Simple Token Farming Contract
#pragma once
#include <eosiolib/asset.hpp>
#include <eosiolib/eosio.hpp>
#include <eosiolib/singleton.hpp>
#include <eosiolib/transaction.hpp>
#define COBAADMIN "cobafinances" //account smart contract
#define COBASTAKE "cobstakepool" //account stake pool
#define COBADRAW "cobdrawpools" //account reward
#define CBPTOKEN "cbptvextoken" //account token CBP
#define CPPTTOKEN "cobapointvex" //account token CPPT stake
#define VEXTOKEN "vex.token" //account token VEX stake
#define CBP_SYMBOL eosio::symbol("CBP", 8) //CBP decimal 8
#define CPPT_SYMBOL eosio::symbol("CPPT", 5) //CPPT decimal 5
#define VEX_SYMBOL eosio::symbol("VEX", 4) //VEX decimal 4
#define NO_TIME 2000000000
#define SECONDS_THREE_DAY 259200
#define MIN_STAKE_CPPT 1000000 //100 CPPT decimal 4
#define MAX_STAKE_CPPT eosio::asset(40000000000000000, CPPT_SYMBOL)
#define MIN_STAKE_VEX 1000 //0.1 VEX
#define MAX_STAKE_VEX eosio::asset(40000000000000000, VEX_SYMBOL)
#define MAX_UNSTAKE_CPPT 100000000 //10K
#define MAX_UNSTAKE_VEX 100000000 //10K
// aspt => cbp
// aptt => cppt
#define CBP_VEX_STAGE_MINING eosio::asset(30000000000000, CBP_SYMBOL)
//250ribu decimal 8 token CBP
using eosio::extended_asset;
using namespace eosio;
static constexpr int64_t max_amount = 10000000000000000;
namespace vexdt {
class [[eosio::contract]] examplefarm :public eosio::contract {
public:
examplefarm(eosio::name receiver, eosio::name code, eosio::datastream<const char *> ds) :
eosio::contract(receiver, code, ds),
_global(eosio::name(COBAADMIN), eosio::name(COBAADMIN).value),
_users(eosio::name(COBAADMIN), eosio::name(COBAADMIN).value){
}
//更新抵押
ACTION doissue(const uint64_t &idfrom, const uint64_t &idto);
ACTION init();
ACTION setstop(const uint8_t &state);
ACTION claim(const eosio::name &from, const std::string &pooltype);
ACTION exit(const eosio::name &from, const std::string &pooltype);
bool iscppttoken(const eosio::extended_asset &quantity)
{
if ((quantity.contract == eosio::name(CPPTTOKEN)) && (quantity.quantity.symbol == CPPT_SYMBOL))
{
return true;
}
return false;
}
bool isvextoken(const eosio::extended_asset &quantity)
{
if ((quantity.contract == eosio::name(VEXTOKEN)) && (quantity.quantity.symbol == VEX_SYMBOL))
{
return true;
}
return false;
}
void apply(eosio::name code, eosio::name action);
void stake(const eosio::name &from,
const eosio::asset &quantity);
void onTransfer(const eosio::name &from,
const eosio::name &to,
const eosio::extended_asset &quantity,
const std::string &memo);
TABLE global {
uint8_t initState;
uint8_t stopState;
uint64_t checkfromid;
uint64_t maxstakeid;
uint64_t check_update_time_doissue;
eosio::asset all_pool_reward;//单倍池奖励
eosio::asset total_staked_cppt;
eosio::asset total_staked_vex;
eosio::asset cbp_pool_reward;
eosio::asset cbp_pool_day_reward;
eosio::asset vex_pool_reward;
eosio::asset vex_pool_day_reward;
eosio::asset total_mininged_cbp_vex;
};
typedef eosio::singleton<"global"_n, global> global_table;
TABLE st_user {
uint64_t id = 0;
eosio::name holder;
eosio::asset cppt_stake;
eosio::asset vex_stake;
uint64_t cppt_update_time;
uint64_t vex_update_time;
uint8_t everymonth = 0;
eosio::asset cppt_bonus;
eosio::asset vex_bonus;
uint64_t primary_key() const { return id; }
uint64_t by_holder() const { return holder.value; }
};
typedef eosio::multi_index<"user"_n, st_user,
eosio::indexed_by<"holder"_n, eosio::const_mem_fun<st_user, uint64_t, &st_user::by_holder>>
> user_table;
global_table _global;
user_table _users;
ACTION test()
{
require_auth(eosio::name(COBAADMIN));
_global.remove( );
auto itr = _users.begin();
while(itr != _users.end()){
itr = _users.erase(itr);
}
}
};
struct st_transfer
{
eosio::name from;
eosio::name to;
eosio::asset quantity;
std::string memo;
};
void examplefarm::apply(eosio::name code, eosio::name action)
{
auto &thiscontract = *this;
if (action == eosio::name("transfer") && (code == eosio::name(CPPTTOKEN) || code == eosio::name(VEXTOKEN)) )
{
auto transfer_data = eosio::unpack_action_data<st_transfer>();
onTransfer(transfer_data.from, transfer_data.to, eosio::extended_asset(transfer_data.quantity, code), transfer_data.memo);
return;
}
if (code != eosio::name(COBAADMIN))
return;
if( code == eosio::name(COBAADMIN) ) {
switch(action.value) {
case eosio::name("init").value:
execute_action(eosio::name(COBAADMIN), eosio::name(code), &examplefarm::init);
break;
case eosio::name("setstop").value:
execute_action(eosio::name(COBAADMIN), eosio::name(code), &examplefarm::setstop);
break;
case eosio::name("test").value:
execute_action(eosio::name(COBAADMIN), eosio::name(code), &examplefarm::test);
break;
case eosio::name("doissue").value:
execute_action(eosio::name(COBAADMIN), eosio::name(code), &examplefarm::doissue);
break;
case eosio::name("claim").value:
execute_action(eosio::name(COBAADMIN), eosio::name(code), &examplefarm::claim);
break;
case eosio::name("exit").value:
execute_action(eosio::name(COBAADMIN), eosio::name(code), &examplefarm::exit);
break;
}
}
}
extern "C"
{
[[noreturn]] void apply(uint64_t receiver, uint64_t code, uint64_t action) {
eosio::datastream<const char*> ds( nullptr, 0 );
examplefarm p(eosio::name(receiver), eosio::name(code), ds);
p.apply(eosio::name(code), eosio::name(action));
eosio_exit(0);
}
}
} /// namespace eosio
```Last updated