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,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ckETH Wallet Provider
|
|
3
|
+
*
|
|
4
|
+
* Provider for Ethereum-compatible wallets on ICP ckETH.
|
|
5
|
+
* Supports balance queries, transactions, and signing.
|
|
6
|
+
*/
|
|
7
|
+
import { ethers } from 'ethers';
|
|
8
|
+
import { BaseWalletProvider } from './base-provider.js';
|
|
9
|
+
/**
|
|
10
|
+
* Environment variable names for RPC configuration
|
|
11
|
+
*/
|
|
12
|
+
const ENV_RPC_URL = 'ETHEREUM_RPC_URL';
|
|
13
|
+
const ENV_SEPOLIA_RPC_URL = 'SEPOLIA_RPC_URL';
|
|
14
|
+
const ENV_INFURA_KEY = 'INFURA_API_KEY';
|
|
15
|
+
/**
|
|
16
|
+
* Public RPC endpoints (rate-limited, for fallback only)
|
|
17
|
+
*/
|
|
18
|
+
const PUBLIC_RPC_URLS = {
|
|
19
|
+
mainnet: [
|
|
20
|
+
'https://eth.llamarpc.com',
|
|
21
|
+
'https://rpc.ankr.com/eth',
|
|
22
|
+
'https://ethereum.publicnode.com',
|
|
23
|
+
],
|
|
24
|
+
sepolia: [
|
|
25
|
+
'https://rpc.sepolia.org',
|
|
26
|
+
'https://ethereum-sepolia.publicnode.com',
|
|
27
|
+
'https://rpc2.sepolia.org',
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Environment variable names for Etherscan configuration
|
|
32
|
+
*/
|
|
33
|
+
const ENV_ETHERSCAN_API_KEY = 'ETHERSCAN_API_KEY';
|
|
34
|
+
/**
|
|
35
|
+
* ckETH wallet provider
|
|
36
|
+
*/
|
|
37
|
+
export class CkEthProvider extends BaseWalletProvider {
|
|
38
|
+
provider = null;
|
|
39
|
+
chainId;
|
|
40
|
+
etherscanApiKey;
|
|
41
|
+
constructor(config) {
|
|
42
|
+
super(config);
|
|
43
|
+
this.chainId = config.chainId ?? 1;
|
|
44
|
+
this.etherscanApiKey = config.etherscanApiKey;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the RPC URL to use for connections
|
|
48
|
+
*
|
|
49
|
+
* Priority:
|
|
50
|
+
* 1. Explicitly configured URL
|
|
51
|
+
* 2. Environment variable (ETHEREUM_RPC_URL or SEPOLIA_RPC_URL)
|
|
52
|
+
* 3. Infura with API key from environment
|
|
53
|
+
* 4. Public RPC endpoints (fallback, rate-limited)
|
|
54
|
+
*
|
|
55
|
+
* @returns RPC URL
|
|
56
|
+
*/
|
|
57
|
+
resolveRpcUrl() {
|
|
58
|
+
const configUrl = super.getRpcUrl();
|
|
59
|
+
if (configUrl && !configUrl.includes('YOUR-API-KEY')) {
|
|
60
|
+
return configUrl;
|
|
61
|
+
}
|
|
62
|
+
const isTestnet = this.chainId !== 1;
|
|
63
|
+
const envVar = isTestnet ? ENV_SEPOLIA_RPC_URL : ENV_RPC_URL;
|
|
64
|
+
const envUrl = process.env[envVar];
|
|
65
|
+
if (envUrl) {
|
|
66
|
+
return envUrl;
|
|
67
|
+
}
|
|
68
|
+
const infuraKey = process.env[ENV_INFURA_KEY];
|
|
69
|
+
if (infuraKey) {
|
|
70
|
+
return isTestnet
|
|
71
|
+
? `https://sepolia.infura.io/v3/${infuraKey}`
|
|
72
|
+
: `https://mainnet.infura.io/v3/${infuraKey}`;
|
|
73
|
+
}
|
|
74
|
+
const publicUrls = isTestnet ? PUBLIC_RPC_URLS.sepolia : PUBLIC_RPC_URLS.mainnet;
|
|
75
|
+
const publicUrl = publicUrls[0];
|
|
76
|
+
if (!publicUrl) {
|
|
77
|
+
throw new Error(`No RPC URL configured. Set ${envVar} environment variable or provide rpcUrl in config. ` +
|
|
78
|
+
`Example: export ${envVar}=https://eth.example.com/v3/your-api-key`);
|
|
79
|
+
}
|
|
80
|
+
console.warn(`Warning: Using public RPC endpoint (${publicUrl}). ` +
|
|
81
|
+
`For production, set ${envVar} environment variable for better reliability.`);
|
|
82
|
+
return publicUrl;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Connect to Ethereum network via RPC
|
|
86
|
+
*/
|
|
87
|
+
async connect() {
|
|
88
|
+
try {
|
|
89
|
+
// Create provider
|
|
90
|
+
this.provider = new ethers.JsonRpcProvider(this.resolveRpcUrl());
|
|
91
|
+
// Verify connection
|
|
92
|
+
const network = await this.provider.getNetwork();
|
|
93
|
+
this.chainId = Number(network.chainId);
|
|
94
|
+
this.connected = true;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
98
|
+
throw new Error(`Failed to connect to ckETH network: ${message}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Disconnect from network
|
|
103
|
+
*/
|
|
104
|
+
async disconnect() {
|
|
105
|
+
this.provider = null;
|
|
106
|
+
this.connected = false;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get wallet balance
|
|
110
|
+
*/
|
|
111
|
+
async getBalance(address) {
|
|
112
|
+
if (!this.provider || !this.connected) {
|
|
113
|
+
throw new Error('Provider not connected');
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const balance = await this.provider.getBalance(address);
|
|
117
|
+
const etherBalance = ethers.formatEther(balance);
|
|
118
|
+
return {
|
|
119
|
+
amount: etherBalance,
|
|
120
|
+
denomination: 'ETH',
|
|
121
|
+
chain: this.getChain(),
|
|
122
|
+
address,
|
|
123
|
+
blockNumber: await this.provider.getBlockNumber(),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
128
|
+
throw new Error(`Failed to get balance: ${message}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Send transaction
|
|
133
|
+
*/
|
|
134
|
+
async sendTransaction(from, request) {
|
|
135
|
+
if (!this.provider || !this.connected) {
|
|
136
|
+
throw new Error('Provider not connected');
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const tx = await this.populateTransaction(from, request);
|
|
140
|
+
const signedTx = await this.signTransaction(tx, from);
|
|
141
|
+
// Send transaction
|
|
142
|
+
const txResponse = await this.provider.broadcastTransaction(signedTx.signedTx);
|
|
143
|
+
return {
|
|
144
|
+
hash: txResponse.hash,
|
|
145
|
+
from,
|
|
146
|
+
to: request.to,
|
|
147
|
+
amount: request.amount,
|
|
148
|
+
chain: this.getChain(),
|
|
149
|
+
timestamp: Date.now(),
|
|
150
|
+
status: 'pending',
|
|
151
|
+
fee: tx.gasPrice ? ethers.formatEther(BigInt(tx.gasPrice) * BigInt(tx.gasLimit || 21000)) : undefined,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
156
|
+
throw new Error(`Failed to send transaction: ${message}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Sign transaction
|
|
161
|
+
*/
|
|
162
|
+
async signTransaction(tx, privateKey) {
|
|
163
|
+
try {
|
|
164
|
+
const wallet = new ethers.Wallet(privateKey);
|
|
165
|
+
const signedTxSerialized = await wallet.signTransaction(tx);
|
|
166
|
+
return {
|
|
167
|
+
txHash: tx.hash || '0x0',
|
|
168
|
+
signedTx: signedTxSerialized,
|
|
169
|
+
signature: '0x',
|
|
170
|
+
request: tx,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
175
|
+
throw new Error(`Failed to sign transaction: ${message}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get transaction history
|
|
180
|
+
*
|
|
181
|
+
* Uses Etherscan API to fetch transaction history.
|
|
182
|
+
* Requires ETHERSCAN_API_KEY environment variable or etherscanApiKey in config.
|
|
183
|
+
*
|
|
184
|
+
* @param address - Wallet address to get history for
|
|
185
|
+
* @returns Array of transactions
|
|
186
|
+
*/
|
|
187
|
+
async getTransactionHistory(address) {
|
|
188
|
+
const apiKey = this.etherscanApiKey || process.env[ENV_ETHERSCAN_API_KEY];
|
|
189
|
+
if (!apiKey) {
|
|
190
|
+
console.warn('Etherscan API key not configured. Set ETHERSCAN_API_KEY environment variable ' +
|
|
191
|
+
'or provide etherscanApiKey in config for transaction history.');
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
const isTestnet = this.chainId !== 1;
|
|
196
|
+
const baseUrl = isTestnet
|
|
197
|
+
? 'https://api-sepolia.etherscan.io/api'
|
|
198
|
+
: 'https://api.etherscan.io/api';
|
|
199
|
+
const url = `${baseUrl}?module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&sort=desc&apikey=${apiKey}`;
|
|
200
|
+
const response = await fetch(url);
|
|
201
|
+
const data = await response.json();
|
|
202
|
+
if (data.status !== '1' || !Array.isArray(data.result)) {
|
|
203
|
+
console.warn('Etherscan API returned no results or error');
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
return data.result.slice(0, 50).map((tx) => ({
|
|
207
|
+
hash: tx.hash,
|
|
208
|
+
from: tx.from,
|
|
209
|
+
to: tx.to,
|
|
210
|
+
amount: ethers.formatEther(BigInt(tx.value)),
|
|
211
|
+
chain: this.getChain(),
|
|
212
|
+
timestamp: parseInt(tx.timeStamp, 10) * 1000,
|
|
213
|
+
status: tx.isError === '1' ? 'failed' : 'confirmed',
|
|
214
|
+
fee: ethers.formatEther(BigInt(tx.gasUsed) * BigInt(tx.gasPrice)),
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
219
|
+
console.warn(`Failed to get transaction history: ${message}`);
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Validate Ethereum address
|
|
225
|
+
*/
|
|
226
|
+
validateAddress(address) {
|
|
227
|
+
try {
|
|
228
|
+
return ethers.isAddress(address);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Estimate transaction fee
|
|
236
|
+
*/
|
|
237
|
+
async estimateFee(request) {
|
|
238
|
+
if (!this.provider || !this.connected) {
|
|
239
|
+
throw new Error('Provider not connected');
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
const feeData = await this.provider.getFeeData();
|
|
243
|
+
const gasLimit = await this.provider.estimateGas({
|
|
244
|
+
to: request.to,
|
|
245
|
+
value: ethers.parseEther(request.amount),
|
|
246
|
+
});
|
|
247
|
+
const gasPrice = feeData.gasPrice || feeData.maxFeePerGas || BigInt(0);
|
|
248
|
+
const fee = gasPrice * gasLimit;
|
|
249
|
+
return ethers.formatEther(fee);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
253
|
+
throw new Error(`Failed to estimate fee: ${message}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get current block number
|
|
258
|
+
*/
|
|
259
|
+
async getBlockNumber() {
|
|
260
|
+
if (!this.provider || !this.connected) {
|
|
261
|
+
throw new Error('Provider not connected');
|
|
262
|
+
}
|
|
263
|
+
return await this.provider.getBlockNumber();
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get transaction by hash
|
|
267
|
+
*/
|
|
268
|
+
async getTransaction(txHash) {
|
|
269
|
+
if (!this.provider || !this.connected) {
|
|
270
|
+
throw new Error('Provider not connected');
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
const tx = await this.provider.getTransaction(txHash);
|
|
274
|
+
if (!tx) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
const receipt = await this.provider.getTransactionReceipt(txHash);
|
|
278
|
+
return {
|
|
279
|
+
hash: tx.hash,
|
|
280
|
+
from: tx.from,
|
|
281
|
+
to: tx.to || '',
|
|
282
|
+
amount: ethers.formatEther(tx.value),
|
|
283
|
+
chain: this.getChain(),
|
|
284
|
+
timestamp: (await this.provider.getBlock(tx.blockNumber || 0))?.timestamp || 0,
|
|
285
|
+
status: receipt ? (receipt.status ? 'confirmed' : 'failed') : 'pending',
|
|
286
|
+
fee: tx.gasPrice ? ethers.formatEther(BigInt(tx.gasPrice) * BigInt(tx.gasLimit || 21000)) : undefined,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
291
|
+
throw new Error(`Failed to get transaction: ${message}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Create transaction from request
|
|
296
|
+
*/
|
|
297
|
+
async populateTransaction(from, request) {
|
|
298
|
+
const tx = {
|
|
299
|
+
to: request.to,
|
|
300
|
+
value: ethers.parseEther(request.amount),
|
|
301
|
+
from,
|
|
302
|
+
gasLimit: request.gasLimit ? BigInt(parseInt(request.gasLimit)) : undefined,
|
|
303
|
+
gasPrice: request.gasPrice ? BigInt(parseInt(request.gasPrice)) : undefined,
|
|
304
|
+
};
|
|
305
|
+
return tx;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get default RPC URL for chain
|
|
309
|
+
*
|
|
310
|
+
* @param isTestnet - Whether to get testnet URL
|
|
311
|
+
* @returns RPC URL from environment or public endpoint
|
|
312
|
+
* @throws Error if no RPC URL is configured
|
|
313
|
+
*/
|
|
314
|
+
static getDefaultRpcUrl(isTestnet = false) {
|
|
315
|
+
const envVar = isTestnet ? ENV_SEPOLIA_RPC_URL : ENV_RPC_URL;
|
|
316
|
+
const envUrl = process.env[envVar];
|
|
317
|
+
if (envUrl) {
|
|
318
|
+
return envUrl;
|
|
319
|
+
}
|
|
320
|
+
const infuraKey = process.env[ENV_INFURA_KEY];
|
|
321
|
+
if (infuraKey) {
|
|
322
|
+
return isTestnet
|
|
323
|
+
? `https://sepolia.infura.io/v3/${infuraKey}`
|
|
324
|
+
: `https://mainnet.infura.io/v3/${infuraKey}`;
|
|
325
|
+
}
|
|
326
|
+
const publicUrls = isTestnet ? PUBLIC_RPC_URLS.sepolia : PUBLIC_RPC_URLS.mainnet;
|
|
327
|
+
const publicUrl = publicUrls[0];
|
|
328
|
+
if (publicUrl) {
|
|
329
|
+
console.warn(`Warning: Using public RPC endpoint (${publicUrl}). ` +
|
|
330
|
+
`For production, set ${envVar} environment variable.`);
|
|
331
|
+
return publicUrl;
|
|
332
|
+
}
|
|
333
|
+
throw new Error(`No RPC URL configured. Set ${envVar} environment variable. ` +
|
|
334
|
+
`Example: export ${envVar}=https://mainnet.infura.io/v3/your-api-key`);
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get chain ID
|
|
338
|
+
*/
|
|
339
|
+
getChainId() {
|
|
340
|
+
return this.chainId;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=cketh-provider.js.map
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polkadot Wallet Provider (Full Implementation)
|
|
3
|
+
*
|
|
4
|
+
* Complete provider for Polkadot wallet operations.
|
|
5
|
+
* Integrates with @polkadot/util-crypto for key derivation.
|
|
6
|
+
* Uses @polkadot/api for real RPC network interactions.
|
|
7
|
+
*/
|
|
8
|
+
import type { Balance, Transaction, TransactionRequest, SignedTransaction, ProviderConfig } from '../types.js';
|
|
9
|
+
import { BaseWalletProvider } from './base-provider.js';
|
|
10
|
+
/**
|
|
11
|
+
* Polkadot provider configuration
|
|
12
|
+
*/
|
|
13
|
+
interface PolkadotConfig extends ProviderConfig {
|
|
14
|
+
/** Polkadot JSON-RPC endpoint (WS or HTTP) */
|
|
15
|
+
rpcUrl: string;
|
|
16
|
+
/** Chain type (mainnet, testnet, dev) */
|
|
17
|
+
network?: 'mainnet' | 'testnet' | 'dev';
|
|
18
|
+
/** Chain type (polkadot, kusama, westend, astar) */
|
|
19
|
+
chainType?: 'polkadot' | 'kusama' | 'westend' | 'astar';
|
|
20
|
+
/** SS58 prefix for address encoding */
|
|
21
|
+
ss58Format?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Polkadot wallet provider
|
|
25
|
+
*/
|
|
26
|
+
export declare class PolkadotProvider extends BaseWalletProvider {
|
|
27
|
+
private keyringPair;
|
|
28
|
+
private api;
|
|
29
|
+
private ss58Format;
|
|
30
|
+
private chainType;
|
|
31
|
+
constructor(config: PolkadotConfig);
|
|
32
|
+
private getApi;
|
|
33
|
+
private getSystemQuery;
|
|
34
|
+
private getBalancesTx;
|
|
35
|
+
private getRpcChain;
|
|
36
|
+
/**
|
|
37
|
+
* Connect to Polkadot network via RPC
|
|
38
|
+
*/
|
|
39
|
+
connect(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect from Polkadot network
|
|
42
|
+
*/
|
|
43
|
+
disconnect(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Get wallet balance
|
|
46
|
+
*/
|
|
47
|
+
getBalance(address: string): Promise<Balance>;
|
|
48
|
+
/**
|
|
49
|
+
* Send transaction
|
|
50
|
+
*/
|
|
51
|
+
sendTransaction(from: string, request: TransactionRequest): Promise<Transaction>;
|
|
52
|
+
/**
|
|
53
|
+
* Sign transaction
|
|
54
|
+
*/
|
|
55
|
+
signTransaction(tx: any, privateKey: string): Promise<SignedTransaction>;
|
|
56
|
+
/**
|
|
57
|
+
* Get transaction history
|
|
58
|
+
*/
|
|
59
|
+
getTransactionHistory(address: string): Promise<Transaction[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Validate Polkadot address (SS58 format)
|
|
62
|
+
*/
|
|
63
|
+
validateAddress(address: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Estimate transaction fee
|
|
66
|
+
*/
|
|
67
|
+
estimateFee(request: TransactionRequest): Promise<string>;
|
|
68
|
+
/**
|
|
69
|
+
* Get current block number
|
|
70
|
+
*/
|
|
71
|
+
getBlockNumber(): Promise<number>;
|
|
72
|
+
/**
|
|
73
|
+
* Get transaction by hash
|
|
74
|
+
*/
|
|
75
|
+
getTransaction(txHash: string): Promise<Transaction | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Initialize keypair from wallet data
|
|
78
|
+
*/
|
|
79
|
+
initKeypair(mnemonic: string, derivationPath?: string): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Initialize from private key
|
|
82
|
+
*/
|
|
83
|
+
initFromPrivateKey(privateKey: string): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Create KeyringPair from private key
|
|
86
|
+
*/
|
|
87
|
+
private createKeyringPair;
|
|
88
|
+
/**
|
|
89
|
+
* Get address from keypair
|
|
90
|
+
*/
|
|
91
|
+
getAddress(): string | null;
|
|
92
|
+
/**
|
|
93
|
+
* Get public key
|
|
94
|
+
*/
|
|
95
|
+
getPublicKey(): string | null;
|
|
96
|
+
/**
|
|
97
|
+
* Parse DOT amount (convert from string to Plancks)
|
|
98
|
+
*/
|
|
99
|
+
private parseDotAmount;
|
|
100
|
+
/**
|
|
101
|
+
* Format Plancks to DOT
|
|
102
|
+
*/
|
|
103
|
+
private formatPlancks;
|
|
104
|
+
/**
|
|
105
|
+
* Create SR25519 signature for transaction
|
|
106
|
+
*/
|
|
107
|
+
createSignature(payload: Uint8Array, privateKeyHex: string): Promise<Uint8Array>;
|
|
108
|
+
/**
|
|
109
|
+
* Get default RPC URL for chain type
|
|
110
|
+
* Checks environment variables first, then falls back to public RPC endpoints
|
|
111
|
+
*/
|
|
112
|
+
private getDefaultRpcUrl;
|
|
113
|
+
}
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=polkadot-provider.d.ts.map
|