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