1import ApiPromise from "@polkadot/api/promise/Api";23type PromiseType<T> = T extends PromiseLike<infer TInner> ? TInner : T;45export default function promisifySubstrate<T extends (...args: any[]) => any>(api: ApiPromise, action: T): (...args: Parameters<T>) => Promise<PromiseType<ReturnType<T>>> {6 return (...args: Parameters<T>) => {7 const promise = new Promise<PromiseType<ReturnType<T>>>((resolve: ((result: PromiseType<ReturnType<T>>) => void) | undefined, reject: ((error: any) => void) | undefined) => {8 const cleanup = () => {9 api.off('disconnected', fail);10 api.off('error', fail);11 resolve = undefined;12 reject = undefined;13 };1415 const success = (r: any) => {16 resolve && resolve(r);17 cleanup();18 };19 const fail = (error: any) => {20 reject && reject(error);21 cleanup();22 };23 24 api.on('disconnected', fail);25 api.on('error', fail);2627 const result = action(...args);28 Promise.resolve(result)29 .then(success, fail);3031 });32 return promise as any;33 };34}