[개발] 스팀 예상 보상금액 조회
[그림] 특정 계정의 현재 스팀파워와 보팅마나 및 100%로 보팅 시 예상 금액
보팅금액 환산
기본적으로 보팅금액은 포스팅 리워딩풀에 쌓인 금액을 스팀 파워에(리워드 쉐어 합계) 비례하여 나눠 갖는다고 생각하심 됩니다.
관련 소스코드
기본적으로 steemdnow.com 사이트 정보를 기반으로 작업해서 만들었네요 :)
해당 예상금액은 보팅하는 순간의 예상 금액이며, 리워드 풀에 참여자가 많아지면 물론 보상 수령 금액은 줄어들게 됩니다. ( 빵 하나를 한명이 아닌 두명 세명이 나눠 먹으면 그 양이 줄어드는 것과 유사하죠, 거기에 힘이 센(보팅파워) 사람이 더 많이 먹는 것이고여 )
// 해당 계정의 보팅 파워를 계산해 준다
const get_vp = (authors)=>{
const __MAX_VOTING_POWER = 10000;
const __CHARGE_PER_SEC = 60 * 60 * 24 * 5; // 432000, 1초당 충전되는 수치, *5는 하루 20% 1/5을 의미함
const __parse = (r) => {
let account = r.name;
let last = r.voting_power; //최근 투표일 기준 보팅파워 , 10000 is max
let gap = (new Date().getTime() - new Date(r.last_vote_time + "Z").getTime())/1000; // 최종 보팅한 이후 흐른 시간, 초
let vp = Math.min(__MAX_VOTING_POWER, parseInt(last + ( gap / __CHARGE_PER_SEC ) * __MAX_VOTING_POWER)); // 시간차를 적용한 현재 보팅파워 10000 is max
return {
account, last, gap, vp,
vesting_shares:parseFloat(r.vesting_shares.split(' ')[0]), // 내꺼
received_vesting_shares:parseFloat(r.received_vesting_shares.split(' ')[0]), // 임대 받은거
delegated_vesting_shares:parseFloat(r.delegated_vesting_shares.split(' ')[0]), // 임대 해준거
};
}
if(authors && !Array.isArray(authors)){
authors = [authors];
}
const is_one = authors.length==1?true:false;
return send_rpc('condenser_api.get_accounts',[authors],URL_STEEM)
.then(res=>{
if(is_one){
return Promise.resolve(res.result.map(r=>__parse(r))[0]);
}else{
return Promise.resolve(res.result.map(r=>__parse(r)));
}
});
}
// 해당 계정의 보팅 파워와 예상 금액을 조회
const get_vp_with_price = (author) =>{
return Promise.all([
get_vp(author),
steem.api.getRewardFundAsync('post'),
steem.api.getCurrentMedianHistoryPriceAsync(),
steem.api.getDynamicGlobalPropertiesAsync(),
]).then(res=>{
let _vp = res[0]; // vp.vp
let rf = res[1]; // rf.reward_balance, rf.recent_claims
let cmhp = res[2];
let dgp = res[3];
let reward_balance = parseFloat(rf.reward_balance.split(' ')[0]);
let recent_claims = parseInt(rf.recent_claims);
let base = parseFloat(cmhp.base.split(' ')[0]); // SBD
let quote = parseFloat(cmhp.quote.split(' ')[0]); // STEEM
let total_vesting_fund_steem = parseFloat(dgp.total_vesting_fund_steem.split(' ')[0]);
let total_vesting_shares = parseFloat(dgp.total_vesting_shares.split(' ')[0]);
let m = total_vesting_fund_steem / total_vesting_shares;
let p = reward_balance / recent_claims;
let l = base / quote; // steem price
let e = parseInt(steem.formatter.vestToSteem(
_vp.vesting_shares+_vp.received_vesting_shares-_vp.delegated_vesting_shares,
total_vesting_shares, total_vesting_fund_steem)); // steempower
let t = _vp.vp / 100; // votingpower
let a = 100; // voteweight
let n = e / m;
let r = parseInt(100 * t * (100 * a) / 1e4);
r = parseInt((r + 49) / 50);
let i = parseInt(n * r * 100);
let o = ((i + 2e12) * (i + 2e12) - 4e24) / (i + 8e12) * p * l;
return Promise.resolve({
sp:e,
vp:t,
steem_price_sbd:parseFloat(l.toFixed(2)),
exp_dollar:parseFloat(o.toFixed(4)),
});
})
}
맺음말
누군가에게 도움이 되길 바라면서 ...
sindoja.sct님이 wonsama님의 이 포스팅에 따봉(0.5 SCT)을 하였습니다.
그나저나 많은 유저가 하이브로 넘어갔는데 스팀 보상액은 늘어나지 않는 이유가 뭔가요? 파이 나눠 먹기 아니였나요?
스팀가격 하락 ( 리워드 풀 감소 ) 과 다른 강자(스파업 한 분들)의 등장이 균형? 을 맞추지 않았나 싶네요
그 누군가가 저일 것 같습니다 ㅎㅎ
포스팅 참조하서 소스 수정을 해야겠습니다. ^^
감사합니다!!
넹