@bsv/templates 1.8.1 → 1.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.
Files changed (37) hide show
  1. package/dist/cjs/mod.js +7 -1
  2. package/dist/cjs/mod.js.map +1 -1
  3. package/dist/cjs/package.json +1 -1
  4. package/dist/cjs/src/Bsv21Token.js +194 -0
  5. package/dist/cjs/src/Bsv21Token.js.map +1 -0
  6. package/dist/cjs/src/DstasToken.js +66 -0
  7. package/dist/cjs/src/DstasToken.js.map +1 -0
  8. package/dist/cjs/src/StasToken.js +111 -0
  9. package/dist/cjs/src/StasToken.js.map +1 -0
  10. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  11. package/dist/esm/mod.js +3 -0
  12. package/dist/esm/mod.js.map +1 -1
  13. package/dist/esm/src/Bsv21Token.js +191 -0
  14. package/dist/esm/src/Bsv21Token.js.map +1 -0
  15. package/dist/esm/src/DstasToken.js +62 -0
  16. package/dist/esm/src/DstasToken.js.map +1 -0
  17. package/dist/esm/src/StasToken.js +106 -0
  18. package/dist/esm/src/StasToken.js.map +1 -0
  19. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  20. package/dist/types/mod.d.ts +6 -0
  21. package/dist/types/mod.d.ts.map +1 -1
  22. package/dist/types/src/Bsv21Token.d.ts +26 -0
  23. package/dist/types/src/Bsv21Token.d.ts.map +1 -0
  24. package/dist/types/src/DstasToken.d.ts +46 -0
  25. package/dist/types/src/DstasToken.d.ts.map +1 -0
  26. package/dist/types/src/StasToken.d.ts +40 -0
  27. package/dist/types/src/StasToken.d.ts.map +1 -0
  28. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  29. package/mod.ts +6 -0
  30. package/package.json +1 -1
  31. package/src/Bsv21Token.ts +197 -0
  32. package/src/DstasToken.ts +105 -0
  33. package/src/StasToken.ts +136 -0
  34. package/src/__tests/Bsv21Token.test.ts +56 -0
  35. package/src/__tests/DstasToken.test.ts +33 -0
  36. package/src/__tests/StasToken.test.ts +44 -0
  37. package/src/__tests/dstas-fixtures.ts +6 -0
package/dist/cjs/mod.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ADMIN_PROTOCOL = exports.MandalaAdmin = exports.MandalaToken = exports.P2MSKH = exports.MultiPushDrop = exports.OpReturn = void 0;
3
+ exports.DstasToken = exports.Bsv21Token = exports.StasToken = exports.ADMIN_PROTOCOL = exports.MandalaAdmin = exports.MandalaToken = exports.P2MSKH = exports.MultiPushDrop = exports.OpReturn = void 0;
4
4
  // Script Templates
5
5
  var OpReturn_js_1 = require("./src/OpReturn.js");
6
6
  Object.defineProperty(exports, "OpReturn", { enumerable: true, get: function () { return OpReturn_js_1.OpReturn; } });
@@ -13,4 +13,10 @@ Object.defineProperty(exports, "MandalaToken", { enumerable: true, get: function
13
13
  var MandalaAdmin_js_1 = require("./src/MandalaAdmin.js");
14
14
  Object.defineProperty(exports, "MandalaAdmin", { enumerable: true, get: function () { return MandalaAdmin_js_1.MandalaAdmin; } });
15
15
  Object.defineProperty(exports, "ADMIN_PROTOCOL", { enumerable: true, get: function () { return MandalaAdmin_js_1.ADMIN_PROTOCOL; } });
16
+ var StasToken_js_1 = require("./src/StasToken.js");
17
+ Object.defineProperty(exports, "StasToken", { enumerable: true, get: function () { return StasToken_js_1.StasToken; } });
18
+ var Bsv21Token_js_1 = require("./src/Bsv21Token.js");
19
+ Object.defineProperty(exports, "Bsv21Token", { enumerable: true, get: function () { return Bsv21Token_js_1.Bsv21Token; } });
20
+ var DstasToken_js_1 = require("./src/DstasToken.js");
21
+ Object.defineProperty(exports, "DstasToken", { enumerable: true, get: function () { return DstasToken_js_1.DstasToken; } });
16
22
  //# sourceMappingURL=mod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../mod.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,iDAA4C;AAAnC,uGAAA,QAAQ,OAAA;AACjB,2DAAsD;AAA7C,iHAAA,aAAa,OAAA;AACtB,6CAAwC;AAA/B,mGAAA,MAAM,OAAA;AACf,yDAAoD;AAA3C,+GAAA,YAAY,OAAA;AAErB,yDAAoE;AAA3D,+GAAA,YAAY,OAAA;AAAE,iHAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../mod.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,iDAA4C;AAAnC,uGAAA,QAAQ,OAAA;AACjB,2DAAsD;AAA7C,iHAAA,aAAa,OAAA;AACtB,6CAAwC;AAA/B,mGAAA,MAAM,OAAA;AACf,yDAAoD;AAA3C,+GAAA,YAAY,OAAA;AAErB,yDAAoE;AAA3D,+GAAA,YAAY,OAAA;AAAE,iHAAA,cAAc,OAAA;AAKrC,mDAA8C;AAArC,yGAAA,SAAS,OAAA;AAElB,qDAAgD;AAAvC,2GAAA,UAAU,OAAA;AAEnB,qDAAgD;AAAvC,2GAAA,UAAU,OAAA"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsv/templates",
3
- "version": "1.8.1",
3
+ "version": "1.9.0",
4
4
  "type": "commonjs",
5
5
  "description": "BSV Blockchain Script Templates",
6
6
  "files": [
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Bsv21Token = void 0;
4
+ const sdk_1 = require("@bsv/sdk");
5
+ /**
6
+ * Bsv21Token — decoder for BSV-21 (1Sat ordinals-style fungible token)
7
+ * locking scripts. The token is an ord-inscription envelope carrying a
8
+ * BSV-20 JSON payload, followed by a standard P2PKH owner lock:
9
+ *
10
+ * OP_FALSE OP_IF "ord" OP_1 "application/bsv-20" OP_0 <json> OP_ENDIF
11
+ * OP_DUP OP_HASH160 <owner_pkh:20> OP_EQUALVERIFY OP_CHECKSIG
12
+ *
13
+ * JSON: {"p":"bsv-20","op":"transfer"|"deploy+mint","id":"<txid_vout>","amt":"<int>",...}
14
+ *
15
+ * BSV-21 amounts are divisible bigints carried as strings; ownership is plain
16
+ * P2PKH. Decode-only — building transfers is the wallet's job (see the 1sat
17
+ * inscription builder). Mirrors the wallet's `parseBsv21LockingScript`.
18
+ */
19
+ const ORD_TAG_HEX = '6f7264'; // "ord"
20
+ const CONTENT_TYPE = 'application/bsv-20';
21
+ const OP_FALSE_HEX = '00';
22
+ const OP_IF_HEX = '63';
23
+ const OP_ENDIF_HEX = '68';
24
+ const OP_DUP_HEX = '76';
25
+ const OP_HASH160_HEX = 'a9';
26
+ const OP_EQUALVERIFY_HEX = '88';
27
+ const OP_CHECKSIG_HEX = 'ac';
28
+ const PKH_PUSH_LEN_HEX = '14';
29
+ class HexReader {
30
+ constructor(hex) {
31
+ this.hex = hex;
32
+ this.pos = 0;
33
+ }
34
+ readByteHex() {
35
+ if (this.pos + 2 > this.hex.length)
36
+ return null;
37
+ const b = this.hex.substring(this.pos, this.pos + 2);
38
+ this.pos += 2;
39
+ return b;
40
+ }
41
+ readBytesHex(n) {
42
+ if (this.pos + n * 2 > this.hex.length)
43
+ return null;
44
+ const out = this.hex.substring(this.pos, this.pos + n * 2);
45
+ this.pos += n * 2;
46
+ return out;
47
+ }
48
+ readPushHex() {
49
+ const op = this.readByteHex();
50
+ if (op === null)
51
+ return null;
52
+ const code = Number.parseInt(op, 16);
53
+ if (code === 0)
54
+ return '';
55
+ if (code >= 0x01 && code <= 0x4b)
56
+ return this.readBytesHex(code);
57
+ if (code === 0x4c) {
58
+ const lenHex = this.readByteHex();
59
+ if (lenHex === null)
60
+ return null;
61
+ return this.readBytesHex(Number.parseInt(lenHex, 16));
62
+ }
63
+ if (code === 0x4d) {
64
+ const b1 = this.readByteHex();
65
+ const b2 = this.readByteHex();
66
+ if (b1 === null || b2 === null)
67
+ return null;
68
+ return this.readBytesHex(Number.parseInt(b2 + b1, 16));
69
+ }
70
+ if (code === 0x4e) {
71
+ const b1 = this.readByteHex();
72
+ const b2 = this.readByteHex();
73
+ const b3 = this.readByteHex();
74
+ const b4 = this.readByteHex();
75
+ if (b1 === null || b2 === null || b3 === null || b4 === null)
76
+ return null;
77
+ return this.readBytesHex(Number.parseInt(b4 + b3 + b2 + b1, 16));
78
+ }
79
+ return null;
80
+ }
81
+ }
82
+ function hexToUtf8(hex) {
83
+ if (hex === '')
84
+ return '';
85
+ try {
86
+ return sdk_1.Utils.toUTF8(sdk_1.Utils.toArray(hex, 'hex'));
87
+ }
88
+ catch {
89
+ return '';
90
+ }
91
+ }
92
+ /** Reads the ord-inscription envelope up to and including OP_ENDIF, returning its JSON payload. */
93
+ function readOrdEnvelope(r) {
94
+ if (r.readPushHex() !== ORD_TAG_HEX)
95
+ throw new Error('not a BSV-21 script: missing "ord" tag');
96
+ // Content-type field id: accept canonical OP_1 (0x51) or non-minimal push-of-0x01.
97
+ const peek = r.hex.substring(r.pos, r.pos + 2);
98
+ if (peek === '51') {
99
+ r.pos += 2;
100
+ }
101
+ else if (r.readPushHex() !== '01') {
102
+ throw new Error('not a BSV-21 script: bad content-type field id');
103
+ }
104
+ const ctHex = r.readPushHex();
105
+ if (ctHex === null || hexToUtf8(ctHex) !== CONTENT_TYPE)
106
+ throw new Error('not a BSV-21 script: wrong content-type');
107
+ if (r.readByteHex() !== '00')
108
+ throw new Error('not a BSV-21 script: missing OP_0 separator');
109
+ const contentHex = r.readPushHex();
110
+ if (contentHex === null)
111
+ throw new Error('not a BSV-21 script: missing JSON payload');
112
+ let payload;
113
+ try {
114
+ payload = JSON.parse(hexToUtf8(contentHex));
115
+ }
116
+ catch {
117
+ throw new Error('not a BSV-21 script: invalid JSON payload');
118
+ }
119
+ if ((payload === null || payload === void 0 ? void 0 : payload.p) !== 'bsv-20')
120
+ throw new Error('not a BSV-21 script: not bsv-20');
121
+ if (r.readByteHex() !== OP_ENDIF_HEX)
122
+ throw new Error('not a BSV-21 script: missing OP_ENDIF');
123
+ return payload;
124
+ }
125
+ /** Reads the trailing standard P2PKH owner lock, returning the owner hash160 (hex). */
126
+ function readP2pkhOwner(r) {
127
+ const dup = r.readByteHex();
128
+ const hash160Op = r.readByteHex();
129
+ const pushLen = r.readByteHex();
130
+ if (dup !== OP_DUP_HEX || hash160Op !== OP_HASH160_HEX || pushLen !== PKH_PUSH_LEN_HEX) {
131
+ throw new Error('not a BSV-21 script: bad P2PKH owner lock');
132
+ }
133
+ const ownerHash160 = r.readBytesHex(20);
134
+ if (ownerHash160 === null)
135
+ throw new Error('not a BSV-21 script: truncated owner hash');
136
+ if (r.readByteHex() !== OP_EQUALVERIFY_HEX || r.readByteHex() !== OP_CHECKSIG_HEX) {
137
+ throw new Error('not a BSV-21 script: bad P2PKH tail');
138
+ }
139
+ return ownerHash160;
140
+ }
141
+ /** Parses the optional `dec` field, accepted as a number or a digit string in [0, 18]. */
142
+ function parseDecimals(payload) {
143
+ if (typeof payload.dec === 'number' && Number.isFinite(payload.dec))
144
+ return payload.dec;
145
+ if (typeof payload.dec === 'string' && /^\d+$/.test(payload.dec)) {
146
+ const n = Number.parseInt(payload.dec, 10);
147
+ if (n >= 0 && n <= 18)
148
+ return n;
149
+ }
150
+ return undefined;
151
+ }
152
+ class Bsv21Token {
153
+ static isBsv21(script) {
154
+ try {
155
+ Bsv21Token.decode(script);
156
+ return true;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ /**
163
+ * Decodes a BSV-21 locking script.
164
+ * @throws if the script is not a recognisable BSV-21 output.
165
+ */
166
+ static decode(script) {
167
+ const lower = script.toHex().toLowerCase();
168
+ if (lower.length < 60)
169
+ throw new Error('not a BSV-21 script: too short');
170
+ if (!lower.startsWith(OP_FALSE_HEX + OP_IF_HEX))
171
+ throw new Error('not a BSV-21 script: missing OP_FALSE OP_IF');
172
+ const r = new HexReader(lower);
173
+ r.pos = 4; // past OP_FALSE OP_IF
174
+ const payload = readOrdEnvelope(r);
175
+ const ownerHash160 = readP2pkhOwner(r);
176
+ const amt = payload.amt;
177
+ if (typeof amt !== 'string' || !/^\d+$/.test(amt))
178
+ throw new Error('not a BSV-21 script: bad amount');
179
+ const isMint = payload.op === 'deploy+mint';
180
+ const dec = parseDecimals(payload);
181
+ const id = !isMint && typeof payload.id === 'string' ? payload.id : '';
182
+ return {
183
+ id,
184
+ amt,
185
+ dec,
186
+ sym: typeof payload.sym === 'string' ? payload.sym : undefined,
187
+ icon: typeof payload.icon === 'string' ? payload.icon : undefined,
188
+ isMint,
189
+ ownerHash160
190
+ };
191
+ }
192
+ }
193
+ exports.Bsv21Token = Bsv21Token;
194
+ //# sourceMappingURL=Bsv21Token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bsv21Token.js","sourceRoot":"","sources":["../../../src/Bsv21Token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DstasToken = void 0;
4
+ const OWNER_PUSH_OP = '14'; // push 20 bytes
5
+ // DSTAS scripts carry the ~2.9KB engine; anything smaller is not DSTAS.
6
+ const MIN_HEX_LEN = 4000;
7
+ function isSinglePush(op) {
8
+ const code = Number.parseInt(op, 16);
9
+ return code >= 0x01 && code <= 0x4b;
10
+ }
11
+ class DstasToken {
12
+ static isDstas(script) {
13
+ try {
14
+ DstasToken.decode(script);
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ /**
22
+ * Decodes a DSTAS locking script's identity fields.
23
+ * @throws if the script is not a recognisable DSTAS script.
24
+ */
25
+ static decode(script) {
26
+ const hex = script.toHex().toLowerCase();
27
+ if (hex.length < MIN_HEX_LEN)
28
+ throw new Error('not a DSTAS script: too short');
29
+ if (!hex.startsWith(OWNER_PUSH_OP))
30
+ throw new Error('not a DSTAS script: missing 20-byte owner push');
31
+ const ownerHash160 = hex.substring(2, 42);
32
+ // OP_RETURN (0x6a) + redemption push (0x14) — unique in a DSTAS body.
33
+ const ri = hex.lastIndexOf('6a14');
34
+ if (ri < 0)
35
+ throw new Error('not a DSTAS script: missing OP_RETURN + redemption');
36
+ const tokenId = hex.substring(ri + 4, ri + 44);
37
+ if (tokenId.length !== 40)
38
+ throw new Error('not a DSTAS script: truncated redemption');
39
+ // Flags push immediately follows the redemption push.
40
+ let flagsHex = '';
41
+ const flagsLenOp = hex.substring(ri + 44, ri + 46);
42
+ if (isSinglePush(flagsLenOp)) {
43
+ const len = Number.parseInt(flagsLenOp, 16);
44
+ flagsHex = hex.substring(ri + 46, ri + 46 + len * 2);
45
+ }
46
+ const flagsByte = flagsHex.length >= 2 ? Number.parseInt(flagsHex.substring(0, 2), 16) : 0;
47
+ const freezeEnabled = (flagsByte & 0x01) !== 0;
48
+ const confiscationEnabled = (flagsByte & 0x02) !== 0;
49
+ // Action-data marker sits right after the owner push:
50
+ // OP_0 (00) = neutral; OP_2 (52) = frozen; push prefixed 0x02 = frozen.
51
+ const actionOp = hex.substring(42, 44);
52
+ const frozen = actionOp === '52' ||
53
+ (isSinglePush(actionOp) && hex.substring(44, 46) === '02');
54
+ return {
55
+ assetId: tokenId,
56
+ tokenId,
57
+ ownerHash160,
58
+ flagsHex,
59
+ freezeEnabled,
60
+ confiscationEnabled,
61
+ frozen
62
+ };
63
+ }
64
+ }
65
+ exports.DstasToken = DstasToken;
66
+ //# sourceMappingURL=DstasToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DstasToken.js","sourceRoot":"","sources":["../../../src/DstasToken.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StasToken = void 0;
4
+ const sdk_1 = require("@bsv/sdk");
5
+ const P2PKH_PREFIX = '76a914';
6
+ const STAS_MARKER = '88ac69';
7
+ /** Resolves a push opcode's payload length + data offset, or null for a non-push opcode. */
8
+ function pushDataLength(scriptHex, opcode, pos) {
9
+ if (opcode >= 0x01 && opcode <= 0x4b)
10
+ return { len: opcode, dataStart: pos };
11
+ if (opcode === 0x4c) {
12
+ if (pos + 2 > scriptHex.length)
13
+ return null;
14
+ return { len: Number.parseInt(scriptHex.substring(pos, pos + 2), 16), dataStart: pos + 2 };
15
+ }
16
+ if (opcode === 0x4d) {
17
+ if (pos + 4 > scriptHex.length)
18
+ return null;
19
+ const b1 = scriptHex.substring(pos, pos + 2);
20
+ const b2 = scriptHex.substring(pos + 2, pos + 4);
21
+ return { len: Number.parseInt(b2 + b1, 16), dataStart: pos + 4 };
22
+ }
23
+ if (opcode === 0x4e) {
24
+ if (pos + 8 > scriptHex.length)
25
+ return null;
26
+ const b1 = scriptHex.substring(pos, pos + 2);
27
+ const b2 = scriptHex.substring(pos + 2, pos + 4);
28
+ const b3 = scriptHex.substring(pos + 4, pos + 6);
29
+ const b4 = scriptHex.substring(pos + 6, pos + 8);
30
+ return { len: Number.parseInt(b4 + b3 + b2 + b1, 16), dataStart: pos + 8 };
31
+ }
32
+ return null;
33
+ }
34
+ /** Reads push-data slots starting at a hex offset (after OP_RETURN). */
35
+ function readPushes(scriptHex, startPos, max = 8) {
36
+ const pushes = [];
37
+ let pos = startPos;
38
+ while (pos < scriptHex.length && pushes.length < max) {
39
+ if (pos + 2 > scriptHex.length)
40
+ break;
41
+ const opcode = Number.parseInt(scriptHex.substring(pos, pos + 2), 16);
42
+ if (Number.isNaN(opcode))
43
+ break;
44
+ pos += 2;
45
+ if (opcode === 0) {
46
+ pushes.push('');
47
+ continue;
48
+ }
49
+ const push = pushDataLength(scriptHex, opcode, pos);
50
+ if (push === null)
51
+ break; // non-push opcode (or truncated length) after OP_RETURN — stop
52
+ pushes.push(scriptHex.substring(push.dataStart, push.dataStart + push.len * 2));
53
+ pos = push.dataStart + push.len * 2;
54
+ }
55
+ return pushes;
56
+ }
57
+ function hexToUtf8(hex) {
58
+ if (hex === '')
59
+ return '';
60
+ try {
61
+ return sdk_1.Utils.toUTF8(sdk_1.Utils.toArray(hex, 'hex'));
62
+ }
63
+ catch {
64
+ return '';
65
+ }
66
+ }
67
+ class StasToken {
68
+ /** True if the script carries the classic STAS prefix + marker. */
69
+ static isStas(script) {
70
+ const hex = script.toHex();
71
+ return hex.startsWith(P2PKH_PREFIX) && hex.substring(46, 52) === STAS_MARKER;
72
+ }
73
+ /**
74
+ * Decodes a classic STAS locking script into its identity fields.
75
+ * @throws if the script is not a classic STAS script.
76
+ */
77
+ static decode(script) {
78
+ var _a, _b;
79
+ const hex = script.toHex();
80
+ if (hex.length < 56)
81
+ throw new Error('not a STAS script: too short');
82
+ if (!hex.startsWith(P2PKH_PREFIX))
83
+ throw new Error('not a STAS script: missing P2PKH prefix');
84
+ if (hex.substring(46, 52) !== STAS_MARKER)
85
+ throw new Error('not a STAS script: missing STAS marker');
86
+ const ownerHash160 = hex.substring(6, 46);
87
+ // OP_RETURN (0x6a) is placed by CreateContract as the last opcode before
88
+ // the data region. The engine body may contain incidental 0x6a bytes, so
89
+ // scan from the back.
90
+ const opReturnIdx = hex.lastIndexOf('6a');
91
+ let symbol = null;
92
+ let flagsHex = null;
93
+ if (opReturnIdx >= 0) {
94
+ const pushes = readPushes(hex, opReturnIdx + 2);
95
+ // Layout after OP_RETURN: [flagsByte, symbol, data, ...].
96
+ flagsHex = ((_a = pushes[0]) === null || _a === void 0 ? void 0 : _a.length) === 2 ? pushes[0] : null;
97
+ const symbolHex = (_b = pushes[1]) !== null && _b !== void 0 ? _b : null;
98
+ symbol = (symbolHex != null && symbolHex !== '')
99
+ ? (hexToUtf8(symbolHex).replace(/[\x00- ]/g, '').trim() || null)
100
+ : null;
101
+ }
102
+ // assetId groups inputs/outputs of the same token for conservation. The
103
+ // symbol is the only identity carried in a classic STAS script; tokens
104
+ // with no symbol fall back to the owner-agnostic script tail hash so the
105
+ // grouping is still stable within a single transfer.
106
+ const assetId = symbol !== null && symbol !== void 0 ? symbol : `stas:${hex.substring(52, 68)}`;
107
+ return { assetId, symbol, ownerHash160, flagsHex };
108
+ }
109
+ }
110
+ exports.StasToken = StasToken;
111
+ //# sourceMappingURL=StasToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StasToken.js","sourceRoot":"","sources":["../../../src/StasToken.ts"],"names":[],"mappings":";;;AAAA,kCAA+C;AAiC/C,MAAM,YAAY,GAAG,QAAQ,CAAA;AAC7B,MAAM,WAAW,GAAG,QAAQ,CAAA;AAI5B,4FAA4F;AAC5F,SAAS,cAAc,CAAE,SAAiB,EAAE,MAAc,EAAE,GAAW;IACrE,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAA;IAC5E,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;IAC5F,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAC3C,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAC5C,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAChD,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;IAClE,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAC3C,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAC5C,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAChD,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;IAC5E,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,wEAAwE;AACxE,SAAS,UAAU,CAAE,SAAiB,EAAE,QAAgB,EAAE,GAAG,GAAG,CAAC;IAC/D,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,GAAG,GAAG,QAAQ,CAAA;IAClB,OAAO,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrD,IAAI,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM;YAAE,MAAK;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACrE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,MAAK;QAC/B,GAAG,IAAI,CAAC,CAAA;QACR,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;QACnD,IAAI,IAAI,KAAK,IAAI;YAAE,MAAK,CAAC,+DAA+D;QACxF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/E,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,SAAS,CAAE,GAAW;IAC7B,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IACzB,IAAI,CAAC;QACH,OAAO,WAAK,CAAC,MAAM,CAAC,WAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAa,SAAS;IACpB,mEAAmE;IACnE,MAAM,CAAC,MAAM,CAAE,MAAqB;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAA;QAC1B,OAAO,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,WAAW,CAAA;IAC9E,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAE,MAAqB;;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAA;QAC1B,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;QACpE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAC7F,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QAEpG,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzC,yEAAyE;QACzE,yEAAyE;QACzE,sBAAsB;QACtB,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,MAAM,GAAkB,IAAI,CAAA;QAChC,IAAI,QAAQ,GAAkB,IAAI,CAAA;QAClC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;YAC/C,0DAA0D;YAC1D,QAAQ,GAAG,CAAA,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,MAAM,MAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACrD,MAAM,SAAS,GAAG,MAAA,MAAM,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAA;YACnC,MAAM,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,KAAK,EAAE,CAAC;gBAC9C,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;gBAChE,CAAC,CAAC,IAAI,CAAA;QACV,CAAC;QAED,wEAAwE;QACxE,uEAAuE;QACvE,yEAAyE;QACzE,qDAAqD;QACrD,MAAM,OAAO,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,QAAQ,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAA;QAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAA;IACpD,CAAC;CACF;AA3CD,8BA2CC"}