Skip to content

Commit

Permalink
Merge fb2dc9d into b4ffd22
Browse files Browse the repository at this point in the history
  • Loading branch information
xinbenlv authored Jul 20, 2022
2 parents b4ffd22 + fb2dc9d commit 1d6a540
Showing 1 changed file with 74 additions and 0 deletions.
74 changes: 74 additions & 0 deletions EIPS/eip-ens-as-holder
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
eip: <to be assigned>
title: ENS as Token Holder
description: An interface for holding tokens by ENS.
author: Zainan Victor Zhou (@xinbenlv)
discussions-to: <URL>
status: Draft
type: Standards Track
category ERC
created: 2022-07-12
requires: 137
---

## Abstract
An interface for smart contract to become a holder of tokens by honoring ENS ownership.
This specification supports EIP-721 and EIP-1155 tokens and is expandable to future token standard or other standard.

## Motivation
Currently, if someone wants to receive token, they have to setup a wallet address, otherwise,
the minter or transferer will not be able to transfer or mint for that token.

By creating smart contract that conform to this interface specification, we can decouple
the transfer of ownership from the existance of wallet addresses.

## Specification

1. Any conforming smart contract must conform to `ERC721TokenReceiver` defined in [EIP-721](./eip-721.md) and `ERC1155TokenReceiver` defined in [EIP-1155](./eip-1155.md).

```solidity
interface IERC_ENS_AS_HOLDER is ERC721Receiver, ERC1155Receiver {
}
```

## Rationale
The rationale fleshes out the specification by describing what motivated the design and why particular design decisions were made. It should describe alternate designs that were considered and related work, e.g. how the feature is supported in other languages.

## Backwards Compatibility
No backward compatibility aware of.

## Reference Implementation
```solidity
contract ENSTokenHolding is ERC721TokenReceiver, Initializable {
address ENSRootRegistry _ensRoot;
mapping<address /* of ERC721 */ => tokenId=> string /* of owner*/)> _erc721TokenHolders;

function initializer(address ensRoot) {
_ensRoot = ensRoot;
}

function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4) {
_erc721TokenHolders[_operator][_tokenId] = "0x" + msg.sender.toString();

return /*bytes4 comply to ERC721 onReceived*/
}

function setOwner(address erc721, uint256 tokenId, string ens) {
require(msg.sender.toString == "0x" + _erc721TokenHolders[erc721][tokenId]);
_erc721TokenHolders[erc721][tokenId] = newOwnerENS;
}

function claim(address erc721, uint256 tokenId) {
require(msg.sender.toString == "0x" + _erc721TokenHolders[erc721][tokenId]
|| _ensRoot.reverseLookup() == /*stored ens*);
ERC721 contract = ERC721(erc721);
erc721.safeTransferFrom(this, msg.sender, tokenId);
);
}
```

## Security Considerations
All EIPs must contain a section that discusses the security implications/considerations relevant to the proposed change. Include information that might be important for security discussions, surfaces risks and can be used throughout the life cycle of the proposal. E.g. include security-relevant design decisions, concerns, important discussions, implementation-specific guidance and pitfalls, an outline of threats and risks and how they are being addressed. EIP submissions missing the "Security Considerations" section will be rejected. An EIP cannot proceed to status "Final" without a Security Considerations discussion deemed sufficient by the reviewers.

## Copyright
Copyright and related rights waived via [CC0](../LICENSE.md).

0 comments on commit 1d6a540

Please sign in to comment.