@chainvue/verus-sdk 0.10.0 → 0.11.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 +5 -0
- package/dist/VerusSDK.d.ts +28 -0
- package/dist/VerusSDK.d.ts.map +1 -1
- package/dist/VerusSDK.js +47 -0
- package/dist/VerusSDK.js.map +1 -1
- package/dist/bundle.js +552 -43
- package/dist/fork/boundary.d.ts +1 -1
- package/dist/fork/boundary.d.ts.map +1 -1
- package/dist/fork/boundary.js +6 -1
- package/dist/fork/boundary.js.map +1 -1
- package/dist/identity/index.d.ts +10 -0
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +31 -0
- package/dist/identity/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/offers/identity.d.ts +193 -0
- package/dist/offers/identity.d.ts.map +1 -0
- package/dist/offers/identity.js +314 -0
- package/dist/offers/identity.js.map +1 -0
- package/dist/offers/maker.d.ts +67 -0
- package/dist/offers/maker.d.ts.map +1 -0
- package/dist/offers/maker.js +132 -0
- package/dist/offers/maker.js.map +1 -0
- package/dist/offers/public.d.ts +30 -0
- package/dist/offers/public.d.ts.map +1 -0
- package/dist/offers/public.js +42 -0
- package/dist/offers/public.js.map +1 -0
- package/dist/offers/sign.d.ts +42 -0
- package/dist/offers/sign.d.ts.map +1 -0
- package/dist/offers/sign.js +98 -0
- package/dist/offers/sign.js.map +1 -0
- package/dist/offers/taker.d.ts +33 -0
- package/dist/offers/taker.d.ts.map +1 -0
- package/dist/offers/taker.js +113 -0
- package/dist/offers/taker.js.map +1 -0
- package/dist/utxo/index.d.ts +7 -0
- package/dist/utxo/index.d.ts.map +1 -1
- package/dist/utxo/index.js +1 -0
- package/dist/utxo/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Network } from '../constants/index.js';
|
|
2
|
+
/** The sighash every offer input is signed with: single output, others open. */
|
|
3
|
+
export declare const SIGHASH_OFFER: number;
|
|
4
|
+
/**
|
|
5
|
+
* Sign one input of an offer transaction with SIGHASH_SINGLE|ANYONECANPAY and
|
|
6
|
+
* install the CryptoCondition fulfillment, leaving the rest of the tx open for a
|
|
7
|
+
* taker to complete.
|
|
8
|
+
*
|
|
9
|
+
* @param unsignedHex the offer tx (input spending the offered CC output, plus
|
|
10
|
+
* the single wanted output at the same index) with an empty
|
|
11
|
+
* scriptSig on `inputIndex`
|
|
12
|
+
* @param prevOutScript the funding output's scriptPubKey (the CC holding the offered asset)
|
|
13
|
+
* @param prevOutValue the funding output's native satoshis (for the sighash)
|
|
14
|
+
*/
|
|
15
|
+
export declare function signOfferInput(unsignedHex: string, inputIndex: number, prevOutScript: Buffer, prevOutValue: bigint, wif: string, network: Network): {
|
|
16
|
+
signedTx: string;
|
|
17
|
+
txid: string;
|
|
18
|
+
};
|
|
19
|
+
/** One input the taker contributes to an offer completion. */
|
|
20
|
+
export interface TakerInput {
|
|
21
|
+
index: number;
|
|
22
|
+
/** The scriptPubKey of the UTXO being spent (P2PKH or a CC reserve output). */
|
|
23
|
+
prevOutScript: Buffer;
|
|
24
|
+
value: bigint;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Sign the taker's inputs of an offer completion with SIGHASH_ALL, leaving the
|
|
28
|
+
* maker's SIGHASH_SINGLE|ANYONECANPAY input untouched.
|
|
29
|
+
*
|
|
30
|
+
* Each input is signed manually and its scriptSig set directly: the fork's
|
|
31
|
+
* `TransactionBuilder.build()` rebuilds ALL inputs and cannot preserve a
|
|
32
|
+
* pre-signed CryptoCondition input (it throws "Not enough signatures provided"),
|
|
33
|
+
* so the taker side is assembled at the transaction level. Both plain (P2PKH) and
|
|
34
|
+
* CC (reserve) taker inputs are handled. Because the taker signs the whole
|
|
35
|
+
* transaction (ALL), the maker's already-committed input + output stay valid —
|
|
36
|
+
* SINGLE|ANYONECANPAY does not commit to the inputs and outputs the taker added.
|
|
37
|
+
*/
|
|
38
|
+
export declare function signTakerInputs(txHex: string, takerInputs: TakerInput[], wif: string, network: Network): {
|
|
39
|
+
signedTx: string;
|
|
40
|
+
txid: string;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/offers/sign.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,gFAAgF;AAChF,eAAO,MAAM,aAAa,QAAwC,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,GACf;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA6BpC;AAED,8DAA8D;AAC9D,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,UAAU,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,GACf;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4BpC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SIGHASH_OFFER = void 0;
|
|
4
|
+
exports.signOfferInput = signOfferInput;
|
|
5
|
+
exports.signTakerInputs = signTakerInputs;
|
|
6
|
+
/**
|
|
7
|
+
* Signing an offer input.
|
|
8
|
+
*
|
|
9
|
+
* A Verus marketplace offer is one half of an atomic swap: the maker spends the
|
|
10
|
+
* output holding the OFFERED asset and, in the same input, commits with
|
|
11
|
+
* SIGHASH_SINGLE | SIGHASH_ANYONECANPAY (0x83) to exactly one output — the WANTED
|
|
12
|
+
* asset paid to the maker. That sighash lets a taker later ADD their own inputs
|
|
13
|
+
* (the wanted asset) and outputs (receiving the offered asset) and sign their
|
|
14
|
+
* side, without invalidating the maker's signature. The two halves merge into one
|
|
15
|
+
* atomic transaction.
|
|
16
|
+
*
|
|
17
|
+
* The offered asset sits in a CryptoCondition output, so the fulfillment is a
|
|
18
|
+
* smart-transaction signature. The fork's `TransactionBuilder.sign` can sign a CC
|
|
19
|
+
* input but HARDCODES the fulfillment's embedded hashType to SIGHASH_ALL, so it
|
|
20
|
+
* can't emit an offer fulfillment. We build the fulfillment explicitly from the
|
|
21
|
+
* fork's exported primitives instead — byte-identical to the daemon's `makeoffer`
|
|
22
|
+
* (verified: `SmartTransactionSignatures(1, 0x83, …).toChunk()` → `018301…`).
|
|
23
|
+
*/
|
|
24
|
+
const boundary_js_1 = require("../fork/boundary.js");
|
|
25
|
+
const index_js_1 = require("../signing/index.js");
|
|
26
|
+
const index_js_2 = require("../utils/index.js");
|
|
27
|
+
const index_js_3 = require("../utxo/index.js");
|
|
28
|
+
const errors_js_1 = require("../errors.js");
|
|
29
|
+
const SIGHASH_SINGLE = 0x03;
|
|
30
|
+
const SIGHASH_ANYONECANPAY = 0x80;
|
|
31
|
+
/** The sighash every offer input is signed with: single output, others open. */
|
|
32
|
+
exports.SIGHASH_OFFER = SIGHASH_SINGLE | SIGHASH_ANYONECANPAY; // 0x83
|
|
33
|
+
/**
|
|
34
|
+
* Sign one input of an offer transaction with SIGHASH_SINGLE|ANYONECANPAY and
|
|
35
|
+
* install the CryptoCondition fulfillment, leaving the rest of the tx open for a
|
|
36
|
+
* taker to complete.
|
|
37
|
+
*
|
|
38
|
+
* @param unsignedHex the offer tx (input spending the offered CC output, plus
|
|
39
|
+
* the single wanted output at the same index) with an empty
|
|
40
|
+
* scriptSig on `inputIndex`
|
|
41
|
+
* @param prevOutScript the funding output's scriptPubKey (the CC holding the offered asset)
|
|
42
|
+
* @param prevOutValue the funding output's native satoshis (for the sighash)
|
|
43
|
+
*/
|
|
44
|
+
function signOfferInput(unsignedHex, inputIndex, prevOutScript, prevOutValue, wif, network) {
|
|
45
|
+
const verusNetwork = (0, index_js_1.getNetwork)(network === 'testnet');
|
|
46
|
+
const tx = boundary_js_1.Transaction.fromHex(unsignedHex, verusNetwork);
|
|
47
|
+
const input = tx.ins[inputIndex];
|
|
48
|
+
if (!input) {
|
|
49
|
+
throw new errors_js_1.TransactionBuildError(`signOfferInput: no input at index ${inputIndex}`);
|
|
50
|
+
}
|
|
51
|
+
const keyPair = boundary_js_1.ECPair.fromWIF(wif, verusNetwork);
|
|
52
|
+
// isWitness = false: Verus CC inputs are not segwit.
|
|
53
|
+
const sighash = tx.hashForSignatureByNetwork(inputIndex, prevOutScript, (0, index_js_2.toSafeNumber)(prevOutValue), exports.SIGHASH_OFFER, false);
|
|
54
|
+
const signature = keyPair.sign(sighash);
|
|
55
|
+
// The compact signature is [recovery-byte, r(32), s(32)]; the CC fulfillment
|
|
56
|
+
// carries the 64-byte r||s (the recovery byte is dropped).
|
|
57
|
+
const fulfillment = new boundary_js_1.SmartTransactionSignatures(1, exports.SIGHASH_OFFER, [
|
|
58
|
+
new boundary_js_1.SmartTransactionSignature(1, 1, keyPair.getPublicKeyBuffer(), signature.toCompact().slice(1)),
|
|
59
|
+
]).toChunk();
|
|
60
|
+
// The scriptSig pushes the fulfillment as one data element (OP_PUSHDATA1 …),
|
|
61
|
+
// matching the daemon's `4c67 0183…` — toChunk() is the raw bytes, not the push.
|
|
62
|
+
input.script = boundary_js_1.script.compile([fulfillment]);
|
|
63
|
+
return { signedTx: tx.toHex(), txid: tx.getId() };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sign the taker's inputs of an offer completion with SIGHASH_ALL, leaving the
|
|
67
|
+
* maker's SIGHASH_SINGLE|ANYONECANPAY input untouched.
|
|
68
|
+
*
|
|
69
|
+
* Each input is signed manually and its scriptSig set directly: the fork's
|
|
70
|
+
* `TransactionBuilder.build()` rebuilds ALL inputs and cannot preserve a
|
|
71
|
+
* pre-signed CryptoCondition input (it throws "Not enough signatures provided"),
|
|
72
|
+
* so the taker side is assembled at the transaction level. Both plain (P2PKH) and
|
|
73
|
+
* CC (reserve) taker inputs are handled. Because the taker signs the whole
|
|
74
|
+
* transaction (ALL), the maker's already-committed input + output stay valid —
|
|
75
|
+
* SINGLE|ANYONECANPAY does not commit to the inputs and outputs the taker added.
|
|
76
|
+
*/
|
|
77
|
+
function signTakerInputs(txHex, takerInputs, wif, network) {
|
|
78
|
+
const verusNetwork = (0, index_js_1.getNetwork)(network === 'testnet');
|
|
79
|
+
const tx = boundary_js_1.Transaction.fromHex(txHex, verusNetwork);
|
|
80
|
+
const keyPair = boundary_js_1.ECPair.fromWIF(wif, verusNetwork);
|
|
81
|
+
for (const { index, prevOutScript, value } of takerInputs) {
|
|
82
|
+
const input = tx.ins[index];
|
|
83
|
+
if (!input) {
|
|
84
|
+
throw new errors_js_1.TransactionBuildError(`signTakerInputs: no input at index ${index}`);
|
|
85
|
+
}
|
|
86
|
+
const sighash = tx.hashForSignatureByNetwork(index, prevOutScript, (0, index_js_2.toSafeNumber)(value), boundary_js_1.Transaction.SIGHASH_ALL, false);
|
|
87
|
+
const signature = keyPair.sign(sighash);
|
|
88
|
+
input.script = (0, index_js_3.isSmartTransactionScript)(prevOutScript)
|
|
89
|
+
? boundary_js_1.script.compile([
|
|
90
|
+
new boundary_js_1.SmartTransactionSignatures(1, boundary_js_1.Transaction.SIGHASH_ALL, [
|
|
91
|
+
new boundary_js_1.SmartTransactionSignature(1, 1, keyPair.getPublicKeyBuffer(), signature.toCompact().slice(1)),
|
|
92
|
+
]).toChunk(),
|
|
93
|
+
])
|
|
94
|
+
: boundary_js_1.script.compile([signature.toScriptSignature(boundary_js_1.Transaction.SIGHASH_ALL), keyPair.getPublicKeyBuffer()]);
|
|
95
|
+
}
|
|
96
|
+
return { signedTx: tx.toHex(), txid: tx.getId() };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/offers/sign.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Network } from '../constants/index.js';
|
|
2
|
+
import type { Utxo } from '../types/index.js';
|
|
3
|
+
export interface CompleteOfferParams {
|
|
4
|
+
/** The maker's half-signed offer transaction (from buildOffer). */
|
|
5
|
+
offerTx: string;
|
|
6
|
+
/** What the maker offers (the value in the commitment input 0), native or token. */
|
|
7
|
+
offered: {
|
|
8
|
+
currency: string;
|
|
9
|
+
amount: bigint;
|
|
10
|
+
};
|
|
11
|
+
/** What the taker must pay (the maker's wanted output 0), native or token. */
|
|
12
|
+
want: {
|
|
13
|
+
currency: string;
|
|
14
|
+
amount: bigint;
|
|
15
|
+
};
|
|
16
|
+
/** The taker's UTXOs — must hold the wanted currency + native for the fee. */
|
|
17
|
+
takerUtxos: Utxo[];
|
|
18
|
+
/** Where the taker receives the offered asset. */
|
|
19
|
+
takerAddress: string;
|
|
20
|
+
changeAddress: string;
|
|
21
|
+
wif: string;
|
|
22
|
+
}
|
|
23
|
+
export interface CompleteOfferResult {
|
|
24
|
+
swapTx: string;
|
|
25
|
+
txid: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Complete an offer: take the maker's half-signed offer, pay the wanted asset,
|
|
29
|
+
* receive the offered asset, and sign the taker's side. The offered and wanted
|
|
30
|
+
* assets may each be the native coin or a token (all four combinations).
|
|
31
|
+
*/
|
|
32
|
+
export declare function completeOffer(params: CompleteOfferParams, network: Network): CompleteOfferResult;
|
|
33
|
+
//# sourceMappingURL=taker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taker.d.ts","sourceRoot":"","sources":["../../src/offers/taker.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,8EAA8E;IAC9E,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,8EAA8E;IAC9E,UAAU,EAAE,IAAI,EAAE,CAAC;IACnB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AASD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,mBAAmB,CA4FhG"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.completeOffer = completeOffer;
|
|
4
|
+
/**
|
|
5
|
+
* Completing (taking) a marketplace offer, offline.
|
|
6
|
+
*
|
|
7
|
+
* The taker receives the maker's half-signed offer (`buildOffer` output): input 0
|
|
8
|
+
* spends the offered asset's commitment and output 0 is the WANTED asset paid to
|
|
9
|
+
* the maker, both committed under the maker's SIGHASH_SINGLE|ANYONECANPAY. The
|
|
10
|
+
* taker adds their side and signs it, and the two halves become one atomic swap:
|
|
11
|
+
*
|
|
12
|
+
* - keep the maker's input 0 and output 0 untouched (index 0);
|
|
13
|
+
* - append output 1: the OFFERED asset paid to the taker;
|
|
14
|
+
* - append the taker's inputs (the wanted currency to pay output 0, plus native
|
|
15
|
+
* for the miner fee) and output 2: the taker's change;
|
|
16
|
+
* - sign only the taker's inputs (SIGHASH_ALL) — the maker's 0x83 stays valid.
|
|
17
|
+
*
|
|
18
|
+
* The taker tx does NOT byte-match the daemon (each wallet selects its own UTXOs);
|
|
19
|
+
* correctness is enforced by value conservation and proven by the live round-trip.
|
|
20
|
+
*
|
|
21
|
+
* This covers all four currency combinations: the offered and wanted assets may
|
|
22
|
+
* each be the native coin or a token. The offered asset flows self-contained from
|
|
23
|
+
* input 0 (the commitment) to output 1 (the taker); the taker's own UTXOs fund
|
|
24
|
+
* only the wanted asset (paid to output 0) plus the miner fee.
|
|
25
|
+
*/
|
|
26
|
+
const boundary_js_1 = require("../fork/boundary.js");
|
|
27
|
+
const index_js_1 = require("../utxo/index.js");
|
|
28
|
+
const index_js_2 = require("../signing/index.js");
|
|
29
|
+
const index_js_3 = require("../identity/index.js");
|
|
30
|
+
const sign_js_1 = require("./sign.js");
|
|
31
|
+
const index_js_4 = require("../utils/index.js");
|
|
32
|
+
const brands_js_1 = require("../core/brands.js");
|
|
33
|
+
const index_js_5 = require("../constants/index.js");
|
|
34
|
+
const errors_js_1 = require("../errors.js");
|
|
35
|
+
/** A native payment script to an R-address (P2PKH) or i-address (pay-to-identity). */
|
|
36
|
+
function nativePaymentScript(address) {
|
|
37
|
+
return address.startsWith('i')
|
|
38
|
+
? (0, index_js_3.identityPaymentScript)((0, brands_js_1.parseIAddress)(address, 'address'))
|
|
39
|
+
: (0, index_js_4.addressToScriptPubKey)(address);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Complete an offer: take the maker's half-signed offer, pay the wanted asset,
|
|
43
|
+
* receive the offered asset, and sign the taker's side. The offered and wanted
|
|
44
|
+
* assets may each be the native coin or a token (all four combinations).
|
|
45
|
+
*/
|
|
46
|
+
function completeOffer(params, network) {
|
|
47
|
+
const verusNetwork = (0, index_js_2.getNetwork)(network === 'testnet');
|
|
48
|
+
const systemId = index_js_5.NETWORK_CONFIG[network].chainId;
|
|
49
|
+
const offeringNative = params.offered.currency === systemId;
|
|
50
|
+
const wantingNative = params.want.currency === systemId;
|
|
51
|
+
if (params.offered.amount <= 0n || params.want.amount <= 0n) {
|
|
52
|
+
throw new errors_js_1.TransactionBuildError('completeOffer: offered.amount and want.amount must be positive');
|
|
53
|
+
}
|
|
54
|
+
const tx = boundary_js_1.Transaction.fromHex(params.offerTx, verusNetwork);
|
|
55
|
+
if (tx.ins.length !== 1 || tx.outs.length !== 1) {
|
|
56
|
+
throw new errors_js_1.TransactionBuildError('completeOffer: expected a maker offer partial (1 input, 1 output)');
|
|
57
|
+
}
|
|
58
|
+
// The native value on the maker's commitment input (input 0): the offered
|
|
59
|
+
// amount if the offer is native, else 0 (a token commitment carries 0 native).
|
|
60
|
+
const commitmentNative = offeringNative ? params.offered.amount : 0n;
|
|
61
|
+
// Output 1: the OFFERED asset paid to the taker — a plain payment for the
|
|
62
|
+
// native coin, a reserve output (0 native) for a token. The offered asset
|
|
63
|
+
// flows from input 0 to here, self-contained.
|
|
64
|
+
if (offeringNative) {
|
|
65
|
+
tx.addOutput(nativePaymentScript(params.takerAddress), (0, index_js_4.toSafeNumber)(params.offered.amount));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const offeredOut = (0, index_js_3.buildTokenChangeOutput)((0, brands_js_1.parseAddress)(params.takerAddress, 'takerAddress'), new Map([[params.offered.currency, params.offered.amount]]));
|
|
69
|
+
tx.addOutput(offeredOut.script, 0);
|
|
70
|
+
}
|
|
71
|
+
// The taker's own UTXOs fund only the WANTED asset (paid to output 0) plus the
|
|
72
|
+
// miner fee. When the wanted asset is a token it is a required currency; when
|
|
73
|
+
// native it is required native on top of the fee. numOutputs=3 (wanted, offered,
|
|
74
|
+
// change); +150 bytes accounts for the maker's input, which selectUtxos can't see.
|
|
75
|
+
const wantedTokenReq = wantingNative
|
|
76
|
+
? new Map()
|
|
77
|
+
: new Map([[params.want.currency, params.want.amount]]);
|
|
78
|
+
const requiredNative = wantingNative ? params.want.amount : 0n;
|
|
79
|
+
const selection = (0, index_js_1.selectUtxos)(params.takerUtxos, requiredNative, wantedTokenReq, 3, systemId, undefined, true, 150);
|
|
80
|
+
const takerInputs = [];
|
|
81
|
+
for (const u of selection.selected) {
|
|
82
|
+
const idx = tx.addInput(Buffer.from(u.txid, 'hex').reverse(), u.outputIndex, 0xffffffff);
|
|
83
|
+
takerInputs.push({ index: idx, prevOutScript: Buffer.from(u.script, 'hex'), value: u.satoshis });
|
|
84
|
+
}
|
|
85
|
+
// Output 2: taker change — the wanted-currency change (with native change
|
|
86
|
+
// bundled onto the reserve output), or plain native change if no token remains.
|
|
87
|
+
const hasTokenChange = selection.currencyChanges.size > 0;
|
|
88
|
+
if (hasTokenChange || selection.nativeChange > 0n) {
|
|
89
|
+
if (hasTokenChange) {
|
|
90
|
+
const change = (0, index_js_3.buildTokenChangeOutput)((0, brands_js_1.parseAddress)(params.changeAddress, 'changeAddress'), selection.currencyChanges);
|
|
91
|
+
tx.addOutput(change.script, (0, index_js_4.toSafeNumber)(selection.nativeChange));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
tx.addOutput(nativePaymentScript(params.changeAddress), (0, index_js_4.toSafeNumber)(selection.nativeChange));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Token conservation over the taker's own inputs: they provide the wanted token
|
|
98
|
+
// (paid to output 0) plus change. The offered token (input 0 → output 1) does
|
|
99
|
+
// not pass through taker inputs, so it is not asserted here — it is balanced by
|
|
100
|
+
// construction (the commitment carries exactly `offered.amount`).
|
|
101
|
+
(0, index_js_1.assertTokenConservation)(selection.selected, wantedTokenReq, selection.currencyChanges, systemId, 'takeOffer');
|
|
102
|
+
// Native conservation across the whole swap. allNativeIn = the commitment's
|
|
103
|
+
// native (funds the offered-native output when offering native, else 0) + the
|
|
104
|
+
// taker's native inputs (fund the wanted-native output when wanting native, the
|
|
105
|
+
// fee, and native change). This identity reduces to exactly `fee` in every
|
|
106
|
+
// combination.
|
|
107
|
+
const takerNativeIn = selection.selected.reduce((s, u) => s + u.satoshis, 0n);
|
|
108
|
+
const allInputsNative = commitmentNative + takerNativeIn;
|
|
109
|
+
(0, index_js_2.assertNativeConservation)([{ satoshis: allInputsNative }], tx.outs, selection.fee, 'takeOffer');
|
|
110
|
+
const { signedTx, txid } = (0, sign_js_1.signTakerInputs)(tx.toHex(), takerInputs, params.wif, network);
|
|
111
|
+
return { swapTx: signedTx, txid };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=taker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taker.js","sourceRoot":"","sources":["../../src/offers/taker.ts"],"names":[],"mappings":"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"}
|
package/dist/utxo/index.d.ts
CHANGED
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { Utxo, DecodedUtxo, SelectionResult } from '../types/index.js';
|
|
10
10
|
export type { Utxo, DecodedUtxo, SelectionResult };
|
|
11
|
+
/**
|
|
12
|
+
* True when the script is a Verus smart (CryptoCondition) output. Used to
|
|
13
|
+
* separate "plain script that unpackOutput doesn't model" (fine — native
|
|
14
|
+
* only) from "smart output that failed to decode" (dangerous — the UTXO may
|
|
15
|
+
* carry token value we cannot see).
|
|
16
|
+
*/
|
|
17
|
+
export declare function isSmartTransactionScript(script: Buffer): boolean;
|
|
11
18
|
/**
|
|
12
19
|
* Decode a UTXO's script to extract currency values
|
|
13
20
|
*
|
package/dist/utxo/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utxo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAK5E,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utxo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAK5E,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AAWnD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUhE;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CA2BpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,EAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAwBN;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAA2B,EACrC,eAAe,GAAE,OAAe,EAChC,UAAU,GAAE,MAAU,GACrB,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,IAAI,EAAE,EACb,cAAc,EAAE,MAAM,EACtB,kBAAkB,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa,EACnD,UAAU,GAAE,MAAU,EACtB,QAAQ,GAAE,MAAuC,EACjD,QAAQ,GAAE,MAA2B,EACrC,eAAe,GAAE,OAAe,EAChC,gBAAgB,GAAE,MAAU,GAC3B,eAAe,CAkKjB"}
|
package/dist/utxo/index.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* All amounts are bigint satoshis — exact integer arithmetic only.
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.isSmartTransactionScript = isSmartTransactionScript;
|
|
11
12
|
exports.decodeUtxo = decodeUtxo;
|
|
12
13
|
exports.assertTokenConservation = assertTokenConservation;
|
|
13
14
|
exports.estimateFee = estimateFee;
|
package/dist/utxo/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utxo/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utxo/index.ts"],"names":[],"mappings":"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"}
|