94 lines
4.5 KiB
Markdown
94 lines
4.5 KiB
Markdown
---
|
||
eip: 4950
|
||
title: Entangled Tokens
|
||
description: ERC-721 extension with two tokens minted that are tied together
|
||
author: Víctor Muñoz (@victormunoz), Josep Lluis de la Rosa (@peplluis7), Easy Innova (@easyinnova)
|
||
discussions-to: https://ethereum-magicians.org/t/entangled-tokens/8702
|
||
status: Draft
|
||
type: Standards Track
|
||
category: ERC
|
||
created: 2022-03-28
|
||
requires: 20, 721, 1155
|
||
---
|
||
|
||
## Abstract
|
||
|
||
This EIP defines an interface for delegating control of a smart contract wallet to pairs of users using entangled [ERC-721](./eip-721.md) non-fungible tokens.
|
||
|
||
## Motivation
|
||
|
||
The motivation is to provide an easy way to share a wallet through NFTs, so that the act of buying an NFT (in a marketplace) gives the buyer the privilege to have access to a given wallet. This wallet could have budget in many tokens, or even be the owner of other NFTs.
|
||
|
||
A use case is to keep contact between an artist and an buyer of its NFTs. If an artist T has created a digital piece of art P with an NFT, then T creates 2 entangled tokens A and B so that he keeps A and transfer B to P. By construction of entangled tokens, only one transfer is possible for them, thus the artist proofs he’s been the creator of P by sending a transaction to A that is visible from B. Otherwise, the owner of P might check the authenticity of the artist by sending a transaction to B so that the artist might proof by showing the outcome out of A.
|
||
|
||
A version of this use case is when one user U mints his piece of art directly in the form of an entangled token A; then the user U sells/transfers it while keeping the entangled token B in the U's wallet. The piece of art and the artists will be entangled whoever is the A's owner.
|
||
|
||
These applications of entangled tokens are envisaged to be useful for:
|
||
|
||
1. NFT authorship / art creation
|
||
2. Distribution of royalties by the creator.
|
||
3. Authenticity of a work of art: creation limited to the author (e.g. only 1000 copies if there are 1000 1000 entangled tokens in that NFT).
|
||
4. Usowners (users that consume an NFT also become -partial- owners of the NFT)
|
||
5. Reformulation of property rights: the one who owns the property receives it without having to follow in the footsteps of the owners.
|
||
6. Identity: Only those credentials that have an entangled token with you are related to you.
|
||
7. Vreservers (value-reservers).
|
||
|
||
## Specification
|
||
|
||
An entangled token contract implements [ERC-721](./eip-721.md) with the additional restriction that it only ever mints exactly two tokens at contract deployment: one with a `tokenId` of `0`, the other with a `tokenId` of `1`. The entangled token contract also implements a smart contract wallet that can be operated by the owners of those two tokens.
|
||
|
||
Also, a `tokenTransfer` function is to be be added in order to allow the token owners to transact with the [ERC-20](./eip-20.md) tokens owned by the contract/NFT itself. The function signature is as follows:
|
||
|
||
```solidity
|
||
function tokenTransfer(IERC20 token, address recipient, uint256 amount) public onlyOwners;
|
||
```
|
||
|
||
## Rationale
|
||
|
||
We decide to extend [ERC-721](./eip-721.md) ([ERC-1155](./eip-1155.md) could be also possible) because the main purpose of this is to be compatible with current marketplaces platforms. This entangled NFTs will be listed in a marketplace, and the user who buys it will have then the possibility to transact with the wallet properties (fungible and non fungible tokens).
|
||
|
||
## Backwards Compatibility
|
||
|
||
No backwards compatibility issues.
|
||
|
||
## Reference Implementation
|
||
|
||
Mint two tokens, and only two, at the contract constructor, and set the `minted` property to true:
|
||
|
||
```solidity
|
||
bool private _minted;
|
||
|
||
constructor(string memory name, string memory symbol, string memory base_uri) ERC721(name, symbol) {
|
||
baseUri = base_uri;
|
||
_mint(msg.sender,0);
|
||
_mint(msg.sender,1);
|
||
_minted = true;
|
||
}
|
||
|
||
function _mint(address to, uint256 tokenId) internal virtual override {
|
||
require(!_minted, "ERC4950: already minted");
|
||
super._mint(to, tokenId);
|
||
}
|
||
```
|
||
|
||
Add additional functions to allow both NFT user owners to operate with other ERC-20 tokens owned by the contract:
|
||
|
||
```solidity
|
||
modifier onlyOwners() {
|
||
require(balanceOf(msg.sender) > 0, "Caller does not own any of the tokens");
|
||
_;
|
||
}
|
||
|
||
function tokenTransfer(IERC20 token, address recipient, uint256 amount) public onlyOwners {
|
||
token.transfer(recipient, amount);
|
||
}
|
||
```
|
||
|
||
## Security Considerations
|
||
|
||
There are no security considerations.
|
||
|
||
## Copyright
|
||
|
||
Copyright and related rights waived via [CC0](../LICENSE.md).
|