文件 1 的 11:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 2 的 11:IMigration.sol
pragma solidity 0.8.0;
interface IMigration {
function onMigration(
address who_,
uint256 amount_,
bytes memory data_
) external;
}
文件 3 的 11:IRewarder.sol
pragma solidity 0.8.0;
interface IRewarder {
function currency() external view returns (address);
function onReward(address to, uint256 unoAmount) external payable returns (uint256);
}
文件 4 的 11:IRewarderFactory.sol
pragma solidity 0.8.0;
interface IRewarderFactory {
function newRewarder(
address _operator,
address _currency,
address _pool
) external returns (address);
}
文件 5 的 11:IRiskPool.sol
pragma solidity 0.8.0;
interface IRiskPool {
function enter(address _from, uint256 _amount) external;
function leaveFromPoolInPending(address _to, uint256 _amount) external;
function leaveFromPending(address _to) external returns (uint256, uint256);
function cancelWithrawRequest(address _to) external returns (uint256, uint256);
function policyClaim(address _to, uint256 _amount) external returns (uint256 realClaimAmount);
function migrateLP(
address _to,
address _migrateTo,
bool _isUnLocked
) external returns (uint256);
function setMinLPCapital(uint256 _minLPCapital) external;
function currency() external view returns (address);
function getTotalWithdrawRequestAmount() external view returns (uint256);
function getWithdrawRequest(address _to)
external
view
returns (
uint256,
uint256,
uint256
);
function lpPriceUno() external view returns (uint256);
}
文件 6 的 11:IRiskPoolFactory.sol
pragma solidity 0.8.0;
interface IRiskPoolFactory {
function newRiskPool(
string calldata _name,
string calldata _symbol,
address _pool,
address _currency
) external returns (address);
}
文件 7 的 11:ISingleSidedReinsurancePool.sol
pragma solidity 0.8.0;
interface ISingleSidedReinsurancePool {
function updatePool() external;
function enterInPool(uint256 _amount) external;
function leaveFromPoolInPending(uint256 _amount) external;
function leaveFromPending() external;
function harvest(address _to) external;
function lpTransfer(
address _from,
address _to,
uint256 _amount
) external;
function riskPool() external view returns (address);
}
文件 8 的 11:ISyntheticSSRPFactory.sol
pragma solidity 0.8.0;
interface ISyntheticSSRPFactory {
function newSyntheticSSRP(address _owner, address _lpToken) external returns (address);
}
文件 9 的 11:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 10 的 11:SingleSidedReinsurancePool.sol
pragma solidity 0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./interfaces/IMigration.sol";
import "./interfaces/IRiskPoolFactory.sol";
import "./interfaces/IRewarderFactory.sol";
import "./interfaces/ISingleSidedReinsurancePool.sol";
import "./interfaces/ISyntheticSSRPFactory.sol";
import "./interfaces/IRewarder.sol";
import "./interfaces/IRiskPool.sol";
import "./libraries/TransferHelper.sol";
contract SingleSidedReinsurancePool is ISingleSidedReinsurancePool, ReentrancyGuard {
address public owner;
address public claimAssessor;
address public migrateTo;
address public syntheticSSRP;
uint256 public LOCK_TIME = 1 days;
uint256 public constant ACC_UNO_PRECISION = 1e18;
uint256 public STAKING_START_TIME;
address public rewarder;
address public override riskPool;
struct PoolInfo {
uint128 lastRewardBlock;
uint128 accUnoPerShare;
uint256 unoMultiplierPerBlock;
}
struct UserInfo {
uint256 lastWithdrawTime;
uint256 rewardDebt;
uint256 amount;
}
mapping(address => UserInfo) public userInfo;
PoolInfo public poolInfo;
event RiskPoolCreated(address indexed _SSRP, address indexed _pool);
event StakedInPool(address indexed _staker, address indexed _pool, uint256 _amount);
event LeftPool(address indexed _staker, address indexed _pool, uint256 _requestAmount);
event LogUpdatePool(uint128 _lastRewardBlock, uint256 _lpSupply, uint256 _accUnoPerShare);
event Harvest(address indexed _user, address indexed _receiver, uint256 _amount);
event LogLeaveFromPendingSSRP(address indexed _user, uint256 _withdrawLpAmount, uint256 _withdrawUnoAmount);
event PolicyClaim(address indexed _user, uint256 _claimAmount);
event LogLpTransferInSSRP(address indexed _from, address indexed _to, uint256 _amount);
event LogCreateRewarder(address indexed _SSRP, address indexed _rewarder, address _currency);
event LogCreateSyntheticSSRP(address indexed _SSRP, address indexed _syntheticSSRP, address indexed _lpToken);
event LogCancelWithdrawRequest(address indexed _user, uint256 _cancelAmount, uint256 _cancelAmountInUno);
event LogMigrate(address indexed _user, address indexed _migrateTo, uint256 _migratedAmount);
constructor(address _owner, address _claimAssessor) {
owner = _owner;
claimAssessor = _claimAssessor;
STAKING_START_TIME = block.timestamp + 3 days;
}
modifier onlyOwner() {
require(msg.sender == owner, "UnoRe: Forbidden");
_;
}
modifier onlyClaimAssessor() {
require(msg.sender == claimAssessor, "UnoRe: Forbidden");
_;
}
modifier isStartTime() {
require(block.timestamp >= STAKING_START_TIME, "UnoRe: not available time");
_;
}
function setRewardMultiplier(uint256 _rewardMultiplier) external onlyOwner {
require(_rewardMultiplier > 0, "UnoRe: zero value");
poolInfo.unoMultiplierPerBlock = _rewardMultiplier;
}
function setClaimAssessor(address _claimAssessor) external onlyOwner {
require(_claimAssessor != address(0), "UnoRe: zero address");
claimAssessor = _claimAssessor;
}
function setMigrateTo(address _migrateTo) external onlyOwner {
require(_migrateTo != address(0), "UnoRe: zero address");
migrateTo = _migrateTo;
}
function setMinLPCapital(uint256 _minLPCapital) external onlyOwner {
require(_minLPCapital > 0, "UnoRe: not allow zero value");
IRiskPool(riskPool).setMinLPCapital(_minLPCapital);
}
function setLockTime(uint256 _lockTime) external onlyOwner {
require(_lockTime > 0, "UnoRe: not allow zero lock time");
LOCK_TIME = _lockTime;
}
function setStakingStartTime(uint256 _startTime) external onlyOwner {
require(_startTime > 0, "UnoRe: not allow zero start time");
STAKING_START_TIME = _startTime;
}
function createRiskPool(
string calldata _name,
string calldata _symbol,
address _factory,
address _currency,
uint256 _rewardMultiplier
) external onlyOwner nonReentrant {
require(riskPool == address(0), "UnoRe: risk pool created already");
riskPool = IRiskPoolFactory(_factory).newRiskPool(_name, _symbol, address(this), _currency);
poolInfo.lastRewardBlock = uint128(block.number);
poolInfo.accUnoPerShare = 0;
poolInfo.unoMultiplierPerBlock = _rewardMultiplier;
emit RiskPoolCreated(address(this), riskPool);
}
function createRewarder(
address _operator,
address _factory,
address _currency
) external onlyOwner nonReentrant {
require(_factory != address(0), "UnoRe: rewarder factory no exist");
rewarder = IRewarderFactory(_factory).newRewarder(_operator, _currency, address(this));
emit LogCreateRewarder(address(this), rewarder, _currency);
}
function createSyntheticSSRP(address _owner, address _factory) external onlyOwner nonReentrant {
require(_owner != address(0), "UnoRe: zero owner address");
require(_factory != address(0), "UnoRe:zero factory address");
require(riskPool != address(0), "UnoRe:zero LP token address");
syntheticSSRP = ISyntheticSSRPFactory(_factory).newSyntheticSSRP(_owner, riskPool);
emit LogCreateSyntheticSSRP(address(this), syntheticSSRP, riskPool);
}
function migrate() external nonReentrant {
require(migrateTo != address(0), "UnoRe: zero address");
_harvest(msg.sender);
uint256 amount = userInfo[msg.sender].amount;
bool isUnLocked = block.timestamp - userInfo[msg.sender].lastWithdrawTime > LOCK_TIME;
uint256 migratedAmount = IRiskPool(riskPool).migrateLP(msg.sender, migrateTo, isUnLocked);
IMigration(migrateTo).onMigration(msg.sender, amount, "");
userInfo[msg.sender].amount = 0;
userInfo[msg.sender].rewardDebt = 0;
emit LogMigrate(msg.sender, migrateTo, migratedAmount);
}
function pendingUno(address _to) external view returns (uint256 pending) {
uint256 tokenSupply = IERC20(riskPool).totalSupply();
uint128 accUnoPerShare = poolInfo.accUnoPerShare;
if (block.number > poolInfo.lastRewardBlock && tokenSupply != 0) {
uint256 blocks = block.number - uint256(poolInfo.lastRewardBlock);
uint256 unoReward = blocks * poolInfo.unoMultiplierPerBlock;
accUnoPerShare = accUnoPerShare + uint128((unoReward * ACC_UNO_PRECISION) / tokenSupply);
}
uint256 userBalance = userInfo[_to].amount;
pending = (userBalance * uint256(accUnoPerShare)) / ACC_UNO_PRECISION - userInfo[_to].rewardDebt;
}
function updatePool() public override {
if (block.number > poolInfo.lastRewardBlock) {
uint256 tokenSupply = IERC20(riskPool).totalSupply();
if (tokenSupply > 0) {
uint256 blocks = block.number - uint256(poolInfo.lastRewardBlock);
uint256 unoReward = blocks * poolInfo.unoMultiplierPerBlock;
poolInfo.accUnoPerShare = poolInfo.accUnoPerShare + uint128(((unoReward * ACC_UNO_PRECISION) / tokenSupply));
}
poolInfo.lastRewardBlock = uint128(block.number);
emit LogUpdatePool(poolInfo.lastRewardBlock, tokenSupply, poolInfo.accUnoPerShare);
}
}
function enterInPool(uint256 _amount) external override isStartTime nonReentrant {
require(_amount != 0, "UnoRe: ZERO Value");
updatePool();
address token = IRiskPool(riskPool).currency();
uint256 lpPriceUno = IRiskPool(riskPool).lpPriceUno();
TransferHelper.safeTransferFrom(token, msg.sender, riskPool, _amount);
IRiskPool(riskPool).enter(msg.sender, _amount);
userInfo[msg.sender].rewardDebt =
userInfo[msg.sender].rewardDebt +
((_amount * 1e18 * uint256(poolInfo.accUnoPerShare)) / lpPriceUno) /
ACC_UNO_PRECISION;
userInfo[msg.sender].amount = userInfo[msg.sender].amount + ((_amount * 1e18) / lpPriceUno);
emit StakedInPool(msg.sender, riskPool, _amount);
}
function leaveFromPoolInPending(uint256 _amount) external override isStartTime nonReentrant {
_harvest(msg.sender);
uint256 amount = userInfo[msg.sender].amount;
uint256 lpPriceUno = IRiskPool(riskPool).lpPriceUno();
(uint256 pendingAmount, , ) = IRiskPool(riskPool).getWithdrawRequest(msg.sender);
require(((amount - pendingAmount) * lpPriceUno) / 1e18 >= _amount, "UnoRe: withdraw amount overflow");
IRiskPool(riskPool).leaveFromPoolInPending(msg.sender, _amount);
userInfo[msg.sender].lastWithdrawTime = block.timestamp;
emit LeftPool(msg.sender, riskPool, _amount);
}
function leaveFromPending() external override isStartTime nonReentrant {
require(block.timestamp - userInfo[msg.sender].lastWithdrawTime >= LOCK_TIME, "UnoRe: Locked time");
_harvest(msg.sender);
uint256 amount = userInfo[msg.sender].amount;
(uint256 pendingAmount, , ) = IRiskPool(riskPool).getWithdrawRequest(msg.sender);
uint256 accumulatedUno = (amount * uint256(poolInfo.accUnoPerShare)) / ACC_UNO_PRECISION;
userInfo[msg.sender].rewardDebt =
accumulatedUno -
((pendingAmount * uint256(poolInfo.accUnoPerShare)) / ACC_UNO_PRECISION);
(uint256 withdrawAmount, uint256 withdrawAmountInUNO) = IRiskPool(riskPool).leaveFromPending(msg.sender);
userInfo[msg.sender].amount = amount - withdrawAmount;
emit LogLeaveFromPendingSSRP(msg.sender, withdrawAmount, withdrawAmountInUNO);
}
function lpTransfer(
address _from,
address _to,
uint256 _amount
) external override nonReentrant {
require(msg.sender == address(riskPool), "UnoRe: not allow others transfer");
if (_from != syntheticSSRP && _to != syntheticSSRP) {
_harvest(_from);
uint256 amount = userInfo[_from].amount;
(uint256 pendingAmount, , ) = IRiskPool(riskPool).getWithdrawRequest(_from);
require(amount - pendingAmount >= _amount, "UnoRe: balance overflow");
uint256 accumulatedUno = (amount * uint256(poolInfo.accUnoPerShare)) / ACC_UNO_PRECISION;
userInfo[_from].rewardDebt = accumulatedUno - ((_amount * uint256(poolInfo.accUnoPerShare)) / ACC_UNO_PRECISION);
userInfo[_from].amount = amount - _amount;
userInfo[_to].rewardDebt =
userInfo[_to].rewardDebt +
((_amount * uint256(poolInfo.accUnoPerShare)) / ACC_UNO_PRECISION);
userInfo[_to].amount = userInfo[_to].amount + _amount;
emit LogLpTransferInSSRP(_from, _to, _amount);
}
}
function harvest(address _to) external override isStartTime nonReentrant {
_harvest(_to);
}
function _harvest(address _to) private {
updatePool();
uint256 amount = userInfo[_to].amount;
uint256 accumulatedUno = (amount * uint256(poolInfo.accUnoPerShare)) / ACC_UNO_PRECISION;
uint256 _pendingUno = accumulatedUno - userInfo[_to].rewardDebt;
userInfo[msg.sender].rewardDebt = accumulatedUno;
uint256 rewardAmount = 0;
if (rewarder != address(0) && _pendingUno != 0) {
rewardAmount = IRewarder(rewarder).onReward(_to, _pendingUno);
}
emit Harvest(msg.sender, _to, rewardAmount);
}
function cancelWithdrawRequest() external nonReentrant {
(uint256 cancelAmount, uint256 cancelAmountInUno) = IRiskPool(riskPool).cancelWithrawRequest(msg.sender);
emit LogCancelWithdrawRequest(msg.sender, cancelAmount, cancelAmountInUno);
}
function policyClaim(address _to, uint256 _amount) external onlyClaimAssessor isStartTime nonReentrant {
require(_to != address(0), "UnoRe: zero address");
require(_amount > 0, "UnoRe: zero amount");
uint256 realClaimAmount = IRiskPool(riskPool).policyClaim(_to, _amount);
emit PolicyClaim(_to, realClaimAmount);
}
function getStakedAmountPerUser(address _to) external view returns (uint256 unoAmount, uint256 lpAmount) {
lpAmount = userInfo[_to].amount;
uint256 lpPriceUno = IRiskPool(riskPool).lpPriceUno();
unoAmount = (lpAmount * lpPriceUno) / 1e18;
}
function getWithdrawRequestPerUser(address _user)
external
view
returns (
uint256 pendingAmount,
uint256 pendingAmountInUno,
uint256 originUnoAmount,
uint256 requestTime
)
{
uint256 lpPriceUno = IRiskPool(riskPool).lpPriceUno();
(pendingAmount, requestTime, originUnoAmount) = IRiskPool(riskPool).getWithdrawRequest(_user);
pendingAmountInUno = (pendingAmount * lpPriceUno) / 1e18;
}
function getTotalWithdrawPendingAmount() external view returns (uint256) {
return IRiskPool(riskPool).getTotalWithdrawRequestAmount();
}
}
文件 11 的 11:TransferHelper.sol
pragma solidity 0.8.0;
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeApprove: approve failed");
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer: transfer failed");
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::transferFrom: transferFrom failed");
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, "TransferHelper::safeTransferETH: ETH transfer failed");
}
}
{
"compilationTarget": {
"contracts/SingleSidedReinsurancePool.sol": "SingleSidedReinsurancePool"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 500
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_claimAssessor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_staker","type":"address"},{"indexed":true,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_requestAmount","type":"uint256"}],"name":"LeftPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_cancelAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_cancelAmountInUno","type":"uint256"}],"name":"LogCancelWithdrawRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSRP","type":"address"},{"indexed":true,"internalType":"address","name":"_rewarder","type":"address"},{"indexed":false,"internalType":"address","name":"_currency","type":"address"}],"name":"LogCreateRewarder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSRP","type":"address"},{"indexed":true,"internalType":"address","name":"_syntheticSSRP","type":"address"},{"indexed":true,"internalType":"address","name":"_lpToken","type":"address"}],"name":"LogCreateSyntheticSSRP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_withdrawLpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_withdrawUnoAmount","type":"uint256"}],"name":"LogLeaveFromPendingSSRP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"LogLpTransferInSSRP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_migrateTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"_migratedAmount","type":"uint256"}],"name":"LogMigrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"_lastRewardBlock","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"_lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_accUnoPerShare","type":"uint256"}],"name":"LogUpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_claimAmount","type":"uint256"}],"name":"PolicyClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSRP","type":"address"},{"indexed":true,"internalType":"address","name":"_pool","type":"address"}],"name":"RiskPoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_staker","type":"address"},{"indexed":true,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakedInPool","type":"event"},{"inputs":[],"name":"ACC_UNO_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCK_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelWithdrawRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAssessor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_currency","type":"address"}],"name":"createRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"uint256","name":"_rewardMultiplier","type":"uint256"}],"name":"createRiskPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_factory","type":"address"}],"name":"createSyntheticSSRP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"enterInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"getStakedAmountPerUser","outputs":[{"internalType":"uint256","name":"unoAmount","type":"uint256"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalWithdrawPendingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getWithdrawRequestPerUser","outputs":[{"internalType":"uint256","name":"pendingAmount","type":"uint256"},{"internalType":"uint256","name":"pendingAmountInUno","type":"uint256"},{"internalType":"uint256","name":"originUnoAmount","type":"uint256"},{"internalType":"uint256","name":"requestTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"leaveFromPending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"leaveFromPoolInPending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"lpTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"pendingUno","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"policyClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"lastRewardBlock","type":"uint128"},{"internalType":"uint128","name":"accUnoPerShare","type":"uint128"},{"internalType":"uint256","name":"unoMultiplierPerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_claimAssessor","type":"address"}],"name":"setClaimAssessor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockTime","type":"uint256"}],"name":"setLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migrateTo","type":"address"}],"name":"setMigrateTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minLPCapital","type":"uint256"}],"name":"setMinLPCapital","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardMultiplier","type":"uint256"}],"name":"setRewardMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStakingStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syntheticSSRP","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"lastWithdrawTime","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}]