From f3ac44ba7e21006dc59fa0f41d611c48a1e4e4a2 Mon Sep 17 00:00:00 2001 From: Rafal Czajkowski Date: Wed, 15 May 2024 18:15:34 +0200 Subject: [PATCH] Add `getDeposits` to staking module Add function that returns all deposits - `queued`, `initialized` and `finalized` for a given depositor. Depositor address is created besed on the bitcoin address returned by `BitcoinProvider`. --- sdk/src/modules/staking/index.ts | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/sdk/src/modules/staking/index.ts b/sdk/src/modules/staking/index.ts index 1313d1ba0..aad93b394 100644 --- a/sdk/src/modules/staking/index.ts +++ b/sdk/src/modules/staking/index.ts @@ -5,6 +5,8 @@ import { StakeInitialization } from "./stake-initialization" import { fromSatoshi, toSatoshi } from "../../lib/utils" import Tbtc from "../tbtc" import { BitcoinProvider } from "../../lib/bitcoin/providers" +import AcreSubgraphApi from "../../lib/api/AcreSubgraphApi" +import { DepositStatus } from "../../lib/api/TbtcApi" export { DepositReceipt } from "../tbtc" @@ -41,16 +43,20 @@ class StakingModule { */ readonly #orangeKit: OrangeKitSdk + readonly #acreSubgraphApi: AcreSubgraphApi + constructor( _contracts: AcreContracts, _bitcoinProvider: BitcoinProvider, _orangeKit: OrangeKitSdk, _tbtc: Tbtc, + acreSubgraphApi: AcreSubgraphApi, ) { this.#contracts = _contracts this.#bitcoinProvider = _bitcoinProvider this.#tbtc = _tbtc this.#orangeKit = _orangeKit + this.#acreSubgraphApi = acreSubgraphApi } /** @@ -156,6 +162,48 @@ class StakingModule { const value = await this.#contracts.bitcoinDepositor.minDepositAmount() return toSatoshi(value) } + + async getDeposits(): Promise< + { + id: string + txHash: string + amount: bigint + status: DepositStatus + }[] + > { + const bitcoinAddress = await this.#bitcoinProvider.getAddress() + + const depositOwnerEvmAddress = EthereumAddress.from( + await this.#orangeKit.predictAddress(bitcoinAddress), + ) + + const subgraphData = await this.#acreSubgraphApi.getDepositsByOwner( + depositOwnerEvmAddress, + ) + + const initializedOrFinalizedDepositsMap = new Map( + subgraphData.map((data) => [data.depositKey, data]), + ) + + const tbtcData = await this.#tbtc.tbtcApi.getDepositsByOwner( + depositOwnerEvmAddress, + ) + + return tbtcData.map((deposit) => { + const depositFromSubgraph = initializedOrFinalizedDepositsMap.get( + deposit.depositKey, + ) + + const amount = depositFromSubgraph?.amount ?? deposit.initialAmount + + return { + id: deposit.depositKey, + txHash: deposit.txHash, + amount, + status: deposit.status, + } + }) + } } export { StakingModule, StakeInitialization }