Master Contract Token (MCT)
A utility token for the Neo Smart Economy
- NEP-5 compatible
- Directly tradable by smart contracts without off-chain code
- Ability to pass additional parameters along with a token transfer to a smart contract
- Offers "staked storage" to contracts holding a minimum amount of MCT
The NEO Smart Economy has a major limitation in that although smart contracts can receive funds (system assets like NEO or GAS) they cannot send funds without intervention of off-chain code that responds to events emitted by the smart contract and creates and broadcasts new transactions.
The introduction of NEP-7 in Neo 2.7.5 has eased some of the difficulties with receiving system assets by a smart contract. Now a contract will be able to be triggered upon receiving NEO/GAS, giving the contract the opportunity to perform actions or reject the transfer. The problem of the inability to send NEO/GAS in a single operation still remains, however.
Current NEP-5 tokens have more limitations than system assets:
- The smart contract will receive no notification that the tokens were sent
- The smart contract will not be able to spend tokens it holds without coordination from an off-chain wallet holding the owner's key
A change is needed to foster automated exchange of value between smart contracts and users. As a result of this need, we have created the Master Contract Token (MCT).
MCT is a NEP-5-compatible token implementation with some additional features. The most notable being the ability for third-party smart contracts to send, receive, and hold it.
Implementation by third-party smart contracts
Receiving MCT tokens via smart contract:
- The existing NEP-5
transferimplementation in MCT is modified so that the scripthash of the recipient of the transfer is checked against all deployed smart contracts on the blockchain.
- If the scripthash belongs to a smart contract (determined by
GetContract(scripthash)NEO API call), the
transferimplementation dynamically invokes the
OnTokenTransferoperation in that contract.
OnTokenTransferoperation informs the third-party smart contract that it has been delegated to receive a certain balance of MCT tokens.
OnTokenTransfercan be written to perform any function during its execution phase, and returns True if the token transfer should be finalized, False otherwise. In the case that a smart contract does not have support for receiving tokens, invoking the
onTokenTransferoperation should fail, also preventing the transfer from occurring and protecting against user error (e.g. pasting the wrong recipient scripthash/address).
- Depending on the return value from the third-party smart contract, the MCT NEP-5 implementation finalizes the transfer.
- Optionally, the invoker can overload the
transfercall with additional arguments over and above the required
amountfor the receiving contract's
OnTokenTransferoperation to use. This allows for more capability in the receiving contract's code with only minor changes to existing wallet software.
Sending MCT tokens from a smart contract:
- The third party smart contract invokes the
transferoperation of the MCT NEP-5 contract with its own scripthash as sender, along with the recipient scripthash and the amount to be transferred.
- The MCT NEP-5
transferimplementation detects that the transfer is coming from an address that corresponds to a known smart contract, and instead of using
CheckWitness(scripthash)to verify the owner of the funds, it verifies that the calling contract's scripthash matches the sender's.
Any future NEP-5 contracts could operate in the same manner with the above mentioned changes to the
Any third party contract that wishes to receive and hold these types of tokens merely needs to implement the
OnTokenTransfer functions as described above in their application (
Application trigger type) code.
Additionally, the third-party contract owner may want to add a function to transfer tokens to the owner's wallet on demand, once
CheckWitness has been used to verify the owner’s signature, if the tokens are ever to be redeemed for some other currency (in the case of an ICO that accepts MCT as payment, for example).
Third-party smart contracts that stake a minimum amount of MCT tokens are allowed to use the MCT smart contract as a storage proxy. The minimum starting stake is 10,000 (ten-thousand) MCT, and can be lowered by the contract owner over time if the value of MCT rises significantly. The minimum stake can never be raised, only lowered. Once the contract has staked tokens, as long as the current minimum stake is maintained, the proxy storage for that contract will work.
Storage keys are prefixed with the scripthash of the calling contract before all standard storage operations (
Delete). This ensures separation of data between different users of staked storage, however it reduces the maximum key length to 1000 bytes.
Using staked storage in the MCT contract means a smart contract author can deploy a contract requiring basic storage capabilities for 90 GAS instead of 490 GAS - a substantial savings.
Advanced features such as
Migrate are not implemented. If a smart contract needs these features, it is advisable to pay the 490 GAS for a storage-enabled contract rather than use staked storage.
An example contract for a dApp that uses MCT as its means of exchange of value as well as for storage can be found at mct-dapp-template.py - this contract could be deployed for only 90 GAS.
Two versions of MCT exist on the Neo TestNet, tokens CTX (scripthash 9aff1e08aea2048a26a3d2ddbb3df495b932b1e7) and CTY (scripthash 81d9cbc994dd104d3e03514b47eb23c6c406b2e7). CTX was airdropped to TestNet addresses holding TestNet NEP-5 tokens but additional tokens may be requested by developers looking to test their contracts against the TestNet tokens.
The MCT contract source is not yet publicly available, however, a custom-compiled version is available for the neo-privnet-docker environment, using the private key of the privnet owner wallet (address: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y, WIF: KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr) as the contract owner. Download mct-privnet.avm
Frequently Asked Questions
There will never be an MCT ICO, the MCT smart contract is the final product. An initial airdrop was used to distribute MCT into the ecosystem. There will be no further giveaways. Anyone pretending to be someone from the MCT team claiming they are giving away MCT at this point is fraudulent.
What were the airdrop rules?
Tokens were distributed to any Neo address that received a transfer of any existing NEP-5 token on the Neo MainNet before May 8, 2018 00:00:00 UTC (ending with MainNet block 2240482). 567,442,000 tokens were airdropped to 404,453 Neo addresses.
1,000 tokens were distributed for each third-party token held for some length of time, regardless of the amount.
For example, if a Neo address held only RPX, RHT and ONT (in any quantity) at any point before May 8, 2018, they would have received an airdrop of 3,000 MCT.
This airdrop distribution is designed to put MCT into the hands of the most active users participating in the NEP-5 token ecosystem rather than just the richest holders.
I have NEP-5 tokens in an exchange wallet, will I get the airdrop?
That is up to the exchange to add MCT and credit your account with the airdrop. With exchanges, the bottom line is - if you do not hold the private keys to a wallet, it is not really your wallet.
What is the distribution and supply of MCT?
580,000,000 tokens is the maximum supply of MCT and 100% of that has already been distributed. Approximately 98% of these were distributed to the community in the airdrop. The remaining ~2% of tokens were allocated to the smart contract owner (Splyse) to offset development and deployment costs and to provide ongoing support for users of the token.
Is there a website?
https://github.com/Splyse/MCT is the only official website. Beware of phishing pages offering tokens in exchange for private keys.
Is there a Discord/Telegram server?
There is a Discord server at https://discord.gg/vrA8tcq. There is no Telegram server or any other official support forum.
Twitter username @mcttoken is not us - we do not know who is behind this account although it is pretending to be the official Twitter feed of MCT. Beware of attempts to steal your private keys or funds by scammers promising to send you MCT - as we said - any such giveaways are bogus. The airdrop is over and there will be no further distributions from the team. The official MCT twitter account is https://twitter.com/MCT_Token