Source Code
Overview
MNT Balance
0 MNT
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
Contract Name:
StrategyVaultV2Multi
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 1000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
interface IComplianceManager {
function isCompliant(address user) external view returns (bool);
}
interface IBalanceVerifier {
function verifyProof(
uint256[2] memory a,
uint256[2][2] memory b,
uint256[2] memory c,
uint256[3] memory input
) external view returns (bool);
}
interface IYieldStrategy {
function deposit() external payable;
function withdraw(uint256 amount) external returns (uint256);
function harvest() external returns (uint256);
function getBalance() external view returns (uint256);
function getPendingYield() external view returns (uint256);
function getAPY() external pure returns (uint256);
}
contract StrategyVaultV2Multi is Ownable, ReentrancyGuard, Pausable {
// ========== STATE VARIABLES ==========
IComplianceManager public complianceManager;
IBalanceVerifier public balanceVerifier;
uint256 public minBalanceThreshold;
uint256 public totalValueLocked;
uint256 public totalShares;
mapping(address => uint256) public shares;
mapping(address => uint256) public userDeposits;
mapping(address => uint256) public totalUserDeposits;
mapping(address => uint256) public totalUserWithdrawals;
// ========== 3 STRATEGIES ==========
address[3] public strategies; // 0: Aave, 1: Uniswap, 2: Lido
string[3] public strategyNames = ["Aave", "Uniswap", "Lido"];
uint256[3] public strategyAllocations; // basis points
uint256 public lastAllocationTime;
uint256 public allocationFrequency = 1 days;
uint256 public performanceFee = 1000; // 10%
uint256 public managementFee = 50; // 0.5%
address public feeRecipient;
// ========== EVENTS ==========
event Deposited(
address indexed user,
uint256 amount,
uint256 shares,
uint256 timestamp
);
event Withdrawn(
address indexed user,
uint256 amount,
uint256 shares,
uint256 timestamp
);
event StrategyUpdated(uint256 indexed index, address strategy, string name);
event AllocationsUpdated(uint256 aave, uint256 uniswap, uint256 lido);
event FundsAllocated(
uint256 aave,
uint256 uniswap,
uint256 lido,
uint256 timestamp
);
event YieldHarvested(
uint256 indexed strategyIndex,
uint256 amount,
uint256 timestamp
);
modifier onlyCompliant() {
require(complianceManager.isCompliant(msg.sender), "Not compliant");
_;
}
constructor(
address _complianceManager,
address _balanceVerifier,
uint256 _minBalanceThreshold
) {
complianceManager = IComplianceManager(_complianceManager);
balanceVerifier = IBalanceVerifier(_balanceVerifier);
minBalanceThreshold = _minBalanceThreshold;
feeRecipient = msg.sender;
}
receive() external payable {
// Accept ETH from strategies during withdrawal
}
// ========== DEPOSIT FUNCTIONS ==========
/**
* @notice Public deposit with compliance check
* @dev Anyone with KYC can deposit
*/
function deposit() external payable whenNotPaused nonReentrant {
// Check KYC compliance
require(complianceManager.isCompliant(msg.sender), "Not compliant");
require(msg.value >= minBalanceThreshold, "Below minimum deposit");
uint256 sharesToMint;
if (totalShares == 0) {
sharesToMint = msg.value;
} else {
sharesToMint = (msg.value * totalShares) / totalValueLocked;
}
shares[msg.sender] += sharesToMint;
userDeposits[msg.sender] += msg.value;
totalUserDeposits[msg.sender] += msg.value;
totalShares += sharesToMint;
totalValueLocked += msg.value;
emit Deposited(msg.sender, msg.value, sharesToMint, block.timestamp);
if (block.timestamp >= lastAllocationTime + allocationFrequency) {
_allocateToStrategies();
}
}
function deposit(
uint256[2] memory a,
uint256[2][2] memory b,
uint256[2] memory c,
uint256[3] memory publicSignals
) external payable onlyCompliant whenNotPaused nonReentrant {
require(msg.value >= minBalanceThreshold, "Below minimum deposit");
bool valid = balanceVerifier.verifyProof(a, b, c, publicSignals);
require(valid, "Invalid balance proof");
uint256 sharesToMint;
if (totalShares == 0) {
sharesToMint = msg.value;
} else {
sharesToMint = (msg.value * totalShares) / totalValueLocked;
}
shares[msg.sender] += sharesToMint;
userDeposits[msg.sender] += msg.value;
totalUserDeposits[msg.sender] += msg.value;
totalShares += sharesToMint;
totalValueLocked += msg.value;
emit Deposited(msg.sender, msg.value, sharesToMint, block.timestamp);
if (block.timestamp >= lastAllocationTime + allocationFrequency) {
_allocateToStrategies();
}
}
// ========== WITHDRAW FUNCTION ==========
function withdraw(
uint256 sharesToBurn
) external whenNotPaused nonReentrant {
require(
sharesToBurn > 0 && sharesToBurn <= shares[msg.sender],
"Invalid shares"
);
uint256 ethAmount = (sharesToBurn * totalValueLocked) / totalShares;
uint256 reserveBalance = address(this).balance;
if (ethAmount > reserveBalance) {
uint256 needed = ethAmount - reserveBalance;
withdrawFromStrategies(needed);
}
shares[msg.sender] -= sharesToBurn;
userDeposits[msg.sender] -= ethAmount;
totalUserWithdrawals[msg.sender] += ethAmount;
totalShares -= sharesToBurn;
totalValueLocked -= ethAmount;
(bool success, ) = msg.sender.call{value: ethAmount}("");
require(success, "Transfer failed");
emit Withdrawn(msg.sender, ethAmount, sharesToBurn, block.timestamp);
}
// ========== STRATEGY MANAGEMENT ==========
function updateStrategy(
uint256 index,
address strategy
) external onlyOwner {
require(index < 3, "Invalid index");
strategies[index] = strategy;
emit StrategyUpdated(index, strategy, strategyNames[index]);
}
function updateAllocations(
uint256 aavePercent,
uint256 uniswapPercent,
uint256 lidoPercent
) external onlyOwner {
uint256 total = aavePercent + uniswapPercent + lidoPercent;
require(total <= 10000, "Total > 100%");
strategyAllocations[0] = aavePercent;
strategyAllocations[1] = uniswapPercent;
strategyAllocations[2] = lidoPercent;
emit AllocationsUpdated(aavePercent, uniswapPercent, lidoPercent);
}
function allocateToStrategies() external onlyOwner whenNotPaused {
_allocateToStrategies();
}
function _allocateToStrategies() internal {
uint256 availableBalance = address(this).balance;
if (availableBalance == 0) return;
uint256[3] memory amounts;
amounts[0] = (availableBalance * strategyAllocations[0]) / 10000;
amounts[1] = (availableBalance * strategyAllocations[1]) / 10000;
amounts[2] = (availableBalance * strategyAllocations[2]) / 10000;
for (uint256 i = 0; i < 3; i++) {
if (amounts[i] > 0 && strategies[i] != address(0)) {
try IYieldStrategy(strategies[i]).deposit{value: amounts[i]}() {
// Success
} catch {
// Failed, funds stay in vault
}
}
}
lastAllocationTime = block.timestamp;
emit FundsAllocated(
amounts[0],
amounts[1],
amounts[2],
block.timestamp
);
}
function harvestYields() external onlyOwner whenNotPaused nonReentrant {
uint256 totalYields = 0;
for (uint256 i = 0; i < 3; i++) {
if (strategies[i] != address(0)) {
try IYieldStrategy(strategies[i]).harvest() returns (
uint256 yields
) {
if (yields > 0) {
totalYields += yields;
totalValueLocked += yields;
emit YieldHarvested(i, yields, block.timestamp);
}
} catch {
// Harvest failed, continue
}
}
}
if (
totalYields > 0 && performanceFee > 0 && feeRecipient != address(0)
) {
uint256 fee = (totalYields * performanceFee) / 10000;
(bool success, ) = feeRecipient.call{value: fee}("");
if (success) {
totalValueLocked -= fee;
}
}
}
function harvestStrategy(
uint256 index
) external onlyOwner whenNotPaused nonReentrant returns (uint256) {
require(index < 3, "Invalid index");
require(strategies[index] != address(0), "Strategy not set");
uint256 yields = IYieldStrategy(strategies[index]).harvest();
if (yields > 0) {
totalValueLocked += yields;
emit YieldHarvested(index, yields, block.timestamp);
if (performanceFee > 0 && feeRecipient != address(0)) {
uint256 fee = (yields * performanceFee) / 10000;
(bool success, ) = feeRecipient.call{value: fee}("");
if (success) {
totalValueLocked -= fee;
}
}
}
return yields;
}
function withdrawFromStrategies(
uint256 ethAmount
) internal returns (uint256) {
uint256 totalWithdrawn = 0;
uint256 remaining = ethAmount;
for (uint256 i = 0; i < 3; i++) {
if (remaining == 0) break;
if (strategies[i] == address(0)) continue;
try IYieldStrategy(strategies[i]).getBalance() returns (
uint256 strategyBalance
) {
if (strategyBalance == 0) continue;
uint256 toWithdraw = remaining > strategyBalance
? strategyBalance
: remaining;
try IYieldStrategy(strategies[i]).withdraw(toWithdraw) returns (
uint256 withdrawn
) {
totalWithdrawn += withdrawn;
remaining -= withdrawn;
} catch {
// Withdrawal failed
}
} catch {
// getBalance failed
}
}
return totalWithdrawn;
}
// ========== VIEW FUNCTIONS ==========
function balanceOf(address user) external view returns (uint256) {
if (totalShares == 0) return 0;
return (shares[user] * totalValueLocked) / totalShares;
}
function getVaultStats()
external
view
returns (
uint256 tvl,
uint256 totalSharesValue,
uint256 reserveBalance,
uint256 allocatedBalance,
uint256 currentAPY,
uint256 sharePrice
)
{
tvl = totalValueLocked;
totalSharesValue = totalShares;
reserveBalance = address(this).balance;
allocatedBalance = getTotalAllocated();
currentAPY = getWeightedAPY();
sharePrice = totalShares > 0
? (totalValueLocked * 1e18) / totalShares
: 1e18;
}
function getUserStats(
address user
)
external
view
returns (
uint256 userShares,
uint256 userValue,
uint256 deposited,
uint256 withdrawn,
uint256 netProfit
)
{
userShares = shares[user];
userValue = totalShares > 0
? (userShares * totalValueLocked) / totalShares
: 0;
deposited = totalUserDeposits[user];
withdrawn = totalUserWithdrawals[user];
netProfit = userValue + withdrawn > deposited
? userValue + withdrawn - deposited
: 0;
}
function getTotalAllocated() public view returns (uint256) {
uint256 total = 0;
for (uint256 i = 0; i < 3; i++) {
if (strategies[i] != address(0)) {
try IYieldStrategy(strategies[i]).getBalance() returns (
uint256 balance
) {
total += balance;
} catch {
// Failed, skip
}
}
}
return total;
}
function getStrategyBalances() external view returns (uint256[3] memory) {
uint256[3] memory balances;
for (uint256 i = 0; i < 3; i++) {
if (strategies[i] != address(0)) {
try IYieldStrategy(strategies[i]).getBalance() returns (
uint256 balance
) {
balances[i] = balance;
} catch {
balances[i] = 0;
}
}
}
return balances;
}
function getStrategyAPYs() external view returns (uint256[3] memory) {
uint256[3] memory apys;
for (uint256 i = 0; i < 3; i++) {
if (strategies[i] != address(0)) {
try IYieldStrategy(strategies[i]).getAPY() returns (
uint256 apy
) {
apys[i] = apy;
} catch {
apys[i] = 0;
}
}
}
return apys;
}
function getWeightedAPY() public view returns (uint256) {
uint256 totalBalance = 0;
uint256 weightedSum = 0;
for (uint256 i = 0; i < 3; i++) {
if (strategies[i] != address(0)) {
try IYieldStrategy(strategies[i]).getBalance() returns (
uint256 balance
) {
totalBalance += balance;
try IYieldStrategy(strategies[i]).getAPY() returns (
uint256 apy
) {
weightedSum += (balance * apy);
} catch {}
} catch {}
}
}
return totalBalance > 0 ? weightedSum / totalBalance : 0;
}
// ========== ADMIN FUNCTIONS ==========
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
function setFeeRecipient(address _feeRecipient) external onlyOwner {
feeRecipient = _feeRecipient;
}
// receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"remappings": [
"forge-std/=lib/forge-std/src/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin/=lib/openzeppelin-contracts/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 1000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": true
}Contract ABI
API[{"inputs":[{"internalType":"address","name":"_complianceManager","type":"address"},{"internalType":"address","name":"_balanceVerifier","type":"address"},{"internalType":"uint256","name":"_minBalanceThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"aave","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uniswap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lido","type":"uint256"}],"name":"AllocationsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"aave","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uniswap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lido","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FundsAllocated","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"StrategyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"strategyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"YieldHarvested","type":"event"},{"inputs":[],"name":"allocateToStrategies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocationFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceVerifier","outputs":[{"internalType":"contract IBalanceVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"complianceManager","outputs":[{"internalType":"contract IComplianceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"},{"internalType":"uint256[3]","name":"publicSignals","type":"uint256[3]"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStrategyAPYs","outputs":[{"internalType":"uint256[3]","name":"","type":"uint256[3]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStrategyBalances","outputs":[{"internalType":"uint256[3]","name":"","type":"uint256[3]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalAllocated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStats","outputs":[{"internalType":"uint256","name":"userShares","type":"uint256"},{"internalType":"uint256","name":"userValue","type":"uint256"},{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"},{"internalType":"uint256","name":"netProfit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultStats","outputs":[{"internalType":"uint256","name":"tvl","type":"uint256"},{"internalType":"uint256","name":"totalSharesValue","type":"uint256"},{"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"internalType":"uint256","name":"allocatedBalance","type":"uint256"},{"internalType":"uint256","name":"currentAPY","type":"uint256"},{"internalType":"uint256","name":"sharePrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWeightedAPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"harvestStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastAllocationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managementFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBalanceThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyAllocations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalUserDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalUserWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalValueLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"aavePercent","type":"uint256"},{"internalType":"uint256","name":"uniswapPercent","type":"uint256"},{"internalType":"uint256","name":"lidoPercent","type":"uint256"}],"name":"updateAllocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"strategy","type":"address"}],"name":"updateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sharesToBurn","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080346200033e57601f620024b738819003918201601f19168301916001600160401b03831184841017620002b1578084926060946040528339810103126200033e576200004d8162000363565b60406200005d6020840162000363565b92015160008054336001600160a01b0319821681178355929492916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556002805460ff19169055604051606081016001600160401b03811182821017620002b157604094929452620000e062000343565b60048152634161766560e01b60208201528152620000fd62000343565b60078152660556e69737761760cc1b602082015260208201526200012062000343565b60048152634c69646f60e01b6020820152604082015290600e936000925b6003841015620002c75780518051906001600160401b038211620002b1578754600181811c91168015620002a6575b60208210146200029057601f811162000247575b50602090601f8311600114620001d2579282600194936020938695600092620001c6575b5050600019600383901b1c191690841b1789555b019601930192946200013e565b015190503880620001a5565b908860005260206000209160005b601f19851681106200022e575083602093600196938796938794601f1981161062000214575b505050811b018955620001b9565b015160001960f88460031b161c1916905538808062000206565b91926020600181928685015181550194019201620001e0565b886000526020600020601f840160051c81016020851062000288575b601f830160051c820181106200027b57505062000181565b6000815560010162000263565b508062000263565b634e487b7160e01b600052602260045260246000fd5b90607f16906200016d565b634e487b7160e01b600052604160045260246000fd5b50620151806015556103e8601655603260175560028054610100600160a81b031916600886901b610100600160a81b0316179055600380546001600160a01b03199081166001600160a01b0393909316929092179055600491909155601880549091163317905560405161213e9081620003798239f35b600080fd5b60408051919082016001600160401b03811183821017620002b157604052565b51906001600160a01b03821682036200033e5756fe6080604081815260049182361015610022575b505050361561002057600080fd5b005b600092833560e01c9182630ba36dcd14611989575081630c36b3d2146117cd57816319412789146117a1578163219d4b8f146117845781632e1a7d4d146114755781633a98ef39146114565781633f4ba83a146113b7578163469048401461138f5781634c16398e146112875781634e43603a146111ca5781635c975abb146111a65781636c8d33231461117e57816370a0823114611158578163715018a6146110f257816374cbc6b414610da857816377d38f3e14610d895781637914d86414610d6b5781637966477614610c8a5781637a57dda714610bb157816382299a5c14610b8d5781638456cb5914610b325781638778878214610b1357816389aabcfc14610a2d57816389e658cc14610a0e5781638da5cb5b146109e8578163a59aa5a614610945578163a6f7f5d614610926578163cab63b5c146108ef578163cada242b146108b8578163cd2b882814610724578163ce7c2ac2146106ed578163d02baf25146106c1578163d0e30db014610528578163d574ea3d146104f2578163e74b981b146104a3578163ec18154e14610484578163f01e3735146102f7578163f2fde38b1461020c575063ff7bce23146101df5780610012565b346102085781600319360112610208576020906001600160a01b0360025460081c169051908152f35b5080fd5b9050346102f35760203660031901126102f3576102276119bd565b90610230611e90565b6001600160a01b0380921692831561028a57505082548273ffffffffffffffffffffffffffffffffffffffff198216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b8280fd5b9050346102f357816003193601126102f357803591602435916001600160a01b03831680930361048057610329611e90565b6003841061033681611aaa565b1561046d575082600b018273ffffffffffffffffffffffffffffffffffffffff1982541617905582600e019080519283526020816020850152859280549061037d826119d8565b809487015260609060019260018116908160001461042357506001146103c9575b88887fb96b9e4835db7b164f8ccfb5126f72c5d454c38e24866200a9e02e888a5d908a8989038aa280f35b8852602088208895505b84861061041057505050509082016060019050817fb96b9e4835db7b164f8ccfb5126f72c5d454c38e24866200a9e02e888a5d908a38808061039e565b80548787018301529483019482016103d3565b92505050859450606092507fb96b9e4835db7b164f8ccfb5126f72c5d454c38e24866200a9e02e888a5d908a9593915060ff191682840152151560051b820101919238808061039e565b846032602492634e487b7160e01b835252fd5b8480fd5b5050346102085781600319360112610208576020906005549051908152f35b83346104ef5760203660031901126104ef576001600160a01b036104c56119bd565b6104cd611e90565b1673ffffffffffffffffffffffffffffffffffffffff19601854161760185580f35b80fd5b9050346102f35760203660031901126102f357359160038310156104ef57506001600160a01b03602092600b0154169051908152f35b919050826003193601126102f3576001600160a01b0391610547611ee8565b61054f611f38565b600254825190630a200e5d60e41b8252338383015281602481602097889460081c165afa9081156106b757916105b26105bb927f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada39594889161068a575b50611d0f565b54341015611d5a565b6006548061066c5750600934935b338652600781528286206105de868254611af5565b9055338652600881528286206105f5348254611af5565b905533865252808420610609348254611af5565b905561061783600654611af5565b60065561062634600554611af5565b6005555134815260208101929092524260408301523391606090a261065060145460155490611af5565b42101561065f575b6001805580f35b610667611f8d565b610658565b61068461067b60099234611b18565b60055490611b2b565b936105c9565b6106aa9150873d89116106b0575b6106a28183611a60565b810190611cf7565b386105ac565b503d610698565b83513d87823e3d90fd5b9050346102f35760203660031901126102f3573560038110156102f35760209250601101549051908152f35b50503461020857602036600319011261020857806020926001600160a01b036107146119bd565b1681526007845220549051908152f35b9050346102f357826003193601126102f35761073e611e90565b610746611ee8565b61074e611f38565b8291835b600381106107df57505050801515806107d4575b806107c0575b610779575b506001805580f35b6107896127109160165490611b18565b0481808080846001600160a01b03601854165af16107a5611b4b565b5015610771576107b790600554611b8b565b60055538610771565b506001600160a01b0360185416151561076c565b506016541515610766565b846001600160a01b0382600b015416806107fe575b5050600101610752565b835190634641257d60e01b825281868160209586945af1879181610885575b5061082b575b8691506107f4565b801561082357917f46eee0760c564660379a99fd69bc8669b19dba864b3053d7dbb597d0cfbfb266848461086360019685969a611af5565b986005610871838254611af5565b905582519182524290820152a29038610823565b9091508281813d83116108b1575b61089d8183611a60565b810103126108ad5751903861081d565b8780fd5b503d610893565b50503461020857602036600319011261020857806020926001600160a01b036108df6119bd565b1681526009845220549051908152f35b50503461020857602036600319011261020857806020926001600160a01b036109166119bd565b168152600a845220549051908152f35b5050346102085781600319360112610208576020906017549051908152f35b838334610208578160031936011261020857600554916006549147610968611df4565b91610971611b98565b9385156109d457670de0b6b3a7640000908188029188830414881517156109c1575060c09750856109a191611b2b565b945b815196875260208701528501526060840152608083015260a0820152f35b8060118a634e487b7160e01b6024945252fd5b5060c09650670de0b6b3a7640000946109a3565b5050346102085781600319360112610208576001600160a01b0360209254169051908152f35b5050346102085781600319360112610208576020906015549051908152f35b919050346102f357826003193601126102f35760608151610a4d81611a44565b369037805191610a5c83611a44565b6060368437835b60038110610a7c57606084610a7a85518092611a82565bf35b6001600160a01b0381600b0154169081610a9b575b6001915001610a63565b83518092629032ff60e51b8252818560209384935afa879181610ade575b5060019350610ad4575085610ace8287611dcd565b52610a91565b610ace8287611dcd565b90915083813d8311610b0c575b610af58183611a60565b81010312610b0857600192519038610ab9565b8680fd5b503d610aeb565b5050346102085781600319360112610208576020906016549051908152f35b50503461020857816003193601126102085760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610b70611e90565b610b78611ee8565b600160ff19600254161760025551338152a180f35b505034610208578160031936011261020857602090610baa611df4565b9051908152f35b839150346102085760603660031901126102085780356024359160443590610bd7611e90565b612710610bed83610be88787611af5565b611af5565b11610c475750610c41907f7ac4f85230181c33e38028a62708509dcfe21b74e6305253b01d63ca3c28602d949583601155846012558160135551938493846040919493926060820195825260208201520152565b0390a180f35b606490602087519162461bcd60e51b8352820152600c60248201527f546f74616c203e203130302500000000000000000000000000000000000000006044820152fd5b919050346102f357826003193601126102f35760608151610caa81611a44565b369037805191610cb983611a44565b6060368437835b60038110610cd757606084610a7a85518092611a82565b6001600160a01b0381600b0154169081610cf6575b6001915001610cc0565b8351809263d2cbf7ad60e01b8252818560209384935afa879181610d3a575b5060019350610d30575085610d2a8287611dcd565b52610cec565b610d2a8287611dcd565b90915083813d8311610d64575b610d518183611a60565b81010312610b0857600192519038610d15565b503d610d47565b9050346102f357826003193601126102f35760209250549051908152f35b5050346102085781600319360112610208576020906014549051908152f35b9190506101603660031901126102f35736602312156102f357805191610dcd83611a12565b6044833682116110ee5782905b8282106110de5750505036606312156110da57815192610df984611a12565b60c484368211610b08576044905b82821061107e575050503660e3121561048057825193610e2685611a12565b61010490853683116108ad5760c4905b83821061106e575050366101231215610b08578451610e5481611a44565b610164928136851161106a5781905b85821061105a5750506001600160a01b03976002896002548a5190630a200e5d60e41b8252338b8301528160209d8e9260081c16815a91602492fa908d821561104f5790610ec492611032575b5091610f1799979593918d99979593611d0f565b610ecc611ee8565b610ed4611f38565b610ee18b54341015611d5a565b60035416948b51998a987f11479fea000000000000000000000000000000000000000000000000000000008a528c8a0190611da5565b8d908c60448a015b84841061100557505050505091610f4891610f4087959460c4870190611da5565b840190611a82565b5afa9081156106b7578591610fe8575b5015610fa757507f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada390600654801560001461066c575060093493338652600781528286206105de868254611af5565b82606492519162461bcd60e51b8352820152601560248201527f496e76616c69642062616c616e63652070726f6f6600000000000000000000006044820152fd5b610fff9150843d86116106b0576106a28183611a60565b38610f58565b829496989a5061101d8160019597999b9d9451611da5565b01920192018c989694928c8b99979593610f1f565b61104991508d803d106106b0576106a28183611a60565b38610eb0565b8c51903d90823e3d90fd5b8135815260209182019101610e63565b8980fd5b8135815260209182019101610e36565b36601f830112156108ad57855161109481611a12565b808784013681116110d65791889285949294905b8082106110c057505081529201916020019050610e07565b813586526020958601958b9550909101906110a8565b8a80fd5b8380fd5b8135815260209182019101610dda565b8580fd5b83346104ef57806003193601126104ef5761110b611e90565b806001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50503461020857602036600319011261020857602090610baa6111796119bd565b611cc7565b5050346102085781600319360112610208576020906001600160a01b03600354169051908152f35b50503461020857816003193601126102085760209060ff6002541690519015158152f35b5050346102085760203660031901126102085760a0916001600160a01b036111f06119bd565b16908181526007602052828120549260065480151560001461127f576112219061121c60055487611b18565b611b2b565b925b825260096020528082205490600a6020528083205492826112448587611af5565b1115611279575061125e826112598587611af5565b611b8b565b935b8151958652602086015284015260608301526080820152f35b93611260565b508192611223565b8284346104ef57602092836003193601126102085735600381101561020857600e01908383518093839080546112bc816119d8565b8085529160019180831690811561136c575060011461132f575b5050506112e99250959392950382611a60565b82519382859384528251928382860152825b84811061131957505050828201840152601f01601f19168101030190f35b81810183015188820188015287955082016112fb565b86528486209492508591905b8183106113545750889450508201016112e988806112d6565b8554888401850152948501948794509183019161133b565b925050506112e994925060ff191682840152151560051b820101869288806112d6565b5050346102085781600319360112610208576020906001600160a01b03601854169051908152f35b9050346102f357826003193601126102f3576113d1611e90565b6002549060ff821615611413575060ff1916600255513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152fd5b5050346102085781600319360112610208576020906006549051908152f35b919050346102f357602090816003193601126110da57823592611496611ee8565b61149e611f38565b83151580611770575b1561172f576114c46114bb60055486611b18565b60065490611b2b565b92478085116115cb575b50338652600781528286206114e4868254611b8b565b9055338652600881528286206114fb858254611b8b565b9055338652600a8152828620611512858254611af5565b905561152085600654611b8b565b60065561152f84600554611b8b565b6005558580808087335af1611542611b4b565b501561158b57505051908152602081019190915242604082015233907f75e161b3e824b114fc1a33274bd7091918dd4e639cede50b78b15a4eea956a2190606090a26001805580f35b606492519162461bcd60e51b8352820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152fd5b6115d59085611b8b565b86875b600381106115e8575b50506114ce565b821561172a5788846001600160a01b0383600b015416801561171f578851629032ff60e51b815282818a81855afa8491816116ee575b50611632575b505050506001905b016115d8565b80156116e257808711156116d9576024905b8a5194859384927f2e1a7d4d0000000000000000000000000000000000000000000000000000000084528c8401525af18a91816116aa575b5061168b575b84818b92611624565b8061169d6116a3926001949695611af5565b93611b8b565b9290611682565b9091508581813d83116116d2575b6116c28183611a60565b810103126110d65751903861167c565b503d6116b8565b50602486611644565b5050505060019061162c565b8481959293503d8311611718575b6117068183611a60565b810103126110da57879251903861161e565b503d6116fc565b50505060019061162c565b6115e1565b82606492519162461bcd60e51b8352820152600e60248201527f496e76616c6964207368617265730000000000000000000000000000000000006044820152fd5b5033855260078352818520548411156114a7565b505034610208578160031936011261020857602090610baa611b98565b83346104ef57806003193601126104ef576117ba611e90565b6117c2611ee8565b6117ca611f8d565b80f35b83833461020857602092836003193601126102f35780356117ec611e90565b6117f4611ee8565b6117fc611f38565b6003811061180981611aaa565b15611976576001600160a01b03918282600b015416908115611934578592918791865180988193634641257d60e01b83525af194851561192a5782956118fb575b508461185e575b5050506001805551908152f35b61186a85600554611af5565b6005557f46eee0760c564660379a99fd69bc8669b19dba864b3053d7dbb597d0cfbfb2668480518781524289820152a2601654801515806118ee575b156118515781806127106118bb829489611b18565b048095601854165af16118cc611b4b565b506118d9575b8080611851565b6118e590600554611b8b565b600555836118d2565b50826018541615156118a6565b9094508581813d8311611923575b6119138183611a60565b810103126102085751938661184a565b503d611909565b84513d84823e3d90fd5b6064908786519162461bcd60e51b8352820152601060248201527f5374726174656779206e6f7420736574000000000000000000000000000000006044820152fd5b602484603284634e487b7160e01b835252fd5b849084346102f35760203660031901126102f3576020926001600160a01b036119b06119bd565b1681526008845220548152f35b600435906001600160a01b03821682036119d357565b600080fd5b90600182811c92168015611a08575b60208310146119f257565b634e487b7160e01b600052602260045260246000fd5b91607f16916119e7565b6040810190811067ffffffffffffffff821117611a2e57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff821117611a2e57604052565b90601f8019910116810190811067ffffffffffffffff821117611a2e57604052565b6000915b60038310611a9357505050565b600190825181526020809101920192019190611a86565b15611ab157565b606460405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e646578000000000000000000000000000000000000006044820152fd5b91908201809211611b0257565b634e487b7160e01b600052601160045260246000fd5b81810292918115918404141715611b0257565b8115611b35570490565b634e487b7160e01b600052601260045260246000fd5b3d15611b86573d9067ffffffffffffffff8211611a2e5760405191611b7a601f8201601f191660200184611a60565b82523d6000602084013e565b606090565b91908203918211611b0257565b600080805b60038110611bbf57508015611bb857611bb591611b2b565b90565b5050600090565b6001600160a01b0381600b01541680611bdc575b50600101611b9d565b6040908151629032ff60e51b8152602060049281838581845afa60009381611c98575b50611c0e575b50505050611bd3565b611c1c838394959698611af5565b96519485809263d2cbf7ad60e01b82525afa928391600094611c67575b5050611c48575b808080611c05565b93611c59611c5f9260019496611b18565b90611af5565b929038611c40565b8181959293953d8311611c91575b611c7f8183611a60565b810103126104ef575051913880611c39565b503d611c75565b90938382813d8311611cc0575b611caf8183611a60565b810103126104ef5750519238611bff565b503d611ca5565b6006548015611bb8576001600160a01b03611bb59216600052600760205261121c60406000205460055490611b18565b908160209103126119d3575180151581036119d35790565b15611d1657565b606460405162461bcd60e51b815260206004820152600d60248201527f4e6f7420636f6d706c69616e74000000000000000000000000000000000000006044820152fd5b15611d6157565b606460405162461bcd60e51b815260206004820152601560248201527f42656c6f77206d696e696d756d206465706f73697400000000000000000000006044820152fd5b6000915b60028310611db657505050565b600190825181526020809101920192019190611da9565b906003811015611dde5760051b0190565b634e487b7160e01b600052603260045260246000fd5b6000805b60038110611e04575090565b6001600160a01b0381600b01541680611e21575b50600101611df8565b6040518091629032ff60e51b825281600460209384935afa918291600093611e5f575b505015611e1857611e589060019293611af5565b9190611e18565b8181949293943d8311611e89575b611e778183611a60565b810103126104ef575051903880611e44565b503d611e6d565b6001600160a01b03600054163303611ea457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60025416611ef457565b606460405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152fd5b600260015414611f49576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b47801561210557604091825190611fa382611a44565b606036833761271080611fb860115486611b18565b048352611fdd81611fcb60125487611b18565b04946020850195865260135490611b18565b049084830191825260005b6003811015806120bb57611ffc8286611dcd565b511515806120a2575b612013575b50600101611fe8565b611dde576001600160a01b0381600b01541661202f8286611dcd565b51813b156119d3576000885180937fd0e30db00000000000000000000000000000000000000000000000000000000082528160049485925af1612073575b5061200a565b67ffffffffffffffff821161208d5750865260013861206d565b604190634e487b7160e01b6000525260246000fd5b505060006001600160a01b0382600b0154161515612005565b505093907f8ec82059003c25a01be08491bfaf15e477fc90b27f3f6b6f9ea7094215f8e5ad93916080934260145551925191519181519384526020840152820152426060820152a1565b5056fea2646970667358221220ab0dbfb6502be553e6e111c84bbc0f7151e78893dadc9b1900db2479d38f0aba64736f6c634300081800330000000000000000000000004b4b79a98a4d705faf185d765f287e84c3195f060000000000000000000000001c43248802896b172aa804dc3fab1cff2277a07800000000000000000000000000000000000000000000000000038d7ea4c68000
Deployed Bytecode
0x6080604081815260049182361015610022575b505050361561002057600080fd5b005b600092833560e01c9182630ba36dcd14611989575081630c36b3d2146117cd57816319412789146117a1578163219d4b8f146117845781632e1a7d4d146114755781633a98ef39146114565781633f4ba83a146113b7578163469048401461138f5781634c16398e146112875781634e43603a146111ca5781635c975abb146111a65781636c8d33231461117e57816370a0823114611158578163715018a6146110f257816374cbc6b414610da857816377d38f3e14610d895781637914d86414610d6b5781637966477614610c8a5781637a57dda714610bb157816382299a5c14610b8d5781638456cb5914610b325781638778878214610b1357816389aabcfc14610a2d57816389e658cc14610a0e5781638da5cb5b146109e8578163a59aa5a614610945578163a6f7f5d614610926578163cab63b5c146108ef578163cada242b146108b8578163cd2b882814610724578163ce7c2ac2146106ed578163d02baf25146106c1578163d0e30db014610528578163d574ea3d146104f2578163e74b981b146104a3578163ec18154e14610484578163f01e3735146102f7578163f2fde38b1461020c575063ff7bce23146101df5780610012565b346102085781600319360112610208576020906001600160a01b0360025460081c169051908152f35b5080fd5b9050346102f35760203660031901126102f3576102276119bd565b90610230611e90565b6001600160a01b0380921692831561028a57505082548273ffffffffffffffffffffffffffffffffffffffff198216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b8280fd5b9050346102f357816003193601126102f357803591602435916001600160a01b03831680930361048057610329611e90565b6003841061033681611aaa565b1561046d575082600b018273ffffffffffffffffffffffffffffffffffffffff1982541617905582600e019080519283526020816020850152859280549061037d826119d8565b809487015260609060019260018116908160001461042357506001146103c9575b88887fb96b9e4835db7b164f8ccfb5126f72c5d454c38e24866200a9e02e888a5d908a8989038aa280f35b8852602088208895505b84861061041057505050509082016060019050817fb96b9e4835db7b164f8ccfb5126f72c5d454c38e24866200a9e02e888a5d908a38808061039e565b80548787018301529483019482016103d3565b92505050859450606092507fb96b9e4835db7b164f8ccfb5126f72c5d454c38e24866200a9e02e888a5d908a9593915060ff191682840152151560051b820101919238808061039e565b846032602492634e487b7160e01b835252fd5b8480fd5b5050346102085781600319360112610208576020906005549051908152f35b83346104ef5760203660031901126104ef576001600160a01b036104c56119bd565b6104cd611e90565b1673ffffffffffffffffffffffffffffffffffffffff19601854161760185580f35b80fd5b9050346102f35760203660031901126102f357359160038310156104ef57506001600160a01b03602092600b0154169051908152f35b919050826003193601126102f3576001600160a01b0391610547611ee8565b61054f611f38565b600254825190630a200e5d60e41b8252338383015281602481602097889460081c165afa9081156106b757916105b26105bb927f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada39594889161068a575b50611d0f565b54341015611d5a565b6006548061066c5750600934935b338652600781528286206105de868254611af5565b9055338652600881528286206105f5348254611af5565b905533865252808420610609348254611af5565b905561061783600654611af5565b60065561062634600554611af5565b6005555134815260208101929092524260408301523391606090a261065060145460155490611af5565b42101561065f575b6001805580f35b610667611f8d565b610658565b61068461067b60099234611b18565b60055490611b2b565b936105c9565b6106aa9150873d89116106b0575b6106a28183611a60565b810190611cf7565b386105ac565b503d610698565b83513d87823e3d90fd5b9050346102f35760203660031901126102f3573560038110156102f35760209250601101549051908152f35b50503461020857602036600319011261020857806020926001600160a01b036107146119bd565b1681526007845220549051908152f35b9050346102f357826003193601126102f35761073e611e90565b610746611ee8565b61074e611f38565b8291835b600381106107df57505050801515806107d4575b806107c0575b610779575b506001805580f35b6107896127109160165490611b18565b0481808080846001600160a01b03601854165af16107a5611b4b565b5015610771576107b790600554611b8b565b60055538610771565b506001600160a01b0360185416151561076c565b506016541515610766565b846001600160a01b0382600b015416806107fe575b5050600101610752565b835190634641257d60e01b825281868160209586945af1879181610885575b5061082b575b8691506107f4565b801561082357917f46eee0760c564660379a99fd69bc8669b19dba864b3053d7dbb597d0cfbfb266848461086360019685969a611af5565b986005610871838254611af5565b905582519182524290820152a29038610823565b9091508281813d83116108b1575b61089d8183611a60565b810103126108ad5751903861081d565b8780fd5b503d610893565b50503461020857602036600319011261020857806020926001600160a01b036108df6119bd565b1681526009845220549051908152f35b50503461020857602036600319011261020857806020926001600160a01b036109166119bd565b168152600a845220549051908152f35b5050346102085781600319360112610208576020906017549051908152f35b838334610208578160031936011261020857600554916006549147610968611df4565b91610971611b98565b9385156109d457670de0b6b3a7640000908188029188830414881517156109c1575060c09750856109a191611b2b565b945b815196875260208701528501526060840152608083015260a0820152f35b8060118a634e487b7160e01b6024945252fd5b5060c09650670de0b6b3a7640000946109a3565b5050346102085781600319360112610208576001600160a01b0360209254169051908152f35b5050346102085781600319360112610208576020906015549051908152f35b919050346102f357826003193601126102f35760608151610a4d81611a44565b369037805191610a5c83611a44565b6060368437835b60038110610a7c57606084610a7a85518092611a82565bf35b6001600160a01b0381600b0154169081610a9b575b6001915001610a63565b83518092629032ff60e51b8252818560209384935afa879181610ade575b5060019350610ad4575085610ace8287611dcd565b52610a91565b610ace8287611dcd565b90915083813d8311610b0c575b610af58183611a60565b81010312610b0857600192519038610ab9565b8680fd5b503d610aeb565b5050346102085781600319360112610208576020906016549051908152f35b50503461020857816003193601126102085760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610b70611e90565b610b78611ee8565b600160ff19600254161760025551338152a180f35b505034610208578160031936011261020857602090610baa611df4565b9051908152f35b839150346102085760603660031901126102085780356024359160443590610bd7611e90565b612710610bed83610be88787611af5565b611af5565b11610c475750610c41907f7ac4f85230181c33e38028a62708509dcfe21b74e6305253b01d63ca3c28602d949583601155846012558160135551938493846040919493926060820195825260208201520152565b0390a180f35b606490602087519162461bcd60e51b8352820152600c60248201527f546f74616c203e203130302500000000000000000000000000000000000000006044820152fd5b919050346102f357826003193601126102f35760608151610caa81611a44565b369037805191610cb983611a44565b6060368437835b60038110610cd757606084610a7a85518092611a82565b6001600160a01b0381600b0154169081610cf6575b6001915001610cc0565b8351809263d2cbf7ad60e01b8252818560209384935afa879181610d3a575b5060019350610d30575085610d2a8287611dcd565b52610cec565b610d2a8287611dcd565b90915083813d8311610d64575b610d518183611a60565b81010312610b0857600192519038610d15565b503d610d47565b9050346102f357826003193601126102f35760209250549051908152f35b5050346102085781600319360112610208576020906014549051908152f35b9190506101603660031901126102f35736602312156102f357805191610dcd83611a12565b6044833682116110ee5782905b8282106110de5750505036606312156110da57815192610df984611a12565b60c484368211610b08576044905b82821061107e575050503660e3121561048057825193610e2685611a12565b61010490853683116108ad5760c4905b83821061106e575050366101231215610b08578451610e5481611a44565b610164928136851161106a5781905b85821061105a5750506001600160a01b03976002896002548a5190630a200e5d60e41b8252338b8301528160209d8e9260081c16815a91602492fa908d821561104f5790610ec492611032575b5091610f1799979593918d99979593611d0f565b610ecc611ee8565b610ed4611f38565b610ee18b54341015611d5a565b60035416948b51998a987f11479fea000000000000000000000000000000000000000000000000000000008a528c8a0190611da5565b8d908c60448a015b84841061100557505050505091610f4891610f4087959460c4870190611da5565b840190611a82565b5afa9081156106b7578591610fe8575b5015610fa757507f91ede45f04a37a7c170f5c1207df3b6bc748dc1e04ad5e917a241d0f52feada390600654801560001461066c575060093493338652600781528286206105de868254611af5565b82606492519162461bcd60e51b8352820152601560248201527f496e76616c69642062616c616e63652070726f6f6600000000000000000000006044820152fd5b610fff9150843d86116106b0576106a28183611a60565b38610f58565b829496989a5061101d8160019597999b9d9451611da5565b01920192018c989694928c8b99979593610f1f565b61104991508d803d106106b0576106a28183611a60565b38610eb0565b8c51903d90823e3d90fd5b8135815260209182019101610e63565b8980fd5b8135815260209182019101610e36565b36601f830112156108ad57855161109481611a12565b808784013681116110d65791889285949294905b8082106110c057505081529201916020019050610e07565b813586526020958601958b9550909101906110a8565b8a80fd5b8380fd5b8135815260209182019101610dda565b8580fd5b83346104ef57806003193601126104ef5761110b611e90565b806001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b50503461020857602036600319011261020857602090610baa6111796119bd565b611cc7565b5050346102085781600319360112610208576020906001600160a01b03600354169051908152f35b50503461020857816003193601126102085760209060ff6002541690519015158152f35b5050346102085760203660031901126102085760a0916001600160a01b036111f06119bd565b16908181526007602052828120549260065480151560001461127f576112219061121c60055487611b18565b611b2b565b925b825260096020528082205490600a6020528083205492826112448587611af5565b1115611279575061125e826112598587611af5565b611b8b565b935b8151958652602086015284015260608301526080820152f35b93611260565b508192611223565b8284346104ef57602092836003193601126102085735600381101561020857600e01908383518093839080546112bc816119d8565b8085529160019180831690811561136c575060011461132f575b5050506112e99250959392950382611a60565b82519382859384528251928382860152825b84811061131957505050828201840152601f01601f19168101030190f35b81810183015188820188015287955082016112fb565b86528486209492508591905b8183106113545750889450508201016112e988806112d6565b8554888401850152948501948794509183019161133b565b925050506112e994925060ff191682840152151560051b820101869288806112d6565b5050346102085781600319360112610208576020906001600160a01b03601854169051908152f35b9050346102f357826003193601126102f3576113d1611e90565b6002549060ff821615611413575060ff1916600255513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152fd5b5050346102085781600319360112610208576020906006549051908152f35b919050346102f357602090816003193601126110da57823592611496611ee8565b61149e611f38565b83151580611770575b1561172f576114c46114bb60055486611b18565b60065490611b2b565b92478085116115cb575b50338652600781528286206114e4868254611b8b565b9055338652600881528286206114fb858254611b8b565b9055338652600a8152828620611512858254611af5565b905561152085600654611b8b565b60065561152f84600554611b8b565b6005558580808087335af1611542611b4b565b501561158b57505051908152602081019190915242604082015233907f75e161b3e824b114fc1a33274bd7091918dd4e639cede50b78b15a4eea956a2190606090a26001805580f35b606492519162461bcd60e51b8352820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152fd5b6115d59085611b8b565b86875b600381106115e8575b50506114ce565b821561172a5788846001600160a01b0383600b015416801561171f578851629032ff60e51b815282818a81855afa8491816116ee575b50611632575b505050506001905b016115d8565b80156116e257808711156116d9576024905b8a5194859384927f2e1a7d4d0000000000000000000000000000000000000000000000000000000084528c8401525af18a91816116aa575b5061168b575b84818b92611624565b8061169d6116a3926001949695611af5565b93611b8b565b9290611682565b9091508581813d83116116d2575b6116c28183611a60565b810103126110d65751903861167c565b503d6116b8565b50602486611644565b5050505060019061162c565b8481959293503d8311611718575b6117068183611a60565b810103126110da57879251903861161e565b503d6116fc565b50505060019061162c565b6115e1565b82606492519162461bcd60e51b8352820152600e60248201527f496e76616c6964207368617265730000000000000000000000000000000000006044820152fd5b5033855260078352818520548411156114a7565b505034610208578160031936011261020857602090610baa611b98565b83346104ef57806003193601126104ef576117ba611e90565b6117c2611ee8565b6117ca611f8d565b80f35b83833461020857602092836003193601126102f35780356117ec611e90565b6117f4611ee8565b6117fc611f38565b6003811061180981611aaa565b15611976576001600160a01b03918282600b015416908115611934578592918791865180988193634641257d60e01b83525af194851561192a5782956118fb575b508461185e575b5050506001805551908152f35b61186a85600554611af5565b6005557f46eee0760c564660379a99fd69bc8669b19dba864b3053d7dbb597d0cfbfb2668480518781524289820152a2601654801515806118ee575b156118515781806127106118bb829489611b18565b048095601854165af16118cc611b4b565b506118d9575b8080611851565b6118e590600554611b8b565b600555836118d2565b50826018541615156118a6565b9094508581813d8311611923575b6119138183611a60565b810103126102085751938661184a565b503d611909565b84513d84823e3d90fd5b6064908786519162461bcd60e51b8352820152601060248201527f5374726174656779206e6f7420736574000000000000000000000000000000006044820152fd5b602484603284634e487b7160e01b835252fd5b849084346102f35760203660031901126102f3576020926001600160a01b036119b06119bd565b1681526008845220548152f35b600435906001600160a01b03821682036119d357565b600080fd5b90600182811c92168015611a08575b60208310146119f257565b634e487b7160e01b600052602260045260246000fd5b91607f16916119e7565b6040810190811067ffffffffffffffff821117611a2e57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff821117611a2e57604052565b90601f8019910116810190811067ffffffffffffffff821117611a2e57604052565b6000915b60038310611a9357505050565b600190825181526020809101920192019190611a86565b15611ab157565b606460405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e646578000000000000000000000000000000000000006044820152fd5b91908201809211611b0257565b634e487b7160e01b600052601160045260246000fd5b81810292918115918404141715611b0257565b8115611b35570490565b634e487b7160e01b600052601260045260246000fd5b3d15611b86573d9067ffffffffffffffff8211611a2e5760405191611b7a601f8201601f191660200184611a60565b82523d6000602084013e565b606090565b91908203918211611b0257565b600080805b60038110611bbf57508015611bb857611bb591611b2b565b90565b5050600090565b6001600160a01b0381600b01541680611bdc575b50600101611b9d565b6040908151629032ff60e51b8152602060049281838581845afa60009381611c98575b50611c0e575b50505050611bd3565b611c1c838394959698611af5565b96519485809263d2cbf7ad60e01b82525afa928391600094611c67575b5050611c48575b808080611c05565b93611c59611c5f9260019496611b18565b90611af5565b929038611c40565b8181959293953d8311611c91575b611c7f8183611a60565b810103126104ef575051913880611c39565b503d611c75565b90938382813d8311611cc0575b611caf8183611a60565b810103126104ef5750519238611bff565b503d611ca5565b6006548015611bb8576001600160a01b03611bb59216600052600760205261121c60406000205460055490611b18565b908160209103126119d3575180151581036119d35790565b15611d1657565b606460405162461bcd60e51b815260206004820152600d60248201527f4e6f7420636f6d706c69616e74000000000000000000000000000000000000006044820152fd5b15611d6157565b606460405162461bcd60e51b815260206004820152601560248201527f42656c6f77206d696e696d756d206465706f73697400000000000000000000006044820152fd5b6000915b60028310611db657505050565b600190825181526020809101920192019190611da9565b906003811015611dde5760051b0190565b634e487b7160e01b600052603260045260246000fd5b6000805b60038110611e04575090565b6001600160a01b0381600b01541680611e21575b50600101611df8565b6040518091629032ff60e51b825281600460209384935afa918291600093611e5f575b505015611e1857611e589060019293611af5565b9190611e18565b8181949293943d8311611e89575b611e778183611a60565b810103126104ef575051903880611e44565b503d611e6d565b6001600160a01b03600054163303611ea457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60025416611ef457565b606460405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152fd5b600260015414611f49576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b47801561210557604091825190611fa382611a44565b606036833761271080611fb860115486611b18565b048352611fdd81611fcb60125487611b18565b04946020850195865260135490611b18565b049084830191825260005b6003811015806120bb57611ffc8286611dcd565b511515806120a2575b612013575b50600101611fe8565b611dde576001600160a01b0381600b01541661202f8286611dcd565b51813b156119d3576000885180937fd0e30db00000000000000000000000000000000000000000000000000000000082528160049485925af1612073575b5061200a565b67ffffffffffffffff821161208d5750865260013861206d565b604190634e487b7160e01b6000525260246000fd5b505060006001600160a01b0382600b0154161515612005565b505093907f8ec82059003c25a01be08491bfaf15e477fc90b27f3f6b6f9ea7094215f8e5ad93916080934260145551925191519181519384526020840152820152426060820152a1565b5056fea2646970667358221220ab0dbfb6502be553e6e111c84bbc0f7151e78893dadc9b1900db2479d38f0aba64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004b4b79a98a4d705faf185d765f287e84c3195f060000000000000000000000001c43248802896b172aa804dc3fab1cff2277a07800000000000000000000000000000000000000000000000000038d7ea4c68000
-----Decoded View---------------
Arg [0] : _complianceManager (address): 0x4B4b79A98A4d705fAf185d765f287E84C3195F06
Arg [1] : _balanceVerifier (address): 0x1C43248802896b172Aa804dc3FAb1cFF2277a078
Arg [2] : _minBalanceThreshold (uint256): 1000000000000000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004b4b79a98a4d705faf185d765f287e84c3195f06
Arg [1] : 0000000000000000000000001c43248802896b172aa804dc3fab1cff2277a078
Arg [2] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.