# Intro

This document contains information for those who use MOE ecosystem.

MOE is an experimental project that is in the development phase. The MOE project does not assume any responsibility for damages incurred as a result of this document. All sources are open, so please verify them directly.

<figure><img src="https://2101693585-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ftu3iqoyxjABaqDHNPIKF%2Fuploads%2FPracHzDLjczLY9wHF25y%2Flogo.png?alt=media&amp;token=3f138ca2-abba-4b99-a8ca-92ce9f8c3944" alt="" width="188"><figcaption><p>Wen MOE?</p></figcaption></figure>


# Specifications

* Type: ERC20
* Blockchain: Ethereum
* Name: MOE Token
* Symbol: MOE
* Decimals: 18
* CA: 0xcBa78d126f0B1FeDa0c538bcAf4C852A7a171099
* Audit: <https://dehacker.io/audit_reports_store/Onnano.pdf>
* Testnet CA(Sepolia): 0x2b1102952f98AeA0547373661765b427983d8592


# Read Contract

## allowance

{% tabs %}
{% tab title="parameters" %}

* owner(address)
* spender(address)
  {% endtab %}

{% tab title="returns" %}

* uint256
  {% endtab %}
  {% endtabs %}

## balanceOf

{% tabs %}
{% tab title="parameters" %}

* accout(address)
  {% endtab %}

{% tab title="returns" %}

* uint256
  {% endtab %}
  {% endtabs %}

## decimals

{% tabs %}
{% tab title="returns" %}

* uint8
  {% endtab %}
  {% endtabs %}

## name

{% tabs %}
{% tab title="returns" %}

* string
  {% endtab %}
  {% endtabs %}

## symbol

{% tabs %}
{% tab title="returns" %}

* string
  {% endtab %}
  {% endtabs %}

## totalSupply

{% tabs %}
{% tab title="returns" %}

* uint256
  {% endtab %}
  {% endtabs %}


# Write Contract

## approve

{% tabs %}
{% tab title="parameters" %}

* spender(address)
* amount(uint256)
  {% endtab %}
  {% endtabs %}

## decreaseAllowance

{% tabs %}
{% tab title="parameters" %}

* spender(address)
* subtractedValue(uint256)
  {% endtab %}
  {% endtabs %}

## increaseAllowance

{% tabs %}
{% tab title="parameters" %}

* spender(address)
* addedValue(uint256)
  {% endtab %}
  {% endtabs %}

## transfer

{% tabs %}
{% tab title="parameters" %}

* to(address)
* amount(uint256)
  {% endtab %}
  {% endtabs %}

## transferFrom

{% tabs %}
{% tab title="parameters" %}

* from(address)
* to(address)
* amount(uint256)
  {% endtab %}
  {% endtabs %}

##


# Burned Uniswap LP Token

MOE has been utilized to provide liquidity in the Uniswap pool, accounting for 90% of the total supply. The ownership of the Uniswap pool has been transferred to the zero address, ensuring that no one can profit from swaps.

Here is the proof.

<details>

<summary>Creating Uniswap v3 liquidity pool</summary>

* TXHash: 0x1795b92651d140aa248948cd6c6166ac8f5b184f55972c1bcd0915c6000b6024

</details>

<details>

<summary>Removing liquidity from the v3 pool to migrate to the Uniswap v2 liquidity pool</summary>

* TXHash: 0x4f4ac19fdf1d851117f69c868feb68d66ff68cf023eeb4d51710175b10b0ed4c

</details>

<details>

<summary>Supplying liquidity to Uniswap v2 pool</summary>

* TXHash: 0x7a250d5630b4cf539739df2c5dacb4c659f2488d
* There is a difference in the amount of ETH due to the Ethereum transaction fees incurred when withdrawing from the v3 pool and using them for opening the v2 pool.

</details>

<details>

<summary>Transferring LP tokens to the zero address to nullify ownership</summary>

* TXHash: 0x9c30b7ba711059a4c36f1bd81b73b1301aa61e4c5ea1db5e053106d614185e69

</details>


# CEX Listing Reserve

{% hint style="info" %}
If listed on Binance, the remaining balance after payment will be burned.&#x20;
{% endhint %}

90% of the tokens were sent to the Uniswap liquidity pool, LP tokens were burnt. The remaining 10% is being held in a cold wallet only to be used as tokens for future CEX listing.

<details>

<summary>The wallet is easily trackable with the ENS name “moecex.eth”</summary>

* ENS: moecex.eth
* Address: 0x96E02c01A3E717A6022A91426c89f2be3953E641

</details>

CEX liquidity provisionings are paid to the exchange according to the formula below.

$$
bonus=(totalremainingbonus)\*0.1
$$

If the remaining balance is 1B MOE, a payment of 0.1B MOE will be made.


# Specifications

* Type: ERC721
* Blockchain: Ethereum
* Name: MOE TRADING CARD
* Symbol: MOETC
* CA: 0xC65eE7960A99D739B277b8dBBF6a75eAAd5482bd
* Testnet CA(Sepolia): 0x83D6Bf47456d5BC474ceB8f39CDF95bEEf6Ed1cE


# Read Contract

## balanceOf

{% tabs %}
{% tab title="parameters" %}

* owner(address)
  {% endtab %}

{% tab title="returns" %}

* uint256
  {% endtab %}
  {% endtabs %}

## fee

This returns the amount of MOE required to mint an MOE Trading Card NFT.

{% tabs %}
{% tab title="returns" %}

* uint256
* It alwasy returns 10\*18(1 MOE)
  {% endtab %}
  {% endtabs %}

## getApproved

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* address
  {% endtab %}
  {% endtabs %}

## isApprovedForAll

{% tabs %}
{% tab title="parameters" %}

* owner(address)
* operator(address)
  {% endtab %}

{% tab title="returns" %}

* bool
  {% endtab %}
  {% endtabs %}

## moeErc20Address

This is the address of the linked MOE token.

{% tabs %}
{% tab title="returns" %}

* address
  {% endtab %}
  {% endtabs %}

## name

{% tabs %}
{% tab title="returns" %}

* string
* It always returns "MOE TRADING CARD"
  {% endtab %}
  {% endtabs %}

## nftInfo

This returns the custom data specific to the MOE Trading Card.

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* uri(string): JSON metadata uri
* originalCreator(string): original creator
* jsonId(bytes4): JSON ID
* isSecondaryCreation(bool): secondary creation
  {% endtab %}
  {% endtabs %}

## ownerOf

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* address
  {% endtab %}
  {% endtabs %}

## supportsInterface

{% tabs %}
{% tab title="parameters" %}

* interfaceId(bytes4)
  {% endtab %}

{% tab title="returns" %}

* bool
  {% endtab %}
  {% endtabs %}

## symbol

{% tabs %}
{% tab title="returns" %}

* string
* It always returns "MOETC"
  {% endtab %}
  {% endtabs %}

## tokenMoe

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* uint256
  {% endtab %}
  {% endtabs %}

## tokenIsOriginal

This function signifies whether the token has been issued by the copyright holder. However, this does not assure copyright verification. Users must verify the authenticity themselves through evidence in the metadata to confirm its originality.

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* bool
  {% endtab %}
  {% endtabs %}

## tokenIsSecondaryCreation

This returns the secondary creation status of the NFT with an given index of tokenId.

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* bool
  {% endtab %}
  {% endtabs %}

## tokenJsonId

This returns the jsonId of the NFT with an given index of tokenId.

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* bytes4
  {% endtab %}
  {% endtabs %}

## tokenOriginalCreator

This returns the origianl creator of the NFT with an given index of tokenId.

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* string
  {% endtab %}
  {% endtabs %}

## tokenURI

{% tabs %}
{% tab title="parameters" %}

* tokenId(uint256)
  {% endtab %}

{% tab title="returns" %}

* string
  {% endtab %}
  {% endtabs %}

This returns the total amount of MOE tokens used as NFT issuance fees.


# Write Contract

## addMoe

{% tabs %}
{% tab title="parameters" %}

* moe(uint256)
* tokenId(uint256)
  {% endtab %}
  {% endtabs %}

## approve

{% tabs %}
{% tab title="parameters" %}

* to(address)
* tokenId(uint256)
  {% endtab %}
  {% endtabs %}

## mint

{% hint style="info" %}
To facilitate fee payment, you need to 'approve' the use of MOE tokens in MOE Trading Card.
{% endhint %}

{% tabs %}
{% tab title="parameters" %}

* to(address)
* moe(uint256)
* uri(string)
* originalCreator(string)
* jsonId(bytes4)
* isOriginal(bool)
* isSecondaryCreation(bool)
  {% endtab %}
  {% endtabs %}

## removeMoe

{% tabs %}
{% tab title="parameters" %}

* moe(uint256)
* tokenId(uint256)
  {% endtab %}
  {% endtabs %}

## safeTransferFrom

safeTransferFrom without the 'data' parameter. Method ID is 0x42842e0e.

{% tabs %}
{% tab title="parameters" %}

* from(address)
* to(address)
* tokenId(uint256)
  {% endtab %}
  {% endtabs %}

## safeTransferFrom

safeTransferFrom with the 'data' parameter. Method ID is 0xb884fde

{% tabs %}
{% tab title="parameters" %}

* from(address)
* to(address)
* tokenId(uint256)
* data(bytes)
  {% endtab %}
  {% endtabs %}

## setApprovalForAll

{% tabs %}
{% tab title="parameters" %}

* operator(address)
* approved(bool)
  {% endtab %}
  {% endtabs %}

## transferFrom

{% tabs %}
{% tab title="parameters" %}

* from(address)
* to(address)
* tokenId(uint256)
  {% endtab %}
  {% endtabs %}


# jsonId

MOE NFT distinguishes various types of NFTs using JSON. Each NFT has a different JSON format depending on its form, and the JSON type is hashed to record it as a jsonId for each NFT.

This is similar to how Ethereum converts the function of a transaction into a hash and uses it in the form of a methodId.

The jsonId is of type bytes4, and if the same jsonId is used, it can be considered as the same type of NFT.

MOE provides several jsonId with JSON sets those are commonly used on onnano.co, which is recommended as a reference service. However, developers can create their own JSON structures and align the jsonId to use them in different services.

Of course, we cannot enforce the creation of jsonId in the manner we propose. However, in MOE NFT where various forms of NFT are issued, voluntarily adhering to this convention would be highly beneficial.

jsonId utilizes the first 4 bytes of the keccak256 hash of the JSON structure string, excluding whitespace.

```javascript
web3.sha3({JSON_STRUCTURE_STRING}).substring(0, 10);
```


# JSON Templates

{% hint style="info" %}
If you would like to register the jsonId standard in this document and notify others, please apply through <moe@onnano.co>.
{% endhint %}

MOE TCG NFT adheres to the standards set forth by OpenSea to ensure compatibility with other platforms.

## Character Database

This serves as the fundamental unit of the onnanoco Character Database, and in order to register in the onnanoco Character DB, one must adhere to this template protocol.

* jsonId : **0xd88f250c**

{% tabs %}
{% tab title="JSON structure" %}

```
{
    "name":string,
    "description":string,
    "image":string,
    "attributes":[
        {
            "trait_type":"profile_image",
            "value":string
        },
        {
            "trait_type":"type",
            "value":string
        },
        {
            "trait_type":"gender",
            "value":string
        },
        {
            "trait_type":"birthday",
            "value":string
        },
        {
            "trait_type":"birthyear",
            "value":integer
        },
        {
            "trait_type":"eye_color",
            "value":string
        },
        {
            "trait_type":"ear",
            "value":string
        },
        {
            "trait_type":"hair_color",
            "value":string
        },
        {
            "trait_type":"hair_style",
            "value":string
        },
        {
            "trait_type":"hair_length",
            "value":string
        },
        {
            "trait_type":"blood",
            "value":string
        },
        {
            "trait_type":"height",
            "value":fraction
        },
        {
            "trait_type":"weight",
            "value":fraction
        },
        {
            "trait_type":"bust",
            "value":integer
        },
        {
            "trait_type":"waist",
            "value":integer,
        },
        {
            "trait_type":"hip",
            "value":integer,
        }  
    ]
}
```

{% endtab %}

{% tab title="Sample" %}

{% endtab %}
{% endtabs %}

### name

* Enter the character's name in the language used in the original work.

### image

* use a square image
* displayable in a web browser
* width and height are not exceeding 1000px

### profile\_image

* use a square image
* displayable in a web browser
* width and height are not exceeding 200px

### type

* enter the character type in English

<table><thead><tr><th width="226.5">value</th><th>description</th></tr></thead><tbody><tr><td>human</td><td></td></tr><tr><td>android</td><td></td></tr><tr><td>angel</td><td></td></tr><tr><td>dark elf</td><td></td></tr><tr><td>dark human</td><td></td></tr><tr><td>demon</td><td></td></tr><tr><td>dragon</td><td></td></tr><tr><td>dwarf</td><td></td></tr><tr><td>elf</td><td></td></tr><tr><td>furry</td><td></td></tr><tr><td>goblin</td><td></td></tr><tr><td>god</td><td></td></tr><tr><td>orge</td><td></td></tr><tr><td>spirit</td><td></td></tr><tr><td>vampire</td><td></td></tr><tr><td>unknown</td><td>If it's not accurately disclosed, please enter it as unknown.</td></tr></tbody></table>

### gender

| value    | description |
| -------- | ----------- |
| female   |             |
| male     |             |
| neuter   |             |
| intersex |             |
| unknown  |             |

### birthday

* Enter the birthday without the year in the 'MM-DD' format.
* If the date of birth is not clear, please enter it as "00-00".


# Specifications

A smart contract for those brave enough to burn MOE tokens.

The most common method of burning tokens is by sending them to a Null Address. This method also allows us to determine which address the burning occurred from through transactions. However, we have created this contract for those who want to burn tokens in a more stylish way.

* Blockchain: Ethereum
* CA: 0x9D434a18eAAF1b249e0aa3fe1001ee349Fd4Fe17
* Testnet CA(Sepolia): 0x46c6cB09cA32e5187B4716783574C08ce25b375B


# Read Contract

## heroes

{% tabs %}
{% tab title="parameters" %}

* address
  {% endtab %}

{% tab title="returns" %}

{% endtab %}
{% endtabs %}

## totalBurn

{% tabs %}
{% tab title="returns" %}

* uint256
  {% endtab %}
  {% endtabs %}


# Write Contract

{% hint style="info" %}
To run this method, you need to 'approve' the use of MOE tokens .
{% endhint %}

## moeMoeKyun

{% tabs %}
{% tab title="parameters" %}

* message(string)
* amount(uint256)
  {% endtab %}
  {% endtabs %}

When executed, contract burns the entered amount . Additionally, it is possible to record message on the blockchain.


# Deprecated

| CA                                         | Amount                  |
| ------------------------------------------ | ----------------------- |
| 0x3F5d3BE4dE42995839A5582896A2F00d4e5dFf40 | 2190699137.48914884 MOE |


# MOE Public API

We provide an API to make it easier to use MOE.

* API endpoint: <https://api.onnano.co>

<mark style="color:blue;">`GET`</mark> `https://api.onnano.co/circulating_supply`

You can check the total issuance and circulation of MOE ERC-20 token.

{% tabs %}
{% tab title="200: OK Circulating sypply(Float)" %}

```
{
    "success":true,
    "total_supply":1000000000000,
    "circulating_supply":898958728322.8444
}
```

{% endtab %}
{% endtabs %}

<mark style="color:blue;">`GET`</mark> `https://api.onnano.co/max_supply`

{% tabs %}
{% tab title="200: OK Max supply(Float)" %}

{% endtab %}
{% endtabs %}

<mark style="color:blue;">`GET`</mark> `https://api.onnano.co/total_supply`

{% tabs %}
{% tab title="200: OK Total supply(Float)" %}

{% endtab %}
{% endtabs %}


# Specifications

No one is  governing MOE. However, there is a need to establish policies related to MOE. Therefore, we intend to address this through a decentralized MOE DAO.

* Bloakchain: Ethereum
* Wrapped MOE CA: 0x08C7Bf59353a42c143D014D95c8fcaa4cD9bc38D
* Timelock Controller CA: 0x38445186B6a93f262E4791219bD5e17EE760A9aF
* Governor CA: 0x37bb7Ac5aeD49C8bE56cABA39aad54f1e3D1dE9D
* Testnet Wrapped MOE CA(Sepolia): 0x9BB92c32Dfbd953b4D340532d06e1C5E9a86561B
* Testnet Timelock Controller CA(Sepolia): 0xa6877B3Ea26105e4A60c1B463a934Ef23D24d6c8
* Testnet Governor CA(Sepolia): 0xA05E8afD38AFbAb9702038E7B4a408FA43F127BE


# Wrapped MOE Token

The MOE token does not include functions such as minting or burning. Additionally, it is not upgradeable. This serves as a crucial mechanism to securely safeguard MOE and prevent any single entity from monopolizing it. However, for Governance purposes, a separately utilized Wrapped token is employed due to the need for additional functionalities.


# Timelock Controller


# Governor


# Tally


