dxs-stas-sdk 1.0.18 → 2.0.2
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/CODEBASE_MAP.json +1 -1
- package/README.md +186 -13
- package/dist/bitcoin/out-point.d.ts.map +1 -1
- package/dist/bitcoin/out-point.js +7 -2
- package/dist/bitcoin/out-point.js.map +1 -1
- package/dist/bitcoin/script-type.d.ts +3 -1
- package/dist/bitcoin/script-type.d.ts.map +1 -1
- package/dist/bitcoin/script-type.js +2 -0
- package/dist/bitcoin/script-type.js.map +1 -1
- package/dist/bitcoin/token-scheme.d.ts +15 -1
- package/dist/bitcoin/token-scheme.d.ts.map +1 -1
- package/dist/bitcoin/token-scheme.js +9 -1
- package/dist/bitcoin/token-scheme.js.map +1 -1
- package/dist/bitcoin/transaction-output.d.ts +0 -3
- package/dist/bitcoin/transaction-output.d.ts.map +1 -1
- package/dist/bitcoin/transaction-output.js +28 -73
- package/dist/bitcoin/transaction-output.js.map +1 -1
- package/dist/dstas-bundle-factory.d.ts +91 -0
- package/dist/dstas-bundle-factory.d.ts.map +1 -0
- package/dist/dstas-bundle-factory.js +436 -0
- package/dist/dstas-bundle-factory.js.map +1 -0
- package/dist/dstas-factory.d.ts +107 -0
- package/dist/dstas-factory.d.ts.map +1 -0
- package/dist/dstas-factory.js +298 -0
- package/dist/dstas-factory.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/script/build/asm-template-builder.d.ts +4 -0
- package/dist/script/build/asm-template-builder.d.ts.map +1 -0
- package/dist/script/build/asm-template-builder.js +50 -0
- package/dist/script/build/asm-template-builder.js.map +1 -0
- package/dist/script/build/p2mpkh-builder.d.ts +6 -0
- package/dist/script/build/p2mpkh-builder.d.ts.map +1 -0
- package/dist/script/build/p2mpkh-builder.js +24 -0
- package/dist/script/build/p2mpkh-builder.js.map +1 -0
- package/dist/script/build/script-builder.d.ts +1 -0
- package/dist/script/build/script-builder.d.ts.map +1 -1
- package/dist/script/build/script-builder.js +19 -1
- package/dist/script/build/script-builder.js.map +1 -1
- package/dist/script/build/stas3-freeze-multisig-builder.d.ts +22 -0
- package/dist/script/build/stas3-freeze-multisig-builder.d.ts.map +1 -0
- package/dist/script/build/stas3-freeze-multisig-builder.js +99 -0
- package/dist/script/build/stas3-freeze-multisig-builder.js.map +1 -0
- package/dist/script/build/unlocking-script-builder.d.ts +11 -0
- package/dist/script/build/unlocking-script-builder.d.ts.map +1 -0
- package/dist/script/build/unlocking-script-builder.js +19 -0
- package/dist/script/build/unlocking-script-builder.js.map +1 -0
- package/dist/script/eval/script-evaluator.d.ts +60 -0
- package/dist/script/eval/script-evaluator.d.ts.map +1 -0
- package/dist/script/eval/script-evaluator.js +1038 -0
- package/dist/script/eval/script-evaluator.js.map +1 -0
- package/dist/script/index.d.ts +13 -0
- package/dist/script/index.d.ts.map +1 -1
- package/dist/script/index.js +13 -0
- package/dist/script/index.js.map +1 -1
- package/dist/script/read/base-script-reader.d.ts +19 -0
- package/dist/script/read/base-script-reader.d.ts.map +1 -0
- package/dist/script/read/base-script-reader.js +136 -0
- package/dist/script/read/base-script-reader.js.map +1 -0
- package/dist/script/read/locking-script-reader.d.ts +40 -0
- package/dist/script/read/locking-script-reader.d.ts.map +1 -0
- package/dist/script/read/locking-script-reader.js +272 -0
- package/dist/script/read/locking-script-reader.js.map +1 -0
- package/dist/script/read/script-read-token.d.ts +9 -0
- package/dist/script/read/script-read-token.d.ts.map +1 -0
- package/dist/script/read/script-read-token.js +15 -0
- package/dist/script/read/script-read-token.js.map +1 -0
- package/dist/script/read/script-reader-extensions.d.ts +7 -0
- package/dist/script/read/script-reader-extensions.d.ts.map +1 -0
- package/dist/script/read/script-reader-extensions.js +22 -0
- package/dist/script/read/script-reader-extensions.js.map +1 -0
- package/dist/script/read/script-reader.js +1 -1
- package/dist/script/read/script-reader.js.map +1 -1
- package/dist/script/read/stas3-locking-script-decomposer.d.ts +20 -0
- package/dist/script/read/stas3-locking-script-decomposer.d.ts.map +1 -0
- package/dist/script/read/stas3-locking-script-decomposer.js +128 -0
- package/dist/script/read/stas3-locking-script-decomposer.js.map +1 -0
- package/dist/script/read/stas3-unlocking-script-decomposer.d.ts +19 -0
- package/dist/script/read/stas3-unlocking-script-decomposer.d.ts.map +1 -0
- package/dist/script/read/stas3-unlocking-script-decomposer.js +223 -0
- package/dist/script/read/stas3-unlocking-script-decomposer.js.map +1 -0
- package/dist/script/script-samples.d.ts +2 -0
- package/dist/script/script-samples.d.ts.map +1 -1
- package/dist/script/script-samples.js +102 -1
- package/dist/script/script-samples.js.map +1 -1
- package/dist/script/script-token.d.ts +3 -0
- package/dist/script/script-token.d.ts.map +1 -1
- package/dist/script/script-token.js +6 -0
- package/dist/script/script-token.js.map +1 -1
- package/dist/script/stas3-second-field.d.ts +30 -0
- package/dist/script/stas3-second-field.d.ts.map +1 -0
- package/dist/script/stas3-second-field.js +110 -0
- package/dist/script/stas3-second-field.js.map +1 -0
- package/dist/script/templates/stas3-freeze-multisig-base.d.ts +8 -0
- package/dist/script/templates/stas3-freeze-multisig-base.d.ts.map +1 -0
- package/dist/script/templates/stas3-freeze-multisig-base.js +2488 -0
- package/dist/script/templates/stas3-freeze-multisig-base.js.map +1 -0
- package/dist/script/templates/stas3-freeze-multisig.d.ts +2 -0
- package/dist/script/templates/stas3-freeze-multisig.d.ts.map +1 -0
- package/dist/script/templates/stas3-freeze-multisig.js +7 -0
- package/dist/script/templates/stas3-freeze-multisig.js.map +1 -0
- package/dist/stas-bundle-factory.d.ts.map +1 -1
- package/dist/stas-bundle-factory.js +4 -0
- package/dist/stas-bundle-factory.js.map +1 -1
- package/dist/transaction/build/input-builder.d.ts +12 -1
- package/dist/transaction/build/input-builder.d.ts.map +1 -1
- package/dist/transaction/build/input-builder.js +191 -22
- package/dist/transaction/build/input-builder.js.map +1 -1
- package/dist/transaction/build/transaction-builder.d.ts +2 -1
- package/dist/transaction/build/transaction-builder.d.ts.map +1 -1
- package/dist/transaction/build/transaction-builder.js +8 -2
- package/dist/transaction/build/transaction-builder.js.map +1 -1
- package/dist/transaction-factory.d.ts +9 -5
- package/dist/transaction-factory.d.ts.map +1 -1
- package/dist/transaction-factory.js +10 -10
- package/dist/transaction-factory.js.map +1 -1
- package/docs/AGENT_HANDBOOK.md +107 -46
- package/docs/COMMAND_LOG.md +59 -0
- package/docs/DSTAS_SCRIPT_INVARIANTS.md +109 -0
- package/docs/MIGRATION.md +10 -9
- package/docs/PR_SUMMARY.md +38 -20
- package/docs/STAS3_FREEZE_MULTISIG.md +92 -0
- package/package.json +2 -2
- package/src/bitcoin/out-point.ts +11 -3
- package/src/bitcoin/script-type.ts +2 -0
- package/src/bitcoin/token-scheme.ts +25 -0
- package/src/bitcoin/transaction-output.ts +26 -75
- package/src/dstas-bundle-factory.ts +799 -0
- package/src/dstas-factory.ts +589 -0
- package/src/index.ts +18 -0
- package/src/script/build/asm-template-builder.ts +52 -0
- package/src/script/build/p2mpkh-builder.ts +22 -0
- package/src/script/build/script-builder.ts +22 -1
- package/src/script/build/stas3-freeze-multisig-builder.ts +158 -0
- package/src/script/build/unlocking-script-builder.ts +18 -0
- package/src/script/eval/script-evaluator.ts +1236 -0
- package/src/script/index.ts +13 -0
- package/src/script/read/base-script-reader.ts +192 -0
- package/src/script/read/locking-script-reader.ts +334 -0
- package/src/script/read/script-read-token.ts +17 -0
- package/src/script/read/script-reader-extensions.ts +21 -0
- package/src/script/read/script-reader.ts +1 -1
- package/src/script/read/stas3-locking-script-decomposer.ts +162 -0
- package/src/script/read/stas3-unlocking-script-decomposer.ts +255 -0
- package/src/script/script-samples.ts +107 -0
- package/src/script/script-token.ts +6 -0
- package/src/script/stas3-second-field.ts +161 -0
- package/src/script/templates/stas3-freeze-multisig-base.ts +2490 -0
- package/src/script/templates/stas3-freeze-multisig.ts +3 -0
- package/src/stas-bundle-factory.ts +4 -0
- package/src/transaction/build/input-builder.ts +268 -28
- package/src/transaction/build/transaction-builder.ts +9 -2
- package/src/transaction-factory.ts +14 -6
- package/tests/address-outpoint.test.ts +49 -0
- package/tests/debug/dstas-transfer-debug.ts +160 -0
- package/tests/debug/dstas-with-change-probe.test.ts +123 -0
- package/tests/dstas-bundle-factory.test.ts +403 -0
- package/tests/dstas-factory-guards.test.ts +50 -0
- package/tests/dstas-flow.test.ts +2069 -0
- package/tests/dstas-multisig-authority-flow.test.ts +518 -0
- package/tests/dstas-swap-mode.test.ts +89 -0
- package/tests/fixtures/dstas-reference-transfer-p2pkh.txt +1 -0
- package/tests/helpers/dstas-flow-helpers.ts +156 -0
- package/tests/helpers/fee-assertions.ts +38 -0
- package/tests/locking-script-reader.test.ts +173 -0
- package/tests/script-build.test.ts +49 -1
- package/tests/script-eval.test.ts +153 -0
- package/tests/stas3-second-field.test.ts +73 -0
- package/tests/token-scheme.test.ts +34 -0
- package/tests/transaction-build.test.ts +53 -0
package/CODEBASE_MAP.json
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dxs-stas-sdk
|
|
2
2
|
|
|
3
|
-
TypeScript SDK for building and reading Bitcoin SV transactions, with first-class support for STAS token scripts. It includes script builders/readers, transaction builders/parsers, STAS
|
|
3
|
+
TypeScript SDK for building and reading Bitcoin SV transactions, with first-class support for DSTAS/STAS token scripts. It includes script builders/readers, transaction builders/parsers, DSTAS and STAS factories, and address/key utilities.
|
|
4
4
|
|
|
5
5
|
## Binary types
|
|
6
6
|
|
|
@@ -16,6 +16,177 @@ npm install dxs-stas-sdk
|
|
|
16
16
|
|
|
17
17
|
An `OutPoint` represents a spendable UTXO: txid, vout, locking script, satoshis, and owner address.
|
|
18
18
|
|
|
19
|
+
## Example: build a DSTAS issue + transfer flow
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import {
|
|
23
|
+
BuildDstasIssueTxs,
|
|
24
|
+
BuildDstasTransferTx,
|
|
25
|
+
OutPoint,
|
|
26
|
+
PrivateKey,
|
|
27
|
+
TokenScheme,
|
|
28
|
+
TransactionReader,
|
|
29
|
+
toHex,
|
|
30
|
+
utf8ToBytes,
|
|
31
|
+
fromHex,
|
|
32
|
+
} from "dxs-stas-sdk";
|
|
33
|
+
|
|
34
|
+
const bob = new PrivateKey(
|
|
35
|
+
fromHex("b62fd57a07804f79291317261054eb9b19c9ccec49146c38b30a29d48636c368"),
|
|
36
|
+
);
|
|
37
|
+
const alice = new PrivateKey(
|
|
38
|
+
fromHex("77b1b7d5bfe1288d94f829baba86d503e1a06b571aaa5d36820be19ef2fe520e"),
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const scheme = new TokenScheme(
|
|
42
|
+
"Divisible STAS",
|
|
43
|
+
toHex(bob.Address.Hash160), // issuer token id
|
|
44
|
+
"DSTAS",
|
|
45
|
+
1,
|
|
46
|
+
{ isDivisible: true },
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// Parse a funding transaction that belongs to issuer address (bob).
|
|
50
|
+
const sourceTx = TransactionReader.readHex("<funding-tx-hex>");
|
|
51
|
+
const fundingOut = OutPoint.fromTransaction(sourceTx, 0);
|
|
52
|
+
|
|
53
|
+
const { issueTxHex } = BuildDstasIssueTxs({
|
|
54
|
+
fundingPayment: { OutPoint: fundingOut, Owner: bob },
|
|
55
|
+
scheme,
|
|
56
|
+
destinations: [{ Satoshis: 100, To: bob.Address }],
|
|
57
|
+
feeRate: 0.1,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const issueTx = TransactionReader.readHex(issueTxHex);
|
|
61
|
+
const stasOut = OutPoint.fromTransaction(issueTx, 0);
|
|
62
|
+
const feeOut = OutPoint.fromTransaction(issueTx, 1);
|
|
63
|
+
|
|
64
|
+
const transferTxHex = BuildDstasTransferTx({
|
|
65
|
+
stasPayment: { OutPoint: stasOut, Owner: bob },
|
|
66
|
+
feePayment: { OutPoint: feeOut, Owner: bob },
|
|
67
|
+
destination: { Satoshis: 100, To: alice.Address },
|
|
68
|
+
Scheme: scheme,
|
|
69
|
+
note: [utf8ToBytes("DSTAS"), utf8ToBytes("transfer")],
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Example: high-level DSTAS payouts with `DstasBundleFactory`
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import {
|
|
77
|
+
Address,
|
|
78
|
+
DstasBundleFactory,
|
|
79
|
+
DstasSpendType,
|
|
80
|
+
LockingScriptReader,
|
|
81
|
+
OutPoint,
|
|
82
|
+
ScriptType,
|
|
83
|
+
Transaction,
|
|
84
|
+
Wallet,
|
|
85
|
+
hash160,
|
|
86
|
+
toHex,
|
|
87
|
+
utf8ToBytes,
|
|
88
|
+
} from "dxs-stas-sdk";
|
|
89
|
+
|
|
90
|
+
const stasWallet =
|
|
91
|
+
Wallet.fromMnemonic("<mnemonic>").deriveWallet("m/44'/236'/0'/0/0");
|
|
92
|
+
const feeWallet =
|
|
93
|
+
Wallet.fromMnemonic("<mnemonic>").deriveWallet("m/44'/236'/0'/0/1");
|
|
94
|
+
|
|
95
|
+
// You provide these integrations from your indexer/wallet backend.
|
|
96
|
+
const getStasUtxoSet = async (minSats = 0): Promise<OutPoint[]> => {
|
|
97
|
+
return await fetchDstasUtxosForAddress(stasWallet.Address, minSats);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const getFundingUtxo = async ({
|
|
101
|
+
estimatedFeeSatoshis,
|
|
102
|
+
}: {
|
|
103
|
+
utxoIdsToSpend: string[];
|
|
104
|
+
estimatedFeeSatoshis: number;
|
|
105
|
+
transactionsCount: number;
|
|
106
|
+
}): Promise<OutPoint> => {
|
|
107
|
+
return await fetchFeeUtxoForAddress(feeWallet.Address, estimatedFeeSatoshis);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const getTransactions = async (
|
|
111
|
+
ids: string[],
|
|
112
|
+
): Promise<Record<string, Transaction>> => {
|
|
113
|
+
return await fetchTransactionsByIds(ids);
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const mapSpendTypeToCode = (spendType: DstasSpendType): number => {
|
|
117
|
+
if (spendType === "swap") return 4;
|
|
118
|
+
if (spendType === "freeze" || spendType === "unfreeze") return 2;
|
|
119
|
+
return 1;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const factory = new DstasBundleFactory(
|
|
123
|
+
stasWallet,
|
|
124
|
+
feeWallet,
|
|
125
|
+
getFundingUtxo,
|
|
126
|
+
getStasUtxoSet,
|
|
127
|
+
getTransactions,
|
|
128
|
+
({ fromOutPoint, recipient, spendType, isFreezeLike, isChange }) => {
|
|
129
|
+
const parsed = LockingScriptReader.read(fromOutPoint.LockignScript).Dstas;
|
|
130
|
+
if (!parsed) throw new Error("Expected DSTAS input locking script");
|
|
131
|
+
if (recipient.m !== 1 || recipient.addresses.length !== 1) {
|
|
132
|
+
throw new Error("README example supports only m=1 recipient");
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
owner: recipient.addresses[0].Hash160,
|
|
137
|
+
actionData:
|
|
138
|
+
spendType === "swap" && !isChange ? parsed.ActionDataRaw : null,
|
|
139
|
+
redemptionPkh: parsed.Redemption,
|
|
140
|
+
frozen:
|
|
141
|
+
spendType === "freeze"
|
|
142
|
+
? true
|
|
143
|
+
: spendType === "unfreeze"
|
|
144
|
+
? false
|
|
145
|
+
: isFreezeLike,
|
|
146
|
+
flags: parsed.Flags,
|
|
147
|
+
serviceFields: parsed.ServiceFields,
|
|
148
|
+
optionalData: parsed.OptionalData,
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
({ txBuilder, inputIndex, spendType, isMerge }) => {
|
|
152
|
+
const input = txBuilder.Inputs[inputIndex];
|
|
153
|
+
input.Merge = isMerge;
|
|
154
|
+
input.DstasSpendingType = mapSpendTypeToCode(spendType);
|
|
155
|
+
input.sign(true);
|
|
156
|
+
if (!input.UnlockingScript) {
|
|
157
|
+
throw new Error("Failed to build DSTAS unlocking script");
|
|
158
|
+
}
|
|
159
|
+
return input.UnlockingScript;
|
|
160
|
+
},
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
const recipients = [
|
|
164
|
+
{
|
|
165
|
+
recipient: { m: 1, addresses: [Address.fromBase58("<alice-address>")] },
|
|
166
|
+
satoshis: 150,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
recipient: { m: 1, addresses: [Address.fromBase58("<bob-address>")] },
|
|
170
|
+
satoshis: 200,
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
|
|
174
|
+
const bundle = await factory.transfer({
|
|
175
|
+
outputs: recipients,
|
|
176
|
+
spendType: "transfer",
|
|
177
|
+
note: [utf8ToBytes("DSTAS"), utf8ToBytes("bundle transfer")],
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
console.log("transactions:", bundle.transactions?.length ?? 0);
|
|
181
|
+
console.log("paid fee satoshis:", bundle.feeSatoshis);
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Notes:
|
|
185
|
+
|
|
186
|
+
- `DstasBundleFactory` plans merge/split/transfer service transactions automatically.
|
|
187
|
+
- `note` is attached only to final transfer transaction(s), not to intermediate service transactions.
|
|
188
|
+
- For recipient multisig (`m > 1`), replace the simple `owner` derivation with your protocol-specific owner preimage/hash strategy.
|
|
189
|
+
|
|
19
190
|
## Example: build a simple P2PKH transaction
|
|
20
191
|
|
|
21
192
|
```ts
|
|
@@ -31,6 +202,7 @@ import {
|
|
|
31
202
|
const pk = new PrivateKey(
|
|
32
203
|
fromHex("b62fd57a07804f79291317261054eb9b19c9ccec49146c38b30a29d48636c368"),
|
|
33
204
|
);
|
|
205
|
+
const from = pk.Address;
|
|
34
206
|
const to = Address.fromBase58("1MkvWa82XHFqmRHaiRZ8BqZS7Uc83wekjp");
|
|
35
207
|
const lockingScript = fromHex(
|
|
36
208
|
"76a914e3b111de8fec527b41f4189e313638075d96ccd688ac",
|
|
@@ -79,7 +251,7 @@ const tokenScheme = new TokenScheme(
|
|
|
79
251
|
"Token Name",
|
|
80
252
|
"e3b111de8fec527b41f4189e313638075d96ccd6",
|
|
81
253
|
"TokenSymbol",
|
|
82
|
-
|
|
254
|
+
1,
|
|
83
255
|
);
|
|
84
256
|
|
|
85
257
|
// Parse a previous transaction that produced a STAS output + fee output.
|
|
@@ -119,7 +291,7 @@ const tokenScheme = new TokenScheme(
|
|
|
119
291
|
"Token Name",
|
|
120
292
|
"e3b111de8fec527b41f4189e313638075d96ccd6",
|
|
121
293
|
"Token Symbol",
|
|
122
|
-
|
|
294
|
+
1,
|
|
123
295
|
);
|
|
124
296
|
|
|
125
297
|
// Parse a funding transaction with two outputs:
|
|
@@ -140,8 +312,8 @@ const txHex = TransactionBuilder.init()
|
|
|
140
312
|
## What this library is for
|
|
141
313
|
|
|
142
314
|
- Construct and parse raw Bitcoin SV transactions.
|
|
143
|
-
- Build and read scripts (P2PKH, OP_RETURN, STAS).
|
|
144
|
-
- Create STAS token transactions
|
|
315
|
+
- Build and read scripts (P2PKH, OP_RETURN, DSTAS, STAS).
|
|
316
|
+
- Create DSTAS and STAS token transactions.
|
|
145
317
|
- Work with keys, addresses, and standard hashing helpers.
|
|
146
318
|
|
|
147
319
|
## FAQ / common pitfalls
|
|
@@ -154,14 +326,15 @@ const txHex = TransactionBuilder.init()
|
|
|
154
326
|
|
|
155
327
|
## API overview (high level)
|
|
156
328
|
|
|
157
|
-
| Area | Purpose | Key exports
|
|
158
|
-
| ----------------------- | ------------------------------------ |
|
|
159
|
-
| Bytes | Hex/UTF-8 helpers and byte utilities | `fromHex`, `toHex`, `utf8ToBytes`, `bytesToUtf8`, `concat`, `equal`
|
|
160
|
-
| Bitcoin primitives | Keys, addresses, transactions | `PrivateKey`, `Address`, `Transaction`, `OutPoint`
|
|
161
|
-
| Script builders/readers | Build and parse scripts | `ScriptBuilder`, `P2pkhBuilder`, `P2stasBuilder`, `NullDataBuilder`, `ScriptReader`
|
|
162
|
-
| Transaction building | Assemble raw txs | `TransactionBuilder`, `TransactionReader`
|
|
163
|
-
|
|
|
329
|
+
| Area | Purpose | Key exports |
|
|
330
|
+
| ----------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------- |
|
|
331
|
+
| Bytes | Hex/UTF-8 helpers and byte utilities | `fromHex`, `toHex`, `utf8ToBytes`, `bytesToUtf8`, `concat`, `equal` |
|
|
332
|
+
| Bitcoin primitives | Keys, addresses, transactions | `PrivateKey`, `Address`, `Transaction`, `OutPoint` |
|
|
333
|
+
| Script builders/readers | Build and parse scripts | `ScriptBuilder`, `P2pkhBuilder`, `P2stasBuilder`, `NullDataBuilder`, `ScriptReader` |
|
|
334
|
+
| Transaction building | Assemble raw txs | `TransactionBuilder`, `TransactionReader` |
|
|
335
|
+
| Token factories | DSTAS/STAS workflows | `DstasBundleFactory`, `BuildDstasIssueTxs`, `BuildDstasTransferTx`, `BuildTransferTx`, `BuildSplitTx` |
|
|
164
336
|
|
|
165
337
|
## Author
|
|
166
338
|
|
|
167
|
-
- Oleg Panagushin
|
|
339
|
+
- Author: [Oleg Panagushin](https://github.com/panagushin)
|
|
340
|
+
CTO / System Architect — Crypto & FinTech
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"out-point.d.ts","sourceRoot":"","sources":["../../src/bitcoin/out-point.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,qBAAa,QAAQ;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,KAAK,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;gBAGxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,KAAK,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU;IAUxB,MAAM,CAAC,eAAe,gBAAiB,WAAW,QAAQ,MAAM,kBAC1B;IAEtC,MAAM,CAAC,OAAO,QAAS,MAAM,QAAQ,MAAM,kBACc;IAEzD,QAAQ,eAAqC;CAC9C;AAED,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"out-point.d.ts","sourceRoot":"","sources":["../../src/bitcoin/out-point.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,qBAAa,QAAQ;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,KAAK,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;gBAGxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,KAAK,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU;IAUxB,MAAM,CAAC,eAAe,gBAAiB,WAAW,QAAQ,MAAM,kBAC1B;IAEtC,MAAM,CAAC,OAAO,QAAS,MAAM,QAAQ,MAAM,kBACc;IAEzD,QAAQ,eAAqC;CAC9C;AAED,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM;CA4BnD"}
|
|
@@ -21,8 +21,13 @@ class OutPointFull extends OutPoint {
|
|
|
21
21
|
constructor(transaction, vout) {
|
|
22
22
|
const output = transaction.Outputs[vout];
|
|
23
23
|
if (output.ScriptType !== script_type_1.ScriptType.p2pkh &&
|
|
24
|
-
output.ScriptType !== script_type_1.ScriptType.
|
|
25
|
-
|
|
24
|
+
output.ScriptType !== script_type_1.ScriptType.p2mpkh &&
|
|
25
|
+
output.ScriptType !== script_type_1.ScriptType.p2stas &&
|
|
26
|
+
output.ScriptType !== script_type_1.ScriptType.dstas)
|
|
27
|
+
throw new Error("p2pkh, p2mpkh, p2stas or dstas output must be provided");
|
|
28
|
+
if (!output.Address) {
|
|
29
|
+
throw new Error("Output does not expose address (for example, DSTAS multisig owner). Build OutPoint manually.");
|
|
30
|
+
}
|
|
26
31
|
super(transaction.Id, vout, output.LockignScript, output.Satoshis, output.Address, output.ScriptType);
|
|
27
32
|
this.Transaction = transaction;
|
|
28
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"out-point.js","sourceRoot":"","sources":["../../src/bitcoin/out-point.ts"],"names":[],"mappings":";;;AAAA,gDAAmD;AAEnD,+CAA2C;AAI3C,MAAa,QAAQ;IASnB,YACE,IAAY,EACZ,IAAY,EACZ,aAAoB,EACpB,QAAgB,EAChB,OAAgB,EAChB,UAAsB;QAgBxB,aAAQ,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAd3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;;AAvBH,4BAgCC;AAPQ,wBAAe,GAAG,CAAC,WAAwB,EAAE,IAAY,EAAE,EAAE,CAClE,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,AADf,CACgB;AAE/B,gBAAO,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,EAAE,CAC7C,IAAI,YAAY,CAAC,+BAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,AAD1C,CAC2C;AAK3D,MAAa,YAAa,SAAQ,QAAQ;IACxC,YAAY,WAAwB,EAAE,IAAY;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzC,IACE,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,KAAK;YACtC,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"out-point.js","sourceRoot":"","sources":["../../src/bitcoin/out-point.ts"],"names":[],"mappings":";;;AAAA,gDAAmD;AAEnD,+CAA2C;AAI3C,MAAa,QAAQ;IASnB,YACE,IAAY,EACZ,IAAY,EACZ,aAAoB,EACpB,QAAgB,EAChB,OAAgB,EAChB,UAAsB;QAgBxB,aAAQ,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAd3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;;AAvBH,4BAgCC;AAPQ,wBAAe,GAAG,CAAC,WAAwB,EAAE,IAAY,EAAE,EAAE,CAClE,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,AADf,CACgB;AAE/B,gBAAO,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,EAAE,CAC7C,IAAI,YAAY,CAAC,+BAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,AAD1C,CAC2C;AAK3D,MAAa,YAAa,SAAQ,QAAQ;IACxC,YAAY,WAAwB,EAAE,IAAY;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzC,IACE,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,KAAK;YACtC,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,MAAM;YACvC,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,MAAM;YACvC,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,KAAK;YAEtC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAE5E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;SACH;QAED,KAAK,CACH,WAAW,CAAC,EAAE,EACd,IAAI,EACJ,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,UAAU,CAClB,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AA7BD,oCA6BC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-type.d.ts","sourceRoot":"","sources":["../../src/bitcoin/script-type.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,OAAO,IAAI;IACX,IAAI,IAAI;IACR,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,QAAQ,IAAI;IACZ,MAAM,IAAI;CACX"}
|
|
1
|
+
{"version":3,"file":"script-type.d.ts","sourceRoot":"","sources":["../../src/bitcoin/script-type.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,OAAO,IAAI;IACX,IAAI,IAAI;IACR,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,QAAQ,IAAI;IACZ,MAAM,IAAI;IACV,KAAK,IAAI;IACT,MAAM,IAAI;CACX"}
|
|
@@ -10,5 +10,7 @@ var ScriptType;
|
|
|
10
10
|
ScriptType[ScriptType["p2ms"] = 4] = "p2ms";
|
|
11
11
|
ScriptType[ScriptType["nullData"] = 5] = "nullData";
|
|
12
12
|
ScriptType[ScriptType["p2stas"] = 6] = "p2stas";
|
|
13
|
+
ScriptType[ScriptType["dstas"] = 7] = "dstas";
|
|
14
|
+
ScriptType[ScriptType["p2mpkh"] = 8] = "p2mpkh";
|
|
13
15
|
})(ScriptType || (exports.ScriptType = ScriptType = {}));
|
|
14
16
|
//# sourceMappingURL=script-type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-type.js","sourceRoot":"","sources":["../../src/bitcoin/script-type.ts"],"names":[],"mappings":";;;AAAA,IAAY,
|
|
1
|
+
{"version":3,"file":"script-type.js","sourceRoot":"","sources":["../../src/bitcoin/script-type.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAUX;AAVD,WAAY,UAAU;IACpB,iDAAW,CAAA;IACX,2CAAQ,CAAA;IACR,6CAAS,CAAA;IACT,2CAAQ,CAAA;IACR,2CAAQ,CAAA;IACR,mDAAY,CAAA;IACZ,+CAAU,CAAA;IACV,6CAAS,CAAA;IACT,+CAAU,CAAA;AACZ,CAAC,EAVW,UAAU,0BAAV,UAAU,QAUrB"}
|
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
export type TokenAuthority = {
|
|
2
|
+
m: number;
|
|
3
|
+
publicKeys: string[];
|
|
4
|
+
};
|
|
5
|
+
export type TokenSchemeOptions = {
|
|
6
|
+
freeze?: boolean;
|
|
7
|
+
confiscation?: boolean;
|
|
8
|
+
isDivisible?: boolean;
|
|
9
|
+
authority?: TokenAuthority;
|
|
10
|
+
};
|
|
1
11
|
export declare class TokenScheme {
|
|
2
12
|
Name: string;
|
|
3
13
|
TokenId: string;
|
|
4
14
|
Symbol: string;
|
|
5
15
|
SatoshisPerToken: number;
|
|
6
|
-
|
|
16
|
+
Freeze: boolean;
|
|
17
|
+
Confiscation: boolean;
|
|
18
|
+
IsDivisible: boolean;
|
|
19
|
+
Authority?: TokenAuthority;
|
|
20
|
+
constructor(name: string, tokenId: string, symbol: string, satoshisPerToken: number, options?: TokenSchemeOptions);
|
|
7
21
|
toJson: () => string;
|
|
8
22
|
toBytes: () => Uint8Array;
|
|
9
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-scheme.d.ts","sourceRoot":"","sources":["../../src/bitcoin/token-scheme.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"token-scheme.d.ts","sourceRoot":"","sources":["../../src/bitcoin/token-scheme.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF,qBAAa,WAAW;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,CAAC;gBAGzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,kBAAuB;IAYlC,MAAM,eAUD;IAEL,OAAO,mBAAiD;CACzD"}
|
|
@@ -2,18 +2,26 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TokenScheme = void 0;
|
|
4
4
|
class TokenScheme {
|
|
5
|
-
constructor(name, tokenId, symbol, satoshisPerToken) {
|
|
5
|
+
constructor(name, tokenId, symbol, satoshisPerToken, options = {}) {
|
|
6
6
|
this.toJson = () => JSON.stringify({
|
|
7
7
|
name: this.Name,
|
|
8
8
|
tokenId: this.TokenId,
|
|
9
9
|
symbol: this.Symbol,
|
|
10
10
|
satoshisPerToken: this.SatoshisPerToken,
|
|
11
|
+
freeze: this.Freeze,
|
|
12
|
+
confiscation: this.Confiscation,
|
|
13
|
+
isDivisible: this.IsDivisible,
|
|
14
|
+
authority: this.Authority,
|
|
11
15
|
});
|
|
12
16
|
this.toBytes = () => new TextEncoder().encode(this.toJson());
|
|
13
17
|
this.Name = name;
|
|
14
18
|
this.TokenId = tokenId;
|
|
15
19
|
this.Symbol = symbol;
|
|
16
20
|
this.SatoshisPerToken = satoshisPerToken;
|
|
21
|
+
this.Freeze = options.freeze === true;
|
|
22
|
+
this.Confiscation = options.confiscation === true;
|
|
23
|
+
this.IsDivisible = options.isDivisible === true;
|
|
24
|
+
this.Authority = options.authority;
|
|
17
25
|
}
|
|
18
26
|
}
|
|
19
27
|
exports.TokenScheme = TokenScheme;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-scheme.js","sourceRoot":"","sources":["../../src/bitcoin/token-scheme.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"token-scheme.js","sourceRoot":"","sources":["../../src/bitcoin/token-scheme.ts"],"names":[],"mappings":";;;AAYA,MAAa,WAAW;IAUtB,YACE,IAAY,EACZ,OAAe,EACf,MAAc,EACd,gBAAwB,EACxB,UAA8B,EAAE;QAYlC,WAAM,GAAG,GAAG,EAAE,CACZ,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEL,YAAO,GAAG,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAtBtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;CAeF;AAxCD,kCAwCC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-output.d.ts","sourceRoot":"","sources":["../../src/bitcoin/transaction-output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transaction-output.d.ts","sourceRoot":"","sources":["../../src/bitcoin/transaction-output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAS,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,iBAAiB;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,KAAK,CAAC;IACrB,UAAU,EAAE,UAAU,CAAsB;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,KAAK,EAAE,CAAM;gBAEP,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK;CAyCnD"}
|
|
@@ -1,88 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TransactionOutput = void 0;
|
|
4
|
-
const
|
|
5
|
-
const script_samples_1 = require("../script/script-samples");
|
|
4
|
+
const locking_script_reader_1 = require("../script/read/locking-script-reader");
|
|
6
5
|
const bytes_1 = require("../bytes");
|
|
7
|
-
const address_1 = require("./address");
|
|
8
|
-
const op_codes_1 = require("./op-codes");
|
|
9
6
|
const script_type_1 = require("./script-type");
|
|
10
7
|
class TransactionOutput {
|
|
11
8
|
constructor(satoshis, lockignScript) {
|
|
9
|
+
var _a, _b, _c, _d;
|
|
12
10
|
this.ScriptType = script_type_1.ScriptType.unknown;
|
|
13
11
|
this.data = [];
|
|
14
|
-
this._isNulData = (scriptTokens) => {
|
|
15
|
-
if (scriptTokens.length > 2 &&
|
|
16
|
-
scriptTokens[0].OpCodeNum === op_codes_1.OpCode.OP_0 &&
|
|
17
|
-
scriptTokens[1].OpCodeNum === op_codes_1.OpCode.OP_RETURN) {
|
|
18
|
-
for (let i = 2; i < scriptTokens.length; i++)
|
|
19
|
-
this.data.push(scriptTokens[i].Data);
|
|
20
|
-
this.ScriptType = script_type_1.ScriptType.nullData;
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
return false;
|
|
24
|
-
};
|
|
25
|
-
this._isP2pkh = (scriptTokens) => {
|
|
26
|
-
if (scriptTokens.length > script_samples_1.p2phkTokens.length)
|
|
27
|
-
return false;
|
|
28
|
-
let opReturnReached = false;
|
|
29
|
-
for (let i = 0; i < scriptTokens.length; i++) {
|
|
30
|
-
const token = scriptTokens[i];
|
|
31
|
-
if (!opReturnReached) {
|
|
32
|
-
if (token.OpCodeNum === op_codes_1.OpCode.OP_RETURN) {
|
|
33
|
-
opReturnReached = true;
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
if (token.OpCodeNum !== script_samples_1.p2phkTokens[i].OpCodeNum)
|
|
37
|
-
return false;
|
|
38
|
-
if (script_samples_1.p2phkTokens[i].IsReceiverId)
|
|
39
|
-
this.Address = new address_1.Address(token.Data);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
this.data.push(token.Data);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
this.ScriptType = script_type_1.ScriptType.p2pkh;
|
|
47
|
-
return true;
|
|
48
|
-
};
|
|
49
|
-
this._isP2stas = (scriptTokens) => {
|
|
50
|
-
const p2stasTokens = (0, script_samples_1.getP2stasTokens)();
|
|
51
|
-
if (scriptTokens.length < p2stasTokens.length)
|
|
52
|
-
return false;
|
|
53
|
-
let opReturnIdx = -1;
|
|
54
|
-
for (let i = 0; i < scriptTokens.length; i++) {
|
|
55
|
-
const token = scriptTokens[i];
|
|
56
|
-
if (opReturnIdx === -1) {
|
|
57
|
-
if (token.OpCodeNum === op_codes_1.OpCode.OP_RETURN) {
|
|
58
|
-
opReturnIdx = i;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
if (token.OpCodeNum !== p2stasTokens[i].OpCodeNum)
|
|
62
|
-
return false;
|
|
63
|
-
if (p2stasTokens[i].IsReceiverId)
|
|
64
|
-
this.Address = new address_1.Address(token.Data);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
if (i === opReturnIdx + 1)
|
|
69
|
-
this.TokenId = (0, bytes_1.toHex)(token.Data);
|
|
70
|
-
else if (i === opReturnIdx + 2)
|
|
71
|
-
this.Symbol = (0, bytes_1.bytesToUtf8)(token.Data);
|
|
72
|
-
else
|
|
73
|
-
this.data.push(token.Data);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
this.ScriptType = script_type_1.ScriptType.p2stas;
|
|
77
|
-
return true;
|
|
78
|
-
};
|
|
79
12
|
this.Satoshis = satoshis;
|
|
80
13
|
this.LockignScript = lockignScript;
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
14
|
+
const reader = locking_script_reader_1.LockingScriptReader.read(this.LockignScript);
|
|
15
|
+
this.ScriptType = reader.ScriptType;
|
|
16
|
+
this.Address = reader.Address;
|
|
17
|
+
if (reader.ScriptType === script_type_1.ScriptType.nullData) {
|
|
18
|
+
this.data = (_a = reader.Data) !== null && _a !== void 0 ? _a : [];
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (reader.ScriptType === script_type_1.ScriptType.p2pkh ||
|
|
22
|
+
reader.ScriptType === script_type_1.ScriptType.p2mpkh) {
|
|
23
|
+
this.data = (_b = reader.Data) !== null && _b !== void 0 ? _b : [];
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (reader.ScriptType === script_type_1.ScriptType.p2stas) {
|
|
27
|
+
this.TokenId = (_c = reader.getTokenId()) !== null && _c !== void 0 ? _c : undefined;
|
|
28
|
+
this.Symbol = (_d = reader.getSymbol()) !== null && _d !== void 0 ? _d : undefined;
|
|
29
|
+
if (reader.Data && reader.Data.length > 2) {
|
|
30
|
+
for (let i = 2; i < reader.Data.length; i++) {
|
|
31
|
+
this.data.push(reader.Data[i]);
|
|
32
|
+
}
|
|
85
33
|
}
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (reader.ScriptType === script_type_1.ScriptType.dstas && reader.Dstas) {
|
|
37
|
+
this.TokenId = (0, bytes_1.toHex)(reader.Dstas.Redemption);
|
|
38
|
+
this.data.push(reader.Dstas.Flags);
|
|
39
|
+
this.data.push(...reader.Dstas.ServiceFields);
|
|
40
|
+
this.data.push(...reader.Dstas.OptionalData);
|
|
86
41
|
}
|
|
87
42
|
}
|
|
88
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-output.js","sourceRoot":"","sources":["../../src/bitcoin/transaction-output.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"transaction-output.js","sourceRoot":"","sources":["../../src/bitcoin/transaction-output.ts"],"names":[],"mappings":";;;AAAA,gFAA2E;AAC3E,oCAAwC;AAExC,+CAA2C;AAE3C,MAAa,iBAAiB;IAS5B,YAAY,QAAgB,EAAE,aAAoB;;QANlD,eAAU,GAAe,wBAAU,CAAC,OAAO,CAAC;QAI5C,SAAI,GAAY,EAAE,CAAC;QAGjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,MAAM,MAAM,GAAG,2CAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE5D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE9B,IAAI,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,QAAQ,EAAE;YAC7C,IAAI,CAAC,IAAI,GAAG,MAAA,MAAM,CAAC,IAAI,mCAAI,EAAE,CAAC;YAC9B,OAAO;SACR;QAED,IACE,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,KAAK;YACtC,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,MAAM,EACvC;YACA,IAAI,CAAC,IAAI,GAAG,MAAA,MAAM,CAAC,IAAI,mCAAI,EAAE,CAAC;YAC9B,OAAO;SACR;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,MAAM,EAAE;YAC3C,IAAI,CAAC,OAAO,GAAG,MAAA,MAAM,CAAC,UAAU,EAAE,mCAAI,SAAS,CAAC;YAChD,IAAI,CAAC,MAAM,GAAG,MAAA,MAAM,CAAC,SAAS,EAAE,mCAAI,SAAS,CAAC;YAE9C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChC;aACF;YACD,OAAO;SACR;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,wBAAU,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE;YAC1D,IAAI,CAAC,OAAO,GAAG,IAAA,aAAK,EAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;SAC9C;IACH,CAAC;CACF;AAlDD,8CAkDC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Address, OutPoint, TPayment, Transaction, Wallet } from "./bitcoin";
|
|
2
|
+
import { Bytes } from "./bytes";
|
|
3
|
+
import { TransactionBuilder } from "./transaction";
|
|
4
|
+
import { Stas3FreezeMultisigParams } from "./script/build/stas3-freeze-multisig-builder";
|
|
5
|
+
export declare const AvgFeeForStas30Merge = 500;
|
|
6
|
+
export type TDstasFundingUtxoRequest = {
|
|
7
|
+
utxoIdsToSpend: string[];
|
|
8
|
+
estimatedFeeSatoshis: number;
|
|
9
|
+
transactionsCount: number;
|
|
10
|
+
};
|
|
11
|
+
export type TDstasGetUtxoFunction = (satoshis?: number) => Promise<OutPoint[]>;
|
|
12
|
+
export type TDstasGetFundingUtxoFunction = (request: TDstasFundingUtxoRequest) => Promise<OutPoint>;
|
|
13
|
+
export type TDstasGetTransactionsFunction = (ids: string[]) => Promise<Record<string, Transaction>>;
|
|
14
|
+
export type TDstasPayoutBundle = {
|
|
15
|
+
transactions?: string[];
|
|
16
|
+
feeSatoshis: number;
|
|
17
|
+
message?: string;
|
|
18
|
+
devMessage?: string;
|
|
19
|
+
};
|
|
20
|
+
export type DstasSpendType = "transfer" | "split" | "merge" | "freeze" | "unfreeze" | "swap";
|
|
21
|
+
export type TDstasRecipient = {
|
|
22
|
+
m: number;
|
|
23
|
+
addresses: Address[];
|
|
24
|
+
};
|
|
25
|
+
export type TDstasTransferOutput = {
|
|
26
|
+
recipient: TDstasRecipient;
|
|
27
|
+
satoshis: number;
|
|
28
|
+
};
|
|
29
|
+
export type TDstasTransferRequest = {
|
|
30
|
+
outputs: TDstasTransferOutput[];
|
|
31
|
+
spendType?: "transfer" | "freeze" | "unfreeze";
|
|
32
|
+
note?: Bytes[];
|
|
33
|
+
};
|
|
34
|
+
export type TDstasLockingParamsBuilder = (args: {
|
|
35
|
+
fromOutPoint: OutPoint;
|
|
36
|
+
recipient: TDstasRecipient;
|
|
37
|
+
spendType: DstasSpendType;
|
|
38
|
+
isFreezeLike: boolean;
|
|
39
|
+
outputIndex: number;
|
|
40
|
+
outputCount: number;
|
|
41
|
+
isChange: boolean;
|
|
42
|
+
}) => Stas3FreezeMultisigParams;
|
|
43
|
+
export type TDstasUnlockingScriptBuilder = (args: {
|
|
44
|
+
txBuilder: TransactionBuilder;
|
|
45
|
+
inputIndex: number;
|
|
46
|
+
outPoint: OutPoint;
|
|
47
|
+
spendType: DstasSpendType;
|
|
48
|
+
isFreezeLike: boolean;
|
|
49
|
+
isMerge: boolean;
|
|
50
|
+
}) => Bytes;
|
|
51
|
+
export type TDstasPayment = TPayment & {
|
|
52
|
+
UnlockingScript?: Bytes;
|
|
53
|
+
};
|
|
54
|
+
export type TDstasDestination = {
|
|
55
|
+
Satoshis: number;
|
|
56
|
+
LockingParams: Stas3FreezeMultisigParams;
|
|
57
|
+
};
|
|
58
|
+
export declare class DstasBundleFactory {
|
|
59
|
+
private readonly stasWallet;
|
|
60
|
+
private readonly feeWallet;
|
|
61
|
+
private readonly getFundingUtxo;
|
|
62
|
+
private readonly getStasUtxoSet;
|
|
63
|
+
private readonly getTransactions;
|
|
64
|
+
private readonly buildLockingParams;
|
|
65
|
+
private readonly buildUnlockingScript;
|
|
66
|
+
constructor(stasWallet: Wallet, feeWallet: Wallet, getFundingUtxo: TDstasGetFundingUtxoFunction, getStasUtxoSet: TDstasGetUtxoFunction, getTransactions: TDstasGetTransactionsFunction, buildLockingParams: TDstasLockingParamsBuilder, buildUnlockingScript: TDstasUnlockingScriptBuilder);
|
|
67
|
+
transfer: ({ outputs, spendType, note, }: TDstasTransferRequest) => Promise<TDstasPayoutBundle>;
|
|
68
|
+
createTransferBundle: (amountSatoshis: number, recipient: TDstasRecipient, note?: Bytes[]) => Promise<TDstasPayoutBundle>;
|
|
69
|
+
createFreezeBundle: (amountSatoshis: number, recipient: TDstasRecipient, note?: Bytes[]) => Promise<TDstasPayoutBundle>;
|
|
70
|
+
createUnfreezeBundle: (amountSatoshis: number, recipient: TDstasRecipient, note?: Bytes[]) => Promise<TDstasPayoutBundle>;
|
|
71
|
+
createSwapBundle: (amountSatoshis: number, recipient: TDstasRecipient, note?: Bytes[]) => Promise<TDstasPayoutBundle>;
|
|
72
|
+
createBundle: (amountSatoshis: number, recipient: TDstasRecipient, spendType: DstasSpendType, note?: Bytes[]) => Promise<TDstasPayoutBundle>;
|
|
73
|
+
private buildBundleWithResolvedFunding;
|
|
74
|
+
private estimateTransactionsCount;
|
|
75
|
+
private estimateMergeTransactionsCount;
|
|
76
|
+
private estimateFinalTransferTransactionsCount;
|
|
77
|
+
private estimateBundleFeeUpperBound;
|
|
78
|
+
private isInsufficientFeeError;
|
|
79
|
+
private _createTransferBundle;
|
|
80
|
+
private buildTransferPlanTransactions;
|
|
81
|
+
private getStasUtxo;
|
|
82
|
+
private mergeStasTransactions;
|
|
83
|
+
private buildStas30Tx;
|
|
84
|
+
private buildDestinations;
|
|
85
|
+
private validateStasAmounts;
|
|
86
|
+
private buildDstasLockingScriptBuilder;
|
|
87
|
+
private outPointFromTransaction;
|
|
88
|
+
private getStasOutPoint;
|
|
89
|
+
private getFeeOutPoint;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=dstas-bundle-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dstas-bundle-factory.d.ts","sourceRoot":"","sources":["../src/dstas-bundle-factory.ts"],"names":[],"mappings":"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"}
|