@gvnrdao/dh-lit-actions 0.0.25 → 0.0.27

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.
@@ -1 +1 @@
1
- 6c842ec61916b48d7a77ad2ecf7a3567e0c33fd20c3870f8ce97f296f3e4a1a9
1
+ 873cdfb66ff07727655c6066bbea5b8b20a9c336f6d28901caa9dfc9fd14baa2
@@ -135,22 +135,42 @@ var _LIT_ACTION_ = (() => {
135
135
  }
136
136
 
137
137
  // src/constants/chunks/bitcoin-network-config.ts
138
- var EVMChain = /* @__PURE__ */ ((EVMChain2) => {
139
- EVMChain2["SEPOLIA"] = "sepolia";
140
- EVMChain2["ETHEREUM"] = "ethereum";
141
- return EVMChain2;
138
+ var EVMChain = /* @__PURE__ */ ((EVMChain3) => {
139
+ EVMChain3["SEPOLIA"] = "sepolia";
140
+ EVMChain3["ETHEREUM"] = "ethereum";
141
+ return EVMChain3;
142
142
  })(EVMChain || {});
143
143
  var CHAIN_TO_BITCOIN_NETWORK = {
144
- ["sepolia" /* SEPOLIA */]: "testnet" /* TESTNET */,
144
+ ["sepolia" /* SEPOLIA */]: "regtest" /* REGTEST */,
145
145
  ["ethereum" /* ETHEREUM */]: "mainnet" /* MAINNET */
146
146
  };
147
147
  var APPROVED_BITCOIN_PROVIDERS = {
148
+ ["regtest" /* REGTEST */]: [
149
+ {
150
+ url: "https://diamond-hands-btc-faucet-6b39a1072059.herokuapp.com/api",
151
+ network: "regtest" /* REGTEST */,
152
+ minConfirmations: 1,
153
+ name: "Diamond Hands"
154
+ },
155
+ {
156
+ url: "http://diamond-hands-btc-faucet-6b39a1072059.herokuapp.com/api",
157
+ network: "regtest" /* REGTEST */,
158
+ minConfirmations: 1,
159
+ name: "Diamond Hands"
160
+ }
161
+ ],
148
162
  ["testnet" /* TESTNET */]: [
149
163
  {
150
164
  url: "https://diamond-hands-btc-faucet-6b39a1072059.herokuapp.com/api",
151
165
  network: "testnet" /* TESTNET */,
152
166
  minConfirmations: 1,
153
- name: "Diamond Hands Faucet"
167
+ name: "Diamond Hands"
168
+ },
169
+ {
170
+ url: "http://diamond-hands-btc-faucet-6b39a1072059.herokuapp.com/api",
171
+ network: "testnet" /* TESTNET */,
172
+ minConfirmations: 1,
173
+ name: "Diamond Hands"
154
174
  }
155
175
  ],
156
176
  ["mainnet" /* MAINNET */]: [
@@ -455,13 +475,14 @@ var _LIT_ACTION_ = (() => {
455
475
  * @returns Array of UTXOs
456
476
  */
457
477
  async getUTXOs(address) {
478
+ const cleanAddress = this.stripNetworkPrefix(address);
458
479
  if (this.config.rpcHelper) {
459
- return await this.fetchUTXOsFromRPC(address);
480
+ return await this.fetchUTXOsFromRPC(cleanAddress);
460
481
  }
461
482
  try {
462
483
  return await this.fetchUTXOsFromProvider(
463
484
  this.config.providerUrl,
464
- address
485
+ cleanAddress
465
486
  );
466
487
  } catch (error) {
467
488
  console.warn(`[Bitcoin Data] Primary provider failed: ${error.message}`);
@@ -474,7 +495,7 @@ var _LIT_ACTION_ = (() => {
474
495
  console.log(
475
496
  `[Bitcoin Data] Trying fallback: ${fallback.name} (${fallback.url})`
476
497
  );
477
- return await this.fetchUTXOsFromProvider(fallback.url, address);
498
+ return await this.fetchUTXOsFromProvider(fallback.url, cleanAddress);
478
499
  } catch (fallbackError) {
479
500
  console.warn(
480
501
  `[Bitcoin Data] Fallback ${fallback.name} failed: ${fallbackError.message}`
@@ -486,6 +507,19 @@ var _LIT_ACTION_ = (() => {
486
507
  throw new Error(`Failed to fetch UTXOs: ${error.message}`);
487
508
  }
488
509
  }
510
+ /**
511
+ * Strip network prefix from Bitcoin address
512
+ *
513
+ * Addresses may be stored with network prefix (e.g., "REGTEST_address")
514
+ * but APIs expect clean addresses without prefix.
515
+ *
516
+ * @param address - Address with optional prefix
517
+ * @returns Clean address without prefix
518
+ */
519
+ stripNetworkPrefix(address) {
520
+ const prefixPattern = /^(REGTEST_|TESTNET_|MAINNET_)/;
521
+ return address.replace(prefixPattern, "");
522
+ }
489
523
  /**
490
524
  * Fetch UTXOs using Bitcoin RPC (for regtest/testing)
491
525
  */
@@ -507,20 +541,6 @@ var _LIT_ACTION_ = (() => {
507
541
  }));
508
542
  return utxos;
509
543
  }
510
- /**
511
- * Detect provider format from URL
512
- *
513
- * Determines which API format a provider uses based on its URL.
514
- *
515
- * @param providerUrl Provider base URL
516
- * @returns Provider format type
517
- */
518
- detectProviderFormat(providerUrl) {
519
- if (providerUrl.includes("diamond-hands-btc-faucet")) {
520
- return "diamond-hands-faucet" /* DIAMOND_HANDS_FAUCET */;
521
- }
522
- return "blockstream" /* BLOCKSTREAM */;
523
- }
524
544
  /**
525
545
  * Parse Diamond Hands Faucet UTXO response
526
546
  *
@@ -586,12 +606,14 @@ var _LIT_ACTION_ = (() => {
586
606
  * - Diamond Hands Faucet: /api/faucet/utxos/{address}
587
607
  */
588
608
  async fetchUTXOsFromProvider(providerUrl, address) {
589
- const format = this.detectProviderFormat(providerUrl);
609
+ const allProviders = Object.values(APPROVED_BITCOIN_PROVIDERS).flat();
610
+ const matched = allProviders.find((p) => p.url === providerUrl);
611
+ const providerName = matched?.name || providerUrl;
590
612
  let endpoint;
591
- if (format === "diamond-hands-faucet" /* DIAMOND_HANDS_FAUCET */) {
592
- endpoint = `${providerUrl}/api/faucet/utxos/${address}`;
613
+ if (providerName === "Diamond Hands") {
614
+ endpoint = `${providerUrl}/faucet/balance/${address}/utxos`;
593
615
  } else {
594
- endpoint = `${providerUrl}/api/address/${address}/utxos`;
616
+ endpoint = `${providerUrl}/address/${address}/utxos`;
595
617
  }
596
618
  const controller = new AbortController();
597
619
  const timeoutId = setTimeout(() => controller.abort(), this.timeout);
@@ -604,7 +626,7 @@ var _LIT_ACTION_ = (() => {
604
626
  );
605
627
  }
606
628
  const data = await response.json();
607
- if (format === "diamond-hands-faucet" /* DIAMOND_HANDS_FAUCET */) {
629
+ if (providerName === "Diamond Hands") {
608
630
  return this.parseDiamondHandsFaucetUTXOs(data);
609
631
  } else {
610
632
  return this.parseBlockstreamUTXOs(data);
@@ -1477,7 +1499,10 @@ var _LIT_ACTION_ = (() => {
1477
1499
  positionId: position.positionId,
1478
1500
  pkpId: position.pkpId,
1479
1501
  borrower: position.borrower,
1480
- vaultAddress: position.vaultAddress,
1502
+ vaultAddress: this.parseVaultAddress(
1503
+ position.vaultAddress,
1504
+ validateChain(this.config.chain)
1505
+ ),
1481
1506
  ucdDebt: BigInt(position.ucdDebt.toString()),
1482
1507
  termStartTimestamp,
1483
1508
  selectedTerm: selectedTermMonths,
@@ -1486,6 +1511,36 @@ var _LIT_ACTION_ = (() => {
1486
1511
  // Extract loan status enum value (0-7)
1487
1512
  };
1488
1513
  }
1514
+ /**
1515
+ * Parse vault address based on format and network
1516
+ *
1517
+ * Supports two formats:
1518
+ * 1. Single string: "mqM3ZR2N6DzZkafSdFqxEAkWovAU3uYTAN"
1519
+ * 2. JSON object: {"mainnet":"bc1q...","testnet":"mqM3ZR2N6DzZkafSdFqxEAkWovAU3uYTAN"}
1520
+ *
1521
+ * @param rawVaultAddress Raw vault address from contract
1522
+ * @param chain EVM chain (sepolia, ethereum)
1523
+ * @returns Parsed Bitcoin address for the appropriate network
1524
+ */
1525
+ parseVaultAddress(rawVaultAddress, chain) {
1526
+ try {
1527
+ const parsed = JSON.parse(rawVaultAddress);
1528
+ if (typeof parsed === "object" && parsed !== null) {
1529
+ const chainLower = chain.toLowerCase();
1530
+ if (chainLower === "sepolia") {
1531
+ return parsed.regtest || parsed.testnet || parsed.mainnet;
1532
+ }
1533
+ const bitcoinNetwork = getBitcoinNetworkForChain(chain);
1534
+ if (bitcoinNetwork === "testnet" /* TESTNET */) {
1535
+ return parsed.testnet || parsed.regtest || parsed.mainnet;
1536
+ } else {
1537
+ return parsed.mainnet;
1538
+ }
1539
+ }
1540
+ } catch (e) {
1541
+ }
1542
+ return rawVaultAddress;
1543
+ }
1489
1544
  /**
1490
1545
  * Quick check if position is liquidatable
1491
1546
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gvnrdao/dh-lit-actions",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "type": "module",
5
5
  "description": "Diamond Hands Protocol LIT Actions - Deterministic, Auditable Builds",
6
6
  "main": "./pkg-dist/index.cjs",