123456import { WsProvider, ApiPromise } from "@polkadot/api";7import type { AccountId, Address, ApplyExtrinsicResult, DispatchError, DispatchInfo, EventRecord, Extrinsic, ExtrinsicStatus, Hash, RuntimeDispatchInfo } from '@polkadot/types/interfaces';8import { IKeyringPair } from "@polkadot/types/types";910import config from "../config";11import promisifySubstrate from "./promisify-substrate";12import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";13import rtt from "../../../runtime_types.json";1415function defaultApiOptions(): ApiOptions {16 const wsProvider = new WsProvider(config.substrateUrl);17 return { provider: wsProvider, types: rtt };18}1920export default async function usingApi(action: (api: ApiPromise) => Promise<void>, settings: ApiOptions | undefined = undefined): Promise<void> {21 settings = settings || defaultApiOptions();22 let api: ApiPromise = new ApiPromise(settings);2324 try {25 await promisifySubstrate(api, async () => {26 if(api) {27 await api.isReadyOrError;28 await action(api);29 }30 })();31 } finally {32 await api.disconnect();33 }34}3536enum TransactionStatus {37 Success,38 Fail,39 NotReady40}4142function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {43 if (status.isReady) {44 return TransactionStatus.NotReady;45 }46 if (status.isBroadcast) {47 return TransactionStatus.NotReady;48 } 49 if (status.isInBlock || status.isFinalized) {50 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {51 return TransactionStatus.Fail;52 }53 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {54 return TransactionStatus.Success;55 }56 }5758 return TransactionStatus.Fail;59}6061export function62submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {63 return new Promise(async (resolve, reject) => {64 try {65 await transaction.signAndSend(sender, ({ events = [], status }) => {66 const transactionStatus = getTransactionStatus(events, status);6768 if (transactionStatus === TransactionStatus.Success) {69 resolve(events);70 } else if (transactionStatus === TransactionStatus.Fail) {71 console.log(`Something went wrong with transaction. Status: ${status}`);72 reject(events);73 }74 });75 } catch (e) {76 console.log('Error: ', e);77 reject(e);78 }79 });80}8182export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {83 const consoleError = console.error;84 const consoleLog = console.log;85 console.error = () => {};86 console.log = () => {};8788 return new Promise<EventRecord[]>(async function(res, rej) {89 const resolve = (rec: EventRecord[]) => {90 setTimeout(() => {91 res(rec);92 console.error = consoleError;93 console.log = consoleLog;94 });95 };96 const reject = (errror: any) => {97 setTimeout(() => {98 rej(errror);99 console.error = consoleError;100 console.log = consoleLog;101 });102 };103 try {104 await transaction.signAndSend(sender, ({ events = [], status }) => {105 const transactionStatus = getTransactionStatus(events, status);106107 console.log('transactionStatus', transactionStatus, 'events', events);108109 if (transactionStatus == TransactionStatus.Success) {110 resolve(events);111 } else if (transactionStatus == TransactionStatus.Fail) {112 reject(events);113 }114 });115 } catch (e) {116 reject(e);117 }118 });119}