Cara Membuat Staking Token CRC20 dengan Fitur Reward – Coinex Smart Chain


Staking crypto adalah metode mempertaruhkan coin atau token, dengan tujuan untuk mendapatkan reward atau pasif income, jika di dunia nyata adalah “bunga” dari uang yang kita simpan di bank. Tetapi staking berbeda dengan bunga bank, staking berjalan di blockchain, permision less dan siapa saja bisa berkontribusi di platform staking.

Dengan staking, memungkinkan anda untuk mendapatkan pasif income berupa token atau stable coin, yang bisa anda tarik kapan saja ke dompet crypto. Staking crypto biasanya memberikan pengembalian atau bunga yang besar, bahkan ada staking yang mempunyai bunga di atas 100%, hal ini adalah daya tarik yang membuat user mau melakukan staking. Semakin besar bunga maka akan semakin besar resikonya, dan juga sebaliknya, kita harus berhati hati dalam memilih platform staking agar tidak mengalami kerugian.

Diartikel ini kami akan memberikan edukasi, bagaimana cara membuat staking token crc20 dengan fitur reward. Nantinya anda bisa menggunakan dapps staking ini untuk mengembangkan project agar lebih berkembang.

Staking yang akan kita buat adalah : staking token crc20 ke smart contract, dan user akan mendapatkan hadiah token crc20 (jumlah hadiah sesuai dengan nilai reward di smart contract dan jumlah token yang di pertaruhkan)

Apa Saja yang Dibutuhkan ?
#1 Wallet

Coinex smart chain adalah blockchain yang support EVM, jadi anda bisa menggunakan wallet yang sama dengan ethereum, hanya perlu mengganti rpc network ke rpc coinex smart chain. Saya anjurkan anda menggunakan wallet EVM metamask (versi browser) karna pemakaian lebih mudah dan cepat.

RPC URL : https://rpc.coinex.net
Network Name : Coinex Smart Chain
ChainID : 52
Symbol : CET
Block Explorer : https://www.coinex.net

 

2# Coin Native CET (coinex smart chain)

CET adalah coin native dari blockchain coinex smart chain, coin cet digunakan untuk membayar semua transaksi seperti swap, send , deploy, dll . Untuk mendapatkan coin CET anda bisa membeli di Coinex Exchange, untuk saat ini satu coin CET berada di harga $0.048 . Jika anda sudah membeli coin CET segera kirim ke wallet yang akan digunakan untuk deploy

 

3# Smart Contract CRC20

Ini adalah code solidity smart contract untuk membuat token crc-20 coinex smart chain, saya menggunakan code dari openzepplin. Anda bisa mengganti detail “Nama Token”, “Symbol”,  “Jumlah Supply”

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MySakingToken1 is ERC20 {
    constructor() ERC20("MySakingToken1", "MTT1") {
        _mint(msg.sender, 1000000 * 10 ** decimals());
    }
}

 

4# Smart Contract Staking + Fitur Reward

Ini adalah code solidity untuk membuat fungsi staking + fitur reward di coinex smart chain, anda bisa mengganti beberapa fitur seperti nama contract, jumlah reward saat user melakukan staking

uint256 public constant REWARD_RATE = 10000000000000000;

Karna token menggunakan decimal 18, maka untuk 1 value token , anda harus menambahkan 18 angka 0. Token ini menggunakan sistem reward per detik.

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

error Staking__TransferFailed();
error Withdraw__TransferFailed();
error Staking__NeedsMoreThanZero();

contract Staking is ReentrancyGuard {
    IERC20 public s_stakingToken;
    IERC20 public s_rewardToken;

    uint256 public constant REWARD_RATE = 10000000000000000;
    uint256 public s_totalSupply;
    uint256 public s_rewardPerTokenStored;
    uint256 public s_lastUpdateTime;

    /** @dev Mapping from address to the amount the user has staked */
    mapping(address => uint256) public s_balances;

    /** @dev Mapping from address to the amount the user has been rewarded */
    mapping(address => uint256) public s_userRewardPerTokenPaid;

    /** @dev Mapping from address to the rewards claimable for user */
    mapping(address => uint256) public s_rewards;

    modifier updateReward(address account) {
        s_rewardPerTokenStored = rewardPerToken();
        s_lastUpdateTime = block.timestamp;
        s_rewards[account] = earned(account);
        s_userRewardPerTokenPaid[account] = s_rewardPerTokenStored;

        _;
    }

    modifier moreThanZero(uint256 amount) {
        if (amount == 0) {
            revert Staking__NeedsMoreThanZero();
        }
        _;
    }

    constructor(address stakingToken, address rewardToken) {
        s_stakingToken = IERC20(stakingToken);
        s_rewardToken = IERC20(rewardToken);
    }

    function earned(address account) public view returns (uint256) {
        uint256 currentBalance = s_balances[account];
        // how much they were paid already
        uint256 amountPaid = s_userRewardPerTokenPaid[account];
        uint256 currentRewardPerToken = rewardPerToken();
        uint256 pastRewards = s_rewards[account];
        uint256 _earned = ((currentBalance * (currentRewardPerToken - amountPaid)) / 1e18) +
            pastRewards;

        return _earned;
    }

    /** @dev Basis of how long it's been during the most recent snapshot/block */
    function rewardPerToken() public view returns (uint256) {
        if (s_totalSupply == 0) {
            return s_rewardPerTokenStored;
        } else {
            return
                s_rewardPerTokenStored +
                (((block.timestamp - s_lastUpdateTime) * REWARD_RATE * 1e18) / s_totalSupply);
        }
    }

    function stake(uint256 amount) external updateReward(msg.sender) moreThanZero(amount) {
        s_balances[msg.sender] += amount;
        s_totalSupply += amount;
        //emit event
        bool success = s_stakingToken.transferFrom(msg.sender, address(this), amount);
        // require(success, "Failed"); Save gas fees here
        if (!success) {
            revert Staking__TransferFailed();
        }
    }

    function withdraw(uint256 amount) external updateReward(msg.sender) moreThanZero(amount) {
        s_balances[msg.sender] -= amount;
        s_totalSupply -= amount;
        // emit event
        bool success = s_stakingToken.transfer(msg.sender, amount);
        if (!success) {
            revert Withdraw__TransferFailed();
        }
    }

    function claimReward() external updateReward(msg.sender) {
        uint256 reward = s_rewards[msg.sender];
        bool success = s_rewardToken.transfer(msg.sender, reward);
        if (!success) {
            revert Staking__TransferFailed();
        }

    }

    // Getter for UI
    function getStaked(address account) public view returns (uint256) {
        return s_balances[account];
    }
}

 

Cara Membuat Staking Token CRC20 + Fitur Reward
1# Deploy Smart Contract CRC20

Untuk membuat token crc20, anda harus deploy code solidity smart contract ke blockchain coinex smart chain, untuk melakukan deploy anda bisa menggunakan “remix ide”

  • Buka remix ide
  • Buat file baru
  • Paste code smart contract token crc20
  • Edit : token name, symbol, total supply
  • Pilih “Solidity Compiler” Compile code smart contract tersebut dengan versi compiler yang sesuai

  • Pilih “Deploy & Run Transaction” , di bagian Environment pilih wallet yang akan anda pakai
  • Deploy

2# Deploy Smart Contract Staking
  • Buka remix ide & Buat file baru
  • Paste code smart contract staking
  • Edit : nama contract, jumlah reward token per detik : contoh = uint256 public constant REWARD_RATE = 10000000000000000;
  • Pilih “Solidiy Compiler” Compile code smart contract tersebut
  • Pilih “Deploy & Run Transaction” , di bagian Environment pilih wallet yang akan anda pakai
  • Sebelum deploy anda harus memasukan smart contract token crc20
  • StakingToken = adalah token yang di staking di smart contract tersebut
  • RewardToken = adalah token reward, yang di berikan kepada staker, anda bisa menggunakan token yang sama dengan token staking atau menggunakan token yang berbeda
  • Deploy

 

3# Verifikasi Smart Contract

Agar user bisa interact dengan smart contract via explorer & code menjadi terbuka, anda harus verifikasi smart contract. Setelah terverifikasi, siapa saja bisa melihat code dari smart contract crc20 atau staking.

  • Di remixIDE pilih “Plugins” , search flattener, dan install plugin tersebut
  • Di menu flattener , flat file solidity
  • Save file tersebut , dan copy ke form verifikasi fi explorer

  • Masuk ke explorer coinex smart chain , masuk ke smart contract
  • Pilih “Contract Info”
  • Pilih “Verify & Publish”
  • Isi semua form yang dibutuhkan , harus sesuai dengan compiler di remix

 

4# Approve Address

Agar bisa melakukan staking, kita perlu approve address wallet dan smart contract staking ke smart contract crc20, jika ini tidak di lakukan, maka akan muncul failed ketika akan staking.

  • Masuk ke explorer coinex smart chain
  • Masuk ke smart contract crc20
  • Connect wallet anda
  • Pilih “Contract Info” , Pilih “Write Contract”
  • Pilih “Approve”
  • spender(address) = masukan alamat wallet anda / smart contract staking
  • amount(uint256) = masukan jumlah token , jangan lupa untuk menambahkan 18 angka 0
  • Klik “Write”

 

5# Kirim Token ke Address (Smart Contract Staking)

Anda perlu mengirim token ke address smart contract staking, token ini nantinya akan di alokasikan untuk reward staker.

 

5# Test Staking

Karna ini hanya smart contract dan belum mempunyai website, maka untuk melakukan staking anda harus interact dengan smart contract di explorer coinex smart chain.

  • Masuk ke Explorer coinex smart chain , masuk ke smart contract staking, Atau anda bisa interact di RemixIDE
  • Connect wallet anda, dan Pilih “write contract”

Cara Staking

  • Pilih “Stake” , masukan jumlah token yang akan anda staking (jangan lupa tambahkan 18 angka 0) , Klik write/transact .
  • Token di wallet anda akan otomatis terpotong (masuk ke smart contract staking)

Cara Claim Reward

  • Pilih “ClaimRewards”
  • Klik write/transact . setelah transaksi selesai anda akan menerima token reward

Cara UnStake

  • Pilih “Withdraw”
  • Masukan jumlah token yang akan anda Unstake, Klik Write/Transact
  • Setelah transaksi selesai, token yang anda stake akan kembali ke wallet

 

Kesimpulan

Smart contract ini bisa anda gunakan untuk project crypto anda, agar project anda lebih di sukai. dengan system staking , user akan lebih tertarik untuk membeli dan hold token, ini akan meningkatkan harga token. Jika anda mahir di pembuatan web reactjs, anda bisa gabungkan smart contract tersebut ke website, agar user bisa interact menggunakan website. Ini adalah edukasi , jika ada kesalahan , mohon di koreksi dan di kritik, terimakasih


Alif Fahmi

hi , I'm Alif, I'm a blockchain & cryptocurrency lover, I love writing & learning, my job is web developer & crypto trader