@agenticprimitives/delegation 1.0.0-alpha.46 → 1.0.0-alpha.47
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 +21 -7
- package/dist/authority-chain.d.ts +77 -7
- package/dist/authority-chain.d.ts.map +1 -1
- package/dist/authority-chain.js +144 -18
- package/dist/authority-chain.js.map +1 -1
- package/dist/caveats.d.ts +166 -3
- package/dist/caveats.d.ts.map +1 -1
- package/dist/caveats.js +65 -7
- package/dist/caveats.js.map +1 -1
- package/dist/evaluator.d.ts.map +1 -1
- package/dist/evaluator.js +9 -7
- package/dist/evaluator.js.map +1 -1
- package/dist/hash.d.ts +8 -0
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +17 -0
- package/dist/hash.js.map +1 -1
- package/dist/index.d.ts +11 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -5
- package/dist/index.js.map +1 -1
- package/dist/invocation-proof.d.ts.map +1 -1
- package/dist/invocation-proof.js +2 -0
- package/dist/invocation-proof.js.map +1 -1
- package/dist/mandate-handlers.d.ts.map +1 -1
- package/dist/mandate-handlers.js +2 -0
- package/dist/mandate-handlers.js.map +1 -1
- package/dist/mandate.d.ts +106 -1
- package/dist/mandate.d.ts.map +1 -1
- package/dist/mandate.js +189 -34
- package/dist/mandate.js.map +1 -1
- package/dist/method-authorization.d.ts +6 -0
- package/dist/method-authorization.d.ts.map +1 -1
- package/dist/method-authorization.js.map +1 -1
- package/dist/onchain.d.ts +150 -1
- package/dist/onchain.d.ts.map +1 -1
- package/dist/onchain.js +94 -2
- package/dist/onchain.js.map +1 -1
- package/dist/presentation-release.d.ts +7 -0
- package/dist/presentation-release.d.ts.map +1 -1
- package/dist/presentation-release.js +49 -17
- package/dist/presentation-release.js.map +1 -1
- package/dist/quorum.d.ts +71 -3
- package/dist/quorum.d.ts.map +1 -1
- package/dist/quorum.js +112 -22
- package/dist/quorum.js.map +1 -1
- package/dist/standing.d.ts.map +1 -1
- package/dist/standing.js +10 -4
- package/dist/standing.js.map +1 -1
- package/dist/token.d.ts +23 -14
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +46 -17
- package/dist/token.js.map +1 -1
- package/package.json +6 -6
package/dist/quorum.d.ts
CHANGED
|
@@ -1,8 +1,70 @@
|
|
|
1
1
|
import { type Address, type Hex } from 'viem';
|
|
2
|
+
/** `QuorumEnforcer.QUORUM_ACTION_TYPEHASH`'s type string — compared to the live Solidity source cross-stack. */
|
|
3
|
+
export declare const QUORUM_ACTION_TYPE = "QuorumAction(uint256 chainId,address enforcer,bytes32 delegationHash,address delegator,address redeemer,address target,uint256 value,bytes32 callDataHash)";
|
|
4
|
+
export declare const QUORUM_ACTION_TYPEHASH: Hex;
|
|
5
|
+
export interface OnChainQuorumAction {
|
|
6
|
+
chainId: number;
|
|
7
|
+
/** The deployed QuorumEnforcer (`address(this)` on chain). */
|
|
8
|
+
enforcer: Address;
|
|
9
|
+
delegationHash: Hex;
|
|
10
|
+
delegator: Address;
|
|
11
|
+
redeemer: Address;
|
|
12
|
+
target: Address;
|
|
13
|
+
value: bigint;
|
|
14
|
+
callData: Hex;
|
|
15
|
+
}
|
|
16
|
+
/** Byte-for-byte `QuorumEnforcer.computeQuorumPayloadHash` — what quorum signers sign for a call that REDEEMS. */
|
|
17
|
+
export declare function computeQuorumPayloadHash(a: OnChainQuorumAction): Hex;
|
|
18
|
+
export declare const OFF_CHAIN_QUORUM_DOMAIN_NAME = "AgenticQuorumAction";
|
|
19
|
+
export declare const OFF_CHAIN_QUORUM_DOMAIN_VERSION = "1";
|
|
20
|
+
export declare const OFF_CHAIN_QUORUM_EIP712_TYPES: {
|
|
21
|
+
readonly OffChainQuorumAction: readonly [{
|
|
22
|
+
readonly name: "delegationHash";
|
|
23
|
+
readonly type: "bytes32";
|
|
24
|
+
}, {
|
|
25
|
+
readonly name: "delegator";
|
|
26
|
+
readonly type: "address";
|
|
27
|
+
}, {
|
|
28
|
+
readonly name: "audience";
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
}, {
|
|
31
|
+
readonly name: "operation";
|
|
32
|
+
readonly type: "string";
|
|
33
|
+
}, {
|
|
34
|
+
readonly name: "argumentsHash";
|
|
35
|
+
readonly type: "bytes32";
|
|
36
|
+
}, {
|
|
37
|
+
readonly name: "expiresAt";
|
|
38
|
+
readonly type: "uint256";
|
|
39
|
+
}];
|
|
40
|
+
};
|
|
41
|
+
/** THE ACTION a quorum approves off chain. Every field is the verifier's own fact about the call it is about
|
|
42
|
+
* to authorize — recomputed server-side, never read from the proof. */
|
|
43
|
+
export interface OffChainQuorumAction {
|
|
44
|
+
chainId: number;
|
|
45
|
+
/** The QuorumEnforcer address the delegation's QuorumCaveat names (the EIP-712 `verifyingContract`). */
|
|
46
|
+
enforcer: Address;
|
|
47
|
+
/** `hashDelegation(delegation, chainId, delegationManager)`. */
|
|
48
|
+
delegationHash: Hex;
|
|
49
|
+
delegator: Address;
|
|
50
|
+
/** The resource server the call is addressed to (the token's `aud`). */
|
|
51
|
+
audience: string;
|
|
52
|
+
/** The tool / operation name. */
|
|
53
|
+
operation: string;
|
|
54
|
+
/** `canonicalArgumentsHash(args)` over the arguments ACTUALLY received. */
|
|
55
|
+
argumentsHash: Hex;
|
|
56
|
+
/** Unix seconds after which the approval is void. Signed; chosen by the signers. */
|
|
57
|
+
expiresAt: number;
|
|
58
|
+
}
|
|
59
|
+
/** The digest quorum signers sign to approve one off-chain action (wallets: `signTypedData`). */
|
|
60
|
+
export declare function computeOffChainQuorumPayloadHash(a: OffChainQuorumAction): Hex;
|
|
2
61
|
export interface OffChainQuorumProof {
|
|
3
62
|
mode: 'off-chain';
|
|
4
|
-
/** The hash the signers signed — MUST equal
|
|
63
|
+
/** The hash the signers signed — MUST equal `computeOffChainQuorumPayloadHash` of the action being
|
|
64
|
+
* authorized. Carried so a mismatch is reported as `payload_unbound`; it is never what is verified against. */
|
|
5
65
|
payloadHash: Hex;
|
|
66
|
+
/** Unix seconds the approval is good until — a SIGNED field of the payload. */
|
|
67
|
+
expiresAt: number;
|
|
6
68
|
/** Concatenated 65-byte ECDSA/packed signatures (Safe-style packing). */
|
|
7
69
|
packedSignatures: Hex;
|
|
8
70
|
}
|
|
@@ -10,14 +72,20 @@ export interface VerifyOffChainQuorumInput {
|
|
|
10
72
|
/** The QuorumCaveat `terms`: abi(address[] signers, uint8 threshold, address approvedHashRegistry). */
|
|
11
73
|
caveatTerms: Hex;
|
|
12
74
|
proof: OffChainQuorumProof;
|
|
13
|
-
/**
|
|
14
|
-
|
|
75
|
+
/** THE ACTION being authorized, as the verifier knows it (`expiresAt` comes from the proof and is signed). */
|
|
76
|
+
action: Omit<OffChainQuorumAction, 'expiresAt'>;
|
|
77
|
+
/** The delegation's own issuance signature. It is never a quorum signature: a slot carrying it is refused
|
|
78
|
+
* outright (it could not verify over the action digest anyway — this makes the refusal explicit and named). */
|
|
79
|
+
delegationSignature: Hex;
|
|
80
|
+
/** Unix seconds. */
|
|
81
|
+
now: number;
|
|
15
82
|
/** Connection-agnostic signature verifier (token.ts wires `verifyUniversalSignature`). */
|
|
16
83
|
verifySignature: (signer: Address, digest: Hex, signature: Hex) => Promise<boolean>;
|
|
17
84
|
}
|
|
18
85
|
export type OffChainQuorumResult = {
|
|
19
86
|
ok: true;
|
|
20
87
|
matched: Address[];
|
|
88
|
+
payloadHash: Hex;
|
|
21
89
|
} | {
|
|
22
90
|
ok: false;
|
|
23
91
|
reason: string;
|
package/dist/quorum.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quorum.d.ts","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quorum.d.ts","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"AAgCA,OAAO,EAA+E,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAQ3H,gHAAgH;AAChH,eAAO,MAAM,kBAAkB,+JAC+H,CAAC;AAC/J,eAAO,MAAM,sBAAsB,EAAE,GAA4C,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;CACf;AAED,kHAAkH;AAClH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,mBAAmB,GAAG,GAAG,CAQpE;AAID,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,eAAO,MAAM,+BAA+B,MAAM,CAAC;AACnD,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;CAShC,CAAC;AAEX;wEACwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,wGAAwG;IACxG,QAAQ,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,aAAa,EAAE,GAAG,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iGAAiG;AACjG,wBAAgB,gCAAgC,CAAC,CAAC,EAAE,oBAAoB,GAAG,GAAG,CAe7E;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB;oHACgH;IAChH,WAAW,EAAE,GAAG,CAAC;IACjB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,gBAAgB,EAAE,GAAG,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,uGAAuG;IACvG,WAAW,EAAE,GAAG,CAAC;IACjB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,8GAA8G;IAC9G,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;IAChD;oHACgH;IAChH,mBAAmB,EAAE,GAAG,CAAC;IACzB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,0FAA0F;IAC1F,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAYtH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuE1G"}
|
package/dist/quorum.js
CHANGED
|
@@ -1,22 +1,90 @@
|
|
|
1
|
-
// Off-chain quorum verification (spec 291 §6b
|
|
2
|
-
// redeem on chain, verify a QuorumCaveat off
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// sub-threshold match rejects.
|
|
1
|
+
// Off-chain quorum verification (spec 291 §6b; rebound to the ACTION by spec 445 / AUTH-4, 2026-11-10).
|
|
2
|
+
// For MCP-only operations that never redeem on chain, verify a QuorumCaveat off chain: threshold satisfied by
|
|
3
|
+
// DISTINCT members of the caveat's signer set, every signature valid over the bound payload — via the
|
|
4
|
+
// connection-agnostic signature verifier (EOA ECDSA / ERC-1271 / ERC-6492). Fail-closed: any decode error,
|
|
5
|
+
// unbound payload, expired approval or sub-threshold match rejects.
|
|
7
6
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// delegation
|
|
7
|
+
// THE PROPERTY (stated over the whole object): a quorum signature is an approval of ONE ACTION under ONE
|
|
8
|
+
// delegation on ONE chain at ONE enforcer, and it is a different kind of signature from the one that ISSUES a
|
|
9
|
+
// delegation. So the payload is the EIP-712 digest of
|
|
11
10
|
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
|
|
11
|
+
// domain { name: "AgenticQuorumAction", version: "1", chainId, verifyingContract: <the QuorumEnforcer> }
|
|
12
|
+
// OffChainQuorumAction(bytes32 delegationHash,address delegator,string audience,string operation,
|
|
13
|
+
// bytes32 argumentsHash,uint256 expiresAt)
|
|
14
|
+
//
|
|
15
|
+
// and the VERIFIER computes it from what it is about to authorize — it is never taken from the proof.
|
|
16
|
+
//
|
|
17
|
+
// WHAT THIS REPLACED (AUTH-4): the quorum signed the bare delegation hash — the same 32 bytes the issuing
|
|
18
|
+
// custodian signs to issue the delegation, with no domain separation. `delegation.signature`, which travels in
|
|
19
|
+
// clear inside every token, was therefore itself a valid quorum signature whenever the issuer sat in the signer
|
|
20
|
+
// set (the natural configuration), and one proof authorized every quorum-gated tool for the delegation's life.
|
|
21
|
+
//
|
|
22
|
+
// ON CHAIN IS A DIFFERENT DIGEST, DELIBERATELY. `QuorumEnforcer.beforeHook` binds
|
|
23
|
+
// `keccak256(abi.encode(QUORUM_ACTION_TYPEHASH, chainid, enforcer, delegationHash, delegator, redeemer, target,
|
|
24
|
+
// value, keccak256(callData)))` — an EVM call. An off-chain action is a tool call (audience, operation,
|
|
25
|
+
// arguments): it has no redeemer, target, value or calldata, and an off-chain proof is never redeemed on chain
|
|
26
|
+
// (`quorumProof.mode: 'off-chain'` is for tools that never reach the enforcer). The two are domain-separated so
|
|
27
|
+
// neither can stand in for the other; `computeQuorumPayloadHash` below is the byte-for-byte mirror of the
|
|
28
|
+
// on-chain one for callers that DO redeem (cross-stack test: test/integration/cross-stack-typehashes.test.ts).
|
|
29
|
+
//
|
|
30
|
+
// Port: smart-agent RecoveryEnforcer.sol (guardian threshold + per-signer + intent-bound). Divergence: that
|
|
31
|
+
// verifies on-chain at redeem; this is the off-chain equivalent for tools that never redeem.
|
|
32
|
+
import { decodeAbiParameters, encodeAbiParameters, hashTypedData, keccak256, toBytes } from 'viem';
|
|
33
|
+
import { assertChainId } from './hash.js';
|
|
34
|
+
const ADDRESS = /^0x[0-9a-fA-F]{40}$/;
|
|
35
|
+
const BYTES32 = /^0x[0-9a-fA-F]{64}$/;
|
|
36
|
+
// ─── The on-chain payload (mirror of QuorumEnforcer.sol) ───────────────────────────────────────────
|
|
37
|
+
/** `QuorumEnforcer.QUORUM_ACTION_TYPEHASH`'s type string — compared to the live Solidity source cross-stack. */
|
|
38
|
+
export const QUORUM_ACTION_TYPE = 'QuorumAction(uint256 chainId,address enforcer,bytes32 delegationHash,address delegator,address redeemer,address target,uint256 value,bytes32 callDataHash)';
|
|
39
|
+
export const QUORUM_ACTION_TYPEHASH = keccak256(toBytes(QUORUM_ACTION_TYPE));
|
|
40
|
+
/** Byte-for-byte `QuorumEnforcer.computeQuorumPayloadHash` — what quorum signers sign for a call that REDEEMS. */
|
|
41
|
+
export function computeQuorumPayloadHash(a) {
|
|
42
|
+
assertChainId(a.chainId, 'computeQuorumPayloadHash');
|
|
43
|
+
return keccak256(encodeAbiParameters([{ type: 'bytes32' }, { type: 'uint256' }, { type: 'address' }, { type: 'bytes32' }, { type: 'address' }, { type: 'address' }, { type: 'address' }, { type: 'uint256' }, { type: 'bytes32' }], [QUORUM_ACTION_TYPEHASH, BigInt(a.chainId), a.enforcer, a.delegationHash, a.delegator, a.redeemer, a.target, a.value, keccak256(a.callData)]));
|
|
44
|
+
}
|
|
45
|
+
// ─── The off-chain payload ─────────────────────────────────────────────────────────────────────────
|
|
46
|
+
export const OFF_CHAIN_QUORUM_DOMAIN_NAME = 'AgenticQuorumAction';
|
|
47
|
+
export const OFF_CHAIN_QUORUM_DOMAIN_VERSION = '1';
|
|
48
|
+
export const OFF_CHAIN_QUORUM_EIP712_TYPES = {
|
|
49
|
+
OffChainQuorumAction: [
|
|
50
|
+
{ name: 'delegationHash', type: 'bytes32' },
|
|
51
|
+
{ name: 'delegator', type: 'address' },
|
|
52
|
+
{ name: 'audience', type: 'string' },
|
|
53
|
+
{ name: 'operation', type: 'string' },
|
|
54
|
+
{ name: 'argumentsHash', type: 'bytes32' },
|
|
55
|
+
{ name: 'expiresAt', type: 'uint256' },
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
/** The digest quorum signers sign to approve one off-chain action (wallets: `signTypedData`). */
|
|
59
|
+
export function computeOffChainQuorumPayloadHash(a) {
|
|
60
|
+
assertChainId(a.chainId, 'computeOffChainQuorumPayloadHash');
|
|
61
|
+
if (!ADDRESS.test(a.enforcer ?? ''))
|
|
62
|
+
throw new Error('computeOffChainQuorumPayloadHash: enforcer must be an address');
|
|
63
|
+
if (!ADDRESS.test(a.delegator ?? ''))
|
|
64
|
+
throw new Error('computeOffChainQuorumPayloadHash: delegator must be an address');
|
|
65
|
+
if (!BYTES32.test(a.delegationHash ?? ''))
|
|
66
|
+
throw new Error('computeOffChainQuorumPayloadHash: delegationHash must be bytes32');
|
|
67
|
+
if (!BYTES32.test(a.argumentsHash ?? ''))
|
|
68
|
+
throw new Error('computeOffChainQuorumPayloadHash: argumentsHash must be bytes32');
|
|
69
|
+
if (typeof a.audience !== 'string' || !a.audience)
|
|
70
|
+
throw new Error('computeOffChainQuorumPayloadHash: audience is required');
|
|
71
|
+
if (typeof a.operation !== 'string' || !a.operation)
|
|
72
|
+
throw new Error('computeOffChainQuorumPayloadHash: operation is required');
|
|
73
|
+
if (!Number.isSafeInteger(a.expiresAt) || a.expiresAt <= 0)
|
|
74
|
+
throw new Error('computeOffChainQuorumPayloadHash: expiresAt must be unix seconds');
|
|
75
|
+
return hashTypedData({
|
|
76
|
+
domain: { name: OFF_CHAIN_QUORUM_DOMAIN_NAME, version: OFF_CHAIN_QUORUM_DOMAIN_VERSION, chainId: a.chainId, verifyingContract: a.enforcer },
|
|
77
|
+
types: OFF_CHAIN_QUORUM_EIP712_TYPES,
|
|
78
|
+
primaryType: 'OffChainQuorumAction',
|
|
79
|
+
message: { delegationHash: a.delegationHash, delegator: a.delegator, audience: a.audience, operation: a.operation, argumentsHash: a.argumentsHash, expiresAt: BigInt(a.expiresAt) },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
16
82
|
/** Split a 0x-prefixed blob of concatenated 65-byte signatures; null if malformed. */
|
|
17
83
|
function splitPackedSignatures(packed) {
|
|
84
|
+
if (typeof packed !== 'string')
|
|
85
|
+
return null;
|
|
18
86
|
const hex = packed.startsWith('0x') ? packed.slice(2) : packed;
|
|
19
|
-
if (hex.length === 0 || hex.length % 130 !== 0)
|
|
87
|
+
if (hex.length === 0 || hex.length % 130 !== 0 || !/^[0-9a-fA-F]+$/.test(hex))
|
|
20
88
|
return null; // 65 bytes = 130 hex chars
|
|
21
89
|
const out = [];
|
|
22
90
|
for (let i = 0; i < hex.length; i += 130)
|
|
@@ -24,8 +92,24 @@ function splitPackedSignatures(packed) {
|
|
|
24
92
|
return out;
|
|
25
93
|
}
|
|
26
94
|
export async function verifyOffChainQuorum(input) {
|
|
27
|
-
// 1. Payload binding —
|
|
28
|
-
|
|
95
|
+
// 1. Payload binding — computed HERE from the action; the proof's own claim is only compared to it.
|
|
96
|
+
const proof = input.proof;
|
|
97
|
+
if (!proof || typeof proof.expiresAt !== 'number' || !Number.isSafeInteger(proof.expiresAt))
|
|
98
|
+
return { ok: false, reason: 'bad_expiry' };
|
|
99
|
+
if (!Number.isFinite(input.now) || proof.expiresAt < input.now)
|
|
100
|
+
return { ok: false, reason: 'quorum_approval_expired' };
|
|
101
|
+
let expected;
|
|
102
|
+
try {
|
|
103
|
+
expected = computeOffChainQuorumPayloadHash({ ...input.action, expiresAt: proof.expiresAt });
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
return { ok: false, reason: `action_unbound (${e instanceof Error ? e.message : 'invalid action'})` };
|
|
107
|
+
}
|
|
108
|
+
if (typeof proof.payloadHash !== 'string' || proof.payloadHash.toLowerCase() !== expected.toLowerCase()) {
|
|
109
|
+
// Named separately: the pre-445 proof shape (the quorum "approving the delegation") is the commonest way here.
|
|
110
|
+
if (typeof proof.payloadHash === 'string' && proof.payloadHash.toLowerCase() === input.action.delegationHash.toLowerCase()) {
|
|
111
|
+
return { ok: false, reason: 'payload_is_delegation_hash' };
|
|
112
|
+
}
|
|
29
113
|
return { ok: false, reason: 'payload_unbound' };
|
|
30
114
|
}
|
|
31
115
|
// 2. Decode the caveat's authorized signer set + threshold.
|
|
@@ -33,23 +117,29 @@ export async function verifyOffChainQuorum(input) {
|
|
|
33
117
|
let threshold;
|
|
34
118
|
try {
|
|
35
119
|
const [s, t] = decodeAbiParameters([{ type: 'address[]' }, { type: 'uint8' }, { type: 'address' }], input.caveatTerms);
|
|
36
|
-
|
|
120
|
+
// The SET: an address listed twice is one member (it can sign once).
|
|
121
|
+
signers = [...new Map(s.map((a) => [a.toLowerCase(), a])).values()];
|
|
37
122
|
threshold = Number(t);
|
|
38
123
|
}
|
|
39
124
|
catch {
|
|
40
125
|
return { ok: false, reason: 'bad_caveat_terms' };
|
|
41
126
|
}
|
|
42
|
-
|
|
127
|
+
// EN-11 parity with QuorumEnforcer: threshold 0 would pass with zero signatures — refused, never defaulted.
|
|
128
|
+
if (!Number.isInteger(threshold) || threshold <= 0)
|
|
43
129
|
return { ok: false, reason: 'bad_threshold' };
|
|
44
130
|
if (signers.length < threshold)
|
|
45
131
|
return { ok: false, reason: 'whitelist_smaller_than_threshold' };
|
|
46
132
|
// 3. Split the packed signatures.
|
|
47
|
-
const sigs = splitPackedSignatures(
|
|
133
|
+
const sigs = splitPackedSignatures(proof.packedSignatures);
|
|
48
134
|
if (sigs === null)
|
|
49
135
|
return { ok: false, reason: 'bad_signatures' };
|
|
136
|
+
const issuance = typeof input.delegationSignature === 'string' ? input.delegationSignature.toLowerCase() : '';
|
|
137
|
+
if (issuance.length > 2 && sigs.some((s) => s.toLowerCase() === issuance)) {
|
|
138
|
+
return { ok: false, reason: 'delegation_signature_in_quorum_slot' };
|
|
139
|
+
}
|
|
50
140
|
if (sigs.length < threshold)
|
|
51
141
|
return { ok: false, reason: 'insufficient_signatures' };
|
|
52
|
-
// 4. Match each signature to a UNIQUE authorized signer (no double-count).
|
|
142
|
+
// 4. Match each signature to a UNIQUE authorized signer (no double-count) over the COMPUTED digest.
|
|
53
143
|
const remaining = new Set(signers.map((a) => a.toLowerCase()));
|
|
54
144
|
const matched = [];
|
|
55
145
|
for (const sig of sigs) {
|
|
@@ -58,7 +148,7 @@ export async function verifyOffChainQuorum(input) {
|
|
|
58
148
|
continue;
|
|
59
149
|
let ok = false;
|
|
60
150
|
try {
|
|
61
|
-
ok = await input.verifySignature(signer,
|
|
151
|
+
ok = (await input.verifySignature(signer, expected, sig)) === true;
|
|
62
152
|
}
|
|
63
153
|
catch {
|
|
64
154
|
ok = false; // a throwing verifier is a failed check (fail-closed)
|
|
@@ -75,6 +165,6 @@ export async function verifyOffChainQuorum(input) {
|
|
|
75
165
|
if (matched.length < threshold) {
|
|
76
166
|
return { ok: false, reason: `threshold_unmet (${matched.length}/${threshold})` };
|
|
77
167
|
}
|
|
78
|
-
return { ok: true, matched };
|
|
168
|
+
return { ok: true, matched, payloadHash: expected };
|
|
79
169
|
}
|
|
80
170
|
//# sourceMappingURL=quorum.js.map
|
package/dist/quorum.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quorum.js","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"quorum.js","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"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"}
|
package/dist/standing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standing.d.ts","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"standing.d.ts","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"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"}
|
package/dist/standing.js
CHANGED
|
@@ -6,10 +6,16 @@
|
|
|
6
6
|
//
|
|
7
7
|
// When a run parks `authority_required`, the holder of the delegate key DERIVES the mandate the run asked for: a
|
|
8
8
|
// child of the standing wire bound to exactly that intent (`deriveMandate`, subset-checked by the capability's own
|
|
9
|
-
// handler), signs it with the delegate key, and presents the chain [child, standing].
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
9
|
+
// handler), signs it with the delegate key, and presents the chain [child, standing].
|
|
10
|
+
//
|
|
11
|
+
// WHO HOLDS THE CHILD TO THE WIRE (spec 445 §3.1). Not this file: `deriveFromStanding` is the honest minter's
|
|
12
|
+
// early refusal, and the holder of the delegate key can sign a child without calling it. The VERIFIER does —
|
|
13
|
+
// `verifyAuthorityChain`, run by the harness composition before every step and by the presentation release before
|
|
14
|
+
// every signature: the root delegator is the principal the step needs; the standing wire is signed by her (ERC-1271
|
|
15
|
+
// / approved digest), unrevoked on chain, in window; the child ⊆ the wire by the capability's handler; and the step
|
|
16
|
+
// itself is within the WIRE's caveats, not only the child's. Revoke the standing wire on chain and the next step,
|
|
17
|
+
// and the next presentation, are refused. (Before spec 445 this paragraph claimed "the harness verifies … the child
|
|
18
|
+
// ⊆ parent"; it verified the wire was live and read the child alone — audit H-7 / AUTH-1, H-8 / AUTH-2.)
|
|
13
19
|
//
|
|
14
20
|
// What a standing wire is NOT: a session, a bearer, a wildcard (never `A2A_ANY_SKILL`), or a pre-approval of
|
|
15
21
|
// anything but the named capability within the window and the cap. One wire, one capability selector.
|
package/dist/standing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standing.js","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,mHAAmH;AACnH,mHAAmH;AACnH,4GAA4G;AAC5G,+FAA+F;AAC/F,EAAE;AACF,iHAAiH;AACjH,mHAAmH;AACnH,
|
|
1
|
+
{"version":3,"file":"standing.js","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"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"}
|
package/dist/token.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Address, type Hex } from 'viem';
|
|
2
2
|
import type { Delegation, DelegationTokenClaims, VerifyError, VerifyOpts, DataScopeGrant, VaultRecordScopeGrant } from './types.js';
|
|
3
|
+
import { type OffChainQuorumProof } from './quorum.js';
|
|
3
4
|
import { type AuditSink } from '@agenticprimitives/audit';
|
|
4
5
|
/** Sorted-key JSON; BigInt → numeric string. Both sides must produce the
|
|
5
6
|
* exact same bytes for the signature to round-trip.
|
|
@@ -171,17 +172,19 @@ export interface VerifyOptsExt extends VerifyOpts {
|
|
|
171
172
|
* Use this for any flow that actually broadcasts a UserOp /
|
|
172
173
|
* transaction that hits the on-chain enforcer.
|
|
173
174
|
*
|
|
174
|
-
* - `{ mode: 'off-chain', payloadHash, packedSignatures }` — for
|
|
175
|
+
* - `{ mode: 'off-chain', payloadHash, expiresAt, packedSignatures }` — for
|
|
175
176
|
* MCP-only / data-tool flows that never reach the on-chain
|
|
176
|
-
* enforcer. The
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
177
|
+
* enforcer. The quorum signs ONE ACTION: the EIP-712 digest
|
|
178
|
+
* `computeOffChainQuorumPayloadHash({ chainId, enforcer,
|
|
179
|
+
* delegationHash, delegator, audience, operation, argumentsHash,
|
|
180
|
+
* expiresAt })` (domain `AgenticQuorumAction`, distinct from the
|
|
181
|
+
* delegation's own). The verifier RECOMPUTES that digest from
|
|
182
|
+
* `quorumAction` + this call's audience / tool / delegation and
|
|
183
|
+
* checks the packed signatures against it and against the signer
|
|
184
|
+
* set in the QuorumCaveat terms — distinct members, threshold ≥ 1.
|
|
185
|
+
* Spec 445 / AUTH-4: a proof over the bare delegation hash (the
|
|
186
|
+
* pre-445 shape), a proof for another action, and the delegation's
|
|
187
|
+
* own signature in a slot are all refused.
|
|
185
188
|
*
|
|
186
189
|
* If `requireQuorumCaveat` is set without a `quorumProof`, the
|
|
187
190
|
* verifier rejects. This makes the off-chain enforcement gap
|
|
@@ -190,10 +193,16 @@ export interface VerifyOptsExt extends VerifyOpts {
|
|
|
190
193
|
*/
|
|
191
194
|
quorumProof?: {
|
|
192
195
|
mode: 'on-chain-redeemed';
|
|
193
|
-
} |
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
196
|
+
} | OffChainQuorumProof;
|
|
197
|
+
/**
|
|
198
|
+
* Spec 445 / AUTH-4 — THE ACTION an off-chain quorum proof must have approved: the canonical hash of the
|
|
199
|
+
* arguments this call ACTUALLY carries (`canonicalArgumentsHash(args)`, recomputed by the resource server —
|
|
200
|
+
* never the client's stated value). The operation is `toolName`, the audience is `audience`. REQUIRED with
|
|
201
|
+
* `quorumProof.mode: 'off-chain'`: absent ⇒ the verifier rejects (`quorum_off_chain_requires_action`) —
|
|
202
|
+
* a quorum that is not told what it approves approves nothing.
|
|
203
|
+
*/
|
|
204
|
+
quorumAction?: {
|
|
205
|
+
argumentsHash: Hex;
|
|
197
206
|
};
|
|
198
207
|
/**
|
|
199
208
|
* Usage-accounting mode for the delegation token's `usageLimit`/JTI (spec 290 §3).
|
package/dist/token.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA4B,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AACxE,OAAO,KAAK,EACV,UAAU,EACV,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,cAAc,EACd,qBAAqB,EACtB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"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"}
|
package/dist/token.js
CHANGED
|
@@ -619,7 +619,14 @@ export async function verifyDelegationToken(token, opts) {
|
|
|
619
619
|
// inert sentinels denies with `'context-required'` rather than silently
|
|
620
620
|
// permitting. Callers who genuinely will redeem on-chain (a separate
|
|
621
621
|
// redeem path) call `evaluateCaveats` directly with `{ enforceOnChain: true }`.
|
|
622
|
-
|
|
622
|
+
// Spec 445 / AUTH-4 — THE QUORUM CAVEAT HAS ONE JUDGE. The evaluator has no entry for the QuorumEnforcer (it
|
|
623
|
+
// cannot check signatures), so a delegation carrying one is `unknown enforcer` ⇒ denied — which is right for
|
|
624
|
+
// every verifier that does not verify the quorum, and is why the off-chain gate below was unreachable through
|
|
625
|
+
// this function before. ONLY when this call verifies the quorum's signatures itself (step 4.5, `off-chain`
|
|
626
|
+
// mode) are that enforcer's caveats handed to that gate instead; `on-chain-redeemed` is a caller's assertion,
|
|
627
|
+
// verifies nothing here, and so leaves the caveat with the evaluator (denied unless the map knows it).
|
|
628
|
+
const quorumJudgedHere = opts.requireQuorumCaveat && opts.quorumProof?.mode === 'off-chain' ? opts.requireQuorumCaveat.enforcer.toLowerCase() : null;
|
|
629
|
+
const verdicts = evaluateCaveats(quorumJudgedHere ? claims.delegation.caveats.filter((c) => c.enforcer.toLowerCase() !== quorumJudgedHere) : claims.delegation.caveats, { timestamp: now, mcpTool: opts.toolName }, opts.enforcerMap, { enforceOnChain: opts.enforceOnChain === true });
|
|
623
630
|
for (const v of verdicts) {
|
|
624
631
|
if (!v.allowed) {
|
|
625
632
|
return rejectWith(`caveat denied (${v.reason})`, claims.delegation.delegator, eip712Hash);
|
|
@@ -645,34 +652,56 @@ export async function verifyDelegationToken(token, opts) {
|
|
|
645
652
|
}
|
|
646
653
|
if (opts.quorumProof.mode === 'off-chain') {
|
|
647
654
|
// Spec 291 §6b — verify the QuorumCaveat off-chain (threshold + authorized
|
|
648
|
-
// signers + signatures bound to THIS delegation
|
|
655
|
+
// signers + signatures bound to THIS ACTION under this delegation). For tools that
|
|
649
656
|
// never redeem on chain. Requires the UniversalSignatureValidator surface
|
|
650
657
|
// so any signer credential strategy (EOA / ERC-1271 / ERC-6492) works.
|
|
651
658
|
if (!opts.universalSignatureValidator) {
|
|
652
659
|
return rejectWith('quorum_off_chain_requires_universalSignatureValidator', claims.delegation.delegator, eip712Hash);
|
|
653
660
|
}
|
|
654
661
|
const usv = opts.universalSignatureValidator;
|
|
655
|
-
|
|
656
|
-
|
|
662
|
+
// EVERY caveat of that enforcer must be satisfied (they were all taken from the evaluator above).
|
|
663
|
+
const quorumCaveats = claims.delegation.caveats.filter((c) => c.enforcer.toLowerCase() === target);
|
|
664
|
+
if (quorumCaveats.length === 0) {
|
|
657
665
|
// Defensive — hasQuorum above already guaranteed presence.
|
|
658
666
|
return rejectWith('quorum caveat vanished', claims.delegation.delegator, eip712Hash);
|
|
659
667
|
}
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
668
|
+
// Spec 445 / AUTH-4 — the quorum approves THIS ACTION, not "this delegation": the digest is recomputed
|
|
669
|
+
// here from the tool, the arguments received, the audience, the delegation, the chain and the enforcer.
|
|
670
|
+
// The proof's own `payloadHash` is only compared to it. Absent facts are a refusal, never a default.
|
|
671
|
+
if (!opts.toolName) {
|
|
672
|
+
return rejectWith('quorum_off_chain_requires_toolName', claims.delegation.delegator, eip712Hash);
|
|
673
|
+
}
|
|
674
|
+
if (!opts.quorumAction || !/^0x[0-9a-fA-F]{64}$/.test(opts.quorumAction.argumentsHash ?? '')) {
|
|
675
|
+
return rejectWith('quorum_off_chain_requires_action', claims.delegation.delegator, eip712Hash);
|
|
676
|
+
}
|
|
677
|
+
for (const quorumCaveat of quorumCaveats) {
|
|
678
|
+
const quorumResult = await verifyOffChainQuorum({
|
|
679
|
+
caveatTerms: quorumCaveat.terms,
|
|
680
|
+
proof: opts.quorumProof,
|
|
681
|
+
action: {
|
|
682
|
+
chainId: opts.chainId,
|
|
683
|
+
enforcer: opts.requireQuorumCaveat.enforcer,
|
|
684
|
+
delegationHash: eip712Hash,
|
|
685
|
+
delegator: claims.delegation.delegator,
|
|
686
|
+
audience: opts.audience,
|
|
687
|
+
operation: opts.toolName,
|
|
688
|
+
argumentsHash: opts.quorumAction.argumentsHash,
|
|
689
|
+
},
|
|
690
|
+
// The issuance signature travels in clear in every token; it is never a quorum signature.
|
|
691
|
+
delegationSignature: claims.delegation.signature,
|
|
692
|
+
now,
|
|
693
|
+
verifySignature: (signer, digest, signature) => verifyUniversalSignature({ signer, digest, signature, rpcUrl: opts.rpcUrl, universalSignatureValidator: usv }),
|
|
694
|
+
});
|
|
695
|
+
if (!quorumResult.ok) {
|
|
696
|
+
return rejectWith(`quorum_off_chain: ${quorumResult.reason}`, claims.delegation.delegator, eip712Hash);
|
|
697
|
+
}
|
|
670
698
|
}
|
|
671
699
|
// Verified — fall through to the rest of the pipeline.
|
|
672
700
|
}
|
|
673
|
-
// mode === 'on-chain-redeemed' — caller asserts the call will
|
|
674
|
-
//
|
|
675
|
-
//
|
|
701
|
+
// mode === 'on-chain-redeemed' — the caller asserts the call will pass through
|
|
702
|
+
// QuorumEnforcer.beforeHook on chain, where the signatures are checked against the
|
|
703
|
+
// CALL (`computeQuorumPayloadHash`). Nothing is verified here on that assertion, so the
|
|
704
|
+
// quorum caveat stayed with the evaluator above (step 4), which has no judge for it.
|
|
676
705
|
}
|
|
677
706
|
// - requireAcceptedOnChain: account.hasAcceptedSessionDelegation(hash)
|
|
678
707
|
// must return true. Spec § 6 high-risk gate. Single extra chain
|