文件 1 的 15:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 15:ICapitalAgent.sol
pragma solidity 0.8.0;
interface ICapitalAgent {
function addPool(
address _ssip,
address _currency,
uint256 _scr
) external;
function setPolicy(address _policy) external;
function SSIPWithdraw(uint256 _withdrawAmount) external;
function SSIPStaking(uint256 _stakingAmount) external;
function SSIPPolicyCaim(
uint256 _withdrawAmount,
uint256 _policyId,
bool _isFinished
) external;
function checkCapitalByMCR(address _pool, uint256 _withdrawAmount) external view returns (bool);
function checkCoverageByMLR(uint256 _coverageAmount) external view returns (bool);
function policySale(uint256 _coverageAmount) external;
function updatePolicyStatus(uint256 _policyId) external;
}
文件 3 的 15: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);
}
文件 4 的 15:IExchangeAgent.sol
pragma solidity 0.8.0;
interface IExchangeAgent {
function USDC_TOKEN() external view returns (address);
function getTokenAmountForUSDC(address _token, uint256 _usdtAmount) external view returns (uint256);
function getETHAmountForUSDC(uint256 _usdtAmount) external view returns (uint256);
function getETHAmountForToken(address _token, uint256 _tokenAmount) external view returns (uint256);
function getTokenAmountForETH(address _token, uint256 _ethAmount) external view returns (uint256);
function getNeededTokenAmount(
address _token0,
address _token1,
uint256 _token0Amount
) external view returns (uint256);
function convertForToken(
address _token0,
address _token1,
uint256 _token0Amount
) external returns (uint256);
function convertForETH(address _token, uint256 _convertAmount) external returns (uint256);
}
文件 5 的 15:IMigration.sol
pragma solidity 0.8.0;
interface IMigration {
function onMigration(
address who_,
uint256 amount_,
bytes memory data_
) external;
}
文件 6 的 15: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);
}
文件 7 的 15:IRewarderFactory.sol
pragma solidity 0.8.0;
interface IRewarderFactory {
function newRewarder(
address _operator,
address _currency,
address _pool
) external returns (address);
}
文件 8 的 15: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);
}
文件 9 的 15:IRiskPoolFactory.sol
pragma solidity 0.8.0;
interface IRiskPoolFactory {
function newRiskPool(
string calldata _name,
string calldata _symbol,
address _pool,
address _currency
) external returns (address);
}
文件 10 的 15:ISingleSidedInsurancePool.sol
pragma solidity 0.8.0;
interface ISingleSidedInsurancePool {
function updatePool() external;
function enterInPool(uint256 _amount) external payable;
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);
}
文件 11 的 15:ISyntheticSSIPFactory.sol
pragma solidity 0.8.0;
interface ISyntheticSSIPFactory {
function newSyntheticSSIP(address _multiSigWallet, address _lpToken) external returns (address);
}
文件 12 的 15:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 13 的 15: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;
}
}
文件 14 的 15:SingleSidedInsurancePool.sol
pragma solidity 0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/ICapitalAgent.sol";
import "./interfaces/IExchangeAgent.sol";
import "./interfaces/IMigration.sol";
import "./interfaces/IRewarderFactory.sol";
import "./interfaces/IRiskPoolFactory.sol";
import "./interfaces/ISingleSidedInsurancePool.sol";
import "./interfaces/IRewarder.sol";
import "./interfaces/IRiskPool.sol";
import "./interfaces/ISyntheticSSIPFactory.sol";
import "./libraries/TransferHelper.sol";
contract SingleSidedInsurancePool is ISingleSidedInsurancePool, ReentrancyGuard, Ownable {
address public claimAssessor;
address private exchangeAgent;
address public migrateTo;
address public capitalAgent;
address public syntheticSSIP;
uint256 public LOCK_TIME = 10 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 _SSIP, 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 LogSetExchangeAgent(address indexed _exchangeAgent);
event LogLeaveFromPendingSSIP(
address indexed _user,
address indexed _riskPool,
uint256 _withdrawLpAmount,
uint256 _withdrawUnoAmount
);
event PolicyClaim(address indexed _user, uint256 _claimAmount);
event LogLpTransferInSSIP(address indexed _from, address indexed _to, uint256 _amount);
event LogCreateRewarder(address indexed _SSIP, address indexed _rewarder, address _currency);
event LogCreateSyntheticSSIP(address indexed _SSIP, address indexed _syntheticSSIP, address indexed _lpToken);
event LogCancelWithdrawRequest(address indexed _user, uint256 _cancelAmount, uint256 _cancelAmountInUno);
event LogMigrate(address indexed _user, address indexed _migrateTo, uint256 _migratedAmount);
event LogSetCapitalAgent(address indexed _SSIP, address indexed _capitalAgent);
event LogSetRewardMultiplier(address indexed _SSIP, uint256 _rewardPerBlock);
event LogSetClaimAssessor(address indexed _SSIP, address indexed _claimAssessor);
event LogSetMigrateTo(address indexed _SSIP, address indexed _migrateTo);
event LogSetMinLPCapital(address indexed _SSIP, uint256 _minLPCapital);
event LogSetLockTime(address indexed _SSIP, uint256 _lockTime);
event LogSetStakingStartTime(address indexed _SSIP, uint256 _startTime);
constructor(
address _claimAssessor,
address _exchangeAgent,
address _capitalAgent,
address _multiSigWallet
) {
require(_claimAssessor != address(0), "UnoRe: zero claimAssessor address");
require(_exchangeAgent != address(0), "UnoRe: zero exchangeAgent address");
require(_capitalAgent != address(0), "UnoRe: zero capitalAgent address");
require(_multiSigWallet != address(0), "UnoRe: zero multisigwallet address");
exchangeAgent = _exchangeAgent;
claimAssessor = _claimAssessor;
capitalAgent = _capitalAgent;
transferOwnership(_multiSigWallet);
}
modifier onlyClaimAssessor() {
require(msg.sender == claimAssessor, "UnoRe: Forbidden");
_;
}
modifier isStartTime() {
require(block.timestamp >= STAKING_START_TIME, "UnoRe: not available time");
_;
}
function setExchangeAgent(address _exchangeAgent) external onlyOwner {
require(_exchangeAgent != address(0), "UnoRe: zero address");
exchangeAgent = _exchangeAgent;
emit LogSetExchangeAgent(_exchangeAgent);
}
function setCapitalAgent(address _capitalAgent) external onlyOwner {
require(_capitalAgent != address(0), "UnoRe: zero address");
capitalAgent = _capitalAgent;
emit LogSetCapitalAgent(address(this), _capitalAgent);
}
function setRewardMultiplier(uint256 _rewardMultiplier) external onlyOwner {
require(_rewardMultiplier > 0, "UnoRe: zero value");
poolInfo.unoMultiplierPerBlock = _rewardMultiplier;
emit LogSetRewardMultiplier(address(this), _rewardMultiplier);
}
function setClaimAssessor(address _claimAssessor) external onlyOwner {
require(_claimAssessor != address(0), "UnoRe: zero address");
claimAssessor = _claimAssessor;
emit LogSetClaimAssessor(address(this), _claimAssessor);
}
function setMigrateTo(address _migrateTo) external onlyOwner {
require(_migrateTo != address(0), "UnoRe: zero address");
migrateTo = _migrateTo;
emit LogSetMigrateTo(address(this), _migrateTo);
}
function setMinLPCapital(uint256 _minLPCapital) external onlyOwner {
require(_minLPCapital > 0, "UnoRe: not allow zero value");
IRiskPool(riskPool).setMinLPCapital(_minLPCapital);
emit LogSetMinLPCapital(address(this), _minLPCapital);
}
function setLockTime(uint256 _lockTime) external onlyOwner {
require(_lockTime > 0, "UnoRe: not allow zero lock time");
LOCK_TIME = _lockTime;
emit LogSetLockTime(address(this), _lockTime);
}
function setStakingStartTime(uint256 _startTime) external onlyOwner {
STAKING_START_TIME = _startTime + block.timestamp;
emit LogSetStakingStartTime(address(this), STAKING_START_TIME);
}
function createRiskPool(
string calldata _name,
string calldata _symbol,
address _factory,
address _currency,
uint256 _rewardMultiplier,
uint256 _SCR
) external onlyOwner nonReentrant {
require(riskPool == address(0), "UnoRe: risk pool created already");
require(_factory != address(0), "UnoRe: zero factory address");
riskPool = IRiskPoolFactory(_factory).newRiskPool(_name, _symbol, address(this), _currency);
poolInfo.lastRewardBlock = uint128(block.number);
poolInfo.accUnoPerShare = 0;
poolInfo.unoMultiplierPerBlock = _rewardMultiplier;
ICapitalAgent(capitalAgent).addPool(address(this), _currency, _SCR);
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");
require(_operator != address(0), "UnoRe: zero operator address");
rewarder = IRewarderFactory(_factory).newRewarder(_operator, _currency, address(this));
emit LogCreateRewarder(address(this), rewarder, _currency);
}
function createSyntheticSSIP(address _multiSigWallet, address _factory) external onlyOwner nonReentrant {
require(_multiSigWallet != address(0), "UnoRe: zero owner address");
require(_factory != address(0), "UnoRe:zero factory address");
require(riskPool != address(0), "UnoRe:zero LP token address");
syntheticSSIP = ISyntheticSSIPFactory(_factory).newSyntheticSSIP(_multiSigWallet, riskPool);
emit LogCreateSyntheticSSIP(address(this), syntheticSSIP, riskPool);
}
function migrate() external nonReentrant {
require(migrateTo != address(0), "UnoRe: zero address");
_harvest(msg.sender);
uint256 lpPrice = IRiskPool(riskPool).lpPriceUno();
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);
ICapitalAgent(capitalAgent).SSIPPolicyCaim((amount * lpPrice) / 1e18, 0, false);
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 payable override isStartTime nonReentrant {
require(_amount != 0, "UnoRe: ZERO Value");
updatePool();
address token = IRiskPool(riskPool).currency();
uint256 lpPriceUno = IRiskPool(riskPool).lpPriceUno();
if (token == address(0)) {
require(msg.value >= _amount, "UnoRe: insufficient paid");
if (msg.value > _amount) {
TransferHelper.safeTransferETH(msg.sender, msg.value - _amount);
}
TransferHelper.safeTransferETH(riskPool, _amount);
} else {
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);
ICapitalAgent(capitalAgent).SSIPStaking(_amount);
emit StakedInPool(msg.sender, riskPool, _amount);
}
function leaveFromPoolInPending(uint256 _amount) external override isStartTime nonReentrant {
_harvest(msg.sender);
require(ICapitalAgent(capitalAgent).checkCapitalByMCR(address(this), _amount), "UnoRe: minimum capital underflow");
uint256 amount = userInfo[msg.sender].amount;
uint256 lpPriceUno = IRiskPool(riskPool).lpPriceUno();
(uint256 pendingAmount, , ) = IRiskPool(riskPool).getWithdrawRequest(msg.sender);
require(amount - pendingAmount >= _amount * 1e18 / lpPriceUno, "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, , uint256 pendingAmountInUNO) = IRiskPool(riskPool).getWithdrawRequest(msg.sender);
ICapitalAgent(capitalAgent).SSIPWithdraw(pendingAmountInUNO);
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 LogLeaveFromPendingSSIP(msg.sender, riskPool, 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 != syntheticSSIP && _to != syntheticSSIP) {
_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 LogLpTransferInSSIP(_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,
uint256 _policyId,
bool _isFinished
) external onlyClaimAssessor isStartTime nonReentrant {
require(_to != address(0), "UnoRe: zero address");
require(_amount > 0, "UnoRe: zero amount");
uint256 realClaimAmount = IRiskPool(riskPool).policyClaim(_to, _amount);
ICapitalAgent(capitalAgent).SSIPPolicyCaim(realClaimAmount, _policyId, _isFinished);
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();
}
}
文件 15 的 15: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/SingleSidedInsurancePool.sol": "SingleSidedInsurancePool"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_claimAssessor","type":"address"},{"internalType":"address","name":"_exchangeAgent","type":"address"},{"internalType":"address","name":"_capitalAgent","type":"address"},{"internalType":"address","name":"_multiSigWallet","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":"_SSIP","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":"_SSIP","type":"address"},{"indexed":true,"internalType":"address","name":"_syntheticSSIP","type":"address"},{"indexed":true,"internalType":"address","name":"_lpToken","type":"address"}],"name":"LogCreateSyntheticSSIP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_riskPool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_withdrawLpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_withdrawUnoAmount","type":"uint256"}],"name":"LogLeaveFromPendingSSIP","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":"LogLpTransferInSSIP","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":true,"internalType":"address","name":"_SSIP","type":"address"},{"indexed":true,"internalType":"address","name":"_capitalAgent","type":"address"}],"name":"LogSetCapitalAgent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSIP","type":"address"},{"indexed":true,"internalType":"address","name":"_claimAssessor","type":"address"}],"name":"LogSetClaimAssessor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_exchangeAgent","type":"address"}],"name":"LogSetExchangeAgent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSIP","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockTime","type":"uint256"}],"name":"LogSetLockTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSIP","type":"address"},{"indexed":true,"internalType":"address","name":"_migrateTo","type":"address"}],"name":"LogSetMigrateTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSIP","type":"address"},{"indexed":false,"internalType":"uint256","name":"_minLPCapital","type":"uint256"}],"name":"LogSetMinLPCapital","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSIP","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"LogSetRewardMultiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_SSIP","type":"address"},{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"LogSetStakingStartTime","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"_SSIP","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":"capitalAgent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"},{"internalType":"uint256","name":"_SCR","type":"uint256"}],"name":"createRiskPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multiSigWallet","type":"address"},{"internalType":"address","name":"_factory","type":"address"}],"name":"createSyntheticSSIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"enterInPool","outputs":[],"stateMutability":"payable","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"},{"internalType":"uint256","name":"_policyId","type":"uint256"},{"internalType":"bool","name":"_isFinished","type":"bool"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"_capitalAgent","type":"address"}],"name":"setCapitalAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_claimAssessor","type":"address"}],"name":"setClaimAssessor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_exchangeAgent","type":"address"}],"name":"setExchangeAgent","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":"syntheticSSIP","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","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"}]