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
package/dist/wallet/wallet.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -7,74 +40,230 @@ exports.WalletManager = void 0;
|
|
|
7
40
|
const uuid_1 = require("uuid");
|
|
8
41
|
const crypto_1 = __importDefault(require("crypto"));
|
|
9
42
|
const db_1 = require("../registry/db");
|
|
43
|
+
const crypto_2 = require("../bsv/crypto");
|
|
44
|
+
const whatsonchain_1 = require("../bsv/whatsonchain");
|
|
45
|
+
const config_1 = require("../config");
|
|
10
46
|
/**
|
|
11
47
|
* BSV Wallet Manager
|
|
12
48
|
*
|
|
13
|
-
*
|
|
14
|
-
* TODO: Integrate @bsv/sdk for real BSV key pairs and transaction signing.
|
|
15
|
-
* For now we generate deterministic-looking keys to build the full flow,
|
|
16
|
-
* then swap in real BSV crypto before mainnet.
|
|
49
|
+
* Manages real BSV wallets with on-chain balance tracking.
|
|
17
50
|
*/
|
|
18
51
|
class WalletManager {
|
|
19
|
-
|
|
52
|
+
hashApiKey(apiKey) {
|
|
53
|
+
return crypto_1.default.createHash('sha256').update(apiKey).digest('hex');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Generate a new API key for wallet auth.
|
|
57
|
+
* Returned ONLY on creation/rotation; stored hashed in DB.
|
|
58
|
+
*/
|
|
59
|
+
generateApiKey() {
|
|
60
|
+
return crypto_1.default.randomBytes(32).toString('hex');
|
|
61
|
+
}
|
|
62
|
+
setApiKey(walletId, apiKey) {
|
|
63
|
+
const db = (0, db_1.getDb)();
|
|
64
|
+
db.prepare('UPDATE wallets SET apiKeyHash = ? WHERE id = ?').run(this.hashApiKey(apiKey), walletId);
|
|
65
|
+
}
|
|
66
|
+
verifyApiKey(walletId, apiKey) {
|
|
67
|
+
const db = (0, db_1.getDb)();
|
|
68
|
+
const row = db.prepare('SELECT apiKeyHash FROM wallets WHERE id = ?').get(walletId);
|
|
69
|
+
if (!row?.apiKeyHash)
|
|
70
|
+
return false;
|
|
71
|
+
return row.apiKeyHash === this.hashApiKey(apiKey);
|
|
72
|
+
}
|
|
73
|
+
getByApiKey(apiKey) {
|
|
74
|
+
const db = (0, db_1.getDb)();
|
|
75
|
+
const hash = this.hashApiKey(apiKey);
|
|
76
|
+
const row = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE apiKeyHash = ?').get(hash);
|
|
77
|
+
return row || null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create a new agent wallet with real BSV keys
|
|
81
|
+
*/
|
|
20
82
|
create() {
|
|
21
83
|
const db = (0, db_1.getDb)();
|
|
22
84
|
const id = (0, uuid_1.v4)();
|
|
23
|
-
|
|
24
|
-
const
|
|
85
|
+
const privKey = (0, crypto_2.generatePrivateKey)();
|
|
86
|
+
const privateKeyWif = privKey.toWif();
|
|
87
|
+
const publicKey = (0, crypto_2.getPublicKeyHex)(privKey);
|
|
88
|
+
const address = (0, crypto_2.deriveAddress)(privKey);
|
|
89
|
+
const encryptedPrivKey = (0, crypto_2.encryptPrivateKey)(privateKeyWif);
|
|
90
|
+
const apiKey = this.generateApiKey();
|
|
91
|
+
const apiKeyHash = this.hashApiKey(apiKey);
|
|
92
|
+
const createdAt = new Date().toISOString();
|
|
25
93
|
db.prepare(`
|
|
26
|
-
INSERT INTO wallets (id, publicKey, address, createdAt)
|
|
27
|
-
VALUES (?, ?, ?, ?)
|
|
28
|
-
`).run(id,
|
|
94
|
+
INSERT INTO wallets (id, publicKey, address, privateKey, apiKeyHash, createdAt)
|
|
95
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
96
|
+
`).run(id, publicKey, address, encryptedPrivKey, apiKeyHash, createdAt);
|
|
29
97
|
return {
|
|
30
98
|
id,
|
|
31
|
-
publicKey
|
|
32
|
-
address
|
|
33
|
-
createdAt
|
|
34
|
-
privateKey:
|
|
99
|
+
publicKey,
|
|
100
|
+
address,
|
|
101
|
+
createdAt,
|
|
102
|
+
privateKey: privateKeyWif, // Only returned on creation.
|
|
103
|
+
apiKey, // Only returned on creation.
|
|
35
104
|
};
|
|
36
105
|
}
|
|
37
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Import wallet from WIF private key
|
|
108
|
+
*/
|
|
109
|
+
importFromWif(wif) {
|
|
110
|
+
const db = (0, db_1.getDb)();
|
|
111
|
+
const id = (0, uuid_1.v4)();
|
|
112
|
+
const privKey = (0, crypto_2.privateKeyFromWif)(wif);
|
|
113
|
+
const publicKey = (0, crypto_2.getPublicKeyHex)(privKey);
|
|
114
|
+
const address = (0, crypto_2.deriveAddress)(privKey);
|
|
115
|
+
const encryptedPrivKey = (0, crypto_2.encryptPrivateKey)(wif);
|
|
116
|
+
const existing = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE address = ?').get(address);
|
|
117
|
+
if (existing)
|
|
118
|
+
return existing;
|
|
119
|
+
const createdAt = new Date().toISOString();
|
|
120
|
+
db.prepare('INSERT INTO wallets (id, publicKey, address, privateKey, createdAt) VALUES (?, ?, ?, ?, ?)').run(id, publicKey, address, encryptedPrivKey, createdAt);
|
|
121
|
+
// Create an API key for the imported wallet (not returned here).
|
|
122
|
+
const apiKey = this.generateApiKey();
|
|
123
|
+
this.setApiKey(id, apiKey);
|
|
124
|
+
return { id, publicKey, address, createdAt };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get wallet by ID
|
|
128
|
+
*/
|
|
38
129
|
getById(id) {
|
|
39
130
|
const db = (0, db_1.getDb)();
|
|
40
|
-
const row = db.prepare('SELECT
|
|
131
|
+
const row = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE id = ?').get(id);
|
|
41
132
|
return row || null;
|
|
42
133
|
}
|
|
43
|
-
|
|
134
|
+
/**
|
|
135
|
+
* Get wallet by address
|
|
136
|
+
*/
|
|
44
137
|
getByAddress(address) {
|
|
45
138
|
const db = (0, db_1.getDb)();
|
|
46
|
-
const row = db.prepare('SELECT
|
|
139
|
+
const row = db.prepare('SELECT id, publicKey, address, createdAt FROM wallets WHERE address = ?').get(address);
|
|
47
140
|
return row || null;
|
|
48
141
|
}
|
|
49
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Get encrypted private key (internal use only)
|
|
144
|
+
*/
|
|
145
|
+
getPrivateKey(walletId) {
|
|
146
|
+
const db = (0, db_1.getDb)();
|
|
147
|
+
const row = db.prepare('SELECT privateKey FROM wallets WHERE id = ?').get(walletId);
|
|
148
|
+
if (!row || !row.privateKey)
|
|
149
|
+
return null;
|
|
150
|
+
return (0, crypto_2.decryptPrivateKey)(row.privateKey);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get balance from BSV blockchain via WhatsOnChain
|
|
154
|
+
*/
|
|
50
155
|
async getBalance(walletId) {
|
|
156
|
+
const wallet = this.getById(walletId);
|
|
157
|
+
if (!wallet)
|
|
158
|
+
return 0;
|
|
159
|
+
if (config_1.config.demoMode) {
|
|
160
|
+
return this.getInternalBalance(walletId);
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const balance = await (0, whatsonchain_1.getBalance)(wallet.address);
|
|
164
|
+
return balance.confirmed + balance.unconfirmed;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.error(`Failed to fetch balance for ${wallet.address}:`, error);
|
|
168
|
+
return this.getInternalBalance(walletId);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get UTXOs for a wallet
|
|
173
|
+
*/
|
|
174
|
+
async getUtxos(walletId) {
|
|
175
|
+
const wallet = this.getById(walletId);
|
|
176
|
+
if (!wallet)
|
|
177
|
+
return [];
|
|
178
|
+
try {
|
|
179
|
+
const wocUtxos = await (0, whatsonchain_1.getUtxos)(wallet.address);
|
|
180
|
+
// Derive locking script from address (P2PKH) to avoid per-UTXO tx lookups.
|
|
181
|
+
const script = (0, crypto_2.getScriptForAddress)(wallet.address);
|
|
182
|
+
const utxos = wocUtxos.map(w => ({
|
|
183
|
+
txid: w.tx_hash,
|
|
184
|
+
vout: w.tx_pos,
|
|
185
|
+
amount: w.value,
|
|
186
|
+
script,
|
|
187
|
+
}));
|
|
188
|
+
if (utxos.length > 0)
|
|
189
|
+
this.syncUtxos(walletId, utxos);
|
|
190
|
+
return utxos.length > 0 ? utxos : this.getCachedUtxos(walletId);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error(`Failed to fetch UTXOs for ${wallet?.address}:`, error);
|
|
194
|
+
return this.getCachedUtxos(walletId);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get transaction history for a wallet
|
|
199
|
+
*/
|
|
200
|
+
async getTxHistory(walletId) {
|
|
201
|
+
const wallet = this.getById(walletId);
|
|
202
|
+
if (!wallet)
|
|
203
|
+
return [];
|
|
204
|
+
const { getTxHistory } = await Promise.resolve().then(() => __importStar(require('../bsv/whatsonchain')));
|
|
205
|
+
try {
|
|
206
|
+
return await getTxHistory(wallet.address);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
console.error(`Failed to fetch tx history for ${wallet.address}:`, error);
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Internal balance (fallback/legacy for testing)
|
|
215
|
+
*/
|
|
216
|
+
getInternalBalance(walletId) {
|
|
51
217
|
const db = (0, db_1.getDb)();
|
|
52
|
-
// Deposits (faucet/funding)
|
|
53
218
|
let deposits = 0;
|
|
54
219
|
try {
|
|
55
220
|
const dep = db.prepare(`SELECT COALESCE(SUM(amount), 0) as total FROM deposits WHERE walletId = ?`).get(walletId);
|
|
56
221
|
deposits = dep?.total || 0;
|
|
57
222
|
}
|
|
58
|
-
catch {
|
|
59
|
-
|
|
60
|
-
|
|
223
|
+
catch {
|
|
224
|
+
/* table may not exist yet */
|
|
225
|
+
}
|
|
226
|
+
const received = db
|
|
227
|
+
.prepare(`
|
|
61
228
|
SELECT COALESCE(SUM(amount - platformFee), 0) as total
|
|
62
229
|
FROM payments WHERE sellerWalletId = ? AND status = 'released'
|
|
63
|
-
`)
|
|
64
|
-
|
|
230
|
+
`)
|
|
231
|
+
.get(walletId);
|
|
232
|
+
const sent = db
|
|
233
|
+
.prepare(`
|
|
65
234
|
SELECT COALESCE(SUM(amount), 0) as total
|
|
66
235
|
FROM payments WHERE buyerWalletId = ? AND status IN ('released', 'escrowed')
|
|
67
|
-
`)
|
|
236
|
+
`)
|
|
237
|
+
.get(walletId);
|
|
68
238
|
return deposits + (received?.total || 0) - (sent?.total || 0);
|
|
69
239
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
240
|
+
/**
|
|
241
|
+
* Sync UTXOs to local cache
|
|
242
|
+
*/
|
|
243
|
+
syncUtxos(walletId, utxos) {
|
|
244
|
+
const db = (0, db_1.getDb)();
|
|
245
|
+
db.prepare("UPDATE utxos SET spent = 1, spentAt = datetime('now') WHERE walletId = ? AND spent = 0").run(walletId);
|
|
246
|
+
const stmt = db.prepare(`
|
|
247
|
+
INSERT OR REPLACE INTO utxos (id, walletId, txid, vout, amount, script, spent, createdAt)
|
|
248
|
+
VALUES (?, ?, ?, ?, ?, ?, 0, datetime('now'))
|
|
249
|
+
`);
|
|
250
|
+
for (const utxo of utxos) {
|
|
251
|
+
const id = `${utxo.txid}:${utxo.vout}`;
|
|
252
|
+
stmt.run(id, walletId, utxo.txid, utxo.vout, utxo.amount, utxo.script);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get cached UTXOs from local database
|
|
257
|
+
*/
|
|
258
|
+
getCachedUtxos(walletId) {
|
|
259
|
+
const db = (0, db_1.getDb)();
|
|
260
|
+
const rows = db.prepare('SELECT txid, vout, amount, script FROM utxos WHERE walletId = ? AND spent = 0').all(walletId);
|
|
261
|
+
return rows.map(row => ({
|
|
262
|
+
txid: row.txid,
|
|
263
|
+
vout: row.vout,
|
|
264
|
+
amount: row.amount,
|
|
265
|
+
script: row.script,
|
|
266
|
+
}));
|
|
78
267
|
}
|
|
79
268
|
}
|
|
80
269
|
exports.WalletManager = WalletManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet/wallet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet/wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type WebhookEvent } from './webhook';
|
|
2
|
+
/**
|
|
3
|
+
* Webhook Delivery Service
|
|
4
|
+
*
|
|
5
|
+
* - Fire-and-forget delivery (doesn't block main flow)
|
|
6
|
+
* - Automatic retries with exponential backoff (3 attempts max)
|
|
7
|
+
* - HMAC-SHA256 signature verification
|
|
8
|
+
* - Idempotency keys
|
|
9
|
+
* - Audit log for all deliveries
|
|
10
|
+
*/
|
|
11
|
+
export declare class WebhookDelivery {
|
|
12
|
+
private webhookManager;
|
|
13
|
+
private retryIntervals;
|
|
14
|
+
private deliveryTimeoutMs;
|
|
15
|
+
/**
|
|
16
|
+
* Trigger a webhook event (fire-and-forget)
|
|
17
|
+
*/
|
|
18
|
+
trigger(eventType: WebhookEvent, payload: any): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Async delivery with retries (internal)
|
|
21
|
+
*/
|
|
22
|
+
private deliverAsync;
|
|
23
|
+
/**
|
|
24
|
+
* Attempt delivery with retries and exponential backoff
|
|
25
|
+
*/
|
|
26
|
+
private attemptDelivery;
|
|
27
|
+
/**
|
|
28
|
+
* Process pending deliveries (for background worker/cron)
|
|
29
|
+
*/
|
|
30
|
+
processPending(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Sanitize payload for demo mode (replace sensitive data)
|
|
33
|
+
*/
|
|
34
|
+
private sanitizePayloadForDemo;
|
|
35
|
+
}
|
|
36
|
+
export declare const webhookDelivery: WebhookDelivery;
|
|
37
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/webhooks/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7D;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,iBAAiB,CAAS;IAElC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnE;;OAEG;YACW,YAAY;IAkB1B;;OAEG;YACW,eAAe;IAuF7B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BrC;;OAEG;IACH,OAAO,CAAC,sBAAsB;CA0B/B;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAA"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.webhookDelivery = exports.WebhookDelivery = void 0;
|
|
4
|
+
const webhook_1 = require("./webhook");
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
/**
|
|
7
|
+
* Webhook Delivery Service
|
|
8
|
+
*
|
|
9
|
+
* - Fire-and-forget delivery (doesn't block main flow)
|
|
10
|
+
* - Automatic retries with exponential backoff (3 attempts max)
|
|
11
|
+
* - HMAC-SHA256 signature verification
|
|
12
|
+
* - Idempotency keys
|
|
13
|
+
* - Audit log for all deliveries
|
|
14
|
+
*/
|
|
15
|
+
class WebhookDelivery {
|
|
16
|
+
webhookManager = new webhook_1.WebhookManager();
|
|
17
|
+
retryIntervals = [0, 60_000, 300_000]; // 0s, 1min, 5min
|
|
18
|
+
deliveryTimeoutMs = 15_000; // 15s timeout per attempt
|
|
19
|
+
/**
|
|
20
|
+
* Trigger a webhook event (fire-and-forget)
|
|
21
|
+
*/
|
|
22
|
+
async trigger(eventType, payload) {
|
|
23
|
+
// Get all active webhooks subscribed to this event
|
|
24
|
+
const webhooks = this.webhookManager.getActiveWebhooksForEvent(eventType);
|
|
25
|
+
if (webhooks.length === 0) {
|
|
26
|
+
console.log(`[Webhooks] No subscribers for event: ${eventType}`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.log(`[Webhooks] Triggering event ${eventType} for ${webhooks.length} webhook(s)`);
|
|
30
|
+
// Create deliveries for all webhooks (async, don't await)
|
|
31
|
+
for (const webhook of webhooks) {
|
|
32
|
+
this.deliverAsync(webhook.id, eventType, payload).catch(err => {
|
|
33
|
+
console.error(`[Webhooks] Failed to deliver to ${webhook.id}:`, err.message);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Async delivery with retries (internal)
|
|
39
|
+
*/
|
|
40
|
+
async deliverAsync(webhookId, eventType, payload) {
|
|
41
|
+
const webhook = this.webhookManager.getById(webhookId);
|
|
42
|
+
if (!webhook || !webhook.active)
|
|
43
|
+
return;
|
|
44
|
+
// Add metadata to payload
|
|
45
|
+
const enrichedPayload = {
|
|
46
|
+
event: eventType,
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
data: config_1.config.demoMode ? this.sanitizePayloadForDemo(payload) : payload,
|
|
49
|
+
};
|
|
50
|
+
// Create delivery record
|
|
51
|
+
const delivery = this.webhookManager.createDelivery(webhookId, eventType, enrichedPayload);
|
|
52
|
+
// Attempt delivery (with retries)
|
|
53
|
+
await this.attemptDelivery(delivery.id, webhook.url, enrichedPayload, delivery.signature, delivery.idempotencyKey);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Attempt delivery with retries and exponential backoff
|
|
57
|
+
*/
|
|
58
|
+
async attemptDelivery(deliveryId, url, payload, signature, idempotencyKey, attemptNumber = 0) {
|
|
59
|
+
if (attemptNumber >= 3) {
|
|
60
|
+
this.webhookManager.updateDelivery(deliveryId, {
|
|
61
|
+
status: 'failed',
|
|
62
|
+
completedAt: new Date().toISOString(),
|
|
63
|
+
});
|
|
64
|
+
console.error(`[Webhooks] Delivery ${deliveryId} failed after 3 attempts`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const now = new Date().toISOString();
|
|
68
|
+
try {
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const timeoutId = setTimeout(() => controller.abort(), this.deliveryTimeoutMs);
|
|
71
|
+
const response = await fetch(url, {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
headers: {
|
|
74
|
+
'Content-Type': 'application/json',
|
|
75
|
+
'User-Agent': 'AgentPay-Webhooks/1.0',
|
|
76
|
+
'X-AgentPay-Signature': signature,
|
|
77
|
+
'X-AgentPay-Delivery': deliveryId,
|
|
78
|
+
'X-Idempotency-Key': idempotencyKey,
|
|
79
|
+
},
|
|
80
|
+
body: JSON.stringify(payload),
|
|
81
|
+
signal: controller.signal,
|
|
82
|
+
});
|
|
83
|
+
clearTimeout(timeoutId);
|
|
84
|
+
const responseBody = await response.text().catch(() => '');
|
|
85
|
+
if (response.ok) {
|
|
86
|
+
// Success
|
|
87
|
+
this.webhookManager.updateDelivery(deliveryId, {
|
|
88
|
+
status: 'success',
|
|
89
|
+
attempts: attemptNumber + 1,
|
|
90
|
+
lastAttemptAt: now,
|
|
91
|
+
responseStatus: response.status,
|
|
92
|
+
responseBody: responseBody.substring(0, 1000), // Limit stored response
|
|
93
|
+
completedAt: now,
|
|
94
|
+
});
|
|
95
|
+
console.log(`[Webhooks] Delivery ${deliveryId} succeeded (attempt ${attemptNumber + 1})`);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// HTTP error - retry
|
|
99
|
+
throw new Error(`HTTP ${response.status}: ${responseBody.substring(0, 200)}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
// Log the attempt
|
|
104
|
+
const nextRetryDelay = this.retryIntervals[attemptNumber + 1];
|
|
105
|
+
const nextRetryAt = nextRetryDelay
|
|
106
|
+
? new Date(Date.now() + nextRetryDelay).toISOString()
|
|
107
|
+
: undefined;
|
|
108
|
+
this.webhookManager.updateDelivery(deliveryId, {
|
|
109
|
+
attempts: attemptNumber + 1,
|
|
110
|
+
lastAttemptAt: now,
|
|
111
|
+
responseBody: error.message.substring(0, 1000),
|
|
112
|
+
nextRetryAt,
|
|
113
|
+
});
|
|
114
|
+
console.warn(`[Webhooks] Delivery ${deliveryId} attempt ${attemptNumber + 1} failed: ${error.message}`);
|
|
115
|
+
// Schedule retry
|
|
116
|
+
if (nextRetryDelay !== undefined) {
|
|
117
|
+
setTimeout(() => {
|
|
118
|
+
this.attemptDelivery(deliveryId, url, payload, signature, idempotencyKey, attemptNumber + 1)
|
|
119
|
+
.catch(err => console.error(`[Webhooks] Retry failed:`, err));
|
|
120
|
+
}, nextRetryDelay);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// No more retries
|
|
124
|
+
this.webhookManager.updateDelivery(deliveryId, {
|
|
125
|
+
status: 'failed',
|
|
126
|
+
completedAt: new Date().toISOString(),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Process pending deliveries (for background worker/cron)
|
|
133
|
+
*/
|
|
134
|
+
async processPending() {
|
|
135
|
+
const pending = this.webhookManager.getPendingDeliveries(100);
|
|
136
|
+
if (pending.length === 0)
|
|
137
|
+
return;
|
|
138
|
+
console.log(`[Webhooks] Processing ${pending.length} pending deliveries`);
|
|
139
|
+
for (const delivery of pending) {
|
|
140
|
+
const webhook = this.webhookManager.getById(delivery.webhookId);
|
|
141
|
+
if (!webhook || !webhook.active) {
|
|
142
|
+
this.webhookManager.updateDelivery(delivery.id, {
|
|
143
|
+
status: 'failed',
|
|
144
|
+
completedAt: new Date().toISOString(),
|
|
145
|
+
});
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
await this.attemptDelivery(delivery.id, webhook.url, delivery.payload, delivery.signature, delivery.idempotencyKey, delivery.attempts).catch(err => {
|
|
149
|
+
console.error(`[Webhooks] Failed to process delivery ${delivery.id}:`, err);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Sanitize payload for demo mode (replace sensitive data)
|
|
155
|
+
*/
|
|
156
|
+
sanitizePayloadForDemo(payload) {
|
|
157
|
+
if (typeof payload !== 'object' || payload === null)
|
|
158
|
+
return payload;
|
|
159
|
+
const sanitized = { ...payload };
|
|
160
|
+
// Replace IDs with demo prefixes
|
|
161
|
+
if (sanitized.id && typeof sanitized.id === 'string') {
|
|
162
|
+
sanitized.id = `demo-${sanitized.id.slice(0, 8)}`;
|
|
163
|
+
}
|
|
164
|
+
// Replace wallet IDs
|
|
165
|
+
for (const key of ['buyerWalletId', 'sellerWalletId', 'agentId']) {
|
|
166
|
+
if (sanitized[key] && typeof sanitized[key] === 'string') {
|
|
167
|
+
sanitized[key] = `demo-wallet-${sanitized[key].slice(0, 6)}`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Replace transaction IDs
|
|
171
|
+
for (const key of ['txId', 'escrowTxId', 'releaseTxId']) {
|
|
172
|
+
if (sanitized[key] && typeof sanitized[key] === 'string') {
|
|
173
|
+
sanitized[key] = `demo-tx-${sanitized[key].slice(0, 8)}`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return sanitized;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.WebhookDelivery = WebhookDelivery;
|
|
180
|
+
// Singleton instance
|
|
181
|
+
exports.webhookDelivery = new WebhookDelivery();
|
|
182
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/webhooks/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export interface Webhook {
|
|
2
|
+
id: string;
|
|
3
|
+
url: string;
|
|
4
|
+
events: string[];
|
|
5
|
+
secret: string;
|
|
6
|
+
active: boolean;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
}
|
|
9
|
+
export interface WebhookDelivery {
|
|
10
|
+
id: string;
|
|
11
|
+
webhookId: string;
|
|
12
|
+
eventType: string;
|
|
13
|
+
payload: any;
|
|
14
|
+
signature: string;
|
|
15
|
+
idempotencyKey: string;
|
|
16
|
+
status: 'pending' | 'success' | 'failed';
|
|
17
|
+
attempts: number;
|
|
18
|
+
lastAttemptAt?: string;
|
|
19
|
+
nextRetryAt?: string;
|
|
20
|
+
responseStatus?: number;
|
|
21
|
+
responseBody?: string;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
completedAt?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const WEBHOOK_EVENTS: readonly ["payment.created", "payment.escrowed", "payment.completed", "payment.failed", "payment.refunded", "service.registered", "service.executed", "dispute.opened", "dispute.resolved"];
|
|
26
|
+
export type WebhookEvent = typeof WEBHOOK_EVENTS[number];
|
|
27
|
+
export declare class WebhookManager {
|
|
28
|
+
/**
|
|
29
|
+
* Register a new webhook
|
|
30
|
+
*/
|
|
31
|
+
register(params: {
|
|
32
|
+
url: string;
|
|
33
|
+
events: string[];
|
|
34
|
+
ownerId?: string;
|
|
35
|
+
}): Webhook;
|
|
36
|
+
/**
|
|
37
|
+
* List webhooks (optionally filtered by owner)
|
|
38
|
+
*/
|
|
39
|
+
list(ownerId?: string): Omit<Webhook, 'secret'>[];
|
|
40
|
+
/**
|
|
41
|
+
* Get webhook by ID (with secret, for internal use)
|
|
42
|
+
*/
|
|
43
|
+
getById(id: string): Webhook | null;
|
|
44
|
+
/**
|
|
45
|
+
* Update webhook
|
|
46
|
+
*/
|
|
47
|
+
update(id: string, updates: {
|
|
48
|
+
url?: string;
|
|
49
|
+
events?: string[];
|
|
50
|
+
active?: boolean;
|
|
51
|
+
}, ownerId?: string): Omit<Webhook, 'secret'> | null;
|
|
52
|
+
/**
|
|
53
|
+
* Delete webhook
|
|
54
|
+
*/
|
|
55
|
+
delete(id: string, ownerId?: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Get active webhooks for a specific event
|
|
58
|
+
*/
|
|
59
|
+
getActiveWebhooksForEvent(eventType: string): Webhook[];
|
|
60
|
+
/**
|
|
61
|
+
* Create a delivery record
|
|
62
|
+
*/
|
|
63
|
+
createDelivery(webhookId: string, eventType: string, payload: any): WebhookDelivery;
|
|
64
|
+
/**
|
|
65
|
+
* Update delivery status
|
|
66
|
+
*/
|
|
67
|
+
updateDelivery(id: string, updates: {
|
|
68
|
+
status?: 'pending' | 'success' | 'failed';
|
|
69
|
+
attempts?: number;
|
|
70
|
+
lastAttemptAt?: string;
|
|
71
|
+
nextRetryAt?: string;
|
|
72
|
+
responseStatus?: number;
|
|
73
|
+
responseBody?: string;
|
|
74
|
+
completedAt?: string;
|
|
75
|
+
}): void;
|
|
76
|
+
/**
|
|
77
|
+
* Get pending deliveries for retry
|
|
78
|
+
*/
|
|
79
|
+
getPendingDeliveries(limit?: number): WebhookDelivery[];
|
|
80
|
+
/**
|
|
81
|
+
* Generate HMAC-SHA256 signature
|
|
82
|
+
*/
|
|
83
|
+
private generateSignature;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/webhooks/webhook.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,GAAG,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,eAAO,MAAM,cAAc,6LAUjB,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;AAExD,qBAAa,cAAc;IACzB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IA0C9E;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;IAmBjD;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAenC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAI;IAyDpI;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAgB7C;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAmBvD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,eAAe;IA6BnF;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAClC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;QACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,GAAG,IAAI;IAcR;;OAEG;IACH,oBAAoB,CAAC,KAAK,SAAM,GAAG,eAAe,EAAE;IA+BpD;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAI1B"}
|