From 24349e6ad32e9943bb711f4ed6b4ec9f09f3772e Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Sun, 1 Sep 2019 18:34:51 +0200 Subject: [PATCH 1/2] Wrapper: hotfix isForwarder() check on apps --- packages/aragon-wrapper/src/index.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/aragon-wrapper/src/index.js b/packages/aragon-wrapper/src/index.js index fa72f5d5..326753f5 100644 --- a/packages/aragon-wrapper/src/index.js +++ b/packages/aragon-wrapper/src/index.js @@ -541,10 +541,23 @@ export default class Aragon { } catch (_) { } } + // This is a hack to fix web3.js and ethers not being able to detect reverts on decoding + // `eth_call`s (apps that implement fallbacks may revert if they haven't defined + // `isForwarder()`) + // Ideally web3.js would throw an error if it receives a revert from an `eth_call`, but + // as of v1.2.1, it interprets reverts as `true` :(. + // + // We check if the app's ABI actually has `isForwarder()` declared, and if not, override + // the isForwarder setting to false. + const overrideIsForwarder = Boolean(appInfo && appInfo.abi) && + !appInfo.abi.some(({ type, name }) => type === 'function' && name === 'isForwarder') + return { ...appInfo, // Override the fetched appInfo with the actual app proxy's values to avoid mismatches - ...app + ...app, + // isForwarder override (see above) + isForwarder: overrideIsForwarder ? false : app.isForwarder } }) ) From e5071ea35ca8b06171c9ec2285c66cf2c0fc6f04 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Sun, 1 Sep 2019 18:50:37 +0200 Subject: [PATCH 2/2] Wrapper: only override isForwarder setting if it's set to true --- packages/aragon-wrapper/src/index.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/aragon-wrapper/src/index.js b/packages/aragon-wrapper/src/index.js index 326753f5..4e0c8bd8 100644 --- a/packages/aragon-wrapper/src/index.js +++ b/packages/aragon-wrapper/src/index.js @@ -549,15 +549,24 @@ export default class Aragon { // // We check if the app's ABI actually has `isForwarder()` declared, and if not, override // the isForwarder setting to false. - const overrideIsForwarder = Boolean(appInfo && appInfo.abi) && + let isForwarderOverride = {} + if ( + app.isForwarder && + appInfo && + Array.isArray(appInfo.abi) && !appInfo.abi.some(({ type, name }) => type === 'function' && name === 'isForwarder') + ) { + isForwarderOverride = { + isForwarder: false + } + } return { ...appInfo, // Override the fetched appInfo with the actual app proxy's values to avoid mismatches ...app, // isForwarder override (see above) - isForwarder: overrideIsForwarder ? false : app.isForwarder + ...isForwarderOverride } }) )