git.delta.rocks / unique-network / refs/commits / 3fb62366cc89

difftreelog

source

tests/src/substrate/substrate-api.ts4.3 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 {19    provider: wsProvider, types: rtt, signedExtensions: {20      ContractHelpers: {21        extrinsic: {},22        payload: {},23      },24    },25  };26}2728export default async function usingApi<T = void>(action: (api: ApiPromise) => Promise<T>, settings: ApiOptions | undefined = undefined): Promise<T> {29  settings = settings || defaultApiOptions();30  const api: ApiPromise = new ApiPromise(settings);31  let result: T = null as unknown as T;3233  // TODO: Remove, this is temporary: Filter unneeded API output 34  // (Jaco promised it will be removed in the next version)35  const consoleErr = console.error;36  console.error = (message: string) => {37    if (!message.includes('StorageChangeSet:: WebSocket is not connected') || message.includes('2021-'))38      consoleErr(message);39  };4041  try {42    await promisifySubstrate(api, async () => {43      if (api) {44        await api.isReadyOrError;45        result = await action(api);46      }47    })();48  } finally {49    await api.disconnect();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  /* eslint no-async-promise-executor: "off" */83  return new Promise(async (resolve, reject) => {84    try {85      await transaction.signAndSend(sender, ({ events = [], status }) => {86        const transactionStatus = getTransactionStatus(events, status);8788        if (transactionStatus === TransactionStatus.Success) {89          resolve(events);90        } else if (transactionStatus === TransactionStatus.Fail) {91          console.log(`Something went wrong with transaction. Status: ${status}`);92          reject(events);93        }94      });95    } catch (e) {96      console.log('Error: ', e);97      reject(e);98    }99  });100}101102export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {103  const consoleError = console.error;104  const consoleLog = console.log;105  console.error = () => {};106  console.log = () => {};107108  /* eslint no-async-promise-executor: "off" */109  return new Promise<EventRecord[]>(async function(res, rej) {110    const resolve = (rec: EventRecord[]) => {111      setTimeout(() => {112        res(rec);113        console.error = consoleError;114        console.log = consoleLog;115      });116    };117    const reject = (errror: any) => {118      setTimeout(() => {119        rej(errror);120        console.error = consoleError;121        console.log = consoleLog;122      });123    };124    try {125      await transaction.signAndSend(sender, ({ events = [], status }) => {126        const transactionStatus = getTransactionStatus(events, status);127128        // console.log('transactionStatus', transactionStatus, 'events', events);129130        if (transactionStatus === TransactionStatus.Success) {131          resolve(events);132        } else if (transactionStatus === TransactionStatus.Fail) {133          reject(events);134        }135      });136    } catch (e) {137      reject(e);138    }139  });140}