@0x/utils
: Add support for nested rich revert decoding
This commit is contained in:
@@ -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;
|
||||||
|
@@ -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', () => {
|
||||||
|
Reference in New Issue
Block a user