A nova CakePool é um novo contrato de stake de $CAKE construído com base no CakeVault (o atual pool automático de CAKE) e projetado para funcionar com o MasterChef v2 da PancakeSwap para fornecer a funcionalidade "stake $CAKE, ganhe $CAKE" enquanto oferece mais recursos, como stake de termo fixo. A pool de CAKE manual atual será retirada após a migração.
A nova CakePool usará um token fictício para coletar $CAKE do MasterChef v2 e recompensar os usuários que fizerem stake de $CAKE. Os usuários que bloquearem seu $CAKE por mais tempo receberão um número mais significativo de participações (aumentados linearmente com base na duração), portanto, desfrutam de um rendimento maior
Preciso migrar?
Se você atualmente está usando enterStaking e leaveStaking no MasterChef da PancakeSwap (), você vai precisar migrar para o novo contrato.
Não precisa mais fazer o reinvestimento
Com a novo CakePool, as recompensas são distribuídas proporcionalmente a todos os usuários do pool com base nas participações. Semelhante a “tokens com juros” ou outros modelos baseados em participação(shares), o saldo em stake dos usuários aumentará quando mais recompensas forem colocadas no pool. Os usuários não precisam colher e reinvestir suas recompensas.
Taxas
Na nova CakePool, todos os usuários do stake flexível estarão sujeitos a dois conjuntos de taxas.
Taxa sobre recompensas de stake flexível
Uma taxa de 2% será aplicada a todas as recompensas geradas pelo stake flexível. O valor da taxa será calculado e realizado na próxima ação de depósito ou retirada, cortada das participações dos usuários. Para consultar o número da taxa de desempenho não realizada, use calculatePerformanceFee(address _user).
Taxa de Saque
Uma taxa de saque de 0,1% será aplicada ao valor sacado do stake se você retirar dentro de 72 horas após a última ação de depósito. A taxa de saque é cortada do valor final da retirada antes da transferência do CAKE.
Visão Geral
Depósito
Se você estiver usando o enterStaking(uint256 _amount) no MasterChef atual da PancakeSwap MasterChef. Você precisa migrar para deposit(uint256 _amount, uint256 _lockDuration). Para o stake flexível, simplesmente use “0” como _lockDuration.
Saldo de Stake e Taxas
Global variables: CakePoolContract // CAKE pool contract
struct UserInfo {
uint256 shares; // number of shares for a user.
uint256 lastDepositedTime; // timestamp of the last deposit action
uint256 cakeAtLastUserAction; // number of CAKE at the last user action
uint256 lastUserActionTime; // timestamp of the last user action
uint256 lockStartTime; // timestamp of the start of the lock.
uint256 lockEndTime; // timestamp of the end of the lock.
uint256 userBoostedShare; // the amount of shares boosted/added to the user.
bool locked; // status of the lock
uint256 lockedAmount; // number of CAKE locked at the start of the lock period.
}
Quantidade de CAKE em stake (antes de subtrair todas as taxas)
async function calculateOverdueFee(_user:address){
const user = await CakePoolContract.userInfo(address);
const isFreeFee = await CakePoolContract.freeFeeUsers(_user); //normal free fee users are some special contracts , so you can set default false
const UNLOCK_FREE_DURATION = 1 week seconds (or you can get from smart contract, const UNLOCK_FREE_DURATION = await CakePoolContract.UNLOCK_FREE_DURATION())
const DURATION_FACTOR_OVERDUE = 180 * 24 * 3600; // 180 days, in order to calculate overdue fee. you can get it from contract too.
if (
user.shares > 0 &&
user.locked &&
!isFreeFee &&
((user.lockEndTime + UNLOCK_FREE_DURATION) < block.timestamp)
) {
const PricePerFullShare = await CakePoolContract.getPricePerFullShare();
uint256 currentAmount = user.shares * PricePerFullShare / 1e18 - user.userBoostedShare;
uint256 earnAmount = currentAmount - user.lockedAmount;
uint256 overdueDuration = block.timestamp - user.lockEndTime - UNLOCK_FREE_DURATION; // you can use UTC timestamp to replace current block.timestamp.
if (overdueDuration > DURATION_FACTOR_OVERDUE) {
overdueDuration = DURATION_FACTOR_OVERDUE;
}
// Rates are calculated based on the user's overdue duration.
uint256 overdueWeight = (overdueDuration * overdueFee) / DURATION_FACTOR_OVERDUE;
uint256 currentOverdueFee = (earnAmount * overdueWeight) / PRECISION_FACTOR;
return currentOverdueFee;
}
return 0;
}
Taxa de Saque
const user = await CakePoolContract.userInfo(address);
const withdrawFee = await CakePoolContract.withdrawFee();
const isFreeFee = await CakePoolContract.freeFeeUsers(_user); //normal free fee users are some special contracts , so you can set default false
let WithdrawFeeAmount = 0;
// you can use UTC timestamp to replace current block.timestamp.
// withdrawFeePeriod = 72 * 3600 (S)
// _amount : withdraw amount
if (!isFreeFee && (block.timestamp < user.lastDepositedTime + withdrawFeePeriod)) {
WithdrawFeeAmount = _amount * withdrawFee;
}
Quantidade de CAKE em stakie (depois de subtrair todas as taxas)
Por favor, note que a nova pool não requer qualquer reinvestimento. As recompensas estão sendo colocadas em seu saldo de stake automaticamente.
No entanto, você pode consultar o número de CAKE ganho desde a última ação, usando a diferença entre o saldo de stake atual (mencionado acima) e o número deuserInfo.cakeAtLastUserAction.
Saque
Se você está usando o método leaveStaking(uint256 _amount) no atual MasterChef da PancakeSwap. Você precisa migrar para withdraw(uint256 _shares).
Ao fazer stake flexível. Observe que, ao retirar, as taxas de recompensa pendentes serão calculadas e cortadas do número de participações dos usuários, o número real de participações retirados será recalibrado, com base na porcentagem de participações que você está retirando em relação ao total das participações que você tem. Veja o exemplo abaixo:
// the number of CAKE being withdrawn can be calculated by:
withdrawPercentage = _sharesToWithdraw / userInfo.shares
stakingBalance = userInfo.shares * PricePerFullShare / 1e18 - userInfo.userBoostedShare - !userInfo.locked ? calculatePerformanceFee(_userAddress) : calculateOverdueFee(_userAddress)
finalWithdrawAmount = withdrawPercentage * stakingBalance
Observe que o valor final do recebimento será afetado pela taxa de saque. Se sua função depende crucialmente do número final de CAKE sendo retirado, recomendamos calcular isso usando a diferença no saldo do CAKE antes e depois da ação de saque:
Ou calcule e subtraia a taxa de saque ao estimar o valor.
Ambiente de Testnet
Você pode usar o seguinte ambiente de testnet para testar a integração do seu projeto com a nova Pool de CAKE da PancakeSwap. Se você tiver alguma dúvida, entre em contato com nossa equipe pelos canais existentes ou entre em contato com bun@pancakeswap.com por e-mail.