ecash-lib 4.7.0 → 4.9.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/dist/index.d.ts CHANGED
@@ -27,5 +27,6 @@ export * from './token/empp.js';
27
27
  export * from './token/slp.js';
28
28
  export * from './token/slp.parse.js';
29
29
  export * from './parse/opreturn.js';
30
+ export * from './inputData.js';
30
31
  export * as payment from './payment';
31
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -69,5 +69,6 @@ __exportStar(require("./token/empp.js"), exports);
69
69
  __exportStar(require("./token/slp.js"), exports);
70
70
  __exportStar(require("./token/slp.parse.js"), exports);
71
71
  __exportStar(require("./parse/opreturn.js"), exports);
72
+ __exportStar(require("./inputData.js"), exports);
72
73
  exports.payment = __importStar(require("./payment"));
73
74
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,mEAAmE;AACnE,sEAAsE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtE,8CAA4B;AAC5B,2CAAyB;AACzB,4CAA0B;AAC1B,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;AAC5B,gDAA8B;AAC9B,gDAA8B;AAC9B,gDAA8B;AAC9B,uDAAqC;AACrC,mDAAiC;AACjC,0CAAwB;AACxB,iDAA+B;AAC/B,kDAAgC;AAChC,gDAA8B;AAC9B,8CAA4B;AAC5B,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,iDAA+B;AAC/B,sDAAoC;AACpC,uDAAqC;AACrC,iDAA+B;AAC/B,uDAAqC;AACrC,oDAAkC;AAClC,kDAAgC;AAChC,iDAA+B;AAC/B,uDAAqC;AACrC,sDAAoC;AACpC,qDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,mEAAmE;AACnE,sEAAsE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtE,8CAA4B;AAC5B,2CAAyB;AACzB,4CAA0B;AAC1B,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;AAC5B,gDAA8B;AAC9B,gDAA8B;AAC9B,gDAA8B;AAC9B,uDAAqC;AACrC,mDAAiC;AACjC,0CAAwB;AACxB,iDAA+B;AAC/B,kDAAgC;AAChC,gDAA8B;AAC9B,8CAA4B;AAC5B,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,iDAA+B;AAC/B,sDAAoC;AACpC,uDAAqC;AACrC,iDAA+B;AAC/B,uDAAqC;AACrC,oDAAkC;AAClC,kDAAgC;AAChC,iDAA+B;AAC/B,uDAAqC;AACrC,sDAAoC;AACpC,iDAA+B;AAC/B,qDAAqC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Result of decoding a P2SH input that uses the Agora-style input-data format.
3
+ *
4
+ * Format follows ecash-agora ad script (ad.ts parseAdScriptSig, partial.ts adScript):
5
+ * - scriptSig = <lokad> <data> <sig> <pubkey> <redeemScript>
6
+ * - lokad first for chronik lokadId indexing
7
+ * - Redeem script: OP_CHECKSIGVERIFY pushBytes(data) OP_EQUALVERIFY pushBytes(lokad) OP_EQUAL
8
+ */
9
+ export interface DecodedInputData {
10
+ /** 4-byte lokad ID (for chronik indexing) */
11
+ lokadId: Uint8Array;
12
+ /** Arbitrary data bytes */
13
+ data: Uint8Array;
14
+ /** Sender's P2PKH address (from pubkey in scriptSig) */
15
+ address: string;
16
+ }
17
+ /**
18
+ * Decode scriptSig from a P2SH input that uses the Agora-style input-data format.
19
+ *
20
+ * Built: scriptSig = [lokad, data, sig, pubkey, redeemScript]
21
+ * Redeem script: OP_CHECKSIG pushBytes(data) OP_EQUALVERIFY pushBytes(lokad) OP_EQUAL
22
+ *
23
+ * @param scriptSig - The scriptSig bytes from the spending input
24
+ * @param prefix - Address prefix (default 'ecash')
25
+ * @returns Decoded lokadId, data, and address, or undefined if the format doesn't match
26
+ */
27
+ export declare function decodeInputData(scriptSig: Uint8Array, prefix?: string): DecodedInputData | undefined;
28
+ //# sourceMappingURL=inputData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputData.d.ts","sourceRoot":"","sources":["../src/inputData.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC7B,6CAA6C;IAC7C,OAAO,EAAE,UAAU,CAAC;IACpB,2BAA2B;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,SAAS,EAAE,UAAU,EACrB,MAAM,SAAU,GACjB,gBAAgB,GAAG,SAAS,CAoE9B"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ // Copyright (c) 2026 The Bitcoin developers
3
+ // Distributed under the MIT software license, see the accompanying
4
+ // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.decodeInputData = decodeInputData;
7
+ const bytes_js_1 = require("./io/bytes.js");
8
+ const op_js_1 = require("./op.js");
9
+ const hash_js_1 = require("./hash.js");
10
+ const address_js_1 = require("./address/address.js");
11
+ const opcode_js_1 = require("./opcode.js");
12
+ /**
13
+ * Decode scriptSig from a P2SH input that uses the Agora-style input-data format.
14
+ *
15
+ * Built: scriptSig = [lokad, data, sig, pubkey, redeemScript]
16
+ * Redeem script: OP_CHECKSIG pushBytes(data) OP_EQUALVERIFY pushBytes(lokad) OP_EQUAL
17
+ *
18
+ * @param scriptSig - The scriptSig bytes from the spending input
19
+ * @param prefix - Address prefix (default 'ecash')
20
+ * @returns Decoded lokadId, data, and address, or undefined if the format doesn't match
21
+ */
22
+ function decodeInputData(scriptSig, prefix = 'ecash') {
23
+ const pushes = [];
24
+ const bytes = new bytes_js_1.Bytes(scriptSig);
25
+ while (bytes.data.length - bytes.idx > 0) {
26
+ try {
27
+ const op = (0, op_js_1.readOp)(bytes);
28
+ if ((0, op_js_1.isPushOp)(op)) {
29
+ pushes.push(op.data);
30
+ }
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ // scriptSig = <lokad> <data> <sig> <pubkey> <redeemScript>
37
+ if (pushes.length < 5) {
38
+ return undefined;
39
+ }
40
+ const lokadId = pushes[0];
41
+ if (lokadId.length !== 4) {
42
+ return undefined;
43
+ }
44
+ const data = pushes[1];
45
+ const pubkey = pushes[pushes.length - 2];
46
+ const redeemScript = pushes[pushes.length - 1];
47
+ if (pubkey.length !== 33 && pubkey.length !== 65) {
48
+ return undefined;
49
+ }
50
+ // Redeem script: OP_CHECKSIGVERIFY pushBytes(data) OP_EQUALVERIFY pushBytes(lokad) OP_EQUAL
51
+ const redeemBytes = new bytes_js_1.Bytes(redeemScript);
52
+ try {
53
+ if ((0, op_js_1.readOp)(redeemBytes) !== opcode_js_1.OP_CHECKSIGVERIFY) {
54
+ return undefined;
55
+ }
56
+ const dataOp = (0, op_js_1.readOp)(redeemBytes);
57
+ if (!(0, op_js_1.isPushOp)(dataOp)) {
58
+ return undefined;
59
+ }
60
+ if (dataOp.data.length !== data.length ||
61
+ dataOp.data.some((b, i) => b !== data[i])) {
62
+ return undefined;
63
+ }
64
+ if ((0, op_js_1.readOp)(redeemBytes) !== opcode_js_1.OP_EQUALVERIFY) {
65
+ return undefined;
66
+ }
67
+ const lokadOp = (0, op_js_1.readOp)(redeemBytes);
68
+ if (!(0, op_js_1.isPushOp)(lokadOp) || lokadOp.data.length !== 4) {
69
+ return undefined;
70
+ }
71
+ if (lokadOp.data.some((b, i) => b !== lokadId[i])) {
72
+ return undefined;
73
+ }
74
+ if ((0, op_js_1.readOp)(redeemBytes) !== opcode_js_1.OP_EQUAL) {
75
+ return undefined;
76
+ }
77
+ }
78
+ catch {
79
+ return undefined;
80
+ }
81
+ const pkh = (0, hash_js_1.shaRmd160)(pubkey);
82
+ const address = address_js_1.Address.p2pkh(pkh, prefix).toString();
83
+ return { lokadId, data, address };
84
+ }
85
+ //# sourceMappingURL=inputData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputData.js","sourceRoot":"","sources":["../src/inputData.ts"],"names":[],"mappings":"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"}
package/dist/op.d.ts CHANGED
@@ -14,6 +14,14 @@ export interface PushOp {
14
14
  opcode: Opcode;
15
15
  data: Uint8Array;
16
16
  }
17
+ /**
18
+ * Parse a number from a script op.
19
+ * Inverse of pushNumberOp: handles OP_0 (0), OP_1NEGATE (-1), OP_1 through OP_16,
20
+ * single-byte push data, and multi-byte minimal script number encoding (up to 64-bit).
21
+ * Always returns bigint for type safety (matches CScriptNum::getint).
22
+ * @throws Error with descriptive message if the op does not encode a number
23
+ */
24
+ export declare function parseNumberFromOp(op: Op): bigint;
17
25
  /** Returns true if the given object is a `PushOp` */
18
26
  export declare function isPushOp(op: any): op is PushOp;
19
27
  /** Read a single Script operation from the bytes */
package/dist/op.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAMH,MAAM,EACT,MAAM,aAAa,CAAC;AAErB;;;IAGI;AACJ,MAAM,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjC;;;IAGI;AACJ,MAAM,WAAW,MAAM;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;CACpB;AAED,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,MAAM,CAU9C;AAED,oDAAoD;AACpD,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,CAsBvC;AAED,6CAA6C;AAC7C,wBAAgB,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QA+B7C;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,CAuBhD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,EAAE,CA8BvD"}
1
+ {"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAQH,MAAM,EACT,MAAM,aAAa,CAAC;AAErB;;;IAGI;AACJ,MAAM,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjC;;;IAGI;AACJ,MAAM,WAAW,MAAM;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;CACpB;AAqED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAwBhD;AAED,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,MAAM,CAU9C;AAED,oDAAoD;AACpD,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,CAsBvC;AAED,6CAA6C;AAC7C,wBAAgB,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QA+B7C;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,CAuBhD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,EAAE,CA8BvD"}
package/dist/op.js CHANGED
@@ -3,12 +3,109 @@
3
3
  // Distributed under the MIT software license, see the accompanying
4
4
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseNumberFromOp = parseNumberFromOp;
6
7
  exports.isPushOp = isPushOp;
7
8
  exports.readOp = readOp;
8
9
  exports.writeOp = writeOp;
9
10
  exports.pushBytesOp = pushBytesOp;
10
11
  exports.pushNumberOp = pushNumberOp;
12
+ const consts_js_1 = require("./consts.js");
11
13
  const opcode_js_1 = require("./opcode.js");
14
+ /**
15
+ * Check if bytes are a minimally encoded script number (not arbitrary data).
16
+ * See CScriptNum::IsMinimallyEncoded in script/script.cpp.
17
+ */
18
+ function isMinimallyEncoded(data) {
19
+ if (data.length === 0)
20
+ return true;
21
+ // Check that the number is encoded with the minimum possible number of bytes.
22
+ // If the most-significant-byte (excluding the sign bit) is zero then we're not minimal.
23
+ // This also rejects the negative-zero encoding, 0x80.
24
+ const last = data[data.length - 1];
25
+ if ((last & 0x7f) === 0) {
26
+ // One exception: if there's more than one byte and the most significant bit of the
27
+ // second-to-last byte is set, it would conflict with the sign bit. E.g. +-255
28
+ // encode to 0xff00 and 0xff80 respectively.
29
+ if (data.length <= 1 || (data[data.length - 2] & 0x80) === 0) {
30
+ return false;
31
+ }
32
+ }
33
+ return true;
34
+ }
35
+ /**
36
+ * Decode a minimally-encoded script number from bytes (little-endian, sign-magnitude).
37
+ * Validates size and minimal encoding; callers can rely on returned value being valid.
38
+ * Always returns bigint for type safety and full 64-bit range (matches CScriptNum::getint).
39
+ * Empty byte array decodes to 0.
40
+ * @throws Error if data exceeds max size or is not minimally encoded
41
+ */
42
+ function decodeScriptNum(data) {
43
+ if (data.length === 0) {
44
+ return 0n;
45
+ }
46
+ if (data.length > consts_js_1.MAX_SCRIPTNUM_BYTE_SIZE) {
47
+ throw new Error(`Script number exceeds maximum size (${data.length} > ${consts_js_1.MAX_SCRIPTNUM_BYTE_SIZE} bytes)`);
48
+ }
49
+ if (!isMinimallyEncoded(data)) {
50
+ throw new Error('Script number is not minimally encoded');
51
+ }
52
+ let result = 0n;
53
+ for (let i = 0; i < data.length; i++) {
54
+ result |= BigInt(data[i]) << BigInt(8 * i);
55
+ }
56
+ if (data[data.length - 1] & 0x80) {
57
+ const mask = ~(0x80n << BigInt(8 * (data.length - 1)));
58
+ result &= mask;
59
+ result = -result;
60
+ }
61
+ return result;
62
+ }
63
+ /**
64
+ * Check if the PushOp uses minimal push encoding for its data length.
65
+ * pushNumberOp always produces minimal pushes.
66
+ */
67
+ function isMinimalPushOp(pushOp) {
68
+ const len = pushOp.data.length;
69
+ if (len === 0)
70
+ return pushOp.opcode === opcode_js_1.OP_0;
71
+ if (len >= 1 && len <= 0x4b)
72
+ return pushOp.opcode === len;
73
+ if (len >= 0x4c && len <= 0xff)
74
+ return pushOp.opcode === opcode_js_1.OP_PUSHDATA1;
75
+ if (len >= 0x100 && len <= 0xffff)
76
+ return pushOp.opcode === opcode_js_1.OP_PUSHDATA2;
77
+ if (len >= 0x10000 && len <= 0xffffffff)
78
+ return pushOp.opcode === opcode_js_1.OP_PUSHDATA4;
79
+ return false;
80
+ }
81
+ /**
82
+ * Parse a number from a script op.
83
+ * Inverse of pushNumberOp: handles OP_0 (0), OP_1NEGATE (-1), OP_1 through OP_16,
84
+ * single-byte push data, and multi-byte minimal script number encoding (up to 64-bit).
85
+ * Always returns bigint for type safety (matches CScriptNum::getint).
86
+ * @throws Error with descriptive message if the op does not encode a number
87
+ */
88
+ function parseNumberFromOp(op) {
89
+ if (typeof op === 'number') {
90
+ if (op === opcode_js_1.OP_0) {
91
+ return 0n;
92
+ }
93
+ if (op === opcode_js_1.OP_1NEGATE) {
94
+ return -1n;
95
+ }
96
+ if (op >= opcode_js_1.OP_1 && op <= opcode_js_1.OP_16) {
97
+ return BigInt(op - 0x50);
98
+ }
99
+ throw new Error(`Opcode 0x${op.toString(16)} does not encode a number (expected OP_0, OP_1NEGATE, or OP_1-OP_16)`);
100
+ }
101
+ if (!isPushOp(op)) {
102
+ throw new Error('Op is not a push op');
103
+ }
104
+ if (!isMinimalPushOp(op)) {
105
+ throw new Error(`Push uses non-minimal encoding (opcode 0x${op.opcode.toString(16)} for ${op.data.length} bytes)`);
106
+ }
107
+ return decodeScriptNum(op.data);
108
+ }
12
109
  /** Returns true if the given object is a `PushOp` */
13
110
  function isPushOp(op) {
14
111
  if (!op || typeof op !== 'object') {
package/dist/op.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"op.js","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"op.js","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,23 @@ export interface Action {
71
71
  feePerKb?: bigint;
72
72
  /** Maximum tx sersize to be used for tx(s) of this action, defaults to MAX_TX_SERSIZE */
73
73
  maxTxSersize?: number;
74
+ /**
75
+ * Data encoded in a P2SH redeem script, revealed when the input is spent.
76
+ * Creates a chained tx: prep tx sends to P2SH, main tx spends it.
77
+ * Works for any tx type (XEC-only, SLP, ALP). Redeem script includes
78
+ * sender pubkey, so P2PKH address derivable from the spending input.
79
+ *
80
+ * Format follows ecash-agora ad script for chronik indexing:
81
+ * - lokad: 4-byte identifier (indexed by chronik as lokadId)
82
+ * - data: arbitrary bytes (like Agora covenant consts, minus covenant variant)
83
+ *
84
+ * scriptSig = <lokad> <data> <sig> <pubkey> <redeemScript>
85
+ * Redeem script: OP_CHECKSIGVERIFY pushBytes(data) OP_EQUALVERIFY pushBytes(lokad) OP_EQUAL
86
+ */
87
+ p2shInputData?: {
88
+ lokad: Uint8Array;
89
+ data: Uint8Array;
90
+ };
74
91
  }
75
92
  /**
76
93
  * Instructions for token actions within a given Action
@@ -139,6 +156,7 @@ export interface BurnAction {
139
156
  /**
140
157
  * Arbitrary data push to be included for token types that support EMPP
141
158
  * Not associated with PaymentOutput[]
159
+ * Only supported for ALP_TOKEN_TYPE_STANDARD (EMPP in OP_RETURN)
142
160
  */
143
161
  export interface DataAction {
144
162
  type: 'DATA';
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/payment/action.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,MAAM;IACnB;;;;OAIG;IACH,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACjB,aAAa,GACb,UAAU,GACV,UAAU,GACV,UAAU,GACV,UAAU,CAAC;AAEjB;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;CACpB"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/payment/action.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,MAAM;IACnB;;;;OAIG;IACH,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;CAC3D;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACjB,aAAa,GACb,UAAU,GACV,UAAU,GACV,UAAU,GACV,UAAU,CAAC;AAEjB;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/payment/action.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,mEAAmE;AACnE,sEAAsE;;;AA0FtE;;;;GAIG;AACU,QAAA,4BAA4B,GAAG,8BAA8B,CAAC"}
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/payment/action.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,mEAAmE;AACnE,sEAAsE;;;AAwGtE;;;;GAIG;AACU,QAAA,4BAA4B,GAAG,8BAA8B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecash-lib",
3
- "version": "4.7.0",
3
+ "version": "4.9.0",
4
4
  "description": "Library for eCash transaction building",
5
5
  "main": "./dist/indexNodeJs.js",
6
6
  "browser": "./dist/indexBrowser.js",
package/src/consts.ts CHANGED
@@ -37,5 +37,11 @@ export const OP_RETURN_MAX_BYTES = 223;
37
37
  */
38
38
  export const MAX_TX_SERSIZE = 100_000;
39
39
 
40
+ /**
41
+ * Maximum byte size of script numbers when interpreting Script.
42
+ * Mirrors MAX_SCRIPTNUM_BYTE_SIZE in src/script/script.h.
43
+ */
44
+ export const MAX_SCRIPTNUM_BYTE_SIZE = 8;
45
+
40
46
  // The size in bytes of a p2pkh output
41
47
  export const P2PKH_OUTPUT_SIZE = 34;