[BCS] 밤부 레퍼럴 관련 버그 테스트 with 소스


얼마전 판다 https://pandayield.com/ 에서 추천인 버그가 발생 하였고

늦은감이 있지만 밤부(대나무) 에서 버그를 한번 테스트 해봤습니다.

결과부터 이야기 하면 ... 안하는 것이 좋습니다. 왜냐 ? 수수료가 획득 금액보다 적기 때문입니다 ㅜ_ㅜ
( 위 표시된 것 이외에도 차감된 금액이 있어서 ... 시간대비 뭐 효율이 ;; )


소스 개요

nodejs 와 약간의 web3 지식만 있다면 손쉽게 구현 하실 수 있을 것 입니다. 물론 코린이를 위해 소스도 첨부하니 관심있는 분은 참조하시면 좋을 것 같습니다.

  • nodejs 설치 이후 아래 소스를 실행하면 주기적으로(15초 단위) harvest 를 수행 합니다. N 개 계정 작업처리 또한 가능

의존성 설치

$ npm install dateformat dotenv web3 @truffle/hdwallet-provider

abi 파일

  • 소스에서 BCS_ABI_PANDA 부분을 참조하여 파일을 해당 위치에 배치하면 된다.

.env 설정

아래를 참조하여 개인키를 .env 파일에 추가하면 된다. 소스 내부에 private key를 추가하는 것은 비추천, 나중에 혹시라도 git 등을 통해 소스 관리를 한다면 최악의 사태(private key 유출) 이 발생 할 수 있기 때문

BCS_WALLET_1=개인키64자리

관련 소스

////////////////////////////////////////////////////////////
//
//  load .env
//

require('dotenv').config();

////////////////////////////////////////////////////////////
//
//  load library
//
const Dateformat = require("dateformat");
const Web3 = require("web3");
const Provider = require("@truffle/hdwallet-provider");

////////////////////////////////////////////////////////////
//
//  const 
//

// binance chain
const BCS_CHAIN_URL = process.env.BCS_CHAIN_URL || 'https://bsc-dataseed1.binance.org:443';

// my private key list - 64 words
const BCS_WALLETS = [
    process.env.BCS_WALLET_1 || '1234123412341234123412341234123412341234123412341234123412341234',
];

// panda 
const BCS_CONTRACT_PANDA = process.env.BCS_CONTRACT_PANDA || '0xa56a4D090DE361000458F5f13073BD3107e47dF2';
const BCS_ABI_PANDA = require('./abi/BCS_ABI_PANDA.json'); // same json - https://api.bscscan.com/api?module=contract&action=getabi&address=0xa56a4d090de361000458f5f13073bd3107e47df2&format=raw
const BCS_METHOD_PANDA_LEAVE_STAKING = "leaveStaking";    // harvest

// gas 
const BCS_GAS_PRICE = 2e10;
const BCS_GAS_USE = 1e6;

const METHOD_SLEEP_SEC = 1000 * 15;

////////////////////////////////////////////////////////////
//
//  functions
//

/**
 * 프로바이더 정보 반환
 * @param {String} pk 개인키
 * @param {String} url 접속주소(메인넷)
 */
function getWeb3 (pk, url) {
    return new Web3(new Provider(pk, url));
}

/**
 * 컨트렉트 정보 반환
 * @param {String} provider - 프로바이더
 * @param {String} abi ABI 정보(JSON)
 * @param {String} contract 계약주소정보
 */
function getContract (web3, abi, contract) {
    return new web3.eth.Contract( abi, contract);
}

/**
 * 팬더 관련 정보를 반환한다
 * @param {String} wallets - 지갑 목록정보
 */
function getDataPanda(pks){
    let datas = [];
    for(let pk of pks){
        let web3 = getWeb3(pk, BCS_CHAIN_URL);
        datas.push( {
            contract : getContract(web3, BCS_ABI_PANDA, BCS_CONTRACT_PANDA),
            addr : web3.eth.accounts.currentProvider.addresses[0]
        } );
    }
    return datas;
}

/**
 * 현재 시간 정보를 반환한다
 */
function getNow(){
    return Dateformat(new Date(), '[yyyy-mm-dd HH:MM:ss] ');
}

/**
 * 전달받은 정보 기반으로 계약을 호출한다
 * @param {String} datas 계약 정보 및 호출 주소 정보
 */
function callContracts(datas){
    let receivedCount = 0;

    // 재호출 처리, 성고을 하던 실패를 하던 동일함
    let _recall = () => {
        receivedCount++;
        if(receivedCount == datas.length){
            console.log(getNow(), `It is called again ${METHOD_SLEEP_SEC/1000} secconds after all data has been transferred.`);
            setTimeout(function(){
                callContracts(datas);
            },METHOD_SLEEP_SEC);
        }
    };
    
    for(let data of datas ){
        console.log(getNow(), `call from : ${data.addr}`);
        data.contract.methods[BCS_METHOD_PANDA_LEAVE_STAKING](0)
            .send({from: data.addr,gasPrice: BCS_GAS_PRICE, gas: BCS_GAS_USE })
            .then(res=>{
                console.log(getNow(), `success from : ${data.addr}`);
                console.log(getNow(), `see more : https://bscscan.com/tx/${res.transactionHash}`);
                _recall();
            })
            .catch(err=>{
                console.log(getNow(), `error occured : ${data.addr}`, err);
                _recall();
            });
    }
}

////////////////////////////////////////////////////////////
//
//  entry point
//

/**
 * 진입점
 */
async function init(){

    // 지갑에서 계약 및 호출 주소 정보를 가져온다
    let datas = getDataPanda(BCS_WALLETS);
    
    // 계약을 호출한다
    callContracts(datas);
}
init();
Sort:  

케밥도 한번 분석 부탁드려용~^^

@wonsama transfered 1.0 KRWP to @krwp.burn. voting percent : 11.69%, voting power : 60.29%, steem power : 1948441.14, STU KRW : 1200.
@wonsama staking status : 822.929 KRWP
@wonsama limit for KRWP voting service : 1.645 KRWP (rate : 0.002)
What you sent : 1.0 KRWP [50894445 - 2b54ef9c96624e922324e1a0e62d40af548b237f]

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.034
BTC 63475.77
ETH 3117.23
USDT 1.00
SBD 3.94