Simple Token Farming Contract

examplefarm.hpp
#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