ecash-lib 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/ecc.d.ts +18 -1
- package/dist/ecc.d.ts.map +1 -1
- package/dist/ecc.js +29 -0
- package/dist/ecc.js.map +1 -1
- package/dist/ffi/ecash_lib_wasm_bg_browser.js +1743 -1679
- package/dist/ffi/ecash_lib_wasm_bg_browser.wasm +0 -0
- package/dist/ffi/ecash_lib_wasm_bg_browser.wasm.d.ts +13 -11
- package/dist/ffi/ecash_lib_wasm_bg_nodejs.wasm +0 -0
- package/dist/ffi/ecash_lib_wasm_bg_nodejs.wasm.d.ts +13 -11
- package/dist/ffi/ecash_lib_wasm_browser.d.ts +27 -11
- package/dist/ffi/ecash_lib_wasm_browser.js +64 -14
- package/dist/ffi/ecash_lib_wasm_nodejs.d.ts +14 -0
- package/dist/ffi/ecash_lib_wasm_nodejs.js +64 -14
- package/dist/hdwallet.d.ts.map +1 -1
- package/dist/hdwallet.js +1 -0
- package/dist/hdwallet.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/io/bytes.d.ts +2 -0
- package/dist/io/bytes.d.ts.map +1 -1
- package/dist/io/bytes.js +10 -2
- package/dist/io/bytes.js.map +1 -1
- package/dist/messages.d.ts +32 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +102 -0
- package/dist/messages.js.map +1 -0
- package/dist/op.d.ts.map +1 -1
- package/dist/op.js +4 -3
- package/dist/op.js.map +1 -1
- package/dist/payment/asn1.d.ts +61 -0
- package/dist/payment/asn1.d.ts.map +1 -0
- package/dist/payment/asn1.js +322 -0
- package/dist/payment/asn1.js.map +1 -0
- package/dist/payment/index.d.ts +3 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/index.js +32 -0
- package/dist/payment/index.js.map +1 -0
- package/dist/payment/x509.d.ts +11 -0
- package/dist/payment/x509.d.ts.map +1 -0
- package/dist/payment/x509.js +17 -0
- package/dist/payment/x509.js.map +1 -0
- package/dist/sigHashType.js.map +1 -1
- package/dist/token/alp.d.ts +6 -0
- package/dist/token/alp.d.ts.map +1 -1
- package/dist/token/alp.js +6 -2
- package/dist/token/alp.js.map +1 -1
- package/dist/token/alp.parse.d.ts +73 -0
- package/dist/token/alp.parse.d.ts.map +1 -0
- package/dist/token/alp.parse.js +168 -0
- package/dist/token/alp.parse.js.map +1 -0
- package/dist/token/common.d.ts +18 -0
- package/dist/token/common.d.ts.map +1 -1
- package/dist/token/common.js +23 -5
- package/dist/token/common.js.map +1 -1
- package/dist/token/empp.d.ts +10 -0
- package/dist/token/empp.d.ts.map +1 -1
- package/dist/token/empp.js +38 -1
- package/dist/token/empp.js.map +1 -1
- package/dist/token/slp.d.ts +12 -0
- package/dist/token/slp.d.ts.map +1 -1
- package/dist/token/slp.js +12 -2
- package/dist/token/slp.js.map +1 -1
- package/dist/token/slp.parse.d.ts +91 -0
- package/dist/token/slp.parse.d.ts.map +1 -0
- package/dist/token/slp.parse.js +251 -0
- package/dist/token/slp.parse.js.map +1 -0
- package/dist/txBuilder.js +1 -1
- package/dist/txBuilder.js.map +1 -1
- package/package.json +5 -7
- package/src/ecc.ts +54 -2
- package/src/ffi/ecash_lib_wasm_bg_browser.js +1743 -1679
- package/src/ffi/ecash_lib_wasm_bg_browser.wasm +0 -0
- package/src/ffi/ecash_lib_wasm_bg_browser.wasm.d.ts +13 -11
- package/src/ffi/ecash_lib_wasm_bg_nodejs.wasm +0 -0
- package/src/ffi/ecash_lib_wasm_bg_nodejs.wasm.d.ts +13 -11
- package/src/ffi/ecash_lib_wasm_browser.d.ts +27 -11
- package/src/ffi/ecash_lib_wasm_browser.js +64 -14
- package/src/ffi/ecash_lib_wasm_nodejs.d.ts +14 -0
- package/src/ffi/ecash_lib_wasm_nodejs.js +64 -14
- package/src/hdwallet.ts +1 -0
- package/src/index.ts +5 -0
- package/src/io/bytes.ts +11 -2
- package/src/messages.ts +125 -0
- package/src/op.ts +5 -3
- package/src/payment/asn1.ts +440 -0
- package/src/payment/index.ts +6 -0
- package/src/payment/x509.ts +15 -0
- package/src/sigHashType.ts +2 -2
- package/src/token/alp.parse.ts +258 -0
- package/src/token/alp.ts +10 -1
- package/src/token/common.ts +28 -4
- package/src/token/empp.ts +42 -1
- package/src/token/slp.parse.ts +383 -0
- package/src/token/slp.ts +22 -1
- package/src/txBuilder.ts +1 -1
- package/.eslintignore +0 -8
- package/eslint.config.js +0 -16
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Script } from '../script.js';
|
|
2
|
+
import { BURN_STR, GENESIS_STR, GenesisInfo, MINT_STR, SEND_STR, UNKNOWN_STR } from './common.js';
|
|
3
|
+
import { SLP_FUNGIBLE, SLP_MINT_VAULT, SLP_NFT1_GROUP, SlpTokenType } from './slp.js';
|
|
4
|
+
/** Parsed SLP GENESIS OP_RETURN Script */
|
|
5
|
+
export interface SlpGenesis {
|
|
6
|
+
/** "GENESIS" */
|
|
7
|
+
txType: typeof GENESIS_STR;
|
|
8
|
+
/** Token type of the token to create */
|
|
9
|
+
tokenType: SlpTokenType;
|
|
10
|
+
/** Info about the token */
|
|
11
|
+
genesisInfo: GenesisInfo;
|
|
12
|
+
/** Number of token atoms to initially mint to out_idx=1 */
|
|
13
|
+
initialAtoms: bigint;
|
|
14
|
+
/** Output index to send the mint baton to, or undefined if none */
|
|
15
|
+
mintBatonOutIdx?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parsed SLP MINT (token type 0x01 and 0x81) OP_RETURN Script.
|
|
19
|
+
* Note: Token type 0x41 has no mint batons.
|
|
20
|
+
**/
|
|
21
|
+
export interface SlpMintClassic {
|
|
22
|
+
/** "MINT" */
|
|
23
|
+
txType: typeof MINT_STR;
|
|
24
|
+
/** Token type of the token to mint */
|
|
25
|
+
tokenType: typeof SLP_FUNGIBLE | typeof SLP_NFT1_GROUP;
|
|
26
|
+
/** Token ID of the token to mint */
|
|
27
|
+
tokenId: string;
|
|
28
|
+
/** Number of token atoms to mint to out_idx=1 */
|
|
29
|
+
additionalAtoms: bigint;
|
|
30
|
+
/** Output index to send the mint baton to, or undefined to destroy it */
|
|
31
|
+
mintBatonOutIdx?: number;
|
|
32
|
+
}
|
|
33
|
+
/** Parsed SLP MINT (token type 0x02) OP_RETURN Script */
|
|
34
|
+
export interface SlpMintVault {
|
|
35
|
+
/** "MINT" */
|
|
36
|
+
txType: typeof MINT_STR;
|
|
37
|
+
/** Token type of the token to mint (0x02) */
|
|
38
|
+
tokenType: typeof SLP_MINT_VAULT;
|
|
39
|
+
/** Token ID of the token to mint */
|
|
40
|
+
tokenId: string;
|
|
41
|
+
/** Array of the number of token atoms to mint to the outputs at 1 to N */
|
|
42
|
+
additionalAtomsArray: bigint[];
|
|
43
|
+
}
|
|
44
|
+
/** Parsed SLP MINT OP_RETURN Script */
|
|
45
|
+
export type SlpMint = SlpMintClassic | SlpMintVault;
|
|
46
|
+
/** Parsed SLP SEND OP_RETURN Script */
|
|
47
|
+
export interface SlpSend {
|
|
48
|
+
/** "SEND" */
|
|
49
|
+
txType: typeof SEND_STR;
|
|
50
|
+
/** Token type of the token to send */
|
|
51
|
+
tokenType: SlpTokenType;
|
|
52
|
+
/** Token ID of the token to send */
|
|
53
|
+
tokenId: string;
|
|
54
|
+
/** Array of the number of token atoms to send to the outputs at 1 to N */
|
|
55
|
+
sendAtomsArray: bigint[];
|
|
56
|
+
}
|
|
57
|
+
/** Parsed SLP BURN OP_RETURN Script */
|
|
58
|
+
export interface SlpBurn {
|
|
59
|
+
/** "BURN" */
|
|
60
|
+
txType: typeof BURN_STR;
|
|
61
|
+
/** Token type of the token to burn */
|
|
62
|
+
tokenType: SlpTokenType;
|
|
63
|
+
/** Token ID of the token to burn */
|
|
64
|
+
tokenId: string;
|
|
65
|
+
/** How many tokens should be burned */
|
|
66
|
+
burnAtoms: bigint;
|
|
67
|
+
}
|
|
68
|
+
/** New unknown SLP token type or tx type */
|
|
69
|
+
export interface SlpUnknown {
|
|
70
|
+
/** Placeholder for unknown token type or tx type */
|
|
71
|
+
txType: typeof UNKNOWN_STR;
|
|
72
|
+
/** Token type number */
|
|
73
|
+
tokenType: number;
|
|
74
|
+
}
|
|
75
|
+
/** Parsed SLP OP_RETURN Script */
|
|
76
|
+
export type SlpData = SlpGenesis | SlpMint | SlpSend | SlpBurn | SlpUnknown;
|
|
77
|
+
/**
|
|
78
|
+
* Parse the given SLP OP_RETURN Script.
|
|
79
|
+
*
|
|
80
|
+
* For data that's clearly not SLP it will return `undefined`.
|
|
81
|
+
* For example, if the OP_RETURN or LOKAD ID is missing.
|
|
82
|
+
*
|
|
83
|
+
* For an unknown token type, it'll return SlpUnknown.
|
|
84
|
+
*
|
|
85
|
+
* For a known token type, it'll parse the remaining data, or throw an error if
|
|
86
|
+
* the format is invalid or if there's an unknown tx type.
|
|
87
|
+
*
|
|
88
|
+
* This behavior mirrors that of Chronik for consistency.
|
|
89
|
+
**/
|
|
90
|
+
export declare function parseSlp(opreturnScript: Script): SlpData | undefined;
|
|
91
|
+
//# sourceMappingURL=slp.parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slp.parse.d.ts","sourceRoot":"","sources":["../../src/token/slp.parse.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAgB,MAAM,cAAc,CAAC;AACpD,OAAO,EACH,QAAQ,EACR,WAAW,EACX,WAAW,EAEX,QAAQ,EACR,QAAQ,EAER,WAAW,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAEH,YAAY,EAIZ,cAAc,EAGd,cAAc,EACd,YAAY,EACf,MAAM,UAAU,CAAC;AAElB,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACvB,gBAAgB;IAChB,MAAM,EAAE,OAAO,WAAW,CAAC;IAC3B,wCAAwC;IACxC,SAAS,EAAE,YAAY,CAAC;IACxB,2BAA2B;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;IAGI;AACJ,MAAM,WAAW,cAAc;IAC3B,aAAa;IACb,MAAM,EAAE,OAAO,QAAQ,CAAC;IACxB,sCAAsC;IACtC,SAAS,EAAE,OAAO,YAAY,GAAG,OAAO,cAAc,CAAC;IACvD,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,yDAAyD;AACzD,MAAM,WAAW,YAAY;IACzB,aAAa;IACb,MAAM,EAAE,OAAO,QAAQ,CAAC;IACxB,6CAA6C;IAC7C,SAAS,EAAE,OAAO,cAAc,CAAC;IACjC,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,uCAAuC;AACvC,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,YAAY,CAAC;AAEpD,uCAAuC;AACvC,MAAM,WAAW,OAAO;IACpB,aAAa;IACb,MAAM,EAAE,OAAO,QAAQ,CAAC;IACxB,sCAAsC;IACtC,SAAS,EAAE,YAAY,CAAC;IACxB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,cAAc,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,uCAAuC;AACvC,MAAM,WAAW,OAAO;IACpB,aAAa;IACb,MAAM,EAAE,OAAO,QAAQ,CAAC;IACxB,sCAAsC;IACtC,SAAS,EAAE,YAAY,CAAC;IACxB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACvB,oDAAoD;IACpD,MAAM,EAAE,OAAO,WAAW,CAAC;IAC3B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,kCAAkC;AAClC,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE5E;;;;;;;;;;;;IAYI;AACJ,wBAAgB,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAgEpE"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2025 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.parseSlp = void 0;
|
|
7
|
+
const str_js_1 = require("../io/str.js");
|
|
8
|
+
const hex_js_1 = require("../io/hex.js");
|
|
9
|
+
const opcode_js_1 = require("../opcode.js");
|
|
10
|
+
const op_js_1 = require("../op.js");
|
|
11
|
+
const common_js_1 = require("./common.js");
|
|
12
|
+
const slp_js_1 = require("./slp.js");
|
|
13
|
+
/**
|
|
14
|
+
* Parse the given SLP OP_RETURN Script.
|
|
15
|
+
*
|
|
16
|
+
* For data that's clearly not SLP it will return `undefined`.
|
|
17
|
+
* For example, if the OP_RETURN or LOKAD ID is missing.
|
|
18
|
+
*
|
|
19
|
+
* For an unknown token type, it'll return SlpUnknown.
|
|
20
|
+
*
|
|
21
|
+
* For a known token type, it'll parse the remaining data, or throw an error if
|
|
22
|
+
* the format is invalid or if there's an unknown tx type.
|
|
23
|
+
*
|
|
24
|
+
* This behavior mirrors that of Chronik for consistency.
|
|
25
|
+
**/
|
|
26
|
+
function parseSlp(opreturnScript) {
|
|
27
|
+
const ops = opreturnScript.ops();
|
|
28
|
+
const opreturnOp = ops.next();
|
|
29
|
+
// Return undefined if not OP_RETURN
|
|
30
|
+
if (opreturnOp === undefined ||
|
|
31
|
+
(0, op_js_1.isPushOp)(opreturnOp) ||
|
|
32
|
+
opreturnOp !== opcode_js_1.OP_RETURN) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
// Return undefined if LOKAD ID is not "SLP\0"
|
|
36
|
+
const lokadId = ops.next();
|
|
37
|
+
if (lokadId === undefined || !(0, op_js_1.isPushOp)(lokadId)) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if ((0, str_js_1.bytesToStr)(lokadId.data) !== slp_js_1.SLP_LOKAD_ID_STR) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
// Parse token type
|
|
44
|
+
const tokenTypeBytes = nextBytes(ops);
|
|
45
|
+
if (tokenTypeBytes === undefined) {
|
|
46
|
+
throw new Error('Missing tokenType');
|
|
47
|
+
}
|
|
48
|
+
if (tokenTypeBytes.length !== 1) {
|
|
49
|
+
throw new Error('tokenType must be exactly 1 byte');
|
|
50
|
+
}
|
|
51
|
+
const tokenType = tokenTypeBytes[0];
|
|
52
|
+
if (tokenType !== slp_js_1.SLP_FUNGIBLE &&
|
|
53
|
+
tokenType !== slp_js_1.SLP_MINT_VAULT &&
|
|
54
|
+
tokenType !== slp_js_1.SLP_NFT1_GROUP &&
|
|
55
|
+
tokenType !== slp_js_1.SLP_NFT1_CHILD) {
|
|
56
|
+
return {
|
|
57
|
+
txType: common_js_1.UNKNOWN_STR,
|
|
58
|
+
tokenType,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Parse tx type (GENESIS, MINT, SEND, BURN)
|
|
62
|
+
const txTypeBytes = nextBytes(ops);
|
|
63
|
+
if (txTypeBytes === undefined) {
|
|
64
|
+
throw new Error('Missing txType');
|
|
65
|
+
}
|
|
66
|
+
const txType = (0, str_js_1.bytesToStr)(txTypeBytes);
|
|
67
|
+
// Handle tx type specific parsing.
|
|
68
|
+
// Advances the `ops` Script iterator
|
|
69
|
+
switch (txType) {
|
|
70
|
+
case common_js_1.GENESIS_STR:
|
|
71
|
+
return nextGenesis(ops, tokenType);
|
|
72
|
+
case common_js_1.MINT_STR:
|
|
73
|
+
return nextMint(ops, tokenType);
|
|
74
|
+
case common_js_1.SEND_STR:
|
|
75
|
+
return nextSend(ops, tokenType);
|
|
76
|
+
case common_js_1.BURN_STR:
|
|
77
|
+
return nextBurn(ops, tokenType);
|
|
78
|
+
default:
|
|
79
|
+
throw new Error('Unknown txType');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.parseSlp = parseSlp;
|
|
83
|
+
function nextGenesis(ops, tokenType) {
|
|
84
|
+
// Parse genesis info
|
|
85
|
+
const tokenTicker = (0, str_js_1.bytesToStr)(nextBytesRequired(ops, 'tokenTicker'));
|
|
86
|
+
const tokenName = (0, str_js_1.bytesToStr)(nextBytesRequired(ops, 'tokenName'));
|
|
87
|
+
const url = (0, str_js_1.bytesToStr)(nextBytesRequired(ops, 'url'));
|
|
88
|
+
const hash = nextBytesRequired(ops, 'hash');
|
|
89
|
+
if (hash.length !== 0 && hash.length !== slp_js_1.SLP_GENESIS_HASH_NUM_BYTES) {
|
|
90
|
+
throw new Error(`hash must be either 0 or ${slp_js_1.SLP_GENESIS_HASH_NUM_BYTES} bytes`);
|
|
91
|
+
}
|
|
92
|
+
const decimalsBytes = nextBytesRequired(ops, 'decimals');
|
|
93
|
+
if (decimalsBytes.length !== 1) {
|
|
94
|
+
throw new Error('decimals must be exactly 1 byte');
|
|
95
|
+
}
|
|
96
|
+
const decimals = decimalsBytes[0];
|
|
97
|
+
if (decimals > common_js_1.MAX_DECIMALS) {
|
|
98
|
+
throw new Error(`decimals must be at most ${common_js_1.MAX_DECIMALS}`);
|
|
99
|
+
}
|
|
100
|
+
// Parse mint data
|
|
101
|
+
let mintVaultScripthash = undefined;
|
|
102
|
+
let mintBatonOutIdx = undefined;
|
|
103
|
+
if (tokenType === slp_js_1.SLP_MINT_VAULT) {
|
|
104
|
+
const scripthashBytes = nextBytesRequired(ops, 'mintVaultScripthash');
|
|
105
|
+
if (scripthashBytes.length !== slp_js_1.SLP_MINT_VAULT_SCRIPTHASH_NUM_BYTES) {
|
|
106
|
+
throw new Error(`mintVaultScripthash must be exactly ${slp_js_1.SLP_MINT_VAULT_SCRIPTHASH_NUM_BYTES} ` +
|
|
107
|
+
'bytes long');
|
|
108
|
+
}
|
|
109
|
+
mintVaultScripthash = (0, hex_js_1.toHex)(scripthashBytes);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
mintBatonOutIdx = nextMintOutIdx(ops, tokenType);
|
|
113
|
+
}
|
|
114
|
+
const initialAtoms = parseSlpAtoms(nextBytesRequired(ops, 'initialAtoms'));
|
|
115
|
+
nextEnd(ops, 'GENESIS');
|
|
116
|
+
return {
|
|
117
|
+
txType: common_js_1.GENESIS_STR,
|
|
118
|
+
tokenType,
|
|
119
|
+
genesisInfo: {
|
|
120
|
+
tokenTicker,
|
|
121
|
+
tokenName,
|
|
122
|
+
url,
|
|
123
|
+
hash: hash.length !== 0 ? (0, hex_js_1.toHex)(hash) : undefined,
|
|
124
|
+
mintVaultScripthash,
|
|
125
|
+
decimals,
|
|
126
|
+
},
|
|
127
|
+
initialAtoms,
|
|
128
|
+
mintBatonOutIdx,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function nextMint(ops, tokenType) {
|
|
132
|
+
const tokenId = nextTokenId(ops);
|
|
133
|
+
if (tokenType === slp_js_1.SLP_MINT_VAULT) {
|
|
134
|
+
const additionalAtomsArray = nextSlpAtomsArray(ops);
|
|
135
|
+
return {
|
|
136
|
+
txType: common_js_1.MINT_STR,
|
|
137
|
+
tokenType,
|
|
138
|
+
tokenId,
|
|
139
|
+
additionalAtomsArray,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
else if (tokenType === slp_js_1.SLP_NFT1_CHILD) {
|
|
143
|
+
throw new Error('SLP_NFT1_CHILD cannot have MINT transactions');
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const mintBatonOutIdx = nextMintOutIdx(ops, tokenType);
|
|
147
|
+
const additionalAtoms = parseSlpAtoms(nextBytesRequired(ops, 'additionalAtoms'));
|
|
148
|
+
nextEnd(ops, 'MINT');
|
|
149
|
+
return {
|
|
150
|
+
txType: common_js_1.MINT_STR,
|
|
151
|
+
tokenType,
|
|
152
|
+
tokenId,
|
|
153
|
+
additionalAtoms,
|
|
154
|
+
mintBatonOutIdx,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function nextSend(ops, tokenType) {
|
|
159
|
+
const tokenId = nextTokenId(ops);
|
|
160
|
+
const sendAtomsArray = nextSlpAtomsArray(ops);
|
|
161
|
+
return {
|
|
162
|
+
txType: common_js_1.SEND_STR,
|
|
163
|
+
tokenType,
|
|
164
|
+
tokenId,
|
|
165
|
+
sendAtomsArray,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function nextBurn(ops, tokenType) {
|
|
169
|
+
const tokenId = nextTokenId(ops);
|
|
170
|
+
const burnAtoms = parseSlpAtoms(nextBytesRequired(ops, 'burnAtoms'));
|
|
171
|
+
nextEnd(ops, 'BURN');
|
|
172
|
+
return {
|
|
173
|
+
txType: common_js_1.BURN_STR,
|
|
174
|
+
tokenType,
|
|
175
|
+
tokenId,
|
|
176
|
+
burnAtoms,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function nextBytes(iter) {
|
|
180
|
+
const op = iter.next();
|
|
181
|
+
if (op === undefined) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
if (!(0, op_js_1.isPushOp)(op)) {
|
|
185
|
+
throw new Error('SLP only supports push-ops');
|
|
186
|
+
}
|
|
187
|
+
return op.data;
|
|
188
|
+
}
|
|
189
|
+
function nextBytesRequired(iter, name) {
|
|
190
|
+
const bytes = nextBytes(iter);
|
|
191
|
+
if (bytes === undefined) {
|
|
192
|
+
throw new Error('Missing ' + name);
|
|
193
|
+
}
|
|
194
|
+
return bytes;
|
|
195
|
+
}
|
|
196
|
+
function nextMintOutIdx(iter, tokenType) {
|
|
197
|
+
const outIdxBytes = nextBytesRequired(iter, 'mintBatonOutIdx');
|
|
198
|
+
if (outIdxBytes.length > 1) {
|
|
199
|
+
throw new Error('mintBatonOutIdx must be at most 1 byte long');
|
|
200
|
+
}
|
|
201
|
+
if (outIdxBytes.length === 1) {
|
|
202
|
+
if (tokenType === slp_js_1.SLP_NFT1_CHILD) {
|
|
203
|
+
throw new Error('SLP_NFT1_CHILD cannot have a mint baton');
|
|
204
|
+
}
|
|
205
|
+
const mintBatonOutIdx = outIdxBytes[0];
|
|
206
|
+
if (mintBatonOutIdx < 2) {
|
|
207
|
+
throw new Error('mintBatonOutIdx must be at least 2');
|
|
208
|
+
}
|
|
209
|
+
return mintBatonOutIdx;
|
|
210
|
+
}
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
function nextTokenId(iter) {
|
|
214
|
+
const tokenIdBytes = nextBytesRequired(iter, 'tokenId');
|
|
215
|
+
if (tokenIdBytes.length !== common_js_1.TOKEN_ID_NUM_BYTES) {
|
|
216
|
+
throw new Error(`tokenId must be exactly ${common_js_1.TOKEN_ID_NUM_BYTES} bytes long`);
|
|
217
|
+
}
|
|
218
|
+
// Note: SLP token ID endianness is big-endian
|
|
219
|
+
return (0, hex_js_1.toHex)(tokenIdBytes);
|
|
220
|
+
}
|
|
221
|
+
function nextSlpAtomsArray(iter) {
|
|
222
|
+
const atomsArray = [];
|
|
223
|
+
let bytes = undefined;
|
|
224
|
+
while ((bytes = nextBytes(iter)) !== undefined) {
|
|
225
|
+
atomsArray.push(parseSlpAtoms(bytes));
|
|
226
|
+
}
|
|
227
|
+
if (atomsArray.length === 0) {
|
|
228
|
+
throw new Error('atomsArray cannot be empty');
|
|
229
|
+
}
|
|
230
|
+
if (atomsArray.length > slp_js_1.SLP_MAX_SEND_OUTPUTS) {
|
|
231
|
+
throw new Error(`atomsArray can at most be ${slp_js_1.SLP_MAX_SEND_OUTPUTS} items long`);
|
|
232
|
+
}
|
|
233
|
+
return atomsArray;
|
|
234
|
+
}
|
|
235
|
+
function nextEnd(iter, txType) {
|
|
236
|
+
if (iter.next() !== undefined) {
|
|
237
|
+
throw new Error(`Superfluous ${txType} bytes`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function parseSlpAtoms(bytes) {
|
|
241
|
+
if (bytes.length !== slp_js_1.SLP_ATOMS_NUM_BYTES) {
|
|
242
|
+
throw new Error(`SLP atoms must be exactly ${slp_js_1.SLP_ATOMS_NUM_BYTES} bytes long`);
|
|
243
|
+
}
|
|
244
|
+
let number = 0n;
|
|
245
|
+
for (let i = 0; i < slp_js_1.SLP_ATOMS_NUM_BYTES; ++i) {
|
|
246
|
+
number <<= 8n;
|
|
247
|
+
number |= BigInt(bytes[i]);
|
|
248
|
+
}
|
|
249
|
+
return number;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=slp.parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slp.parse.js","sourceRoot":"","sources":["../../src/token/slp.parse.ts"],"names":[],"mappings":"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"}
|
package/dist/txBuilder.js
CHANGED
|
@@ -34,7 +34,7 @@ class TxBuilder {
|
|
|
34
34
|
prepareOutputs() {
|
|
35
35
|
let fixedOutputSum = 0n;
|
|
36
36
|
let leftoverIdx = undefined;
|
|
37
|
-
|
|
37
|
+
const outputs = new Array(this.outputs.length);
|
|
38
38
|
for (let idx = 0; idx < this.outputs.length; ++idx) {
|
|
39
39
|
const builderOutput = this.outputs[idx];
|
|
40
40
|
if ('bytecode' in builderOutput) {
|
package/dist/txBuilder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txBuilder.js","sourceRoot":"","sources":["../src/txBuilder.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,mEAAmE;AACnE,sEAAsE;;;AAEtE,qCAAyC;AACzC,uCAAoC;AACpC,wDAAkD;AAClD,mCAAsC;AACtC,2CAAqC;AACrC,qDAAmE;AACnE,mCAOiB;AACjB,mDAA8D;AAmC9D,oDAAoD;AACpD,MAAa,SAAS;IAalB,YAAmB,MAKlB;QACG,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,0BAAkB,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,0EAA0E;IAClE,QAAQ;QACZ,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEO,cAAc;QAKlB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,WAAW,GAAuB,SAAS,CAAC;QAChD,
|
|
1
|
+
{"version":3,"file":"txBuilder.js","sourceRoot":"","sources":["../src/txBuilder.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,mEAAmE;AACnE,sEAAsE;;;AAEtE,qCAAyC;AACzC,uCAAoC;AACpC,wDAAkD;AAClD,mCAAsC;AACtC,2CAAqC;AACrC,qDAAmE;AACnE,mCAOiB;AACjB,mDAA8D;AAmC9D,oDAAoD;AACpD,MAAa,SAAS;IAalB,YAAmB,MAKlB;QACG,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,0BAAkB,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,0EAA0E;IAClE,QAAQ;QACZ,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEO,cAAc;QAKlB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,WAAW,GAAuB,SAAS,CAAC;QAChD,MAAM,OAAO,GAAe,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;YACjD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBAC9B,qCAAqC;gBACrC,qEAAqE;gBACrE,2DAA2D;gBAC3D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC5B,MAAM,gDAAgD,CAAC;gBAC3D,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG;oBACX,IAAI,EAAE,EAAE,EAAE,cAAc;oBACxB,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE;iBAC/B,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,cAAc,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,oBAAY,EAAC,aAAa,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QACD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IACpD,CAAC;IAED,wDAAwD;IACjD,IAAI,CAAC,MAIX;QACG,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,IAAI,YAAG,EAAE,CAAC;QACrC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAA,mBAAW,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,iBAAiB,GAAG,CAAC,GAAQ,EAAE,UAAsB,EAAE,EAAE;YAC3D,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;gBAChD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;gBAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC1B,KAAK,CAAC,MAAM,GAAG,SAAS,CACpB,GAAG,EACH,IAAI,+BAAe,CAAC;wBAChB,QAAQ,EAAE,GAAG;wBACb,UAAU;qBACb,CAAC,CACL,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC,CAAC;QACF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACX,uEAAuE,CAC1E,CAAC;YACN,CAAC;YACD,IAAI,MAAM,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACX,mDAAmD,CACtD,CAAC;YACN,CAAC;YACD,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,MAAM,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACX,mDAAmD,CACtD,CAAC;YACN,CAAC;YACD,MAAM,eAAe,GAAG,0BAAU,CAAC,WAAW,CAC1C,IAAI,UAAE,CAAC;gBACH,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM;gBACN,OAAO;gBACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;aAC1B,CAAC,CACL,CAAC;YACF,yEAAyE;YACzE,iBAAiB,CAAC,IAAI,iBAAQ,EAAE,EAAE,eAAe,CAAC,CAAC;YACnD,IAAI,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,YAAY,GAAG,QAAQ,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC;YACzD,IAAI,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACjC,2DAA2D;gBAC3D,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBAC/B,eAAe,CAAC,EAAE,CAAC,OAAO,GAAG,OAAO,CAAC;gBACrC,gEAAgE;gBAChE,iBAAiB,CAAC,IAAI,iBAAQ,EAAE,EAAE,eAAe,CAAC,CAAC;gBACnD,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACtC,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;YAC7C,CAAC;YACD,IAAI,QAAQ,GAAG,cAAc,GAAG,KAAK,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CACX,4BAA4B,QAAQ,uBAChC,QAAQ,GAAG,cACf,cAAc,KAAK,WAAW,CACjC,CAAC;YACN,CAAC;QACL,CAAC;QACD,MAAM,UAAU,GAAG,0BAAU,CAAC,MAAM,CAChC,IAAI,UAAE,CAAC;YACH,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAC,CACL,CAAC;QACF,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACnC,OAAO,UAAU,CAAC,EAAE,CAAC;IACzB,CAAC;CACJ;AA1JD,8BA0JC;AAED;kBACkB;AAClB,SAAgB,SAAS,CAAC,MAAc,EAAE,QAAgB;IACtD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;AAC9D,CAAC;AAFD,8BAEC;AAED,gDAAgD;AAChD,SAAgB,aAAa,CACzB,GAAe,EACf,YAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,4BAAW,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC;AACvB,CAAC;AARD,sCAQC;AAED;;;IAGI;AACJ,SAAgB,eAAe,CAC3B,GAAQ,EACR,EAAc,EACd,OAAmB,EACnB,WAAwB;IAExB,MAAM,GAAG,GACL,WAAW,CAAC,OAAO,IAAI,mCAAkB,CAAC,MAAM;QAC5C,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC;QAC5B,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC;AAXD,0CAWC;AAED,kEAAkE;AAC3D,MAAM,cAAc,GAAG,CAC1B,EAAc,EACd,EAAc,EACd,WAAwB,EAC1B,EAAE;IACA,OAAO,CAAC,GAAQ,EAAE,KAAsB,EAAU,EAAE;QAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAA,iBAAO,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAClE,OAAO,kBAAM,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC,CAAC;AACN,CAAC,CAAC;AAXW,QAAA,cAAc,kBAWzB;AAEF,iEAAiE;AAC1D,MAAM,aAAa,GAAG,CAAC,EAAc,EAAE,WAAwB,EAAE,EAAE;IACtE,OAAO,CAAC,GAAQ,EAAE,KAAsB,EAAU,EAAE;QAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAA,iBAAO,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAClE,OAAO,kBAAM,CAAC,OAAO,CAAC,CAAC,IAAA,mBAAW,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC;AACN,CAAC,CAAC;AAPW,QAAA,aAAa,iBAOxB"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ecash-lib",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "Library for eCash transaction building",
|
|
5
5
|
"main": "./dist/indexNodeJs.js",
|
|
6
6
|
"browser": "./dist/indexBrowser.js",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist",
|
|
9
|
-
"test": "mocha --
|
|
10
|
-
"integration-tests": "mocha --
|
|
9
|
+
"test": "mocha --import=tsx ./src/*.test.ts ./src/**/*.test.ts",
|
|
10
|
+
"integration-tests": "mocha --import=tsx ./tests/*.test.ts --timeout 60000",
|
|
11
11
|
"coverage": "nyc npm run test",
|
|
12
12
|
"junit": "npm run test --reporter mocha-junit-reporter"
|
|
13
13
|
},
|
|
@@ -33,8 +33,7 @@
|
|
|
33
33
|
"@types/mocha": "^10.0.6",
|
|
34
34
|
"@types/node": "^20.12.7",
|
|
35
35
|
"chai": "^5.1.0",
|
|
36
|
-
"chronik-client": "^3.
|
|
37
|
-
"eslint-plugin-header": "^3.1.1",
|
|
36
|
+
"chronik-client": "^3.1.1",
|
|
38
37
|
"mocha": "^10.4.0",
|
|
39
38
|
"mocha-junit-reporter": "^2.2.1",
|
|
40
39
|
"nyc": "^15.1.0",
|
|
@@ -42,8 +41,7 @@
|
|
|
42
41
|
"source-map-support": "^0.5.21",
|
|
43
42
|
"ts-node": "^10.9.2",
|
|
44
43
|
"tsx": "^4.7.2",
|
|
45
|
-
"typescript": "^5.4.3"
|
|
46
|
-
"typescript-eslint": "^7.6.0"
|
|
44
|
+
"typescript": "^5.4.3"
|
|
47
45
|
},
|
|
48
46
|
"dependencies": {
|
|
49
47
|
"b58-ts": "^0.1.0",
|
package/src/ecc.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
4
4
|
|
|
5
5
|
/** Interface to abstract over Elliptic Curve Cryptography */
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
|
|
6
7
|
export interface Ecc {
|
|
7
8
|
/** Derive a public key from secret key. */
|
|
8
9
|
derivePubkey(seckey: Uint8Array): Uint8Array;
|
|
@@ -10,9 +11,21 @@ export interface Ecc {
|
|
|
10
11
|
/** Sign an ECDSA signature. msg needs to be a 32-byte hash */
|
|
11
12
|
ecdsaSign(seckey: Uint8Array, msg: Uint8Array): Uint8Array;
|
|
12
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Verify an ECDSA signature. msg needs to be a 32-byte hash.
|
|
16
|
+
* Throws an exception if the signature is invalid.
|
|
17
|
+
**/
|
|
18
|
+
ecdsaVerify(sig: Uint8Array, msg: Uint8Array, pk: Uint8Array): void;
|
|
19
|
+
|
|
13
20
|
/** Sign a Schnorr signature. msg needs to be a 32-byte hash */
|
|
14
21
|
schnorrSign(seckey: Uint8Array, msg: Uint8Array): Uint8Array;
|
|
15
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Verify a Schnorr signature. msg needs to be a 32-byte hash.
|
|
25
|
+
* Throws an exception if the signature is invalid.
|
|
26
|
+
**/
|
|
27
|
+
schnorrVerify(sig: Uint8Array, msg: Uint8Array, pk: Uint8Array): void;
|
|
28
|
+
|
|
16
29
|
/**
|
|
17
30
|
* Return whether the given secret key is valid, i.e. whether is of correct
|
|
18
31
|
* length (32 bytes) and is on the curve.
|
|
@@ -30,6 +43,9 @@ export interface Ecc {
|
|
|
30
43
|
|
|
31
44
|
/** Recover the public key of an ECDSA signed signature (with recovery ID) */
|
|
32
45
|
recoverSig(sig: Uint8Array, msg: Uint8Array): Uint8Array;
|
|
46
|
+
|
|
47
|
+
/** Compress an uncompressed public key (must start with 0x04) */
|
|
48
|
+
compressPk(pk: Uint8Array): Uint8Array;
|
|
33
49
|
}
|
|
34
50
|
|
|
35
51
|
/** Dummy Ecc impl that always returns 0, useful for measuring tx size */
|
|
@@ -42,10 +58,14 @@ export class EccDummy implements Ecc {
|
|
|
42
58
|
return new Uint8Array(73);
|
|
43
59
|
}
|
|
44
60
|
|
|
61
|
+
ecdsaVerify(_sig: Uint8Array, _msg: Uint8Array, _pk: Uint8Array): void {}
|
|
62
|
+
|
|
45
63
|
schnorrSign(_seckey: Uint8Array, _msg: Uint8Array): Uint8Array {
|
|
46
64
|
return new Uint8Array(64);
|
|
47
65
|
}
|
|
48
66
|
|
|
67
|
+
schnorrVerify(_sig: Uint8Array, _msg: Uint8Array, _pk: Uint8Array): void {}
|
|
68
|
+
|
|
49
69
|
isValidSeckey(_seckey: Uint8Array): boolean {
|
|
50
70
|
return false;
|
|
51
71
|
}
|
|
@@ -65,14 +85,20 @@ export class EccDummy implements Ecc {
|
|
|
65
85
|
recoverSig(_sig: Uint8Array, _msg: Uint8Array): Uint8Array {
|
|
66
86
|
return new Uint8Array(33);
|
|
67
87
|
}
|
|
88
|
+
|
|
89
|
+
compressPk(_pk: Uint8Array): Uint8Array {
|
|
90
|
+
return new Uint8Array(33);
|
|
91
|
+
}
|
|
68
92
|
}
|
|
69
93
|
|
|
70
|
-
|
|
94
|
+
type FfiEcc = Omit<Ecc, 'compressPk'>;
|
|
95
|
+
const ECC: { ecc?: FfiEcc } = {};
|
|
71
96
|
|
|
72
|
-
export function __setEcc(ecc:
|
|
97
|
+
export function __setEcc(ecc: FfiEcc) {
|
|
73
98
|
ECC.ecc = ecc;
|
|
74
99
|
}
|
|
75
100
|
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
|
|
76
102
|
export class Ecc implements Ecc {
|
|
77
103
|
/** Derive a public key from secret key. */
|
|
78
104
|
derivePubkey(seckey: Uint8Array): Uint8Array {
|
|
@@ -84,11 +110,27 @@ export class Ecc implements Ecc {
|
|
|
84
110
|
return ECC.ecc!.ecdsaSign(seckey, msg);
|
|
85
111
|
}
|
|
86
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Verify an ECDSA signature. msg needs to be a 32-byte hash.
|
|
115
|
+
* Throws an exception if the signature is invalid.
|
|
116
|
+
**/
|
|
117
|
+
ecdsaVerify(sig: Uint8Array, msg: Uint8Array, pk: Uint8Array): void {
|
|
118
|
+
ECC.ecc?.ecdsaVerify(sig, msg, pk);
|
|
119
|
+
}
|
|
120
|
+
|
|
87
121
|
/** Sign a Schnorr signature. msg needs to be a 32-byte hash */
|
|
88
122
|
schnorrSign(seckey: Uint8Array, msg: Uint8Array): Uint8Array {
|
|
89
123
|
return ECC.ecc!.schnorrSign(seckey, msg);
|
|
90
124
|
}
|
|
91
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Verify a Schnorr signature. msg needs to be a 32-byte hash.
|
|
128
|
+
* Throws an exception if the signature is invalid.
|
|
129
|
+
**/
|
|
130
|
+
schnorrVerify(sig: Uint8Array, msg: Uint8Array, pk: Uint8Array): void {
|
|
131
|
+
ECC.ecc?.schnorrVerify(sig, msg, pk);
|
|
132
|
+
}
|
|
133
|
+
|
|
92
134
|
/**
|
|
93
135
|
* Return whether the given secret key is valid, i.e. whether is of correct
|
|
94
136
|
* length (32 bytes) and is on the curve.
|
|
@@ -114,4 +156,14 @@ export class Ecc implements Ecc {
|
|
|
114
156
|
recoverSig(sig: Uint8Array, msg: Uint8Array): Uint8Array {
|
|
115
157
|
return ECC.ecc!.recoverSig(sig, msg);
|
|
116
158
|
}
|
|
159
|
+
|
|
160
|
+
compressPk(pk: Uint8Array): Uint8Array {
|
|
161
|
+
if (pk[0] != 0x04) {
|
|
162
|
+
throw new Error('Uncompressed pubkey must start with 0x04');
|
|
163
|
+
}
|
|
164
|
+
const compressedPk = new Uint8Array(33);
|
|
165
|
+
compressedPk[0] = 0x02 | (pk[64] & 0x01);
|
|
166
|
+
compressedPk.set(pk.slice(1, 33), 1);
|
|
167
|
+
return compressedPk;
|
|
168
|
+
}
|
|
117
169
|
}
|