git.delta.rocks / unique-network / refs/commits / 09636be4bace

difftreelog

source

tests/src/substrate/substrate-api.ts4.4 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 { EventRecord } from '@polkadot/types/interfaces/system/types';8import { ExtrinsicStatus } from '@polkadot/types/interfaces/author/types';9import { IKeyringPair } from "@polkadot/types/types";1011import config from "../config";12import promisifySubstrate from "./promisify-substrate";13import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";14import rtt from "../../../runtime_types.json";1516function defaultApiOptions(): ApiOptions {17  const wsProvider = new WsProvider(config.substrateUrl);18  return { provider: wsProvider, types: rtt };19}2021export default async function usingApi<T = void>(action: (api: ApiPromise) => Promise<T>, settings: ApiOptions | undefined = undefined): Promise<T> {22  settings = settings || defaultApiOptions();23  let api: ApiPromise = new ApiPromise(settings);24  let result: T = null as unknown as T;2526  // TODO: Remove, this is temporary: Filter unneeded API output 27  // (Jaco promised it will be removed in the next version)28  const consoleLog = console.log;29  console.log = (message: string) => {30    if (message.includes("API/INIT: Capabilities detected") || message.includes("2021-")) {}31    else if (message.includes("StorageChangeSet:: WebSocket is not connected") || message.includes("2021-")) {}32    else consoleLog(message);33  };34  const consoleErr = console.error;35  console.error = (message: string) => {36    if (message.includes("StorageChangeSet:: WebSocket is not connected") || message.includes("2021-")) {}37    else consoleErr(message);38  };3940  try {41    await promisifySubstrate(api, async () => {42      if (api) {43        await api.isReadyOrError;44        result = await action(api);45      }46    })();47  } finally {48    await api.disconnect();49    console.log = consoleLog;50    console.error = consoleErr;51  }52  return result as T;53}5455enum TransactionStatus {56  Success,57  Fail,58  NotReady59}6061function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {62  if (status.isReady) {63    return TransactionStatus.NotReady;64  }65  if (status.isBroadcast) {66    return TransactionStatus.NotReady;67  } 68  if (status.isInBlock || status.isFinalized) {69    if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {70      return TransactionStatus.Fail;71    }72    if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {73      return TransactionStatus.Success;74    }75  }7677  return TransactionStatus.Fail;78}7980export function81submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {82  return new Promise(async (resolve, reject) => {83    try {84      await transaction.signAndSend(sender, ({ events = [], status }) => {85        const transactionStatus = getTransactionStatus(events, status);8687        if (transactionStatus === TransactionStatus.Success) {88          resolve(events);89        } else if (transactionStatus === TransactionStatus.Fail) {90          console.log(`Something went wrong with transaction. Status: ${status}`);91          reject(events);92        }93      });94    } catch (e) {95      console.log('Error: ', e);96      reject(e);97    }98  });99}100101export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {102  const consoleError = console.error;103  const consoleLog = console.log;104  console.error = () => {};105  console.log = () => {};106107  return new Promise<EventRecord[]>(async function(res, rej) {108    const resolve = (rec: EventRecord[]) => {109      setTimeout(() => {110        res(rec);111        console.error = consoleError;112        console.log = consoleLog;113      });114    };115    const reject = (errror: any) => {116      setTimeout(() => {117        rej(errror);118        console.error = consoleError;119        console.log = consoleLog;120      });121    };122    try {123      await transaction.signAndSend(sender, ({ events = [], status }) => {124        const transactionStatus = getTransactionStatus(events, status);125126        // console.log('transactionStatus', transactionStatus, 'events', events);127128        if (transactionStatus === TransactionStatus.Success) {129          resolve(events);130        } else if (transactionStatus === TransactionStatus.Fail) {131          reject(events);132        }133      });134    } catch (e) {135      reject(e);136    }137  });138}