@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/{chunk-NAEEEZMH.js → chunk-4HMM7ZKY.js} +24 -1
- package/dist/chunk-4HMM7ZKY.js.map +1 -0
- package/dist/{chunk-T246CYQ7.js → chunk-Z6NDXVBL.js} +44 -17
- package/dist/chunk-Z6NDXVBL.js.map +1 -0
- package/dist/ethers.cjs +22 -0
- package/dist/ethers.cjs.map +1 -1
- package/dist/ethers.d.cts +3 -1
- package/dist/ethers.d.ts +3 -1
- package/dist/ethers.js +1 -1
- package/dist/{gas-estimation-Byi278aa.d.cts → gas-estimation-BV8WdwNF.d.cts} +4 -0
- package/dist/{gas-estimation-CUZXjsO7.d.ts → gas-estimation-v9OjKMsL.d.ts} +4 -0
- package/dist/index.cjs +68 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/indexeddb.cjs +65 -15
- package/dist/indexeddb.cjs.map +1 -1
- package/dist/indexeddb.js +2 -2
- package/dist/memory.cjs +65 -15
- package/dist/memory.cjs.map +1 -1
- package/dist/memory.js +2 -2
- package/dist/sqlite.cjs +65 -15
- package/dist/sqlite.cjs.map +1 -1
- package/dist/sqlite.js +2 -2
- package/package.json +5 -5
- package/dist/chunk-NAEEEZMH.js.map +0 -1
- package/dist/chunk-T246CYQ7.js.map +0 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
Contract,
|
|
4
4
|
zeroPadValue,
|
|
5
|
+
Interface,
|
|
5
6
|
TypedDataEncoder,
|
|
6
7
|
verifyTypedData,
|
|
7
8
|
getAddress as ethersAddress,
|
|
@@ -60,6 +61,28 @@ var EthersChainReader = class {
|
|
|
60
61
|
async getChainId() {
|
|
61
62
|
return (await this.client.getNetwork()).chainId;
|
|
62
63
|
}
|
|
64
|
+
async isValidRegistrationSignature(owner, digest, signature) {
|
|
65
|
+
try {
|
|
66
|
+
const result = await this.client.call({
|
|
67
|
+
to: getAddress(owner),
|
|
68
|
+
data: new Interface(erc1271Abi).encodeFunctionData("isValidSignature", [
|
|
69
|
+
digest,
|
|
70
|
+
signature
|
|
71
|
+
])
|
|
72
|
+
});
|
|
73
|
+
return result.length >= 66 && result.slice(0, 66).toLowerCase() === "0x1626ba7e" + "00".repeat(28);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
if (isError(error, "CALL_EXCEPTION")) return false;
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async getProtocolAddressRegistry(address) {
|
|
80
|
+
return getAddress(
|
|
81
|
+
await new Contract(getAddress(address), invisiProtocolAbi, this.client).getFunction(
|
|
82
|
+
"addressRegistry"
|
|
83
|
+
)()
|
|
84
|
+
);
|
|
85
|
+
}
|
|
63
86
|
async getProtocolVersion(address) {
|
|
64
87
|
return BigInt(
|
|
65
88
|
await new Contract(getAddress(address), invisiProtocolAbi, this.client).getFunction(
|
|
@@ -348,4 +371,4 @@ export {
|
|
|
348
371
|
EthersFundingSigner,
|
|
349
372
|
EthersFundingVerifier
|
|
350
373
|
};
|
|
351
|
-
//# sourceMappingURL=chunk-
|
|
374
|
+
//# sourceMappingURL=chunk-4HMM7ZKY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integrations/ethers.ts"],"sourcesContent":["import {\n Contract,\n zeroPadValue,\n Interface,\n TypedDataEncoder,\n verifyTypedData,\n getAddress as ethersAddress,\n getBytes,\n keccak256,\n isError,\n type Provider,\n type Signer,\n} from \"ethers\";\nimport type { Address, Hex } from \"@invisi-labs/protocol/contracts\";\nconst getAddress = (value: string): Address => ethersAddress(value) as Address;\nimport {\n invisiProtocolAbi,\n invisiAddressRegistryAbi,\n invisiFactoryAbi,\n} from \"@invisi-labs/protocol/contracts\";\nimport { ReceivingAddress, type ReceivingKeyLookup } from \"@invisi-labs/core/address\";\nimport type {\n ChainReader,\n FactoryReader,\n RegistryReader,\n RegistryContext,\n TransactionContext,\n DeploymentContext,\n CanonicalBlock,\n CanonicalReceipt,\n} from \"@invisi-labs/protocol\";\nimport type { FundingSigner, FundingTypedData, FundingAuthorizationVerifier } from \"../session\";\n\nconst erc1271Abi = [\n \"function isValidSignature(bytes32 hash, bytes signature) view returns (bytes4)\",\n];\nfunction fundingTypes(data: FundingTypedData) {\n const types = Object.fromEntries(\n Object.entries(data.types).map(([name, fields]) => [name, [...fields]])\n );\n check(\n TypedDataEncoder.from(types).primaryType === data.primaryType,\n \"funding typed-data primary type mismatch\"\n );\n return types;\n}\n\nfunction check(value: unknown, message: string): asserts value {\n if (!value) {\n throw new Error(message);\n }\n}\n\nasync function chain(client: Provider, expected: bigint): Promise<void> {\n check((await client.getNetwork()).chainId === expected, \"EVM client chain mismatch\");\n}\n\nfunction number(value: unknown): bigint {\n check(typeof value === \"bigint\" && value >= 0n, \"invalid chain integer\");\n return value;\n}\n\nfunction boolean(value: unknown): boolean {\n check(typeof value === \"boolean\", \"invalid chain boolean\");\n return value;\n}\n\nfunction word(value: unknown): Hex {\n check(typeof value === \"string\" && /^0x[0-9a-fA-F]{64}$/.test(value), \"invalid chain word\");\n return value.toLowerCase() as Hex;\n}\n\nfunction ownerWord(value: Hex): Hex {\n // Public owners use canonical EVM addresses; registry slots remain bytes32.\n const identity = ReceivingAddress.fromIdentity(value).walletIdentity;\n return zeroPadValue(identity, 32) as Hex;\n}\n\n/** Reads exact block numbers; higher layers additionally enforce post-read snapshot barriers. */\nexport class EthersChainReader implements ChainReader, RegistryReader, FactoryReader {\n constructor(readonly client: Provider) {}\n\n async getChainId() {\n return (await this.client.getNetwork()).chainId;\n }\n\n async isValidRegistrationSignature(\n owner: Address,\n digest: Hex,\n signature: Hex\n ): Promise<boolean> {\n try {\n const result = await this.client.call({\n to: getAddress(owner),\n data: new Interface(erc1271Abi).encodeFunctionData(\"isValidSignature\", [\n digest,\n signature,\n ]),\n });\n // SignatureChecker compares the complete first return word, including padding.\n return (\n result.length >= 66 &&\n result.slice(0, 66).toLowerCase() === \"0x1626ba7e\" + \"00\".repeat(28)\n );\n } catch (error) {\n if (isError(error, \"CALL_EXCEPTION\")) return false;\n throw error;\n }\n }\n\n async getProtocolAddressRegistry(address: Address): Promise<Address> {\n return getAddress(\n await new Contract(getAddress(address), invisiProtocolAbi, this.client).getFunction(\n \"addressRegistry\"\n )()\n );\n }\n\n async getProtocolVersion(address: Address): Promise<bigint> {\n return BigInt(\n await new Contract(getAddress(address), invisiProtocolAbi, this.client).getFunction(\n \"VERSION\"\n )()\n );\n }\n\n async getCode(address: Address): Promise<Hex> {\n return (await this.client.getCode(getAddress(address))) as Hex;\n }\n\n async getFactoryInstanceAddress(factory: Address, salt: Hex): Promise<Address> {\n return getAddress(\n await new Contract(factory, invisiFactoryAbi, this.client).getFunction(\n \"getInstanceAddress\"\n )(salt)\n );\n }\n async isFactoryInstance(factory: Address, instance: Address): Promise<boolean> {\n return boolean(\n await new Contract(factory, invisiFactoryAbi, this.client).getFunction(\"isInstance\")(\n instance\n )\n );\n }\n async getInstanceFactory(instance: Address): Promise<Address> {\n return getAddress(\n await new Contract(instance, invisiProtocolAbi, this.client).getFunction(\"factory\")()\n );\n }\n async getLatestBlockNumber() {\n return BigInt(await this.client.getBlockNumber());\n }\n\n async getBlock(blockNumber: bigint): Promise<CanonicalBlock> {\n const block = await this.client.getBlock(blockNumber);\n check(\n block && BigInt(block.number) === blockNumber && block.hash && block.parentHash,\n \"invalid canonical block\"\n );\n return {\n number: BigInt(block.number),\n hash: word(block.hash),\n parentHash: word(block.parentHash),\n timestamp: number(BigInt(block.timestamp)),\n };\n }\n\n private async read(\n context: { chainId: bigint },\n address: Address,\n abi: ConstructorParameters<typeof Interface>[0],\n functionName: string,\n args: readonly unknown[],\n block?: CanonicalBlock\n ): Promise<unknown> {\n await chain(this.client, context.chainId);\n if (block) {\n check(\n (await this.getBlock(block.number)).hash === block.hash,\n \"canonical read block mismatch\"\n );\n }\n return new Contract(getAddress(address), abi, this.client).getFunction(functionName)(\n ...args,\n ...(block ? [{ blockTag: block.number }] : [])\n );\n }\n\n async getFundingNonce(context: DeploymentContext, payer: Address, block: CanonicalBlock) {\n return number(\n await this.read(\n context,\n context.protocolAddress,\n invisiProtocolAbi,\n \"nonces\",\n [getAddress(payer)],\n block\n )\n );\n }\n\n async getRegistryNonce(context: RegistryContext, walletIdentity: Hex, block: CanonicalBlock) {\n return number(\n await this.read(\n context,\n context.registryAddress,\n invisiAddressRegistryAbi,\n \"nonceOf\",\n [ownerWord(walletIdentity)],\n block\n )\n );\n }\n\n async isKnownRoot(\n context: DeploymentContext,\n treeId: bigint,\n root: Hex,\n block: CanonicalBlock\n ) {\n return boolean(\n await this.read(\n context,\n context.protocolAddress,\n invisiProtocolAbi,\n \"rootHistory\",\n [number(treeId), word(root)],\n block\n )\n );\n }\n\n async isSpent(context: DeploymentContext, nullifiers: readonly Hex[], block: CanonicalBlock) {\n const copied = nullifiers.map(word);\n const result: boolean[] = [];\n for (let offset = 0; offset < copied.length; offset += 32) {\n result.push(\n ...(await Promise.all(\n copied\n .slice(offset, offset + 32)\n .map((nf) =>\n this.read(\n context,\n context.protocolAddress,\n invisiProtocolAbi,\n \"isNullifierSpent\",\n [nf],\n block\n ).then(boolean)\n )\n ))\n );\n }\n return result;\n }\n\n async getTransaction(hash: Hex) {\n try {\n const tx = await this.client.getTransaction(word(hash));\n if (!tx?.to) {\n return null;\n }\n return {\n transactionHash: word(tx.hash),\n to: getAddress(tx.to),\n from: getAddress(tx.from),\n nonce: number(BigInt(tx.nonce)),\n data: tx.data as Hex,\n value: number(tx.value),\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"TransactionNotFoundError\") {\n return null;\n }\n throw error;\n }\n }\n\n async getReceipt(hash: Hex): Promise<CanonicalReceipt | null> {\n try {\n const receipt = await this.client.getTransactionReceipt(word(hash));\n if (!receipt) return null;\n const block = await this.getBlock(BigInt(receipt.blockNumber));\n check(block.hash === receipt.blockHash, \"receipt block is no longer canonical\");\n return {\n block,\n transactionHash: word(receipt.hash),\n status: receipt.status === 1 ? \"success\" : \"reverted\",\n logs: receipt.logs.map((log) => {\n check(\n !log.removed && log.transactionHash === receipt.hash && log.index !== null,\n \"invalid receipt log\"\n );\n return {\n address: getAddress(log.address),\n data: log.data as Hex,\n topics: [...log.topics] as Hex[],\n transactionHash: word(log.transactionHash),\n logIndex: log.index,\n };\n }),\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"TransactionReceiptNotFoundError\") {\n return null;\n }\n throw error;\n }\n }\n}\n\n/** Resolves only the explicitly selected registry. Validates canonical public key encodings. */\nexport class EthersAddressResolver {\n readonly #context: Readonly<RegistryContext>;\n\n constructor(\n readonly client: Provider,\n context: RegistryContext,\n readonly expectedRuntimeCodeHash?: Hex\n ) {\n this.#context = Object.freeze({\n ...context,\n registryAddress: getAddress(context.registryAddress),\n });\n check(BigInt(context.registryAddress) !== 0n, \"invalid registry address\");\n }\n\n readonly lookup: ReceivingKeyLookup = async (walletIdentity) => {\n await chain(this.client, this.#context.chainId);\n if (this.expectedRuntimeCodeHash) {\n const code = await this.client.getCode(this.#context.registryAddress);\n check(\n code !== \"0x\" && keccak256(code) === this.expectedRuntimeCodeHash,\n \"registry runtime profile mismatch\"\n );\n }\n const block = await this.client.getBlock(\"latest\");\n check(block && block.hash, \"invalid registry block\");\n const contract = new Contract(\n this.#context.registryAddress,\n invisiAddressRegistryAbi,\n this.client\n );\n const registered = await contract.getFunction(\"isRegistered\")(ownerWord(walletIdentity), {\n blockTag: block.number,\n });\n if (!registered) return null;\n const [keys] = await contract.getFunction(\"receivingKeysOf\")(ownerWord(walletIdentity), {\n blockTag: block.number,\n });\n check(\n (await this.client.getBlock(block.number))?.hash === block.hash,\n \"canonical registry read changed\"\n );\n return ReceivingAddress.from({\n walletIdentity,\n viewingPublicKey: getBytes(keys.viewingPublicKey),\n clueKey: getBytes(keys.clueKey),\n }).getReceivingKeys();\n };\n}\n\nexport class EthersFundingSigner implements FundingSigner {\n readonly address: Address;\n constructor(\n readonly signer: Signer,\n readonly chainId: bigint,\n address: Address\n ) {\n this.address = getAddress(address);\n }\n static async create(signer: Signer, chainId: bigint): Promise<EthersFundingSigner> {\n return new EthersFundingSigner(signer, chainId, getAddress(await signer.getAddress()));\n }\n async signTypedData(data: FundingTypedData): Promise<Hex> {\n const copied = structuredClone(data);\n check(\n BigInt(copied.domain.chainId as bigint) === this.chainId,\n \"funding typed-data chain mismatch\"\n );\n check(\n getAddress(await this.signer.getAddress()) === this.address,\n \"funding signer address mismatch\"\n );\n if (this.signer.provider) await chain(this.signer.provider, this.chainId);\n return (await this.signer.signTypedData(\n copied.domain,\n fundingTypes(copied),\n copied.message\n )) as Hex;\n }\n}\n\nexport class EthersFundingVerifier implements FundingAuthorizationVerifier {\n constructor(\n readonly client: Provider,\n readonly chainId: bigint\n ) {}\n async verifyTypedData(\n data: FundingTypedData & { address: Address; signature: Hex }\n ): Promise<boolean> {\n const copied = structuredClone(data);\n check(\n BigInt(copied.domain.chainId as bigint) === this.chainId,\n \"funding typed-data chain mismatch\"\n );\n await chain(this.client, this.chainId);\n const address = getAddress(copied.address);\n if ((await this.client.getCode(address)) === \"0x\") {\n try {\n return (\n getAddress(\n verifyTypedData(\n copied.domain,\n fundingTypes(copied),\n copied.message,\n copied.signature\n )\n ) === address\n );\n } catch {\n return false;\n }\n }\n try {\n return (\n (await new Contract(address, erc1271Abi, this.client).getFunction(\n \"isValidSignature\"\n )(\n TypedDataEncoder.hash(copied.domain, fundingTypes(copied), copied.message),\n copied.signature\n )) === \"0x1626ba7e\"\n );\n } catch (error) {\n if (isError(error, \"CALL_EXCEPTION\")) return false;\n throw error;\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EthersChainReader
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4HMM7ZKY.js";
|
|
4
4
|
|
|
5
5
|
// src/session/state.ts
|
|
6
6
|
function creditReservationKey(commitment) {
|
|
@@ -1362,25 +1362,27 @@ function extractDeliveryCandidates(logs, context, confirmedThrough) {
|
|
|
1362
1362
|
const tokens = array(a.tokens);
|
|
1363
1363
|
const cs = array(a.commitments), tree = integer(a.treeId), start = index(a.startLeafIndex), packed = a.packedDeliveries;
|
|
1364
1364
|
check(
|
|
1365
|
-
typeof packed === "string" && /^0x(?:[0-9a-fA-F]{2})*$/.test(packed)
|
|
1365
|
+
typeof packed === "string" && /^0x(?:[0-9a-fA-F]{2})*$/.test(packed),
|
|
1366
1366
|
"invalid packed deliveries"
|
|
1367
1367
|
);
|
|
1368
1368
|
check(tokens.length === cs.length, "batch token count mismatch");
|
|
1369
|
+
check(start + cs.length <= 65536, "batch exceeds tree capacity");
|
|
1370
|
+
let offset = 2;
|
|
1369
1371
|
cs.forEach((c, i) => {
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
"funds",
|
|
1377
|
-
{
|
|
1378
|
-
ciphertext: `0x${segment.slice(0, 316)}`,
|
|
1379
|
-
clue: `0x${segment.slice(316)}`
|
|
1380
|
-
},
|
|
1381
|
-
tokens[i]
|
|
1372
|
+
check(offset + 4 <= packed.length, "truncated delivery length prefix");
|
|
1373
|
+
const length = Number.parseInt(packed.slice(offset, offset + 4), 16);
|
|
1374
|
+
offset += 4;
|
|
1375
|
+
check(
|
|
1376
|
+
length >= 160 && length <= 416 && offset + length * 2 + 136 <= packed.length,
|
|
1377
|
+
"invalid packed delivery length"
|
|
1382
1378
|
);
|
|
1379
|
+
const ciphertext = `0x${packed.slice(offset, offset + length * 2)}`;
|
|
1380
|
+
offset += length * 2;
|
|
1381
|
+
const clue = `0x${packed.slice(offset, offset + 136)}`;
|
|
1382
|
+
offset += 136;
|
|
1383
|
+
add(log, tree, start + i, c, "funds", { ciphertext, clue }, tokens[i]);
|
|
1383
1384
|
});
|
|
1385
|
+
check(offset === packed.length, "trailing packed delivery bytes");
|
|
1384
1386
|
} else if (log.eventName === "CreditCreated") creation(log, a, a);
|
|
1385
1387
|
else if (log.eventName === "CreditToppedUp")
|
|
1386
1388
|
creation(log, a, object(object(a.params).creation));
|
|
@@ -2775,6 +2777,7 @@ import {
|
|
|
2775
2777
|
// src/session/prepare-common.ts
|
|
2776
2778
|
import { getAddress, hexlify } from "ethers";
|
|
2777
2779
|
import {
|
|
2780
|
+
encodeMemo,
|
|
2778
2781
|
MissingCapabilityError as MissingCapabilityError2,
|
|
2779
2782
|
ReceivingAddress as ReceivingAddress2,
|
|
2780
2783
|
computeNoteCommitment,
|
|
@@ -2884,6 +2887,7 @@ var Preparation = class {
|
|
|
2884
2887
|
const recipient = await ReceivingAddress2.parse(payment.to).resolve(
|
|
2885
2888
|
this.runtime.options.addressResolver
|
|
2886
2889
|
);
|
|
2890
|
+
const memo = encodeMemo(payment.memo);
|
|
2887
2891
|
const nonce = generateNonce();
|
|
2888
2892
|
const identity = await computeNoteIdentity(BigInt(recipient.walletIdentity), nonce);
|
|
2889
2893
|
const keys = recipient.getReceivingKeys();
|
|
@@ -2893,6 +2897,7 @@ var Preparation = class {
|
|
|
2893
2897
|
tokenAddress: BigInt(context.tokenAddress),
|
|
2894
2898
|
walletIdentity: recipient.walletIdentity,
|
|
2895
2899
|
amount: payment.amount,
|
|
2900
|
+
...memo.length === 0 ? {} : { memo },
|
|
2896
2901
|
nonce
|
|
2897
2902
|
};
|
|
2898
2903
|
const commitment = await computeNoteCommitment(
|
|
@@ -3147,6 +3152,7 @@ var CreditPreparation = class {
|
|
|
3147
3152
|
ownerPayout: BigInt(ownerPayout),
|
|
3148
3153
|
spenderPayout: BigInt(spenderPayout),
|
|
3149
3154
|
amount: options.amount,
|
|
3155
|
+
...options.memo === void 0 ? {} : { memo: options.memo },
|
|
3150
3156
|
expiry,
|
|
3151
3157
|
nonce: generateNonce2(),
|
|
3152
3158
|
creditSharedKey: generateCreditSharedKey()
|
|
@@ -3238,7 +3244,16 @@ var CreditPreparation = class {
|
|
|
3238
3244
|
}
|
|
3239
3245
|
const amount = positiveAmount(old.note.amount + options.additionalAmount, 126);
|
|
3240
3246
|
const output = await this.seal(
|
|
3241
|
-
{
|
|
3247
|
+
{
|
|
3248
|
+
...old,
|
|
3249
|
+
note: {
|
|
3250
|
+
...old.note,
|
|
3251
|
+
amount,
|
|
3252
|
+
expiry,
|
|
3253
|
+
nonce: generateNonce2(),
|
|
3254
|
+
...options.memo === void 0 ? {} : { memo: options.memo }
|
|
3255
|
+
}
|
|
3256
|
+
},
|
|
3242
3257
|
frame
|
|
3243
3258
|
);
|
|
3244
3259
|
return this.creation(
|
|
@@ -3304,6 +3319,7 @@ var CreditPreparation = class {
|
|
|
3304
3319
|
note: {
|
|
3305
3320
|
...n,
|
|
3306
3321
|
amount: remaining,
|
|
3322
|
+
...options.credits[i].memo === void 0 ? {} : { memo: options.credits[i].memo },
|
|
3307
3323
|
nonce: await deriveRemainderNonce(...args)
|
|
3308
3324
|
}
|
|
3309
3325
|
},
|
|
@@ -3637,6 +3653,7 @@ import { NullifierCapability } from "@invisi-labs/core";
|
|
|
3637
3653
|
|
|
3638
3654
|
// src/session/inventory.ts
|
|
3639
3655
|
import {
|
|
3656
|
+
encodeMemo as encodeMemo2,
|
|
3640
3657
|
computeCreditCommitment as computeCreditCommitment2,
|
|
3641
3658
|
computeCreditNullifier as computeCreditNullifier3,
|
|
3642
3659
|
computeCreditSharedKeyHash as computeCreditSharedKeyHash2,
|
|
@@ -3778,6 +3795,10 @@ var InventoryProcessor = class {
|
|
|
3778
3795
|
if (!remainder) {
|
|
3779
3796
|
continue;
|
|
3780
3797
|
}
|
|
3798
|
+
const child = foundByKey.get(
|
|
3799
|
+
params.remainderCommitments[index2] + ":" + previous.role
|
|
3800
|
+
);
|
|
3801
|
+
const memo = child?.state.note.memo;
|
|
3781
3802
|
const record = {
|
|
3782
3803
|
commitment: params.remainderCommitments[index2],
|
|
3783
3804
|
treeId: BigInt(args.outputTreeId),
|
|
@@ -3786,7 +3807,13 @@ var InventoryProcessor = class {
|
|
|
3786
3807
|
blockHash: event.blockHash,
|
|
3787
3808
|
transactionHash: event.transactionHash,
|
|
3788
3809
|
role: previous.role,
|
|
3789
|
-
state: {
|
|
3810
|
+
state: {
|
|
3811
|
+
...clone(previous.state),
|
|
3812
|
+
note: {
|
|
3813
|
+
...remainder,
|
|
3814
|
+
...memo === void 0 ? {} : { memo: encodeMemo2(memo) }
|
|
3815
|
+
}
|
|
3816
|
+
},
|
|
3790
3817
|
receivingKeySource: { kind: "draw", commitment: previous.commitment },
|
|
3791
3818
|
spent: "unknown"
|
|
3792
3819
|
};
|
|
@@ -4327,4 +4354,4 @@ export {
|
|
|
4327
4354
|
WalletSession,
|
|
4328
4355
|
MemoryWalletStore
|
|
4329
4356
|
};
|
|
4330
|
-
//# sourceMappingURL=chunk-
|
|
4357
|
+
//# sourceMappingURL=chunk-Z6NDXVBL.js.map
|