git.delta.rocks / unique-network / refs/commits / ffadfaaae655

difftreelog

source

tests/src/substrate/substrate-api.ts3.7 KiBsourcehistory
1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import { 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}