# EVMs

# NFT Implementation

Although Soulbound tokens have been a popular point of discussion in the Ethereum community, the adoption of a standard has yet to fully take off.

For this reason we've used the most well known NFT standard (ERC721) and modified it to prevent transfers. You can see the source code for our EVM contracts here

# Expiry and Revoking

The most important addition we've made to the ERC721 standard is an expiry date for the NFT and the ability to revoke NFTs, making them invalid. Both of these fields are tracked on-chain, rather than in token metadata, which allows other smart contracts to know whether a certain NFT is valid.

For further information about the specific NFT associated with an address, including metadata, we also support ERC721Enumerable.

# Use of Proxy for Upgrades

We currently use a simple UUPSProxy for our smart contracts, allowing us to upgrade the contract.

# Deterministic Address

When deploying our smart contracts we use a CREATE2 deployer, which ensures we have a deterministic address. This way the address of our contracts on all chains remains the same.

# Metadata

The majority of metadata for EVM based chains will be stored off-chain, to reduce gas costs.

Using the ERC721 function tokenURI will return an IPFS URI to a JSON document with the metadata.

Here's an example of the JSON metadata stored in IPFS:

{
    "description": "An example of a non-transferable KYCDAO NFT",
    "image": "ipfs://QmRCe3McAC4i9Tc6A…cJLCAaM1uv5U8ZSxYUMexSp",
    "name": "KYCDAO NFT"
}