Skip to content

Commit 8a3045f

Browse files
committed
polish eth call return data handling
1 parent 32342fa commit 8a3045f

File tree

1 file changed

+36
-47
lines changed

1 file changed

+36
-47
lines changed

packages/eth-providers/src/base-provider.ts

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -251,25 +251,17 @@ export interface PollFilters {
251251
[PollFilterType.Logs]: LogPollFilter[];
252252
}
253253

254-
export interface CallInfo {
255-
ok?: {
256-
exit_reason: {
257-
succeed?: 'Stopped' | 'Returned' | 'Suicided';
258-
error?: any;
259-
revert?: 'Reverted';
260-
fatal?: any;
261-
};
262-
value: string;
263-
used_gas: string;
264-
used_storage: number;
265-
logs: Log[];
266-
};
267-
err?: {
268-
module: {
269-
index: number;
270-
error: `0x${string}`;
271-
};
272-
};
254+
export interface CallReturnInfo {
255+
exit_reason: {
256+
succeed?: 'Stopped' | 'Returned' | 'Suicided';
257+
error?: any;
258+
revert?: 'Reverted';
259+
fatal?: any;
260+
};
261+
value: string;
262+
used_gas: string;
263+
used_storage: number;
264+
logs: Log[];
273265
}
274266

275267
export abstract class BaseProvider extends AbstractProvider {
@@ -814,53 +806,50 @@ export abstract class BaseProvider extends AbstractProvider {
814806
_ethCall = async (callRequest: SubstrateEvmCallRequest, at?: string) => {
815807
const api = at ? await this.api.at(at) : this.api;
816808

817-
const { from, to, gasLimit, storageLimit, value, data, accessList } = callRequest;
818-
const estimate = false;
819-
820809
// call evm rpc when `state_call` is not supported yet
821810
if (!api.call.evmRuntimeRPCApi) {
822811
const data = await this.api.rpc.evm.call(callRequest);
823-
const res: CallInfo = {
824-
ok: {
825-
exit_reason: { succeed: 'Returned' },
826-
value: data.toHex(),
827-
used_gas: '0',
828-
used_storage: 0,
829-
logs: [],
830-
},
812+
813+
return {
814+
exit_reason: { succeed: 'Returned' },
815+
value: data.toHex(),
816+
used_gas: '0',
817+
used_storage: 0,
818+
logs: [],
831819
};
832-
return res.ok;
833820
}
834821

822+
const { from, to, gasLimit, storageLimit, value, data, accessList } = callRequest;
823+
const estimate = false;
824+
835825
const res = to
836826
? await api.call.evmRuntimeRPCApi.call(from, to, data, value, gasLimit, storageLimit, accessList, estimate)
837827
: await api.call.evmRuntimeRPCApi.create(from, data, value, gasLimit, storageLimit, accessList, estimate);
838828

839-
const { ok, err } = res.toJSON() as CallInfo;
829+
const ok = res.toJSON()['ok'] as CallReturnInfo | undefined;
840830
if (!ok) {
841831
// substrate level error
842-
const errMetaValid = err?.module.index !== undefined && err?.module.error !== undefined;
843-
if (!errMetaValid) {
844-
return logger.throwError(
845-
'internal JSON-RPC error [unknown error - cannot decode error info from error meta]',
846-
Logger.errors.CALL_EXCEPTION,
847-
callRequest
848-
);
849-
}
832+
let errMsg: string;
833+
const err = res.asErr;
834+
if (err.isModule) {
835+
const { index, error } = err.asModule;
836+
const errInfo = this.api.registry.findMetaError({
837+
index: new BN(index),
838+
error: new BN(error),
839+
});
850840

851-
const errInfo = this.api.registry.findMetaError({
852-
index: new BN(err.module.index),
853-
error: new BN(hexToU8a(err.module.error)[0]),
854-
});
855-
const msg = `internal JSON-RPC error [${errInfo.section}.${errInfo.name}: ${errInfo.docs}]`;
841+
errMsg = `internal JSON-RPC error [${errInfo.section}.${errInfo.name}: ${errInfo.docs}]`;
842+
} else {
843+
errMsg = err.toString();
844+
}
856845

857-
return logger.throwError(msg, Logger.errors.CALL_EXCEPTION, callRequest);
846+
return logger.throwError(errMsg, Logger.errors.CALL_EXCEPTION, callRequest);
858847
}
859848

860849
// check evm level error
861850
checkEvmExecutionError(ok);
862851

863-
return ok!;
852+
return ok;
864853
};
865854

866855
getStorageAt = async (

0 commit comments

Comments
 (0)