@lendasat/lendaswap-sdk-pure 0.2.42 → 0.2.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_esm-7KJOBTZC.js +3660 -0
- package/dist/_esm-7KJOBTZC.js.map +1 -0
- package/dist/_esm-UGRDSVEV.cjs +3662 -0
- package/dist/_esm-UGRDSVEV.cjs.map +1 -0
- package/dist/api/client.d.ts +0 -4
- package/dist/api/client.d.ts.map +1 -1
- package/dist/base-2KYNAFR3.cjs +109 -0
- package/dist/base-2KYNAFR3.cjs.map +1 -0
- package/dist/base-B6OGU65B.js +7 -0
- package/dist/base-B6OGU65B.js.map +1 -0
- package/dist/ccip-MPMAZOUF.js +5 -0
- package/dist/ccip-MPMAZOUF.js.map +1 -0
- package/dist/ccip-PD37NJHA.cjs +26 -0
- package/dist/ccip-PD37NJHA.cjs.map +1 -0
- package/dist/cctp-bridge/index.cjs +67 -0
- package/dist/cctp-bridge/index.cjs.map +1 -0
- package/dist/cctp-bridge/index.js +51 -15
- package/dist/cctp-bridge/index.js.map +1 -1
- package/dist/cctp-inbound/client.d.ts +21 -19
- package/dist/cctp-inbound/client.d.ts.map +1 -1
- package/dist/cctp-inbound/smartAccount.d.ts +21 -19
- package/dist/cctp-inbound/smartAccount.d.ts.map +1 -1
- package/dist/chunk-3JWT4OW2.js +369 -0
- package/dist/chunk-3JWT4OW2.js.map +1 -0
- package/dist/chunk-A4GKKURK.cjs +430 -0
- package/dist/chunk-A4GKKURK.cjs.map +1 -0
- package/dist/chunk-BZU3R5DJ.cjs +554 -0
- package/dist/chunk-BZU3R5DJ.cjs.map +1 -0
- package/dist/chunk-C4YXYD24.js +418 -0
- package/dist/chunk-C4YXYD24.js.map +1 -0
- package/dist/chunk-CZNQYFDP.js +6141 -0
- package/dist/chunk-CZNQYFDP.js.map +1 -0
- package/dist/chunk-DKTFDGIU.js +2207 -0
- package/dist/chunk-DKTFDGIU.js.map +1 -0
- package/dist/chunk-DNSJDKTP.cjs +96 -0
- package/dist/chunk-DNSJDKTP.cjs.map +1 -0
- package/dist/chunk-EPKFLKTM.js +47093 -0
- package/dist/chunk-EPKFLKTM.js.map +1 -0
- package/dist/chunk-JBVKWKD4.cjs +50 -0
- package/dist/chunk-JBVKWKD4.cjs.map +1 -0
- package/dist/chunk-NPFJAXKV.js +551 -0
- package/dist/chunk-NPFJAXKV.js.map +1 -0
- package/dist/chunk-PKDJZJMV.cjs +2214 -0
- package/dist/chunk-PKDJZJMV.cjs.map +1 -0
- package/dist/chunk-PLDDJCW6.js +43 -0
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/chunk-RIOT5VOJ.cjs +47240 -0
- package/dist/chunk-RIOT5VOJ.cjs.map +1 -0
- package/dist/chunk-WVZSHRV7.cjs +431 -0
- package/dist/chunk-WVZSHRV7.cjs.map +1 -0
- package/dist/chunk-YEZOPVAH.js +86 -0
- package/dist/chunk-YEZOPVAH.js.map +1 -0
- package/dist/chunk-YLWPBHMV.cjs +6311 -0
- package/dist/chunk-YLWPBHMV.cjs.map +1 -0
- package/dist/client.d.ts +68 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/compose-quote.d.ts +77 -0
- package/dist/compose-quote.d.ts.map +1 -0
- package/dist/delegate.cjs +23 -0
- package/dist/delegate.cjs.map +1 -0
- package/dist/delegate.js +5 -269
- package/dist/delegate.js.map +1 -1
- package/dist/dist-NE2R4YCX.js +5 -0
- package/dist/dist-NE2R4YCX.js.map +1 -0
- package/dist/dist-VEHYC67F.cjs +550 -0
- package/dist/dist-VEHYC67F.cjs.map +1 -0
- package/dist/esplora.d.ts +14 -0
- package/dist/esplora.d.ts.map +1 -1
- package/dist/generated/api.d.ts +235 -38
- package/dist/generated/api.d.ts.map +1 -1
- package/dist/index.cjs +35461 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35309 -32
- package/dist/index.js.map +1 -1
- package/dist/mine.wasm-JJEJEODX.js +9 -0
- package/dist/mine.wasm-JJEJEODX.js.map +1 -0
- package/dist/mine.wasm-Z3ORSBKN.cjs +12 -0
- package/dist/mine.wasm-Z3ORSBKN.cjs.map +1 -0
- package/dist/node.cjs +166 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.js +157 -18
- package/dist/node.js.map +1 -1
- package/dist/secp256k1-PJCSE4N6.cjs +30 -0
- package/dist/secp256k1-PJCSE4N6.cjs.map +1 -0
- package/dist/secp256k1-VZNNVEPN.js +5 -0
- package/dist/secp256k1-VZNNVEPN.js.map +1 -0
- package/dist/tokens.d.ts +2 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/types/chain-config.d.ts +50 -0
- package/dist/types/chain-config.d.ts.map +1 -0
- package/dist/types/chain.d.ts +11 -0
- package/dist/types/chain.d.ts.map +1 -0
- package/dist/types/dex-quote.d.ts +85 -0
- package/dist/types/dex-quote.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/network-fees.d.ts +43 -0
- package/dist/types/network-fees.d.ts.map +1 -0
- package/dist/types/quote.d.ts +87 -0
- package/dist/types/quote.d.ts.map +1 -0
- package/dist/types/swap-pairs.d.ts +37 -0
- package/dist/types/swap-pairs.d.ts.map +1 -0
- package/dist/version.d.ts +2 -2
- package/dist/wallet-SCGRX3EN.js +4 -0
- package/dist/wallet-SCGRX3EN.js.map +1 -0
- package/dist/wallet-SZJDXAY7.cjs +45 -0
- package/dist/wallet-SZJDXAY7.cjs.map +1 -0
- package/package.json +23 -10
- package/dist/api/client.js +0 -13
- package/dist/api/client.js.map +0 -1
- package/dist/arkade-network.js +0 -40
- package/dist/arkade-network.js.map +0 -1
- package/dist/arkade.js +0 -61
- package/dist/arkade.js.map +0 -1
- package/dist/cctp/attestation.js +0 -149
- package/dist/cctp/attestation.js.map +0 -1
- package/dist/cctp/constants.js +0 -92
- package/dist/cctp/constants.js.map +0 -1
- package/dist/cctp/fee.js +0 -70
- package/dist/cctp/fee.js.map +0 -1
- package/dist/cctp/index.js +0 -13
- package/dist/cctp/index.js.map +0 -1
- package/dist/cctp/types.js +0 -5
- package/dist/cctp/types.js.map +0 -1
- package/dist/cctp/utils.js +0 -91
- package/dist/cctp/utils.js.map +0 -1
- package/dist/cctp-bridge/bridge.js +0 -74
- package/dist/cctp-bridge/bridge.js.map +0 -1
- package/dist/cctp-inbound/approveAndBurn.js +0 -95
- package/dist/cctp-inbound/approveAndBurn.js.map +0 -1
- package/dist/cctp-inbound/burn.js +0 -66
- package/dist/cctp-inbound/burn.js.map +0 -1
- package/dist/cctp-inbound/chainMap.js +0 -128
- package/dist/cctp-inbound/chainMap.js.map +0 -1
- package/dist/cctp-inbound/client.js +0 -125
- package/dist/cctp-inbound/client.js.map +0 -1
- package/dist/cctp-inbound/eip2612.js +0 -95
- package/dist/cctp-inbound/eip2612.js.map +0 -1
- package/dist/cctp-inbound/evmSignerAdapter.js +0 -82
- package/dist/cctp-inbound/evmSignerAdapter.js.map +0 -1
- package/dist/cctp-inbound/fundSwap.js +0 -95
- package/dist/cctp-inbound/fundSwap.js.map +0 -1
- package/dist/cctp-inbound/index.js +0 -34
- package/dist/cctp-inbound/index.js.map +0 -1
- package/dist/cctp-inbound/permit2.js +0 -32
- package/dist/cctp-inbound/permit2.js.map +0 -1
- package/dist/cctp-inbound/preflight.js +0 -84
- package/dist/cctp-inbound/preflight.js.map +0 -1
- package/dist/cctp-inbound/recover.js +0 -177
- package/dist/cctp-inbound/recover.js.map +0 -1
- package/dist/cctp-inbound/smartAccount.js +0 -117
- package/dist/cctp-inbound/smartAccount.js.map +0 -1
- package/dist/cctp-inbound/submit.js +0 -136
- package/dist/cctp-inbound/submit.js.map +0 -1
- package/dist/cctp-inbound/types.js +0 -5
- package/dist/cctp-inbound/types.js.map +0 -1
- package/dist/cctp-inbound/userOp.js +0 -151
- package/dist/cctp-inbound/userOp.js.map +0 -1
- package/dist/client.js +0 -4126
- package/dist/client.js.map +0 -1
- package/dist/create/arkade-to-lightning.js +0 -76
- package/dist/create/arkade-to-lightning.js.map +0 -1
- package/dist/create/arkade.js +0 -86
- package/dist/create/arkade.js.map +0 -1
- package/dist/create/bitcoin-to-arkade.js +0 -76
- package/dist/create/bitcoin-to-arkade.js.map +0 -1
- package/dist/create/bitcoin.js +0 -77
- package/dist/create/bitcoin.js.map +0 -1
- package/dist/create/evm-to-arkade.js +0 -80
- package/dist/create/evm-to-arkade.js.map +0 -1
- package/dist/create/evm-to-bitcoin.js +0 -82
- package/dist/create/evm-to-bitcoin.js.map +0 -1
- package/dist/create/evm-to-lightning.js +0 -89
- package/dist/create/evm-to-lightning.js.map +0 -1
- package/dist/create/index.js +0 -21
- package/dist/create/index.js.map +0 -1
- package/dist/create/lightning-to-arkade.js +0 -69
- package/dist/create/lightning-to-arkade.js.map +0 -1
- package/dist/create/lightning.js +0 -61
- package/dist/create/lightning.js.map +0 -1
- package/dist/create/retry.js +0 -71
- package/dist/create/retry.js.map +0 -1
- package/dist/create/types.js +0 -5
- package/dist/create/types.js.map +0 -1
- package/dist/escrow/index.js +0 -115
- package/dist/escrow/index.js.map +0 -1
- package/dist/esplora.js +0 -47
- package/dist/esplora.js.map +0 -1
- package/dist/evm/coordinator.js +0 -714
- package/dist/evm/coordinator.js.map +0 -1
- package/dist/evm/htlc.js +0 -278
- package/dist/evm/htlc.js.map +0 -1
- package/dist/evm/index.js +0 -10
- package/dist/evm/index.js.map +0 -1
- package/dist/evm/signing.js +0 -70
- package/dist/evm/signing.js.map +0 -1
- package/dist/evm/wallet.js +0 -133
- package/dist/evm/wallet.js.map +0 -1
- package/dist/generated/api.js +0 -6
- package/dist/generated/api.js.map +0 -1
- package/dist/logging.js +0 -130
- package/dist/logging.js.map +0 -1
- package/dist/price-calculations.js +0 -135
- package/dist/price-calculations.js.map +0 -1
- package/dist/redeem/arkade.js +0 -416
- package/dist/redeem/arkade.js.map +0 -1
- package/dist/redeem/ethereum.js +0 -206
- package/dist/redeem/ethereum.js.map +0 -1
- package/dist/redeem/gasless.js +0 -73
- package/dist/redeem/gasless.js.map +0 -1
- package/dist/redeem/index.js +0 -189
- package/dist/redeem/index.js.map +0 -1
- package/dist/redeem/types.js +0 -36
- package/dist/redeem/types.js.map +0 -1
- package/dist/refund/arkade.js +0 -200
- package/dist/refund/arkade.js.map +0 -1
- package/dist/refund/collab-arkade-evm.js +0 -307
- package/dist/refund/collab-arkade-evm.js.map +0 -1
- package/dist/refund/collab-arkade-lightning.js +0 -245
- package/dist/refund/collab-arkade-lightning.js.map +0 -1
- package/dist/refund/index.js +0 -12
- package/dist/refund/index.js.map +0 -1
- package/dist/refund/onchain.js +0 -366
- package/dist/refund/onchain.js.map +0 -1
- package/dist/signer/index.js +0 -249
- package/dist/signer/index.js.map +0 -1
- package/dist/storage/idb.js +0 -236
- package/dist/storage/idb.js.map +0 -1
- package/dist/storage/index.js +0 -98
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/sqlite.js +0 -206
- package/dist/storage/sqlite.js.map +0 -1
- package/dist/storage/types.js +0 -9
- package/dist/storage/types.js.map +0 -1
- package/dist/tokens.js +0 -322
- package/dist/tokens.js.map +0 -1
- package/dist/usd-price.js +0 -96
- package/dist/usd-price.js.map +0 -1
- package/dist/usdt0-bridge/constants.js +0 -71
- package/dist/usdt0-bridge/constants.js.map +0 -1
- package/dist/usdt0-bridge/index.js +0 -11
- package/dist/usdt0-bridge/index.js.map +0 -1
- package/dist/usdt0-bridge/tracking.js +0 -123
- package/dist/usdt0-bridge/tracking.js.map +0 -1
- package/dist/usdt0-bridge/utils.js +0 -51
- package/dist/usdt0-bridge/utils.js.map +0 -1
- package/dist/version.js +0 -6
- package/dist/version.js.map +0 -1
- package/dist/ws.js +0 -145
- package/dist/ws.js.map +0 -1
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
import { init_btc_signer, init_legacy, init_sha2, networks, ripemd160, sha256, VHTLC, RestArkProvider, RestIndexerProvider, Address, OutScript, ArkAddress, SigHash, Intent, setArkPsbtField, VtxoTaprootTree, SingleKey, ConditionWitness, Transaction2 } from './chunk-EPKFLKTM.js';
|
|
2
|
+
import { init_base, hex, base64 } from './chunk-NPFJAXKV.js';
|
|
3
|
+
|
|
4
|
+
// src/delegate.ts
|
|
5
|
+
init_btc_signer();
|
|
6
|
+
init_legacy();
|
|
7
|
+
init_sha2();
|
|
8
|
+
init_base();
|
|
9
|
+
|
|
10
|
+
// src/arkade-network.ts
|
|
11
|
+
var DEFAULT_ARKADE_URLS = {
|
|
12
|
+
bitcoin: "https://arkade.computer",
|
|
13
|
+
mainnet: "https://arkade.computer",
|
|
14
|
+
signet: "https://mutinynet.arkade.sh",
|
|
15
|
+
mutinynet: "https://mutinynet.arkade.sh"
|
|
16
|
+
};
|
|
17
|
+
function getNetworkName(network) {
|
|
18
|
+
switch (network.toLowerCase()) {
|
|
19
|
+
case "mainnet":
|
|
20
|
+
case "bitcoin":
|
|
21
|
+
return "bitcoin";
|
|
22
|
+
case "testnet":
|
|
23
|
+
return "testnet";
|
|
24
|
+
case "signet":
|
|
25
|
+
return "signet";
|
|
26
|
+
case "mutinynet":
|
|
27
|
+
return "mutinynet";
|
|
28
|
+
case "regtest":
|
|
29
|
+
return "regtest";
|
|
30
|
+
default:
|
|
31
|
+
throw new Error(`Unknown network: ${network}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function getNetworkHrp(networkName) {
|
|
35
|
+
return networks[networkName].hrp;
|
|
36
|
+
}
|
|
37
|
+
function resolveArkadeServerUrl(network, arkadeServerUrl) {
|
|
38
|
+
const networkName = getNetworkName(network);
|
|
39
|
+
return resolveArkadeServerUrlByName(networkName, arkadeServerUrl);
|
|
40
|
+
}
|
|
41
|
+
function resolveArkadeServerUrlByName(networkName, arkadeServerUrl) {
|
|
42
|
+
const serverUrl = arkadeServerUrl ?? DEFAULT_ARKADE_URLS[networkName];
|
|
43
|
+
if (!serverUrl) {
|
|
44
|
+
throw new Error(
|
|
45
|
+
`No Arkade server URL configured for network: ${networkName}`
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return serverUrl;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// src/logging.ts
|
|
52
|
+
var LEVEL_VALUE = {
|
|
53
|
+
trace: 10,
|
|
54
|
+
debug: 20,
|
|
55
|
+
info: 30,
|
|
56
|
+
warn: 40,
|
|
57
|
+
error: 50
|
|
58
|
+
};
|
|
59
|
+
var SECRET_FIELD_PATTERN = new RegExp(
|
|
60
|
+
"(^|_|-|\\b)(secret|secretkey|usersecretkey|privatekey|mnemonic|xprv|preimage|signature|authorization|apikey|api_key|bearer)(_|-|\\b|$)",
|
|
61
|
+
"i"
|
|
62
|
+
);
|
|
63
|
+
var REDACTED = "[REDACTED]";
|
|
64
|
+
var noopLogger = Object.freeze({});
|
|
65
|
+
function shouldLog(level, configuredLevel) {
|
|
66
|
+
if (configuredLevel === "silent") return false;
|
|
67
|
+
return LEVEL_VALUE[level] >= LEVEL_VALUE[configuredLevel];
|
|
68
|
+
}
|
|
69
|
+
function serializeError(error) {
|
|
70
|
+
if (error instanceof Error) {
|
|
71
|
+
return {
|
|
72
|
+
name: error.name,
|
|
73
|
+
message: error.message,
|
|
74
|
+
stack: error.stack
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return error;
|
|
78
|
+
}
|
|
79
|
+
function redactLogValue(value) {
|
|
80
|
+
if (typeof value === "bigint") return value.toString();
|
|
81
|
+
if (value instanceof Error) return serializeError(value);
|
|
82
|
+
if (Array.isArray(value)) return value.map(redactLogValue);
|
|
83
|
+
if (value && typeof value === "object") {
|
|
84
|
+
const out = {};
|
|
85
|
+
for (const [key, nested] of Object.entries(
|
|
86
|
+
value
|
|
87
|
+
)) {
|
|
88
|
+
out[key] = SECRET_FIELD_PATTERN.test(key) ? REDACTED : redactLogValue(nested);
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
var SdkLogger = class _SdkLogger {
|
|
95
|
+
#logger;
|
|
96
|
+
#level;
|
|
97
|
+
#context;
|
|
98
|
+
constructor(options = {}, context = {}) {
|
|
99
|
+
this.#logger = options.logger ?? noopLogger;
|
|
100
|
+
this.#level = options.logLevel ?? "silent";
|
|
101
|
+
this.#context = context;
|
|
102
|
+
}
|
|
103
|
+
child(context) {
|
|
104
|
+
return new _SdkLogger(
|
|
105
|
+
{ logger: this.#logger, logLevel: this.#level },
|
|
106
|
+
{
|
|
107
|
+
...this.#context,
|
|
108
|
+
...context,
|
|
109
|
+
data: {
|
|
110
|
+
...this.#context.data,
|
|
111
|
+
...context.data
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
trace(record) {
|
|
117
|
+
this.#emit("trace", record);
|
|
118
|
+
}
|
|
119
|
+
debug(record) {
|
|
120
|
+
this.#emit("debug", record);
|
|
121
|
+
}
|
|
122
|
+
info(record) {
|
|
123
|
+
this.#emit("info", record);
|
|
124
|
+
}
|
|
125
|
+
warn(record) {
|
|
126
|
+
this.#emit("warn", record);
|
|
127
|
+
}
|
|
128
|
+
error(record) {
|
|
129
|
+
this.#emit("error", record);
|
|
130
|
+
}
|
|
131
|
+
#emit(level, record) {
|
|
132
|
+
if (!shouldLog(level, this.#level)) return;
|
|
133
|
+
const sink = this.#logger[level];
|
|
134
|
+
if (!sink) return;
|
|
135
|
+
const data = redactLogValue({
|
|
136
|
+
...this.#context.data,
|
|
137
|
+
...record.data
|
|
138
|
+
});
|
|
139
|
+
sink({
|
|
140
|
+
level,
|
|
141
|
+
module: record.module ?? this.#context.module,
|
|
142
|
+
operation: record.operation ?? this.#context.operation,
|
|
143
|
+
swapId: record.swapId ?? this.#context.swapId,
|
|
144
|
+
event: record.event,
|
|
145
|
+
message: record.message,
|
|
146
|
+
data: Object.keys(data).length > 0 ? data : void 0,
|
|
147
|
+
error: record.error === void 0 ? void 0 : redactLogValue(record.error)
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
function createSdkLogger(options) {
|
|
152
|
+
return new SdkLogger(options);
|
|
153
|
+
}
|
|
154
|
+
function createConsoleLogger() {
|
|
155
|
+
const write = (record) => {
|
|
156
|
+
const { level, message, ...rest } = record;
|
|
157
|
+
const payload = Object.fromEntries(
|
|
158
|
+
Object.entries(rest).filter(([, value]) => value !== void 0)
|
|
159
|
+
);
|
|
160
|
+
const args = Object.keys(payload).length > 0 ? [message, payload] : [message];
|
|
161
|
+
if (level === "trace") console.debug(...args);
|
|
162
|
+
else if (level === "debug") console.debug(...args);
|
|
163
|
+
else if (level === "info") console.info(...args);
|
|
164
|
+
else if (level === "warn") console.warn(...args);
|
|
165
|
+
else console.error(...args);
|
|
166
|
+
};
|
|
167
|
+
return {
|
|
168
|
+
trace: write,
|
|
169
|
+
debug: write,
|
|
170
|
+
info: write,
|
|
171
|
+
warn: write,
|
|
172
|
+
error: write
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/delegate.ts
|
|
177
|
+
var P2A_SCRIPT = new Uint8Array([81, 2, 78, 115]);
|
|
178
|
+
var P2A = { script: P2A_SCRIPT, amount: 0n };
|
|
179
|
+
function secondsToTimelock(seconds) {
|
|
180
|
+
return { type: "seconds", value: BigInt(seconds) };
|
|
181
|
+
}
|
|
182
|
+
function parseXOnlyPubKey(pubKeyHex) {
|
|
183
|
+
const bytes = hex.decode(pubKeyHex);
|
|
184
|
+
if (bytes.length === 33) return bytes.slice(1);
|
|
185
|
+
if (bytes.length === 32) return bytes;
|
|
186
|
+
throw new Error(`Invalid public key length: ${bytes.length}`);
|
|
187
|
+
}
|
|
188
|
+
async function fetchCosignerPk(lendaswapApiUrl) {
|
|
189
|
+
const url = `${lendaswapApiUrl.replace(/\/$/, "")}/api/delegate/cosigner-pk`;
|
|
190
|
+
const res = await fetch(url);
|
|
191
|
+
if (!res.ok) {
|
|
192
|
+
throw new Error(
|
|
193
|
+
`Failed to fetch cosigner pk: ${res.status} ${await res.text()}`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
const body = await res.json();
|
|
197
|
+
return body.cosigner_pk;
|
|
198
|
+
}
|
|
199
|
+
async function delegateClaim(params) {
|
|
200
|
+
const userPkBytes = parseXOnlyPubKey(params.userPubKey);
|
|
201
|
+
const lendaswapPkBytes = parseXOnlyPubKey(params.lendaswapPubKey);
|
|
202
|
+
const serverPkBytes = parseXOnlyPubKey(params.arkadeServerPubKey);
|
|
203
|
+
const preimageBytes = hex.decode(params.preimage);
|
|
204
|
+
const preimageHashBytes = ripemd160(sha256(preimageBytes));
|
|
205
|
+
if (hex.encode(preimageHashBytes) !== hex.encode(ripemd160(hex.decode(params.preimageHash)))) {
|
|
206
|
+
throw new Error("Preimage hash mismatch");
|
|
207
|
+
}
|
|
208
|
+
const networkName = getNetworkName(params.network);
|
|
209
|
+
const vhtlc = new VHTLC.Script({
|
|
210
|
+
sender: lendaswapPkBytes,
|
|
211
|
+
receiver: userPkBytes,
|
|
212
|
+
server: serverPkBytes,
|
|
213
|
+
preimageHash: preimageHashBytes,
|
|
214
|
+
refundLocktime: BigInt(params.refundLocktime),
|
|
215
|
+
unilateralClaimDelay: secondsToTimelock(params.unilateralClaimDelay),
|
|
216
|
+
unilateralRefundDelay: secondsToTimelock(params.unilateralRefundDelay),
|
|
217
|
+
unilateralRefundWithoutReceiverDelay: secondsToTimelock(
|
|
218
|
+
params.unilateralRefundWithoutReceiverDelay
|
|
219
|
+
)
|
|
220
|
+
});
|
|
221
|
+
const hrp = getNetworkHrp(networkName);
|
|
222
|
+
const computedAddr = vhtlc.address(hrp, serverPkBytes).encode();
|
|
223
|
+
if (computedAddr !== params.vhtlcAddress) {
|
|
224
|
+
throw new Error(
|
|
225
|
+
`VHTLC address mismatch: computed ${computedAddr}, expected ${params.vhtlcAddress}`
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
return settleDelegate({
|
|
229
|
+
userSecretKey: params.userSecretKey,
|
|
230
|
+
tapLeafScript: vhtlc.claim(),
|
|
231
|
+
tapTree: vhtlc.encode(),
|
|
232
|
+
vhtlcPkScript: hex.encode(vhtlc.pkScript),
|
|
233
|
+
witnessData: preimageBytes,
|
|
234
|
+
destinationAddress: params.destinationAddress,
|
|
235
|
+
networkName,
|
|
236
|
+
lendaswapApiUrl: params.lendaswapApiUrl,
|
|
237
|
+
arkadeServerUrl: params.arkadeServerUrl,
|
|
238
|
+
locktime: void 0,
|
|
239
|
+
swapId: params.swapId,
|
|
240
|
+
preimage: params.preimage,
|
|
241
|
+
logger: params.logger,
|
|
242
|
+
logLevel: params.logLevel
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
async function delegateRefund(params) {
|
|
246
|
+
const userPkBytes = parseXOnlyPubKey(params.userPubKey);
|
|
247
|
+
const lendaswapPkBytes = parseXOnlyPubKey(params.lendaswapPubKey);
|
|
248
|
+
const serverPkBytes = parseXOnlyPubKey(params.arkadeServerPubKey);
|
|
249
|
+
const hashLockBytes = hex.decode(params.hashLock);
|
|
250
|
+
const preimageHashBytes = hashLockBytes.length === 32 ? ripemd160(hashLockBytes) : hashLockBytes;
|
|
251
|
+
const networkName = getNetworkName(params.network);
|
|
252
|
+
const vhtlc = new VHTLC.Script({
|
|
253
|
+
sender: userPkBytes,
|
|
254
|
+
receiver: lendaswapPkBytes,
|
|
255
|
+
server: serverPkBytes,
|
|
256
|
+
preimageHash: preimageHashBytes,
|
|
257
|
+
refundLocktime: BigInt(params.refundLocktime),
|
|
258
|
+
unilateralClaimDelay: secondsToTimelock(params.unilateralClaimDelay),
|
|
259
|
+
unilateralRefundDelay: secondsToTimelock(params.unilateralRefundDelay),
|
|
260
|
+
unilateralRefundWithoutReceiverDelay: secondsToTimelock(
|
|
261
|
+
params.unilateralRefundWithoutReceiverDelay
|
|
262
|
+
)
|
|
263
|
+
});
|
|
264
|
+
const hrp = getNetworkHrp(networkName);
|
|
265
|
+
const computedAddr = vhtlc.address(hrp, serverPkBytes).encode();
|
|
266
|
+
if (computedAddr !== params.vhtlcAddress) {
|
|
267
|
+
throw new Error(
|
|
268
|
+
`VHTLC address mismatch: computed ${computedAddr}, expected ${params.vhtlcAddress}`
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
return settleDelegate({
|
|
272
|
+
userSecretKey: params.userSecretKey,
|
|
273
|
+
tapLeafScript: vhtlc.refundWithoutReceiver(),
|
|
274
|
+
tapTree: vhtlc.encode(),
|
|
275
|
+
vhtlcPkScript: hex.encode(vhtlc.pkScript),
|
|
276
|
+
witnessData: void 0,
|
|
277
|
+
destinationAddress: params.destinationAddress,
|
|
278
|
+
networkName,
|
|
279
|
+
lendaswapApiUrl: params.lendaswapApiUrl,
|
|
280
|
+
arkadeServerUrl: params.arkadeServerUrl,
|
|
281
|
+
locktime: params.refundLocktime,
|
|
282
|
+
logger: params.logger,
|
|
283
|
+
logLevel: params.logLevel
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
async function settleDelegate(opts) {
|
|
287
|
+
const {
|
|
288
|
+
userSecretKey,
|
|
289
|
+
tapLeafScript,
|
|
290
|
+
tapTree,
|
|
291
|
+
vhtlcPkScript,
|
|
292
|
+
witnessData,
|
|
293
|
+
destinationAddress,
|
|
294
|
+
networkName,
|
|
295
|
+
lendaswapApiUrl,
|
|
296
|
+
arkadeServerUrl
|
|
297
|
+
} = opts;
|
|
298
|
+
const logger = createSdkLogger(opts).child({
|
|
299
|
+
module: "delegate",
|
|
300
|
+
operation: "delegate.settle",
|
|
301
|
+
swapId: opts.swapId,
|
|
302
|
+
data: { destinationAddress, networkName }
|
|
303
|
+
});
|
|
304
|
+
const serverUrl = resolveArkadeServerUrlByName(networkName, arkadeServerUrl);
|
|
305
|
+
const arkProvider = new RestArkProvider(serverUrl);
|
|
306
|
+
const indexerProvider = new RestIndexerProvider(serverUrl);
|
|
307
|
+
const serverInfo = await arkProvider.getInfo();
|
|
308
|
+
const cosignerPkHex = await fetchCosignerPk(lendaswapApiUrl);
|
|
309
|
+
const btcNetwork = networks[networkName];
|
|
310
|
+
const forfeitDecoded = Address(btcNetwork).decode(serverInfo.forfeitAddress);
|
|
311
|
+
const forfeitPkScript = OutScript.encode(forfeitDecoded);
|
|
312
|
+
const { vtxos: allVtxos } = await indexerProvider.getVtxos({
|
|
313
|
+
scripts: [vhtlcPkScript]
|
|
314
|
+
});
|
|
315
|
+
const vtxos = allVtxos.filter((v) => !v.isSpent);
|
|
316
|
+
if (vtxos.length === 0) {
|
|
317
|
+
throw new Error("No settleable VTXOs found at the VHTLC address");
|
|
318
|
+
}
|
|
319
|
+
const totalAmount = vtxos.reduce((acc, v) => acc + BigInt(v.value), 0n);
|
|
320
|
+
if (totalAmount === 0n) {
|
|
321
|
+
throw new Error("Total VTXO amount is zero");
|
|
322
|
+
}
|
|
323
|
+
logger.info({
|
|
324
|
+
event: "delegate.settle.vtxos_found",
|
|
325
|
+
message: "Found settleable VTXOs for delegate settlement",
|
|
326
|
+
data: { vtxoCount: vtxos.length, totalAmount }
|
|
327
|
+
});
|
|
328
|
+
const destAddr = ArkAddress.decode(destinationAddress);
|
|
329
|
+
const destPkScript = destAddr.pkScript;
|
|
330
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
331
|
+
const intentMessage = {
|
|
332
|
+
type: "register",
|
|
333
|
+
onchain_output_indexes: [],
|
|
334
|
+
valid_at: now,
|
|
335
|
+
expire_at: now + 120,
|
|
336
|
+
cosigners_public_keys: [cosignerPkHex]
|
|
337
|
+
};
|
|
338
|
+
const pkScriptBytes = hex.decode(vhtlcPkScript);
|
|
339
|
+
const intentInputs = vtxos.map((v) => ({
|
|
340
|
+
txid: hex.decode(v.txid),
|
|
341
|
+
index: v.vout,
|
|
342
|
+
witnessUtxo: {
|
|
343
|
+
script: pkScriptBytes,
|
|
344
|
+
amount: BigInt(v.value)
|
|
345
|
+
},
|
|
346
|
+
tapLeafScript: [tapLeafScript],
|
|
347
|
+
sequence: opts.locktime ? 4294967294 : void 0,
|
|
348
|
+
sighashType: SigHash.ALL
|
|
349
|
+
}));
|
|
350
|
+
const intentProof = Intent.create(intentMessage, intentInputs, [
|
|
351
|
+
{ script: destPkScript, amount: totalAmount }
|
|
352
|
+
]);
|
|
353
|
+
for (let i = 0; i < vtxos.length; i++) {
|
|
354
|
+
setArkPsbtField(intentProof, i + 1, VtxoTaprootTree, tapTree);
|
|
355
|
+
}
|
|
356
|
+
const signer = SingleKey.fromHex(userSecretKey);
|
|
357
|
+
if (witnessData) {
|
|
358
|
+
for (let i = 0; i < vtxos.length; i++) {
|
|
359
|
+
setArkPsbtField(intentProof, i + 1, ConditionWitness, [witnessData]);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const signedIntentProof = await signer.sign(intentProof);
|
|
363
|
+
const dust = serverInfo.dust;
|
|
364
|
+
const signedForfeitPsbts = [];
|
|
365
|
+
for (const v of vtxos) {
|
|
366
|
+
const vtxoAmount = BigInt(v.value);
|
|
367
|
+
const forfeitTx = new Transaction2({
|
|
368
|
+
version: 3,
|
|
369
|
+
lockTime: 0
|
|
370
|
+
});
|
|
371
|
+
forfeitTx.addInput({
|
|
372
|
+
txid: hex.decode(v.txid),
|
|
373
|
+
index: v.vout,
|
|
374
|
+
witnessUtxo: {
|
|
375
|
+
script: pkScriptBytes,
|
|
376
|
+
amount: vtxoAmount
|
|
377
|
+
},
|
|
378
|
+
tapLeafScript: [tapLeafScript],
|
|
379
|
+
sighashType: SigHash.ALL_ANYONECANPAY
|
|
380
|
+
});
|
|
381
|
+
forfeitTx.addOutput({
|
|
382
|
+
script: forfeitPkScript,
|
|
383
|
+
amount: vtxoAmount + dust
|
|
384
|
+
});
|
|
385
|
+
forfeitTx.addOutput(P2A);
|
|
386
|
+
setArkPsbtField(forfeitTx, 0, VtxoTaprootTree, tapTree);
|
|
387
|
+
if (witnessData) {
|
|
388
|
+
setArkPsbtField(forfeitTx, 0, ConditionWitness, [witnessData]);
|
|
389
|
+
}
|
|
390
|
+
const signedForfeit = await signer.sign(forfeitTx);
|
|
391
|
+
signedForfeitPsbts.push(base64.encode(signedForfeit.toPSBT()));
|
|
392
|
+
}
|
|
393
|
+
const intentProofBase64 = base64.encode(signedIntentProof.toPSBT());
|
|
394
|
+
const intentMessageJson = Intent.encodeMessage(intentMessage);
|
|
395
|
+
const settleUrl = `${lendaswapApiUrl.replace(/\/$/, "")}/api/delegate/settle`;
|
|
396
|
+
const settleRes = await fetch(settleUrl, {
|
|
397
|
+
method: "POST",
|
|
398
|
+
headers: { "Content-Type": "application/json" },
|
|
399
|
+
body: JSON.stringify({
|
|
400
|
+
intent_proof: intentProofBase64,
|
|
401
|
+
intent_message: intentMessageJson,
|
|
402
|
+
forfeit_psbts: signedForfeitPsbts,
|
|
403
|
+
cosigner_pk: cosignerPkHex,
|
|
404
|
+
swap_id: opts.swapId,
|
|
405
|
+
preimage: opts.preimage
|
|
406
|
+
})
|
|
407
|
+
});
|
|
408
|
+
if (!settleRes.ok) {
|
|
409
|
+
const errBody = await settleRes.text();
|
|
410
|
+
throw new Error(`Delegate settle failed: ${settleRes.status} ${errBody}`);
|
|
411
|
+
}
|
|
412
|
+
const result = await settleRes.json();
|
|
413
|
+
return { commitmentTxid: result.commitment_txid };
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export { SdkLogger, createConsoleLogger, createSdkLogger, delegateClaim, delegateRefund, fetchCosignerPk, getNetworkHrp, getNetworkName, noopLogger, redactLogValue, resolveArkadeServerUrl, resolveArkadeServerUrlByName };
|
|
417
|
+
//# sourceMappingURL=chunk-C4YXYD24.js.map
|
|
418
|
+
//# sourceMappingURL=chunk-C4YXYD24.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/delegate.ts","../src/arkade-network.ts","../src/logging.ts"],"names":["Transaction"],"mappings":"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","file":"chunk-C4YXYD24.js","sourcesContent":["/**\n * Delegate settlement for VHTLC VTXOs.\n *\n * Allows the client to prepare and sign delegate PSBTs (intent + forfeits),\n * then POST them to the lendaswap backend which runs the Ark batch ceremony.\n *\n * This works for spendable, recoverable, AND expired VTXOs — unlike the\n * offchain submitTx/finalizeTx path which only handles spendable VTXOs.\n */\n\nimport {\n ArkAddress,\n type ArkProvider,\n ConditionWitness,\n type IndexerProvider,\n Intent,\n type NetworkName,\n networks,\n RestArkProvider,\n RestIndexerProvider,\n SingleKey,\n setArkPsbtField,\n type TapLeafScript,\n Transaction,\n VHTLC,\n VtxoTaprootTree,\n} from \"@arkade-os/sdk\";\nimport { Address, OutScript, SigHash } from \"@scure/btc-signer\";\n\n// P2A is the zero-value anchor output (OP_1 0x4e73)\nconst P2A_SCRIPT = new Uint8Array([0x51, 0x02, 0x4e, 0x73]);\nconst P2A = { script: P2A_SCRIPT, amount: 0n };\n\nimport { ripemd160 } from \"@noble/hashes/legacy.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { base64, hex } from \"@scure/base\";\n\nimport {\n getNetworkHrp,\n getNetworkName,\n resolveArkadeServerUrlByName,\n} from \"./arkade-network.js\";\nimport { createSdkLogger, type Logger, type LogLevel } from \"./logging.js\";\n\nfunction secondsToTimelock(\n seconds: number,\n): VHTLC.Options[\"unilateralClaimDelay\"] {\n return { type: \"seconds\" as const, value: BigInt(seconds) };\n}\n\nfunction parseXOnlyPubKey(pubKeyHex: string): Uint8Array {\n const bytes = hex.decode(pubKeyHex);\n if (bytes.length === 33) return bytes.slice(1);\n if (bytes.length === 32) return bytes;\n throw new Error(`Invalid public key length: ${bytes.length}`);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface DelegateClaimParams {\n userSecretKey: string;\n userPubKey: string;\n lendaswapPubKey: string;\n arkadeServerPubKey: string;\n preimage: string;\n preimageHash: string;\n vhtlcAddress: string;\n refundLocktime: number;\n unilateralClaimDelay: number;\n unilateralRefundDelay: number;\n unilateralRefundWithoutReceiverDelay: number;\n /** Destination Arkade address */\n destinationAddress: string;\n network: string;\n /** Lendaswap API base URL (e.g. http://localhost:3333) */\n lendaswapApiUrl: string;\n arkadeServerUrl?: string;\n /** Optional swap ID — enables the backend to mark swap as ClientRedeemed. */\n swapId?: string;\n /** Optional logger sink. Silent by default. */\n logger?: Logger;\n /** Minimum log level to emit. Defaults to `silent`. */\n logLevel?: LogLevel;\n}\n\nexport interface DelegateRefundParams {\n userSecretKey: string;\n userPubKey: string;\n lendaswapPubKey: string;\n arkadeServerPubKey: string;\n hashLock: string;\n vhtlcAddress: string;\n refundLocktime: number;\n unilateralClaimDelay: number;\n unilateralRefundDelay: number;\n unilateralRefundWithoutReceiverDelay: number;\n destinationAddress: string;\n network: string;\n lendaswapApiUrl: string;\n arkadeServerUrl?: string;\n /** Optional logger sink. Silent by default. */\n logger?: Logger;\n /** Minimum log level to emit. Defaults to `silent`. */\n logLevel?: LogLevel;\n}\n\nexport interface DelegateSettleResult {\n commitmentTxid: string;\n}\n\n/**\n * Fetch the backend's static delegate cosigner public key.\n */\nexport async function fetchCosignerPk(\n lendaswapApiUrl: string,\n): Promise<string> {\n const url = `${lendaswapApiUrl.replace(/\\/$/, \"\")}/api/delegate/cosigner-pk`;\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(\n `Failed to fetch cosigner pk: ${res.status} ${await res.text()}`,\n );\n }\n const body = (await res.json()) as { cosigner_pk: string };\n return body.cosigner_pk;\n}\n\n/**\n * Settle a VHTLC via delegate claim (reveal preimage).\n */\nexport async function delegateClaim(\n params: DelegateClaimParams,\n): Promise<DelegateSettleResult> {\n const userPkBytes = parseXOnlyPubKey(params.userPubKey);\n const lendaswapPkBytes = parseXOnlyPubKey(params.lendaswapPubKey);\n const serverPkBytes = parseXOnlyPubKey(params.arkadeServerPubKey);\n\n const preimageBytes = hex.decode(params.preimage);\n const preimageHashBytes = ripemd160(sha256(preimageBytes));\n\n if (\n hex.encode(preimageHashBytes) !==\n hex.encode(ripemd160(hex.decode(params.preimageHash)))\n ) {\n throw new Error(\"Preimage hash mismatch\");\n }\n\n // Build VHTLC — for claim: lendaswap=sender, user=receiver\n const networkName = getNetworkName(params.network);\n const vhtlc = new VHTLC.Script({\n sender: lendaswapPkBytes,\n receiver: userPkBytes,\n server: serverPkBytes,\n preimageHash: preimageHashBytes,\n refundLocktime: BigInt(params.refundLocktime),\n unilateralClaimDelay: secondsToTimelock(params.unilateralClaimDelay),\n unilateralRefundDelay: secondsToTimelock(params.unilateralRefundDelay),\n unilateralRefundWithoutReceiverDelay: secondsToTimelock(\n params.unilateralRefundWithoutReceiverDelay,\n ),\n });\n\n const hrp = getNetworkHrp(networkName);\n const computedAddr = vhtlc.address(hrp, serverPkBytes).encode();\n if (computedAddr !== params.vhtlcAddress) {\n throw new Error(\n `VHTLC address mismatch: computed ${computedAddr}, expected ${params.vhtlcAddress}`,\n );\n }\n\n return settleDelegate({\n userSecretKey: params.userSecretKey,\n tapLeafScript: vhtlc.claim(),\n tapTree: vhtlc.encode(),\n vhtlcPkScript: hex.encode(vhtlc.pkScript),\n witnessData: preimageBytes,\n destinationAddress: params.destinationAddress,\n networkName,\n lendaswapApiUrl: params.lendaswapApiUrl,\n arkadeServerUrl: params.arkadeServerUrl,\n locktime: undefined,\n swapId: params.swapId,\n preimage: params.preimage,\n logger: params.logger,\n logLevel: params.logLevel,\n });\n}\n\n/**\n * Settle a VHTLC via delegate refund (after locktime expiry).\n */\nexport async function delegateRefund(\n params: DelegateRefundParams,\n): Promise<DelegateSettleResult> {\n const userPkBytes = parseXOnlyPubKey(params.userPubKey);\n const lendaswapPkBytes = parseXOnlyPubKey(params.lendaswapPubKey);\n const serverPkBytes = parseXOnlyPubKey(params.arkadeServerPubKey);\n\n const hashLockBytes = hex.decode(params.hashLock);\n const preimageHashBytes =\n hashLockBytes.length === 32 ? ripemd160(hashLockBytes) : hashLockBytes;\n\n // Build VHTLC — for refund: user=sender, lendaswap=receiver\n const networkName = getNetworkName(params.network);\n const vhtlc = new VHTLC.Script({\n sender: userPkBytes,\n receiver: lendaswapPkBytes,\n server: serverPkBytes,\n preimageHash: preimageHashBytes,\n refundLocktime: BigInt(params.refundLocktime),\n unilateralClaimDelay: secondsToTimelock(params.unilateralClaimDelay),\n unilateralRefundDelay: secondsToTimelock(params.unilateralRefundDelay),\n unilateralRefundWithoutReceiverDelay: secondsToTimelock(\n params.unilateralRefundWithoutReceiverDelay,\n ),\n });\n\n const hrp = getNetworkHrp(networkName);\n const computedAddr = vhtlc.address(hrp, serverPkBytes).encode();\n if (computedAddr !== params.vhtlcAddress) {\n throw new Error(\n `VHTLC address mismatch: computed ${computedAddr}, expected ${params.vhtlcAddress}`,\n );\n }\n\n return settleDelegate({\n userSecretKey: params.userSecretKey,\n tapLeafScript: vhtlc.refundWithoutReceiver(),\n tapTree: vhtlc.encode(),\n vhtlcPkScript: hex.encode(vhtlc.pkScript),\n witnessData: undefined,\n destinationAddress: params.destinationAddress,\n networkName,\n lendaswapApiUrl: params.lendaswapApiUrl,\n arkadeServerUrl: params.arkadeServerUrl,\n locktime: params.refundLocktime,\n logger: params.logger,\n logLevel: params.logLevel,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal\n// ---------------------------------------------------------------------------\n\ninterface SettleDelegateOpts {\n userSecretKey: string;\n tapLeafScript: TapLeafScript;\n tapTree: Uint8Array;\n vhtlcPkScript: string;\n witnessData: Uint8Array | undefined;\n destinationAddress: string;\n networkName: NetworkName;\n lendaswapApiUrl: string;\n arkadeServerUrl: string | undefined;\n locktime: number | undefined;\n swapId?: string;\n preimage?: string;\n logger?: Logger;\n logLevel?: LogLevel;\n}\n\nasync function settleDelegate(\n opts: SettleDelegateOpts,\n): Promise<DelegateSettleResult> {\n const {\n userSecretKey,\n tapLeafScript,\n tapTree,\n vhtlcPkScript,\n witnessData,\n destinationAddress,\n networkName,\n lendaswapApiUrl,\n arkadeServerUrl,\n } = opts;\n\n const logger = createSdkLogger(opts).child({\n module: \"delegate\",\n operation: \"delegate.settle\",\n swapId: opts.swapId,\n data: { destinationAddress, networkName },\n });\n\n const serverUrl = resolveArkadeServerUrlByName(networkName, arkadeServerUrl);\n\n const arkProvider: ArkProvider = new RestArkProvider(serverUrl);\n const indexerProvider: IndexerProvider = new RestIndexerProvider(serverUrl);\n const serverInfo = await arkProvider.getInfo();\n\n // Fetch cosigner pk from lendaswap backend\n const cosignerPkHex = await fetchCosignerPk(lendaswapApiUrl);\n\n // Decode forfeit address (bech32) to pkScript\n const btcNetwork = networks[networkName];\n const forfeitDecoded = Address(btcNetwork).decode(serverInfo.forfeitAddress);\n const forfeitPkScript = OutScript.encode(forfeitDecoded);\n\n // Fetch VTXOs — include all (not just spendable)\n const { vtxos: allVtxos } = await indexerProvider.getVtxos({\n scripts: [vhtlcPkScript],\n });\n\n // Filter to unspent VTXOs\n const vtxos = allVtxos.filter((v) => !v.isSpent);\n\n if (vtxos.length === 0) {\n throw new Error(\"No settleable VTXOs found at the VHTLC address\");\n }\n\n const totalAmount = vtxos.reduce((acc, v) => acc + BigInt(v.value), 0n);\n if (totalAmount === 0n) {\n throw new Error(\"Total VTXO amount is zero\");\n }\n\n logger.info({\n event: \"delegate.settle.vtxos_found\",\n message: \"Found settleable VTXOs for delegate settlement\",\n data: { vtxoCount: vtxos.length, totalAmount },\n });\n\n // Parse destination (Ark address → taproot pkScript)\n const destAddr = ArkAddress.decode(destinationAddress);\n const destPkScript = destAddr.pkScript;\n\n // Build intent message\n const now = Math.floor(Date.now() / 1000);\n const intentMessage: Intent.RegisterMessage = {\n type: \"register\",\n onchain_output_indexes: [],\n valid_at: now,\n expire_at: now + 120,\n cosigners_public_keys: [cosignerPkHex],\n };\n\n // Build intent inputs from VTXOs\n const pkScriptBytes = hex.decode(vhtlcPkScript);\n const intentInputs = vtxos.map((v) => ({\n txid: hex.decode(v.txid),\n index: v.vout,\n witnessUtxo: {\n script: pkScriptBytes,\n amount: BigInt(v.value),\n },\n tapLeafScript: [tapLeafScript],\n sequence: opts.locktime ? 0xfffffffe : undefined,\n sighashType: SigHash.ALL,\n }));\n\n // Build intent proof PSBT\n const intentProof = Intent.create(intentMessage, intentInputs, [\n { script: destPkScript, amount: totalAmount },\n ]);\n\n // Set VtxoTaprootTree on each real input (skip input 0 which is the toSpend ref)\n for (let i = 0; i < vtxos.length; i++) {\n setArkPsbtField(intentProof, i + 1, VtxoTaprootTree, tapTree);\n }\n\n // Sign intent proof\n const signer = SingleKey.fromHex(userSecretKey);\n\n // Set condition witness (preimage) if claiming\n if (witnessData) {\n for (let i = 0; i < vtxos.length; i++) {\n setArkPsbtField(intentProof, i + 1, ConditionWitness, [witnessData]);\n }\n }\n\n const signedIntentProof = await signer.sign(intentProof);\n\n // Build and sign delegate forfeit PSBTs.\n // Delegate forfeits have 1 input (the VTXO) with SIGHASH_ALL|ANYONECANPAY.\n // The connector input is added later by the cosigner during batch finalization.\n // Output amount = vtxo_amount + connector_dust (anticipating the connector).\n const dust = serverInfo.dust;\n const signedForfeitPsbts: string[] = [];\n\n for (const v of vtxos) {\n const vtxoAmount = BigInt(v.value);\n\n const forfeitTx = new Transaction({\n version: 3,\n lockTime: 0,\n });\n\n forfeitTx.addInput({\n txid: hex.decode(v.txid),\n index: v.vout,\n witnessUtxo: {\n script: pkScriptBytes,\n amount: vtxoAmount,\n },\n tapLeafScript: [tapLeafScript],\n sighashType: SigHash.ALL_ANYONECANPAY,\n });\n\n // Main output: VTXO amount + connector dust → forfeit address\n forfeitTx.addOutput({\n script: forfeitPkScript,\n amount: vtxoAmount + dust,\n });\n\n // Anchor output (P2A)\n forfeitTx.addOutput(P2A);\n\n // Set taproot tree\n setArkPsbtField(forfeitTx, 0, VtxoTaprootTree, tapTree);\n\n if (witnessData) {\n setArkPsbtField(forfeitTx, 0, ConditionWitness, [witnessData]);\n }\n\n const signedForfeit = await signer.sign(forfeitTx);\n signedForfeitPsbts.push(base64.encode(signedForfeit.toPSBT()));\n }\n\n // Serialize intent proof\n const intentProofBase64 = base64.encode(signedIntentProof.toPSBT());\n const intentMessageJson = Intent.encodeMessage(intentMessage);\n\n // POST to backend\n const settleUrl = `${lendaswapApiUrl.replace(/\\/$/, \"\")}/api/delegate/settle`;\n const settleRes = await fetch(settleUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n intent_proof: intentProofBase64,\n intent_message: intentMessageJson,\n forfeit_psbts: signedForfeitPsbts,\n cosigner_pk: cosignerPkHex,\n swap_id: opts.swapId,\n preimage: opts.preimage,\n }),\n });\n\n if (!settleRes.ok) {\n const errBody = await settleRes.text();\n throw new Error(`Delegate settle failed: ${settleRes.status} ${errBody}`);\n }\n\n const result = (await settleRes.json()) as { commitment_txid: string };\n return { commitmentTxid: result.commitment_txid };\n}\n","import { type NetworkName, networks } from \"@arkade-os/sdk\";\n\n/** Default Arkade server URL by network */\nexport const DEFAULT_ARKADE_URLS: Record<string, string> = {\n bitcoin: \"https://arkade.computer\",\n mainnet: \"https://arkade.computer\",\n signet: \"https://mutinynet.arkade.sh\",\n mutinynet: \"https://mutinynet.arkade.sh\",\n};\n\nexport function getNetworkName(network: string): NetworkName {\n switch (network.toLowerCase()) {\n case \"mainnet\":\n case \"bitcoin\":\n return \"bitcoin\";\n case \"testnet\":\n return \"testnet\";\n case \"signet\":\n return \"signet\";\n case \"mutinynet\":\n return \"mutinynet\";\n case \"regtest\":\n return \"regtest\";\n default:\n throw new Error(`Unknown network: ${network}`);\n }\n}\n\nexport function getNetworkHrp(networkName: NetworkName): string {\n return networks[networkName].hrp;\n}\n\nexport function resolveArkadeServerUrl(\n network: string,\n arkadeServerUrl?: string,\n): string {\n const networkName = getNetworkName(network);\n return resolveArkadeServerUrlByName(networkName, arkadeServerUrl);\n}\n\nexport function resolveArkadeServerUrlByName(\n networkName: NetworkName,\n arkadeServerUrl?: string,\n): string {\n const serverUrl = arkadeServerUrl ?? DEFAULT_ARKADE_URLS[networkName];\n if (!serverUrl) {\n throw new Error(\n `No Arkade server URL configured for network: ${networkName}`,\n );\n }\n return serverUrl;\n}\n","export type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nexport type ActiveLogLevel = Exclude<LogLevel, \"silent\">;\n\nexport interface LogRecord {\n level: ActiveLogLevel;\n message: string;\n event?: string;\n module?: string;\n operation?: string;\n swapId?: string;\n data?: Record<string, unknown>;\n error?: unknown;\n}\n\nexport interface Logger {\n trace?(record: LogRecord): void;\n debug?(record: LogRecord): void;\n info?(record: LogRecord): void;\n warn?(record: LogRecord): void;\n error?(record: LogRecord): void;\n}\n\nexport interface LoggerOptions {\n logger?: Logger;\n logLevel?: LogLevel;\n}\n\nexport interface LogContext {\n module?: string;\n operation?: string;\n swapId?: string;\n data?: Record<string, unknown>;\n}\n\nconst LEVEL_VALUE: Record<ActiveLogLevel, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n};\n\nconst SECRET_FIELD_PATTERN = new RegExp(\n \"(^|_|-|\\\\b)\" +\n \"(secret|secretkey|usersecretkey|privatekey|mnemonic|xprv|\" +\n \"preimage|signature|authorization|apikey|api_key|bearer)\" +\n \"(_|-|\\\\b|$)\",\n \"i\",\n);\n\nconst REDACTED = \"[REDACTED]\";\n\nexport const noopLogger: Logger = Object.freeze({});\n\nfunction shouldLog(level: ActiveLogLevel, configuredLevel: LogLevel): boolean {\n if (configuredLevel === \"silent\") return false;\n return LEVEL_VALUE[level] >= LEVEL_VALUE[configuredLevel];\n}\n\nfunction serializeError(error: unknown): unknown {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n }\n return error;\n}\n\nexport function redactLogValue(value: unknown): unknown {\n if (typeof value === \"bigint\") return value.toString();\n if (value instanceof Error) return serializeError(value);\n if (Array.isArray(value)) return value.map(redactLogValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(\n value as Record<string, unknown>,\n )) {\n out[key] = SECRET_FIELD_PATTERN.test(key)\n ? REDACTED\n : redactLogValue(nested);\n }\n return out;\n }\n return value;\n}\n\nexport class SdkLogger {\n readonly #logger: Logger;\n readonly #level: LogLevel;\n readonly #context: LogContext;\n\n constructor(options: LoggerOptions = {}, context: LogContext = {}) {\n this.#logger = options.logger ?? noopLogger;\n this.#level = options.logLevel ?? \"silent\";\n this.#context = context;\n }\n\n child(context: LogContext): SdkLogger {\n return new SdkLogger(\n { logger: this.#logger, logLevel: this.#level },\n {\n ...this.#context,\n ...context,\n data: {\n ...this.#context.data,\n ...context.data,\n },\n },\n );\n }\n\n trace(record: Omit<LogRecord, \"level\">): void {\n this.#emit(\"trace\", record);\n }\n\n debug(record: Omit<LogRecord, \"level\">): void {\n this.#emit(\"debug\", record);\n }\n\n info(record: Omit<LogRecord, \"level\">): void {\n this.#emit(\"info\", record);\n }\n\n warn(record: Omit<LogRecord, \"level\">): void {\n this.#emit(\"warn\", record);\n }\n\n error(record: Omit<LogRecord, \"level\">): void {\n this.#emit(\"error\", record);\n }\n\n #emit(level: ActiveLogLevel, record: Omit<LogRecord, \"level\">): void {\n if (!shouldLog(level, this.#level)) return;\n\n const sink = this.#logger[level];\n if (!sink) return;\n\n const data = redactLogValue({\n ...this.#context.data,\n ...record.data,\n }) as Record<string, unknown>;\n\n sink({\n level,\n module: record.module ?? this.#context.module,\n operation: record.operation ?? this.#context.operation,\n swapId: record.swapId ?? this.#context.swapId,\n event: record.event,\n message: record.message,\n data: Object.keys(data).length > 0 ? data : undefined,\n error:\n record.error === undefined ? undefined : redactLogValue(record.error),\n });\n }\n}\n\nexport function createSdkLogger(options?: LoggerOptions): SdkLogger {\n return new SdkLogger(options);\n}\n\nexport function createConsoleLogger(): Logger {\n const write = (record: LogRecord) => {\n const { level, message, ...rest } = record;\n const payload = Object.fromEntries(\n Object.entries(rest).filter(([, value]) => value !== undefined),\n );\n const args =\n Object.keys(payload).length > 0 ? [message, payload] : [message];\n if (level === \"trace\") console.debug(...args);\n else if (level === \"debug\") console.debug(...args);\n else if (level === \"info\") console.info(...args);\n else if (level === \"warn\") console.warn(...args);\n else console.error(...args);\n };\n\n return {\n trace: write,\n debug: write,\n info: write,\n warn: write,\n error: write,\n };\n}\n"]}
|