Cara Membuat CET Staking di Blockchain Coinex Smart Chain – Part 1


Pada umumnya Staking adalah proses memvalidasi jaringan sebuah blockchain dan validator akan mendapatkan reward berupa coin native dari blockchain tersebut. Bisanya untuk melakukan staking kita perlu mengunci sejumlah coin (contohnya CET) dalam sebuah wallet dan wallet tersebut berada pada sebuah server (validator), validator mempunyai kemampuan untuk mengkonfirmasi transaksi pada jaringan blockchain dan mendapatkan reward tiap block yang di selesaikan.

Siapapun dapat menjadi validator atau melakukan staking di jaringan blockchain coinex smart chain, tentunya harus menyiapkan server dengan spesifikasi yang tinggi dan mengunci sejumlah coin CET di wallet validator. Contoh pada jaringan ethereum 2.0, untuk melakukan staking membutuhkan 32 coin ETH, jika di jaringan coinex smart chain, membutuhkan 10.000 coin CET. Setiap blockchain mempunyai persyaratan yang berbeda-beda tergantung dari konsensus atau ketentuan dari developer blockchain itu sendiri.

Tujuan staking adalah untuk mengamankan jaringan Coinex smart chain dari serangan dan agar lebih terdesentralisasi. Tetapi ada juga staking yang menggunakan smart contract, contohnya staking di beberapa platform defi. User bisa mengunci token tertentu di pool (smart coontract) staking dan mereka akan mendapatkan reward berupa token. Ada yang menggunakan smart contract staking untuk mendapatkan sebuah tiket IDO atau whitelist IDO, contoh di beberapa plaform launchpad solana.

Di artikel ini saya akan memberikan tutorial cara membuat dapps staking untuk coin native coinex smart chain, yaitu CET. Staking ini tidak mempunyai fitur reward atau farming, ini lebih cocok untuk metode “Staking untuk whitelist IDO” atau staking untuk ticket IDO yang biasanya dilakukan oleh beberapa platform launchpad. Yang akan saya ajarkan adalah staking menggunakan smart contract di blockchain coinex smart chain. Mengapa saya memilih blockchain coinex smart chain ?

  • Coinex smart chain lebih ramah lingkungan , karena menggunakan protokol PoS (Proof of Stake)
  • Coinex smart chain mempunyai performa tinggi, untuk memvalidasi 1 transaksi hanya membutuhkan 3-5 detik saja, berbeda dengan blockchain lain yang membutuhkan 30 detik hingga 60 menit
  • High TPS, coinex smart chain mampu menampung lebih dari 600 transaksi per detik
  • Support EVM, ini yang paling saya suka, kita bisa menerapkan code (smart contrac) yang sama dengan ethereum di blockchain coinex smart chain
Apa Yang Perlu Dipersiapkan ?

Ada beberapa hal yang perlu anda persiapkan untuk membuat Cet Staking di Coinex Smart Chain.

1# EVM Wallet (Metamask)

Wallet untuk blockchain coinex smart chain anda bisa menggunakan metamask, saya anjurkan menggunakan metamask versi browser, karna lebih mudah dalam penggunaan. Anda perlu mengganti atau setting rpc metamask ke rpc coinex, seperti ini

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

 

2# Coin CET (Coin Native Coinex Smart Chain)

CET merupakan coin native dari blockchain coinex smart chain, yang artinya adalah semua fee transaksi di dalam blockchain tersebut di bayar menggunakan coin CET, contoh jika anda mengirim token, swap atau trading, anda memerlukan coin CET untuk membayar gas fee. Untuk 1 kali transaksi di coinex sangat murah, tidak lebih dri $0.005. Untuk mendapatkan coin CET anda bisa membelinya di Coinex Exchange. Coin CET saat ini bernilai $0.033 per coin, anda bisa melihat grafik dan history coin cet di coingecko atau coinmarketcap.

 

3# Staking CET Smart Contract

Ini adalah smart contract Staking CET, dengan smart contract ini kita bisa membuat platform staking untuk coin cet,

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract CetStaking is ReentrancyGuard, Ownable {

uint256 public UNSTAKEABLE_FEE = 9990; // How much can they Unstake? 99.9% AKA 0.1% Staking FEE
uint256 public MINIMUM_CONTRIBUTION_AMOUNT = 0.05 ether; // Minimum Amount to Stake
bool public CONTRACT_RENOUNCED = false; // for ownerOnly Functions
string private constant NEVER_CONTRIBUTED_ERROR = "This address has never contributed CET to the protocol";
string private constant NO_ETH_CONTRIBUTIONS_ERROR = "No CET Contributions";
string private constant MINIMUM_CONTRIBUTION_ERROR = "Contributions must be over the minimum contribution amount";

struct Staker {
address addr; // The Address of the Staker
uint256 lifetime_contribution; // The Total Lifetime Contribution of the Staker
uint256 contribution; // The Current Contribution of the Staker
uint256 yield; // The Current Yield / Reward amount of the Staker
uint256 unstakeable; // How much can the staker withdraw.
uint256 joined; // When did the Staker start staking
bool exists;
}

mapping(address => Staker) public stakers;
address[] public stakerList;

constructor() ReentrancyGuard() {

}

receive() external payable {}
fallback() external payable {}
function SweepETH() external onlyOwner {
uint256 a = address(this).balance;
}

function AddStakerYield(address addr, uint256 a) private {
stakers[addr].yield = stakers[addr].yield + a;
}

function RemoveStakerYield(address addr, uint256 a) private {
stakers[addr].yield = stakers[addr].yield - a;
}

function RenounceContract() external onlyOwner {
CONTRACT_RENOUNCED = true;
}

function ChangeMinimumStakingAmount(uint256 a) external onlyOwner {
MINIMUM_CONTRIBUTION_AMOUNT = a;
}

function ChangeUnstakeableFee(uint256 a) external onlyOwner {
UNSTAKEABLE_FEE = a;
}

function UnstakeAll() external onlyOwner {
if(CONTRACT_RENOUNCED == true){revert("Unable to perform this action");}
for (uint i = 0; i < stakerList.length; i++) {
address user = stakerList[i];
ForceRemoveStake(user);
}
}

function Stake() external nonReentrant payable {
require(msg.value >= MINIMUM_CONTRIBUTION_AMOUNT, MINIMUM_CONTRIBUTION_ERROR);
uint256 bnb = msg.value;
uint256 unstakeable = (bnb * UNSTAKEABLE_FEE) / 10000;

if(StakerExists(msg.sender)){
stakers[msg.sender].lifetime_contribution = stakers[msg.sender].lifetime_contribution + bnb;
stakers[msg.sender].contribution = stakers[msg.sender].contribution + unstakeable;
stakers[msg.sender].unstakeable = stakers[msg.sender].unstakeable + unstakeable;
}else{
// Create new user
Staker memory user;
user.addr = msg.sender;
user.contribution = unstakeable;
user.lifetime_contribution = bnb;
user.yield = 0;
user.exists = true;
user.unstakeable = unstakeable;
user.joined = block.timestamp;
// Add user to Stakers
stakers[msg.sender] = user;
stakerList.push(msg.sender);
}

// Staking has completed (or failed and won't reach this point)
uint256 c = (10000 - UNSTAKEABLE_FEE);
uint256 fee = (bnb * c) / 10000;
}

function RemoveStake() external {
address user = msg.sender;
if(!StakerExists(user)){ revert(NEVER_CONTRIBUTED_ERROR); }
uint256 uns = stakers[user].unstakeable;
if(uns == 0){ revert("This user has nothing to withdraw from the protocol"); }
// Proceed to Unstake user funds from 3rd Party Yielding Farms etc

// Remove Stake
stakers[user].unstakeable = 0;
stakers[user].contribution = 0;
payable(user).transfer(uns);
}

function ForceRemoveStake(address user) private {
// withdraw avAVAX for WAVAX and Unwrap WAVAX for AVAX
if(!StakerExists(user)){ revert(NEVER_CONTRIBUTED_ERROR); }
uint256 uns = stakers[user].unstakeable;
if(uns == 0){ revert("This user has nothing to withdraw from the protocol"); }
// Proceed to Unstake user funds from 3rd Party Yielding Farms etc

// Remove Stake
stakers[user].unstakeable = 0;
stakers[user].contribution = 0;
payable(user).transfer(uns);
}

/*
CONTRIBUTER GETTERS
*/

function StakerExists(address a) public view returns(bool){
return stakers[a].exists;
}

function StakerCount() public view returns(uint256){
return stakerList.length;
}

function GetStakeJoinDate(address a) public view returns(uint256){
if(!StakerExists(a)){revert(NEVER_CONTRIBUTED_ERROR);}
return stakers[a].joined;
}

function GetStakerYield(address a) public view returns(uint256){
if(!StakerExists(a)){revert(NEVER_CONTRIBUTED_ERROR);}
return stakers[a].yield;
}

function GetStakingAmount(address a) public view returns (uint256){
if(!StakerExists(a)){revert(NEVER_CONTRIBUTED_ERROR);}
return stakers[a].contribution;
}

function GetStakerPercentageByAddress(address a) public view returns(uint256){
if(!StakerExists(a)){revert(NEVER_CONTRIBUTED_ERROR);}
uint256 c_total = 0;
for (uint i = 0; i < stakerList.length; i++) {
c_total = c_total + stakers[stakerList[i]].contribution;
}
if(c_total == 0){revert(NO_ETH_CONTRIBUTIONS_ERROR);}
return (stakers[a].contribution * 10000) / c_total;
}

function GetStakerUnstakeableAmount(address addr) public view returns(uint256) {
if(StakerExists(addr)){ return stakers[addr].unstakeable; }else{ return 0; }
}

function GetLifetimeContributionAmount(address a) public view returns (uint256){
if(!StakerExists(a)){revert("This address has never contributed DAI to the protocol");}
return stakers[a].lifetime_contribution;
}

function CheckContractRenounced() external view returns(bool){
return CONTRACT_RENOUNCED;
}

}

 

Cara Membuat CET Staking di Blockchain Coinex Smart Chain
1# Deploy Smart Contract CET Staking

Buka situs Remix IDE Coinex https://ide.coinex.net/ . situs ini sama seperti remix ethereum ide, digunakan untuk deploy atau interact dengan smart contract. Beberapa informasi di smart contract yang bisa anda ganti atau sesuaikan.

  • contract CetStaking = adalah nama smart contract terebut, anda bisa menggantinya sesuai dengan keinginan
  • uint256 public UNSTAKEABLE_FEE = adalah jumlah fee saat user melakukan UnStake
  • int256 public MINIMUM_CONTRIBUTION_AMOUNT = adalah jumlah minimal coin CET yang bisa distake, contoh minima 1 CET untuk melakukan staking

Cara Deploy Smart Contract

  • Buat file baru , contoh CetStaking.sol
  • Paste smartcontract di atas, dan lakukan compile smart contract sampai selesai
  • Setelah proses compile selesai, klik deploy smart contract tersebut dan lakukan konfirmasi di wallet metamask

 

2# Verifikasi Smart Contract CET Staking

Setelah proses deploy selesai, anda perlu melakukan verifikasi smart contract di explorer coinex smart chain, agar sumber code bisa di lihat oleh public, setelah smart contract terverifikasi, siapa saja bisa melihat code dan interact dengan smart contract tersebut melalui explorer coinex.

  • Aktifkan plugin flattener remix ide coinex
  • Flat file smart contract staking, save file tersebut dan lakukan compile ulang
  • Masuk ke smart contract staking di explorer coinex smart chain, klik “Contract Info”
  • Klik “Verify & Publish” dan isi semua informasi yang butuhkan + masukan code smart contract dari file yang sudah di flat


Alif Fahmi

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