El nuevo CakePool es un nuevo contrato de staking de $CAKE construido sobre la base de CakeVault (el actual pool de CAKE automático) y diseñado para trabajar con PancakeSwap MasterChef v2 y proporcionar la funcionalidad de "Stake $CAKE, gana $CAKE" al tiempo que ofrece más características, como el staking a a plazo fijo. El pool de CAKE manual actual se retirará después de la migración.
El nuevo CakePool usará un token ficticio para realizar el harvest de $CAKE de MasterChef v2 y recompensarlos a los usuarios que están haciendo staking de $CAKE. Los usuarios que bloqueen sus $CAKE durante más tiempo recibirán un número más significativo de tenencias (boosteadas linealmente en función de la duración), por lo tanto, disfrutarán de un mayor rendimiento.
Necesito migrar?
Si estás usando enterStaking y leaveStaking en el contrato MasterChef de PancakeSwap (), necesitarás migrar al nuevo contrato.
No más compounding
Con el nuevo CakePool, las recompensas se distribuyen proporcionalmente a todos los usuarios del pool en función de las tenencias. Al igual que los "tokens que devengan intereses" u otros modelos basados en tenencias, el staking balance de los usuarios crecerá cuando se pongan más recompensas en el pool. Los usuarios no necesitan realizar harvest y reinvertir sus recompensas.
Fees
En el nuevo CakePool, todos los usuarios de staking flexibles estarán sujetos a dos conjuntos de fees.
Fee en recompensas de staking flexible
Se aplicará una tarifa del 2% a todas las recompensas generadas por el staking flexible. El monto de la tarifa se calculará y realizará en la próxima acción de depósito o retiro, tomada de las tenencias de los usuarios. Para consultar el número de la tarifa no realizada, utilice calculatePerformanceFee(address _user).
Fee de Retiro
Se aplicará una tarifa de retiro del 0.1% al monto de unstake si retira dentro de las 72 horas posteriores a la última acción de depósito. La tarifa de retiro se reduce del monto final del retiro antes de la transferencia de CAKE.
Resumen
Deposit
Si actualmente estás usando enterStaking(uint256 _amount) en el contrato MasterChef de PancakeSwap. Deberás migrar a deposit(uint256 _amount, uint256 _lockDuration). Para staking flexible, use “0” en_lockDuration.
Staking Balance and Fees
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.
}
CAKE staking amount (before subtracting all the fees)
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;
}
Withdraw Fee
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;
}
Tenga en cuenta que el nuevo pool no requiere ningún interés compuesto manual. Las recompensas se colocan en su saldo de depósito automáticamente.
Sin embargo, puede consultar el número de CAKE obtenidos desde la última acción, utilizando la diferencia entre el saldo de depósito actual (mencionado anteriormente) y el número de userInfo.cakeAtLastUserAction.
Withdraw
Si estás usando el método leaveStaking(uint256 _amount) en el actual PancakeSwap MasterChef. Necesitarás migrar awithdraw(uint256 _shares).
Al hacer staking flexible, tenga en cuenta que al retirar, las tarifas de recompensa pendientes se calcularán y se reducirán del número de tenencias de los usuarios, el número real de tenencias que se retiran se volverá a calibrar, en función del porcentaje de las tenencias que está retirando contra el total de tenencias que tiene. Vea el ejemplo a continuación:
// 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
Tenga en cuenta que el monto final de recepción se verá afectado por la tarifa de retiro. Si su función depende fundamentalmente del número final de CAKE que se retira, le recomendamos que calcule utilizando la diferencia en el saldo de CAKE antes y después de la acción de retiro:
O bien, calcule y reste la tarifa de retiro al estimar la cantidad.
Entorno Testnet
Puede utilizar el siguiente entorno de testnet para probar la integración de tu proyecto con el nuevo PancakeSwap Cake Pool. Si tienes alguna pregunta, comuníquese con nuestro equipo a través de los canales existentes o a través de bun@pancakeswap.com.