agentvault 1.0.1 → 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 (292) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/dist/cli/commands/approve.js +5 -5
  3. package/dist/cli/commands/archive.js +5 -5
  4. package/dist/cli/commands/backup.js +5 -5
  5. package/dist/cli/commands/cloud-backup.js +12 -12
  6. package/dist/cli/commands/decrypt.js +2 -2
  7. package/dist/cli/commands/deploy.js +1 -1
  8. package/dist/cli/commands/exec.js +2 -2
  9. package/dist/cli/commands/fetch.js +4 -4
  10. package/dist/cli/commands/inference.js +5 -5
  11. package/dist/cli/commands/init.d.ts +1 -1
  12. package/dist/cli/commands/init.js +16 -16
  13. package/dist/cli/commands/list.js +4 -4
  14. package/dist/cli/commands/package.js +2 -2
  15. package/dist/cli/commands/profile.js +1 -1
  16. package/dist/cli/commands/rebuild.js +2 -2
  17. package/dist/cli/commands/show.js +1 -1
  18. package/dist/cli/commands/status.d.ts +1 -1
  19. package/dist/cli/commands/status.js +8 -8
  20. package/dist/cli/commands/trace.js +1 -1
  21. package/dist/cli/commands/wallet-export.js +1 -1
  22. package/dist/cli/commands/wallet-sign.js +1 -1
  23. package/dist/cli/commands/wallet.d.ts +1 -1
  24. package/dist/cli/commands/wallet.js +1 -1
  25. package/dist/cli/index.d.ts +2 -2
  26. package/dist/cli/index.js +3 -3
  27. package/dist/src/archival/archive-manager.d.ts +85 -0
  28. package/dist/src/archival/archive-manager.js +294 -0
  29. package/dist/src/archival/arweave-client.d.ts +88 -0
  30. package/dist/src/archival/arweave-client.js +223 -0
  31. package/dist/src/archival/index.d.ts +8 -0
  32. package/{src/archival/index.ts → dist/src/archival/index.js} +1 -1
  33. package/dist/src/backup/backup.d.ts +67 -0
  34. package/dist/src/backup/backup.js +231 -0
  35. package/dist/src/backup/index.d.ts +7 -0
  36. package/{src/backup/index.ts → dist/src/backup/index.js} +1 -1
  37. package/dist/src/cloud-storage/cloud-sync.d.ts +49 -0
  38. package/dist/src/cloud-storage/cloud-sync.js +372 -0
  39. package/dist/src/cloud-storage/index.d.ts +11 -0
  40. package/{src/cloud-storage/index.ts → dist/src/cloud-storage/index.js} +1 -1
  41. package/dist/src/cloud-storage/provider-detector.d.ts +34 -0
  42. package/dist/src/cloud-storage/provider-detector.js +158 -0
  43. package/{src/cloud-storage/types.ts → dist/src/cloud-storage/types.d.ts} +40 -53
  44. package/dist/src/cloud-storage/types.js +10 -0
  45. package/dist/src/debugging/index.d.ts +6 -0
  46. package/{src/debugging/index.ts → dist/src/debugging/index.js} +1 -1
  47. package/dist/src/debugging/logs.d.ts +32 -0
  48. package/dist/src/debugging/logs.js +158 -0
  49. package/dist/src/debugging/types.d.ts +91 -0
  50. package/dist/src/debugging/types.js +5 -0
  51. package/dist/src/deployment/deployer.d.ts +52 -0
  52. package/dist/src/deployment/deployer.js +211 -0
  53. package/dist/src/deployment/icpClient.d.ts +144 -0
  54. package/dist/src/deployment/icpClient.js +545 -0
  55. package/dist/src/deployment/index.d.ts +11 -0
  56. package/dist/src/deployment/index.js +14 -0
  57. package/dist/src/deployment/promotion.d.ts +32 -0
  58. package/dist/src/deployment/promotion.js +114 -0
  59. package/dist/src/deployment/types.d.ts +101 -0
  60. package/dist/src/deployment/types.js +5 -0
  61. package/dist/src/icp/batch.d.ts +112 -0
  62. package/dist/src/icp/batch.js +273 -0
  63. package/dist/src/icp/cycles.d.ts +29 -0
  64. package/{src/icp/cycles.ts → dist/src/icp/cycles.js} +8 -22
  65. package/dist/src/icp/environment.d.ts +60 -0
  66. package/dist/src/icp/environment.js +183 -0
  67. package/dist/src/icp/icpcli.d.ts +204 -0
  68. package/dist/src/icp/icpcli.js +374 -0
  69. package/dist/src/icp/icwasm.d.ts +94 -0
  70. package/dist/src/icp/icwasm.js +197 -0
  71. package/dist/src/icp/identity.d.ts +50 -0
  72. package/{src/icp/identity.ts → dist/src/icp/identity.js} +15 -28
  73. package/dist/src/icp/index.d.ts +16 -0
  74. package/dist/src/icp/index.js +20 -0
  75. package/dist/src/icp/optimization.d.ts +16 -0
  76. package/dist/src/icp/optimization.js +225 -0
  77. package/dist/src/icp/tokens.d.ts +24 -0
  78. package/{src/icp/tokens.ts → dist/src/icp/tokens.js} +5 -12
  79. package/dist/src/icp/tool-detector.d.ts +31 -0
  80. package/dist/src/icp/tool-detector.js +104 -0
  81. package/dist/src/icp/types.d.ts +493 -0
  82. package/dist/src/icp/types.js +7 -0
  83. package/dist/src/index.d.ts +12 -0
  84. package/dist/src/index.js +18 -0
  85. package/dist/src/inference/bittensor-client.d.ts +108 -0
  86. package/dist/src/inference/bittensor-client.js +224 -0
  87. package/dist/src/inference/index.d.ts +8 -0
  88. package/{src/inference/index.ts → dist/src/inference/index.js} +1 -1
  89. package/dist/src/inference/inference-manager.d.ts +76 -0
  90. package/dist/src/inference/inference-manager.js +228 -0
  91. package/dist/src/metrics/index.d.ts +7 -0
  92. package/{src/metrics/index.ts → dist/src/metrics/index.js} +1 -1
  93. package/dist/src/metrics/metrics.d.ts +39 -0
  94. package/dist/src/metrics/metrics.js +129 -0
  95. package/dist/src/monitoring/alerting.d.ts +51 -0
  96. package/dist/src/monitoring/alerting.js +169 -0
  97. package/dist/src/monitoring/health.d.ts +40 -0
  98. package/dist/src/monitoring/health.js +164 -0
  99. package/dist/src/monitoring/index.d.ts +10 -0
  100. package/dist/src/monitoring/index.js +12 -0
  101. package/dist/src/monitoring/info.d.ts +15 -0
  102. package/dist/src/monitoring/info.js +109 -0
  103. package/dist/src/monitoring/types.d.ts +93 -0
  104. package/dist/src/monitoring/types.js +7 -0
  105. package/dist/src/network/index.d.ts +5 -0
  106. package/{src/network/index.ts → dist/src/network/index.js} +1 -1
  107. package/dist/src/network/network-config.d.ts +31 -0
  108. package/dist/src/network/network-config.js +109 -0
  109. package/dist/src/packaging/compiler.d.ts +61 -0
  110. package/dist/src/packaging/compiler.js +562 -0
  111. package/dist/src/packaging/config-persistence.d.ts +46 -0
  112. package/dist/src/packaging/config-persistence.js +108 -0
  113. package/dist/src/packaging/config-schemas.d.ts +115 -0
  114. package/dist/src/packaging/config-schemas.js +43 -0
  115. package/dist/src/packaging/detector.d.ts +26 -0
  116. package/dist/src/packaging/detector.js +193 -0
  117. package/dist/src/packaging/index.d.ts +16 -0
  118. package/dist/src/packaging/index.js +22 -0
  119. package/dist/src/packaging/packager.d.ts +31 -0
  120. package/dist/src/packaging/packager.js +90 -0
  121. package/dist/src/packaging/parsers/clawdbot.d.ts +19 -0
  122. package/dist/src/packaging/parsers/clawdbot.js +231 -0
  123. package/dist/src/packaging/parsers/cline.d.ts +26 -0
  124. package/dist/src/packaging/parsers/cline.js +185 -0
  125. package/dist/src/packaging/parsers/generic.d.ts +27 -0
  126. package/dist/src/packaging/parsers/generic.js +228 -0
  127. package/dist/src/packaging/parsers/goose.d.ts +26 -0
  128. package/dist/src/packaging/parsers/goose.js +175 -0
  129. package/dist/src/packaging/parsers/index.d.ts +11 -0
  130. package/{src/packaging/parsers/index.ts → dist/src/packaging/parsers/index.js} +1 -1
  131. package/dist/src/packaging/serializer.d.ts +108 -0
  132. package/dist/src/packaging/serializer.js +153 -0
  133. package/dist/src/packaging/types.d.ts +131 -0
  134. package/dist/src/packaging/types.js +5 -0
  135. package/dist/src/packaging/wasmedge-compiler.d.ts +76 -0
  136. package/dist/src/packaging/wasmedge-compiler.js +349 -0
  137. package/dist/src/security/index.d.ts +11 -0
  138. package/{src/security/index.ts → dist/src/security/index.js} +1 -4
  139. package/dist/src/security/multisig.d.ts +102 -0
  140. package/dist/src/security/multisig.js +283 -0
  141. package/dist/src/security/types.d.ts +207 -0
  142. package/dist/src/security/types.js +217 -0
  143. package/dist/src/security/vetkeys.d.ts +179 -0
  144. package/dist/src/security/vetkeys.js +499 -0
  145. package/dist/src/testing/index.d.ts +6 -0
  146. package/{src/testing/index.ts → dist/src/testing/index.js} +1 -1
  147. package/dist/src/testing/local-runner.d.ts +23 -0
  148. package/dist/src/testing/local-runner.js +226 -0
  149. package/dist/src/testing/types.d.ts +98 -0
  150. package/dist/src/testing/types.js +5 -0
  151. package/dist/src/wallet/cbor-serializer.d.ts +82 -0
  152. package/dist/src/wallet/cbor-serializer.js +282 -0
  153. package/dist/src/wallet/chain-dispatcher.d.ts +112 -0
  154. package/dist/src/wallet/chain-dispatcher.js +241 -0
  155. package/dist/src/wallet/cross-chain-aggregator.d.ts +119 -0
  156. package/dist/src/wallet/cross-chain-aggregator.js +235 -0
  157. package/dist/src/wallet/index.d.ts +16 -0
  158. package/dist/src/wallet/index.js +22 -0
  159. package/dist/src/wallet/key-derivation.d.ts +117 -0
  160. package/dist/src/wallet/key-derivation.js +325 -0
  161. package/dist/src/wallet/providers/base-provider.d.ts +111 -0
  162. package/dist/src/wallet/providers/base-provider.js +58 -0
  163. package/dist/src/wallet/providers/cketh-provider.d.ts +104 -0
  164. package/dist/src/wallet/providers/cketh-provider.js +343 -0
  165. package/dist/src/wallet/providers/polkadot-provider.d.ts +115 -0
  166. package/dist/src/wallet/providers/polkadot-provider.js +407 -0
  167. package/dist/src/wallet/providers/solana-provider.d.ts +102 -0
  168. package/dist/src/wallet/providers/solana-provider.js +393 -0
  169. package/dist/src/wallet/transaction-queue.d.ts +133 -0
  170. package/dist/src/wallet/transaction-queue.js +195 -0
  171. package/dist/src/wallet/types.d.ts +167 -0
  172. package/dist/src/wallet/types.js +5 -0
  173. package/dist/src/wallet/vetkeys-adapter.d.ts +134 -0
  174. package/dist/src/wallet/vetkeys-adapter.js +313 -0
  175. package/dist/src/wallet/wallet-manager.d.ts +202 -0
  176. package/dist/src/wallet/wallet-manager.js +451 -0
  177. package/dist/src/wallet/wallet-storage.d.ts +131 -0
  178. package/dist/src/wallet/wallet-storage.js +274 -0
  179. package/macos-wallet-app/AgentVaultWallet/App/AgentVaultWalletApp.swift +54 -0
  180. package/macos-wallet-app/AgentVaultWallet/Models/AppState.swift +102 -0
  181. package/macos-wallet-app/AgentVaultWallet/Models/Chain.swift +121 -0
  182. package/macos-wallet-app/AgentVaultWallet/Models/Wallet.swift +98 -0
  183. package/macos-wallet-app/AgentVaultWallet/Resources/AgentVaultWallet.entitlements +27 -0
  184. package/macos-wallet-app/AgentVaultWallet/Resources/Info.plist +69 -0
  185. package/macos-wallet-app/AgentVaultWallet/Services/BackupService.swift +270 -0
  186. package/macos-wallet-app/AgentVaultWallet/Services/CLIBridge.swift +367 -0
  187. package/macos-wallet-app/AgentVaultWallet/Services/CryptoService.swift +157 -0
  188. package/macos-wallet-app/AgentVaultWallet/Services/FileService.swift +120 -0
  189. package/macos-wallet-app/AgentVaultWallet/Services/KeychainService.swift +219 -0
  190. package/macos-wallet-app/AgentVaultWallet/Utilities/Constants.swift +44 -0
  191. package/macos-wallet-app/AgentVaultWallet/Utilities/Extensions.swift +115 -0
  192. package/macos-wallet-app/AgentVaultWallet/ViewModels/BackupViewModel.swift +237 -0
  193. package/macos-wallet-app/AgentVaultWallet/ViewModels/CreateWalletViewModel.swift +137 -0
  194. package/macos-wallet-app/AgentVaultWallet/ViewModels/ImportWalletViewModel.swift +179 -0
  195. package/macos-wallet-app/AgentVaultWallet/ViewModels/WalletStore.swift +286 -0
  196. package/macos-wallet-app/AgentVaultWallet/Views/Backup/BackupView.swift +235 -0
  197. package/macos-wallet-app/AgentVaultWallet/Views/Backup/RestoreView.swift +316 -0
  198. package/macos-wallet-app/AgentVaultWallet/Views/Create/CreateWalletFlow.swift +438 -0
  199. package/macos-wallet-app/AgentVaultWallet/Views/Import/ImportWalletFlow.swift +399 -0
  200. package/macos-wallet-app/AgentVaultWallet/Views/MainView.swift +134 -0
  201. package/macos-wallet-app/AgentVaultWallet/Views/Settings/SettingsView.swift +276 -0
  202. package/macos-wallet-app/AgentVaultWallet/Views/Sidebar/SidebarView.swift +133 -0
  203. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/DashboardView.swift +233 -0
  204. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletDetailView.swift +281 -0
  205. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletListView.swift +280 -0
  206. package/macos-wallet-app/AgentVaultWallet/Views/Welcome/WelcomeView.swift +176 -0
  207. package/macos-wallet-app/Makefile +47 -0
  208. package/macos-wallet-app/project.yml +40 -0
  209. package/macos-wallet-app/setup.sh +73 -0
  210. package/package.json +10 -2
  211. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +0 -28
  212. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +0 -1
  213. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +0 -28
  214. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +0 -1
  215. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +0 -28
  216. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +0 -1
  217. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +0 -28
  218. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +0 -1
  219. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +0 -1
  220. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +0 -28
  221. package/backups/test-backup.json +0 -28
  222. package/scripts/dev-dashboard.mjs +0 -84
  223. package/site/README.md +0 -63
  224. package/site/docusaurus.config.ts +0 -148
  225. package/site/package-lock.json +0 -18383
  226. package/site/package.json +0 -47
  227. package/site/sidebars.ts +0 -86
  228. package/site/static/.gitkeep +0 -0
  229. package/site/static/img/logo.svg +0 -28
  230. package/site/static/img/og-image.svg +0 -35
  231. package/src/archival/archive-manager.ts +0 -372
  232. package/src/archival/arweave-client.ts +0 -289
  233. package/src/backup/backup.ts +0 -315
  234. package/src/cloud-storage/cloud-sync.ts +0 -461
  235. package/src/cloud-storage/provider-detector.ts +0 -198
  236. package/src/debugging/logs.ts +0 -193
  237. package/src/debugging/types.ts +0 -100
  238. package/src/deployment/deployer.ts +0 -274
  239. package/src/deployment/icpClient.ts +0 -620
  240. package/src/deployment/index.ts +0 -46
  241. package/src/deployment/promotion.ts +0 -161
  242. package/src/deployment/types.ts +0 -111
  243. package/src/icp/batch.ts +0 -374
  244. package/src/icp/environment.ts +0 -215
  245. package/src/icp/icpcli.ts +0 -438
  246. package/src/icp/icwasm.ts +0 -222
  247. package/src/icp/index.ts +0 -94
  248. package/src/icp/optimization.ts +0 -242
  249. package/src/icp/tool-detector.ts +0 -110
  250. package/src/icp/types.ts +0 -574
  251. package/src/index.ts +0 -25
  252. package/src/inference/bittensor-client.ts +0 -304
  253. package/src/inference/inference-manager.ts +0 -327
  254. package/src/metrics/metrics.ts +0 -186
  255. package/src/monitoring/alerting.ts +0 -190
  256. package/src/monitoring/health.ts +0 -197
  257. package/src/monitoring/index.ts +0 -38
  258. package/src/monitoring/info.ts +0 -114
  259. package/src/monitoring/types.ts +0 -99
  260. package/src/network/network-config.ts +0 -129
  261. package/src/packaging/compiler.ts +0 -647
  262. package/src/packaging/config-persistence.ts +0 -135
  263. package/src/packaging/config-schemas.ts +0 -156
  264. package/src/packaging/detector.ts +0 -220
  265. package/src/packaging/index.ts +0 -90
  266. package/src/packaging/packager.ts +0 -118
  267. package/src/packaging/parsers/clawdbot.ts +0 -278
  268. package/src/packaging/parsers/cline.ts +0 -223
  269. package/src/packaging/parsers/generic.ts +0 -266
  270. package/src/packaging/parsers/goose.ts +0 -214
  271. package/src/packaging/serializer.ts +0 -260
  272. package/src/packaging/types.ts +0 -144
  273. package/src/packaging/wasmedge-compiler.ts +0 -406
  274. package/src/security/multisig.ts +0 -415
  275. package/src/security/types.ts +0 -416
  276. package/src/security/vetkeys.ts +0 -655
  277. package/src/testing/local-runner.ts +0 -264
  278. package/src/testing/types.ts +0 -104
  279. package/src/wallet/cbor-serializer.ts +0 -323
  280. package/src/wallet/chain-dispatcher.ts +0 -313
  281. package/src/wallet/cross-chain-aggregator.ts +0 -346
  282. package/src/wallet/index.ts +0 -76
  283. package/src/wallet/key-derivation.ts +0 -425
  284. package/src/wallet/providers/base-provider.ts +0 -154
  285. package/src/wallet/providers/cketh-provider.ts +0 -434
  286. package/src/wallet/providers/polkadot-provider.ts +0 -503
  287. package/src/wallet/providers/solana-provider.ts +0 -490
  288. package/src/wallet/transaction-queue.ts +0 -284
  289. package/src/wallet/types.ts +0 -178
  290. package/src/wallet/vetkeys-adapter.ts +0 -431
  291. package/src/wallet/wallet-manager.ts +0 -597
  292. package/src/wallet/wallet-storage.ts +0 -380
@@ -1,490 +0,0 @@
1
- /**
2
- * Solana Wallet Provider (Full Implementation)
3
- *
4
- * Complete provider for Solana wallet operations.
5
- * Integrates with @solana/web3.js for key derivation.
6
- * Uses Connection for real RPC network interactions.
7
- */
8
-
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
- import {
18
- Connection,
19
- Keypair,
20
- PublicKey,
21
- SystemProgram,
22
- Transaction as SolanaTransaction,
23
- LAMPORTS_PER_SOL,
24
- type Commitment,
25
- } from '@solana/web3.js';
26
- import { Buffer } from 'buffer';
27
-
28
- /**
29
- * Solana provider configuration
30
- */
31
- interface SolanaConfig extends ProviderConfig {
32
- /** Solana JSON-RPC endpoint (HTTP or WebSocket) */
33
- rpcUrl: string;
34
- /** Network type (mainnet, devnet) */
35
- network?: 'mainnet' | 'devnet';
36
- /** Commitment level */
37
- commitment?: Commitment;
38
- }
39
-
40
- /**
41
- * Solana wallet provider
42
- */
43
- export class SolanaProvider extends BaseWalletProvider {
44
- private connection: Connection | null = null;
45
- private keypair: Keypair | null = null;
46
- private network: string;
47
- private commitment: Commitment;
48
-
49
- constructor(config: SolanaConfig) {
50
- super(config);
51
- this.network = config.network || 'mainnet';
52
- this.commitment = config.commitment || 'confirmed';
53
- }
54
-
55
- /**
56
- * Connect to Solana network via RPC
57
- */
58
- async connect(): Promise<void> {
59
- try {
60
- const rpcUrl = this.config.rpcUrl || this.getDefaultRpcUrl();
61
- this.connection = new Connection(rpcUrl, this.commitment);
62
-
63
- // Verify connection by getting latest slot
64
- const slot = await this.connection.getSlot();
65
-
66
- this.connected = true;
67
- console.log(`Connected to Solana ${this.network} at slot ${slot}`);
68
- } catch (error) {
69
- const message = error instanceof Error ? error.message : 'Unknown error';
70
- throw new Error(`Failed to connect to Solana network: ${message}`);
71
- }
72
- }
73
-
74
- /**
75
- * Disconnect from Solana network
76
- */
77
- async disconnect(): Promise<void> {
78
- this.connection = null;
79
- this.keypair = null;
80
- this.connected = false;
81
- }
82
-
83
- /**
84
- * Get wallet balance
85
- */
86
- async getBalance(address: string): Promise<Balance> {
87
- if (!this.connected || !this.connection) {
88
- throw new Error('Provider not connected');
89
- }
90
-
91
- try {
92
- const publicKey = new PublicKey(address);
93
- const balanceInLamports = await this.connection.getBalance(publicKey);
94
- const balanceInSol = balanceInLamports / LAMPORTS_PER_SOL;
95
-
96
- const slot = await this.connection.getSlot();
97
-
98
- return {
99
- amount: balanceInSol.toString(),
100
- denomination: 'SOL',
101
- chain: 'solana',
102
- address,
103
- blockNumber: slot,
104
- };
105
- } catch (error) {
106
- const message = error instanceof Error ? error.message : 'Unknown error';
107
- throw new Error(`Failed to get balance: ${message}`);
108
- }
109
- }
110
-
111
- /**
112
- * Send transaction
113
- */
114
- async sendTransaction(
115
- from: string,
116
- request: TransactionRequest
117
- ): Promise<Transaction> {
118
- if (!this.connected || !this.connection || !this.keypair) {
119
- throw new Error('Provider not connected or no wallet loaded');
120
- }
121
-
122
- try {
123
- const toPublicKey = new PublicKey(request.to);
124
- const fromPublicKey = new PublicKey(from);
125
- const amountInLamports = this.parseSolAmount(request.amount);
126
-
127
- // Get latest blockhash
128
- const { blockhash } = await this.connection.getLatestBlockhash();
129
-
130
- // Create SystemProgram transfer instruction
131
- const instruction = SystemProgram.transfer({
132
- fromPubkey: fromPublicKey,
133
- toPubkey: toPublicKey,
134
- lamports: amountInLamports,
135
- });
136
-
137
- // Create transaction
138
- const transaction = new SolanaTransaction().add(instruction);
139
- transaction.recentBlockhash = blockhash;
140
- transaction.feePayer = fromPublicKey;
141
-
142
- // Sign and send transaction
143
- const signature = await this.connection.sendTransaction(
144
- transaction,
145
- [this.keypair]
146
- );
147
-
148
- const fee = await this.estimateFee(request);
149
-
150
- return {
151
- hash: signature,
152
- from,
153
- to: request.to,
154
- amount: request.amount,
155
- chain: 'solana',
156
- timestamp: Date.now(),
157
- status: 'pending',
158
- fee,
159
- data: { memo: request.memo },
160
- };
161
- } catch (error) {
162
- const message = error instanceof Error ? error.message : 'Unknown error';
163
- throw new Error(`Failed to send transaction: ${message}`);
164
- }
165
- }
166
-
167
- /**
168
- * Sign transaction
169
- */
170
- async signTransaction(
171
- tx: any,
172
- privateKey: string
173
- ): Promise<SignedTransaction> {
174
- if (!this.connection) {
175
- throw new Error('Provider not connected');
176
- }
177
-
178
- try {
179
- const keypair = this.createKeypairFromPrivateKey(privateKey);
180
- const toPublicKey = new PublicKey(tx.to);
181
- const fromPublicKey = keypair.publicKey;
182
- const amountInLamports = this.parseSolAmount(tx.amount);
183
-
184
- // Get latest blockhash
185
- const { blockhash } = await this.connection.getLatestBlockhash();
186
-
187
- // Create transaction
188
- const instruction = SystemProgram.transfer({
189
- fromPubkey: fromPublicKey,
190
- toPubkey: toPublicKey,
191
- lamports: amountInLamports,
192
- });
193
-
194
- const transaction = new SolanaTransaction().add(instruction);
195
- transaction.recentBlockhash = blockhash;
196
- transaction.feePayer = fromPublicKey;
197
-
198
- // Sign transaction
199
- transaction.sign(keypair);
200
-
201
- return {
202
- txHash: transaction.signature?.toString() || '',
203
- signedTx: transaction.serialize().toString('base64'),
204
- signature: Buffer.from(transaction.signature!).toString('hex'),
205
- request: tx,
206
- };
207
- } catch (error) {
208
- const message = error instanceof Error ? error.message : 'Unknown error';
209
- throw new Error(`Failed to sign transaction: ${message}`);
210
- }
211
- }
212
-
213
- /**
214
- * Get transaction history
215
- */
216
- async getTransactionHistory(address: string): Promise<Transaction[]> {
217
- if (!this.connected || !this.connection) {
218
- throw new Error('Provider not connected');
219
- }
220
-
221
- try {
222
- const publicKey = new PublicKey(address);
223
- const transactions: Transaction[] = [];
224
-
225
- // Get recent signatures for this address (limit to 20)
226
- const signatures = await this.connection.getSignaturesForAddress(
227
- publicKey,
228
- { limit: 20 }
229
- );
230
-
231
- // Fetch detailed transaction info for each signature
232
- for (const sig of signatures) {
233
- try {
234
- const tx = await this.connection.getParsedTransaction(
235
- sig.signature,
236
- { maxSupportedTransactionVersion: 0 }
237
- );
238
-
239
- if (!tx || !tx.meta) continue;
240
-
241
- // Find transfer instruction
242
- const transfer = tx.transaction.message.instructions.find(
243
- (ix: any) => ix.programId.toBase58() === SystemProgram.programId.toBase58()
244
- );
245
-
246
- if (!transfer) continue;
247
-
248
- const parsedIx = (transfer as any).parsed;
249
- if (parsedIx?.type !== 'transfer') continue;
250
-
251
- const { from, to, lamports } = parsedIx.info;
252
-
253
- // Only include transactions involving this address
254
- if (from !== address && to !== address) continue;
255
-
256
- transactions.push({
257
- hash: sig.signature,
258
- from,
259
- to,
260
- amount: (lamports / LAMPORTS_PER_SOL).toFixed(9),
261
- chain: 'solana',
262
- timestamp: (sig.blockTime || Date.now() / 1000) * 1000,
263
- status: 'confirmed',
264
- fee: tx.meta.fee
265
- ? (tx.meta.fee / LAMPORTS_PER_SOL).toFixed(9)
266
- : '0',
267
- });
268
- } catch (error) {
269
- console.warn(`Failed to fetch transaction ${sig.signature}:`, error);
270
- continue;
271
- }
272
- }
273
-
274
- return transactions;
275
- } catch (error) {
276
- const message = error instanceof Error ? error.message : 'Unknown error';
277
- console.warn(`Failed to get transaction history: ${message}`);
278
- return [];
279
- }
280
- }
281
-
282
- /**
283
- * Validate Solana address (Base58 format)
284
- */
285
- validateAddress(address: string): boolean {
286
- try {
287
- new PublicKey(address);
288
- return true;
289
- } catch {
290
- return false;
291
- }
292
- }
293
-
294
- /**
295
- * Estimate transaction fee
296
- */
297
- async estimateFee(request: TransactionRequest): Promise<string> {
298
- if (!this.connected || !this.connection || !this.keypair) {
299
- return '0.000005'; // Default minimum
300
- }
301
-
302
- try {
303
- const toPublicKey = new PublicKey(request.to);
304
- const fromPublicKey = this.keypair.publicKey;
305
- const amountInLamports = this.parseSolAmount(request.amount);
306
-
307
- // Get latest blockhash
308
- const { blockhash } = await this.connection.getLatestBlockhash();
309
-
310
- // Create transaction
311
- const instruction = SystemProgram.transfer({
312
- fromPubkey: fromPublicKey,
313
- toPubkey: toPublicKey,
314
- lamports: amountInLamports,
315
- });
316
-
317
- const transaction = new SolanaTransaction().add(instruction);
318
- transaction.recentBlockhash = blockhash;
319
- transaction.feePayer = fromPublicKey;
320
-
321
- // Estimate fee
322
- const fee = await transaction.getEstimatedFee(this.connection);
323
- if (!fee) return '0.000005';
324
- const feeInSol = fee / LAMPORTS_PER_SOL;
325
-
326
- return feeInSol.toFixed(9);
327
- } catch (_error) {
328
- return '0.000005';
329
- }
330
- }
331
-
332
- /**
333
- * Get current block number (slot)
334
- */
335
- async getBlockNumber(): Promise<number> {
336
- if (!this.connected || !this.connection) {
337
- throw new Error('Provider not connected');
338
- }
339
-
340
- try {
341
- return await this.connection.getSlot();
342
- } catch (error) {
343
- const message = error instanceof Error ? error.message : 'Unknown error';
344
- throw new Error(`Failed to get block number: ${message}`);
345
- }
346
- }
347
-
348
- /**
349
- * Get transaction by hash
350
- */
351
- async getTransaction(txHash: string): Promise<Transaction | null> {
352
- if (!this.connected || !this.connection) {
353
- throw new Error('Provider not connected');
354
- }
355
-
356
- try {
357
- const tx = await this.connection.getParsedTransaction(
358
- txHash,
359
- { maxSupportedTransactionVersion: 0 }
360
- );
361
-
362
- if (!tx || !tx.meta) return null;
363
-
364
- // Find transfer instruction
365
- const transfer = tx.transaction.message.instructions.find(
366
- (ix: any) => ix.programId.toBase58() === SystemProgram.programId.toBase58()
367
- );
368
-
369
- if (!transfer) return null;
370
-
371
- const parsedIx = (transfer as any).parsed;
372
- if (parsedIx?.type !== 'transfer') return null;
373
-
374
- const { from, to, lamports } = parsedIx.info;
375
-
376
- return {
377
- hash: txHash,
378
- from,
379
- to,
380
- amount: (lamports / LAMPORTS_PER_SOL).toFixed(9),
381
- chain: 'solana',
382
- timestamp: (tx.blockTime || Date.now() / 1000) * 1000,
383
- status: 'confirmed',
384
- fee: tx.meta.fee
385
- ? (tx.meta.fee / LAMPORTS_PER_SOL).toFixed(9)
386
- : '0',
387
- };
388
- } catch (error) {
389
- const message = error instanceof Error ? error.message : 'Unknown error';
390
- throw new Error(`Failed to get transaction: ${message}`);
391
- }
392
- }
393
-
394
- /**
395
- * Initialize keypair from wallet data
396
- */
397
- async initKeypair(mnemonic: string, derivationPath?: string): Promise<void> {
398
- try {
399
- const { generateSeedFromMnemonic, deriveSolanaKey } = await import('../key-derivation.js');
400
- const seed = generateSeedFromMnemonic(mnemonic);
401
- const path = derivationPath || "m/44'/501'/0'/0'/0'";
402
- const derived = deriveSolanaKey(seed, path);
403
-
404
- const privateKeyBytes = Uint8Array.from(
405
- Buffer.from(derived.privateKey, 'hex')
406
- );
407
- this.keypair = Keypair.fromSecretKey(privateKeyBytes);
408
-
409
- console.log('Solana keypair initialized for derivation:', path);
410
- console.log('Address:', this.getAddress());
411
- } catch (error) {
412
- const message = error instanceof Error ? error.message : 'Unknown error';
413
- throw new Error(`Failed to initialize Solana keypair: ${message}`);
414
- }
415
- }
416
-
417
- /**
418
- * Initialize from private key
419
- */
420
- async initFromPrivateKey(privateKey: string): Promise<void> {
421
- try {
422
- this.keypair = this.createKeypairFromPrivateKey(privateKey);
423
-
424
- console.log('Solana keypair initialized from private key');
425
- console.log('Address:', this.getAddress());
426
- } catch (error) {
427
- const message = error instanceof Error ? error.message : 'Unknown error';
428
- throw new Error(`Failed to initialize Solana keypair from private key: ${message}`);
429
- }
430
- }
431
-
432
- /**
433
- * Create Keypair from private key
434
- */
435
- private createKeypairFromPrivateKey(privateKeyHex: string): Keypair {
436
- const privateKeyBytes = Buffer.from(privateKeyHex, 'hex');
437
- return Keypair.fromSecretKey(privateKeyBytes.subarray(0, 32));
438
- }
439
-
440
- /**
441
- * Get address from keypair
442
- */
443
- getAddress(): string | null {
444
- if (!this.keypair) {
445
- return null;
446
- }
447
- return this.keypair.publicKey.toBase58();
448
- }
449
-
450
- /**
451
- * Get public key
452
- */
453
- getPublicKey(): string | null {
454
- if (!this.keypair) {
455
- return null;
456
- }
457
- return Buffer.from(this.keypair.publicKey.toBytes()).toString('hex');
458
- }
459
-
460
- /**
461
- * Parse SOL amount to lamports
462
- */
463
- private parseSolAmount(amountStr: string): number {
464
- try {
465
- const cleanAmount = amountStr.replace(/,/g, '').trim();
466
- const amount = parseFloat(cleanAmount);
467
- return Math.floor(amount * LAMPORTS_PER_SOL);
468
- } catch {
469
- return 0;
470
- }
471
- }
472
-
473
- /**
474
- * Get default RPC URL for network type
475
- * Checks environment variables first, then falls back to public RPC endpoints
476
- */
477
- private getDefaultRpcUrl(): string {
478
- const envUrls: Record<string, string | undefined> = {
479
- mainnet: process.env.SOLANA_MAINNET_RPC_URL || process.env.SOLANA_RPC_URL,
480
- devnet: process.env.SOLANA_DEVNET_RPC_URL || process.env.SOLANA_RPC_URL,
481
- };
482
-
483
- const publicUrls: Record<string, string> = {
484
- mainnet: 'https://api.mainnet-beta.solana.com',
485
- devnet: 'https://api.devnet.solana.com',
486
- };
487
-
488
- return envUrls[this.network] || publicUrls[this.network] || publicUrls.mainnet!;
489
- }
490
- }