์ด์ Token์ ์๋ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ ํฌ์คํ
์ ํ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง๋ค๊ณ ๋์ ๋ณด๋ ํ์ฌ Pending Token์ด ์๋ Token๋ค์ ๋ณด์ฌ์ฃผ๊ณ ๋ฐ๋ก Claim์ ํ ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๊ทธ๋์ ๋ฐ๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ์์ต๋๋ค.
๋ง์ฝ ๊ฐ์ง๊ณ ์๋ Token ์ค์ Claim ํด์ผํ Pending Token์ด ์๋ค๋ฉด ๋นจ๊ฐ์์ผ๋ก ํ์ํ ํ
ํ์ฌ ๋ณด์ ์๋ + Pending Token ์
์ผ๋ก ํ์ํ๊ฒ๋ ๋ณ๊ฒฝํ์์ต๋๋ค.
1 ) ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์์ผ๋ก ํฌ๋ฉง์ผ๋ก Token์ ์๋์ด ํ์๋ฉ๋๋ค. ์คํ ์ดํน, ์๋๋ฅผ ์ฃผ๊ฑฐ๋ ๋ฐ์ ๊ฒ์ด ์์ผ๋ฉด ํ์ํ์ง ์๋๋ก ์์ค๋ฅผ ์์ ํ์์ต๋๋ค.
Token ์ด๋ฆ _ ํ์ฌ๋ณด์ ์๋ _ Pending ์๋(Claim ๊ฐ๋ฅ ์๋)
2 ) ์คํ ์ดํน์ด๋ ์๋์ฃผ๊ฑฐ๋ ๋ฐ์ ๊ฒ์ด ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ ๋ฉ๋๋ค.
Token ์ด๋ฆ _ ํ์ฌ๋ณด์ ์๋ _ Pending ์๋(Claim ๊ฐ๋ฅ ์๋) _ (์คํ ์ดํน์๋ _ + ์๋๋ฐ์ ์๋ _ - ์๋ ์ค ์๋)
Token์ pending ์๋์ ์๊ธฐ ์ํด Status ๊ฐ๊ณผ ์๋์ ๊ณ์ฐ์ ์ํด precision์ด ํ์ํ์ฌ info ๊ฐ์ ์ถ๊ฐ๋ก ์ ์ฅํ์์ต๋๋ค.
const account = urlParts[1];
const [
tokenBalances,
tokenUnstakes,
tokenStatuses,
transferHistory,
allTokenBalances,
allTokenInfo,
] = await Promise.all([
ssc.findOne('tokens', 'balances', {
account,
symbol: LIQUID_TOKEN_UPPERCASE,
}),
ssc.findOne('tokens', 'pendingUnstakes', {
account,
symbol: LIQUID_TOKEN_UPPERCASE,
}),
getScotAccountDataAsync(account),
getSteemEngineAccountHistoryAsync(account),
ssc.find('tokens', 'balances', {
account,
}),
getScotDataAsync('info', {}),
]);
if (tokenBalances) {
state.accounts[account].token_balances = tokenBalances;
}
if (tokenUnstakes) {
state.accounts[account].token_unstakes = tokenUnstakes;
}
if (tokenStatuses && tokenStatuses[LIQUID_TOKEN_UPPERCASE]) {
state.accounts[account].token_status = tokenStatuses[LIQUID_TOKEN_UPPERCASE];
state.accounts[account].all_token_status = tokenStatuses;
}
if (transferHistory) {
// Reverse to show recent activity first
state.accounts[
account
].transfer_history = transferHistory.reverse();
}
if (allTokenBalances) {
state.accounts[account].all_token_balances = allTokenBalances;
}
if(allTokenInfo){
state.accounts[account].all_token_info = allTokenInfo;
}
Token์ ํ์ํ๋ ๋ถ๋ถ์์ Pending Token ์ ๋ณด๋ฅผ ์ถ๊ฐํ์๊ณ ๋ฒํผ ํด๋ฆญ ์ Claim ๋๋๋ก ํจ์๋ฅผ ์ถ๊ฐํ์์ต๋๋ค.
if(account.has('all_token_balances'))
{
const allTokenBalances = account.get('all_token_balances').toJS();
const allTokenStatus = account.get('all_token_status');
const allTokenInfo = account.get('all_token_info');
// added by realmankwon (2019-06-18) sort by alphabet asc
allTokenBalances.sort(
(a, b) =>
a.symbol >
b.symbol
? 1
: -1
);
for (let v = 0; v < allTokenBalances.length; ++v) {
const tokenBalance = allTokenBalances[v];
// added by realmankwon (2019-06-18) except LIQUID_TOKEN_UPPERCASE
if(tokenBalance.symbol === LIQUID_TOKEN_UPPERCASE) continue;
const pendingToken = allTokenStatus.getIn([tokenBalance.symbol, 'pending_token']);
const tokenPrecision = allTokenInfo.getIn([tokenBalance.symbol, 'precision']);
let tokenReward = 0;
if(pendingToken && tokenPrecision ){
tokenReward = pendingToken / Math.pow(10, tokenPrecision);
}
const tokenFormattedStr =
<FormattedAssetToken
balance={tokenBalance.balance}
stake={tokenBalance.stake}
delegationsIn={tokenBalance.delegationsIn}
delegationsOut={tokenBalance.delegationsOut}
reward={tokenReward}
symbol={tokenBalance.symbol}
/>;
const tokenBalanceStr = isMyAccount && tokenReward > 0
? <span key={tokenBalance.symbol} onClick = {e => {
this.handleClaimTokenRewards(account, tokenBalance.symbol);
}}>
{tokenFormattedStr}
</span>
: <span key={tokenBalance.symbol} >
{tokenFormattedStr}
</span>;
all_token_balances_list.push(
tokenBalanceStr
);
}
์ด ๋ถ๋ถ์ด Claim์ ์ฒ๋ฆฌํ๋ ํจ์ ๋ถ๋ถ์ ๋๋ค.
handleClaimTokenRewards = (account, token) => {
this.props.claimTokenRewards(account, token);
};
claimTokenRewards: (account, token) => {
const username = account.get('name');
const successCallback = () => {
dispatch(
globalActions.getState({ url: `@${username}/transfers` })
);
};
const operation = {
id: 'scot_claim_token',
required_posting_auths: [username],
json: JSON.stringify({
symbol: token,
}),
};
dispatch(
transactionActions.broadcastOperation({
type: 'custom_json',
operation,
successCallback,
})
);
},
const FormattedAssetToken = ({ balance, stake, delegationsIn, delegationsOut, reward, symbol }) => {
if (balance && typeof balance === 'string') {
balance = parsePayoutAmount(balance);
}
const bal = formatDecimal(balance);
let isStake = false;
let isDelegationIn = false;
let isDelegationOut = false;
let isReward = false;
if (stake && typeof stake === 'string') {
stake = parsePayoutAmount(stake);
if(stake > 0)
isStake = true;
}
const stk = formatDecimal(stake);
if (delegationsIn && typeof delegationsIn === 'string') {
delegationsIn = parsePayoutAmount(delegationsIn);
if(delegationsIn > 0)
isDelegationIn = true;
}
const dIn = formatDecimal(delegationsIn || 0) ;
if (delegationsOut && typeof delegationsOut === 'string') {
delegationsOut = parsePayoutAmount(delegationsOut);
if(delegationsOut > 0)
isDelegationOut = true;
}
const dOut = formatDecimal(delegationsOut || 0) ;
if(reward > 0)
isReward = true;
const rew = formatDecimal(reward || 0) ;
const tokenClassName = isReward ? `FormattedAssetTokenReward` : `FormattedAssetToken`;
return isStake || isDelegationIn || isDelegationOut ? (
<span className={tokenClassName}>
<span className="prefix">{symbol} </span>
<span className="integer">{bal[0]}</span>
<span className="decimal">{bal[1]}</span>
{ isReward && ` + `}
{ isReward &&
<span className="integer">{rew[0]}</span>
}
{ isReward &&
<span className="decimal">{rew[1]}</span>
}
{'('}
<span className="integer">{stk[0]}</span>
<span className="decimal">{stk[1]}</span>{', +'}
<span className="integer">{dIn[0]}</span>
<span className="decimal">{dIn[1]}</span>{', -'}
<span className="integer">{dOut[0]}</span>
<span className="decimal">{dOut[1]}</span>{')'}
</span>
) : (
<span className={tokenClassName}>
<span className="prefix">{symbol} </span>
<span className="integer">{bal[0]}</span>
<span className="decimal">{bal[1]}</span>
{ isReward && ` + `}
{ isReward &&
<span className="integer">{rew[0]}</span>
}
{ isReward &&
<span className="decimal">{rew[1]}</span>
}
</span>
);
});