@agirails/sdk 2.2.3 → 2.3.1

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 (211) hide show
  1. package/README.md +65 -31
  2. package/dist/ACTPClient.d.ts +42 -1
  3. package/dist/ACTPClient.d.ts.map +1 -1
  4. package/dist/ACTPClient.js +207 -22
  5. package/dist/ACTPClient.js.map +1 -1
  6. package/dist/abi/AgentRegistry.json +133 -0
  7. package/dist/adapters/AdapterRouter.d.ts.map +1 -1
  8. package/dist/adapters/AdapterRouter.js.map +1 -1
  9. package/dist/adapters/BasicAdapter.d.ts +10 -1
  10. package/dist/adapters/BasicAdapter.d.ts.map +1 -1
  11. package/dist/adapters/BasicAdapter.js +36 -1
  12. package/dist/adapters/BasicAdapter.js.map +1 -1
  13. package/dist/adapters/X402Adapter.d.ts +34 -7
  14. package/dist/adapters/X402Adapter.d.ts.map +1 -1
  15. package/dist/adapters/X402Adapter.js +36 -8
  16. package/dist/adapters/X402Adapter.js.map +1 -1
  17. package/dist/adapters/index.d.ts +1 -1
  18. package/dist/adapters/index.d.ts.map +1 -1
  19. package/dist/adapters/index.js.map +1 -1
  20. package/dist/cli/commands/diff.d.ts +11 -0
  21. package/dist/cli/commands/diff.d.ts.map +1 -0
  22. package/dist/cli/commands/diff.js +115 -0
  23. package/dist/cli/commands/diff.js.map +1 -0
  24. package/dist/cli/commands/init.d.ts +1 -0
  25. package/dist/cli/commands/init.d.ts.map +1 -1
  26. package/dist/cli/commands/init.js +260 -19
  27. package/dist/cli/commands/init.js.map +1 -1
  28. package/dist/cli/commands/publish.d.ts +11 -0
  29. package/dist/cli/commands/publish.d.ts.map +1 -0
  30. package/dist/cli/commands/publish.js +170 -0
  31. package/dist/cli/commands/publish.js.map +1 -0
  32. package/dist/cli/commands/pull.d.ts +12 -0
  33. package/dist/cli/commands/pull.d.ts.map +1 -0
  34. package/dist/cli/commands/pull.js +99 -0
  35. package/dist/cli/commands/pull.js.map +1 -0
  36. package/dist/cli/commands/register.d.ts +16 -0
  37. package/dist/cli/commands/register.d.ts.map +1 -0
  38. package/dist/cli/commands/register.js +211 -0
  39. package/dist/cli/commands/register.js.map +1 -0
  40. package/dist/cli/index.js +10 -0
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/cli/utils/config.d.ts +6 -0
  43. package/dist/cli/utils/config.d.ts.map +1 -1
  44. package/dist/cli/utils/config.js.map +1 -1
  45. package/dist/config/agirailsmd.d.ts +94 -0
  46. package/dist/config/agirailsmd.d.ts.map +1 -0
  47. package/dist/config/agirailsmd.js +209 -0
  48. package/dist/config/agirailsmd.js.map +1 -0
  49. package/dist/config/networks.d.ts +22 -4
  50. package/dist/config/networks.d.ts.map +1 -1
  51. package/dist/config/networks.js +64 -26
  52. package/dist/config/networks.js.map +1 -1
  53. package/dist/config/publishPipeline.d.ts +75 -0
  54. package/dist/config/publishPipeline.d.ts.map +1 -0
  55. package/dist/config/publishPipeline.js +193 -0
  56. package/dist/config/publishPipeline.js.map +1 -0
  57. package/dist/config/syncOperations.d.ts +67 -0
  58. package/dist/config/syncOperations.d.ts.map +1 -0
  59. package/dist/config/syncOperations.js +208 -0
  60. package/dist/config/syncOperations.js.map +1 -0
  61. package/dist/erc8004/ERC8004Bridge.d.ts.map +1 -1
  62. package/dist/erc8004/ERC8004Bridge.js +6 -5
  63. package/dist/erc8004/ERC8004Bridge.js.map +1 -1
  64. package/dist/erc8004/ReputationReporter.d.ts.map +1 -1
  65. package/dist/erc8004/ReputationReporter.js +9 -12
  66. package/dist/erc8004/ReputationReporter.js.map +1 -1
  67. package/dist/index.d.ts +5 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +11 -3
  70. package/dist/index.js.map +1 -1
  71. package/dist/level0/request.d.ts.map +1 -1
  72. package/dist/level0/request.js +23 -86
  73. package/dist/level0/request.js.map +1 -1
  74. package/dist/level1/Agent.d.ts +0 -11
  75. package/dist/level1/Agent.d.ts.map +1 -1
  76. package/dist/level1/Agent.js +19 -36
  77. package/dist/level1/Agent.js.map +1 -1
  78. package/dist/protocol/ACTPKernel.d.ts +7 -1
  79. package/dist/protocol/ACTPKernel.d.ts.map +1 -1
  80. package/dist/protocol/ACTPKernel.js +13 -10
  81. package/dist/protocol/ACTPKernel.js.map +1 -1
  82. package/dist/protocol/EventMonitor.d.ts +14 -0
  83. package/dist/protocol/EventMonitor.d.ts.map +1 -1
  84. package/dist/protocol/EventMonitor.js +14 -0
  85. package/dist/protocol/EventMonitor.js.map +1 -1
  86. package/dist/registry/AgentRegistryClient.d.ts +75 -0
  87. package/dist/registry/AgentRegistryClient.d.ts.map +1 -0
  88. package/dist/registry/AgentRegistryClient.js +160 -0
  89. package/dist/registry/AgentRegistryClient.js.map +1 -0
  90. package/dist/runtime/BlockchainRuntime.d.ts +5 -0
  91. package/dist/runtime/BlockchainRuntime.d.ts.map +1 -1
  92. package/dist/runtime/BlockchainRuntime.js +1 -1
  93. package/dist/runtime/BlockchainRuntime.js.map +1 -1
  94. package/dist/storage/ArchiveBundleBuilder.d.ts.map +1 -1
  95. package/dist/storage/ArchiveBundleBuilder.js.map +1 -1
  96. package/dist/storage/ArweaveClient.d.ts.map +1 -1
  97. package/dist/storage/ArweaveClient.js +2 -0
  98. package/dist/storage/ArweaveClient.js.map +1 -1
  99. package/dist/storage/FilebaseClient.d.ts.map +1 -1
  100. package/dist/storage/FilebaseClient.js +2 -0
  101. package/dist/storage/FilebaseClient.js.map +1 -1
  102. package/dist/types/adapter.d.ts +39 -0
  103. package/dist/types/adapter.d.ts.map +1 -1
  104. package/dist/types/adapter.js +7 -0
  105. package/dist/types/adapter.js.map +1 -1
  106. package/dist/types/x402.d.ts +23 -0
  107. package/dist/types/x402.d.ts.map +1 -1
  108. package/dist/types/x402.js.map +1 -1
  109. package/dist/utils/ErrorRecoveryGuide.d.ts.map +1 -1
  110. package/dist/utils/ErrorRecoveryGuide.js +3 -2
  111. package/dist/utils/ErrorRecoveryGuide.js.map +1 -1
  112. package/dist/utils/IPFSClient.d.ts +3 -2
  113. package/dist/utils/IPFSClient.d.ts.map +1 -1
  114. package/dist/utils/IPFSClient.js +7 -5
  115. package/dist/utils/IPFSClient.js.map +1 -1
  116. package/dist/utils/computeTypeHash.js +1 -3
  117. package/dist/utils/computeTypeHash.js.map +1 -1
  118. package/dist/utils/retry.d.ts.map +1 -1
  119. package/dist/utils/retry.js +0 -1
  120. package/dist/utils/retry.js.map +1 -1
  121. package/dist/utils/validation.d.ts +2 -2
  122. package/dist/utils/validation.d.ts.map +1 -1
  123. package/dist/utils/validation.js +2 -2
  124. package/dist/utils/validation.js.map +1 -1
  125. package/dist/wallet/AutoWalletProvider.d.ts +77 -0
  126. package/dist/wallet/AutoWalletProvider.d.ts.map +1 -0
  127. package/dist/wallet/AutoWalletProvider.js +197 -0
  128. package/dist/wallet/AutoWalletProvider.js.map +1 -0
  129. package/dist/wallet/EOAWalletProvider.d.ts +21 -0
  130. package/dist/wallet/EOAWalletProvider.d.ts.map +1 -0
  131. package/dist/wallet/EOAWalletProvider.js +57 -0
  132. package/dist/wallet/EOAWalletProvider.js.map +1 -0
  133. package/dist/wallet/IWalletProvider.d.ts +115 -0
  134. package/dist/wallet/IWalletProvider.d.ts.map +1 -0
  135. package/dist/wallet/IWalletProvider.js +12 -0
  136. package/dist/wallet/IWalletProvider.js.map +1 -0
  137. package/dist/wallet/aa/BundlerClient.d.ts +70 -0
  138. package/dist/wallet/aa/BundlerClient.d.ts.map +1 -0
  139. package/dist/wallet/aa/BundlerClient.js +183 -0
  140. package/dist/wallet/aa/BundlerClient.js.map +1 -0
  141. package/dist/wallet/aa/DualNonceManager.d.ts +55 -0
  142. package/dist/wallet/aa/DualNonceManager.d.ts.map +1 -0
  143. package/dist/wallet/aa/DualNonceManager.js +131 -0
  144. package/dist/wallet/aa/DualNonceManager.js.map +1 -0
  145. package/dist/wallet/aa/PaymasterClient.d.ts +52 -0
  146. package/dist/wallet/aa/PaymasterClient.d.ts.map +1 -0
  147. package/dist/wallet/aa/PaymasterClient.js +115 -0
  148. package/dist/wallet/aa/PaymasterClient.js.map +1 -0
  149. package/dist/wallet/aa/TransactionBatcher.d.ts +87 -0
  150. package/dist/wallet/aa/TransactionBatcher.d.ts.map +1 -0
  151. package/dist/wallet/aa/TransactionBatcher.js +148 -0
  152. package/dist/wallet/aa/TransactionBatcher.js.map +1 -0
  153. package/dist/wallet/aa/UserOpBuilder.d.ts +71 -0
  154. package/dist/wallet/aa/UserOpBuilder.d.ts.map +1 -0
  155. package/dist/wallet/aa/UserOpBuilder.js +196 -0
  156. package/dist/wallet/aa/UserOpBuilder.js.map +1 -0
  157. package/dist/wallet/aa/constants.d.ts +54 -0
  158. package/dist/wallet/aa/constants.d.ts.map +1 -0
  159. package/dist/wallet/aa/constants.js +18 -0
  160. package/dist/wallet/aa/constants.js.map +1 -0
  161. package/dist/wallet/keystore.d.ts +16 -0
  162. package/dist/wallet/keystore.d.ts.map +1 -0
  163. package/dist/wallet/keystore.js +132 -0
  164. package/dist/wallet/keystore.js.map +1 -0
  165. package/package.json +5 -2
  166. package/src/ACTPClient.ts +275 -27
  167. package/src/abi/AgentRegistry.json +133 -0
  168. package/src/adapters/AdapterRouter.ts +0 -1
  169. package/src/adapters/BasicAdapter.ts +41 -1
  170. package/src/adapters/X402Adapter.ts +94 -16
  171. package/src/adapters/index.ts +9 -1
  172. package/src/cli/commands/diff.ts +141 -0
  173. package/src/cli/commands/init.ts +311 -22
  174. package/src/cli/commands/publish.ts +208 -0
  175. package/src/cli/commands/pull.ts +124 -0
  176. package/src/cli/commands/register.ts +233 -0
  177. package/src/cli/index.ts +12 -0
  178. package/src/cli/utils/config.ts +9 -0
  179. package/src/config/agirailsmd.ts +262 -0
  180. package/src/config/networks.ts +89 -26
  181. package/src/config/publishPipeline.ts +276 -0
  182. package/src/config/syncOperations.ts +279 -0
  183. package/src/erc8004/ERC8004Bridge.ts +6 -5
  184. package/src/erc8004/ReputationReporter.ts +14 -18
  185. package/src/index.ts +15 -0
  186. package/src/level0/request.ts +27 -88
  187. package/src/level1/Agent.ts +21 -37
  188. package/src/protocol/ACTPKernel.ts +20 -10
  189. package/src/protocol/EventMonitor.ts +14 -0
  190. package/src/registry/AgentRegistryClient.ts +202 -0
  191. package/src/runtime/BlockchainRuntime.ts +7 -1
  192. package/src/storage/ArchiveBundleBuilder.ts +0 -2
  193. package/src/storage/ArweaveClient.ts +2 -1
  194. package/src/storage/FilebaseClient.ts +3 -3
  195. package/src/types/adapter.ts +14 -0
  196. package/src/types/x402.ts +32 -0
  197. package/src/utils/ErrorRecoveryGuide.ts +4 -2
  198. package/src/utils/IPFSClient.ts +9 -7
  199. package/src/utils/computeTypeHash.ts +1 -3
  200. package/src/utils/retry.ts +0 -1
  201. package/src/utils/validation.ts +2 -2
  202. package/src/wallet/AutoWalletProvider.ts +294 -0
  203. package/src/wallet/EOAWalletProvider.ts +69 -0
  204. package/src/wallet/IWalletProvider.ts +133 -0
  205. package/src/wallet/aa/BundlerClient.ts +273 -0
  206. package/src/wallet/aa/DualNonceManager.ts +163 -0
  207. package/src/wallet/aa/PaymasterClient.ts +173 -0
  208. package/src/wallet/aa/TransactionBatcher.ts +240 -0
  209. package/src/wallet/aa/UserOpBuilder.ts +246 -0
  210. package/src/wallet/aa/constants.ts +60 -0
  211. package/src/wallet/keystore.ts +119 -0
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * TransactionBatcher — Encodes ACTP multi-call batches.
4
+ *
5
+ * An ACTP payment requires 3 contract calls:
6
+ * 1. USDC.approve(escrowVault, amount)
7
+ * 2. ACTPKernel.createTransaction(provider, requester, amount, deadline, disputeWindow, serviceHash, agentId)
8
+ * 3. ACTPKernel.linkEscrow(txId, escrowVault, escrowId)
9
+ *
10
+ * TransactionBatcher encodes all 3 as SmartWalletCall[] for executeBatch.
11
+ * It pre-computes the txId using the same keccak256 formula as the contract.
12
+ *
13
+ * @module wallet/aa/TransactionBatcher
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.buildTestnetInitBatch = exports.buildTestnetMintBatch = exports.buildRegisterAgentBatch = exports.buildACTPPayBatch = exports.computeTransactionId = void 0;
17
+ const ethers_1 = require("ethers");
18
+ // ============================================================================
19
+ // ABI fragments — minimal for encoding only
20
+ // ============================================================================
21
+ const ERC20_APPROVE_ABI = [
22
+ 'function approve(address spender, uint256 amount)',
23
+ ];
24
+ const ACTP_KERNEL_ABI = [
25
+ 'function createTransaction(address provider, address requester, uint256 amount, uint256 deadline, uint256 disputeWindow, bytes32 serviceHash, uint256 agentId)',
26
+ 'function linkEscrow(bytes32 txId, address escrowVault, bytes32 escrowId)',
27
+ ];
28
+ // ============================================================================
29
+ // Public API
30
+ // ============================================================================
31
+ /**
32
+ * Pre-compute ACTP transaction ID.
33
+ *
34
+ * Matches ACTPKernel.sol:
35
+ * transactionId = keccak256(abi.encodePacked(requester, provider, amount, serviceHash, nonce))
36
+ */
37
+ function computeTransactionId(requester, provider, amount, serviceHash, nonce) {
38
+ return ethers_1.ethers.keccak256(ethers_1.ethers.solidityPacked(['address', 'address', 'uint256', 'bytes32', 'uint256'], [requester, provider, BigInt(amount), serviceHash, nonce]));
39
+ }
40
+ exports.computeTransactionId = computeTransactionId;
41
+ /**
42
+ * Build the 3-call ACTP payment batch.
43
+ *
44
+ * Returns SmartWalletCall[] for executeBatch and the pre-computed txId.
45
+ */
46
+ function buildACTPPayBatch(params) {
47
+ const amount = BigInt(params.amount);
48
+ // Pre-compute txId
49
+ const txId = computeTransactionId(params.requester, params.provider, params.amount, params.serviceHash, params.actpNonce);
50
+ const erc20Iface = new ethers_1.ethers.Interface(ERC20_APPROVE_ABI);
51
+ const kernelIface = new ethers_1.ethers.Interface(ACTP_KERNEL_ABI);
52
+ // Call 1: USDC.approve(escrowVault, amount)
53
+ const approveData = erc20Iface.encodeFunctionData('approve', [
54
+ params.contracts.escrowVault,
55
+ amount,
56
+ ]);
57
+ // Call 2: ACTPKernel.createTransaction(...)
58
+ const createTxData = kernelIface.encodeFunctionData('createTransaction', [
59
+ params.provider,
60
+ params.requester,
61
+ amount,
62
+ params.deadline,
63
+ params.disputeWindow,
64
+ params.serviceHash,
65
+ BigInt(params.agentId || '0'),
66
+ ]);
67
+ // Call 3: ACTPKernel.linkEscrow(txId, escrowVault, escrowId)
68
+ // escrowId = txId (ACTP standard)
69
+ const linkEscrowData = kernelIface.encodeFunctionData('linkEscrow', [
70
+ txId,
71
+ params.contracts.escrowVault,
72
+ txId,
73
+ ]);
74
+ const calls = [
75
+ { target: params.contracts.usdc, value: 0n, data: approveData },
76
+ { target: params.contracts.actpKernel, value: 0n, data: createTxData },
77
+ { target: params.contracts.actpKernel, value: 0n, data: linkEscrowData },
78
+ ];
79
+ return { calls, txId };
80
+ }
81
+ exports.buildACTPPayBatch = buildACTPPayBatch;
82
+ /**
83
+ * ABI fragment for AgentRegistry.registerAgent.
84
+ *
85
+ * Matches IAgentRegistry.sol:
86
+ * registerAgent(string endpoint, ServiceDescriptor[] serviceDescriptors)
87
+ *
88
+ * ServiceDescriptor = (bytes32, string, string, uint256, uint256, uint256, string)
89
+ */
90
+ const AGENT_REGISTRY_ABI = [
91
+ 'function registerAgent(string endpoint, (bytes32 serviceTypeHash, string serviceType, string schemaURI, uint256 minPrice, uint256 maxPrice, uint256 avgCompletionTime, string metadataCID)[] serviceDescriptors)',
92
+ ];
93
+ /**
94
+ * Build a register-agent batch for AgentRegistry.
95
+ *
96
+ * Used for bootstrap registration (gasless even before registration — chicken-and-egg).
97
+ *
98
+ * @param agentRegistryAddress - AgentRegistry contract address
99
+ * @param endpoint - Agent webhook / IPFS gateway URL
100
+ * @param serviceDescriptors - At least 1 service descriptor (contract requirement)
101
+ */
102
+ function buildRegisterAgentBatch(agentRegistryAddress, endpoint, serviceDescriptors) {
103
+ if (serviceDescriptors.length === 0) {
104
+ throw new Error('At least one service descriptor is required for registration');
105
+ }
106
+ const iface = new ethers_1.ethers.Interface(AGENT_REGISTRY_ABI);
107
+ // Convert to contract format (bigint fields already correct)
108
+ const descriptors = serviceDescriptors.map(sd => ({
109
+ serviceTypeHash: sd.serviceTypeHash,
110
+ serviceType: sd.serviceType,
111
+ schemaURI: sd.schemaURI,
112
+ minPrice: sd.minPrice,
113
+ maxPrice: sd.maxPrice,
114
+ avgCompletionTime: sd.avgCompletionTime,
115
+ metadataCID: sd.metadataCID,
116
+ }));
117
+ const data = iface.encodeFunctionData('registerAgent', [endpoint, descriptors]);
118
+ return [
119
+ { target: agentRegistryAddress, value: 0n, data },
120
+ ];
121
+ }
122
+ exports.buildRegisterAgentBatch = buildRegisterAgentBatch;
123
+ /**
124
+ * Build a MockUSDC mint call (testnet only).
125
+ */
126
+ function buildTestnetMintBatch(mockUsdcAddress, recipient, amount) {
127
+ const iface = new ethers_1.ethers.Interface([
128
+ 'function mint(address to, uint256 amount)',
129
+ ]);
130
+ const data = iface.encodeFunctionData('mint', [recipient, BigInt(amount)]);
131
+ return [
132
+ { target: mockUsdcAddress, value: 0n, data },
133
+ ];
134
+ }
135
+ exports.buildTestnetMintBatch = buildTestnetMintBatch;
136
+ /**
137
+ * Build a combined register + mint batch for testnet init.
138
+ *
139
+ * Single UserOp: register on AgentRegistry + mint test USDC.
140
+ * Both are bootstrap-allowed (gasless without prior registration).
141
+ */
142
+ function buildTestnetInitBatch(params) {
143
+ const registerCalls = buildRegisterAgentBatch(params.agentRegistryAddress, params.endpoint, params.serviceDescriptors);
144
+ const mintCalls = buildTestnetMintBatch(params.mockUsdcAddress, params.recipient, params.mintAmount);
145
+ return [...registerCalls, ...mintCalls];
146
+ }
147
+ exports.buildTestnetInitBatch = buildTestnetInitBatch;
148
+ //# sourceMappingURL=TransactionBatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionBatcher.js","sourceRoot":"","sources":["../../../src/wallet/aa/TransactionBatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * UserOpBuilder — Constructs ERC-4337 v0.6 UserOperations.
3
+ *
4
+ * Builds UserOps for CoinbaseSmartWallet:
5
+ * - Encodes executeBatch(Call[]) as callData
6
+ * - Adds initCode for first-time wallet deployment
7
+ * - Signs with owner's private key (EIP-191 over UserOp hash)
8
+ *
9
+ * Uses ethers v6 for ABI encoding (no viem dependency yet — see Phase 2 note).
10
+ * viem+permissionless will be added if needed for paymaster integration.
11
+ *
12
+ * @module wallet/aa/UserOpBuilder
13
+ */
14
+ import { ethers } from 'ethers';
15
+ import { UserOperationV06, SmartWalletCall } from './constants';
16
+ /**
17
+ * Compute the counterfactual Smart Wallet address for a given signer.
18
+ *
19
+ * This address is deterministic (CREATE2) and can be computed off-chain
20
+ * without deploying the wallet.
21
+ */
22
+ export declare function computeSmartWalletAddress(signerAddress: string, provider: ethers.JsonRpcProvider, nonce?: bigint): Promise<string>;
23
+ /**
24
+ * Build initCode for first-time wallet deployment.
25
+ *
26
+ * initCode = factory address + createAccount calldata
27
+ * When the wallet already exists, pass '0x' as initCode.
28
+ */
29
+ export declare function buildInitCode(signerAddress: string, nonce?: bigint): string;
30
+ /**
31
+ * Encode executeBatch calldata from an array of calls.
32
+ */
33
+ export declare function encodeExecuteBatch(calls: SmartWalletCall[]): string;
34
+ /**
35
+ * Build a full UserOperation (unsigned).
36
+ *
37
+ * Gas limits and paymasterAndData must be filled by the caller
38
+ * (via BundlerClient.estimateGas and PaymasterClient.sponsor).
39
+ */
40
+ export declare function buildUserOp(params: {
41
+ sender: string;
42
+ nonce: bigint;
43
+ calls: SmartWalletCall[];
44
+ isFirstDeploy: boolean;
45
+ signerAddress: string;
46
+ }): UserOperationV06;
47
+ /**
48
+ * Compute the UserOperation hash for signing (v0.6).
49
+ *
50
+ * hash = keccak256(abi.encode(
51
+ * keccak256(pack(userOp)),
52
+ * entryPoint,
53
+ * chainId
54
+ * ))
55
+ */
56
+ export declare function getUserOpHash(userOp: UserOperationV06, chainId: number): string;
57
+ /**
58
+ * Sign a UserOperation with the owner's private key.
59
+ *
60
+ * CoinbaseSmartWallet expects the signature to be:
61
+ * abi.encode(SignatureWrapper(0, abi.encodePacked(r,s,v)))
62
+ *
63
+ * where ownerIndex=0 for single-owner wallets.
64
+ */
65
+ export declare function signUserOp(userOp: UserOperationV06, signer: ethers.Wallet, chainId: number): Promise<string>;
66
+ /**
67
+ * Serialize UserOp for JSON-RPC (bundler API).
68
+ * Converts bigints to hex strings.
69
+ */
70
+ export declare function serializeUserOp(userOp: UserOperationV06): Record<string, string>;
71
+ //# sourceMappingURL=UserOpBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserOpBuilder.d.ts","sourceRoot":"","sources":["../../../src/wallet/aa/UserOpBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,eAAe,EAIhB,MAAM,aAAa,CAAC;AAiCrB;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,CAAC,eAAe,EAChC,KAAK,GAAE,MAA6B,GACnC,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,KAAK,GAAE,MAA6B,GACnC,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CASnE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,gBAAgB,CAoBnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,GACd,MAAM,CAqCR;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAchF"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * UserOpBuilder — Constructs ERC-4337 v0.6 UserOperations.
4
+ *
5
+ * Builds UserOps for CoinbaseSmartWallet:
6
+ * - Encodes executeBatch(Call[]) as callData
7
+ * - Adds initCode for first-time wallet deployment
8
+ * - Signs with owner's private key (EIP-191 over UserOp hash)
9
+ *
10
+ * Uses ethers v6 for ABI encoding (no viem dependency yet — see Phase 2 note).
11
+ * viem+permissionless will be added if needed for paymaster integration.
12
+ *
13
+ * @module wallet/aa/UserOpBuilder
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.serializeUserOp = exports.signUserOp = exports.getUserOpHash = exports.buildUserOp = exports.encodeExecuteBatch = exports.buildInitCode = exports.computeSmartWalletAddress = void 0;
17
+ const ethers_1 = require("ethers");
18
+ const constants_1 = require("./constants");
19
+ const abiCoder = ethers_1.ethers.AbiCoder.defaultAbiCoder();
20
+ // ============================================================================
21
+ // ABI fragments
22
+ // ============================================================================
23
+ /** CoinbaseSmartWallet.executeBatch(Call[]) */
24
+ const EXECUTE_BATCH_ABI = [
25
+ 'function executeBatch((address target, uint256 value, bytes data)[] calls)',
26
+ ];
27
+ /** CoinbaseSmartWalletFactory.createAccount(bytes[],uint256) */
28
+ const FACTORY_CREATE_ABI = [
29
+ 'function createAccount(bytes[] owners, uint256 nonce)',
30
+ ];
31
+ /** CoinbaseSmartWalletFactory.getAddress(bytes[],uint256) */
32
+ const FACTORY_GET_ADDRESS_ABI = [
33
+ 'function getAddress(bytes[] owners, uint256 nonce) view returns (address)',
34
+ ];
35
+ // Typed factory interface to avoid ethers v6 getAddress() collision
36
+ const FACTORY_ABI = [
37
+ ...FACTORY_CREATE_ABI,
38
+ ...FACTORY_GET_ADDRESS_ABI,
39
+ ];
40
+ // ============================================================================
41
+ // Public API
42
+ // ============================================================================
43
+ /**
44
+ * Compute the counterfactual Smart Wallet address for a given signer.
45
+ *
46
+ * This address is deterministic (CREATE2) and can be computed off-chain
47
+ * without deploying the wallet.
48
+ */
49
+ async function computeSmartWalletAddress(signerAddress, provider, nonce = constants_1.DEFAULT_WALLET_NONCE) {
50
+ const factory = new ethers_1.ethers.Contract(constants_1.SMART_WALLET_FACTORY, FACTORY_ABI, provider);
51
+ // CoinbaseSmartWallet encodes owners as bytes[] — EOA address is abi.encode(address)
52
+ const ownerBytes = abiCoder.encode(['address'], [signerAddress]);
53
+ // Use getFunction to avoid collision with ethers v6 BaseContract.getAddress()
54
+ const fn = factory.getFunction('getAddress');
55
+ return await fn([ownerBytes], nonce);
56
+ }
57
+ exports.computeSmartWalletAddress = computeSmartWalletAddress;
58
+ /**
59
+ * Build initCode for first-time wallet deployment.
60
+ *
61
+ * initCode = factory address + createAccount calldata
62
+ * When the wallet already exists, pass '0x' as initCode.
63
+ */
64
+ function buildInitCode(signerAddress, nonce = constants_1.DEFAULT_WALLET_NONCE) {
65
+ const iface = new ethers_1.ethers.Interface(FACTORY_CREATE_ABI);
66
+ const ownerBytes = abiCoder.encode(['address'], [signerAddress]);
67
+ const calldata = iface.encodeFunctionData('createAccount', [
68
+ [ownerBytes],
69
+ nonce,
70
+ ]);
71
+ // initCode = factory address (20 bytes) + calldata
72
+ return constants_1.SMART_WALLET_FACTORY + calldata.slice(2);
73
+ }
74
+ exports.buildInitCode = buildInitCode;
75
+ /**
76
+ * Encode executeBatch calldata from an array of calls.
77
+ */
78
+ function encodeExecuteBatch(calls) {
79
+ const iface = new ethers_1.ethers.Interface(EXECUTE_BATCH_ABI);
80
+ return iface.encodeFunctionData('executeBatch', [
81
+ calls.map((c) => ({
82
+ target: c.target,
83
+ value: c.value,
84
+ data: c.data,
85
+ })),
86
+ ]);
87
+ }
88
+ exports.encodeExecuteBatch = encodeExecuteBatch;
89
+ /**
90
+ * Build a full UserOperation (unsigned).
91
+ *
92
+ * Gas limits and paymasterAndData must be filled by the caller
93
+ * (via BundlerClient.estimateGas and PaymasterClient.sponsor).
94
+ */
95
+ function buildUserOp(params) {
96
+ const callData = encodeExecuteBatch(params.calls);
97
+ const initCode = params.isFirstDeploy
98
+ ? buildInitCode(params.signerAddress)
99
+ : '0x';
100
+ return {
101
+ sender: params.sender,
102
+ nonce: params.nonce,
103
+ initCode,
104
+ callData,
105
+ // Placeholder values — filled by gas estimation
106
+ callGasLimit: 0n,
107
+ verificationGasLimit: 0n,
108
+ preVerificationGas: 0n,
109
+ maxFeePerGas: 0n,
110
+ maxPriorityFeePerGas: 0n,
111
+ paymasterAndData: '0x',
112
+ signature: '0x',
113
+ };
114
+ }
115
+ exports.buildUserOp = buildUserOp;
116
+ /**
117
+ * Compute the UserOperation hash for signing (v0.6).
118
+ *
119
+ * hash = keccak256(abi.encode(
120
+ * keccak256(pack(userOp)),
121
+ * entryPoint,
122
+ * chainId
123
+ * ))
124
+ */
125
+ function getUserOpHash(userOp, chainId) {
126
+ // Pack all fields except signature
127
+ const packed = abiCoder.encode([
128
+ 'address', // sender
129
+ 'uint256', // nonce
130
+ 'bytes32', // keccak256(initCode)
131
+ 'bytes32', // keccak256(callData)
132
+ 'uint256', // callGasLimit
133
+ 'uint256', // verificationGasLimit
134
+ 'uint256', // preVerificationGas
135
+ 'uint256', // maxFeePerGas
136
+ 'uint256', // maxPriorityFeePerGas
137
+ 'bytes32', // keccak256(paymasterAndData)
138
+ ], [
139
+ userOp.sender,
140
+ userOp.nonce,
141
+ ethers_1.ethers.keccak256(userOp.initCode),
142
+ ethers_1.ethers.keccak256(userOp.callData),
143
+ userOp.callGasLimit,
144
+ userOp.verificationGasLimit,
145
+ userOp.preVerificationGas,
146
+ userOp.maxFeePerGas,
147
+ userOp.maxPriorityFeePerGas,
148
+ ethers_1.ethers.keccak256(userOp.paymasterAndData),
149
+ ]);
150
+ const packedHash = ethers_1.ethers.keccak256(packed);
151
+ return ethers_1.ethers.keccak256(abiCoder.encode(['bytes32', 'address', 'uint256'], [packedHash, constants_1.ENTRYPOINT_V06, chainId]));
152
+ }
153
+ exports.getUserOpHash = getUserOpHash;
154
+ /**
155
+ * Sign a UserOperation with the owner's private key.
156
+ *
157
+ * CoinbaseSmartWallet expects the signature to be:
158
+ * abi.encode(SignatureWrapper(0, abi.encodePacked(r,s,v)))
159
+ *
160
+ * where ownerIndex=0 for single-owner wallets.
161
+ */
162
+ async function signUserOp(userOp, signer, chainId) {
163
+ const hash = getUserOpHash(userOp, chainId);
164
+ // ethers signMessage adds EIP-191 prefix. CoinbaseSmartWallet expects raw ECDSA.
165
+ // We use signingKey.sign() for raw signature over the hash bytes.
166
+ const sig = signer.signingKey.sign(hash);
167
+ // Pack r + s + v
168
+ const rawSig = ethers_1.ethers.concat([sig.r, sig.s, new Uint8Array([sig.v])]);
169
+ // CoinbaseSmartWallet SignatureWrapper: abi.encode(uint256 ownerIndex, bytes signatureData)
170
+ return abiCoder.encode(['uint256', 'bytes'], [0, rawSig]);
171
+ }
172
+ exports.signUserOp = signUserOp;
173
+ /**
174
+ * Serialize UserOp for JSON-RPC (bundler API).
175
+ * Converts bigints to hex strings.
176
+ */
177
+ function serializeUserOp(userOp) {
178
+ return {
179
+ sender: userOp.sender,
180
+ nonce: toHex(userOp.nonce),
181
+ initCode: userOp.initCode,
182
+ callData: userOp.callData,
183
+ callGasLimit: toHex(userOp.callGasLimit),
184
+ verificationGasLimit: toHex(userOp.verificationGasLimit),
185
+ preVerificationGas: toHex(userOp.preVerificationGas),
186
+ maxFeePerGas: toHex(userOp.maxFeePerGas),
187
+ maxPriorityFeePerGas: toHex(userOp.maxPriorityFeePerGas),
188
+ paymasterAndData: userOp.paymasterAndData,
189
+ signature: userOp.signature,
190
+ };
191
+ }
192
+ exports.serializeUserOp = serializeUserOp;
193
+ function toHex(n) {
194
+ return '0x' + n.toString(16);
195
+ }
196
+ //# sourceMappingURL=UserOpBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserOpBuilder.js","sourceRoot":"","sources":["../../../src/wallet/aa/UserOpBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Account Abstraction constants for CoinbaseSmartWallet on Base.
3
+ *
4
+ * EntryPoint v0.6 — CoinbaseSmartWallet hardcodes this version.
5
+ * Factory address is canonical across all Base networks.
6
+ *
7
+ * @module wallet/aa/constants
8
+ */
9
+ /** ERC-4337 EntryPoint v0.6 (canonical, all EVM chains) */
10
+ export declare const ENTRYPOINT_V06 = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789";
11
+ /** CoinbaseSmartWallet factory (canonical, all Base networks) */
12
+ export declare const SMART_WALLET_FACTORY = "0xBA5ED110eFDBa3D005bfC882d75358ACBbB85842";
13
+ /** Default nonce for first Smart Wallet per owner */
14
+ export declare const DEFAULT_WALLET_NONCE = 0n;
15
+ /**
16
+ * UserOperation v0.6 struct — 11 unpacked fields.
17
+ * CoinbaseSmartWallet does NOT support v0.7 packed format.
18
+ */
19
+ export interface UserOperationV06 {
20
+ sender: string;
21
+ nonce: bigint;
22
+ initCode: string;
23
+ callData: string;
24
+ callGasLimit: bigint;
25
+ verificationGasLimit: bigint;
26
+ preVerificationGas: bigint;
27
+ maxFeePerGas: bigint;
28
+ maxPriorityFeePerGas: bigint;
29
+ paymasterAndData: string;
30
+ signature: string;
31
+ }
32
+ /**
33
+ * CoinbaseSmartWallet Call struct for executeBatch.
34
+ */
35
+ export interface SmartWalletCall {
36
+ target: string;
37
+ value: bigint;
38
+ data: string;
39
+ }
40
+ /**
41
+ * Gas estimation result from bundler.
42
+ */
43
+ export interface GasEstimate {
44
+ callGasLimit: bigint;
45
+ verificationGasLimit: bigint;
46
+ preVerificationGas: bigint;
47
+ }
48
+ /**
49
+ * Paymaster sponsorship response.
50
+ */
51
+ export interface PaymasterResponse {
52
+ paymasterAndData: string;
53
+ }
54
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/wallet/aa/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,cAAc,+CAA+C,CAAC;AAE3E,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,+CAA+C,CAAC;AAEjF,qDAAqD;AACrD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * Account Abstraction constants for CoinbaseSmartWallet on Base.
4
+ *
5
+ * EntryPoint v0.6 — CoinbaseSmartWallet hardcodes this version.
6
+ * Factory address is canonical across all Base networks.
7
+ *
8
+ * @module wallet/aa/constants
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DEFAULT_WALLET_NONCE = exports.SMART_WALLET_FACTORY = exports.ENTRYPOINT_V06 = void 0;
12
+ /** ERC-4337 EntryPoint v0.6 (canonical, all EVM chains) */
13
+ exports.ENTRYPOINT_V06 = '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789';
14
+ /** CoinbaseSmartWallet factory (canonical, all Base networks) */
15
+ exports.SMART_WALLET_FACTORY = '0xBA5ED110eFDBa3D005bfC882d75358ACBbB85842';
16
+ /** Default nonce for first Smart Wallet per owner */
17
+ exports.DEFAULT_WALLET_NONCE = 0n;
18
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/wallet/aa/constants.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,2DAA2D;AAC9C,QAAA,cAAc,GAAG,4CAA4C,CAAC;AAE3E,iEAAiE;AACpD,QAAA,oBAAoB,GAAG,4CAA4C,CAAC;AAEjF,qDAAqD;AACxC,QAAA,oBAAoB,GAAG,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Auto-resolve private key: env var → keystore → undefined.
3
+ * Never logs or prints the key itself.
4
+ */
5
+ export declare function resolvePrivateKey(stateDirectory?: string): Promise<string | undefined>;
6
+ /**
7
+ * Get cached address from last resolvePrivateKey() call.
8
+ * Works for both env-var and keystore resolution paths.
9
+ */
10
+ export declare function getCachedAddress(stateDirectory?: string): string | undefined;
11
+ /**
12
+ * Clear all cached keys and addresses (for testing).
13
+ * @internal
14
+ */
15
+ export declare function _clearCache(): void;
16
+ //# sourceMappingURL=keystore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../src/wallet/keystore.ts"],"names":[],"mappings":"AA+CA;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwC7B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU5E;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports._clearCache = exports.getCachedAddress = exports.resolvePrivateKey = void 0;
27
+ /**
28
+ * Keystore auto-resolution for ACTP wallets.
29
+ *
30
+ * Resolution order:
31
+ * 1. ACTP_PRIVATE_KEY env var (backward compat, highest priority)
32
+ * 2. .actp/keystore.json decrypted with ACTP_KEY_PASSWORD
33
+ * 3. undefined (caller decides what to do)
34
+ */
35
+ const fs = __importStar(require("fs"));
36
+ const path = __importStar(require("path"));
37
+ const ethers_1 = require("ethers");
38
+ // Cache keyed by resolved keystorePath to support multiple stateDirectories
39
+ const _cache = new Map();
40
+ // Separate cache for env-var-resolved key (no path dependency)
41
+ let _envCache = null;
42
+ /**
43
+ * Validate that stateDirectory doesn't escape expected boundaries.
44
+ * Guards against path traversal when stateDirectory comes from user input.
45
+ */
46
+ function validateStateDirectory(stateDirectory) {
47
+ if (stateDirectory.includes('\0')) {
48
+ throw new Error('Invalid stateDirectory: null byte detected');
49
+ }
50
+ // Reject raw '..' in the input (before normalization resolves it)
51
+ // Catches both relative traversal (../../etc) and embedded traversal (/tmp/../../etc)
52
+ if (stateDirectory.includes('..')) {
53
+ throw new Error('Invalid stateDirectory: path traversal detected (..)');
54
+ }
55
+ }
56
+ /**
57
+ * Validate and normalize a raw private key string.
58
+ * Trims whitespace and verifies 0x-prefixed 64-char hex format.
59
+ */
60
+ function validateRawKey(raw, source) {
61
+ const trimmed = raw.trim();
62
+ if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed)) {
63
+ throw new Error(`Invalid private key from ${source}: expected 0x-prefixed 64-char hex string`);
64
+ }
65
+ return trimmed;
66
+ }
67
+ /**
68
+ * Auto-resolve private key: env var → keystore → undefined.
69
+ * Never logs or prints the key itself.
70
+ */
71
+ async function resolvePrivateKey(stateDirectory) {
72
+ // 1. Env var (highest priority, backward compat)
73
+ if (process.env.ACTP_PRIVATE_KEY) {
74
+ if (_envCache)
75
+ return _envCache.key;
76
+ const key = validateRawKey(process.env.ACTP_PRIVATE_KEY, 'ACTP_PRIVATE_KEY env var');
77
+ const address = new ethers_1.Wallet(key).address;
78
+ _envCache = { key, address };
79
+ return key;
80
+ }
81
+ // 2. Resolve keystore path
82
+ if (stateDirectory) {
83
+ validateStateDirectory(stateDirectory);
84
+ }
85
+ const actpDir = stateDirectory
86
+ ? path.join(stateDirectory, '.actp')
87
+ : path.join(process.cwd(), '.actp');
88
+ const keystorePath = path.resolve(actpDir, 'keystore.json');
89
+ // 3. Cache hit (keyed by resolved path)
90
+ const cached = _cache.get(keystorePath);
91
+ if (cached)
92
+ return cached.key;
93
+ // 4. Keystore file
94
+ if (!fs.existsSync(keystorePath))
95
+ return undefined;
96
+ const password = process.env.ACTP_KEY_PASSWORD;
97
+ if (!password) {
98
+ throw new Error('Keystore found at ' + keystorePath + ' but ACTP_KEY_PASSWORD is not set.\n' +
99
+ 'Set it: export ACTP_KEY_PASSWORD="your-password"');
100
+ }
101
+ const keystore = fs.readFileSync(keystorePath, 'utf-8');
102
+ const wallet = await ethers_1.Wallet.fromEncryptedJson(keystore, password);
103
+ _cache.set(keystorePath, { key: wallet.privateKey, address: wallet.address });
104
+ return wallet.privateKey;
105
+ }
106
+ exports.resolvePrivateKey = resolvePrivateKey;
107
+ /**
108
+ * Get cached address from last resolvePrivateKey() call.
109
+ * Works for both env-var and keystore resolution paths.
110
+ */
111
+ function getCachedAddress(stateDirectory) {
112
+ // Env var path
113
+ if (_envCache)
114
+ return _envCache.address;
115
+ // Keystore path — look up by resolved path
116
+ const actpDir = stateDirectory
117
+ ? path.join(stateDirectory, '.actp')
118
+ : path.join(process.cwd(), '.actp');
119
+ const keystorePath = path.resolve(actpDir, 'keystore.json');
120
+ return _cache.get(keystorePath)?.address;
121
+ }
122
+ exports.getCachedAddress = getCachedAddress;
123
+ /**
124
+ * Clear all cached keys and addresses (for testing).
125
+ * @internal
126
+ */
127
+ function _clearCache() {
128
+ _cache.clear();
129
+ _envCache = null;
130
+ }
131
+ exports._clearCache = _clearCache;
132
+ //# sourceMappingURL=keystore.js.map