@atomiqlabs/chain-evm
Version:
EVM specific base implementation
189 lines (188 loc) • 7.86 kB
TypeScript
/// <reference types="node" />
/// <reference types="node" />
import { BitcoinNetwork, BitcoinRpc, BtcBlock, BtcRelay, RelaySynchronizer } from "@atomiqlabs/base";
import { EVMBtcHeader } from "./headers/EVMBtcHeader";
import { EVMContractBase } from "../contract/EVMContractBase";
import { BtcRelay as BtcRelayTypechain } from "./BtcRelayTypechain";
import { EVMBtcStoredHeader } from "./headers/EVMBtcStoredHeader";
import { EVMSigner } from "../wallet/EVMSigner";
import { EVMTx } from "../chain/modules/EVMTransactions";
import { EVMChainInterface } from "../chain/EVMChainInterface";
export declare class EVMBtcRelay<B extends BtcBlock> extends EVMContractBase<BtcRelayTypechain> implements BtcRelay<EVMBtcStoredHeader, EVMTx, B, EVMSigner> {
SaveMainHeaders(signer: string, mainHeaders: EVMBtcHeader[], storedHeader: EVMBtcStoredHeader, feeRate: string): Promise<EVMTx>;
SaveShortForkHeaders(signer: string, forkHeaders: EVMBtcHeader[], storedHeader: EVMBtcStoredHeader, feeRate: string): Promise<EVMTx>;
SaveLongForkHeaders(signer: string, forkId: number, forkHeaders: EVMBtcHeader[], storedHeader: EVMBtcStoredHeader, feeRate: string, totalForkHeaders?: number): Promise<EVMTx>;
bitcoinRpc: BitcoinRpc<B>;
readonly maxHeadersPerTx: number;
readonly maxForkHeadersPerTx: number;
readonly maxShortForkHeadersPerTx: number;
constructor(chainInterface: EVMChainInterface<any>, bitcoinRpc: BitcoinRpc<B>, bitcoinNetwork: BitcoinNetwork, contractAddress: string, contractDeploymentHeight?: number);
/**
* Computes subsequent commited headers as they will appear on the blockchain when transactions
* are submitted & confirmed
*
* @param initialStoredHeader
* @param syncedHeaders
* @private
*/
private computeCommitedHeaders;
/**
* A common logic for submitting blockheaders in a transaction
*
* @param signer
* @param headers headers to sync to the btc relay
* @param storedHeader current latest stored block header for a given fork
* @param tipWork work of the current tip in a given fork
* @param forkId forkId to submit to, forkId=0 means main chain, forkId=-1 means short fork
* @param feeRate feeRate for the transaction
* @param totalForkHeaders Total number of headers in a fork
* @private
*/
private _saveHeaders;
private findStoredBlockheaderInTraces;
private getBlock;
private getBlockHeight;
/**
* Returns data about current main chain tip stored in the btc relay
*/
getTipData(): Promise<{
commitHash: string;
blockhash: string;
chainWork: Buffer;
blockheight: number;
}>;
/**
* Retrieves blockheader with a specific blockhash, returns null if requiredBlockheight is provided and
* btc relay contract is not synced up to the desired blockheight
*
* @param blockData
* @param requiredBlockheight
*/
retrieveLogAndBlockheight(blockData: {
blockhash: string;
}, requiredBlockheight?: number): Promise<{
header: EVMBtcStoredHeader;
height: number;
} | null>;
/**
* Retrieves blockheader data by blockheader's commit hash,
*
* @param commitmentHashStr
* @param blockData
*/
retrieveLogByCommitHash(commitmentHashStr: string, blockData: {
blockhash: string;
}): Promise<EVMBtcStoredHeader>;
/**
* Retrieves latest known stored blockheader & blockheader from bitcoin RPC that is in the main chain
*/
retrieveLatestKnownBlockLog(): Promise<{
resultStoredHeader: EVMBtcStoredHeader;
resultBitcoinHeader: B;
}>;
/**
* Saves blockheaders as a bitcoin main chain to the btc relay
*
* @param signer
* @param mainHeaders
* @param storedHeader
* @param feeRate
*/
saveMainHeaders(signer: string, mainHeaders: BtcBlock[], storedHeader: EVMBtcStoredHeader, feeRate?: string): Promise<{
forkId: number;
lastStoredHeader: EVMBtcStoredHeader;
tx: import("ethers").TransactionRequest;
computedCommitedHeaders: EVMBtcStoredHeader[];
}>;
/**
* Creates a new long fork and submits the headers to it
*
* @param signer
* @param forkHeaders
* @param storedHeader
* @param tipWork
* @param feeRate
*/
saveNewForkHeaders(signer: string, forkHeaders: BtcBlock[], storedHeader: EVMBtcStoredHeader, tipWork: Buffer, feeRate?: string): Promise<{
forkId: number;
lastStoredHeader: EVMBtcStoredHeader;
tx: import("ethers").TransactionRequest;
computedCommitedHeaders: EVMBtcStoredHeader[];
}>;
/**
* Continues submitting blockheaders to a given fork
*
* @param signer
* @param forkHeaders
* @param storedHeader
* @param forkId
* @param tipWork
* @param feeRate
*/
saveForkHeaders(signer: string, forkHeaders: BtcBlock[], storedHeader: EVMBtcStoredHeader, forkId: number, tipWork: Buffer, feeRate?: string): Promise<{
forkId: number;
lastStoredHeader: EVMBtcStoredHeader;
tx: import("ethers").TransactionRequest;
computedCommitedHeaders: EVMBtcStoredHeader[];
}>;
/**
* Submits short fork with given blockheaders
*
* @param signer
* @param forkHeaders
* @param storedHeader
* @param tipWork
* @param feeRate
*/
saveShortForkHeaders(signer: string, forkHeaders: BtcBlock[], storedHeader: EVMBtcStoredHeader, tipWork: Buffer, feeRate?: string): Promise<{
forkId: number;
lastStoredHeader: EVMBtcStoredHeader;
tx: import("ethers").TransactionRequest;
computedCommitedHeaders: EVMBtcStoredHeader[];
}>;
/**
* Estimate required synchronization fee (worst case) to synchronize btc relay to the required blockheight
*
* @param requiredBlockheight
* @param feeRate
*/
estimateSynchronizeFee(requiredBlockheight: number, feeRate?: string): Promise<bigint>;
/**
* Returns fee required (in SOL) to synchronize a single block to btc relay
*
* @param feeRate
*/
getFeePerBlock(feeRate?: string): Promise<bigint>;
/**
* Gets fee rate required for submitting blockheaders to the main chain
*/
getMainFeeRate(signer: string | null): Promise<string>;
/**
* Gets fee rate required for submitting blockheaders to the specific fork
*/
getForkFeeRate(signer: string, forkId: number): Promise<string>;
saveInitialHeader(signer: string, header: B, epochStart: number, pastBlocksTimestamps: number[], feeRate?: string): Promise<EVMTx>;
/**
* Gets committed header, identified by blockhash & blockheight, determines required BTC relay blockheight based on
* requiredConfirmations
* If synchronizer is passed & blockhash is not found, it produces transactions to sync up the btc relay to the
* current chain tip & adds them to the txs array
*
* @param signer
* @param btcRelay
* @param btcTxs
* @param txs solana transaction array, in case we need to synchronize the btc relay ourselves the synchronization
* txns are added here
* @param synchronizer optional synchronizer to use to synchronize the btc relay in case it is not yet synchronized
* to the required blockheight
* @param feeRate Fee rate to use for synchronization transactions
* @private
*/
static getCommitedHeadersAndSynchronize(signer: string, btcRelay: EVMBtcRelay<any>, btcTxs: {
blockheight: number;
requiredConfirmations: number;
blockhash: string;
}[], txs: EVMTx[], synchronizer?: RelaySynchronizer<EVMBtcStoredHeader, EVMTx, any>, feeRate?: string): Promise<{
[blockhash: string]: EVMBtcStoredHeader;
}>;
}