import {ApiPromise, ISigner, ISubmittableResult, SubmittableExtrinsic} from '../../types' import {sendTransaction, signTransaction} from '../extrinsicTools' export interface ExtrinsicInfo { blockHash: string blockNumber?: number txIndex?: number txHash: string } export interface ExtrinsicResult { txResult: ISubmittableResult extrinsicInfo: ExtrinsicInfo } export interface ExtrinsicOptions { //todo: era, header, etc... } export interface ExtrinsicSendOptions { getBlockNumber?: boolean } export abstract class AbstractExtrinsic { constructor( protected readonly api: ApiPromise, protected tx: SubmittableExtrinsic, protected readonly params: P, ) { } get isSigned() { return this.tx.isSigned } /** * @ignore Unimplemented */ verifySignature() { throw new Error('Unimplemented') //todo: implement } getRawTx() { return this.tx } async sign(signer: ISigner) { this.tx = await signTransaction(this.tx, signer) return this } async send(options?: ExtrinsicSendOptions): Promise { return await this.processResult(await sendTransaction(this.tx), options) } async signAndSend(signer: ISigner, options?: ExtrinsicSendOptions): Promise { await this.sign(signer) return await this.send(options) } async getPaymentInfo(fromAddress: string): Promise { const result = await this.tx.paymentInfo(fromAddress) return result.partialFee.toBigInt() } protected async getBaseResult(txResult: ISubmittableResult, options?: ExtrinsicSendOptions): Promise { const blockHash = txResult.status.asInBlock!.toString() const blockNumber: number | undefined = (options?.getBlockNumber && !!blockHash) ? (await this.api.rpc.chain.getBlock(blockHash)).block.header.number.toNumber() : undefined const extrinsicInfo: ExtrinsicInfo = { blockHash, txHash: txResult.txHash.toString(), txIndex: txResult.txIndex, blockNumber } return { txResult: txResult, extrinsicInfo, } } protected async processResult(txResult: ISubmittableResult, options?: ExtrinsicSendOptions): Promise { return await this.getBaseResult(txResult, options) as R } } export class TransactionFromRawTx extends AbstractExtrinsic { constructor(api: ApiPromise, tx: SubmittableExtrinsic | string, options?: ExtrinsicOptions) { const transaction = typeof tx === 'string' ? api.tx(tx) : tx super(api, transaction, tx); } }