UNPKG

@atomiqlabs/chain-starknet

Version:

Starknet specific base implementation

91 lines (76 loc) 3.19 kB
import {Call} from "starknet"; import {StarknetChainInterface} from "./StarknetChainInterface"; import {StarknetTx} from "./modules/StarknetTransactions"; export type StarknetGas = {l1?: number, l2?: number}; export function sumStarknetGas(a: StarknetGas, b: StarknetGas) { return { l1: (a?.l1 ?? 0) + (b?.l1 ?? 0), l2: (a?.l2 ?? 0) + (b?.l2 ?? 0) } } export class StarknetAction { L1GasLimit: number; L2GasLimit: number; readonly mainSigner: string; private readonly root: StarknetChainInterface; private readonly instructions: Call[]; private feeRate: string; constructor( mainSigner: string, root: StarknetChainInterface, instructions: Call[] | Call = [], gasLimit?: StarknetGas, feeRate?: string ) { this.mainSigner = mainSigner; this.root = root; this.instructions = Array.isArray(instructions) ? instructions : [instructions]; this.L1GasLimit = gasLimit?.l1 ?? 0; this.L2GasLimit = gasLimit?.l2 ?? 0; this.feeRate = feeRate; } private estimateFeeRate(): Promise<string> { return this.root.Fees.getFeeRate(); } public addIx(instruction: Call, gasLimit?: StarknetGas) { this.instructions.push(instruction); this.L1GasLimit += gasLimit?.l1 ?? 0; this.L2GasLimit += gasLimit?.l2 ?? 0; } public add(action: StarknetAction): this { return this.addAction(action); } public addAction(action: StarknetAction, index: number = this.instructions.length): this { if(action.mainSigner!==this.mainSigner) throw new Error("Actions need to have the same signer!"); if(this.L1GasLimit==null && action.L1GasLimit!=null) this.L1GasLimit = action.L1GasLimit; if(this.L2GasLimit==null && action.L2GasLimit!=null) this.L2GasLimit = action.L2GasLimit; if(this.L1GasLimit!=null && action.L1GasLimit!=null) this.L1GasLimit += action.L1GasLimit; if(this.L2GasLimit!=null && action.L2GasLimit!=null) this.L2GasLimit += action.L2GasLimit; this.instructions.splice(index, 0, ...action.instructions); if(this.feeRate==null) this.feeRate = action.feeRate; return this; } public async tx(feeRate?: string): Promise<StarknetTx> { if(feeRate==null) feeRate = this.feeRate; if(feeRate==null) feeRate = await this.estimateFeeRate(); return { type: "INVOKE", tx: this.instructions, details: { ...this.root.Fees.getFeeDetails(this.L1GasLimit, this.L2GasLimit, feeRate), walletAddress: this.mainSigner, cairoVersion: "1", chainId: this.root.starknetChainId, nonce: null, accountDeploymentData: [], skipValidate: false } }; } public async addToTxs(txs: StarknetTx[], feeRate?: string): Promise<void> { txs.push(await this.tx(feeRate)); } public ixsLength(): number { return this.instructions.length; } }