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,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages archiving of agent data to Arweave.
|
|
5
|
+
* Handles metadata tracking, batch uploads, and retrieval.
|
|
6
|
+
*/
|
|
7
|
+
export interface ArchiveMetadata {
|
|
8
|
+
id: string;
|
|
9
|
+
agentName: string;
|
|
10
|
+
agentVersion: string;
|
|
11
|
+
transactionId?: string;
|
|
12
|
+
timestamp: Date;
|
|
13
|
+
sizeBytes: number;
|
|
14
|
+
checksum: string;
|
|
15
|
+
tags: Record<string, string>;
|
|
16
|
+
status: 'pending' | 'uploading' | 'confirmed' | 'failed';
|
|
17
|
+
blockHeight?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ArchiveOptions {
|
|
20
|
+
includeConfig?: boolean;
|
|
21
|
+
includeLogs?: boolean;
|
|
22
|
+
includeMetrics?: boolean;
|
|
23
|
+
tags?: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
export interface ArchiveResult {
|
|
26
|
+
success: boolean;
|
|
27
|
+
archiveId?: string;
|
|
28
|
+
transactionId?: string;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Archive agent data to local storage (for later upload)
|
|
33
|
+
*/
|
|
34
|
+
export declare function prepareArchive(agentName: string, agentVersion: string, data: Record<string, any>, options?: ArchiveOptions): ArchiveResult;
|
|
35
|
+
/**
|
|
36
|
+
* Mark archive as uploading
|
|
37
|
+
*/
|
|
38
|
+
export declare function markArchiveUploading(archiveId: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Update archive with transaction ID
|
|
41
|
+
*/
|
|
42
|
+
export declare function updateArchiveTransaction(archiveId: string, transactionId: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Mark archive as confirmed
|
|
45
|
+
*/
|
|
46
|
+
export declare function confirmArchive(archiveId: string, blockHeight?: number): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Mark archive as failed
|
|
49
|
+
*/
|
|
50
|
+
export declare function failArchive(archiveId: string, error?: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Get archive metadata by ID
|
|
53
|
+
*/
|
|
54
|
+
export declare function getArchive(archiveId: string): ArchiveMetadata | null;
|
|
55
|
+
/**
|
|
56
|
+
* List all archives for an agent
|
|
57
|
+
*/
|
|
58
|
+
export declare function listArchives(agentName?: string): ArchiveMetadata[];
|
|
59
|
+
/**
|
|
60
|
+
* List pending archives (ready for upload)
|
|
61
|
+
*/
|
|
62
|
+
export declare function listPendingArchives(): ArchiveMetadata[];
|
|
63
|
+
/**
|
|
64
|
+
* Get archive data by ID
|
|
65
|
+
*/
|
|
66
|
+
export declare function getArchiveData(archiveId: string): Record<string, any> | null;
|
|
67
|
+
/**
|
|
68
|
+
* Delete archive (local storage only, does not affect Arweave)
|
|
69
|
+
*/
|
|
70
|
+
export declare function deleteArchive(archiveId: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Get archive statistics
|
|
73
|
+
*/
|
|
74
|
+
export declare function getArchiveStats(agentName?: string): {
|
|
75
|
+
total: number;
|
|
76
|
+
confirmed: number;
|
|
77
|
+
pending: number;
|
|
78
|
+
failed: number;
|
|
79
|
+
totalBytes: number;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Verify archive checksum
|
|
83
|
+
*/
|
|
84
|
+
export declare function verifyArchive(archiveId: string): boolean;
|
|
85
|
+
//# sourceMappingURL=archive-manager.d.ts.map
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages archiving of agent data to Arweave.
|
|
5
|
+
* Handles metadata tracking, batch uploads, and retrieval.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import crypto from 'node:crypto';
|
|
11
|
+
import { parse, stringify } from 'yaml';
|
|
12
|
+
const AGENTVAULT_DIR = path.join(os.homedir(), '.agentvault');
|
|
13
|
+
const ARCHIVES_DIR = path.join(AGENTVAULT_DIR, 'archives');
|
|
14
|
+
const ARCHIVE_INDEX_PATH = path.join(ARCHIVES_DIR, 'index.yaml');
|
|
15
|
+
function ensureArchivesDir() {
|
|
16
|
+
if (!fs.existsSync(AGENTVAULT_DIR)) {
|
|
17
|
+
fs.mkdirSync(AGENTVAULT_DIR, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
if (!fs.existsSync(ARCHIVES_DIR)) {
|
|
20
|
+
fs.mkdirSync(ARCHIVES_DIR, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function getIndex() {
|
|
24
|
+
if (!fs.existsSync(ARCHIVE_INDEX_PATH)) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const content = fs.readFileSync(ARCHIVE_INDEX_PATH, 'utf8');
|
|
29
|
+
const parsed = parse(content);
|
|
30
|
+
if (Array.isArray(parsed)) {
|
|
31
|
+
return parsed.map((item) => ({
|
|
32
|
+
...item,
|
|
33
|
+
timestamp: new Date(item.timestamp),
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error('Failed to load archive index:', error);
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function saveIndex(index) {
|
|
44
|
+
ensureArchivesDir();
|
|
45
|
+
fs.writeFileSync(ARCHIVE_INDEX_PATH, stringify(index), 'utf8');
|
|
46
|
+
}
|
|
47
|
+
function generateChecksum(data) {
|
|
48
|
+
return crypto.createHash('sha256').update(data).digest('hex');
|
|
49
|
+
}
|
|
50
|
+
function generateArchiveId() {
|
|
51
|
+
return `archive-${Date.now()}-${crypto.randomBytes(4).toString('hex')}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Archive agent data to local storage (for later upload)
|
|
55
|
+
*/
|
|
56
|
+
export function prepareArchive(agentName, agentVersion, data, options = {}) {
|
|
57
|
+
try {
|
|
58
|
+
ensureArchivesDir();
|
|
59
|
+
const archiveId = generateArchiveId();
|
|
60
|
+
const timestamp = new Date();
|
|
61
|
+
const dataStr = JSON.stringify(data);
|
|
62
|
+
const checksum = generateChecksum(dataStr);
|
|
63
|
+
const metadata = {
|
|
64
|
+
id: archiveId,
|
|
65
|
+
agentName,
|
|
66
|
+
agentVersion,
|
|
67
|
+
timestamp,
|
|
68
|
+
sizeBytes: Buffer.byteLength(dataStr),
|
|
69
|
+
checksum,
|
|
70
|
+
tags: {
|
|
71
|
+
'agent-name': agentName,
|
|
72
|
+
'agent-version': agentVersion,
|
|
73
|
+
'content-type': 'application/json',
|
|
74
|
+
...options.tags,
|
|
75
|
+
},
|
|
76
|
+
status: 'pending',
|
|
77
|
+
};
|
|
78
|
+
const archivePath = path.join(ARCHIVES_DIR, `${archiveId}.json`);
|
|
79
|
+
fs.writeFileSync(archivePath, dataStr, 'utf8');
|
|
80
|
+
const index = getIndex();
|
|
81
|
+
index.push(metadata);
|
|
82
|
+
saveIndex(index);
|
|
83
|
+
return {
|
|
84
|
+
success: true,
|
|
85
|
+
archiveId,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Mark archive as uploading
|
|
97
|
+
*/
|
|
98
|
+
export function markArchiveUploading(archiveId) {
|
|
99
|
+
try {
|
|
100
|
+
const index = getIndex();
|
|
101
|
+
const archive = index.find((a) => a.id === archiveId);
|
|
102
|
+
if (!archive) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
archive.status = 'uploading';
|
|
106
|
+
saveIndex(index);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('Failed to mark archive as uploading:', error);
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Update archive with transaction ID
|
|
116
|
+
*/
|
|
117
|
+
export function updateArchiveTransaction(archiveId, transactionId) {
|
|
118
|
+
try {
|
|
119
|
+
const index = getIndex();
|
|
120
|
+
const archive = index.find((a) => a.id === archiveId);
|
|
121
|
+
if (!archive) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
archive.transactionId = transactionId;
|
|
125
|
+
archive.status = 'pending';
|
|
126
|
+
saveIndex(index);
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error('Failed to update archive transaction:', error);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Mark archive as confirmed
|
|
136
|
+
*/
|
|
137
|
+
export function confirmArchive(archiveId, blockHeight) {
|
|
138
|
+
try {
|
|
139
|
+
const index = getIndex();
|
|
140
|
+
const archive = index.find((a) => a.id === archiveId);
|
|
141
|
+
if (!archive) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
archive.status = 'confirmed';
|
|
145
|
+
if (blockHeight) {
|
|
146
|
+
archive.blockHeight = blockHeight;
|
|
147
|
+
}
|
|
148
|
+
saveIndex(index);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.error('Failed to confirm archive:', error);
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Mark archive as failed
|
|
158
|
+
*/
|
|
159
|
+
export function failArchive(archiveId, error) {
|
|
160
|
+
try {
|
|
161
|
+
const index = getIndex();
|
|
162
|
+
const archive = index.find((a) => a.id === archiveId);
|
|
163
|
+
if (!archive) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
archive.status = 'failed';
|
|
167
|
+
if (error) {
|
|
168
|
+
archive.tags['error'] = error;
|
|
169
|
+
}
|
|
170
|
+
saveIndex(index);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
console.error('Failed to mark archive as failed:', err);
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get archive metadata by ID
|
|
180
|
+
*/
|
|
181
|
+
export function getArchive(archiveId) {
|
|
182
|
+
try {
|
|
183
|
+
const index = getIndex();
|
|
184
|
+
return index.find((a) => a.id === archiveId) || null;
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.error('Failed to get archive:', error);
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* List all archives for an agent
|
|
193
|
+
*/
|
|
194
|
+
export function listArchives(agentName) {
|
|
195
|
+
try {
|
|
196
|
+
const index = getIndex();
|
|
197
|
+
if (agentName) {
|
|
198
|
+
return index.filter((a) => a.agentName === agentName);
|
|
199
|
+
}
|
|
200
|
+
return index;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
console.error('Failed to list archives:', error);
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* List pending archives (ready for upload)
|
|
209
|
+
*/
|
|
210
|
+
export function listPendingArchives() {
|
|
211
|
+
try {
|
|
212
|
+
const index = getIndex();
|
|
213
|
+
return index.filter((a) => a.status === 'pending');
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
console.error('Failed to list pending archives:', error);
|
|
217
|
+
return [];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get archive data by ID
|
|
222
|
+
*/
|
|
223
|
+
export function getArchiveData(archiveId) {
|
|
224
|
+
try {
|
|
225
|
+
const archivePath = path.join(ARCHIVES_DIR, `${archiveId}.json`);
|
|
226
|
+
if (!fs.existsSync(archivePath)) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const content = fs.readFileSync(archivePath, 'utf8');
|
|
230
|
+
return JSON.parse(content);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
console.error('Failed to get archive data:', error);
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Delete archive (local storage only, does not affect Arweave)
|
|
239
|
+
*/
|
|
240
|
+
export function deleteArchive(archiveId) {
|
|
241
|
+
try {
|
|
242
|
+
const index = getIndex();
|
|
243
|
+
const archiveIndex = index.findIndex((a) => a.id === archiveId);
|
|
244
|
+
if (archiveIndex === -1) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
const archivePath = path.join(ARCHIVES_DIR, `${archiveId}.json`);
|
|
248
|
+
if (fs.existsSync(archivePath)) {
|
|
249
|
+
fs.unlinkSync(archivePath);
|
|
250
|
+
}
|
|
251
|
+
index.splice(archiveIndex, 1);
|
|
252
|
+
saveIndex(index);
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
console.error('Failed to delete archive:', error);
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get archive statistics
|
|
262
|
+
*/
|
|
263
|
+
export function getArchiveStats(agentName) {
|
|
264
|
+
const archives = listArchives(agentName);
|
|
265
|
+
return {
|
|
266
|
+
total: archives.length,
|
|
267
|
+
confirmed: archives.filter((a) => a.status === 'confirmed').length,
|
|
268
|
+
pending: archives.filter((a) => a.status === 'pending').length,
|
|
269
|
+
failed: archives.filter((a) => a.status === 'failed').length,
|
|
270
|
+
totalBytes: archives.reduce((sum, a) => sum + a.sizeBytes, 0),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Verify archive checksum
|
|
275
|
+
*/
|
|
276
|
+
export function verifyArchive(archiveId) {
|
|
277
|
+
try {
|
|
278
|
+
const metadata = getArchive(archiveId);
|
|
279
|
+
if (!metadata) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const data = getArchiveData(archiveId);
|
|
283
|
+
if (!data) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
const actualChecksum = generateChecksum(JSON.stringify(data));
|
|
287
|
+
return actualChecksum === metadata.checksum;
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
console.error('Failed to verify archive:', error);
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=archive-manager.js.map
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arweave Client
|
|
3
|
+
*
|
|
4
|
+
* Handles interaction with Arweave network for permanent data archival.
|
|
5
|
+
* Supports uploading data, retrieving transactions, and checking status.
|
|
6
|
+
*/
|
|
7
|
+
export interface ArweaveConfig {
|
|
8
|
+
host?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
protocol?: 'http' | 'https';
|
|
11
|
+
timeout?: number;
|
|
12
|
+
logging?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface UploadOptions {
|
|
15
|
+
tags?: Record<string, string>;
|
|
16
|
+
fee?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ArchiveTransaction {
|
|
19
|
+
id: string;
|
|
20
|
+
owner: string;
|
|
21
|
+
tags: Record<string, string>;
|
|
22
|
+
size: number;
|
|
23
|
+
timestamp: Date;
|
|
24
|
+
block?: {
|
|
25
|
+
height: number;
|
|
26
|
+
indep_hash: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface UploadResult {
|
|
30
|
+
success: boolean;
|
|
31
|
+
transactionId?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
}
|
|
34
|
+
export type JWKInterface = Record<string, any>;
|
|
35
|
+
export declare class ArweaveClient {
|
|
36
|
+
private config;
|
|
37
|
+
private client;
|
|
38
|
+
constructor(config?: ArweaveConfig);
|
|
39
|
+
/**
|
|
40
|
+
* Initialize Arweave client (lazy loading)
|
|
41
|
+
*/
|
|
42
|
+
private getClient;
|
|
43
|
+
/**
|
|
44
|
+
* Dynamically import arweave (optional dependency)
|
|
45
|
+
*/
|
|
46
|
+
private importArweave;
|
|
47
|
+
/**
|
|
48
|
+
* Upload data to Arweave
|
|
49
|
+
*/
|
|
50
|
+
uploadData(data: string | Buffer, jwk: JWKInterface, options?: UploadOptions): Promise<UploadResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Upload JSON data to Arweave
|
|
53
|
+
*/
|
|
54
|
+
uploadJSON<T>(jsonData: T, jwk: JWKInterface, options?: UploadOptions): Promise<UploadResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Get transaction data by ID
|
|
57
|
+
*/
|
|
58
|
+
getTransactionData(transactionId: string): Promise<string | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Get transaction status
|
|
61
|
+
*/
|
|
62
|
+
getTransactionStatus(transactionId: string): Promise<'pending' | 'confirmed' | 'not_found' | 'error'>;
|
|
63
|
+
/**
|
|
64
|
+
* Get transaction info
|
|
65
|
+
*/
|
|
66
|
+
getTransaction(transactionId: string): Promise<ArchiveTransaction | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Get wallet balance in AR
|
|
69
|
+
*/
|
|
70
|
+
getWalletBalance(address: string): Promise<string>;
|
|
71
|
+
/**
|
|
72
|
+
* Estimate upload cost in AR
|
|
73
|
+
*/
|
|
74
|
+
estimateUploadCost(dataSizeBytes: number): Promise<string>;
|
|
75
|
+
/**
|
|
76
|
+
* Generate a new Arweave wallet
|
|
77
|
+
*/
|
|
78
|
+
generateWallet(): Promise<JWKInterface>;
|
|
79
|
+
/**
|
|
80
|
+
* Get wallet address from JWK
|
|
81
|
+
*/
|
|
82
|
+
getAddressFromJWK(jwk: JWKInterface): Promise<string>;
|
|
83
|
+
/**
|
|
84
|
+
* Create Arweave instance
|
|
85
|
+
*/
|
|
86
|
+
getClientInstance(): Promise<any>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=arweave-client.d.ts.map
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arweave Client
|
|
3
|
+
*
|
|
4
|
+
* Handles interaction with Arweave network for permanent data archival.
|
|
5
|
+
* Supports uploading data, retrieving transactions, and checking status.
|
|
6
|
+
*/
|
|
7
|
+
export class ArweaveClient {
|
|
8
|
+
config;
|
|
9
|
+
client = null;
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
this.config = {
|
|
12
|
+
host: config.host || 'arweave.net',
|
|
13
|
+
port: config.port || 443,
|
|
14
|
+
protocol: config.protocol || 'https',
|
|
15
|
+
timeout: config.timeout || 20000,
|
|
16
|
+
logging: config.logging || false,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initialize Arweave client (lazy loading)
|
|
21
|
+
*/
|
|
22
|
+
async getClient() {
|
|
23
|
+
if (!this.client) {
|
|
24
|
+
try {
|
|
25
|
+
const Arweave = await this.importArweave();
|
|
26
|
+
this.client = new Arweave({
|
|
27
|
+
host: this.config.host,
|
|
28
|
+
port: this.config.port,
|
|
29
|
+
protocol: this.config.protocol,
|
|
30
|
+
timeout: this.config.timeout,
|
|
31
|
+
logging: this.config.logging,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (_error) {
|
|
35
|
+
throw new Error('arweave is required for ArweaveClient. Install with: npm install arweave');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return this.client;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Dynamically import arweave (optional dependency)
|
|
42
|
+
*/
|
|
43
|
+
async importArweave() {
|
|
44
|
+
try {
|
|
45
|
+
const dynamicImport = new Function('modulePath', 'return import(modulePath)');
|
|
46
|
+
const arweaveModule = await dynamicImport('arweave');
|
|
47
|
+
return arweaveModule.default;
|
|
48
|
+
}
|
|
49
|
+
catch (_error) {
|
|
50
|
+
throw new Error('arweave is required for ArweaveClient. Install with: npm install arweave');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Upload data to Arweave
|
|
55
|
+
*/
|
|
56
|
+
async uploadData(data, jwk, options = {}) {
|
|
57
|
+
try {
|
|
58
|
+
const client = await this.getClient();
|
|
59
|
+
const transaction = await client.createTransaction({
|
|
60
|
+
data: typeof data === 'string' ? data : data.toString('base64'),
|
|
61
|
+
}, jwk);
|
|
62
|
+
if (options.tags) {
|
|
63
|
+
for (const [key, value] of Object.entries(options.tags)) {
|
|
64
|
+
transaction.addTag(key, value);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
await client.transactions.sign(transaction, jwk);
|
|
68
|
+
const response = await client.transactions.post(transaction);
|
|
69
|
+
if (response.status === 200 || response.status === 202) {
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
transactionId: transaction.id,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: `Upload failed with status ${response.status}`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Upload JSON data to Arweave
|
|
91
|
+
*/
|
|
92
|
+
async uploadJSON(jsonData, jwk, options = {}) {
|
|
93
|
+
return this.uploadData(JSON.stringify(jsonData), jwk, {
|
|
94
|
+
...options,
|
|
95
|
+
tags: {
|
|
96
|
+
'Content-Type': 'application/json',
|
|
97
|
+
...(options.tags || {}),
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get transaction data by ID
|
|
103
|
+
*/
|
|
104
|
+
async getTransactionData(transactionId) {
|
|
105
|
+
try {
|
|
106
|
+
const client = await this.getClient();
|
|
107
|
+
const data = await client.transactions.getData(transactionId, {
|
|
108
|
+
decode: true,
|
|
109
|
+
});
|
|
110
|
+
return data.toString();
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error(`Failed to fetch transaction ${transactionId}:`, error);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get transaction status
|
|
119
|
+
*/
|
|
120
|
+
async getTransactionStatus(transactionId) {
|
|
121
|
+
try {
|
|
122
|
+
const client = await this.getClient();
|
|
123
|
+
const status = await client.transactions.getStatus(transactionId);
|
|
124
|
+
if (!status) {
|
|
125
|
+
return 'not_found';
|
|
126
|
+
}
|
|
127
|
+
if (status.confirmed && status.confirmed.number_of_confirmations > 0) {
|
|
128
|
+
return 'confirmed';
|
|
129
|
+
}
|
|
130
|
+
return 'pending';
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error(`Failed to check status for ${transactionId}:`, error);
|
|
134
|
+
return 'error';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get transaction info
|
|
139
|
+
*/
|
|
140
|
+
async getTransaction(transactionId) {
|
|
141
|
+
try {
|
|
142
|
+
const client = await this.getClient();
|
|
143
|
+
const transaction = await client.transactions.get(transactionId);
|
|
144
|
+
const tags = {};
|
|
145
|
+
transaction.get('tags').forEach((tag) => {
|
|
146
|
+
const name = tag.get('name', { decode: true, string: true });
|
|
147
|
+
const value = tag.get('value', { decode: true, string: true });
|
|
148
|
+
if (name && value) {
|
|
149
|
+
tags[name] = value;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
const block = transaction.get('block');
|
|
153
|
+
let blockInfo;
|
|
154
|
+
if (block) {
|
|
155
|
+
blockInfo = {
|
|
156
|
+
height: block.get('height'),
|
|
157
|
+
indep_hash: block.get('indep_hash'),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
id: transaction.id,
|
|
162
|
+
owner: transaction.owner,
|
|
163
|
+
tags,
|
|
164
|
+
size: parseInt(transaction.data_size, 10),
|
|
165
|
+
timestamp: new Date(parseInt(transaction.last_tx, 10) * 1000),
|
|
166
|
+
block: blockInfo,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.error(`Failed to fetch transaction ${transactionId}:`, error);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get wallet balance in AR
|
|
176
|
+
*/
|
|
177
|
+
async getWalletBalance(address) {
|
|
178
|
+
try {
|
|
179
|
+
const client = await this.getClient();
|
|
180
|
+
const balance = await client.wallets.getBalance(address);
|
|
181
|
+
return client.ar.winstonToAr(balance);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error(`Failed to fetch balance for ${address}:`, error);
|
|
185
|
+
return '0';
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Estimate upload cost in AR
|
|
190
|
+
*/
|
|
191
|
+
async estimateUploadCost(dataSizeBytes) {
|
|
192
|
+
try {
|
|
193
|
+
const client = await this.getClient();
|
|
194
|
+
const price = await client.transactions.getPrice(dataSizeBytes);
|
|
195
|
+
return client.ar.winstonToAr(price);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error('Failed to estimate cost:', error);
|
|
199
|
+
return '0';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Generate a new Arweave wallet
|
|
204
|
+
*/
|
|
205
|
+
async generateWallet() {
|
|
206
|
+
const client = await this.getClient();
|
|
207
|
+
return client.wallets.generate();
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get wallet address from JWK
|
|
211
|
+
*/
|
|
212
|
+
async getAddressFromJWK(jwk) {
|
|
213
|
+
const client = await this.getClient();
|
|
214
|
+
return client.wallets.jwkToAddress(jwk);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Create Arweave instance
|
|
218
|
+
*/
|
|
219
|
+
async getClientInstance() {
|
|
220
|
+
return this.getClient();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=arweave-client.js.map
|