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.
- package/.env.example +40 -0
- package/README.md +35 -4
- package/VERIFICATION_SUMMARY.txt +151 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +530 -74
- package/dist/api/server.js.map +1 -1
- package/dist/bsv/crypto.d.ts +65 -0
- package/dist/bsv/crypto.d.ts.map +1 -0
- package/dist/bsv/crypto.js +158 -0
- package/dist/bsv/crypto.js.map +1 -0
- package/dist/bsv/mnee.d.ts +88 -0
- package/dist/bsv/mnee.d.ts.map +1 -0
- package/dist/bsv/mnee.js +173 -0
- package/dist/bsv/mnee.js.map +1 -0
- package/dist/bsv/opreturn.d.ts +22 -0
- package/dist/bsv/opreturn.d.ts.map +1 -0
- package/dist/bsv/opreturn.js +117 -0
- package/dist/bsv/opreturn.js.map +1 -0
- package/dist/bsv/whatsonchain.d.ts +46 -0
- package/dist/bsv/whatsonchain.d.ts.map +1 -0
- package/dist/bsv/whatsonchain.js +98 -0
- package/dist/bsv/whatsonchain.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +85 -0
- package/dist/config.js.map +1 -0
- package/dist/currency/currency.d.ts +70 -0
- package/dist/currency/currency.d.ts.map +1 -0
- package/dist/currency/currency.js +137 -0
- package/dist/currency/currency.js.map +1 -0
- package/dist/disputes/dispute.d.ts +50 -0
- package/dist/disputes/dispute.d.ts.map +1 -0
- package/dist/disputes/dispute.js +162 -0
- package/dist/disputes/dispute.js.map +1 -0
- package/dist/docs/openapi.yaml +1079 -0
- package/dist/docs/swagger.d.ts +12 -0
- package/dist/docs/swagger.d.ts.map +1 -0
- package/dist/docs/swagger.js +104 -0
- package/dist/docs/swagger.js.map +1 -0
- package/dist/middleware/auth.d.ts +20 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +32 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +25 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -0
- package/dist/middleware/rateLimit.js +61 -0
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/payment/payment.d.ts +79 -9
- package/dist/payment/payment.d.ts.map +1 -1
- package/dist/payment/payment.js +387 -47
- package/dist/payment/payment.js.map +1 -1
- package/dist/registry/db.d.ts.map +1 -1
- package/dist/registry/db.js +110 -3
- package/dist/registry/db.js.map +1 -1
- package/dist/registry/registry.d.ts +1 -1
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +12 -4
- package/dist/registry/registry.js.map +1 -1
- package/dist/types/index.d.ts +34 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/validation.d.ts +27 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +164 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/verification/receipt.d.ts +42 -0
- package/dist/verification/receipt.d.ts.map +1 -0
- package/dist/verification/receipt.js +10 -0
- package/dist/verification/receipt.js.map +1 -0
- package/dist/verification/verification.d.ts +41 -0
- package/dist/verification/verification.d.ts.map +1 -0
- package/dist/verification/verification.js +217 -0
- package/dist/verification/verification.js.map +1 -0
- package/dist/wallet/providerManager.d.ts +32 -0
- package/dist/wallet/providerManager.d.ts.map +1 -0
- package/dist/wallet/providerManager.js +118 -0
- package/dist/wallet/providerManager.js.map +1 -0
- package/dist/wallet/providers/handcash.d.ts +22 -0
- package/dist/wallet/providers/handcash.d.ts.map +1 -0
- package/dist/wallet/providers/handcash.js +214 -0
- package/dist/wallet/providers/handcash.js.map +1 -0
- package/dist/wallet/providers/internal.d.ts +15 -0
- package/dist/wallet/providers/internal.d.ts.map +1 -0
- package/dist/wallet/providers/internal.js +208 -0
- package/dist/wallet/providers/internal.js.map +1 -0
- package/dist/wallet/providers/types.d.ts +50 -0
- package/dist/wallet/providers/types.d.ts.map +1 -0
- package/dist/wallet/providers/types.js +6 -0
- package/dist/wallet/providers/types.js.map +1 -0
- package/dist/wallet/providers/yours.d.ts +18 -0
- package/dist/wallet/providers/yours.d.ts.map +1 -0
- package/dist/wallet/providers/yours.js +122 -0
- package/dist/wallet/providers/yours.js.map +1 -0
- package/dist/wallet/wallet.d.ts +52 -5
- package/dist/wallet/wallet.d.ts.map +1 -1
- package/dist/wallet/wallet.js +223 -34
- package/dist/wallet/wallet.js.map +1 -1
- package/dist/webhooks/delivery.d.ts +37 -0
- package/dist/webhooks/delivery.d.ts.map +1 -0
- package/dist/webhooks/delivery.js +182 -0
- package/dist/webhooks/delivery.js.map +1 -0
- package/dist/webhooks/webhook.d.ts +85 -0
- package/dist/webhooks/webhook.d.ts.map +1 -0
- package/dist/webhooks/webhook.js +271 -0
- package/dist/webhooks/webhook.js.map +1 -0
- package/package.json +74 -54
- package/sdk-python/LICENSE +21 -0
- package/sdk-python/MANIFEST.in +9 -0
- package/sdk-python/README.md +372 -0
- package/sdk-python/agentspay/__init__.py +97 -0
- package/sdk-python/agentspay/client.py +256 -0
- package/sdk-python/agentspay/disputes.py +174 -0
- package/sdk-python/agentspay/exceptions.py +53 -0
- package/sdk-python/agentspay/payments.py +169 -0
- package/sdk-python/agentspay/services.py +198 -0
- package/sdk-python/agentspay/types.py +154 -0
- package/sdk-python/agentspay/wallet.py +113 -0
- package/sdk-python/agentspay/webhooks.py +195 -0
- package/sdk-python/examples/consumer.py +147 -0
- package/sdk-python/examples/provider.py +116 -0
- package/sdk-python/pyproject.toml +61 -0
- package/sdk-python/setup.py +53 -0
- package/sdk-python/tests/test_client.py +221 -0
- package/test-addr.js +29 -0
- package/test-mnee-simple.js +51 -0
- package/test-mnee.js +47 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Internal Wallet Provider
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.InternalWalletProvider = void 0;
|
|
40
|
+
const uuid_1 = require("uuid");
|
|
41
|
+
const db_1 = require("../../registry/db");
|
|
42
|
+
const crypto_1 = require("../../bsv/crypto");
|
|
43
|
+
const whatsonchain_1 = require("../../bsv/whatsonchain");
|
|
44
|
+
const config_1 = require("../../config");
|
|
45
|
+
const sdk_1 = require("@bsv/sdk");
|
|
46
|
+
class InternalWalletProvider {
|
|
47
|
+
type = 'internal';
|
|
48
|
+
async connect(params) {
|
|
49
|
+
const db = (0, db_1.getDb)();
|
|
50
|
+
const id = (0, uuid_1.v4)();
|
|
51
|
+
let privKey;
|
|
52
|
+
let privateKeyWif;
|
|
53
|
+
if (params?.privateKeyWif) {
|
|
54
|
+
privateKeyWif = params.privateKeyWif;
|
|
55
|
+
privKey = (0, crypto_1.privateKeyFromWif)(privateKeyWif);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
privKey = (0, crypto_1.generatePrivateKey)();
|
|
59
|
+
privateKeyWif = privKey.toWif();
|
|
60
|
+
}
|
|
61
|
+
const publicKey = (0, crypto_1.getPublicKeyHex)(privKey);
|
|
62
|
+
const address = (0, crypto_1.deriveAddress)(privKey);
|
|
63
|
+
const existing = db.prepare('SELECT id, address, publicKey FROM wallets WHERE address = ?').get(address);
|
|
64
|
+
if (existing) {
|
|
65
|
+
return {
|
|
66
|
+
walletId: existing.id,
|
|
67
|
+
address: existing.address,
|
|
68
|
+
publicKey: existing.publicKey,
|
|
69
|
+
providerType: 'internal',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const encryptedPrivKey = (0, crypto_1.encryptPrivateKey)(privateKeyWif);
|
|
73
|
+
const createdAt = new Date().toISOString();
|
|
74
|
+
db.prepare(`
|
|
75
|
+
INSERT INTO wallets (id, publicKey, address, privateKey, createdAt)
|
|
76
|
+
VALUES (?, ?, ?, ?, ?)
|
|
77
|
+
`).run(id, publicKey, address, encryptedPrivKey, createdAt);
|
|
78
|
+
this.storeProviderMetadata(id, {});
|
|
79
|
+
return { walletId: id, address, publicKey, providerType: 'internal' };
|
|
80
|
+
}
|
|
81
|
+
async getBalance(walletId) {
|
|
82
|
+
const db = (0, db_1.getDb)();
|
|
83
|
+
const wallet = db.prepare('SELECT address FROM wallets WHERE id = ?').get(walletId);
|
|
84
|
+
if (!wallet)
|
|
85
|
+
throw new Error('Wallet not found');
|
|
86
|
+
if (config_1.config.demoMode) {
|
|
87
|
+
return this.getInternalBalance(walletId);
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const balance = await (0, whatsonchain_1.getBalance)(wallet.address);
|
|
91
|
+
return balance.confirmed + balance.unconfirmed;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error(`Failed to fetch balance for ${wallet.address}:`, error);
|
|
95
|
+
return this.getInternalBalance(walletId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async signTransaction(walletId, txReq) {
|
|
99
|
+
const db = (0, db_1.getDb)();
|
|
100
|
+
const row = db.prepare('SELECT privateKey, address FROM wallets WHERE id = ?').get(walletId);
|
|
101
|
+
if (!row || !row.privateKey)
|
|
102
|
+
throw new Error('Wallet not found or no private key');
|
|
103
|
+
const privateKeyWif = (0, crypto_1.decryptPrivateKey)(row.privateKey);
|
|
104
|
+
const privKey = (0, crypto_1.privateKeyFromWif)(privateKeyWif);
|
|
105
|
+
const { getUtxos } = await Promise.resolve().then(() => __importStar(require('../../bsv/whatsonchain')));
|
|
106
|
+
const utxos = await getUtxos(row.address);
|
|
107
|
+
if (utxos.length === 0) {
|
|
108
|
+
throw new Error('No UTXOs available');
|
|
109
|
+
}
|
|
110
|
+
const tx = new sdk_1.Transaction();
|
|
111
|
+
const totalOut = txReq.recipients.reduce((sum, r) => sum + r.amount, 0);
|
|
112
|
+
const estimatedFee = 200;
|
|
113
|
+
let totalIn = 0;
|
|
114
|
+
for (const utxo of utxos) {
|
|
115
|
+
if (totalIn >= totalOut + estimatedFee)
|
|
116
|
+
break;
|
|
117
|
+
tx.addInput({
|
|
118
|
+
sourceTXID: utxo.tx_hash,
|
|
119
|
+
sourceOutputIndex: utxo.tx_pos,
|
|
120
|
+
unlockingScriptTemplate: new sdk_1.P2PKH().unlock(privKey),
|
|
121
|
+
sequence: 0xffffffff,
|
|
122
|
+
});
|
|
123
|
+
totalIn += utxo.value;
|
|
124
|
+
}
|
|
125
|
+
if (totalIn < totalOut + estimatedFee) {
|
|
126
|
+
throw new Error(`Insufficient funds: need ${totalOut + estimatedFee}, have ${totalIn}`);
|
|
127
|
+
}
|
|
128
|
+
for (const recipient of txReq.recipients) {
|
|
129
|
+
tx.addOutput({
|
|
130
|
+
lockingScript: new sdk_1.P2PKH().lock(recipient.address),
|
|
131
|
+
change: false,
|
|
132
|
+
satoshis: recipient.amount,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (txReq.data && txReq.data.length > 0) {
|
|
136
|
+
const opReturnParts = ['OP_FALSE', 'OP_RETURN', ...txReq.data.map(d => `0x${Buffer.from(d).toString('hex')}`)];
|
|
137
|
+
const opReturnScript = sdk_1.LockingScript.fromASM(opReturnParts.join(' '));
|
|
138
|
+
tx.addOutput({
|
|
139
|
+
lockingScript: opReturnScript,
|
|
140
|
+
change: false,
|
|
141
|
+
satoshis: 0,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const changeAddress = txReq.changeAddress || row.address;
|
|
145
|
+
const actualFee = Math.ceil(tx.toBinary().length * config_1.config.feePerByte);
|
|
146
|
+
const changeAmount = totalIn - totalOut - actualFee;
|
|
147
|
+
if (changeAmount > 546) {
|
|
148
|
+
tx.addOutput({
|
|
149
|
+
lockingScript: new sdk_1.P2PKH().lock(changeAddress),
|
|
150
|
+
change: true,
|
|
151
|
+
satoshis: changeAmount,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
await tx.fee();
|
|
155
|
+
await tx.sign();
|
|
156
|
+
const txHex = tx.toHex();
|
|
157
|
+
const txId = tx.id('hex');
|
|
158
|
+
return { txHex, txId };
|
|
159
|
+
}
|
|
160
|
+
async getAddress(walletId) {
|
|
161
|
+
const db = (0, db_1.getDb)();
|
|
162
|
+
const row = db.prepare('SELECT address FROM wallets WHERE id = ?').get(walletId);
|
|
163
|
+
if (!row)
|
|
164
|
+
throw new Error('Wallet not found');
|
|
165
|
+
return row.address;
|
|
166
|
+
}
|
|
167
|
+
async disconnect(_walletId) {
|
|
168
|
+
// Nothing to disconnect
|
|
169
|
+
}
|
|
170
|
+
getInternalBalance(walletId) {
|
|
171
|
+
const db = (0, db_1.getDb)();
|
|
172
|
+
let deposits = 0;
|
|
173
|
+
try {
|
|
174
|
+
const dep = db.prepare(`SELECT COALESCE(SUM(amount), 0) as total FROM deposits WHERE walletId = ?`).get(walletId);
|
|
175
|
+
deposits = dep?.total || 0;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
/* table may not exist yet */
|
|
179
|
+
}
|
|
180
|
+
const received = db.prepare(`
|
|
181
|
+
SELECT COALESCE(SUM(amount - platformFee), 0) as total
|
|
182
|
+
FROM payments WHERE sellerWalletId = ? AND status = 'released'
|
|
183
|
+
`).get(walletId);
|
|
184
|
+
const sent = db.prepare(`
|
|
185
|
+
SELECT COALESCE(SUM(amount), 0) as total
|
|
186
|
+
FROM payments WHERE buyerWalletId = ? AND status IN ('released', 'escrowed')
|
|
187
|
+
`).get(walletId);
|
|
188
|
+
return deposits + (received?.total || 0) - (sent?.total || 0);
|
|
189
|
+
}
|
|
190
|
+
storeProviderMetadata(walletId, data) {
|
|
191
|
+
const db = (0, db_1.getDb)();
|
|
192
|
+
db.exec(`
|
|
193
|
+
CREATE TABLE IF NOT EXISTS wallet_providers (
|
|
194
|
+
walletId TEXT PRIMARY KEY,
|
|
195
|
+
providerType TEXT NOT NULL,
|
|
196
|
+
providerData TEXT NOT NULL,
|
|
197
|
+
createdAt TEXT NOT NULL,
|
|
198
|
+
lastUsed TEXT
|
|
199
|
+
)
|
|
200
|
+
`);
|
|
201
|
+
db.prepare(`
|
|
202
|
+
INSERT OR REPLACE INTO wallet_providers (walletId, providerType, providerData, createdAt, lastUsed)
|
|
203
|
+
VALUES (?, ?, ?, datetime('now'), datetime('now'))
|
|
204
|
+
`).run(walletId, 'internal', JSON.stringify(data));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.InternalWalletProvider = InternalWalletProvider;
|
|
208
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/wallet/providers/internal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Provider Types
|
|
3
|
+
*/
|
|
4
|
+
export type WalletProviderType = 'internal' | 'handcash' | 'yours';
|
|
5
|
+
export interface WalletConnection {
|
|
6
|
+
walletId: string;
|
|
7
|
+
address: string;
|
|
8
|
+
publicKey?: string;
|
|
9
|
+
paymail?: string;
|
|
10
|
+
displayName?: string;
|
|
11
|
+
providerType: WalletProviderType;
|
|
12
|
+
}
|
|
13
|
+
export interface SignedTransaction {
|
|
14
|
+
txHex: string;
|
|
15
|
+
txId: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TransactionRequest {
|
|
18
|
+
recipients: Array<{
|
|
19
|
+
address: string;
|
|
20
|
+
amount: number;
|
|
21
|
+
}>;
|
|
22
|
+
changeAddress?: string;
|
|
23
|
+
data?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface WalletProvider {
|
|
26
|
+
type: WalletProviderType;
|
|
27
|
+
connect(params?: any): Promise<WalletConnection>;
|
|
28
|
+
getBalance(walletId: string): Promise<number>;
|
|
29
|
+
signTransaction(walletId: string, tx: TransactionRequest): Promise<SignedTransaction>;
|
|
30
|
+
getAddress(walletId: string): Promise<string>;
|
|
31
|
+
disconnect(walletId: string): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export interface HandCashConnectParams {
|
|
34
|
+
authToken: string;
|
|
35
|
+
}
|
|
36
|
+
export interface YoursConnectParams {
|
|
37
|
+
address: string;
|
|
38
|
+
publicKey: string;
|
|
39
|
+
}
|
|
40
|
+
export interface InternalConnectParams {
|
|
41
|
+
privateKeyWif?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface WalletProviderMetadata {
|
|
44
|
+
walletId: string;
|
|
45
|
+
providerType: WalletProviderType;
|
|
46
|
+
providerData: string;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
lastUsed?: string;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/wallet/providers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAA;AAElE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,KAAK,CAAC;QAChB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;IACF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAA;IACxB,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAChD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACrF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/wallet/providers/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yours Wallet Provider
|
|
3
|
+
*/
|
|
4
|
+
import type { WalletProvider, WalletConnection, SignedTransaction, TransactionRequest, YoursConnectParams } from './types';
|
|
5
|
+
export declare class YoursWalletProvider implements WalletProvider {
|
|
6
|
+
type: "yours";
|
|
7
|
+
connect(params?: YoursConnectParams): Promise<WalletConnection>;
|
|
8
|
+
getBalance(walletId: string): Promise<number>;
|
|
9
|
+
signTransaction(_walletId: string, _txReq: TransactionRequest): Promise<SignedTransaction>;
|
|
10
|
+
prepareTransaction(walletId: string, txReq: TransactionRequest): TransactionRequest;
|
|
11
|
+
submitSignedTransaction(walletId: string, signedTx: SignedTransaction): Promise<SignedTransaction>;
|
|
12
|
+
getAddress(walletId: string): Promise<string>;
|
|
13
|
+
disconnect(walletId: string): Promise<void>;
|
|
14
|
+
private storeProviderMetadata;
|
|
15
|
+
private updateProviderMetadata;
|
|
16
|
+
private updateLastUsed;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=yours.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yours.d.ts","sourceRoot":"","sources":["../../../src/wallet/providers/yours.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAEhB,qBAAa,mBAAoB,YAAW,cAAc;IACxD,IAAI,EAAG,OAAO,CAAS;IAEjB,OAAO,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyC/D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB7C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQhG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,kBAAkB;IAQ7E,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAUlG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO7C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,cAAc;CAIvB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Yours Wallet Provider
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.YoursWalletProvider = void 0;
|
|
7
|
+
const uuid_1 = require("uuid");
|
|
8
|
+
const db_1 = require("../../registry/db");
|
|
9
|
+
const config_1 = require("../../config");
|
|
10
|
+
const whatsonchain_1 = require("../../bsv/whatsonchain");
|
|
11
|
+
class YoursWalletProvider {
|
|
12
|
+
type = 'yours';
|
|
13
|
+
async connect(params) {
|
|
14
|
+
if (!params?.address || !params?.publicKey) {
|
|
15
|
+
throw new Error('Yours wallet address and public key required');
|
|
16
|
+
}
|
|
17
|
+
const db = (0, db_1.getDb)();
|
|
18
|
+
const { address, publicKey } = params;
|
|
19
|
+
const existing = db.prepare('SELECT id FROM wallets WHERE address = ?').get(address);
|
|
20
|
+
if (existing) {
|
|
21
|
+
this.updateProviderMetadata(existing.id, { publicKey });
|
|
22
|
+
return {
|
|
23
|
+
walletId: existing.id,
|
|
24
|
+
address,
|
|
25
|
+
publicKey,
|
|
26
|
+
displayName: 'Yours Wallet',
|
|
27
|
+
providerType: 'yours',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const id = (0, uuid_1.v4)();
|
|
31
|
+
const createdAt = new Date().toISOString();
|
|
32
|
+
db.prepare(`
|
|
33
|
+
INSERT INTO wallets (id, publicKey, address, privateKey, createdAt)
|
|
34
|
+
VALUES (?, ?, ?, ?, ?)
|
|
35
|
+
`).run(id, publicKey, address, '', createdAt);
|
|
36
|
+
this.storeProviderMetadata(id, { publicKey });
|
|
37
|
+
return {
|
|
38
|
+
walletId: id,
|
|
39
|
+
address,
|
|
40
|
+
publicKey,
|
|
41
|
+
displayName: 'Yours Wallet',
|
|
42
|
+
providerType: 'yours',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async getBalance(walletId) {
|
|
46
|
+
const db = (0, db_1.getDb)();
|
|
47
|
+
const wallet = db.prepare('SELECT address FROM wallets WHERE id = ?').get(walletId);
|
|
48
|
+
if (!wallet)
|
|
49
|
+
throw new Error('Wallet not found');
|
|
50
|
+
if (config_1.config.demoMode) {
|
|
51
|
+
return 100000;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const balance = await (0, whatsonchain_1.getBalance)(wallet.address);
|
|
55
|
+
return balance.confirmed + balance.unconfirmed;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error(`Failed to fetch balance: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async signTransaction(_walletId, _txReq) {
|
|
62
|
+
throw new Error('Yours wallet signing must happen client-side. ' +
|
|
63
|
+
'Use prepareTransaction() to get transaction data, ' +
|
|
64
|
+
'then sign via browser extension and submit with submitSignedTransaction().');
|
|
65
|
+
}
|
|
66
|
+
prepareTransaction(walletId, txReq) {
|
|
67
|
+
const db = (0, db_1.getDb)();
|
|
68
|
+
const wallet = db.prepare('SELECT address FROM wallets WHERE id = ?').get(walletId);
|
|
69
|
+
if (!wallet)
|
|
70
|
+
throw new Error('Wallet not found');
|
|
71
|
+
return txReq;
|
|
72
|
+
}
|
|
73
|
+
async submitSignedTransaction(walletId, signedTx) {
|
|
74
|
+
const db = (0, db_1.getDb)();
|
|
75
|
+
const wallet = db.prepare('SELECT address FROM wallets WHERE id = ?').get(walletId);
|
|
76
|
+
if (!wallet)
|
|
77
|
+
throw new Error('Wallet not found');
|
|
78
|
+
this.updateLastUsed(walletId);
|
|
79
|
+
return signedTx;
|
|
80
|
+
}
|
|
81
|
+
async getAddress(walletId) {
|
|
82
|
+
const db = (0, db_1.getDb)();
|
|
83
|
+
const row = db.prepare('SELECT address FROM wallets WHERE id = ?').get(walletId);
|
|
84
|
+
if (!row)
|
|
85
|
+
throw new Error('Wallet not found');
|
|
86
|
+
return row.address;
|
|
87
|
+
}
|
|
88
|
+
async disconnect(walletId) {
|
|
89
|
+
const db = (0, db_1.getDb)();
|
|
90
|
+
db.prepare('DELETE FROM wallet_providers WHERE walletId = ?').run(walletId);
|
|
91
|
+
}
|
|
92
|
+
storeProviderMetadata(walletId, data) {
|
|
93
|
+
const db = (0, db_1.getDb)();
|
|
94
|
+
db.exec(`
|
|
95
|
+
CREATE TABLE IF NOT EXISTS wallet_providers (
|
|
96
|
+
walletId TEXT PRIMARY KEY,
|
|
97
|
+
providerType TEXT NOT NULL,
|
|
98
|
+
providerData TEXT NOT NULL,
|
|
99
|
+
createdAt TEXT NOT NULL,
|
|
100
|
+
lastUsed TEXT
|
|
101
|
+
)
|
|
102
|
+
`);
|
|
103
|
+
db.prepare(`
|
|
104
|
+
INSERT OR REPLACE INTO wallet_providers (walletId, providerType, providerData, createdAt, lastUsed)
|
|
105
|
+
VALUES (?, ?, ?, datetime('now'), datetime('now'))
|
|
106
|
+
`).run(walletId, 'yours', JSON.stringify(data));
|
|
107
|
+
}
|
|
108
|
+
updateProviderMetadata(walletId, data) {
|
|
109
|
+
const db = (0, db_1.getDb)();
|
|
110
|
+
db.prepare(`
|
|
111
|
+
UPDATE wallet_providers
|
|
112
|
+
SET providerData = ?, lastUsed = datetime('now')
|
|
113
|
+
WHERE walletId = ?
|
|
114
|
+
`).run(JSON.stringify(data), walletId);
|
|
115
|
+
}
|
|
116
|
+
updateLastUsed(walletId) {
|
|
117
|
+
const db = (0, db_1.getDb)();
|
|
118
|
+
db.prepare(`UPDATE wallet_providers SET lastUsed = datetime('now') WHERE walletId = ?`).run(walletId);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.YoursWalletProvider = YoursWalletProvider;
|
|
122
|
+
//# sourceMappingURL=yours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yours.js","sourceRoot":"","sources":["../../../src/wallet/providers/yours.ts"],"names":[],"mappings":"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"}
|
package/dist/wallet/wallet.d.ts
CHANGED
|
@@ -1,19 +1,66 @@
|
|
|
1
1
|
import type { AgentWallet } from '../types';
|
|
2
|
+
import type { UTXO } from '../bsv/crypto';
|
|
2
3
|
/**
|
|
3
4
|
* BSV Wallet Manager
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
* TODO: Integrate @bsv/sdk for real BSV key pairs and transaction signing.
|
|
7
|
-
* For now we generate deterministic-looking keys to build the full flow,
|
|
8
|
-
* then swap in real BSV crypto before mainnet.
|
|
6
|
+
* Manages real BSV wallets with on-chain balance tracking.
|
|
9
7
|
*/
|
|
10
8
|
export declare class WalletManager {
|
|
9
|
+
private hashApiKey;
|
|
10
|
+
/**
|
|
11
|
+
* Generate a new API key for wallet auth.
|
|
12
|
+
* Returned ONLY on creation/rotation; stored hashed in DB.
|
|
13
|
+
*/
|
|
14
|
+
generateApiKey(): string;
|
|
15
|
+
setApiKey(walletId: string, apiKey: string): void;
|
|
16
|
+
verifyApiKey(walletId: string, apiKey: string): boolean;
|
|
17
|
+
getByApiKey(apiKey: string): AgentWallet | null;
|
|
18
|
+
/**
|
|
19
|
+
* Create a new agent wallet with real BSV keys
|
|
20
|
+
*/
|
|
11
21
|
create(): AgentWallet & {
|
|
12
22
|
privateKey: string;
|
|
23
|
+
apiKey: string;
|
|
13
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Import wallet from WIF private key
|
|
27
|
+
*/
|
|
28
|
+
importFromWif(wif: string): AgentWallet;
|
|
29
|
+
/**
|
|
30
|
+
* Get wallet by ID
|
|
31
|
+
*/
|
|
14
32
|
getById(id: string): AgentWallet | null;
|
|
33
|
+
/**
|
|
34
|
+
* Get wallet by address
|
|
35
|
+
*/
|
|
15
36
|
getByAddress(address: string): AgentWallet | null;
|
|
37
|
+
/**
|
|
38
|
+
* Get encrypted private key (internal use only)
|
|
39
|
+
*/
|
|
40
|
+
getPrivateKey(walletId: string): string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Get balance from BSV blockchain via WhatsOnChain
|
|
43
|
+
*/
|
|
16
44
|
getBalance(walletId: string): Promise<number>;
|
|
17
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Get UTXOs for a wallet
|
|
47
|
+
*/
|
|
48
|
+
getUtxos(walletId: string): Promise<UTXO[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Get transaction history for a wallet
|
|
51
|
+
*/
|
|
52
|
+
getTxHistory(walletId: string): Promise<any[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Internal balance (fallback/legacy for testing)
|
|
55
|
+
*/
|
|
56
|
+
private getInternalBalance;
|
|
57
|
+
/**
|
|
58
|
+
* Sync UTXOs to local cache
|
|
59
|
+
*/
|
|
60
|
+
private syncUtxos;
|
|
61
|
+
/**
|
|
62
|
+
* Get cached UTXOs from local database
|
|
63
|
+
*/
|
|
64
|
+
private getCachedUtxos;
|
|
18
65
|
}
|
|
19
66
|
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/wallet/wallet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/wallet/wallet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAY3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEzC;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACH,cAAc,IAAI,MAAM;IAIxB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKjD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAOvD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO/C;;OAEG;IACH,MAAM,IAAI,WAAW,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IA8B9D;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IA4BvC;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAMvC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAMjD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAO9C;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBnD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAyBjD;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAapD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,OAAO,CAAC,cAAc;CAUvB"}
|