@invisi-labs/protocol 1.1.5 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AddressRegistry.ts","../src/RegistrationOperation.ts","../src/registry.ts","../src/credit-create.ts","../src/validation.ts","../src/credit-lifecycle.ts","../src/funds.ts","../src/Protocol.ts","../src/TokenProtocol.ts","../src/verify.ts","../src/witness.ts","../src/witness-layouts.json","../src/factory.ts"],"sourcesContent":["import type { Hex } from \"./contracts\";\nimport { getAddress, keccak256 } from \"ethers\";\n\nimport {\n MissingCapabilityError,\n ReceivingAddress,\n type ReceivingKeyLookup,\n} from \"@invisi-labs/core\";\nimport {\n RegistrationOperation,\n type RegistrationPreparation,\n type RegistryReader,\n} from \"./RegistrationOperation\";\nimport {\n buildRegistrationCalldata,\n registrationTypedData,\n registrationDigest,\n type AddressRegistration,\n type RegistrationOptions,\n type RegistryContext,\n} from \"./registry\";\n\nexport interface AddressRegistryOptions {\n lookup?: ReceivingKeyLookup;\n expectedRuntimeCodeHash?: Hex;\n}\n\n/** Independent registry deployment and nonce domain, selected by the application. */\nexport class AddressRegistry {\n readonly context: Readonly<RegistryContext>;\n readonly #lookup: ReceivingKeyLookup | undefined;\n readonly expectedRuntimeCodeHash: Hex | undefined;\n\n constructor(context: RegistryContext, options: AddressRegistryOptions = {}) {\n if (\n typeof context.chainId !== \"bigint\" ||\n context.chainId < 0n ||\n context.chainId >= 1n << 64n ||\n BigInt(getAddress(context.registryAddress) as Hex) === 0n\n ) {\n throw new Error(\"invalid registry context\");\n }\n this.context = Object.freeze({\n ...context,\n registryAddress: getAddress(context.registryAddress) as Hex,\n });\n this.#lookup = options.lookup;\n this.expectedRuntimeCodeHash = options.expectedRuntimeCodeHash?.toLowerCase() as\n Hex | undefined;\n if (\n this.expectedRuntimeCodeHash &&\n !/^0x[0-9a-f]{64}$/.test(this.expectedRuntimeCodeHash)\n ) {\n throw new Error(\"invalid registry runtime profile\");\n }\n Object.freeze(this);\n }\n\n async validateDeployment(\n reader: Pick<RegistryReader, \"getChainId\" | \"getCode\">\n ): Promise<void> {\n if (!this.expectedRuntimeCodeHash) {\n throw new MissingCapabilityError(\"trusted registry deployment profile\");\n }\n if ((await reader.getChainId()) !== this.context.chainId) {\n throw new Error(\"registry chain mismatch\");\n }\n const code = await reader.getCode(this.context.registryAddress);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(code) ||\n (keccak256(code) as Hex) !== this.expectedRuntimeCodeHash\n ) {\n throw new Error(\"registry runtime profile mismatch\");\n }\n }\n\n prepareRegistration(options: RegistrationPreparation): Promise<RegistrationOperation> {\n return RegistrationOperation.prepare(this, options);\n }\n\n async resolve(address: string): Promise<string> {\n const receiving = ReceivingAddress.parse(address);\n if (receiving.kind === \"short\" && !this.#lookup) {\n throw new MissingCapabilityError(\"registry reader\");\n }\n return (await receiving.resolve(this.#lookup)).toString();\n }\n\n typedData(registration: AddressRegistration, options?: RegistrationOptions) {\n return registrationTypedData(this.context, registration, options);\n }\n\n digest(registration: AddressRegistration, options?: RegistrationOptions) {\n return registrationDigest(this.context, registration, options);\n }\n\n buildCall(\n registration: AddressRegistration,\n signature: `0x${string}`,\n options?: RegistrationOptions\n ) {\n return buildRegistrationCalldata(this.context, registration, signature, options);\n }\n}\n","import type { PublicWallet } from \"@invisi-labs/core\";\nimport type { Address, Hex } from \"./contracts\";\nimport { hexlify, Interface, getBytes, verifyTypedData } from \"ethers\";\n\nimport { invisiAddressRegistryAbi } from \"./contracts\";\nimport { ReceivingAddress, createSigningRequest } from \"@invisi-labs/core\";\nimport type { AddressRegistry } from \"./AddressRegistry\";\nimport type { CanonicalBlock, ChainReader, TransactionCall } from \"./interfaces\";\nimport {\n buildRegistrationCalldata,\n registrationTypedData,\n registrationDigest,\n type AddressRegistration,\n type RegistryContext,\n} from \"./registry\";\n\nexport interface RegistryReader extends Pick<\n ChainReader,\n \"getChainId\" | \"getCode\" | \"getBlock\" | \"getLatestBlockNumber\" | \"getTransaction\" | \"getReceipt\"\n> {\n /** Validate arbitrary ERC-1271 bytes for a contract owner; transport errors propagate. */\n isValidRegistrationSignature?(owner: Address, digest: Hex, signature: Hex): Promise<boolean>;\n getRegistryNonce(\n context: RegistryContext,\n walletIdentity: Hex,\n block: CanonicalBlock\n ): Promise<bigint>;\n}\n\nexport interface RegistrationPreparation {\n wallet: PublicWallet;\n reader: RegistryReader;\n deadline?: bigint;\n update?: boolean;\n}\n\nexport type RegistrationStatus =\n | \"prepared\"\n | \"ready\"\n | \"submitted\"\n | \"confirmed\"\n | \"uncertain\"\n | \"failed\"\n | \"expired\"\n | \"reorged\";\n\ninterface RegistrationPlan {\n id: string;\n context: RegistryContext;\n registration: AddressRegistration;\n update: boolean;\n}\n\nfunction check(ok: unknown, message: string): asserts ok {\n if (!ok) {\n throw new Error(message);\n }\n}\n\nexport class RegistrationOperation {\n readonly #registry: AddressRegistry;\n readonly #runtime: RegistrationPreparation;\n readonly #plan: RegistrationPlan;\n readonly #signature: Hex | undefined;\n readonly #hash: Hex | undefined;\n readonly #anchor: CanonicalBlock | undefined;\n readonly status: RegistrationStatus;\n\n private constructor(\n registry: AddressRegistry,\n runtime: RegistrationPreparation,\n plan: RegistrationPlan,\n status: RegistrationStatus,\n signature?: Hex,\n hash?: Hex,\n anchor?: CanonicalBlock\n ) {\n this.#registry = registry;\n this.#runtime = { ...runtime };\n this.#plan = structuredClone(plan);\n this.status = status;\n this.#signature = signature;\n this.#hash = hash;\n this.#anchor = anchor ? { ...anchor } : undefined;\n Object.freeze(this);\n }\n\n static async prepare(\n registry: AddressRegistry,\n options: RegistrationPreparation\n ): Promise<RegistrationOperation> {\n const runtime = { ...options };\n const update = options.update ?? false;\n check(typeof update === \"boolean\", \"update must be boolean\");\n await registry.validateDeployment(runtime.reader);\n const block = await runtime.reader.getBlock(await runtime.reader.getLatestBlockNumber());\n const context = { ...registry.context, now: block.timestamp };\n const nonce = await runtime.reader.getRegistryNonce(\n context,\n runtime.wallet.walletIdentity,\n block\n );\n check(\n typeof nonce === \"bigint\" && nonce >= 0n && nonce < (1n << 64n) - 1n,\n \"invalid or exhausted registry nonce\"\n );\n check(\n update ? nonce > 0n : nonce === 0n,\n update ? \"wallet is not registered\" : \"wallet is already registered; prepare an update\"\n );\n const address = ReceivingAddress.parse(await registry.resolve(runtime.wallet.getAddress()));\n const keys = address.getReceivingKeys();\n const registration: AddressRegistration = {\n walletIdentity: runtime.wallet.walletIdentity,\n keys: {\n viewingPublicKey: hexlify(keys.viewingPublicKey) as Hex,\n clueKey: hexlify(keys.clueKey) as Hex,\n },\n nonce,\n deadline: options.deadline ?? block.timestamp + 300n,\n };\n registrationTypedData(context, registration, { update, expectedNonce: nonce });\n check(\n (await runtime.reader.getBlock(block.number)).hash === block.hash,\n \"canonical registry block changed while preparing\"\n );\n return new RegistrationOperation(\n registry,\n runtime,\n { id: crypto.randomUUID(), context, registration, update },\n \"prepared\"\n );\n }\n\n get id(): string {\n return this.#plan.id;\n }\n\n preview() {\n return {\n id: this.id,\n status: this.status,\n chainId: this.#plan.context.chainId,\n registryAddress: this.#plan.context.registryAddress,\n ...structuredClone(this.#plan.registration),\n update: this.#plan.update,\n };\n }\n\n /** Export portable EIP-712 data for external signing. */\n async exportRegistrationAuthorization(options: { signal?: AbortSignal } = {}) {\n check(this.status === \"prepared\", \"registry operation is not awaiting authorization\");\n options.signal?.throwIfAborted();\n await this.validateFreshness();\n options.signal?.throwIfAborted();\n return createSigningRequest(this.typedData());\n }\n\n /** Validate and attach an independently obtained EOA or ERC-1271 signature. */\n async withSignature(\n signature: string,\n options: { signal?: AbortSignal } = {}\n ): Promise<RegistrationOperation> {\n check(this.status === \"prepared\", \"registry operation is not awaiting authorization\");\n options.signal?.throwIfAborted();\n await this.validateFreshness();\n options.signal?.throwIfAborted();\n check(\n /^0x(?:[a-fA-F0-9]{2})+$/.test(signature),\n \"registry signature must be nonempty hexadecimal bytes\"\n );\n const p = this.#plan;\n const owner = p.registration.walletIdentity as Address;\n // Match the protocol's SignatureChecker: canonical ECDSA first, including\n // delegated EOAs with code, then the contract-owner ERC-1271 fallback.\n let valid = false;\n try {\n const bytes = getBytes(signature);\n const typed = this.typedData();\n valid =\n bytes.length === 65 &&\n (bytes[64] === 27 || bytes[64] === 28) &&\n BigInt(verifyTypedData(typed.domain, typed.types, typed.message, signature)) ===\n BigInt(owner);\n } catch {\n valid = false;\n }\n if (!valid) {\n const code = await this.#runtime.reader.getCode(owner);\n check(/^0x(?:[a-fA-F0-9]{2})*$/.test(code), \"invalid owner contract code\");\n check(code !== \"0x\", \"invalid EOA registry signature\");\n const verify = this.#runtime.reader.isValidRegistrationSignature;\n check(verify, \"ERC-1271 registry signature verification capability is missing\");\n check(\n await verify.call(\n this.#runtime.reader,\n owner,\n registrationDigest(p.context, p.registration, { update: p.update }),\n signature as Hex\n ),\n \"invalid ERC-1271 registry signature\"\n );\n }\n options.signal?.throwIfAborted();\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n this.#plan,\n \"ready\",\n signature as Hex\n );\n }\n\n /** Empty signatures require the transaction sender to be the wallet owner. */\n async authorizeDirect(): Promise<RegistrationOperation> {\n check(this.status === \"prepared\", \"registry operation is not awaiting authorization\");\n await this.validateFreshness();\n return new RegistrationOperation(this.#registry, this.#runtime, this.#plan, \"ready\", \"0x\");\n }\n\n typedData() {\n const p = this.#plan;\n return registrationTypedData(p.context, p.registration, {\n update: p.update,\n expectedNonce: p.registration.nonce,\n });\n }\n\n private call(): TransactionCall {\n check(this.#signature !== undefined, \"registry signature is missing\");\n const p = this.#plan;\n const result = buildRegistrationCalldata(p.context, p.registration, this.#signature, {\n update: p.update,\n expectedNonce: p.registration.nonce,\n });\n return { to: result.to, data: result.callData, value: result.value };\n }\n\n async exportTransaction(): Promise<TransactionCall> {\n check(\n this.#signature !== undefined && this.status !== \"prepared\",\n \"registry operation is not ready\"\n );\n await this.validateFreshness();\n return this.call();\n }\n\n private async validateFreshness(): Promise<void> {\n await this.#registry.validateDeployment(this.#runtime.reader);\n const block = await this.#runtime.reader.getBlock(\n await this.#runtime.reader.getLatestBlockNumber()\n );\n const p = this.#plan;\n check(block.timestamp <= p.registration.deadline, \"registry operation has expired\");\n check(\n (await this.#runtime.reader.getRegistryNonce(\n p.context,\n p.registration.walletIdentity,\n block\n )) === p.registration.nonce,\n \"registry nonce changed; prepare again\"\n );\n check(\n (await this.#runtime.reader.getBlock(block.number)).hash === block.hash,\n \"canonical registry block changed during authorization\"\n );\n }\n\n /** Associate a signed/broadcast transaction; ethers owns sending and receipt waiting. */\n trackTransaction(transactionHash: string): RegistrationOperation {\n check(/^0x[a-fA-F0-9]{64}$/.test(transactionHash), \"invalid registry transaction hash\");\n check(\n this.#signature !== undefined && [\"ready\", \"uncertain\"].includes(this.status),\n \"registry operation is not ready\"\n );\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n this.#plan,\n \"uncertain\",\n this.#signature,\n transactionHash as Hex\n );\n }\n\n async reconcile(\n options: { transactionHash?: Hex; signal?: AbortSignal } = {}\n ): Promise<RegistrationOperation> {\n options.signal?.throwIfAborted();\n const { reader } = this.#runtime;\n const p = this.#plan;\n await this.#registry.validateDeployment(reader);\n if (\n this.#anchor &&\n (await reader.getBlock(this.#anchor.number)).hash !== this.#anchor.hash\n ) {\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n p,\n \"reorged\",\n this.#signature,\n this.#hash\n );\n }\n const hash = options.transactionHash ?? this.#hash;\n const receipt = hash ? await reader.getReceipt(hash) : null;\n if (receipt) {\n check(\n receipt.transactionHash === hash &&\n (await reader.getBlock(receipt.block.number)).hash === receipt.block.hash,\n \"registry receipt is not canonical\"\n );\n const transaction = await reader.getTransaction(hash!);\n const call = this.call();\n check(\n transaction &&\n transaction.transactionHash === hash &&\n transaction.to.toLowerCase() === call.to.toLowerCase() &&\n transaction.data.toLowerCase() === call.data.toLowerCase() &&\n transaction.value === 0n &&\n (this.#signature !== \"0x\" ||\n BigInt(transaction.from) === BigInt(p.registration.walletIdentity)),\n \"registry transaction differs from frozen request\"\n );\n check(\n receipt.status === \"success\" || receipt.status === \"reverted\",\n \"registry execution status is missing\"\n );\n if (receipt.status === \"success\") {\n const found = receipt.logs.some((log) => {\n if (\n log.address.toLowerCase() !== p.context.registryAddress.toLowerCase() ||\n log.transactionHash !== hash\n ) {\n return false;\n }\n try {\n const event = ((decoded) => ({\n eventName: decoded!.name,\n args: decoded!.args.toObject(),\n }))(\n new Interface(invisiAddressRegistryAbi).parseLog({\n data: log.data,\n topics: log.topics as never,\n })\n );\n return (\n event.eventName === \"ReceivingKeysSet\" &&\n BigInt(event.args.walletIdentity) ===\n BigInt(p.registration.walletIdentity) &&\n event.args.viewingPublicKey.toLowerCase() ===\n p.registration.keys.viewingPublicKey.toLowerCase() &&\n event.args.clueKey.toLowerCase() ===\n p.registration.keys.clueKey.toLowerCase() &&\n event.args.nextNonce === p.registration.nonce + 1n\n );\n } catch {\n return false;\n }\n });\n check(found, \"registry receipt has no matching key update event\");\n check(\n (await reader.getBlock(receipt.block.number)).hash === receipt.block.hash,\n \"registry block changed during confirmation\"\n );\n options.signal?.throwIfAborted();\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n p,\n \"confirmed\",\n this.#signature,\n hash,\n receipt.block\n );\n }\n }\n const head = await reader.getBlock(await reader.getLatestBlockNumber());\n const nonce = await reader.getRegistryNonce(p.context, p.registration.walletIdentity, head);\n check(\n (await reader.getBlock(head.number)).hash === head.hash,\n \"canonical registry block changed during reconciliation\"\n );\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n p,\n head.timestamp > p.registration.deadline\n ? \"expired\"\n : nonce !== p.registration.nonce\n ? \"failed\"\n : \"uncertain\",\n this.#signature,\n hash\n );\n }\n\n toJSON() {\n return {\n id: this.id,\n kind: this.#plan.update ? \"update-receiving-keys\" : \"register-receiving-keys\",\n status: this.status,\n };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import type { Address, Hex } from \"./contracts\";\nimport {\n Contract,\n Interface,\n getAddress,\n getBytes,\n hexlify,\n isHexString,\n TypedDataEncoder,\n toBeHex,\n type ContractRunner,\n} from \"ethers\";\n\nimport { invisiAddressRegistryAbi } from \"./contracts\";\nimport { ReceivingAddress, decodeAddress, type ReceivingKeyLookup } from \"@invisi-labs/core\";\n\nexport interface RegistryContext {\n chainId: bigint;\n registryAddress: Address;\n /** Optional explicit wall-clock value in seconds. Equality with deadline is valid. */\n now?: bigint;\n}\nexport interface RegistryReceivingKeys {\n viewingPublicKey: Hex;\n clueKey: Hex;\n}\nexport interface AddressRegistration {\n /** Nonzero EVM owner: 20 bytes or canonical zero-padded bytes32. */\n walletIdentity: Hex;\n keys: RegistryReceivingKeys;\n /** The current registry nonce expected for this operation. */\n nonce: bigint;\n deadline: bigint;\n}\nexport interface RegistrationOptions {\n update?: boolean;\n /** Check a separately obtained current nonce before authorizing or encoding. */\n expectedNonce?: bigint;\n}\nexport interface RegistrationCalldata {\n to: Address;\n callData: Hex;\n value: 0n;\n}\nconst MAX_NONCE = (1n << 64n) - 1n;\nfunction uint64(value: bigint, name: string): bigint {\n if (typeof value !== \"bigint\" || value < 0n || value > MAX_NONCE)\n throw new RangeError(`${name} must be uint64`);\n return value;\n}\nfunction hexBytes(value: Hex, length: number): Uint8Array {\n if (typeof value !== \"string\" || !isHexString(value) || value.length !== 2 + length * 2)\n throw new Error(`Expected ${length} hexadecimal bytes`);\n return getBytes(value);\n}\nfunction normalizeKeys(walletIdentity: Hex, keys: RegistryReceivingKeys): RegistryReceivingKeys {\n const decoded = decodeAddress(\n ReceivingAddress.from({\n walletIdentity,\n viewingPublicKey: hexBytes(keys.viewingPublicKey, 33),\n clueKey: hexBytes(keys.clueKey, 32),\n }).toString()\n );\n if (decoded.kind !== \"long\") throw new Error(\"Expected full receiving address\");\n return {\n viewingPublicKey: hexlify(decoded.viewingPublicKey) as Hex,\n clueKey: hexlify(decoded.clueKey) as Hex,\n };\n}\nfunction normalize(\n context: RegistryContext,\n registration: AddressRegistration,\n options: RegistrationOptions\n) {\n uint64(context.chainId, \"chainId\");\n const registryAddress = getAddress(context.registryAddress) as Hex;\n if (BigInt(registryAddress) === 0n) throw new Error(\"Registry address must be nonzero\");\n if (!/^0x(?:[0-9a-fA-F]{40}|[0-9a-fA-F]{64})$/.test(registration.walletIdentity))\n throw new Error(\"Wallet identity must be an EVM owner or padded bytes32\");\n // Converting to 20 bytes rejects nonzero high bits instead of truncating them.\n const walletIdentity = decodeAddress(\n ReceivingAddress.fromIdentity(\n toBeHex(BigInt(registration.walletIdentity), 20) as Hex\n ).toString()\n ).walletIdentity;\n const keys = normalizeKeys(walletIdentity, registration.keys);\n const nonce = uint64(registration.nonce, \"nonce\"),\n deadline = uint64(registration.deadline, \"deadline\");\n if (nonce === MAX_NONCE) throw new Error(\"Registry nonce exhausted\");\n if (options.update !== undefined && typeof options.update !== \"boolean\")\n throw new TypeError(\"update must be boolean\");\n if (!options.update && nonce !== 0n)\n throw new Error(\"Initial registration requires nonce zero\");\n if (\n options.expectedNonce !== undefined &&\n uint64(options.expectedNonce, \"expectedNonce\") !== nonce\n )\n throw new Error(\"Registry nonce mismatch\");\n if (context.now !== undefined && deadline < uint64(context.now, \"now\"))\n throw new Error(\"Registration expired\");\n return { registryAddress, registration: { walletIdentity, keys, nonce, deadline } };\n}\n\n/** Standard registry EIP-712 data, independent of private WalletAuthorization. */\nexport function registrationTypedData(\n context: RegistryContext,\n registration: AddressRegistration,\n options: RegistrationOptions = {}\n) {\n const { registryAddress, registration: r } = normalize(context, registration, options);\n const primaryType = options.update ? \"UpdateReceivingKeys\" : \"RegisterReceivingKeys\";\n return {\n domain: {\n name: \"InvisiAddressRegistry\",\n version: \"1\",\n chainId: context.chainId,\n verifyingContract: registryAddress,\n },\n primaryType,\n types: {\n [primaryType]: [\n { name: \"walletIdentity\", type: \"bytes32\" },\n { name: \"viewingPublicKey\", type: \"bytes\" },\n { name: \"clueKey\", type: \"bytes32\" },\n { name: \"nonce\", type: \"uint64\" },\n { name: \"deadline\", type: \"uint64\" },\n ],\n },\n message: {\n walletIdentity: toBeHex(BigInt(r.walletIdentity), 32),\n ...r.keys,\n nonce: r.nonce,\n deadline: r.deadline,\n },\n };\n}\nexport function registrationDigest(\n context: RegistryContext,\n registration: AddressRegistration,\n options: RegistrationOptions = {}\n): Hex {\n const typed = registrationTypedData(context, registration, options);\n return TypedDataEncoder.hash(typed.domain, typed.types, typed.message) as Hex;\n}\n/** Encode an owner call (empty signature) or an EIP-712 / ERC-1271 authorized relay. */\nexport function buildRegistrationCalldata(\n context: RegistryContext,\n registration: AddressRegistration,\n signature: Hex,\n options: RegistrationOptions = {}\n): RegistrationCalldata {\n const normalized = normalize(context, registration, options);\n if (typeof signature !== \"string\" || !isHexString(signature) || signature.length % 2 !== 0)\n throw new Error(\"Registration signature must be hexadecimal bytes\");\n return {\n to: normalized.registryAddress,\n value: 0n,\n callData: new Interface(invisiAddressRegistryAbi).encodeFunctionData(\n options.update ? \"updateKeys\" : \"registerKeys\",\n [\n {\n ...normalized.registration,\n walletIdentity: toBeHex(BigInt(normalized.registration.walletIdentity), 32),\n },\n signature,\n ]\n ) as Hex,\n };\n}\n\n/** Ethers runner used for registry contract reads. */\nexport type RegistryReadClient = ContractRunner;\n/** One receivingKeysOf query per short address; RPC failures propagate unchanged. */\nexport function createRegistryReceivingKeyLookup(\n client: RegistryReadClient,\n registryAddress: Address\n): ReceivingKeyLookup {\n const address = getAddress(registryAddress) as Hex;\n if (BigInt(address) === 0n) throw new Error(\"Registry address must be nonzero\");\n return async (walletIdentity) => {\n const identity = decodeAddress(\n ReceivingAddress.fromIdentity(walletIdentity).toString()\n ).walletIdentity;\n const [keys, nonce] = await new Contract(\n address,\n invisiAddressRegistryAbi,\n client\n ).getFunction(\"receivingKeysOf\")(toBeHex(BigInt(identity), 32));\n uint64(nonce, \"registry nonce\");\n const normalized = normalizeKeys(identity, keys);\n return {\n viewingPublicKey: getBytes(normalized.viewingPublicKey),\n clueKey: getBytes(normalized.clueKey),\n };\n };\n}\n","import type { Address, Hex } from \"./contracts\";\nimport {\n AbiCoder,\n dataLength,\n getAddress,\n Interface,\n isHexString,\n keccak256,\n ParamType,\n} from \"ethers\";\n\nimport { invisiProtocolAbi, type CreateCreditParams, type Delivery } from \"./contracts\";\nimport { computeWalletAuthorizationDigest, walletAuthorizationTypedData } from \"@invisi-labs/core\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n field,\n fundingFields,\n getEIP712Domain,\n known,\n normalizeContext,\n normalizeOpaqueDelivery,\n normalizeFunding,\n normalizeSources,\n notes,\n pad,\n uint,\n validateFundingSubmission,\n word,\n ZERO_ADDRESS,\n type FundingInput,\n type TransactionContext,\n} from \"./validation\";\nconst creationTuple = [\n \"(address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32 creditCommitment,bytes32 changeCommitment,address owner,uint256 expiry,uint256 deadline)\",\n][0]!;\nexport const CREATE_CREDIT_FIELDS = [\n \"token\",\n \"sources\",\n \"nullifiers\",\n \"creditCommitment\",\n \"changeCommitment\",\n \"owner\",\n \"expiry\",\n \"deadline\",\n] as const;\n/** Public checks cannot establish ownership or conservation: those are enforced by the proof. */\nexport function validateCreateCreditRequest(\n c: TransactionContext,\n p: CreateCreditParams,\n cs: readonly Delivery[],\n funding: FundingInput = {}\n) {\n known(p, CREATE_CREDIT_FIELDS);\n if ((getAddress(p.token) as Hex) !== (getAddress(c.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n const ctx = normalizeContext(c),\n ns = notes(p.nullifiers, \"nullifiers\"),\n sources = normalizeSources(p.sources, ns.length, 10),\n creditCommitment = word(field(p.creditCommitment)),\n changeCommitment = word(field(p.changeCommitment)),\n owner = getAddress(p.owner) as Hex,\n expiry = uint(p.expiry, 64, \"expiry\"),\n deadline = checkDeadline(c, p.deadline),\n f = normalizeFunding(funding);\n if (BigInt(creditCommitment) === 0n || creditCommitment === changeCommitment)\n throw new Error(\"zero or duplicate commitment\");\n if (BigInt(owner) === 0n || expiry === 0n || (c.now !== undefined && expiry <= c.now))\n throw new Error(\"owner must be nonzero and expiry future\");\n if (dense(cs, \"deliveries\").length !== 3) throw new Error(\"deliveries count mismatch\");\n const deliveries = cs.map((v, i) =>\n normalizeOpaqueDelivery(v, { empty: i === 2 && BigInt(changeCommitment) === 0n })\n );\n if (ns.length === 0 && f.amount === 0n)\n throw new Error(\"empty inputs require positive funding\");\n return {\n ...ctx,\n sources,\n nullifiers: ns,\n actualCount: ns.length,\n sourceCount: sources.length,\n creditCommitment,\n changeCommitment,\n owner,\n expiry,\n deadline,\n deliveries,\n funding: f,\n };\n}\nexport function createCreditBaseInputs(\n c: TransactionContext,\n p: CreateCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateCreateCreditRequest(c, p, cs, f),\n h = BigInt(deliveriesHash(cs));\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.owner),\n BigInt(r.actualCount),\n BigInt(r.sourceCount),\n ...pad(\n r.sources.map((s) => s.treeId),\n 10\n ),\n ...pad(\n r.sources.map((s) => BigInt(s.merkleRoot)),\n 10\n ),\n ...pad(r.nullifiers.map(BigInt), 10),\n BigInt(r.creditCommitment),\n BigInt(r.changeCommitment),\n h >> 128n,\n h & ((1n << 128n) - 1n),\n r.expiry,\n r.deadline,\n r.funding.amount,\n BigInt(r.funding.payer),\n ].map(word);\n}\nexport function createCreditPublicInputs(\n c: TransactionContext,\n p: CreateCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n const base = createCreditBaseInputs(c, p, deliveries, funding);\n const digest = BigInt(\n computeWalletAuthorizationDigest({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation: \"create-credit\",\n capacity: 10,\n words: base.map(BigInt),\n })\n );\n return [...base, word(digest >> 128n), word(digest & ((1n << 128n) - 1n))];\n}\nconst hashContext = {\n chainId: 0n,\n protocolAddress: ZERO_ADDRESS,\n tokenAddress: ZERO_ADDRESS,\n};\nexport function createCreditRequestHash(\n p: CreateCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateCreateCreditRequest({ ...hashContext, tokenAddress: p.token }, p, cs, f);\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n { type: \"bytes32\" },\n creationTuple,\n { type: \"bytes32\" },\n { type: \"address\" },\n { type: \"uint256\" },\n ].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiCreateCredit\")),\n p,\n deliveriesHash(cs),\n r.funding.payer,\n r.funding.amount,\n ]\n ) as Hex\n ) as Hex;\n}\nexport function encodeCreateCreditTypedData(\n c: TransactionContext,\n p: CreateCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n return walletAuthorizationTypedData({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation: \"create-credit\",\n capacity: 10,\n words: createCreditBaseInputs(c, p, deliveries, funding).map(BigInt),\n });\n}\nexport function encodeCreateCreditFundingTypedData(\n c: TransactionContext,\n p: CreateCreditParams,\n cs: readonly Delivery[],\n f: FundingInput\n) {\n const r = validateCreateCreditRequest(c, p, cs, f);\n if (r.funding.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: createCreditRequestHash(p, cs, f),\n payer: r.funding.payer,\n amount: r.funding.amount,\n sigNonce: r.funding.sigNonce,\n deadline: r.funding.deadline,\n },\n };\n}\nexport interface BuildCreateCreditCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: CreateCreditParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n caller?: Address;\n}\nexport function buildCreateCreditCalldata(p: BuildCreateCreditCalldataParams) {\n const r = validateCreateCreditRequest(p.context, p.params, p.deliveries, p.funding);\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"createCredit\", [\n encodeCreditProof(p.proof),\n p.params,\n p.deliveries,\n r.funding,\n ]) as Hex,\n approveAmount: r.funding.amount,\n };\n}\n\n/** Frame a raw direct proof from the proving backend for the Credit verifier adapter. */\nexport function encodeCreditProof(proof: Hex): Hex {\n if (!isHexString(proof) || !/^0x(?:[a-fA-F0-9]{2})*$/.test(proof) || dataLength(proof) === 0)\n throw new Error(\"empty or malformed Credit proof\");\n return AbiCoder.defaultAbiCoder().encode(\n [\"uint8\", \"bytes\"].map((parameter) => ParamType.from(parameter)),\n [0, proof]\n ) as Hex;\n}\n","import { MAX_CIPHERTEXT_BYTES } from \"@invisi-labs/core\";\nimport type { Address, Delivery, FundingParams, Hex, InputSource } from \"./contracts\";\nimport {\n AbiCoder,\n dataLength,\n getAddress,\n isHexString,\n keccak256,\n ParamType,\n toBeHex,\n} from \"ethers\";\n\nexport type { DeploymentContext } from \"@invisi-labs/rpc\";\nimport type { DeploymentContext } from \"@invisi-labs/rpc\";\nexport interface TransactionContext extends DeploymentContext {\n tokenAddress: Address;\n now?: bigint;\n /** Explicit chain timestamp used to bind Credit draw UTC periods. */\n timestamp?: bigint;\n}\nexport const FIELD_MODULUS =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617n;\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as const;\nexport const ZERO_WORD = toBeHex(0n, 32) as Hex;\nexport const EMPTY_PERMIT = {\n deadline: 0n,\n v: 0,\n r: ZERO_WORD,\n s: ZERO_WORD,\n} as const;\nexport const EMPTY_FUNDING: FundingParams = {\n payer: ZERO_ADDRESS,\n amount: 0n,\n sigNonce: 0n,\n deadline: 0n,\n signature: \"0x\",\n permit: EMPTY_PERMIT,\n};\nexport type FundingInput = Partial<Omit<FundingParams, \"permit\">> & {\n permit?: FundingParams[\"permit\"];\n};\nexport function uint(v: bigint | number | string, bits: number, name = \"value\"): bigint {\n if (\n (typeof v !== \"bigint\" && typeof v !== \"number\" && typeof v !== \"string\") ||\n (typeof v === \"number\" && !Number.isSafeInteger(v))\n )\n throw new Error(`${name} must be an integer`);\n const n = BigInt(v);\n if (n < 0n || n >= 1n << BigInt(bits)) throw new Error(`${name} exceeds u${bits}`);\n return n;\n}\nexport function field(v: bigint | string, name = \"field\"): bigint {\n const n = uint(v, 256, name);\n if (n >= FIELD_MODULUS) throw new Error(`${name} is noncanonical field`);\n return n;\n}\nexport const word = (v: bigint | string): Hex =>\n toBeHex(typeof v === \"bigint\" ? v : BigInt(v), 32) as Hex;\nexport function dense<T>(v: readonly T[], name: string): readonly T[] {\n if (!Array.isArray(v)) throw new Error(`${name} must be array`);\n for (let i = 0; i < v.length; i++)\n if (!Object.hasOwn(v, i) || v[i] === undefined || v[i] === null)\n throw new Error(`${name} has missing or sparse entries`);\n return v;\n}\nexport function known(v: object, keys: readonly string[], name = \"params\") {\n if (\n !v ||\n typeof v !== \"object\" ||\n Array.isArray(v) ||\n Object.keys(v).some((k) => !keys.includes(k))\n )\n throw new Error(`${name} has unsupported fields`);\n}\nexport function notes(v: readonly Hex[], name: string) {\n const r = dense(v, name).map((v) => word(field(v, name)));\n if (r.some((v) => BigInt(v) === 0n) || new Set(r).size !== r.length)\n throw new Error(`duplicate or zero ${name}`);\n return r;\n}\nexport function envelope(v: Hex, length: number, version?: number, maximum = length): Hex {\n if (\n !isHexString(v) ||\n !/^0x(?:[a-fA-F0-9]{2})*$/.test(v) ||\n dataLength(v) < length ||\n dataLength(v) > maximum\n )\n throw new Error(`ciphertext must be ${length} bytes`);\n if (version !== undefined && Number.parseInt(v.slice(2, 4), 16) !== version)\n throw new Error(\"unsupported ciphertext envelope version\");\n return v;\n}\nexport function normalizeContext(c: TransactionContext) {\n return {\n ...c,\n chainId: uint(c.chainId, 64, \"chainId\"),\n protocolAddress: getAddress(c.protocolAddress) as Hex,\n tokenAddress: getAddress(c.tokenAddress) as Hex,\n };\n}\nexport function checkDeadline(c: TransactionContext, value: bigint) {\n const n = uint(value, 64, \"deadline\");\n if (c.now !== undefined && n < uint(c.now, 64, \"now\")) throw new Error(\"deadline has expired\");\n return n;\n}\nexport function normalizeSources(\n sources: readonly InputSource[],\n inputCount: number,\n capacity: number\n) {\n dense(sources, \"sources\");\n if (\n inputCount < 0 ||\n inputCount > capacity ||\n sources.length > inputCount ||\n (inputCount === 0 ? sources.length !== 0 : sources.length === 0)\n )\n throw new Error(\"source count must be 1..inputCount, or empty for zero inputs\");\n let previous = 0n;\n return sources.map((s) => {\n known(s, [\"treeId\", \"merkleRoot\"], \"source\");\n const treeId = uint(s.treeId, 64, \"treeId\"),\n merkleRoot = word(field(s.merkleRoot, \"merkleRoot\"));\n if (treeId === 0n || treeId <= previous || BigInt(merkleRoot) === 0n)\n throw new Error(\"sources must have positive roots and strictly ascending tree IDs\");\n previous = treeId;\n return { treeId, merkleRoot };\n });\n}\nexport const pad = (v: readonly bigint[], n: number): bigint[] => [\n ...v,\n ...(Array(n - v.length).fill(0n) as bigint[]),\n];\n/** Receipt/transport validation must not reject unrelated future wallet codecs. */\nexport function normalizeOpaqueDelivery(\n value: Delivery,\n options: { empty?: boolean } = {}\n): Delivery {\n known(value, [\"ciphertext\", \"clue\"], \"delivery\");\n if (options.empty) {\n if (value.ciphertext !== \"0x\" || value.clue !== \"0x\")\n throw new Error(\"absent output requires an empty delivery\");\n return { ciphertext: \"0x\", clue: \"0x\" };\n }\n const ciphertext = envelope(value.ciphertext, 1, undefined, MAX_CIPHERTEXT_BYTES);\n const clue = envelope(value.clue, 68);\n if (clue.slice(130, 132).toLowerCase() !== \"18\") throw new Error(\"clue precision must be 24\");\n return { ciphertext, clue };\n}\n\nexport const deliveriesHash = (v: readonly Delivery[]) =>\n keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n {\n type: \"tuple[]\",\n components: [\n { name: \"ciphertext\", type: \"bytes\" },\n { name: \"clue\", type: \"bytes\" },\n ],\n },\n ].map((parameter) => ParamType.from(parameter)),\n [dense(v, \"deliveries\")]\n ) as Hex\n ) as Hex;\nexport function normalizeFunding(input: FundingInput = {}): FundingParams {\n const f = { ...EMPTY_FUNDING, ...input };\n getAddress(f.payer) as Hex;\n uint(f.amount, 128, \"depositAmount\");\n uint(f.sigNonce, 256, \"sigNonce\");\n uint(f.deadline, 256, \"funding deadline\");\n if (!isHexString(f.signature) || !/^0x(?:[a-fA-F0-9]{2})*$/.test(f.signature))\n throw new Error(\"invalid signature bytes\");\n const p = f.permit;\n uint(p.deadline, 256);\n uint(p.v, 8);\n for (const v of [p.r, p.s])\n if (!isHexString(v) || dataLength(v) !== 32) throw new Error(\"permit r/s must be bytes32\");\n if ((f.amount === 0n) !== (BigInt(f.payer) === 0n))\n throw new Error(\"deposit amount and payer must both be zero or positive\");\n if (\n f.amount === 0n &&\n (f.sigNonce !== 0n ||\n f.deadline !== 0n ||\n f.signature !== \"0x\" ||\n p.deadline !== 0n ||\n p.v !== 0 ||\n BigInt(p.r) !== 0n ||\n BigInt(p.s) !== 0n)\n )\n throw new Error(\"zero funding must be entirely empty\");\n return { ...f, payer: getAddress(f.payer) as Hex };\n}\nexport function validateFundingSubmission(f: FundingParams, caller?: Address, now?: bigint) {\n if (f.signature !== \"0x\" && now !== undefined && uint(now, 64, \"now\") > f.deadline)\n throw new Error(\"funding authorization has expired\");\n if (\n f.signature === \"0x\" &&\n (f.sigNonce !== 0n ||\n f.deadline !== 0n ||\n (caller !== undefined && f.amount > 0n && (getAddress(caller) as Hex) !== f.payer))\n )\n throw new Error(\"direct funding requires payer caller and zero nonce/deadline\");\n}\nexport const getEIP712Domain = (c: TransactionContext) => ({\n name: \"InvisibleProtocol\",\n version: \"1\",\n chainId: uint(c.chainId, 64),\n verifyingContract: getAddress(c.protocolAddress) as Hex,\n});\nexport const fundingFields = [\n { name: \"requestHash\", type: \"bytes32\" },\n { name: \"payer\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"sigNonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n] as const;\n","import type { Address, Hex } from \"./contracts\";\nimport { AbiCoder, getAddress, Interface, keccak256, ParamType } from \"ethers\";\n\nimport {\n invisiProtocolAbi,\n type CancelCreditParams,\n type CreditDrawParams,\n type Delivery,\n type TopUpCreditParams,\n} from \"./contracts\";\nimport {\n creditPeriods,\n computeWalletAuthorizationDigest,\n walletAuthorizationTypedData,\n type WalletOperation,\n} from \"@invisi-labs/core\";\nimport {\n createCreditBaseInputs,\n encodeCreditProof,\n validateCreateCreditRequest,\n} from \"./credit-create\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n field,\n fundingFields,\n getEIP712Domain,\n known,\n normalizeContext,\n normalizeOpaqueDelivery,\n normalizeSources,\n notes,\n pad,\n uint,\n validateFundingSubmission,\n word,\n ZERO_ADDRESS,\n type FundingInput,\n type TransactionContext,\n} from \"./validation\";\nexport const CREDIT_DRAW_CAPACITIES = [1, 12, 50, 120] as const;\nexport function selectCreditDrawCircuit(count: number) {\n if (!Number.isInteger(count) || count < 1 || count > 120)\n throw new Error(\"draw requires 1..120 credits\");\n const maxSize = CREDIT_DRAW_CAPACITIES.find((n) => count <= n)!;\n return {\n name: `credit_draw_slots${maxSize}`,\n maxSize,\n publicInputCount: 6 * maxSize + 14,\n totalBits: 126 + Math.ceil(Math.log2(maxSize)),\n };\n}\nexport function validateCreditDrawRequest(\n c: TransactionContext,\n p: CreditDrawParams,\n cs: readonly Delivery[]\n) {\n known(p, [\n \"token\",\n \"sources\",\n \"nullifiers\",\n \"remainderCommitments\",\n \"expiries\",\n \"recoveryAmounts\",\n \"spender\",\n \"totalAmount\",\n \"deadline\",\n ]);\n if ((getAddress(p.token) as Hex) !== (getAddress(c.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n const ctx = normalizeContext(c),\n ns = notes(p.nullifiers, \"nullifiers\"),\n profile = selectCreditDrawCircuit(ns.length),\n sources = normalizeSources(p.sources, ns.length, profile.maxSize);\n for (const [key, v] of Object.entries({\n remainderCommitments: p.remainderCommitments,\n expiries: p.expiries,\n recoveryAmounts: p.recoveryAmounts,\n }))\n if (dense<unknown>(v, key).length !== ns.length) throw new Error(`${key} count mismatch`);\n const remainderCommitments = p.remainderCommitments.map((v) => word(field(v))),\n recoveryAmounts = p.recoveryAmounts.map((v) => word(field(v))),\n expiries = p.expiries.map((v) => uint(v, 64, \"expiry\")),\n positives = remainderCommitments.filter((v) => BigInt(v) !== 0n);\n if (new Set(positives).size !== positives.length)\n throw new Error(\"duplicate remainder commitment\");\n for (let i = 0; i < ns.length; i++) {\n if (expiries[i] === 0n || (c.now !== undefined && expiries[i]! <= c.now))\n throw new Error(\"expiry must be future\");\n if (BigInt(remainderCommitments[i]!) === 0n && BigInt(recoveryAmounts[i]!) !== 0n)\n throw new Error(\"full draw requires zero recovery amount\");\n }\n const spender = getAddress(p.spender) as Hex,\n totalAmount = uint(p.totalAmount, profile.totalBits, \"totalAmount\");\n if (BigInt(spender) === 0n || totalAmount === 0n)\n throw new Error(\"spender and total amount must be positive\");\n if (dense(cs, \"deliveries\").length !== 2 * ns.length)\n throw new Error(\"deliveries count mismatch\");\n const deliveries = cs.map((v, i) =>\n BigInt(remainderCommitments[Math.floor(i / 2)]!) === 0n\n ? normalizeOpaqueDelivery(v, { empty: true })\n : normalizeOpaqueDelivery(v, {})\n );\n return {\n ...ctx,\n sources,\n nullifiers: ns,\n remainderCommitments,\n recoveryAmounts,\n expiries,\n spender,\n totalAmount,\n deadline: checkDeadline(c, p.deadline),\n deliveries,\n profile,\n periods: creditPeriods(c.timestamp!),\n };\n}\nexport function creditDrawBaseInputs(\n c: TransactionContext,\n p: CreditDrawParams,\n cs: readonly Delivery[]\n) {\n const r = validateCreditDrawRequest(c, p, cs),\n n = r.profile.maxSize,\n h = BigInt(deliveriesHash(cs));\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.spender),\n BigInt(r.nullifiers.length),\n BigInt(r.sources.length),\n ...pad(\n r.sources.map((s) => s.treeId),\n n\n ),\n ...pad(\n r.sources.map((s) => BigInt(s.merkleRoot)),\n n\n ),\n ...pad(r.nullifiers.map(BigInt), n),\n ...pad(r.remainderCommitments.map(BigInt), n),\n ...pad(r.expiries, n),\n r.totalAmount,\n r.deadline,\n h >> 128n,\n h & ((1n << 128n) - 1n),\n ...pad(r.recoveryAmounts.map(BigInt), n),\n r.periods.currentDay,\n r.periods.currentMonth,\n ].map(word);\n}\nexport function validateCancelCreditRequest(c: TransactionContext, p: CancelCreditParams) {\n known(p, [\"token\", \"source\", \"nullifier\", \"owner\", \"amount\", \"deadline\"]);\n if ((getAddress(p.token) as Hex) !== (getAddress(c.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n const ctx = normalizeContext(c),\n source = normalizeSources([p.source], 1, 1)[0]!,\n nullifier = notes([p.nullifier], \"nullifier\")[0]!,\n owner = getAddress(p.owner) as Hex,\n amount = uint(p.amount, 126, \"amount\");\n if (BigInt(owner) === 0n || amount === 0n) throw new Error(\"owner and amount must be positive\");\n return {\n ...ctx,\n source,\n nullifier,\n owner,\n amount,\n deadline: checkDeadline(c, p.deadline),\n };\n}\nexport function cancelCreditBaseInputs(c: TransactionContext, p: CancelCreditParams) {\n const r = validateCancelCreditRequest(c, p);\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.owner),\n r.source.treeId,\n BigInt(r.source.merkleRoot),\n BigInt(r.nullifier),\n r.amount,\n r.deadline,\n ].map(word);\n}\nexport function validateTopUpCreditRequest(\n c: TransactionContext,\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n funding: FundingInput = {}\n) {\n known(p, [\"token\", \"creation\", \"creditSource\", \"creditNullifier\", \"previousExpiry\"]);\n const creation = validateCreateCreditRequest(c, p.creation, cs, funding),\n creditSource = normalizeSources([p.creditSource], 1, 1)[0]!,\n creditNullifier = notes([p.creditNullifier], \"creditNullifier\")[0]!,\n previousExpiry = uint(p.previousExpiry, 64, \"previousExpiry\");\n if (previousExpiry === 0n || (c.now !== undefined && previousExpiry <= c.now))\n throw new Error(\"previous Credit has expired\");\n if (creation.expiry < previousExpiry) throw new Error(\"expiry must not decrease\");\n if (creation.nullifiers.includes(creditNullifier))\n throw new Error(\"duplicate credit and ordinary nullifier\");\n return { creation, creditSource, creditNullifier, previousExpiry };\n}\nexport function topUpCreditBaseInputs(\n c: TransactionContext,\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateTopUpCreditRequest(c, p, cs, f);\n return [\n ...createCreditBaseInputs(c, p.creation, cs, f),\n word(r.creditSource.treeId),\n r.creditSource.merkleRoot,\n r.creditNullifier,\n word(r.previousExpiry),\n ];\n}\nconst cancelTuple = [\n \"(address token,(uint256 treeId,bytes32 merkleRoot) source,bytes32 nullifier,address owner,uint256 amount,uint256 deadline)\",\n][0]!;\nconst topTuple = [\n \"((address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32 creditCommitment,bytes32 changeCommitment,address owner,uint256 expiry,uint256 deadline) creation,(uint256 treeId,bytes32 merkleRoot) creditSource,bytes32 creditNullifier,uint256 previousExpiry)\",\n][0]!;\nconst hashContext = {\n chainId: 0n,\n protocolAddress: ZERO_ADDRESS,\n tokenAddress: ZERO_ADDRESS,\n};\nexport function cancelCreditRequestHash(p: CancelCreditParams) {\n validateCancelCreditRequest({ ...hashContext, tokenAddress: p.token }, p);\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, cancelTuple].map((parameter) => ParamType.from(parameter)),\n [keccak256(new TextEncoder().encode(\"InvisiCancelCredit\")), p]\n ) as Hex\n ) as Hex;\n}\nexport function topUpCreditRequestHash(\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateTopUpCreditRequest(\n { ...hashContext, tokenAddress: p.creation.token },\n p,\n cs,\n f\n );\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n { type: \"bytes32\" },\n topTuple,\n { type: \"bytes32\" },\n { type: \"address\" },\n { type: \"uint256\" },\n ].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiTopUpCredit\")),\n p,\n deliveriesHash(cs),\n r.creation.funding.payer,\n r.creation.funding.amount,\n ]\n ) as Hex\n ) as Hex;\n}\nfunction authorize(\n c: TransactionContext,\n operation: WalletOperation,\n capacity: number,\n words: readonly Hex[]\n) {\n return walletAuthorizationTypedData({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation,\n capacity,\n words: words.map(BigInt),\n });\n}\nfunction appendDigest(\n c: TransactionContext,\n operation: WalletOperation,\n capacity: number,\n words: readonly Hex[]\n) {\n const digest = BigInt(\n computeWalletAuthorizationDigest({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation,\n capacity,\n words: words.map(BigInt),\n })\n );\n return [...words, word(digest >> 128n), word(digest & ((1n << 128n) - 1n))];\n}\nexport function encodeCancelCreditTypedData(c: TransactionContext, p: CancelCreditParams) {\n return authorize(c, \"cancel-credit\", 1, cancelCreditBaseInputs(c, p));\n}\nexport function encodeTopUpCreditTypedData(\n c: TransactionContext,\n p: TopUpCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n return authorize(c, \"top-up-credit\", 10, topUpCreditBaseInputs(c, p, deliveries, funding));\n}\nexport function encodeCreditDrawTypedData(\n c: TransactionContext,\n p: CreditDrawParams,\n deliveries: readonly Delivery[]\n) {\n return authorize(\n c,\n \"credit-draw\",\n selectCreditDrawCircuit(p.nullifiers.length).maxSize,\n creditDrawBaseInputs(c, p, deliveries)\n );\n}\nexport function creditDrawPublicInputs(\n c: TransactionContext,\n p: CreditDrawParams,\n deliveries: readonly Delivery[]\n) {\n return appendDigest(\n c,\n \"credit-draw\",\n selectCreditDrawCircuit(p.nullifiers.length).maxSize,\n creditDrawBaseInputs(c, p, deliveries)\n );\n}\nexport function cancelCreditPublicInputs(c: TransactionContext, p: CancelCreditParams) {\n return appendDigest(c, \"cancel-credit\", 1, cancelCreditBaseInputs(c, p));\n}\nexport function topUpCreditPublicInputs(\n c: TransactionContext,\n p: TopUpCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n return appendDigest(c, \"top-up-credit\", 10, topUpCreditBaseInputs(c, p, deliveries, funding));\n}\nexport function encodeTopUpCreditFundingTypedData(\n c: TransactionContext,\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n f: FundingInput\n) {\n const r = validateTopUpCreditRequest(c, p, cs, f),\n funding = r.creation.funding;\n if (funding.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: topUpCreditRequestHash(p, cs, f),\n payer: funding.payer,\n amount: funding.amount,\n sigNonce: funding.sigNonce,\n deadline: funding.deadline,\n },\n };\n}\nexport interface BuildCreditDrawCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: CreditDrawParams;\n deliveries: readonly Delivery[];\n}\nexport function buildCreditDrawCalldata(p: BuildCreditDrawCalldataParams) {\n validateCreditDrawRequest(p.context, p.params, p.deliveries);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"creditDraw\", [\n encodeCreditProof(p.proof),\n p.params,\n p.deliveries,\n ]) as Hex,\n nullifiers: p.params.nullifiers,\n totalAmount: p.params.totalAmount,\n };\n}\nexport interface BuildCancelCreditCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: CancelCreditParams;\n}\nexport function buildCancelCreditCalldata(p: BuildCancelCreditCalldataParams) {\n validateCancelCreditRequest(p.context, p.params);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"cancelCredit\", [\n encodeCreditProof(p.proof),\n p.params,\n ]) as Hex,\n };\n}\nexport interface BuildTopUpCreditCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: TopUpCreditParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n caller?: Address;\n}\nexport function buildTopUpCreditCalldata(p: BuildTopUpCreditCalldataParams) {\n const r = validateTopUpCreditRequest(p.context, p.params, p.deliveries, p.funding);\n validateFundingSubmission(r.creation.funding, p.caller, p.context.now);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"topUpCredit\", [\n encodeCreditProof(p.proof),\n p.params,\n p.deliveries,\n r.creation.funding,\n ]) as Hex,\n approveAmount: r.creation.funding.amount,\n };\n}\n","import type { Address, Hex } from \"./contracts\";\nimport { AbiCoder, getAddress, Interface, keccak256, ParamType, TypedDataEncoder } from \"ethers\";\n\nimport {\n invisiProtocolAbi,\n type CrossTreeTransactParams,\n type Delivery,\n type ShieldOutput,\n type ShieldParams,\n type TransactRequest,\n} from \"./contracts\";\nimport { computeNoteCommitment, walletAuthorizationTypedData } from \"@invisi-labs/core\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n field,\n fundingFields,\n getEIP712Domain,\n known,\n normalizeContext,\n normalizeOpaqueDelivery,\n normalizeFunding,\n normalizeSources,\n notes,\n pad,\n uint,\n validateFundingSubmission,\n word,\n type DeploymentContext,\n type FundingInput,\n type TransactionContext,\n} from \"./validation\";\nexport const TRANSACT_CAPACITIES = [14, 56, 112, 168] as const;\nexport type TransactCapacity = (typeof TRANSACT_CAPACITIES)[number];\nexport function selectTransactCapacity(inputs: number, outputs: number): TransactCapacity {\n if (\n !Number.isInteger(inputs) ||\n !Number.isInteger(outputs) ||\n inputs < 0 ||\n outputs < 0 ||\n inputs + outputs < 1 ||\n (inputs === 0 && outputs < 2) ||\n inputs + outputs > 168\n )\n throw new Error(\"unsupported transact shape\");\n return TRANSACT_CAPACITIES.find((n) => inputs + outputs <= n)!;\n}\nexport type TransactRequestParams = CrossTreeTransactParams;\nexport function normalizeTransactRequest(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n funding: FundingInput = {}\n) {\n const ctx = normalizeContext(c);\n if ((getAddress(p.token) as Hex) !== ctx.tokenAddress)\n throw new Error(\"request token mismatch\");\n known(p, [\n \"token\",\n \"sources\",\n \"nullifiers\",\n \"outputCommitments\",\n \"withdrawalAddress\",\n \"withdrawalAmount\",\n \"deadline\",\n ]);\n const ns = notes(p.nullifiers, \"nullifiers\"),\n os = notes(p.outputCommitments, \"outputCommitments\"),\n capacity = selectTransactCapacity(ns.length, os.length);\n const sources = normalizeSources(p.sources, ns.length, capacity),\n deliveries = dense(cs, \"deliveries\").map((v) => normalizeOpaqueDelivery(v));\n if (deliveries.length !== os.length) throw new Error(\"deliveries count mismatch\");\n const withdrawalAmount = uint(p.withdrawalAmount, 128, \"withdrawalAmount\"),\n withdrawalAddress = getAddress(p.withdrawalAddress) as Hex,\n f = normalizeFunding(funding);\n if (\n (withdrawalAmount === 0n) !== (BigInt(withdrawalAddress) === 0n) ||\n (os.length === 0 && withdrawalAmount === 0n)\n )\n throw new Error(\"invalid withdrawal\");\n if (ns.length === 0 && (f.amount === 0n || withdrawalAmount !== 0n))\n throw new Error(\"zero inputs require positive funding and zero withdrawal\");\n return {\n ...ctx,\n capacity,\n sources,\n nullifiers: ns,\n outputCommitments: os,\n inputCount: ns.length,\n outputCount: os.length,\n sourceCount: sources.length,\n inputTreeIds: pad(\n sources.map((s) => s.treeId),\n capacity\n ),\n merkleRoots: pad(\n sources.map((s) => BigInt(s.merkleRoot)),\n capacity\n ),\n slotValues: pad([...ns, ...os].map(BigInt), capacity),\n deliveries,\n deliveriesHash: deliveriesHash(deliveries),\n withdrawalAddress,\n withdrawalAmount,\n deadline: checkDeadline(c, p.deadline),\n depositAmount: f.amount,\n depositPayer: f.payer,\n funding: f,\n };\n}\nexport function transactPublicInputs(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = normalizeTransactRequest(c, p, cs, f),\n h = BigInt(r.deliveriesHash);\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.inputCount),\n BigInt(r.outputCount),\n BigInt(r.sourceCount),\n ...r.inputTreeIds,\n ...r.merkleRoots,\n ...r.slotValues,\n h >> 128n,\n h & ((1n << 128n) - 1n),\n BigInt(r.withdrawalAddress),\n r.withdrawalAmount,\n r.deadline,\n r.depositAmount,\n BigInt(r.depositPayer),\n ].map(word);\n}\nexport function encodeTransactTypedData(\n c: TransactionContext,\n p: TransactRequestParams,\n deliveries: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = normalizeTransactRequest(c, p, deliveries, f);\n return walletAuthorizationTypedData({\n context: { chainId: r.chainId, protocolAddress: BigInt(r.protocolAddress) },\n operation: \"transact\",\n capacity: r.capacity,\n words: transactPublicInputs(c, p, deliveries, f).map(BigInt),\n });\n}\nconst singleTuple = [\n \"(address token,bytes32 merkleRoot,bytes32[] nullifiers,bytes32[] outputCommitments,uint256 inputTreeId,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline)\",\n][0]!;\nconst crossTuple = [\n \"(address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32[] outputCommitments,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline)\",\n][0]!;\nexport function transactFundingRequestHash(\n proof: Hex,\n p: TransactRequestParams,\n cs: readonly Delivery[]\n) {\n const single = {\n token: p.token,\n merkleRoot: p.sources[0]?.merkleRoot ?? word(0n),\n nullifiers: p.nullifiers,\n outputCommitments: p.outputCommitments,\n inputTreeId: p.sources[0]?.treeId ?? 0n,\n withdrawalAddress: p.withdrawalAddress,\n withdrawalAmount: p.withdrawalAmount,\n deadline: p.deadline,\n };\n return p.sources.length > 1\n ? (keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, { type: \"bytes32\" }, crossTuple, { type: \"bytes32\" }].map(\n (parameter) => ParamType.from(parameter)\n ),\n [\n keccak256(new TextEncoder().encode(\"InvisiCrossTreeTransact\")),\n keccak256(proof),\n p,\n deliveriesHash(cs),\n ]\n ) as Hex\n ) as Hex)\n : (keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, singleTuple, { type: \"bytes32\" }].map((parameter) =>\n ParamType.from(parameter)\n ),\n [keccak256(proof), single, deliveriesHash(cs)]\n ) as Hex\n ) as Hex);\n}\nexport function encodeTransactFundingTypedData(\n c: TransactionContext,\n proof: Hex,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n funding: FundingInput\n) {\n normalizeTransactRequest(c, p, cs, funding);\n const f = normalizeFunding(funding);\n if (f.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: transactFundingRequestHash(proof, p, cs),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\nexport interface BuildTransactCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: TransactRequestParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n caller?: Address;\n}\nexport function buildTransactCalldata(p: BuildTransactCalldataParams) {\n const r = normalizeTransactRequest(p.context, p.params, p.deliveries, p.funding);\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n const request: TransactRequest = {\n params: {\n token: r.tokenAddress,\n sources: r.sources,\n nullifiers: r.nullifiers,\n outputCommitments: r.outputCommitments,\n withdrawalAddress: r.withdrawalAddress,\n withdrawalAmount: r.withdrawalAmount,\n deadline: r.deadline,\n },\n deliveries: p.deliveries,\n funding: r.funding,\n };\n const abi = invisiProtocolAbi.filter(\n (item) =>\n item.type === \"function\" &&\n item.name === \"transact\" &&\n item.inputs.length === 2 &&\n item.inputs[1]?.type === \"tuple\"\n );\n const data = new Interface(abi).encodeFunctionData(\"transact\", [p.proof, request]) as Hex;\n return { data, capacity: r.capacity, approveAmount: r.depositAmount };\n}\nexport interface BuildTransactAggregateCalldataParams {\n context: DeploymentContext & { now?: bigint };\n proof: Hex;\n requests: readonly TransactRequest[];\n caller?: Address;\n}\nexport function buildTransactAggregateCalldata(p: BuildTransactAggregateCalldataParams) {\n if (![4, 8, 12].includes(dense(p.requests, \"requests\").length))\n throw new Error(\"aggregate requires 4, 8 or 12 requests\");\n for (const request of p.requests) {\n const r = normalizeTransactRequest(\n { ...p.context, tokenAddress: request.params.token },\n request.params,\n request.deliveries,\n request.funding\n );\n if (r.capacity !== 14) throw new Error(\"aggregate supports only capacity 14\");\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n }\n return {\n data: new Interface(\n invisiProtocolAbi.filter(\n (item) =>\n item.type === \"function\" &&\n item.name === \"transact\" &&\n item.inputs[1]?.type === \"tuple[]\"\n )\n ).encodeFunctionData(\"transact\", [p.proof, p.requests]) as Hex,\n capacity: 14 as const,\n };\n}\nexport interface BuildShieldCalldataParams {\n context: TransactionContext;\n params: ShieldParams;\n outputs: readonly ShieldOutput[];\n deliveries: readonly Delivery[];\n funding: FundingInput;\n caller?: Address;\n}\nexport async function validateShieldRequest(p: BuildShieldCalldataParams) {\n normalizeContext(p.context);\n if ((getAddress(p.params.token) as Hex) !== (getAddress(p.context.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n known(p.params, [\"token\", \"outputCommitments\", \"deadline\"]);\n checkDeadline(p.context, p.params.deadline);\n const outputs = dense(p.outputs, \"outputs\"),\n commitments = notes(p.params.outputCommitments, \"outputCommitments\"),\n cs = dense(p.deliveries, \"deliveries\"),\n f = normalizeFunding(p.funding);\n if (\n outputs.length < 1 ||\n outputs.length > 10 ||\n commitments.length !== outputs.length ||\n cs.length !== outputs.length\n )\n throw new Error(\"shield requires 1..10 outputs and matching deliveries\");\n let total = 0n;\n for (const [i, o] of outputs.entries()) {\n known(o, [\"identity\", \"amount\"], \"output\");\n uint(o.amount, 128, \"amount\");\n if (o.amount === 0n) throw new Error(\"amount must be positive\");\n field(o.identity);\n normalizeOpaqueDelivery(cs[i]!);\n if (\n (await computeNoteCommitment(\n p.context.chainId,\n o.identity,\n BigInt(p.context.tokenAddress),\n o.amount\n )) !== commitments[i]\n )\n throw new Error(\"output commitment mismatch\");\n total += o.amount;\n }\n if (total !== f.amount) throw new Error(\"funding must equal output total\");\n return f;\n}\nexport function shieldFundingRequestHash(\n params: ShieldParams,\n outputs: readonly ShieldOutput[],\n cs: readonly Delivery[]\n) {\n const outputHash = keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"(bytes32 identity,uint256 amount)[]\"].map((parameter) => ParamType.from(parameter)),\n [outputs]\n ) as Hex\n ) as Hex;\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n \"bytes32\",\n \"(address token,bytes32[] outputCommitments,uint256 deadline)\",\n \"bytes32\",\n \"bytes32\",\n ].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiShield\")),\n params,\n outputHash,\n deliveriesHash(cs),\n ]\n ) as Hex\n ) as Hex;\n}\nexport async function encodeShieldFundingTypedData(p: BuildShieldCalldataParams) {\n const f = await validateShieldRequest(p);\n return {\n domain: getEIP712Domain(p.context),\n primaryType: \"FundShield\" as const,\n types: { FundShield: fundingFields },\n message: {\n requestHash: shieldFundingRequestHash(p.params, p.outputs, p.deliveries),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\nexport async function buildShieldCalldata(p: BuildShieldCalldataParams) {\n const f = await validateShieldRequest(p);\n validateFundingSubmission(f, p.caller, p.context.now);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"shield\", [\n p.params,\n p.outputs,\n p.deliveries,\n f,\n ]) as Hex,\n approveAmount: f.amount,\n };\n}\n\n/** Full active user-circuit public inputs: business statement followed by EIP-712 digest limbs. */\nexport function transactUserPublicInputs(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const words = transactPublicInputs(c, p, cs, f),\n digest = BigInt(\n ((typed) =>\n TypedDataEncoder.hash(\n typed.domain,\n Object.fromEntries(\n Object.entries(typed.types).map(([name, fields]) => [\n name,\n [...(fields as readonly { name: string; type: string }[])],\n ])\n ),\n typed.message\n ))(encodeTransactTypedData(c, p, cs, f))\n );\n return [...words, word(digest >> 128n), word(digest & ((1n << 128n) - 1n))];\n}\nexport type AggregateMemberInput = Pick<TransactRequest, \"params\" | \"deliveries\"> & {\n funding?: FundingInput;\n};\n/** Atomic aggregate funding binds the member statement rather than the aggregate proof bytes. */\nexport function aggregateMemberRequestHash(c: TransactionContext, r: AggregateMemberInput) {\n const capacity = selectTransactCapacity(\n r.params.nullifiers.length,\n r.params.outputCommitments.length\n );\n if (capacity !== 14) throw new Error(\"aggregate supports only capacity 14\");\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"bytes32\", \"uint256\", \"bytes32[]\"].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiAtomicBatchMemberV1\")),\n BigInt(capacity),\n transactPublicInputs(c, r.params, r.deliveries, r.funding),\n ]\n ) as Hex\n ) as Hex;\n}\n/** Router adapter business words (56 per member), not the aggregate circuit statement. */\nexport function aggregatePublicInputs(\n c: TransactionContext,\n requests: readonly AggregateMemberInput[]\n) {\n if (![4, 8, 12].includes(dense(requests, \"requests\").length))\n throw new Error(\"aggregate requires 4, 8 or 12 requests\");\n return requests.flatMap((r) => {\n const context = { ...c, tokenAddress: r.params.token };\n aggregateMemberRequestHash(context, r);\n return [word(14n), ...transactPublicInputs(context, r.params, r.deliveries, r.funding)];\n });\n}\nexport function encodeAggregateFundingTypedData(c: TransactionContext, r: AggregateMemberInput) {\n const f = normalizeFunding(r.funding);\n if (f.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: aggregateMemberRequestHash(c, r),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\n","import type { Address, Hex } from \"./contracts\";\nimport { Contract, getAddress, keccak256, type Provider } from \"ethers\";\n\nimport {\n defineDeployment,\n type ProtocolDeployment,\n type ProtocolRpcClient,\n} from \"@invisi-labs/rpc\";\nimport { buildTransactAggregateCalldata, type BuildTransactAggregateCalldataParams } from \"./funds\";\nimport type { ChainReader } from \"./interfaces\";\nimport { TokenProtocol } from \"./TokenProtocol\";\nimport { known, type DeploymentContext } from \"./validation\";\n\nexport interface ProtocolOptions {\n deployment: ProtocolDeployment;\n}\n\n/** A multi-token deployment. Asset support is always read from the chain. */\nexport class Protocol {\n readonly deployment: Readonly<ProtocolDeployment>;\n readonly context: Readonly<DeploymentContext>;\n\n constructor(options: ProtocolOptions) {\n known(options, [\"deployment\"], \"protocol options\");\n this.deployment = defineDeployment(options.deployment);\n this.context = Object.freeze({\n chainId: this.deployment.chainId,\n protocolAddress: this.deployment.protocol.address,\n });\n Object.freeze(this);\n }\n\n /** Load the selected deployment and verify its contract against Chain RPC before returning. */\n static async fromRpc(\n rpc: Pick<ProtocolRpcClient, \"getDeployment\">,\n provider: Provider,\n options: { signal?: AbortSignal } = {}\n ): Promise<Protocol> {\n const chainId = (await provider.getNetwork()).chainId;\n if (typeof chainId !== \"bigint\" || chainId <= 0n || chainId >= 1n << 64n)\n throw new Error(\"invalid protocol chainId\");\n const deployment = await rpc.getDeployment(\n chainId,\n options.signal ? { signal: options.signal } : {}\n );\n const protocol = new Protocol({ deployment });\n if (protocol.context.chainId !== chainId) throw new Error(\"RPC deployment chain mismatch\");\n await protocol.validateDeployment(provider);\n return protocol;\n }\n\n async validateDeployment(\n connection:\n | Provider\n | (Pick<ChainReader, \"getChainId\" | \"getCode\"> & {\n getProtocolVersion?(address: Address): Promise<bigint>;\n getProtocolAddressRegistry?(address: Address): Promise<Address>;\n })\n ): Promise<void> {\n const reader =\n \"getNetwork\" in connection\n ? {\n getChainId: async () => (await connection.getNetwork()).chainId,\n getCode: async (address: Address) =>\n (await connection.getCode(address)) as Hex,\n getProtocolAddressRegistry: async (address: Address) =>\n getAddress(\n await new Contract(\n address,\n [\"function addressRegistry() view returns (address)\"],\n connection\n ).getFunction(\"addressRegistry\")()\n ) as Address,\n getProtocolVersion: async (address: Address) =>\n BigInt(\n await new Contract(\n address,\n [\"function VERSION() view returns (uint256)\"],\n connection\n ).getFunction(\"VERSION\")()\n ),\n }\n : connection;\n if ((await reader.getChainId()) !== this.context.chainId)\n throw new Error(\"deployment chain mismatch\");\n const code = await reader.getCode(this.context.protocolAddress);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(code) ||\n (keccak256(code) as Hex) !== this.deployment.protocol.runtimeCodeHash\n )\n throw new Error(\"protocol runtime code profile mismatch\");\n if (\n reader.getProtocolVersion &&\n (await reader.getProtocolVersion(this.context.protocolAddress)) !== 1n\n )\n throw new Error(\"unsupported onchain protocol version\");\n const registry = this.deployment.registry;\n if (registry) {\n if (!reader.getProtocolAddressRegistry)\n throw new Error(\"registry binding reader capability is missing\");\n if (\n getAddress(\n await reader.getProtocolAddressRegistry(this.context.protocolAddress)\n ) !== getAddress(registry.address)\n )\n throw new Error(\"protocol registry binding mismatch\");\n const registryCode = await reader.getCode(registry.address);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(registryCode) ||\n keccak256(registryCode) !== registry.runtimeCodeHash\n )\n throw new Error(\"registry runtime code profile mismatch\");\n }\n }\n\n aggregate(request: Omit<BuildTransactAggregateCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTransactAggregateCalldata({ ...request, context: this.context }),\n };\n }\n\n /** Build an operation context for one asset within this same deployment. */\n forToken(tokenAddress: Address): TokenProtocol {\n return new TokenProtocol(\n { ...this.context, tokenAddress: getAddress(tokenAddress) as Hex },\n { expectedRuntimeCodeHash: this.deployment.protocol.runtimeCodeHash }\n );\n }\n}\n","import type { Hex } from \"./contracts\";\nimport { keccak256 } from \"ethers\";\n\nimport { MissingCapabilityError } from \"@invisi-labs/core\";\nimport { buildCreateCreditCalldata, type BuildCreateCreditCalldataParams } from \"./credit-create\";\nimport {\n buildCancelCreditCalldata,\n buildCreditDrawCalldata,\n buildTopUpCreditCalldata,\n type BuildCancelCreditCalldataParams,\n type BuildCreditDrawCalldataParams,\n type BuildTopUpCreditCalldataParams,\n} from \"./credit-lifecycle\";\nimport {\n buildShieldCalldata,\n buildTransactAggregateCalldata,\n buildTransactCalldata,\n type BuildShieldCalldataParams,\n type BuildTransactAggregateCalldataParams,\n type BuildTransactCalldataParams,\n} from \"./funds\";\nimport type { ChainReader } from \"./interfaces\";\nimport { normalizeContext, type TransactionContext } from \"./validation\";\n\nexport interface TokenProtocolOptions {\n expectedRuntimeCodeHash?: Hex;\n}\n\n/** A token-specific operation binding within a multi-token deployment. Pure builders never sign or submit. */\nexport class TokenProtocol {\n readonly context: Readonly<TransactionContext>;\n readonly expectedRuntimeCodeHash: Hex | undefined;\n\n constructor(context: TransactionContext, options: TokenProtocolOptions = {}) {\n const normalized = normalizeContext(context);\n if (BigInt(normalized.protocolAddress) === 0n || BigInt(normalized.tokenAddress) === 0n) {\n throw new Error(\"deployment addresses must be nonzero\");\n }\n if (\n options.expectedRuntimeCodeHash &&\n !/^0x[0-9a-fA-F]{64}$/.test(options.expectedRuntimeCodeHash)\n ) {\n throw new Error(\"invalid runtime code hash\");\n }\n this.expectedRuntimeCodeHash = options.expectedRuntimeCodeHash?.toLowerCase() as\n Hex | undefined;\n this.context = Object.freeze(normalized);\n Object.freeze(this);\n }\n\n async validateDeployment(\n reader: Pick<ChainReader, \"getChainId\" | \"getCode\">,\n options: { requireRuntimeProfile?: boolean } = {}\n ): Promise<void> {\n if ((options.requireRuntimeProfile ?? true) && !this.expectedRuntimeCodeHash) {\n throw new MissingCapabilityError(\"trusted deployment profile\");\n }\n if ((await reader.getChainId()) !== this.context.chainId) {\n throw new Error(\"deployment chain mismatch\");\n }\n const code = await reader.getCode(this.context.protocolAddress);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(code) ||\n (this.expectedRuntimeCodeHash &&\n (keccak256(code) as Hex) !== this.expectedRuntimeCodeHash)\n ) {\n throw new Error(\"deployment runtime code profile mismatch\");\n }\n const tokenCode = await reader.getCode(this.context.tokenAddress);\n if (!/^0x(?:[0-9a-fA-F]{2})+$/.test(tokenCode)) {\n throw new Error(\"token address must have contract code\");\n }\n }\n\n transact(request: Omit<BuildTransactCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTransactCalldata({ ...request, context: this.context }),\n };\n }\n\n aggregate(request: Omit<BuildTransactAggregateCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTransactAggregateCalldata({ ...request, context: this.context }),\n };\n }\n\n async shield(request: Omit<BuildShieldCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...(await buildShieldCalldata({ ...request, context: this.context })),\n };\n }\n\n createCredit(request: Omit<BuildCreateCreditCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildCreateCreditCalldata({ ...request, context: this.context }),\n };\n }\n\n drawCredit(request: Omit<BuildCreditDrawCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildCreditDrawCalldata({ ...request, context: this.context }),\n };\n }\n\n cancelCredit(request: Omit<BuildCancelCreditCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildCancelCreditCalldata({ ...request, context: this.context }),\n };\n }\n\n topUpCredit(request: Omit<BuildTopUpCreditCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTopUpCreditCalldata({ ...request, context: this.context }),\n };\n }\n}\n","import {\n computeCreditCommitment,\n computeCreditSharedKeyHash,\n computeNoteCommitment,\n computeNoteIdentity,\n FIELD_MODULUS,\n} from \"@invisi-labs/core\";\n\nexport interface VerifyNoteCommitmentParams {\n walletIdentity: `0x${string}`;\n tokenAddress: `0x${string}`;\n amount: bigint;\n nonce: `0x${string}`;\n noteCommitment: `0x${string}`;\n chainId: bigint;\n}\n\nexport async function verifyNoteCommitment(params: VerifyNoteCommitmentParams): Promise<boolean> {\n const expected = await computeNoteCommitment(\n params.chainId,\n await computeNoteIdentity(BigInt(params.walletIdentity), BigInt(params.nonce)),\n BigInt(params.tokenAddress),\n params.amount\n );\n return BigInt(expected) === BigInt(params.noteCommitment);\n}\n\nexport interface VerifyCreditCommitmentParams extends Partial<\n import(\"@invisi-labs/core\").CreditPolicy\n> {\n chainId: bigint;\n spenderWalletIdentity: `0x${string}`;\n ownerWalletIdentity: `0x${string}`;\n spenderPayout: `0x${string}`;\n ownerPayout: `0x${string}`;\n tokenAddress: `0x${string}`;\n amount: bigint;\n nonce: bigint;\n expiry: bigint;\n creditSharedKey: bigint;\n /** Server-returned value to verify against the locally recomputed commitment. */\n creditCommitment: `0x${string}`;\n}\n\n/**\n * Hashes the received shared key locally, recomputes the Credit leaf and compares it to the\n * server-returned value. A mismatch means the server folded a wrong nonce\n * (or other parameter) — the caller MUST abort and not create a Credit.\n */\nexport async function verifyCreditCommitment(\n params: VerifyCreditCommitmentParams\n): Promise<boolean> {\n if (params.creditSharedKey <= 0n || params.creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"creditSharedKey must be a nonzero canonical Field\");\n const expected = await computeCreditCommitment(\n params.chainId,\n params.spenderWalletIdentity,\n params.ownerWalletIdentity,\n BigInt(params.spenderPayout),\n BigInt(params.ownerPayout),\n BigInt(params.tokenAddress),\n params.amount,\n params.nonce,\n params.expiry,\n await computeCreditSharedKeyHash(params.creditSharedKey),\n params\n );\n return BigInt(expected) === BigInt(params.creditCommitment);\n}\n","import type {\n CancelCreditParams,\n CreateCreditParams,\n CreditDrawParams,\n Delivery,\n Hex,\n InputSource,\n TopUpCreditParams,\n} from \"./contracts\";\n\nimport {\n computeCreditCommitment,\n normalizeCreditPolicy,\n applyCreditDrawUsage,\n computeCreditNullifier,\n computeCreditSharedKeyHash,\n computeNoteCommitment,\n computeNoteIdentity,\n computeNoteNullifier,\n computeWalletAuthorizationDigest,\n normalizeCreditDeliveryState,\n poseidonHash,\n verifyWalletAuthorization,\n type AuthorizedStatement,\n type CreditDeliveryState,\n type CreditNote,\n type Note,\n type WalletAuthorizationWitness,\n type WalletOperation,\n} from \"@invisi-labs/core\";\nimport {\n LocalWitness,\n type CircuitName,\n type ProofStatement,\n type ProofTarget,\n type ProvingRequest,\n} from \"@invisi-labs/prover\";\n\nimport { TokenProtocol } from \"./TokenProtocol\";\nimport { createCreditPublicInputs } from \"./credit-create\";\nimport {\n cancelCreditPublicInputs,\n creditDrawPublicInputs,\n selectCreditDrawCircuit,\n topUpCreditPublicInputs,\n} from \"./credit-lifecycle\";\nimport {\n normalizeTransactRequest,\n transactUserPublicInputs,\n type BuildTransactCalldataParams,\n} from \"./funds\";\nimport { FIELD_MODULUS, type FundingInput } from \"./validation\";\nimport layouts from \"./witness-layouts.json\";\n\nexport interface NoteMembership {\n note: Note;\n treeId: bigint;\n leafIndex: number;\n path: readonly bigint[];\n}\nexport interface CreditMembership {\n state: CreditDeliveryState;\n treeId: bigint;\n leafIndex: number;\n path: readonly bigint[];\n}\nexport interface TransactWitnessParams extends Omit<\n BuildTransactCalldataParams,\n \"proof\" | \"context\"\n> {\n inputs: readonly NoteMembership[];\n outputs: readonly Note[];\n authorization?: AuthorizedStatement;\n target?: ProofTarget;\n}\nexport interface CreateCreditWitnessParams {\n params: CreateCreditParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n inputs: readonly NoteMembership[];\n state: CreditDeliveryState;\n change?: Note;\n authorization: AuthorizedStatement;\n}\nexport interface DrawCreditWitnessParams {\n /** Explicit chain timestamp used to prepare this signed statement. */\n timestamp: bigint;\n params: CreditDrawParams;\n deliveries: readonly Delivery[];\n inputs: readonly CreditMembership[];\n amounts: readonly bigint[];\n authorization: AuthorizedStatement;\n}\nexport interface CancelCreditWitnessParams {\n params: CancelCreditParams;\n input: CreditMembership;\n authorization: AuthorizedStatement;\n}\nexport interface TopUpCreditWitnessParams extends Omit<CreateCreditWitnessParams, \"params\"> {\n params: TopUpCreditParams;\n previous: CreditMembership;\n}\nconst pad = <T>(values: readonly T[], count: number, zero: () => T): T[] => {\n if (values.length > count) throw new Error(\"witness capacity exceeded\");\n return [...values, ...Array.from({ length: count - values.length }, zero)];\n};\nconst policyWitness = (note: CreditNote, usage = true) => {\n const p = normalizeCreditPolicy(note);\n return {\n single_limit: p.singleLimit,\n daily_limit: p.dailyLimit,\n monthly_limit: p.monthlyLimit,\n ...(usage\n ? {\n last_day: p.lastDay,\n daily_spent: p.dailySpent,\n last_month: p.lastMonth,\n monthly_spent: p.monthlySpent,\n }\n : {}),\n };\n};\nconst zeros = () => Array<bigint>(16).fill(0n);\nconst zeroAuthority = (): WalletAuthorizationWitness => ({\n public_key_x: Array<number>(32).fill(0),\n public_key_y: Array<number>(32).fill(0),\n signature: Array<number>(64).fill(0),\n});\nfunction check(ok: boolean, message: string): asserts ok {\n if (!ok) throw new Error(message);\n}\nfunction provingRequest(\n circuitName: CircuitName,\n privateInputs: Record<string, unknown>,\n expectedPublicInputs: readonly Hex[],\n target: ProofTarget = \"evm\"\n): ProvingRequest {\n const schema = layouts[circuitName],\n key = schema.keys[target as keyof typeof schema.keys];\n check(typeof key === \"string\", \"unpublished proof target\");\n check(\n expectedPublicInputs.length === schema.publicInputCount,\n \"public input order/width mismatch\"\n );\n check(\n Object.keys(privateInputs).length === schema.private.length &&\n schema.private.every((name) => Object.hasOwn(privateInputs, name)),\n \"private witness schema mismatch\"\n );\n let offset = 0;\n const publicInputs: Record<string, unknown> = {};\n for (const entry of schema.public) {\n const values = expectedPublicInputs.slice(offset, offset + entry.count).map((value) => {\n const n = BigInt(value);\n check(n >= 0n && n < FIELD_MODULUS, \"noncanonical public input\");\n return n;\n });\n publicInputs[entry.name] = entry.array ? values : values[0];\n offset += entry.count;\n }\n check(offset === expectedPublicInputs.length, \"public input layout mismatch\");\n return {\n circuitName,\n target,\n artifactSha256: schema.artifactSha256,\n vkSha256: key,\n expectedPublicInputs: [...expectedPublicInputs],\n witness: new LocalWitness({ ...privateInputs, ...publicInputs }),\n };\n}\n/** Local typed assembly for authenticated circuit releases; no network or backend selection. */\nexport class WitnessBuilder {\n readonly #protocol: TokenProtocol;\n constructor(protocol: TokenProtocol) {\n this.#protocol = protocol;\n }\n static statement(\n circuitName: CircuitName,\n expectedPublicInputs: readonly Hex[],\n target: ProofTarget = \"evm\"\n ): ProofStatement {\n const schema = layouts[circuitName],\n key = schema.keys[target as keyof typeof schema.keys];\n check(\n typeof key === \"string\" && expectedPublicInputs.length === schema.publicInputCount,\n \"unpublished target or statement width mismatch\"\n );\n return {\n circuitName,\n target,\n artifactSha256: schema.artifactSha256,\n vkSha256: key,\n expectedPublicInputs: [...expectedPublicInputs],\n };\n }\n private context(note: Note | CreditNote): void {\n const c = this.#protocol.context;\n check(\n note.chainId === c.chainId &&\n note.protocolAddress === BigInt(c.protocolAddress) &&\n note.tokenAddress === BigInt(c.tokenAddress),\n \"note context mismatch\"\n );\n }\n private async authority(\n operation: WalletOperation,\n capacity: number,\n words: readonly Hex[],\n signed: AuthorizedStatement | undefined,\n identity: Hex\n ): Promise<WalletAuthorizationWitness> {\n check(!!signed, \"private wallet authorization required\");\n const c = this.#protocol.context,\n request = {\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation,\n capacity,\n words: words.slice(0, -2).map(BigInt),\n };\n check(\n signed.walletIdentity === identity &&\n signed.digest === computeWalletAuthorizationDigest(request),\n \"authorization statement mismatch\"\n );\n const witness = signed.withWitness((value) => value);\n check(\n await verifyWalletAuthorization(\n identity,\n Uint8Array.from([4, ...witness.public_key_x, ...witness.public_key_y]),\n Uint8Array.from(witness.signature),\n request\n ),\n \"invalid wallet authorization\"\n );\n return witness;\n }\n private async membership(\n leaf: Hex,\n input: { treeId: bigint; leafIndex: number; path: readonly bigint[] },\n sources: readonly InputSource[]\n ): Promise<number> {\n const source = sources.findIndex((value) => value.treeId === input.treeId);\n check(\n source >= 0 &&\n Number.isInteger(input.leafIndex) &&\n input.leafIndex >= 0 &&\n input.leafIndex < 65536 &&\n input.path.length === 16,\n \"invalid membership position\"\n );\n let root = BigInt(leaf);\n for (let level = 0; level < 16; level++)\n root = BigInt(\n await poseidonHash(\n (input.leafIndex >> level) & 1\n ? [input.path[level]!, root]\n : [root, input.path[level]!]\n )\n );\n check(root === BigInt(sources[source]!.merkleRoot), \"membership root mismatch\");\n return source;\n }\n private async noteLeaf(note: Note): Promise<Hex> {\n this.context(note);\n return computeNoteCommitment(\n note.chainId,\n await computeNoteIdentity(BigInt(note.walletIdentity), note.nonce),\n note.tokenAddress,\n note.amount\n );\n }\n private async creditLeaf(note: CreditNote): Promise<Hex> {\n this.context(note);\n return computeCreditCommitment(\n note.chainId,\n note.spenderWalletIdentity,\n note.ownerWalletIdentity,\n note.spenderPayout,\n note.ownerPayout,\n note.tokenAddress,\n note.amount,\n note.nonce,\n note.expiry,\n await computeCreditSharedKeyHash(note.creditSharedKey),\n note\n );\n }\n private async noteInputs(\n inputs: readonly NoteMembership[],\n sources: readonly InputSource[],\n nullifiers: readonly Hex[],\n identity: Hex,\n authority: WalletAuthorizationWitness\n ) {\n check(inputs.length === nullifiers.length, \"input count mismatch\");\n return Promise.all(\n inputs.map(async (input, i) => {\n check(input.note.walletIdentity === identity, \"input wallet mismatch\");\n const leaf = await this.noteLeaf(input.note);\n check(\n (await computeNoteNullifier(input.note.chainId, input.note.nonce, leaf)) ===\n nullifiers[i],\n \"input nullifier mismatch\"\n );\n return BigInt(await this.membership(leaf, input, sources));\n })\n );\n }\n async transact(p: TransactWitnessParams): Promise<ProvingRequest> {\n const c = this.#protocol.context,\n n = normalizeTransactRequest(c, p.params, p.deliveries, p.funding),\n words = transactUserPublicInputs(c, p.params, p.deliveries, p.funding);\n check(\n p.inputs.length === n.inputCount && p.outputs.length === n.outputCount,\n \"note count mismatch\"\n );\n const identity = p.inputs[0]?.note.walletIdentity;\n const unsignedSweep =\n !!identity &&\n !p.authorization &&\n n.outputCount === 0 &&\n n.depositAmount === 0n &&\n BigInt(p.params.withdrawalAddress) === BigInt(identity);\n const authority =\n identity && !unsignedSweep\n ? await this.authority(\"transact\", n.capacity, words, p.authorization, identity)\n : zeroAuthority();\n const sources = await this.noteInputs(\n p.inputs,\n p.params.sources,\n p.params.nullifiers,\n identity ?? ((\"0x\" + \"00\".repeat(32)) as Hex),\n authority\n );\n for (const [i, note] of p.outputs.entries())\n check(\n (await this.noteLeaf(note)) === p.params.outputCommitments[i],\n \"output commitment mismatch\"\n );\n const all = [...p.inputs.map((input) => input.note), ...p.outputs];\n return provingRequest(\n `transact_user_slots${n.capacity}`,\n {\n wallet_identity: identity ? BigInt(identity) : 0n,\n ...authority,\n output_wallet_identities: pad(\n [\n ...p.inputs.map(() => 0n),\n ...p.outputs.map((note) => BigInt(note.walletIdentity)),\n ],\n n.capacity,\n () => 0n\n ),\n amounts: pad(\n all.map((note) => note.amount),\n n.capacity,\n () => 0n\n ),\n nonces: pad(\n all.map((note) => note.nonce),\n n.capacity,\n () => 0n\n ),\n leaf_indices: pad(\n p.inputs.map((input) => BigInt(input.leafIndex)),\n n.capacity,\n () => 0n\n ),\n merkle_paths: pad(\n p.inputs.map((input) => [...input.path]),\n n.capacity,\n zeros\n ),\n input_source_indices: pad(sources, n.capacity, () => 0n),\n },\n words,\n p.target\n );\n }\n private async creation(\n p: CreateCreditWitnessParams,\n operation: \"create-credit\" | \"top-up-credit\",\n words: readonly Hex[]\n ) {\n const state = normalizeCreditDeliveryState(p.state),\n note = state.note;\n check(\n (await this.creditLeaf(note)) === p.params.creditCommitment &&\n note.ownerPayout === BigInt(p.params.owner) &&\n note.expiry === p.params.expiry,\n \"Credit creation mismatch\"\n );\n if (\n operation === \"create-credit\" &&\n [note.lastDay, note.dailySpent, note.lastMonth, note.monthlySpent].some((v) => v !== 0n)\n )\n throw new Error(\"new Credit usage must be zero\");\n const authority = await this.authority(\n operation,\n 10,\n words,\n p.authorization,\n note.ownerWalletIdentity\n );\n const sources = await this.noteInputs(\n p.inputs,\n p.params.sources,\n p.params.nullifiers,\n note.ownerWalletIdentity,\n authority\n );\n if (p.change)\n check(\n p.change.walletIdentity === note.ownerWalletIdentity &&\n (await this.noteLeaf(p.change)) === p.params.changeCommitment,\n \"change commitment mismatch\"\n );\n else check(BigInt(p.params.changeCommitment) === 0n, \"missing change note\");\n return {\n ...authority,\n input_amounts: pad(\n p.inputs.map((input) => input.note.amount),\n 10,\n () => 0n\n ),\n input_nonces: pad(\n p.inputs.map((input) => input.note.nonce),\n 10,\n () => 0n\n ),\n leaf_indices: pad(\n p.inputs.map((input) => BigInt(input.leafIndex)),\n 10,\n () => 0n\n ),\n merkle_paths: pad(\n p.inputs.map((input) => [...input.path]),\n 10,\n zeros\n ),\n input_source_indices: pad(sources, 10, () => 0n),\n spender_payout: note.spenderPayout,\n spender_wallet_identity: BigInt(note.spenderWalletIdentity),\n owner_wallet_identity: BigInt(note.ownerWalletIdentity),\n ...policyWitness(note, operation === \"top-up-credit\"),\n credit_amount: note.amount,\n credit_nonce: note.nonce,\n credit_shared_key: note.creditSharedKey,\n change_amount: p.change?.amount ?? 0n,\n change_nonce: p.change?.nonce ?? 0n,\n };\n }\n async createCredit(p: CreateCreditWitnessParams): Promise<ProvingRequest> {\n const words = createCreditPublicInputs(\n this.#protocol.context,\n p.params,\n p.deliveries,\n p.funding\n );\n return provingRequest(\n \"create_credit\",\n await this.creation(p, \"create-credit\", words),\n words\n );\n }\n async cancelCredit(p: CancelCreditWitnessParams): Promise<ProvingRequest> {\n const note = normalizeCreditDeliveryState(p.input.state).note,\n leaf = await this.creditLeaf(note),\n c = this.#protocol.context;\n check(\n (await computeCreditNullifier(c.chainId, note.creditSharedKey, leaf)) ===\n p.params.nullifier &&\n note.amount === p.params.amount &&\n note.ownerPayout === BigInt(p.params.owner),\n \"Credit cancellation mismatch\"\n );\n await this.membership(leaf, p.input, [p.params.source]);\n const words = cancelCreditPublicInputs(c, p.params),\n authority = await this.authority(\n \"cancel-credit\",\n 1,\n words,\n p.authorization,\n note.ownerWalletIdentity\n );\n return provingRequest(\n \"credit_cancel\",\n {\n ...authority,\n spender_payout: note.spenderPayout,\n spender_wallet_identity: BigInt(note.spenderWalletIdentity),\n owner_wallet_identity: BigInt(note.ownerWalletIdentity),\n ...policyWitness(note),\n input_nonce: note.nonce,\n expiry: note.expiry,\n credit_shared_key: note.creditSharedKey,\n leaf_index: BigInt(p.input.leafIndex),\n merkle_path: [...p.input.path],\n },\n words\n );\n }\n async drawCredit(p: DrawCreditWitnessParams): Promise<ProvingRequest> {\n const c = { ...this.#protocol.context, timestamp: p.timestamp },\n profile = selectCreditDrawCircuit(p.inputs.length),\n capacity = profile.maxSize;\n check(\n p.inputs.length === p.amounts.length && p.inputs.length === p.params.nullifiers.length,\n \"draw input count mismatch\"\n );\n const notes = p.inputs.map((input) => normalizeCreditDeliveryState(input.state).note),\n identity = notes[0]!.spenderWalletIdentity;\n const words = creditDrawPublicInputs(c, p.params, p.deliveries),\n authority = await this.authority(\n \"credit-draw\",\n capacity,\n words,\n p.authorization,\n identity\n );\n const sourceIndices = await Promise.all(\n notes.map(async (note, i) => {\n applyCreditDrawUsage(note, p.amounts[i]!, p.timestamp);\n const leaf = await this.creditLeaf(note);\n check(\n note.spenderWalletIdentity === identity &&\n note.spenderPayout === BigInt(p.params.spender) &&\n note.expiry === p.params.expiries[i] &&\n p.amounts[i]! > 0n &&\n p.amounts[i]! <= note.amount &&\n (await computeCreditNullifier(c.chainId, note.creditSharedKey, leaf)) ===\n p.params.nullifiers[i],\n \"Credit draw mismatch\"\n );\n return BigInt(await this.membership(leaf, p.inputs[i]!, p.params.sources));\n })\n );\n return provingRequest(\n profile.name as CircuitName,\n {\n ...authority,\n ...Object.fromEntries(\n Object.entries({\n singleLimit: \"single_limits\",\n dailyLimit: \"daily_limits\",\n monthlyLimit: \"monthly_limits\",\n lastDay: \"last_days\",\n dailySpent: \"daily_spents\",\n lastMonth: \"last_months\",\n monthlySpent: \"monthly_spents\",\n }).map(([key, name]) => [\n name,\n pad(\n notes.map(\n (note) =>\n normalizeCreditPolicy(note)[\n key as keyof ReturnType<typeof normalizeCreditPolicy>\n ]\n ),\n capacity,\n () => 0n\n ),\n ])\n ),\n spender_wallet_identity: BigInt(identity),\n owner_payouts: pad(\n notes.map((note) => note.ownerPayout),\n capacity,\n () => 0n\n ),\n owner_wallet_identities: pad(\n notes.map((note) => BigInt(note.ownerWalletIdentity)),\n capacity,\n () => 0n\n ),\n input_amounts: pad(\n notes.map((note) => note.amount),\n capacity,\n () => 0n\n ),\n input_nonces: pad(\n notes.map((note) => note.nonce),\n capacity,\n () => 0n\n ),\n credit_shared_keys: pad(\n notes.map((note) => note.creditSharedKey),\n capacity,\n () => 0n\n ),\n leaf_indices: pad(\n p.inputs.map((input) => BigInt(input.leafIndex)),\n capacity,\n () => 0n\n ),\n merkle_paths: pad(\n p.inputs.map((input) => [...input.path]),\n capacity,\n zeros\n ),\n input_source_indices: pad(sourceIndices, capacity, () => 0n),\n draw_amounts: pad(p.amounts, capacity, () => 0n),\n },\n words\n );\n }\n async topUpCredit(p: TopUpCreditWitnessParams): Promise<ProvingRequest> {\n const c = this.#protocol.context,\n previous = normalizeCreditDeliveryState(p.previous.state),\n next = normalizeCreditDeliveryState(p.state),\n old = previous.note,\n note = next.note,\n leaf = await this.creditLeaf(old);\n for (const field of [\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"spenderPayout\",\n \"ownerPayout\",\n \"creditSharedKey\",\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n ] as const)\n check(old[field] === note[field], \"Credit role or payout changed\");\n check(\n JSON.stringify(previous.ownerReceivingKeys) ===\n JSON.stringify(next.ownerReceivingKeys) &&\n JSON.stringify(previous.spenderReceivingKeys) ===\n JSON.stringify(next.spenderReceivingKeys),\n \"Credit receiving snapshots changed\"\n );\n check(\n old.amount < note.amount &&\n old.expiry <= note.expiry &&\n old.expiry === p.params.previousExpiry &&\n (c.now === undefined || old.expiry > c.now),\n \"invalid Credit top-up\"\n );\n check(\n (await computeCreditNullifier(c.chainId, old.creditSharedKey, leaf)) ===\n p.params.creditNullifier,\n \"previous Credit nullifier mismatch\"\n );\n await this.membership(leaf, p.previous, [p.params.creditSource]);\n const words = topUpCreditPublicInputs(c, p.params, p.deliveries, p.funding),\n base = await this.creation({ ...p, params: p.params.creation }, \"top-up-credit\", words);\n return provingRequest(\n \"credit_top_up\",\n {\n ...base,\n previous_single_limit: old.singleLimit!,\n previous_daily_limit: old.dailyLimit!,\n previous_monthly_limit: old.monthlyLimit!,\n previous_credit_amount: old.amount,\n previous_credit_nonce: old.nonce,\n previous_credit_leaf_index: BigInt(p.previous.leafIndex),\n previous_credit_merkle_path: [...p.previous.path],\n },\n words\n );\n }\n}\n","{\n \"transact_user_slots14\": {\n \"artifactSha256\": \"486a749ae3944ae83a7ff2d298e7469b18737d88553a7d99c4782f22f7332996\",\n \"keys\": {\n \"evm\": \"7b3e65d5201246e733a1816489d80acb219a98e8606e1b81e6d48ff0c1fd537a\",\n \"noir-recursive\": \"148957e28e6339a8ce1121851fb7a232e31f4c5b741e415733b8d627f4b62649\"\n },\n \"publicInputCount\": 57,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 14,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 14,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 14,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"wallet_identity\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_wallet_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_user_slots56\": {\n \"artifactSha256\": \"169db2ff23c15adb14756edf9bb99bbd343df807b3e1c7f1f510070897e653cf\",\n \"keys\": {\n \"evm\": \"cbf54de94bff266bf846f9722c0f3ffa1fb7a0f9f478466f193de0e9123ce7f5\"\n },\n \"publicInputCount\": 183,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 56,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 56,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 56,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"wallet_identity\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_wallet_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_user_slots112\": {\n \"artifactSha256\": \"221bbbd6ff0c7d7dec74677e52484f082b3e176bb0fa47f3236064e396d73739\",\n \"keys\": {\n \"evm\": \"67b2d361b023f193ecdb5a9aefbe2840349ee5ce848ab4101416734f3a7e91e9\"\n },\n \"publicInputCount\": 351,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 112,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 112,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 112,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"wallet_identity\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_wallet_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_user_slots168\": {\n \"artifactSha256\": \"d479253eaaacc973806a84e142e2362d873bba0f150ce050d32b8d9b2947adc8\",\n \"keys\": {\n \"evm\": \"c50e72b0718c6393f82f5a67e248ba093d0db56ece42bbf092da93e9369c2624\"\n },\n \"publicInputCount\": 519,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 168,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 168,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 168,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"wallet_identity\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_wallet_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_aggregate_14_4\": {\n \"artifactSha256\": \"4fe7c63fb80cba35af4c4525fbabcfb75033286e681afbdcb3fb043c03456246\",\n \"keys\": {\n \"evm\": \"664d4ff0de6b8c876ce990ea368d7a59cee411463c24dd5621d64c8949554674\"\n },\n \"publicInputCount\": 229,\n \"public\": [\n {\n \"name\": \"statements\",\n \"count\": 4,\n \"array\": true\n },\n {\n \"name\": \"inner_vk_commitment\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"verification_key\",\n \"key_hash\",\n \"proofs\"\n ]\n },\n \"transact_aggregate_14_8\": {\n \"artifactSha256\": \"0a266ad4bb4c6dce42b1e851fcbb34b1becae1edd6bf6af82d7b9ed7184576df\",\n \"keys\": {\n \"evm\": \"042139122d0eee8beeaa9c18397276fa5a2872218495fa16ca438fbdd80fa3e1\"\n },\n \"publicInputCount\": 457,\n \"public\": [\n {\n \"name\": \"statements\",\n \"count\": 8,\n \"array\": true\n },\n {\n \"name\": \"inner_vk_commitment\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"verification_key\",\n \"key_hash\",\n \"proofs\"\n ]\n },\n \"transact_aggregate_14_12\": {\n \"artifactSha256\": \"738849e83eb4a78eb69cb6e20a86f6f27ba3784d04a83abd338f84de5c20d7d2\",\n \"keys\": {\n \"evm\": \"539928b264aea4d07a41e772d5d5a7b7666a6883decb985c27ca7422e7f8ea1f\"\n },\n \"publicInputCount\": 685,\n \"public\": [\n {\n \"name\": \"statements\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"inner_vk_commitment\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"verification_key\",\n \"key_hash\",\n \"proofs\"\n ]\n },\n \"create_credit\": {\n \"artifactSha256\": \"3ed6cfdee4f5fd840f023580f76c208768777fea79737f2511377e5c55be0230\",\n \"keys\": {\n \"evm\": \"56f663c6053be0d158a271022d200c732597efd3a2e0be48fe94549d0b1795e0\"\n },\n \"publicInputCount\": 46,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"owner_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"credit_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"change_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"expiry\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_amounts\",\n \"input_nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_payout\",\n \"spender_wallet_identity\",\n \"owner_wallet_identity\",\n \"credit_amount\",\n \"credit_nonce\",\n \"credit_shared_key\",\n \"single_limit\",\n \"daily_limit\",\n \"monthly_limit\",\n \"change_amount\",\n \"change_nonce\"\n ]\n },\n \"credit_draw_slots1\": {\n \"artifactSha256\": \"4542b227e0552b45c302f1dace21cadeba4962c96244e021472f1f7531cff8d1\",\n \"keys\": {\n \"evm\": \"43c051a2bedf9454c12e70b10156361e414944823ba23e80662c16c7ced0a2ce\"\n },\n \"publicInputCount\": 20,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_draw_slots12\": {\n \"artifactSha256\": \"dd72b0867fc3be7cd90de263bd2d0892075cb18eb4f6dd671b13111710f10369\",\n \"keys\": {\n \"evm\": \"5e31d771e6294993736078596d9c69f21fe7595eda50e3cce6d7406b65cf1443\"\n },\n \"publicInputCount\": 86,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_draw_slots50\": {\n \"artifactSha256\": \"09c7469866748b4c0c4bbf2b040844771948a170999f6dc7a38fe5c0ecda4054\",\n \"keys\": {\n \"evm\": \"7b613225b6f32a077011d4196c356e836d22dcd116efe687fde53144fbd8db9f\"\n },\n \"publicInputCount\": 314,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_draw_slots120\": {\n \"artifactSha256\": \"6ccd0366a669c50fd5da875c3eae194fe8aa4c36d35a5f9ebfd64636ea599b48\",\n \"keys\": {\n \"evm\": \"d715848afc5c1ecdfcef5ed5026865abef5040a3bc232fd65330a5ffee8475fb\"\n },\n \"publicInputCount\": 734,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_cancel\": {\n \"artifactSha256\": \"b4459c2cf756d096e37291cf4d7cd129866b6d420b6d03c928f383b057112ccb\",\n \"keys\": {\n \"evm\": \"fc8ad196ef15f3328afcc8f01d867a3ebefd15451c2813948442fab1923b73b2\"\n },\n \"publicInputCount\": 11,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"owner_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"merkle_root\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"nullifier\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_payout\",\n \"spender_wallet_identity\",\n \"owner_wallet_identity\",\n \"input_nonce\",\n \"expiry\",\n \"credit_shared_key\",\n \"single_limit\",\n \"daily_limit\",\n \"monthly_limit\",\n \"last_day\",\n \"daily_spent\",\n \"last_month\",\n \"monthly_spent\",\n \"leaf_index\",\n \"merkle_path\"\n ]\n },\n \"credit_top_up\": {\n \"artifactSha256\": \"2ffebd5753ec1b0c050204d4f97498765fe61ea01a793a9b2466c2f97536345c\",\n \"keys\": {\n \"evm\": \"40b02a9d2e7eb7b49daaac4b7760328537b7982fd5a225cc065bb74cd5ef44b3\"\n },\n \"publicInputCount\": 50,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"owner_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"credit_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"change_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"expiry\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"credit_tree_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"credit_merkle_root\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"credit_nullifier\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"previous_expiry\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_amounts\",\n \"input_nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_payout\",\n \"spender_wallet_identity\",\n \"owner_wallet_identity\",\n \"credit_amount\",\n \"credit_nonce\",\n \"credit_shared_key\",\n \"single_limit\",\n \"daily_limit\",\n \"monthly_limit\",\n \"previous_single_limit\",\n \"previous_daily_limit\",\n \"previous_monthly_limit\",\n \"last_day\",\n \"daily_spent\",\n \"last_month\",\n \"monthly_spent\",\n \"change_amount\",\n \"change_nonce\",\n \"previous_credit_amount\",\n \"previous_credit_nonce\",\n \"previous_credit_leaf_index\",\n \"previous_credit_merkle_path\"\n ]\n }\n}\n","import type { Hex } from \"./contracts\";\nimport { Contract, getAddress, type ContractRunner } from \"ethers\";\n\nimport { invisiFactoryAbi } from \"./contracts\";\n/**\n * Query the selected factory. The caller still verifies the returned deployment profile.\n * Calls `factory.getInstanceAddress(salt)` on-chain.\n */\nexport async function resolveInstanceAddress(\n client: ContractRunner,\n factoryAddress: `0x${string}`,\n salt: `0x${string}`\n): Promise<`0x${string}`> {\n const instance = await new Contract(\n getAddress(factoryAddress),\n invisiFactoryAbi,\n client\n ).getFunction(\"getInstanceAddress\")(salt);\n return getAddress(instance) as Hex;\n}\n"],"mappings":"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","names":["getAddress","ReceivingAddress","hexlify","Interface","getBytes","ReceivingAddress","ReceivingAddress","hexlify","getBytes","Interface","getAddress","ReceivingAddress","AbiCoder","dataLength","getAddress","Interface","isHexString","keccak256","ParamType","getAddress","isHexString","keccak256","toBeHex","v","getAddress","keccak256","AbiCoder","ParamType","Interface","isHexString","dataLength","AbiCoder","getAddress","Interface","keccak256","ParamType","computeWalletAuthorizationDigest","walletAuthorizationTypedData","getAddress","hashContext","keccak256","AbiCoder","ParamType","walletAuthorizationTypedData","computeWalletAuthorizationDigest","Interface","AbiCoder","getAddress","Interface","keccak256","ParamType","TypedDataEncoder","walletAuthorizationTypedData","getAddress","walletAuthorizationTypedData","keccak256","AbiCoder","ParamType","Interface","TypedDataEncoder","Contract","getAddress","keccak256","keccak256","MissingCapabilityError","MissingCapabilityError","keccak256","getAddress","Contract","keccak256","computeNoteCommitment","FIELD_MODULUS","computeCreditCommitment","computeCreditSharedKeyHash","computeNoteCommitment","computeNoteIdentity","computeWalletAuthorizationDigest","pad","check","computeWalletAuthorizationDigest","computeNoteCommitment","computeNoteIdentity","computeCreditCommitment","computeCreditSharedKeyHash","notes","field","Contract","getAddress","Contract","getAddress"]}
1
+ {"version":3,"sources":["../src/authorization/WitnessContext.ts","../src/authorization/common.ts","../src/validation.ts","../src/witness-layouts.json","../src/authorization/credit-cancel.ts","../src/credit/credit-lifecycle.ts","../src/fees/fee.ts","../src/credit/credit-create.ts","../src/authorization/credit-creation.ts","../src/authorization/credit-create.ts","../src/authorization/credit-draw.ts","../src/authorization/credit-top-up.ts","../src/authorization/transact.ts","../src/funds/public-inputs.ts","../src/funds/funding.ts","../src/funds/abi-tuples.ts","../src/funds/request.ts","../src/authorization/witness.ts","../src/client/Protocol.ts","../src/funds/aggregate.ts","../src/client/TokenProtocol.ts","../src/funds/calldata.ts","../src/funds/shield.ts","../src/registry/AddressRegistry.ts","../src/registry/RegistrationOperation.ts","../src/registry/registry.ts","../src/verification/verify.ts","../src/factory/factory.ts"],"sourcesContent":["import {\n computeCreditCommitment,\n computeCreditSharedKeyHash,\n computeNoteCommitment,\n computeNoteIdentity,\n computeNoteNullifier,\n computeWalletAuthorizationDigest,\n poseidonHash,\n verifyWalletAuthorization,\n type AuthorizedStatement,\n type CreditNote,\n type Note,\n type WalletAuthorizationWitness,\n type WalletOperation,\n} from \"@invisi-labs/core\";\nimport { TokenProtocol } from \"../client/TokenProtocol\";\nimport type { Hex, InputSource } from \"../contracts/index\";\nimport { check } from \"./common\";\nimport type { NoteMembership } from \"./types\";\n/** Shared ownership, authorization and Merkle checks for witness builders. */\nexport class WitnessContext {\n constructor(readonly protocol: TokenProtocol) {}\n context(note: Note | CreditNote): void {\n const c = this.protocol.context;\n check(\n note.chainId === c.chainId &&\n note.protocolAddress === BigInt(c.protocolAddress) &&\n note.tokenAddress === BigInt(c.tokenAddress),\n \"note context mismatch\"\n );\n }\n async authority(\n operation: WalletOperation,\n capacity: number,\n words: readonly Hex[],\n signed: AuthorizedStatement | undefined,\n identity: Hex\n ): Promise<WalletAuthorizationWitness> {\n check(!!signed, \"private wallet authorization required\");\n const c = this.protocol.context,\n request = {\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation,\n capacity,\n words: words.slice(0, -2).map(BigInt),\n };\n check(\n signed.ownerAddress === identity &&\n signed.digest === computeWalletAuthorizationDigest(request),\n \"authorization statement mismatch\"\n );\n const witness = signed.withWitness((value) => value);\n check(\n await verifyWalletAuthorization(\n identity,\n Uint8Array.from([4, ...witness.public_key_x, ...witness.public_key_y]),\n Uint8Array.from(witness.signature),\n request\n ),\n \"invalid wallet authorization\"\n );\n return witness;\n }\n async membership(\n leaf: Hex,\n input: { treeId: bigint; leafIndex: number; path: readonly bigint[] },\n sources: readonly InputSource[]\n ): Promise<number> {\n const source = sources.findIndex((value) => value.treeId === input.treeId);\n check(\n source >= 0 &&\n Number.isInteger(input.leafIndex) &&\n input.leafIndex >= 0 &&\n input.leafIndex < 65536 &&\n input.path.length === 16,\n \"invalid membership position\"\n );\n let root = BigInt(leaf);\n for (let level = 0; level < 16; level++)\n root = BigInt(\n await poseidonHash(\n (input.leafIndex >> level) & 1\n ? [input.path[level]!, root]\n : [root, input.path[level]!]\n )\n );\n check(root === BigInt(sources[source]!.merkleRoot), \"membership root mismatch\");\n return source;\n }\n async noteLeaf(note: Note): Promise<Hex> {\n this.context(note);\n return computeNoteCommitment(\n note.chainId,\n await computeNoteIdentity(BigInt(note.ownerAddress), note.nonce),\n note.tokenAddress,\n note.amount\n );\n }\n async creditLeaf(note: CreditNote): Promise<Hex> {\n this.context(note);\n return computeCreditCommitment(\n note.chainId,\n note.spenderWalletIdentity,\n note.ownerWalletIdentity,\n note.spenderPayout,\n note.ownerPayout,\n note.tokenAddress,\n note.amount,\n note.nonce,\n note.expiry,\n await computeCreditSharedKeyHash(note.creditSharedKey),\n note\n );\n }\n async noteInputs(\n inputs: readonly NoteMembership[],\n sources: readonly InputSource[],\n nullifiers: readonly Hex[],\n identity: Hex,\n authority: WalletAuthorizationWitness\n ) {\n check(inputs.length === nullifiers.length, \"input count mismatch\");\n return Promise.all(\n inputs.map(async (input, i) => {\n check(input.note.ownerAddress === identity, \"input wallet mismatch\");\n const leaf = await this.noteLeaf(input.note);\n check(\n (await computeNoteNullifier(input.note.chainId, input.note.nonce, leaf)) ===\n nullifiers[i],\n \"input nullifier mismatch\"\n );\n return BigInt(await this.membership(leaf, input, sources));\n })\n );\n }\n}\n","import {\n normalizeCreditPolicy,\n type CreditNote,\n type WalletAuthorizationWitness,\n} from \"@invisi-labs/core\";\nimport {\n LocalWitness,\n type CircuitName,\n type ProofStatement,\n type ProofTarget,\n type ProvingRequest,\n} from \"@invisi-labs/prover\";\nimport type { Hex } from \"../contracts/index\";\nimport { FIELD_MODULUS } from \"../validation\";\nimport layouts from \"../witness-layouts.json\";\n\nexport const pad = <T>(values: readonly T[], count: number, zero: () => T): T[] => {\n if (values.length > count) throw new Error(\"witness capacity exceeded\");\n return [...values, ...Array.from({ length: count - values.length }, zero)];\n};\n\nexport const policyWitness = (note: CreditNote, usage = true) => {\n const p = normalizeCreditPolicy(note);\n return {\n single_limit: p.singleLimit,\n daily_limit: p.dailyLimit,\n monthly_limit: p.monthlyLimit,\n ...(usage\n ? {\n last_day: p.lastDay,\n daily_spent: p.dailySpent,\n last_month: p.lastMonth,\n monthly_spent: p.monthlySpent,\n }\n : {}),\n };\n};\n\nexport const zeros = () => Array<bigint>(16).fill(0n);\n\nexport const zeroAuthority = (): WalletAuthorizationWitness => ({\n public_key_x: Array<number>(32).fill(0),\n public_key_y: Array<number>(32).fill(0),\n signature: Array<number>(64).fill(0),\n});\n\nexport function check(ok: boolean, message: string): asserts ok {\n if (!ok) throw new Error(message);\n}\n\nexport function provingRequest(\n circuitName: CircuitName,\n privateInputs: Record<string, unknown>,\n expectedPublicInputs: readonly Hex[],\n target: ProofTarget = \"evm\"\n): ProvingRequest {\n const schema = layouts[circuitName],\n key = schema.keys[target as keyof typeof schema.keys];\n check(typeof key === \"string\", \"unpublished proof target\");\n check(\n expectedPublicInputs.length === schema.publicInputCount,\n \"public input order/width mismatch\"\n );\n check(\n Object.keys(privateInputs).length === schema.private.length &&\n schema.private.every((name) => Object.hasOwn(privateInputs, name)),\n \"private witness schema mismatch\"\n );\n let offset = 0;\n const publicInputs: Record<string, unknown> = {};\n for (const entry of schema.public) {\n const values = expectedPublicInputs.slice(offset, offset + entry.count).map((value) => {\n const n = BigInt(value);\n check(n >= 0n && n < FIELD_MODULUS, \"noncanonical public input\");\n return n;\n });\n publicInputs[entry.name] = entry.array ? values : values[0];\n offset += entry.count;\n }\n check(offset === expectedPublicInputs.length, \"public input layout mismatch\");\n return {\n circuitName,\n target,\n artifactSha256: schema.artifactSha256,\n vkSha256: key,\n expectedPublicInputs: [...expectedPublicInputs],\n witness: new LocalWitness({ ...privateInputs, ...publicInputs }),\n };\n}\nexport function witnessStatement(\n circuitName: CircuitName,\n expectedPublicInputs: readonly Hex[],\n target: ProofTarget = \"evm\"\n): ProofStatement {\n const schema = layouts[circuitName],\n key = schema.keys[target as keyof typeof schema.keys];\n check(\n typeof key === \"string\" && expectedPublicInputs.length === schema.publicInputCount,\n \"unpublished target or statement width mismatch\"\n );\n return {\n circuitName,\n target,\n artifactSha256: schema.artifactSha256,\n vkSha256: key,\n expectedPublicInputs: [...expectedPublicInputs],\n };\n}\n","import { MAX_CIPHERTEXT_BYTES } from \"@invisi-labs/core\";\nimport type { DeploymentContext } from \"@invisi-labs/rpc\";\nimport {\n AbiCoder,\n dataLength,\n getAddress,\n isHexString,\n keccak256,\n ParamType,\n toBeHex,\n} from \"ethers\";\nimport type { Address, Delivery, FundingParams, Hex, InputSource } from \"./contracts/index\";\n\nexport type { DeploymentContext } from \"@invisi-labs/rpc\";\nexport interface TransactionContext extends DeploymentContext {\n tokenAddress: Address;\n now?: bigint;\n /** Explicit chain timestamp used to bind Credit draw UTC periods. */\n timestamp?: bigint;\n}\nexport const FIELD_MODULUS =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617n;\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as const;\nexport const ZERO_WORD = toBeHex(0n, 32) as Hex;\nexport const EMPTY_PERMIT = {\n deadline: 0n,\n v: 0,\n r: ZERO_WORD,\n s: ZERO_WORD,\n} as const;\nexport const EMPTY_FUNDING: FundingParams = {\n payer: ZERO_ADDRESS,\n amount: 0n,\n sigNonce: 0n,\n deadline: 0n,\n signature: \"0x\",\n permit: EMPTY_PERMIT,\n};\nexport type FundingInput = Partial<Omit<FundingParams, \"permit\">> & {\n permit?: FundingParams[\"permit\"];\n};\nexport function uint(v: bigint | number | string, bits: number, name = \"value\"): bigint {\n if (\n (typeof v !== \"bigint\" && typeof v !== \"number\" && typeof v !== \"string\") ||\n (typeof v === \"number\" && !Number.isSafeInteger(v))\n )\n throw new Error(`${name} must be an integer`);\n const n = BigInt(v);\n if (n < 0n || n >= 1n << BigInt(bits)) throw new Error(`${name} exceeds u${bits}`);\n return n;\n}\nexport function field(v: bigint | string, name = \"field\"): bigint {\n const n = uint(v, 256, name);\n if (n >= FIELD_MODULUS) throw new Error(`${name} is noncanonical field`);\n return n;\n}\nexport const word = (v: bigint | string): Hex =>\n toBeHex(typeof v === \"bigint\" ? v : BigInt(v), 32) as Hex;\nexport function dense<T>(v: readonly T[], name: string): readonly T[] {\n if (!Array.isArray(v)) throw new Error(`${name} must be array`);\n for (let i = 0; i < v.length; i++)\n if (!Object.hasOwn(v, i) || v[i] === undefined || v[i] === null)\n throw new Error(`${name} has missing or sparse entries`);\n return v;\n}\nexport function known(v: object, keys: readonly string[], name = \"params\") {\n if (\n !v ||\n typeof v !== \"object\" ||\n Array.isArray(v) ||\n Object.keys(v).some((k) => !keys.includes(k))\n )\n throw new Error(`${name} has unsupported fields`);\n}\nexport function notes(v: readonly Hex[], name: string) {\n const r = dense(v, name).map((v) => word(field(v, name)));\n if (r.some((v) => BigInt(v) === 0n) || new Set(r).size !== r.length)\n throw new Error(`duplicate or zero ${name}`);\n return r;\n}\nexport function envelope(v: Hex, length: number, version?: number, maximum = length): Hex {\n if (\n !isHexString(v) ||\n !/^0x(?:[a-fA-F0-9]{2})*$/.test(v) ||\n dataLength(v) < length ||\n dataLength(v) > maximum\n )\n throw new Error(`ciphertext must be ${length} bytes`);\n if (version !== undefined && Number.parseInt(v.slice(2, 4), 16) !== version)\n throw new Error(\"unsupported ciphertext envelope version\");\n return v;\n}\nexport function normalizeContext(c: TransactionContext) {\n return {\n ...c,\n chainId: uint(c.chainId, 64, \"chainId\"),\n protocolAddress: getAddress(c.protocolAddress) as Hex,\n tokenAddress: getAddress(c.tokenAddress) as Hex,\n };\n}\nexport function checkDeadline(c: TransactionContext, value: bigint) {\n const n = uint(value, 64, \"deadline\");\n if (c.now !== undefined && n < uint(c.now, 64, \"now\")) throw new Error(\"deadline has expired\");\n return n;\n}\nexport function normalizeSources(\n sources: readonly InputSource[],\n inputCount: number,\n capacity: number\n) {\n dense(sources, \"sources\");\n if (\n inputCount < 0 ||\n inputCount > capacity ||\n sources.length > inputCount ||\n (inputCount === 0 ? sources.length !== 0 : sources.length === 0)\n )\n throw new Error(\"source count must be 1..inputCount, or empty for zero inputs\");\n let previous = 0n;\n return sources.map((s) => {\n known(s, [\"treeId\", \"merkleRoot\"], \"source\");\n const treeId = uint(s.treeId, 64, \"treeId\"),\n merkleRoot = word(field(s.merkleRoot, \"merkleRoot\"));\n if (treeId === 0n || treeId <= previous || BigInt(merkleRoot) === 0n)\n throw new Error(\"sources must have positive roots and strictly ascending tree IDs\");\n previous = treeId;\n return { treeId, merkleRoot };\n });\n}\nexport const pad = (v: readonly bigint[], n: number): bigint[] => [\n ...v,\n ...(Array(n - v.length).fill(0n) as bigint[]),\n];\n/** Receipt/transport validation must not reject unrelated future wallet codecs. */\nexport function normalizeOpaqueDelivery(\n value: Delivery,\n options: { empty?: boolean; allowEmpty?: boolean } = {}\n): Delivery {\n known(value, [\"ciphertext\", \"clue\"], \"delivery\");\n if (options.empty) {\n if (value.ciphertext !== \"0x\" || value.clue !== \"0x\")\n throw new Error(\"absent output requires an empty delivery\");\n return { ciphertext: \"0x\", clue: \"0x\" };\n }\n if (options.allowEmpty && value.ciphertext === \"0x\" && value.clue === \"0x\")\n return { ciphertext: \"0x\", clue: \"0x\" };\n const ciphertext = envelope(value.ciphertext, 1, undefined, MAX_CIPHERTEXT_BYTES);\n const clue = envelope(value.clue, 68);\n if (clue.slice(130, 132).toLowerCase() !== \"18\") throw new Error(\"clue precision must be 24\");\n return { ciphertext, clue };\n}\n\nexport const deliveriesHash = (v: readonly Delivery[]) =>\n keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n {\n type: \"tuple[]\",\n components: [\n { name: \"ciphertext\", type: \"bytes\" },\n { name: \"clue\", type: \"bytes\" },\n ],\n },\n ].map((parameter) => ParamType.from(parameter)),\n [dense(v, \"deliveries\")]\n ) as Hex\n ) as Hex;\nexport function normalizeFunding(input: FundingInput = {}): FundingParams {\n const f = { ...EMPTY_FUNDING, ...input };\n getAddress(f.payer) as Hex;\n uint(f.amount, 128, \"depositAmount\");\n uint(f.sigNonce, 256, \"sigNonce\");\n uint(f.deadline, 256, \"funding deadline\");\n if (!isHexString(f.signature) || !/^0x(?:[a-fA-F0-9]{2})*$/.test(f.signature))\n throw new Error(\"invalid signature bytes\");\n const p = f.permit;\n uint(p.deadline, 256);\n uint(p.v, 8);\n for (const v of [p.r, p.s])\n if (!isHexString(v) || dataLength(v) !== 32) throw new Error(\"permit r/s must be bytes32\");\n if ((f.amount === 0n) !== (BigInt(f.payer) === 0n))\n throw new Error(\"deposit amount and payer must both be zero or positive\");\n if (\n f.amount === 0n &&\n (f.sigNonce !== 0n ||\n f.deadline !== 0n ||\n f.signature !== \"0x\" ||\n p.deadline !== 0n ||\n p.v !== 0 ||\n BigInt(p.r) !== 0n ||\n BigInt(p.s) !== 0n)\n )\n throw new Error(\"zero funding must be entirely empty\");\n return { ...f, payer: getAddress(f.payer) as Hex };\n}\nexport function validateFundingSubmission(f: FundingParams, caller?: Address, now?: bigint) {\n if (f.signature !== \"0x\" && now !== undefined && uint(now, 64, \"now\") > f.deadline)\n throw new Error(\"funding authorization has expired\");\n if (\n f.signature === \"0x\" &&\n (f.sigNonce !== 0n ||\n f.deadline !== 0n ||\n (caller !== undefined && f.amount > 0n && (getAddress(caller) as Hex) !== f.payer))\n )\n throw new Error(\"direct funding requires payer caller and zero nonce/deadline\");\n}\nexport const getEIP712Domain = (c: TransactionContext) => ({\n name: \"InvisibleProtocol\",\n version: \"1\",\n chainId: uint(c.chainId, 64),\n verifyingContract: getAddress(c.protocolAddress) as Hex,\n});\nexport const fundingFields = [\n { name: \"requestHash\", type: \"bytes32\" },\n { name: \"payer\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n { name: \"sigNonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n] as const;\n","{\n \"transact_user_slots14\": {\n \"artifactSha256\": \"df9458f0be9c8905241ee74e5f11c0e1c348ef749fe1a9d599034a983f08dbd5\",\n \"keys\": {\n \"evm\": \"a9db580b09d05f09d4ea58b8d9755855525b8cc20beee4b1fbfe4cad10251e4e\",\n \"noir-recursive\": \"912191fc9484b2c0ab869d44900054b1a7c25c3256177abfc102884f3fa7d7ed\"\n },\n \"publicInputCount\": 59,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 14,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 14,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 14,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_recipient\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_owner_address\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_user_slots56\": {\n \"artifactSha256\": \"370299e1ee32a57b6a81ccdbf5e95efef144bee17d38d402bbbfbaa392d355d8\",\n \"keys\": {\n \"evm\": \"2bb2fdf9ef33200038aa6e0a9f35e2a7252bf3946f5b5d68dd0ae85172adeddf\"\n },\n \"publicInputCount\": 185,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 56,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 56,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 56,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_recipient\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_owner_address\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_user_slots112\": {\n \"artifactSha256\": \"259417390705f5ced1cbd671582a2fe40dbf7a259d8717f4e90989dc4368ad91\",\n \"keys\": {\n \"evm\": \"523652b9391818c0af0af8668ba2cd786be25ef00e6bcafa662ed829a32746a7\"\n },\n \"publicInputCount\": 353,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 112,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 112,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 112,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_recipient\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_owner_address\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_user_slots168\": {\n \"artifactSha256\": \"2a86703ca068c50f305d3b4b856ab3b2145d066da0bab894eac8e7c174c20292\",\n \"keys\": {\n \"evm\": \"c9d821fdd5b8cfcdc7fe93e673a8c99487879a4680c8f1b86c0b5c05a3cad515\"\n },\n \"publicInputCount\": 521,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"output_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 168,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 168,\n \"array\": true\n },\n {\n \"name\": \"slot_values\",\n \"count\": 168,\n \"array\": true\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"withdrawal_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_recipient\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_owner_address\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"output_identities\",\n \"amounts\",\n \"nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\"\n ]\n },\n \"transact_aggregate_14_4\": {\n \"artifactSha256\": \"4cd3f3d0dbcac9a48fec728450fd73a247321f655da02bd08db789e07b47527b\",\n \"keys\": {\n \"evm\": \"6654b125cb96d5f4dd263c82cb34b0862bf63ff761fe5feab834f10283a0265d\"\n },\n \"publicInputCount\": 237,\n \"public\": [\n {\n \"name\": \"statements\",\n \"count\": 4,\n \"array\": true\n },\n {\n \"name\": \"inner_vk_commitment\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"verification_key\",\n \"key_hash\",\n \"proofs\"\n ]\n },\n \"transact_aggregate_14_8\": {\n \"artifactSha256\": \"b36ff5370043782364d41dbe00443970292b0240429f241c974ae6c9b10debfe\",\n \"keys\": {\n \"evm\": \"2ad5b8b24109edf24197e97fbad35519d7d18558df19183ca3f91c4089ce4421\"\n },\n \"publicInputCount\": 473,\n \"public\": [\n {\n \"name\": \"statements\",\n \"count\": 8,\n \"array\": true\n },\n {\n \"name\": \"inner_vk_commitment\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"verification_key\",\n \"key_hash\",\n \"proofs\"\n ]\n },\n \"transact_aggregate_14_12\": {\n \"artifactSha256\": \"1191a92a333d826d4c4bd6a2e701a7751beb609904f8b928e3816f276d6fda67\",\n \"keys\": {\n \"evm\": \"a8b06d969e97f53624fae05d08aa548182ad09db24fe60159fae61d243c0cb9d\"\n },\n \"publicInputCount\": 709,\n \"public\": [\n {\n \"name\": \"statements\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"inner_vk_commitment\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"verification_key\",\n \"key_hash\",\n \"proofs\"\n ]\n },\n \"create_credit\": {\n \"artifactSha256\": \"16a41fd585d5f925e4e93fd6a308e1ca8c90ea287778871cb0d214f0d0e223ce\",\n \"keys\": {\n \"evm\": \"e8d3dc1f6922dbe1a0aa6016e65664be28d7005180ee943a4b237ac5518971bb\"\n },\n \"publicInputCount\": 48,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"owner_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"credit_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"change_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"expiry\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_recipient\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_amounts\",\n \"input_nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_payout\",\n \"spender_wallet_identity\",\n \"owner_wallet_identity\",\n \"credit_amount\",\n \"credit_nonce\",\n \"credit_shared_key\",\n \"single_limit\",\n \"daily_limit\",\n \"monthly_limit\",\n \"change_amount\",\n \"change_nonce\"\n ]\n },\n \"credit_draw_slots1\": {\n \"artifactSha256\": \"4542b227e0552b45c302f1dace21cadeba4962c96244e021472f1f7531cff8d1\",\n \"keys\": {\n \"evm\": \"43c051a2bedf9454c12e70b10156361e414944823ba23e80662c16c7ced0a2ce\"\n },\n \"publicInputCount\": 20,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 1,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_draw_slots12\": {\n \"artifactSha256\": \"dd72b0867fc3be7cd90de263bd2d0892075cb18eb4f6dd671b13111710f10369\",\n \"keys\": {\n \"evm\": \"5e31d771e6294993736078596d9c69f21fe7595eda50e3cce6d7406b65cf1443\"\n },\n \"publicInputCount\": 86,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 12,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_draw_slots50\": {\n \"artifactSha256\": \"09c7469866748b4c0c4bbf2b040844771948a170999f6dc7a38fe5c0ecda4054\",\n \"keys\": {\n \"evm\": \"7b613225b6f32a077011d4196c356e836d22dcd116efe687fde53144fbd8db9f\"\n },\n \"publicInputCount\": 314,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 50,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_draw_slots120\": {\n \"artifactSha256\": \"6ccd0366a669c50fd5da875c3eae194fe8aa4c36d35a5f9ebfd64636ea599b48\",\n \"keys\": {\n \"evm\": \"d715848afc5c1ecdfcef5ed5026865abef5040a3bc232fd65330a5ffee8475fb\"\n },\n \"publicInputCount\": 734,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"spender_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_ids\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"roots\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"remainder_commitments\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"expiries\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"total_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"recovery_amounts\",\n \"count\": 120,\n \"array\": true\n },\n {\n \"name\": \"current_day\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"current_month\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_wallet_identity\",\n \"owner_payouts\",\n \"owner_wallet_identities\",\n \"input_amounts\",\n \"input_nonces\",\n \"credit_shared_keys\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"draw_amounts\",\n \"single_limits\",\n \"daily_limits\",\n \"monthly_limits\",\n \"last_days\",\n \"daily_spents\",\n \"last_months\",\n \"monthly_spents\"\n ]\n },\n \"credit_cancel\": {\n \"artifactSha256\": \"6485609280fe5a3d44ca9f1865b29b44253b3d2cd49770d000e7bb7a3db8e65d\",\n \"keys\": {\n \"evm\": \"d74cf842d204cdf271c06a69482ddff11568e89630346b634d486205bec4bd9e\"\n },\n \"publicInputCount\": 13,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"owner_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"tree_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"merkle_root\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"nullifier\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_recipient\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_payout\",\n \"spender_wallet_identity\",\n \"owner_wallet_identity\",\n \"input_nonce\",\n \"expiry\",\n \"credit_shared_key\",\n \"single_limit\",\n \"daily_limit\",\n \"monthly_limit\",\n \"last_day\",\n \"daily_spent\",\n \"last_month\",\n \"monthly_spent\",\n \"leaf_index\",\n \"merkle_path\"\n ]\n },\n \"credit_top_up\": {\n \"artifactSha256\": \"3004eea1c26ec8e33f8fc9ee171a3b6af250682efb607f7003ae58f8327998ab\",\n \"keys\": {\n \"evm\": \"b7f378a871a27649c3f7fd1af554c8f87d99bcf0780b21972e910212ed4e5a0d\"\n },\n \"publicInputCount\": 52,\n \"public\": [\n {\n \"name\": \"chain_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"protocol_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"token_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"owner_address\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"actual_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"source_count\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"input_tree_ids\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"merkle_roots\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"nullifiers\",\n \"count\": 10,\n \"array\": true\n },\n {\n \"name\": \"credit_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"change_commitment\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"delivery_hash_low\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"expiry\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deadline\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"deposit_payer\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_recipient\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"fee_amount\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"credit_tree_id\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"credit_merkle_root\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"credit_nullifier\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"previous_expiry\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_high\",\n \"count\": 1,\n \"array\": false\n },\n {\n \"name\": \"auth_digest_low\",\n \"count\": 1,\n \"array\": false\n }\n ],\n \"private\": [\n \"input_amounts\",\n \"input_nonces\",\n \"leaf_indices\",\n \"merkle_paths\",\n \"input_source_indices\",\n \"public_key_x\",\n \"public_key_y\",\n \"signature\",\n \"spender_payout\",\n \"spender_wallet_identity\",\n \"owner_wallet_identity\",\n \"credit_amount\",\n \"credit_nonce\",\n \"credit_shared_key\",\n \"single_limit\",\n \"daily_limit\",\n \"monthly_limit\",\n \"previous_single_limit\",\n \"previous_daily_limit\",\n \"previous_monthly_limit\",\n \"last_day\",\n \"daily_spent\",\n \"last_month\",\n \"monthly_spent\",\n \"change_amount\",\n \"change_nonce\",\n \"previous_credit_amount\",\n \"previous_credit_nonce\",\n \"previous_credit_leaf_index\",\n \"previous_credit_merkle_path\"\n ]\n }\n}\n","import { computeCreditNullifier, normalizeCreditDeliveryState } from \"@invisi-labs/core\";\nimport { type ProvingRequest } from \"@invisi-labs/prover\";\nimport { cancelCreditPublicInputs } from \"../credit/credit-lifecycle\";\nimport { check, policyWitness, provingRequest } from \"./common\";\nimport type { CancelCreditWitnessParams } from \"./types\";\nimport { WitnessContext } from \"./WitnessContext\";\nexport async function cancelCredit(\n witness: WitnessContext,\n p: CancelCreditWitnessParams\n): Promise<ProvingRequest> {\n const note = normalizeCreditDeliveryState(p.input.state).note,\n leaf = await witness.creditLeaf(note),\n c = witness.protocol.context;\n check(\n (await computeCreditNullifier(c.chainId, note.creditSharedKey, leaf)) ===\n p.params.nullifier &&\n note.amount === p.params.amount &&\n note.ownerPayout === BigInt(p.params.owner),\n \"Credit cancellation mismatch\"\n );\n await witness.membership(leaf, p.input, [p.params.source]);\n const words = cancelCreditPublicInputs(c, p.params),\n authority = await witness.authority(\n \"cancel-credit\",\n 1,\n words,\n p.authorization,\n note.ownerWalletIdentity\n );\n return provingRequest(\n \"credit_cancel\",\n {\n ...authority,\n spender_payout: note.spenderPayout,\n spender_wallet_identity: BigInt(note.spenderWalletIdentity),\n owner_wallet_identity: BigInt(note.ownerWalletIdentity),\n ...policyWitness(note),\n input_nonce: note.nonce,\n expiry: note.expiry,\n credit_shared_key: note.creditSharedKey,\n leaf_index: BigInt(p.input.leafIndex),\n merkle_path: [...p.input.path],\n },\n words\n );\n}\n","import { AbiCoder, getAddress, Interface, keccak256, ParamType } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport { normalizeFee } from \"../fees/fee\";\n\nimport {\n computeWalletAuthorizationDigest,\n creditPeriods,\n walletAuthorizationTypedData,\n type WalletOperation,\n} from \"@invisi-labs/core\";\nimport {\n invisiProtocolAbi,\n type CancelCreditParams,\n type CreditDrawParams,\n type Delivery,\n type TopUpCreditParams,\n} from \"../contracts/index\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n field,\n fundingFields,\n getEIP712Domain,\n known,\n normalizeContext,\n normalizeOpaqueDelivery,\n normalizeSources,\n notes,\n pad,\n uint,\n validateFundingSubmission,\n word,\n ZERO_ADDRESS,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nimport {\n createCreditBaseInputs,\n encodeCreditProof,\n validateCreateCreditRequest,\n} from \"./credit-create\";\nexport const CREDIT_DRAW_CAPACITIES = [1, 12, 50, 120] as const;\nexport function selectCreditDrawCircuit(count: number) {\n if (!Number.isInteger(count) || count < 1 || count > 120)\n throw new Error(\"draw requires 1..120 credits\");\n const maxSize = CREDIT_DRAW_CAPACITIES.find((n) => count <= n)!;\n return {\n name: `credit_draw_slots${maxSize}`,\n maxSize,\n publicInputCount: 6 * maxSize + 14,\n totalBits: 126 + Math.ceil(Math.log2(maxSize)),\n };\n}\nexport function validateCreditDrawRequest(\n c: TransactionContext,\n p: CreditDrawParams,\n cs: readonly Delivery[]\n) {\n known(p, [\n \"token\",\n \"sources\",\n \"nullifiers\",\n \"remainderCommitments\",\n \"expiries\",\n \"recoveryAmounts\",\n \"spender\",\n \"totalAmount\",\n \"deadline\",\n ]);\n if ((getAddress(p.token) as Hex) !== (getAddress(c.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n const ctx = normalizeContext(c),\n ns = notes(p.nullifiers, \"nullifiers\"),\n profile = selectCreditDrawCircuit(ns.length),\n sources = normalizeSources(p.sources, ns.length, profile.maxSize);\n for (const [key, v] of Object.entries({\n remainderCommitments: p.remainderCommitments,\n expiries: p.expiries,\n recoveryAmounts: p.recoveryAmounts,\n }))\n if (dense<unknown>(v, key).length !== ns.length) throw new Error(`${key} count mismatch`);\n const remainderCommitments = p.remainderCommitments.map((v) => word(field(v))),\n recoveryAmounts = p.recoveryAmounts.map((v) => word(field(v))),\n expiries = p.expiries.map((v) => uint(v, 64, \"expiry\")),\n positives = remainderCommitments.filter((v) => BigInt(v) !== 0n);\n if (new Set(positives).size !== positives.length)\n throw new Error(\"duplicate remainder commitment\");\n for (let i = 0; i < ns.length; i++) {\n if (expiries[i] === 0n || (c.now !== undefined && expiries[i]! <= c.now))\n throw new Error(\"expiry must be future\");\n if (BigInt(remainderCommitments[i]!) === 0n && BigInt(recoveryAmounts[i]!) !== 0n)\n throw new Error(\"full draw requires zero recovery amount\");\n }\n const spender = getAddress(p.spender) as Hex,\n totalAmount = uint(p.totalAmount, profile.totalBits, \"totalAmount\");\n if (BigInt(spender) === 0n || totalAmount === 0n)\n throw new Error(\"spender and total amount must be positive\");\n if (dense(cs, \"deliveries\").length !== 2 * ns.length)\n throw new Error(\"deliveries count mismatch\");\n const deliveries = cs.map((v, i) =>\n BigInt(remainderCommitments[Math.floor(i / 2)]!) === 0n\n ? normalizeOpaqueDelivery(v, { empty: true })\n : normalizeOpaqueDelivery(v, {})\n );\n return {\n ...ctx,\n sources,\n nullifiers: ns,\n remainderCommitments,\n recoveryAmounts,\n expiries,\n spender,\n totalAmount,\n deadline: checkDeadline(c, p.deadline),\n deliveries,\n profile,\n periods: creditPeriods(c.timestamp!),\n };\n}\nexport function creditDrawBaseInputs(\n c: TransactionContext,\n p: CreditDrawParams,\n cs: readonly Delivery[]\n) {\n const r = validateCreditDrawRequest(c, p, cs),\n n = r.profile.maxSize,\n h = BigInt(deliveriesHash(cs));\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.spender),\n BigInt(r.nullifiers.length),\n BigInt(r.sources.length),\n ...pad(\n r.sources.map((s) => s.treeId),\n n\n ),\n ...pad(\n r.sources.map((s) => BigInt(s.merkleRoot)),\n n\n ),\n ...pad(r.nullifiers.map(BigInt), n),\n ...pad(r.remainderCommitments.map(BigInt), n),\n ...pad(r.expiries, n),\n r.totalAmount,\n r.deadline,\n h >> 128n,\n h & ((1n << 128n) - 1n),\n ...pad(r.recoveryAmounts.map(BigInt), n),\n r.periods.currentDay,\n r.periods.currentMonth,\n ].map(word);\n}\nexport function validateCancelCreditRequest(c: TransactionContext, p: CancelCreditParams) {\n known(p, [\n \"token\",\n \"source\",\n \"nullifier\",\n \"owner\",\n \"amount\",\n \"deadline\",\n \"feeRecipient\",\n \"feeAmount\",\n ]);\n if ((getAddress(p.token) as Hex) !== (getAddress(c.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n const ctx = normalizeContext(c),\n source = normalizeSources([p.source], 1, 1)[0]!,\n nullifier = notes([p.nullifier], \"nullifier\")[0]!,\n owner = getAddress(p.owner) as Hex,\n amount = uint(p.amount, 126, \"amount\");\n if (BigInt(owner) === 0n || amount === 0n) throw new Error(\"owner and amount must be positive\");\n const fee = normalizeFee(p);\n if (fee.feeAmount >= amount) throw new Error(\"fee must leave a positive owner refund\");\n return {\n ...ctx,\n ...fee,\n source,\n nullifier,\n owner,\n amount,\n deadline: checkDeadline(c, p.deadline),\n };\n}\nexport function cancelCreditBaseInputs(c: TransactionContext, p: CancelCreditParams) {\n const r = validateCancelCreditRequest(c, p);\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.owner),\n r.source.treeId,\n BigInt(r.source.merkleRoot),\n BigInt(r.nullifier),\n r.amount,\n r.deadline,\n BigInt(r.feeRecipient),\n r.feeAmount,\n ].map(word);\n}\nexport function validateTopUpCreditRequest(\n c: TransactionContext,\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n funding: FundingInput = {}\n) {\n known(p, [\"token\", \"creation\", \"creditSource\", \"creditNullifier\", \"previousExpiry\"]);\n const creation = validateCreateCreditRequest(c, p.creation, cs, funding),\n creditSource = normalizeSources([p.creditSource], 1, 1)[0]!,\n creditNullifier = notes([p.creditNullifier], \"creditNullifier\")[0]!,\n previousExpiry = uint(p.previousExpiry, 64, \"previousExpiry\");\n if (previousExpiry === 0n || (c.now !== undefined && previousExpiry <= c.now))\n throw new Error(\"previous Credit has expired\");\n if (creation.expiry < previousExpiry) throw new Error(\"expiry must not decrease\");\n if (creation.nullifiers.includes(creditNullifier))\n throw new Error(\"duplicate credit and ordinary nullifier\");\n return { creation, creditSource, creditNullifier, previousExpiry };\n}\nexport function topUpCreditBaseInputs(\n c: TransactionContext,\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateTopUpCreditRequest(c, p, cs, f);\n return [\n ...createCreditBaseInputs(c, p.creation, cs, f),\n word(r.creditSource.treeId),\n r.creditSource.merkleRoot,\n r.creditNullifier,\n word(r.previousExpiry),\n ];\n}\nconst cancelTuple = [\n \"(address token,(uint256 treeId,bytes32 merkleRoot) source,bytes32 nullifier,address owner,uint256 amount,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n][0]!;\nconst topTuple = [\n \"((address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32 creditCommitment,bytes32 changeCommitment,address owner,uint256 expiry,uint256 deadline,address feeRecipient,uint256 feeAmount) creation,(uint256 treeId,bytes32 merkleRoot) creditSource,bytes32 creditNullifier,uint256 previousExpiry)\",\n][0]!;\nconst hashContext = {\n chainId: 0n,\n protocolAddress: ZERO_ADDRESS,\n tokenAddress: ZERO_ADDRESS,\n};\nexport function cancelCreditRequestHash(p: CancelCreditParams) {\n validateCancelCreditRequest({ ...hashContext, tokenAddress: p.token }, p);\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, cancelTuple].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiCancelCredit\")),\n { ...p, ...normalizeFee(p) },\n ]\n ) as Hex\n ) as Hex;\n}\nexport function topUpCreditRequestHash(\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateTopUpCreditRequest(\n { ...hashContext, tokenAddress: p.creation.token },\n p,\n cs,\n f\n );\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n { type: \"bytes32\" },\n topTuple,\n { type: \"bytes32\" },\n { type: \"address\" },\n { type: \"uint256\" },\n ].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiTopUpCredit\")),\n { ...p, creation: { ...p.creation, ...normalizeFee(p.creation) } },\n deliveriesHash(cs),\n r.creation.funding.payer,\n r.creation.funding.amount,\n ]\n ) as Hex\n ) as Hex;\n}\nfunction authorize(\n c: TransactionContext,\n operation: WalletOperation,\n capacity: number,\n words: readonly Hex[]\n) {\n return walletAuthorizationTypedData({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation,\n capacity,\n words: words.map(BigInt),\n });\n}\nfunction appendDigest(\n c: TransactionContext,\n operation: WalletOperation,\n capacity: number,\n words: readonly Hex[]\n) {\n const digest = BigInt(\n computeWalletAuthorizationDigest({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation,\n capacity,\n words: words.map(BigInt),\n })\n );\n return [...words, word(digest >> 128n), word(digest & ((1n << 128n) - 1n))];\n}\nexport function encodeCancelCreditTypedData(c: TransactionContext, p: CancelCreditParams) {\n return authorize(c, \"cancel-credit\", 1, cancelCreditBaseInputs(c, p));\n}\nexport function encodeTopUpCreditTypedData(\n c: TransactionContext,\n p: TopUpCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n return authorize(c, \"top-up-credit\", 10, topUpCreditBaseInputs(c, p, deliveries, funding));\n}\nexport function encodeCreditDrawTypedData(\n c: TransactionContext,\n p: CreditDrawParams,\n deliveries: readonly Delivery[]\n) {\n return authorize(\n c,\n \"credit-draw\",\n selectCreditDrawCircuit(p.nullifiers.length).maxSize,\n creditDrawBaseInputs(c, p, deliveries)\n );\n}\nexport function creditDrawPublicInputs(\n c: TransactionContext,\n p: CreditDrawParams,\n deliveries: readonly Delivery[]\n) {\n return appendDigest(\n c,\n \"credit-draw\",\n selectCreditDrawCircuit(p.nullifiers.length).maxSize,\n creditDrawBaseInputs(c, p, deliveries)\n );\n}\nexport function cancelCreditPublicInputs(c: TransactionContext, p: CancelCreditParams) {\n return appendDigest(c, \"cancel-credit\", 1, cancelCreditBaseInputs(c, p));\n}\nexport function topUpCreditPublicInputs(\n c: TransactionContext,\n p: TopUpCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n return appendDigest(c, \"top-up-credit\", 10, topUpCreditBaseInputs(c, p, deliveries, funding));\n}\nexport function encodeTopUpCreditFundingTypedData(\n c: TransactionContext,\n p: TopUpCreditParams,\n cs: readonly Delivery[],\n f: FundingInput\n) {\n const r = validateTopUpCreditRequest(c, p, cs, f),\n funding = r.creation.funding;\n if (funding.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: topUpCreditRequestHash(p, cs, f),\n payer: funding.payer,\n amount: funding.amount,\n sigNonce: funding.sigNonce,\n deadline: funding.deadline,\n },\n };\n}\nexport interface BuildCreditDrawCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: CreditDrawParams;\n deliveries: readonly Delivery[];\n}\nexport function buildCreditDrawCalldata(p: BuildCreditDrawCalldataParams) {\n validateCreditDrawRequest(p.context, p.params, p.deliveries);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"creditDraw\", [\n encodeCreditProof(p.proof),\n p.params,\n p.deliveries,\n ]) as Hex,\n nullifiers: p.params.nullifiers,\n totalAmount: p.params.totalAmount,\n };\n}\nexport interface BuildCancelCreditCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: CancelCreditParams;\n}\nexport function buildCancelCreditCalldata(p: BuildCancelCreditCalldataParams) {\n validateCancelCreditRequest(p.context, p.params);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"cancelCredit\", [\n encodeCreditProof(p.proof),\n { ...p.params, ...normalizeFee(p.params) },\n ]) as Hex,\n };\n}\nexport interface BuildTopUpCreditCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: TopUpCreditParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n caller?: Address;\n}\nexport function buildTopUpCreditCalldata(p: BuildTopUpCreditCalldataParams) {\n const r = validateTopUpCreditRequest(p.context, p.params, p.deliveries, p.funding);\n validateFundingSubmission(r.creation.funding, p.caller, p.context.now);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"topUpCredit\", [\n encodeCreditProof(p.proof),\n { ...p.params, creation: { ...p.params.creation, ...normalizeFee(p.params.creation) } },\n p.deliveries,\n r.creation.funding,\n ]) as Hex,\n approveAmount: r.creation.funding.amount,\n };\n}\n","import { getAddress } from \"ethers\";\nimport type { Address } from \"../contracts/index\";\nimport { uint, ZERO_ADDRESS } from \"../validation\";\n/** Canonical optional public fee. Omitting both fields explicitly selects zero fee. */\nexport function normalizeFee(p: { feeRecipient?: Address; feeAmount?: bigint }) {\n const feeRecipient = getAddress(p.feeRecipient ?? ZERO_ADDRESS) as Address;\n const feeAmount = uint(p.feeAmount ?? 0n, 128, \"feeAmount\");\n if ((BigInt(feeRecipient) === 0n) !== (feeAmount === 0n))\n throw new Error(\"invalid fee context\");\n return { feeRecipient, feeAmount };\n}\n","import {\n AbiCoder,\n dataLength,\n getAddress,\n Interface,\n isHexString,\n keccak256,\n ParamType,\n} from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport { normalizeFee } from \"../fees/fee\";\n\nimport { computeWalletAuthorizationDigest, walletAuthorizationTypedData } from \"@invisi-labs/core\";\nimport { invisiProtocolAbi, type CreateCreditParams, type Delivery } from \"../contracts/index\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n field,\n fundingFields,\n getEIP712Domain,\n known,\n normalizeContext,\n normalizeFunding,\n normalizeOpaqueDelivery,\n normalizeSources,\n notes,\n pad,\n uint,\n validateFundingSubmission,\n word,\n ZERO_ADDRESS,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nconst creationTuple = [\n \"(address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32 creditCommitment,bytes32 changeCommitment,address owner,uint256 expiry,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n][0]!;\nexport const CREATE_CREDIT_FIELDS = [\n \"token\",\n \"sources\",\n \"nullifiers\",\n \"creditCommitment\",\n \"changeCommitment\",\n \"owner\",\n \"expiry\",\n \"deadline\",\n \"feeRecipient\",\n \"feeAmount\",\n] as const;\n/** Public checks cannot establish ownership or conservation: those are enforced by the proof. */\nexport function validateCreateCreditRequest(\n c: TransactionContext,\n p: CreateCreditParams,\n cs: readonly Delivery[],\n funding: FundingInput = {}\n) {\n known(p, CREATE_CREDIT_FIELDS);\n if ((getAddress(p.token) as Hex) !== (getAddress(c.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n const ctx = normalizeContext(c),\n ns = notes(p.nullifiers, \"nullifiers\"),\n sources = normalizeSources(p.sources, ns.length, 10),\n creditCommitment = word(field(p.creditCommitment)),\n changeCommitment = word(field(p.changeCommitment)),\n owner = getAddress(p.owner) as Hex,\n expiry = uint(p.expiry, 64, \"expiry\"),\n deadline = checkDeadline(c, p.deadline),\n f = normalizeFunding(funding);\n if (BigInt(creditCommitment) === 0n || creditCommitment === changeCommitment)\n throw new Error(\"zero or duplicate commitment\");\n if (BigInt(owner) === 0n || expiry === 0n || (c.now !== undefined && expiry <= c.now))\n throw new Error(\"owner must be nonzero and expiry future\");\n if (dense(cs, \"deliveries\").length !== 3) throw new Error(\"deliveries count mismatch\");\n const deliveries = cs.map((v, i) =>\n normalizeOpaqueDelivery(v, {\n empty: i === 2 && BigInt(changeCommitment) === 0n,\n allowEmpty: i === 2,\n })\n );\n if (ns.length === 0 && f.amount === 0n)\n throw new Error(\"empty inputs require positive funding\");\n return {\n ...ctx,\n ...normalizeFee(p),\n sources,\n nullifiers: ns,\n actualCount: ns.length,\n sourceCount: sources.length,\n creditCommitment,\n changeCommitment,\n owner,\n expiry,\n deadline,\n deliveries,\n funding: f,\n };\n}\nexport function createCreditBaseInputs(\n c: TransactionContext,\n p: CreateCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateCreateCreditRequest(c, p, cs, f),\n h = BigInt(deliveriesHash(cs));\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.owner),\n BigInt(r.actualCount),\n BigInt(r.sourceCount),\n ...pad(\n r.sources.map((s) => s.treeId),\n 10\n ),\n ...pad(\n r.sources.map((s) => BigInt(s.merkleRoot)),\n 10\n ),\n ...pad(r.nullifiers.map(BigInt), 10),\n BigInt(r.creditCommitment),\n BigInt(r.changeCommitment),\n h >> 128n,\n h & ((1n << 128n) - 1n),\n r.expiry,\n r.deadline,\n r.funding.amount,\n BigInt(r.funding.payer),\n BigInt(r.feeRecipient),\n r.feeAmount,\n ].map(word);\n}\nexport function createCreditPublicInputs(\n c: TransactionContext,\n p: CreateCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n const base = createCreditBaseInputs(c, p, deliveries, funding);\n const digest = BigInt(\n computeWalletAuthorizationDigest({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation: \"create-credit\",\n capacity: 10,\n words: base.map(BigInt),\n })\n );\n return [...base, word(digest >> 128n), word(digest & ((1n << 128n) - 1n))];\n}\nconst hashContext = {\n chainId: 0n,\n protocolAddress: ZERO_ADDRESS,\n tokenAddress: ZERO_ADDRESS,\n};\nexport function createCreditRequestHash(\n p: CreateCreditParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = validateCreateCreditRequest({ ...hashContext, tokenAddress: p.token }, p, cs, f);\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n { type: \"bytes32\" },\n creationTuple,\n { type: \"bytes32\" },\n { type: \"address\" },\n { type: \"uint256\" },\n ].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiCreateCredit\")),\n { ...p, ...normalizeFee(p) },\n deliveriesHash(cs),\n r.funding.payer,\n r.funding.amount,\n ]\n ) as Hex\n ) as Hex;\n}\nexport function encodeCreateCreditTypedData(\n c: TransactionContext,\n p: CreateCreditParams,\n deliveries: readonly Delivery[],\n funding: FundingInput = {}\n) {\n return walletAuthorizationTypedData({\n context: { chainId: c.chainId, protocolAddress: BigInt(c.protocolAddress) },\n operation: \"create-credit\",\n capacity: 10,\n words: createCreditBaseInputs(c, p, deliveries, funding).map(BigInt),\n });\n}\nexport function encodeCreateCreditFundingTypedData(\n c: TransactionContext,\n p: CreateCreditParams,\n cs: readonly Delivery[],\n f: FundingInput\n) {\n const r = validateCreateCreditRequest(c, p, cs, f);\n if (r.funding.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: createCreditRequestHash(p, cs, f),\n payer: r.funding.payer,\n amount: r.funding.amount,\n sigNonce: r.funding.sigNonce,\n deadline: r.funding.deadline,\n },\n };\n}\nexport interface BuildCreateCreditCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: CreateCreditParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n caller?: Address;\n}\nexport function buildCreateCreditCalldata(p: BuildCreateCreditCalldataParams) {\n const r = validateCreateCreditRequest(p.context, p.params, p.deliveries, p.funding);\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"createCredit\", [\n encodeCreditProof(p.proof),\n { ...p.params, ...normalizeFee(p.params) },\n p.deliveries,\n r.funding,\n ]) as Hex,\n approveAmount: r.funding.amount,\n };\n}\n\n/** Frame a raw direct proof from the proving backend for the Credit verifier adapter. */\nexport function encodeCreditProof(proof: Hex): Hex {\n if (!isHexString(proof) || !/^0x(?:[a-fA-F0-9]{2})*$/.test(proof) || dataLength(proof) === 0)\n throw new Error(\"empty or malformed Credit proof\");\n return AbiCoder.defaultAbiCoder().encode(\n [\"uint8\", \"bytes\"].map((parameter) => ParamType.from(parameter)),\n [0, proof]\n ) as Hex;\n}\n","import { normalizeCreditDeliveryState } from \"@invisi-labs/core\";\nimport type { Hex } from \"../contracts/index\";\nimport { check, pad, policyWitness, zeros } from \"./common\";\nimport type { CreateCreditWitnessParams } from \"./types\";\nimport { WitnessContext } from \"./WitnessContext\";\nexport async function creation(\n witness: WitnessContext,\n p: CreateCreditWitnessParams,\n operation: \"create-credit\" | \"top-up-credit\",\n words: readonly Hex[]\n) {\n const state = normalizeCreditDeliveryState(p.state),\n note = state.note;\n check(\n (await witness.creditLeaf(note)) === p.params.creditCommitment &&\n note.ownerPayout === BigInt(p.params.owner) &&\n note.expiry === p.params.expiry,\n \"Credit creation mismatch\"\n );\n if (\n operation === \"create-credit\" &&\n [note.lastDay, note.dailySpent, note.lastMonth, note.monthlySpent].some((v) => v !== 0n)\n )\n throw new Error(\"new Credit usage must be zero\");\n const authority = await witness.authority(\n operation,\n 10,\n words,\n p.authorization,\n note.ownerWalletIdentity\n );\n const sources = await witness.noteInputs(\n p.inputs,\n p.params.sources,\n p.params.nullifiers,\n note.ownerWalletIdentity,\n authority\n );\n if (p.change)\n check(\n p.change.ownerAddress === note.ownerWalletIdentity &&\n (await witness.noteLeaf(p.change)) === p.params.changeCommitment,\n \"change commitment mismatch\"\n );\n else check(BigInt(p.params.changeCommitment) === 0n, \"missing change note\");\n return {\n ...authority,\n input_amounts: pad(\n p.inputs.map((input) => input.note.amount),\n 10,\n () => 0n\n ),\n input_nonces: pad(\n p.inputs.map((input) => input.note.nonce),\n 10,\n () => 0n\n ),\n leaf_indices: pad(\n p.inputs.map((input) => BigInt(input.leafIndex)),\n 10,\n () => 0n\n ),\n merkle_paths: pad(\n p.inputs.map((input) => [...input.path]),\n 10,\n zeros\n ),\n input_source_indices: pad(sources, 10, () => 0n),\n spender_payout: note.spenderPayout,\n spender_wallet_identity: BigInt(note.spenderWalletIdentity),\n owner_wallet_identity: BigInt(note.ownerWalletIdentity),\n ...policyWitness(note, operation === \"top-up-credit\"),\n credit_amount: note.amount,\n credit_nonce: note.nonce,\n credit_shared_key: note.creditSharedKey,\n change_amount: p.change?.amount ?? 0n,\n change_nonce: p.change?.nonce ?? 0n,\n };\n}\n","import { type ProvingRequest } from \"@invisi-labs/prover\";\nimport { createCreditPublicInputs } from \"../credit/credit-create\";\nimport { provingRequest } from \"./common\";\nimport { creation } from \"./credit-creation\";\nimport type { CreateCreditWitnessParams } from \"./types\";\nimport { WitnessContext } from \"./WitnessContext\";\nexport async function createCredit(\n witness: WitnessContext,\n p: CreateCreditWitnessParams\n): Promise<ProvingRequest> {\n const words = createCreditPublicInputs(\n witness.protocol.context,\n p.params,\n p.deliveries,\n p.funding\n );\n return provingRequest(\n \"create_credit\",\n await creation(witness, p, \"create-credit\", words),\n words\n );\n}\n","import {\n applyCreditDrawUsage,\n computeCreditNullifier,\n normalizeCreditDeliveryState,\n normalizeCreditPolicy,\n} from \"@invisi-labs/core\";\nimport { type CircuitName, type ProvingRequest } from \"@invisi-labs/prover\";\nimport { creditDrawPublicInputs, selectCreditDrawCircuit } from \"../credit/credit-lifecycle\";\nimport { check, pad, provingRequest, zeros } from \"./common\";\nimport type { DrawCreditWitnessParams } from \"./types\";\nimport { WitnessContext } from \"./WitnessContext\";\nexport async function drawCredit(\n witness: WitnessContext,\n p: DrawCreditWitnessParams\n): Promise<ProvingRequest> {\n const c = { ...witness.protocol.context, timestamp: p.timestamp },\n profile = selectCreditDrawCircuit(p.inputs.length),\n capacity = profile.maxSize;\n check(\n p.inputs.length === p.amounts.length && p.inputs.length === p.params.nullifiers.length,\n \"draw input count mismatch\"\n );\n const notes = p.inputs.map((input) => normalizeCreditDeliveryState(input.state).note),\n identity = notes[0]!.spenderWalletIdentity;\n const words = creditDrawPublicInputs(c, p.params, p.deliveries),\n authority = await witness.authority(\n \"credit-draw\",\n capacity,\n words,\n p.authorization,\n identity\n );\n const sourceIndices = await Promise.all(\n notes.map(async (note, i) => {\n applyCreditDrawUsage(note, p.amounts[i]!, p.timestamp);\n const leaf = await witness.creditLeaf(note);\n check(\n note.spenderWalletIdentity === identity &&\n note.spenderPayout === BigInt(p.params.spender) &&\n note.expiry === p.params.expiries[i] &&\n p.amounts[i]! > 0n &&\n p.amounts[i]! <= note.amount &&\n (await computeCreditNullifier(c.chainId, note.creditSharedKey, leaf)) ===\n p.params.nullifiers[i],\n \"Credit draw mismatch\"\n );\n return BigInt(await witness.membership(leaf, p.inputs[i]!, p.params.sources));\n })\n );\n return provingRequest(\n profile.name as CircuitName,\n {\n ...authority,\n ...Object.fromEntries(\n Object.entries({\n singleLimit: \"single_limits\",\n dailyLimit: \"daily_limits\",\n monthlyLimit: \"monthly_limits\",\n lastDay: \"last_days\",\n dailySpent: \"daily_spents\",\n lastMonth: \"last_months\",\n monthlySpent: \"monthly_spents\",\n }).map(([key, name]) => [\n name,\n pad(\n notes.map(\n (note) =>\n normalizeCreditPolicy(note)[\n key as keyof ReturnType<typeof normalizeCreditPolicy>\n ]\n ),\n capacity,\n () => 0n\n ),\n ])\n ),\n spender_wallet_identity: BigInt(identity),\n owner_payouts: pad(\n notes.map((note) => note.ownerPayout),\n capacity,\n () => 0n\n ),\n owner_wallet_identities: pad(\n notes.map((note) => BigInt(note.ownerWalletIdentity)),\n capacity,\n () => 0n\n ),\n input_amounts: pad(\n notes.map((note) => note.amount),\n capacity,\n () => 0n\n ),\n input_nonces: pad(\n notes.map((note) => note.nonce),\n capacity,\n () => 0n\n ),\n credit_shared_keys: pad(\n notes.map((note) => note.creditSharedKey),\n capacity,\n () => 0n\n ),\n leaf_indices: pad(\n p.inputs.map((input) => BigInt(input.leafIndex)),\n capacity,\n () => 0n\n ),\n merkle_paths: pad(\n p.inputs.map((input) => [...input.path]),\n capacity,\n zeros\n ),\n input_source_indices: pad(sourceIndices, capacity, () => 0n),\n draw_amounts: pad(p.amounts, capacity, () => 0n),\n },\n words\n );\n}\n","import { computeCreditNullifier, normalizeCreditDeliveryState } from \"@invisi-labs/core\";\nimport { type ProvingRequest } from \"@invisi-labs/prover\";\nimport { topUpCreditPublicInputs } from \"../credit/credit-lifecycle\";\nimport { check, provingRequest } from \"./common\";\nimport { creation } from \"./credit-creation\";\nimport type { TopUpCreditWitnessParams } from \"./types\";\nimport { WitnessContext } from \"./WitnessContext\";\nexport async function topUpCredit(\n witness: WitnessContext,\n p: TopUpCreditWitnessParams\n): Promise<ProvingRequest> {\n const c = witness.protocol.context,\n previous = normalizeCreditDeliveryState(p.previous.state),\n next = normalizeCreditDeliveryState(p.state),\n old = previous.note,\n note = next.note,\n leaf = await witness.creditLeaf(old);\n for (const field of [\n \"spenderWalletIdentity\",\n \"ownerWalletIdentity\",\n \"spenderPayout\",\n \"ownerPayout\",\n \"creditSharedKey\",\n \"lastDay\",\n \"dailySpent\",\n \"lastMonth\",\n \"monthlySpent\",\n ] as const)\n check(old[field] === note[field], \"Credit role or payout changed\");\n check(\n JSON.stringify(previous.ownerReceivingKeys) === JSON.stringify(next.ownerReceivingKeys) &&\n JSON.stringify(previous.spenderReceivingKeys) ===\n JSON.stringify(next.spenderReceivingKeys),\n \"Credit receiving snapshots changed\"\n );\n check(\n old.amount < note.amount &&\n old.expiry <= note.expiry &&\n old.expiry === p.params.previousExpiry &&\n (c.now === undefined || old.expiry > c.now),\n \"invalid Credit top-up\"\n );\n check(\n (await computeCreditNullifier(c.chainId, old.creditSharedKey, leaf)) ===\n p.params.creditNullifier,\n \"previous Credit nullifier mismatch\"\n );\n await witness.membership(leaf, p.previous, [p.params.creditSource]);\n const words = topUpCreditPublicInputs(c, p.params, p.deliveries, p.funding),\n base = await creation(witness, { ...p, params: p.params.creation }, \"top-up-credit\", words);\n return provingRequest(\n \"credit_top_up\",\n {\n ...base,\n previous_single_limit: old.singleLimit!,\n previous_daily_limit: old.dailyLimit!,\n previous_monthly_limit: old.monthlyLimit!,\n previous_credit_amount: old.amount,\n previous_credit_nonce: old.nonce,\n previous_credit_leaf_index: BigInt(p.previous.leafIndex),\n previous_credit_merkle_path: [...p.previous.path],\n },\n words\n );\n}\n","import { computeNoteCommitment, computeNoteIdentity } from \"@invisi-labs/core\";\nimport { type ProvingRequest } from \"@invisi-labs/prover\";\nimport type { Hex } from \"../contracts/index\";\nimport { transactUserPublicInputs } from \"../funds/public-inputs\";\nimport { normalizeTransactRequest } from \"../funds/request\";\nimport { field, uint, word } from \"../validation\";\nimport { check, pad, provingRequest, zeroAuthority, zeros } from \"./common\";\nimport type { TransactWitnessParams } from \"./types\";\nimport { WitnessContext } from \"./WitnessContext\";\nexport async function transact(\n witness: WitnessContext,\n p: TransactWitnessParams\n): Promise<ProvingRequest> {\n const c = witness.protocol.context,\n n = normalizeTransactRequest(c, p.params, p.deliveries, p.funding),\n words = transactUserPublicInputs(c, p.params, p.deliveries, p.funding);\n check(\n p.inputs.length === n.inputCount && p.outputs.length === n.outputCount,\n \"note count mismatch\"\n );\n const identity = p.inputs[0]?.note.ownerAddress;\n const unsignedSweep =\n !!identity &&\n !p.authorization &&\n n.outputCount === 0 &&\n n.depositAmount === 0n &&\n n.feeAmount === 0n &&\n BigInt(p.params.withdrawalAddress) === BigInt(identity);\n const authority =\n identity && !unsignedSweep\n ? await witness.authority(\"transact\", n.capacity, words, p.authorization, identity)\n : zeroAuthority();\n const sources = await witness.noteInputs(\n p.inputs,\n p.params.sources,\n p.params.nullifiers,\n identity ?? ((\"0x\" + \"00\".repeat(32)) as Hex),\n authority\n );\n const outputs = await Promise.all(\n p.outputs.map(async (output, i) => {\n const opening = \"identity\" in output ? output.note : output;\n const identity =\n \"identity\" in output\n ? field(output.identity)\n : BigInt(await computeNoteIdentity(BigInt(output.ownerAddress), output.nonce));\n const amount = uint(output.amount, 128, \"output amount\");\n check(identity !== 0n && amount !== 0n, \"zero output identity or amount\");\n if (opening) {\n witness.context(opening);\n check(\n opening.amount === amount &&\n BigInt(\n await computeNoteIdentity(BigInt(opening.ownerAddress), opening.nonce)\n ) === identity,\n \"output opening mismatch\"\n );\n }\n const commitment = await computeNoteCommitment(\n c.chainId,\n word(identity),\n BigInt(c.tokenAddress),\n amount\n );\n check(commitment === p.params.outputCommitments[i], \"output commitment mismatch\");\n return { identity, amount };\n })\n );\n const all = [...p.inputs.map((input) => input.note), ...outputs];\n return provingRequest(\n `transact_user_slots${n.capacity}`,\n {\n input_owner_address: identity ? BigInt(identity) : 0n,\n ...authority,\n output_identities: pad(\n [...p.inputs.map(() => 0n), ...outputs.map((output) => output.identity)],\n n.capacity,\n () => 0n\n ),\n amounts: pad(\n all.map((note) => note.amount),\n n.capacity,\n () => 0n\n ),\n nonces: pad(\n [...p.inputs.map((input) => input.note.nonce), ...outputs.map(() => 0n)],\n n.capacity,\n () => 0n\n ),\n leaf_indices: pad(\n p.inputs.map((input) => BigInt(input.leafIndex)),\n n.capacity,\n () => 0n\n ),\n merkle_paths: pad(\n p.inputs.map((input) => [...input.path]),\n n.capacity,\n zeros\n ),\n input_source_indices: pad(sources, n.capacity, () => 0n),\n },\n words,\n p.target\n );\n}\n","import { TypedDataEncoder } from \"ethers\";\nimport { type Delivery } from \"../contracts/index\";\nimport { word, type FundingInput, type TransactionContext } from \"../validation\";\nimport { encodeTransactTypedData } from \"./funding\";\nimport { transactPublicInputs, TransactRequestParams } from \"./request\";\n\n/** Full active user-circuit public inputs: business statement followed by EIP-712 digest limbs. */\nexport function transactUserPublicInputs(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const words = transactPublicInputs(c, p, cs, f),\n digest = BigInt(\n ((typed) =>\n TypedDataEncoder.hash(\n typed.domain,\n Object.fromEntries(\n Object.entries(typed.types).map(([name, fields]) => [\n name,\n [...(fields as readonly { name: string; type: string }[])],\n ])\n ),\n typed.message\n ))(encodeTransactTypedData(c, p, cs, f))\n );\n return [...words, word(digest >> 128n), word(digest & ((1n << 128n) - 1n))];\n}\n","import { walletAuthorizationTypedData } from \"@invisi-labs/core\";\nimport { AbiCoder, keccak256, ParamType } from \"ethers\";\nimport type { Hex } from \"../contracts/index\";\nimport { type Delivery } from \"../contracts/index\";\nimport {\n deliveriesHash,\n fundingFields,\n getEIP712Domain,\n normalizeFunding,\n word,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nimport { crossTuple, singleTuple } from \"./abi-tuples\";\nimport { normalizeTransactRequest, transactPublicInputs, TransactRequestParams } from \"./request\";\n\nexport function encodeTransactTypedData(\n c: TransactionContext,\n p: TransactRequestParams,\n deliveries: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = normalizeTransactRequest(c, p, deliveries, f);\n return walletAuthorizationTypedData({\n context: { chainId: r.chainId, protocolAddress: BigInt(r.protocolAddress) },\n operation: \"transact\",\n capacity: r.capacity,\n words: transactPublicInputs(c, p, deliveries, f).map(BigInt),\n });\n}\n\nexport function transactFundingRequestHash(\n proof: Hex,\n p: TransactRequestParams,\n cs: readonly Delivery[]\n) {\n const single = {\n token: p.token,\n merkleRoot: p.sources[0]?.merkleRoot ?? word(0n),\n nullifiers: p.nullifiers,\n outputCommitments: p.outputCommitments,\n inputTreeId: p.sources[0]?.treeId ?? 0n,\n withdrawalAddress: p.withdrawalAddress,\n withdrawalAmount: p.withdrawalAmount,\n deadline: p.deadline,\n feeRecipient: p.feeRecipient ?? \"0x0000000000000000000000000000000000000000\",\n feeAmount: p.feeAmount ?? 0n,\n };\n return p.sources.length > 1\n ? (keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, { type: \"bytes32\" }, crossTuple, { type: \"bytes32\" }].map(\n (parameter) => ParamType.from(parameter)\n ),\n [\n keccak256(new TextEncoder().encode(\"InvisiCrossTreeTransact\")),\n keccak256(proof),\n { ...p, feeRecipient: single.feeRecipient, feeAmount: single.feeAmount },\n deliveriesHash(cs),\n ]\n ) as Hex\n ) as Hex)\n : (keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, singleTuple, { type: \"bytes32\" }].map((parameter) =>\n ParamType.from(parameter)\n ),\n [keccak256(proof), single, deliveriesHash(cs)]\n ) as Hex\n ) as Hex);\n}\n\nexport function encodeTransactFundingTypedData(\n c: TransactionContext,\n proof: Hex,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n funding: FundingInput\n) {\n normalizeTransactRequest(c, p, cs, funding);\n const f = normalizeFunding(funding);\n if (f.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: transactFundingRequestHash(proof, p, cs),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\n","export const singleTuple = [\n \"(address token,bytes32 merkleRoot,bytes32[] nullifiers,bytes32[] outputCommitments,uint256 inputTreeId,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n][0]!;\n\nexport const crossTuple = [\n \"(address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32[] outputCommitments,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n][0]!;\n","import { getAddress } from \"ethers\";\nimport type { Hex } from \"../contracts/index\";\nimport { type CrossTreeTransactParams, type Delivery } from \"../contracts/index\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n known,\n normalizeContext,\n normalizeFunding,\n normalizeOpaqueDelivery,\n normalizeSources,\n notes,\n pad,\n uint,\n word,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\n\nexport const TRANSACT_CAPACITIES = [14, 56, 112, 168] as const;\n\nexport type TransactCapacity = (typeof TRANSACT_CAPACITIES)[number];\n\nexport function selectTransactCapacity(inputs: number, outputs: number): TransactCapacity {\n if (\n !Number.isInteger(inputs) ||\n !Number.isInteger(outputs) ||\n inputs < 0 ||\n outputs < 0 ||\n inputs + outputs < 1 ||\n (inputs === 0 && outputs < 2) ||\n inputs + outputs > 168\n )\n throw new Error(\"unsupported transact shape\");\n return TRANSACT_CAPACITIES.find((n) => inputs + outputs <= n)!;\n}\n\nexport type TransactRequestParams = CrossTreeTransactParams;\n\nexport function normalizeTransactRequest(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n funding: FundingInput = {}\n) {\n const ctx = normalizeContext(c);\n if ((getAddress(p.token) as Hex) !== ctx.tokenAddress)\n throw new Error(\"request token mismatch\");\n known(p, [\n \"token\",\n \"sources\",\n \"nullifiers\",\n \"outputCommitments\",\n \"withdrawalAddress\",\n \"withdrawalAmount\",\n \"deadline\",\n \"feeRecipient\",\n \"feeAmount\",\n ]);\n const ns = notes(p.nullifiers, \"nullifiers\"),\n os = notes(p.outputCommitments, \"outputCommitments\"),\n capacity = selectTransactCapacity(ns.length, os.length);\n const sources = normalizeSources(p.sources, ns.length, capacity),\n deliveries = dense(cs, \"deliveries\").map((v) =>\n normalizeOpaqueDelivery(v, { allowEmpty: true })\n );\n if (deliveries.length !== os.length) throw new Error(\"deliveries count mismatch\");\n const withdrawalAmount = uint(p.withdrawalAmount, 128, \"withdrawalAmount\"),\n withdrawalAddress = getAddress(p.withdrawalAddress) as Hex,\n f = normalizeFunding(funding);\n const feeAmount = uint(p.feeAmount ?? 0n, 128, \"feeAmount\");\n const feeRecipient = getAddress(\n p.feeRecipient ?? \"0x0000000000000000000000000000000000000000\"\n ) as Hex;\n if ((feeAmount === 0n) !== (BigInt(feeRecipient) === 0n)) throw new Error(\"invalid fee\");\n if (\n (withdrawalAmount === 0n) !== (BigInt(withdrawalAddress) === 0n) ||\n (os.length === 0 && withdrawalAmount === 0n)\n )\n throw new Error(\"invalid withdrawal\");\n if (ns.length === 0 && (f.amount === 0n || withdrawalAmount !== 0n))\n throw new Error(\"zero inputs require positive funding and zero withdrawal\");\n return {\n ...ctx,\n capacity,\n sources,\n nullifiers: ns,\n outputCommitments: os,\n inputCount: ns.length,\n outputCount: os.length,\n sourceCount: sources.length,\n inputTreeIds: pad(\n sources.map((s) => s.treeId),\n capacity\n ),\n merkleRoots: pad(\n sources.map((s) => BigInt(s.merkleRoot)),\n capacity\n ),\n slotValues: pad([...ns, ...os].map(BigInt), capacity),\n deliveries,\n deliveriesHash: deliveriesHash(deliveries),\n withdrawalAddress,\n withdrawalAmount,\n feeRecipient,\n feeAmount,\n deadline: checkDeadline(c, p.deadline),\n depositAmount: f.amount,\n depositPayer: f.payer,\n funding: f,\n };\n}\n\nexport function transactPublicInputs(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = normalizeTransactRequest(c, p, cs, f),\n h = BigInt(r.deliveriesHash);\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.inputCount),\n BigInt(r.outputCount),\n BigInt(r.sourceCount),\n ...r.inputTreeIds,\n ...r.merkleRoots,\n ...r.slotValues,\n h >> 128n,\n h & ((1n << 128n) - 1n),\n BigInt(r.withdrawalAddress),\n r.withdrawalAmount,\n r.deadline,\n r.depositAmount,\n BigInt(r.depositPayer),\n BigInt(r.feeRecipient),\n r.feeAmount,\n ].map(word);\n}\n","import {\n type CircuitName,\n type ProofStatement,\n type ProofTarget,\n type ProvingRequest,\n} from \"@invisi-labs/prover\";\nimport { TokenProtocol } from \"../client/TokenProtocol\";\nimport type { Hex } from \"../contracts/index\";\n\nimport { WitnessContext } from \"./WitnessContext\";\nimport { witnessStatement } from \"./common\";\nimport { cancelCredit } from \"./credit-cancel\";\nimport { createCredit } from \"./credit-create\";\nimport { drawCredit } from \"./credit-draw\";\nimport { topUpCredit } from \"./credit-top-up\";\nimport { transact } from \"./transact\";\nimport type {\n CancelCreditWitnessParams,\n CreateCreditWitnessParams,\n DrawCreditWitnessParams,\n TopUpCreditWitnessParams,\n TransactWitnessParams,\n} from \"./types\";\nexport type {\n CancelCreditWitnessParams,\n CreateCreditWitnessParams,\n CreditMembership,\n DrawCreditWitnessParams,\n NoteMembership,\n TopUpCreditWitnessParams,\n TransactWitnessParams,\n} from \"./types\";\n/** Assemble witnesses through operation-specific builders with shared validation. */\nexport class WitnessBuilder {\n readonly #witness: WitnessContext;\n constructor(protocol: TokenProtocol) {\n this.#witness = new WitnessContext(protocol);\n }\n static statement(\n circuitName: CircuitName,\n expectedPublicInputs: readonly Hex[],\n target: ProofTarget = \"evm\"\n ): ProofStatement {\n return witnessStatement(circuitName, expectedPublicInputs, target);\n }\n async transact(p: TransactWitnessParams): Promise<ProvingRequest> {\n return transact(this.#witness, p);\n }\n async createCredit(p: CreateCreditWitnessParams): Promise<ProvingRequest> {\n return createCredit(this.#witness, p);\n }\n async cancelCredit(p: CancelCreditWitnessParams): Promise<ProvingRequest> {\n return cancelCredit(this.#witness, p);\n }\n async drawCredit(p: DrawCreditWitnessParams): Promise<ProvingRequest> {\n return drawCredit(this.#witness, p);\n }\n async topUpCredit(p: TopUpCreditWitnessParams): Promise<ProvingRequest> {\n return topUpCredit(this.#witness, p);\n }\n}\n","import { Contract, getAddress, keccak256, type Provider } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\n\nimport {\n defineDeployment,\n type ProtocolDeployment,\n type ProtocolRpcClient,\n} from \"@invisi-labs/rpc\";\nimport {\n buildTransactAggregateCalldata,\n type BuildTransactAggregateCalldataParams,\n} from \"../funds/aggregate\";\nimport type { ChainReader } from \"../interfaces\";\nimport { known, type DeploymentContext } from \"../validation\";\nimport { TokenProtocol } from \"./TokenProtocol\";\n\nexport interface ProtocolOptions {\n deployment: ProtocolDeployment;\n}\n\n/** A multi-token deployment. Asset support is always read from the chain. */\nexport class Protocol {\n readonly deployment: Readonly<ProtocolDeployment>;\n readonly context: Readonly<DeploymentContext>;\n\n constructor(options: ProtocolOptions) {\n known(options, [\"deployment\"], \"protocol options\");\n this.deployment = defineDeployment(options.deployment);\n this.context = Object.freeze({\n chainId: this.deployment.chainId,\n protocolAddress: this.deployment.protocol.address,\n });\n Object.freeze(this);\n }\n\n /** Load the selected deployment and verify its contract against Chain RPC before returning. */\n static async fromRpc(\n rpc: Pick<ProtocolRpcClient, \"getDeployment\">,\n provider: Provider,\n options: { signal?: AbortSignal } = {}\n ): Promise<Protocol> {\n const chainId = (await provider.getNetwork()).chainId;\n if (typeof chainId !== \"bigint\" || chainId <= 0n || chainId >= 1n << 64n)\n throw new Error(\"invalid protocol chainId\");\n const deployment = await rpc.getDeployment(\n chainId,\n options.signal ? { signal: options.signal } : {}\n );\n const protocol = new Protocol({ deployment });\n if (protocol.context.chainId !== chainId) throw new Error(\"RPC deployment chain mismatch\");\n await protocol.validateDeployment(provider);\n return protocol;\n }\n\n async validateDeployment(\n connection:\n | Provider\n | (Pick<ChainReader, \"getChainId\" | \"getCode\"> & {\n getProtocolVersion?(address: Address): Promise<bigint>;\n getProtocolAddressRegistry?(address: Address): Promise<Address>;\n })\n ): Promise<void> {\n const reader =\n \"getNetwork\" in connection\n ? {\n getChainId: async () => (await connection.getNetwork()).chainId,\n getCode: async (address: Address) =>\n (await connection.getCode(address)) as Hex,\n getProtocolAddressRegistry: async (address: Address) =>\n getAddress(\n await new Contract(\n address,\n [\"function addressRegistry() view returns (address)\"],\n connection\n ).getFunction(\"addressRegistry\")()\n ) as Address,\n getProtocolVersion: async (address: Address) =>\n BigInt(\n await new Contract(\n address,\n [\"function VERSION() view returns (uint256)\"],\n connection\n ).getFunction(\"VERSION\")()\n ),\n }\n : connection;\n if ((await reader.getChainId()) !== this.context.chainId)\n throw new Error(\"deployment chain mismatch\");\n const code = await reader.getCode(this.context.protocolAddress);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(code) ||\n (keccak256(code) as Hex) !== this.deployment.protocol.runtimeCodeHash\n )\n throw new Error(\"protocol runtime code profile mismatch\");\n if (\n reader.getProtocolVersion &&\n (await reader.getProtocolVersion(this.context.protocolAddress)) !== 1n\n )\n throw new Error(\"unsupported onchain protocol version\");\n const registry = this.deployment.registry;\n if (registry) {\n if (!reader.getProtocolAddressRegistry)\n throw new Error(\"registry binding reader capability is missing\");\n if (\n getAddress(\n await reader.getProtocolAddressRegistry(this.context.protocolAddress)\n ) !== getAddress(registry.address)\n )\n throw new Error(\"protocol registry binding mismatch\");\n const registryCode = await reader.getCode(registry.address);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(registryCode) ||\n keccak256(registryCode) !== registry.runtimeCodeHash\n )\n throw new Error(\"registry runtime code profile mismatch\");\n }\n }\n\n aggregate(request: Omit<BuildTransactAggregateCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTransactAggregateCalldata({ ...request, context: this.context }),\n };\n }\n\n /** Build an operation context for one asset within this same deployment. */\n forToken(tokenAddress: Address): TokenProtocol {\n return new TokenProtocol(\n { ...this.context, tokenAddress: getAddress(tokenAddress) as Hex },\n { expectedRuntimeCodeHash: this.deployment.protocol.runtimeCodeHash }\n );\n }\n}\n","import { AbiCoder, Interface, keccak256, ParamType } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport { invisiProtocolAbi, type TransactRequest } from \"../contracts/index\";\nimport {\n dense,\n fundingFields,\n getEIP712Domain,\n normalizeFunding,\n validateFundingSubmission,\n word,\n type DeploymentContext,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nimport { normalizeTransactRequest, selectTransactCapacity, transactPublicInputs } from \"./request\";\n\nexport interface BuildTransactAggregateCalldataParams {\n context: DeploymentContext & { now?: bigint };\n proof: Hex;\n requests: readonly TransactRequest[];\n caller?: Address;\n}\n\nexport function buildTransactAggregateCalldata(p: BuildTransactAggregateCalldataParams) {\n if (![4, 8, 12].includes(dense(p.requests, \"requests\").length))\n throw new Error(\"aggregate requires 4, 8 or 12 requests\");\n const requests = p.requests.map((request) => {\n const r = normalizeTransactRequest(\n { ...p.context, tokenAddress: request.params.token },\n request.params,\n request.deliveries,\n request.funding\n );\n if (r.capacity !== 14) throw new Error(\"aggregate supports only capacity 14\");\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n return {\n ...request,\n params: { ...request.params, feeRecipient: r.feeRecipient, feeAmount: r.feeAmount },\n };\n });\n return {\n data: new Interface(\n invisiProtocolAbi.filter(\n (item) =>\n item.type === \"function\" &&\n item.name === \"transact\" &&\n item.inputs[1]?.type === \"tuple[]\"\n )\n ).encodeFunctionData(\"transact\", [p.proof, requests]) as Hex,\n capacity: 14 as const,\n };\n}\n\nexport type AggregateMemberInput = Pick<TransactRequest, \"params\" | \"deliveries\"> & {\n funding?: FundingInput;\n};\n\n/** Atomic aggregate funding binds the member statement rather than the aggregate proof bytes. */\nexport function aggregateMemberRequestHash(c: TransactionContext, r: AggregateMemberInput) {\n const capacity = selectTransactCapacity(\n r.params.nullifiers.length,\n r.params.outputCommitments.length\n );\n if (capacity !== 14) throw new Error(\"aggregate supports only capacity 14\");\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"bytes32\", \"uint256\", \"bytes32[]\"].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiAtomicBatchMemberV1\")),\n BigInt(capacity),\n transactPublicInputs(c, r.params, r.deliveries, r.funding),\n ]\n ) as Hex\n ) as Hex;\n}\n\n/** Router adapter business words (58 per member), not the aggregate circuit statement. */\nexport function aggregatePublicInputs(\n c: TransactionContext,\n requests: readonly AggregateMemberInput[]\n) {\n if (![4, 8, 12].includes(dense(requests, \"requests\").length))\n throw new Error(\"aggregate requires 4, 8 or 12 requests\");\n return requests.flatMap((r) => {\n const context = { ...c, tokenAddress: r.params.token };\n aggregateMemberRequestHash(context, r);\n return [word(14n), ...transactPublicInputs(context, r.params, r.deliveries, r.funding)];\n });\n}\n\nexport function encodeAggregateFundingTypedData(c: TransactionContext, r: AggregateMemberInput) {\n const f = normalizeFunding(r.funding);\n if (f.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: aggregateMemberRequestHash(c, r),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\n","import { keccak256 } from \"ethers\";\nimport type { Hex } from \"../contracts/index\";\n\nimport { MissingCapabilityError } from \"@invisi-labs/core\";\nimport {\n buildCreateCreditCalldata,\n type BuildCreateCreditCalldataParams,\n} from \"../credit/credit-create\";\nimport {\n buildCancelCreditCalldata,\n buildCreditDrawCalldata,\n buildTopUpCreditCalldata,\n type BuildCancelCreditCalldataParams,\n type BuildCreditDrawCalldataParams,\n type BuildTopUpCreditCalldataParams,\n} from \"../credit/credit-lifecycle\";\nimport {\n buildTransactAggregateCalldata,\n type BuildTransactAggregateCalldataParams,\n} from \"../funds/aggregate\";\nimport { buildTransactCalldata, type BuildTransactCalldataParams } from \"../funds/calldata\";\nimport { buildShieldCalldata, type BuildShieldCalldataParams } from \"../funds/shield\";\nimport type { ChainReader } from \"../interfaces\";\nimport { normalizeContext, type TransactionContext } from \"../validation\";\n\nexport interface TokenProtocolOptions {\n expectedRuntimeCodeHash?: Hex;\n}\n\n/** A token-specific operation binding within a multi-token deployment. Pure builders never sign or submit. */\nexport class TokenProtocol {\n readonly context: Readonly<TransactionContext>;\n readonly expectedRuntimeCodeHash: Hex | undefined;\n\n constructor(context: TransactionContext, options: TokenProtocolOptions = {}) {\n const normalized = normalizeContext(context);\n if (BigInt(normalized.protocolAddress) === 0n || BigInt(normalized.tokenAddress) === 0n) {\n throw new Error(\"deployment addresses must be nonzero\");\n }\n if (\n options.expectedRuntimeCodeHash &&\n !/^0x[0-9a-fA-F]{64}$/.test(options.expectedRuntimeCodeHash)\n ) {\n throw new Error(\"invalid runtime code hash\");\n }\n this.expectedRuntimeCodeHash = options.expectedRuntimeCodeHash?.toLowerCase() as\n Hex | undefined;\n this.context = Object.freeze(normalized);\n Object.freeze(this);\n }\n\n async validateDeployment(\n reader: Pick<ChainReader, \"getChainId\" | \"getCode\">,\n options: { requireRuntimeProfile?: boolean } = {}\n ): Promise<void> {\n if ((options.requireRuntimeProfile ?? true) && !this.expectedRuntimeCodeHash) {\n throw new MissingCapabilityError(\"trusted deployment profile\");\n }\n if ((await reader.getChainId()) !== this.context.chainId) {\n throw new Error(\"deployment chain mismatch\");\n }\n const code = await reader.getCode(this.context.protocolAddress);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(code) ||\n (this.expectedRuntimeCodeHash &&\n (keccak256(code) as Hex) !== this.expectedRuntimeCodeHash)\n ) {\n throw new Error(\"deployment runtime code profile mismatch\");\n }\n const tokenCode = await reader.getCode(this.context.tokenAddress);\n if (!/^0x(?:[0-9a-fA-F]{2})+$/.test(tokenCode)) {\n throw new Error(\"token address must have contract code\");\n }\n }\n\n transact(request: Omit<BuildTransactCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTransactCalldata({ ...request, context: this.context }),\n };\n }\n\n aggregate(request: Omit<BuildTransactAggregateCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTransactAggregateCalldata({ ...request, context: this.context }),\n };\n }\n\n async shield(request: Omit<BuildShieldCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...(await buildShieldCalldata({ ...request, context: this.context })),\n };\n }\n\n createCredit(request: Omit<BuildCreateCreditCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildCreateCreditCalldata({ ...request, context: this.context }),\n };\n }\n\n drawCredit(request: Omit<BuildCreditDrawCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildCreditDrawCalldata({ ...request, context: this.context }),\n };\n }\n\n cancelCredit(request: Omit<BuildCancelCreditCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildCancelCreditCalldata({ ...request, context: this.context }),\n };\n }\n\n topUpCredit(request: Omit<BuildTopUpCreditCalldataParams, \"context\">) {\n return {\n to: this.context.protocolAddress,\n value: 0n,\n ...buildTopUpCreditCalldata({ ...request, context: this.context }),\n };\n }\n}\n","import { Interface } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport { invisiProtocolAbi, type Delivery, type TransactRequest } from \"../contracts/index\";\nimport {\n validateFundingSubmission,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nimport { normalizeTransactRequest, TransactRequestParams } from \"./request\";\n\nexport interface BuildTransactCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: TransactRequestParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n caller?: Address;\n}\n\nexport function buildTransactCalldata(p: BuildTransactCalldataParams) {\n const r = normalizeTransactRequest(p.context, p.params, p.deliveries, p.funding);\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n const request: TransactRequest = {\n params: {\n token: r.tokenAddress,\n sources: r.sources,\n nullifiers: r.nullifiers,\n outputCommitments: r.outputCommitments,\n withdrawalAddress: r.withdrawalAddress,\n withdrawalAmount: r.withdrawalAmount,\n deadline: r.deadline,\n feeRecipient: r.feeRecipient,\n feeAmount: r.feeAmount,\n },\n deliveries: p.deliveries,\n funding: r.funding,\n };\n const abi = invisiProtocolAbi.filter(\n (item) =>\n item.type === \"function\" &&\n item.name === \"transact\" &&\n item.inputs.length === 2 &&\n item.inputs[1]?.type === \"tuple\"\n );\n const data = new Interface(abi).encodeFunctionData(\"transact\", [p.proof, request]) as Hex;\n return { data, capacity: r.capacity, approveAmount: r.depositAmount };\n}\n","import { computeNoteCommitment } from \"@invisi-labs/core\";\nimport { AbiCoder, getAddress, Interface, keccak256, ParamType } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport {\n invisiProtocolAbi,\n type Delivery,\n type ShieldOutput,\n type ShieldParams,\n} from \"../contracts/index\";\nimport { normalizeFee } from \"../fees/fee\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n field,\n fundingFields,\n getEIP712Domain,\n known,\n normalizeContext,\n normalizeFunding,\n normalizeOpaqueDelivery,\n notes,\n uint,\n validateFundingSubmission,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\n\nexport interface BuildShieldCalldataParams {\n context: TransactionContext;\n params: ShieldParams;\n outputs: readonly ShieldOutput[];\n deliveries: readonly Delivery[];\n funding: FundingInput;\n caller?: Address;\n}\n\nexport async function validateShieldRequest(p: BuildShieldCalldataParams) {\n normalizeContext(p.context);\n if ((getAddress(p.params.token) as Hex) !== (getAddress(p.context.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n known(p.params, [\"token\", \"outputCommitments\", \"deadline\", \"feeRecipient\", \"feeAmount\"]);\n checkDeadline(p.context, p.params.deadline);\n const outputs = dense(p.outputs, \"outputs\"),\n commitments = notes(p.params.outputCommitments, \"outputCommitments\"),\n cs = dense(p.deliveries, \"deliveries\"),\n f = normalizeFunding(p.funding);\n if (\n outputs.length < 1 ||\n outputs.length > 10 ||\n commitments.length !== outputs.length ||\n cs.length !== outputs.length\n )\n throw new Error(\"shield requires 1..10 outputs and matching deliveries\");\n let total = 0n;\n for (const [i, o] of outputs.entries()) {\n known(o, [\"identity\", \"amount\"], \"output\");\n uint(o.amount, 128, \"amount\");\n if (o.amount === 0n) throw new Error(\"amount must be positive\");\n field(o.identity);\n normalizeOpaqueDelivery(cs[i]!, { allowEmpty: true });\n if (\n (await computeNoteCommitment(\n p.context.chainId,\n o.identity,\n BigInt(p.context.tokenAddress),\n o.amount\n )) !== commitments[i]\n )\n throw new Error(\"output commitment mismatch\");\n total += o.amount;\n }\n if (total + normalizeFee(p.params).feeAmount !== f.amount)\n throw new Error(\"funding must equal output total plus fee\");\n return f;\n}\n\nexport async function encodeShieldFundingTypedData(p: BuildShieldCalldataParams) {\n const f = await validateShieldRequest(p);\n return {\n domain: getEIP712Domain(p.context),\n primaryType: \"FundShield\" as const,\n types: { FundShield: fundingFields },\n message: {\n requestHash: shieldFundingRequestHash(p.params, p.outputs, p.deliveries),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\n\nexport async function buildShieldCalldata(p: BuildShieldCalldataParams) {\n const f = await validateShieldRequest(p);\n validateFundingSubmission(f, p.caller, p.context.now);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"shield\", [\n { ...p.params, ...normalizeFee(p.params) },\n p.outputs,\n p.deliveries,\n f,\n ]) as Hex,\n approveAmount: f.amount,\n };\n}\n\nexport function shieldFundingRequestHash(\n params: ShieldParams,\n outputs: readonly ShieldOutput[],\n cs: readonly Delivery[]\n) {\n const outputHash = keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"(bytes32 identity,uint256 amount)[]\"].map((parameter) => ParamType.from(parameter)),\n [outputs]\n ) as Hex\n ) as Hex;\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n \"bytes32\",\n \"(address token,bytes32[] outputCommitments,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n \"bytes32\",\n \"bytes32\",\n ].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiShield\")),\n { ...params, ...normalizeFee(params) },\n outputHash,\n deliveriesHash(cs),\n ]\n ) as Hex\n ) as Hex;\n}\n","import { getAddress, keccak256 } from \"ethers\";\nimport type { Hex } from \"../contracts/index\";\n\nimport {\n MissingCapabilityError,\n ReceivingAddress,\n type ReceivingKeyLookup,\n} from \"@invisi-labs/core\";\nimport {\n RegistrationOperation,\n type RegistrationPreparation,\n type RegistryReader,\n} from \"./RegistrationOperation\";\nimport {\n buildRegistrationCalldata,\n registrationDigest,\n registrationTypedData,\n type AddressRegistration,\n type RegistrationOptions,\n type RegistryContext,\n} from \"./registry\";\n\nexport interface AddressRegistryOptions {\n lookup?: ReceivingKeyLookup;\n expectedRuntimeCodeHash?: Hex;\n}\n\n/** Independent registry deployment and nonce domain, selected by the application. */\nexport class AddressRegistry {\n readonly context: Readonly<RegistryContext>;\n readonly #lookup: ReceivingKeyLookup | undefined;\n readonly expectedRuntimeCodeHash: Hex | undefined;\n\n constructor(context: RegistryContext, options: AddressRegistryOptions = {}) {\n if (\n typeof context.chainId !== \"bigint\" ||\n context.chainId < 0n ||\n context.chainId >= 1n << 64n ||\n BigInt(getAddress(context.registryAddress) as Hex) === 0n\n ) {\n throw new Error(\"invalid registry context\");\n }\n this.context = Object.freeze({\n ...context,\n registryAddress: getAddress(context.registryAddress) as Hex,\n });\n this.#lookup = options.lookup;\n this.expectedRuntimeCodeHash = options.expectedRuntimeCodeHash?.toLowerCase() as\n Hex | undefined;\n if (\n this.expectedRuntimeCodeHash &&\n !/^0x[0-9a-f]{64}$/.test(this.expectedRuntimeCodeHash)\n ) {\n throw new Error(\"invalid registry runtime profile\");\n }\n Object.freeze(this);\n }\n\n async validateDeployment(\n reader: Pick<RegistryReader, \"getChainId\" | \"getCode\">\n ): Promise<void> {\n if (!this.expectedRuntimeCodeHash) {\n throw new MissingCapabilityError(\"trusted registry deployment profile\");\n }\n if ((await reader.getChainId()) !== this.context.chainId) {\n throw new Error(\"registry chain mismatch\");\n }\n const code = await reader.getCode(this.context.registryAddress);\n if (\n !/^0x(?:[0-9a-fA-F]{2})+$/.test(code) ||\n (keccak256(code) as Hex) !== this.expectedRuntimeCodeHash\n ) {\n throw new Error(\"registry runtime profile mismatch\");\n }\n }\n\n prepareRegistration(options: RegistrationPreparation): Promise<RegistrationOperation> {\n return RegistrationOperation.prepare(this, options);\n }\n\n async resolve(address: string): Promise<string> {\n const receiving = ReceivingAddress.parse(address);\n if (receiving.kind === \"short\" && !this.#lookup) {\n throw new MissingCapabilityError(\"registry reader\");\n }\n return (await receiving.resolve(this.#lookup)).toString();\n }\n\n typedData(registration: AddressRegistration, options?: RegistrationOptions) {\n return registrationTypedData(this.context, registration, options);\n }\n\n digest(registration: AddressRegistration, options?: RegistrationOptions) {\n return registrationDigest(this.context, registration, options);\n }\n\n buildCall(\n registration: AddressRegistration,\n signature: `0x${string}`,\n options?: RegistrationOptions\n ) {\n return buildRegistrationCalldata(this.context, registration, signature, options);\n }\n}\n","import type { PublicWallet } from \"@invisi-labs/core\";\nimport { Interface, getBytes, hexlify, verifyTypedData } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\n\nimport { ReceivingAddress, createSigningRequest } from \"@invisi-labs/core\";\nimport { invisiAddressRegistryAbi } from \"../contracts/index\";\nimport type { CanonicalBlock, ChainReader, TransactionCall } from \"../interfaces\";\nimport type { AddressRegistry } from \"./AddressRegistry\";\nimport {\n buildRegistrationCalldata,\n registrationDigest,\n registrationTypedData,\n type AddressRegistration,\n type RegistryContext,\n} from \"./registry\";\n\nexport interface RegistryReader extends Pick<\n ChainReader,\n \"getChainId\" | \"getCode\" | \"getBlock\" | \"getLatestBlockNumber\" | \"getTransaction\" | \"getReceipt\"\n> {\n /** Validate arbitrary ERC-1271 bytes for a contract owner; transport errors propagate. */\n isValidRegistrationSignature?(owner: Address, digest: Hex, signature: Hex): Promise<boolean>;\n getRegistryNonce(\n context: RegistryContext,\n ownerAddress: Hex,\n block: CanonicalBlock\n ): Promise<bigint>;\n}\n\nexport interface RegistrationPreparation {\n wallet: PublicWallet;\n reader: RegistryReader;\n deadline?: bigint;\n update?: boolean;\n}\n\nexport type RegistrationStatus =\n | \"prepared\"\n | \"ready\"\n | \"submitted\"\n | \"confirmed\"\n | \"uncertain\"\n | \"failed\"\n | \"expired\"\n | \"reorged\";\n\ninterface RegistrationPlan {\n id: string;\n context: RegistryContext;\n registration: AddressRegistration;\n update: boolean;\n}\n\nfunction check(ok: unknown, message: string): asserts ok {\n if (!ok) {\n throw new Error(message);\n }\n}\n\nexport class RegistrationOperation {\n readonly #registry: AddressRegistry;\n readonly #runtime: RegistrationPreparation;\n readonly #plan: RegistrationPlan;\n readonly #signature: Hex | undefined;\n readonly #hash: Hex | undefined;\n readonly #anchor: CanonicalBlock | undefined;\n readonly status: RegistrationStatus;\n\n private constructor(\n registry: AddressRegistry,\n runtime: RegistrationPreparation,\n plan: RegistrationPlan,\n status: RegistrationStatus,\n signature?: Hex,\n hash?: Hex,\n anchor?: CanonicalBlock\n ) {\n this.#registry = registry;\n this.#runtime = { ...runtime };\n this.#plan = structuredClone(plan);\n this.status = status;\n this.#signature = signature;\n this.#hash = hash;\n this.#anchor = anchor ? { ...anchor } : undefined;\n Object.freeze(this);\n }\n\n static async prepare(\n registry: AddressRegistry,\n options: RegistrationPreparation\n ): Promise<RegistrationOperation> {\n const runtime = { ...options };\n const update = options.update ?? false;\n check(typeof update === \"boolean\", \"update must be boolean\");\n await registry.validateDeployment(runtime.reader);\n const block = await runtime.reader.getBlock(await runtime.reader.getLatestBlockNumber());\n const context = { ...registry.context, now: block.timestamp };\n const nonce = await runtime.reader.getRegistryNonce(\n context,\n runtime.wallet.ownerAddress,\n block\n );\n check(\n typeof nonce === \"bigint\" && nonce >= 0n && nonce < (1n << 64n) - 1n,\n \"invalid or exhausted registry nonce\"\n );\n check(\n update ? nonce > 0n : nonce === 0n,\n update ? \"wallet is not registered\" : \"wallet is already registered; prepare an update\"\n );\n const address = ReceivingAddress.parse(await registry.resolve(runtime.wallet.getAddress()));\n const keys = address.getReceivingKeys();\n const registration: AddressRegistration = {\n ownerAddress: runtime.wallet.ownerAddress,\n keys: {\n viewingPublicKey: hexlify(keys.viewingPublicKey) as Hex,\n clueKey: hexlify(keys.clueKey) as Hex,\n },\n nonce,\n deadline: options.deadline ?? block.timestamp + 300n,\n };\n registrationTypedData(context, registration, { update, expectedNonce: nonce });\n check(\n (await runtime.reader.getBlock(block.number)).hash === block.hash,\n \"canonical registry block changed while preparing\"\n );\n return new RegistrationOperation(\n registry,\n runtime,\n { id: crypto.randomUUID(), context, registration, update },\n \"prepared\"\n );\n }\n\n get id(): string {\n return this.#plan.id;\n }\n\n preview() {\n return {\n id: this.id,\n status: this.status,\n chainId: this.#plan.context.chainId,\n registryAddress: this.#plan.context.registryAddress,\n ...structuredClone(this.#plan.registration),\n update: this.#plan.update,\n };\n }\n\n /** Export portable EIP-712 data for external signing. */\n async exportRegistrationAuthorization(options: { signal?: AbortSignal } = {}) {\n check(this.status === \"prepared\", \"registry operation is not awaiting authorization\");\n options.signal?.throwIfAborted();\n await this.validateFreshness();\n options.signal?.throwIfAborted();\n return createSigningRequest(this.typedData());\n }\n\n /** Validate and attach an independently obtained EOA or ERC-1271 signature. */\n async withSignature(\n signature: string,\n options: { signal?: AbortSignal } = {}\n ): Promise<RegistrationOperation> {\n check(this.status === \"prepared\", \"registry operation is not awaiting authorization\");\n options.signal?.throwIfAborted();\n await this.validateFreshness();\n options.signal?.throwIfAborted();\n check(\n /^0x(?:[a-fA-F0-9]{2})+$/.test(signature),\n \"registry signature must be nonempty hexadecimal bytes\"\n );\n const p = this.#plan;\n const owner = p.registration.ownerAddress as Address;\n // Match the protocol's SignatureChecker: canonical ECDSA first, including\n // delegated EOAs with code, then the contract-owner ERC-1271 fallback.\n let valid = false;\n try {\n const bytes = getBytes(signature);\n const typed = this.typedData();\n valid =\n bytes.length === 65 &&\n (bytes[64] === 27 || bytes[64] === 28) &&\n BigInt(verifyTypedData(typed.domain, typed.types, typed.message, signature)) ===\n BigInt(owner);\n } catch {\n valid = false;\n }\n if (!valid) {\n const code = await this.#runtime.reader.getCode(owner);\n check(/^0x(?:[a-fA-F0-9]{2})*$/.test(code), \"invalid owner contract code\");\n check(code !== \"0x\", \"invalid EOA registry signature\");\n const verify = this.#runtime.reader.isValidRegistrationSignature;\n check(verify, \"ERC-1271 registry signature verification capability is missing\");\n check(\n await verify.call(\n this.#runtime.reader,\n owner,\n registrationDigest(p.context, p.registration, { update: p.update }),\n signature as Hex\n ),\n \"invalid ERC-1271 registry signature\"\n );\n }\n options.signal?.throwIfAborted();\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n this.#plan,\n \"ready\",\n signature as Hex\n );\n }\n\n /** Empty signatures require the transaction sender to be the wallet owner. */\n async authorizeDirect(): Promise<RegistrationOperation> {\n check(this.status === \"prepared\", \"registry operation is not awaiting authorization\");\n await this.validateFreshness();\n return new RegistrationOperation(this.#registry, this.#runtime, this.#plan, \"ready\", \"0x\");\n }\n\n typedData() {\n const p = this.#plan;\n return registrationTypedData(p.context, p.registration, {\n update: p.update,\n expectedNonce: p.registration.nonce,\n });\n }\n\n private call(): TransactionCall {\n check(this.#signature !== undefined, \"registry signature is missing\");\n const p = this.#plan;\n const result = buildRegistrationCalldata(p.context, p.registration, this.#signature, {\n update: p.update,\n expectedNonce: p.registration.nonce,\n });\n return { to: result.to, data: result.callData, value: result.value };\n }\n\n async exportTransaction(): Promise<TransactionCall> {\n check(\n this.#signature !== undefined && this.status !== \"prepared\",\n \"registry operation is not ready\"\n );\n await this.validateFreshness();\n return this.call();\n }\n\n private async validateFreshness(): Promise<void> {\n await this.#registry.validateDeployment(this.#runtime.reader);\n const block = await this.#runtime.reader.getBlock(\n await this.#runtime.reader.getLatestBlockNumber()\n );\n const p = this.#plan;\n check(block.timestamp <= p.registration.deadline, \"registry operation has expired\");\n check(\n (await this.#runtime.reader.getRegistryNonce(\n p.context,\n p.registration.ownerAddress,\n block\n )) === p.registration.nonce,\n \"registry nonce changed; prepare again\"\n );\n check(\n (await this.#runtime.reader.getBlock(block.number)).hash === block.hash,\n \"canonical registry block changed during authorization\"\n );\n }\n\n /** Associate a signed/broadcast transaction; ethers owns sending and receipt waiting. */\n trackTransaction(transactionHash: string): RegistrationOperation {\n check(/^0x[a-fA-F0-9]{64}$/.test(transactionHash), \"invalid registry transaction hash\");\n check(\n this.#signature !== undefined && [\"ready\", \"uncertain\"].includes(this.status),\n \"registry operation is not ready\"\n );\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n this.#plan,\n \"uncertain\",\n this.#signature,\n transactionHash as Hex\n );\n }\n\n async reconcile(\n options: { transactionHash?: Hex; signal?: AbortSignal } = {}\n ): Promise<RegistrationOperation> {\n options.signal?.throwIfAborted();\n const { reader } = this.#runtime;\n const p = this.#plan;\n await this.#registry.validateDeployment(reader);\n if (\n this.#anchor &&\n (await reader.getBlock(this.#anchor.number)).hash !== this.#anchor.hash\n ) {\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n p,\n \"reorged\",\n this.#signature,\n this.#hash\n );\n }\n const hash = options.transactionHash ?? this.#hash;\n const receipt = hash ? await reader.getReceipt(hash) : null;\n if (receipt) {\n check(\n receipt.transactionHash === hash &&\n (await reader.getBlock(receipt.block.number)).hash === receipt.block.hash,\n \"registry receipt is not canonical\"\n );\n const transaction = await reader.getTransaction(hash!);\n const call = this.call();\n check(\n transaction &&\n transaction.transactionHash === hash &&\n transaction.to.toLowerCase() === call.to.toLowerCase() &&\n transaction.data.toLowerCase() === call.data.toLowerCase() &&\n transaction.value === 0n &&\n (this.#signature !== \"0x\" ||\n BigInt(transaction.from) === BigInt(p.registration.ownerAddress)),\n \"registry transaction differs from frozen request\"\n );\n check(\n receipt.status === \"success\" || receipt.status === \"reverted\",\n \"registry execution status is missing\"\n );\n if (receipt.status === \"success\") {\n const found = receipt.logs.some((log) => {\n if (\n log.address.toLowerCase() !== p.context.registryAddress.toLowerCase() ||\n log.transactionHash !== hash\n ) {\n return false;\n }\n try {\n const event = ((decoded) => ({\n eventName: decoded!.name,\n args: decoded!.args.toObject(),\n }))(\n new Interface(invisiAddressRegistryAbi).parseLog({\n data: log.data,\n topics: log.topics as never,\n })\n );\n return (\n event.eventName === \"ReceivingKeysSet\" &&\n BigInt(event.args.walletIdentity) ===\n BigInt(p.registration.ownerAddress) &&\n event.args.viewingPublicKey.toLowerCase() ===\n p.registration.keys.viewingPublicKey.toLowerCase() &&\n event.args.clueKey.toLowerCase() ===\n p.registration.keys.clueKey.toLowerCase() &&\n event.args.nextNonce === p.registration.nonce + 1n\n );\n } catch {\n return false;\n }\n });\n check(found, \"registry receipt has no matching key update event\");\n check(\n (await reader.getBlock(receipt.block.number)).hash === receipt.block.hash,\n \"registry block changed during confirmation\"\n );\n options.signal?.throwIfAborted();\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n p,\n \"confirmed\",\n this.#signature,\n hash,\n receipt.block\n );\n }\n }\n const head = await reader.getBlock(await reader.getLatestBlockNumber());\n const nonce = await reader.getRegistryNonce(p.context, p.registration.ownerAddress, head);\n check(\n (await reader.getBlock(head.number)).hash === head.hash,\n \"canonical registry block changed during reconciliation\"\n );\n return new RegistrationOperation(\n this.#registry,\n this.#runtime,\n p,\n head.timestamp > p.registration.deadline\n ? \"expired\"\n : nonce !== p.registration.nonce\n ? \"failed\"\n : \"uncertain\",\n this.#signature,\n hash\n );\n }\n\n toJSON() {\n return {\n id: this.id,\n kind: this.#plan.update ? \"update-receiving-keys\" : \"register-receiving-keys\",\n status: this.status,\n };\n }\n\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import {\n Contract,\n Interface,\n TypedDataEncoder,\n getAddress,\n getBytes,\n hexlify,\n isHexString,\n toBeHex,\n type ContractRunner,\n} from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\n\nimport { ReceivingAddress, decodeAddress, type ReceivingKeyLookup } from \"@invisi-labs/core\";\nimport { invisiAddressRegistryAbi } from \"../contracts/index\";\n\nexport interface RegistryContext {\n chainId: bigint;\n registryAddress: Address;\n /** Optional explicit wall-clock value in seconds. Equality with deadline is valid. */\n now?: bigint;\n}\nexport interface RegistryReceivingKeys {\n viewingPublicKey: Hex;\n clueKey: Hex;\n}\nexport interface AddressRegistration {\n /** Nonzero EVM owner: 20 bytes or canonical zero-padded bytes32. */\n ownerAddress: Hex;\n keys: RegistryReceivingKeys;\n /** The current registry nonce expected for this operation. */\n nonce: bigint;\n deadline: bigint;\n}\nexport interface RegistrationOptions {\n update?: boolean;\n /** Check a separately obtained current nonce before authorizing or encoding. */\n expectedNonce?: bigint;\n}\nexport interface RegistrationCalldata {\n to: Address;\n callData: Hex;\n value: 0n;\n}\nconst MAX_NONCE = (1n << 64n) - 1n;\nfunction uint64(value: bigint, name: string): bigint {\n if (typeof value !== \"bigint\" || value < 0n || value > MAX_NONCE)\n throw new RangeError(`${name} must be uint64`);\n return value;\n}\nfunction hexBytes(value: Hex, length: number): Uint8Array {\n if (typeof value !== \"string\" || !isHexString(value) || value.length !== 2 + length * 2)\n throw new Error(`Expected ${length} hexadecimal bytes`);\n return getBytes(value);\n}\nfunction normalizeKeys(ownerAddress: Hex, keys: RegistryReceivingKeys): RegistryReceivingKeys {\n const decoded = decodeAddress(\n ReceivingAddress.from({\n ownerAddress,\n viewingPublicKey: hexBytes(keys.viewingPublicKey, 33),\n clueKey: hexBytes(keys.clueKey, 32),\n }).toString()\n );\n if (decoded.kind !== \"long\") throw new Error(\"Expected full receiving address\");\n return {\n viewingPublicKey: hexlify(decoded.viewingPublicKey) as Hex,\n clueKey: hexlify(decoded.clueKey) as Hex,\n };\n}\nfunction normalize(\n context: RegistryContext,\n registration: AddressRegistration,\n options: RegistrationOptions\n) {\n uint64(context.chainId, \"chainId\");\n const registryAddress = getAddress(context.registryAddress) as Hex;\n if (BigInt(registryAddress) === 0n) throw new Error(\"Registry address must be nonzero\");\n if (!/^0x(?:[0-9a-fA-F]{40}|[0-9a-fA-F]{64})$/.test(registration.ownerAddress))\n throw new Error(\"Wallet identity must be an EVM owner or padded bytes32\");\n // Converting to 20 bytes rejects nonzero high bits instead of truncating them.\n const ownerAddress = decodeAddress(\n ReceivingAddress.fromIdentity(\n toBeHex(BigInt(registration.ownerAddress), 20) as Hex\n ).toString()\n ).ownerAddress;\n const keys = normalizeKeys(ownerAddress, registration.keys);\n const nonce = uint64(registration.nonce, \"nonce\"),\n deadline = uint64(registration.deadline, \"deadline\");\n if (nonce === MAX_NONCE) throw new Error(\"Registry nonce exhausted\");\n if (options.update !== undefined && typeof options.update !== \"boolean\")\n throw new TypeError(\"update must be boolean\");\n if (!options.update && nonce !== 0n)\n throw new Error(\"Initial registration requires nonce zero\");\n if (\n options.expectedNonce !== undefined &&\n uint64(options.expectedNonce, \"expectedNonce\") !== nonce\n )\n throw new Error(\"Registry nonce mismatch\");\n if (context.now !== undefined && deadline < uint64(context.now, \"now\"))\n throw new Error(\"Registration expired\");\n return { registryAddress, registration: { ownerAddress, keys, nonce, deadline } };\n}\n\n/** Standard registry EIP-712 data, independent of private WalletAuthorization. */\nexport function registrationTypedData(\n context: RegistryContext,\n registration: AddressRegistration,\n options: RegistrationOptions = {}\n) {\n const { registryAddress, registration: r } = normalize(context, registration, options);\n const primaryType = options.update ? \"UpdateReceivingKeys\" : \"RegisterReceivingKeys\";\n return {\n domain: {\n name: \"InvisiAddressRegistry\",\n version: \"1\",\n chainId: context.chainId,\n verifyingContract: registryAddress,\n },\n primaryType,\n types: {\n [primaryType]: [\n { name: \"walletIdentity\", type: \"bytes32\" },\n { name: \"viewingPublicKey\", type: \"bytes\" },\n { name: \"clueKey\", type: \"bytes32\" },\n { name: \"nonce\", type: \"uint64\" },\n { name: \"deadline\", type: \"uint64\" },\n ],\n },\n message: {\n walletIdentity: toBeHex(BigInt(r.ownerAddress), 32),\n ...r.keys,\n nonce: r.nonce,\n deadline: r.deadline,\n },\n };\n}\nexport function registrationDigest(\n context: RegistryContext,\n registration: AddressRegistration,\n options: RegistrationOptions = {}\n): Hex {\n const typed = registrationTypedData(context, registration, options);\n return TypedDataEncoder.hash(typed.domain, typed.types, typed.message) as Hex;\n}\n/** Encode an owner call (empty signature) or an EIP-712 / ERC-1271 authorized relay. */\nexport function buildRegistrationCalldata(\n context: RegistryContext,\n registration: AddressRegistration,\n signature: Hex,\n options: RegistrationOptions = {}\n): RegistrationCalldata {\n const normalized = normalize(context, registration, options);\n if (typeof signature !== \"string\" || !isHexString(signature) || signature.length % 2 !== 0)\n throw new Error(\"Registration signature must be hexadecimal bytes\");\n return {\n to: normalized.registryAddress,\n value: 0n,\n callData: new Interface(invisiAddressRegistryAbi).encodeFunctionData(\n options.update ? \"updateKeys\" : \"registerKeys\",\n [\n {\n // The registry wire schema retains its deployed EIP-712/ABI field name.\n walletIdentity: toBeHex(BigInt(normalized.registration.ownerAddress), 32),\n keys: normalized.registration.keys,\n nonce: normalized.registration.nonce,\n deadline: normalized.registration.deadline,\n },\n signature,\n ]\n ) as Hex,\n };\n}\n\n/** Ethers runner used for registry contract reads. */\nexport type RegistryReadClient = ContractRunner;\n/** One receivingKeysOf query per short address; RPC failures propagate unchanged. */\nexport function createRegistryReceivingKeyLookup(\n client: RegistryReadClient,\n registryAddress: Address\n): ReceivingKeyLookup {\n const address = getAddress(registryAddress) as Hex;\n if (BigInt(address) === 0n) throw new Error(\"Registry address must be nonzero\");\n return async (ownerAddress) => {\n const identity = decodeAddress(\n ReceivingAddress.fromIdentity(ownerAddress).toString()\n ).ownerAddress;\n const [keys, nonce] = await new Contract(\n address,\n invisiAddressRegistryAbi,\n client\n ).getFunction(\"receivingKeysOf\")(toBeHex(BigInt(identity), 32));\n uint64(nonce, \"registry nonce\");\n const normalized = normalizeKeys(identity, keys);\n return {\n viewingPublicKey: getBytes(normalized.viewingPublicKey),\n clueKey: getBytes(normalized.clueKey),\n };\n };\n}\n","import {\n computeCreditCommitment,\n computeCreditSharedKeyHash,\n computeNoteCommitment,\n computeNoteIdentity,\n FIELD_MODULUS,\n} from \"@invisi-labs/core\";\n\nexport interface VerifyNoteCommitmentParams {\n ownerAddress: `0x${string}`;\n tokenAddress: `0x${string}`;\n amount: bigint;\n nonce: `0x${string}`;\n noteCommitment: `0x${string}`;\n chainId: bigint;\n}\n\nexport async function verifyNoteCommitment(params: VerifyNoteCommitmentParams): Promise<boolean> {\n const expected = await computeNoteCommitment(\n params.chainId,\n await computeNoteIdentity(BigInt(params.ownerAddress), BigInt(params.nonce)),\n BigInt(params.tokenAddress),\n params.amount\n );\n return BigInt(expected) === BigInt(params.noteCommitment);\n}\n\nexport interface VerifyCreditCommitmentParams extends Partial<\n import(\"@invisi-labs/core\").CreditPolicy\n> {\n chainId: bigint;\n spenderWalletIdentity: `0x${string}`;\n ownerWalletIdentity: `0x${string}`;\n spenderPayout: `0x${string}`;\n ownerPayout: `0x${string}`;\n tokenAddress: `0x${string}`;\n amount: bigint;\n nonce: bigint;\n expiry: bigint;\n creditSharedKey: bigint;\n /** Server-returned value to verify against the locally recomputed commitment. */\n creditCommitment: `0x${string}`;\n}\n\n/**\n * Hashes the received shared key locally, recomputes the Credit leaf and compares it to the\n * server-returned value. A mismatch means the server folded a wrong nonce\n * (or other parameter) — the caller MUST abort and not create a Credit.\n */\nexport async function verifyCreditCommitment(\n params: VerifyCreditCommitmentParams\n): Promise<boolean> {\n if (params.creditSharedKey <= 0n || params.creditSharedKey >= FIELD_MODULUS)\n throw new RangeError(\"creditSharedKey must be a nonzero canonical Field\");\n const expected = await computeCreditCommitment(\n params.chainId,\n params.spenderWalletIdentity,\n params.ownerWalletIdentity,\n BigInt(params.spenderPayout),\n BigInt(params.ownerPayout),\n BigInt(params.tokenAddress),\n params.amount,\n params.nonce,\n params.expiry,\n await computeCreditSharedKeyHash(params.creditSharedKey),\n params\n );\n return BigInt(expected) === BigInt(params.creditCommitment);\n}\n","import { Contract, getAddress, type ContractRunner } from \"ethers\";\nimport type { Hex } from \"../contracts/index\";\n\nimport { invisiFactoryAbi } from \"../contracts/index\";\n/**\n * Query the selected factory. The caller still verifies the returned deployment profile.\n * Calls `factory.getInstanceAddress(salt)` on-chain.\n */\nexport async function resolveInstanceAddress(\n client: ContractRunner,\n factoryAddress: `0x${string}`,\n salt: `0x${string}`\n): Promise<`0x${string}`> {\n const instance = await new Contract(\n getAddress(factoryAddress),\n invisiFactoryAbi,\n client\n ).getFunction(\"getInstanceAddress\")(salt);\n return getAddress(instance) as Hex;\n}\n"],"mappings":"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CR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,QACR,OAAS;AAAA,QACT,OAAS;AAAA,MA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","names":["v","pad","AbiCoder","getAddress","Interface","keccak256","ParamType","getAddress","getAddress","computeWalletAuthorizationDigest","walletAuthorizationTypedData","AbiCoder","dataLength","getAddress","isHexString","keccak256","ParamType","computeWalletAuthorizationDigest","getAddress","computeWalletAuthorizationDigest","keccak256","AbiCoder","ParamType","isHexString","dataLength","getAddress","creation","hashContext","keccak256","AbiCoder","ParamType","walletAuthorizationTypedData","computeWalletAuthorizationDigest","Interface","normalizeCreditDeliveryState","normalizeCreditDeliveryState","pad","computeCreditNullifier","normalizeCreditDeliveryState","normalizeCreditPolicy","notes","normalizeCreditDeliveryState","computeCreditNullifier","pad","normalizeCreditPolicy","computeCreditNullifier","normalizeCreditDeliveryState","normalizeCreditDeliveryState","field","computeCreditNullifier","computeNoteCommitment","computeNoteIdentity","walletAuthorizationTypedData","AbiCoder","keccak256","ParamType","getAddress","getAddress","walletAuthorizationTypedData","keccak256","AbiCoder","ParamType","identity","computeNoteIdentity","computeNoteCommitment","pad","getAddress","keccak256","AbiCoder","Interface","keccak256","ParamType","Interface","keccak256","AbiCoder","ParamType","keccak256","Interface","Interface","computeNoteCommitment","AbiCoder","getAddress","Interface","keccak256","ParamType","getAddress","computeNoteCommitment","Interface","keccak256","AbiCoder","ParamType","keccak256","getAddress","keccak256","getAddress","keccak256","MissingCapabilityError","ReceivingAddress","Interface","getBytes","hexlify","ReceivingAddress","Contract","Interface","TypedDataEncoder","getAddress","isHexString","toBeHex","isHexString","getAddress","toBeHex","TypedDataEncoder","Interface","Contract","check","ReceivingAddress","hexlify","getBytes","Interface","getAddress","MissingCapabilityError","keccak256","ReceivingAddress","computeCreditCommitment","computeCreditSharedKeyHash","computeNoteCommitment","computeNoteIdentity","FIELD_MODULUS","Contract","getAddress","Contract","getAddress"]}