git.delta.rocks / unique-network / refs/commits / 447f0573a19c

difftreelog

source

tests/src/substrate/substrate-api.ts4.2 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  const 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 consoleErr = console.error;29  console.error = (message: string) => {30    if (!message.includes('StorageChangeSet:: WebSocket is not connected') || message.includes('2021-'))31      consoleErr(message);32  };3334  try {35    await promisifySubstrate(api, async () => {36      if (api) {37        await api.isReadyOrError;38        result = await action(api);39      }40    })();41  } finally {42    await api.disconnect();43    console.error = consoleErr;44  }45  return result as T;46}4748enum TransactionStatus {49  Success,50  Fail,51  NotReady52}5354function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {55  if (status.isReady) {56    return TransactionStatus.NotReady;57  }58  if (status.isBroadcast) {59    return TransactionStatus.NotReady;60  } 61  if (status.isInBlock || status.isFinalized) {62    if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {63      return TransactionStatus.Fail;64    }65    if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {66      return TransactionStatus.Success;67    }68  }6970  return TransactionStatus.Fail;71}7273export function74submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {75  /* eslint no-async-promise-executor: "off" */76  return new Promise(async (resolve, reject) => {77    try {78      await transaction.signAndSend(sender, ({ events = [], status }) => {79        const transactionStatus = getTransactionStatus(events, status);8081        if (transactionStatus === TransactionStatus.Success) {82          resolve(events);83        } else if (transactionStatus === TransactionStatus.Fail) {84          console.log(`Something went wrong with transaction. Status: ${status}`);85          reject(events);86        }87      });88    } catch (e) {89      console.log('Error: ', e);90      reject(e);91    }92  });93}9495export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {96  const consoleError = console.error;97  const consoleLog = console.log;98  console.error = () => {};99  console.log = () => {};100101  /* eslint no-async-promise-executor: "off" */102  return new Promise<EventRecord[]>(async function(res, rej) {103    const resolve = (rec: EventRecord[]) => {104      setTimeout(() => {105        res(rec);106        console.error = consoleError;107        console.log = consoleLog;108      });109    };110    const reject = (errror: any) => {111      setTimeout(() => {112        rej(errror);113        console.error = consoleError;114        console.log = consoleLog;115      });116    };117    try {118      await transaction.signAndSend(sender, ({ events = [], status }) => {119        const transactionStatus = getTransactionStatus(events, status);120121        // console.log('transactionStatus', transactionStatus, 'events', events);122123        if (transactionStatus === TransactionStatus.Success) {124          resolve(events);125        } else if (transactionStatus === TransactionStatus.Fail) {126          reject(events);127        }128      });129    } catch (e) {130      reject(e);131    }132  });133}