mirror of https://github.com/status-im/EIPs.git
74 lines
3.1 KiB
Markdown
74 lines
3.1 KiB
Markdown
---
|
|
eip: 897
|
|
title: ERC DelegateProxy
|
|
author: Jorge Izquierdo <jorge@aragon.one>, Manuel Araoz <manuel@zeppelin.solutions>
|
|
type: Standards Track
|
|
category: ERC
|
|
status: Draft
|
|
created: 2018-02-21
|
|
discussions-to: https://github.com/ethereum/EIPs/pulls/897
|
|
---
|
|
|
|
## Simple Summary
|
|
Proxy contracts are being increasingly used as both as an upgradeability mechanism
|
|
and a way to save gas when deploying many instances of a particular contract. This
|
|
standard proposes a set of interfaces for proxies to signal how they work and what
|
|
their main implementation is.
|
|
|
|
## Abstract
|
|
Using proxies that delegate their own logic to another contract is becoming an
|
|
increasingly popular technique for both smart contract upgradeability and creating
|
|
cheap clone contracts.
|
|
|
|
We don't believe there is value in standardizing any particular implementation
|
|
of a DelegateProxy, given its simplicity, but we believe there is a lot of value
|
|
in agreeing on an interface all proxies use that allows for a standard way to
|
|
operate with proxies.
|
|
|
|
## Implementations
|
|
|
|
- **aragonOS**: [AppProxyUpgradeable](https://github.com/aragon/aragonOS/blob/dev/contracts/apps/AppProxyUpgradeable.sol), [AppProxyPinned](https://github.com/aragon/aragonOS/blob/dev/contracts/apps/AppProxyPinned.sol) and [KernelProxy](https://github.com/aragon/aragonOS/blob/dev/contracts/kernel/KernelProxy.sol)
|
|
|
|
- **zeppelinOS**: [Proxy](https://github.com/zeppelinos/labs/blob/2da9e859db81a61f2449d188e7193788ca721c65/upgradeability_ownership/contracts/Proxy.sol)
|
|
|
|
## Standardized interface
|
|
|
|
```solidity
|
|
interface ERCProxy {
|
|
function proxyType() public pure returns (uint256 proxyTypeId);
|
|
function implementation() public view returns (address codeAddr);
|
|
}
|
|
```
|
|
|
|
### Code address (`implementation()`)
|
|
The returned code address is the address the proxy would delegate calls to at that
|
|
moment in time, for that message.
|
|
|
|
### Proxy Type (`proxyType()`)
|
|
|
|
Checking the proxy type is the way to check whether a contract is a proxy at all.
|
|
When a contract fails to return to this method or it returns 0, it can be assumed
|
|
that the contract is not a proxy.
|
|
|
|
It also allows for communicating a bit more of information about how the proxy
|
|
operates. It is a pure function, therefore making it effectively constant as
|
|
it cannot return a different value depending on state changes.
|
|
|
|
- **Forwarding proxy** (`id = 1`): The proxy will always forward to the same code
|
|
address. The following invariant should always be true: once the proxy returns
|
|
a non-zero code address, that code address should never change.
|
|
|
|
- **Upgradeable proxy** (`id = 2`): The proxy code address can be changed depending
|
|
on some arbitrary logic implemented either at the proxy level or in its forwarded
|
|
logic.
|
|
|
|
## Benefits
|
|
|
|
- **Source code verification**: right now when checking the code of a proxy in explorers
|
|
like Etherscan, it just shows the code in the proxy itself but not the actual
|
|
code of the contract. By standardizing this construct, they will be able to show
|
|
both the actual ABI and code for the contract.
|
|
|
|
## Copyright
|
|
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
|