@engramx/idl 0.16.0-rc.12 → 0.16.0-rc.14
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/engram.did +221 -193
- package/dist/engram.idl.d.ts +203 -203
- package/dist/engram.idl.js +130 -112
- package/dist/market.did +45 -20
- package/dist/market.idl.d.ts +39 -20
- package/dist/market.idl.js +36 -23
- package/dist/registry.did +60 -28
- package/dist/registry.idl.d.ts +50 -20
- package/dist/registry.idl.js +35 -23
- package/package.json +1 -1
package/dist/engram.did
CHANGED
|
@@ -5,8 +5,14 @@ type X402SignOutcome =
|
|
|
5
5
|
};
|
|
6
6
|
type WriteReceipt =
|
|
7
7
|
record {
|
|
8
|
+
atNs: int;
|
|
9
|
+
contentRoot: blob;
|
|
8
10
|
head: blob;
|
|
11
|
+
prev: blob;
|
|
12
|
+
recordId: nat;
|
|
13
|
+
recordPrev: blob;
|
|
9
14
|
seq: nat;
|
|
15
|
+
size: nat;
|
|
10
16
|
version: nat;
|
|
11
17
|
};
|
|
12
18
|
type WorldIdRpContext =
|
|
@@ -168,6 +174,12 @@ type Seat =
|
|
|
168
174
|
produced: nat;
|
|
169
175
|
weeks: nat64;
|
|
170
176
|
};
|
|
177
|
+
type SealedEntry =
|
|
178
|
+
record {
|
|
179
|
+
digest: blob;
|
|
180
|
+
entryHash: blob;
|
|
181
|
+
id: nat;
|
|
182
|
+
};
|
|
171
183
|
type Role =
|
|
172
184
|
variant {
|
|
173
185
|
Admin;
|
|
@@ -213,18 +225,23 @@ type ResyncReport =
|
|
|
213
225
|
type Result_9 =
|
|
214
226
|
variant {
|
|
215
227
|
Err: Error;
|
|
216
|
-
Ok:
|
|
228
|
+
Ok: BackupRetentionReport;
|
|
217
229
|
};
|
|
218
230
|
type Result_8 =
|
|
219
231
|
variant {
|
|
220
232
|
Err: Error;
|
|
221
|
-
Ok:
|
|
233
|
+
Ok: SignedTransaction;
|
|
222
234
|
};
|
|
223
|
-
type
|
|
235
|
+
type Result_72 =
|
|
224
236
|
variant {
|
|
225
237
|
Err: Error;
|
|
226
238
|
Ok: AgentRecord;
|
|
227
239
|
};
|
|
240
|
+
type Result_71 =
|
|
241
|
+
variant {
|
|
242
|
+
Err: Error;
|
|
243
|
+
Ok: record {activatesAtNs: int;};
|
|
244
|
+
};
|
|
228
245
|
type Result_70 =
|
|
229
246
|
variant {
|
|
230
247
|
Err: Error;
|
|
@@ -238,47 +255,47 @@ type Result_7 =
|
|
|
238
255
|
type Result_69 =
|
|
239
256
|
variant {
|
|
240
257
|
Err: Error;
|
|
241
|
-
Ok:
|
|
258
|
+
Ok: CondenseResult;
|
|
242
259
|
};
|
|
243
260
|
type Result_68 =
|
|
244
261
|
variant {
|
|
245
262
|
Err: Error;
|
|
246
|
-
Ok:
|
|
263
|
+
Ok: MemoryRangeExport;
|
|
247
264
|
};
|
|
248
|
-
type
|
|
265
|
+
type Result_66 =
|
|
249
266
|
variant {
|
|
250
267
|
Err: Error;
|
|
251
|
-
Ok:
|
|
268
|
+
Ok: Page_21;
|
|
252
269
|
};
|
|
253
270
|
type Result_65 =
|
|
254
271
|
variant {
|
|
255
272
|
Err: Error;
|
|
256
|
-
Ok:
|
|
273
|
+
Ok: AgentWriteReview;
|
|
257
274
|
};
|
|
258
275
|
type Result_64 =
|
|
259
276
|
variant {
|
|
260
277
|
Err: Error;
|
|
261
|
-
Ok:
|
|
278
|
+
Ok: BackupMetadata;
|
|
262
279
|
};
|
|
263
280
|
type Result_63 =
|
|
264
281
|
variant {
|
|
265
282
|
Err: Error;
|
|
266
|
-
Ok:
|
|
283
|
+
Ok: ChildAllowanceRow;
|
|
267
284
|
};
|
|
268
285
|
type Result_62 =
|
|
269
286
|
variant {
|
|
270
287
|
Err: Error;
|
|
271
|
-
Ok:
|
|
288
|
+
Ok: ChildOpening;
|
|
272
289
|
};
|
|
273
290
|
type Result_61 =
|
|
274
291
|
variant {
|
|
275
292
|
Err: Error;
|
|
276
|
-
Ok:
|
|
293
|
+
Ok: blob;
|
|
277
294
|
};
|
|
278
295
|
type Result_60 =
|
|
279
296
|
variant {
|
|
280
297
|
Err: Error;
|
|
281
|
-
Ok:
|
|
298
|
+
Ok: EvmAddresses;
|
|
282
299
|
};
|
|
283
300
|
type Result_6 =
|
|
284
301
|
variant {
|
|
@@ -288,52 +305,52 @@ type Result_6 =
|
|
|
288
305
|
type Result_59 =
|
|
289
306
|
variant {
|
|
290
307
|
Err: Error;
|
|
291
|
-
Ok:
|
|
308
|
+
Ok: AlertStatus;
|
|
292
309
|
};
|
|
293
310
|
type Result_58 =
|
|
294
311
|
variant {
|
|
295
312
|
Err: Error;
|
|
296
|
-
Ok:
|
|
313
|
+
Ok: MemoryHistory;
|
|
297
314
|
};
|
|
298
315
|
type Result_57 =
|
|
299
316
|
variant {
|
|
300
317
|
Err: Error;
|
|
301
|
-
Ok:
|
|
318
|
+
Ok: MemoryRetentionPolicy;
|
|
302
319
|
};
|
|
303
320
|
type Result_56 =
|
|
304
321
|
variant {
|
|
305
322
|
Err: Error;
|
|
306
|
-
Ok:
|
|
323
|
+
Ok: OwnerConsole;
|
|
307
324
|
};
|
|
308
325
|
type Result_55 =
|
|
309
326
|
variant {
|
|
310
327
|
Err: Error;
|
|
311
|
-
Ok:
|
|
328
|
+
Ok: record {paths: vec text;};
|
|
312
329
|
};
|
|
313
330
|
type Result_54 =
|
|
314
331
|
variant {
|
|
315
332
|
Err: Error;
|
|
316
|
-
Ok:
|
|
333
|
+
Ok: SigningFloorStatus;
|
|
317
334
|
};
|
|
318
335
|
type Result_53 =
|
|
319
336
|
variant {
|
|
320
337
|
Err: Error;
|
|
321
|
-
Ok:
|
|
338
|
+
Ok: SpendCeiling;
|
|
322
339
|
};
|
|
323
340
|
type Result_52 =
|
|
324
341
|
variant {
|
|
325
342
|
Err: Error;
|
|
326
|
-
Ok:
|
|
343
|
+
Ok: SpendingPolicy;
|
|
327
344
|
};
|
|
328
345
|
type Result_51 =
|
|
329
346
|
variant {
|
|
330
347
|
Err: Error;
|
|
331
|
-
Ok:
|
|
348
|
+
Ok: StorageReport;
|
|
332
349
|
};
|
|
333
350
|
type Result_50 =
|
|
334
351
|
variant {
|
|
335
352
|
Err: Error;
|
|
336
|
-
Ok:
|
|
353
|
+
Ok: WalletBalances;
|
|
337
354
|
};
|
|
338
355
|
type Result_5 =
|
|
339
356
|
variant {
|
|
@@ -343,47 +360,47 @@ type Result_5 =
|
|
|
343
360
|
type Result_49 =
|
|
344
361
|
variant {
|
|
345
362
|
Err: Error;
|
|
346
|
-
Ok:
|
|
363
|
+
Ok: WorldIdConfig;
|
|
347
364
|
};
|
|
348
365
|
type Result_48 =
|
|
349
366
|
variant {
|
|
350
367
|
Err: Error;
|
|
351
|
-
Ok:
|
|
368
|
+
Ok: WorldIdRpContext;
|
|
352
369
|
};
|
|
353
370
|
type Result_47 =
|
|
354
371
|
variant {
|
|
355
372
|
Err: Error;
|
|
356
|
-
Ok:
|
|
373
|
+
Ok: opt text;
|
|
357
374
|
};
|
|
358
375
|
type Result_46 =
|
|
359
376
|
variant {
|
|
360
377
|
Err: Error;
|
|
361
|
-
Ok:
|
|
378
|
+
Ok: bool;
|
|
362
379
|
};
|
|
363
380
|
type Result_45 =
|
|
364
381
|
variant {
|
|
365
382
|
Err: Error;
|
|
366
|
-
Ok:
|
|
383
|
+
Ok: text;
|
|
367
384
|
};
|
|
368
385
|
type Result_44 =
|
|
369
386
|
variant {
|
|
370
387
|
Err: Error;
|
|
371
|
-
Ok:
|
|
388
|
+
Ok: Page_20;
|
|
372
389
|
};
|
|
373
390
|
type Result_43 =
|
|
374
391
|
variant {
|
|
375
392
|
Err: Error;
|
|
376
|
-
Ok:
|
|
393
|
+
Ok: Page_19;
|
|
377
394
|
};
|
|
378
395
|
type Result_42 =
|
|
379
396
|
variant {
|
|
380
397
|
Err: Error;
|
|
381
|
-
Ok:
|
|
398
|
+
Ok: Page_18;
|
|
382
399
|
};
|
|
383
400
|
type Result_41 =
|
|
384
401
|
variant {
|
|
385
402
|
Err: Error;
|
|
386
|
-
Ok:
|
|
403
|
+
Ok: RecordPage;
|
|
387
404
|
};
|
|
388
405
|
type Result_40 =
|
|
389
406
|
variant {
|
|
@@ -543,17 +560,17 @@ type Result_13 =
|
|
|
543
560
|
type Result_12 =
|
|
544
561
|
variant {
|
|
545
562
|
Err: Error;
|
|
546
|
-
Ok:
|
|
563
|
+
Ok: nat;
|
|
547
564
|
};
|
|
548
565
|
type Result_11 =
|
|
549
566
|
variant {
|
|
550
567
|
Err: Error;
|
|
551
|
-
Ok:
|
|
568
|
+
Ok: SessionContext;
|
|
552
569
|
};
|
|
553
570
|
type Result_10 =
|
|
554
571
|
variant {
|
|
555
572
|
Err: Error;
|
|
556
|
-
Ok:
|
|
573
|
+
Ok: MemoryFile;
|
|
557
574
|
};
|
|
558
575
|
type Result_1 =
|
|
559
576
|
variant {
|
|
@@ -580,27 +597,13 @@ type Repudiation =
|
|
|
580
597
|
reason: text;
|
|
581
598
|
version: nat;
|
|
582
599
|
};
|
|
583
|
-
type
|
|
600
|
+
type RecordPage =
|
|
584
601
|
record {
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
destinationFields: vec text;
|
|
591
|
-
domainName: text;
|
|
592
|
-
domainSeparator: vec nat8;
|
|
593
|
-
domainVersion: text;
|
|
594
|
-
encodeTypeString: text;
|
|
595
|
-
fields: vec record {
|
|
596
|
-
text;
|
|
597
|
-
text;
|
|
598
|
-
};
|
|
599
|
-
primaryType: text;
|
|
600
|
-
registeredAtNs: int;
|
|
601
|
-
typeHash: vec nat8;
|
|
602
|
-
typeId: blob;
|
|
603
|
-
verifyingContract: text;
|
|
602
|
+
hashFirstFrom: nat;
|
|
603
|
+
items: vec AuditEntry;
|
|
604
|
+
ringFloor: nat;
|
|
605
|
+
sealed: vec SealedEntry;
|
|
606
|
+
total: nat;
|
|
604
607
|
};
|
|
605
608
|
type ReceiptPage =
|
|
606
609
|
record {
|
|
@@ -769,16 +772,13 @@ type Page_13 =
|
|
|
769
772
|
};
|
|
770
773
|
type Page_12 =
|
|
771
774
|
record {
|
|
772
|
-
items: vec
|
|
775
|
+
items: vec Eip712Destination;
|
|
773
776
|
total: nat;
|
|
774
777
|
withheld: nat;
|
|
775
778
|
};
|
|
776
779
|
type Page_11 =
|
|
777
780
|
record {
|
|
778
|
-
items: vec
|
|
779
|
-
activeFromNs: int;
|
|
780
|
-
address: text;
|
|
781
|
-
};
|
|
781
|
+
items: vec Eip712TypeView;
|
|
782
782
|
total: nat;
|
|
783
783
|
withheld: nat;
|
|
784
784
|
};
|
|
@@ -1181,7 +1181,7 @@ type Engram =
|
|
|
1181
1181
|
/// nomination names. That check compares the caller inside the module, where
|
|
1182
1182
|
/// test/key-replacement.test.mo runs it; this body names no roster gate, because the caller holds
|
|
1183
1183
|
/// no role here until the move.
|
|
1184
|
-
acceptAgentKeyNomination: (agentKey: principal) -> (
|
|
1184
|
+
acceptAgentKeyNomination: (agentKey: principal) -> (Result_72);
|
|
1185
1185
|
/// Consensus transform for the alert webhook outcall: collapse the response to status-only so
|
|
1186
1186
|
/// replicas agree regardless of response headers/body (we only care that the POST landed 2xx).
|
|
1187
1187
|
///
|
|
@@ -1194,9 +1194,32 @@ type Engram =
|
|
|
1194
1194
|
context: blob;
|
|
1195
1195
|
response: HttpRequestResult;
|
|
1196
1196
|
}) -> (HttpRequestResult) query;
|
|
1197
|
+
/// Owner-managed destination allowlist (D7). Additions LOOSEN and wait 24h; removals TIGHTEN
|
|
1198
|
+
/// and apply instantly — the ratified asymmetry, applied to the one mutable policy surface.
|
|
1199
|
+
///
|
|
1200
|
+
/// ⟨2026-10-14, the owner's ruling 4A⟩ ONE LIST PER REGISTERED ACTION. `addEvmWithdrawDestination`,
|
|
1201
|
+
/// `removeEvmWithdrawDestination` and `listEvmWithdrawDestinations` — one list for every action —
|
|
1202
|
+
/// are REMOVED; these three take the action's `typeId`. Same rules, per action: the owner only; an
|
|
1203
|
+
/// addition activates after 24 hours and is refused while payments are frozen; a removal is instant
|
|
1204
|
+
/// and works while frozen; a value is 1–128 characters (an address, or a venue value such as an
|
|
1205
|
+
/// account name). The action must be registered: a destination list belongs to an action, and a
|
|
1206
|
+
/// list for no action would be a value nothing checks. The caller is the owner's app.
|
|
1207
|
+
addEip712Destination: (typeId: blob, value: text) -> (Result_71);
|
|
1197
1208
|
/// Register a typed-data shape as signable. Owner-only, freeze-gated (a registration is a grant
|
|
1198
1209
|
/// of FUTURE authority — a frozen engram must not be able to widen what it can sign), and the
|
|
1199
1210
|
/// shape is IMMUTABLE: any change mints a new typeId.
|
|
1211
|
+
///
|
|
1212
|
+
/// ⟨2026-10-14, the owner's rulings 3A and 5A⟩ ONE BAR FOR EVERY REGISTRATION — the class the owner
|
|
1213
|
+
/// names is stored as a label and decides nothing. Every registration: records the irrevocability
|
|
1214
|
+
/// acknowledgement (`ackIrrevocable = true`); has no opaque field (`bytes`, `bytes1..32`); names at
|
|
1215
|
+
/// least one destination field OR carries a must-equal rule; passes the watchers — an owner alert
|
|
1216
|
+
/// webhook set, enabled AND with its money class on, and an `#Active` guardian holding
|
|
1217
|
+
/// `canFreezePayments`; and waits `Eip712Policy.COOLOFF_NS` (72 hours). It may carry per-field
|
|
1218
|
+
/// rules (`fieldRules`: "at most N" read as a plain decimal with D places, "must equal X"), which
|
|
1219
|
+
/// are part of the registered shape — inside the typeId, stored in `eip712FieldRules`, enforced in
|
|
1220
|
+
/// `eip712SignFor` before the cap reservation. Before this, a withdrawal registered as `#standard`
|
|
1221
|
+
/// needed no webhook, no guardian and no destination field, waited one hour, and signed to any
|
|
1222
|
+
/// address. Intrinsic checks still come first and the watchers last (the 2026-08-06 re-ordering).
|
|
1200
1223
|
addEip712Type: (spec:
|
|
1201
1224
|
record {
|
|
1202
1225
|
ackIrrevocable: bool;
|
|
@@ -1211,6 +1234,10 @@ type Engram =
|
|
|
1211
1234
|
destinationFields: vec text;
|
|
1212
1235
|
domainName: text;
|
|
1213
1236
|
domainVersion: text;
|
|
1237
|
+
fieldRules: vec record {
|
|
1238
|
+
text;
|
|
1239
|
+
Eip712FieldRule;
|
|
1240
|
+
};
|
|
1214
1241
|
fields: vec record {
|
|
1215
1242
|
text;
|
|
1216
1243
|
text;
|
|
@@ -1218,9 +1245,6 @@ type Engram =
|
|
|
1218
1245
|
primaryType: text;
|
|
1219
1246
|
verifyingContract: text;
|
|
1220
1247
|
}) -> (Result_70);
|
|
1221
|
-
/// Owner-managed destination allowlist (D7). Additions LOOSEN and wait 24h; removals TIGHTEN
|
|
1222
|
-
/// and apply instantly — the ratified asymmetry, applied to the one mutable policy surface.
|
|
1223
|
-
addEvmWithdrawDestination: (dest: text) -> (Result_69);
|
|
1224
1248
|
/// ⟨0.16.0, L1⟩ THE ROLE-CONFLICT ARM, and why three refusals here are not the same refusal.
|
|
1225
1249
|
///
|
|
1226
1250
|
/// This method had five distinct ways to say no through one `text`, and a caller could only tell
|
|
@@ -1262,7 +1286,7 @@ type Engram =
|
|
|
1262
1286
|
/// Gated on requireWritesNotPaused — unlike the export. This one destroys retained entries, which
|
|
1263
1287
|
/// is exactly what a guardian pause exists to hold. No action alert is raised: the operation is
|
|
1264
1288
|
/// owner-initiated, owner-only, and already chained into the audit log.
|
|
1265
|
-
applyCondense: (toSeq: nat) -> (
|
|
1289
|
+
applyCondense: (toSeq: nat) -> (Result_69);
|
|
1266
1290
|
/// Owner-only: activate a guardian who has registered against an invite.
|
|
1267
1291
|
///
|
|
1268
1292
|
/// Until this call the guardian is `#Pending` and can do NOTHING — registering is a claim, this
|
|
@@ -1333,13 +1357,13 @@ type Engram =
|
|
|
1333
1357
|
///
|
|
1334
1358
|
/// The write half also refuses while writes are PAUSED.
|
|
1335
1359
|
backupInit: (dbType: text, backupType: BackupType, parentBackupId:
|
|
1336
|
-
opt text, sha256: text, backupLabel: opt text) -> (
|
|
1360
|
+
opt text, sha256: text, backupLabel: opt text) -> (Result_45);
|
|
1337
1361
|
/// Read one chunk of a finalized backup, by index.
|
|
1338
1362
|
///
|
|
1339
1363
|
/// ⚠ GATED ON `read_backup`, which is NOT the permission the upload half uses — that one is
|
|
1340
1364
|
/// `canAppendMemory`. Holding one says nothing about the other, deliberately: taking a backup and
|
|
1341
1365
|
/// carrying it away are different authorities.
|
|
1342
|
-
backupPullChunk: (backupId: text, chunkIndex: nat) -> (
|
|
1366
|
+
backupPullChunk: (backupId: text, chunkIndex: nat) -> (Result_61) query;
|
|
1343
1367
|
backupPushChunk: (backupId: text, chunkIndex: nat, data: blob) ->
|
|
1344
1368
|
(Result_1);
|
|
1345
1369
|
/// The OWNER cancels an agent's pending key nomination; the agent keeps its current key. Refused
|
|
@@ -1372,7 +1396,7 @@ type Engram =
|
|
|
1372
1396
|
/// ⟨2026-10-02⟩ The second parameter is NAMED `amountE6` now, as the census row above rules the
|
|
1373
1397
|
/// pair — e6 base units of the token named first. A name only: Candid passes arguments by
|
|
1374
1398
|
/// position, so nothing on the wire moved.
|
|
1375
|
-
convertEarningsToCycles: (token: text, amountE6: nat) -> (
|
|
1399
|
+
convertEarningsToCycles: (token: text, amountE6: nat) -> (Result_12);
|
|
1376
1400
|
/// Owner-only: mint a single-use invite code an agent redeems with `pairAgent`.
|
|
1377
1401
|
///
|
|
1378
1402
|
/// ⚠ READ THIS BEFORE INVITING SOMEONE BACK. Pairing is ONE-SHOT PER PRINCIPAL on
|
|
@@ -1391,7 +1415,7 @@ type Engram =
|
|
|
1391
1415
|
/// A principal that is already a GUARDIAN cannot become an agent — a guardian is an
|
|
1392
1416
|
/// independent check on agents, so one wallet must not hold both.
|
|
1393
1417
|
createAgentInvite: (name: text, permissions: AgentPermissions) ->
|
|
1394
|
-
(
|
|
1418
|
+
(Result_45);
|
|
1395
1419
|
/// Owner-only: mint an invite for a GUARDIAN — an independent check on agents, not a
|
|
1396
1420
|
/// co-owner and not a recovery agent.
|
|
1397
1421
|
///
|
|
@@ -1414,7 +1438,7 @@ type Engram =
|
|
|
1414
1438
|
/// So an invite that fails to redeem for that reason is not a bad code. The rule exists because
|
|
1415
1439
|
/// a check must be independent of the thing it checks.
|
|
1416
1440
|
createGuardianInvite: (name: text, permissions: GuardianPermissions) ->
|
|
1417
|
-
(
|
|
1441
|
+
(Result_45);
|
|
1418
1442
|
/// OWNER-ONLY deletion of a stored backup.
|
|
1419
1443
|
///
|
|
1420
1444
|
/// ⚠ NOT THE SAME GATE AS THE REST OF THE FAMILY, and the asymmetry is deliberate: `backupInit`,
|
|
@@ -1442,35 +1466,6 @@ type Engram =
|
|
|
1442
1466
|
/// `#NotFound` for an unknown id and `#Conflict` when the request is no longer pending, and it
|
|
1443
1467
|
/// does not change the policy — the next request over the same limit will be raised again.
|
|
1444
1468
|
denyRequest: (requestId: text, reason: text) -> (Result_1);
|
|
1445
|
-
/// Force the tECDSA derivation and return the address.
|
|
1446
|
-
///
|
|
1447
|
-
/// It exists because the gateway's own derivation fires from a timer that is lazy on some
|
|
1448
|
-
/// replicas, and until it lands the EVM quote advertises the `0x0` fallback and settle fails
|
|
1449
|
-
/// closed — a live money surface quoting an address that cannot receive.
|
|
1450
|
-
///
|
|
1451
|
-
/// ⟨0.16.0, B-2⟩ Derivation now comes from `EvmIdentity`, and the return type carries the
|
|
1452
|
-
/// outcome: this used to answer `""` on failure, which is a Text a caller can and did paste into
|
|
1453
|
-
/// a payment flow. An empty string is not an address, and saying so is the difference between a
|
|
1454
|
-
/// failed derivation and an address of nothing.
|
|
1455
|
-
///
|
|
1456
|
-
/// ⚠ TRANSITIONAL: it also primes the ic402 gate, because the gate still settles commerce on this
|
|
1457
|
-
/// canister until those 47 methods move. That second call disappears with them — it is listed in
|
|
1458
|
-
/// the move order in the spec's B-2 addendum, not left for someone to find.
|
|
1459
|
-
///
|
|
1460
|
-
/// PUBLIC: it inherits `getEvmAddress`'s gate rather than choosing one, and could not usefully be
|
|
1461
|
-
/// narrower — it exists so a caller can make the derivation happen BEFORE a payment flow, and the
|
|
1462
|
-
/// derivation itself is ungated. Idempotent and bounded to the same one-derivation-per-lifetime
|
|
1463
|
-
/// work, so an anonymous caller can cause it once and no more.
|
|
1464
|
-
/// ⟨L7⟩ UPDATE, NOT QUERY, and this one does not merely await — it WRITES. The body awaits
|
|
1465
|
-
/// `EvmIdentity.deriveAddress` (the management canister's `ecdsa_public_key`) and
|
|
1466
|
-
/// `gate.deriveEvmRecipientAt` ⟨renamed 2026-09-22 with the path⟩, then caches the result in `evmAddressCache`. So a query is
|
|
1467
|
-
/// impossible twice over: it could not await the derivation, and it could not keep the answer.
|
|
1468
|
-
/// Named `ensure*` rather than `get*` for that reason — the write is the point, and a read verb
|
|
1469
|
-
/// would have promised a cheapness this cannot deliver.
|
|
1470
|
-
///
|
|
1471
|
-
/// ⟨Marker added 2026-08-23; the census row said "L7 mark added per review" and no mark was at
|
|
1472
|
-
/// the site.⟩
|
|
1473
|
-
ensureEvmReady: () -> (Result_44);
|
|
1474
1469
|
/// Record that log entries [fromSeq, toSeq] were served, and return the root that proves it.
|
|
1475
1470
|
///
|
|
1476
1471
|
/// This is the receipt ledgerfs Q2 requires before any of those entries may be condensed away.
|
|
@@ -1484,7 +1479,7 @@ type Engram =
|
|
|
1484
1479
|
/// situation rather than a safety measure. It IS gated on requireMemoryAttached: a store that
|
|
1485
1480
|
/// failed its integrity check must not attest anything it cannot vouch for.
|
|
1486
1481
|
exportMemoryRange: (fromSeq: nat, toSeq: nat, authorFilter:
|
|
1487
|
-
opt principal) -> (
|
|
1482
|
+
opt principal) -> (Result_68);
|
|
1488
1483
|
/// ⟨0.16.0, L2.2 — renamed from `guardianFreezePayments`⟩ The prefix LIED about who may call it.
|
|
1489
1484
|
/// The gate is `requireOwnerOrGuardian`, and an owner freezing their own payments is the ordinary
|
|
1490
1485
|
/// case — the guardian is the exceptional one. A name that says otherwise sends an owner looking
|
|
@@ -1500,6 +1495,8 @@ type Engram =
|
|
|
1500
1495
|
/// individual method's body finds nothing — the check is one level down.⟩
|
|
1501
1496
|
/// · `addEip712Type` and `addEvmWithdrawDestination` — pre-staging for a later payout is the
|
|
1502
1497
|
/// thing a brake most needs to stop, so the destination list is frozen along with the signing.
|
|
1498
|
+
/// ⟨2026-10-14, the owner's ruling 4A⟩ `addEvmWithdrawDestination` is removed; its place is
|
|
1499
|
+
/// `addEip712Destination` (one list per registered action), freeze-gated the same way.
|
|
1503
1500
|
/// · `sessionReadMemory` and `sessionAppendMemory` — the paid-memory rail, money coming IN.
|
|
1504
1501
|
///
|
|
1505
1502
|
/// AND WHAT IT DELIBERATELY DOES NOT, stated so the absence is not read as an oversight:
|
|
@@ -1516,7 +1513,7 @@ type Engram =
|
|
|
1516
1513
|
/// before this one. If any of them is wrong, this comment is where the argument should happen.
|
|
1517
1514
|
freezePayments: () -> (Result_1);
|
|
1518
1515
|
/// Delivery status + config readback. Owner-only (the URL is a secret).
|
|
1519
|
-
getActionAlertStatus: () -> (
|
|
1516
|
+
getActionAlertStatus: () -> (Result_59) query;
|
|
1520
1517
|
/// Agents need to know what they may revise, so they can read it too. Whole-value config, same
|
|
1521
1518
|
/// carve-out as getProtectedPaths — and kept a SEPARATE method from it deliberately (L2.2): a
|
|
1522
1519
|
/// protected path and a revisable path are opposite grants, and one accessor for both would be a
|
|
@@ -1524,7 +1521,7 @@ type Engram =
|
|
|
1524
1521
|
///
|
|
1525
1522
|
/// Refusal reason preserved from the trap: a grant is a power, and its absence and its
|
|
1526
1523
|
/// concealment are different facts.
|
|
1527
|
-
getAgentRevisablePaths: () -> (
|
|
1524
|
+
getAgentRevisablePaths: () -> (Result_55) query;
|
|
1528
1525
|
/// OWNER-ONLY: every engagement's seat weeks on this engram, with the agent's root — the day it
|
|
1529
1526
|
/// paired, the days of its first and last payment signature, a 64-week map whose bit 0 is the week
|
|
1530
1527
|
/// of the last one, and how many were produced. Never an amount, a recipient or a nonce.
|
|
@@ -1535,7 +1532,7 @@ type Engram =
|
|
|
1535
1532
|
/// order. Anyone else is refused by name (`#Refused getAgentSeatWeeks: …`), never answered with an
|
|
1536
1533
|
/// empty page. Paged; `total` is every engagement ever paired here (a reset keeps the rows).
|
|
1537
1534
|
/// Two rows can name one root: an agent paired again after it left is a second engagement.
|
|
1538
|
-
getAgentSeatWeeks: (start: nat, limit: nat) -> (
|
|
1535
|
+
getAgentSeatWeeks: (start: nat, limit: nat) -> (Result_66) query;
|
|
1539
1536
|
/// Owner: everything written into this engram by someone other than the owner since the last
|
|
1540
1537
|
/// markAgentWritesReviewed() — agent appends/revisions AND paid-session appends (see
|
|
1541
1538
|
/// qualifiesForReview for why those two families are recognised differently).
|
|
@@ -1543,7 +1540,7 @@ type Engram =
|
|
|
1543
1540
|
/// them — the UI must page (markAgentWritesReviewed(?lastShownId)) and must NOT present 200
|
|
1544
1541
|
/// as a total. `earliest` discloses ring eviction — if cursor < earliest, entries between them
|
|
1545
1542
|
/// aged out of the ring (the CHAIN still proves total count; this view can't show their bodies).
|
|
1546
|
-
getAgentWriteReview: () -> (
|
|
1543
|
+
getAgentWriteReview: () -> (Result_65) query;
|
|
1547
1544
|
/// Why anchoring is or is not advancing. PUBLIC: ungated on purpose — detecting a stalled
|
|
1548
1545
|
/// engram is the point, a gated read would fail-to-empty and hand a third party fabricated zeros,
|
|
1549
1546
|
/// and none of these fields is a secret — `total` is already public via getCertifiedAuditHead.
|
|
@@ -1562,7 +1559,7 @@ type Engram =
|
|
|
1562
1559
|
/// below serves the same head WITH the subnet certificate for a caller that needs to verify it
|
|
1563
1560
|
/// was signed rather than asserted.
|
|
1564
1561
|
getAuditHead: () -> (AuditHead) query;
|
|
1565
|
-
getBackupMetadata: (backupId: text) -> (
|
|
1562
|
+
getBackupMetadata: (backupId: text) -> (Result_64) query;
|
|
1566
1563
|
/// The cashier this engram recognises as its rent biller — `null` until the registry pushes one.
|
|
1567
1564
|
///
|
|
1568
1565
|
/// PUBLIC: a payer about to send money needs to know which cashier this engram will accept credit
|
|
@@ -1592,11 +1589,11 @@ type Engram =
|
|
|
1592
1589
|
/// query's state writes are discarded when it returns, and the `denied` call first written here
|
|
1593
1590
|
/// recorded nothing while reading as if it did. The refusal is loud in the reply instead. WHAT
|
|
1594
1591
|
/// WOULD MAKE THIS WRONG: a reason to record who asked — then this becomes an update that says so.
|
|
1595
|
-
getChildAllowance: (agentPrincipal: principal) -> (
|
|
1592
|
+
getChildAllowance: (agentPrincipal: principal) -> (Result_63) query;
|
|
1596
1593
|
/// Owner-only, Billing-class: what opening an engram costs this engram, the balance below which an
|
|
1597
1594
|
/// agent's request is refused, the balance now, and every agent's allowance. The console's cost
|
|
1598
1595
|
/// sentence reads it. Cycles are owner-class information, as on the owner's console read.
|
|
1599
|
-
getChildOpening: () -> (
|
|
1596
|
+
getChildOpening: () -> (Result_62) query;
|
|
1600
1597
|
/// Derive the shared memory-encryption key, encrypted under the caller's transport
|
|
1601
1598
|
/// public key. Gated to owner + read-agents (the same principals allowed to read
|
|
1602
1599
|
/// memory). The client decrypts it locally with its transport secret key.
|
|
@@ -1621,7 +1618,7 @@ type Engram =
|
|
|
1621
1618
|
/// cost. Stated here because L7 requires the reason be readable from the interface rather than
|
|
1622
1619
|
/// inferred by opening the body — which is exactly what had to happen to write this line.
|
|
1623
1620
|
getEncryptedMemoryKey: (epoch: opt nat, transportPublicKey: blob) ->
|
|
1624
|
-
(
|
|
1621
|
+
(Result_61);
|
|
1625
1622
|
/// ⟨0.16.0, owner ruling 2026-08-20 — option (a)⟩ `x402Support` REPORTS THE RAIL, not a constant.
|
|
1626
1623
|
///
|
|
1627
1624
|
/// The card's config hardcodes `x402Support = true`, answering a buyer's question with a fact
|
|
@@ -1646,10 +1643,6 @@ type Engram =
|
|
|
1646
1643
|
/// has never met this engram what it is and how to transact with it. A card behind a gate cannot
|
|
1647
1644
|
/// be discovered, and the ERC-8004 ecosystem it participates in assumes an open read.
|
|
1648
1645
|
getEngramCard: () -> (AgentCard) query;
|
|
1649
|
-
/// PUBLIC: the engram's permanent spawn ordinal — a provable, non-sensitive fact. It identifies a
|
|
1650
|
-
/// canister, never a person.
|
|
1651
|
-
/// null = spawned before numbering existed; the owner can backfill via syncEngramNumber().
|
|
1652
|
-
getEngramNumber: () -> (opt nat) query;
|
|
1653
1646
|
/// Re-pointed at `EvmIdentity` (B-2): custody derivation no longer routes through the ic402
|
|
1654
1647
|
/// Gateway, which is leaving for the market canister. Behaviour is unchanged for a caller — same
|
|
1655
1648
|
/// address, same tECDSA key — but the engram no longer needs a marketplace to know its own
|
|
@@ -1720,7 +1713,7 @@ type Engram =
|
|
|
1720
1713
|
/// It refuses rather than half-answers: if either address cannot be derived the reply is
|
|
1721
1714
|
/// `#Err`, never a record carrying an empty string (ic402's `getEvmAddress` answers `""` on a
|
|
1722
1715
|
/// failed derivation — that is fail-to-empty on a money surface, and it stops here).
|
|
1723
|
-
getEvmAddress: () -> (
|
|
1716
|
+
getEvmAddress: () -> (Result_60);
|
|
1724
1717
|
/// The owner's OWN EVM address, if they registered one — distinct from `getEvmAddress`, which is
|
|
1725
1718
|
/// the address this canister derives for itself.
|
|
1726
1719
|
///
|
|
@@ -1735,7 +1728,7 @@ type Engram =
|
|
|
1735
1728
|
/// the management canister's `ecdsa_public_key`. A query cannot await, so the round-trip is the
|
|
1736
1729
|
/// cost — stated here because L7 requires the reason be readable from the interface rather than
|
|
1737
1730
|
/// inferred by opening the body.
|
|
1738
|
-
getEvmSignerAddress: () -> (
|
|
1731
|
+
getEvmSignerAddress: () -> (Result_45);
|
|
1739
1732
|
/// PUBLIC: where this chain begins, for the stranger deciding whether to trust it.
|
|
1740
1733
|
///
|
|
1741
1734
|
/// The fourth of the four evidence methods (`getAuditHead`, `getCertifiedAuditHead`,
|
|
@@ -1744,7 +1737,7 @@ type Engram =
|
|
|
1744
1737
|
/// cannot verify it, and nothing here identifies anybody.
|
|
1745
1738
|
getGenesisNote: () -> (GenesisNote) query;
|
|
1746
1739
|
/// A guardian's own channel status (their URL is their secret — each guardian sees only theirs).
|
|
1747
|
-
getGuardianAlertStatus: () -> (
|
|
1740
|
+
getGuardianAlertStatus: () -> (Result_59) query;
|
|
1748
1741
|
/// The market this engram will accept signing requests from — `null` until the registry pushes
|
|
1749
1742
|
/// one at spawn, which is why `requireMarket` refuses fleet-wide today.
|
|
1750
1743
|
///
|
|
@@ -1774,7 +1767,7 @@ type Engram =
|
|
|
1774
1767
|
/// never renumbered: the next page starts at the last version returned plus one. Defaults
|
|
1775
1768
|
/// return the whole history of any file a pre-FD engram could have held.
|
|
1776
1769
|
getMemoryHistory: (path: text, start: opt nat, max: opt nat) ->
|
|
1777
|
-
(
|
|
1770
|
+
(Result_58) query;
|
|
1778
1771
|
/// PUBLIC: the epoch alone, and deliberately nothing else (rotation study D4). A `rotatedAt[]`
|
|
1779
1772
|
/// history would be a public, fleet-enumerable feed of when each owner terminated a trust
|
|
1780
1773
|
/// relationship — readable by, among others, the party just terminated.
|
|
@@ -1815,7 +1808,7 @@ type Engram =
|
|
|
1815
1808
|
/// Refusal reasons of both merge: an empty policy reads as "nothing is capped, every version kept
|
|
1816
1809
|
/// forever" — a claim about what this engram will DESTROY — and an empty guard list reads as
|
|
1817
1810
|
/// "nothing is held back".
|
|
1818
|
-
getMemoryRetentionPolicy: () -> (
|
|
1811
|
+
getMemoryRetentionPolicy: () -> (Result_57) query;
|
|
1819
1812
|
/// The metrics reader this engram answers — `null` until the spawning registry names one.
|
|
1820
1813
|
///
|
|
1821
1814
|
/// PUBLIC: an owner deciding whether to switch the read off needs to know who it is, and anyone
|
|
@@ -1838,7 +1831,7 @@ type Engram =
|
|
|
1838
1831
|
/// was `nat`, then widened to `opt nat` so a refusal could be `null`, which broke every published
|
|
1839
1832
|
/// client (rule 4) and bought a masked answer nobody had asked for — the census could not even
|
|
1840
1833
|
/// find a consumer that read the masked `0`. Behind a gate there is nobody to mask it from.
|
|
1841
|
-
getOwnerConsole: () -> (
|
|
1834
|
+
getOwnerConsole: () -> (Result_56) query;
|
|
1842
1835
|
/// Owner + agents only (agents need it to avoid writing protected paths).
|
|
1843
1836
|
///
|
|
1844
1837
|
/// A NAMED RECORD, not a Page: the setter replaces this list wholesale, so there is no window to
|
|
@@ -1850,7 +1843,7 @@ type Engram =
|
|
|
1850
1843
|
/// path on this engram is protected", and an agent consults this list precisely to avoid
|
|
1851
1844
|
/// writing one — so a fabricated empty here does not merely misinform, it invites the write the
|
|
1852
1845
|
/// list exists to prevent.
|
|
1853
|
-
getProtectedPaths: () -> (
|
|
1846
|
+
getProtectedPaths: () -> (Result_55) query;
|
|
1854
1847
|
/// Whether the metrics reader's read is answered — `true` from birth.
|
|
1855
1848
|
///
|
|
1856
1849
|
/// PUBLIC: the promise that an owner can switch this read off can be checked only if the switch
|
|
@@ -1859,7 +1852,7 @@ type Engram =
|
|
|
1859
1852
|
/// Owner-only, Billing-class: the signing floor, the balance, one signature's price, and how many
|
|
1860
1853
|
/// payment signatures the balance carries above the floor before `signX402Payment` is refused by
|
|
1861
1854
|
/// name. The same numbers the check uses, so Billing can say only what the engram enforces.
|
|
1862
|
-
getSigningFloor: () -> (
|
|
1855
|
+
getSigningFloor: () -> (Result_54) query;
|
|
1863
1856
|
/// The registry that spawned this engram, if it recorded one.
|
|
1864
1857
|
///
|
|
1865
1858
|
/// PUBLIC: it is the provenance claim. An engram asserting it is part of a fleet, under that
|
|
@@ -1876,7 +1869,7 @@ type Engram =
|
|
|
1876
1869
|
/// configuration, and the engram-wide total would also tell one agent how much the others spent.
|
|
1877
1870
|
/// A refusal names this method (`Gated.gatedResult`) rather than answering null/0 — a ceiling of
|
|
1878
1871
|
/// "none" and a spend of 0 are both real answers, so a fabricated one would be read as fact.
|
|
1879
|
-
getSpendCeiling: () -> (
|
|
1872
|
+
getSpendCeiling: () -> (Result_53) query;
|
|
1880
1873
|
/// Read the caps in force for a caller.
|
|
1881
1874
|
///
|
|
1882
1875
|
/// OWNER-ONLY, and this is where it diverges from the market's inbound twin, which is public.
|
|
@@ -1884,8 +1877,8 @@ type Engram =
|
|
|
1884
1877
|
/// Here the engram serves no 402s at all: these caps are the owner's private custody
|
|
1885
1878
|
/// configuration, and publishing them would tell any caller exactly how large a signing request
|
|
1886
1879
|
/// can be before it needs an approval nobody is watching for.
|
|
1887
|
-
getSpendPolicy: (caller: opt principal) -> (
|
|
1888
|
-
getStorageStats: () -> (
|
|
1880
|
+
getSpendPolicy: (caller: opt principal) -> (Result_52) query;
|
|
1881
|
+
getStorageStats: () -> (Result_51) query;
|
|
1889
1882
|
/// Timer arm-state. PUBLIC and deliberately so: these timers are self-arming to save cycles,
|
|
1890
1883
|
/// and an optimisation nobody can verify is an optimisation nobody should trust. Cheap to read,
|
|
1891
1884
|
/// leaks nothing (booleans about our own scheduling).
|
|
@@ -1956,12 +1949,12 @@ type Engram =
|
|
|
1956
1949
|
/// ⟨L7⟩ MARKER ADDED 2026-08-23, reasoning above UNCHANGED — this block already said "Stays an
|
|
1957
1950
|
/// UPDATE, marked per L7: it awaits three ICRC-1 ledgers". It was marked in prose and invisible
|
|
1958
1951
|
/// to any gate; the glyph is what `scripts/check-update-for-read.mjs` matches.
|
|
1959
|
-
getWalletBalances: () -> (
|
|
1952
|
+
getWalletBalances: () -> (Result_50);
|
|
1960
1953
|
/// Refusal reason preserved, and it is the clearest case of why a masked read is worse than no
|
|
1961
1954
|
/// read: three empty strings with `configured = false` is a VALID-LOOKING answer meaning "this
|
|
1962
1955
|
/// engram has no World ID configuration" — handed to a caller who merely lacks a grant. The
|
|
1963
1956
|
/// fabrication is indistinguishable from the truth by construction.
|
|
1964
|
-
getWorldIdConfig: () -> (
|
|
1957
|
+
getWorldIdConfig: () -> (Result_49) query;
|
|
1965
1958
|
/// ⟨L7⟩ UPDATE, NOT QUERY: this awaits THREE system calls — `raw_rand()` for the nonce,
|
|
1966
1959
|
/// `Call.signWithEcdsa` for the signature, and `worldIdRpPublicKey()` for the derived key. A
|
|
1967
1960
|
/// query can do none of them.
|
|
@@ -1970,7 +1963,7 @@ type Engram =
|
|
|
1970
1963
|
/// Valid iff the derived signer address (getWorldIdRpSignerAddress) is registered for this rp_id in
|
|
1971
1964
|
/// the World Developer Portal. Short-lived (300s TTL, idkit-server's default) and single-purpose —
|
|
1972
1965
|
/// it authorizes opening one verification request, nothing else.
|
|
1973
|
-
getWorldIdRpContext: () -> (
|
|
1966
|
+
getWorldIdRpContext: () -> (Result_48);
|
|
1974
1967
|
/// Owner-only: the EVM address derived from the engram's dedicated World ID RP signing key (the
|
|
1975
1968
|
/// "worldid-rp" tECDSA path). Register THIS address as the rp_id's signer in the World Developer
|
|
1976
1969
|
/// Portal — the engram never holds or exports a private key (only threshold shares exist, on the
|
|
@@ -1980,7 +1973,7 @@ type Engram =
|
|
|
1980
1973
|
/// awaits `worldIdRpPublicKey()` (management `ecdsa_public_key`), and it calls `denied()` on
|
|
1981
1974
|
/// refusal — a state write, which a query cannot perform. So even if the key were cached this
|
|
1982
1975
|
/// could not become a query without silently retiring its denial record (ADR-0002's class).
|
|
1983
|
-
getWorldIdRpSignerAddress: () -> (
|
|
1976
|
+
getWorldIdRpSignerAddress: () -> (Result_45);
|
|
1984
1977
|
/// The verified IDKitResult, verbatim, as World's /api/v4/verify accepted it — the re-checkable
|
|
1985
1978
|
/// artifact behind verifiedHuman. Role-gated because it carries the NULLIFIER.
|
|
1986
1979
|
/// `Result<opt Text>` — and the double wrapper is the entire point, not redundancy.
|
|
@@ -1999,7 +1992,7 @@ type Engram =
|
|
|
1999
1992
|
/// `///`, so the dead name was PUBLISHED in engram.did and pointed every client at a method the
|
|
2000
1993
|
/// canister does not serve. The tombstones below and at `about()` are historical and correct as
|
|
2001
1994
|
/// written; this one was present tense, which is the difference that matters.⟩
|
|
2002
|
-
getWorldIdVerification: () -> (
|
|
1995
|
+
getWorldIdVerification: () -> (Result_47) query;
|
|
2003
1996
|
/// ⟨0.16.0, L1⟩ THE EMERGENCY FAMILY. Every refusal below is `#Refused` or `#NotFound`, and the
|
|
2004
1997
|
/// absence of a `#Conflict` here is the point: these are the calls someone makes while something
|
|
2005
1998
|
/// is going wrong, and the only two answers that help are "you may not do this" and "there is
|
|
@@ -2074,7 +2067,7 @@ type Engram =
|
|
|
2074
2067
|
///
|
|
2075
2068
|
/// Owner-gated because it reports on custody posture, and answered as a Result so that a
|
|
2076
2069
|
/// wrong-identity caller gets a refusal rather than a bare `false` that reads as "no address yet".
|
|
2077
|
-
isEvmAddressCached: () -> (
|
|
2070
|
+
isEvmAddressCached: () -> (Result_46) query;
|
|
2078
2071
|
/// Issue an OAuth authorization code. Called by an OAuth client's sign-in bridge
|
|
2079
2072
|
/// (an `/auth/connector`-style route) after II authentication. The client then
|
|
2080
2073
|
/// redirects the user's browser to `redirectUri` with `?code=<this>` so the
|
|
@@ -2082,7 +2075,7 @@ type Engram =
|
|
|
2082
2075
|
///
|
|
2083
2076
|
/// Owner-only: only the engram owner can authorize a Connector install.
|
|
2084
2077
|
issueAuthCode: (redirectUri: text, scope: text, codeChallenge: text,
|
|
2085
|
-
clientId: opt text) -> (
|
|
2078
|
+
clientId: opt text) -> (Result_45);
|
|
2086
2079
|
/// ⟨0.16.0⟩ `getCycleSnapshotSource` DELETED — folded into `CycleSnapshot.source`, one label per
|
|
2087
2080
|
/// ROW. A single label for a whole ring misattributes every row recorded under the other source,
|
|
2088
2081
|
/// and the source flips by design (self-call first, balance on fallback). Its documentation of
|
|
@@ -2096,7 +2089,7 @@ type Engram =
|
|
|
2096
2089
|
/// Refusal reason preserved, and it is the sharpest of this family: a masked `[]` reads as a
|
|
2097
2090
|
/// DORMANT engram and corrupts retention math — a fabricated empty here does not just misinform a
|
|
2098
2091
|
/// reader, it feeds a wrong number into a decision about destroying data.
|
|
2099
|
-
listActivitySnapshots: (start: nat, limit: nat) -> (
|
|
2092
|
+
listActivitySnapshots: (start: nat, limit: nat) -> (Result_44) query;
|
|
2100
2093
|
/// ⟨0.16.0⟩ THE PAGE EXEMPLAR. Trap → `#Refused`, bare array → `Result<Page<T>>` (L1 + L3).
|
|
2101
2094
|
///
|
|
2102
2095
|
/// The refusal prose that used to be `gatedTrap`'s `whyNotEmpty` argument is not lost — it is why
|
|
@@ -2111,7 +2104,7 @@ type Engram =
|
|
|
2111
2104
|
///
|
|
2112
2105
|
/// `withheld` is 0: this roster is owner-only in whole, so there is no partial-visibility case.
|
|
2113
2106
|
/// A method that filters rows by caller sets it — see L1's row-level honesty rule.
|
|
2114
|
-
listAgents: (start: nat, limit: nat) -> (
|
|
2107
|
+
listAgents: (start: nat, limit: nat) -> (Result_43) query;
|
|
2115
2108
|
/// The GUARDIAN-audience projection of the agent roster — three fields, not the full record.
|
|
2116
2109
|
///
|
|
2117
2110
|
/// Two audiences, two methods (L1/L8), rather than one method masking fields by caller: a
|
|
@@ -2123,7 +2116,7 @@ type Engram =
|
|
|
2123
2116
|
/// Refusal reason preserved: `[]` reads as "this engram has no agents", and this is the list a
|
|
2124
2117
|
/// guardian consults BEFORE REVOKING ONE. A fabricated empty here does not merely misinform —
|
|
2125
2118
|
/// it tells someone acting under emergency powers that there is nothing to act on.
|
|
2126
|
-
listAgentsForGuardian: (start: nat, limit: nat) -> (
|
|
2119
|
+
listAgentsForGuardian: (start: nat, limit: nat) -> (Result_42) query;
|
|
2127
2120
|
/// Owner-only: rows carry caller, amount, operation and free-text rationale. The SDK omits it.
|
|
2128
2121
|
///
|
|
2129
2122
|
/// The optional leading filter SURVIVES the L3 reshape — ratified (census tier-2 #8) rather than
|
|
@@ -2156,7 +2149,21 @@ type Engram =
|
|
|
2156
2149
|
/// For the owner and a guardian `withheld` is 0 and the page is the span. WHAT WOULD MAKE THIS
|
|
2157
2150
|
/// WRONG: a reader who must see the whole record without being the owner or a guardian — the
|
|
2158
2151
|
/// public certified head is the answer for integrity, and nothing else is.
|
|
2159
|
-
|
|
2152
|
+
///
|
|
2153
|
+
/// ⟨2026-10-15, the owner's ruling 6B of 2026-10-14⟩ PUBLIC NOW, AND THE COUNT BECAME ROWS. The
|
|
2154
|
+
/// reply is a `Wire.RecordPage`: every entry in the span the reader may not see in full comes back
|
|
2155
|
+
/// as a hash-only row in `sealed` (id, SHA-256 of its body, entry hash) instead of being counted in
|
|
2156
|
+
/// `withheld`, so `items.size() + sealed.size()` is the span examined. Each entry is hashed first,
|
|
2157
|
+
/// then chained (`AuditLog`), so those rows are enough to walk from any entry to the certified
|
|
2158
|
+
/// head — which is what lets a stranger check one entry without the owner. A caller with no role,
|
|
2159
|
+
/// the anonymous caller included, is a stranger (`RecordView.readerFrom`) and gets only sealed
|
|
2160
|
+
/// rows; the owner and guardians still see every entry, an agent its own. Nothing here refuses,
|
|
2161
|
+
/// so the read's former refusal ("Anonymous caller not allowed") is gone from it.
|
|
2162
|
+
/// `ringFloor` says where the ring starts — a `start` below it begins at it — and `hashFirstFrom`
|
|
2163
|
+
/// where this record switched to the hash-first rule. A sealed row costs one SHA-256 of its body
|
|
2164
|
+
/// at read time; nothing new is stored. WHAT WOULD MAKE THIS WRONG: a sealed row carrying any part
|
|
2165
|
+
/// of a body, or a stranger reaching `items` (test/record-view.test.mo pins both).
|
|
2166
|
+
listAuditEntries: (start: nat, limit: nat) -> (Result_41) query;
|
|
2160
2167
|
/// ⟨0.16.0, L1 + L3 — census-ruled⟩ THE TWO-MECHANISM EXCEPTION DISSOLVES.
|
|
2161
2168
|
///
|
|
2162
2169
|
/// This method used to answer THREE ways to one question: a list, an `#Err` text, and a trap,
|
|
@@ -2212,13 +2219,6 @@ type Engram =
|
|
|
2212
2219
|
/// for non-owners just as silently, and a caller could not tell a filtered tombstone list from a
|
|
2213
2220
|
/// complete one. Counted before slicing, so policy-hidden rows never blur into paging.
|
|
2214
2221
|
listDeletedMemoryFiles: (start: nat, limit: nat) -> (Result_36) query;
|
|
2215
|
-
/// The registered shapes — E3: encodeTypeString is the display artifact, verbatim.
|
|
2216
|
-
/// Stays on the engram under B1 (hybrid): EIP-712 signing is custody, and custody does not leave.
|
|
2217
|
-
///
|
|
2218
|
-
/// Refusal reason preserved: `[]` reads as "this engram can sign nothing" — a claim about SIGNING
|
|
2219
|
-
/// AUTHORITY, which is not a thing to hand an unauthorized reader. The public trail of every
|
|
2220
|
-
/// registration remains the audit chain under getCertifiedAuditHead.
|
|
2221
|
-
listEip712Types: (start: nat, limit: nat) -> (Result_35) query;
|
|
2222
2222
|
/// Stays on the engram under B1 (hybrid): withdrawal custody does not leave.
|
|
2223
2223
|
///
|
|
2224
2224
|
/// NAMED item, not a `(Text, Int)` tuple. The Int is an activation time, and a bare Int beside a
|
|
@@ -2227,7 +2227,24 @@ type Engram =
|
|
|
2227
2227
|
/// Refusal reason preserved, and it has two halves that matter separately: `[]` reads as "this
|
|
2228
2228
|
/// engram may withdraw nowhere", OR — worse — as "no allowlist is in force", which is the
|
|
2229
2229
|
/// opposite security posture. It also erases any pending 24h activation from view.
|
|
2230
|
-
|
|
2230
|
+
///
|
|
2231
|
+
/// ⟨2026-10-14, 4A⟩ One action's list: `typeId` names the action, and an unregistered one is
|
|
2232
|
+
/// `#NotFound` rather than an empty page (an empty page means "this action may sign to nothing").
|
|
2233
|
+
/// The item's field is `value`, not `address`: a list may hold a venue value that is no address.
|
|
2234
|
+
/// Readable by the owner, an active agent or an active guardian, as the old list was.
|
|
2235
|
+
listEip712Destinations: (typeId: blob, start: nat, limit: nat) ->
|
|
2236
|
+
(Result_35) query;
|
|
2237
|
+
/// The registered shapes — E3: encodeTypeString is the display artifact, verbatim.
|
|
2238
|
+
/// Stays on the engram under B1 (hybrid): EIP-712 signing is custody, and custody does not leave.
|
|
2239
|
+
///
|
|
2240
|
+
/// Refusal reason preserved: `[]` reads as "this engram can sign nothing" — a claim about SIGNING
|
|
2241
|
+
/// AUTHORITY, which is not a thing to hand an unauthorized reader. The public trail of every
|
|
2242
|
+
/// registration remains the audit chain under getCertifiedAuditHead.
|
|
2243
|
+
///
|
|
2244
|
+
/// ⟨2026-10-14, the owner's ruling 3A⟩ Each row carries its per-field rules (`fieldRules`), joined in
|
|
2245
|
+
/// from `eip712FieldRules` — they are part of what the type authorises, so a reader of the list must
|
|
2246
|
+
/// not have to make a second call to learn them. The row type is `Eip712TypeView`.
|
|
2247
|
+
listEip712Types: (start: nat, limit: nat) -> (Result_34) query;
|
|
2231
2248
|
/// Accessible by owner and guardians.
|
|
2232
2249
|
///
|
|
2233
2250
|
/// Refusal reason carried over from the trap, because it is the sharpest example of why this
|
|
@@ -2474,7 +2491,7 @@ type Engram =
|
|
|
2474
2491
|
/// (every family qualifiesForReview admits is written to auditLogger, so they share that space),
|
|
2475
2492
|
/// and this never inspects an operation or a role. Widening what the review shows therefore
|
|
2476
2493
|
/// changes only which ids the console can pass here — it cannot desynchronise the cursor.
|
|
2477
|
-
markAgentWritesReviewed: (uptoAuditId: opt nat) -> (
|
|
2494
|
+
markAgentWritesReviewed: (uptoAuditId: opt nat) -> (Result_12);
|
|
2478
2495
|
/// The AGENT's current key nominates the key that will replace it. Nothing moves yet: the new
|
|
2479
2496
|
/// key must accept, by its own call, within 24 hours (`acceptAgentKeyNomination`). One pending
|
|
2480
2497
|
/// nomination per agent — a new one replaces the earlier one, and the record says which. Refused,
|
|
@@ -2517,7 +2534,7 @@ type Engram =
|
|
|
2517
2534
|
/// NOT freeze-gated: the owner always controls their own funds.
|
|
2518
2535
|
/// Guardian freeze only blocks agent/public operations.
|
|
2519
2536
|
ownerWithdraw: (amount: TokenAmount, ownerAuth: opt ActionAuth) ->
|
|
2520
|
-
(
|
|
2537
|
+
(Result_12);
|
|
2521
2538
|
/// ⟨0.16.0⟩ `payRentFromEarnings` DELETED — ruled TWICE (B1 and B2), and it was the single
|
|
2522
2539
|
/// clearest violation of the OSS/platform split in this repo.
|
|
2523
2540
|
///
|
|
@@ -2639,7 +2656,7 @@ type Engram =
|
|
|
2639
2656
|
/// counter here could never persist; read counting lives on the update path
|
|
2640
2657
|
/// (`sessionReadContext` and the MCP reads). A caller measuring engram usage from this method
|
|
2641
2658
|
/// will measure nothing.
|
|
2642
|
-
readMemory: (path: text) -> (
|
|
2659
|
+
readMemory: (path: text) -> (Result_10) query;
|
|
2643
2660
|
/// Read many paths in one call. Per-path Results are KEPT — partial success is the point, and
|
|
2644
2661
|
/// one unreadable path must not fail the other nine.
|
|
2645
2662
|
///
|
|
@@ -2750,6 +2767,9 @@ type Engram =
|
|
|
2750
2767
|
/// override is to overwrite it with a frozen copy of the global policy, which then stops
|
|
2751
2768
|
/// following later changes. That makes every override permanent in effect.
|
|
2752
2769
|
removeCallerSpendPolicy: (caller: principal) -> (Result_1);
|
|
2770
|
+
/// ⟨2026-10-14, 4A⟩ Remove a destination from one action's list. Instant, and NOT freeze-gated:
|
|
2771
|
+
/// removal TIGHTENS, and a frozen engram must still be able to shrink what it could sign to.
|
|
2772
|
+
removeEip712Destination: (typeId: blob, value: text) -> (Result_1);
|
|
2753
2773
|
/// De-register a type that has NEVER SIGNED. Exists because of a hazard the first external
|
|
2754
2774
|
/// validation found within hours (consumer report, 2026-08-06): a bare-name #standard registration —
|
|
2755
2775
|
/// cheap, no watcher preconditions — permanently blocked the guarded namespaced registration
|
|
@@ -2759,8 +2779,9 @@ type Engram =
|
|
|
2759
2779
|
/// removes only authority that was never exercised, which is removing nothing but the mistake.
|
|
2760
2780
|
/// NOT freeze-gated, same reasoning as removeEvmWithdrawDestination: this is TIGHTENING, and a
|
|
2761
2781
|
/// frozen engram must still be able to shrink what it could sign.
|
|
2782
|
+
/// ⟨2026-10-14⟩ `removeEvmWithdrawDestination` is now `removeEip712Destination` (ruling 4A); same
|
|
2783
|
+
/// reasoning. Removing a type now also drops its rules and its own destination list.
|
|
2762
2784
|
removeEip712Type: (typeId: blob) -> (Result_1);
|
|
2763
|
-
removeEvmWithdrawDestination: (dest: text) -> (Result_1);
|
|
2764
2785
|
/// Owner-only: remove a guardian from the roster.
|
|
2765
2786
|
///
|
|
2766
2787
|
/// Unlike revoking an agent this is NOT terminal for the principal — the guardian roster does
|
|
@@ -2774,7 +2795,7 @@ type Engram =
|
|
|
2774
2795
|
/// the original audit entry stay exactly where they were; this appends a chained
|
|
2775
2796
|
/// `memory.repudiate` entry and lists the (path, version) so readers can see the dispute.
|
|
2776
2797
|
repudiateMemoryWrite: (path: text, version: nat, reason: text) ->
|
|
2777
|
-
(
|
|
2798
|
+
(Result_12);
|
|
2778
2799
|
/// ⚠ OWNER-ONLY BULK RESET. Destructive, and wider than its name suggests.
|
|
2779
2800
|
///
|
|
2780
2801
|
/// It severs EVERY grant surface that can outlive a role — agents, guardians, invites and
|
|
@@ -2902,7 +2923,7 @@ type Engram =
|
|
|
2902
2923
|
/// written, and only then does it await one notification per revoked agent. So a notification
|
|
2903
2924
|
/// that fails leaves the agents revoked here regardless — a partial notify is not a partial
|
|
2904
2925
|
/// revocation, which is the direction that matters for a panic button.
|
|
2905
|
-
revokeAllAgents: () -> (
|
|
2926
|
+
revokeAllAgents: () -> (Result_12);
|
|
2906
2927
|
/// Owner-only panic button: revoke every connector bearer token at once. Returns how many.
|
|
2907
2928
|
///
|
|
2908
2929
|
/// The THIRD independent surface — hosted connectors authenticate with bearer tokens, not with
|
|
@@ -2911,7 +2932,7 @@ type Engram =
|
|
|
2911
2932
|
/// holding a live session.
|
|
2912
2933
|
///
|
|
2913
2934
|
/// Tokens are re-issuable: revoking them is not permanent the way revoking an agent is.
|
|
2914
|
-
revokeAllBearerTokens: () -> (
|
|
2935
|
+
revokeAllBearerTokens: () -> (Result_12);
|
|
2915
2936
|
/// ⟨0.16.0⟩ `removeAllGuardians` DELETED — test-only (L6), and verified NOT part of KILL-SWITCH's
|
|
2916
2937
|
/// mass-revoke set. The destructive phase-07 suite iterates `removeGuardian` instead, so nothing
|
|
2917
2938
|
/// loses a capability: what dies is a bulk spelling no runbook ever invoked.
|
|
@@ -2923,7 +2944,7 @@ type Engram =
|
|
|
2923
2944
|
///
|
|
2924
2945
|
/// Unlike revoking an agent, this costs nothing permanently — an invite is a one-time code,
|
|
2925
2946
|
/// so voiding it and minting a fresh one is the ordinary path.
|
|
2926
|
-
revokeAllInvites: () -> (
|
|
2947
|
+
revokeAllInvites: () -> (Result_12);
|
|
2927
2948
|
/// Revoke a bearer token by its public tokenId. Idempotent.
|
|
2928
2949
|
/// Subsequent /mcp requests using this token will be rejected.
|
|
2929
2950
|
revokeBearerToken: (tokenId: text) -> (Result_1);
|
|
@@ -2950,13 +2971,6 @@ type Engram =
|
|
|
2950
2971
|
/// agent on that record, so its standing is not the problem — the record's state is. An
|
|
2951
2972
|
/// agent reading `#Refused` would go looking for a permission that was never missing.
|
|
2952
2973
|
rotateAgentKeyHash: (newPublicKeyHash: text) -> (Result_1);
|
|
2953
|
-
/// One-time onboarding seed: writes a starter file so the first read-back is non-empty.
|
|
2954
|
-
///
|
|
2955
|
-
/// Owner-only, and it REFUSES once any memory exists — so it can only ever add the initial
|
|
2956
|
-
/// placeholder and can never overwrite real content. Deliberately NOT counted as a write (no
|
|
2957
|
-
/// `totalMemoryWrites`, no `firstWriteAt`): it is a system seed rather than activity, and
|
|
2958
|
-
/// counting it would corrupt both the write metrics and time-to-first-write for every engram.
|
|
2959
|
-
seedMemory: (path: text, content: blob) -> (Result);
|
|
2960
2974
|
/// Append to a memory file against a PAID x402 session voucher — the write half of the paid rail,
|
|
2961
2975
|
/// authorized by the voucher rather than by a role.
|
|
2962
2976
|
/// ⟨2026-09-30, ic402 2.17.0⟩ Authorized by the payer's own call with the voucher: only the
|
|
@@ -3000,7 +3014,7 @@ type Engram =
|
|
|
3000
3014
|
/// ⚠ RAW STORED BYTES, like `readMemoryBatch`. On a Private (encrypted) engram the content is
|
|
3001
3015
|
/// CIPHERTEXT; the key-holding SDK decrypts it. A caller without the key gets bytes it cannot
|
|
3002
3016
|
/// read, not an error.
|
|
3003
|
-
sessionReadContext: (clientLabel: text) -> (
|
|
3017
|
+
sessionReadContext: (clientLabel: text) -> (Result_11);
|
|
3004
3018
|
/// Read one memory file against a PAID x402 session voucher. No role, no invite — the voucher is
|
|
3005
3019
|
/// the authorization, which is what makes this the engram's one rail a stranger can pay to use.
|
|
3006
3020
|
///
|
|
@@ -3030,7 +3044,7 @@ type Engram =
|
|
|
3030
3044
|
/// session must not be the side door: without this guard a stranger holding a fraction-of-a-
|
|
3031
3045
|
/// cent voucher could read `secrets/*`.
|
|
3032
3046
|
/// · Payments are frozen on this engram.
|
|
3033
|
-
sessionReadMemory: (voucher: Voucher, path: text) -> (
|
|
3047
|
+
sessionReadMemory: (voucher: Voucher, path: text) -> (Result_10);
|
|
3034
3048
|
/// Configure action alerts: an https webhook that receives new chained-audit entries matching the
|
|
3035
3049
|
/// enabled event classes (money / approvals / guardian / agentWrites), batched, at most one
|
|
3036
3050
|
/// POST per minute. Owner-only. Payloads carry audit METADATA (operation, caller, role, bounded
|
|
@@ -3070,7 +3084,7 @@ type Engram =
|
|
|
3070
3084
|
/// called it an "ops floor: retention enforcement deletes owner backup data silently", mitigated
|
|
3071
3085
|
/// by a `Debug.print` nobody reads. An owner lowering the cap is destroying their own backups;
|
|
3072
3086
|
/// they are told how many, in the reply and in the audit line.
|
|
3073
|
-
setBackupRetention: (dbType: text, maxBackups: nat) -> (
|
|
3087
|
+
setBackupRetention: (dbType: text, maxBackups: nat) -> (Result_9);
|
|
3074
3088
|
/// Override the caps for ONE caller — an agent this owner trusts more, or less, than the rest.
|
|
3075
3089
|
setCallerSpendPolicy: (caller: principal, policy: SpendingPolicy) ->
|
|
3076
3090
|
(Result_1);
|
|
@@ -3176,6 +3190,10 @@ type Engram =
|
|
|
3176
3190
|
/// bounded instead by each registered type's daily count and destination list; and agent-
|
|
3177
3191
|
/// registration transactions (`signEngramRegistration`), bounded by three per caller per day and
|
|
3178
3192
|
/// the 500-gwei gas ceiling. Whether the ceiling should cover them is a separate owner question.⟩
|
|
3193
|
+
/// ⟨2026-10-14, the owner's rulings 3A, 4A and 5A⟩ Typed-data signatures are now bounded by each
|
|
3194
|
+
/// registered type's daily count, its per-field rules ("at most N", "must equal X") and ITS OWN
|
|
3195
|
+
/// destination list, and the signing floor (`SigningFloor`) guards them as it guards x402 payments.
|
|
3196
|
+
/// They are still not counted against this ceiling.
|
|
3179
3197
|
///
|
|
3180
3198
|
/// WHY: the owner decided on 2026-09-28 to add one daily spending ceiling across all callers on an
|
|
3181
3199
|
/// engram and keep the limit of five agents. Every other spending limit is per caller, so without
|
|
@@ -3297,7 +3315,7 @@ type Engram =
|
|
|
3297
3315
|
maxFeePerGas: nat;
|
|
3298
3316
|
maxPriorityFeePerGas: nat;
|
|
3299
3317
|
nonce: nat;
|
|
3300
|
-
}) -> (
|
|
3318
|
+
}) -> (Result_8);
|
|
3301
3319
|
/// Sign an EIP-3009 authorization for x402 payment. Agent-accessible.
|
|
3302
3320
|
/// Client probes the URL, extracts chain/token/recipient/amount from the 402, and calls this.
|
|
3303
3321
|
/// Canister signs → returns header → client retries with header.
|
|
@@ -3329,33 +3347,6 @@ type Engram =
|
|
|
3329
3347
|
tokenName: text;
|
|
3330
3348
|
tokenVersion: text;
|
|
3331
3349
|
}) -> (Result_3);
|
|
3332
|
-
/// Self-heal: if the registry's spawn-time push was missed, the owner pulls the number from
|
|
3333
|
-
/// the spawning registry. Idempotent; fails closed if the registry has no record.
|
|
3334
|
-
syncEngramNumber: () -> (Result_8);
|
|
3335
|
-
/// Genesis seed — the atomic "spawn only when there's real content" primitive. The spawning
|
|
3336
|
-
/// REGISTRY pushes the owner's first real memory immediately after install, so a canister is
|
|
3337
|
-
/// never spawned holding nothing (see the registry's `provisionEngram` optional genesis).
|
|
3338
|
-
///
|
|
3339
|
-
/// Gated `spawnedBy`-only and ONE-SHOT: it refuses once any file exists, so it can seed and never
|
|
3340
|
-
/// overwrite. Unlike the owner-only `seedMemory` placeholder this is REAL owner content, so it
|
|
3341
|
-
/// IS counted as an owner write (`firstWriteAt`, `totalMemoryWrites`) and is authored by the
|
|
3342
|
-
/// OWNER rather than by the registry principal that called it. It never touches the
|
|
3343
|
-
/// agent metrics.
|
|
3344
|
-
///
|
|
3345
|
-
/// ⚠ THE PAYLOAD IS `Nat` AND MUST STAY `Nat`, which is a constraint on any client of this
|
|
3346
|
-
/// method rather than an internal detail. Its only caller is the registry, over an
|
|
3347
|
-
/// inter-canister boundary, through a hand-declared actor type — and the registry is ROUTINELY a
|
|
3348
|
-
/// different version from the engram template it is seeding: it upgrades before the fleet does,
|
|
3349
|
-
/// and during a transition it can serve a template older than itself. A return-type change here
|
|
3350
|
-
/// breaks genesis provisioning across that skew. That is measured, not predicted: the registry
|
|
3351
|
-
/// trapped with "IDL error: unexpected IDL type when parsing Nat" while seeding an engram built
|
|
3352
|
-
/// at the staging tag. A receipt would buy nothing anyway — the caller does `ignore await`.
|
|
3353
|
-
///
|
|
3354
|
-
/// ⚠ ORDERING: upload the engram TEMPLATE first, then upgrade the registry. The reverse leaves a
|
|
3355
|
-
/// window where a spawn seeds an old-shape engram with a new-shape expectation; the reply fails
|
|
3356
|
-
/// to decode and `provisionEngram` dies on a trap its own `try/catch` cannot reach (ADR-0001),
|
|
3357
|
-
/// failing the WHOLE SPAWN rather than just the seed.
|
|
3358
|
-
sysApplyGenesisSeed: (path: text, content: blob) -> (Result_8);
|
|
3359
3350
|
/// OWNER force-close, for a session the payer abandoned.
|
|
3360
3351
|
///
|
|
3361
3352
|
/// ⟨R1b, ruled 2026-08-26: owner-gated, NO guardian.⟩ It moves someone else's money, and only ever
|
|
@@ -3532,9 +3523,6 @@ type Engram =
|
|
|
3532
3523
|
/// nobody but the spawning registry can fix it. That refusal therefore names the real remedy
|
|
3533
3524
|
/// rather than telling an owner to run a call they can no longer make.
|
|
3534
3525
|
sysSetBillerId: (id: principal) -> (Result_1);
|
|
3535
|
-
/// One-shot assignment of the spawn ordinal — callable ONLY by the spawning registry, ONLY
|
|
3536
|
-
/// while unset. Neither the owner nor any later registry can change an assigned number.
|
|
3537
|
-
sysSetEngramNumber: (n: nat) -> (Result_1);
|
|
3538
3526
|
/// Point this engram at the commerce satellite allowed to ask it for signatures. ⟨0.16.0, B1⟩
|
|
3539
3527
|
///
|
|
3540
3528
|
/// SAME AUTHORITY AS `sysSetBillerId`, and for a stronger reason. That one routes money; this one
|
|
@@ -3571,6 +3559,9 @@ type Engram =
|
|
|
3571
3559
|
/// (the market cannot introduce a shape), its cool-off must have elapsed, its per-type daily cap
|
|
3572
3560
|
/// still binds, the destination allowlist still fails closed, and a payments freeze still stops
|
|
3573
3561
|
/// it. What the market supplies is the request; what the engram supplies is the whole policy.
|
|
3562
|
+
/// ⟨2026-10-14⟩ And the type's per-field rules, its own destination list (ruling 4A) and the
|
|
3563
|
+
/// signing floor (ruling 5A) — all in `eip712SignFor`, so they bind the market as they bind the
|
|
3564
|
+
/// owner; a refusal here is on the chained record under the market's caller and role.
|
|
3574
3565
|
///
|
|
3575
3566
|
/// That is what "signatures only" means in code, and it is why this method needs no new authority
|
|
3576
3567
|
/// model: an unregistered typeId is refused for the market exactly as it is for the owner.
|
|
@@ -3696,6 +3687,32 @@ type Eip712Value =
|
|
|
3696
3687
|
string: text;
|
|
3697
3688
|
uint: nat;
|
|
3698
3689
|
};
|
|
3690
|
+
type Eip712TypeView =
|
|
3691
|
+
record {
|
|
3692
|
+
ackIrrevocable: bool;
|
|
3693
|
+
authorityClass: AuthorityClass;
|
|
3694
|
+
chainId: nat;
|
|
3695
|
+
cooloffEndsAtNs: int;
|
|
3696
|
+
dailySignCap: nat;
|
|
3697
|
+
destinationFields: vec text;
|
|
3698
|
+
domainName: text;
|
|
3699
|
+
domainSeparator: vec nat8;
|
|
3700
|
+
domainVersion: text;
|
|
3701
|
+
encodeTypeString: text;
|
|
3702
|
+
fieldRules: vec record {
|
|
3703
|
+
text;
|
|
3704
|
+
Eip712FieldRule;
|
|
3705
|
+
};
|
|
3706
|
+
fields: vec record {
|
|
3707
|
+
text;
|
|
3708
|
+
text;
|
|
3709
|
+
};
|
|
3710
|
+
primaryType: text;
|
|
3711
|
+
registeredAtNs: int;
|
|
3712
|
+
typeHash: vec nat8;
|
|
3713
|
+
typeId: blob;
|
|
3714
|
+
verifyingContract: text;
|
|
3715
|
+
};
|
|
3699
3716
|
type Eip712SignatureOut =
|
|
3700
3717
|
record {
|
|
3701
3718
|
digest: blob;
|
|
@@ -3710,6 +3727,19 @@ type Eip712Registration =
|
|
|
3710
3727
|
encodeTypeString: text;
|
|
3711
3728
|
typeId: blob;
|
|
3712
3729
|
};
|
|
3730
|
+
type Eip712FieldRule =
|
|
3731
|
+
variant {
|
|
3732
|
+
atMost: record {
|
|
3733
|
+
decimals: nat;
|
|
3734
|
+
max: nat;
|
|
3735
|
+
};
|
|
3736
|
+
mustEqual: text;
|
|
3737
|
+
};
|
|
3738
|
+
type Eip712Destination =
|
|
3739
|
+
record {
|
|
3740
|
+
activeFromNs: int;
|
|
3741
|
+
value: text;
|
|
3742
|
+
};
|
|
3713
3743
|
type Eip3009Authorization =
|
|
3714
3744
|
record {
|
|
3715
3745
|
from: text;
|
|
@@ -4050,8 +4080,6 @@ type About =
|
|
|
4050
4080
|
agentMemoryWrites: nat;
|
|
4051
4081
|
auditLogSize: nat;
|
|
4052
4082
|
backupCount: nat;
|
|
4053
|
-
distinctReaderClients: nat;
|
|
4054
|
-
distinctReaderPrincipals: nat;
|
|
4055
4083
|
encryptionEnabled: bool;
|
|
4056
4084
|
firstAgentWriteAtNs: opt int;
|
|
4057
4085
|
firstWriteAtNs: opt int;
|