agentspay 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/.env.example +40 -0
  2. package/README.md +35 -4
  3. package/VERIFICATION_SUMMARY.txt +151 -0
  4. package/dist/api/server.d.ts.map +1 -1
  5. package/dist/api/server.js +530 -74
  6. package/dist/api/server.js.map +1 -1
  7. package/dist/bsv/crypto.d.ts +65 -0
  8. package/dist/bsv/crypto.d.ts.map +1 -0
  9. package/dist/bsv/crypto.js +158 -0
  10. package/dist/bsv/crypto.js.map +1 -0
  11. package/dist/bsv/mnee.d.ts +88 -0
  12. package/dist/bsv/mnee.d.ts.map +1 -0
  13. package/dist/bsv/mnee.js +173 -0
  14. package/dist/bsv/mnee.js.map +1 -0
  15. package/dist/bsv/opreturn.d.ts +22 -0
  16. package/dist/bsv/opreturn.d.ts.map +1 -0
  17. package/dist/bsv/opreturn.js +117 -0
  18. package/dist/bsv/opreturn.js.map +1 -0
  19. package/dist/bsv/whatsonchain.d.ts +46 -0
  20. package/dist/bsv/whatsonchain.d.ts.map +1 -0
  21. package/dist/bsv/whatsonchain.js +98 -0
  22. package/dist/bsv/whatsonchain.js.map +1 -0
  23. package/dist/config.d.ts +38 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +85 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/currency/currency.d.ts +70 -0
  28. package/dist/currency/currency.d.ts.map +1 -0
  29. package/dist/currency/currency.js +137 -0
  30. package/dist/currency/currency.js.map +1 -0
  31. package/dist/disputes/dispute.d.ts +50 -0
  32. package/dist/disputes/dispute.d.ts.map +1 -0
  33. package/dist/disputes/dispute.js +162 -0
  34. package/dist/disputes/dispute.js.map +1 -0
  35. package/dist/docs/openapi.yaml +1079 -0
  36. package/dist/docs/swagger.d.ts +12 -0
  37. package/dist/docs/swagger.d.ts.map +1 -0
  38. package/dist/docs/swagger.js +104 -0
  39. package/dist/docs/swagger.js.map +1 -0
  40. package/dist/middleware/auth.d.ts +20 -0
  41. package/dist/middleware/auth.d.ts.map +1 -0
  42. package/dist/middleware/auth.js +32 -0
  43. package/dist/middleware/auth.js.map +1 -0
  44. package/dist/middleware/rateLimit.d.ts +25 -0
  45. package/dist/middleware/rateLimit.d.ts.map +1 -0
  46. package/dist/middleware/rateLimit.js +61 -0
  47. package/dist/middleware/rateLimit.js.map +1 -0
  48. package/dist/payment/payment.d.ts +79 -9
  49. package/dist/payment/payment.d.ts.map +1 -1
  50. package/dist/payment/payment.js +387 -47
  51. package/dist/payment/payment.js.map +1 -1
  52. package/dist/registry/db.d.ts.map +1 -1
  53. package/dist/registry/db.js +110 -3
  54. package/dist/registry/db.js.map +1 -1
  55. package/dist/registry/registry.d.ts +1 -1
  56. package/dist/registry/registry.d.ts.map +1 -1
  57. package/dist/registry/registry.js +12 -4
  58. package/dist/registry/registry.js.map +1 -1
  59. package/dist/types/index.d.ts +34 -0
  60. package/dist/types/index.d.ts.map +1 -1
  61. package/dist/types/index.js.map +1 -1
  62. package/dist/utils/validation.d.ts +27 -0
  63. package/dist/utils/validation.d.ts.map +1 -0
  64. package/dist/utils/validation.js +164 -0
  65. package/dist/utils/validation.js.map +1 -0
  66. package/dist/verification/receipt.d.ts +42 -0
  67. package/dist/verification/receipt.d.ts.map +1 -0
  68. package/dist/verification/receipt.js +10 -0
  69. package/dist/verification/receipt.js.map +1 -0
  70. package/dist/verification/verification.d.ts +41 -0
  71. package/dist/verification/verification.d.ts.map +1 -0
  72. package/dist/verification/verification.js +217 -0
  73. package/dist/verification/verification.js.map +1 -0
  74. package/dist/wallet/providerManager.d.ts +32 -0
  75. package/dist/wallet/providerManager.d.ts.map +1 -0
  76. package/dist/wallet/providerManager.js +118 -0
  77. package/dist/wallet/providerManager.js.map +1 -0
  78. package/dist/wallet/providers/handcash.d.ts +22 -0
  79. package/dist/wallet/providers/handcash.d.ts.map +1 -0
  80. package/dist/wallet/providers/handcash.js +214 -0
  81. package/dist/wallet/providers/handcash.js.map +1 -0
  82. package/dist/wallet/providers/internal.d.ts +15 -0
  83. package/dist/wallet/providers/internal.d.ts.map +1 -0
  84. package/dist/wallet/providers/internal.js +208 -0
  85. package/dist/wallet/providers/internal.js.map +1 -0
  86. package/dist/wallet/providers/types.d.ts +50 -0
  87. package/dist/wallet/providers/types.d.ts.map +1 -0
  88. package/dist/wallet/providers/types.js +6 -0
  89. package/dist/wallet/providers/types.js.map +1 -0
  90. package/dist/wallet/providers/yours.d.ts +18 -0
  91. package/dist/wallet/providers/yours.d.ts.map +1 -0
  92. package/dist/wallet/providers/yours.js +122 -0
  93. package/dist/wallet/providers/yours.js.map +1 -0
  94. package/dist/wallet/wallet.d.ts +52 -5
  95. package/dist/wallet/wallet.d.ts.map +1 -1
  96. package/dist/wallet/wallet.js +223 -34
  97. package/dist/wallet/wallet.js.map +1 -1
  98. package/dist/webhooks/delivery.d.ts +37 -0
  99. package/dist/webhooks/delivery.d.ts.map +1 -0
  100. package/dist/webhooks/delivery.js +182 -0
  101. package/dist/webhooks/delivery.js.map +1 -0
  102. package/dist/webhooks/webhook.d.ts +85 -0
  103. package/dist/webhooks/webhook.d.ts.map +1 -0
  104. package/dist/webhooks/webhook.js +271 -0
  105. package/dist/webhooks/webhook.js.map +1 -0
  106. package/package.json +74 -54
  107. package/sdk-python/LICENSE +21 -0
  108. package/sdk-python/MANIFEST.in +9 -0
  109. package/sdk-python/README.md +372 -0
  110. package/sdk-python/agentspay/__init__.py +97 -0
  111. package/sdk-python/agentspay/client.py +256 -0
  112. package/sdk-python/agentspay/disputes.py +174 -0
  113. package/sdk-python/agentspay/exceptions.py +53 -0
  114. package/sdk-python/agentspay/payments.py +169 -0
  115. package/sdk-python/agentspay/services.py +198 -0
  116. package/sdk-python/agentspay/types.py +154 -0
  117. package/sdk-python/agentspay/wallet.py +113 -0
  118. package/sdk-python/agentspay/webhooks.py +195 -0
  119. package/sdk-python/examples/consumer.py +147 -0
  120. package/sdk-python/examples/provider.py +116 -0
  121. package/sdk-python/pyproject.toml +61 -0
  122. package/sdk-python/setup.py +53 -0
  123. package/sdk-python/tests/test_client.py +221 -0
  124. package/test-addr.js +29 -0
  125. package/test-mnee-simple.js +51 -0
  126. package/test-mnee.js +47 -0
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ /**
3
+ * Verification Manager
4
+ *
5
+ * Handles creation, storage, and verification of execution receipts.
6
+ * Provides cryptographic proof of service execution.
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.VerificationManager = void 0;
13
+ const uuid_1 = require("uuid");
14
+ const crypto_1 = __importDefault(require("crypto"));
15
+ const db_1 = require("../registry/db");
16
+ class VerificationManager {
17
+ platformSecret;
18
+ constructor(platformSecret) {
19
+ // Use environment variable or generate deterministic secret
20
+ this.platformSecret = platformSecret || process.env.AGENTPAY_PLATFORM_SECRET || 'agentspay-platform-secret-change-in-production';
21
+ }
22
+ /**
23
+ * Create an execution receipt after service execution
24
+ */
25
+ async createReceipt(payment, input, output, executionTimeMs, providerSecret) {
26
+ const db = (0, db_1.getDb)();
27
+ const now = Date.now();
28
+ const receiptData = {
29
+ paymentId: payment.id,
30
+ serviceId: payment.serviceId,
31
+ input,
32
+ output,
33
+ timestamp: now,
34
+ executionTimeMs,
35
+ };
36
+ // Hash inputs and outputs
37
+ const inputHash = this.hashData(input);
38
+ const outputHash = this.hashData(output);
39
+ // Create receipt ID
40
+ const id = (0, uuid_1.v4)();
41
+ // Generate provider signature (if provider secret available)
42
+ const providerSignature = providerSecret
43
+ ? this.signReceipt(receiptData, providerSecret)
44
+ : this.signReceipt(receiptData, this.platformSecret); // Fallback to platform
45
+ // Generate platform signature
46
+ const platformSignature = this.signReceipt(receiptData, this.platformSecret);
47
+ // Create receipt hash (hash of all fields for integrity)
48
+ const receiptHash = this.hashReceipt({
49
+ id,
50
+ paymentId: payment.id,
51
+ serviceId: payment.serviceId,
52
+ inputHash,
53
+ outputHash,
54
+ timestamp: now,
55
+ executionTimeMs,
56
+ providerSignature,
57
+ platformSignature,
58
+ });
59
+ const receipt = {
60
+ id,
61
+ paymentId: payment.id,
62
+ serviceId: payment.serviceId,
63
+ inputHash,
64
+ outputHash,
65
+ timestamp: now,
66
+ executionTimeMs,
67
+ providerSignature,
68
+ platformSignature,
69
+ receiptHash,
70
+ };
71
+ // Store in database
72
+ db.prepare(`
73
+ INSERT INTO execution_receipts (
74
+ id, paymentId, serviceId, inputHash, outputHash,
75
+ timestamp, executionTimeMs, providerSignature, platformSignature,
76
+ receiptHash, createdAt
77
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
78
+ `).run(receipt.id, receipt.paymentId, receipt.serviceId, receipt.inputHash, receipt.outputHash, receipt.timestamp, receipt.executionTimeMs, receipt.providerSignature, receipt.platformSignature, receipt.receiptHash, new Date(now).toISOString());
79
+ return receipt;
80
+ }
81
+ /**
82
+ * Get receipt by payment ID
83
+ */
84
+ getReceipt(paymentId) {
85
+ const db = (0, db_1.getDb)();
86
+ const row = db.prepare(`
87
+ SELECT id, paymentId, serviceId, inputHash, outputHash,
88
+ timestamp, executionTimeMs, providerSignature, platformSignature,
89
+ receiptHash, blockchainTxId, blockchainAnchoredAt
90
+ FROM execution_receipts
91
+ WHERE paymentId = ?
92
+ `).get(paymentId);
93
+ if (!row)
94
+ return null;
95
+ return {
96
+ id: row.id,
97
+ paymentId: row.paymentId,
98
+ serviceId: row.serviceId,
99
+ inputHash: row.inputHash,
100
+ outputHash: row.outputHash,
101
+ timestamp: row.timestamp,
102
+ executionTimeMs: row.executionTimeMs,
103
+ providerSignature: row.providerSignature,
104
+ platformSignature: row.platformSignature,
105
+ receiptHash: row.receiptHash,
106
+ blockchainTxId: row.blockchainTxId || undefined,
107
+ blockchainAnchoredAt: row.blockchainAnchoredAt || undefined,
108
+ };
109
+ }
110
+ /**
111
+ * Verify receipt integrity and signatures
112
+ */
113
+ async verifyReceipt(receipt) {
114
+ const errors = [];
115
+ // 1. Verify receipt hash integrity
116
+ const expectedHash = this.hashReceipt({
117
+ id: receipt.id,
118
+ paymentId: receipt.paymentId,
119
+ serviceId: receipt.serviceId,
120
+ inputHash: receipt.inputHash,
121
+ outputHash: receipt.outputHash,
122
+ timestamp: receipt.timestamp,
123
+ executionTimeMs: receipt.executionTimeMs,
124
+ providerSignature: receipt.providerSignature,
125
+ platformSignature: receipt.platformSignature,
126
+ });
127
+ if (expectedHash !== receipt.receiptHash) {
128
+ errors.push('Receipt hash mismatch - data has been tampered');
129
+ }
130
+ // 2. Verify platform signature
131
+ const receiptData = {
132
+ paymentId: receipt.paymentId,
133
+ serviceId: receipt.serviceId,
134
+ input: {}, // We don't store raw input, only hash
135
+ output: {},
136
+ timestamp: receipt.timestamp,
137
+ executionTimeMs: receipt.executionTimeMs,
138
+ };
139
+ const expectedPlatformSig = this.signReceipt(receiptData, this.platformSecret);
140
+ if (expectedPlatformSig !== receipt.platformSignature) {
141
+ errors.push('Platform signature invalid');
142
+ }
143
+ // 3. Check if exists in database
144
+ const stored = this.getReceipt(receipt.paymentId);
145
+ if (!stored) {
146
+ errors.push('Receipt not found in database');
147
+ }
148
+ else if (stored.receiptHash !== receipt.receiptHash) {
149
+ errors.push('Receipt does not match stored version');
150
+ }
151
+ // 4. Optional: Verify blockchain anchor
152
+ let blockchainVerified = false;
153
+ if (receipt.blockchainTxId) {
154
+ // TODO: Implement blockchain verification via WhatsOnChain API
155
+ // For now, just flag as anchored
156
+ blockchainVerified = true;
157
+ }
158
+ return {
159
+ valid: errors.length === 0,
160
+ errors,
161
+ receipt,
162
+ blockchainVerified,
163
+ };
164
+ }
165
+ /**
166
+ * Update receipt with blockchain anchor
167
+ */
168
+ async anchorToBlockchain(receiptHash, txId) {
169
+ const db = (0, db_1.getDb)();
170
+ const now = new Date().toISOString();
171
+ db.prepare(`
172
+ UPDATE execution_receipts
173
+ SET blockchainTxId = ?, blockchainAnchoredAt = ?
174
+ WHERE receiptHash = ?
175
+ `).run(txId, now, receiptHash);
176
+ }
177
+ /**
178
+ * Hash arbitrary data (for inputs/outputs)
179
+ */
180
+ hashData(data) {
181
+ const json = JSON.stringify(data, Object.keys(data).sort()); // Deterministic
182
+ return crypto_1.default.createHash('sha256').update(json).digest('hex');
183
+ }
184
+ /**
185
+ * Hash receipt fields for integrity check
186
+ */
187
+ hashReceipt(fields) {
188
+ const canonical = JSON.stringify({
189
+ id: fields.id,
190
+ paymentId: fields.paymentId,
191
+ serviceId: fields.serviceId,
192
+ inputHash: fields.inputHash,
193
+ outputHash: fields.outputHash,
194
+ timestamp: fields.timestamp,
195
+ executionTimeMs: fields.executionTimeMs,
196
+ providerSignature: fields.providerSignature,
197
+ platformSignature: fields.platformSignature,
198
+ });
199
+ return crypto_1.default.createHash('sha256').update(canonical).digest('hex');
200
+ }
201
+ /**
202
+ * Sign receipt data with HMAC-SHA256
203
+ */
204
+ signReceipt(data, secret) {
205
+ const canonical = JSON.stringify({
206
+ paymentId: data.paymentId,
207
+ serviceId: data.serviceId,
208
+ inputHash: this.hashData(data.input),
209
+ outputHash: this.hashData(data.output),
210
+ timestamp: data.timestamp,
211
+ executionTimeMs: data.executionTimeMs,
212
+ });
213
+ return crypto_1.default.createHmac('sha256', secret).update(canonical).digest('hex');
214
+ }
215
+ }
216
+ exports.VerificationManager = VerificationManager;
217
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/verification/verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Wallet Provider Manager
3
+ *
4
+ * Central coordinator for all wallet providers.
5
+ * Handles provider selection, switching, and delegation.
6
+ */
7
+ import type { WalletProvider, WalletProviderType, WalletConnection, SignedTransaction, TransactionRequest, WalletProviderMetadata } from './providers/types';
8
+ export declare class ProviderManager {
9
+ private providers;
10
+ constructor();
11
+ getProvider(type: WalletProviderType): WalletProvider;
12
+ getWalletProvider(walletId: string): WalletProvider;
13
+ getProviderMetadata(walletId: string): WalletProviderMetadata | null;
14
+ connect(type: WalletProviderType, params?: any): Promise<WalletConnection>;
15
+ getBalance(walletId: string): Promise<number>;
16
+ signTransaction(walletId: string, txReq: TransactionRequest): Promise<SignedTransaction>;
17
+ getAddress(walletId: string): Promise<string>;
18
+ disconnect(walletId: string): Promise<void>;
19
+ getWalletInfo(walletId: string): Promise<{
20
+ wallet: any;
21
+ provider: WalletProviderMetadata | null;
22
+ balance: number;
23
+ }>;
24
+ listProviders(): Array<{
25
+ type: WalletProviderType;
26
+ name: string;
27
+ description: string;
28
+ }>;
29
+ switchProvider(walletId: string, newType: WalletProviderType, params?: any): Promise<WalletConnection>;
30
+ }
31
+ export declare function getProviderManager(): ProviderManager;
32
+ //# sourceMappingURL=providerManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerManager.d.ts","sourceRoot":"","sources":["../../src/wallet/providerManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,mBAAmB,CAAA;AAE1B,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAyC;;IAS1D,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc;IAQrD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAQnD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI;IAiB9D,OAAO,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAK1E,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAKxF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAA;QACX,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAA;QACvC,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC;IAkBF,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,kBAAkB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBjF,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAK7G;AAID,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Wallet Provider Manager
4
+ *
5
+ * Central coordinator for all wallet providers.
6
+ * Handles provider selection, switching, and delegation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ProviderManager = void 0;
10
+ exports.getProviderManager = getProviderManager;
11
+ const db_1 = require("../registry/db");
12
+ const internal_1 = require("./providers/internal");
13
+ const handcash_1 = require("./providers/handcash");
14
+ const yours_1 = require("./providers/yours");
15
+ class ProviderManager {
16
+ providers;
17
+ constructor() {
18
+ this.providers = new Map();
19
+ this.providers.set('internal', new internal_1.InternalWalletProvider());
20
+ this.providers.set('handcash', new handcash_1.HandCashWalletProvider());
21
+ this.providers.set('yours', new yours_1.YoursWalletProvider());
22
+ }
23
+ getProvider(type) {
24
+ const provider = this.providers.get(type);
25
+ if (!provider) {
26
+ throw new Error(`Unknown provider type: ${type}`);
27
+ }
28
+ return provider;
29
+ }
30
+ getWalletProvider(walletId) {
31
+ const metadata = this.getProviderMetadata(walletId);
32
+ if (!metadata) {
33
+ return this.getProvider('internal');
34
+ }
35
+ return this.getProvider(metadata.providerType);
36
+ }
37
+ getProviderMetadata(walletId) {
38
+ const db = (0, db_1.getDb)();
39
+ db.exec(`
40
+ CREATE TABLE IF NOT EXISTS wallet_providers (
41
+ walletId TEXT PRIMARY KEY,
42
+ providerType TEXT NOT NULL,
43
+ providerData TEXT NOT NULL,
44
+ createdAt TEXT NOT NULL,
45
+ lastUsed TEXT
46
+ )
47
+ `);
48
+ const row = db.prepare('SELECT * FROM wallet_providers WHERE walletId = ?').get(walletId);
49
+ return row || null;
50
+ }
51
+ async connect(type, params) {
52
+ const provider = this.getProvider(type);
53
+ return provider.connect(params);
54
+ }
55
+ async getBalance(walletId) {
56
+ const provider = this.getWalletProvider(walletId);
57
+ return provider.getBalance(walletId);
58
+ }
59
+ async signTransaction(walletId, txReq) {
60
+ const provider = this.getWalletProvider(walletId);
61
+ return provider.signTransaction(walletId, txReq);
62
+ }
63
+ async getAddress(walletId) {
64
+ const provider = this.getWalletProvider(walletId);
65
+ return provider.getAddress(walletId);
66
+ }
67
+ async disconnect(walletId) {
68
+ const provider = this.getWalletProvider(walletId);
69
+ await provider.disconnect(walletId);
70
+ }
71
+ async getWalletInfo(walletId) {
72
+ const db = (0, db_1.getDb)();
73
+ const wallet = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE id = ?').get(walletId);
74
+ if (!wallet) {
75
+ throw new Error('Wallet not found');
76
+ }
77
+ const provider = this.getProviderMetadata(walletId);
78
+ const balance = await this.getBalance(walletId);
79
+ return {
80
+ wallet,
81
+ provider,
82
+ balance,
83
+ };
84
+ }
85
+ listProviders() {
86
+ return [
87
+ {
88
+ type: 'internal',
89
+ name: 'Internal Wallet',
90
+ description: 'Private key stored on server (encrypted). For development only.',
91
+ },
92
+ {
93
+ type: 'handcash',
94
+ name: 'HandCash',
95
+ description: 'Connect your HandCash wallet. Private keys never leave HandCash.',
96
+ },
97
+ {
98
+ type: 'yours',
99
+ name: 'Yours Wallet',
100
+ description: 'Use Yours Wallet browser extension. Sign transactions locally.',
101
+ },
102
+ ];
103
+ }
104
+ async switchProvider(walletId, newType, params) {
105
+ await this.disconnect(walletId);
106
+ const provider = this.getProvider(newType);
107
+ return provider.connect(params);
108
+ }
109
+ }
110
+ exports.ProviderManager = ProviderManager;
111
+ let providerManager = null;
112
+ function getProviderManager() {
113
+ if (!providerManager) {
114
+ providerManager = new ProviderManager();
115
+ }
116
+ return providerManager;
117
+ }
118
+ //# sourceMappingURL=providerManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerManager.js","sourceRoot":"","sources":["../../src/wallet/providerManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * HandCash Connect Provider
3
+ */
4
+ import type { WalletProvider, WalletConnection, SignedTransaction, TransactionRequest, HandCashConnectParams } from './types';
5
+ export declare class HandCashWalletProvider implements WalletProvider {
6
+ type: "handcash";
7
+ private appId;
8
+ private appSecret;
9
+ private redirectUrl;
10
+ constructor();
11
+ getAuthorizationUrl(): string;
12
+ connect(params?: HandCashConnectParams): Promise<WalletConnection>;
13
+ getBalance(walletId: string): Promise<number>;
14
+ signTransaction(walletId: string, txReq: TransactionRequest): Promise<SignedTransaction>;
15
+ getAddress(walletId: string): Promise<string>;
16
+ disconnect(walletId: string): Promise<void>;
17
+ private storeProviderMetadata;
18
+ private updateProviderMetadata;
19
+ private getProviderMetadata;
20
+ private updateLastUsed;
21
+ }
22
+ //# sourceMappingURL=handcash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handcash.d.ts","sourceRoot":"","sources":["../../../src/wallet/providers/handcash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAShB,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,IAAI,EAAG,UAAU,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,WAAW,CAAQ;;IAQ3B,mBAAmB,IAAI,MAAM;IAavB,OAAO,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoFlE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB7C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+CxF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ7C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,cAAc;CAIvB"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ /**
3
+ * HandCash Connect Provider
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HandCashWalletProvider = void 0;
7
+ const uuid_1 = require("uuid");
8
+ const db_1 = require("../../registry/db");
9
+ const config_1 = require("../../config");
10
+ let HandCashConnect = null;
11
+ try {
12
+ HandCashConnect = require('@handcash/handcash-connect').HandCashConnect;
13
+ }
14
+ catch {
15
+ console.warn('⚠️ HandCash Connect SDK not installed. HandCash provider will use mock mode.');
16
+ }
17
+ class HandCashWalletProvider {
18
+ type = 'handcash';
19
+ appId;
20
+ appSecret;
21
+ redirectUrl;
22
+ constructor() {
23
+ this.appId = process.env.HANDCASH_APP_ID || 'demo-app-id';
24
+ this.appSecret = process.env.HANDCASH_APP_SECRET || 'demo-app-secret';
25
+ this.redirectUrl = process.env.HANDCASH_REDIRECT_URL || 'http://localhost:3100/api/wallets/connect/handcash/callback';
26
+ }
27
+ getAuthorizationUrl() {
28
+ if (!HandCashConnect || config_1.config.demoMode) {
29
+ return 'https://demo-handcash-auth-url.com';
30
+ }
31
+ const handCashConnect = new HandCashConnect({
32
+ appId: this.appId,
33
+ appSecret: this.appSecret,
34
+ });
35
+ return handCashConnect.getRedirectionUrl();
36
+ }
37
+ async connect(params) {
38
+ if (!params?.authToken) {
39
+ throw new Error('HandCash auth token required');
40
+ }
41
+ const db = (0, db_1.getDb)();
42
+ const id = (0, uuid_1.v4)();
43
+ if (!HandCashConnect || config_1.config.demoMode) {
44
+ const mockConnection = {
45
+ walletId: id,
46
+ address: '1MockHandCashAddress' + Math.random().toString(36).slice(2, 8),
47
+ paymail: 'demo@handcash.io',
48
+ displayName: 'Demo HandCash User',
49
+ providerType: 'handcash',
50
+ };
51
+ this.storeProviderMetadata(id, {
52
+ authToken: params.authToken,
53
+ paymail: mockConnection.paymail,
54
+ displayName: mockConnection.displayName,
55
+ });
56
+ db.prepare(`
57
+ INSERT INTO wallets (id, publicKey, address, privateKey, createdAt)
58
+ VALUES (?, ?, ?, ?, ?)
59
+ `).run(id, '', mockConnection.paymail, '', new Date().toISOString());
60
+ return mockConnection;
61
+ }
62
+ try {
63
+ const handCashConnect = new HandCashConnect({
64
+ appId: this.appId,
65
+ appSecret: this.appSecret,
66
+ });
67
+ const account = handCashConnect.getAccountFromAuthToken(params.authToken);
68
+ const profile = await account.profile.getCurrentProfile();
69
+ const existing = db.prepare('SELECT id FROM wallet_providers WHERE providerData LIKE ?')
70
+ .get(`%"paymail":"${profile.paymail}"%`);
71
+ if (existing) {
72
+ this.updateProviderMetadata(existing.id, {
73
+ authToken: params.authToken,
74
+ paymail: profile.paymail,
75
+ displayName: profile.displayName,
76
+ });
77
+ return {
78
+ walletId: existing.id,
79
+ address: profile.paymail,
80
+ paymail: profile.paymail,
81
+ displayName: profile.displayName,
82
+ providerType: 'handcash',
83
+ };
84
+ }
85
+ const createdAt = new Date().toISOString();
86
+ db.prepare(`
87
+ INSERT INTO wallets (id, publicKey, address, privateKey, createdAt)
88
+ VALUES (?, ?, ?, ?, ?)
89
+ `).run(id, '', profile.paymail, '', createdAt);
90
+ this.storeProviderMetadata(id, {
91
+ authToken: params.authToken,
92
+ paymail: profile.paymail,
93
+ displayName: profile.displayName,
94
+ handle: profile.handle,
95
+ });
96
+ return {
97
+ walletId: id,
98
+ address: profile.paymail,
99
+ paymail: profile.paymail,
100
+ displayName: profile.displayName,
101
+ providerType: 'handcash',
102
+ };
103
+ }
104
+ catch (error) {
105
+ throw new Error(`HandCash connection failed: ${error.message}`);
106
+ }
107
+ }
108
+ async getBalance(walletId) {
109
+ if (!HandCashConnect || config_1.config.demoMode) {
110
+ return 100000;
111
+ }
112
+ const metadata = this.getProviderMetadata(walletId);
113
+ if (!metadata)
114
+ throw new Error('HandCash wallet not found');
115
+ const data = JSON.parse(metadata.providerData);
116
+ try {
117
+ const handCashConnect = new HandCashConnect({
118
+ appId: this.appId,
119
+ appSecret: this.appSecret,
120
+ });
121
+ const account = handCashConnect.getAccountFromAuthToken(data.authToken);
122
+ const balanceBsv = await account.wallet.getSpendableBalance('BSV');
123
+ return Math.floor(balanceBsv * 100000000);
124
+ }
125
+ catch (error) {
126
+ throw new Error(`Failed to fetch HandCash balance: ${error.message}`);
127
+ }
128
+ }
129
+ async signTransaction(walletId, txReq) {
130
+ if (!HandCashConnect || config_1.config.demoMode) {
131
+ return {
132
+ txHex: '0100000001...' + Math.random().toString(36),
133
+ txId: 'mock-handcash-tx-' + (0, uuid_1.v4)(),
134
+ };
135
+ }
136
+ const metadata = this.getProviderMetadata(walletId);
137
+ if (!metadata)
138
+ throw new Error('HandCash wallet not found');
139
+ const data = JSON.parse(metadata.providerData);
140
+ try {
141
+ const handCashConnect = new HandCashConnect({
142
+ appId: this.appId,
143
+ appSecret: this.appSecret,
144
+ });
145
+ const account = handCashConnect.getAccountFromAuthToken(data.authToken);
146
+ const payments = txReq.recipients.map(r => ({
147
+ destination: r.address,
148
+ currencyCode: 'SAT',
149
+ sendAmount: r.amount,
150
+ }));
151
+ const attachment = txReq.data && txReq.data.length > 0
152
+ ? { data: txReq.data.join(' ') }
153
+ : undefined;
154
+ const paymentResult = await account.wallet.pay({
155
+ payments,
156
+ attachment,
157
+ });
158
+ this.updateLastUsed(walletId);
159
+ return {
160
+ txHex: paymentResult.rawTransactionHex || '',
161
+ txId: paymentResult.transactionId,
162
+ };
163
+ }
164
+ catch (error) {
165
+ throw new Error(`HandCash payment failed: ${error.message}`);
166
+ }
167
+ }
168
+ async getAddress(walletId) {
169
+ const metadata = this.getProviderMetadata(walletId);
170
+ if (!metadata)
171
+ throw new Error('HandCash wallet not found');
172
+ const data = JSON.parse(metadata.providerData);
173
+ return data.paymail;
174
+ }
175
+ async disconnect(walletId) {
176
+ const db = (0, db_1.getDb)();
177
+ db.prepare('DELETE FROM wallet_providers WHERE walletId = ?').run(walletId);
178
+ }
179
+ storeProviderMetadata(walletId, data) {
180
+ const db = (0, db_1.getDb)();
181
+ db.exec(`
182
+ CREATE TABLE IF NOT EXISTS wallet_providers (
183
+ walletId TEXT PRIMARY KEY,
184
+ providerType TEXT NOT NULL,
185
+ providerData TEXT NOT NULL,
186
+ createdAt TEXT NOT NULL,
187
+ lastUsed TEXT
188
+ )
189
+ `);
190
+ db.prepare(`
191
+ INSERT OR REPLACE INTO wallet_providers (walletId, providerType, providerData, createdAt, lastUsed)
192
+ VALUES (?, ?, ?, datetime('now'), datetime('now'))
193
+ `).run(walletId, 'handcash', JSON.stringify(data));
194
+ }
195
+ updateProviderMetadata(walletId, data) {
196
+ const db = (0, db_1.getDb)();
197
+ db.prepare(`
198
+ UPDATE wallet_providers
199
+ SET providerData = ?, lastUsed = datetime('now')
200
+ WHERE walletId = ?
201
+ `).run(JSON.stringify(data), walletId);
202
+ }
203
+ getProviderMetadata(walletId) {
204
+ const db = (0, db_1.getDb)();
205
+ return db.prepare('SELECT * FROM wallet_providers WHERE walletId = ? AND providerType = ?')
206
+ .get(walletId, 'handcash');
207
+ }
208
+ updateLastUsed(walletId) {
209
+ const db = (0, db_1.getDb)();
210
+ db.prepare(`UPDATE wallet_providers SET lastUsed = datetime('now') WHERE walletId = ?`).run(walletId);
211
+ }
212
+ }
213
+ exports.HandCashWalletProvider = HandCashWalletProvider;
214
+ //# sourceMappingURL=handcash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handcash.js","sourceRoot":"","sources":["../../../src/wallet/providers/handcash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Internal Wallet Provider
3
+ */
4
+ import type { WalletProvider, WalletConnection, SignedTransaction, TransactionRequest, InternalConnectParams } from './types';
5
+ export declare class InternalWalletProvider implements WalletProvider {
6
+ type: "internal";
7
+ connect(params?: InternalConnectParams): Promise<WalletConnection>;
8
+ getBalance(walletId: string): Promise<number>;
9
+ signTransaction(walletId: string, txReq: TransactionRequest): Promise<SignedTransaction>;
10
+ getAddress(walletId: string): Promise<string>;
11
+ disconnect(_walletId: string): Promise<void>;
12
+ private getInternalBalance;
13
+ private storeProviderMetadata;
14
+ }
15
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/wallet/providers/internal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAGhB,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,IAAI,EAAG,UAAU,CAAS;IAEpB,OAAO,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyClE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB7C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6ExF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,qBAAqB;CAkB9B"}