To be crystal clear:
- I do not have a problem with metamask, specifically.
- I do have a problem with white lists maintained by large, private companies.
- I understand that the Ethereum codebase is permissionless.
- I understand that anyone can build a wallet and market their wallet to users.
But what I don’t understand is why people think “If you don’t like it, just make your own wallet company!” is a reasonable response to my concern as an app dev about not having feature-parity with the apps made by wallet companies. That approach might be viable for unicorns like Coinbase and Uniswap, but it isn’t for me.
3074 white lists are wallet-specific. The invoker contracts are chain specific. If I want to make a smart contract that uses AUTH
or AUTHCALL
on ten different chains with the ten largest wallets then I will need to go through one hundred wait lists and audits. Many of those white lists will be managed by wallet companies building their own applications, some of which may be competing with mine.
The debate seems to have missed one critically important fact: a white listed invoker that is generalized enough for the use cases of all apps would be so generalized that maintaining a white list would no longer serve a purpose, as any hostile app could fully drain the user via the generalized invoker.
An example:
A lending protocol similar to AAVE, but with a ‘hook’ that executes prior to the liquidation of a borrower’s collateral. The hook would use 3074 to deposit more of the user’s collateral tokens into the lending protocol to avoid the liquidation.
An app-specific version of this invoker would:
- Ensure that
AUTHCALL
is only used during the liquidation.
- Ensure that the
AUTHCALL
is only called explicitly by the lending protocol.
- Only transfer the specific token that matches the user’s collateral token.
- Only deposit up to a pre-approved amount set by the user when they opted into the hook.
- Can continue ‘topping off’ multiple collateralized positions to protect the user from liquidations while keeping the user capital efficient.
- Can be opted-out at any time.
- Fully immutable, etc
Now if we set up this hook to access the 3074 op codes through a generalized invoker, this is what it would look like from the perspective of the generalized invoker:
(assume prices are crashing)
- The invoker would be called by a contract (the invoker is not used as an entrypoint)
- The contract would then transfer some of one of the user’s tokens to itself
- It would then transfer some of another one of the user’s tokens to itself
- And it would keep doing this until the user is fully drained.
The generalized invoker has no sense of the lending protocol. It doesn’t know that the user had deposited multiple different ERC20 tokens into it, it also doesn’t know that each of these transfers is a deposit that is protecting the user.
From its POV, all it sees is some contract transferring all of the users’ tokens to itself. Without apriori knowledge of the lending protocol, this would be indistinguishable from an attack.
If a white listed invoker allows the calling contract to take all of the users’ tokens then there’s no point in maintaining a white list. Importantly, the app-specific version of the invoker would be significantly safer than any invoker that is generalized enough to perform this feature.
Although this design, specifically, isn’t something I’m planning to build, this app-specific invoker design is a genuinely useful feature. It’s a feature that helps users. It’s a feature that provides value to users - both by freeing up a portion of their collateralized capital and by mitigating the losses that a user suffers upon liquidation. This type of app doesn’t even use intents; with intents, the advantages of in-app 3074 are even more pronounced.
I do not want to have to “build my own wallet company” in order to build an app like this. I do not want to have to “build my own wallet company” to have feature parity with the wallet companies building apps like this.
As an app dev, my perspective is:
- I would strongly prefer for the permissioning of smart contract usage of 3074 to be managed by users in a similar way (but more pronounced, perhaps) to how users currently manage token approvals.
- If that isn’t possible, I would prefer for smart contract usage of 3074 to be handled solely by an enshrined invoker contract.
- If that isn’t possible, then I do not believe that 3074 is secure enough for production.
I do not believe that invoker interactions should be heterogenous between wallets. Handling the permissioning offchain doesn’t make a system permissionless, especially when that permissioning is explicitly assumed to be occuring and is factored into the security assumptions of the proposal. If the EIP is too unsafe to function without strict permissioning from offchain actors then, in my opinion, it is too unsafe for production in a permissionless system.