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, reject) => {8 const cleanup = () => {9 api.off('disconnected', fail);10 api.off('error', fail);11 };1213 const success = (r: any) => {14 cleanup();15 resolve(r);16 };17 const fail = (error: any) => {18 cleanup();19 reject(error);20 };21 22 api.on('disconnected', fail);23 api.on('error', fail);2425 const result = action(...args);26 Promise.resolve(result)27 .then(success, fail);2829 });30 return promise as any;31 };32}