@0x/utils: Add support for nested rich revert decoding

This commit is contained in:
Michael Zhu 2020-08-18 13:10:51 -07:00
parent 7842bb4cad
commit 89117beda2
2 changed files with 27 additions and 0 deletions

View File

@ -14,6 +14,7 @@ type ArgTypes =
| BigNumber
| number
| boolean
| RevertError
| BigNumber[]
| string[]
| number[]
@ -122,6 +123,19 @@ export abstract class RevertError extends Error {
const instance = new type();
try {
const values = decoder(_bytes);
_.transform(
values,
(result, value, key) => {
const { type: argType } = instance._getArgumentByName(key);
if (argType === 'bytes') {
try {
const nestedRevert = RevertError.decode(value as string, coerce);
result[key] = nestedRevert.toString();
} catch (err) {} // tslint:disable-line:no-empty
}
},
values,
);
_.assign(instance, { values });
instance.message = instance.toString();
return instance;

View File

@ -39,7 +39,14 @@ class FixedSizeArrayRevertError extends RevertError {
}
}
class ParentRevertError extends RevertError {
public constructor(nestedError?: string) {
super('ParentRevertError', 'ParentRevertError(bytes nestedError)', { nestedError });
}
}
RevertError.registerType(CustomRevertError);
RevertError.registerType(ParentRevertError);
describe('RevertError', () => {
describe('equality', () => {
@ -159,6 +166,12 @@ describe('RevertError', () => {
const decode = () => RevertError.decode(_encoded);
expect(decode).to.throw();
});
it('should decode a nested revert error', () => {
const nested = new StringRevertError(message);
const parent = new ParentRevertError(nested.encode());
const decoded = RevertError.decode(parent.encode());
expect(decoded.toString()).to.equal(new ParentRevertError(nested.toString()).toString());
});
});
describe('getThrownErrorRevertErrorBytes', () => {
it('should decode Parity revert errors', () => {