@invisi-labs/sdk 1.1.0 → 1.1.2

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.d.cts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as _invisi_labs_core from '@invisi-labs/core';
2
2
  import { WalletAuthorizationProvider, CreditDeliveryState, Wallet, Note, DisclosureOutput, Disclosure, DisclosureResult } from '@invisi-labs/core';
3
- export { Address, CreditDeliveryState, CreditNote, CreditOpening, Detector, Disclosure, DisclosureExport, DisclosureOutput, DisclosureResult, Hex, MissingCapabilityError, Note, NullifierCapability, ReceivingKeys, ViewingCapability, Wallet, WalletAuthorization, WalletAuthorizationProvider } from '@invisi-labs/core';
4
- import { O as OperationRuntime, a as OperationPlan, G as GasReference, F as FundingSigner, b as OperationAggregateMember, C as CancelCreditPreparation, c as CreateCreditPreparation, D as DrawCreditPreparation, S as ShieldPreparation, d as SweepPreparation, T as TopUpCreditPreparation, e as TransferPreparation, W as WithdrawalPreparation, f as WalletSessionOptions } from './gas-estimation-Byi278aa.cjs';
5
- export { g as CoinSelector, h as FundingAuthorizationVerifier, i as FundingSource, j as FundingTypedData, k as GasBenchmarkCircuit, l as GasBenchmarkDeployment, m as GasBenchmarkProfile, n as GasBenchmarkSample, o as GasBenchmarkShape, p as defineGasBenchmarks } from './gas-estimation-Byi278aa.cjs';
3
+ export { Address, CreditDeliveryState, CreditNote, CreditOpening, Detector, Disclosure, DisclosureExport, DisclosureOutput, DisclosureResult, Hex, MAX_MEMO_BYTES, Memo, MissingCapabilityError, Note, NullifierCapability, ReceivingKeys, ViewingCapability, Wallet, WalletAuthorization, WalletAuthorizationProvider, decodeMemoText, encodeMemo } from '@invisi-labs/core';
4
+ import { O as OperationRuntime, a as OperationPlan, G as GasReference, F as FundingSigner, b as OperationAggregateMember, C as CancelCreditPreparation, c as CreateCreditPreparation, D as DrawCreditPreparation, S as ShieldPreparation, d as SweepPreparation, T as TopUpCreditPreparation, e as TransferPreparation, W as WithdrawalPreparation, f as WalletSessionOptions } from './gas-estimation-BV8WdwNF.cjs';
5
+ export { g as CoinSelector, h as FundingAuthorizationVerifier, i as FundingSource, j as FundingTypedData, k as GasBenchmarkCircuit, l as GasBenchmarkDeployment, m as GasBenchmarkProfile, n as GasBenchmarkSample, o as GasBenchmarkShape, p as defineGasBenchmarks } from './gas-estimation-BV8WdwNF.cjs';
6
6
  import * as _invisi_labs_protocol from '@invisi-labs/protocol';
7
7
  import { TransactionCall, Protocol, CanonicalBlock, ChainReader, TokenProtocol, AddressRegistry as AddressRegistry$1, RegistrationPreparation } from '@invisi-labs/protocol';
8
8
  export { AddressRegistryOptions, CanonicalBlock, CanonicalReceipt, ChainReader, FactoryReader, Membership, Protocol, ProtocolDataProvider, ProtocolDataStatus, ProtocolOptions, ProtocolUpdateRange, ProtocolUpdates, RegistrationOperation, RegistryContext, RegistryReader, TokenProtocol, TokenProtocolOptions, TransactionCall, TransactionContext } from '@invisi-labs/protocol';
@@ -24,11 +24,11 @@ declare class PreparedTransaction {
24
24
  private constructor();
25
25
  static prepare(runtime: Runtime, plan: OperationPlan): PreparedTransaction;
26
26
  get id(): string;
27
- get kind(): "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
27
+ get kind(): "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
28
28
  estimateGas(): GasReference;
29
29
  preview(): {
30
30
  id: string;
31
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
31
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
32
32
  status: OperationStatus;
33
33
  context: {
34
34
  tokenAddress: _invisi_labs_core.Address;
@@ -87,7 +87,7 @@ declare class PreparedTransaction {
87
87
  toJSON(): {
88
88
  transaction: boolean;
89
89
  id: string;
90
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
90
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
91
91
  status: OperationStatus;
92
92
  };
93
93
  }
@@ -185,7 +185,7 @@ declare class Operation {
185
185
  estimateGas(): GasReference;
186
186
  preview(): {
187
187
  id: string;
188
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
188
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
189
189
  status: OperationStatus;
190
190
  context: {
191
191
  tokenAddress: _invisi_labs_core.Address;
@@ -245,7 +245,7 @@ declare class Operation {
245
245
  }): Promise<Operation>;
246
246
  toJSON(): {
247
247
  id: string;
248
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
248
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
249
249
  status: OperationStatus;
250
250
  };
251
251
  }
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as _invisi_labs_core from '@invisi-labs/core';
2
2
  import { WalletAuthorizationProvider, CreditDeliveryState, Wallet, Note, DisclosureOutput, Disclosure, DisclosureResult } from '@invisi-labs/core';
3
- export { Address, CreditDeliveryState, CreditNote, CreditOpening, Detector, Disclosure, DisclosureExport, DisclosureOutput, DisclosureResult, Hex, MissingCapabilityError, Note, NullifierCapability, ReceivingKeys, ViewingCapability, Wallet, WalletAuthorization, WalletAuthorizationProvider } from '@invisi-labs/core';
4
- import { O as OperationRuntime, a as OperationPlan, G as GasReference, F as FundingSigner, b as OperationAggregateMember, C as CancelCreditPreparation, c as CreateCreditPreparation, D as DrawCreditPreparation, S as ShieldPreparation, d as SweepPreparation, T as TopUpCreditPreparation, e as TransferPreparation, W as WithdrawalPreparation, f as WalletSessionOptions } from './gas-estimation-CUZXjsO7.js';
5
- export { g as CoinSelector, h as FundingAuthorizationVerifier, i as FundingSource, j as FundingTypedData, k as GasBenchmarkCircuit, l as GasBenchmarkDeployment, m as GasBenchmarkProfile, n as GasBenchmarkSample, o as GasBenchmarkShape, p as defineGasBenchmarks } from './gas-estimation-CUZXjsO7.js';
3
+ export { Address, CreditDeliveryState, CreditNote, CreditOpening, Detector, Disclosure, DisclosureExport, DisclosureOutput, DisclosureResult, Hex, MAX_MEMO_BYTES, Memo, MissingCapabilityError, Note, NullifierCapability, ReceivingKeys, ViewingCapability, Wallet, WalletAuthorization, WalletAuthorizationProvider, decodeMemoText, encodeMemo } from '@invisi-labs/core';
4
+ import { O as OperationRuntime, a as OperationPlan, G as GasReference, F as FundingSigner, b as OperationAggregateMember, C as CancelCreditPreparation, c as CreateCreditPreparation, D as DrawCreditPreparation, S as ShieldPreparation, d as SweepPreparation, T as TopUpCreditPreparation, e as TransferPreparation, W as WithdrawalPreparation, f as WalletSessionOptions } from './gas-estimation-v9OjKMsL.js';
5
+ export { g as CoinSelector, h as FundingAuthorizationVerifier, i as FundingSource, j as FundingTypedData, k as GasBenchmarkCircuit, l as GasBenchmarkDeployment, m as GasBenchmarkProfile, n as GasBenchmarkSample, o as GasBenchmarkShape, p as defineGasBenchmarks } from './gas-estimation-v9OjKMsL.js';
6
6
  import * as _invisi_labs_protocol from '@invisi-labs/protocol';
7
7
  import { TransactionCall, Protocol, CanonicalBlock, ChainReader, TokenProtocol, AddressRegistry as AddressRegistry$1, RegistrationPreparation } from '@invisi-labs/protocol';
8
8
  export { AddressRegistryOptions, CanonicalBlock, CanonicalReceipt, ChainReader, FactoryReader, Membership, Protocol, ProtocolDataProvider, ProtocolDataStatus, ProtocolOptions, ProtocolUpdateRange, ProtocolUpdates, RegistrationOperation, RegistryContext, RegistryReader, TokenProtocol, TokenProtocolOptions, TransactionCall, TransactionContext } from '@invisi-labs/protocol';
@@ -24,11 +24,11 @@ declare class PreparedTransaction {
24
24
  private constructor();
25
25
  static prepare(runtime: Runtime, plan: OperationPlan): PreparedTransaction;
26
26
  get id(): string;
27
- get kind(): "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
27
+ get kind(): "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
28
28
  estimateGas(): GasReference;
29
29
  preview(): {
30
30
  id: string;
31
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
31
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
32
32
  status: OperationStatus;
33
33
  context: {
34
34
  tokenAddress: _invisi_labs_core.Address;
@@ -87,7 +87,7 @@ declare class PreparedTransaction {
87
87
  toJSON(): {
88
88
  transaction: boolean;
89
89
  id: string;
90
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
90
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
91
91
  status: OperationStatus;
92
92
  };
93
93
  }
@@ -185,7 +185,7 @@ declare class Operation {
185
185
  estimateGas(): GasReference;
186
186
  preview(): {
187
187
  id: string;
188
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
188
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
189
189
  status: OperationStatus;
190
190
  context: {
191
191
  tokenAddress: _invisi_labs_core.Address;
@@ -245,7 +245,7 @@ declare class Operation {
245
245
  }): Promise<Operation>;
246
246
  toJSON(): {
247
247
  id: string;
248
- kind: "shield" | "transfer" | "withdraw" | "sweep" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
248
+ kind: "transfer" | "withdraw" | "sweep" | "shield" | "create-credit" | "draw-credit" | "top-up-credit" | "cancel-credit";
249
249
  status: OperationStatus;
250
250
  };
251
251
  }
package/dist/index.js CHANGED
@@ -19,13 +19,13 @@ import {
19
19
  signOperationFunding,
20
20
  statement,
21
21
  walletBalance
22
- } from "./chunk-T246CYQ7.js";
22
+ } from "./chunk-Z6NDXVBL.js";
23
23
  import {
24
24
  EthersAddressResolver,
25
25
  EthersChainReader,
26
26
  EthersFundingSigner,
27
27
  EthersFundingVerifier
28
- } from "./chunk-NAEEEZMH.js";
28
+ } from "./chunk-4HMM7ZKY.js";
29
29
 
30
30
  // src/explicit-preparation.ts
31
31
  import { getAddress } from "ethers";
@@ -436,7 +436,10 @@ import {
436
436
  NullifierCapability,
437
437
  WalletAuthorization,
438
438
  MissingCapabilityError as MissingCapabilityError3,
439
- Disclosure
439
+ Disclosure,
440
+ encodeMemo,
441
+ decodeMemoText,
442
+ MAX_MEMO_BYTES
440
443
  } from "@invisi-labs/core";
441
444
  import { Protocol, RegistrationOperation } from "@invisi-labs/protocol";
442
445
  import { ProtocolRpcError } from "@invisi-labs/rpc";
@@ -554,6 +557,7 @@ export {
554
557
  DisclosureVerifier,
555
558
  EncryptedWalletCodec,
556
559
  Invisi,
560
+ MAX_MEMO_BYTES,
557
561
  MissingCapabilityError3 as MissingCapabilityError,
558
562
  NullifierCapability,
559
563
  Operation,
@@ -566,7 +570,9 @@ export {
566
570
  Wallet,
567
571
  WalletAuthorization,
568
572
  WalletSession,
573
+ decodeMemoText,
569
574
  defineGasBenchmarks,
575
+ encodeMemo,
570
576
  walletBalance
571
577
  };
572
578
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/explicit-preparation.ts","../src/PreparedTransaction.ts","../src/Invisi.ts","../src/index.ts","../src/ProtocolRpcClient.ts","../src/AddressRegistry.ts","../src/integrations/encrypted-codec.ts"],"sourcesContent":["import { getAddress } from \"ethers\";\nimport type { CreditInput, NoteInput } from \"./explicit-types\";\nimport { PreparedTransaction } from \"./PreparedTransaction\";\nimport { positiveAmount } from \"./session/prepare-common\";\nimport { TransactionPreparation } from \"./session/transaction-preparation\";\nimport type { PreparationInventory, WalletSessionOptions } from \"./session/operation-types\";\n\n/** Only explicitly supplied records participate. No store or automatic coin selection. */\nexport function explicitPreparation(\n options: WalletSessionOptions,\n data: {\n inputs?: readonly NoteInput[];\n creditInputs?: readonly CreditInput[];\n changeAddress?: string;\n },\n tokenAddress: `0x${string}`\n) {\n if (!options.chainReader) throw new Error(\"chain reader required\");\n const inputs = structuredClone(data.inputs ?? []);\n const credits = structuredClone(data.creditInputs ?? []);\n const inventory: PreparationInventory = { notes: {}, credits: {}, reservations: {} };\n const context = options.protocol.context;\n function position(input: NoteInput | CreditInput) {\n if (\n typeof input.treeId !== \"bigint\" ||\n input.treeId < 0n ||\n input.treeId >= 1n << 256n ||\n !Number.isInteger(input.leafIndex) ||\n input.leafIndex < 0 ||\n input.leafIndex >= 65536\n )\n throw new Error(\"invalid explicit input position\");\n }\n for (const input of inputs) {\n position(input);\n positiveAmount(input.note.amount);\n if (inventory.notes[input.commitment]) throw new Error(\"duplicate explicit note input\");\n if (\n input.note.chainId !== context.chainId ||\n input.note.protocolAddress !== BigInt(context.protocolAddress) ||\n input.note.walletIdentity !== options.wallet.walletIdentity\n )\n throw new Error(\"explicit note identity or deployment mismatch\");\n inventory.notes[input.commitment] = { ...input, spent: \"unspent\" };\n }\n for (const input of credits) {\n position(input);\n if (input.role !== \"owner\" && input.role !== \"spender\")\n throw new Error(\"invalid explicit Credit role\");\n const key = input.commitment + \":\" + input.role;\n if (inventory.credits[key]) throw new Error(\"duplicate explicit Credit input\");\n inventory.credits[key] = { ...input, spent: \"unspent\" };\n }\n const scope = {\n ...context,\n namespace: \"explicit\",\n walletIdentity: options.wallet.walletIdentity,\n };\n const { store: _store, coinSelector: _selector, ...capabilities } = options;\n\n if (inputs.some((input) => input.note.tokenAddress !== BigInt(getAddress(tokenAddress))))\n throw new Error(\"explicit note token mismatch\");\n const runtime = {\n options: { ...capabilities, protocol: options.protocol.forToken(tokenAddress) },\n reader: options.chainReader!,\n scope,\n authorization: () => options.authorization ?? options.wallet.exportAuthorization(),\n };\n return new TransactionPreparation<PreparedTransaction>({\n ...runtime,\n explicitInputs: true,\n ...(data.changeAddress ? { changeAddress: data.changeAddress } : {}),\n readInventory: async () => structuredClone(inventory),\n complete: async (plan) => PreparedTransaction.prepare(runtime, plan),\n });\n}\n","import { estimateGasReference } from \"./gas-estimation\";\nimport {\n authorizeOperation,\n proveOperation,\n signOperationFunding,\n} from \"./session/operation-execution\";\nimport {\n MissingCapabilityError,\n type AuthorizedStatement,\n type WalletAuthorizationProvider,\n} from \"@invisi-labs/core\";\nimport { normalizeFunding, type TransactionCall } from \"@invisi-labs/protocol\";\nimport type { Prover, ProverOptions, ProofBundle } from \"@invisi-labs/prover\";\nimport type {\n FundingSigner,\n OperationPlan,\n OperationRuntime,\n OperationAggregateMember,\n SavedOperation,\n} from \"./session/operation-types\";\nimport type { OperationStatus } from \"./session/state\";\nimport {\n encodeOperation,\n publicProof,\n requiresAuthorization,\n statement,\n} from \"./session/operation-protocol\";\nimport { sameStatement } from \"./session/proof-integrity\";\nimport { operationPreview } from \"./session/operation-preview\";\nfunction check(ok: unknown, message: string): asserts ok {\n if (!ok) throw new Error(message);\n}\n\ntype Runtime = Omit<OperationRuntime, \"store\">;\ntype Lifecycle = { generation: number; busy: boolean };\n/** An immutable, local transaction handle. No wallet inventory, reservations or persistence. */\nexport class PreparedTransaction {\n readonly #runtime: Runtime;\n readonly #saved: SavedOperation;\n readonly #authorization: AuthorizedStatement | undefined;\n readonly #lifecycle: Lifecycle;\n readonly status: OperationStatus;\n private constructor(\n runtime: Runtime,\n saved: SavedOperation,\n status: OperationStatus,\n lifecycle: Lifecycle,\n authorization?: AuthorizedStatement\n ) {\n this.#runtime = runtime;\n this.#saved = structuredClone(saved);\n this.#lifecycle = lifecycle;\n this.#authorization = authorization;\n this.status = status;\n Object.freeze(this);\n }\n static prepare(runtime: Runtime, plan: OperationPlan): PreparedTransaction {\n return new PreparedTransaction(\n runtime,\n { plan: structuredClone(plan), generation: 0 },\n \"prepared\",\n { generation: 0, busy: false }\n );\n }\n get id() {\n return this.#saved.plan.id;\n }\n get kind() {\n return this.#saved.plan.kind;\n }\n estimateGas() {\n return estimateGasReference(\n this.#saved.plan,\n this.#runtime.options.protocol,\n this.#runtime.options.gasBenchmarks\n );\n }\n preview() {\n return operationPreview(this.#saved.plan, this.status);\n }\n private current() {\n check(\n !this.#lifecycle.busy && this.#lifecycle.generation === this.#saved.generation,\n \"stale transaction handle or active worker\"\n );\n }\n private async stage(\n stage: string,\n allowed: OperationStatus[],\n work: (\n saved: SavedOperation\n ) => Promise<{ status: OperationStatus; authorization?: AuthorizedStatement }>,\n signal?: AbortSignal\n ): Promise<PreparedTransaction> {\n signal?.throwIfAborted();\n this.current();\n check(allowed.includes(this.status), `invalid transaction stage for ${stage}`);\n this.#lifecycle.busy = true;\n const saved = structuredClone(this.#saved);\n try {\n const next = await work(saved);\n signal?.throwIfAborted();\n saved.generation++;\n this.#lifecycle.generation = saved.generation;\n return new PreparedTransaction(\n this.#runtime,\n saved,\n next.status,\n this.#lifecycle,\n next.authorization ?? this.#authorization\n );\n } finally {\n this.#lifecycle.busy = false;\n }\n }\n async authorize(options?: { signal?: AbortSignal }): Promise<PreparedTransaction>;\n async authorize(\n provider: WalletAuthorizationProvider,\n options?: { signal?: AbortSignal }\n ): Promise<PreparedTransaction>;\n async authorize(\n providerOrOptions: WalletAuthorizationProvider | { signal?: AbortSignal } = {},\n suppliedOptions: { signal?: AbortSignal } = {}\n ): Promise<PreparedTransaction> {\n const options = \"authorize\" in providerOrOptions ? suppliedOptions : providerOrOptions;\n const provider =\n \"authorize\" in providerOrOptions ? providerOrOptions : this.#runtime.authorization();\n check(\n requiresAuthorization(this.#saved.plan),\n \"operation does not require wallet authorization\"\n );\n const selectedProvider = provider;\n check(\n provider.walletIdentity === this.#runtime.scope.walletIdentity,\n \"wallet authorization capability mismatch\"\n );\n return this.stage(\n \"wallet authorization\",\n [\"prepared\", \"authorized\"],\n async (saved) => {\n const authorization = await authorizeOperation(saved.plan, selectedProvider);\n return { status: \"authorized\", authorization };\n },\n options.signal\n );\n }\n\n async prove(options?: ProverOptions): Promise<PreparedTransaction>;\n async prove(backend: Prover, options?: ProverOptions): Promise<PreparedTransaction>;\n async prove(\n backendOrOptions: Prover | ProverOptions = {},\n suppliedOptions: ProverOptions = {}\n ): Promise<PreparedTransaction> {\n const options = \"prove\" in backendOrOptions ? suppliedOptions : backendOrOptions;\n const plan = this.#saved.plan;\n check(plan.kind !== \"shield\", \"shield requires no proof\");\n if (requiresAuthorization(plan)) {\n check(\n this.#authorization,\n \"local wallet authorization required; authorize again after recovery\"\n );\n }\n const prover =\n \"prove\" in backendOrOptions ? backendOrOptions : this.#runtime.options.prover;\n if (!prover) {\n throw new MissingCapabilityError(\"prover\");\n }\n return this.stage(\n \"proof\",\n requiresAuthorization(plan) ? [\"authorized\"] : [\"prepared\"],\n async (saved) => {\n const p = saved.plan;\n saved.proof = await proveOperation(\n this.#runtime.options.protocol,\n p,\n this.#authorization,\n prover,\n options\n );\n if (p.fundingMode === \"signature\") {\n return { status: \"proved\" };\n }\n if (p.statement?.target !== \"noir-recursive\") {\n saved.call = await this.encode(saved);\n }\n return { status: \"ready\" };\n },\n options.signal\n );\n }\n\n private encode(saved: SavedOperation): Promise<TransactionCall> {\n return encodeOperation(saved);\n }\n\n async authorizeFunding(options?: { signal?: AbortSignal }): Promise<PreparedTransaction>;\n async authorizeFunding(\n signer: FundingSigner,\n options?: { signal?: AbortSignal }\n ): Promise<PreparedTransaction>;\n async authorizeFunding(\n signerOrOptions: FundingSigner | { signal?: AbortSignal } = {},\n suppliedOptions: { signal?: AbortSignal } = {}\n ): Promise<PreparedTransaction> {\n const options = \"signTypedData\" in signerOrOptions ? suppliedOptions : signerOrOptions;\n const suppliedSigner = \"signTypedData\" in signerOrOptions ? signerOrOptions : undefined;\n const p = this.#saved.plan;\n check(p.fundingMode === \"signature\", \"operation does not require a funding signature\");\n check(p.kind === \"shield\" || this.#saved.proof, \"proof must precede funding authorization\");\n const signer = suppliedSigner ?? this.#runtime.options.fundingSigner;\n if (!signer) {\n throw new MissingCapabilityError(\"EVM funding signer\");\n }\n check(\n signer.address.toLowerCase() === p.funding.payer!.toLowerCase(),\n \"funding signer is not the payer\"\n );\n return this.stage(\n \"funding authorization\",\n p.kind === \"shield\" ? [\"prepared\"] : [\"proved\"],\n async (saved) => {\n saved.plan.funding.signature = await signOperationFunding(\n saved,\n signer,\n this.#runtime.options.fundingVerifier\n );\n if (saved.plan.statement?.target !== \"noir-recursive\") {\n saved.call = await this.encode(saved);\n }\n return { status: \"ready\" };\n },\n options.signal\n );\n }\n\n /** Shield caller funding needs no wallet signing or proof; this step only encodes its frozen request. */\n async ready(): Promise<PreparedTransaction> {\n check(\n this.kind === \"shield\" && this.#saved.plan.fundingMode === \"caller\",\n \"operation needs authorization or proof first\"\n );\n return this.stage(\"encoding\", [\"prepared\"], async (saved) => {\n saved.call = await this.encode(saved);\n return { status: \"ready\" };\n });\n }\n\n async exportTransaction(): Promise<TransactionCall> {\n this.current();\n check(\n this.#saved.plan.statement?.target !== \"noir-recursive\",\n \"recursive operations must be exported as aggregate members\"\n );\n check(this.status === \"ready\" && this.#saved.call, \"transaction is not ready\");\n return structuredClone(this.#saved.call);\n }\n exportProof(): ProofBundle {\n this.current();\n check(this.#saved.proof, \"transaction has no proof\");\n return publicProof(this.#saved.proof);\n }\n exportAggregateMember(): OperationAggregateMember {\n this.current();\n const saved = this.#saved,\n plan = saved.plan;\n check(\n this.status === \"ready\" &&\n plan.params &&\n saved.proof &&\n plan.statement?.target === \"noir-recursive\" &&\n plan.statement.circuitName === \"transact_user_slots14\",\n \"ready recursive slots14 transaction required\"\n );\n sameStatement(saved.proof, statement(plan));\n check(\n saved.proof.proofHex.length === 2 + 458 * 64,\n \"recursive member proof must have 458 fields\"\n );\n return {\n bundle: publicProof(saved.proof),\n statement: structuredClone(plan.statement),\n context: { ...plan.context },\n request: {\n params: structuredClone(plan.params),\n deliveries: plan.outputs.map((output) => structuredClone(output.delivery)),\n funding: normalizeFunding(plan.funding),\n },\n };\n }\n toJSON() {\n return { transaction: true, id: this.id, kind: this.kind, status: this.status };\n }\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import { copyGasBenchmarks } from \"./gas-estimation\";\nimport { explicitPreparation } from \"./explicit-preparation\";\nimport type { PreparedTransaction } from \"./PreparedTransaction\";\nimport type {\n ExplicitTransferPreparation,\n ExplicitWithdrawalPreparation,\n ExplicitSweepPreparation,\n ExplicitShieldPreparation,\n ExplicitCreateCreditPreparation,\n ExplicitDrawCreditPreparation,\n ExplicitTopUpCreditPreparation,\n ExplicitCancelCreditPreparation,\n} from \"./explicit-types\";\nimport { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport type { Provider, Signer } from \"ethers\";\nimport {\n EthersChainReader,\n EthersFundingSigner,\n EthersFundingVerifier,\n EthersAddressResolver,\n} from \"./integrations/ethers\";\nimport { MissingCapabilityError } from \"@invisi-labs/core\";\nimport { Protocol, type ChainReader } from \"@invisi-labs/protocol\";\nimport { WalletSession, type WalletSessionOptions } from \"./session\";\n\n/** Compose independent Chain RPC and indexed Protocol RPC with local wallet capabilities. */\nexport type InvisiOptions = Omit<\n WalletSessionOptions,\n \"wallet\" | \"protocol\" | \"namespace\" | \"viewing\" | \"authorization\" | \"chainReader\"\n> & {\n provider?: Provider;\n signer?: Signer;\n chainReader?: ChainReader;\n};\n\n/** Wallet identity and session permissions; shared infrastructure belongs to InvisiOptions. */\nexport type ConnectionOptions = Pick<\n WalletSessionOptions,\n \"wallet\" | \"protocol\" | \"namespace\" | \"viewing\" | \"authorization\"\n>;\n\n/** A neutral composition entry point; every resolved instance owns an independent session. */\nexport class Invisi {\n readonly #options: InvisiOptions;\n\n constructor(options: InvisiOptions = {}) {\n this.#options = {\n ...options,\n ...(options.gasBenchmarks\n ? { gasBenchmarks: copyGasBenchmarks(options.gasBenchmarks) }\n : {}),\n };\n Object.freeze(this);\n }\n\n async connect(options: ConnectionOptions): Promise<WalletSession> {\n return new WalletSession(await this.resolve(options));\n }\n private async resolve(options: ConnectionOptions): Promise<WalletSessionOptions> {\n // Snapshot session permissions before the first network request.\n const allowed = [\"wallet\", \"protocol\", \"namespace\", \"viewing\", \"authorization\"];\n for (const key of Object.keys(options)) {\n if (!allowed.includes(key))\n throw new Error(\n `Unknown connection option: ${key}; configure infrastructure on Invisi`\n );\n }\n const selected = { ...options };\n const combined = { ...this.#options, ...selected };\n const { provider, signer, ...runtime } = combined;\n const reader =\n combined.chainReader ?? (provider ? new EthersChainReader(provider) : undefined);\n if (!reader) throw new MissingCapabilityError(\"chain reader\");\n if (provider && (await provider.getNetwork()).chainId !== selected.protocol.context.chainId)\n throw new Error(\"provider deployment chain mismatch\");\n await selected.protocol.validateDeployment(reader);\n if (runtime.protocolRpc instanceof ProtocolRpcClient) {\n runtime.protocolRpc = runtime.protocolRpc.withReader(reader);\n }\n if (signer) {\n if (!provider) throw new MissingCapabilityError(\"provider for signer\");\n if (!signer.provider) throw new Error(\"signer must be connected to a provider\");\n if ((await signer.provider.getNetwork()).chainId !== selected.protocol.context.chainId)\n throw new Error(\"signer-provider deployment chain mismatch\");\n }\n const registry = selected.protocol.deployment.registry;\n const fundingSigner =\n combined.fundingSigner ??\n (signer\n ? await EthersFundingSigner.create(signer, selected.protocol.context.chainId)\n : undefined);\n const fundingVerifier =\n combined.fundingVerifier ??\n (provider\n ? new EthersFundingVerifier(provider, selected.protocol.context.chainId)\n : undefined);\n const addressResolver =\n combined.addressResolver ??\n (provider && registry\n ? new EthersAddressResolver(\n provider,\n {\n chainId: selected.protocol.context.chainId,\n registryAddress: registry.address,\n },\n registry.runtimeCodeHash\n ).lookup\n : undefined);\n return {\n ...runtime,\n chainReader: reader,\n ...(signer ? { signer } : {}),\n ...(fundingSigner ? { fundingSigner } : {}),\n ...(fundingVerifier ? { fundingVerifier } : {}),\n ...(addressResolver ? { addressResolver } : {}),\n protocol: selected.protocol,\n };\n }\n\n async prepareTransfer(options: ExplicitTransferPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareTransfer(request);\n }\n async prepareWithdraw(options: ExplicitWithdrawalPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareWithdraw(request);\n }\n async prepareSweep(options: ExplicitSweepPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareSweep(request);\n }\n async prepareShield(options: ExplicitShieldPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, {}, request.tokenAddress);\n return preparation.prepareShield(request);\n }\n async prepareCreateCredit(\n options: ExplicitCreateCreditPreparation\n ): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareCreateCredit(request);\n }\n async prepareDrawCredit(options: ExplicitDrawCreditPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareDrawCredit(request);\n }\n async prepareTopUpCredit(\n options: ExplicitTopUpCreditPreparation\n ): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareTopUpCredit(request);\n }\n async prepareCancelCredit(\n options: ExplicitCancelCreditPreparation\n ): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareCancelCredit(request);\n }\n\n toJSON() {\n return { invisi: true };\n }\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","export { Invisi } from \"./Invisi\";\nexport type { InvisiOptions, ConnectionOptions } from \"./Invisi\";\nexport {\n Wallet,\n ViewingCapability,\n Detector,\n NullifierCapability,\n WalletAuthorization,\n MissingCapabilityError,\n Disclosure,\n} from \"@invisi-labs/core\";\nexport type {\n Address,\n Hex,\n Note,\n CreditNote,\n CreditDeliveryState,\n ReceivingKeys,\n WalletAuthorizationProvider,\n CreditOpening,\n DisclosureOutput,\n DisclosureExport,\n DisclosureResult,\n} from \"@invisi-labs/core\";\nexport { Protocol, RegistrationOperation } from \"@invisi-labs/protocol\";\nexport type {\n ChainReader,\n ProtocolDataProvider,\n ProtocolDataStatus,\n ProtocolUpdates,\n ProtocolUpdateRange,\n TransactionCall,\n CanonicalBlock,\n CanonicalReceipt,\n Membership,\n RegistryReader,\n ProtocolOptions,\n TokenProtocol,\n TokenProtocolOptions,\n FactoryReader,\n AddressRegistryOptions,\n RegistryContext,\n TransactionContext,\n} from \"@invisi-labs/protocol\";\nexport { WalletSession, Operation, walletBalance, DisclosureVerifier } from \"./session\";\nexport type {\n RefreshOptions,\n RefreshResult,\n WalletStore,\n WalletScope,\n WalletState,\n BalanceSnapshot,\n WalletSessionOptions,\n TransferPreparation,\n WithdrawalPreparation,\n SweepPreparation,\n ShieldPreparation,\n CreateCreditPreparation,\n DrawCreditPreparation,\n TopUpCreditPreparation,\n CancelCreditPreparation,\n FundingSigner,\n FundingAuthorizationVerifier,\n FundingTypedData,\n FundingSource,\n CoinSelector,\n OperationStatus,\n OperationAggregateMember,\n DisclosureReference,\n DisclosureReader,\n DisclosureVerifierOptions,\n DisclosureEvidence,\n VerifiedDisclosure,\n} from \"./session\";\nexport type {\n Prover,\n ProverOptions,\n ProofBundle,\n ProofStatement,\n AggregatorCapability,\n AggregateMember,\n} from \"@invisi-labs/prover\";\n\nexport { ProtocolRpcError } from \"@invisi-labs/rpc\";\nexport type { ProtocolDeployment } from \"@invisi-labs/rpc\";\nexport { ProtocolRpcClient } from \"./ProtocolRpcClient\";\nexport { AddressRegistry } from \"./AddressRegistry\";\nexport type {\n ProtocolRpcClientOptions,\n ProtocolRpcReader,\n ProtocolRpcConnectionOptions,\n ProtocolRpcChain,\n} from \"@invisi-labs/rpc\";\n\nexport { EncryptedWalletCodec } from \"./integrations/encrypted-codec\";\n\nexport { PreparedTransaction } from \"./PreparedTransaction\";\nexport type {\n NoteInput,\n CreditInput,\n TransactionIdentity,\n ExplicitTransferPreparation,\n ExplicitWithdrawalPreparation,\n ExplicitSweepPreparation,\n ExplicitShieldPreparation,\n ExplicitCreateCreditPreparation,\n ExplicitDrawCreditPreparation,\n ExplicitTopUpCreditPreparation,\n ExplicitCancelCreditPreparation,\n} from \"./explicit-types\";\n\nexport type { SessionTransactionOptions } from \"./session/WalletSession\";\n\nexport type {\n GasBenchmarkProfile,\n GasBenchmarkShape,\n GasBenchmarkDeployment,\n GasBenchmarkCircuit,\n GasBenchmarkSample,\n GasReference,\n} from \"./gas-estimation\";\n\nexport { defineGasBenchmarks } from \"./gas-estimation\";\n","import type { Provider } from \"ethers\";\nimport { ProtocolRpcClient as RpcClient } from \"@invisi-labs/rpc\";\nimport { EthersChainReader } from \"./integrations/ethers\";\n\n/** Protocol RPC transport with ethers provider integration for independent chain checks. */\nexport class ProtocolRpcClient extends RpcClient {\n withProvider(provider: Provider): RpcClient {\n return this.withReader(new EthersChainReader(provider));\n }\n}\n","import type { Provider } from \"ethers\";\nimport { AddressRegistry as Registry, type RegistrationPreparation } from \"@invisi-labs/protocol\";\nimport { EthersChainReader } from \"./integrations/ethers\";\n\n/** Registry operations accept the application's existing ethers provider. */\nexport class AddressRegistry extends Registry {\n override prepareRegistration(\n options:\n | RegistrationPreparation\n | (Omit<RegistrationPreparation, \"reader\"> & { provider: Provider })\n ) {\n if (\"provider\" in options) {\n const { provider, ...preparation } = options;\n return super.prepareRegistration({\n ...preparation,\n reader: new EthersChainReader(provider),\n });\n }\n return super.prepareRegistration(options);\n }\n}\n","import {\n serializeState,\n deserializeState,\n type WalletState,\n type WalletRecordCodec,\n} from \"../session\";\n/** Caller-owned, nonextractable AES-GCM key. The SDK does not persist the key. */\nexport class EncryptedWalletCodec implements WalletRecordCodec {\n readonly #key: CryptoKey;\n private constructor(key: CryptoKey) {\n this.#key = key;\n }\n static fromKey(key: CryptoKey): EncryptedWalletCodec {\n if (\n key.type !== \"secret\" ||\n key.algorithm.name !== \"AES-GCM\" ||\n (key.algorithm as AesKeyAlgorithm).length !== 256 ||\n !key.usages.includes(\"encrypt\") ||\n !key.usages.includes(\"decrypt\")\n )\n throw new Error(\"wallet record key must support AES-256-GCM encryption and decryption\");\n return new EncryptedWalletCodec(key);\n }\n static async fromBytes(key: Uint8Array): Promise<EncryptedWalletCodec> {\n if (key.length !== 32) throw new Error(\"wallet record encryption requires 32 key bytes\");\n const copy = Uint8Array.from(key);\n try {\n return EncryptedWalletCodec.fromKey(\n await crypto.subtle.importKey(\"raw\", copy, { name: \"AES-GCM\" }, false, [\n \"encrypt\",\n \"decrypt\",\n ])\n );\n } finally {\n copy.fill(0);\n }\n }\n private aad(context: { key: string; revision: number }): Uint8Array<ArrayBuffer> {\n if (!Number.isSafeInteger(context.revision) || context.revision < 1)\n throw new Error(\"invalid encrypted record revision\");\n return new TextEncoder().encode(\n `Invisi.WalletRecord.v1\\0${context.revision}\\0${context.key}`\n );\n }\n async encode(\n state: WalletState,\n context: { key: string; revision: number }\n ): Promise<Uint8Array> {\n const iv = crypto.getRandomValues(new Uint8Array(12)),\n plain = Uint8Array.from(serializeState(state));\n try {\n const encrypted = new Uint8Array(\n await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv, additionalData: this.aad(context) },\n this.#key,\n plain\n )\n );\n const out = new Uint8Array(13 + encrypted.length);\n out[0] = 1;\n out.set(iv, 1);\n out.set(encrypted, 13);\n return out;\n } finally {\n plain.fill(0);\n }\n }\n async decode(\n data: Uint8Array,\n context: { key: string; revision: number }\n ): Promise<WalletState> {\n if (data.length < 29 || data[0] !== 1)\n throw new Error(\"wallet record authentication failed\");\n let plain: Uint8Array;\n try {\n plain = new Uint8Array(\n await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: Uint8Array.from(data.subarray(1, 13)),\n additionalData: this.aad(context),\n },\n this.#key,\n Uint8Array.from(data.subarray(13))\n )\n );\n } catch {\n throw new Error(\"wallet record authentication failed\");\n }\n try {\n return deserializeState(plain);\n } finally {\n plain.fill(0);\n }\n }\n toJSON() {\n return { walletRecordCodec: \"AES-256-GCM\" };\n }\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n"],"mappings":"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","names":["MissingCapabilityError","MissingCapabilityError","MissingCapabilityError","ProtocolRpcClient"]}
1
+ {"version":3,"sources":["../src/explicit-preparation.ts","../src/PreparedTransaction.ts","../src/Invisi.ts","../src/index.ts","../src/ProtocolRpcClient.ts","../src/AddressRegistry.ts","../src/integrations/encrypted-codec.ts"],"sourcesContent":["import { getAddress } from \"ethers\";\nimport type { CreditInput, NoteInput } from \"./explicit-types\";\nimport { PreparedTransaction } from \"./PreparedTransaction\";\nimport { positiveAmount } from \"./session/prepare-common\";\nimport { TransactionPreparation } from \"./session/transaction-preparation\";\nimport type { PreparationInventory, WalletSessionOptions } from \"./session/operation-types\";\n\n/** Only explicitly supplied records participate. No store or automatic coin selection. */\nexport function explicitPreparation(\n options: WalletSessionOptions,\n data: {\n inputs?: readonly NoteInput[];\n creditInputs?: readonly CreditInput[];\n changeAddress?: string;\n },\n tokenAddress: `0x${string}`\n) {\n if (!options.chainReader) throw new Error(\"chain reader required\");\n const inputs = structuredClone(data.inputs ?? []);\n const credits = structuredClone(data.creditInputs ?? []);\n const inventory: PreparationInventory = { notes: {}, credits: {}, reservations: {} };\n const context = options.protocol.context;\n function position(input: NoteInput | CreditInput) {\n if (\n typeof input.treeId !== \"bigint\" ||\n input.treeId < 0n ||\n input.treeId >= 1n << 256n ||\n !Number.isInteger(input.leafIndex) ||\n input.leafIndex < 0 ||\n input.leafIndex >= 65536\n )\n throw new Error(\"invalid explicit input position\");\n }\n for (const input of inputs) {\n position(input);\n positiveAmount(input.note.amount);\n if (inventory.notes[input.commitment]) throw new Error(\"duplicate explicit note input\");\n if (\n input.note.chainId !== context.chainId ||\n input.note.protocolAddress !== BigInt(context.protocolAddress) ||\n input.note.walletIdentity !== options.wallet.walletIdentity\n )\n throw new Error(\"explicit note identity or deployment mismatch\");\n inventory.notes[input.commitment] = { ...input, spent: \"unspent\" };\n }\n for (const input of credits) {\n position(input);\n if (input.role !== \"owner\" && input.role !== \"spender\")\n throw new Error(\"invalid explicit Credit role\");\n const key = input.commitment + \":\" + input.role;\n if (inventory.credits[key]) throw new Error(\"duplicate explicit Credit input\");\n inventory.credits[key] = { ...input, spent: \"unspent\" };\n }\n const scope = {\n ...context,\n namespace: \"explicit\",\n walletIdentity: options.wallet.walletIdentity,\n };\n const { store: _store, coinSelector: _selector, ...capabilities } = options;\n\n if (inputs.some((input) => input.note.tokenAddress !== BigInt(getAddress(tokenAddress))))\n throw new Error(\"explicit note token mismatch\");\n const runtime = {\n options: { ...capabilities, protocol: options.protocol.forToken(tokenAddress) },\n reader: options.chainReader!,\n scope,\n authorization: () => options.authorization ?? options.wallet.exportAuthorization(),\n };\n return new TransactionPreparation<PreparedTransaction>({\n ...runtime,\n explicitInputs: true,\n ...(data.changeAddress ? { changeAddress: data.changeAddress } : {}),\n readInventory: async () => structuredClone(inventory),\n complete: async (plan) => PreparedTransaction.prepare(runtime, plan),\n });\n}\n","import { estimateGasReference } from \"./gas-estimation\";\nimport {\n authorizeOperation,\n proveOperation,\n signOperationFunding,\n} from \"./session/operation-execution\";\nimport {\n MissingCapabilityError,\n type AuthorizedStatement,\n type WalletAuthorizationProvider,\n} from \"@invisi-labs/core\";\nimport { normalizeFunding, type TransactionCall } from \"@invisi-labs/protocol\";\nimport type { Prover, ProverOptions, ProofBundle } from \"@invisi-labs/prover\";\nimport type {\n FundingSigner,\n OperationPlan,\n OperationRuntime,\n OperationAggregateMember,\n SavedOperation,\n} from \"./session/operation-types\";\nimport type { OperationStatus } from \"./session/state\";\nimport {\n encodeOperation,\n publicProof,\n requiresAuthorization,\n statement,\n} from \"./session/operation-protocol\";\nimport { sameStatement } from \"./session/proof-integrity\";\nimport { operationPreview } from \"./session/operation-preview\";\nfunction check(ok: unknown, message: string): asserts ok {\n if (!ok) throw new Error(message);\n}\n\ntype Runtime = Omit<OperationRuntime, \"store\">;\ntype Lifecycle = { generation: number; busy: boolean };\n/** An immutable, local transaction handle. No wallet inventory, reservations or persistence. */\nexport class PreparedTransaction {\n readonly #runtime: Runtime;\n readonly #saved: SavedOperation;\n readonly #authorization: AuthorizedStatement | undefined;\n readonly #lifecycle: Lifecycle;\n readonly status: OperationStatus;\n private constructor(\n runtime: Runtime,\n saved: SavedOperation,\n status: OperationStatus,\n lifecycle: Lifecycle,\n authorization?: AuthorizedStatement\n ) {\n this.#runtime = runtime;\n this.#saved = structuredClone(saved);\n this.#lifecycle = lifecycle;\n this.#authorization = authorization;\n this.status = status;\n Object.freeze(this);\n }\n static prepare(runtime: Runtime, plan: OperationPlan): PreparedTransaction {\n return new PreparedTransaction(\n runtime,\n { plan: structuredClone(plan), generation: 0 },\n \"prepared\",\n { generation: 0, busy: false }\n );\n }\n get id() {\n return this.#saved.plan.id;\n }\n get kind() {\n return this.#saved.plan.kind;\n }\n estimateGas() {\n return estimateGasReference(\n this.#saved.plan,\n this.#runtime.options.protocol,\n this.#runtime.options.gasBenchmarks\n );\n }\n preview() {\n return operationPreview(this.#saved.plan, this.status);\n }\n private current() {\n check(\n !this.#lifecycle.busy && this.#lifecycle.generation === this.#saved.generation,\n \"stale transaction handle or active worker\"\n );\n }\n private async stage(\n stage: string,\n allowed: OperationStatus[],\n work: (\n saved: SavedOperation\n ) => Promise<{ status: OperationStatus; authorization?: AuthorizedStatement }>,\n signal?: AbortSignal\n ): Promise<PreparedTransaction> {\n signal?.throwIfAborted();\n this.current();\n check(allowed.includes(this.status), `invalid transaction stage for ${stage}`);\n this.#lifecycle.busy = true;\n const saved = structuredClone(this.#saved);\n try {\n const next = await work(saved);\n signal?.throwIfAborted();\n saved.generation++;\n this.#lifecycle.generation = saved.generation;\n return new PreparedTransaction(\n this.#runtime,\n saved,\n next.status,\n this.#lifecycle,\n next.authorization ?? this.#authorization\n );\n } finally {\n this.#lifecycle.busy = false;\n }\n }\n async authorize(options?: { signal?: AbortSignal }): Promise<PreparedTransaction>;\n async authorize(\n provider: WalletAuthorizationProvider,\n options?: { signal?: AbortSignal }\n ): Promise<PreparedTransaction>;\n async authorize(\n providerOrOptions: WalletAuthorizationProvider | { signal?: AbortSignal } = {},\n suppliedOptions: { signal?: AbortSignal } = {}\n ): Promise<PreparedTransaction> {\n const options = \"authorize\" in providerOrOptions ? suppliedOptions : providerOrOptions;\n const provider =\n \"authorize\" in providerOrOptions ? providerOrOptions : this.#runtime.authorization();\n check(\n requiresAuthorization(this.#saved.plan),\n \"operation does not require wallet authorization\"\n );\n const selectedProvider = provider;\n check(\n provider.walletIdentity === this.#runtime.scope.walletIdentity,\n \"wallet authorization capability mismatch\"\n );\n return this.stage(\n \"wallet authorization\",\n [\"prepared\", \"authorized\"],\n async (saved) => {\n const authorization = await authorizeOperation(saved.plan, selectedProvider);\n return { status: \"authorized\", authorization };\n },\n options.signal\n );\n }\n\n async prove(options?: ProverOptions): Promise<PreparedTransaction>;\n async prove(backend: Prover, options?: ProverOptions): Promise<PreparedTransaction>;\n async prove(\n backendOrOptions: Prover | ProverOptions = {},\n suppliedOptions: ProverOptions = {}\n ): Promise<PreparedTransaction> {\n const options = \"prove\" in backendOrOptions ? suppliedOptions : backendOrOptions;\n const plan = this.#saved.plan;\n check(plan.kind !== \"shield\", \"shield requires no proof\");\n if (requiresAuthorization(plan)) {\n check(\n this.#authorization,\n \"local wallet authorization required; authorize again after recovery\"\n );\n }\n const prover =\n \"prove\" in backendOrOptions ? backendOrOptions : this.#runtime.options.prover;\n if (!prover) {\n throw new MissingCapabilityError(\"prover\");\n }\n return this.stage(\n \"proof\",\n requiresAuthorization(plan) ? [\"authorized\"] : [\"prepared\"],\n async (saved) => {\n const p = saved.plan;\n saved.proof = await proveOperation(\n this.#runtime.options.protocol,\n p,\n this.#authorization,\n prover,\n options\n );\n if (p.fundingMode === \"signature\") {\n return { status: \"proved\" };\n }\n if (p.statement?.target !== \"noir-recursive\") {\n saved.call = await this.encode(saved);\n }\n return { status: \"ready\" };\n },\n options.signal\n );\n }\n\n private encode(saved: SavedOperation): Promise<TransactionCall> {\n return encodeOperation(saved);\n }\n\n async authorizeFunding(options?: { signal?: AbortSignal }): Promise<PreparedTransaction>;\n async authorizeFunding(\n signer: FundingSigner,\n options?: { signal?: AbortSignal }\n ): Promise<PreparedTransaction>;\n async authorizeFunding(\n signerOrOptions: FundingSigner | { signal?: AbortSignal } = {},\n suppliedOptions: { signal?: AbortSignal } = {}\n ): Promise<PreparedTransaction> {\n const options = \"signTypedData\" in signerOrOptions ? suppliedOptions : signerOrOptions;\n const suppliedSigner = \"signTypedData\" in signerOrOptions ? signerOrOptions : undefined;\n const p = this.#saved.plan;\n check(p.fundingMode === \"signature\", \"operation does not require a funding signature\");\n check(p.kind === \"shield\" || this.#saved.proof, \"proof must precede funding authorization\");\n const signer = suppliedSigner ?? this.#runtime.options.fundingSigner;\n if (!signer) {\n throw new MissingCapabilityError(\"EVM funding signer\");\n }\n check(\n signer.address.toLowerCase() === p.funding.payer!.toLowerCase(),\n \"funding signer is not the payer\"\n );\n return this.stage(\n \"funding authorization\",\n p.kind === \"shield\" ? [\"prepared\"] : [\"proved\"],\n async (saved) => {\n saved.plan.funding.signature = await signOperationFunding(\n saved,\n signer,\n this.#runtime.options.fundingVerifier\n );\n if (saved.plan.statement?.target !== \"noir-recursive\") {\n saved.call = await this.encode(saved);\n }\n return { status: \"ready\" };\n },\n options.signal\n );\n }\n\n /** Shield caller funding needs no wallet signing or proof; this step only encodes its frozen request. */\n async ready(): Promise<PreparedTransaction> {\n check(\n this.kind === \"shield\" && this.#saved.plan.fundingMode === \"caller\",\n \"operation needs authorization or proof first\"\n );\n return this.stage(\"encoding\", [\"prepared\"], async (saved) => {\n saved.call = await this.encode(saved);\n return { status: \"ready\" };\n });\n }\n\n async exportTransaction(): Promise<TransactionCall> {\n this.current();\n check(\n this.#saved.plan.statement?.target !== \"noir-recursive\",\n \"recursive operations must be exported as aggregate members\"\n );\n check(this.status === \"ready\" && this.#saved.call, \"transaction is not ready\");\n return structuredClone(this.#saved.call);\n }\n exportProof(): ProofBundle {\n this.current();\n check(this.#saved.proof, \"transaction has no proof\");\n return publicProof(this.#saved.proof);\n }\n exportAggregateMember(): OperationAggregateMember {\n this.current();\n const saved = this.#saved,\n plan = saved.plan;\n check(\n this.status === \"ready\" &&\n plan.params &&\n saved.proof &&\n plan.statement?.target === \"noir-recursive\" &&\n plan.statement.circuitName === \"transact_user_slots14\",\n \"ready recursive slots14 transaction required\"\n );\n sameStatement(saved.proof, statement(plan));\n check(\n saved.proof.proofHex.length === 2 + 458 * 64,\n \"recursive member proof must have 458 fields\"\n );\n return {\n bundle: publicProof(saved.proof),\n statement: structuredClone(plan.statement),\n context: { ...plan.context },\n request: {\n params: structuredClone(plan.params),\n deliveries: plan.outputs.map((output) => structuredClone(output.delivery)),\n funding: normalizeFunding(plan.funding),\n },\n };\n }\n toJSON() {\n return { transaction: true, id: this.id, kind: this.kind, status: this.status };\n }\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","import { copyGasBenchmarks } from \"./gas-estimation\";\nimport { explicitPreparation } from \"./explicit-preparation\";\nimport type { PreparedTransaction } from \"./PreparedTransaction\";\nimport type {\n ExplicitTransferPreparation,\n ExplicitWithdrawalPreparation,\n ExplicitSweepPreparation,\n ExplicitShieldPreparation,\n ExplicitCreateCreditPreparation,\n ExplicitDrawCreditPreparation,\n ExplicitTopUpCreditPreparation,\n ExplicitCancelCreditPreparation,\n} from \"./explicit-types\";\nimport { ProtocolRpcClient } from \"@invisi-labs/rpc\";\nimport type { Provider, Signer } from \"ethers\";\nimport {\n EthersChainReader,\n EthersFundingSigner,\n EthersFundingVerifier,\n EthersAddressResolver,\n} from \"./integrations/ethers\";\nimport { MissingCapabilityError } from \"@invisi-labs/core\";\nimport { Protocol, type ChainReader } from \"@invisi-labs/protocol\";\nimport { WalletSession, type WalletSessionOptions } from \"./session\";\n\n/** Compose independent Chain RPC and indexed Protocol RPC with local wallet capabilities. */\nexport type InvisiOptions = Omit<\n WalletSessionOptions,\n \"wallet\" | \"protocol\" | \"namespace\" | \"viewing\" | \"authorization\" | \"chainReader\"\n> & {\n provider?: Provider;\n signer?: Signer;\n chainReader?: ChainReader;\n};\n\n/** Wallet identity and session permissions; shared infrastructure belongs to InvisiOptions. */\nexport type ConnectionOptions = Pick<\n WalletSessionOptions,\n \"wallet\" | \"protocol\" | \"namespace\" | \"viewing\" | \"authorization\"\n>;\n\n/** A neutral composition entry point; every resolved instance owns an independent session. */\nexport class Invisi {\n readonly #options: InvisiOptions;\n\n constructor(options: InvisiOptions = {}) {\n this.#options = {\n ...options,\n ...(options.gasBenchmarks\n ? { gasBenchmarks: copyGasBenchmarks(options.gasBenchmarks) }\n : {}),\n };\n Object.freeze(this);\n }\n\n async connect(options: ConnectionOptions): Promise<WalletSession> {\n return new WalletSession(await this.resolve(options));\n }\n private async resolve(options: ConnectionOptions): Promise<WalletSessionOptions> {\n // Snapshot session permissions before the first network request.\n const allowed = [\"wallet\", \"protocol\", \"namespace\", \"viewing\", \"authorization\"];\n for (const key of Object.keys(options)) {\n if (!allowed.includes(key))\n throw new Error(\n `Unknown connection option: ${key}; configure infrastructure on Invisi`\n );\n }\n const selected = { ...options };\n const combined = { ...this.#options, ...selected };\n const { provider, signer, ...runtime } = combined;\n const reader =\n combined.chainReader ?? (provider ? new EthersChainReader(provider) : undefined);\n if (!reader) throw new MissingCapabilityError(\"chain reader\");\n if (provider && (await provider.getNetwork()).chainId !== selected.protocol.context.chainId)\n throw new Error(\"provider deployment chain mismatch\");\n await selected.protocol.validateDeployment(reader);\n if (runtime.protocolRpc instanceof ProtocolRpcClient) {\n runtime.protocolRpc = runtime.protocolRpc.withReader(reader);\n }\n if (signer) {\n if (!provider) throw new MissingCapabilityError(\"provider for signer\");\n if (!signer.provider) throw new Error(\"signer must be connected to a provider\");\n if ((await signer.provider.getNetwork()).chainId !== selected.protocol.context.chainId)\n throw new Error(\"signer-provider deployment chain mismatch\");\n }\n const registry = selected.protocol.deployment.registry;\n const fundingSigner =\n combined.fundingSigner ??\n (signer\n ? await EthersFundingSigner.create(signer, selected.protocol.context.chainId)\n : undefined);\n const fundingVerifier =\n combined.fundingVerifier ??\n (provider\n ? new EthersFundingVerifier(provider, selected.protocol.context.chainId)\n : undefined);\n const addressResolver =\n combined.addressResolver ??\n (provider && registry\n ? new EthersAddressResolver(\n provider,\n {\n chainId: selected.protocol.context.chainId,\n registryAddress: registry.address,\n },\n registry.runtimeCodeHash\n ).lookup\n : undefined);\n return {\n ...runtime,\n chainReader: reader,\n ...(signer ? { signer } : {}),\n ...(fundingSigner ? { fundingSigner } : {}),\n ...(fundingVerifier ? { fundingVerifier } : {}),\n ...(addressResolver ? { addressResolver } : {}),\n protocol: selected.protocol,\n };\n }\n\n async prepareTransfer(options: ExplicitTransferPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareTransfer(request);\n }\n async prepareWithdraw(options: ExplicitWithdrawalPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareWithdraw(request);\n }\n async prepareSweep(options: ExplicitSweepPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareSweep(request);\n }\n async prepareShield(options: ExplicitShieldPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, {}, request.tokenAddress);\n return preparation.prepareShield(request);\n }\n async prepareCreateCredit(\n options: ExplicitCreateCreditPreparation\n ): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareCreateCredit(request);\n }\n async prepareDrawCredit(options: ExplicitDrawCreditPreparation): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareDrawCredit(request);\n }\n async prepareTopUpCredit(\n options: ExplicitTopUpCreditPreparation\n ): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareTopUpCredit(request);\n }\n async prepareCancelCredit(\n options: ExplicitCancelCreditPreparation\n ): Promise<PreparedTransaction> {\n const { wallet, protocol, ...input } = options;\n const request = structuredClone(input);\n const runtime = await this.resolve({ wallet, protocol });\n const preparation = explicitPreparation(runtime, request, request.tokenAddress);\n return preparation.prepareCancelCredit(request);\n }\n\n toJSON() {\n return { invisi: true };\n }\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n","export { Invisi } from \"./Invisi\";\nexport type { InvisiOptions, ConnectionOptions } from \"./Invisi\";\nexport {\n Wallet,\n ViewingCapability,\n Detector,\n NullifierCapability,\n WalletAuthorization,\n MissingCapabilityError,\n Disclosure,\n encodeMemo,\n decodeMemoText,\n MAX_MEMO_BYTES,\n} from \"@invisi-labs/core\";\nexport type {\n Address,\n Hex,\n Memo,\n Note,\n CreditNote,\n CreditDeliveryState,\n ReceivingKeys,\n WalletAuthorizationProvider,\n CreditOpening,\n DisclosureOutput,\n DisclosureExport,\n DisclosureResult,\n} from \"@invisi-labs/core\";\nexport { Protocol, RegistrationOperation } from \"@invisi-labs/protocol\";\nexport type {\n ChainReader,\n ProtocolDataProvider,\n ProtocolDataStatus,\n ProtocolUpdates,\n ProtocolUpdateRange,\n TransactionCall,\n CanonicalBlock,\n CanonicalReceipt,\n Membership,\n RegistryReader,\n ProtocolOptions,\n TokenProtocol,\n TokenProtocolOptions,\n FactoryReader,\n AddressRegistryOptions,\n RegistryContext,\n TransactionContext,\n} from \"@invisi-labs/protocol\";\nexport { WalletSession, Operation, walletBalance, DisclosureVerifier } from \"./session\";\nexport type {\n RefreshOptions,\n RefreshResult,\n WalletStore,\n WalletScope,\n WalletState,\n BalanceSnapshot,\n WalletSessionOptions,\n TransferPreparation,\n WithdrawalPreparation,\n SweepPreparation,\n ShieldPreparation,\n CreateCreditPreparation,\n DrawCreditPreparation,\n TopUpCreditPreparation,\n CancelCreditPreparation,\n FundingSigner,\n FundingAuthorizationVerifier,\n FundingTypedData,\n FundingSource,\n CoinSelector,\n OperationStatus,\n OperationAggregateMember,\n DisclosureReference,\n DisclosureReader,\n DisclosureVerifierOptions,\n DisclosureEvidence,\n VerifiedDisclosure,\n} from \"./session\";\nexport type {\n Prover,\n ProverOptions,\n ProofBundle,\n ProofStatement,\n AggregatorCapability,\n AggregateMember,\n} from \"@invisi-labs/prover\";\n\nexport { ProtocolRpcError } from \"@invisi-labs/rpc\";\nexport type { ProtocolDeployment } from \"@invisi-labs/rpc\";\nexport { ProtocolRpcClient } from \"./ProtocolRpcClient\";\nexport { AddressRegistry } from \"./AddressRegistry\";\nexport type {\n ProtocolRpcClientOptions,\n ProtocolRpcReader,\n ProtocolRpcConnectionOptions,\n ProtocolRpcChain,\n} from \"@invisi-labs/rpc\";\n\nexport { EncryptedWalletCodec } from \"./integrations/encrypted-codec\";\n\nexport { PreparedTransaction } from \"./PreparedTransaction\";\nexport type {\n NoteInput,\n CreditInput,\n TransactionIdentity,\n ExplicitTransferPreparation,\n ExplicitWithdrawalPreparation,\n ExplicitSweepPreparation,\n ExplicitShieldPreparation,\n ExplicitCreateCreditPreparation,\n ExplicitDrawCreditPreparation,\n ExplicitTopUpCreditPreparation,\n ExplicitCancelCreditPreparation,\n} from \"./explicit-types\";\n\nexport type { SessionTransactionOptions } from \"./session/WalletSession\";\n\nexport type {\n GasBenchmarkProfile,\n GasBenchmarkShape,\n GasBenchmarkDeployment,\n GasBenchmarkCircuit,\n GasBenchmarkSample,\n GasReference,\n} from \"./gas-estimation\";\n\nexport { defineGasBenchmarks } from \"./gas-estimation\";\n","import type { Provider } from \"ethers\";\nimport { ProtocolRpcClient as RpcClient } from \"@invisi-labs/rpc\";\nimport { EthersChainReader } from \"./integrations/ethers\";\n\n/** Protocol RPC transport with ethers provider integration for independent chain checks. */\nexport class ProtocolRpcClient extends RpcClient {\n withProvider(provider: Provider): RpcClient {\n return this.withReader(new EthersChainReader(provider));\n }\n}\n","import type { Provider } from \"ethers\";\nimport { AddressRegistry as Registry, type RegistrationPreparation } from \"@invisi-labs/protocol\";\nimport { EthersChainReader } from \"./integrations/ethers\";\n\n/** Registry operations accept the application's existing ethers provider. */\nexport class AddressRegistry extends Registry {\n override prepareRegistration(\n options:\n | RegistrationPreparation\n | (Omit<RegistrationPreparation, \"reader\"> & { provider: Provider })\n ) {\n if (\"provider\" in options) {\n const { provider, ...preparation } = options;\n return super.prepareRegistration({\n ...preparation,\n reader: new EthersChainReader(provider),\n });\n }\n return super.prepareRegistration(options);\n }\n}\n","import {\n serializeState,\n deserializeState,\n type WalletState,\n type WalletRecordCodec,\n} from \"../session\";\n/** Caller-owned, nonextractable AES-GCM key. The SDK does not persist the key. */\nexport class EncryptedWalletCodec implements WalletRecordCodec {\n readonly #key: CryptoKey;\n private constructor(key: CryptoKey) {\n this.#key = key;\n }\n static fromKey(key: CryptoKey): EncryptedWalletCodec {\n if (\n key.type !== \"secret\" ||\n key.algorithm.name !== \"AES-GCM\" ||\n (key.algorithm as AesKeyAlgorithm).length !== 256 ||\n !key.usages.includes(\"encrypt\") ||\n !key.usages.includes(\"decrypt\")\n )\n throw new Error(\"wallet record key must support AES-256-GCM encryption and decryption\");\n return new EncryptedWalletCodec(key);\n }\n static async fromBytes(key: Uint8Array): Promise<EncryptedWalletCodec> {\n if (key.length !== 32) throw new Error(\"wallet record encryption requires 32 key bytes\");\n const copy = Uint8Array.from(key);\n try {\n return EncryptedWalletCodec.fromKey(\n await crypto.subtle.importKey(\"raw\", copy, { name: \"AES-GCM\" }, false, [\n \"encrypt\",\n \"decrypt\",\n ])\n );\n } finally {\n copy.fill(0);\n }\n }\n private aad(context: { key: string; revision: number }): Uint8Array<ArrayBuffer> {\n if (!Number.isSafeInteger(context.revision) || context.revision < 1)\n throw new Error(\"invalid encrypted record revision\");\n return new TextEncoder().encode(\n `Invisi.WalletRecord.v1\\0${context.revision}\\0${context.key}`\n );\n }\n async encode(\n state: WalletState,\n context: { key: string; revision: number }\n ): Promise<Uint8Array> {\n const iv = crypto.getRandomValues(new Uint8Array(12)),\n plain = Uint8Array.from(serializeState(state));\n try {\n const encrypted = new Uint8Array(\n await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv, additionalData: this.aad(context) },\n this.#key,\n plain\n )\n );\n const out = new Uint8Array(13 + encrypted.length);\n out[0] = 1;\n out.set(iv, 1);\n out.set(encrypted, 13);\n return out;\n } finally {\n plain.fill(0);\n }\n }\n async decode(\n data: Uint8Array,\n context: { key: string; revision: number }\n ): Promise<WalletState> {\n if (data.length < 29 || data[0] !== 1)\n throw new Error(\"wallet record authentication failed\");\n let plain: Uint8Array;\n try {\n plain = new Uint8Array(\n await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: Uint8Array.from(data.subarray(1, 13)),\n additionalData: this.aad(context),\n },\n this.#key,\n Uint8Array.from(data.subarray(13))\n )\n );\n } catch {\n throw new Error(\"wallet record authentication failed\");\n }\n try {\n return deserializeState(plain);\n } finally {\n plain.fill(0);\n }\n }\n toJSON() {\n return { walletRecordCodec: \"AES-256-GCM\" };\n }\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n return this.toJSON();\n }\n}\n"],"mappings":"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","names":["MissingCapabilityError","MissingCapabilityError","MissingCapabilityError","ProtocolRpcClient"]}
@@ -30,6 +30,9 @@ var import_ethers = require("ethers");
30
30
  var import_contracts = require("@invisi-labs/protocol/contracts");
31
31
  var import_address = require("@invisi-labs/core/address");
32
32
  var getAddress = (value) => (0, import_ethers.getAddress)(value);
33
+ var erc1271Abi = [
34
+ "function isValidSignature(bytes32 hash, bytes signature) view returns (bytes4)"
35
+ ];
33
36
  function check(value, message) {
34
37
  if (!value) {
35
38
  throw new Error(message);
@@ -61,6 +64,28 @@ var EthersChainReader = class {
61
64
  async getChainId() {
62
65
  return (await this.client.getNetwork()).chainId;
63
66
  }
67
+ async isValidRegistrationSignature(owner, digest, signature) {
68
+ try {
69
+ const result = await this.client.call({
70
+ to: getAddress(owner),
71
+ data: new import_ethers.Interface(erc1271Abi).encodeFunctionData("isValidSignature", [
72
+ digest,
73
+ signature
74
+ ])
75
+ });
76
+ return result.length >= 66 && result.slice(0, 66).toLowerCase() === "0x1626ba7e" + "00".repeat(28);
77
+ } catch (error) {
78
+ if ((0, import_ethers.isError)(error, "CALL_EXCEPTION")) return false;
79
+ throw error;
80
+ }
81
+ }
82
+ async getProtocolAddressRegistry(address2) {
83
+ return getAddress(
84
+ await new import_ethers.Contract(getAddress(address2), import_contracts.invisiProtocolAbi, this.client).getFunction(
85
+ "addressRegistry"
86
+ )()
87
+ );
88
+ }
64
89
  async getProtocolVersion(address2) {
65
90
  return BigInt(
66
91
  await new import_ethers.Contract(getAddress(address2), import_contracts.invisiProtocolAbi, this.client).getFunction(
@@ -441,25 +466,27 @@ function extractDeliveryCandidates(logs, context, confirmedThrough) {
441
466
  const tokens = array(a.tokens);
442
467
  const cs = array(a.commitments), tree = integer(a.treeId), start = index(a.startLeafIndex), packed = a.packedDeliveries;
443
468
  check2(
444
- typeof packed === "string" && /^0x(?:[0-9a-fA-F]{2})*$/.test(packed) && packed.length === 2 + 452 * cs.length,
469
+ typeof packed === "string" && /^0x(?:[0-9a-fA-F]{2})*$/.test(packed),
445
470
  "invalid packed deliveries"
446
471
  );
447
472
  check2(tokens.length === cs.length, "batch token count mismatch");
473
+ check2(start + cs.length <= 65536, "batch exceeds tree capacity");
474
+ let offset = 2;
448
475
  cs.forEach((c, i) => {
449
- const segment = packed.slice(2 + 452 * i, 2 + 452 * (i + 1));
450
- add(
451
- log,
452
- tree,
453
- start + i,
454
- c,
455
- "funds",
456
- {
457
- ciphertext: `0x${segment.slice(0, 316)}`,
458
- clue: `0x${segment.slice(316)}`
459
- },
460
- tokens[i]
476
+ check2(offset + 4 <= packed.length, "truncated delivery length prefix");
477
+ const length = Number.parseInt(packed.slice(offset, offset + 4), 16);
478
+ offset += 4;
479
+ check2(
480
+ length >= 160 && length <= 416 && offset + length * 2 + 136 <= packed.length,
481
+ "invalid packed delivery length"
461
482
  );
483
+ const ciphertext = `0x${packed.slice(offset, offset + length * 2)}`;
484
+ offset += length * 2;
485
+ const clue = `0x${packed.slice(offset, offset + 136)}`;
486
+ offset += 136;
487
+ add(log, tree, start + i, c, "funds", { ciphertext, clue }, tokens[i]);
462
488
  });
489
+ check2(offset === packed.length, "trailing packed delivery bytes");
463
490
  } else if (log.eventName === "CreditCreated") creation(log, a, a);
464
491
  else if (log.eventName === "CreditToppedUp")
465
492
  creation(log, a, object(object(a.params).creation));
@@ -3059,6 +3086,7 @@ var Preparation = class {
3059
3086
  const recipient = await import_core8.ReceivingAddress.parse(payment.to).resolve(
3060
3087
  this.runtime.options.addressResolver
3061
3088
  );
3089
+ const memo = (0, import_core8.encodeMemo)(payment.memo);
3062
3090
  const nonce = (0, import_core8.generateNonce)();
3063
3091
  const identity = await (0, import_core8.computeNoteIdentity)(BigInt(recipient.walletIdentity), nonce);
3064
3092
  const keys = recipient.getReceivingKeys();
@@ -3068,6 +3096,7 @@ var Preparation = class {
3068
3096
  tokenAddress: BigInt(context.tokenAddress),
3069
3097
  walletIdentity: recipient.walletIdentity,
3070
3098
  amount: payment.amount,
3099
+ ...memo.length === 0 ? {} : { memo },
3071
3100
  nonce
3072
3101
  };
3073
3102
  const commitment = await (0, import_core8.computeNoteCommitment)(
@@ -3303,6 +3332,7 @@ var CreditPreparation = class {
3303
3332
  ownerPayout: BigInt(ownerPayout),
3304
3333
  spenderPayout: BigInt(spenderPayout),
3305
3334
  amount: options.amount,
3335
+ ...options.memo === void 0 ? {} : { memo: options.memo },
3306
3336
  expiry,
3307
3337
  nonce: (0, import_core9.generateNonce)(),
3308
3338
  creditSharedKey: (0, import_core9.generateCreditSharedKey)()
@@ -3394,7 +3424,16 @@ var CreditPreparation = class {
3394
3424
  }
3395
3425
  const amount = positiveAmount(old.note.amount + options.additionalAmount, 126);
3396
3426
  const output = await this.seal(
3397
- { ...old, note: { ...old.note, amount, expiry, nonce: (0, import_core9.generateNonce)() } },
3427
+ {
3428
+ ...old,
3429
+ note: {
3430
+ ...old.note,
3431
+ amount,
3432
+ expiry,
3433
+ nonce: (0, import_core9.generateNonce)(),
3434
+ ...options.memo === void 0 ? {} : { memo: options.memo }
3435
+ }
3436
+ },
3398
3437
  frame
3399
3438
  );
3400
3439
  return this.creation(
@@ -3460,6 +3499,7 @@ var CreditPreparation = class {
3460
3499
  note: {
3461
3500
  ...n,
3462
3501
  amount: remaining,
3502
+ ...options.credits[i].memo === void 0 ? {} : { memo: options.credits[i].memo },
3463
3503
  nonce: await (0, import_core9.deriveRemainderNonce)(...args)
3464
3504
  }
3465
3505
  },
@@ -3929,6 +3969,10 @@ var InventoryProcessor = class {
3929
3969
  if (!remainder) {
3930
3970
  continue;
3931
3971
  }
3972
+ const child = foundByKey.get(
3973
+ params.remainderCommitments[index2] + ":" + previous.role
3974
+ );
3975
+ const memo = child?.state.note.memo;
3932
3976
  const record = {
3933
3977
  commitment: params.remainderCommitments[index2],
3934
3978
  treeId: BigInt(args.outputTreeId),
@@ -3937,7 +3981,13 @@ var InventoryProcessor = class {
3937
3981
  blockHash: event.blockHash,
3938
3982
  transactionHash: event.transactionHash,
3939
3983
  role: previous.role,
3940
- state: { ...clone(previous.state), note: remainder },
3984
+ state: {
3985
+ ...clone(previous.state),
3986
+ note: {
3987
+ ...remainder,
3988
+ ...memo === void 0 ? {} : { memo: (0, import_core10.encodeMemo)(memo) }
3989
+ }
3990
+ },
3941
3991
  receivingKeySource: { kind: "draw", commitment: previous.commitment },
3942
3992
  spent: "unknown"
3943
3993
  };