@atomiqlabs/sdk
Version:
atomiq labs SDK for cross-chain swaps between smart chains and bitcoin
130 lines (129 loc) • 5.84 kB
TypeScript
/// <reference types="node" />
import { ISwapWrapper, ISwapWrapperOptions, SwapTypeDefinition, WrapperCtorTokens } from "../ISwapWrapper";
import { ChainType, ClaimEvent, InitializeEvent, RefundEvent, SignatureData, SwapCommitState, SwapEvent } from "@atomiqlabs/base";
import { ISwap } from "../ISwap";
import { UnifiedSwapStorage } from "../../storage/UnifiedSwapStorage";
import { UnifiedSwapEventListener } from "../../events/UnifiedSwapEventListener";
import { ISwapPrice } from "../../prices/abstract/ISwapPrice";
import { EventEmitter } from "events";
import { SwapType } from "../../enums/SwapType";
import { IEscrowSwap } from "./IEscrowSwap";
import { Intermediary } from "../../intermediaries/Intermediary";
import { IntermediaryAPI } from "../../intermediaries/apis/IntermediaryAPI";
export type IEscrowSwapDefinition<T extends ChainType, W extends IEscrowSwapWrapper<T, any>, S extends IEscrowSwap<T>> = SwapTypeDefinition<T, W, S>;
/**
* Base class for wrappers of escrow-based swaps (i.e. swaps utilizing PrTLC and HTLC primitives)
*
* @category Swaps/Abstract
*/
export declare abstract class IEscrowSwapWrapper<T extends ChainType, D extends IEscrowSwapDefinition<T, IEscrowSwapWrapper<T, D>, IEscrowSwap<T, D>>, O extends ISwapWrapperOptions = ISwapWrapperOptions> extends ISwapWrapper<T, D, O> {
readonly abstract TYPE: SwapType;
/**
* @internal
*/
readonly _contract: (version?: string) => T["Contract"];
/**
* @internal
*/
readonly _swapDataDeserializer: (version?: string) => new (data: any) => T["Data"];
readonly _versionedContracts: {
[version: string]: {
swapContract: T["Contract"];
swapDataConstructor: new (data: any) => T["Data"];
};
};
constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], prices: ISwapPrice, tokens: WrapperCtorTokens, lpApi: IntermediaryAPI, options: O, versionedContracts: {
[version: string]: {
swapContract: T["Contract"];
swapDataConstructor: new (data: any) => T["Data"];
};
}, events?: EventEmitter<{
swapState: [ISwap];
}>);
/**
* Pre-fetches signature verification data from the server's pre-sent promise, doesn't throw, instead returns null
*
* @param signDataPrefetch Promise that resolves when we receive "signDataPrefetch" from the LP in streaming mode
* @param contractVersion
* @returns Pre-fetched signature verification data or null if failed
*
* @internal
*/
protected preFetchSignData(signDataPrefetch: Promise<any | null>, contractVersion: string): Promise<T["PreFetchVerification"] | undefined>;
/**
* Verifies swap initialization signature returned by the intermediary
*
* @param initiator A smart chain account initiating the swap
* @param data Parsed swap data from the intermediary
* @param signature Response of the intermediary
* @param feeRatePromise Pre-fetched fee rate promise
* @param preFetchSignatureVerificationData Pre-fetched signature verification data
* @param contractVersion
* @param abortSignal
* @returns Swap initialization signature expiry
* @throws {SignatureVerificationError} when swap init signature is invalid
*
* @internal
*/
protected verifyReturnedSignature(initiator: string, data: T["Data"], signature: SignatureData, feeRatePromise: Promise<any>, preFetchSignatureVerificationData: Promise<any>, contractVersion: string, abortSignal?: AbortSignal): Promise<number>;
/**
* Processes InitializeEvent for a given swap
* @param swap
* @param event
* @returns Whether the swap was updated/changed
*
* @internal
*/
protected abstract processEventInitialize(swap: D["Swap"], event: InitializeEvent<T["Data"]>): Promise<boolean>;
/**
* Processes ClaimEvent for a given swap
* @param swap
* @param event
* @returns Whether the swap was updated/changed
*
* @internal
*/
protected abstract processEventClaim(swap: D["Swap"], event: ClaimEvent<T["Data"]>): Promise<boolean>;
/**
* Processes RefundEvent for a given swap
* @param swap
* @param event
* @returns Whether the swap was updated/changed
*
* @internal
*/
protected abstract processEventRefund(swap: D["Swap"], event: RefundEvent<T["Data"]>): Promise<boolean>;
/**
* Processes a single SC on-chain event
* @param event
* @param swap
*
* @internal
*/
protected processEvent(event: SwapEvent<T["Data"]>, swap: D["Swap"]): Promise<void>;
/**
* @inheritDoc
* @internal
*/
protected _checkPastSwaps(pastSwaps: D["Swap"][]): Promise<{
changedSwaps: D["Swap"][];
removeSwaps: D["Swap"][];
}>;
/**
* Recovers a swap from smart chain on-chain data, please note that not all values for the recovered
* swaps might be populated, as some data is purely off-chain and can never be recovered purely
* from on-chain data.
*
* @param init Swap escrow initialization transaction and swap data
* @param state Current on-chain state of the swap
* @param lp Intermediary (LP) used as a counterparty for the swap
*/
abstract recoverFromSwapDataAndState(init: {
data: T["Data"];
getInitTxId: () => Promise<string>;
getTxBlock: () => Promise<{
blockTime: number;
blockHeight: number;
}>;
}, state: SwapCommitState, contractVersion: string, lp?: Intermediary): Promise<D["Swap"] | null>;
}