@atomiqlabs/base
Version:
Base classes and interfaces for atomiq protocol
462 lines (461 loc) • 22.9 kB
TypeScript
/// <reference types="node" />
import { SwapData } from "./SwapData";
import { BtcStoredHeader } from "../btcrelay/types/BtcStoredHeader";
import { SwapCommitStatus } from "./SwapCommitStatus";
import { ChainSwapType } from "./ChainSwapType";
import { RelaySynchronizer } from "../btcrelay/synchronizer/RelaySynchronizer";
import { Buffer } from "buffer";
import { AbstractSigner, TransactionConfirmationOptions } from "../chains/ChainInterface";
export type IntermediaryReputationType = {
[key in ChainSwapType]: {
successVolume: bigint;
successCount: bigint;
failVolume: bigint;
failCount: bigint;
coopCloseVolume: bigint;
coopCloseCount: bigint;
};
};
export type SignatureData = {
prefix: string;
timeout: string;
signature: string;
};
export type BitcoinTransactionData = {
blockhash: string;
confirmations: number;
txid: string;
hex: string;
height: number;
};
export interface SwapContract<T extends SwapData = SwapData, TX = any, PreFetchData = any, PreFetchVerification = any, Signer extends AbstractSigner = AbstractSigner, ChainId extends string = string> {
readonly chainId: ChainId;
readonly claimWithSecretTimeout: number;
readonly claimWithTxDataTimeout: number;
readonly refundTimeout: number;
/**
* Initializes the swap contract
*/
start(): Promise<void>;
/**
* Signs & sends transactions for initializing a non-payIn swap (BTC -> SC)
*
* @param signer Signer to use for the transaction (must match claimer in swap data)
* @param swapData Swap to init
* @param signature Signature data from the offerer
* @param skipChecks Whether to skip verification of the signature & checking if the swap is already committed
* @param txOptions Transaction options
*/
init(signer: Signer, swapData: T, signature: SignatureData, skipChecks?: boolean, txOptions?: TransactionConfirmationOptions): Promise<string>;
/**
* Returns the unsigned transactions required for initializing a non-payIn swap (BTC -> SC)
*
* @param swapData Swap to init
* @param signature Signature data from the offerer
* @param skipChecks Whether to skip verification of the signature & checking if the swap is already committed
* @param feeRate Fee rate to use for the transaction
*/
txsInit(swapData: T, signature: SignatureData, skipChecks?: boolean, feeRate?: string): Promise<TX[]>;
/**
* Signs & sends transactions required for claiming an HTLC swap
*
* @param signer Signer for which the transaction should be created (doesn't need to match the claimer)
* @param swapData Swap to claim
* @param secret Secret pre-image that hashes to the swap hash
* @param checkExpiry Whether to check expiration of the swap before executing transactions
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param txOptions Transaction options
*/
claimWithSecret(signer: Signer, swapData: T, secret: string, checkExpiry?: boolean, initAta?: boolean, txOptions?: TransactionConfirmationOptions): Promise<string>;
/**
* Returns the unsigned transactions required for claiming an HTLC swap
*
* @param signer Signer for which the transaction should be created (doesn't need to match the claimer)
* @param swapData Swap to claim
* @param secret Secret pre-image that hashes to the swap hash
* @param checkExpiry Whether to check expiration of the swap before returning the transactions
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param feeRate Fee rate to use for the transactions
* @param skipAtaCheck Whether to skip checking if token account exists
*/
txsClaimWithSecret(signer: string | Signer, swapData: T, secret: string, checkExpiry?: boolean, initAta?: boolean, feeRate?: string, skipAtaCheck?: boolean): Promise<TX[]>;
/**
* Signs & sends transactions required for claiming an on-chain PTLC (proof-time locked contract) swap
*
* @param signer Signer for which the transaction should be created (doesn't need to match the claimer)
* @param swapData Swap to claim
* @param tx Bitcoin transaction containing the required output
* @param requiredConfirmations Required confirmations for the escrow to be claimed
* @param vout Bitcoin tx's output index of the required output
* @param storedHeader Optional already retrieved stored header to use for proving
* @param synchronizer Optiona synchronizer to be used if BTC relay contract is not synced up to the required blockheight
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param txOptions Transaction options
*/
claimWithTxData(signer: Signer, swapData: T, tx: BitcoinTransactionData, requiredConfirmations: number, vout: number, storedHeader?: BtcStoredHeader<any>, synchronizer?: RelaySynchronizer<any, TX, any>, initAta?: boolean, txOptions?: TransactionConfirmationOptions): Promise<string>;
/**
* Returns the unsigned transactions required for claiming an on-chain PTLC (proof-time locked contract) swap
*
* @param signer Signer for which the transaction should be created (doesn't need to match the claimer)
* @param swapData Swap to claim
* @param tx Bitcoin transaction containing the required output
* @param requiredConfirmations Required confirmations for the escrow to be claimed
* @param vout Bitcoin tx's output index of the required output
* @param storedHeader Optional already retrieved stored header to use for proving
* @param synchronizer Optiona synchronizer to be used if BTC relay contract is not synced up to the required blockheight
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param feeRate Fee rate to use for the transactions
*/
txsClaimWithTxData(signer: string | Signer, swapData: T, tx: BitcoinTransactionData, requiredConfirmations: number, vout: number, storedHeader?: BtcStoredHeader<any>, synchronizer?: RelaySynchronizer<any, TX, any>, initAta?: boolean, feeRate?: string): Promise<TX[]>;
/**
* Signs & sends transactions for refunding a timed out swap
*
* @param signer Signer to use for the transaction (must match offerer in swap data)
* @param swapData Swap to refund
* @param check Whether to check if the swap contract still exists on-chain
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param txOptions Transaction options
*/
refund(signer: Signer, swapData: T, check?: boolean, initAta?: boolean, txOptions?: TransactionConfirmationOptions): Promise<string>;
/**
* Returns the transactions for refunding a timed out swap
*
* @param signer Signer of the refund transaction
* @param swapData Swap to refund
* @param check Whether to check if the swap contract still exists on-chain
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param feeRate Fee rate to use for the transactions
*/
txsRefund(signer: string, swapData: T, check?: boolean, initAta?: boolean, feeRate?: string): Promise<TX[]>;
/**
* Signs & sends transactions for refunding a swap with a valid refund signature from the claimer
*
* @param signer Signer to use for the transaction (must match offerer in swap data)
* @param swapData Swap to refund
* @param signature Refund signature received from the claimer
* @param check Whether to check if the swap contract still exists on-chain
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param txOptions Transaction options
*/
refundWithAuthorization(signer: Signer, swapData: T, signature: SignatureData, check?: boolean, initAta?: boolean, txOptions?: TransactionConfirmationOptions): Promise<string>;
/**
* Returns the transactions for refunding a swap with a valid refund signature from the claimer
*
* @param signer Signer of the refund transaction
* @param swapData Swap to refund
* @param signature Refund signature received from the claimer
* @param check Whether to check if the swap contract still exists on-chain
* @param initAta Whether to initialize a token account if it doesn't exist (applies to e.g. Solana, with token specific ATAs)
* @param feeRate Fee rate to use for the transactions
*/
txsRefundWithAuthorization(signer: string, swapData: T, signature: SignatureData, check?: boolean, initAta?: boolean, feeRate?: string): Promise<TX[]>;
/**
* Signs & sends transactions for initializing and instantly (upon init confirmation) claiming the HTLC, used for BTC-LN -> SC swaps
*
* @param signer Signer to use for the transaction (must match claimer in swap data)
* @param swapData Swap to process
* @param signature Signature data from the offerer
* @param secret Secret pre-image that hashes to the swap hash
* @param skipChecks Whether to skip verification of the signature & checking if the swap is already committed
* @param txOptions Transaction options
*/
initAndClaimWithSecret?(signer: Signer, swapData: T, signature: SignatureData, secret: string, skipChecks?: boolean, txOptions?: TransactionConfirmationOptions): Promise<string[]>;
/**
* Checks whether a swap is already expired, swap expires a bit sooner for the claimer & a bit later for offerer, this
* is used to account for possible on-chain time skew
*
* @param signer Signer to use for checking the expiry
* @param swapData Swap to check
*/
isExpired(signer: string, swapData: T): Promise<boolean>;
/**
* Checks whether a swap is claimable for the signer, i.e. it is not expired yet and is committed on-chain
*
* @param signer
* @param swapData
*/
isClaimable(signer: string, swapData: T): Promise<boolean>;
/**
* Checks whether a given swap is committed on chain (initialized)
*
* @param swapData
*/
isCommited(swapData: T): Promise<boolean>;
/**
* Returns the full status of the swap, expiry is handler by the isExpired function so also requires a signer
*
* @param signer
* @param swapData
*/
getCommitStatus(signer: string, swapData: T): Promise<SwapCommitStatus>;
/**
* Checks whether a given swap is refundable by us, i.e. it is already expired, we are offerer & swap is committed on-chain
*
* @param signer
* @param swapData
*/
isRequestRefundable(signer: string, swapData: T): Promise<boolean>;
/**
* Pre-fetches data required for creating init signature
*/
preFetchBlockDataForSignatures?(): Promise<PreFetchData>;
/**
* Pre-fetches data required for init signature verification
* @param data
*/
preFetchForInitSignatureVerification?(data: PreFetchData): Promise<PreFetchVerification>;
/**
* Generates the initialization signature
*
* @param signer Signer to use for signing the message
* @param swapData Swap to sign
* @param authorizationTimeout Timeout of the authorization
* @param preFetchedBlockData Optional pre-fetched data required for creating the signature
* @param feeRate Optional fee rate to use for the authorization
*/
getInitSignature(signer: Signer, swapData: T, authorizationTimeout: number, preFetchedBlockData?: PreFetchData, feeRate?: string): Promise<SignatureData>;
/**
* Checks whether a signature is a valid initialization signature for a given swap
*
* @param swapData Swap to initialize
* @param signature Signature data
* @param feeRate Fee rate used for the authorization
* @param preFetchedVerificationData Optional pre-fetched data required for signature validation
* @returns {Buffer | null} The message being signed if valid or null if invalid signature
*/
isValidInitAuthorization(swapData: T, signature: SignatureData, feeRate?: string, preFetchedVerificationData?: PreFetchVerification): Promise<Buffer | null>;
/**
* Returns the expiry timestamp (UNIX milliseconds) of the authorization
*
* @param swapData Swap
* @param signature Signature data
* @param preFetchedVerificationData Optional pre-fetched data required for signature validation
*/
getInitAuthorizationExpiry(swapData: T, signature: SignatureData, preFetchedVerificationData?: PreFetchVerification): Promise<number>;
/**
* Checks whether a given init signature is already expired
*
* @param swapData Swap
* @param signature Signature data
*/
isInitAuthorizationExpired(swapData: T, signature: SignatureData): Promise<boolean>;
/**
* Generates the refund signature for a given swap allowing the offerer to refund before expiration
*
* @param signer Signer to use for signing the message (must be the same as offerer in swap data)
* @param swapData Swap to refund
* @param authorizationTimeout Timeout of the provided refund authorization
*/
getRefundSignature(signer: Signer, swapData: T, authorizationTimeout: number): Promise<SignatureData>;
/**
* Checks whether a given refund signature is valid
*
* @param swapData Swap to refund
* @param signature Signature received from the claimer
*/
isValidRefundAuthorization(swapData: T, signature: SignatureData): Promise<Buffer | null>;
/**
* Signs the given data with the provided signer
*
* @param signer Signer to sign the message
* @param data Data to sign
*/
getDataSignature(signer: Signer, data: Buffer): Promise<string>;
/**
* Checks whether a provided data is signature is valid
*
* @param data Data to sign
* @param signature Signature
* @param publicKey Public key of the signer
*/
isValidDataSignature(data: Buffer, signature: string, publicKey: string): Promise<boolean>;
/**
* Returns the token balance of a given signer's address
*
* @param signer Address to check the balance of
* @param token Token
* @param inContract Whether we are checking the liquidity deposited into the LP vault or just on-chain balance
*/
getBalance(signer: string, token: string, inContract: boolean): Promise<bigint>;
/**
* Create a swap data for this given chain
*
* @param type Type of the swap
* @param offerer Offerer address
* @param claimer Claimer addres
* @param token Token to use for the swap
* @param amount Amount of tokens for the swap
* @param paymentHash Payment hash identifying the swap
* @param sequence Swap sequence uniquelly defining this swap
* @param expiry Expiration of the swap
* @param payIn Whether the swap is payIn (offerer paying to the contract, or not payIn offerer using funds in his LP vault)
* @param payOut Whether the swap is payOut (claimer getting the funds to his on-chain address, or no payOut claimer
* getting his funds into his LP vault)
* @param securityDeposit Security deposit for the swap paid by the claimer (options premium)
* @param claimerBounty Bounty for the claimer of the swap (used for watchtowers)
* @param depositToken Token to be used for security deposit and claimer bounty
*/
createSwapData(type: ChainSwapType, offerer: string, claimer: string, token: string, amount: bigint, paymentHash: string, sequence: bigint, expiry: bigint, payIn: boolean, payOut: boolean, securityDeposit: bigint, claimerBounty: bigint, depositToken?: string): Promise<T>;
/**
* Returns intermediary's reputation for a given token swaps
*
* @param address
* @param token
*/
getIntermediaryReputation(address: string, token: string): Promise<IntermediaryReputationType>;
/**
* Returns the fee in native token base units to commit (initiate) the swap
*
* @param swapData Swap to initiate
* @param feeRate Optional fee rate (fetched on-demand if not provided)
*/
getCommitFee(swapData: T, feeRate?: string): Promise<bigint>;
/**
* Returns raw fee (not including any account deposits we might need) for initiating the swap
*
* @param swapData Swap to initiate
* @param feeRate Optional fee rate (fetched on-demand if not provided)
*/
getRawCommitFee?(swapData: T, feeRate?: string): Promise<bigint>;
/**
* Returns the fee in native token base units to claim the swap
*
* @param signer Signer claiming the swap
* @param swapData Swap to claim
* @param feeRate Optional fee rate (fetched on-demand if not provided)
*/
getClaimFee(signer: string, swapData: T, feeRate?: string): Promise<bigint>;
/**
* Returns raw fee (not including any refunds we might get that would make the getClaimFee negative) for claiming the swap
*
* @param signer Signer claiming the swap
* @param swapData Swap to claim
* @param feeRate Optional fee rate (fetched on-demand if not provided)
*/
getRawClaimFee?(signer: string, swapData: T, feeRate?: string): Promise<bigint>;
/**
* Returns the fee in native token base units to refund the swap
*
* @param swapData Swap to refund
* @param feeRate Optional fee rate (fetched on-demand if not provided)
*/
getRefundFee(swapData: T, feeRate?: string): Promise<bigint>;
/**
* Returns raw fee (not including any refunds we might get that would make the getRefundFee negative) for claiming the swap
*
* @param swapData Swap to claim
* @param feeRate Optional fee rate (fetched on-demand if not provided)
*/
getRawRefundFee?(swapData: T, feeRate?: string): Promise<bigint>;
/**
* Returns the fee rate for committing (initializing) a payIn swap
*
* @param offerer Offerer of the swap
* @param claimer Claimer of the swap
* @param token Token to be swapped
* @param paymentHash Optional payment hash
*/
getInitPayInFeeRate(offerer: string, claimer: string, token: string, paymentHash?: string): Promise<string>;
/**
* Returns the fee rate for committing (initializing) a non-payIn swap
*
* @param offerer Offerer of the swap
* @param claimer Claimer of the swap
* @param token Token to be swapped
* @param paymentHash Optional payment hash
*/
getInitFeeRate(offerer: string, claimer: string, token: string, paymentHash?: string): Promise<string>;
/**
* Returns the fee rate for refunding a swap
*
* @param swapData Swap to refund
*/
getRefundFeeRate(swapData: T): Promise<string>;
/**
* Returns the fee rate for claiming a swap as a specific signer
*
* @param signer Signer claiming the swap
* @param swapData Swap to claim
*/
getClaimFeeRate(signer: string, swapData: T): Promise<string>;
getExtraData(outputScript: Buffer, amount: bigint, confirmations: number, nonce?: bigint): Buffer;
/**
* Compute the claim hash for a given transaction output, either nonced or just output locked
*
* @param outputScript Bitcoin output locking script
* @param amount Amount of sats in the output
* @param confirmations Required number of confirmations for the swap to be claimable
* @param nonce Nonce to be used as replay protection
*/
getHashForOnchain(outputScript: Buffer, amount: bigint, confirmations: number, nonce?: bigint): Buffer;
/**
* Compute the claim hash for a given transaction id
*
* @param txId Bitcoin transaction ID
* @param confirmations Required number of confirmations for the swap to be claimable
*/
getHashForTxId(txId: string, confirmations: number): Buffer;
/**
* Compute the claim hash for an HTLC swap with a given swap hash
*
* @param swapHash
*/
getHashForHtlc(swapHash: Buffer): Buffer;
/**
* Withdraws funds from the trading LP vault
*
* @param signer Signer to sign the withdrawal with
* @param token Token to withdraw
* @param amount Amount of the token to withdraw
* @param txOptions Transaction options
*/
withdraw(signer: Signer, token: string, amount: bigint, txOptions?: TransactionConfirmationOptions): Promise<string>;
/**
* Returns transactions required for signer to withdraw funds from the trading LP vault
*
* @param signer Owner of the funds
* @param token Token to withdraw
* @param amount Amount of the token to withdraw
* @param feeRate Optional fee rate to use for the transaction (fetched on-demand if not provided)
*/
txsWithdraw(signer: string, token: string, amount: bigint, feeRate?: string): Promise<TX[]>;
/**
* Deposits funds to the trading LP vault
*
* @param signer Signer to sign the deposit with
* @param token Token to deposit
* @param amount Amount of the token to deposit
* @param txOptions Transaction options
*/
deposit(signer: Signer, token: string, amount: bigint, txOptions?: TransactionConfirmationOptions): Promise<string>;
/**
* Returns transactions required for signer to deposit funds to the trading LP vault
*
* @param signer Owner of the funds
* @param token Token to deposit
* @param amount Amount of the token to deposit
* @param feeRate Optional fee rate to use for the transaction (fetched on-demand if not provided)
*/
txsDeposit(signer: string, token: string, amount: bigint, feeRate?: string): Promise<TX[]>;
/**
* Returns the amount of deposits (in native token) that we can claim back (this is useful for SVM chains with the PDAs
* requiring you to put some deposit in order to store data)
*
* @param signer Signer to check the claimable deposits for
*/
getClaimableDeposits?(signer: string): Promise<{
count: number;
totalValue: bigint;
}>;
/**
* Claims the funds from claimable deposits
*
* @param signer Owner of the deposits, transaction signer
* @param txOptions Transaction options
*/
claimDeposits?(signer: Signer, txOptions: TransactionConfirmationOptions): Promise<{
txIds: string[];
count: number;
totalValue: bigint;
}>;
}