Skip to content

Commit 729695f

Browse files
refactor: query package
1 parent 50fbec4 commit 729695f

16 files changed

+85
-88
lines changed

packages/query/index.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
export * from './src/bitcoin/address/address.utils';
2-
export * from './src/bitcoin/address/transactions-by-address.hooks';
32
export * from './src/bitcoin/address/transactions-by-address.query';
4-
export * from './src/bitcoin/address/utxos-by-address.hooks';
53
export * from './src/bitcoin/address/utxos-by-address.query';
64
export * from './src/bitcoin/balance/btc-blockbook-utxos';
7-
export * from './src/bitcoin/balance/btc-taproot-balance.hooks';
5+
export * from './src/bitcoin/balance/btc-taproot-balance.query';
6+
export * from './src/bitcoin/balance/balance.utils';
87
export * from './src/bitcoin/clients/best-in-slot';
98
export * from './src/bitcoin/clients/bitcoin-client';
109
export * from './src/bitcoin/fees/fee-estimates.query';
@@ -13,7 +12,7 @@ export * from './src/bitcoin/ordinals/inscription-text-content.query';
1312
export * from './src/bitcoin/ordinals/inscription.query';
1413
export * from './src/bitcoin/ordinals/inscription.utils';
1514
export * from './src/bitcoin/ordinals/inscriptions-by-param.query';
16-
export * from './src/bitcoin/ordinals/inscriptions.hooks';
15+
export * from './src/bitcoin/ordinals/ordinals.utils';
1716
export * from './src/bitcoin/ordinals/inscriptions.query';
1817
export * from './src/bitcoin/ordinalsbot-client';
1918
export * from './src/bitcoin/runes/runes-outputs-by-address.query';
@@ -27,8 +26,8 @@ export * from './src/common/compliance-checker/compliance-checker.query';
2726
export * from './src/common/compliance-checker/compliance-checker.constants';
2827
export * from './src/common/compliance-checker/compliance-checker.types';
2928
export * from './src/common/alex-sdk/alex-sdk-swappable-currency.query';
30-
export * from './src/common/alex-sdk/alex-sdk.hooks';
31-
export * from './src/common/market-data/market-data.hooks';
29+
export * from './src/common/alex-sdk/alex-sdk.utils';
30+
export * from './src/common/market-data/market-data.utils';
3231
export * from './src/common/market-data/market-data.query';
3332
export * from './src/common/market-data/vendors/binance-market-data.query';
3433
export * from './src/common/market-data/vendors/coincap-market-data.query';
@@ -38,7 +37,7 @@ export * from './src/query-config';
3837
export * from './src/query-prefixes';
3938
export * from './src/rate-limiter/best-in-slot-limiter';
4039
export * from './src/rate-limiter/hiro-rate-limiter';
41-
export * from './src/stacks/balance/account-balance.hooks';
40+
export * from './src/stacks/balance/account-balance.utils';
4241
export * from './src/stacks/balance/account-balance.query';
4342
export * from './src/stacks/bns/bns.query';
4443
export * from './src/stacks/bns/bns.utils';
@@ -55,7 +54,7 @@ export * from './src/stacks/nonce/account-nonces.utils';
5554
export * from './src/stacks/sip10/sip10-tokens.utils';
5655
export * from './src/stacks/stacks-client';
5756
export * from './src/stacks/stx20-api-types';
58-
export * from './src/stacks/stx20/stx20-tokens.hooks';
57+
export * from './src/stacks/stx20/stx20-tokens.utils';
5958
export * from './src/stacks/stx20/stx20-tokens.query';
6059
export * from './src/stacks/token-metadata/fungible-tokens/fungible-token-metadata.query';
6160
export * from './src/stacks/token-metadata/non-fungible-tokens/non-fungible-token-holdings.query';

packages/query/src/bitcoin/address/address.utils.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { BTC_DECIMALS } from '@leather.io/constants';
2-
import type { Money } from '@leather.io/models';
3-
import { isEmptyArray } from '@leather.io/utils';
2+
import type { BitcoinTx, Inscription, Money } from '@leather.io/models';
3+
import { isEmptyArray, sumNumbers } from '@leather.io/utils';
44

55
import { UtxoResponseItem } from '../../../types/utxo';
6+
import { RunesOutputsByAddress } from '../clients/best-in-slot';
67

78
export function createBitcoinCryptoCurrencyAssetTypeWrapper(balance: Money) {
89
return {
@@ -21,3 +22,39 @@ export function createBitcoinCryptoCurrencyAssetTypeWrapper(balance: Money) {
2122
export function hasInscriptions(utxos: UtxoResponseItem[]) {
2223
return !isEmptyArray(utxos);
2324
}
25+
26+
export function calculateOutboundPendingTxsValue(pendingTxs: BitcoinTx[], address: string) {
27+
// sum all inputs
28+
const sumInputs = sumNumbers(pendingTxs.flatMap(tx => tx.vin.map(input => input.prevout.value)));
29+
30+
// get all outputs that are sent back to the address
31+
const returnedOutputChangeValues = pendingTxs
32+
.flatMap(tx => tx.vout.map(output => output))
33+
.filter(v => v.scriptpubkey_address === address)
34+
.flatMap(output => output.value);
35+
36+
// sum all filtered outputs
37+
const sumOutputs = sumNumbers(returnedOutputChangeValues);
38+
39+
return sumInputs.minus(sumOutputs).toNumber();
40+
}
41+
42+
interface UtxoIdentifier {
43+
txid: string;
44+
vout: number;
45+
}
46+
47+
export function filterUtxosWithInscriptions(inscriptions: Inscription[]) {
48+
return <T extends UtxoIdentifier>(utxo: T) => {
49+
return !inscriptions.some(
50+
inscription =>
51+
`${utxo.txid}:${utxo.vout.toString()}` === `${inscription.txid}:${inscription.output}`
52+
);
53+
};
54+
}
55+
56+
export function filterUtxosWithRunes(runes: RunesOutputsByAddress[]) {
57+
return <T extends UtxoIdentifier>(utxo: T) => {
58+
return !runes.some(rune => rune.output === `${utxo.txid}:${utxo.vout}`);
59+
};
60+
}

packages/query/src/bitcoin/address/transactions-by-address.hooks.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

packages/query/src/bitcoin/address/transactions-by-address.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
mockPendingTxs2,
55
mockPendingTxs3,
66
} from '../../../test/mock-btc-txs';
7-
import { calculateOutboundPendingTxsValue } from './transactions-by-address.hooks';
7+
import { calculateOutboundPendingTxsValue } from './address.utils';
88

99
describe(calculateOutboundPendingTxsValue.name, () => {
1010
test('that it returns 0 if there are no pending txs', () => {

packages/query/src/bitcoin/address/utxos-by-address.hooks.ts

Lines changed: 0 additions & 23 deletions
This file was deleted.

packages/query/src/bitcoin/address/utxos-by-address.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { mockInscriptionsList } from '../../../test/mock-inscriptions';
22
import { mockUtxos } from '../../../test/mock-utxos';
3-
import { filterUtxosWithInscriptions } from './utxos-by-address.hooks';
3+
import { filterUtxosWithInscriptions } from './address.utils';
44

55
describe(filterUtxosWithInscriptions, () => {
66
test('that it filters out utxos with inscriptions so they are not spent', () => {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Inscription } from '@leather.io/models';
2+
import { createMoney, sumNumbers } from '@leather.io/utils';
3+
4+
import { UtxoWithDerivationPath } from '../../../types/utxo';
5+
import { filterUtxosWithInscriptions } from '../address/address.utils';
6+
7+
const RETRIEVE_UTXO_DUST_AMOUNT = 10000;
8+
9+
export function filterUninscribedUtxosToRecoverFromTaproot(
10+
utxos: UtxoWithDerivationPath[],
11+
inscriptions: Inscription[]
12+
) {
13+
const filteredUtxosList = utxos
14+
.filter(utxo => utxo.status.confirmed)
15+
.filter(utxo => utxo.value > RETRIEVE_UTXO_DUST_AMOUNT);
16+
17+
return filteredUtxosList.filter(filterUtxosWithInscriptions(inscriptions));
18+
}
19+
20+
export function utxosToBalance(utxos: UtxoWithDerivationPath[]) {
21+
return createMoney(sumNumbers(utxos.map(utxo => Number(utxo.value))), 'BTC');
22+
}

packages/query/src/bitcoin/balance/btc-taproot-balance.hooks.ts renamed to packages/query/src/bitcoin/balance/btc-taproot-balance.query.ts

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,10 @@
11
import type { UseQueryResult } from '@tanstack/react-query';
22

3-
import { Inscription } from '@leather.io/models';
4-
import { createMoney, isDefined, sumNumbers } from '@leather.io/utils';
3+
import { isDefined } from '@leather.io/utils';
54

6-
import { UtxoWithDerivationPath } from '../../../types/utxo';
7-
import { filterUtxosWithInscriptions } from '../address/utxos-by-address.hooks';
85
import { BestInSlotInscriptionByXpubResponse } from '../clients/best-in-slot';
96
import { createBestInSlotInscription } from '../ordinals/inscription.utils';
10-
import { findInscriptionsOnUtxo } from '../ordinals/inscriptions.hooks';
11-
12-
const RETRIEVE_UTXO_DUST_AMOUNT = 10000;
13-
14-
export function filterUninscribedUtxosToRecoverFromTaproot(
15-
utxos: UtxoWithDerivationPath[],
16-
inscriptions: Inscription[]
17-
) {
18-
const filteredUtxosList = utxos
19-
.filter(utxo => utxo.status.confirmed)
20-
.filter(utxo => utxo.value > RETRIEVE_UTXO_DUST_AMOUNT);
21-
22-
return filteredUtxosList.filter(filterUtxosWithInscriptions(inscriptions));
23-
}
24-
25-
export function utxosToBalance(utxos: UtxoWithDerivationPath[]) {
26-
return createMoney(sumNumbers(utxos.map(utxo => Number(utxo.value))), 'BTC');
27-
}
7+
import { findInscriptionsOnUtxo } from '../ordinals/ordinals.utils';
288

299
export function combineInscriptionResults(
3010
queries: UseQueryResult<BestInSlotInscriptionByXpubResponse, Error>[]

packages/query/src/bitcoin/ordinals/inscriptions.query.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import axios from 'axios';
22

33
import { BitcoinQueryPrefixes } from '../../query-prefixes';
4+
import { BitcoinClient } from '../clients/bitcoin-client';
5+
import { createInscriptionByXpubQueryKey } from './ordinals.utils';
46

57
export function createGetInscriptionsByAddressCacheKey(address: string, networkId: string) {
68
return [BitcoinQueryPrefixes.GetInscriptionsByAddress, networkId, address];
@@ -33,3 +35,12 @@ export async function getNumberOfInscriptionOnUtxoUsingOrdinalsCom(id: string, i
3335

3436
return thumbnailCount;
3537
}
38+
39+
export function createInscriptionByXpubQuery(client: BitcoinClient, xpub: string) {
40+
return {
41+
queryKey: createInscriptionByXpubQueryKey(xpub),
42+
queryFn: () => client.BestInSlotApi.getInscriptionsByXpub(xpub),
43+
refetchOnWindowFocus: false,
44+
staleTime: 1000 * 60 * 5,
45+
} as const;
46+
}

packages/query/src/bitcoin/ordinals/inscriptions.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { mockInscriptionResponsesList } from '../../../test/mock-inscriptions';
22
import { createBestInSlotInscription } from './inscription.utils';
3-
import { findInscriptionsOnUtxo } from './inscriptions.hooks';
3+
import { findInscriptionsOnUtxo } from './ordinals.utils';
44

55
describe(findInscriptionsOnUtxo, () => {
66
test('that it finds an inscription on a utxo', () => {

0 commit comments

Comments
 (0)