123456import {ApiPromise} from '@polkadot/api';78type PromiseType<T> = T extends PromiseLike<infer TInner> ? TInner : T;910export default function promisifySubstrate<T extends (...args: any[]) => any>(api: ApiPromise, action: T): (...args: Parameters<T>) => Promise<PromiseType<ReturnType<T>>> {11 return (...args: Parameters<T>) => {12 const promise = new Promise<PromiseType<ReturnType<T>>>((resolve: ((result: PromiseType<ReturnType<T>>) => void) | undefined, reject: ((error: any) => void) | undefined) => {13 const cleanup = () => {14 api.off('disconnected', fail);15 api.off('error', fail);16 resolve = undefined;17 reject = undefined;18 };1920 const success = (r: any) => {21 resolve && resolve(r);22 cleanup();23 };24 const fail = (error: any) => {25 reject && reject(error);26 cleanup();27 };2829 api.on('disconnected', fail);30 api.on('error', fail);3132 const result = action(...args);33 Promise.resolve(result)34 .then(success, fail);3536 });37 return promise as any;38 };39}