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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DigiByte network parameters for mainnet, testnet, and regtest.
|
|
3
|
+
*/
|
|
4
|
+
export interface NetworkParams {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly bech32Hrp: string;
|
|
7
|
+
readonly pubkeyVersion: number;
|
|
8
|
+
readonly scriptVersion: number;
|
|
9
|
+
readonly wifVersion: number;
|
|
10
|
+
readonly bip44CoinType: number;
|
|
11
|
+
readonly defaultRpcPort: number;
|
|
12
|
+
readonly defaultP2pPort: number;
|
|
13
|
+
readonly defaultRpcUrl: string;
|
|
14
|
+
readonly magic: Buffer;
|
|
15
|
+
}
|
|
16
|
+
export declare const MAINNET: NetworkParams;
|
|
17
|
+
export declare const TESTNET: NetworkParams;
|
|
18
|
+
export declare const REGTEST: NetworkParams;
|
|
19
|
+
/** Lookup network by name */
|
|
20
|
+
export declare function getNetwork(name: string): NetworkParams;
|
|
21
|
+
//# sourceMappingURL=params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/network/params.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,OAAO,EAAE,aAWrB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,aAWrB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,aAWrB,CAAC;AAEF,6BAA6B;AAC7B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAWtD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DigiByte network parameters for mainnet, testnet, and regtest.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.REGTEST = exports.TESTNET = exports.MAINNET = void 0;
|
|
7
|
+
exports.getNetwork = getNetwork;
|
|
8
|
+
exports.MAINNET = {
|
|
9
|
+
name: 'mainnet',
|
|
10
|
+
bech32Hrp: 'dgb',
|
|
11
|
+
pubkeyVersion: 0x1e,
|
|
12
|
+
scriptVersion: 0x3f,
|
|
13
|
+
wifVersion: 0x80,
|
|
14
|
+
bip44CoinType: 20,
|
|
15
|
+
defaultRpcPort: 14022,
|
|
16
|
+
defaultP2pPort: 12024,
|
|
17
|
+
defaultRpcUrl: 'https://rpc.digirails.org',
|
|
18
|
+
magic: Buffer.from([0xfa, 0xc3, 0xb6, 0xda]),
|
|
19
|
+
};
|
|
20
|
+
exports.TESTNET = {
|
|
21
|
+
name: 'testnet',
|
|
22
|
+
bech32Hrp: 'dgbt',
|
|
23
|
+
pubkeyVersion: 0x7e,
|
|
24
|
+
scriptVersion: 0x8c,
|
|
25
|
+
wifVersion: 0xfe,
|
|
26
|
+
bip44CoinType: 20,
|
|
27
|
+
defaultRpcPort: 14023,
|
|
28
|
+
defaultP2pPort: 12026,
|
|
29
|
+
defaultRpcUrl: 'https://rpc.digirails.org',
|
|
30
|
+
magic: Buffer.from([0xfd, 0xc8, 0xbd, 0xdd]),
|
|
31
|
+
};
|
|
32
|
+
exports.REGTEST = {
|
|
33
|
+
name: 'regtest',
|
|
34
|
+
bech32Hrp: 'dgbrt',
|
|
35
|
+
pubkeyVersion: 0x7e,
|
|
36
|
+
scriptVersion: 0x8c,
|
|
37
|
+
wifVersion: 0xfe,
|
|
38
|
+
bip44CoinType: 20,
|
|
39
|
+
defaultRpcPort: 18443,
|
|
40
|
+
defaultP2pPort: 18444,
|
|
41
|
+
defaultRpcUrl: 'http://127.0.0.1:18443',
|
|
42
|
+
magic: Buffer.from([0xfa, 0xbf, 0xb5, 0xda]),
|
|
43
|
+
};
|
|
44
|
+
/** Lookup network by name */
|
|
45
|
+
function getNetwork(name) {
|
|
46
|
+
switch (name.toLowerCase()) {
|
|
47
|
+
case 'mainnet':
|
|
48
|
+
return exports.MAINNET;
|
|
49
|
+
case 'testnet':
|
|
50
|
+
return exports.TESTNET;
|
|
51
|
+
case 'regtest':
|
|
52
|
+
return exports.REGTEST;
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(`Unknown network: ${name}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/network/params.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAuDH,gCAWC;AAnDY,QAAA,OAAO,GAAkB;IACpC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;CAC7C,CAAC;AAEW,QAAA,OAAO,GAAkB;IACpC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;CAC7C,CAAC;AAEW,QAAA,OAAO,GAAkB;IACpC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,OAAO;IAClB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;CAC7C,CAAC;AAEF,6BAA6B;AAC7B,SAAgB,UAAU,CAAC,IAAY;IACrC,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,KAAK,SAAS;YACZ,OAAO,eAAO,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,eAAO,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,eAAO,CAAC;QACjB;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SubProtocol } from './network/constants';
|
|
2
|
+
/** Encode the 5-byte DigiRails header. Set test=true to mark as a test transaction. */
|
|
3
|
+
export declare function encodeHeader(subProtocol: SubProtocol, messageType: number, test?: boolean): Buffer;
|
|
4
|
+
/** Decoded header result: [version, subProtocol, messageType, payload, isTest] */
|
|
5
|
+
export type DecodedHeader = [number, SubProtocol, number, Uint8Array, boolean];
|
|
6
|
+
/** Decode header from raw data. Returns [version, subProtocol, messageType, payload, isTest] or null. */
|
|
7
|
+
export declare function decodeHeader(data: Uint8Array): DecodedHeader | null;
|
|
8
|
+
/** Encode an identity declaration: header + optional UTF-8 label (up to 75 bytes) */
|
|
9
|
+
export declare function encodeIdentityDeclaration(label?: string, test?: boolean): Buffer;
|
|
10
|
+
/** Encode an identity transfer: header + new address hash (20 or 32 bytes) */
|
|
11
|
+
export declare function encodeIdentityTransfer(newAddressHash: Uint8Array, test?: boolean): Buffer;
|
|
12
|
+
/** Encode a service declaration: header + category(2B) + flags(2B) + manifestHash(32B) + [domain] */
|
|
13
|
+
export declare function encodeServiceDeclaration(category: number, flags: number, manifestHashBytes: Uint8Array, { test, manifestDomain }?: {
|
|
14
|
+
test?: boolean;
|
|
15
|
+
manifestDomain?: string;
|
|
16
|
+
}): Buffer;
|
|
17
|
+
/** Encode a payment memo: header + invoiceId(16B) + optional serviceRef(0-59B) */
|
|
18
|
+
export declare function encodePaymentMemo(invoiceId: Uint8Array, serviceRef?: Uint8Array, test?: boolean): Buffer;
|
|
19
|
+
/** Encode a refund memo: header + invoiceId(16B) = 21B total */
|
|
20
|
+
export declare function encodeRefundMemo(invoiceId: Uint8Array, test?: boolean): Buffer;
|
|
21
|
+
/** Encode an attestation: header + targetAddressHash(20B) + score(1B) + nonce(4B) = 30B total */
|
|
22
|
+
export declare function encodeAttestation(targetAddressHash: Uint8Array, score: number, nonce: number, test?: boolean): Buffer;
|
|
23
|
+
/** Compute SHA-256 hash of a manifest JSON string */
|
|
24
|
+
export declare function manifestHash(manifestJson: string): Buffer;
|
|
25
|
+
//# sourceMappingURL=opreturn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opreturn.d.ts","sourceRoot":"","sources":["../src/opreturn.ts"],"names":[],"mappings":"AASA,OAAO,EAOL,WAAW,EAIZ,MAAM,qBAAqB,CAAC;AAI7B,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,IAAI,UAAQ,GACX,MAAM,CAGR;AAED,kFAAkF;AAClF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAE/E,yGAAyG;AACzG,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAYnE;AAID,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,KAAK,SAAK,EAAE,IAAI,UAAQ,GAAG,MAAM,CAS1E;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,UAAQ,GAAG,MAAM,CAOvF;AAID,qGAAqG;AACrG,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,UAAU,EAC7B,EAAE,IAAY,EAAE,cAAmB,EAAE,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACtF,MAAM,CAmBR;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,UAAU,EACrB,UAAU,GAAE,UAA4B,EACxC,IAAI,UAAQ,GACX,MAAM,CAYR;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,UAAQ,GAAG,MAAM,CAO5E;AAID,iGAAiG;AACjG,wBAAgB,iBAAiB,CAC/B,iBAAiB,EAAE,UAAU,EAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,UAAQ,GACX,MAAM,CAeR;AAID,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
package/dist/opreturn.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encodeHeader = encodeHeader;
|
|
4
|
+
exports.decodeHeader = decodeHeader;
|
|
5
|
+
exports.encodeIdentityDeclaration = encodeIdentityDeclaration;
|
|
6
|
+
exports.encodeIdentityTransfer = encodeIdentityTransfer;
|
|
7
|
+
exports.encodeServiceDeclaration = encodeServiceDeclaration;
|
|
8
|
+
exports.encodePaymentMemo = encodePaymentMemo;
|
|
9
|
+
exports.encodeRefundMemo = encodeRefundMemo;
|
|
10
|
+
exports.encodeAttestation = encodeAttestation;
|
|
11
|
+
exports.manifestHash = manifestHash;
|
|
12
|
+
/**
|
|
13
|
+
* OP_RETURN header encoding/decoding for all DigiRails sub-protocols.
|
|
14
|
+
*
|
|
15
|
+
* Header format (5 bytes):
|
|
16
|
+
* DR_MAGIC (2B) + version byte (1B) + SubProtocol (1B) + MessageType (1B)
|
|
17
|
+
*
|
|
18
|
+
* The version byte's MSB (bit 7) is a test flag. Lower 7 bits = version number.
|
|
19
|
+
*/
|
|
20
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
21
|
+
const constants_1 = require("./network/constants");
|
|
22
|
+
// ---------- Header ----------
|
|
23
|
+
/** Encode the 5-byte DigiRails header. Set test=true to mark as a test transaction. */
|
|
24
|
+
function encodeHeader(subProtocol, messageType, test = false) {
|
|
25
|
+
const versionByte = test ? constants_1.DR_VERSION | constants_1.DR_TEST_FLAG : constants_1.DR_VERSION;
|
|
26
|
+
return Buffer.from([0x44, 0x52, versionByte, subProtocol, messageType]);
|
|
27
|
+
}
|
|
28
|
+
/** Decode header from raw data. Returns [version, subProtocol, messageType, payload, isTest] or null. */
|
|
29
|
+
function decodeHeader(data) {
|
|
30
|
+
if (data.length < constants_1.DR_HEADER_SIZE)
|
|
31
|
+
return null;
|
|
32
|
+
if (data[0] !== 0x44 || data[1] !== 0x52)
|
|
33
|
+
return null;
|
|
34
|
+
const rawVersion = data[2];
|
|
35
|
+
const isTest = (rawVersion & constants_1.DR_TEST_FLAG) !== 0;
|
|
36
|
+
const version = rawVersion & 0x7f;
|
|
37
|
+
const subProtocol = data[3];
|
|
38
|
+
const messageType = data[4];
|
|
39
|
+
const payload = data.slice(constants_1.DR_HEADER_SIZE);
|
|
40
|
+
return [version, subProtocol, messageType, payload, isTest];
|
|
41
|
+
}
|
|
42
|
+
// ---------- DR-Core (0x00) ----------
|
|
43
|
+
/** Encode an identity declaration: header + optional UTF-8 label (up to 75 bytes) */
|
|
44
|
+
function encodeIdentityDeclaration(label = '', test = false) {
|
|
45
|
+
const header = encodeHeader(constants_1.SubProtocol.DR_CORE, constants_1.CoreMessageType.IDENTITY_DECLARATION, test);
|
|
46
|
+
const labelBytes = Buffer.from(label, 'utf-8');
|
|
47
|
+
if (labelBytes.length > constants_1.DR_MAX_PAYLOAD) {
|
|
48
|
+
throw new Error(`Label exceeds ${constants_1.DR_MAX_PAYLOAD} bytes: ${labelBytes.length}`);
|
|
49
|
+
}
|
|
50
|
+
return Buffer.concat([header, labelBytes]);
|
|
51
|
+
}
|
|
52
|
+
/** Encode an identity transfer: header + new address hash (20 or 32 bytes) */
|
|
53
|
+
function encodeIdentityTransfer(newAddressHash, test = false) {
|
|
54
|
+
if (newAddressHash.length !== 20 && newAddressHash.length !== 32) {
|
|
55
|
+
throw new Error(`Address hash must be 20 or 32 bytes, got ${newAddressHash.length}`);
|
|
56
|
+
}
|
|
57
|
+
const header = encodeHeader(constants_1.SubProtocol.DR_CORE, constants_1.CoreMessageType.IDENTITY_TRANSFER, test);
|
|
58
|
+
return Buffer.concat([header, newAddressHash]);
|
|
59
|
+
}
|
|
60
|
+
// ---------- DR-Pay (0x01) ----------
|
|
61
|
+
/** Encode a service declaration: header + category(2B) + flags(2B) + manifestHash(32B) + [domain] */
|
|
62
|
+
function encodeServiceDeclaration(category, flags, manifestHashBytes, { test = false, manifestDomain = '' } = {}) {
|
|
63
|
+
if (manifestHashBytes.length !== 32) {
|
|
64
|
+
throw new Error(`Manifest hash must be 32 bytes, got ${manifestHashBytes.length}`);
|
|
65
|
+
}
|
|
66
|
+
const domainBytes = manifestDomain ? Buffer.from(manifestDomain, 'utf-8') : Buffer.alloc(0);
|
|
67
|
+
if (domainBytes.length > constants_1.DR_MAX_PAYLOAD - 36) {
|
|
68
|
+
throw new Error(`Domain too long: ${domainBytes.length} bytes (max ${constants_1.DR_MAX_PAYLOAD - 36})`);
|
|
69
|
+
}
|
|
70
|
+
const header = encodeHeader(constants_1.SubProtocol.DR_PAY, constants_1.PayMessageType.SERVICE_DECLARATION, test);
|
|
71
|
+
const payload = Buffer.alloc(36);
|
|
72
|
+
payload.writeUInt16BE(category, 0);
|
|
73
|
+
payload.writeUInt16BE(flags, 2);
|
|
74
|
+
payload.set(manifestHashBytes, 4);
|
|
75
|
+
return Buffer.concat([header, payload, domainBytes]);
|
|
76
|
+
}
|
|
77
|
+
/** Encode a payment memo: header + invoiceId(16B) + optional serviceRef(0-59B) */
|
|
78
|
+
function encodePaymentMemo(invoiceId, serviceRef = Buffer.alloc(0), test = false) {
|
|
79
|
+
if (invoiceId.length !== 16) {
|
|
80
|
+
throw new Error(`Invoice ID must be 16 bytes, got ${invoiceId.length}`);
|
|
81
|
+
}
|
|
82
|
+
const maxRef = constants_1.DR_MAX_PAYLOAD - 16; // 59 bytes
|
|
83
|
+
if (serviceRef.length > maxRef) {
|
|
84
|
+
throw new Error(`Service ref exceeds ${maxRef} bytes: ${serviceRef.length}`);
|
|
85
|
+
}
|
|
86
|
+
const header = encodeHeader(constants_1.SubProtocol.DR_PAY, constants_1.PayMessageType.PAYMENT_MEMO, test);
|
|
87
|
+
return Buffer.concat([header, invoiceId, serviceRef]);
|
|
88
|
+
}
|
|
89
|
+
/** Encode a refund memo: header + invoiceId(16B) = 21B total */
|
|
90
|
+
function encodeRefundMemo(invoiceId, test = false) {
|
|
91
|
+
if (invoiceId.length !== 16) {
|
|
92
|
+
throw new Error(`Invoice ID must be 16 bytes, got ${invoiceId.length}`);
|
|
93
|
+
}
|
|
94
|
+
const header = encodeHeader(constants_1.SubProtocol.DR_PAY, constants_1.PayMessageType.REFUND_MEMO, test);
|
|
95
|
+
return Buffer.concat([header, invoiceId]);
|
|
96
|
+
}
|
|
97
|
+
// ---------- DR-Rep (0x02) ----------
|
|
98
|
+
/** Encode an attestation: header + targetAddressHash(20B) + score(1B) + nonce(4B) = 30B total */
|
|
99
|
+
function encodeAttestation(targetAddressHash, score, nonce, test = false) {
|
|
100
|
+
if (targetAddressHash.length !== 20) {
|
|
101
|
+
throw new Error(`Target address hash must be 20 bytes, got ${targetAddressHash.length}`);
|
|
102
|
+
}
|
|
103
|
+
if (score < 0 || score > 255) {
|
|
104
|
+
throw new Error(`Score must be 0-255, got ${score}`);
|
|
105
|
+
}
|
|
106
|
+
const header = encodeHeader(constants_1.SubProtocol.DR_REP, constants_1.RepMessageType.ATTESTATION, test);
|
|
107
|
+
const payload = Buffer.alloc(25);
|
|
108
|
+
payload.set(targetAddressHash, 0);
|
|
109
|
+
payload[20] = score;
|
|
110
|
+
payload.writeUInt32BE(nonce, 21);
|
|
111
|
+
return Buffer.concat([header, payload]);
|
|
112
|
+
}
|
|
113
|
+
// ---------- Utilities ----------
|
|
114
|
+
/** Compute SHA-256 hash of a manifest JSON string */
|
|
115
|
+
function manifestHash(manifestJson) {
|
|
116
|
+
return Buffer.from((0, sha256_1.sha256)(Buffer.from(manifestJson, 'utf-8')));
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=opreturn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opreturn.js","sourceRoot":"","sources":["../src/opreturn.ts"],"names":[],"mappings":";;AAyBA,oCAOC;AAMD,oCAYC;AAKD,8DASC;AAGD,wDAOC;AAKD,4DAwBC;AAGD,8CAgBC;AAGD,4CAOC;AAKD,8CAoBC;AAKD,oCAEC;AApKD;;;;;;;GAOG;AACH,iDAA8C;AAC9C,mDAW6B;AAE7B,+BAA+B;AAE/B,uFAAuF;AACvF,SAAgB,YAAY,CAC1B,WAAwB,EACxB,WAAmB,EACnB,IAAI,GAAG,KAAK;IAEZ,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,sBAAU,GAAG,wBAAY,CAAC,CAAC,CAAC,sBAAU,CAAC;IAClE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAC1E,CAAC;AAKD,yGAAyG;AACzG,SAAgB,YAAY,CAAC,IAAgB;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,0BAAc;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,UAAU,GAAG,wBAAY,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAgB,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,0BAAc,CAAC,CAAC;IAE3C,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED,uCAAuC;AAEvC,qFAAqF;AACrF,SAAgB,yBAAyB,CAAC,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,KAAK;IAChE,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAW,CAAC,OAAO,EAAE,2BAAe,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAC7F,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE/C,IAAI,UAAU,CAAC,MAAM,GAAG,0BAAc,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,iBAAiB,0BAAc,WAAW,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,8EAA8E;AAC9E,SAAgB,sBAAsB,CAAC,cAA0B,EAAE,IAAI,GAAG,KAAK;IAC7E,IAAI,cAAc,CAAC,MAAM,KAAK,EAAE,IAAI,cAAc,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,4CAA4C,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAW,CAAC,OAAO,EAAE,2BAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,sCAAsC;AAEtC,qGAAqG;AACrG,SAAgB,wBAAwB,CACtC,QAAgB,EAChB,KAAa,EACb,iBAA6B,EAC7B,EAAE,IAAI,GAAG,KAAK,EAAE,cAAc,GAAG,EAAE,KAAkD,EAAE;IAEvF,IAAI,iBAAiB,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,uCAAuC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,WAAW,CAAC,MAAM,GAAG,0BAAc,GAAG,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,oBAAoB,WAAW,CAAC,MAAM,eAAe,0BAAc,GAAG,EAAE,GAAG,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAW,CAAC,MAAM,EAAE,0BAAc,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,kFAAkF;AAClF,SAAgB,iBAAiB,CAC/B,SAAqB,EACrB,aAAyB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EACxC,IAAI,GAAG,KAAK;IAEZ,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,0BAAc,GAAG,EAAE,CAAC,CAAC,WAAW;IAC/C,IAAI,UAAU,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,WAAW,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAW,CAAC,MAAM,EAAE,0BAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,gEAAgE;AAChE,SAAgB,gBAAgB,CAAC,SAAqB,EAAE,IAAI,GAAG,KAAK;IAClE,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAW,CAAC,MAAM,EAAE,0BAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,sCAAsC;AAEtC,iGAAiG;AACjG,SAAgB,iBAAiB,CAC/B,iBAA6B,EAC7B,KAAa,EACb,KAAa,EACb,IAAI,GAAG,KAAK;IAEZ,IAAI,iBAAiB,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,6CAA6C,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,uBAAW,CAAC,MAAM,EAAE,0BAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;IACpB,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,kCAAkC;AAElC,qDAAqD;AACrD,SAAgB,YAAY,CAAC,YAAoB;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buyer-side payment flow: request service, pay invoice, receive delivery.
|
|
3
|
+
*/
|
|
4
|
+
import { Wallet } from '../wallet/wallet';
|
|
5
|
+
import { ConfirmationTier } from '../models/enums';
|
|
6
|
+
import { PaymentInvoice, ServiceDelivery } from '../models/messages';
|
|
7
|
+
/**
|
|
8
|
+
* Send a SERVICE_REQUEST and receive a PAYMENT_INVOICE.
|
|
9
|
+
* Returns [invoice, requestEndpointUrl].
|
|
10
|
+
*/
|
|
11
|
+
export declare function requestService(params: {
|
|
12
|
+
wallet: Wallet;
|
|
13
|
+
sellerUrl: string;
|
|
14
|
+
serviceId: string;
|
|
15
|
+
serviceParams?: Record<string, unknown>;
|
|
16
|
+
maxAmount?: string;
|
|
17
|
+
confirmationTier?: ConfirmationTier;
|
|
18
|
+
sellerAddress?: string;
|
|
19
|
+
}): Promise<[PaymentInvoice, string]>;
|
|
20
|
+
/**
|
|
21
|
+
* Pay an invoice: build TX, broadcast, send PAYMENT_BROADCAST, receive SERVICE_DELIVERY.
|
|
22
|
+
*/
|
|
23
|
+
export declare function payInvoice(params: {
|
|
24
|
+
wallet: Wallet;
|
|
25
|
+
invoice: PaymentInvoice;
|
|
26
|
+
sellerUrl: string;
|
|
27
|
+
test?: boolean;
|
|
28
|
+
}): Promise<ServiceDelivery>;
|
|
29
|
+
//# sourceMappingURL=buyer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buyer.d.ts","sourceRoot":"","sources":["../../src/payment/buyer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,cAAc,EAEd,eAAe,EAKhB,MAAM,oBAAoB,CAAC;AAG5B;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CA2DpC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,eAAe,CAAC,CAsE3B"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requestService = requestService;
|
|
4
|
+
exports.payInvoice = payInvoice;
|
|
5
|
+
const utxo_1 = require("../wallet/utxo");
|
|
6
|
+
const opreturn_1 = require("../opreturn");
|
|
7
|
+
const script_1 = require("../crypto/script");
|
|
8
|
+
const enums_1 = require("../models/enums");
|
|
9
|
+
const messages_1 = require("../models/messages");
|
|
10
|
+
const exceptions_1 = require("../exceptions");
|
|
11
|
+
/**
|
|
12
|
+
* Send a SERVICE_REQUEST and receive a PAYMENT_INVOICE.
|
|
13
|
+
* Returns [invoice, requestEndpointUrl].
|
|
14
|
+
*/
|
|
15
|
+
async function requestService(params) {
|
|
16
|
+
const { wallet, sellerUrl, serviceId, serviceParams, maxAmount = '0.01', confirmationTier = enums_1.ConfirmationTier.MEMPOOL, sellerAddress = '', } = params;
|
|
17
|
+
const requestUrl = `${sellerUrl.replace(/\/$/, '')}/drpay/request`;
|
|
18
|
+
const request = (0, messages_1.createPaymentRequest)({
|
|
19
|
+
fromAddress: wallet.address,
|
|
20
|
+
toAddress: sellerAddress,
|
|
21
|
+
serviceId,
|
|
22
|
+
serviceParams,
|
|
23
|
+
maxAmount,
|
|
24
|
+
confirmationTier,
|
|
25
|
+
});
|
|
26
|
+
let response;
|
|
27
|
+
try {
|
|
28
|
+
response = await fetch(requestUrl, {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: { 'Content-Type': 'application/json' },
|
|
31
|
+
body: JSON.stringify(request),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
throw new exceptions_1.NetworkError(`Failed to reach seller: ${err.message}`);
|
|
36
|
+
}
|
|
37
|
+
const data = await response.json();
|
|
38
|
+
// Check for error response
|
|
39
|
+
if (data.type === 'error') {
|
|
40
|
+
const errResp = messages_1.ErrorResponseSchema.parse(data);
|
|
41
|
+
throw new exceptions_1.PaymentError(`Seller error: ${errResp.error.code} — ${errResp.error.message}`);
|
|
42
|
+
}
|
|
43
|
+
const invoice = messages_1.PaymentInvoiceSchema.parse(data);
|
|
44
|
+
// Validate invoice
|
|
45
|
+
const now = Math.floor(Date.now() / 1000);
|
|
46
|
+
if (invoice.payment.expires_at <= now) {
|
|
47
|
+
throw new exceptions_1.InvoiceExpiredError();
|
|
48
|
+
}
|
|
49
|
+
// Validate amount doesn't exceed max
|
|
50
|
+
const invoiceAmountSat = (0, utxo_1.dgbToSat)(invoice.payment.amount);
|
|
51
|
+
const maxAmountSat = (0, utxo_1.dgbToSat)(maxAmount);
|
|
52
|
+
if (invoiceAmountSat > maxAmountSat) {
|
|
53
|
+
throw new exceptions_1.PaymentError(`Invoice amount ${invoice.payment.amount} DGB exceeds max ${maxAmount} DGB`);
|
|
54
|
+
}
|
|
55
|
+
return [invoice, requestUrl];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Pay an invoice: build TX, broadcast, send PAYMENT_BROADCAST, receive SERVICE_DELIVERY.
|
|
59
|
+
*/
|
|
60
|
+
async function payInvoice(params) {
|
|
61
|
+
const { wallet, invoice, sellerUrl, test = false } = params;
|
|
62
|
+
// Check expiry
|
|
63
|
+
const now = Math.floor(Date.now() / 1000);
|
|
64
|
+
if (invoice.payment.expires_at <= now) {
|
|
65
|
+
throw new exceptions_1.InvoiceExpiredError();
|
|
66
|
+
}
|
|
67
|
+
const amountSat = (0, utxo_1.dgbToSat)(invoice.payment.amount);
|
|
68
|
+
// Encode payment memo in OP_RETURN
|
|
69
|
+
// Use first 16 bytes of invoice ID as the memo invoice_id
|
|
70
|
+
const invoiceIdBytes = Buffer.alloc(16);
|
|
71
|
+
const idStr = invoice.id.replace(/^inv_/, '');
|
|
72
|
+
const idBuf = Buffer.from(idStr, 'utf-8');
|
|
73
|
+
idBuf.copy(invoiceIdBytes, 0, 0, Math.min(idBuf.length, 16));
|
|
74
|
+
const opReturnData = (0, opreturn_1.encodePaymentMemo)(invoiceIdBytes, Buffer.alloc(0), test);
|
|
75
|
+
// Build and sign transaction
|
|
76
|
+
const tx = await wallet.buildPayment({
|
|
77
|
+
toAddress: invoice.payment.address,
|
|
78
|
+
amountSat,
|
|
79
|
+
opReturnData,
|
|
80
|
+
});
|
|
81
|
+
// Broadcast
|
|
82
|
+
const txid = await wallet.broadcast(tx);
|
|
83
|
+
// Find the payment output vout
|
|
84
|
+
const expectedScript = (0, script_1.addressToScriptPubkey)(invoice.payment.address, wallet.getNetwork());
|
|
85
|
+
let paymentVout = 0;
|
|
86
|
+
for (let i = 0; i < tx.outputs.length; i++) {
|
|
87
|
+
if (Buffer.compare(tx.outputs[i].scriptPubkey, expectedScript) === 0) {
|
|
88
|
+
paymentVout = i;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Send PAYMENT_BROADCAST
|
|
93
|
+
const broadcastUrl = `${sellerUrl.replace(/\/$/, '')}/drpay/broadcast`;
|
|
94
|
+
const broadcast = (0, messages_1.createPaymentBroadcast)({
|
|
95
|
+
invoiceId: invoice.id,
|
|
96
|
+
txid,
|
|
97
|
+
vout: paymentVout,
|
|
98
|
+
rawTx: invoice.terms.confirmation_tier === 'mempool' ? tx.hex() : undefined,
|
|
99
|
+
});
|
|
100
|
+
let deliveryResponse;
|
|
101
|
+
try {
|
|
102
|
+
deliveryResponse = await fetch(broadcastUrl, {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
headers: { 'Content-Type': 'application/json' },
|
|
105
|
+
body: JSON.stringify(broadcast),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
throw new exceptions_1.NetworkError(`Failed to send broadcast to seller: ${err.message}`);
|
|
110
|
+
}
|
|
111
|
+
const deliveryData = await deliveryResponse.json();
|
|
112
|
+
if (deliveryData.type === 'error') {
|
|
113
|
+
const errResp = messages_1.ErrorResponseSchema.parse(deliveryData);
|
|
114
|
+
throw new exceptions_1.PaymentError(`Seller error on broadcast: ${errResp.error.code} — ${errResp.error.message}`);
|
|
115
|
+
}
|
|
116
|
+
return messages_1.ServiceDeliverySchema.parse(deliveryData);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=buyer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buyer.js","sourceRoot":"","sources":["../../src/payment/buyer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PaymentFlow: high-level orchestrator combining buyer operations.
|
|
3
|
+
*/
|
|
4
|
+
import { Wallet } from '../wallet/wallet';
|
|
5
|
+
import { ConfirmationTier } from '../models/enums';
|
|
6
|
+
import { ServiceDelivery } from '../models/messages';
|
|
7
|
+
/**
|
|
8
|
+
* Complete a full payment flow in one call:
|
|
9
|
+
* discover → request → pay → receive delivery.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buy(params: {
|
|
12
|
+
wallet: Wallet;
|
|
13
|
+
sellerUrl: string;
|
|
14
|
+
serviceId: string;
|
|
15
|
+
serviceParams?: Record<string, unknown>;
|
|
16
|
+
maxAmount?: string;
|
|
17
|
+
confirmationTier?: ConfirmationTier;
|
|
18
|
+
test?: boolean;
|
|
19
|
+
}): Promise<ServiceDelivery>;
|
|
20
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/payment/flow.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD;;;GAGG;AACH,wBAAsB,GAAG,CAAC,MAAM,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B3B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buy = buy;
|
|
4
|
+
const enums_1 = require("../models/enums");
|
|
5
|
+
const buyer_1 = require("./buyer");
|
|
6
|
+
/**
|
|
7
|
+
* Complete a full payment flow in one call:
|
|
8
|
+
* discover → request → pay → receive delivery.
|
|
9
|
+
*/
|
|
10
|
+
async function buy(params) {
|
|
11
|
+
const { wallet, sellerUrl, serviceId, serviceParams, maxAmount = '0.01', confirmationTier = enums_1.ConfirmationTier.MEMPOOL, test = false, } = params;
|
|
12
|
+
// Step 1: Request service (sends SERVICE_REQUEST, receives PAYMENT_INVOICE)
|
|
13
|
+
const [invoice] = await (0, buyer_1.requestService)({
|
|
14
|
+
wallet,
|
|
15
|
+
sellerUrl,
|
|
16
|
+
serviceId,
|
|
17
|
+
serviceParams,
|
|
18
|
+
maxAmount,
|
|
19
|
+
confirmationTier,
|
|
20
|
+
});
|
|
21
|
+
// Step 2: Pay invoice (builds TX, broadcasts, sends PAYMENT_BROADCAST, receives SERVICE_DELIVERY)
|
|
22
|
+
return (0, buyer_1.payInvoice)({
|
|
23
|
+
wallet,
|
|
24
|
+
invoice,
|
|
25
|
+
sellerUrl,
|
|
26
|
+
test,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/payment/flow.ts"],"names":[],"mappings":";;AAYA,kBAoCC;AA5CD,2CAAmD;AAEnD,mCAAqD;AAErD;;;GAGG;AACI,KAAK,UAAU,GAAG,CAAC,MAQzB;IACC,MAAM,EACJ,MAAM,EACN,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,GAAG,MAAM,EAClB,gBAAgB,GAAG,wBAAgB,CAAC,OAAO,EAC3C,IAAI,GAAG,KAAK,GACb,GAAG,MAAM,CAAC;IAEX,4EAA4E;IAC5E,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAA,sBAAc,EAAC;QACrC,MAAM;QACN,SAAS;QACT,SAAS;QACT,aAAa;QACb,SAAS;QACT,gBAAgB;KACjB,CAAC,CAAC;IAEH,kGAAkG;IAClG,OAAO,IAAA,kBAAU,EAAC;QAChB,MAAM;QACN,OAAO;QACP,SAAS;QACT,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/payment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyRawTxSimple = exports.buy = exports.SellerFlow = exports.payInvoice = exports.requestService = void 0;
|
|
4
|
+
var buyer_1 = require("./buyer");
|
|
5
|
+
Object.defineProperty(exports, "requestService", { enumerable: true, get: function () { return buyer_1.requestService; } });
|
|
6
|
+
Object.defineProperty(exports, "payInvoice", { enumerable: true, get: function () { return buyer_1.payInvoice; } });
|
|
7
|
+
var seller_1 = require("./seller");
|
|
8
|
+
Object.defineProperty(exports, "SellerFlow", { enumerable: true, get: function () { return seller_1.SellerFlow; } });
|
|
9
|
+
var flow_1 = require("./flow");
|
|
10
|
+
Object.defineProperty(exports, "buy", { enumerable: true, get: function () { return flow_1.buy; } });
|
|
11
|
+
var verification_1 = require("./verification");
|
|
12
|
+
Object.defineProperty(exports, "verifyRawTxSimple", { enumerable: true, get: function () { return verification_1.verifyRawTxSimple; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/payment/index.ts"],"names":[],"mappings":";;;AAAA,iCAAqD;AAA5C,uGAAA,cAAc,OAAA;AAAE,mGAAA,UAAU,OAAA;AACnC,mCAAsD;AAA7C,oGAAA,UAAU,OAAA;AACnB,+BAA6B;AAApB,2FAAA,GAAG,OAAA;AACZ,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seller-side payment flow: handle requests, verify payments, deliver services.
|
|
3
|
+
*/
|
|
4
|
+
import { RpcClient } from '../rpc/client';
|
|
5
|
+
import { Wallet } from '../wallet/wallet';
|
|
6
|
+
import { PaymentInvoice, ServiceDelivery, ErrorResponse } from '../models/messages';
|
|
7
|
+
import { Service } from '../models/manifest';
|
|
8
|
+
import { NetworkParams } from '../network/params';
|
|
9
|
+
/** Service handler function type */
|
|
10
|
+
export type ServiceHandler = (params: Record<string, unknown> | undefined) => Promise<Record<string, unknown>>;
|
|
11
|
+
export declare class SellerFlow {
|
|
12
|
+
private wallet;
|
|
13
|
+
private rpc;
|
|
14
|
+
private network;
|
|
15
|
+
private autoRefund;
|
|
16
|
+
private services;
|
|
17
|
+
private pendingInvoices;
|
|
18
|
+
constructor(wallet: Wallet, network?: NetworkParams, rpc?: RpcClient, autoRefund?: boolean);
|
|
19
|
+
/** Register a service with its handler */
|
|
20
|
+
registerService(service: Service, handler: ServiceHandler): void;
|
|
21
|
+
/** Handle a SERVICE_REQUEST → return PAYMENT_INVOICE or ErrorResponse */
|
|
22
|
+
handleRequest(data: unknown): PaymentInvoice | ErrorResponse;
|
|
23
|
+
/** Handle a PAYMENT_BROADCAST → verify payment → execute handler → return ServiceDelivery or ErrorResponse */
|
|
24
|
+
handleBroadcast(data: unknown): Promise<ServiceDelivery | ErrorResponse>;
|
|
25
|
+
private attemptRefund;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=seller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller.d.ts","sourceRoot":"","sources":["../../src/payment/seller.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C,OAAO,EAKL,cAAc,EACd,eAAe,EACf,aAAa,EAId,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AAI3D,oCAAoC;AACpC,MAAM,MAAM,cAAc,GAAG,CAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAUtC,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAyE;IACzF,OAAO,CAAC,eAAe,CAA0C;gBAErD,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAuB,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,GAAE,OAAc;IAOzG,0CAA0C;IAC1C,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAIhE,yEAAyE;IACzE,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,aAAa;IA2C5D,8GAA8G;IACxG,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,aAAa,CAAC;YAwGhE,aAAa;CAiC5B"}
|