@agenticvault/agentic-vault 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.
- package/.claude-plugin/plugin.json +19 -0
- package/.env.example +16 -0
- package/.mcp.json.example +18 -0
- package/LICENSE +21 -0
- package/README.ja.md +163 -0
- package/README.ko.md +163 -0
- package/README.md +161 -0
- package/README.zh-CN.md +163 -0
- package/README.zh-TW.md +163 -0
- package/dist/agentic/audit/logger.d.ts +7 -0
- package/dist/agentic/audit/logger.js +19 -0
- package/dist/agentic/audit/logger.js.map +1 -0
- package/dist/agentic/audit/types.d.ts +11 -0
- package/dist/agentic/audit/types.js +2 -0
- package/dist/agentic/audit/types.js.map +1 -0
- package/dist/agentic/cli.d.ts +8 -0
- package/dist/agentic/cli.js +87 -0
- package/dist/agentic/cli.js.map +1 -0
- package/dist/agentic/index.d.ts +5 -0
- package/dist/agentic/index.js +7 -0
- package/dist/agentic/index.js.map +1 -0
- package/dist/agentic/mcp/server.d.ts +8 -0
- package/dist/agentic/mcp/server.js +25 -0
- package/dist/agentic/mcp/server.js.map +1 -0
- package/dist/agentic/mcp/tools/decoded-call-pipeline.d.ts +14 -0
- package/dist/agentic/mcp/tools/decoded-call-pipeline.js +18 -0
- package/dist/agentic/mcp/tools/decoded-call-pipeline.js.map +1 -0
- package/dist/agentic/mcp/tools/get-address.d.ts +3 -0
- package/dist/agentic/mcp/tools/get-address.js +25 -0
- package/dist/agentic/mcp/tools/get-address.js.map +1 -0
- package/dist/agentic/mcp/tools/health-check.d.ts +3 -0
- package/dist/agentic/mcp/tools/health-check.js +25 -0
- package/dist/agentic/mcp/tools/health-check.js.map +1 -0
- package/dist/agentic/mcp/tools/index.d.ts +7 -0
- package/dist/agentic/mcp/tools/index.js +21 -0
- package/dist/agentic/mcp/tools/index.js.map +1 -0
- package/dist/agentic/mcp/tools/result-adapter.d.ts +10 -0
- package/dist/agentic/mcp/tools/result-adapter.js +15 -0
- package/dist/agentic/mcp/tools/result-adapter.js.map +1 -0
- package/dist/agentic/mcp/tools/shared.d.ts +71 -0
- package/dist/agentic/mcp/tools/shared.js +12 -0
- package/dist/agentic/mcp/tools/shared.js.map +1 -0
- package/dist/agentic/mcp/tools/sign-defi-call.d.ts +3 -0
- package/dist/agentic/mcp/tools/sign-defi-call.js +23 -0
- package/dist/agentic/mcp/tools/sign-defi-call.js.map +1 -0
- package/dist/agentic/mcp/tools/sign-permit.d.ts +3 -0
- package/dist/agentic/mcp/tools/sign-permit.js +39 -0
- package/dist/agentic/mcp/tools/sign-permit.js.map +1 -0
- package/dist/agentic/mcp/tools/sign-swap.d.ts +3 -0
- package/dist/agentic/mcp/tools/sign-swap.js +23 -0
- package/dist/agentic/mcp/tools/sign-swap.js.map +1 -0
- package/dist/agentic/mcp/tools/sign-transaction.d.ts +3 -0
- package/dist/agentic/mcp/tools/sign-transaction.js +68 -0
- package/dist/agentic/mcp/tools/sign-transaction.js.map +1 -0
- package/dist/agentic/mcp/tools/sign-typed-data.d.ts +3 -0
- package/dist/agentic/mcp/tools/sign-typed-data.js +50 -0
- package/dist/agentic/mcp/tools/sign-typed-data.js.map +1 -0
- package/dist/agentic/policy/engine.d.ts +2 -0
- package/dist/agentic/policy/engine.js +3 -0
- package/dist/agentic/policy/engine.js.map +1 -0
- package/dist/agentic/policy/types.d.ts +2 -0
- package/dist/agentic/policy/types.js +2 -0
- package/dist/agentic/policy/types.js.map +1 -0
- package/dist/cli/commands/decode.d.ts +1 -0
- package/dist/cli/commands/decode.js +51 -0
- package/dist/cli/commands/decode.js.map +1 -0
- package/dist/cli/commands/dry-run.d.ts +2 -0
- package/dist/cli/commands/dry-run.js +56 -0
- package/dist/cli/commands/dry-run.js.map +1 -0
- package/dist/cli/commands/encode.d.ts +1 -0
- package/dist/cli/commands/encode.js +77 -0
- package/dist/cli/commands/encode.js.map +1 -0
- package/dist/cli/commands/get-address.d.ts +3 -0
- package/dist/cli/commands/get-address.js +26 -0
- package/dist/cli/commands/get-address.js.map +1 -0
- package/dist/cli/commands/health.d.ts +3 -0
- package/dist/cli/commands/health.js +26 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.js +40 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/sign-permit.d.ts +2 -0
- package/dist/cli/commands/sign-permit.js +110 -0
- package/dist/cli/commands/sign-permit.js.map +1 -0
- package/dist/cli/commands/sign.d.ts +2 -0
- package/dist/cli/commands/sign.js +82 -0
- package/dist/cli/commands/sign.js.map +1 -0
- package/dist/cli/context.d.ts +10 -0
- package/dist/cli/context.js +84 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/formatters.d.ts +18 -0
- package/dist/cli/formatters.js +74 -0
- package/dist/cli/formatters.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +108 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/evm-signer-adapter.d.ts +42 -0
- package/dist/core/evm-signer-adapter.js +92 -0
- package/dist/core/evm-signer-adapter.js.map +1 -0
- package/dist/core/signing-provider.d.ts +14 -0
- package/dist/core/signing-provider.js +2 -0
- package/dist/core/signing-provider.js.map +1 -0
- package/dist/crypto/evm-signer.util.d.ts +43 -0
- package/dist/crypto/evm-signer.util.js +151 -0
- package/dist/crypto/evm-signer.util.js.map +1 -0
- package/dist/evm-signer.util.d.ts +1 -0
- package/dist/evm-signer.util.js +4 -0
- package/dist/evm-signer.util.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/kms-client.d.ts +1 -0
- package/dist/kms-client.js +4 -0
- package/dist/kms-client.js.map +1 -0
- package/dist/kms-signer.d.ts +1 -0
- package/dist/kms-signer.js +4 -0
- package/dist/kms-signer.js.map +1 -0
- package/dist/protocols/catalog.d.ts +310 -0
- package/dist/protocols/catalog.js +162 -0
- package/dist/protocols/catalog.js.map +1 -0
- package/dist/protocols/decoders/aave-v3.d.ts +2 -0
- package/dist/protocols/decoders/aave-v3.js +105 -0
- package/dist/protocols/decoders/aave-v3.js.map +1 -0
- package/dist/protocols/decoders/erc20.d.ts +2 -0
- package/dist/protocols/decoders/erc20.js +51 -0
- package/dist/protocols/decoders/erc20.js.map +1 -0
- package/dist/protocols/decoders/uniswap-v3.d.ts +2 -0
- package/dist/protocols/decoders/uniswap-v3.js +57 -0
- package/dist/protocols/decoders/uniswap-v3.js.map +1 -0
- package/dist/protocols/dispatcher.d.ts +8 -0
- package/dist/protocols/dispatcher.js +32 -0
- package/dist/protocols/dispatcher.js.map +1 -0
- package/dist/protocols/index.d.ts +16 -0
- package/dist/protocols/index.js +19 -0
- package/dist/protocols/index.js.map +1 -0
- package/dist/protocols/policy/engine.d.ts +11 -0
- package/dist/protocols/policy/engine.js +67 -0
- package/dist/protocols/policy/engine.js.map +1 -0
- package/dist/protocols/policy/evaluators/aave-v3.d.ts +2 -0
- package/dist/protocols/policy/evaluators/aave-v3.js +118 -0
- package/dist/protocols/policy/evaluators/aave-v3.js.map +1 -0
- package/dist/protocols/policy/evaluators/erc20.d.ts +2 -0
- package/dist/protocols/policy/evaluators/erc20.js +55 -0
- package/dist/protocols/policy/evaluators/erc20.js.map +1 -0
- package/dist/protocols/policy/evaluators/uniswap-v3.d.ts +2 -0
- package/dist/protocols/policy/evaluators/uniswap-v3.js +46 -0
- package/dist/protocols/policy/evaluators/uniswap-v3.js.map +1 -0
- package/dist/protocols/policy/loader.d.ts +11 -0
- package/dist/protocols/policy/loader.js +70 -0
- package/dist/protocols/policy/loader.js.map +1 -0
- package/dist/protocols/policy/types.d.ts +38 -0
- package/dist/protocols/policy/types.js +2 -0
- package/dist/protocols/policy/types.js.map +1 -0
- package/dist/protocols/registry.d.ts +21 -0
- package/dist/protocols/registry.js +52 -0
- package/dist/protocols/registry.js.map +1 -0
- package/dist/protocols/types.d.ts +90 -0
- package/dist/protocols/types.js +2 -0
- package/dist/protocols/types.js.map +1 -0
- package/dist/protocols/workflows/get-address.d.ts +2 -0
- package/dist/protocols/workflows/get-address.js +41 -0
- package/dist/protocols/workflows/get-address.js.map +1 -0
- package/dist/protocols/workflows/health-check.d.ts +2 -0
- package/dist/protocols/workflows/health-check.js +41 -0
- package/dist/protocols/workflows/health-check.js.map +1 -0
- package/dist/protocols/workflows/index.d.ts +5 -0
- package/dist/protocols/workflows/index.js +5 -0
- package/dist/protocols/workflows/index.js.map +1 -0
- package/dist/protocols/workflows/sign-defi-call.d.ts +14 -0
- package/dist/protocols/workflows/sign-defi-call.js +157 -0
- package/dist/protocols/workflows/sign-defi-call.js.map +1 -0
- package/dist/protocols/workflows/sign-permit.d.ts +21 -0
- package/dist/protocols/workflows/sign-permit.js +320 -0
- package/dist/protocols/workflows/sign-permit.js.map +1 -0
- package/dist/protocols/workflows/types.d.ts +79 -0
- package/dist/protocols/workflows/types.js +2 -0
- package/dist/protocols/workflows/types.js.map +1 -0
- package/dist/provider/factory.d.ts +12 -0
- package/dist/provider/factory.js +19 -0
- package/dist/provider/factory.js.map +1 -0
- package/dist/providers/aws-kms/aws-kms-client.d.ts +19 -0
- package/dist/providers/aws-kms/aws-kms-client.js +47 -0
- package/dist/providers/aws-kms/aws-kms-client.js.map +1 -0
- package/dist/providers/aws-kms/aws-kms-provider.d.ts +17 -0
- package/dist/providers/aws-kms/aws-kms-provider.js +40 -0
- package/dist/providers/aws-kms/aws-kms-provider.js.map +1 -0
- package/dist/providers/aws-kms/index.d.ts +3 -0
- package/dist/providers/aws-kms/index.js +4 -0
- package/dist/providers/aws-kms/index.js.map +1 -0
- package/dist/providers/aws-kms/kms-signer-adapter.d.ts +41 -0
- package/dist/providers/aws-kms/kms-signer-adapter.js +101 -0
- package/dist/providers/aws-kms/kms-signer-adapter.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +109 -0
- package/policy.example.json +43 -0
- package/skills/audit-log/SKILL.md +32 -0
- package/skills/check-wallet/SKILL.md +23 -0
- package/skills/sign-permit/SKILL.md +29 -0
- package/skills/sign-swap/SKILL.md +29 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
const DEFAULT_SERVICE = 'agentic-vault';
|
|
2
|
+
const CANONICAL_PERMIT_FIELDS = new Set(['owner', 'spender', 'value', 'nonce', 'deadline']);
|
|
3
|
+
/**
|
|
4
|
+
* EIP-2612 permit signing workflow.
|
|
5
|
+
*
|
|
6
|
+
* Security validations:
|
|
7
|
+
* 1. Canonical EIP-2612 types.Permit field check
|
|
8
|
+
* 2. Message field presence (value, spender, deadline)
|
|
9
|
+
* 3. Payload/metadata consistency (message vs top-level args)
|
|
10
|
+
* 4. Domain validation (verifyingContract, chainId)
|
|
11
|
+
*/
|
|
12
|
+
export async function signPermit(ctx, input) {
|
|
13
|
+
const service = ctx.service ?? DEFAULT_SERVICE;
|
|
14
|
+
const token = input.token.toLowerCase();
|
|
15
|
+
// 0. Guard against non-object domain/types/message (no Zod at workflow boundary)
|
|
16
|
+
if (!input.domain || typeof input.domain !== 'object') {
|
|
17
|
+
ctx.auditSink.log({
|
|
18
|
+
service,
|
|
19
|
+
action: 'sign_permit',
|
|
20
|
+
who: ctx.caller,
|
|
21
|
+
what: 'Invalid domain parameter: must be a non-null object',
|
|
22
|
+
why: 'Input validation failed',
|
|
23
|
+
result: 'error',
|
|
24
|
+
details: { chainId: input.chainId, token },
|
|
25
|
+
});
|
|
26
|
+
return { status: 'error', reason: 'domain must be a non-null object' };
|
|
27
|
+
}
|
|
28
|
+
if (!input.types || typeof input.types !== 'object') {
|
|
29
|
+
ctx.auditSink.log({
|
|
30
|
+
service,
|
|
31
|
+
action: 'sign_permit',
|
|
32
|
+
who: ctx.caller,
|
|
33
|
+
what: 'Invalid types parameter: must be a non-null object',
|
|
34
|
+
why: 'Input validation failed',
|
|
35
|
+
result: 'error',
|
|
36
|
+
details: { chainId: input.chainId, token },
|
|
37
|
+
});
|
|
38
|
+
return { status: 'error', reason: 'types must be a non-null object' };
|
|
39
|
+
}
|
|
40
|
+
if (!input.message || typeof input.message !== 'object') {
|
|
41
|
+
ctx.auditSink.log({
|
|
42
|
+
service,
|
|
43
|
+
action: 'sign_permit',
|
|
44
|
+
who: ctx.caller,
|
|
45
|
+
what: 'Invalid message parameter: must be a non-null object',
|
|
46
|
+
why: 'Input validation failed',
|
|
47
|
+
result: 'error',
|
|
48
|
+
details: { chainId: input.chainId, token },
|
|
49
|
+
});
|
|
50
|
+
return { status: 'error', reason: 'message must be a non-null object' };
|
|
51
|
+
}
|
|
52
|
+
// 1. Parse value safely
|
|
53
|
+
let amountWei;
|
|
54
|
+
try {
|
|
55
|
+
amountWei = BigInt(input.value);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
ctx.auditSink.log({
|
|
59
|
+
service,
|
|
60
|
+
action: 'sign_permit',
|
|
61
|
+
who: ctx.caller,
|
|
62
|
+
what: `Invalid value parameter for token ${token} on chain ${input.chainId}`,
|
|
63
|
+
why: 'Input validation: value must be a decimal string',
|
|
64
|
+
result: 'error',
|
|
65
|
+
details: { chainId: input.chainId, token },
|
|
66
|
+
});
|
|
67
|
+
return { status: 'error', reason: 'Invalid value: must be a decimal string' };
|
|
68
|
+
}
|
|
69
|
+
// 2. Evaluate policy
|
|
70
|
+
const evaluation = ctx.policyEngine.evaluate({
|
|
71
|
+
chainId: input.chainId,
|
|
72
|
+
to: token,
|
|
73
|
+
amountWei,
|
|
74
|
+
deadline: input.deadline,
|
|
75
|
+
});
|
|
76
|
+
if (!evaluation.allowed) {
|
|
77
|
+
ctx.auditSink.log({
|
|
78
|
+
service,
|
|
79
|
+
action: 'sign_permit',
|
|
80
|
+
who: ctx.caller,
|
|
81
|
+
what: `Permit signing denied for token ${token} on chain ${input.chainId}`,
|
|
82
|
+
why: `Policy violations: ${evaluation.violations.join('; ')}`,
|
|
83
|
+
result: 'denied',
|
|
84
|
+
details: { chainId: input.chainId, token, spender: input.spender, violations: evaluation.violations },
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
status: 'denied',
|
|
88
|
+
reason: `Policy denied: ${evaluation.violations.join('; ')}`,
|
|
89
|
+
violations: evaluation.violations,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// 3. Validate types.Permit matches canonical EIP-2612 schema
|
|
93
|
+
const typesPermit = input.types?.Permit;
|
|
94
|
+
if (!Array.isArray(typesPermit)) {
|
|
95
|
+
ctx.auditSink.log({
|
|
96
|
+
service,
|
|
97
|
+
action: 'sign_permit',
|
|
98
|
+
who: ctx.caller,
|
|
99
|
+
what: 'Permit types.Permit is missing or not an array',
|
|
100
|
+
why: 'Canonical EIP-2612 requires types.Permit definition',
|
|
101
|
+
result: 'denied',
|
|
102
|
+
details: { chainId: input.chainId, token },
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
status: 'denied',
|
|
106
|
+
reason: 'types.Permit must be an array of EIP-712 field definitions',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const typeFieldNames = new Set(typesPermit
|
|
110
|
+
.filter((f) => typeof f === 'object' &&
|
|
111
|
+
f !== null &&
|
|
112
|
+
typeof f.name === 'string')
|
|
113
|
+
.map((f) => f.name));
|
|
114
|
+
const missingTypeFields = [...CANONICAL_PERMIT_FIELDS].filter((f) => !typeFieldNames.has(f));
|
|
115
|
+
if (missingTypeFields.length > 0) {
|
|
116
|
+
ctx.auditSink.log({
|
|
117
|
+
service,
|
|
118
|
+
action: 'sign_permit',
|
|
119
|
+
who: ctx.caller,
|
|
120
|
+
what: `Permit types.Permit missing required fields: ${missingTypeFields.join(', ')}`,
|
|
121
|
+
why: 'EIP-712 digest only includes fields listed in types; omitting policy-checked fields is a bypass',
|
|
122
|
+
result: 'denied',
|
|
123
|
+
details: { chainId: input.chainId, token, missingTypeFields },
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
status: 'denied',
|
|
127
|
+
reason: `types.Permit must include canonical fields: ${missingTypeFields.join(', ')} missing`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// 4. Validate canonical EIP-2612 Permit fields are present in message
|
|
131
|
+
const message = input.message;
|
|
132
|
+
if (message.value == null || message.spender == null || message.deadline == null) {
|
|
133
|
+
ctx.auditSink.log({
|
|
134
|
+
service,
|
|
135
|
+
action: 'sign_permit',
|
|
136
|
+
who: ctx.caller,
|
|
137
|
+
what: 'Permit message missing required EIP-2612 fields',
|
|
138
|
+
why: 'Canonical Permit must include value, spender, and deadline',
|
|
139
|
+
result: 'denied',
|
|
140
|
+
details: {
|
|
141
|
+
chainId: input.chainId,
|
|
142
|
+
token,
|
|
143
|
+
hasValue: message.value != null,
|
|
144
|
+
hasSpender: message.spender != null,
|
|
145
|
+
hasDeadline: message.deadline != null,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
status: 'denied',
|
|
150
|
+
reason: 'Permit message must include value, spender, and deadline fields',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// 5. Validate message fields match policy-checked args
|
|
154
|
+
if (String(message.value) !== input.value) {
|
|
155
|
+
ctx.auditSink.log({
|
|
156
|
+
service,
|
|
157
|
+
action: 'sign_permit',
|
|
158
|
+
who: ctx.caller,
|
|
159
|
+
what: `Permit payload mismatch: message.value (${String(message.value)}) !== args.value (${input.value})`,
|
|
160
|
+
why: 'Payload/metadata consistency check failed',
|
|
161
|
+
result: 'denied',
|
|
162
|
+
details: { chainId: input.chainId, token, messageValue: String(message.value), argsValue: input.value },
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
status: 'denied',
|
|
166
|
+
reason: 'Payload mismatch: message.value does not match value',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (String(message.spender).toLowerCase() !== input.spender.toLowerCase()) {
|
|
170
|
+
ctx.auditSink.log({
|
|
171
|
+
service,
|
|
172
|
+
action: 'sign_permit',
|
|
173
|
+
who: ctx.caller,
|
|
174
|
+
what: `Permit payload mismatch: message.spender (${String(message.spender)}) !== args.spender (${input.spender})`,
|
|
175
|
+
why: 'Payload/metadata consistency check failed',
|
|
176
|
+
result: 'denied',
|
|
177
|
+
details: { chainId: input.chainId, token, messageSpender: String(message.spender), argsSpender: input.spender },
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
status: 'denied',
|
|
181
|
+
reason: 'Payload mismatch: message.spender does not match spender',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (String(message.deadline) !== String(input.deadline)) {
|
|
185
|
+
ctx.auditSink.log({
|
|
186
|
+
service,
|
|
187
|
+
action: 'sign_permit',
|
|
188
|
+
who: ctx.caller,
|
|
189
|
+
what: `Permit payload mismatch: message.deadline (${String(message.deadline)}) !== args.deadline (${input.deadline})`,
|
|
190
|
+
why: 'Payload/metadata consistency check failed',
|
|
191
|
+
result: 'denied',
|
|
192
|
+
details: { chainId: input.chainId, token, messageDeadline: String(message.deadline), argsDeadline: input.deadline },
|
|
193
|
+
});
|
|
194
|
+
return {
|
|
195
|
+
status: 'denied',
|
|
196
|
+
reason: 'Payload mismatch: message.deadline does not match deadline',
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// 6. Validate EIP-712 domain
|
|
200
|
+
const domain = input.domain;
|
|
201
|
+
if (!domain.verifyingContract || !domain.chainId) {
|
|
202
|
+
ctx.auditSink.log({
|
|
203
|
+
service,
|
|
204
|
+
action: 'sign_permit',
|
|
205
|
+
who: ctx.caller,
|
|
206
|
+
what: 'Permit domain missing required fields',
|
|
207
|
+
why: 'Domain must include verifyingContract and chainId for replay protection',
|
|
208
|
+
result: 'denied',
|
|
209
|
+
details: {
|
|
210
|
+
chainId: input.chainId,
|
|
211
|
+
token,
|
|
212
|
+
hasVerifyingContract: !!domain.verifyingContract,
|
|
213
|
+
hasChainId: domain.chainId != null,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
status: 'denied',
|
|
218
|
+
reason: 'Permit domain must include verifyingContract and chainId',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (domain.verifyingContract.toLowerCase() !== token) {
|
|
222
|
+
ctx.auditSink.log({
|
|
223
|
+
service,
|
|
224
|
+
action: 'sign_permit',
|
|
225
|
+
who: ctx.caller,
|
|
226
|
+
what: `Permit payload mismatch: domain.verifyingContract (${domain.verifyingContract}) !== token (${token})`,
|
|
227
|
+
why: 'Payload/metadata consistency check failed',
|
|
228
|
+
result: 'denied',
|
|
229
|
+
details: { chainId: input.chainId, token, domainContract: domain.verifyingContract },
|
|
230
|
+
});
|
|
231
|
+
return {
|
|
232
|
+
status: 'denied',
|
|
233
|
+
reason: 'Payload mismatch: domain.verifyingContract does not match token',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
if (domain.chainId !== input.chainId) {
|
|
237
|
+
ctx.auditSink.log({
|
|
238
|
+
service,
|
|
239
|
+
action: 'sign_permit',
|
|
240
|
+
who: ctx.caller,
|
|
241
|
+
what: `Permit payload mismatch: domain.chainId (${domain.chainId}) !== args.chainId (${input.chainId})`,
|
|
242
|
+
why: 'Payload/metadata consistency check failed',
|
|
243
|
+
result: 'denied',
|
|
244
|
+
details: { argsChainId: input.chainId, domainChainId: domain.chainId },
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
status: 'denied',
|
|
248
|
+
reason: 'Payload mismatch: domain.chainId does not match chainId',
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// 7. Dry-run: return validation result without signing
|
|
252
|
+
if (ctx.dryRun) {
|
|
253
|
+
ctx.auditSink.log({
|
|
254
|
+
service,
|
|
255
|
+
action: 'sign_permit',
|
|
256
|
+
who: ctx.caller,
|
|
257
|
+
what: `Dry-run approved permit for token ${token} on chain ${input.chainId}`,
|
|
258
|
+
why: 'Permit validation passed (dry-run)',
|
|
259
|
+
result: 'approved',
|
|
260
|
+
details: { chainId: input.chainId, token, spender: input.spender, dryRun: true },
|
|
261
|
+
});
|
|
262
|
+
return {
|
|
263
|
+
status: 'dry-run-approved',
|
|
264
|
+
details: {
|
|
265
|
+
chainId: input.chainId,
|
|
266
|
+
token,
|
|
267
|
+
spender: input.spender,
|
|
268
|
+
value: input.value,
|
|
269
|
+
deadline: input.deadline,
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// 8. Sign
|
|
274
|
+
if (!ctx.signer) {
|
|
275
|
+
ctx.auditSink.log({
|
|
276
|
+
service,
|
|
277
|
+
action: 'sign_permit',
|
|
278
|
+
who: ctx.caller,
|
|
279
|
+
what: 'Signer not available for permit signing',
|
|
280
|
+
why: 'Configuration error: signer is required when dryRun is not enabled',
|
|
281
|
+
result: 'error',
|
|
282
|
+
});
|
|
283
|
+
return { status: 'error', reason: 'Signer is required when dryRun is not enabled' };
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
const sig = await ctx.signer.signTypedData({
|
|
287
|
+
domain: input.domain,
|
|
288
|
+
types: input.types,
|
|
289
|
+
primaryType: 'Permit',
|
|
290
|
+
message: input.message,
|
|
291
|
+
});
|
|
292
|
+
ctx.auditSink.log({
|
|
293
|
+
service,
|
|
294
|
+
action: 'sign_permit',
|
|
295
|
+
who: ctx.caller,
|
|
296
|
+
what: `Signed permit for token ${token} on chain ${input.chainId}`,
|
|
297
|
+
why: 'Permit signing approved by policy',
|
|
298
|
+
result: 'approved',
|
|
299
|
+
details: { chainId: input.chainId, token, spender: input.spender },
|
|
300
|
+
});
|
|
301
|
+
return {
|
|
302
|
+
status: 'approved',
|
|
303
|
+
data: JSON.stringify(sig),
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
308
|
+
ctx.auditSink.log({
|
|
309
|
+
service,
|
|
310
|
+
action: 'sign_permit',
|
|
311
|
+
who: ctx.caller,
|
|
312
|
+
what: `Failed to sign permit for token ${token}`,
|
|
313
|
+
why: 'Signing error',
|
|
314
|
+
result: 'error',
|
|
315
|
+
details: { error: msg },
|
|
316
|
+
});
|
|
317
|
+
return { status: 'error', reason: `Signing error: ${msg}` };
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=sign-permit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-permit.js","sourceRoot":"","sources":["../../../src/protocols/workflows/sign-permit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** Caller identity for audit trail */
|
|
2
|
+
export type WorkflowCaller = 'mcp-client' | 'cli' | 'sdk' | 'openclaw';
|
|
3
|
+
/** Audit sink interface — consumers inject their own implementation */
|
|
4
|
+
export interface AuditSink {
|
|
5
|
+
log(entry: {
|
|
6
|
+
service: string;
|
|
7
|
+
action: string;
|
|
8
|
+
who: string;
|
|
9
|
+
what: string;
|
|
10
|
+
why: string;
|
|
11
|
+
result: 'approved' | 'denied' | 'error';
|
|
12
|
+
details?: Record<string, unknown>;
|
|
13
|
+
}): unknown;
|
|
14
|
+
}
|
|
15
|
+
/** Minimal signer interface for workflows */
|
|
16
|
+
export interface WorkflowSigner {
|
|
17
|
+
getAddress(): Promise<`0x${string}`>;
|
|
18
|
+
signTransaction(tx: Record<string, unknown>): Promise<`0x${string}`>;
|
|
19
|
+
signTypedData(params: Record<string, unknown>): Promise<{
|
|
20
|
+
v: number;
|
|
21
|
+
r: `0x${string}`;
|
|
22
|
+
s: `0x${string}`;
|
|
23
|
+
}>;
|
|
24
|
+
healthCheck(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** Decoded intent from protocol dispatcher */
|
|
27
|
+
export interface WorkflowDecodedIntent {
|
|
28
|
+
protocol: string;
|
|
29
|
+
chainId: number;
|
|
30
|
+
to: `0x${string}`;
|
|
31
|
+
selector?: `0x${string}`;
|
|
32
|
+
action?: string;
|
|
33
|
+
args?: Record<string, unknown>;
|
|
34
|
+
reason?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Minimal policy engine interface for workflows */
|
|
37
|
+
export interface WorkflowPolicyEngine {
|
|
38
|
+
evaluate(request: {
|
|
39
|
+
chainId: number;
|
|
40
|
+
to: `0x${string}`;
|
|
41
|
+
selector?: `0x${string}`;
|
|
42
|
+
amountWei?: bigint;
|
|
43
|
+
deadline?: number;
|
|
44
|
+
intent?: WorkflowDecodedIntent;
|
|
45
|
+
}): {
|
|
46
|
+
allowed: boolean;
|
|
47
|
+
violations: string[];
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Protocol dispatcher interface for calldata decoding */
|
|
51
|
+
export interface WorkflowDispatcher {
|
|
52
|
+
dispatch(chainId: number, to: `0x${string}`, data: `0x${string}`): WorkflowDecodedIntent;
|
|
53
|
+
}
|
|
54
|
+
/** Full context for workflow execution */
|
|
55
|
+
export interface WorkflowContext {
|
|
56
|
+
signer?: WorkflowSigner;
|
|
57
|
+
policyEngine: WorkflowPolicyEngine;
|
|
58
|
+
auditSink: AuditSink;
|
|
59
|
+
dispatcher?: WorkflowDispatcher;
|
|
60
|
+
caller: WorkflowCaller;
|
|
61
|
+
service?: string;
|
|
62
|
+
dryRun?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/** Discriminated union for workflow results */
|
|
65
|
+
export type WorkflowResult = {
|
|
66
|
+
status: 'approved';
|
|
67
|
+
data: string;
|
|
68
|
+
details?: Record<string, unknown>;
|
|
69
|
+
} | {
|
|
70
|
+
status: 'dry-run-approved';
|
|
71
|
+
details: Record<string, unknown>;
|
|
72
|
+
} | {
|
|
73
|
+
status: 'denied';
|
|
74
|
+
reason: string;
|
|
75
|
+
violations?: string[];
|
|
76
|
+
} | {
|
|
77
|
+
status: 'error';
|
|
78
|
+
reason: string;
|
|
79
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/protocols/workflows/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SigningProvider } from '../core/signing-provider.js';
|
|
2
|
+
export interface AwsKmsSigningProviderConfig {
|
|
3
|
+
provider: 'aws-kms';
|
|
4
|
+
keyId: string;
|
|
5
|
+
region: string;
|
|
6
|
+
}
|
|
7
|
+
export type SigningProviderConfig = AwsKmsSigningProviderConfig;
|
|
8
|
+
/**
|
|
9
|
+
* Factory function to create a SigningProvider from config.
|
|
10
|
+
* Currently supports 'aws-kms'. Extensible for future providers.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createSigningProvider(config: SigningProviderConfig): SigningProvider;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AwsKmsClient } from '../providers/aws-kms/aws-kms-client.js';
|
|
2
|
+
import { AwsKmsProvider } from '../providers/aws-kms/aws-kms-provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Factory function to create a SigningProvider from config.
|
|
5
|
+
* Currently supports 'aws-kms'. Extensible for future providers.
|
|
6
|
+
*/
|
|
7
|
+
export function createSigningProvider(config) {
|
|
8
|
+
switch (config.provider) {
|
|
9
|
+
case 'aws-kms': {
|
|
10
|
+
const kmsClient = new AwsKmsClient({ region: config.region });
|
|
11
|
+
return new AwsKmsProvider(kmsClient, { keyId: config.keyId });
|
|
12
|
+
}
|
|
13
|
+
default: {
|
|
14
|
+
const _exhaustive = config.provider;
|
|
15
|
+
throw new Error(`Unknown provider: ${_exhaustive}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/provider/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAU1E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA6B;IACjE,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC,QAAQ,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAqB,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface KmsKeyMetadata {
|
|
2
|
+
keySpec: string;
|
|
3
|
+
keyUsage: string;
|
|
4
|
+
keyState: string;
|
|
5
|
+
}
|
|
6
|
+
export interface IKmsClient {
|
|
7
|
+
signDigest(keyId: string, digest: Uint8Array): Promise<Uint8Array>;
|
|
8
|
+
getPublicKey(keyId: string): Promise<Uint8Array>;
|
|
9
|
+
describeKey(keyId: string): Promise<KmsKeyMetadata>;
|
|
10
|
+
}
|
|
11
|
+
export declare class AwsKmsClient implements IKmsClient {
|
|
12
|
+
private client;
|
|
13
|
+
constructor(config: {
|
|
14
|
+
region: string;
|
|
15
|
+
});
|
|
16
|
+
signDigest(keyId: string, digest: Uint8Array): Promise<Uint8Array>;
|
|
17
|
+
getPublicKey(keyId: string): Promise<Uint8Array>;
|
|
18
|
+
describeKey(keyId: string): Promise<KmsKeyMetadata>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { DescribeKeyCommand, GetPublicKeyCommand, KMSClient, SignCommand, } from '@aws-sdk/client-kms';
|
|
2
|
+
import { parseDerPublicKey } from '../../evm-signer.util.js';
|
|
3
|
+
export class AwsKmsClient {
|
|
4
|
+
client;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
const clientConfig = { region: config.region };
|
|
7
|
+
this.client = new KMSClient(clientConfig);
|
|
8
|
+
}
|
|
9
|
+
async signDigest(keyId, digest) {
|
|
10
|
+
if (digest.length !== 32) {
|
|
11
|
+
throw new Error(`Digest must be 32 bytes, got ${digest.length}`);
|
|
12
|
+
}
|
|
13
|
+
const command = new SignCommand({
|
|
14
|
+
KeyId: keyId,
|
|
15
|
+
Message: digest,
|
|
16
|
+
SigningAlgorithm: 'ECDSA_SHA_256',
|
|
17
|
+
MessageType: 'DIGEST',
|
|
18
|
+
});
|
|
19
|
+
const response = await this.client.send(command);
|
|
20
|
+
if (!response.Signature) {
|
|
21
|
+
throw new Error('KMS Sign response missing Signature');
|
|
22
|
+
}
|
|
23
|
+
return new Uint8Array(response.Signature);
|
|
24
|
+
}
|
|
25
|
+
async getPublicKey(keyId) {
|
|
26
|
+
const command = new GetPublicKeyCommand({ KeyId: keyId });
|
|
27
|
+
const response = await this.client.send(command);
|
|
28
|
+
if (!response.PublicKey) {
|
|
29
|
+
throw new Error('KMS GetPublicKey response missing PublicKey');
|
|
30
|
+
}
|
|
31
|
+
const derBytes = new Uint8Array(response.PublicKey);
|
|
32
|
+
return parseDerPublicKey(derBytes);
|
|
33
|
+
}
|
|
34
|
+
async describeKey(keyId) {
|
|
35
|
+
const command = new DescribeKeyCommand({ KeyId: keyId });
|
|
36
|
+
const response = await this.client.send(command);
|
|
37
|
+
if (!response.KeyMetadata) {
|
|
38
|
+
throw new Error('KMS DescribeKey response missing KeyMetadata');
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
keySpec: response.KeyMetadata.KeySpec ?? 'UNKNOWN',
|
|
42
|
+
keyUsage: response.KeyMetadata.KeyUsage ?? 'UNKNOWN',
|
|
43
|
+
keyState: response.KeyMetadata.KeyState ?? 'UNKNOWN',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=aws-kms-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-kms-client.js","sourceRoot":"","sources":["../../../src/providers/aws-kms/aws-kms-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EAET,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAc7D,MAAM,OAAO,YAAY;IACf,MAAM,CAAY;IAE1B,YAAY,MAA0B;QACpC,MAAM,YAAY,GAAoB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,MAAkB;QAChD,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,MAAM;YACf,gBAAgB,EAAE,eAAe;YACjC,WAAW,EAAE,QAAQ;SACtB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,OAAO,IAAI,SAAS;YAClD,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS;YACpD,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS;SACrD,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SigningProvider, SignatureBlob, PublicKeyBlob } from '../../core/signing-provider.js';
|
|
2
|
+
import type { IKmsClient } from './aws-kms-client.js';
|
|
3
|
+
export interface AwsKmsProviderConfig {
|
|
4
|
+
keyId: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* AWS KMS implementation of SigningProvider.
|
|
8
|
+
* Key is bound at construction time (no keyId per call).
|
|
9
|
+
*/
|
|
10
|
+
export declare class AwsKmsProvider implements SigningProvider {
|
|
11
|
+
private readonly keyId;
|
|
12
|
+
private readonly kmsClient;
|
|
13
|
+
constructor(kmsClient: IKmsClient, config: AwsKmsProviderConfig);
|
|
14
|
+
signDigest(digest: Uint8Array): Promise<SignatureBlob>;
|
|
15
|
+
getPublicKey(): Promise<PublicKeyBlob>;
|
|
16
|
+
healthCheck(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS KMS implementation of SigningProvider.
|
|
3
|
+
* Key is bound at construction time (no keyId per call).
|
|
4
|
+
*/
|
|
5
|
+
export class AwsKmsProvider {
|
|
6
|
+
keyId;
|
|
7
|
+
kmsClient;
|
|
8
|
+
constructor(kmsClient, config) {
|
|
9
|
+
this.kmsClient = kmsClient;
|
|
10
|
+
this.keyId = config.keyId;
|
|
11
|
+
}
|
|
12
|
+
async signDigest(digest) {
|
|
13
|
+
const bytes = await this.kmsClient.signDigest(this.keyId, digest);
|
|
14
|
+
return {
|
|
15
|
+
bytes,
|
|
16
|
+
encoding: 'der',
|
|
17
|
+
algorithm: 'secp256k1',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async getPublicKey() {
|
|
21
|
+
const bytes = await this.kmsClient.getPublicKey(this.keyId);
|
|
22
|
+
return {
|
|
23
|
+
bytes,
|
|
24
|
+
algorithm: 'secp256k1',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async healthCheck() {
|
|
28
|
+
const metadata = await this.kmsClient.describeKey(this.keyId);
|
|
29
|
+
if (metadata.keySpec !== 'ECC_SECG_P256K1') {
|
|
30
|
+
throw new Error(`KMS key has invalid KeySpec: ${metadata.keySpec}, expected ECC_SECG_P256K1`);
|
|
31
|
+
}
|
|
32
|
+
if (metadata.keyUsage !== 'SIGN_VERIFY') {
|
|
33
|
+
throw new Error(`KMS key has invalid KeyUsage: ${metadata.keyUsage}, expected SIGN_VERIFY`);
|
|
34
|
+
}
|
|
35
|
+
if (metadata.keyState !== 'Enabled') {
|
|
36
|
+
throw new Error(`KMS key is not enabled: ${metadata.keyState}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=aws-kms-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-kms-provider.js","sourceRoot":"","sources":["../../../src/providers/aws-kms/aws-kms-provider.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,OAAO,cAAc;IACR,KAAK,CAAS;IACd,SAAS,CAAa;IAEvC,YAAY,SAAqB,EAAE,MAA4B;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAkB;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClE,OAAO;YACL,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,WAAW;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,OAAO;YACL,KAAK;YACL,SAAS,EAAE,WAAW;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9D,IAAI,QAAQ,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,gCAAgC,QAAQ,CAAC,OAAO,4BAA4B,CAC7E,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,iCAAiC,QAAQ,CAAC,QAAQ,wBAAwB,CAC3E,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,CAAC,QAAQ,EAAE,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/aws-kms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAwC,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,cAAc,EAA6B,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAwB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type Address, type Hex, type TransactionSerializable } from 'viem';
|
|
2
|
+
import type { IKmsClient } from './aws-kms-client.js';
|
|
3
|
+
import type { SignTypedDataParams, SignatureComponents, SignerAdapter } from '../../types.js';
|
|
4
|
+
export interface KmsSignerConfig {
|
|
5
|
+
keyId: string;
|
|
6
|
+
region: string;
|
|
7
|
+
expectedAddress?: Address;
|
|
8
|
+
}
|
|
9
|
+
export declare class KmsSignerAdapter implements SignerAdapter {
|
|
10
|
+
private readonly keyId;
|
|
11
|
+
private readonly expectedAddress?;
|
|
12
|
+
private readonly kmsClient;
|
|
13
|
+
private addressPromise;
|
|
14
|
+
constructor(kmsClient: IKmsClient, config: KmsSignerConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Get the Ethereum address derived from the KMS public key.
|
|
17
|
+
* Uses promise memoization to avoid concurrent GetPublicKey calls during cold start.
|
|
18
|
+
*/
|
|
19
|
+
getAddress(): Promise<Address>;
|
|
20
|
+
/**
|
|
21
|
+
* Sign a transaction: serialize -> keccak256 -> KMS sign -> DER decode -> assemble signed tx.
|
|
22
|
+
*/
|
|
23
|
+
signTransaction(tx: TransactionSerializable): Promise<Hex>;
|
|
24
|
+
/**
|
|
25
|
+
* Sign EIP-712 typed data. Returns {v, r, s} for permit-style calls.
|
|
26
|
+
* v = yParity + 27 (legacy recovery id format expected by EIP-2612 selfPermit).
|
|
27
|
+
*/
|
|
28
|
+
signTypedData(params: SignTypedDataParams): Promise<SignatureComponents>;
|
|
29
|
+
/**
|
|
30
|
+
* Health check: verify KMS key is configured correctly and address matches expectations.
|
|
31
|
+
*/
|
|
32
|
+
healthCheck(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Internal: sign a 32-byte digest via KMS and resolve the recovery parameter.
|
|
35
|
+
*/
|
|
36
|
+
private signDigestAndRecover;
|
|
37
|
+
/**
|
|
38
|
+
* Internal: derive address from KMS public key.
|
|
39
|
+
*/
|
|
40
|
+
private deriveAddress;
|
|
41
|
+
}
|