@sig-net/midnight 0.0.8 → 0.10.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 +254 -112
- package/dist/index.d.ts +4 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -11
- package/dist/index.js.map +1 -1
- package/dist/managed/compiler/contract-info.json +88 -0
- package/dist/managed/compiler/contract-manifest.json +8 -8
- package/dist/managed/contract/index.d.ts +12 -0
- package/dist/managed/contract/index.js +328 -54
- package/dist/managed/contract/index.js.map +1 -1
- package/dist/signature-requests-state-reader.d.ts.map +1 -1
- package/dist/signature-requests-state-reader.js +2 -1
- package/dist/signature-requests-state-reader.js.map +1 -1
- package/dist/signature-response-verification.d.ts +1 -1
- package/dist/signature-response-verification.d.ts.map +1 -1
- package/dist/signature-response-verification.js +1 -1
- package/dist/signature-response-verification.js.map +1 -1
- package/dist/signet-evtype2tx-requests.d.ts +247 -0
- package/dist/signet-evtype2tx-requests.d.ts.map +1 -0
- package/dist/signet-evtype2tx-requests.js +371 -0
- package/dist/signet-evtype2tx-requests.js.map +1 -0
- package/dist/signet-request-response-reader.d.ts +1 -1
- package/dist/signet-request-response-reader.d.ts.map +1 -1
- package/dist/signet-request-response-reader.js +1 -1
- package/dist/signet-request-response-reader.js.map +1 -1
- package/dist/signet-requests.d.ts +36 -202
- package/dist/signet-requests.d.ts.map +1 -1
- package/dist/signet-requests.js +31 -300
- package/dist/signet-requests.js.map +1 -1
- package/package.json +1 -1
- package/src/Signet.compact +74 -4
- package/src/circuits.compact +13 -27
package/dist/signet-requests.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
// TypeScript twins of the request-side structs in the Compact
|
|
2
|
-
// `Signet.compact` (same directory)
|
|
1
|
+
// TypeScript twins of the CHAIN-AGNOSTIC request-side structs in the Compact
|
|
2
|
+
// library `Signet.compact` (same directory): the request record, its enums,
|
|
3
|
+
// request ids, and the runtime-descriptor toolkit shared by every tx-params
|
|
4
|
+
// decomposition. Everything specific to the EVM Type-2 decomposition (the
|
|
5
|
+
// only decomposition so far) lives in `signet-evtype2tx-requests.ts`.
|
|
6
|
+
//
|
|
7
|
+
// The shapes MUST stay in lockstep with the Compact structs: the
|
|
3
8
|
// compiler inlines struct types anonymously into each contract's generated
|
|
4
9
|
// managed/contract/index.d.ts, and these named types match them structurally,
|
|
5
10
|
// so ledger reads assign to them without casts.
|
|
6
11
|
//
|
|
7
12
|
// The lockstep is enforced by each consuming contract's simulator tests: the
|
|
8
|
-
// "
|
|
13
|
+
// "test-caller-contract ledger shape" test in packages/test-caller-contract/tests/
|
|
9
14
|
// contract.test.ts assigns the generated `ledger().signBidirectionalEventMap`
|
|
10
15
|
// to the named SignBidirectionalEventLedgerMap type — the assignment itself is
|
|
11
16
|
// the assertion, so any structural drift between the generated managed types
|
|
@@ -13,9 +18,7 @@
|
|
|
13
18
|
//
|
|
14
19
|
// Read more: https://docs.sig.network/ (signet protocol) and the module
|
|
15
20
|
// header in Signet.compact (key derivation, event flow).
|
|
16
|
-
import { CompactTypeBoolean, CompactTypeBytes, CompactTypeEnum, CompactTypeUnsignedInteger,
|
|
17
|
-
import { getAddress, getBytes, Signature, Transaction } from "ethers";
|
|
18
|
-
import { bigintToBytes32, bytesToBigint } from "./ecdsa-attestation.js";
|
|
21
|
+
import { CompactTypeBoolean, CompactTypeBytes, CompactTypeEnum, CompactTypeUnsignedInteger, } from "@midnight-ntwrk/compact-runtime";
|
|
19
22
|
/**
|
|
20
23
|
* Which transaction-param decomposition a request carries (Compact:
|
|
21
24
|
* `enum TxParamType`), as the generated code represents enums: a `number`
|
|
@@ -23,7 +26,7 @@ import { bigintToBytes32, bytesToBigint } from "./ecdsa-attestation.js";
|
|
|
23
26
|
* `enum`) so the values stay structurally `number`.
|
|
24
27
|
*/
|
|
25
28
|
export const TxParamType = {
|
|
26
|
-
/**
|
|
29
|
+
/** `EVMType2TxParams` (signet-evtype2tx-requests.ts): an EIP-1559 EVM transaction. */
|
|
27
30
|
evmType2: 0,
|
|
28
31
|
/**
|
|
29
32
|
* Never emitted — mirrors the Compact-side padding variant that keeps the
|
|
@@ -52,40 +55,37 @@ export const MPCDestination = {
|
|
|
52
55
|
/** Never emitted — the >= 2 variants padding (see {@link TxParamType}). */
|
|
53
56
|
reserved: 1,
|
|
54
57
|
};
|
|
55
|
-
// ----
|
|
58
|
+
// ---- Runtime descriptor toolkit (TS twin of the compiled struct codecs) ----
|
|
56
59
|
//
|
|
57
60
|
// DEVIATION from the "pure circuits are compiled, never re-written in TS"
|
|
58
|
-
// rule (see circuits.compact):
|
|
61
|
+
// rule (see circuits.compact): the request-id circuit is generic over the
|
|
59
62
|
// tx-params type and schema lengths, the Compact compiler cannot export
|
|
60
63
|
// type-parameterized circuits from the top level, and a compiled copy would
|
|
61
64
|
// have to be monomorphized at ONE capacity instantiation — a client
|
|
62
65
|
// contract's choice that never belongs in this client-agnostic package. So
|
|
63
|
-
// the
|
|
66
|
+
// the record descriptor (and the per-decomposition `calculateRequestId`
|
|
67
|
+
// built on it, see signet-evtype2tx-requests.ts) alone gets a TS twin here.
|
|
64
68
|
//
|
|
65
|
-
// It is NOT a hand-port of the hash algorithm:
|
|
69
|
+
// It is NOT a hand-port of the hash algorithm: ids come from the very
|
|
66
70
|
// `persistentHash` runtime builtin that compiled circuits call, over runtime
|
|
67
71
|
// type descriptors mirroring the ones the compiler generates (compare
|
|
68
72
|
// `_calculateRequestId_0` in any consuming contract's
|
|
69
73
|
// managed/contract/index.js). What must stay in lockstep with Signet.compact
|
|
70
74
|
// is exactly what this file already keeps in lockstep — the struct shapes,
|
|
71
|
-
// field by field, in declaration order. Enforced by caller-contract's
|
|
75
|
+
// field by field, in declaration order. Enforced by test-caller-contract's
|
|
72
76
|
// "submitSignatureRequest round-trip" test, which asserts the id computed
|
|
73
77
|
// here equals the ledger map key minted by the REAL compiled contract.
|
|
74
|
-
// Runtime descriptors of the Compact base types the
|
|
75
|
-
// CompactTypeUnsignedInteger takes (maxValue, byte length) — same
|
|
76
|
-
// the compiler emits for Uint<8/64
|
|
78
|
+
// Runtime descriptors of the Compact base types the generic record fields
|
|
79
|
+
// use. CompactTypeUnsignedInteger takes (maxValue, byte length) — same
|
|
80
|
+
// literals the compiler emits for Uint<8/64>. CompactTypeEnum takes
|
|
77
81
|
// (variantCount - 1, byte length); NOTE a 1-variant enum would compile to
|
|
78
82
|
// `CompactTypeEnum(0, 0)` — zero bytes, which the proof server cannot parse
|
|
79
83
|
// inside persistentHash preimages. Every enum therefore carries a padding
|
|
80
84
|
// `reserved` variant so it stays at (1, 1).
|
|
81
|
-
const BYTES_4 = new CompactTypeBytes(4);
|
|
82
|
-
const BYTES_20 = new CompactTypeBytes(20);
|
|
83
85
|
const BYTES_32 = new CompactTypeBytes(32);
|
|
84
86
|
const BYTES_64 = new CompactTypeBytes(64);
|
|
85
87
|
const UINT_8 = new CompactTypeUnsignedInteger(2n ** 8n - 1n, 1);
|
|
86
|
-
const UINT_16 = new CompactTypeUnsignedInteger(2n ** 16n - 1n, 2);
|
|
87
88
|
const UINT_64 = new CompactTypeUnsignedInteger(2n ** 64n - 1n, 8);
|
|
88
|
-
const UINT_128 = new CompactTypeUnsignedInteger(2n ** 128n - 1n, 16);
|
|
89
89
|
const TX_PARAM_TYPE = new CompactTypeEnum(1, 1);
|
|
90
90
|
const MPC_SIGNATURE_ALGORITHM = new CompactTypeEnum(1, 1);
|
|
91
91
|
const MPC_DESTINATION = new CompactTypeEnum(1, 1);
|
|
@@ -110,7 +110,7 @@ const CONTRACT_ADDRESS = {
|
|
|
110
110
|
* @param fields - One runtime descriptor per struct field, in declaration order.
|
|
111
111
|
* @returns The composed struct descriptor.
|
|
112
112
|
*/
|
|
113
|
-
function compactStructDescriptor(fields) {
|
|
113
|
+
export function compactStructDescriptor(fields) {
|
|
114
114
|
const entries = Object.entries(fields);
|
|
115
115
|
return {
|
|
116
116
|
alignment: () => entries.flatMap(([, type]) => type.alignment()),
|
|
@@ -131,77 +131,29 @@ function compactStructDescriptor(fields) {
|
|
|
131
131
|
* @param inner - Descriptor of the wrapped type.
|
|
132
132
|
* @returns The Maybe struct descriptor.
|
|
133
133
|
*/
|
|
134
|
-
function compactMaybeDescriptor(inner) {
|
|
134
|
+
export function compactMaybeDescriptor(inner) {
|
|
135
135
|
return compactStructDescriptor({
|
|
136
136
|
is_some: CompactTypeBoolean,
|
|
137
137
|
value: inner,
|
|
138
138
|
});
|
|
139
139
|
}
|
|
140
140
|
/**
|
|
141
|
-
* Descriptor of {@link
|
|
142
|
-
* of
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
|
|
147
|
-
export function evmCalldataDescriptor(maxWords) {
|
|
148
|
-
return compactStructDescriptor({
|
|
149
|
-
selector: BYTES_4,
|
|
150
|
-
noWords: UINT_16,
|
|
151
|
-
words: new CompactTypeVector(maxWords, BYTES_32),
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Descriptor of {@link EVMAccessListEntry} at one storage-key capacity
|
|
156
|
-
* (Compact: `EVMAccessListEntry<#maxStorageKeys>`).
|
|
157
|
-
*
|
|
158
|
-
* @param maxStorageKeys - Storage-key capacity per entry.
|
|
159
|
-
* @returns The entry descriptor.
|
|
160
|
-
*/
|
|
161
|
-
export function evmAccessListEntryDescriptor(maxStorageKeys) {
|
|
162
|
-
return compactStructDescriptor({
|
|
163
|
-
address: BYTES_20,
|
|
164
|
-
storageKeyCount: UINT_8,
|
|
165
|
-
storageKeys: new CompactTypeVector(maxStorageKeys, BYTES_32),
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Descriptor of {@link EVMType2TxParams} at one capacity instantiation —
|
|
170
|
-
* the TS analogue of Compact's `EVMType2TxParams<#maxCalldataWords,
|
|
171
|
-
* #maxAccessListEntries, #maxStorageKeysPerEntry>`.
|
|
172
|
-
*
|
|
173
|
-
* @param maxCalldataWords - Calldata word capacity.
|
|
174
|
-
* @param maxAccessListEntries - Access-list entry capacity.
|
|
175
|
-
* @param maxStorageKeysPerEntry - Storage-key capacity per entry.
|
|
176
|
-
* @returns The tx-params descriptor.
|
|
177
|
-
*/
|
|
178
|
-
export function evmType2TxParamsDescriptor(maxCalldataWords, maxAccessListEntries, maxStorageKeysPerEntry) {
|
|
179
|
-
return compactStructDescriptor({
|
|
180
|
-
to: BYTES_20,
|
|
181
|
-
chainId: UINT_64,
|
|
182
|
-
nonce: UINT_64,
|
|
183
|
-
gasLimit: UINT_64,
|
|
184
|
-
maxFeePerGas: UINT_128,
|
|
185
|
-
maxPriorityFeePerGas: UINT_128,
|
|
186
|
-
value: UINT_128,
|
|
187
|
-
accessListEntryCount: UINT_8,
|
|
188
|
-
accessList: new CompactTypeVector(maxAccessListEntries, evmAccessListEntryDescriptor(maxStorageKeysPerEntry)),
|
|
189
|
-
calldata: compactMaybeDescriptor(evmCalldataDescriptor(maxCalldataWords)),
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Descriptor of {@link SignBidirectionalEvent} at one capacity instantiation.
|
|
141
|
+
* Descriptor of {@link SignBidirectionalEvent} over ANY tx-params
|
|
142
|
+
* decomposition — the TS analogue of Compact's generic
|
|
143
|
+
* `SignBidirectionalEvent<TxParams, #LenOutputDeserialization,
|
|
144
|
+
* #LenRespondSerialization>`. Each decomposition wraps this with its own
|
|
145
|
+
* capacity-parameterized convenience (see `signBidirectionalEventDescriptor`
|
|
146
|
+
* in signet-evtype2tx-requests.ts for the EVM Type-2 one).
|
|
194
147
|
*
|
|
195
|
-
* @param
|
|
196
|
-
*
|
|
197
|
-
* @param maxStorageKeysPerEntry - Storage-key capacity per entry.
|
|
148
|
+
* @param txParams - Descriptor of the tx-params decomposition, already at
|
|
149
|
+
* its capacity instantiation.
|
|
198
150
|
* @param lenOutputDeserialization - Declared byte width of
|
|
199
151
|
* `outputDeserializationSchema` (Compact `#LenOutputDeserialization`).
|
|
200
152
|
* @param lenRespondSerialization - Declared byte width of
|
|
201
153
|
* `respondSerializationSchema` (Compact `#LenRespondSerialization`).
|
|
202
154
|
* @returns The event record descriptor.
|
|
203
155
|
*/
|
|
204
|
-
export function
|
|
156
|
+
export function signBidirectionalEventDescriptorWith(txParams, lenOutputDeserialization, lenRespondSerialization) {
|
|
205
157
|
return compactStructDescriptor({
|
|
206
158
|
sender: CONTRACT_ADDRESS,
|
|
207
159
|
requestNonce: UINT_64,
|
|
@@ -211,233 +163,12 @@ export function signBidirectionalEventDescriptor(maxCalldataWords, maxAccessList
|
|
|
211
163
|
dest: MPC_DESTINATION,
|
|
212
164
|
params: BYTES_64,
|
|
213
165
|
txParamType: TX_PARAM_TYPE,
|
|
214
|
-
txParams
|
|
166
|
+
txParams,
|
|
215
167
|
caip2Id: BYTES_32,
|
|
216
168
|
outputDeserializationSchema: new CompactTypeBytes(lenOutputDeserialization),
|
|
217
169
|
respondSerializationSchema: new CompactTypeBytes(lenRespondSerialization),
|
|
218
170
|
});
|
|
219
171
|
}
|
|
220
|
-
/**
|
|
221
|
-
* Canonical id of a signet request: the persistent hash of the entire event
|
|
222
|
-
* record (which commits to every field, the sender address included — there
|
|
223
|
-
* is deliberately no extra domain tag). TS twin of Signet.compact's
|
|
224
|
-
* `calculateRequestId` circuit (see the deviation note atop this section),
|
|
225
|
-
* generic over the capacity instantiation via the record's own array
|
|
226
|
-
* lengths — pass the record exactly as the ledger stores it, unused slots
|
|
227
|
-
* included and schemas at their declared widths.
|
|
228
|
-
*
|
|
229
|
-
* @param request - The full event record (contract-shaped, all slots).
|
|
230
|
-
* @returns The 32-byte request id — the record's ledger map key.
|
|
231
|
-
*/
|
|
232
|
-
export function calculateRequestId(request) {
|
|
233
|
-
const { txParams } = request;
|
|
234
|
-
const maxCalldataWords = txParams.calldata.value.words.length;
|
|
235
|
-
const maxAccessListEntries = txParams.accessList.length;
|
|
236
|
-
const maxStorageKeysPerEntry = maxAccessListEntries === 0 ? 0 : txParams.accessList[0].storageKeys.length;
|
|
237
|
-
return persistentHash(signBidirectionalEventDescriptor(maxCalldataWords, maxAccessListEntries, maxStorageKeysPerEntry, request.outputDeserializationSchema.length, request.respondSerializationSchema.length), request);
|
|
238
|
-
}
|
|
239
|
-
// ---- Calldata / transaction assembly ----------------------------------------
|
|
240
|
-
/**
|
|
241
|
-
* The 32-byte value of a numeric ABI word: the little-endian field embed of
|
|
242
|
-
* the number, exactly what Compact's `x as Field as Bytes<32>` cast produces
|
|
243
|
-
* in-circuit. Use when building words off-chain (UIs, expected-record
|
|
244
|
-
* builders, tests).
|
|
245
|
-
*
|
|
246
|
-
* @param value - The word's numeric value (e.g. an amount).
|
|
247
|
-
* @returns The 32-byte LE embed to store in an {@link EVMCalldata} word.
|
|
248
|
-
*/
|
|
249
|
-
export function numericAbiWordValue(value) {
|
|
250
|
-
return bigintToBytes32(value);
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* The 32-byte staticArg word value for an EVM address: the BIG-ENDIAN
|
|
254
|
-
* numeric reading of its 20 display-order bytes, LE-embedded. TS mirror of
|
|
255
|
-
* Signet.compact's `evmAddressAbiValue` circuit (+ `as Bytes<32>`); see the
|
|
256
|
-
* warning there — embedding the display-order bytes directly would come out
|
|
257
|
-
* byte-reversed in the assembled calldata.
|
|
258
|
-
*
|
|
259
|
-
* @param address - The 20-byte address in display order.
|
|
260
|
-
* @returns The 32-byte word value to store in an {@link EVMCalldata} word.
|
|
261
|
-
*/
|
|
262
|
-
export function evmAddressAbiWord(address) {
|
|
263
|
-
let value = 0n;
|
|
264
|
-
for (const byte of address) {
|
|
265
|
-
value = value * 256n + BigInt(byte);
|
|
266
|
-
}
|
|
267
|
-
return bigintToBytes32(value);
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Re-assemble the raw calldata a request's words describe:
|
|
271
|
-
* `data = selector || BE(words[0..noWords])`. Each word is a little-endian
|
|
272
|
-
* field embed (the contract's `x as Field as Bytes<32>` cast); the leading
|
|
273
|
-
* `noWords` are re-encoded big-endian into 32-byte ABI words and any remaining
|
|
274
|
-
* capacity slots are dropped. This is THE implementation of the MPC re-assembly
|
|
275
|
-
* documented on `EVMCalldata` in Signet.compact.
|
|
276
|
-
*
|
|
277
|
-
* @param calldata - The request's calldata field.
|
|
278
|
-
* @returns Hex calldata for the transaction (`"0x"` when absent).
|
|
279
|
-
*/
|
|
280
|
-
export function assembleCalldata(calldata) {
|
|
281
|
-
if (!calldata.is_some) {
|
|
282
|
-
return "0x";
|
|
283
|
-
}
|
|
284
|
-
const { selector, noWords, words } = calldata.value;
|
|
285
|
-
let data = `0x${bytesToHex(selector)}`;
|
|
286
|
-
for (let i = 0; i < Number(noWords); i++) {
|
|
287
|
-
data += bytesToHex(bigintToBytes32BE(bytesToBigint(words[i])));
|
|
288
|
-
}
|
|
289
|
-
return data;
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Decode the real (count-trimmed) access list of a request into the shape
|
|
293
|
-
* ethers' `Transaction.from` accepts.
|
|
294
|
-
*
|
|
295
|
-
* @param txParams - The request's transaction decomposition.
|
|
296
|
-
* @returns The access list, possibly empty.
|
|
297
|
-
*/
|
|
298
|
-
function decodeAccessList(txParams) {
|
|
299
|
-
return txParams.accessList
|
|
300
|
-
.slice(0, Number(txParams.accessListEntryCount))
|
|
301
|
-
.map((entry) => ({
|
|
302
|
-
address: getAddress(`0x${bytesToHex(entry.address)}`),
|
|
303
|
-
storageKeys: entry.storageKeys
|
|
304
|
-
.slice(0, Number(entry.storageKeyCount))
|
|
305
|
-
.map((key) => `0x${bytesToHex(key)}`),
|
|
306
|
-
}));
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Rebuild the unsigned EIP-1559 transaction a request record describes,
|
|
310
|
-
* byte-identical to the one the MPC assembles and signs: calldata from the
|
|
311
|
-
* tagged words (see {@link assembleCalldata}), the count-trimmed access
|
|
312
|
-
* list, and the stored envelope fields. This is the canonical
|
|
313
|
-
* request→transaction transform; response-side verification
|
|
314
|
-
* (`signature-response-verification.ts`) and the signed-transaction builder
|
|
315
|
-
* below both go through it, so the transaction a client broadcasts is
|
|
316
|
-
* provably the one the MPC put its signature over.
|
|
317
|
-
*
|
|
318
|
-
* @param request - The on-ledger request record.
|
|
319
|
-
* @returns The unsigned ethers transaction (`unsignedHash` is the digest the
|
|
320
|
-
* MPC signs).
|
|
321
|
-
* @throws Error if a calldata word carries an unknown kind.
|
|
322
|
-
*/
|
|
323
|
-
export function signBidirectionalEventToUnsignedEVMTransaction(request) {
|
|
324
|
-
const { txParams } = request;
|
|
325
|
-
return Transaction.from({
|
|
326
|
-
type: 2,
|
|
327
|
-
chainId: txParams.chainId,
|
|
328
|
-
nonce: Number(txParams.nonce),
|
|
329
|
-
gasLimit: txParams.gasLimit,
|
|
330
|
-
maxFeePerGas: txParams.maxFeePerGas,
|
|
331
|
-
maxPriorityFeePerGas: txParams.maxPriorityFeePerGas,
|
|
332
|
-
to: getAddress(`0x${bytesToHex(txParams.to)}`),
|
|
333
|
-
value: txParams.value,
|
|
334
|
-
accessList: decodeAccessList(txParams),
|
|
335
|
-
data: assembleCalldata(txParams.calldata),
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Decode a response signature record (as posted to the signet contract's
|
|
340
|
-
* signature response log — the canonical MPC `Signature { big_r, s,
|
|
341
|
-
* recovery_id }` shape) into an ethers {@link Signature}: `r` is `bigR`'s x
|
|
342
|
-
* coordinate, `v` the legacy parity derived from the recovery id.
|
|
343
|
-
*
|
|
344
|
-
* @param response - The posted signature record.
|
|
345
|
-
* @returns The ethers signature.
|
|
346
|
-
* @throws Error if the recovery id is not 0 or 1.
|
|
347
|
-
*/
|
|
348
|
-
export function signatureRespondedEventToSignature(response) {
|
|
349
|
-
const recoveryId = Number(response.recoveryId);
|
|
350
|
-
if (recoveryId !== 0 && recoveryId !== 1) {
|
|
351
|
-
throw new Error(`expected a recovery id of 0 or 1, got ${recoveryId}`);
|
|
352
|
-
}
|
|
353
|
-
return Signature.from({
|
|
354
|
-
r: `0x${bytesToHex(response.bigRx)}`,
|
|
355
|
-
s: `0x${bytesToHex(response.s)}`,
|
|
356
|
-
v: recoveryId + 27,
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
/** secp256k1 base field prime (2^256 - 2^32 - 977). */
|
|
360
|
-
const SECP256K1_P = 2n ** 256n - 2n ** 32n - 977n;
|
|
361
|
-
/** Modular exponentiation by squaring. */
|
|
362
|
-
function modPow(base, exponent, modulus) {
|
|
363
|
-
let result = 1n;
|
|
364
|
-
let b = base % modulus;
|
|
365
|
-
let e = exponent;
|
|
366
|
-
while (e > 0n) {
|
|
367
|
-
if (e & 1n)
|
|
368
|
-
result = (result * b) % modulus;
|
|
369
|
-
b = (b * b) % modulus;
|
|
370
|
-
e >>= 1n;
|
|
371
|
-
}
|
|
372
|
-
return result;
|
|
373
|
-
}
|
|
374
|
-
/** Encode a bigint as exactly 32 BIG-endian bytes (secp256k1 scalar form). */
|
|
375
|
-
function bigintToBytes32BE(value) {
|
|
376
|
-
const out = new Uint8Array(32);
|
|
377
|
-
let v = value;
|
|
378
|
-
for (let i = 31; i >= 0; i--) {
|
|
379
|
-
out[i] = Number(v & 0xffn);
|
|
380
|
-
v >>= 8n;
|
|
381
|
-
}
|
|
382
|
-
return out;
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Encode an ECDSA signature as the response record posted to the signet
|
|
386
|
-
* contract — the inverse of {@link signatureRespondedEventToSignature},
|
|
387
|
-
* for MPC-side posters (the fakenet signer, tests). The canonical record
|
|
388
|
-
* carries `bigR` as a full affine point but an `r || s || v` signature only
|
|
389
|
-
* has R.x and the parity of R.y, so R.y is recovered by decompressing the
|
|
390
|
-
* point on the curve (y² = x³ + 7 over the secp256k1 base field).
|
|
391
|
-
*
|
|
392
|
-
* The parameter is structural (the r/s/yParity subset of an ethers
|
|
393
|
-
* {@link Signature}) so signatures from ANY ethers instance qualify — posters
|
|
394
|
-
* living in other repos resolve their own ethers install, and nominal class
|
|
395
|
-
* typing would reject it.
|
|
396
|
-
*
|
|
397
|
-
* @param signature - The signature to encode (`r`/`s` as 0x hex, `yParity` 0 or 1).
|
|
398
|
-
* @returns The response record, ready to post.
|
|
399
|
-
* @throws Error if `r` is not the x coordinate of a curve point.
|
|
400
|
-
*/
|
|
401
|
-
export function signatureToSignatureRespondedEvent(signature) {
|
|
402
|
-
const x = BigInt(signature.r);
|
|
403
|
-
const ySquared = (modPow(x, 3n, SECP256K1_P) + 7n) % SECP256K1_P;
|
|
404
|
-
// P ≡ 3 (mod 4), so a square root (when one exists) is c^((P+1)/4).
|
|
405
|
-
let y = modPow(ySquared, (SECP256K1_P + 1n) / 4n, SECP256K1_P);
|
|
406
|
-
if ((y * y) % SECP256K1_P !== ySquared) {
|
|
407
|
-
throw new Error("signature r is not the x coordinate of a secp256k1 point");
|
|
408
|
-
}
|
|
409
|
-
if ((y & 1n) !== BigInt(signature.yParity)) {
|
|
410
|
-
y = SECP256K1_P - y;
|
|
411
|
-
}
|
|
412
|
-
return {
|
|
413
|
-
bigRx: getBytes(signature.r),
|
|
414
|
-
bigRy: bigintToBytes32BE(y),
|
|
415
|
-
s: getBytes(signature.s),
|
|
416
|
-
recoveryId: BigInt(signature.yParity),
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* Assemble the broadcast-ready signed EIP-1559 transaction for a request from
|
|
421
|
-
* its MPC signature response: rebuild the exact unsigned transaction the MPC
|
|
422
|
-
* signed (see {@link signBidirectionalEventToUnsignedEVMTransaction}) and
|
|
423
|
-
* attach the signature. Does NOT check that the signature recovers to the
|
|
424
|
-
* requester's derived address — the response log is unauthenticated, so
|
|
425
|
-
* verify first with `verifySignatureRespondedEvent`.
|
|
426
|
-
*
|
|
427
|
-
* @param request - The on-ledger request record.
|
|
428
|
-
* @param response - The posted signature record answering it.
|
|
429
|
-
* @returns The signed ethers transaction; `serialized` is the raw payload for
|
|
430
|
-
* `eth_sendRawTransaction`, `hash` its on-chain hash, `from` the recovered
|
|
431
|
-
* sender.
|
|
432
|
-
* @throws Error if the request record is malformed (see
|
|
433
|
-
* {@link signBidirectionalEventToUnsignedEVMTransaction}) or the response
|
|
434
|
-
* is not a decodable signature.
|
|
435
|
-
*/
|
|
436
|
-
export function signBidirectionalEventToSignedEVMTransaction(request, response) {
|
|
437
|
-
const transaction = signBidirectionalEventToUnsignedEVMTransaction(request);
|
|
438
|
-
transaction.signature = signatureRespondedEventToSignature(response);
|
|
439
|
-
return transaction;
|
|
440
|
-
}
|
|
441
172
|
/**
|
|
442
173
|
* Render bytes as a lowercase hex string, no `0x` prefix.
|
|
443
174
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signet-requests.js","sourceRoot":"","sources":["../src/signet-requests.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signet-requests.js","sourceRoot":"","sources":["../src/signet-requests.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Signet.compact
CHANGED
|
@@ -97,7 +97,9 @@ module Signet {
|
|
|
97
97
|
// outputDeserializationSchema tells the MPC how to deserialise the destination chain's
|
|
98
98
|
// execution output (destination chain -> MPC). respondSerializationSchema tells the MPC
|
|
99
99
|
// how to serialise that output into the RespondBidirectionalEvent it posts back
|
|
100
|
-
// (MPC -> Midnight).
|
|
100
|
+
// (MPC -> Midnight).
|
|
101
|
+
// Both are ABI-style JSON schema strings, sized per client contract
|
|
102
|
+
// (see: https://docs.soliditylang.org/en/v0.8.30/abi-spec.html#json)
|
|
101
103
|
outputDeserializationSchema: Bytes<LenOutputDeserialization>;
|
|
102
104
|
respondSerializationSchema: Bytes<LenRespondSerialization>;
|
|
103
105
|
}
|
|
@@ -238,7 +240,7 @@ module Signet {
|
|
|
238
240
|
// Posted by MPC back to Signet singleton for clients to extract, verify and deliver
|
|
239
241
|
// back to the client contract. The singleton stores posts UNVERIFIED: client contracts
|
|
240
242
|
// must verify the signature themselves against their MPC response key, via
|
|
241
|
-
// verifyRespondBidirectionalEvent
|
|
243
|
+
// verifyRespondBidirectionalEvent.
|
|
242
244
|
export struct RespondBidirectionalEvent {
|
|
243
245
|
// ABI-encoded return data of the remote call (canonical
|
|
244
246
|
// serialized_output), zero-padded. First 32-byte word == 1 signals
|
|
@@ -359,9 +361,77 @@ module Signet {
|
|
|
359
361
|
|
|
360
362
|
// ABI calldata for the EVM call: 4-byte selector + 32-byte slots
|
|
361
363
|
// (https://docs.soliditylang.org/en/latest/abi-spec.html).
|
|
364
|
+
// CRITICAL: every ABI word here must be stored in canonical ABI form, as
|
|
365
|
+
// the MPC signs a transaction composed of exactly these words. See the
|
|
366
|
+
// ABI Calldata Word Construction Utilities below for help constructing
|
|
367
|
+
// canonical ABI words for common types.
|
|
362
368
|
export struct EVMCalldata<#maxWords> {
|
|
363
|
-
selector: Bytes<4>; // the literal first 4 calldata bytes
|
|
369
|
+
selector: Bytes<4>; // the literal first 4 calldata bytes
|
|
364
370
|
noWords: Uint<16>; // No. of used words in the words list
|
|
365
|
-
words: Vector<maxWords, Bytes<32>>;
|
|
371
|
+
words: Vector<maxWords, Bytes<32>>; // canonical ABI words (big-endian)
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// ---- ABI Calldata Word Construction Utilities ------------------------------------------------------
|
|
375
|
+
// Canonical ABI word builders and readers. Words MUST be stored in canonical
|
|
376
|
+
// ABI form (big-endian, per the ABI spec). These utilities help construct
|
|
377
|
+
// canonical ABI words for common types.
|
|
378
|
+
|
|
379
|
+
// Construct the canonical ABI word for a 20-byte EVM address.
|
|
380
|
+
// Output format: 12 zero bytes, then the 20 display-order address bytes.
|
|
381
|
+
export pure circuit evmAddressAbiWord(addr: Bytes<20>): Bytes<32> {
|
|
382
|
+
return Bytes[...default<Bytes<12>>, ...addr];
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Construct the canonical ABI word for a Uint<128> value (e.g. an ERC20 amount).
|
|
386
|
+
// Output format: the value as a 32-byte big-endian integer.
|
|
387
|
+
export pure circuit numericAbiWord(value: Uint<128>): Bytes<32> {
|
|
388
|
+
// Compact's Uint->Bytes cast is little-endian,
|
|
389
|
+
// so cast to 16 LE bytes and emit them reversed into the low half.
|
|
390
|
+
const le = (value as Bytes<16>) as Vector<16, Uint<8>>;
|
|
391
|
+
return Bytes[
|
|
392
|
+
...default<Bytes<16>>,
|
|
393
|
+
le[15], le[14], le[13], le[12], le[11], le[10], le[9], le[8],
|
|
394
|
+
le[7], le[6], le[5], le[4], le[3], le[2], le[1], le[0]
|
|
395
|
+
];
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Construct the canonical ABI word for a Boolean.
|
|
399
|
+
// Output format: 31 zero bytes, then 0x01 (true) or 0x00 (false).
|
|
400
|
+
export pure circuit boolAbiWord(value: Boolean): Bytes<32> {
|
|
401
|
+
return Bytes[...default<Bytes<31>>, value as Uint<8>];
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Read a numeric ABI word back into a Uint<128>: the big-endian fold of
|
|
405
|
+
// bytes 16..31. The leading half must be zero (a canonical Uint<128> word);
|
|
406
|
+
// rejecting junk there keeps settle circuits from silently truncating a
|
|
407
|
+
// wider value. Max fold result is 2^128 - 1, well inside the field.
|
|
408
|
+
export pure circuit abiWordToUint128(word: Bytes<32>): Uint<128> {
|
|
409
|
+
assert(slice<16>(word, 0) as Field == 0 as Field, "ABI word exceeds Uint<128>");
|
|
410
|
+
const b0 = slice<1>(word, 16) as Field;
|
|
411
|
+
const b1 = b0 * 256 + (slice<1>(word, 17) as Field);
|
|
412
|
+
const b2 = b1 * 256 + (slice<1>(word, 18) as Field);
|
|
413
|
+
const b3 = b2 * 256 + (slice<1>(word, 19) as Field);
|
|
414
|
+
const b4 = b3 * 256 + (slice<1>(word, 20) as Field);
|
|
415
|
+
const b5 = b4 * 256 + (slice<1>(word, 21) as Field);
|
|
416
|
+
const b6 = b5 * 256 + (slice<1>(word, 22) as Field);
|
|
417
|
+
const b7 = b6 * 256 + (slice<1>(word, 23) as Field);
|
|
418
|
+
const b8 = b7 * 256 + (slice<1>(word, 24) as Field);
|
|
419
|
+
const b9 = b8 * 256 + (slice<1>(word, 25) as Field);
|
|
420
|
+
const b10 = b9 * 256 + (slice<1>(word, 26) as Field);
|
|
421
|
+
const b11 = b10 * 256 + (slice<1>(word, 27) as Field);
|
|
422
|
+
const b12 = b11 * 256 + (slice<1>(word, 28) as Field);
|
|
423
|
+
const b13 = b12 * 256 + (slice<1>(word, 29) as Field);
|
|
424
|
+
const b14 = b13 * 256 + (slice<1>(word, 30) as Field);
|
|
425
|
+
const b15 = b14 * 256 + (slice<1>(word, 31) as Field);
|
|
426
|
+
return b15 as Uint<128>;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Read a Boolean ABI word back into a Boolean. The first 31 bytes must be
|
|
430
|
+
// zero and the last byte 0 or 1: any non-canonical word is rejected.
|
|
431
|
+
export pure circuit abiWordToBool(word: Bytes<32>): Boolean {
|
|
432
|
+
assert(slice<31>(word, 0) as Field == 0 as Field, "ABI word is not a canonical Boolean");
|
|
433
|
+
const last = slice<1>(word, 31) as Field;
|
|
434
|
+
assert(last == 0 as Field || last == 1 as Field, "ABI word is not a canonical Boolean");
|
|
435
|
+
return last == 1 as Field;
|
|
366
436
|
}
|
|
367
437
|
}
|
package/src/circuits.compact
CHANGED
|
@@ -1,31 +1,12 @@
|
|
|
1
1
|
pragma language_version >= 0.25;
|
|
2
2
|
|
|
3
|
-
// Compiled export surface of the Signet module.
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// exercise the REAL circuits, and off-chain code (the attestation digest,
|
|
11
|
-
// response verification, key-pin hashing, notification packing) reuses them
|
|
12
|
-
// instead of hand-porting the algorithms. Off-chain code only ever DECODES a
|
|
13
|
-
// SignBidirectionalEventNotification (fixed-offset byte reads), but tests
|
|
14
|
-
// build fixtures with the compiled packer to pin the pack<->decode lockstep.
|
|
15
|
-
//
|
|
16
|
-
// ONLY the non-generic circuits are exported here. The request circuits
|
|
17
|
-
// (calculateRequestId, constructSignBidirectionalEvent) are generic over the
|
|
18
|
-
// tx-params type and schema lengths, the compiler cannot export
|
|
19
|
-
// type-parameterized circuits from the top level, and this package is
|
|
20
|
-
// client-agnostic: a capacity instantiation is a CLIENT contract's choice and
|
|
21
|
-
// never belongs here. constructSignBidirectionalEvent is contract-only, so it
|
|
22
|
-
// needs no off-chain copy. calculateRequestId IS needed off-chain (clients
|
|
23
|
-
// recompute ledger map keys), so it alone has a documented-deviation TS twin
|
|
24
|
-
// in signet-requests.ts, kept honest by caller-contract's
|
|
25
|
-
// submitSignatureRequest round-trip test.
|
|
26
|
-
//
|
|
27
|
-
// Compile with --skip-zk only: pure circuits run in TS without proving keys.
|
|
28
|
-
// The secp256k1 types require the --feature-zkir-v3 compiler flag.
|
|
3
|
+
// Compiled export surface of the Signet module. Signet.compact is
|
|
4
|
+
// module-only and compiles to nothing on its own, so this contract-less
|
|
5
|
+
// program re-exports its pure circuits: the compiler emits them as
|
|
6
|
+
// pureCircuits for unit tests and off-chain code to reuse instead of
|
|
7
|
+
// re-porting the algorithms. Only non-generic circuits can be exported
|
|
8
|
+
// (the compiler cannot export type-parameterised circuits top-level).
|
|
9
|
+
// Compile with --skip-zk and --feature-zkir-v3.
|
|
29
10
|
|
|
30
11
|
import CompactStandardLibrary;
|
|
31
12
|
import "./Signet";
|
|
@@ -34,5 +15,10 @@ export {
|
|
|
34
15
|
signetAttestationDigest,
|
|
35
16
|
verifyRespondBidirectionalEvent,
|
|
36
17
|
signetKeyHash,
|
|
37
|
-
constructSignBidirectionalEventNotificationV1
|
|
18
|
+
constructSignBidirectionalEventNotificationV1,
|
|
19
|
+
evmAddressAbiWord,
|
|
20
|
+
numericAbiWord,
|
|
21
|
+
boolAbiWord,
|
|
22
|
+
abiWordToUint128,
|
|
23
|
+
abiWordToBool
|
|
38
24
|
};
|