@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 | BigNumber
| number | number
| boolean | boolean
| RevertError
| BigNumber[] | BigNumber[]
| string[] | string[]
| number[] | number[]
@@ -122,6 +123,19 @@ export abstract class RevertError extends Error {
const instance = new type(); const instance = new type();
try { try {
const values = decoder(_bytes); 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 }); _.assign(instance, { values });
instance.message = instance.toString(); instance.message = instance.toString();
return instance; 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(CustomRevertError);
RevertError.registerType(ParentRevertError);
describe('RevertError', () => { describe('RevertError', () => {
describe('equality', () => { describe('equality', () => {
@@ -159,6 +166,12 @@ describe('RevertError', () => {
const decode = () => RevertError.decode(_encoded); const decode = () => RevertError.decode(_encoded);
expect(decode).to.throw(); 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', () => { describe('getThrownErrorRevertErrorBytes', () => {
it('should decode Parity revert errors', () => { it('should decode Parity revert errors', () => {