difftreelog
fix remove extra IF
in: master
1 file changed
tests/src/substrate/substrate-api.tsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import '../interfaces/augment-api-events';18import {WsProvider, ApiPromise} from '@polkadot/api';19import {EventRecord} from '@polkadot/types/interfaces/system/types';20import {ExtrinsicStatus} from '@polkadot/types/interfaces/author/types';21import {IKeyringPair} from '@polkadot/types/types';2223import config from '../config';24import promisifySubstrate from './promisify-substrate';25import {ApiOptions, SubmittableExtrinsic, ApiTypes} from '@polkadot/api/types';26import * as defs from '../interfaces/definitions';27import privateKey from './privateKey';282930function defaultApiOptions(): ApiOptions {31 const wsProvider = new WsProvider(config.substrateUrl);32 return {33 provider: wsProvider, signedExtensions: {34 ContractHelpers: {35 extrinsic: {},36 payload: {},37 },38 FakeTransactionFinalizer: {39 extrinsic: {},40 payload: {},41 },42 },43 rpc: {44 unique: defs.unique.rpc,45 // TODO free RMRK! rmrk: defs.rmrk.rpc,46 eth: {47 feeHistory: {48 description: 'Dummy',49 params: [],50 type: 'u8',51 },52 maxPriorityFeePerGas: {53 description: 'Dummy',54 params: [],55 type: 'u8',56 },57 },58 },59 };60}6162export default async function usingApi<T = void>(action: (api: ApiPromise, privateKeyWrapper?: (account: string) => IKeyringPair) => Promise<T>, settings: ApiOptions | undefined = undefined): Promise<T> {63 settings = settings || defaultApiOptions();64 const api: ApiPromise = new ApiPromise(settings);65 let result: T = null as unknown as T;6667 // TODO: Remove, this is temporary: Filter unneeded API output68 // (Jaco promised it will be removed in the next version)69 const consoleErr = console.error;70 const consoleLog = console.log;71 const consoleWarn = console.warn;7273 const outFn = (printer: any) => (...args: any[]) => {74 for (const arg of args) {75 if (typeof arg !== 'string')76 continue;77 if (arg.includes('1000:: Normal connection closure' || arg === 'Normal connection closure'))78 return;79 }80 printer(...args);81 };8283 console.error = outFn(consoleErr.bind(console));84 console.log = outFn(consoleLog.bind(console));85 console.warn = outFn(consoleWarn.bind(console));8687 try {88 await promisifySubstrate(api, async () => {89 if (api) {90 await api.isReadyOrError;91 const chainProperties = api.registry.getChainProperties();92 if (chainProperties) {93 const ss58Format = (chainProperties).toHuman().ss58Format;94 const privateKeyWrapper = (account: string) => privateKey(account, Number(ss58Format));95 result = await action(api, privateKeyWrapper);96 } 97 }98 })();99 } finally {100 await api.disconnect();101 console.error = consoleErr;102 console.log = consoleLog;103 console.warn = consoleWarn;104 }105 return result as T;106}107108enum TransactionStatus {109 Success,110 Fail,111 NotReady112}113114function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {115 if (status.isReady) {116 return TransactionStatus.NotReady;117 }118 if (status.isBroadcast) {119 return TransactionStatus.NotReady;120 }121 if (status.isInBlock || status.isFinalized) {122 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {123 return TransactionStatus.Fail;124 }125 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {126 return TransactionStatus.Success;127 }128 }129130 return TransactionStatus.Fail;131}132133export function executeTransaction(api: ApiPromise, sender: IKeyringPair, transaction: SubmittableExtrinsic<'promise'>): Promise<EventRecord[]> {134 return new Promise(async (res, rej) => {135 try {136 await transaction.signAndSend(sender, ({events, status}) => {137 if (!status.isInBlock && !status.isFinalized) return;138 for (const {event} of events) {139 if (api.events.system.ExtrinsicSuccess.is(event)) {140 res(events);141 } else if (api.events.system.ExtrinsicFailed.is(event)) {142 const {data: [error]} = event;143 if (error.isModule) {144 const decoded = api.registry.findMetaError(error.asModule);145 const {method, section} = decoded;146 rej(new Error(`${section}.${method}`));147 } else {148 rej(new Error(error.toString()));149 }150 }151 }152 });153 } catch (e) {154 rej(e);155 }156 });157}158159export function160submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {161 /* eslint no-async-promise-executor: "off" */162 return new Promise(async (resolve, reject) => {163 try {164 await transaction.signAndSend(sender, ({events = [], status}) => {165 const transactionStatus = getTransactionStatus(events, status);166167 if (transactionStatus === TransactionStatus.Success) {168 resolve(events);169 } else if (transactionStatus === TransactionStatus.Fail) {170 console.log(`Something went wrong with transaction. Status: ${status}`);171 reject(events);172 }173 });174 } catch (e) {175 console.log('Error: ', e);176 reject(e);177 }178 });179}180181export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {182 console.error = () => {};183 console.log = () => {};184185 /* eslint no-async-promise-executor: "off" */186 return new Promise<EventRecord[]>(async function(res, rej) {187 const resolve = (rec: EventRecord[]) => {188 setTimeout(() => {189 res(rec);190 });191 };192 const reject = (errror: any) => {193 setTimeout(() => {194 rej(errror);195 });196 };197 try {198 await transaction.signAndSend(sender, ({events = [], status}) => {199 const transactionStatus = getTransactionStatus(events, status);200201 // console.log('transactionStatus', transactionStatus, 'events', events);202203 if (transactionStatus === TransactionStatus.Success) {204 resolve(events);205 } else if (transactionStatus === TransactionStatus.Fail) {206 reject(events);207 }208 });209 } catch (e) {210 reject(e);211 }212 });213}1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {ApiPromise, WsProvider} from '@polkadot/api';18import {ApiOptions, ApiTypes, SubmittableExtrinsic} from '@polkadot/api/types';19import {ExtrinsicStatus} from '@polkadot/types/interfaces/author/types';20import {EventRecord} from '@polkadot/types/interfaces/system/types';21import {IKeyringPair} from '@polkadot/types/types';22import config from '../config';23import '../interfaces/augment-api-events';24import * as defs from '../interfaces/definitions';25import privateKey from './privateKey';26import promisifySubstrate from './promisify-substrate';27282930function defaultApiOptions(): ApiOptions {31 const wsProvider = new WsProvider(config.substrateUrl);32 return {33 provider: wsProvider, signedExtensions: {34 ContractHelpers: {35 extrinsic: {},36 payload: {},37 },38 FakeTransactionFinalizer: {39 extrinsic: {},40 payload: {},41 },42 },43 rpc: {44 unique: defs.unique.rpc,45 // TODO free RMRK! rmrk: defs.rmrk.rpc,46 eth: {47 feeHistory: {48 description: 'Dummy',49 params: [],50 type: 'u8',51 },52 maxPriorityFeePerGas: {53 description: 'Dummy',54 params: [],55 type: 'u8',56 },57 },58 },59 };60}6162export default async function usingApi<T = void>(action: (api: ApiPromise, privateKeyWrapper?: (account: string) => IKeyringPair) => Promise<T>, settings: ApiOptions | undefined = undefined): Promise<T> {63 settings = settings || defaultApiOptions();64 const api: ApiPromise = new ApiPromise(settings);65 let result: T = null as unknown as T;6667 // TODO: Remove, this is temporary: Filter unneeded API output68 // (Jaco promised it will be removed in the next version)69 const consoleErr = console.error;70 const consoleLog = console.log;71 const consoleWarn = console.warn;7273 const outFn = (printer: any) => (...args: any[]) => {74 for (const arg of args) {75 if (typeof arg !== 'string')76 continue;77 if (arg.includes('1000:: Normal connection closure' || arg === 'Normal connection closure'))78 return;79 }80 printer(...args);81 };8283 console.error = outFn(consoleErr.bind(console));84 console.log = outFn(consoleLog.bind(console));85 console.warn = outFn(consoleWarn.bind(console));8687 try {88 await promisifySubstrate(api, async () => {89 if (api) {90 await api.isReadyOrError;91 const ss58Format = (api.registry.getChainProperties())!.toHuman().ss58Format;92 const privateKeyWrapper = (account: string) => privateKey(account, Number(ss58Format));93 result = await action(api, privateKeyWrapper);94 }95 })();96 } finally {97 await api.disconnect();98 console.error = consoleErr;99 console.log = consoleLog;100 console.warn = consoleWarn;101 }102 return result as T;103}104105enum TransactionStatus {106 Success,107 Fail,108 NotReady109}110111function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {112 if (status.isReady) {113 return TransactionStatus.NotReady;114 }115 if (status.isBroadcast) {116 return TransactionStatus.NotReady;117 }118 if (status.isInBlock || status.isFinalized) {119 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {120 return TransactionStatus.Fail;121 }122 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {123 return TransactionStatus.Success;124 }125 }126127 return TransactionStatus.Fail;128}129130export function executeTransaction(api: ApiPromise, sender: IKeyringPair, transaction: SubmittableExtrinsic<'promise'>): Promise<EventRecord[]> {131 return new Promise(async (res, rej) => {132 try {133 await transaction.signAndSend(sender, ({events, status}) => {134 if (!status.isInBlock && !status.isFinalized) return;135 for (const {event} of events) {136 if (api.events.system.ExtrinsicSuccess.is(event)) {137 res(events);138 } else if (api.events.system.ExtrinsicFailed.is(event)) {139 const {data: [error]} = event;140 if (error.isModule) {141 const decoded = api.registry.findMetaError(error.asModule);142 const {method, section} = decoded;143 rej(new Error(`${section}.${method}`));144 } else {145 rej(new Error(error.toString()));146 }147 }148 }149 });150 } catch (e) {151 rej(e);152 }153 });154}155156export function157submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {158 /* eslint no-async-promise-executor: "off" */159 return new Promise(async (resolve, reject) => {160 try {161 await transaction.signAndSend(sender, ({events = [], status}) => {162 const transactionStatus = getTransactionStatus(events, status);163164 if (transactionStatus === TransactionStatus.Success) {165 resolve(events);166 } else if (transactionStatus === TransactionStatus.Fail) {167 console.log(`Something went wrong with transaction. Status: ${status}`);168 reject(events);169 }170 });171 } catch (e) {172 console.log('Error: ', e);173 reject(e);174 }175 });176}177178export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {179 console.error = () => {};180 console.log = () => {};181182 /* eslint no-async-promise-executor: "off" */183 return new Promise<EventRecord[]>(async function(res, rej) {184 const resolve = (rec: EventRecord[]) => {185 setTimeout(() => {186 res(rec);187 });188 };189 const reject = (errror: any) => {190 setTimeout(() => {191 rej(errror);192 });193 };194 try {195 await transaction.signAndSend(sender, ({events = [], status}) => {196 const transactionStatus = getTransactionStatus(events, status);197198 // console.log('transactionStatus', transactionStatus, 'events', events);199200 if (transactionStatus === TransactionStatus.Success) {201 resolve(events);202 } else if (transactionStatus === TransactionStatus.Fail) {203 reject(events);204 }205 });206 } catch (e) {207 reject(e);208 }209 });210}