@keelcodes/conformance 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +187 -0
  3. package/dist/abi.d.ts +219 -0
  4. package/dist/abi.d.ts.map +1 -0
  5. package/dist/abi.js +41 -0
  6. package/dist/abi.js.map +1 -0
  7. package/dist/agents.d.ts +24 -0
  8. package/dist/agents.d.ts.map +1 -0
  9. package/dist/agents.js +161 -0
  10. package/dist/agents.js.map +1 -0
  11. package/dist/checks.d.ts +12 -0
  12. package/dist/checks.d.ts.map +1 -0
  13. package/dist/checks.js +168 -0
  14. package/dist/checks.js.map +1 -0
  15. package/dist/delegation.d.ts +40 -0
  16. package/dist/delegation.d.ts.map +1 -0
  17. package/dist/delegation.js +245 -0
  18. package/dist/delegation.js.map +1 -0
  19. package/dist/index.d.ts +30 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +25 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/permissions.d.ts +52 -0
  24. package/dist/permissions.d.ts.map +1 -0
  25. package/dist/permissions.js +189 -0
  26. package/dist/permissions.js.map +1 -0
  27. package/dist/reader.d.ts +9 -0
  28. package/dist/reader.d.ts.map +1 -0
  29. package/dist/reader.js +58 -0
  30. package/dist/reader.js.map +1 -0
  31. package/dist/redteam.d.ts +38 -0
  32. package/dist/redteam.d.ts.map +1 -0
  33. package/dist/redteam.js +190 -0
  34. package/dist/redteam.js.map +1 -0
  35. package/dist/report.d.ts +4 -0
  36. package/dist/report.d.ts.map +1 -0
  37. package/dist/report.js +29 -0
  38. package/dist/report.js.map +1 -0
  39. package/dist/runner.d.ts +8 -0
  40. package/dist/runner.d.ts.map +1 -0
  41. package/dist/runner.js +62 -0
  42. package/dist/runner.js.map +1 -0
  43. package/dist/types.d.ts +227 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +45 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.js","sourceRoot":"","sources":["../src/delegation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @keelcodes/conformance
3
+ *
4
+ * Cross-ecosystem conformance and security suite for agent accounts: it probes
5
+ * the standard surface of an ERC-7579 account (and the modules installed on it)
6
+ * and reports pass/fail per assertion, anchored to the spec.
7
+ *
8
+ * The suite talks to an {@link AccountReader} port, so it runs against an
9
+ * in-memory fake in tests or a live chain via {@link createViemReader} — no
10
+ * Keel-specific dependency, which is what makes it usable as a neutral public
11
+ * good.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ export { erc7579AccountAbi, erc7579ModuleAbi, erc7710ManagerAbi, erc8004IdentityAbi, erc8004ReputationAbi } from './abi.js';
16
+ export { ERC7579_CHECKS, ERC7579_SUITE } from './checks.js';
17
+ export { createViemReader } from './reader.js';
18
+ export { formatReport } from './report.js';
19
+ export { runChecks, runSuite, summarize } from './runner.js';
20
+ export { ANY_DELEGATE, EIP712_DOMAIN_TYPEHASH, ERC7710_CHECKS, ERC7710_SUITE, ROOT_AUTHORITY, SAMPLE_DELEGATION, caveatHash, computeDelegationHash, computeDomainHash, createViemDelegationReader, } from './delegation.js';
21
+ export { ERC7715_CHECKS, ERC7715_METHODS, ERC7715_SUITE, assertPermissionResponse, createViemPermissionsProvider, } from './permissions.js';
22
+ export { ERC721_INTERFACE_ID, ERC8004_CHECKS, ERC8004_SUITE, createViemAgentRegistryReader, } from './agents.js';
23
+ export { REDTEAM_CASES, REDTEAM_CHECKS, REDTEAM_SUITE, parseForgeRedTeamReport, toRedTeamPort, } from './redteam.js';
24
+ export { EXECUTION_MODE, MODULE_TYPE, accountTarget, moduleAdminTarget } from './types.js';
25
+ export type { ModuleTypeId } from './types.js';
26
+ export type { AccountReader, Address, AgentRegistryReader, Check, CheckResult, CheckTarget, ConformanceReport, ConformanceSummary, Delegation, DelegationCaveat, DelegationReader, Hex, ModuleAdminPort, PermissionsProvider, RedTeamPort, Severity, Suite, } from './types.js';
27
+ export type { PermissionResponse, PermissionRule } from './permissions.js';
28
+ export type { RedTeamCase } from './redteam.js';
29
+ export type { ViemAgentRegistryOptions } from './agents.js';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,uBAAuB,EACvB,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3F,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EACV,aAAa,EACb,OAAO,EACP,mBAAmB,EACnB,KAAK,EACL,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,GAAG,EACH,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,KAAK,GACN,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC3E,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @keelcodes/conformance
3
+ *
4
+ * Cross-ecosystem conformance and security suite for agent accounts: it probes
5
+ * the standard surface of an ERC-7579 account (and the modules installed on it)
6
+ * and reports pass/fail per assertion, anchored to the spec.
7
+ *
8
+ * The suite talks to an {@link AccountReader} port, so it runs against an
9
+ * in-memory fake in tests or a live chain via {@link createViemReader} — no
10
+ * Keel-specific dependency, which is what makes it usable as a neutral public
11
+ * good.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ export { erc7579AccountAbi, erc7579ModuleAbi, erc7710ManagerAbi, erc8004IdentityAbi, erc8004ReputationAbi } from './abi.js';
16
+ export { ERC7579_CHECKS, ERC7579_SUITE } from './checks.js';
17
+ export { createViemReader } from './reader.js';
18
+ export { formatReport } from './report.js';
19
+ export { runChecks, runSuite, summarize } from './runner.js';
20
+ export { ANY_DELEGATE, EIP712_DOMAIN_TYPEHASH, ERC7710_CHECKS, ERC7710_SUITE, ROOT_AUTHORITY, SAMPLE_DELEGATION, caveatHash, computeDelegationHash, computeDomainHash, createViemDelegationReader, } from './delegation.js';
21
+ export { ERC7715_CHECKS, ERC7715_METHODS, ERC7715_SUITE, assertPermissionResponse, createViemPermissionsProvider, } from './permissions.js';
22
+ export { ERC721_INTERFACE_ID, ERC8004_CHECKS, ERC8004_SUITE, createViemAgentRegistryReader, } from './agents.js';
23
+ export { REDTEAM_CASES, REDTEAM_CHECKS, REDTEAM_SUITE, parseForgeRedTeamReport, toRedTeamPort, } from './redteam.js';
24
+ export { EXECUTION_MODE, MODULE_TYPE, accountTarget, moduleAdminTarget } from './types.js';
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,uBAAuB,EACvB,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { PublicClient } from 'viem';
2
+ import type { Address, Check, Hex, PermissionsProvider, Suite } from './types.js';
3
+ /**
4
+ * ERC-7715 conformance (Request Permissions from Wallets).
5
+ *
6
+ * ERC-7715 is a **wallet JSON-RPC** standard (EIP-1193 `request`), not an
7
+ * on-chain interface; execution happens later through ERC-7710's
8
+ * `redeemDelegations`. The suite therefore probes the wallet's methods and
9
+ * validates the response shapes the EIP fixes — in particular that a granted
10
+ * permission carries an opaque `context` and a `delegationManager` a redeemer
11
+ * can actually call.
12
+ *
13
+ * Method names follow the current eips.ethereum.org text; older drafts and some
14
+ * MetaMask docs used `wallet_grantPermissions` / `wallet_getPermissions`.
15
+ */
16
+ export declare const ERC7715_METHODS: {
17
+ readonly request: "wallet_requestExecutionPermissions";
18
+ readonly revoke: "wallet_revokeExecutionPermission";
19
+ readonly supported: "wallet_getSupportedExecutionPermissions";
20
+ readonly granted: "wallet_getGrantedExecutionPermissions";
21
+ };
22
+ export interface PermissionRule {
23
+ type: string;
24
+ data: Record<string, unknown>;
25
+ }
26
+ export interface PermissionResponse {
27
+ /** `uint256` chain id, hex-encoded. */
28
+ chainId: Hex;
29
+ to: Address;
30
+ from?: Address;
31
+ permission: {
32
+ type: string;
33
+ isAdjustmentAllowed: boolean;
34
+ data: Record<string, unknown>;
35
+ };
36
+ rules?: readonly PermissionRule[];
37
+ /** Opaque, single-use string redeemed via ERC-7710. */
38
+ context: Hex;
39
+ dependencies: readonly {
40
+ factory: Hex;
41
+ factoryData: Hex;
42
+ }[];
43
+ delegationManager: Address;
44
+ }
45
+ /** Validates one `PermissionResponse` from `wallet_getGrantedExecutionPermissions`. */
46
+ export declare function assertPermissionResponse(value: unknown, index: number): PermissionResponse;
47
+ export declare const ERC7715_CHECKS: readonly Check[];
48
+ /** ERC-7715 permissions suite. */
49
+ export declare const ERC7715_SUITE: Suite;
50
+ /** Points the ERC-7715 suite at a wallet that speaks EIP-1193 `request`. */
51
+ export declare function createViemPermissionsProvider(client: PublicClient): PermissionsProvider;
52
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAe,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE/F;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,OAAO,EAAE,GAAG,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC/B,CAAC;IACF,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,uDAAuD;IACvD,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,SAAS;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,WAAW,EAAE,GAAG,CAAA;KAAE,EAAE,CAAC;IAC5D,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAUD,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAkD1F;AAkBD,eAAO,MAAM,cAAc,EAAE,SAAS,KAAK,EA2F1C,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,mBAAmB,CAMvF"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * ERC-7715 conformance (Request Permissions from Wallets).
3
+ *
4
+ * ERC-7715 is a **wallet JSON-RPC** standard (EIP-1193 `request`), not an
5
+ * on-chain interface; execution happens later through ERC-7710's
6
+ * `redeemDelegations`. The suite therefore probes the wallet's methods and
7
+ * validates the response shapes the EIP fixes — in particular that a granted
8
+ * permission carries an opaque `context` and a `delegationManager` a redeemer
9
+ * can actually call.
10
+ *
11
+ * Method names follow the current eips.ethereum.org text; older drafts and some
12
+ * MetaMask docs used `wallet_grantPermissions` / `wallet_getPermissions`.
13
+ */
14
+ export const ERC7715_METHODS = {
15
+ request: 'wallet_requestExecutionPermissions',
16
+ revoke: 'wallet_revokeExecutionPermission',
17
+ supported: 'wallet_getSupportedExecutionPermissions',
18
+ granted: 'wallet_getGrantedExecutionPermissions',
19
+ };
20
+ function isHex(value) {
21
+ return typeof value === 'string' && /^0x[0-9a-fA-F]*$/.test(value);
22
+ }
23
+ function isAddress(value) {
24
+ return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value);
25
+ }
26
+ /** Validates one `PermissionResponse` from `wallet_getGrantedExecutionPermissions`. */
27
+ export function assertPermissionResponse(value, index) {
28
+ const at = `permissions[${index}]`;
29
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
30
+ throw new Error(`${at} must be an object`);
31
+ }
32
+ const record = value;
33
+ if (!isHex(record['chainId']) || record['chainId'] === '0x') {
34
+ throw new Error(`${at}.chainId must be a hex-encoded chain id`);
35
+ }
36
+ if (!isAddress(record['to'])) {
37
+ throw new Error(`${at}.to must be an address`);
38
+ }
39
+ if (!isHex(record['context']) || record['context'] === '0x') {
40
+ throw new Error(`${at}.context must be a non-empty 0x string`);
41
+ }
42
+ if (!isAddress(record['delegationManager'])) {
43
+ throw new Error(`${at}.delegationManager must be an address`);
44
+ }
45
+ const permission = record['permission'];
46
+ if (typeof permission !== 'object' || permission === null || Array.isArray(permission)) {
47
+ throw new Error(`${at}.permission must be an object`);
48
+ }
49
+ const fields = permission;
50
+ if (typeof fields['type'] !== 'string' || fields['type'] === '') {
51
+ throw new Error(`${at}.permission.type must be a non-empty string`);
52
+ }
53
+ if (typeof fields['isAdjustmentAllowed'] !== 'boolean') {
54
+ throw new Error(`${at}.permission.isAdjustmentAllowed must be a boolean`);
55
+ }
56
+ if (typeof fields['data'] !== 'object' || fields['data'] === null) {
57
+ throw new Error(`${at}.permission.data must be an object`);
58
+ }
59
+ const dependencies = record['dependencies'];
60
+ if (!Array.isArray(dependencies)) {
61
+ throw new Error(`${at}.dependencies must be an array`);
62
+ }
63
+ dependencies.forEach((dependency, depIndex) => {
64
+ if (typeof dependency !== 'object' || dependency === null) {
65
+ throw new Error(`${at}.dependencies[${depIndex}] must be an object`);
66
+ }
67
+ const dep = dependency;
68
+ if (!isHex(dep['factory']) || !isHex(dep['factoryData'])) {
69
+ throw new Error(`${at}.dependencies[${depIndex}] must carry hex factory and factoryData`);
70
+ }
71
+ });
72
+ return value;
73
+ }
74
+ function permissionsProvider(target) {
75
+ const provider = target.permissions;
76
+ if (provider === undefined) {
77
+ throw new Error('the ERC-7715 suite needs a `permissions` provider on the target');
78
+ }
79
+ return provider;
80
+ }
81
+ async function discover(provider) {
82
+ const result = await provider.request({ method: ERC7715_METHODS.supported, params: [] });
83
+ if (typeof result !== 'object' || result === null || Array.isArray(result)) {
84
+ throw new Error(`${ERC7715_METHODS.supported} must return an object`);
85
+ }
86
+ return result;
87
+ }
88
+ export const ERC7715_CHECKS = [
89
+ {
90
+ id: 'erc7715.wallet.capabilityDiscovery',
91
+ title: 'Wallet advertises supported execution permissions',
92
+ spec: 'ERC-7715 §wallet_getSupportedExecutionPermissions',
93
+ severity: 'high',
94
+ async run(target) {
95
+ const supported = await discover(permissionsProvider(target));
96
+ const types = Object.keys(supported);
97
+ if (types.length === 0) {
98
+ throw new Error(`${ERC7715_METHODS.supported} returned no permission types`);
99
+ }
100
+ for (const type of types) {
101
+ const entry = supported[type];
102
+ if (typeof entry !== 'object' || entry === null) {
103
+ throw new Error(`supported permission ${type} must be an object`);
104
+ }
105
+ const record = entry;
106
+ if (!Array.isArray(record['chainIds'])) {
107
+ throw new Error(`supported permission ${type} must list chainIds`);
108
+ }
109
+ if (!Array.isArray(record['ruleTypes'])) {
110
+ throw new Error(`supported permission ${type} must list ruleTypes`);
111
+ }
112
+ }
113
+ return `${types.length} permission type(s) advertised`;
114
+ },
115
+ },
116
+ {
117
+ id: 'erc7715.wallet.chainIdFormat',
118
+ title: 'Advertised chain ids are 0x hex strings',
119
+ spec: 'ERC-7715 §wallet_getSupportedExecutionPermissions',
120
+ severity: 'medium',
121
+ async run(target) {
122
+ const supported = await discover(permissionsProvider(target));
123
+ for (const [type, entry] of Object.entries(supported)) {
124
+ const chainIds = entry['chainIds'];
125
+ if (!Array.isArray(chainIds))
126
+ continue;
127
+ for (const chainId of chainIds) {
128
+ if (!isHex(chainId) || chainId === '0x') {
129
+ throw new Error(`supported permission ${type} has a non-hex chainId ${JSON.stringify(chainId)}`);
130
+ }
131
+ }
132
+ }
133
+ return 'chain ids are hex-encoded';
134
+ },
135
+ },
136
+ {
137
+ id: 'erc7715.wallet.grantedResponseShape',
138
+ title: 'Granted permissions match the EIP response shape',
139
+ spec: 'ERC-7715 §PermissionResponse',
140
+ severity: 'high',
141
+ async run(target) {
142
+ const result = await permissionsProvider(target).request({
143
+ method: ERC7715_METHODS.granted,
144
+ params: [],
145
+ });
146
+ if (!Array.isArray(result)) {
147
+ throw new Error(`${ERC7715_METHODS.granted} must return an array`);
148
+ }
149
+ result.forEach((entry, index) => assertPermissionResponse(entry, index));
150
+ return `${result.length} granted permission(s) well-formed`;
151
+ },
152
+ },
153
+ {
154
+ id: 'erc7715.wallet.delegationManagerBound',
155
+ title: 'Granted permissions point at the expected DelegationManager',
156
+ spec: 'ERC-7715 §PermissionResponse → ERC-7710',
157
+ severity: 'high',
158
+ async run(target) {
159
+ const result = await permissionsProvider(target).request({
160
+ method: ERC7715_METHODS.granted,
161
+ params: [],
162
+ });
163
+ if (!Array.isArray(result) || result.length === 0) {
164
+ return 'no granted permissions to cross-check';
165
+ }
166
+ const permissions = result.map((entry, index) => assertPermissionResponse(entry, index));
167
+ // When a delegation reader is present, redemption must land on it.
168
+ const manager = target.delegation?.manager?.toLowerCase();
169
+ for (const permission of permissions) {
170
+ if (manager !== undefined && permission.delegationManager.toLowerCase() !== manager) {
171
+ throw new Error(`permission redeems via ${permission.delegationManager}, but the delegation manager under test is ${target.delegation?.manager}`);
172
+ }
173
+ }
174
+ return `all ${permissions.length} permission(s) redeem via a known DelegationManager`;
175
+ },
176
+ },
177
+ ];
178
+ /** ERC-7715 permissions suite. */
179
+ export const ERC7715_SUITE = {
180
+ name: 'ERC-7715',
181
+ spec: 'ERC-7715 (Request Permissions from Wallets)',
182
+ checks: ERC7715_CHECKS,
183
+ };
184
+ /** Points the ERC-7715 suite at a wallet that speaks EIP-1193 `request`. */
185
+ export function createViemPermissionsProvider(client) {
186
+ const request = client.request;
187
+ return { request: (args) => request(args) };
188
+ }
189
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PublicClient } from 'viem';
2
+ import type { AccountReader } from './types.js';
3
+ /**
4
+ * Adapts a viem `PublicClient` to {@link AccountReader} — the "run it against a
5
+ * live chain" path. Everything is a plain `view` call, so a read-only client and
6
+ * no signer are enough.
7
+ */
8
+ export declare function createViemReader(client: PublicClient): AccountReader;
9
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAuDpE"}
package/dist/reader.js ADDED
@@ -0,0 +1,58 @@
1
+ import { erc7579AccountAbi, erc7579ModuleAbi } from './abi.js';
2
+ /**
3
+ * Adapts a viem `PublicClient` to {@link AccountReader} — the "run it against a
4
+ * live chain" path. Everything is a plain `view` call, so a read-only client and
5
+ * no signer are enough.
6
+ */
7
+ export function createViemReader(client) {
8
+ const hasCode = async (account) => {
9
+ const code = await client.getCode({ address: account });
10
+ return Boolean(code && code !== '0x');
11
+ };
12
+ return {
13
+ hasCode,
14
+ async isModuleInstalled({ account, module, moduleTypeId }) {
15
+ // An account with no code is not deployed: nothing can be installed on it.
16
+ if (!(await hasCode(account)))
17
+ return false;
18
+ return client.readContract({
19
+ address: account,
20
+ abi: erc7579AccountAbi,
21
+ functionName: 'isModuleInstalled',
22
+ args: [moduleTypeId, module, '0x'],
23
+ });
24
+ },
25
+ async supportsExecutionMode(account, mode) {
26
+ return client.readContract({
27
+ address: account,
28
+ abi: erc7579AccountAbi,
29
+ functionName: 'supportsExecutionMode',
30
+ args: [mode],
31
+ });
32
+ },
33
+ async accountId(account) {
34
+ return client.readContract({
35
+ address: account,
36
+ abi: erc7579AccountAbi,
37
+ functionName: 'accountId',
38
+ });
39
+ },
40
+ async isModuleInitialized(module, account) {
41
+ return client.readContract({
42
+ address: module,
43
+ abi: erc7579ModuleAbi,
44
+ functionName: 'isInitialized',
45
+ args: [account],
46
+ });
47
+ },
48
+ async isModuleType(module, moduleTypeId) {
49
+ return client.readContract({
50
+ address: module,
51
+ abi: erc7579ModuleAbi,
52
+ functionName: 'isModuleType',
53
+ args: [moduleTypeId],
54
+ });
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG/D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAgB,EAAoB,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QAEP,KAAK,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE;YACvD,2EAA2E;YAC3E,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC5C,OAAO,MAAM,CAAC,YAAY,CAAC;gBACzB,OAAO,EAAE,OAAO;gBAChB,GAAG,EAAE,iBAAiB;gBACtB,YAAY,EAAE,mBAAmB;gBACjC,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAS;YAC5C,OAAO,MAAM,CAAC,YAAY,CAAC;gBACzB,OAAO,EAAE,OAAO;gBAChB,GAAG,EAAE,iBAAiB;gBACtB,YAAY,EAAE,uBAAuB;gBACrC,IAAI,EAAE,CAAC,IAAI,CAAC;aACb,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,OAAO;YACrB,OAAO,MAAM,CAAC,YAAY,CAAC;gBACzB,OAAO,EAAE,OAAO;gBAChB,GAAG,EAAE,iBAAiB;gBACtB,YAAY,EAAE,WAAW;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO;YACvC,OAAO,MAAM,CAAC,YAAY,CAAC;gBACzB,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,gBAAgB;gBACrB,YAAY,EAAE,eAAe;gBAC7B,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY;YACrC,OAAO,MAAM,CAAC,YAAY,CAAC;gBACzB,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,gBAAgB;gBACrB,YAAY,EAAE,cAAc;gBAC5B,IAAI,EAAE,CAAC,YAAY,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Check, RedTeamPort, Severity, Suite } from './types.js';
2
+ /**
3
+ * Red-team conformance suite.
4
+ *
5
+ * The adversarial cases are executable Foundry tests
6
+ * (`contracts/test/redteam/KeelPolicyHook.redteam.t.sol`); this module brings
7
+ * their results into the *same* report machinery as the standards suites so a
8
+ * run shows every threat id and whether it was actually exercised.
9
+ *
10
+ * The threat-id mapping is explicit and one-to-one: each `RedTeamCase` names the
11
+ * threat id from `docs/THREAT_MODEL.md` and the Foundry test that covers it,
12
+ * because the two spell ids differently (`T-BYPASS-01` vs `T_BYPASS_01`). A case
13
+ * whose result is absent reads as **"not run"** and fails — an unverified threat
14
+ * is never silently green.
15
+ */
16
+ export interface RedTeamCase {
17
+ /** Threat-model id (`docs/THREAT_MODEL.md`), e.g. `T-BYPASS-01`. */
18
+ threat: string;
19
+ /** The Foundry test function that exercises this threat. */
20
+ test: string;
21
+ title: string;
22
+ severity: Severity;
23
+ }
24
+ /** The threat catalogue, mapped test-by-test to `docs/THREAT_MODEL.md` §4. */
25
+ export declare const REDTEAM_CASES: readonly RedTeamCase[];
26
+ export declare const REDTEAM_CHECKS: readonly Check[];
27
+ /** Red-team suite: Foundry adversarial cases reported through the conformance runner. */
28
+ export declare const REDTEAM_SUITE: Suite;
29
+ /** Adapts a `testName → passed` table (e.g. from {@link parseForgeRedTeamReport}) to a {@link RedTeamPort}. */
30
+ export declare function toRedTeamPort(results: Readonly<Record<string, boolean>>): RedTeamPort;
31
+ /**
32
+ * Parses `forge test --match-path 'test/redteam/*' --json` output into a
33
+ * `testName → passed` table. Forge nests results by file → contract →
34
+ * `test_results`, so the walk is structural rather than depth-fixed; any leaf
35
+ * carrying a `status` is recorded.
36
+ */
37
+ export declare function parseForgeRedTeamReport(value: unknown): Record<string, boolean>;
38
+ //# sourceMappingURL=redteam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redteam.d.ts","sourceRoot":"","sources":["../src/redteam.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAe,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,8EAA8E;AAC9E,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EA+H/C,CAAC;AAUF,eAAO,MAAM,cAAc,EAAE,SAAS,KAAK,EAexC,CAAC;AAEJ,yFAAyF;AACzF,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,+GAA+G;AAC/G,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,WAAW,CAErF;AAOD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB/E"}