@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.
Files changed (201) hide show
  1. package/.claude-plugin/plugin.json +19 -0
  2. package/.env.example +16 -0
  3. package/.mcp.json.example +18 -0
  4. package/LICENSE +21 -0
  5. package/README.ja.md +163 -0
  6. package/README.ko.md +163 -0
  7. package/README.md +161 -0
  8. package/README.zh-CN.md +163 -0
  9. package/README.zh-TW.md +163 -0
  10. package/dist/agentic/audit/logger.d.ts +7 -0
  11. package/dist/agentic/audit/logger.js +19 -0
  12. package/dist/agentic/audit/logger.js.map +1 -0
  13. package/dist/agentic/audit/types.d.ts +11 -0
  14. package/dist/agentic/audit/types.js +2 -0
  15. package/dist/agentic/audit/types.js.map +1 -0
  16. package/dist/agentic/cli.d.ts +8 -0
  17. package/dist/agentic/cli.js +87 -0
  18. package/dist/agentic/cli.js.map +1 -0
  19. package/dist/agentic/index.d.ts +5 -0
  20. package/dist/agentic/index.js +7 -0
  21. package/dist/agentic/index.js.map +1 -0
  22. package/dist/agentic/mcp/server.d.ts +8 -0
  23. package/dist/agentic/mcp/server.js +25 -0
  24. package/dist/agentic/mcp/server.js.map +1 -0
  25. package/dist/agentic/mcp/tools/decoded-call-pipeline.d.ts +14 -0
  26. package/dist/agentic/mcp/tools/decoded-call-pipeline.js +18 -0
  27. package/dist/agentic/mcp/tools/decoded-call-pipeline.js.map +1 -0
  28. package/dist/agentic/mcp/tools/get-address.d.ts +3 -0
  29. package/dist/agentic/mcp/tools/get-address.js +25 -0
  30. package/dist/agentic/mcp/tools/get-address.js.map +1 -0
  31. package/dist/agentic/mcp/tools/health-check.d.ts +3 -0
  32. package/dist/agentic/mcp/tools/health-check.js +25 -0
  33. package/dist/agentic/mcp/tools/health-check.js.map +1 -0
  34. package/dist/agentic/mcp/tools/index.d.ts +7 -0
  35. package/dist/agentic/mcp/tools/index.js +21 -0
  36. package/dist/agentic/mcp/tools/index.js.map +1 -0
  37. package/dist/agentic/mcp/tools/result-adapter.d.ts +10 -0
  38. package/dist/agentic/mcp/tools/result-adapter.js +15 -0
  39. package/dist/agentic/mcp/tools/result-adapter.js.map +1 -0
  40. package/dist/agentic/mcp/tools/shared.d.ts +71 -0
  41. package/dist/agentic/mcp/tools/shared.js +12 -0
  42. package/dist/agentic/mcp/tools/shared.js.map +1 -0
  43. package/dist/agentic/mcp/tools/sign-defi-call.d.ts +3 -0
  44. package/dist/agentic/mcp/tools/sign-defi-call.js +23 -0
  45. package/dist/agentic/mcp/tools/sign-defi-call.js.map +1 -0
  46. package/dist/agentic/mcp/tools/sign-permit.d.ts +3 -0
  47. package/dist/agentic/mcp/tools/sign-permit.js +39 -0
  48. package/dist/agentic/mcp/tools/sign-permit.js.map +1 -0
  49. package/dist/agentic/mcp/tools/sign-swap.d.ts +3 -0
  50. package/dist/agentic/mcp/tools/sign-swap.js +23 -0
  51. package/dist/agentic/mcp/tools/sign-swap.js.map +1 -0
  52. package/dist/agentic/mcp/tools/sign-transaction.d.ts +3 -0
  53. package/dist/agentic/mcp/tools/sign-transaction.js +68 -0
  54. package/dist/agentic/mcp/tools/sign-transaction.js.map +1 -0
  55. package/dist/agentic/mcp/tools/sign-typed-data.d.ts +3 -0
  56. package/dist/agentic/mcp/tools/sign-typed-data.js +50 -0
  57. package/dist/agentic/mcp/tools/sign-typed-data.js.map +1 -0
  58. package/dist/agentic/policy/engine.d.ts +2 -0
  59. package/dist/agentic/policy/engine.js +3 -0
  60. package/dist/agentic/policy/engine.js.map +1 -0
  61. package/dist/agentic/policy/types.d.ts +2 -0
  62. package/dist/agentic/policy/types.js +2 -0
  63. package/dist/agentic/policy/types.js.map +1 -0
  64. package/dist/cli/commands/decode.d.ts +1 -0
  65. package/dist/cli/commands/decode.js +51 -0
  66. package/dist/cli/commands/decode.js.map +1 -0
  67. package/dist/cli/commands/dry-run.d.ts +2 -0
  68. package/dist/cli/commands/dry-run.js +56 -0
  69. package/dist/cli/commands/dry-run.js.map +1 -0
  70. package/dist/cli/commands/encode.d.ts +1 -0
  71. package/dist/cli/commands/encode.js +77 -0
  72. package/dist/cli/commands/encode.js.map +1 -0
  73. package/dist/cli/commands/get-address.d.ts +3 -0
  74. package/dist/cli/commands/get-address.js +26 -0
  75. package/dist/cli/commands/get-address.js.map +1 -0
  76. package/dist/cli/commands/health.d.ts +3 -0
  77. package/dist/cli/commands/health.js +26 -0
  78. package/dist/cli/commands/health.js.map +1 -0
  79. package/dist/cli/commands/mcp.d.ts +6 -0
  80. package/dist/cli/commands/mcp.js +40 -0
  81. package/dist/cli/commands/mcp.js.map +1 -0
  82. package/dist/cli/commands/sign-permit.d.ts +2 -0
  83. package/dist/cli/commands/sign-permit.js +110 -0
  84. package/dist/cli/commands/sign-permit.js.map +1 -0
  85. package/dist/cli/commands/sign.d.ts +2 -0
  86. package/dist/cli/commands/sign.js +82 -0
  87. package/dist/cli/commands/sign.js.map +1 -0
  88. package/dist/cli/context.d.ts +10 -0
  89. package/dist/cli/context.js +84 -0
  90. package/dist/cli/context.js.map +1 -0
  91. package/dist/cli/formatters.d.ts +18 -0
  92. package/dist/cli/formatters.js +74 -0
  93. package/dist/cli/formatters.js.map +1 -0
  94. package/dist/cli/index.d.ts +2 -0
  95. package/dist/cli/index.js +108 -0
  96. package/dist/cli/index.js.map +1 -0
  97. package/dist/core/evm-signer-adapter.d.ts +42 -0
  98. package/dist/core/evm-signer-adapter.js +92 -0
  99. package/dist/core/evm-signer-adapter.js.map +1 -0
  100. package/dist/core/signing-provider.d.ts +14 -0
  101. package/dist/core/signing-provider.js +2 -0
  102. package/dist/core/signing-provider.js.map +1 -0
  103. package/dist/crypto/evm-signer.util.d.ts +43 -0
  104. package/dist/crypto/evm-signer.util.js +151 -0
  105. package/dist/crypto/evm-signer.util.js.map +1 -0
  106. package/dist/evm-signer.util.d.ts +1 -0
  107. package/dist/evm-signer.util.js +4 -0
  108. package/dist/evm-signer.util.js.map +1 -0
  109. package/dist/index.d.ts +11 -0
  110. package/dist/index.js +9 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/kms-client.d.ts +1 -0
  113. package/dist/kms-client.js +4 -0
  114. package/dist/kms-client.js.map +1 -0
  115. package/dist/kms-signer.d.ts +1 -0
  116. package/dist/kms-signer.js +4 -0
  117. package/dist/kms-signer.js.map +1 -0
  118. package/dist/protocols/catalog.d.ts +310 -0
  119. package/dist/protocols/catalog.js +162 -0
  120. package/dist/protocols/catalog.js.map +1 -0
  121. package/dist/protocols/decoders/aave-v3.d.ts +2 -0
  122. package/dist/protocols/decoders/aave-v3.js +105 -0
  123. package/dist/protocols/decoders/aave-v3.js.map +1 -0
  124. package/dist/protocols/decoders/erc20.d.ts +2 -0
  125. package/dist/protocols/decoders/erc20.js +51 -0
  126. package/dist/protocols/decoders/erc20.js.map +1 -0
  127. package/dist/protocols/decoders/uniswap-v3.d.ts +2 -0
  128. package/dist/protocols/decoders/uniswap-v3.js +57 -0
  129. package/dist/protocols/decoders/uniswap-v3.js.map +1 -0
  130. package/dist/protocols/dispatcher.d.ts +8 -0
  131. package/dist/protocols/dispatcher.js +32 -0
  132. package/dist/protocols/dispatcher.js.map +1 -0
  133. package/dist/protocols/index.d.ts +16 -0
  134. package/dist/protocols/index.js +19 -0
  135. package/dist/protocols/index.js.map +1 -0
  136. package/dist/protocols/policy/engine.d.ts +11 -0
  137. package/dist/protocols/policy/engine.js +67 -0
  138. package/dist/protocols/policy/engine.js.map +1 -0
  139. package/dist/protocols/policy/evaluators/aave-v3.d.ts +2 -0
  140. package/dist/protocols/policy/evaluators/aave-v3.js +118 -0
  141. package/dist/protocols/policy/evaluators/aave-v3.js.map +1 -0
  142. package/dist/protocols/policy/evaluators/erc20.d.ts +2 -0
  143. package/dist/protocols/policy/evaluators/erc20.js +55 -0
  144. package/dist/protocols/policy/evaluators/erc20.js.map +1 -0
  145. package/dist/protocols/policy/evaluators/uniswap-v3.d.ts +2 -0
  146. package/dist/protocols/policy/evaluators/uniswap-v3.js +46 -0
  147. package/dist/protocols/policy/evaluators/uniswap-v3.js.map +1 -0
  148. package/dist/protocols/policy/loader.d.ts +11 -0
  149. package/dist/protocols/policy/loader.js +70 -0
  150. package/dist/protocols/policy/loader.js.map +1 -0
  151. package/dist/protocols/policy/types.d.ts +38 -0
  152. package/dist/protocols/policy/types.js +2 -0
  153. package/dist/protocols/policy/types.js.map +1 -0
  154. package/dist/protocols/registry.d.ts +21 -0
  155. package/dist/protocols/registry.js +52 -0
  156. package/dist/protocols/registry.js.map +1 -0
  157. package/dist/protocols/types.d.ts +90 -0
  158. package/dist/protocols/types.js +2 -0
  159. package/dist/protocols/types.js.map +1 -0
  160. package/dist/protocols/workflows/get-address.d.ts +2 -0
  161. package/dist/protocols/workflows/get-address.js +41 -0
  162. package/dist/protocols/workflows/get-address.js.map +1 -0
  163. package/dist/protocols/workflows/health-check.d.ts +2 -0
  164. package/dist/protocols/workflows/health-check.js +41 -0
  165. package/dist/protocols/workflows/health-check.js.map +1 -0
  166. package/dist/protocols/workflows/index.d.ts +5 -0
  167. package/dist/protocols/workflows/index.js +5 -0
  168. package/dist/protocols/workflows/index.js.map +1 -0
  169. package/dist/protocols/workflows/sign-defi-call.d.ts +14 -0
  170. package/dist/protocols/workflows/sign-defi-call.js +157 -0
  171. package/dist/protocols/workflows/sign-defi-call.js.map +1 -0
  172. package/dist/protocols/workflows/sign-permit.d.ts +21 -0
  173. package/dist/protocols/workflows/sign-permit.js +320 -0
  174. package/dist/protocols/workflows/sign-permit.js.map +1 -0
  175. package/dist/protocols/workflows/types.d.ts +79 -0
  176. package/dist/protocols/workflows/types.js +2 -0
  177. package/dist/protocols/workflows/types.js.map +1 -0
  178. package/dist/provider/factory.d.ts +12 -0
  179. package/dist/provider/factory.js +19 -0
  180. package/dist/provider/factory.js.map +1 -0
  181. package/dist/providers/aws-kms/aws-kms-client.d.ts +19 -0
  182. package/dist/providers/aws-kms/aws-kms-client.js +47 -0
  183. package/dist/providers/aws-kms/aws-kms-client.js.map +1 -0
  184. package/dist/providers/aws-kms/aws-kms-provider.d.ts +17 -0
  185. package/dist/providers/aws-kms/aws-kms-provider.js +40 -0
  186. package/dist/providers/aws-kms/aws-kms-provider.js.map +1 -0
  187. package/dist/providers/aws-kms/index.d.ts +3 -0
  188. package/dist/providers/aws-kms/index.js +4 -0
  189. package/dist/providers/aws-kms/index.js.map +1 -0
  190. package/dist/providers/aws-kms/kms-signer-adapter.d.ts +41 -0
  191. package/dist/providers/aws-kms/kms-signer-adapter.js +101 -0
  192. package/dist/providers/aws-kms/kms-signer-adapter.js.map +1 -0
  193. package/dist/types.d.ts +13 -0
  194. package/dist/types.js +2 -0
  195. package/dist/types.js.map +1 -0
  196. package/package.json +109 -0
  197. package/policy.example.json +43 -0
  198. package/skills/audit-log/SKILL.md +32 -0
  199. package/skills/check-wallet/SKILL.md +23 -0
  200. package/skills/sign-permit/SKILL.md +29 -0
  201. package/skills/sign-swap/SKILL.md +29 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/protocols/policy/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { Address, Hex } from 'viem';
2
+ import type { ProtocolDecoder } from './types.js';
3
+ export interface ContractEntry {
4
+ protocol: string;
5
+ decoder: ProtocolDecoder;
6
+ }
7
+ export interface RegistryConfig {
8
+ contracts: Record<string, ContractEntry>;
9
+ interfaceDecoders: ProtocolDecoder[];
10
+ }
11
+ export declare class ProtocolRegistry {
12
+ private readonly addressMap;
13
+ private readonly interfaceDecoders;
14
+ constructor(config: RegistryConfig);
15
+ /**
16
+ * Lookup protocol by chainId + contract address (Stage 1).
17
+ * Falls back to interface-based decoder matching by selector (Stage 2).
18
+ */
19
+ resolve(chainId: number, to: Address, selector: Hex): ProtocolDecoder | undefined;
20
+ }
21
+ export declare function createDefaultRegistry(): RegistryConfig;
@@ -0,0 +1,52 @@
1
+ import { erc20Decoder } from './decoders/erc20.js';
2
+ import { uniswapV3Decoder } from './decoders/uniswap-v3.js';
3
+ import { aaveV3Decoder } from './decoders/aave-v3.js';
4
+ export class ProtocolRegistry {
5
+ addressMap;
6
+ interfaceDecoders;
7
+ constructor(config) {
8
+ // Normalize keys to lowercase for case-insensitive address matching
9
+ this.addressMap = new Map(Object.entries(config.contracts).map(([key, entry]) => [key.toLowerCase(), entry]));
10
+ this.interfaceDecoders = config.interfaceDecoders;
11
+ }
12
+ /**
13
+ * Lookup protocol by chainId + contract address (Stage 1).
14
+ * Falls back to interface-based decoder matching by selector (Stage 2).
15
+ */
16
+ resolve(chainId, to, selector) {
17
+ const key = `${chainId}:${to.toLowerCase()}`;
18
+ const entry = this.addressMap.get(key);
19
+ if (entry)
20
+ return entry.decoder;
21
+ const normalizedSelector = selector.toLowerCase();
22
+ return this.interfaceDecoders.find((d) => d.supportedSelectors.some((s) => s.toLowerCase() === normalizedSelector));
23
+ }
24
+ }
25
+ export function createDefaultRegistry() {
26
+ return {
27
+ contracts: {
28
+ // Uniswap V3 SwapRouter02 (Ethereum mainnet)
29
+ '1:0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45': {
30
+ protocol: 'uniswap_v3',
31
+ decoder: uniswapV3Decoder,
32
+ },
33
+ // Uniswap V3 SwapRouter02 (Sepolia testnet)
34
+ '11155111:0x3bfa4769fb09eefc5a80d6e87c3b9c650f7ae48e': {
35
+ protocol: 'uniswap_v3',
36
+ decoder: uniswapV3Decoder,
37
+ },
38
+ // Aave V3 Pool (Ethereum mainnet)
39
+ '1:0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2': {
40
+ protocol: 'aave_v3',
41
+ decoder: aaveV3Decoder,
42
+ },
43
+ // Aave V3 Pool (Sepolia testnet)
44
+ '11155111:0x6ae43d3271ff6888e7fc43fd7321a503ff738951': {
45
+ protocol: 'aave_v3',
46
+ decoder: aaveV3Decoder,
47
+ },
48
+ },
49
+ interfaceDecoders: [erc20Decoder],
50
+ };
51
+ }
52
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/protocols/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAYtD,MAAM,OAAO,gBAAgB;IACV,UAAU,CAA6B;IACvC,iBAAiB,CAAoB;IAEtD,YAAY,MAAsB;QAChC,oEAAoE;QACpE,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC,CACnF,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAAe,EAAE,EAAW,EAAE,QAAa;QACjD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC;QAEhC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAS,CAAC;QACzD,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,kBAAkB,CAAC,CACzE,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,SAAS,EAAE;YACT,6CAA6C;YAC7C,8CAA8C,EAAE;gBAC9C,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,gBAAgB;aAC1B;YACD,4CAA4C;YAC5C,qDAAqD,EAAE;gBACrD,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,gBAAgB;aAC1B;YACD,kCAAkC;YAClC,8CAA8C,EAAE;gBAC9C,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,aAAa;aACvB;YACD,iCAAiC;YACjC,qDAAqD,EAAE;gBACrD,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,aAAa;aACvB;SACF;QACD,iBAAiB,EAAE,CAAC,YAAY,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,90 @@
1
+ import type { Address, Hex } from 'viem';
2
+ interface IntentBase {
3
+ chainId: number;
4
+ to: Address;
5
+ selector: Hex;
6
+ }
7
+ export interface Erc20ApproveIntent extends IntentBase {
8
+ protocol: 'erc20';
9
+ action: 'approve';
10
+ args: {
11
+ spender: Address;
12
+ amount: bigint;
13
+ };
14
+ }
15
+ export interface Erc20TransferIntent extends IntentBase {
16
+ protocol: 'erc20';
17
+ action: 'transfer';
18
+ args: {
19
+ to: Address;
20
+ amount: bigint;
21
+ };
22
+ }
23
+ export interface UniswapV3ExactInputSingleIntent extends IntentBase {
24
+ protocol: 'uniswap_v3';
25
+ action: 'exactInputSingle';
26
+ args: {
27
+ tokenIn: Address;
28
+ tokenOut: Address;
29
+ fee: number;
30
+ recipient: Address;
31
+ amountIn: bigint;
32
+ amountOutMinimum: bigint;
33
+ sqrtPriceLimitX96: bigint;
34
+ };
35
+ }
36
+ export interface AaveV3SupplyIntent extends IntentBase {
37
+ protocol: 'aave_v3';
38
+ action: 'supply';
39
+ args: {
40
+ asset: Address;
41
+ amount: bigint;
42
+ onBehalfOf: Address;
43
+ referralCode: number;
44
+ };
45
+ }
46
+ export interface AaveV3BorrowIntent extends IntentBase {
47
+ protocol: 'aave_v3';
48
+ action: 'borrow';
49
+ args: {
50
+ asset: Address;
51
+ amount: bigint;
52
+ interestRateMode: bigint;
53
+ referralCode: number;
54
+ onBehalfOf: Address;
55
+ };
56
+ }
57
+ export interface AaveV3RepayIntent extends IntentBase {
58
+ protocol: 'aave_v3';
59
+ action: 'repay';
60
+ args: {
61
+ asset: Address;
62
+ amount: bigint;
63
+ interestRateMode: bigint;
64
+ onBehalfOf: Address;
65
+ };
66
+ }
67
+ export interface AaveV3WithdrawIntent extends IntentBase {
68
+ protocol: 'aave_v3';
69
+ action: 'withdraw';
70
+ args: {
71
+ asset: Address;
72
+ amount: bigint;
73
+ to: Address;
74
+ };
75
+ }
76
+ export interface UnknownIntent {
77
+ protocol: 'unknown';
78
+ chainId: number;
79
+ to: Address;
80
+ selector?: Hex;
81
+ rawData: Hex;
82
+ reason: string;
83
+ }
84
+ export type DecodedIntent = Erc20ApproveIntent | Erc20TransferIntent | UniswapV3ExactInputSingleIntent | AaveV3SupplyIntent | AaveV3BorrowIntent | AaveV3RepayIntent | AaveV3WithdrawIntent | UnknownIntent;
85
+ export interface ProtocolDecoder {
86
+ readonly protocol: string;
87
+ readonly supportedSelectors: readonly Hex[];
88
+ decode(chainId: number, to: Address, data: Hex): DecodedIntent;
89
+ }
90
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/protocols/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { WorkflowContext, WorkflowResult } from './types.js';
2
+ export declare function getAddress(ctx: WorkflowContext): Promise<WorkflowResult>;
@@ -0,0 +1,41 @@
1
+ const DEFAULT_SERVICE = 'agentic-vault';
2
+ export async function getAddress(ctx) {
3
+ const service = ctx.service ?? DEFAULT_SERVICE;
4
+ if (!ctx.signer) {
5
+ ctx.auditSink.log({
6
+ service,
7
+ action: 'get_address',
8
+ who: ctx.caller,
9
+ what: 'Signer not available for address lookup',
10
+ why: 'Configuration error: signer is required',
11
+ result: 'error',
12
+ });
13
+ return { status: 'error', reason: 'Signer is required for get_address' };
14
+ }
15
+ try {
16
+ const address = await ctx.signer.getAddress();
17
+ ctx.auditSink.log({
18
+ service,
19
+ action: 'get_address',
20
+ who: ctx.caller,
21
+ what: `Retrieved wallet address: ${address}`,
22
+ why: 'Address lookup requested',
23
+ result: 'approved',
24
+ });
25
+ return { status: 'approved', data: address };
26
+ }
27
+ catch (error) {
28
+ const msg = error instanceof Error ? error.message : String(error);
29
+ ctx.auditSink.log({
30
+ service,
31
+ action: 'get_address',
32
+ who: ctx.caller,
33
+ what: 'Failed to retrieve wallet address',
34
+ why: 'Address lookup error',
35
+ result: 'error',
36
+ details: { error: msg },
37
+ });
38
+ return { status: 'error', reason: msg };
39
+ }
40
+ }
41
+ //# sourceMappingURL=get-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-address.js","sourceRoot":"","sources":["../../../src/protocols/workflows/get-address.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAoB;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC;IAE/C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;YAChB,OAAO;YACP,MAAM,EAAE,aAAa;YACrB,GAAG,EAAE,GAAG,CAAC,MAAM;YACf,IAAI,EAAE,yCAAyC;YAC/C,GAAG,EAAE,yCAAyC;YAC9C,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAE9C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;YAChB,OAAO;YACP,MAAM,EAAE,aAAa;YACrB,GAAG,EAAE,GAAG,CAAC,MAAM;YACf,IAAI,EAAE,6BAA6B,OAAO,EAAE;YAC5C,GAAG,EAAE,0BAA0B;YAC/B,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;YAChB,OAAO;YACP,MAAM,EAAE,aAAa;YACrB,GAAG,EAAE,GAAG,CAAC,MAAM;YACf,IAAI,EAAE,mCAAmC;YACzC,GAAG,EAAE,sBAAsB;YAC3B,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { WorkflowContext, WorkflowResult } from './types.js';
2
+ export declare function healthCheck(ctx: WorkflowContext): Promise<WorkflowResult>;
@@ -0,0 +1,41 @@
1
+ const DEFAULT_SERVICE = 'agentic-vault';
2
+ export async function healthCheck(ctx) {
3
+ const service = ctx.service ?? DEFAULT_SERVICE;
4
+ if (!ctx.signer) {
5
+ ctx.auditSink.log({
6
+ service,
7
+ action: 'health_check',
8
+ who: ctx.caller,
9
+ what: 'Signer not available for health check',
10
+ why: 'Configuration error: signer is required',
11
+ result: 'error',
12
+ });
13
+ return { status: 'error', reason: 'Signer is required for health_check' };
14
+ }
15
+ try {
16
+ await ctx.signer.healthCheck();
17
+ ctx.auditSink.log({
18
+ service,
19
+ action: 'health_check',
20
+ who: ctx.caller,
21
+ what: 'Health check passed',
22
+ why: 'Health check requested',
23
+ result: 'approved',
24
+ });
25
+ return { status: 'approved', data: JSON.stringify({ status: 'healthy' }) };
26
+ }
27
+ catch (error) {
28
+ const msg = error instanceof Error ? error.message : String(error);
29
+ ctx.auditSink.log({
30
+ service,
31
+ action: 'health_check',
32
+ who: ctx.caller,
33
+ what: 'Health check failed',
34
+ why: 'Health check error',
35
+ result: 'error',
36
+ details: { error: msg },
37
+ });
38
+ return { status: 'error', reason: msg };
39
+ }
40
+ }
41
+ //# sourceMappingURL=health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../../src/protocols/workflows/health-check.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAoB;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC;IAE/C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;YAChB,OAAO;YACP,MAAM,EAAE,cAAc;YACtB,GAAG,EAAE,GAAG,CAAC,MAAM;YACf,IAAI,EAAE,uCAAuC;YAC7C,GAAG,EAAE,yCAAyC;YAC9C,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE/B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;YAChB,OAAO;YACP,MAAM,EAAE,cAAc;YACtB,GAAG,EAAE,GAAG,CAAC,MAAM;YACf,IAAI,EAAE,qBAAqB;YAC3B,GAAG,EAAE,wBAAwB;YAC7B,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC7E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;YAChB,OAAO;YACP,MAAM,EAAE,cAAc;YACtB,GAAG,EAAE,GAAG,CAAC,MAAM;YACf,IAAI,EAAE,qBAAqB;YAC3B,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type { WorkflowCaller, AuditSink, WorkflowSigner, WorkflowPolicyEngine, WorkflowDispatcher, WorkflowDecodedIntent, WorkflowContext, WorkflowResult, } from './types.js';
2
+ export { signDefiCall, type SignDefiCallInput } from './sign-defi-call.js';
3
+ export { signPermit, type SignPermitInput } from './sign-permit.js';
4
+ export { getAddress } from './get-address.js';
5
+ export { healthCheck } from './health-check.js';
@@ -0,0 +1,5 @@
1
+ export { signDefiCall } from './sign-defi-call.js';
2
+ export { signPermit } from './sign-permit.js';
3
+ export { getAddress } from './get-address.js';
4
+ export { healthCheck } from './health-check.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocols/workflows/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { WorkflowContext, WorkflowResult } from './types.js';
2
+ export interface SignDefiCallInput {
3
+ chainId: number;
4
+ to: string;
5
+ data: string;
6
+ value?: string;
7
+ }
8
+ /**
9
+ * Decode → fail-closed reject → policy → sign workflow.
10
+ *
11
+ * Interface-agnostic: callers provide WorkflowContext with their own
12
+ * AuditSink, caller tag, and service name.
13
+ */
14
+ export declare function signDefiCall(ctx: WorkflowContext, actionName: string, input: SignDefiCallInput): Promise<WorkflowResult>;
@@ -0,0 +1,157 @@
1
+ const DEFAULT_SERVICE = 'agentic-vault';
2
+ /**
3
+ * Decode → fail-closed reject → policy → sign workflow.
4
+ *
5
+ * Interface-agnostic: callers provide WorkflowContext with their own
6
+ * AuditSink, caller tag, and service name.
7
+ */
8
+ export async function signDefiCall(ctx, actionName, input) {
9
+ const service = ctx.service ?? DEFAULT_SERVICE;
10
+ const to = input.to.toLowerCase();
11
+ const data = input.data;
12
+ // 1. Require dispatcher
13
+ if (!ctx.dispatcher) {
14
+ throw new Error(`${actionName} requires dispatcher in WorkflowContext`);
15
+ }
16
+ // 2. Decode calldata
17
+ const intent = ctx.dispatcher.dispatch(input.chainId, to, data);
18
+ // 3. Reject unknown protocols (fail-closed)
19
+ if (intent.protocol === 'unknown') {
20
+ ctx.auditSink.log({
21
+ service,
22
+ action: actionName,
23
+ who: ctx.caller,
24
+ what: `Rejected unknown calldata for ${to} on chain ${input.chainId}`,
25
+ why: `Decoder rejection: ${intent.reason}`,
26
+ result: 'denied',
27
+ details: { chainId: input.chainId, to, reason: intent.reason },
28
+ });
29
+ return {
30
+ status: 'denied',
31
+ reason: `Rejected: ${intent.reason}`,
32
+ };
33
+ }
34
+ // 4. Parse value
35
+ let amountWei;
36
+ if (input.value) {
37
+ try {
38
+ amountWei = BigInt(input.value);
39
+ }
40
+ catch {
41
+ ctx.auditSink.log({
42
+ service,
43
+ action: actionName,
44
+ who: ctx.caller,
45
+ what: `Invalid value parameter for ${to} on chain ${input.chainId}`,
46
+ why: 'Input validation: value must be a decimal string',
47
+ result: 'error',
48
+ details: { chainId: input.chainId, to },
49
+ });
50
+ return {
51
+ status: 'error',
52
+ reason: 'Invalid value: must be a decimal string',
53
+ };
54
+ }
55
+ }
56
+ // 5. Policy evaluation with decoded intent
57
+ const evaluation = ctx.policyEngine.evaluate({
58
+ chainId: input.chainId,
59
+ to,
60
+ selector: intent.selector,
61
+ amountWei,
62
+ intent,
63
+ });
64
+ if (!evaluation.allowed) {
65
+ ctx.auditSink.log({
66
+ service,
67
+ action: actionName,
68
+ who: ctx.caller,
69
+ what: `Policy denied ${intent.protocol}:${intent.action} on chain ${input.chainId}`,
70
+ why: `Violations: ${evaluation.violations.join('; ')}`,
71
+ result: 'denied',
72
+ details: {
73
+ chainId: input.chainId,
74
+ to,
75
+ protocol: intent.protocol,
76
+ action: intent.action,
77
+ violations: evaluation.violations,
78
+ },
79
+ });
80
+ return {
81
+ status: 'denied',
82
+ reason: `Policy denied: ${evaluation.violations.join('; ')}`,
83
+ violations: evaluation.violations,
84
+ };
85
+ }
86
+ // 6. Dry-run: return decoded intent + policy evaluation without signing
87
+ if (ctx.dryRun) {
88
+ ctx.auditSink.log({
89
+ service,
90
+ action: actionName,
91
+ who: ctx.caller,
92
+ what: `Dry-run approved ${intent.protocol}:${intent.action} on chain ${input.chainId}`,
93
+ why: 'Approved by decoder + policy (dry-run)',
94
+ result: 'approved',
95
+ details: { chainId: input.chainId, to, protocol: intent.protocol, action: intent.action, dryRun: true },
96
+ });
97
+ return {
98
+ status: 'dry-run-approved',
99
+ details: {
100
+ protocol: intent.protocol,
101
+ action: intent.action,
102
+ chainId: input.chainId,
103
+ to,
104
+ intent,
105
+ evaluation: { allowed: true, violations: [] },
106
+ },
107
+ };
108
+ }
109
+ // 7. Sign
110
+ if (!ctx.signer) {
111
+ ctx.auditSink.log({
112
+ service,
113
+ action: actionName,
114
+ who: ctx.caller,
115
+ what: 'Signer not available for signing',
116
+ why: 'Configuration error: signer is required when dryRun is not enabled',
117
+ result: 'error',
118
+ });
119
+ return { status: 'error', reason: 'Signer is required when dryRun is not enabled' };
120
+ }
121
+ try {
122
+ const signedTx = await ctx.signer.signTransaction({
123
+ chainId: input.chainId,
124
+ to,
125
+ data,
126
+ value: amountWei,
127
+ });
128
+ ctx.auditSink.log({
129
+ service,
130
+ action: actionName,
131
+ who: ctx.caller,
132
+ what: `Signed ${intent.protocol}:${intent.action} for ${to} on chain ${input.chainId}`,
133
+ why: 'Approved by decoder + policy',
134
+ result: 'approved',
135
+ details: { chainId: input.chainId, to, protocol: intent.protocol, action: intent.action },
136
+ });
137
+ return {
138
+ status: 'approved',
139
+ data: signedTx,
140
+ details: { protocol: intent.protocol, action: intent.action },
141
+ };
142
+ }
143
+ catch (error) {
144
+ const msg = error instanceof Error ? error.message : String(error);
145
+ ctx.auditSink.log({
146
+ service,
147
+ action: actionName,
148
+ who: ctx.caller,
149
+ what: `Failed to sign ${intent.protocol}:${intent.action}`,
150
+ why: 'Signing error',
151
+ result: 'error',
152
+ details: { error: msg },
153
+ });
154
+ return { status: 'error', reason: `Signing error: ${msg}` };
155
+ }
156
+ }
157
+ //# sourceMappingURL=sign-defi-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-defi-call.js","sourceRoot":"","sources":["../../../src/protocols/workflows/sign-defi-call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { WorkflowContext, WorkflowResult } from './types.js';
2
+ export interface SignPermitInput {
3
+ chainId: number;
4
+ token: string;
5
+ spender: string;
6
+ value: string;
7
+ deadline: number;
8
+ domain: Record<string, unknown>;
9
+ types: Record<string, unknown>;
10
+ message: Record<string, unknown>;
11
+ }
12
+ /**
13
+ * EIP-2612 permit signing workflow.
14
+ *
15
+ * Security validations:
16
+ * 1. Canonical EIP-2612 types.Permit field check
17
+ * 2. Message field presence (value, spender, deadline)
18
+ * 3. Payload/metadata consistency (message vs top-level args)
19
+ * 4. Domain validation (verifyingContract, chainId)
20
+ */
21
+ export declare function signPermit(ctx: WorkflowContext, input: SignPermitInput): Promise<WorkflowResult>;