eip | title | author | discussions-to | status | type | category | created |
---|---|---|---|---|---|---|---|
725 |
Proxy Account |
Fabian Vogelsteller (@frozeman), Tyler Yasaka (@tyleryasaka) |
Draft |
Standards Track |
ERC |
2017-10-02 |
A standard interface for a simple proxy account.
The following describes standard functions for a unique identifiable proxy account to be used by humans, groups, organisations, objects and machines. The proxy has 2 abilities: (1) it can execute arbitrary contract calls, and (2) it can hold arbitrary data through a generic key/value store. One of these keys should hold the owner of the contract. The owner may be an address or a key manager contract for more complex management logic. Most importantly, this contract should be the reference point for a long-lasting identifiable profiles.
Standardizing a minimal interface for an proxy account allows third parties to interact with various proxy accounts contracts in a consistent manner. the benefit is a persistent account that is independed from single keys and can attach an arbitrary amount of information to verifiy, or enhance the accounts purpose.
Returns the data at the specified key.
function getData(bytes32 _key) external view returns (bytes32 _value);
Sets the data at a specific key.
Triggers Event: DataChanged
function setData(bytes32 _key, bytes32 _value) external;
Executes an action on other contracts or a transfer of the EVM chains native cryptocurrency. MUST only be called by the current owner of the contract.
function execute(uint256 _operationType, address _to, uint256 _value, bytes _data) external;
The operationType
should represent the assembly operation as follows:
0
forcall
1
fordelegatecall
2
forcreate
Others may be added in the future. Inspired by ERC1077 and Gnosis
MUST be triggered when setData
was successfully called.
event DataChanged(bytes32 indexed key, bytes32 indexed value);
MUST be triggered when execute
creates a new contract using the _operationType
2
.
event ContractCreated(address indexed contractAddress);
key: 0x0000000000000000000000000000000000000000000000000000000000000000
value: left padded address, e.g. 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe
The proxy account contract should have exactly one owner.
This owner should be the only msg.sender
that is allowed to call execute
or setData
.
The owner address sits at key 0x0000000000000000000000000000000000000000000000000000000000000000
.
The value of this key is the owner address left padded to 32bytes, like 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe
. Transferring the ownership can be done by having the current owner call setData
for key 0x00...
.
Data keys, should be the keccak256 hash of a type name.
Exception is key 0x00...
, which must be the owner.
If there is a need for numbering multiple versions of a key, bytes can be removed from the hash of the name, in order to make room for the number. This method would allow the contracts themselves to read the name.
Multiple keys for the same key type must add a keyTypeName-1
at the end of the key type.
This would looks as follows for myNewKeyType
:
version 0 myNewKeyType
: 0xa94996022594f93c34a730df0ae89d1ecd69dff98c17d0387e69ce58346323a4
version 1 myNewKeyType-1
: 0xb6dace1ed14874742c4d1b8cd9b270305176f769e0ae22118a02c2db4e620f29
version 2 myNewKeyType-2
: 0x6cc96a01de588f4550e8c3a821aed065ae7897f8dfb61836c78c0389e499d9ed
...
Anyone that would like to standardize a new data key should make a pull request to update the table below.
Name | Description | Key | value |
---|---|---|---|
owner | The owner of the proxy account | 0x0000000000000000000000000000000000000000000000000000000000000000 | left padded owner address, e.g. 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe |
735 | The proxy accounts claim holder contract (per ERC735) | 0xb0f23aea7d77ce19f9393243a7b50a3bcaac893c7d68a5a309dea7cacf035fd0 | left padded address of the claim holder contract, e.g. 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe |
780 | The proxy accounts claim holder contract (per ERC735) | 0xdaf52dba5981246bcf8fd7c6b00dce587fdcf5e2a95b281eea95dcd1376afdcd | left padded address of the claim registry contract, e.g. 0x000000000000000000000000de0B295669a9FD93d5F28D9Ec85E40f4cb697BAe |
The purpose of an identity proxy is to allow an entity to exist as a first-class citizen in Ethereum, with the ability to execute arbitrary contract calls. At that same time the proxy account should be managed by an arbitrary simple or complex logic.
It also opens up the possibility of meta transactions, where a third party can send a transaction to the owner contract, that then verifies the execution permission based on a signed message.
It further allows any information to be attached to that proxy accounts which can be in the forms of claims via ERC735 or ERC780, or any arbitrary new systems and protocols.
This specification was chosen to allow the most flexibility and experimentation around verifiable manageable accounts.
pragma solidity ^0.5.4;
interface ERC725 {
event DataChanged(bytes32 indexed key, bytes32 indexed value);
event ContractCreated(address indexed contractAddress);
function getData(bytes32 _key) external view returns (bytes32 _value);
function setData(bytes32 _key, bytes32 _value) external;
function execute(uint256 _operationType, address _to, uint256 _value, bytes calldata _data) external;
}
Copyright and related rights waived via CC0.