# Virtual miners (EVM)

### Specification

Token standard ERC-1155

Name and ticker Ermine Virtual Miner (EVM)

There are 12 categories of miners in total.

&#x20;8 categories (0-7) will be available for purchase at the start of sales.

4 categories (8-11) will be available after 180 days from the start of sales.

Each miner category has a name, a 3D animated graphic video loaded in IPFS, performance measured in IPS, emission and miner price.

<table data-header-hidden><thead><tr><th width="146"></th><th width="138"></th><th width="135"></th><th width="152"></th><th></th></tr></thead><tbody><tr><td>Category</td><td>Name</td><td>Performance, IPS</td><td>Total supply</td><td>Price, ETH</td></tr><tr><td>0</td><td>Bit</td><td>1</td><td>1,000,000</td><td>0.07</td></tr><tr><td>1</td><td>Byte</td><td>8</td><td>500,000</td><td>0.50</td></tr><tr><td>2</td><td>ECO</td><td>12</td><td>300,000</td><td>0.71</td></tr><tr><td>3</td><td>Lite</td><td>38</td><td>100,000</td><td>2.14</td></tr><tr><td>4</td><td>Master</td><td>64</td><td>50,000</td><td>3.56</td></tr><tr><td>5</td><td>Expert</td><td>132</td><td>20,000</td><td>7.14</td></tr><tr><td>6</td><td>PRO</td><td>198</td><td>10,000</td><td>10.57</td></tr><tr><td>7</td><td>PRO MAX</td><td>398</td><td>5,000</td><td>19.88</td></tr><tr><td>8</td><td>LE 50</td><td>50</td><td>50,000</td><td>2.71</td></tr><tr><td>9</td><td>LE 100</td><td>100</td><td>20,000</td><td>5.29</td></tr><tr><td>10</td><td>LE PRO 200</td><td>200</td><td>3,000</td><td>10.43</td></tr><tr><td>11</td><td>LE PRO MAX</td><td>500</td><td>1,000</td><td>24.86</td></tr></tbody></table>

### Ethereum from the sale of miners is distributed as a percentage

<figure><img src="/files/qhYEQydrAl1kyTlanViP" alt=""><figcaption><p>Distribution Ethereum</p></figcaption></figure>

### Contract address

<mark style="color:green;">**0xF07fF1a72E1F71B38F07eA278FB95Dc8eA029889**</mark>

### Contract on Etherscan

#### <https://etherscan.io/token/0xf07ff1a72e1f71b38f07ea278fb95dc8ea029889>

```solidity
// Some codesol
// SPDX-License-Identifier: MIT
// Ermine Virtual Miners (EVM) :: https://ermine.pro 

//  ███████╗██████╗$███╗$$$███╗██╗███╗$$$██╗███████╗██╗$$$██╗███╗$$$███╗
//  ██╔════╝██╔══██╗████╗$████║██║████╗$$██║██╔════╝██║$$$██║████╗$████║
//  █████╗$$██████╔╝██╔████╔██║██║██╔██╗$██║█████╗$$██║$$$██║██╔████╔██║
//  ██╔══╝$$██╔══██╗██║╚██╔╝██║██║██║╚██╗██║██╔══╝$$╚██╗$██╔╝██║╚██╔╝██║
//  ███████╗██║$$██║██║$╚═╝$██║██║██║$╚████║███████╗$╚████╔╝$██║$╚═╝$██║
//  ╚══════╝╚═╝$$╚═╝╚═╝$$$$$╚═╝╚═╝╚═╝$$╚═══╝╚══════╝$$╚═══╝$$╚═╝$$$$$╚═╝

pragma solidity ^0.8.17;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract ErmineVM is ERC1155Supply, Ownable  {
    uint[] public maxAmountEVM = new uint256[](12);
    uint[] public burnedEVM = new uint256[](12);
    uint256 public timeAddLE;
    address public addressErmineStore;
    bool VMpart1 = false;
    bool VMpart2 = false;
    string public name;
    string public symbol;  

event Burn(address indexed from, uint evm_id, uint256 amount);

struct Admin {
    bool sys;
}

mapping(address => Admin) public checkAdmin;

constructor(string memory _uri, string memory _name, string memory _symbol) ERC1155(_uri) {
    name = _name;
    symbol = _symbol;
    checkAdmin[msg.sender].sys = true;
    //Mint to the developers' wallet to distribute them to community members for fulfilling certain conditions (competitions)
    //100 miners with 1 IPS each
    _mint(msg.sender, 0, 100, "");
    //Setting the maximum number of EVMs for each category
    maxAmountEVM[0] = 1000000;
    maxAmountEVM[1] = 500000;
    maxAmountEVM[2] = 300000;
    maxAmountEVM[3] = 100000;
    maxAmountEVM[4] = 50000;
    maxAmountEVM[5] = 20000;
    maxAmountEVM[6] = 10000;
    maxAmountEVM[7] = 5000;
    maxAmountEVM[8] = 50000;
    maxAmountEVM[9] = 20000;
    maxAmountEVM[10] = 3000;
    maxAmountEVM[11] = 1000;
}

modifier onlyAdmin() {
    require(checkAdmin[msg.sender].sys);
    _;                              
} 

//EVM mint for Ermine store part 1
function mintEVMforStore() external onlyOwner {
require(addressErmineStore != address(0), "Ermine store address not specified! Set the store address and try again!");
require(!VMpart1, "Virtual miners have already been sent to the Ermine store. Can't be repeated!");
    VMpart1 = !VMpart1;
    _mint(addressErmineStore, 0, (maxAmountEVM[0] - 100), "");
    for (uint i = 1; i < 8; i++) {
    _mint(addressErmineStore, i, maxAmountEVM[i], "");
    //Setting the time to transfer VM LE to the Ermine store. VM LE release will be available in 181 days.
    timeAddLE = block.timestamp + 15638400;
    }
}

//EVM mint for Ermine store part 2. Available one time. The call is available to everyone.
function mintEVMLEforStore() external {
require(block.timestamp >= timeAddLE, "It is not yet possible to ship the EVM LE to the Ermine store. Less than 181 days have passed since the first shipment!");
require(VMpart1, "Release the EVM in the first batch first!");
require(!VMpart2, "Virtual miners have already been sent to the Ermine store. Can't be repeated!");
    VMpart2 = !VMpart2;
    for (uint i = 8; i < 12; i++) {
    _mint(addressErmineStore, i, maxAmountEVM[i], "");
    }
}

//Burning is available to everyone
function burnMyEVM(uint evm_id, uint256 amount) external { 
    require(balanceOf(msg.sender, evm_id) >= amount, "You don't have enough EVM to burn them!");
    _burn(msg.sender, evm_id, amount);
    burnedEVM[evm_id] += amount;
    emit Burn(msg.sender, evm_id, amount);
}

//Set Ermine store address (you can only set the store address once)
function setErmineStore(address _ErmineStore) external onlyOwner {
    require(addressErmineStore == address(0), "The address of the Ermine store is already set!");
    addressErmineStore = _ErmineStore;
    checkAdmin[addressErmineStore].sys = true;
}

//Set URI
function setURI(string memory newuri) public onlyAdmin {
    _setURI(newuri);
}

//Remove Admin Rights
function RemoveAdmin() public onlyAdmin {
    require(checkAdmin[msg.sender].sys, "You cannot relinquish admin rights as you are not an admin!");
    checkAdmin[msg.sender].sys = !checkAdmin[msg.sender].sys;
}

//View URI
function uri(uint256 _id) public view override returns (string memory) {
    require(exists(_id), "URI: nonexistent EVM token");
    return string(abi.encodePacked(super.uri(_id), Strings.toString(_id)));
}

}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ermine.pro/ermine.-virtual-mining./ecosystem-ermine/virtual-miners-evm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
