UNPKG

@sovryn-zero/lib-base

Version:
252 lines (215 loc) 8.2 kB
import { Decimalish } from "./Decimal"; import { TroveAdjustmentParams, TroveCreationParams } from "./Trove"; import { CollateralGainTransferDetails, LiquidationDetails, RedemptionDetails, StabilityDepositChangeDetails, StabilityPoolGainsWithdrawalDetails, TransactableLiquity, TroveAdjustmentDetails, TroveClosureDetails, TroveCreationDetails } from "./TransactableLiquity"; /** * A transaction that has already been sent. * * @remarks * Implemented by {@link @sovryn-zero/lib-ethers#SentEthersLiquityTransaction}. * * @public */ export interface SentLiquityTransaction<S = unknown, T extends LiquityReceipt = LiquityReceipt> { /** Implementation-specific sent transaction object. */ readonly rawSentTransaction: S; /** * Check whether the transaction has been mined, and whether it was successful. * * @remarks * Unlike {@link @sovryn-zero/lib-base#SentLiquityTransaction.waitForReceipt | waitForReceipt()}, * this function doesn't wait for the transaction to be mined. */ getReceipt(): Promise<T>; /** * Wait for the transaction to be mined, and check whether it was successful. * * @returns Either a {@link @sovryn-zero/lib-base#FailedReceipt} or a * {@link @sovryn-zero/lib-base#SuccessfulReceipt}. */ waitForReceipt(): Promise<Extract<T, MinedReceipt>>; } /** * Indicates that the transaction hasn't been mined yet. * * @remarks * Returned by {@link SentLiquityTransaction.getReceipt}. * * @public */ export type PendingReceipt = { status: "pending" }; /** @internal */ export const _pendingReceipt: PendingReceipt = { status: "pending" }; /** * Indicates that the transaction has been mined, but it failed. * * @remarks * The `rawReceipt` property is an implementation-specific transaction receipt object. * * Returned by {@link SentLiquityTransaction.getReceipt} and * {@link SentLiquityTransaction.waitForReceipt}. * * @public */ export type FailedReceipt<R = unknown> = { status: "failed"; rawReceipt: R }; /** @internal */ export const _failedReceipt = <R>(rawReceipt: R): FailedReceipt<R> => ({ status: "failed", rawReceipt }); /** * Indicates that the transaction has succeeded. * * @remarks * The `rawReceipt` property is an implementation-specific transaction receipt object. * * The `details` property may contain more information about the transaction. * See the return types of {@link TransactableLiquity} functions for the exact contents of `details` * for each type of Zero transaction. * * Returned by {@link SentLiquityTransaction.getReceipt} and * {@link SentLiquityTransaction.waitForReceipt}. * * @public */ export type SuccessfulReceipt<R = unknown, D = unknown> = { status: "succeeded"; rawReceipt: R; details: D; }; /** @internal */ export const _successfulReceipt = <R, D>( rawReceipt: R, details: D, toString?: () => string ): SuccessfulReceipt<R, D> => ({ status: "succeeded", rawReceipt, details, ...(toString ? { toString } : {}) }); /** * Either a {@link FailedReceipt} or a {@link SuccessfulReceipt}. * * @public */ export type MinedReceipt<R = unknown, D = unknown> = FailedReceipt<R> | SuccessfulReceipt<R, D>; /** * One of either a {@link PendingReceipt}, a {@link FailedReceipt} or a {@link SuccessfulReceipt}. * * @public */ export type LiquityReceipt<R = unknown, D = unknown> = PendingReceipt | MinedReceipt<R, D>; /** @internal */ export type _SendableFrom<T, R, S> = { [M in keyof T]: T[M] extends (...args: infer A) => Promise<infer D> ? (...args: A) => Promise<SentLiquityTransaction<S, LiquityReceipt<R, D>>> : never; }; /** * Send Zero transactions. * * @remarks * The functions return an object implementing {@link SentLiquityTransaction}, which can be used * to monitor the transaction and get its details when it succeeds. * * Implemented by {@link @sovryn-zero/lib-ethers#SendableEthersLiquity}. * * @public */ export interface SendableLiquity<R = unknown, S = unknown> extends _SendableFrom<TransactableLiquity, R, S> { // Methods re-declared for documentation purposes /** {@inheritDoc TransactableLiquity.openTrove} */ openTrove( params: TroveCreationParams<Decimalish>, maxBorrowingRate?: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, TroveCreationDetails>>>; /** {@inheritDoc TransactableLiquity.closeTrove} */ closeTrove(): Promise<SentLiquityTransaction<S, LiquityReceipt<R, TroveClosureDetails>>>; /** {@inheritDoc TransactableLiquity.adjustTrove} */ adjustTrove( params: TroveAdjustmentParams<Decimalish>, maxBorrowingRate?: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, TroveAdjustmentDetails>>>; /** {@inheritDoc TransactableLiquity.depositCollateral} */ depositCollateral( amount: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, TroveAdjustmentDetails>>>; /** {@inheritDoc TransactableLiquity.withdrawCollateral} */ withdrawCollateral( amount: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, TroveAdjustmentDetails>>>; /** {@inheritDoc TransactableLiquity.borrowZUSD} */ borrowZUSD( amount: Decimalish, maxBorrowingRate?: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, TroveAdjustmentDetails>>>; /** {@inheritDoc TransactableLiquity.repayZUSD} */ repayZUSD( amount: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, TroveAdjustmentDetails>>>; /** @internal */ setPrice(price: Decimalish): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; /** {@inheritDoc TransactableLiquity.liquidate} */ liquidate( address: string | string[] ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, LiquidationDetails>>>; /** {@inheritDoc TransactableLiquity.liquidateUpTo} */ liquidateUpTo( maximumNumberOfTrovesToLiquidate: number ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, LiquidationDetails>>>; /** {@inheritDoc TransactableLiquity.depositZUSDInStabilityPool} */ depositZUSDInStabilityPool( amount: Decimalish, frontendTag?: string ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, StabilityDepositChangeDetails>>>; /** {@inheritDoc TransactableLiquity.withdrawZUSDFromStabilityPool} */ withdrawZUSDFromStabilityPool( amount: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, StabilityDepositChangeDetails>>>; /** {@inheritDoc TransactableLiquity.withdrawGainsFromStabilityPool} */ withdrawGainsFromStabilityPool(): Promise< SentLiquityTransaction<S, LiquityReceipt<R, StabilityPoolGainsWithdrawalDetails>> >; /** {@inheritDoc TransactableLiquity.transferCollateralGainToTrove} */ transferCollateralGainToTrove(): Promise< SentLiquityTransaction<S, LiquityReceipt<R, CollateralGainTransferDetails>> >; /** {@inheritDoc TransactableLiquity.sendZUSD} */ sendZUSD( toAddress: string, amount: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; /** {@inheritDoc TransactableLiquity.sendZERO} */ sendZERO( toAddress: string, amount: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; /** {@inheritDoc TransactableLiquity.redeemZUSD} */ redeemZUSD( amount: Decimalish, maxRedemptionRate?: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, RedemptionDetails>>>; /** {@inheritDoc TransactableLiquity.claimCollateralSurplus} */ claimCollateralSurplus(): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; /** {@inheritDoc TransactableLiquity.stakeZERO} */ stakeZERO(amount: Decimalish): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; /** {@inheritDoc TransactableLiquity.unstakeZERO} */ unstakeZERO(amount: Decimalish): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; /** {@inheritDoc TransactableLiquity.withdrawGainsFromStaking} */ withdrawGainsFromStaking(): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; /** {@inheritDoc TransactableLiquity.registerFrontend} */ registerFrontend( kickbackRate: Decimalish ): Promise<SentLiquityTransaction<S, LiquityReceipt<R, void>>>; }