digirails 0.1.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/LICENSE +21 -0
- package/README.md +102 -0
- package/dist/agent.d.ts +72 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +176 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +46 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/base58.d.ts +9 -0
- package/dist/crypto/base58.d.ts.map +1 -0
- package/dist/crypto/base58.js +107 -0
- package/dist/crypto/base58.js.map +1 -0
- package/dist/crypto/bech32.d.ts +9 -0
- package/dist/crypto/bech32.d.ts.map +1 -0
- package/dist/crypto/bech32.js +141 -0
- package/dist/crypto/bech32.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +22 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/keys.d.ts +25 -0
- package/dist/crypto/keys.d.ts.map +1 -0
- package/dist/crypto/keys.js +129 -0
- package/dist/crypto/keys.js.map +1 -0
- package/dist/crypto/script.d.ts +12 -0
- package/dist/crypto/script.d.ts.map +1 -0
- package/dist/crypto/script.js +105 -0
- package/dist/crypto/script.js.map +1 -0
- package/dist/crypto/transaction.d.ts +47 -0
- package/dist/crypto/transaction.d.ts.map +1 -0
- package/dist/crypto/transaction.js +227 -0
- package/dist/crypto/transaction.js.map +1 -0
- package/dist/discovery/index.d.ts +2 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +6 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/manifest_client.d.ts +9 -0
- package/dist/discovery/manifest_client.d.ts.map +1 -0
- package/dist/discovery/manifest_client.js +29 -0
- package/dist/discovery/manifest_client.js.map +1 -0
- package/dist/exceptions.d.ts +32 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +72 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +1 -0
- package/dist/models/enums.d.ts +48 -0
- package/dist/models/enums.d.ts.map +1 -0
- package/dist/models/enums.js +84 -0
- package/dist/models/enums.js.map +1 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +20 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/manifest.d.ts +327 -0
- package/dist/models/manifest.d.ts.map +1 -0
- package/dist/models/manifest.js +47 -0
- package/dist/models/manifest.js.map +1 -0
- package/dist/models/messages.d.ts +336 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/messages.js +166 -0
- package/dist/models/messages.js.map +1 -0
- package/dist/network/constants.d.ts +51 -0
- package/dist/network/constants.d.ts.map +1 -0
- package/dist/network/constants.js +63 -0
- package/dist/network/constants.js.map +1 -0
- package/dist/network/index.d.ts +3 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +19 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/params.d.ts +21 -0
- package/dist/network/params.d.ts.map +1 -0
- package/dist/network/params.js +57 -0
- package/dist/network/params.js.map +1 -0
- package/dist/opreturn.d.ts +25 -0
- package/dist/opreturn.d.ts.map +1 -0
- package/dist/opreturn.js +118 -0
- package/dist/opreturn.js.map +1 -0
- package/dist/payment/buyer.d.ts +29 -0
- package/dist/payment/buyer.d.ts.map +1 -0
- package/dist/payment/buyer.js +118 -0
- package/dist/payment/buyer.js.map +1 -0
- package/dist/payment/flow.d.ts +20 -0
- package/dist/payment/flow.d.ts.map +1 -0
- package/dist/payment/flow.js +29 -0
- package/dist/payment/flow.js.map +1 -0
- package/dist/payment/index.d.ts +5 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/index.js +13 -0
- package/dist/payment/index.js.map +1 -0
- package/dist/payment/seller.d.ts +27 -0
- package/dist/payment/seller.d.ts.map +1 -0
- package/dist/payment/seller.js +193 -0
- package/dist/payment/seller.js.map +1 -0
- package/dist/payment/verification.d.ts +8 -0
- package/dist/payment/verification.d.ts.map +1 -0
- package/dist/payment/verification.js +89 -0
- package/dist/payment/verification.js.map +1 -0
- package/dist/rpc/client.d.ts +21 -0
- package/dist/rpc/client.d.ts.map +1 -0
- package/dist/rpc/client.js +131 -0
- package/dist/rpc/client.js.map +1 -0
- package/dist/rpc/index.d.ts +2 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/rpc/index.js +6 -0
- package/dist/rpc/index.js.map +1 -0
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +104 -0
- package/dist/server.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/wallet/index.d.ts +4 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +14 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/keystore.d.ts +32 -0
- package/dist/wallet/keystore.d.ts.map +1 -0
- package/dist/wallet/keystore.js +111 -0
- package/dist/wallet/keystore.js.map +1 -0
- package/dist/wallet/utxo.d.ts +32 -0
- package/dist/wallet/utxo.d.ts.map +1 -0
- package/dist/wallet/utxo.js +88 -0
- package/dist/wallet/utxo.js.map +1 -0
- package/dist/wallet/wallet.d.ts +52 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +249 -0
- package/dist/wallet/wallet.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SellerFlow = void 0;
|
|
4
|
+
const utxo_1 = require("../wallet/utxo");
|
|
5
|
+
const enums_1 = require("../models/enums");
|
|
6
|
+
const messages_1 = require("../models/messages");
|
|
7
|
+
const verification_1 = require("./verification");
|
|
8
|
+
const opreturn_1 = require("../opreturn");
|
|
9
|
+
const constants_1 = require("../network/constants");
|
|
10
|
+
const params_1 = require("../network/params");
|
|
11
|
+
const REFUND_FEE_SAT = 50000n;
|
|
12
|
+
class SellerFlow {
|
|
13
|
+
wallet;
|
|
14
|
+
rpc;
|
|
15
|
+
network;
|
|
16
|
+
autoRefund;
|
|
17
|
+
services = new Map();
|
|
18
|
+
pendingInvoices = new Map();
|
|
19
|
+
constructor(wallet, network = params_1.MAINNET, rpc, autoRefund = true) {
|
|
20
|
+
this.wallet = wallet;
|
|
21
|
+
this.rpc = rpc ?? null;
|
|
22
|
+
this.network = network;
|
|
23
|
+
this.autoRefund = autoRefund;
|
|
24
|
+
}
|
|
25
|
+
/** Register a service with its handler */
|
|
26
|
+
registerService(service, handler) {
|
|
27
|
+
this.services.set(service.id, { service, handler });
|
|
28
|
+
}
|
|
29
|
+
/** Handle a SERVICE_REQUEST → return PAYMENT_INVOICE or ErrorResponse */
|
|
30
|
+
handleRequest(data) {
|
|
31
|
+
let request;
|
|
32
|
+
try {
|
|
33
|
+
request = messages_1.PaymentRequestSchema.parse(data);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return (0, messages_1.createErrorResponse)({
|
|
37
|
+
code: enums_1.ErrorCode.INVALID_REQUEST,
|
|
38
|
+
message: 'Invalid payment request format',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const registered = this.services.get(request.service.id);
|
|
42
|
+
if (!registered) {
|
|
43
|
+
return (0, messages_1.createErrorResponse)({
|
|
44
|
+
requestId: request.id,
|
|
45
|
+
code: enums_1.ErrorCode.UNKNOWN_SERVICE,
|
|
46
|
+
message: `Unknown service: ${request.service.id}`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const { service, handler } = registered;
|
|
50
|
+
// Create invoice
|
|
51
|
+
const invoice = (0, messages_1.createPaymentInvoice)({
|
|
52
|
+
requestId: request.id,
|
|
53
|
+
paymentAddress: this.wallet.address,
|
|
54
|
+
amount: service.pricing.amount,
|
|
55
|
+
confirmationTier: request.payment.confirmation_tier,
|
|
56
|
+
expiresInSeconds: service.payment.max_invoice_age_seconds,
|
|
57
|
+
memo: `${service.id}`,
|
|
58
|
+
});
|
|
59
|
+
// Store pending invoice
|
|
60
|
+
this.pendingInvoices.set(invoice.id, {
|
|
61
|
+
invoice,
|
|
62
|
+
service,
|
|
63
|
+
request,
|
|
64
|
+
handler,
|
|
65
|
+
});
|
|
66
|
+
return invoice;
|
|
67
|
+
}
|
|
68
|
+
/** Handle a PAYMENT_BROADCAST → verify payment → execute handler → return ServiceDelivery or ErrorResponse */
|
|
69
|
+
async handleBroadcast(data) {
|
|
70
|
+
let broadcast;
|
|
71
|
+
try {
|
|
72
|
+
broadcast = messages_1.PaymentBroadcastSchema.parse(data);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return (0, messages_1.createErrorResponse)({
|
|
76
|
+
code: enums_1.ErrorCode.INVALID_REQUEST,
|
|
77
|
+
message: 'Invalid payment broadcast format',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const pending = this.pendingInvoices.get(broadcast.invoice_id);
|
|
81
|
+
if (!pending) {
|
|
82
|
+
return (0, messages_1.createErrorResponse)({
|
|
83
|
+
code: enums_1.ErrorCode.PAYMENT_NOT_FOUND,
|
|
84
|
+
message: `Unknown invoice: ${broadcast.invoice_id}`,
|
|
85
|
+
retry: true,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// Check invoice expiry
|
|
89
|
+
const now = Math.floor(Date.now() / 1000);
|
|
90
|
+
if (pending.invoice.payment.expires_at <= now) {
|
|
91
|
+
this.pendingInvoices.delete(broadcast.invoice_id);
|
|
92
|
+
return (0, messages_1.createErrorResponse)({
|
|
93
|
+
code: enums_1.ErrorCode.INVOICE_EXPIRED,
|
|
94
|
+
message: 'Invoice has expired',
|
|
95
|
+
retry: true,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const expectedAmountSat = (0, utxo_1.dgbToSat)(pending.invoice.payment.amount);
|
|
99
|
+
// Verify payment
|
|
100
|
+
const tier = pending.invoice.terms.confirmation_tier;
|
|
101
|
+
if (tier === 'mempool' && broadcast.raw_tx) {
|
|
102
|
+
// Mempool verification — parse raw TX locally
|
|
103
|
+
const vout = (0, verification_1.verifyRawTxSimple)(broadcast.raw_tx, pending.invoice.payment.address, expectedAmountSat, this.network);
|
|
104
|
+
if (vout < 0) {
|
|
105
|
+
return (0, messages_1.createErrorResponse)({
|
|
106
|
+
code: enums_1.ErrorCode.PAYMENT_MISMATCH,
|
|
107
|
+
message: 'Raw TX does not contain matching payment output',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (this.rpc) {
|
|
112
|
+
// RPC verification — query the node
|
|
113
|
+
try {
|
|
114
|
+
const txData = (await this.rpc.getRawTransaction(broadcast.txid, true));
|
|
115
|
+
const vouts = txData['vout'];
|
|
116
|
+
const voutData = vouts[broadcast.vout];
|
|
117
|
+
if (!voutData) {
|
|
118
|
+
return (0, messages_1.createErrorResponse)({
|
|
119
|
+
code: enums_1.ErrorCode.PAYMENT_MISMATCH,
|
|
120
|
+
message: `Vout ${broadcast.vout} does not exist in transaction`,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const valueDgb = voutData['value'];
|
|
124
|
+
const valueSat = BigInt(Math.round(valueDgb * 1e8));
|
|
125
|
+
if (valueSat < expectedAmountSat) {
|
|
126
|
+
return (0, messages_1.createErrorResponse)({
|
|
127
|
+
code: enums_1.ErrorCode.INSUFFICIENT_PAYMENT,
|
|
128
|
+
message: `Payment ${valueSat} sat < required ${expectedAmountSat} sat`,
|
|
129
|
+
retry: true,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return (0, messages_1.createErrorResponse)({
|
|
135
|
+
code: enums_1.ErrorCode.PAYMENT_NOT_FOUND,
|
|
136
|
+
message: 'Transaction not found in mempool or blockchain',
|
|
137
|
+
retry: true,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Payment verified — execute service handler
|
|
142
|
+
try {
|
|
143
|
+
const result = await pending.handler(pending.request.service.params);
|
|
144
|
+
this.pendingInvoices.delete(broadcast.invoice_id);
|
|
145
|
+
return (0, messages_1.createServiceDelivery)({
|
|
146
|
+
invoiceId: broadcast.invoice_id,
|
|
147
|
+
status: 'complete',
|
|
148
|
+
result,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
this.pendingInvoices.delete(broadcast.invoice_id);
|
|
153
|
+
const refund = await this.attemptRefund(pending);
|
|
154
|
+
return (0, messages_1.createErrorResponse)({
|
|
155
|
+
code: enums_1.ErrorCode.SERVICE_UNAVAILABLE,
|
|
156
|
+
message: `Service execution failed: ${err.message}`,
|
|
157
|
+
retry: true,
|
|
158
|
+
refund: refund ?? undefined,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async attemptRefund(pending) {
|
|
163
|
+
if (!this.autoRefund || !this.rpc) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const paymentSat = (0, utxo_1.dgbToSat)(pending.invoice.payment.amount);
|
|
167
|
+
if (paymentSat <= constants_1.DUST_THRESHOLD) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
const buyerAddress = pending.request.from.address;
|
|
171
|
+
try {
|
|
172
|
+
const idRaw = new TextEncoder().encode(pending.invoice.id);
|
|
173
|
+
const invoiceIdBytes = new Uint8Array(16);
|
|
174
|
+
invoiceIdBytes.set(idRaw.slice(0, 16));
|
|
175
|
+
const opReturnData = (0, opreturn_1.encodeRefundMemo)(invoiceIdBytes);
|
|
176
|
+
await this.wallet.syncUtxos();
|
|
177
|
+
const tx = await this.wallet.buildPayment({
|
|
178
|
+
toAddress: buyerAddress,
|
|
179
|
+
amountSat: paymentSat,
|
|
180
|
+
feeSat: REFUND_FEE_SAT,
|
|
181
|
+
opReturnData,
|
|
182
|
+
});
|
|
183
|
+
const txid = await this.wallet.broadcast(tx);
|
|
184
|
+
const refundDgb = (0, utxo_1.satToDgb)(paymentSat);
|
|
185
|
+
return { txid, amount: refundDgb };
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.SellerFlow = SellerFlow;
|
|
193
|
+
//# sourceMappingURL=seller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller.js","sourceRoot":"","sources":["../../src/payment/seller.ts"],"names":[],"mappings":";;;AAKA,yCAAoD;AACpD,2CAA8D;AAC9D,iDAW4B;AAE5B,iDAAmD;AACnD,0CAA+C;AAC/C,oDAAsD;AACtD,8CAA2D;AAE3D,MAAM,cAAc,GAAG,MAAO,CAAC;AAe/B,MAAa,UAAU;IACb,MAAM,CAAS;IACf,GAAG,CAAmB;IACtB,OAAO,CAAgB;IACvB,UAAU,CAAU;IACpB,QAAQ,GAA+D,IAAI,GAAG,EAAE,CAAC;IACjF,eAAe,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEjE,YAAY,MAAc,EAAE,UAAyB,gBAAO,EAAE,GAAe,EAAE,aAAsB,IAAI;QACvG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,0CAA0C;IAC1C,eAAe,CAAC,OAAgB,EAAE,OAAuB;QACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,yEAAyE;IACzE,aAAa,CAAC,IAAa;QACzB,IAAI,OAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,GAAG,+BAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAA,8BAAmB,EAAC;gBACzB,IAAI,EAAE,iBAAS,CAAC,eAAe;gBAC/B,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAA,8BAAmB,EAAC;gBACzB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,IAAI,EAAE,iBAAS,CAAC,eAAe;gBAC/B,OAAO,EAAE,oBAAoB,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE;aAClD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;QAExC,iBAAiB;QACjB,MAAM,OAAO,GAAG,IAAA,+BAAoB,EAAC;YACnC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YACnC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;YAC9B,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,iBAAiB;YACnD,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,uBAAuB;YACzD,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE;SACtB,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;YACnC,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8GAA8G;IAC9G,KAAK,CAAC,eAAe,CAAC,IAAa;QACjC,IAAI,SAA2B,CAAC;QAChC,IAAI,CAAC;YACH,SAAS,GAAG,iCAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAA,8BAAmB,EAAC;gBACzB,IAAI,EAAE,iBAAS,CAAC,eAAe;gBAC/B,OAAO,EAAE,kCAAkC;aAC5C,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAA,8BAAmB,EAAC;gBACzB,IAAI,EAAE,iBAAS,CAAC,iBAAiB;gBACjC,OAAO,EAAE,oBAAoB,SAAS,CAAC,UAAU,EAAE;gBACnD,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;QAED,uBAAuB;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;YAC9C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAClD,OAAO,IAAA,8BAAmB,EAAC;gBACzB,IAAI,EAAE,iBAAS,CAAC,eAAe;gBAC/B,OAAO,EAAE,qBAAqB;gBAC9B,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAA,eAAQ,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEnE,iBAAiB;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACrD,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YAC3C,8CAA8C;YAC9C,MAAM,IAAI,GAAG,IAAA,gCAAiB,EAC5B,SAAS,CAAC,MAAM,EAChB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAC/B,iBAAiB,EACjB,IAAI,CAAC,OAAO,CACb,CAAC;YACF,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBACb,OAAO,IAAA,8BAAmB,EAAC;oBACzB,IAAI,EAAE,iBAAS,CAAC,gBAAgB;oBAChC,OAAO,EAAE,iDAAiD;iBAC3D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,oCAAoC;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAGrE,CAAC;gBACF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAmC,CAAC;gBAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,IAAA,8BAAmB,EAAC;wBACzB,IAAI,EAAE,iBAAS,CAAC,gBAAgB;wBAChC,OAAO,EAAE,QAAQ,SAAS,CAAC,IAAI,gCAAgC;qBAChE,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAW,CAAC;gBAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;gBACpD,IAAI,QAAQ,GAAG,iBAAiB,EAAE,CAAC;oBACjC,OAAO,IAAA,8BAAmB,EAAC;wBACzB,IAAI,EAAE,iBAAS,CAAC,oBAAoB;wBACpC,OAAO,EAAE,WAAW,QAAQ,mBAAmB,iBAAiB,MAAM;wBACtE,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAA,8BAAmB,EAAC;oBACzB,IAAI,EAAE,iBAAS,CAAC,iBAAiB;oBACjC,OAAO,EAAE,gDAAgD;oBACzD,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAElD,OAAO,IAAA,gCAAqB,EAAC;gBAC3B,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,MAAM,EAAE,UAAU;gBAClB,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO,IAAA,8BAAmB,EAAC;gBACzB,IAAI,EAAE,iBAAS,CAAC,mBAAmB;gBACnC,OAAO,EAAE,6BAA8B,GAAa,CAAC,OAAO,EAAE;gBAC9D,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,MAAM,IAAI,SAAS;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAuB;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,eAAQ,EAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5D,IAAI,UAAU,IAAI,0BAAc,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3D,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1C,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,IAAA,2BAAgB,EAAC,cAAc,CAAC,CAAC;YAEtD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;gBACxC,SAAS,EAAE,YAAY;gBACvB,SAAS,EAAE,UAAU;gBACrB,MAAM,EAAE,cAAc;gBACtB,YAAY;aACb,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,IAAA,eAAQ,EAAC,UAAU,CAAC,CAAC;YACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA1MD,gCA0MC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NetworkParams } from '../network/params';
|
|
2
|
+
/**
|
|
3
|
+
* Verify a raw transaction (mempool tier — no RPC needed).
|
|
4
|
+
* Parses the raw TX hex, finds an output matching the expected address and amount.
|
|
5
|
+
* Returns the matching vout index, or -1 if not found.
|
|
6
|
+
*/
|
|
7
|
+
export declare function verifyRawTxSimple(rawTxHex: string, expectedAddress: string, expectedAmountSat: bigint, network?: NetworkParams): number;
|
|
8
|
+
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/payment/verification.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AA2B3D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,OAAO,GAAE,aAAuB,GAC/B,MAAM,CAyDR"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyRawTxSimple = verifyRawTxSimple;
|
|
4
|
+
/**
|
|
5
|
+
* Payment verification utilities.
|
|
6
|
+
* Verifies that a raw transaction pays the expected address and amount.
|
|
7
|
+
*/
|
|
8
|
+
const script_1 = require("../crypto/script");
|
|
9
|
+
const params_1 = require("../network/params");
|
|
10
|
+
/** Parse a Bitcoin varint from raw bytes, returning [value, bytesConsumed] */
|
|
11
|
+
function parseVarint(data, offset) {
|
|
12
|
+
const first = data[offset];
|
|
13
|
+
if (first < 0xfd) {
|
|
14
|
+
return [first, 1];
|
|
15
|
+
}
|
|
16
|
+
else if (first === 0xfd) {
|
|
17
|
+
const val = data[offset + 1] | (data[offset + 2] << 8);
|
|
18
|
+
return [val, 3];
|
|
19
|
+
}
|
|
20
|
+
else if (first === 0xfe) {
|
|
21
|
+
const val = data[offset + 1] |
|
|
22
|
+
(data[offset + 2] << 8) |
|
|
23
|
+
(data[offset + 3] << 16) |
|
|
24
|
+
(data[offset + 4] << 24);
|
|
25
|
+
return [val >>> 0, 5]; // unsigned
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// 0xff — 8 bytes, but we limit to safe integer range
|
|
29
|
+
let val = 0n;
|
|
30
|
+
for (let i = 0; i < 8; i++) {
|
|
31
|
+
val |= BigInt(data[offset + 1 + i]) << BigInt(i * 8);
|
|
32
|
+
}
|
|
33
|
+
return [Number(val), 9];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Verify a raw transaction (mempool tier — no RPC needed).
|
|
38
|
+
* Parses the raw TX hex, finds an output matching the expected address and amount.
|
|
39
|
+
* Returns the matching vout index, or -1 if not found.
|
|
40
|
+
*/
|
|
41
|
+
function verifyRawTxSimple(rawTxHex, expectedAddress, expectedAmountSat, network = params_1.MAINNET) {
|
|
42
|
+
const raw = Buffer.from(rawTxHex, 'hex');
|
|
43
|
+
let offset = 0;
|
|
44
|
+
// Version (4 bytes)
|
|
45
|
+
offset += 4;
|
|
46
|
+
// Check for SegWit marker
|
|
47
|
+
let hasWitness = false;
|
|
48
|
+
if (raw[offset] === 0x00 && raw[offset + 1] === 0x01) {
|
|
49
|
+
hasWitness = true;
|
|
50
|
+
offset += 2;
|
|
51
|
+
}
|
|
52
|
+
// Input count
|
|
53
|
+
const [inputCount, inputCountLen] = parseVarint(raw, offset);
|
|
54
|
+
offset += inputCountLen;
|
|
55
|
+
// Skip inputs
|
|
56
|
+
for (let i = 0; i < inputCount; i++) {
|
|
57
|
+
offset += 32; // prevout hash
|
|
58
|
+
offset += 4; // prevout index
|
|
59
|
+
const [scriptLen, scriptLenSize] = parseVarint(raw, offset);
|
|
60
|
+
offset += scriptLenSize;
|
|
61
|
+
offset += scriptLen; // scriptSig
|
|
62
|
+
offset += 4; // sequence
|
|
63
|
+
}
|
|
64
|
+
// Output count
|
|
65
|
+
const [outputCount, outputCountLen] = parseVarint(raw, offset);
|
|
66
|
+
offset += outputCountLen;
|
|
67
|
+
// Expected scriptPubKey
|
|
68
|
+
const expectedScript = (0, script_1.addressToScriptPubkey)(expectedAddress, network);
|
|
69
|
+
// Parse outputs
|
|
70
|
+
for (let vout = 0; vout < outputCount; vout++) {
|
|
71
|
+
// Value (8 bytes LE)
|
|
72
|
+
let value = 0n;
|
|
73
|
+
for (let i = 0; i < 8; i++) {
|
|
74
|
+
value |= BigInt(raw[offset + i]) << BigInt(i * 8);
|
|
75
|
+
}
|
|
76
|
+
offset += 8;
|
|
77
|
+
// scriptPubKey
|
|
78
|
+
const [scriptLen, scriptLenSize] = parseVarint(raw, offset);
|
|
79
|
+
offset += scriptLenSize;
|
|
80
|
+
const scriptPubkey = raw.slice(offset, offset + scriptLen);
|
|
81
|
+
offset += scriptLen;
|
|
82
|
+
// Check match
|
|
83
|
+
if (value >= expectedAmountSat && Buffer.compare(scriptPubkey, expectedScript) === 0) {
|
|
84
|
+
return vout;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return -1;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/payment/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class RpcClient {
|
|
2
|
+
private url;
|
|
3
|
+
private username?;
|
|
4
|
+
private password?;
|
|
5
|
+
private nextId;
|
|
6
|
+
constructor(url: string, username?: string, password?: string);
|
|
7
|
+
private call;
|
|
8
|
+
getBlockCount(): Promise<number>;
|
|
9
|
+
getBlockHash(height: number): Promise<string>;
|
|
10
|
+
getBlock(hashOrHeight: string | number, verbosity?: number): Promise<unknown>;
|
|
11
|
+
getBlockchainInfo(): Promise<Record<string, unknown>>;
|
|
12
|
+
getRawTransaction(txid: string, verbose?: boolean): Promise<unknown>;
|
|
13
|
+
getTxOut(txid: string, vout: number, includeMempool?: boolean): Promise<unknown>;
|
|
14
|
+
sendRawTransaction(hexstring: string): Promise<string>;
|
|
15
|
+
getRawMempool(): Promise<string[]>;
|
|
16
|
+
getMempoolEntry(txid: string): Promise<unknown>;
|
|
17
|
+
generateToAddress(nblocks: number, address: string): Promise<string[]>;
|
|
18
|
+
listUnspent(minConf?: number, maxConf?: number, addresses?: string[]): Promise<Array<Record<string, unknown>>>;
|
|
19
|
+
importAddress(address: string, label?: string, rescan?: boolean): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"AAsBA,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAK;gBAEP,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;YAgB/C,IAAI;IA4DZ,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxE,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMrD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7E,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMtD,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/C,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAItE,WAAW,CACf,OAAO,SAAI,EACX,OAAO,SAAU,EACjB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAMpC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RpcClient = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Async JSON-RPC 2.0 client for DigiByte Core.
|
|
6
|
+
* Works against both public RPC (light mode) and local node (full mode).
|
|
7
|
+
*/
|
|
8
|
+
const exceptions_1 = require("../exceptions");
|
|
9
|
+
class RpcClient {
|
|
10
|
+
url;
|
|
11
|
+
username;
|
|
12
|
+
password;
|
|
13
|
+
nextId = 1;
|
|
14
|
+
constructor(url, username, password) {
|
|
15
|
+
// Support URL-embedded credentials (http://user:pass@host:port)
|
|
16
|
+
const parsed = new URL(url);
|
|
17
|
+
if (parsed.username && parsed.password && !username) {
|
|
18
|
+
this.username = decodeURIComponent(parsed.username);
|
|
19
|
+
this.password = decodeURIComponent(parsed.password);
|
|
20
|
+
parsed.username = '';
|
|
21
|
+
parsed.password = '';
|
|
22
|
+
this.url = parsed.toString().replace(/\/$/, '');
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
this.url = url;
|
|
26
|
+
this.username = username;
|
|
27
|
+
this.password = password;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async call(method, params = []) {
|
|
31
|
+
const body = {
|
|
32
|
+
jsonrpc: '2.0',
|
|
33
|
+
id: this.nextId++,
|
|
34
|
+
method,
|
|
35
|
+
params,
|
|
36
|
+
};
|
|
37
|
+
const headers = {
|
|
38
|
+
'Content-Type': 'application/json',
|
|
39
|
+
};
|
|
40
|
+
if (this.username && this.password) {
|
|
41
|
+
const auth = Buffer.from(`${this.username}:${this.password}`).toString('base64');
|
|
42
|
+
headers['Authorization'] = `Basic ${auth}`;
|
|
43
|
+
}
|
|
44
|
+
let response;
|
|
45
|
+
try {
|
|
46
|
+
response = await fetch(this.url, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers,
|
|
49
|
+
body: JSON.stringify(body),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
throw new exceptions_1.NetworkError(`RPC connection failed: ${err.message}`);
|
|
54
|
+
}
|
|
55
|
+
if (!response.ok && response.status !== 200) {
|
|
56
|
+
// Some RPC errors come with 500 status but valid JSON-RPC error bodies
|
|
57
|
+
let text;
|
|
58
|
+
try {
|
|
59
|
+
text = await response.text();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
text = '';
|
|
63
|
+
}
|
|
64
|
+
// Try to parse as JSON-RPC error
|
|
65
|
+
try {
|
|
66
|
+
const parsed = JSON.parse(text);
|
|
67
|
+
if (parsed.error) {
|
|
68
|
+
throw new exceptions_1.RpcError(parsed.error.code, parsed.error.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
if (e instanceof exceptions_1.RpcError)
|
|
73
|
+
throw e;
|
|
74
|
+
}
|
|
75
|
+
throw new exceptions_1.NetworkError(`RPC HTTP error ${response.status}: ${text}`);
|
|
76
|
+
}
|
|
77
|
+
const data = (await response.json());
|
|
78
|
+
if (data.error) {
|
|
79
|
+
throw new exceptions_1.RpcError(data.error.code, data.error.message);
|
|
80
|
+
}
|
|
81
|
+
return data.result;
|
|
82
|
+
}
|
|
83
|
+
// ---------- Chain queries ----------
|
|
84
|
+
async getBlockCount() {
|
|
85
|
+
return (await this.call('getblockcount'));
|
|
86
|
+
}
|
|
87
|
+
async getBlockHash(height) {
|
|
88
|
+
return (await this.call('getblockhash', [height]));
|
|
89
|
+
}
|
|
90
|
+
async getBlock(hashOrHeight, verbosity = 1) {
|
|
91
|
+
const hash = typeof hashOrHeight === 'number'
|
|
92
|
+
? await this.getBlockHash(hashOrHeight)
|
|
93
|
+
: hashOrHeight;
|
|
94
|
+
return this.call('getblock', [hash, verbosity]);
|
|
95
|
+
}
|
|
96
|
+
async getBlockchainInfo() {
|
|
97
|
+
return (await this.call('getblockchaininfo'));
|
|
98
|
+
}
|
|
99
|
+
// ---------- Transaction queries ----------
|
|
100
|
+
async getRawTransaction(txid, verbose = true) {
|
|
101
|
+
return this.call('getrawtransaction', [txid, verbose]);
|
|
102
|
+
}
|
|
103
|
+
async getTxOut(txid, vout, includeMempool = true) {
|
|
104
|
+
return this.call('gettxout', [txid, vout, includeMempool]);
|
|
105
|
+
}
|
|
106
|
+
async sendRawTransaction(hexstring) {
|
|
107
|
+
return (await this.call('sendrawtransaction', [hexstring]));
|
|
108
|
+
}
|
|
109
|
+
// ---------- Mempool ----------
|
|
110
|
+
async getRawMempool() {
|
|
111
|
+
return (await this.call('getrawmempool'));
|
|
112
|
+
}
|
|
113
|
+
async getMempoolEntry(txid) {
|
|
114
|
+
return this.call('getmempoolentry', [txid]);
|
|
115
|
+
}
|
|
116
|
+
// ---------- Regtest helpers ----------
|
|
117
|
+
async generateToAddress(nblocks, address) {
|
|
118
|
+
return (await this.call('generatetoaddress', [nblocks, address]));
|
|
119
|
+
}
|
|
120
|
+
async listUnspent(minConf = 0, maxConf = 9999999, addresses) {
|
|
121
|
+
const params = [minConf, maxConf];
|
|
122
|
+
if (addresses)
|
|
123
|
+
params.push(addresses);
|
|
124
|
+
return (await this.call('listunspent', params));
|
|
125
|
+
}
|
|
126
|
+
async importAddress(address, label = '', rescan = false) {
|
|
127
|
+
await this.call('importaddress', [address, label, rescan]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.RpcClient = RpcClient;
|
|
131
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rpc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RpcClient = void 0;
|
|
4
|
+
var client_1 = require("./client");
|
|
5
|
+
Object.defineProperty(exports, "RpcClient", { enumerable: true, get: function () { return client_1.RpcClient; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rpc/index.ts"],"names":[],"mappings":";;;AAAA,mCAAqC;AAA5B,mGAAA,SAAS,OAAA"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Manifest } from './models/manifest';
|
|
2
|
+
import { SellerFlow, ServiceHandler } from './payment/seller';
|
|
3
|
+
import { Service } from './models/manifest';
|
|
4
|
+
export declare class DigiRailsServer {
|
|
5
|
+
private server;
|
|
6
|
+
private sellerFlow;
|
|
7
|
+
private manifest;
|
|
8
|
+
private host;
|
|
9
|
+
private port;
|
|
10
|
+
constructor(params: {
|
|
11
|
+
sellerFlow: SellerFlow;
|
|
12
|
+
manifest: Manifest;
|
|
13
|
+
host?: string;
|
|
14
|
+
port?: number;
|
|
15
|
+
});
|
|
16
|
+
/** Register a service on the seller flow */
|
|
17
|
+
registerService(service: Service, handler: ServiceHandler): void;
|
|
18
|
+
/** Start the HTTP server */
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
/** Stop the HTTP server */
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
private handleRequest;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;gBAET,MAAM,EAAE;QAClB,UAAU,EAAE,UAAU,CAAC;QACvB,QAAQ,EAAE,QAAQ,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAOD,4CAA4C;IAC5C,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAIhE,4BAA4B;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B,2BAA2B;IACrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUb,aAAa;CA8C5B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DigiRailsServer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* DigiRails HTTP seller server (Node.js native http).
|
|
6
|
+
* Serves manifest and handles payment flow endpoints.
|
|
7
|
+
*/
|
|
8
|
+
const http_1 = require("http");
|
|
9
|
+
class DigiRailsServer {
|
|
10
|
+
server = null;
|
|
11
|
+
sellerFlow;
|
|
12
|
+
manifest;
|
|
13
|
+
host;
|
|
14
|
+
port;
|
|
15
|
+
constructor(params) {
|
|
16
|
+
this.sellerFlow = params.sellerFlow;
|
|
17
|
+
this.manifest = params.manifest;
|
|
18
|
+
this.host = params.host ?? '0.0.0.0';
|
|
19
|
+
this.port = params.port ?? 8080;
|
|
20
|
+
}
|
|
21
|
+
/** Register a service on the seller flow */
|
|
22
|
+
registerService(service, handler) {
|
|
23
|
+
this.sellerFlow.registerService(service, handler);
|
|
24
|
+
}
|
|
25
|
+
/** Start the HTTP server */
|
|
26
|
+
async start() {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
this.server = (0, http_1.createServer)(async (req, res) => {
|
|
29
|
+
try {
|
|
30
|
+
await this.handleRequest(req, res);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
34
|
+
res.end(JSON.stringify({ error: 'Internal server error' }));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
this.server.listen(this.port, this.host, () => {
|
|
38
|
+
resolve();
|
|
39
|
+
});
|
|
40
|
+
this.server.on('error', reject);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Stop the HTTP server */
|
|
44
|
+
async stop() {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
if (this.server) {
|
|
47
|
+
this.server.close(() => resolve());
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
resolve();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async handleRequest(req, res) {
|
|
55
|
+
const url = req.url ?? '/';
|
|
56
|
+
const method = req.method ?? 'GET';
|
|
57
|
+
// CORS headers
|
|
58
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
59
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
60
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
61
|
+
if (method === 'OPTIONS') {
|
|
62
|
+
res.writeHead(204);
|
|
63
|
+
res.end();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Manifest endpoint
|
|
67
|
+
if (url === '/.well-known/digirails.json' && method === 'GET') {
|
|
68
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
69
|
+
res.end(JSON.stringify(this.manifest));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Payment request endpoint
|
|
73
|
+
if (url === '/drpay/request' && method === 'POST') {
|
|
74
|
+
const body = await readBody(req);
|
|
75
|
+
const data = JSON.parse(body);
|
|
76
|
+
const result = this.sellerFlow.handleRequest(data);
|
|
77
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
78
|
+
res.end(JSON.stringify(result));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Payment broadcast endpoint
|
|
82
|
+
if (url === '/drpay/broadcast' && method === 'POST') {
|
|
83
|
+
const body = await readBody(req);
|
|
84
|
+
const data = JSON.parse(body);
|
|
85
|
+
const result = await this.sellerFlow.handleBroadcast(data);
|
|
86
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
87
|
+
res.end(JSON.stringify(result));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// 404
|
|
91
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
92
|
+
res.end(JSON.stringify({ error: 'Not found' }));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.DigiRailsServer = DigiRailsServer;
|
|
96
|
+
function readBody(req) {
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
const chunks = [];
|
|
99
|
+
req.on('data', (chunk) => chunks.push(chunk));
|
|
100
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
|
|
101
|
+
req.on('error', reject);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
|