@invisi-labs/protocol 1.1.6 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/chunk-7SS2YSEF.js +199 -0
- package/dist/chunk-7SS2YSEF.js.map +1 -0
- package/dist/{chunk-BYJ4LXCJ.js → chunk-HHJLFLVJ.js} +616 -714
- package/dist/chunk-HHJLFLVJ.js.map +1 -0
- package/dist/chunk-MVQQD5W5.js +487 -0
- package/dist/chunk-MVQQD5W5.js.map +1 -0
- package/dist/chunk-Z2XPYNMC.js +446 -0
- package/dist/chunk-Z2XPYNMC.js.map +1 -0
- package/dist/contracts.cjs +615 -713
- package/dist/contracts.cjs.map +1 -1
- package/dist/contracts.d.cts +5 -5
- package/dist/contracts.d.ts +5 -5
- package/dist/contracts.js +1 -1
- package/dist/credit.cjs +3367 -0
- package/dist/credit.cjs.map +1 -0
- package/dist/credit.d.cts +252 -0
- package/dist/credit.d.ts +252 -0
- package/dist/credit.js +53 -0
- package/dist/credit.js.map +1 -0
- package/dist/index.cjs +4294 -4223
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +128 -933
- package/dist/index.d.ts +128 -933
- package/dist/index.js +2853 -3584
- package/dist/index.js.map +1 -1
- package/dist/note.cjs +3456 -0
- package/dist/note.cjs.map +1 -0
- package/dist/note.d.cts +232 -0
- package/dist/note.d.ts +232 -0
- package/dist/note.js +43 -0
- package/dist/note.js.map +1 -0
- package/dist/provenance.cjs +558 -0
- package/dist/provenance.cjs.map +1 -0
- package/dist/provenance.d.cts +188 -0
- package/dist/provenance.d.ts +188 -0
- package/dist/provenance.js +499 -0
- package/dist/provenance.js.map +1 -0
- package/dist/{types-BmUlasOg.d.cts → types-CUnFzl5S.d.cts} +530 -590
- package/dist/{types-BmUlasOg.d.ts → types-CUnFzl5S.d.ts} +530 -590
- package/dist/validation-8g0SQVE5.d.ts +235 -0
- package/dist/validation-MgURYiNF.d.cts +235 -0
- package/package.json +20 -5
- package/dist/chunk-BYJ4LXCJ.js.map +0 -1
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import {
|
|
2
|
+
checkDeadline,
|
|
3
|
+
deliveriesHash,
|
|
4
|
+
dense,
|
|
5
|
+
field,
|
|
6
|
+
fundingFields,
|
|
7
|
+
getEIP712Domain,
|
|
8
|
+
known,
|
|
9
|
+
normalizeContext,
|
|
10
|
+
normalizeFee,
|
|
11
|
+
normalizeFunding,
|
|
12
|
+
normalizeOpaqueDelivery,
|
|
13
|
+
normalizeSources,
|
|
14
|
+
notes,
|
|
15
|
+
pad,
|
|
16
|
+
uint,
|
|
17
|
+
validateFundingSubmission,
|
|
18
|
+
word
|
|
19
|
+
} from "./chunk-7SS2YSEF.js";
|
|
20
|
+
import {
|
|
21
|
+
invisiProtocolAbi
|
|
22
|
+
} from "./chunk-HHJLFLVJ.js";
|
|
23
|
+
|
|
24
|
+
// src/note/aggregate-routes.ts
|
|
25
|
+
var AGGREGATE_ROUTES = Object.freeze(
|
|
26
|
+
[
|
|
27
|
+
...Array.from({ length: 10 }, (_, i) => i + 1).flatMap(
|
|
28
|
+
(capacity) => [1, 2, 5].map((count) => ({
|
|
29
|
+
kind: "dedicated",
|
|
30
|
+
capacity,
|
|
31
|
+
count,
|
|
32
|
+
name: `transact_aggregate_${capacity}_${count}`,
|
|
33
|
+
publicInputCount: (17 + 3 * capacity) * count + 1
|
|
34
|
+
}))
|
|
35
|
+
),
|
|
36
|
+
...[2, 3, 4, 5].map((count) => ({
|
|
37
|
+
kind: "mixed",
|
|
38
|
+
capacity: 0,
|
|
39
|
+
count,
|
|
40
|
+
name: `transact_aggregate_mixed_1_5_${count}`,
|
|
41
|
+
publicInputCount: 33 * count + 5
|
|
42
|
+
}))
|
|
43
|
+
].map((route) => Object.freeze(route))
|
|
44
|
+
);
|
|
45
|
+
function selectAggregateRoute(capacities) {
|
|
46
|
+
if (!capacities.length || Array.from(
|
|
47
|
+
{ length: capacities.length },
|
|
48
|
+
(_, i) => Number.isInteger(capacities[i]) && capacities[i] >= 1 && capacities[i] <= 10
|
|
49
|
+
).some((v) => !v))
|
|
50
|
+
throw Error("unsupported aggregate capacities");
|
|
51
|
+
const count = capacities.length, dedicated = AGGREGATE_ROUTES.find(
|
|
52
|
+
(r) => r.kind === "dedicated" && r.capacity === capacities[0] && r.count === count
|
|
53
|
+
);
|
|
54
|
+
if (dedicated && capacities.every((c) => c === capacities[0])) return dedicated;
|
|
55
|
+
const mixed = AGGREGATE_ROUTES.find((r) => r.kind === "mixed" && r.count === count);
|
|
56
|
+
if (mixed && capacities.every((c) => c <= 5)) return mixed;
|
|
57
|
+
throw Error("unsupported aggregate capacity/count combination");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// src/note/request.ts
|
|
61
|
+
import { getAddress } from "ethers";
|
|
62
|
+
var TRANSACT_CAPACITIES = [
|
|
63
|
+
1,
|
|
64
|
+
2,
|
|
65
|
+
3,
|
|
66
|
+
4,
|
|
67
|
+
5,
|
|
68
|
+
6,
|
|
69
|
+
7,
|
|
70
|
+
8,
|
|
71
|
+
9,
|
|
72
|
+
10,
|
|
73
|
+
20,
|
|
74
|
+
30,
|
|
75
|
+
40,
|
|
76
|
+
50,
|
|
77
|
+
60,
|
|
78
|
+
70,
|
|
79
|
+
80,
|
|
80
|
+
90,
|
|
81
|
+
100,
|
|
82
|
+
110,
|
|
83
|
+
120,
|
|
84
|
+
130,
|
|
85
|
+
140,
|
|
86
|
+
150,
|
|
87
|
+
160,
|
|
88
|
+
170,
|
|
89
|
+
180,
|
|
90
|
+
190
|
|
91
|
+
];
|
|
92
|
+
function selectTransactCapacity(inputs, outputs) {
|
|
93
|
+
if (!Number.isInteger(inputs) || !Number.isInteger(outputs) || inputs < 0 || outputs < 0 || inputs + outputs < 1 || inputs === 0 && outputs < 2 || inputs + outputs > 190)
|
|
94
|
+
throw new Error("unsupported transact shape");
|
|
95
|
+
return TRANSACT_CAPACITIES.find((n) => inputs + outputs <= n);
|
|
96
|
+
}
|
|
97
|
+
function normalizeTransactRequest(c, p, cs, funding = {}) {
|
|
98
|
+
const ctx = normalizeContext(c);
|
|
99
|
+
if (getAddress(p.token) !== ctx.tokenAddress)
|
|
100
|
+
throw new Error("request token mismatch");
|
|
101
|
+
known(p, [
|
|
102
|
+
"token",
|
|
103
|
+
"sources",
|
|
104
|
+
"nullifiers",
|
|
105
|
+
"noteCommitments",
|
|
106
|
+
"withdrawalAddress",
|
|
107
|
+
"withdrawalAmount",
|
|
108
|
+
"deadline",
|
|
109
|
+
"feeRecipient",
|
|
110
|
+
"feeAmount"
|
|
111
|
+
]);
|
|
112
|
+
const ns = notes(p.nullifiers, "nullifiers"), os = notes(p.noteCommitments, "noteCommitments"), capacity = selectTransactCapacity(ns.length, os.length);
|
|
113
|
+
const sources = normalizeSources(p.sources, ns.length, capacity), deliveries = dense(cs, "deliveries").map(
|
|
114
|
+
(v) => normalizeOpaqueDelivery(v, { allowEmpty: true })
|
|
115
|
+
);
|
|
116
|
+
if (deliveries.length !== os.length) throw new Error("deliveries count mismatch");
|
|
117
|
+
const withdrawalAmount = uint(p.withdrawalAmount, 128, "withdrawalAmount"), withdrawalAddress = getAddress(p.withdrawalAddress), f = normalizeFunding(funding);
|
|
118
|
+
const feeAmount = uint(p.feeAmount ?? 0n, 128, "feeAmount");
|
|
119
|
+
const feeRecipient = getAddress(
|
|
120
|
+
p.feeRecipient ?? "0x0000000000000000000000000000000000000000"
|
|
121
|
+
);
|
|
122
|
+
if (feeAmount === 0n !== (BigInt(feeRecipient) === 0n)) throw new Error("invalid fee");
|
|
123
|
+
if (withdrawalAmount === 0n !== (BigInt(withdrawalAddress) === 0n) || os.length === 0 && withdrawalAmount === 0n)
|
|
124
|
+
throw new Error("invalid withdrawal");
|
|
125
|
+
if (ns.length === 0 && (f.amount === 0n || withdrawalAmount !== 0n))
|
|
126
|
+
throw new Error("zero inputs require positive funding and zero withdrawal");
|
|
127
|
+
return {
|
|
128
|
+
...ctx,
|
|
129
|
+
capacity,
|
|
130
|
+
sources,
|
|
131
|
+
nullifiers: ns,
|
|
132
|
+
noteCommitments: os,
|
|
133
|
+
inputCount: ns.length,
|
|
134
|
+
outputCount: os.length,
|
|
135
|
+
sourceCount: sources.length,
|
|
136
|
+
inputTreeIds: pad(
|
|
137
|
+
sources.map((s) => s.treeId),
|
|
138
|
+
capacity
|
|
139
|
+
),
|
|
140
|
+
merkleRoots: pad(
|
|
141
|
+
sources.map((s) => BigInt(s.merkleRoot)),
|
|
142
|
+
capacity
|
|
143
|
+
),
|
|
144
|
+
slotValues: pad([...ns, ...os].map(BigInt), capacity),
|
|
145
|
+
deliveries,
|
|
146
|
+
deliveriesHash: deliveriesHash(deliveries),
|
|
147
|
+
withdrawalAddress,
|
|
148
|
+
withdrawalAmount,
|
|
149
|
+
feeRecipient,
|
|
150
|
+
feeAmount,
|
|
151
|
+
deadline: checkDeadline(c, p.deadline),
|
|
152
|
+
depositAmount: f.amount,
|
|
153
|
+
depositPayer: f.payer,
|
|
154
|
+
funding: f
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function transactPublicInputs(c, p, cs, f = {}) {
|
|
158
|
+
const r = normalizeTransactRequest(c, p, cs, f), h = BigInt(r.deliveriesHash);
|
|
159
|
+
return [
|
|
160
|
+
r.chainId,
|
|
161
|
+
BigInt(r.protocolAddress),
|
|
162
|
+
BigInt(r.tokenAddress),
|
|
163
|
+
BigInt(r.inputCount),
|
|
164
|
+
BigInt(r.outputCount),
|
|
165
|
+
BigInt(r.sourceCount),
|
|
166
|
+
...r.inputTreeIds,
|
|
167
|
+
...r.merkleRoots,
|
|
168
|
+
...r.slotValues,
|
|
169
|
+
h >> 128n,
|
|
170
|
+
h & (1n << 128n) - 1n,
|
|
171
|
+
BigInt(r.withdrawalAddress),
|
|
172
|
+
r.withdrawalAmount,
|
|
173
|
+
r.deadline,
|
|
174
|
+
r.depositAmount,
|
|
175
|
+
BigInt(r.depositPayer),
|
|
176
|
+
BigInt(r.feeRecipient),
|
|
177
|
+
r.feeAmount
|
|
178
|
+
].map(word);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// src/note/aggregate.ts
|
|
182
|
+
import { AbiCoder, Interface, keccak256, ParamType } from "ethers";
|
|
183
|
+
function buildTransactAggregateCalldata(p) {
|
|
184
|
+
const route = selectAggregateRoute(
|
|
185
|
+
dense(p.requests, "requests").map(
|
|
186
|
+
(r) => selectTransactCapacity(r.params.nullifiers.length, r.params.noteCommitments.length)
|
|
187
|
+
)
|
|
188
|
+
);
|
|
189
|
+
const requests = p.requests.map((request) => {
|
|
190
|
+
const r = normalizeTransactRequest(
|
|
191
|
+
{ ...p.context, tokenAddress: request.params.token },
|
|
192
|
+
request.params,
|
|
193
|
+
request.deliveries,
|
|
194
|
+
request.funding
|
|
195
|
+
);
|
|
196
|
+
if (r.capacity > 10) throw Error("aggregate supports C1..C10");
|
|
197
|
+
validateFundingSubmission(r.funding, p.caller, p.context.now);
|
|
198
|
+
return {
|
|
199
|
+
...request,
|
|
200
|
+
params: { ...request.params, feeRecipient: r.feeRecipient, feeAmount: r.feeAmount }
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
const approvalRequirements = [];
|
|
204
|
+
for (const request of requests) {
|
|
205
|
+
const funding = normalizeFunding(request.funding);
|
|
206
|
+
if (funding.amount === 0n) continue;
|
|
207
|
+
const token = request.params.token;
|
|
208
|
+
const existing = approvalRequirements.find(
|
|
209
|
+
(item) => item.token.toLowerCase() === token.toLowerCase() && item.payer.toLowerCase() === funding.payer.toLowerCase()
|
|
210
|
+
);
|
|
211
|
+
if (existing) existing.amount += funding.amount;
|
|
212
|
+
else approvalRequirements.push({ token, payer: funding.payer, amount: funding.amount });
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
data: new Interface(
|
|
216
|
+
invisiProtocolAbi.filter(
|
|
217
|
+
(item) => item.type === "function" && item.name === "transact" && item.inputs[1]?.type === "tuple[]"
|
|
218
|
+
)
|
|
219
|
+
).encodeFunctionData("transact", [p.proof, requests]),
|
|
220
|
+
capacity: route.capacity,
|
|
221
|
+
approvalRequirements
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function aggregateMemberRequestHash(c, r) {
|
|
225
|
+
const capacity = selectTransactCapacity(
|
|
226
|
+
r.params.nullifiers.length,
|
|
227
|
+
r.params.noteCommitments.length
|
|
228
|
+
);
|
|
229
|
+
if (capacity > 10) throw Error("aggregate supports C1..C10");
|
|
230
|
+
return keccak256(
|
|
231
|
+
AbiCoder.defaultAbiCoder().encode(
|
|
232
|
+
["bytes32", "uint256", "bytes32[]"].map((parameter) => ParamType.from(parameter)),
|
|
233
|
+
[
|
|
234
|
+
keccak256(new TextEncoder().encode("InvisiAtomicBatchMemberV1")),
|
|
235
|
+
BigInt(capacity),
|
|
236
|
+
transactPublicInputs(c, r.params, r.deliveries, r.funding)
|
|
237
|
+
]
|
|
238
|
+
)
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
function aggregatePublicInputs(c, requests) {
|
|
242
|
+
selectAggregateRoute(
|
|
243
|
+
dense(requests, "requests").map(
|
|
244
|
+
(r) => selectTransactCapacity(r.params.nullifiers.length, r.params.noteCommitments.length)
|
|
245
|
+
)
|
|
246
|
+
);
|
|
247
|
+
return requests.flatMap((r) => {
|
|
248
|
+
const context = { ...c, tokenAddress: r.params.token };
|
|
249
|
+
aggregateMemberRequestHash(context, r);
|
|
250
|
+
return [
|
|
251
|
+
word(
|
|
252
|
+
BigInt(
|
|
253
|
+
selectTransactCapacity(
|
|
254
|
+
r.params.nullifiers.length,
|
|
255
|
+
r.params.noteCommitments.length
|
|
256
|
+
)
|
|
257
|
+
)
|
|
258
|
+
),
|
|
259
|
+
...transactPublicInputs(context, r.params, r.deliveries, r.funding)
|
|
260
|
+
];
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function encodeAggregateFundingTypedData(c, r) {
|
|
264
|
+
const f = normalizeFunding(r.funding);
|
|
265
|
+
if (f.amount === 0n) throw new Error("funding authorization requires positive deposit");
|
|
266
|
+
return {
|
|
267
|
+
domain: getEIP712Domain(c),
|
|
268
|
+
primaryType: "FundTransact",
|
|
269
|
+
types: { FundTransact: fundingFields },
|
|
270
|
+
message: {
|
|
271
|
+
requestHash: aggregateMemberRequestHash(c, r),
|
|
272
|
+
payer: f.payer,
|
|
273
|
+
amount: f.amount,
|
|
274
|
+
sigNonce: f.sigNonce,
|
|
275
|
+
deadline: f.deadline
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// src/note/calldata.ts
|
|
281
|
+
import { Interface as Interface2 } from "ethers";
|
|
282
|
+
function buildTransactCalldata(p) {
|
|
283
|
+
const r = normalizeTransactRequest(p.context, p.params, p.deliveries, p.funding);
|
|
284
|
+
validateFundingSubmission(r.funding, p.caller, p.context.now);
|
|
285
|
+
const request = {
|
|
286
|
+
params: {
|
|
287
|
+
token: r.tokenAddress,
|
|
288
|
+
sources: r.sources,
|
|
289
|
+
nullifiers: r.nullifiers,
|
|
290
|
+
noteCommitments: r.noteCommitments,
|
|
291
|
+
withdrawalAddress: r.withdrawalAddress,
|
|
292
|
+
withdrawalAmount: r.withdrawalAmount,
|
|
293
|
+
deadline: r.deadline,
|
|
294
|
+
feeRecipient: r.feeRecipient,
|
|
295
|
+
feeAmount: r.feeAmount
|
|
296
|
+
},
|
|
297
|
+
deliveries: p.deliveries,
|
|
298
|
+
funding: r.funding
|
|
299
|
+
};
|
|
300
|
+
const abi = invisiProtocolAbi.filter(
|
|
301
|
+
(item) => item.type === "function" && item.name === "transact" && item.inputs.length === 2 && item.inputs[1]?.type === "tuple"
|
|
302
|
+
);
|
|
303
|
+
const data = new Interface2(abi).encodeFunctionData("transact", [p.proof, request]);
|
|
304
|
+
return { data, capacity: r.capacity, approveAmount: r.depositAmount };
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// src/note/funding.ts
|
|
308
|
+
import { walletAuthorizationTypedData } from "@invisi-labs/primitives";
|
|
309
|
+
import { AbiCoder as AbiCoder2, keccak256 as keccak2562, ParamType as ParamType2 } from "ethers";
|
|
310
|
+
|
|
311
|
+
// src/note/abi-tuples.ts
|
|
312
|
+
var singleTuple = [
|
|
313
|
+
"(address token,bytes32 merkleRoot,bytes32[] nullifiers,bytes32[] noteCommitments,uint256 inputTreeId,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline,address feeRecipient,uint256 feeAmount)"
|
|
314
|
+
][0];
|
|
315
|
+
var crossTuple = [
|
|
316
|
+
"(address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32[] noteCommitments,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline,address feeRecipient,uint256 feeAmount)"
|
|
317
|
+
][0];
|
|
318
|
+
|
|
319
|
+
// src/note/funding.ts
|
|
320
|
+
function encodeTransactTypedData(c, p, deliveries, f = {}) {
|
|
321
|
+
const r = normalizeTransactRequest(c, p, deliveries, f);
|
|
322
|
+
return walletAuthorizationTypedData({
|
|
323
|
+
context: { chainId: r.chainId, protocolAddress: BigInt(r.protocolAddress) },
|
|
324
|
+
operation: "transact",
|
|
325
|
+
capacity: r.capacity,
|
|
326
|
+
words: transactPublicInputs(c, p, deliveries, f).map(BigInt)
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
function transactFundingRequestHash(proof, p, cs) {
|
|
330
|
+
const single = {
|
|
331
|
+
token: p.token,
|
|
332
|
+
merkleRoot: p.sources[0]?.merkleRoot ?? word(0n),
|
|
333
|
+
nullifiers: p.nullifiers,
|
|
334
|
+
noteCommitments: p.noteCommitments,
|
|
335
|
+
inputTreeId: p.sources[0]?.treeId ?? 0n,
|
|
336
|
+
withdrawalAddress: p.withdrawalAddress,
|
|
337
|
+
withdrawalAmount: p.withdrawalAmount,
|
|
338
|
+
deadline: p.deadline,
|
|
339
|
+
feeRecipient: p.feeRecipient ?? "0x0000000000000000000000000000000000000000",
|
|
340
|
+
feeAmount: p.feeAmount ?? 0n
|
|
341
|
+
};
|
|
342
|
+
return p.sources.length > 1 ? keccak2562(
|
|
343
|
+
AbiCoder2.defaultAbiCoder().encode(
|
|
344
|
+
[{ type: "bytes32" }, { type: "bytes32" }, crossTuple, { type: "bytes32" }].map(
|
|
345
|
+
(parameter) => ParamType2.from(parameter)
|
|
346
|
+
),
|
|
347
|
+
[
|
|
348
|
+
keccak2562(new TextEncoder().encode("InvisiCrossTreeTransact")),
|
|
349
|
+
keccak2562(proof),
|
|
350
|
+
{ ...p, feeRecipient: single.feeRecipient, feeAmount: single.feeAmount },
|
|
351
|
+
deliveriesHash(cs)
|
|
352
|
+
]
|
|
353
|
+
)
|
|
354
|
+
) : keccak2562(
|
|
355
|
+
AbiCoder2.defaultAbiCoder().encode(
|
|
356
|
+
[{ type: "bytes32" }, singleTuple, { type: "bytes32" }].map(
|
|
357
|
+
(parameter) => ParamType2.from(parameter)
|
|
358
|
+
),
|
|
359
|
+
[keccak2562(proof), single, deliveriesHash(cs)]
|
|
360
|
+
)
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
function encodeTransactFundingTypedData(c, proof, p, cs, funding) {
|
|
364
|
+
normalizeTransactRequest(c, p, cs, funding);
|
|
365
|
+
const f = normalizeFunding(funding);
|
|
366
|
+
if (f.amount === 0n) throw new Error("funding authorization requires positive deposit");
|
|
367
|
+
return {
|
|
368
|
+
domain: getEIP712Domain(c),
|
|
369
|
+
primaryType: "FundTransact",
|
|
370
|
+
types: { FundTransact: fundingFields },
|
|
371
|
+
message: {
|
|
372
|
+
requestHash: transactFundingRequestHash(proof, p, cs),
|
|
373
|
+
payer: f.payer,
|
|
374
|
+
amount: f.amount,
|
|
375
|
+
sigNonce: f.sigNonce,
|
|
376
|
+
deadline: f.deadline
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// src/note/shield.ts
|
|
382
|
+
import { computeNoteCommitment } from "@invisi-labs/primitives";
|
|
383
|
+
import { AbiCoder as AbiCoder3, getAddress as getAddress2, Interface as Interface3, keccak256 as keccak2563, ParamType as ParamType3 } from "ethers";
|
|
384
|
+
async function validateShieldRequest(p) {
|
|
385
|
+
normalizeContext(p.context);
|
|
386
|
+
if (getAddress2(p.params.token) !== getAddress2(p.context.tokenAddress))
|
|
387
|
+
throw new Error("request token mismatch");
|
|
388
|
+
known(p.params, ["token", "noteCommitments", "deadline", "feeRecipient", "feeAmount"]);
|
|
389
|
+
checkDeadline(p.context, p.params.deadline);
|
|
390
|
+
const outputs = dense(p.outputs, "outputs"), commitments = notes(p.params.noteCommitments, "noteCommitments"), cs = dense(p.deliveries, "deliveries"), f = normalizeFunding(p.funding);
|
|
391
|
+
if (outputs.length < 1 || outputs.length > 10 || commitments.length !== outputs.length || cs.length !== outputs.length)
|
|
392
|
+
throw new Error("shield requires 1..10 outputs and matching deliveries");
|
|
393
|
+
let total = 0n;
|
|
394
|
+
for (const [i, o] of outputs.entries()) {
|
|
395
|
+
known(o, ["identity", "amount"], "output");
|
|
396
|
+
uint(o.amount, 128, "amount");
|
|
397
|
+
if (o.amount === 0n) throw new Error("amount must be positive");
|
|
398
|
+
field(o.identity);
|
|
399
|
+
normalizeOpaqueDelivery(cs[i], { allowEmpty: true });
|
|
400
|
+
if (await computeNoteCommitment(
|
|
401
|
+
p.context.chainId,
|
|
402
|
+
BigInt(p.context.protocolAddress),
|
|
403
|
+
o.identity,
|
|
404
|
+
BigInt(p.context.tokenAddress),
|
|
405
|
+
o.amount
|
|
406
|
+
) !== commitments[i])
|
|
407
|
+
throw new Error("output commitment mismatch");
|
|
408
|
+
total += o.amount;
|
|
409
|
+
}
|
|
410
|
+
if (total + normalizeFee(p.params).feeAmount !== f.amount)
|
|
411
|
+
throw new Error("funding must equal output total plus fee");
|
|
412
|
+
return f;
|
|
413
|
+
}
|
|
414
|
+
async function encodeShieldFundingTypedData(p) {
|
|
415
|
+
const f = await validateShieldRequest(p);
|
|
416
|
+
return {
|
|
417
|
+
domain: getEIP712Domain(p.context),
|
|
418
|
+
primaryType: "FundShield",
|
|
419
|
+
types: { FundShield: fundingFields },
|
|
420
|
+
message: {
|
|
421
|
+
requestHash: shieldFundingRequestHash(p.params, p.outputs, p.deliveries),
|
|
422
|
+
payer: f.payer,
|
|
423
|
+
amount: f.amount,
|
|
424
|
+
sigNonce: f.sigNonce,
|
|
425
|
+
deadline: f.deadline
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
async function buildShieldCalldata(p) {
|
|
430
|
+
const f = await validateShieldRequest(p);
|
|
431
|
+
validateFundingSubmission(f, p.caller, p.context.now);
|
|
432
|
+
return {
|
|
433
|
+
data: new Interface3(invisiProtocolAbi).encodeFunctionData("shield", [
|
|
434
|
+
{ ...p.params, ...normalizeFee(p.params) },
|
|
435
|
+
p.outputs,
|
|
436
|
+
p.deliveries,
|
|
437
|
+
f
|
|
438
|
+
]),
|
|
439
|
+
approveAmount: f.amount
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
function shieldFundingRequestHash(params, outputs, cs) {
|
|
443
|
+
const outputHash = keccak2563(
|
|
444
|
+
AbiCoder3.defaultAbiCoder().encode(
|
|
445
|
+
["(bytes32 identity,uint256 amount)[]"].map((parameter) => ParamType3.from(parameter)),
|
|
446
|
+
[outputs]
|
|
447
|
+
)
|
|
448
|
+
);
|
|
449
|
+
return keccak2563(
|
|
450
|
+
AbiCoder3.defaultAbiCoder().encode(
|
|
451
|
+
[
|
|
452
|
+
"bytes32",
|
|
453
|
+
"(address token,bytes32[] noteCommitments,uint256 deadline,address feeRecipient,uint256 feeAmount)",
|
|
454
|
+
"bytes32",
|
|
455
|
+
"bytes32"
|
|
456
|
+
].map((parameter) => ParamType3.from(parameter)),
|
|
457
|
+
[
|
|
458
|
+
keccak2563(new TextEncoder().encode("InvisiShield")),
|
|
459
|
+
{ ...params, ...normalizeFee(params) },
|
|
460
|
+
outputHash,
|
|
461
|
+
deliveriesHash(cs)
|
|
462
|
+
]
|
|
463
|
+
)
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
export {
|
|
468
|
+
AGGREGATE_ROUTES,
|
|
469
|
+
selectAggregateRoute,
|
|
470
|
+
TRANSACT_CAPACITIES,
|
|
471
|
+
selectTransactCapacity,
|
|
472
|
+
normalizeTransactRequest,
|
|
473
|
+
transactPublicInputs,
|
|
474
|
+
buildTransactAggregateCalldata,
|
|
475
|
+
aggregateMemberRequestHash,
|
|
476
|
+
aggregatePublicInputs,
|
|
477
|
+
encodeAggregateFundingTypedData,
|
|
478
|
+
buildTransactCalldata,
|
|
479
|
+
encodeTransactTypedData,
|
|
480
|
+
transactFundingRequestHash,
|
|
481
|
+
encodeTransactFundingTypedData,
|
|
482
|
+
validateShieldRequest,
|
|
483
|
+
encodeShieldFundingTypedData,
|
|
484
|
+
buildShieldCalldata,
|
|
485
|
+
shieldFundingRequestHash
|
|
486
|
+
};
|
|
487
|
+
//# sourceMappingURL=chunk-MVQQD5W5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/note/aggregate-routes.ts","../src/note/request.ts","../src/note/aggregate.ts","../src/note/calldata.ts","../src/note/funding.ts","../src/note/abi-tuples.ts","../src/note/shield.ts"],"sourcesContent":["export interface AggregateRoute {\n kind: \"dedicated\" | \"mixed\";\n capacity: number;\n count: number;\n name: string;\n publicInputCount: number;\n}\nexport const AGGREGATE_ROUTES: readonly AggregateRoute[] = Object.freeze(\n [\n ...Array.from({ length: 10 }, (_, i) => i + 1).flatMap((capacity) =>\n [1, 2, 5].map((count) => ({\n kind: \"dedicated\" as const,\n capacity,\n count,\n name: `transact_aggregate_${capacity}_${count}`,\n publicInputCount: (17 + 3 * capacity) * count + 1,\n }))\n ),\n ...[2, 3, 4, 5].map((count) => ({\n kind: \"mixed\" as const,\n capacity: 0,\n count,\n name: `transact_aggregate_mixed_1_5_${count}`,\n publicInputCount: 33 * count + 5,\n })),\n ].map((route) => Object.freeze(route))\n);\n/** Select the canonical immutable route without reordering requests or changing member capacities. */\nexport function selectAggregateRoute(capacities: readonly number[]): AggregateRoute {\n if (\n !capacities.length ||\n Array.from(\n { length: capacities.length },\n (_, i) => Number.isInteger(capacities[i]) && capacities[i]! >= 1 && capacities[i]! <= 10\n ).some((v) => !v)\n )\n throw Error(\"unsupported aggregate capacities\");\n const count = capacities.length,\n dedicated = AGGREGATE_ROUTES.find(\n (r) => r.kind === \"dedicated\" && r.capacity === capacities[0] && r.count === count\n );\n if (dedicated && capacities.every((c) => c === capacities[0])) return dedicated;\n const mixed = AGGREGATE_ROUTES.find((r) => r.kind === \"mixed\" && r.count === count);\n if (mixed && capacities.every((c) => c <= 5)) return mixed;\n throw Error(\"unsupported aggregate capacity/count combination\");\n}\n","import { getAddress } from \"ethers\";\nimport type { Hex } from \"../contracts/index\";\nimport { type CrossTreeTransactParams, type Delivery } from \"../contracts/index\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n known,\n normalizeContext,\n normalizeFunding,\n normalizeOpaqueDelivery,\n normalizeSources,\n notes,\n pad,\n uint,\n word,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\n\nexport const TRANSACT_CAPACITIES = [\n 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150,\n 160, 170, 180, 190,\n] as const;\n\nexport type TransactCapacity = (typeof TRANSACT_CAPACITIES)[number];\n\nexport function selectTransactCapacity(inputs: number, outputs: number): TransactCapacity {\n if (\n !Number.isInteger(inputs) ||\n !Number.isInteger(outputs) ||\n inputs < 0 ||\n outputs < 0 ||\n inputs + outputs < 1 ||\n (inputs === 0 && outputs < 2) ||\n inputs + outputs > 190\n )\n throw new Error(\"unsupported transact shape\");\n return TRANSACT_CAPACITIES.find((n) => inputs + outputs <= n)!;\n}\n\nexport type TransactRequestParams = CrossTreeTransactParams;\n\nexport function normalizeTransactRequest(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n funding: FundingInput = {}\n) {\n const ctx = normalizeContext(c);\n if ((getAddress(p.token) as Hex) !== ctx.tokenAddress)\n throw new Error(\"request token mismatch\");\n known(p, [\n \"token\",\n \"sources\",\n \"nullifiers\",\n \"noteCommitments\",\n \"withdrawalAddress\",\n \"withdrawalAmount\",\n \"deadline\",\n \"feeRecipient\",\n \"feeAmount\",\n ]);\n const ns = notes(p.nullifiers, \"nullifiers\"),\n os = notes(p.noteCommitments, \"noteCommitments\"),\n capacity = selectTransactCapacity(ns.length, os.length);\n const sources = normalizeSources(p.sources, ns.length, capacity),\n deliveries = dense(cs, \"deliveries\").map((v) =>\n normalizeOpaqueDelivery(v, { allowEmpty: true })\n );\n if (deliveries.length !== os.length) throw new Error(\"deliveries count mismatch\");\n const withdrawalAmount = uint(p.withdrawalAmount, 128, \"withdrawalAmount\"),\n withdrawalAddress = getAddress(p.withdrawalAddress) as Hex,\n f = normalizeFunding(funding);\n const feeAmount = uint(p.feeAmount ?? 0n, 128, \"feeAmount\");\n const feeRecipient = getAddress(\n p.feeRecipient ?? \"0x0000000000000000000000000000000000000000\"\n ) as Hex;\n if ((feeAmount === 0n) !== (BigInt(feeRecipient) === 0n)) throw new Error(\"invalid fee\");\n if (\n (withdrawalAmount === 0n) !== (BigInt(withdrawalAddress) === 0n) ||\n (os.length === 0 && withdrawalAmount === 0n)\n )\n throw new Error(\"invalid withdrawal\");\n if (ns.length === 0 && (f.amount === 0n || withdrawalAmount !== 0n))\n throw new Error(\"zero inputs require positive funding and zero withdrawal\");\n return {\n ...ctx,\n capacity,\n sources,\n nullifiers: ns,\n noteCommitments: os,\n inputCount: ns.length,\n outputCount: os.length,\n sourceCount: sources.length,\n inputTreeIds: pad(\n sources.map((s) => s.treeId),\n capacity\n ),\n merkleRoots: pad(\n sources.map((s) => BigInt(s.merkleRoot)),\n capacity\n ),\n slotValues: pad([...ns, ...os].map(BigInt), capacity),\n deliveries,\n deliveriesHash: deliveriesHash(deliveries),\n withdrawalAddress,\n withdrawalAmount,\n feeRecipient,\n feeAmount,\n deadline: checkDeadline(c, p.deadline),\n depositAmount: f.amount,\n depositPayer: f.payer,\n funding: f,\n };\n}\n\nexport function transactPublicInputs(\n c: TransactionContext,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = normalizeTransactRequest(c, p, cs, f),\n h = BigInt(r.deliveriesHash);\n return [\n r.chainId,\n BigInt(r.protocolAddress),\n BigInt(r.tokenAddress),\n BigInt(r.inputCount),\n BigInt(r.outputCount),\n BigInt(r.sourceCount),\n ...r.inputTreeIds,\n ...r.merkleRoots,\n ...r.slotValues,\n h >> 128n,\n h & ((1n << 128n) - 1n),\n BigInt(r.withdrawalAddress),\n r.withdrawalAmount,\n r.deadline,\n r.depositAmount,\n BigInt(r.depositPayer),\n BigInt(r.feeRecipient),\n r.feeAmount,\n ].map(word);\n}\n","import { selectAggregateRoute } from \"./aggregate-routes\";\nimport { AbiCoder, Interface, keccak256, ParamType } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport { invisiProtocolAbi, type TransactRequest } from \"../contracts/index\";\nimport {\n dense,\n fundingFields,\n getEIP712Domain,\n normalizeFunding,\n validateFundingSubmission,\n word,\n type DeploymentContext,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nimport { normalizeTransactRequest, selectTransactCapacity, transactPublicInputs } from \"./request\";\n\nexport interface BuildTransactAggregateCalldataParams {\n context: DeploymentContext & { now?: bigint };\n proof: Hex;\n requests: readonly TransactRequest[];\n caller?: Address;\n}\n\nexport function buildTransactAggregateCalldata(p: BuildTransactAggregateCalldataParams) {\n const route = selectAggregateRoute(\n dense<TransactRequest>(p.requests, \"requests\").map((r) =>\n selectTransactCapacity(r.params.nullifiers.length, r.params.noteCommitments.length)\n )\n );\n const requests = p.requests.map((request) => {\n const r = normalizeTransactRequest(\n { ...p.context, tokenAddress: request.params.token },\n request.params,\n request.deliveries,\n request.funding\n );\n if (r.capacity > 10) throw Error(\"aggregate supports C1..C10\");\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n return {\n ...request,\n params: { ...request.params, feeRecipient: r.feeRecipient, feeAmount: r.feeAmount },\n };\n });\n const approvalRequirements: { token: Address; payer: Address; amount: bigint }[] = [];\n for (const request of requests) {\n const funding = normalizeFunding(request.funding);\n if (funding.amount === 0n) continue;\n const token = request.params.token;\n const existing = approvalRequirements.find(\n (item) =>\n item.token.toLowerCase() === token.toLowerCase() &&\n item.payer.toLowerCase() === funding.payer.toLowerCase()\n );\n if (existing) existing.amount += funding.amount;\n else approvalRequirements.push({ token, payer: funding.payer, amount: funding.amount });\n }\n return {\n data: new Interface(\n invisiProtocolAbi.filter(\n (item) =>\n item.type === \"function\" &&\n item.name === \"transact\" &&\n item.inputs[1]?.type === \"tuple[]\"\n )\n ).encodeFunctionData(\"transact\", [p.proof, requests]) as Hex,\n capacity: route.capacity,\n approvalRequirements,\n };\n}\n\nexport type AggregateMemberInput = Pick<TransactRequest, \"params\" | \"deliveries\"> & {\n funding?: FundingInput;\n};\n\n/** Atomic aggregate funding binds the member statement rather than the aggregate proof bytes. */\nexport function aggregateMemberRequestHash(c: TransactionContext, r: AggregateMemberInput) {\n const capacity = selectTransactCapacity(\n r.params.nullifiers.length,\n r.params.noteCommitments.length\n );\n if (capacity > 10) throw Error(\"aggregate supports C1..C10\");\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"bytes32\", \"uint256\", \"bytes32[]\"].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiAtomicBatchMemberV1\")),\n BigInt(capacity),\n transactPublicInputs(c, r.params, r.deliveries, r.funding),\n ]\n ) as Hex\n ) as Hex;\n}\n\n/** Router adapter business words (58 per member), not the aggregate circuit statement. */\nexport function aggregatePublicInputs(\n c: TransactionContext,\n requests: readonly AggregateMemberInput[]\n) {\n selectAggregateRoute(\n dense<AggregateMemberInput>(requests, \"requests\").map((r) =>\n selectTransactCapacity(r.params.nullifiers.length, r.params.noteCommitments.length)\n )\n );\n return requests.flatMap((r) => {\n const context = { ...c, tokenAddress: r.params.token };\n aggregateMemberRequestHash(context, r);\n return [\n word(\n BigInt(\n selectTransactCapacity(\n r.params.nullifiers.length,\n r.params.noteCommitments.length\n )\n )\n ),\n ...transactPublicInputs(context, r.params, r.deliveries, r.funding),\n ];\n });\n}\n\nexport function encodeAggregateFundingTypedData(c: TransactionContext, r: AggregateMemberInput) {\n const f = normalizeFunding(r.funding);\n if (f.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: aggregateMemberRequestHash(c, r),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\n","import { Interface } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport { invisiProtocolAbi, type Delivery, type TransactRequest } from \"../contracts/index\";\nimport {\n validateFundingSubmission,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nimport { normalizeTransactRequest, TransactRequestParams } from \"./request\";\n\nexport interface BuildTransactCalldataParams {\n context: TransactionContext;\n proof: Hex;\n params: TransactRequestParams;\n deliveries: readonly Delivery[];\n funding?: FundingInput;\n caller?: Address;\n}\n\nexport function buildTransactCalldata(p: BuildTransactCalldataParams) {\n const r = normalizeTransactRequest(p.context, p.params, p.deliveries, p.funding);\n validateFundingSubmission(r.funding, p.caller, p.context.now);\n const request: TransactRequest = {\n params: {\n token: r.tokenAddress,\n sources: r.sources,\n nullifiers: r.nullifiers,\n noteCommitments: r.noteCommitments,\n withdrawalAddress: r.withdrawalAddress,\n withdrawalAmount: r.withdrawalAmount,\n deadline: r.deadline,\n feeRecipient: r.feeRecipient,\n feeAmount: r.feeAmount,\n },\n deliveries: p.deliveries,\n funding: r.funding,\n };\n const abi = invisiProtocolAbi.filter(\n (item) =>\n item.type === \"function\" &&\n item.name === \"transact\" &&\n item.inputs.length === 2 &&\n item.inputs[1]?.type === \"tuple\"\n );\n const data = new Interface(abi).encodeFunctionData(\"transact\", [p.proof, request]) as Hex;\n return { data, capacity: r.capacity, approveAmount: r.depositAmount };\n}\n","import { walletAuthorizationTypedData } from \"@invisi-labs/primitives\";\nimport { AbiCoder, keccak256, ParamType } from \"ethers\";\nimport type { Hex } from \"../contracts/index\";\nimport { type Delivery } from \"../contracts/index\";\nimport {\n deliveriesHash,\n fundingFields,\n getEIP712Domain,\n normalizeFunding,\n word,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\nimport { crossTuple, singleTuple } from \"./abi-tuples\";\nimport { normalizeTransactRequest, transactPublicInputs, TransactRequestParams } from \"./request\";\n\nexport function encodeTransactTypedData(\n c: TransactionContext,\n p: TransactRequestParams,\n deliveries: readonly Delivery[],\n f: FundingInput = {}\n) {\n const r = normalizeTransactRequest(c, p, deliveries, f);\n return walletAuthorizationTypedData({\n context: { chainId: r.chainId, protocolAddress: BigInt(r.protocolAddress) },\n operation: \"transact\",\n capacity: r.capacity,\n words: transactPublicInputs(c, p, deliveries, f).map(BigInt),\n });\n}\n\nexport function transactFundingRequestHash(\n proof: Hex,\n p: TransactRequestParams,\n cs: readonly Delivery[]\n) {\n const single = {\n token: p.token,\n merkleRoot: p.sources[0]?.merkleRoot ?? word(0n),\n nullifiers: p.nullifiers,\n noteCommitments: p.noteCommitments,\n inputTreeId: p.sources[0]?.treeId ?? 0n,\n withdrawalAddress: p.withdrawalAddress,\n withdrawalAmount: p.withdrawalAmount,\n deadline: p.deadline,\n feeRecipient: p.feeRecipient ?? \"0x0000000000000000000000000000000000000000\",\n feeAmount: p.feeAmount ?? 0n,\n };\n return p.sources.length > 1\n ? (keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, { type: \"bytes32\" }, crossTuple, { type: \"bytes32\" }].map(\n (parameter) => ParamType.from(parameter)\n ),\n [\n keccak256(new TextEncoder().encode(\"InvisiCrossTreeTransact\")),\n keccak256(proof),\n { ...p, feeRecipient: single.feeRecipient, feeAmount: single.feeAmount },\n deliveriesHash(cs),\n ]\n ) as Hex\n ) as Hex)\n : (keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [{ type: \"bytes32\" }, singleTuple, { type: \"bytes32\" }].map((parameter) =>\n ParamType.from(parameter)\n ),\n [keccak256(proof), single, deliveriesHash(cs)]\n ) as Hex\n ) as Hex);\n}\n\nexport function encodeTransactFundingTypedData(\n c: TransactionContext,\n proof: Hex,\n p: TransactRequestParams,\n cs: readonly Delivery[],\n funding: FundingInput\n) {\n normalizeTransactRequest(c, p, cs, funding);\n const f = normalizeFunding(funding);\n if (f.amount === 0n) throw new Error(\"funding authorization requires positive deposit\");\n return {\n domain: getEIP712Domain(c),\n primaryType: \"FundTransact\" as const,\n types: { FundTransact: fundingFields },\n message: {\n requestHash: transactFundingRequestHash(proof, p, cs),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\n","export const singleTuple = [\n \"(address token,bytes32 merkleRoot,bytes32[] nullifiers,bytes32[] noteCommitments,uint256 inputTreeId,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n][0]!;\n\nexport const crossTuple = [\n \"(address token,(uint256 treeId,bytes32 merkleRoot)[] sources,bytes32[] nullifiers,bytes32[] noteCommitments,address withdrawalAddress,uint256 withdrawalAmount,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n][0]!;\n","import { computeNoteCommitment } from \"@invisi-labs/primitives\";\nimport { AbiCoder, getAddress, Interface, keccak256, ParamType } from \"ethers\";\nimport type { Address, Hex } from \"../contracts/index\";\nimport {\n invisiProtocolAbi,\n type Delivery,\n type ShieldOutput,\n type ShieldParams,\n} from \"../contracts/index\";\nimport { normalizeFee } from \"../fees/fee\";\nimport {\n checkDeadline,\n deliveriesHash,\n dense,\n field,\n fundingFields,\n getEIP712Domain,\n known,\n normalizeContext,\n normalizeFunding,\n normalizeOpaqueDelivery,\n notes,\n uint,\n validateFundingSubmission,\n type FundingInput,\n type TransactionContext,\n} from \"../validation\";\n\nexport interface BuildShieldCalldataParams {\n context: TransactionContext;\n params: ShieldParams;\n outputs: readonly ShieldOutput[];\n deliveries: readonly Delivery[];\n funding: FundingInput;\n caller?: Address;\n}\n\nexport async function validateShieldRequest(p: BuildShieldCalldataParams) {\n normalizeContext(p.context);\n if ((getAddress(p.params.token) as Hex) !== (getAddress(p.context.tokenAddress) as Hex))\n throw new Error(\"request token mismatch\");\n known(p.params, [\"token\", \"noteCommitments\", \"deadline\", \"feeRecipient\", \"feeAmount\"]);\n checkDeadline(p.context, p.params.deadline);\n const outputs = dense(p.outputs, \"outputs\"),\n commitments = notes(p.params.noteCommitments, \"noteCommitments\"),\n cs = dense(p.deliveries, \"deliveries\"),\n f = normalizeFunding(p.funding);\n if (\n outputs.length < 1 ||\n outputs.length > 10 ||\n commitments.length !== outputs.length ||\n cs.length !== outputs.length\n )\n throw new Error(\"shield requires 1..10 outputs and matching deliveries\");\n let total = 0n;\n for (const [i, o] of outputs.entries()) {\n known(o, [\"identity\", \"amount\"], \"output\");\n uint(o.amount, 128, \"amount\");\n if (o.amount === 0n) throw new Error(\"amount must be positive\");\n field(o.identity);\n normalizeOpaqueDelivery(cs[i]!, { allowEmpty: true });\n if (\n (await computeNoteCommitment(\n p.context.chainId,\n BigInt(p.context.protocolAddress),\n o.identity,\n BigInt(p.context.tokenAddress),\n o.amount\n )) !== commitments[i]\n )\n throw new Error(\"output commitment mismatch\");\n total += o.amount;\n }\n if (total + normalizeFee(p.params).feeAmount !== f.amount)\n throw new Error(\"funding must equal output total plus fee\");\n return f;\n}\n\nexport async function encodeShieldFundingTypedData(p: BuildShieldCalldataParams) {\n const f = await validateShieldRequest(p);\n return {\n domain: getEIP712Domain(p.context),\n primaryType: \"FundShield\" as const,\n types: { FundShield: fundingFields },\n message: {\n requestHash: shieldFundingRequestHash(p.params, p.outputs, p.deliveries),\n payer: f.payer,\n amount: f.amount,\n sigNonce: f.sigNonce,\n deadline: f.deadline,\n },\n };\n}\n\nexport async function buildShieldCalldata(p: BuildShieldCalldataParams) {\n const f = await validateShieldRequest(p);\n validateFundingSubmission(f, p.caller, p.context.now);\n return {\n data: new Interface(invisiProtocolAbi).encodeFunctionData(\"shield\", [\n { ...p.params, ...normalizeFee(p.params) },\n p.outputs,\n p.deliveries,\n f,\n ]) as Hex,\n approveAmount: f.amount,\n };\n}\n\nexport function shieldFundingRequestHash(\n params: ShieldParams,\n outputs: readonly ShieldOutput[],\n cs: readonly Delivery[]\n) {\n const outputHash = keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\"(bytes32 identity,uint256 amount)[]\"].map((parameter) => ParamType.from(parameter)),\n [outputs]\n ) as Hex\n ) as Hex;\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n [\n \"bytes32\",\n \"(address token,bytes32[] noteCommitments,uint256 deadline,address feeRecipient,uint256 feeAmount)\",\n \"bytes32\",\n \"bytes32\",\n ].map((parameter) => ParamType.from(parameter)),\n [\n keccak256(new TextEncoder().encode(\"InvisiShield\")),\n { ...params, ...normalizeFee(params) },\n outputHash,\n deliveriesHash(cs),\n ]\n ) as Hex\n ) as Hex;\n}\n"],"mappings":"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","names":["Interface","Interface","AbiCoder","keccak256","ParamType","keccak256","AbiCoder","ParamType","AbiCoder","getAddress","Interface","keccak256","ParamType","getAddress","Interface","keccak256","AbiCoder","ParamType"]}
|