EIPs/EIPS/eip-1167.md

5.8 KiB

eip title author discussions-to status type category created
1167 Minimal Proxy Contract Peter Murray <@yarrumretep>, Nate Welsh <@flygoing>, Joe Messerman <@JAMesserman> https://github.com/optionality/clone-factory/issues/10 Draft Standards Track ERC 2018-06-22

Simple Summary

To simply and cheaply clone contract functionality in an immutable way, we propose to standardize on a minimal bytecode implementation which delegates all calls to a known, fixed address.

Abstract

By standardizing on a known minimal bytecode redirect implementation, this standard will allow users and third party tools (e.g. Etherscan) to (a) simply discover that a contract will always redirect in a known manner and (b) depend on the behavior of the code at the destination contract as the behavior of the redirecting contract. Specifically, tooling can interrogate the bytecode at a redirecting address to determine the location of the code that will run - and can depend on representations about that code (verified source, third-party audits, etc). We have an implementation we believe to be minimal and covering both standard calls and

Motivation

This standard is desireable to allow for use-cases wherein it is desireable to clone exact contract functionality with a minimum of side effects (e.g. memory slot stomping) and with super-cheap deployment of duplicate proxies.

Specification

The exact bytecode of the standard clone contract is this: 6000368180378080368173bebebebebebebebebebebebebebebebebebebebe5af43d82803e15602c573d90f35b3d90fd wherein the bytes at idices 10 - 29 (inclusive) are replaced with the 20 byte address of the master functionality contract. The reference implementation of this is found at the optionality/clone-factory github repo. There are variations as well for using vanity contract addresses with leading zeros to further shrink the necessary clone bytecode (thus making it cheaper to deploy). Detection of clone and redirection is implemented in the clone-factory repo with a contract deployed on both Kovan and Mainnet that detects the presence of a clone and returns the destination address if the interrogated contract is a clone (handles shortened addresses as well).

Rationale

The goals of this effort have been the following:

  • inexpensive deployment (low gas to deploy clones)
  • support clone initialization in creation transaction (through factory contract model)
  • simple clone bytecode to encourage directly bytecode interrogation (see CloneProbe.sol in the clone-factory project)
  • dependable, locked-down behavior - this is not designed to handle upgradability, nor should it as the representation we are seeking is stronger.
  • small operational overhead - adds a single call cost to each call
  • handles error return bubbling for revert messages

Backwards Compatibility

There are no backwards compatibility issues.

Test Cases

We have included some simple test cases in the clone-factory project that demonstrate the function of this contract including the error handling and error message propagation.

Implementation

Please see optionality/clone-factory

Copyright and related rights waived via CC0.