agentvault 1.0.0 → 1.0.2

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 (293) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/README.md +1 -1
  3. package/dist/cli/commands/approve.js +5 -5
  4. package/dist/cli/commands/archive.js +5 -5
  5. package/dist/cli/commands/backup.js +5 -5
  6. package/dist/cli/commands/cloud-backup.js +12 -12
  7. package/dist/cli/commands/decrypt.js +2 -2
  8. package/dist/cli/commands/deploy.js +1 -1
  9. package/dist/cli/commands/exec.js +2 -2
  10. package/dist/cli/commands/fetch.js +4 -4
  11. package/dist/cli/commands/inference.js +5 -5
  12. package/dist/cli/commands/init.d.ts +1 -1
  13. package/dist/cli/commands/init.js +16 -16
  14. package/dist/cli/commands/list.js +4 -4
  15. package/dist/cli/commands/package.js +2 -2
  16. package/dist/cli/commands/profile.js +1 -1
  17. package/dist/cli/commands/rebuild.js +2 -2
  18. package/dist/cli/commands/show.js +1 -1
  19. package/dist/cli/commands/status.d.ts +1 -1
  20. package/dist/cli/commands/status.js +8 -8
  21. package/dist/cli/commands/trace.js +1 -1
  22. package/dist/cli/commands/wallet-export.js +1 -1
  23. package/dist/cli/commands/wallet-sign.js +1 -1
  24. package/dist/cli/commands/wallet.d.ts +1 -1
  25. package/dist/cli/commands/wallet.js +1 -1
  26. package/dist/cli/index.d.ts +2 -2
  27. package/dist/cli/index.js +3 -3
  28. package/dist/src/archival/archive-manager.d.ts +85 -0
  29. package/dist/src/archival/archive-manager.js +294 -0
  30. package/dist/src/archival/arweave-client.d.ts +88 -0
  31. package/dist/src/archival/arweave-client.js +223 -0
  32. package/dist/src/archival/index.d.ts +8 -0
  33. package/{src/archival/index.ts → dist/src/archival/index.js} +1 -1
  34. package/dist/src/backup/backup.d.ts +67 -0
  35. package/dist/src/backup/backup.js +231 -0
  36. package/dist/src/backup/index.d.ts +7 -0
  37. package/{src/backup/index.ts → dist/src/backup/index.js} +1 -1
  38. package/dist/src/cloud-storage/cloud-sync.d.ts +49 -0
  39. package/dist/src/cloud-storage/cloud-sync.js +372 -0
  40. package/dist/src/cloud-storage/index.d.ts +11 -0
  41. package/{src/cloud-storage/index.ts → dist/src/cloud-storage/index.js} +1 -1
  42. package/dist/src/cloud-storage/provider-detector.d.ts +34 -0
  43. package/dist/src/cloud-storage/provider-detector.js +158 -0
  44. package/{src/cloud-storage/types.ts → dist/src/cloud-storage/types.d.ts} +40 -53
  45. package/dist/src/cloud-storage/types.js +10 -0
  46. package/dist/src/debugging/index.d.ts +6 -0
  47. package/{src/debugging/index.ts → dist/src/debugging/index.js} +1 -1
  48. package/dist/src/debugging/logs.d.ts +32 -0
  49. package/dist/src/debugging/logs.js +158 -0
  50. package/dist/src/debugging/types.d.ts +91 -0
  51. package/dist/src/debugging/types.js +5 -0
  52. package/dist/src/deployment/deployer.d.ts +52 -0
  53. package/dist/src/deployment/deployer.js +211 -0
  54. package/dist/src/deployment/icpClient.d.ts +144 -0
  55. package/dist/src/deployment/icpClient.js +545 -0
  56. package/dist/src/deployment/index.d.ts +11 -0
  57. package/dist/src/deployment/index.js +14 -0
  58. package/dist/src/deployment/promotion.d.ts +32 -0
  59. package/dist/src/deployment/promotion.js +114 -0
  60. package/dist/src/deployment/types.d.ts +101 -0
  61. package/dist/src/deployment/types.js +5 -0
  62. package/dist/src/icp/batch.d.ts +112 -0
  63. package/dist/src/icp/batch.js +273 -0
  64. package/dist/src/icp/cycles.d.ts +29 -0
  65. package/{src/icp/cycles.ts → dist/src/icp/cycles.js} +8 -22
  66. package/dist/src/icp/environment.d.ts +60 -0
  67. package/dist/src/icp/environment.js +183 -0
  68. package/dist/src/icp/icpcli.d.ts +204 -0
  69. package/dist/src/icp/icpcli.js +374 -0
  70. package/dist/src/icp/icwasm.d.ts +94 -0
  71. package/dist/src/icp/icwasm.js +197 -0
  72. package/dist/src/icp/identity.d.ts +50 -0
  73. package/{src/icp/identity.ts → dist/src/icp/identity.js} +15 -28
  74. package/dist/src/icp/index.d.ts +16 -0
  75. package/dist/src/icp/index.js +20 -0
  76. package/dist/src/icp/optimization.d.ts +16 -0
  77. package/dist/src/icp/optimization.js +225 -0
  78. package/dist/src/icp/tokens.d.ts +24 -0
  79. package/{src/icp/tokens.ts → dist/src/icp/tokens.js} +5 -12
  80. package/dist/src/icp/tool-detector.d.ts +31 -0
  81. package/dist/src/icp/tool-detector.js +104 -0
  82. package/dist/src/icp/types.d.ts +493 -0
  83. package/dist/src/icp/types.js +7 -0
  84. package/dist/src/index.d.ts +12 -0
  85. package/dist/src/index.js +18 -0
  86. package/dist/src/inference/bittensor-client.d.ts +108 -0
  87. package/dist/src/inference/bittensor-client.js +224 -0
  88. package/dist/src/inference/index.d.ts +8 -0
  89. package/{src/inference/index.ts → dist/src/inference/index.js} +1 -1
  90. package/dist/src/inference/inference-manager.d.ts +76 -0
  91. package/dist/src/inference/inference-manager.js +228 -0
  92. package/dist/src/metrics/index.d.ts +7 -0
  93. package/{src/metrics/index.ts → dist/src/metrics/index.js} +1 -1
  94. package/dist/src/metrics/metrics.d.ts +39 -0
  95. package/dist/src/metrics/metrics.js +129 -0
  96. package/dist/src/monitoring/alerting.d.ts +51 -0
  97. package/dist/src/monitoring/alerting.js +169 -0
  98. package/dist/src/monitoring/health.d.ts +40 -0
  99. package/dist/src/monitoring/health.js +164 -0
  100. package/dist/src/monitoring/index.d.ts +10 -0
  101. package/dist/src/monitoring/index.js +12 -0
  102. package/dist/src/monitoring/info.d.ts +15 -0
  103. package/dist/src/monitoring/info.js +109 -0
  104. package/dist/src/monitoring/types.d.ts +93 -0
  105. package/dist/src/monitoring/types.js +7 -0
  106. package/dist/src/network/index.d.ts +5 -0
  107. package/{src/network/index.ts → dist/src/network/index.js} +1 -1
  108. package/dist/src/network/network-config.d.ts +31 -0
  109. package/dist/src/network/network-config.js +109 -0
  110. package/dist/src/packaging/compiler.d.ts +61 -0
  111. package/dist/src/packaging/compiler.js +562 -0
  112. package/dist/src/packaging/config-persistence.d.ts +46 -0
  113. package/dist/src/packaging/config-persistence.js +108 -0
  114. package/dist/src/packaging/config-schemas.d.ts +115 -0
  115. package/dist/src/packaging/config-schemas.js +43 -0
  116. package/dist/src/packaging/detector.d.ts +26 -0
  117. package/dist/src/packaging/detector.js +193 -0
  118. package/dist/src/packaging/index.d.ts +16 -0
  119. package/dist/src/packaging/index.js +22 -0
  120. package/dist/src/packaging/packager.d.ts +31 -0
  121. package/dist/src/packaging/packager.js +90 -0
  122. package/dist/src/packaging/parsers/clawdbot.d.ts +19 -0
  123. package/dist/src/packaging/parsers/clawdbot.js +231 -0
  124. package/dist/src/packaging/parsers/cline.d.ts +26 -0
  125. package/dist/src/packaging/parsers/cline.js +185 -0
  126. package/dist/src/packaging/parsers/generic.d.ts +27 -0
  127. package/dist/src/packaging/parsers/generic.js +228 -0
  128. package/dist/src/packaging/parsers/goose.d.ts +26 -0
  129. package/dist/src/packaging/parsers/goose.js +175 -0
  130. package/dist/src/packaging/parsers/index.d.ts +11 -0
  131. package/{src/packaging/parsers/index.ts → dist/src/packaging/parsers/index.js} +1 -1
  132. package/dist/src/packaging/serializer.d.ts +108 -0
  133. package/dist/src/packaging/serializer.js +153 -0
  134. package/dist/src/packaging/types.d.ts +131 -0
  135. package/dist/src/packaging/types.js +5 -0
  136. package/dist/src/packaging/wasmedge-compiler.d.ts +76 -0
  137. package/dist/src/packaging/wasmedge-compiler.js +349 -0
  138. package/dist/src/security/index.d.ts +11 -0
  139. package/{src/security/index.ts → dist/src/security/index.js} +1 -4
  140. package/dist/src/security/multisig.d.ts +102 -0
  141. package/dist/src/security/multisig.js +283 -0
  142. package/dist/src/security/types.d.ts +207 -0
  143. package/dist/src/security/types.js +217 -0
  144. package/dist/src/security/vetkeys.d.ts +179 -0
  145. package/dist/src/security/vetkeys.js +499 -0
  146. package/dist/src/testing/index.d.ts +6 -0
  147. package/{src/testing/index.ts → dist/src/testing/index.js} +1 -1
  148. package/dist/src/testing/local-runner.d.ts +23 -0
  149. package/dist/src/testing/local-runner.js +226 -0
  150. package/dist/src/testing/types.d.ts +98 -0
  151. package/dist/src/testing/types.js +5 -0
  152. package/dist/src/wallet/cbor-serializer.d.ts +82 -0
  153. package/dist/src/wallet/cbor-serializer.js +282 -0
  154. package/dist/src/wallet/chain-dispatcher.d.ts +112 -0
  155. package/dist/src/wallet/chain-dispatcher.js +241 -0
  156. package/dist/src/wallet/cross-chain-aggregator.d.ts +119 -0
  157. package/dist/src/wallet/cross-chain-aggregator.js +235 -0
  158. package/dist/src/wallet/index.d.ts +16 -0
  159. package/dist/src/wallet/index.js +22 -0
  160. package/dist/src/wallet/key-derivation.d.ts +117 -0
  161. package/dist/src/wallet/key-derivation.js +325 -0
  162. package/dist/src/wallet/providers/base-provider.d.ts +111 -0
  163. package/dist/src/wallet/providers/base-provider.js +58 -0
  164. package/dist/src/wallet/providers/cketh-provider.d.ts +104 -0
  165. package/dist/src/wallet/providers/cketh-provider.js +343 -0
  166. package/dist/src/wallet/providers/polkadot-provider.d.ts +115 -0
  167. package/dist/src/wallet/providers/polkadot-provider.js +407 -0
  168. package/dist/src/wallet/providers/solana-provider.d.ts +102 -0
  169. package/dist/src/wallet/providers/solana-provider.js +393 -0
  170. package/dist/src/wallet/transaction-queue.d.ts +133 -0
  171. package/dist/src/wallet/transaction-queue.js +195 -0
  172. package/dist/src/wallet/types.d.ts +167 -0
  173. package/dist/src/wallet/types.js +5 -0
  174. package/dist/src/wallet/vetkeys-adapter.d.ts +134 -0
  175. package/dist/src/wallet/vetkeys-adapter.js +313 -0
  176. package/dist/src/wallet/wallet-manager.d.ts +202 -0
  177. package/dist/src/wallet/wallet-manager.js +451 -0
  178. package/dist/src/wallet/wallet-storage.d.ts +131 -0
  179. package/dist/src/wallet/wallet-storage.js +274 -0
  180. package/macos-wallet-app/AgentVaultWallet/App/AgentVaultWalletApp.swift +54 -0
  181. package/macos-wallet-app/AgentVaultWallet/Models/AppState.swift +102 -0
  182. package/macos-wallet-app/AgentVaultWallet/Models/Chain.swift +121 -0
  183. package/macos-wallet-app/AgentVaultWallet/Models/Wallet.swift +98 -0
  184. package/macos-wallet-app/AgentVaultWallet/Resources/AgentVaultWallet.entitlements +27 -0
  185. package/macos-wallet-app/AgentVaultWallet/Resources/Info.plist +69 -0
  186. package/macos-wallet-app/AgentVaultWallet/Services/BackupService.swift +270 -0
  187. package/macos-wallet-app/AgentVaultWallet/Services/CLIBridge.swift +367 -0
  188. package/macos-wallet-app/AgentVaultWallet/Services/CryptoService.swift +157 -0
  189. package/macos-wallet-app/AgentVaultWallet/Services/FileService.swift +120 -0
  190. package/macos-wallet-app/AgentVaultWallet/Services/KeychainService.swift +219 -0
  191. package/macos-wallet-app/AgentVaultWallet/Utilities/Constants.swift +44 -0
  192. package/macos-wallet-app/AgentVaultWallet/Utilities/Extensions.swift +115 -0
  193. package/macos-wallet-app/AgentVaultWallet/ViewModels/BackupViewModel.swift +237 -0
  194. package/macos-wallet-app/AgentVaultWallet/ViewModels/CreateWalletViewModel.swift +137 -0
  195. package/macos-wallet-app/AgentVaultWallet/ViewModels/ImportWalletViewModel.swift +179 -0
  196. package/macos-wallet-app/AgentVaultWallet/ViewModels/WalletStore.swift +286 -0
  197. package/macos-wallet-app/AgentVaultWallet/Views/Backup/BackupView.swift +235 -0
  198. package/macos-wallet-app/AgentVaultWallet/Views/Backup/RestoreView.swift +316 -0
  199. package/macos-wallet-app/AgentVaultWallet/Views/Create/CreateWalletFlow.swift +438 -0
  200. package/macos-wallet-app/AgentVaultWallet/Views/Import/ImportWalletFlow.swift +399 -0
  201. package/macos-wallet-app/AgentVaultWallet/Views/MainView.swift +134 -0
  202. package/macos-wallet-app/AgentVaultWallet/Views/Settings/SettingsView.swift +276 -0
  203. package/macos-wallet-app/AgentVaultWallet/Views/Sidebar/SidebarView.swift +133 -0
  204. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/DashboardView.swift +233 -0
  205. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletDetailView.swift +281 -0
  206. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletListView.swift +280 -0
  207. package/macos-wallet-app/AgentVaultWallet/Views/Welcome/WelcomeView.swift +176 -0
  208. package/macos-wallet-app/Makefile +47 -0
  209. package/macos-wallet-app/project.yml +40 -0
  210. package/macos-wallet-app/setup.sh +73 -0
  211. package/package.json +10 -2
  212. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +0 -28
  213. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +0 -1
  214. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +0 -28
  215. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +0 -1
  216. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +0 -28
  217. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +0 -1
  218. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +0 -28
  219. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +0 -1
  220. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +0 -1
  221. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +0 -28
  222. package/backups/test-backup.json +0 -28
  223. package/scripts/dev-dashboard.mjs +0 -84
  224. package/site/README.md +0 -63
  225. package/site/docusaurus.config.ts +0 -148
  226. package/site/package-lock.json +0 -18383
  227. package/site/package.json +0 -47
  228. package/site/sidebars.ts +0 -86
  229. package/site/static/.gitkeep +0 -0
  230. package/site/static/img/logo.svg +0 -28
  231. package/site/static/img/og-image.svg +0 -35
  232. package/src/archival/archive-manager.ts +0 -372
  233. package/src/archival/arweave-client.ts +0 -289
  234. package/src/backup/backup.ts +0 -315
  235. package/src/cloud-storage/cloud-sync.ts +0 -461
  236. package/src/cloud-storage/provider-detector.ts +0 -198
  237. package/src/debugging/logs.ts +0 -193
  238. package/src/debugging/types.ts +0 -100
  239. package/src/deployment/deployer.ts +0 -274
  240. package/src/deployment/icpClient.ts +0 -620
  241. package/src/deployment/index.ts +0 -46
  242. package/src/deployment/promotion.ts +0 -161
  243. package/src/deployment/types.ts +0 -111
  244. package/src/icp/batch.ts +0 -374
  245. package/src/icp/environment.ts +0 -215
  246. package/src/icp/icpcli.ts +0 -438
  247. package/src/icp/icwasm.ts +0 -222
  248. package/src/icp/index.ts +0 -94
  249. package/src/icp/optimization.ts +0 -242
  250. package/src/icp/tool-detector.ts +0 -110
  251. package/src/icp/types.ts +0 -574
  252. package/src/index.ts +0 -25
  253. package/src/inference/bittensor-client.ts +0 -304
  254. package/src/inference/inference-manager.ts +0 -327
  255. package/src/metrics/metrics.ts +0 -186
  256. package/src/monitoring/alerting.ts +0 -190
  257. package/src/monitoring/health.ts +0 -197
  258. package/src/monitoring/index.ts +0 -38
  259. package/src/monitoring/info.ts +0 -114
  260. package/src/monitoring/types.ts +0 -99
  261. package/src/network/network-config.ts +0 -129
  262. package/src/packaging/compiler.ts +0 -647
  263. package/src/packaging/config-persistence.ts +0 -135
  264. package/src/packaging/config-schemas.ts +0 -156
  265. package/src/packaging/detector.ts +0 -220
  266. package/src/packaging/index.ts +0 -90
  267. package/src/packaging/packager.ts +0 -118
  268. package/src/packaging/parsers/clawdbot.ts +0 -278
  269. package/src/packaging/parsers/cline.ts +0 -223
  270. package/src/packaging/parsers/generic.ts +0 -266
  271. package/src/packaging/parsers/goose.ts +0 -214
  272. package/src/packaging/serializer.ts +0 -260
  273. package/src/packaging/types.ts +0 -144
  274. package/src/packaging/wasmedge-compiler.ts +0 -406
  275. package/src/security/multisig.ts +0 -415
  276. package/src/security/types.ts +0 -416
  277. package/src/security/vetkeys.ts +0 -655
  278. package/src/testing/local-runner.ts +0 -264
  279. package/src/testing/types.ts +0 -104
  280. package/src/wallet/cbor-serializer.ts +0 -323
  281. package/src/wallet/chain-dispatcher.ts +0 -313
  282. package/src/wallet/cross-chain-aggregator.ts +0 -346
  283. package/src/wallet/index.ts +0 -76
  284. package/src/wallet/key-derivation.ts +0 -425
  285. package/src/wallet/providers/base-provider.ts +0 -154
  286. package/src/wallet/providers/cketh-provider.ts +0 -434
  287. package/src/wallet/providers/polkadot-provider.ts +0 -503
  288. package/src/wallet/providers/solana-provider.ts +0 -490
  289. package/src/wallet/transaction-queue.ts +0 -284
  290. package/src/wallet/types.ts +0 -178
  291. package/src/wallet/vetkeys-adapter.ts +0 -431
  292. package/src/wallet/wallet-manager.ts +0 -597
  293. package/src/wallet/wallet-storage.ts +0 -380
@@ -1,434 +0,0 @@
1
- /**
2
- * ckETH Wallet Provider
3
- *
4
- * Provider for Ethereum-compatible wallets on ICP ckETH.
5
- * Supports balance queries, transactions, and signing.
6
- */
7
-
8
- import { ethers } from 'ethers';
9
- import type {
10
- Balance,
11
- Transaction,
12
- TransactionRequest,
13
- SignedTransaction,
14
- ProviderConfig,
15
- } from '../types.js';
16
- import { BaseWalletProvider } from './base-provider.js';
17
-
18
- /**
19
- * Environment variable names for RPC configuration
20
- */
21
- const ENV_RPC_URL = 'ETHEREUM_RPC_URL';
22
- const ENV_SEPOLIA_RPC_URL = 'SEPOLIA_RPC_URL';
23
- const ENV_INFURA_KEY = 'INFURA_API_KEY';
24
-
25
- /**
26
- * Public RPC endpoints (rate-limited, for fallback only)
27
- */
28
- const PUBLIC_RPC_URLS = {
29
- mainnet: [
30
- 'https://eth.llamarpc.com',
31
- 'https://rpc.ankr.com/eth',
32
- 'https://ethereum.publicnode.com',
33
- ],
34
- sepolia: [
35
- 'https://rpc.sepolia.org',
36
- 'https://ethereum-sepolia.publicnode.com',
37
- 'https://rpc2.sepolia.org',
38
- ],
39
- };
40
-
41
- /**
42
- * Environment variable names for Etherscan configuration
43
- */
44
- const ENV_ETHERSCAN_API_KEY = 'ETHERSCAN_API_KEY';
45
-
46
- /**
47
- * ckETH provider configuration
48
- */
49
- interface CkEthConfig extends ProviderConfig {
50
- /** Ethereum JSON-RPC endpoint */
51
- rpcUrl: string;
52
- /** Chain ID (1 = Mainnet, 5 = Goerli, 11155111 = Sepolia) */
53
- chainId?: number;
54
- /** Etherscan API key (optional, for transaction history) */
55
- etherscanApiKey?: string;
56
- }
57
-
58
- /**
59
- * ckETH wallet provider
60
- */
61
- export class CkEthProvider extends BaseWalletProvider {
62
- private provider: ethers.JsonRpcProvider | null = null;
63
- private chainId: number;
64
- private etherscanApiKey: string | undefined;
65
-
66
- constructor(config: CkEthConfig) {
67
- super(config);
68
- this.chainId = config.chainId ?? 1;
69
- this.etherscanApiKey = config.etherscanApiKey;
70
- }
71
-
72
- /**
73
- * Resolve the RPC URL to use for connections
74
- *
75
- * Priority:
76
- * 1. Explicitly configured URL
77
- * 2. Environment variable (ETHEREUM_RPC_URL or SEPOLIA_RPC_URL)
78
- * 3. Infura with API key from environment
79
- * 4. Public RPC endpoints (fallback, rate-limited)
80
- *
81
- * @returns RPC URL
82
- */
83
- private resolveRpcUrl(): string {
84
- const configUrl = super.getRpcUrl();
85
- if (configUrl && !configUrl.includes('YOUR-API-KEY')) {
86
- return configUrl;
87
- }
88
-
89
- const isTestnet = this.chainId !== 1;
90
- const envVar = isTestnet ? ENV_SEPOLIA_RPC_URL : ENV_RPC_URL;
91
- const envUrl = process.env[envVar];
92
-
93
- if (envUrl) {
94
- return envUrl;
95
- }
96
-
97
- const infuraKey = process.env[ENV_INFURA_KEY];
98
- if (infuraKey) {
99
- return isTestnet
100
- ? `https://sepolia.infura.io/v3/${infuraKey}`
101
- : `https://mainnet.infura.io/v3/${infuraKey}`;
102
- }
103
-
104
- const publicUrls = isTestnet ? PUBLIC_RPC_URLS.sepolia : PUBLIC_RPC_URLS.mainnet;
105
- const publicUrl = publicUrls[0];
106
-
107
- if (!publicUrl) {
108
- throw new Error(
109
- `No RPC URL configured. Set ${envVar} environment variable or provide rpcUrl in config. ` +
110
- `Example: export ${envVar}=https://eth.example.com/v3/your-api-key`
111
- );
112
- }
113
-
114
- console.warn(
115
- `Warning: Using public RPC endpoint (${publicUrl}). ` +
116
- `For production, set ${envVar} environment variable for better reliability.`
117
- );
118
-
119
- return publicUrl;
120
- }
121
-
122
- /**
123
- * Connect to Ethereum network via RPC
124
- */
125
- async connect(): Promise<void> {
126
- try {
127
- // Create provider
128
- this.provider = new ethers.JsonRpcProvider(this.resolveRpcUrl());
129
-
130
- // Verify connection
131
- const network = await this.provider.getNetwork();
132
- this.chainId = Number(network.chainId);
133
-
134
- this.connected = true;
135
- } catch (error) {
136
- const message = error instanceof Error ? error.message : 'Unknown error';
137
- throw new Error(`Failed to connect to ckETH network: ${message}`);
138
- }
139
- }
140
-
141
- /**
142
- * Disconnect from network
143
- */
144
- async disconnect(): Promise<void> {
145
- this.provider = null;
146
- this.connected = false;
147
- }
148
-
149
- /**
150
- * Get wallet balance
151
- */
152
- async getBalance(address: string): Promise<Balance> {
153
- if (!this.provider || !this.connected) {
154
- throw new Error('Provider not connected');
155
- }
156
-
157
- try {
158
- const balance = await this.provider.getBalance(address);
159
- const etherBalance = ethers.formatEther(balance);
160
-
161
- return {
162
- amount: etherBalance,
163
- denomination: 'ETH',
164
- chain: this.getChain(),
165
- address,
166
- blockNumber: await this.provider.getBlockNumber(),
167
- };
168
- } catch (error) {
169
- const message = error instanceof Error ? error.message : 'Unknown error';
170
- throw new Error(`Failed to get balance: ${message}`);
171
- }
172
- }
173
-
174
- /**
175
- * Send transaction
176
- */
177
- async sendTransaction(
178
- from: string,
179
- request: TransactionRequest
180
- ): Promise<Transaction> {
181
- if (!this.provider || !this.connected) {
182
- throw new Error('Provider not connected');
183
- }
184
-
185
- try {
186
- const tx = await this.populateTransaction(from, request);
187
- const signedTx = await this.signTransaction(tx, from);
188
-
189
- // Send transaction
190
- const txResponse = await this.provider.broadcastTransaction(signedTx.signedTx);
191
-
192
- return {
193
- hash: txResponse.hash,
194
- from,
195
- to: request.to,
196
- amount: request.amount,
197
- chain: this.getChain(),
198
- timestamp: Date.now(),
199
- status: 'pending',
200
- fee: tx.gasPrice ? ethers.formatEther(BigInt(tx.gasPrice) * BigInt(tx.gasLimit || 21000)) : undefined,
201
- };
202
- } catch (error) {
203
- const message = error instanceof Error ? error.message : 'Unknown error';
204
- throw new Error(`Failed to send transaction: ${message}`);
205
- }
206
- }
207
-
208
- /**
209
- * Sign transaction
210
- */
211
- async signTransaction(
212
- tx: any,
213
- privateKey: string
214
- ): Promise<SignedTransaction> {
215
- try {
216
- const wallet = new ethers.Wallet(privateKey);
217
- const signedTxSerialized = await wallet.signTransaction(tx);
218
-
219
- return {
220
- txHash: tx.hash || '0x0',
221
- signedTx: signedTxSerialized,
222
- signature: '0x',
223
- request: tx,
224
- };
225
- } catch (error) {
226
- const message = error instanceof Error ? error.message : 'Unknown error';
227
- throw new Error(`Failed to sign transaction: ${message}`);
228
- }
229
- }
230
-
231
- /**
232
- * Get transaction history
233
- *
234
- * Uses Etherscan API to fetch transaction history.
235
- * Requires ETHERSCAN_API_KEY environment variable or etherscanApiKey in config.
236
- *
237
- * @param address - Wallet address to get history for
238
- * @returns Array of transactions
239
- */
240
- async getTransactionHistory(address: string): Promise<Transaction[]> {
241
- const apiKey = this.etherscanApiKey || process.env[ENV_ETHERSCAN_API_KEY];
242
-
243
- if (!apiKey) {
244
- console.warn(
245
- 'Etherscan API key not configured. Set ETHERSCAN_API_KEY environment variable ' +
246
- 'or provide etherscanApiKey in config for transaction history.'
247
- );
248
- return [];
249
- }
250
-
251
- try {
252
- const isTestnet = this.chainId !== 1;
253
- const baseUrl = isTestnet
254
- ? 'https://api-sepolia.etherscan.io/api'
255
- : 'https://api.etherscan.io/api';
256
-
257
- const url = `${baseUrl}?module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&sort=desc&apikey=${apiKey}`;
258
-
259
- const response = await fetch(url);
260
- const data = await response.json() as { status: string; result: Array<{
261
- hash: string;
262
- from: string;
263
- to: string;
264
- value: string;
265
- timeStamp: string;
266
- gasUsed: string;
267
- gasPrice: string;
268
- isError: string;
269
- }> };
270
-
271
- if (data.status !== '1' || !Array.isArray(data.result)) {
272
- console.warn('Etherscan API returned no results or error');
273
- return [];
274
- }
275
-
276
- return data.result.slice(0, 50).map((tx) => ({
277
- hash: tx.hash,
278
- from: tx.from,
279
- to: tx.to,
280
- amount: ethers.formatEther(BigInt(tx.value)),
281
- chain: this.getChain(),
282
- timestamp: parseInt(tx.timeStamp, 10) * 1000,
283
- status: tx.isError === '1' ? 'failed' : 'confirmed',
284
- fee: ethers.formatEther(BigInt(tx.gasUsed) * BigInt(tx.gasPrice)),
285
- }));
286
- } catch (error) {
287
- const message = error instanceof Error ? error.message : 'Unknown error';
288
- console.warn(`Failed to get transaction history: ${message}`);
289
- return [];
290
- }
291
- }
292
-
293
- /**
294
- * Validate Ethereum address
295
- */
296
- validateAddress(address: string): boolean {
297
- try {
298
- return ethers.isAddress(address);
299
- } catch {
300
- return false;
301
- }
302
- }
303
-
304
- /**
305
- * Estimate transaction fee
306
- */
307
- async estimateFee(request: TransactionRequest): Promise<string> {
308
- if (!this.provider || !this.connected) {
309
- throw new Error('Provider not connected');
310
- }
311
-
312
- try {
313
- const feeData = await this.provider.getFeeData();
314
- const gasLimit = await this.provider.estimateGas({
315
- to: request.to,
316
- value: ethers.parseEther(request.amount),
317
- });
318
-
319
- const gasPrice = feeData.gasPrice || feeData.maxFeePerGas || BigInt(0);
320
- const fee = gasPrice * gasLimit;
321
- return ethers.formatEther(fee);
322
- } catch (error) {
323
- const message = error instanceof Error ? error.message : 'Unknown error';
324
- throw new Error(`Failed to estimate fee: ${message}`);
325
- }
326
- }
327
-
328
- /**
329
- * Get current block number
330
- */
331
- async getBlockNumber(): Promise<number> {
332
- if (!this.provider || !this.connected) {
333
- throw new Error('Provider not connected');
334
- }
335
-
336
- return await this.provider.getBlockNumber();
337
- }
338
-
339
- /**
340
- * Get transaction by hash
341
- */
342
- async getTransaction(txHash: string): Promise<Transaction | null> {
343
- if (!this.provider || !this.connected) {
344
- throw new Error('Provider not connected');
345
- }
346
-
347
- try {
348
- const tx = await this.provider.getTransaction(txHash);
349
- if (!tx) {
350
- return null;
351
- }
352
-
353
- const receipt = await this.provider.getTransactionReceipt(txHash);
354
-
355
- return {
356
- hash: tx.hash,
357
- from: tx.from,
358
- to: tx.to || '',
359
- amount: ethers.formatEther(tx.value),
360
- chain: this.getChain(),
361
- timestamp: (await this.provider.getBlock(tx.blockNumber || 0))?.timestamp || 0,
362
- status: receipt ? (receipt.status ? 'confirmed' : 'failed') : 'pending',
363
- fee: tx.gasPrice ? ethers.formatEther(BigInt(tx.gasPrice) * BigInt(tx.gasLimit || 21000)) : undefined,
364
- };
365
- } catch (error) {
366
- const message = error instanceof Error ? error.message : 'Unknown error';
367
- throw new Error(`Failed to get transaction: ${message}`);
368
- }
369
- }
370
-
371
- /**
372
- * Create transaction from request
373
- */
374
- private async populateTransaction(
375
- from: string,
376
- request: TransactionRequest
377
- ): Promise<any> {
378
- const tx = {
379
- to: request.to,
380
- value: ethers.parseEther(request.amount),
381
- from,
382
- gasLimit: request.gasLimit ? BigInt(parseInt(request.gasLimit)) : undefined,
383
- gasPrice: request.gasPrice ? BigInt(parseInt(request.gasPrice)) : undefined,
384
- };
385
-
386
- return tx;
387
- }
388
-
389
- /**
390
- * Get default RPC URL for chain
391
- *
392
- * @param isTestnet - Whether to get testnet URL
393
- * @returns RPC URL from environment or public endpoint
394
- * @throws Error if no RPC URL is configured
395
- */
396
- static getDefaultRpcUrl(isTestnet: boolean = false): string {
397
- const envVar = isTestnet ? ENV_SEPOLIA_RPC_URL : ENV_RPC_URL;
398
- const envUrl = process.env[envVar];
399
-
400
- if (envUrl) {
401
- return envUrl;
402
- }
403
-
404
- const infuraKey = process.env[ENV_INFURA_KEY];
405
- if (infuraKey) {
406
- return isTestnet
407
- ? `https://sepolia.infura.io/v3/${infuraKey}`
408
- : `https://mainnet.infura.io/v3/${infuraKey}`;
409
- }
410
-
411
- const publicUrls = isTestnet ? PUBLIC_RPC_URLS.sepolia : PUBLIC_RPC_URLS.mainnet;
412
- const publicUrl = publicUrls[0];
413
-
414
- if (publicUrl) {
415
- console.warn(
416
- `Warning: Using public RPC endpoint (${publicUrl}). ` +
417
- `For production, set ${envVar} environment variable.`
418
- );
419
- return publicUrl;
420
- }
421
-
422
- throw new Error(
423
- `No RPC URL configured. Set ${envVar} environment variable. ` +
424
- `Example: export ${envVar}=https://mainnet.infura.io/v3/your-api-key`
425
- );
426
- }
427
-
428
- /**
429
- * Get chain ID
430
- */
431
- getChainId(): number {
432
- return this.chainId;
433
- }
434
- }