mirror of
https://github.com/status-im/EIPs.git
synced 2025-02-04 11:03:42 +00:00
ERC DelegateProxy (#897)
* Add ERCProxy draft * Add missing links * Re-format EIP897 * ERC897: add reference to implementations
This commit is contained in:
parent
901ccdebb4
commit
cf2d76109c
73
EIPS/eip-897.md
Normal file
73
EIPS/eip-897.md
Normal file
@ -0,0 +1,73 @@
|
||||
---
|
||||
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/).
|
Loading…
x
Reference in New Issue
Block a user