-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add ERCProxy draft * Add missing links * Re-format EIP897 * ERC897: add reference to implementations
- Loading branch information
Showing
1 changed file
with
73 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
--- | ||
eip: 897 | ||
title: ERC DelegateProxy | ||
author: Jorge Izquierdo <[email protected]>, Manuel Araoz <[email protected]> | ||
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/). |