This address is reported to be at risk due to a Sorbet Finance hack. The owner is advised to secure their funds by revoking approvals now.
Source Code
More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GuniMultiplyProxyActions
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity >=0.7.6; pragma abicoder v2; import "../interfaces/IERC20.sol"; import "./ExchangeData.sol"; import "../utils/SafeMath.sol"; import "../interfaces/mcd/IJoin.sol"; import "../interfaces/mcd/IManager.sol"; import "../interfaces/mcd/IVat.sol"; import "../interfaces/mcd/IJug.sol"; import "../interfaces/mcd/IDaiJoin.sol"; import "../interfaces/misc/IUniPool.sol"; import "../interfaces/misc/IGUNIRouter.sol"; import "../interfaces/misc/IGUNIResolver.sol"; import "../interfaces/misc/IGUNIToken.sol"; import "../interfaces/exchange/IExchange.sol"; import "./../flashMint/interface/IERC3156FlashBorrower.sol"; import "./../flashMint/interface/IERC3156FlashLender.sol"; struct CdpData { address gemJoin; address payable fundsReceiver; uint256 cdpId; bytes32 ilk; uint256 requiredDebt; uint256 token0Amount; string methodName; } struct GuniAddressRegistry { address guni; address router; address resolver; address guniProxyActions; address otherToken; address exchange; address jug; address manager; address lender; } contract GuniMultiplyProxyActions is IERC3156FlashBorrower { using SafeMath for uint256; uint256 constant RAY = 10**27; address public constant DAIJOIN = 0x9759A6Ac90977b93B58547b4A71c78317f391A28; address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; IERC20 public constant daiContract = IERC20(DAI); modifier logMethodName( string memory name, CdpData memory data, address destination ) { if (bytes(data.methodName).length == 0) { data.methodName = name; } _; data.methodName = ""; } function openMultiplyGuniVault( ExchangeData calldata exchangeData, CdpData memory cdpData, GuniAddressRegistry calldata guniAddressRegistry ) public logMethodName("openMultiplyGuniVault", cdpData, guniAddressRegistry.guniProxyActions) { cdpData.ilk = IJoin(cdpData.gemJoin).ilk(); cdpData.cdpId = IManager(guniAddressRegistry.manager).open(cdpData.ilk, address(this)); increaseMultipleGuni(exchangeData, cdpData, guniAddressRegistry); } function increaseMultipleGuni( ExchangeData calldata exchangeData, CdpData memory cdpData, GuniAddressRegistry calldata guniAddressRegistry ) public logMethodName("increaseMultipleGuni", cdpData, guniAddressRegistry.guniProxyActions) { daiContract.transferFrom( msg.sender, guniAddressRegistry.guniProxyActions, cdpData.token0Amount ); takeAFlashLoan(exchangeData, cdpData, guniAddressRegistry, 1); } function closeGuniVaultExitDai( ExchangeData calldata exchangeData, CdpData memory cdpData, GuniAddressRegistry calldata guniAddressRegistry ) public logMethodName("closeGuniVaultExitDai", cdpData, guniAddressRegistry.guniProxyActions) { cdpData.ilk = IJoin(cdpData.gemJoin).ilk(); address urn = IManager(guniAddressRegistry.manager).urns(cdpData.cdpId); address vat = IManager(guniAddressRegistry.manager).vat(); uint256 wadD = _getWipeAllWad(vat, urn, urn, cdpData.ilk); cdpData.requiredDebt = wadD; takeAFlashLoan(exchangeData, cdpData, guniAddressRegistry, 0); } function takeAFlashLoan( ExchangeData calldata exchangeData, CdpData memory cdpData, GuniAddressRegistry calldata guniAddressRegistry, uint256 action ) internal { bytes memory paramsData = abi.encode(action, exchangeData, cdpData, guniAddressRegistry); IManager(guniAddressRegistry.manager).cdpAllow( cdpData.cdpId, guniAddressRegistry.guniProxyActions, 1 ); IERC3156FlashLender(guniAddressRegistry.lender).flashLoan( IERC3156FlashBorrower(guniAddressRegistry.guniProxyActions), DAI, cdpData.requiredDebt, paramsData ); IManager(guniAddressRegistry.manager).cdpAllow( cdpData.cdpId, guniAddressRegistry.guniProxyActions, 0 ); } function _increaseMPGuni( ExchangeData memory exchangeData, CdpData memory cdpData, GuniAddressRegistry memory guniAddressRegistry, uint256 borrowedDaiAmount ) internal { IGUNIToken guni = IGUNIToken(guniAddressRegistry.guni); IERC20 otherToken = IERC20(guniAddressRegistry.otherToken); uint256 bal0 = daiContract.balanceOf(address(this)); { IExchange exchange = IExchange(guniAddressRegistry.exchange); daiContract.approve(address(exchange), exchangeData.fromTokenAmount); exchange.swapDaiForToken( exchangeData.toTokenAddress, exchangeData.fromTokenAmount, exchangeData.minToTokenAmount, exchangeData.exchangeAddress, exchangeData._exchangeCalldata ); } uint256 guniBalance; uint256 bal1 = otherToken.balanceOf(address(this)); bal0 = daiContract.balanceOf(address(this)); { IGUNIRouter router = IGUNIRouter(guniAddressRegistry.router); daiContract.approve(address(router), bal0); otherToken.approve(address(router), bal1); (, , guniBalance) = router.addLiquidity(address(guni), bal0, bal1, 0, 0, address(this)); } guni.approve(guniAddressRegistry.guniProxyActions, guniBalance); joinDrawDebt( cdpData, borrowedDaiAmount.sub(IERC20(DAI).balanceOf(address(this))), guniAddressRegistry.manager, guniAddressRegistry.jug ); uint256 daiLeft = IERC20(DAI).balanceOf(address(this)).sub(borrowedDaiAmount); uint256 otherTokenLeft = otherToken.balanceOf(address(this)); emit MultipleActionCalled( cdpData.methodName, cdpData.cdpId, exchangeData.minToTokenAmount, exchangeData.toTokenAmount, 0, daiLeft ); if (daiLeft > 0) { IERC20(DAI).transfer(cdpData.fundsReceiver, daiLeft); } if (otherTokenLeft > 0) { otherToken.transfer(cdpData.fundsReceiver, otherTokenLeft); } } function _closeToDaiMPGuni( ExchangeData memory exchangeData, CdpData memory cdpData, GuniAddressRegistry memory guniAddressRegistry, uint256 borrowedDaiAmount ) internal { IExchange exchange = IExchange(guniAddressRegistry.exchange); IERC20 otherToken = IERC20(guniAddressRegistry.otherToken); uint256 ink = getInk(guniAddressRegistry.manager, cdpData); wipeAndFreeGem( guniAddressRegistry.manager, cdpData.gemJoin, cdpData.cdpId, cdpData.requiredDebt, ink ); IGUNIToken guni = IGUNIToken(guniAddressRegistry.guni); uint256 guniBalance = guni.balanceOf(address(this)); { IGUNIRouter router = IGUNIRouter(guniAddressRegistry.router); guni.approve(address(router), guniBalance); router.removeLiquidity(address(guni), guniBalance, 0, 0, address(this)); } otherToken.approve(address(exchange), otherToken.balanceOf(address(this))); exchange.swapTokenForDai( exchangeData.toTokenAddress, otherToken.balanceOf(address(this)), exchangeData.minToTokenAmount, exchangeData.exchangeAddress, exchangeData._exchangeCalldata ); uint256 daiLeft = IERC20(DAI).balanceOf(address(this)).sub(borrowedDaiAmount); uint256 otherTokenLeft = otherToken.balanceOf(address(this)); emit MultipleActionCalled( cdpData.methodName, cdpData.cdpId, exchangeData.minToTokenAmount, exchangeData.toTokenAmount, 0, daiLeft ); if (daiLeft > 0) { IERC20(DAI).transfer(cdpData.fundsReceiver, daiLeft); } if (otherTokenLeft > 0) { otherToken.transfer(cdpData.fundsReceiver, otherTokenLeft); } } function onFlashLoan( address initiator, address token, uint256 amount, uint256 fee, bytes calldata params ) public override returns (bytes32) { ( uint256 mode, ExchangeData memory exchangeData, CdpData memory cdpData, GuniAddressRegistry memory guniAddressRegistry ) = abi.decode(params, (uint256, ExchangeData, CdpData, GuniAddressRegistry)); require(msg.sender == address(guniAddressRegistry.lender), "mpa-untrusted-lender"); uint256 borrowedDaiAmount; { borrowedDaiAmount = amount.add(fee); } emit FLData(IERC20(DAI).balanceOf(address(this)).sub(cdpData.token0Amount), borrowedDaiAmount); require( cdpData.requiredDebt.add(cdpData.token0Amount) <= IERC20(DAI).balanceOf(address(this)), "mpa-receive-requested-amount-mismatch" ); if (mode == 1) { _increaseMPGuni(exchangeData, cdpData, guniAddressRegistry, borrowedDaiAmount); } if (mode == 0) { _closeToDaiMPGuni(exchangeData, cdpData, guniAddressRegistry, borrowedDaiAmount); } IERC20(token).approve(guniAddressRegistry.lender, borrowedDaiAmount); return keccak256("ERC3156FlashBorrower.onFlashLoan"); } function getOtherTokenAmount( IGUNIToken guni, IGUNIResolver resolver, uint256 bal0, uint256 otherTokenDecimals ) public view returns (uint256 amount) { (uint256 sqrtPriceX96, , , , , , ) = IUniPool(guni.pool()).slot0(); uint256 otherTokenTo18Conv = 10**(18 - otherTokenDecimals); (, amount) = resolver.getRebalanceParams( address(guni), guni.token0() == DAI ? bal0 : 0, guni.token1() == DAI ? bal0 : 0, ((((sqrtPriceX96 * sqrtPriceX96) >> 96) * 1e18) >> 96) * otherTokenTo18Conv ); } function getInk(address manager, CdpData memory cdpData) internal view returns (uint256) { address urn = IManager(manager).urns(cdpData.cdpId); address vat = IManager(manager).vat(); (uint256 ink, ) = IVat(vat).urns(cdpData.ilk, urn); return ink; } function wipeAndFreeGem( address manager, address gemJoin, uint256 cdp, uint256 borrowedDai, uint256 collateralDraw ) internal { address vat = IManager(manager).vat(); address urn = IManager(manager).urns(cdp); bytes32 ilk = IManager(manager).ilks(cdp); IERC20(DAI).approve(DAIJOIN, borrowedDai); IDaiJoin(DAIJOIN).join(urn, borrowedDai); uint256 wadC = convertTo18(gemJoin, collateralDraw); IManager(manager).frob(cdp, -toInt256(wadC), _getWipeDart(vat, IVat(vat).dai(urn), urn, ilk)); IManager(manager).flux(cdp, address(this), wadC); IJoin(gemJoin).exit(address(this), collateralDraw); } function convertTo18(address gemJoin, uint256 amt) internal returns (uint256 wad) { // For those collaterals that have less than 18 decimals precision we need to do the conversion before passing to frob function // Adapters will automatically handle the difference of precision wad = amt.mul(10**(18 - IJoin(gemJoin).dec())); } function _getWipeDart( address vat, uint256 dai, address urn, bytes32 ilk ) internal view returns (int256 dart) { // Gets actual rate from the vat (, uint256 rate, , , ) = IVat(vat).ilks(ilk); // Gets actual art value of the urn (, uint256 art) = IVat(vat).urns(ilk, urn); // Uses the whole dai balance in the vat to reduce the debt dart = toInt256(dai / rate); // Checks the calculated dart is not higher than urn.art (total debt), otherwise uses its value dart = uint256(dart) <= art ? -dart : -toInt256(art); } function joinDrawDebt( CdpData memory cdpData, uint256 borrowedDai, address manager, address jug ) private { IGem gem = IJoin(cdpData.gemJoin).gem(); uint256 balance = IERC20(address(gem)).balanceOf(address(this)); gem.approve(address(cdpData.gemJoin), balance); address urn = IManager(manager).urns(cdpData.cdpId); address vat = IManager(manager).vat(); IJoin(cdpData.gemJoin).join(urn, balance); IManager(manager).frob( cdpData.cdpId, toInt256(convertTo18(cdpData.gemJoin, balance)), _getDrawDart(vat, jug, urn, cdpData.ilk, borrowedDai) ); IManager(manager).move(cdpData.cdpId, address(this), borrowedDai.mul(RAY)); IVat(vat).hope(DAIJOIN); IJoin(DAIJOIN).exit(address(this), borrowedDai); } function _getDrawDart( address vat, address jug, address urn, bytes32 ilk, uint256 wad ) internal returns (int256 dart) { // Updates stability fee rate uint256 rate = IJug(jug).drip(ilk); // Gets DAI balance of the urn in the vat uint256 dai = IVat(vat).dai(urn); // If there was already enough DAI in the vat balance, just exits it without adding more debt if (dai < wad.mul(RAY)) { // Calculates the needed dart so together with the existing dai in the vat is enough to exit wad amount of DAI tokens dart = toInt256(wad.mul(RAY).sub(dai) / rate); // This is neeeded due lack of precision. It might need to sum an extra dart wei (for the given DAI wad amount) dart = uint256(dart).mul(rate) < wad.mul(RAY) ? dart + 1 : dart; } } function toRad(uint256 wad) internal pure returns (uint256 rad) { rad = wad.mul(10**27); } function toInt256(uint256 x) internal pure returns (int256 y) { y = int256(x); require(y >= 0, "int256-overflow"); } function _getWipeAllWad( address vat, address usr, address urn, bytes32 ilk ) internal view returns (uint256 wad) { // Gets actual rate from the vat (, uint256 rate, , , ) = IVat(vat).ilks(ilk); // Gets actual art value of the urn (, uint256 art) = IVat(vat).urns(ilk, urn); // Gets actual dai amount in the urn uint256 dai = IVat(vat).dai(usr); uint256 rad = art.mul(rate).sub(dai); wad = rad / RAY; // If the rad precision has some dust, it will need to request for 1 extra wad wei wad = wad.mul(RAY) < rad ? wad + 1 : wad; } event FLData(uint256 borrowed, uint256 due); event MultipleActionCalled( string methodName, uint256 indexed cdpId, uint256 swapMinAmount, uint256 swapOptimistAmount, uint256 collateralLeft, uint256 daiLeft ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; interface IERC20 { function totalSupply() external view returns (uint256 supply); function balanceOf(address _owner) external view returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); function decimals() external view returns (uint256 digits); event Approval(address indexed _owner, address indexed _spender, uint256 _value); }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity >=0.7.6; struct ExchangeData { address fromTokenAddress; address toTokenAddress; uint256 fromTokenAmount; uint256 toTokenAmount; uint256 minToTokenAmount; address exchangeAddress; bytes _exchangeCalldata; }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import './IGem.sol'; abstract contract IJoin { bytes32 public ilk; function dec() public view virtual returns (uint256); function gem() public view virtual returns (IGem); function join(address, uint256) public payable virtual; function exit(address, uint256) public virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract IManager { function last(address) public virtual returns (uint256); function cdpCan( address, uint256, address ) public view virtual returns (uint256); function ilks(uint256) public view virtual returns (bytes32); function owns(uint256) public view virtual returns (address); function urns(uint256) public view virtual returns (address); function vat() public view virtual returns (address); function open(bytes32, address) public virtual returns (uint256); function give(uint256, address) public virtual; function cdpAllow( uint256, address, uint256 ) public virtual; function urnAllow(address, uint256) public virtual; function frob( uint256, int256, int256 ) public virtual; function flux( uint256, address, uint256 ) public virtual; function move( uint256, address, uint256 ) public virtual; function exit( address, uint256, address, uint256 ) public virtual; function quit(uint256, address) public virtual; function enter(address, uint256) public virtual; function shift(uint256, uint256) public virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract IVat { struct Urn { uint256 ink; // Locked Collateral [wad] uint256 art; // Normalised Debt [wad] } struct Ilk { uint256 Art; // Total Normalised Debt [wad] uint256 rate; // Accumulated Rates [ray] uint256 spot; // Price with Safety Margin [ray] uint256 line; // Debt Ceiling [rad] uint256 dust; // Urn Debt Floor [rad] } mapping(bytes32 => mapping(address => Urn)) public urns; mapping(bytes32 => Ilk) public ilks; mapping(bytes32 => mapping(address => uint256)) public gem; // [wad] function can(address, address) public view virtual returns (uint256); function dai(address) public view virtual returns (uint256); function frob( bytes32, address, address, address, int256, int256 ) public virtual; function hope(address) public virtual; function move( address, address, uint256 ) public virtual; function fork( bytes32, address, address, int256, int256 ) public virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract IJug { struct Ilk { uint256 duty; uint256 rho; } mapping(bytes32 => Ilk) public ilks; function drip(bytes32) public virtual returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import './IVat.sol'; import './IGem.sol'; abstract contract IDaiJoin { function vat() public virtual returns (IVat); function dai() public virtual returns (IGem); function join(address, uint256) public payable virtual; function exit(address, uint256) public virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract IUniPool { function slot0() public view virtual returns ( uint160, int24, uint16, uint16, uint16, uint8, bool ); function swap( address, bool, int256, uint160, bytes calldata ) public view virtual; function positions(bytes32) public view virtual returns ( uint128, uint256, uint256, uint128, uint128 ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract IGUNIRouter { function addLiquidity( address _pool, uint256 _amount0Max, uint256 _amount1Max, uint256 _amount0Min, uint256 _amount1Min, address _receiver ) public virtual returns ( uint256 amount0, uint256 amount1, uint256 mintAmount ); function removeLiquidity( address _pool, uint256 _burnAmount, uint256 _amount0Min, uint256 _amount1Min, address _receiver ) public virtual returns ( uint256 amount0, uint256 amount1, uint256 liquidityBurned ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract IGUNIResolver { function getRebalanceParams( address pool, uint256 amount0In, uint256 amount1In, uint256 price18Decimals ) external view virtual returns (bool zeroForOne, uint256 swapAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./../IERC20.sol"; abstract contract IGUNIToken is IERC20 { function mint(uint256 mintAmount, address receiver) public virtual returns ( uint256 amount0, uint256 amount1, uint128 liquidityMinted ); function burn(uint256 burnAmount, address receiver) public virtual returns ( uint256 amount0, uint256 amount1, uint128 liquidityBurned ); function getMintAmounts(uint256 amount0Max, uint256 amount1Max) public virtual view returns ( uint256 amount0, uint256 amount1, uint256 mintAmount ); function token0() public virtual view returns (address); function token1() public virtual view returns (address); function pool() public virtual view returns (address); function getUnderlyingBalances() public virtual view returns (uint256, uint256); }
pragma solidity >=0.7.0; abstract contract IExchange { function swapDaiForToken( address asset, uint256 amount, uint256 receiveAtLeast, address callee, bytes calldata withData ) external virtual; function swapTokenForDai( address asset, uint256 amount, uint256 receiveAtLeast, address callee, bytes calldata withData ) external virtual; }
// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2021 Dai Foundation // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. pragma solidity >=0.6.12; interface IERC3156FlashBorrower { /** * @dev Receive a flash loan. * @param initiator The initiator of the loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @param fee The additional amount of tokens to repay. * @param data Arbitrary data structure, intended to contain user-defined parameters. * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" */ function onFlashLoan( address initiator, address token, uint256 amount, uint256 fee, bytes calldata data ) external returns (bytes32); }
// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2021 Dai Foundation // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. pragma solidity >=0.6.12; import "./IERC3156FlashBorrower.sol"; interface IERC3156FlashLender { /** * @dev The amount of currency available to be lent. * @param token The loan currency. * @return The amount of `token` that can be borrowed. */ function maxFlashLoan( address token ) external view returns (uint256); /** * @dev The fee to be charged for a given loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @return The amount of `token` to be charged for the loan, on top of the returned principal. */ function flashFee( address token, uint256 amount ) external view returns (uint256); /** * @dev Initiate a flash loan. * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. * @param token The loan currency. * @param amount The amount of tokens lent. * @param data Arbitrary data structure, intended to contain user-defined parameters. */ function flashLoan( IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data ) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract IGem { function dec() public virtual returns (uint256); function gem() public virtual returns (IGem); function join(address, uint256) public payable virtual; function exit(address, uint256) public virtual; function approve(address, uint256) public virtual; function transfer(address, uint256) public virtual returns (bool); function transferFrom( address, address, uint256 ) public virtual returns (bool); function deposit() public payable virtual; function withdraw(uint256) public virtual; function allowance(address, address) public virtual returns (uint256); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"borrowed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"due","type":"uint256"}],"name":"FLData","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"methodName","type":"string"},{"indexed":true,"internalType":"uint256","name":"cdpId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapMinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapOptimistAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralLeft","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiLeft","type":"uint256"}],"name":"MultipleActionCalled","type":"event"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAIJOIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"toTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minToTokenAmount","type":"uint256"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"bytes","name":"_exchangeCalldata","type":"bytes"}],"internalType":"struct ExchangeData","name":"exchangeData","type":"tuple"},{"components":[{"internalType":"address","name":"gemJoin","type":"address"},{"internalType":"address payable","name":"fundsReceiver","type":"address"},{"internalType":"uint256","name":"cdpId","type":"uint256"},{"internalType":"bytes32","name":"ilk","type":"bytes32"},{"internalType":"uint256","name":"requiredDebt","type":"uint256"},{"internalType":"uint256","name":"token0Amount","type":"uint256"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct CdpData","name":"cdpData","type":"tuple"},{"components":[{"internalType":"address","name":"guni","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"address","name":"guniProxyActions","type":"address"},{"internalType":"address","name":"otherToken","type":"address"},{"internalType":"address","name":"exchange","type":"address"},{"internalType":"address","name":"jug","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"lender","type":"address"}],"internalType":"struct GuniAddressRegistry","name":"guniAddressRegistry","type":"tuple"}],"name":"closeGuniVaultExitDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daiContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IGUNIToken","name":"guni","type":"address"},{"internalType":"contract IGUNIResolver","name":"resolver","type":"address"},{"internalType":"uint256","name":"bal0","type":"uint256"},{"internalType":"uint256","name":"otherTokenDecimals","type":"uint256"}],"name":"getOtherTokenAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"toTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minToTokenAmount","type":"uint256"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"bytes","name":"_exchangeCalldata","type":"bytes"}],"internalType":"struct ExchangeData","name":"exchangeData","type":"tuple"},{"components":[{"internalType":"address","name":"gemJoin","type":"address"},{"internalType":"address payable","name":"fundsReceiver","type":"address"},{"internalType":"uint256","name":"cdpId","type":"uint256"},{"internalType":"bytes32","name":"ilk","type":"bytes32"},{"internalType":"uint256","name":"requiredDebt","type":"uint256"},{"internalType":"uint256","name":"token0Amount","type":"uint256"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct CdpData","name":"cdpData","type":"tuple"},{"components":[{"internalType":"address","name":"guni","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"address","name":"guniProxyActions","type":"address"},{"internalType":"address","name":"otherToken","type":"address"},{"internalType":"address","name":"exchange","type":"address"},{"internalType":"address","name":"jug","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"lender","type":"address"}],"internalType":"struct GuniAddressRegistry","name":"guniAddressRegistry","type":"tuple"}],"name":"increaseMultipleGuni","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initiator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"toTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minToTokenAmount","type":"uint256"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"bytes","name":"_exchangeCalldata","type":"bytes"}],"internalType":"struct ExchangeData","name":"exchangeData","type":"tuple"},{"components":[{"internalType":"address","name":"gemJoin","type":"address"},{"internalType":"address payable","name":"fundsReceiver","type":"address"},{"internalType":"uint256","name":"cdpId","type":"uint256"},{"internalType":"bytes32","name":"ilk","type":"bytes32"},{"internalType":"uint256","name":"requiredDebt","type":"uint256"},{"internalType":"uint256","name":"token0Amount","type":"uint256"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct CdpData","name":"cdpData","type":"tuple"},{"components":[{"internalType":"address","name":"guni","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"address","name":"guniProxyActions","type":"address"},{"internalType":"address","name":"otherToken","type":"address"},{"internalType":"address","name":"exchange","type":"address"},{"internalType":"address","name":"jug","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"lender","type":"address"}],"internalType":"struct GuniAddressRegistry","name":"guniAddressRegistry","type":"tuple"}],"name":"openMultiplyGuniVault","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506136a3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063aa27fd441161005b578063aa27fd44146100f3578063ac0397b314610106578063e0bab4c4146100b6578063f85c2ce31461011957610088565b806323e30c8b1461008d5780632ce8b913146100b65780633be1b5fe146100cb57806377925bf1146100de575b600080fd5b6100a061009b366004612c86565b610121565b6040516100ad9190613362565b60405180910390f35b6100be6103e7565b6040516100ad9190613249565b6100a06100d9366004612d88565b6103f9565b6100f16100ec366004612dcd565b6106d9565b005b6100f1610101366004612dcd565b610862565b6100f1610114366004612dcd565b610a8f565b6100be610b85565b60008080808061013386880188612ee9565b93509350935093508061010001516001600160a01b0316336001600160a01b03161461017a5760405162461bcd60e51b815260040161017190613464565b60405180910390fd5b60006101868a8a610b9d565b90507f9c6641b21946115d10f3f55df9bec5752ec06d40dc9250b1cc6560549764600e6102418460a0015160008051602061362d8339815191526001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016101eb9190613249565b60206040518083038186803b15801561020357600080fd5b505afa158015610217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023b9190612d70565b90610c00565b82604051610250929190613596565b60405180910390a16040516370a0823160e01b815260008051602061362d833981519152906370a0823190610289903090600401613249565b60206040518083038186803b1580156102a157600080fd5b505afa1580156102b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d99190612d70565b60a084015160808501516102ec91610b9d565b111561030a5760405162461bcd60e51b81526004016101719061341f565b846001141561031f5761031f84848484610c42565b8461033057610330848484846113da565b61010082015160405163095ea7b360e01b81526001600160a01b038d169163095ea7b39161036391908590600401613281565b602060405180830381600087803b15801561037d57600080fd5b505af1158015610391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b59190612d2b565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99c9b505050505050505050505050565b60008051602061362d83398151915281565b600080856001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d9190612c6a565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104a557600080fd5b505afa1580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190612e52565b5050505050506001600160a01b03169050600083601203600a0a9050856001600160a01b031663444b4bf68860008051602061362d8339815191526001600160a01b03168a6001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561055a57600080fd5b505afa15801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190612c6a565b6001600160a01b0316146105a75760006105a9565b875b60008051602061362d8339815191526001600160a01b03168b6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fa57600080fd5b505afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190612c6a565b6001600160a01b031614610647576000610649565b885b85606080898a02901c670de0b6b3a764000002901c026040518563ffffffff1660e01b815260040161067e949392919061333c565b604080518083038186803b15801561069557600080fd5b505afa1580156106a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cd9190612d45565b98975050505050505050565b6040805180820190915260158152741bdc195b935d5b1d1a5c1b1e51dd5b9a55985d5b1d605a1b6020820152826107166080840160608501612c4e565b60c0820151516107285760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612d70565b60608601526107b3610100850160e08601612c4e565b6001600160a01b0316636090dec58660600151306040518363ffffffff1660e01b81526004016107e492919061336b565b602060405180830381600087803b1580156107fe57600080fd5b505af1158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190612d70565b6040860152610846868686610a8f565b5060408051602081019091526000815260c09091015250505050565b604080518082019091526015815274636c6f736547756e695661756c744578697444616960581b60208201528261089f6080840160608501612c4e565b60c0820151516108b15760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ee57600080fd5b505afa158015610902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109269190612d70565b6060860152600061093e610100860160e08701612c4e565b6001600160a01b0316632726b07387604001516040518263ffffffff1660e01b815260040161096d9190613362565b60206040518083038186803b15801561098557600080fd5b505afa158015610999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd9190612c6a565b905060006109d2610100870160e08801612c4e565b6001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015610a0a57600080fd5b505afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190612c6a565b90506000610a568284858b606001516117cc565b608089018190529050610a6c89898960006119aa565b505050604051806020016040528060008152508260c00181905250505050505050565b604080518082019091526014815273696e6372656173654d756c7469706c6547756e6960601b602082015282610acb6080840160608501612c4e565b60c082015151610add5760c082018390525b60008051602061362d8339815191526323b872dd33610b026080880160608901612c4e565b8860a001516040518463ffffffff1660e01b8152600401610b259392919061325d565b602060405180830381600087803b158015610b3f57600080fd5b505af1158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190612d2b565b5061084686868660016119aa565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600082820183811015610bf7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000610bf783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ba6565b815160808301516040516370a0823160e01b815260009060008051602061362d833981519152906370a0823190610c7d903090600401613249565b60206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190612d70565b60a08601516040808a0151905163095ea7b360e01b8152929350909160008051602061362d8339815191529163095ea7b391610d0d918591600401613281565b602060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5f9190612d2b565b50806001600160a01b031663bc6f02b289602001518a604001518b608001518c60a001518d60c001516040518663ffffffff1660e01b8152600401610da89594939291906132ca565b600060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b5050505050600080836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e0a9190613249565b60206040518083038186803b158015610e2257600080fd5b505afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190612d70565b6040516370a0823160e01b815290915060008051602061362d833981519152906370a0823190610e8e903090600401613249565b60206040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612d70565b602088015160405163095ea7b360e01b81529194509060008051602061362d8339815191529063095ea7b390610f1a9084908890600401613281565b602060405180830381600087803b158015610f3457600080fd5b505af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612d2b565b5060405163095ea7b360e01b81526001600160a01b0386169063095ea7b390610f9b9084908690600401613281565b602060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fed9190612d2b565b5060405163fb9f478960e01b81526001600160a01b0382169063fb9f4789906110259089908890879060009081903090600401613304565b606060405180830381600087803b15801561103f57600080fd5b505af1158015611053573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110779190613008565b60608b015160405163095ea7b360e01b81529196506001600160a01b038a16945063095ea7b393506110af9250908690600401613281565b602060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190612d2b565b506040516370a0823160e01b81526111a39089906111949060008051602061362d833981519152906370a082319061113d903090600401613249565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190612d70565b8990610c00565b8960e001518a60c00151611c3d565b6040516370a0823160e01b81526000906111dd90889060008051602061362d833981519152906370a08231906101eb903090600401613249565b90506000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161120d9190613249565b60206040518083038186803b15801561122557600080fd5b505afa158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d9190612d70565b905089604001517fead01ff65532b6ee1646408ed4a14f45b5ee091a71e9bb1f579c0a44d59230118b60c001518d608001518e606001516000876040516112a89594939291906133bf565b60405180910390a281156113415760208a015160405163a9059cbb60e01b815260008051602061362d8339815191529163a9059cbb916112ed91908690600401613281565b602060405180830381600087803b15801561130757600080fd5b505af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612d2b565b505b80156113cd5760208a015160405163a9059cbb60e01b81526001600160a01b0388169163a9059cbb9161137991908590600401613281565b602060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cb9190612d2b565b505b5050505050505050505050565b60a0820151608083015160e08401516000906113f690876120d3565b90506114158560e001518760000151886040015189608001518561225b565b84516040516370a0823160e01b81526000906001600160a01b038316906370a0823190611446903090600401613249565b60206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612d70565b602088015160405163095ea7b360e01b8152919250906001600160a01b0384169063095ea7b3906114cd9084908690600401613281565b602060405180830381600087803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190612d2b565b50604051632cfc215960e11b81526001600160a01b038216906359f842b29061155590869086906000908190309060040161329a565b606060405180830381600087803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a79190613008565b50506040516370a0823160e01b81526001600160a01b038716925063095ea7b39150879083906370a08231906115e1903090600401613249565b60206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190612d70565b6040518363ffffffff1660e01b815260040161164e929190613281565b602060405180830381600087803b15801561166857600080fd5b505af115801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190612d2b565b50846001600160a01b031663c723c87f8a60200151866001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016116e19190613249565b60206040518083038186803b1580156116f957600080fd5b505afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190612d70565b8c608001518d60a001518e60c001516040518663ffffffff1660e01b81526004016117609594939291906132ca565b600060405180830381600087803b15801561177a57600080fd5b505af115801561178e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506111dd9150889060008051602061362d833981519152906370a08231906101eb903090600401613249565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016117fb9190613362565b60a06040518083038186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b815260040161188192919061336b565b604080518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d09190612fe5565b9150506000876001600160a01b0316636c25b346886040518263ffffffff1660e01b81526004016119019190613249565b60206040518083038186803b15801561191957600080fd5b505afa15801561192d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119519190612d70565b905060006119638261023b85876126a4565b90506b033b2e3c9fd0803ce8000000810494508061198d866b033b2e3c9fd0803ce80000006126a4565b10611998578461199d565b846001015b9998505050505050505050565b6000818585856040516020016119c394939291906134c7565b60408051601f1981840301815291905290506119e6610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611a0c9190612c4e565b60016040518463ffffffff1660e01b8152600401611a2c93929190613492565b600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b50611a719250505061012084016101008501612c4e565b6001600160a01b0316635cffe9de611a8f6080860160608701612c4e565b60008051602061362d8339815191528760800151856040518563ffffffff1660e01b8152600401611ac39493929190613382565b602060405180830381600087803b158015611add57600080fd5b505af1158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612d2b565b50611b27610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611b4d9190612c4e565b60006040518463ffffffff1660e01b8152600401611b6d93929190613492565b600060405180830381600087803b158015611b8757600080fd5b505af1158015611b9b573d6000803e3d6000fd5b505050505050505050565b60008184841115611c355760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611bfa578181015183820152602001611be2565b50505050905090810190601f168015611c275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600084600001516001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7c57600080fd5b505afa158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190612c6a565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611ce49190613249565b60206040518083038186803b158015611cfc57600080fd5b505afa158015611d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d349190612d70565b865160405163095ea7b360e01b81529192506001600160a01b0384169163095ea7b391611d65918590600401613281565b600060405180830381600087803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b505050506000846001600160a01b0316632726b07388604001516040518263ffffffff1660e01b8152600401611dc99190613362565b60206040518083038186803b158015611de157600080fd5b505afa158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e199190612c6a565b90506000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190612c6a565b8851604051633b4da69f60e01b81529192506001600160a01b031690633b4da69f90611ec09085908790600401613281565b600060405180830381600087803b158015611eda57600080fd5b505af1158015611eee573d6000803e3d6000fd5b50505050856001600160a01b03166345e6bdcd8960400151611f1c611f178c60000151886126fd565b612780565b611f2d858a888f606001518f6127a7565b6040518463ffffffff1660e01b8152600401611f4b939291906134b1565b600060405180830381600087803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505060408901516001600160a01b038816915063f9f30db69030611faa8b6b033b2e3c9fd0803ce80000006126a4565b6040518463ffffffff1660e01b8152600401611fc893929190613492565b600060405180830381600087803b158015611fe257600080fd5b505af1158015611ff6573d6000803e3d6000fd5b50506040516328ec8bf160e21b81526001600160a01b038416925063a3b22fc4915061203a90739759a6ac90977b93b58547b4a71c78317f391a2890600401613249565b600060405180830381600087803b15801561205457600080fd5b505af1158015612068573d6000803e3d6000fd5b505060405163ef693bed60e01b8152739759a6ac90977b93b58547b4a71c78317f391a28925063ef693bed91506120a59030908b90600401613281565b600060405180830381600087803b1580156120bf57600080fd5b505af11580156113cb573d6000803e3d6000fd5b600080836001600160a01b0316632726b07384604001516040518263ffffffff1660e01b81526004016121069190613362565b60206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121569190612c6a565b90506000846001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561219357600080fd5b505afa1580156121a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cb9190612c6a565b90506000816001600160a01b0316632424be5c8660600151856040518363ffffffff1660e01b815260040161220192919061336b565b604080518083038186803b15801561221857600080fd5b505afa15801561222c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122509190612fe5565b509695505050505050565b6000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce9190612c6a565b90506000866001600160a01b0316632726b073866040518263ffffffff1660e01b81526004016122fe9190613362565b60206040518083038186803b15801561231657600080fd5b505afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e9190612c6a565b90506000876001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b815260040161237e9190613362565b60206040518083038186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ce9190612d70565b60405163095ea7b360e01b815290915060008051602061362d8339815191529063095ea7b39061241890739759a6ac90977b93b58547b4a71c78317f391a28908990600401613281565b602060405180830381600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246a9190612d2b565b50604051633b4da69f60e01b8152739759a6ac90977b93b58547b4a71c78317f391a2890633b4da69f906124a49085908990600401613281565b600060405180830381600087803b1580156124be57600080fd5b505af11580156124d2573d6000803e3d6000fd5b5050505060006124e288866126fd565b9050886001600160a01b03166345e6bdcd886124fd84612780565b60000361258788896001600160a01b0316636c25b3468a6040518263ffffffff1660e01b81526004016125309190613249565b60206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190612d70565b8989612932565b6040518463ffffffff1660e01b81526004016125a5939291906134b1565b600060405180830381600087803b1580156125bf57600080fd5b505af11580156125d3573d6000803e3d6000fd5b50506040516313771f0760e31b81526001600160a01b038c169250639bb8f8389150612607908a9030908690600401613492565b600060405180830381600087803b15801561262157600080fd5b505af1158015612635573d6000803e3d6000fd5b505060405163ef693bed60e01b81526001600160a01b038b16925063ef693bed91506126679030908990600401613281565b600060405180830381600087803b15801561268157600080fd5b505af1158015612695573d6000803e3d6000fd5b50505050505050505050505050565b6000826126b357506000610bfa565b828202828482816126c057fe5b0414610bf75760405162461bcd60e51b815260040180806020018281038252602181526020018061364d6021913960400191505060405180910390fd5b6000610bf7836001600160a01b031663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127739190612d70565b8390601203600a0a6126a4565b8060008112156127a25760405162461bcd60e51b8152600401610171906133f6565b919050565b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b81526004016127d69190613362565b602060405180830381600087803b1580156127f057600080fd5b505af1158015612804573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128289190612d70565b90506000876001600160a01b0316636c25b346876040518263ffffffff1660e01b81526004016128589190613249565b60206040518083038186803b15801561287057600080fd5b505afa158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190612d70565b90506128c0846b033b2e3c9fd0803ce80000006126a4565b811015612927576128f2826128e58361023b886b033b2e3c9fd0803ce80000006126a4565b816128ec57fe5b04612780565b925061290a846b033b2e3c9fd0803ce80000006126a4565b61291484846126a4565b1061291f5782612924565b826001015b92505b505095945050505050565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016129619190613362565b60a06040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b81526004016129e792919061336b565b604080518083038186803b1580156129fe57600080fd5b505afa158015612a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a369190612fe5565b915050612a458287816128ec57fe5b925080831115612a6057612a5881612780565b600003612a65565b826000035b979650505050505050565b80356127a281613614565b805180151581146127a257600080fd5b600082601f830112612a9b578081fd5b813567ffffffffffffffff811115612aaf57fe5b612ac2601f8201601f19166020016135a4565b818152846020838601011115612ad6578283fd5b816020850160208301379081016020019190915292915050565b600060e08284031215612b01578081fd5b612b0b60e06135a4565b9050612b1682612a70565b8152612b2460208301612a70565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013567ffffffffffffffff811115612b6b57600080fd5b612b7784828501612a8b565b60c08301525092915050565b6000610120808385031215612b96578182fd5b612b9f816135a4565b915050612bab82612a70565b8152612bb960208301612a70565b6020820152612bca60408301612a70565b6040820152612bdb60608301612a70565b6060820152612bec60808301612a70565b6080820152612bfd60a08301612a70565b60a0820152612c0e60c08301612a70565b60c0820152612c1f60e08301612a70565b60e0820152610100612c32818401612a70565b9082015292915050565b805161ffff811681146127a257600080fd5b600060208284031215612c5f578081fd5b8135610bf781613614565b600060208284031215612c7b578081fd5b8151610bf781613614565b60008060008060008060a08789031215612c9e578182fd5b8635612ca981613614565b95506020870135612cb981613614565b94506040870135935060608701359250608087013567ffffffffffffffff80821115612ce3578384fd5b818901915089601f830112612cf6578384fd5b813581811115612d04578485fd5b8a6020828501011115612d15578485fd5b6020830194508093505050509295509295509295565b600060208284031215612d3c578081fd5b610bf782612a7b565b60008060408385031215612d57578182fd5b612d6083612a7b565b9150602083015190509250929050565b600060208284031215612d81578081fd5b5051919050565b60008060008060808587031215612d9d578182fd5b8435612da881613614565b93506020850135612db881613614565b93969395505050506040820135916060013590565b6000806000838503610160811215612de3578182fd5b843567ffffffffffffffff80821115612dfa578384fd5b9086019060e08289031215612e0d578384fd5b90945060208601359080821115612e22578384fd5b50612e2f87828801612af0565b935050610120603f1982011215612e44578182fd5b506040840190509250925092565b600080600080600080600060e0888a031215612e6c578485fd5b8751612e7781613614565b8097505060208801518060020b8114612e8e578586fd5b9550612e9c60408901612c3c565b9450612eaa60608901612c3c565b9350612eb860808901612c3c565b925060a088015160ff81168114612ecd578182fd5b9150612edb60c08901612a7b565b905092959891949750929550565b6000806000806101808587031215612eff578182fd5b84359350602085013567ffffffffffffffff80821115612f1d578384fd5b9086019060e08289031215612f30578384fd5b612f3a60e06135a4565b612f4383612a70565b8152612f5160208401612a70565b6020820152604083013560408201526060830135606082015260808301356080820152612f8060a08401612a70565b60a082015260c083013582811115612f96578586fd5b612fa28a828601612a8b565b60c08301525094506040870135915080821115612fbd578384fd5b50612fca87828801612af0565b925050612fda8660608701612b83565b905092959194509250565b60008060408385031215612ff7578182fd5b505080516020909101519092909150565b60008060006060848603121561301c578081fd5b8351925060208401519150604084015190509250925092565b600080600080600060a0868803121561304c578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b818110156130d0576020818501810151868301820152016130b4565b818111156130e15782602083870101525b50601f01601f19169290920160200192915050565b600060018060a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015160e060c085015261315360e08501826130ab565b949350505050565b803561316681613614565b6001600160a01b03168252602081013561317f81613614565b61318c6020840182613074565b5061319960408201612a70565b6131a66040840182613074565b506131b360608201612a70565b6131c06060840182613074565b506131cd60808201612a70565b6131da6080840182613074565b506131e760a08201612a70565b6131f460a0840182613074565b5061320160c08201612a70565b61320e60c0840182613074565b5061321b60e08201612a70565b61322860e0840182613074565b50610100613237818301612a70565b61324382850182613074565b50505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039586168152602081019490945260408401929092526060830152909116608082015260a00190565b6001600160a01b03868116825260208201869052604082018590528316606082015260a060808201819052600090612a65908301846130ab565b6001600160a01b039687168152602081019590955260408501939093526060840191909152608083015290911660a082015260c00190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133b5908301846130ab565b9695505050505050565b600060a082526133d260a08301886130ab565b90508560208301528460408301528360608301528260808301529695505050505050565b6020808252600f908201526e696e743235362d6f766572666c6f7760881b604082015260600190565b60208082526025908201527f6d70612d726563656976652d7265717565737465642d616d6f756e742d6d69736040820152640dac2e8c6d60db1b606082015260800190565b60208082526014908201527336b83096bab73a393ab9ba32b216b632b73232b960611b604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b600061018086835280602084015285356134e081613614565b6001600160a01b0316908301526134f960208601612a70565b6135076101a0840182613074565b5060408501356101c083015260608501356101e0830152608085013561020083015261353560a08601612a70565b613543610220840182613074565b5061355160c08601866135c8565b60e061024085015261356861026085018284613081565b915050828103604084015261357d81866130f6565b91505061358d606083018461315b565b95945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156135c057fe5b604052919050565b6000808335601e198436030181126135de578283fd5b830160208101925035905067ffffffffffffffff8111156135fe57600080fd5b80360383131561360d57600080fd5b9250929050565b6001600160a01b038116811461362957600080fd5b5056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220501289e884483aeb5f7f4c6333cd4fddce7794e653c038f1f5272ad23943e1cc64736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063aa27fd441161005b578063aa27fd44146100f3578063ac0397b314610106578063e0bab4c4146100b6578063f85c2ce31461011957610088565b806323e30c8b1461008d5780632ce8b913146100b65780633be1b5fe146100cb57806377925bf1146100de575b600080fd5b6100a061009b366004612c86565b610121565b6040516100ad9190613362565b60405180910390f35b6100be6103e7565b6040516100ad9190613249565b6100a06100d9366004612d88565b6103f9565b6100f16100ec366004612dcd565b6106d9565b005b6100f1610101366004612dcd565b610862565b6100f1610114366004612dcd565b610a8f565b6100be610b85565b60008080808061013386880188612ee9565b93509350935093508061010001516001600160a01b0316336001600160a01b03161461017a5760405162461bcd60e51b815260040161017190613464565b60405180910390fd5b60006101868a8a610b9d565b90507f9c6641b21946115d10f3f55df9bec5752ec06d40dc9250b1cc6560549764600e6102418460a0015160008051602061362d8339815191526001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016101eb9190613249565b60206040518083038186803b15801561020357600080fd5b505afa158015610217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023b9190612d70565b90610c00565b82604051610250929190613596565b60405180910390a16040516370a0823160e01b815260008051602061362d833981519152906370a0823190610289903090600401613249565b60206040518083038186803b1580156102a157600080fd5b505afa1580156102b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d99190612d70565b60a084015160808501516102ec91610b9d565b111561030a5760405162461bcd60e51b81526004016101719061341f565b846001141561031f5761031f84848484610c42565b8461033057610330848484846113da565b61010082015160405163095ea7b360e01b81526001600160a01b038d169163095ea7b39161036391908590600401613281565b602060405180830381600087803b15801561037d57600080fd5b505af1158015610391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b59190612d2b565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99c9b505050505050505050505050565b60008051602061362d83398151915281565b600080856001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d9190612c6a565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104a557600080fd5b505afa1580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190612e52565b5050505050506001600160a01b03169050600083601203600a0a9050856001600160a01b031663444b4bf68860008051602061362d8339815191526001600160a01b03168a6001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561055a57600080fd5b505afa15801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190612c6a565b6001600160a01b0316146105a75760006105a9565b875b60008051602061362d8339815191526001600160a01b03168b6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fa57600080fd5b505afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190612c6a565b6001600160a01b031614610647576000610649565b885b85606080898a02901c670de0b6b3a764000002901c026040518563ffffffff1660e01b815260040161067e949392919061333c565b604080518083038186803b15801561069557600080fd5b505afa1580156106a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cd9190612d45565b98975050505050505050565b6040805180820190915260158152741bdc195b935d5b1d1a5c1b1e51dd5b9a55985d5b1d605a1b6020820152826107166080840160608501612c4e565b60c0820151516107285760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612d70565b60608601526107b3610100850160e08601612c4e565b6001600160a01b0316636090dec58660600151306040518363ffffffff1660e01b81526004016107e492919061336b565b602060405180830381600087803b1580156107fe57600080fd5b505af1158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190612d70565b6040860152610846868686610a8f565b5060408051602081019091526000815260c09091015250505050565b604080518082019091526015815274636c6f736547756e695661756c744578697444616960581b60208201528261089f6080840160608501612c4e565b60c0820151516108b15760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ee57600080fd5b505afa158015610902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109269190612d70565b6060860152600061093e610100860160e08701612c4e565b6001600160a01b0316632726b07387604001516040518263ffffffff1660e01b815260040161096d9190613362565b60206040518083038186803b15801561098557600080fd5b505afa158015610999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd9190612c6a565b905060006109d2610100870160e08801612c4e565b6001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015610a0a57600080fd5b505afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190612c6a565b90506000610a568284858b606001516117cc565b608089018190529050610a6c89898960006119aa565b505050604051806020016040528060008152508260c00181905250505050505050565b604080518082019091526014815273696e6372656173654d756c7469706c6547756e6960601b602082015282610acb6080840160608501612c4e565b60c082015151610add5760c082018390525b60008051602061362d8339815191526323b872dd33610b026080880160608901612c4e565b8860a001516040518463ffffffff1660e01b8152600401610b259392919061325d565b602060405180830381600087803b158015610b3f57600080fd5b505af1158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190612d2b565b5061084686868660016119aa565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600082820183811015610bf7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000610bf783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ba6565b815160808301516040516370a0823160e01b815260009060008051602061362d833981519152906370a0823190610c7d903090600401613249565b60206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190612d70565b60a08601516040808a0151905163095ea7b360e01b8152929350909160008051602061362d8339815191529163095ea7b391610d0d918591600401613281565b602060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5f9190612d2b565b50806001600160a01b031663bc6f02b289602001518a604001518b608001518c60a001518d60c001516040518663ffffffff1660e01b8152600401610da89594939291906132ca565b600060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b5050505050600080836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e0a9190613249565b60206040518083038186803b158015610e2257600080fd5b505afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190612d70565b6040516370a0823160e01b815290915060008051602061362d833981519152906370a0823190610e8e903090600401613249565b60206040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612d70565b602088015160405163095ea7b360e01b81529194509060008051602061362d8339815191529063095ea7b390610f1a9084908890600401613281565b602060405180830381600087803b158015610f3457600080fd5b505af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612d2b565b5060405163095ea7b360e01b81526001600160a01b0386169063095ea7b390610f9b9084908690600401613281565b602060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fed9190612d2b565b5060405163fb9f478960e01b81526001600160a01b0382169063fb9f4789906110259089908890879060009081903090600401613304565b606060405180830381600087803b15801561103f57600080fd5b505af1158015611053573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110779190613008565b60608b015160405163095ea7b360e01b81529196506001600160a01b038a16945063095ea7b393506110af9250908690600401613281565b602060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190612d2b565b506040516370a0823160e01b81526111a39089906111949060008051602061362d833981519152906370a082319061113d903090600401613249565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190612d70565b8990610c00565b8960e001518a60c00151611c3d565b6040516370a0823160e01b81526000906111dd90889060008051602061362d833981519152906370a08231906101eb903090600401613249565b90506000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161120d9190613249565b60206040518083038186803b15801561122557600080fd5b505afa158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d9190612d70565b905089604001517fead01ff65532b6ee1646408ed4a14f45b5ee091a71e9bb1f579c0a44d59230118b60c001518d608001518e606001516000876040516112a89594939291906133bf565b60405180910390a281156113415760208a015160405163a9059cbb60e01b815260008051602061362d8339815191529163a9059cbb916112ed91908690600401613281565b602060405180830381600087803b15801561130757600080fd5b505af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612d2b565b505b80156113cd5760208a015160405163a9059cbb60e01b81526001600160a01b0388169163a9059cbb9161137991908590600401613281565b602060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cb9190612d2b565b505b5050505050505050505050565b60a0820151608083015160e08401516000906113f690876120d3565b90506114158560e001518760000151886040015189608001518561225b565b84516040516370a0823160e01b81526000906001600160a01b038316906370a0823190611446903090600401613249565b60206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612d70565b602088015160405163095ea7b360e01b8152919250906001600160a01b0384169063095ea7b3906114cd9084908690600401613281565b602060405180830381600087803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190612d2b565b50604051632cfc215960e11b81526001600160a01b038216906359f842b29061155590869086906000908190309060040161329a565b606060405180830381600087803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a79190613008565b50506040516370a0823160e01b81526001600160a01b038716925063095ea7b39150879083906370a08231906115e1903090600401613249565b60206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190612d70565b6040518363ffffffff1660e01b815260040161164e929190613281565b602060405180830381600087803b15801561166857600080fd5b505af115801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190612d2b565b50846001600160a01b031663c723c87f8a60200151866001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016116e19190613249565b60206040518083038186803b1580156116f957600080fd5b505afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190612d70565b8c608001518d60a001518e60c001516040518663ffffffff1660e01b81526004016117609594939291906132ca565b600060405180830381600087803b15801561177a57600080fd5b505af115801561178e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506111dd9150889060008051602061362d833981519152906370a08231906101eb903090600401613249565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016117fb9190613362565b60a06040518083038186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b815260040161188192919061336b565b604080518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d09190612fe5565b9150506000876001600160a01b0316636c25b346886040518263ffffffff1660e01b81526004016119019190613249565b60206040518083038186803b15801561191957600080fd5b505afa15801561192d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119519190612d70565b905060006119638261023b85876126a4565b90506b033b2e3c9fd0803ce8000000810494508061198d866b033b2e3c9fd0803ce80000006126a4565b10611998578461199d565b846001015b9998505050505050505050565b6000818585856040516020016119c394939291906134c7565b60408051601f1981840301815291905290506119e6610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611a0c9190612c4e565b60016040518463ffffffff1660e01b8152600401611a2c93929190613492565b600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b50611a719250505061012084016101008501612c4e565b6001600160a01b0316635cffe9de611a8f6080860160608701612c4e565b60008051602061362d8339815191528760800151856040518563ffffffff1660e01b8152600401611ac39493929190613382565b602060405180830381600087803b158015611add57600080fd5b505af1158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612d2b565b50611b27610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611b4d9190612c4e565b60006040518463ffffffff1660e01b8152600401611b6d93929190613492565b600060405180830381600087803b158015611b8757600080fd5b505af1158015611b9b573d6000803e3d6000fd5b505050505050505050565b60008184841115611c355760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611bfa578181015183820152602001611be2565b50505050905090810190601f168015611c275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600084600001516001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7c57600080fd5b505afa158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190612c6a565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611ce49190613249565b60206040518083038186803b158015611cfc57600080fd5b505afa158015611d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d349190612d70565b865160405163095ea7b360e01b81529192506001600160a01b0384169163095ea7b391611d65918590600401613281565b600060405180830381600087803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b505050506000846001600160a01b0316632726b07388604001516040518263ffffffff1660e01b8152600401611dc99190613362565b60206040518083038186803b158015611de157600080fd5b505afa158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e199190612c6a565b90506000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190612c6a565b8851604051633b4da69f60e01b81529192506001600160a01b031690633b4da69f90611ec09085908790600401613281565b600060405180830381600087803b158015611eda57600080fd5b505af1158015611eee573d6000803e3d6000fd5b50505050856001600160a01b03166345e6bdcd8960400151611f1c611f178c60000151886126fd565b612780565b611f2d858a888f606001518f6127a7565b6040518463ffffffff1660e01b8152600401611f4b939291906134b1565b600060405180830381600087803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505060408901516001600160a01b038816915063f9f30db69030611faa8b6b033b2e3c9fd0803ce80000006126a4565b6040518463ffffffff1660e01b8152600401611fc893929190613492565b600060405180830381600087803b158015611fe257600080fd5b505af1158015611ff6573d6000803e3d6000fd5b50506040516328ec8bf160e21b81526001600160a01b038416925063a3b22fc4915061203a90739759a6ac90977b93b58547b4a71c78317f391a2890600401613249565b600060405180830381600087803b15801561205457600080fd5b505af1158015612068573d6000803e3d6000fd5b505060405163ef693bed60e01b8152739759a6ac90977b93b58547b4a71c78317f391a28925063ef693bed91506120a59030908b90600401613281565b600060405180830381600087803b1580156120bf57600080fd5b505af11580156113cb573d6000803e3d6000fd5b600080836001600160a01b0316632726b07384604001516040518263ffffffff1660e01b81526004016121069190613362565b60206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121569190612c6a565b90506000846001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561219357600080fd5b505afa1580156121a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cb9190612c6a565b90506000816001600160a01b0316632424be5c8660600151856040518363ffffffff1660e01b815260040161220192919061336b565b604080518083038186803b15801561221857600080fd5b505afa15801561222c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122509190612fe5565b509695505050505050565b6000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce9190612c6a565b90506000866001600160a01b0316632726b073866040518263ffffffff1660e01b81526004016122fe9190613362565b60206040518083038186803b15801561231657600080fd5b505afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e9190612c6a565b90506000876001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b815260040161237e9190613362565b60206040518083038186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ce9190612d70565b60405163095ea7b360e01b815290915060008051602061362d8339815191529063095ea7b39061241890739759a6ac90977b93b58547b4a71c78317f391a28908990600401613281565b602060405180830381600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246a9190612d2b565b50604051633b4da69f60e01b8152739759a6ac90977b93b58547b4a71c78317f391a2890633b4da69f906124a49085908990600401613281565b600060405180830381600087803b1580156124be57600080fd5b505af11580156124d2573d6000803e3d6000fd5b5050505060006124e288866126fd565b9050886001600160a01b03166345e6bdcd886124fd84612780565b60000361258788896001600160a01b0316636c25b3468a6040518263ffffffff1660e01b81526004016125309190613249565b60206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190612d70565b8989612932565b6040518463ffffffff1660e01b81526004016125a5939291906134b1565b600060405180830381600087803b1580156125bf57600080fd5b505af11580156125d3573d6000803e3d6000fd5b50506040516313771f0760e31b81526001600160a01b038c169250639bb8f8389150612607908a9030908690600401613492565b600060405180830381600087803b15801561262157600080fd5b505af1158015612635573d6000803e3d6000fd5b505060405163ef693bed60e01b81526001600160a01b038b16925063ef693bed91506126679030908990600401613281565b600060405180830381600087803b15801561268157600080fd5b505af1158015612695573d6000803e3d6000fd5b50505050505050505050505050565b6000826126b357506000610bfa565b828202828482816126c057fe5b0414610bf75760405162461bcd60e51b815260040180806020018281038252602181526020018061364d6021913960400191505060405180910390fd5b6000610bf7836001600160a01b031663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127739190612d70565b8390601203600a0a6126a4565b8060008112156127a25760405162461bcd60e51b8152600401610171906133f6565b919050565b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b81526004016127d69190613362565b602060405180830381600087803b1580156127f057600080fd5b505af1158015612804573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128289190612d70565b90506000876001600160a01b0316636c25b346876040518263ffffffff1660e01b81526004016128589190613249565b60206040518083038186803b15801561287057600080fd5b505afa158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190612d70565b90506128c0846b033b2e3c9fd0803ce80000006126a4565b811015612927576128f2826128e58361023b886b033b2e3c9fd0803ce80000006126a4565b816128ec57fe5b04612780565b925061290a846b033b2e3c9fd0803ce80000006126a4565b61291484846126a4565b1061291f5782612924565b826001015b92505b505095945050505050565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016129619190613362565b60a06040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b81526004016129e792919061336b565b604080518083038186803b1580156129fe57600080fd5b505afa158015612a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a369190612fe5565b915050612a458287816128ec57fe5b925080831115612a6057612a5881612780565b600003612a65565b826000035b979650505050505050565b80356127a281613614565b805180151581146127a257600080fd5b600082601f830112612a9b578081fd5b813567ffffffffffffffff811115612aaf57fe5b612ac2601f8201601f19166020016135a4565b818152846020838601011115612ad6578283fd5b816020850160208301379081016020019190915292915050565b600060e08284031215612b01578081fd5b612b0b60e06135a4565b9050612b1682612a70565b8152612b2460208301612a70565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013567ffffffffffffffff811115612b6b57600080fd5b612b7784828501612a8b565b60c08301525092915050565b6000610120808385031215612b96578182fd5b612b9f816135a4565b915050612bab82612a70565b8152612bb960208301612a70565b6020820152612bca60408301612a70565b6040820152612bdb60608301612a70565b6060820152612bec60808301612a70565b6080820152612bfd60a08301612a70565b60a0820152612c0e60c08301612a70565b60c0820152612c1f60e08301612a70565b60e0820152610100612c32818401612a70565b9082015292915050565b805161ffff811681146127a257600080fd5b600060208284031215612c5f578081fd5b8135610bf781613614565b600060208284031215612c7b578081fd5b8151610bf781613614565b60008060008060008060a08789031215612c9e578182fd5b8635612ca981613614565b95506020870135612cb981613614565b94506040870135935060608701359250608087013567ffffffffffffffff80821115612ce3578384fd5b818901915089601f830112612cf6578384fd5b813581811115612d04578485fd5b8a6020828501011115612d15578485fd5b6020830194508093505050509295509295509295565b600060208284031215612d3c578081fd5b610bf782612a7b565b60008060408385031215612d57578182fd5b612d6083612a7b565b9150602083015190509250929050565b600060208284031215612d81578081fd5b5051919050565b60008060008060808587031215612d9d578182fd5b8435612da881613614565b93506020850135612db881613614565b93969395505050506040820135916060013590565b6000806000838503610160811215612de3578182fd5b843567ffffffffffffffff80821115612dfa578384fd5b9086019060e08289031215612e0d578384fd5b90945060208601359080821115612e22578384fd5b50612e2f87828801612af0565b935050610120603f1982011215612e44578182fd5b506040840190509250925092565b600080600080600080600060e0888a031215612e6c578485fd5b8751612e7781613614565b8097505060208801518060020b8114612e8e578586fd5b9550612e9c60408901612c3c565b9450612eaa60608901612c3c565b9350612eb860808901612c3c565b925060a088015160ff81168114612ecd578182fd5b9150612edb60c08901612a7b565b905092959891949750929550565b6000806000806101808587031215612eff578182fd5b84359350602085013567ffffffffffffffff80821115612f1d578384fd5b9086019060e08289031215612f30578384fd5b612f3a60e06135a4565b612f4383612a70565b8152612f5160208401612a70565b6020820152604083013560408201526060830135606082015260808301356080820152612f8060a08401612a70565b60a082015260c083013582811115612f96578586fd5b612fa28a828601612a8b565b60c08301525094506040870135915080821115612fbd578384fd5b50612fca87828801612af0565b925050612fda8660608701612b83565b905092959194509250565b60008060408385031215612ff7578182fd5b505080516020909101519092909150565b60008060006060848603121561301c578081fd5b8351925060208401519150604084015190509250925092565b600080600080600060a0868803121561304c578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b818110156130d0576020818501810151868301820152016130b4565b818111156130e15782602083870101525b50601f01601f19169290920160200192915050565b600060018060a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015160e060c085015261315360e08501826130ab565b949350505050565b803561316681613614565b6001600160a01b03168252602081013561317f81613614565b61318c6020840182613074565b5061319960408201612a70565b6131a66040840182613074565b506131b360608201612a70565b6131c06060840182613074565b506131cd60808201612a70565b6131da6080840182613074565b506131e760a08201612a70565b6131f460a0840182613074565b5061320160c08201612a70565b61320e60c0840182613074565b5061321b60e08201612a70565b61322860e0840182613074565b50610100613237818301612a70565b61324382850182613074565b50505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039586168152602081019490945260408401929092526060830152909116608082015260a00190565b6001600160a01b03868116825260208201869052604082018590528316606082015260a060808201819052600090612a65908301846130ab565b6001600160a01b039687168152602081019590955260408501939093526060840191909152608083015290911660a082015260c00190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133b5908301846130ab565b9695505050505050565b600060a082526133d260a08301886130ab565b90508560208301528460408301528360608301528260808301529695505050505050565b6020808252600f908201526e696e743235362d6f766572666c6f7760881b604082015260600190565b60208082526025908201527f6d70612d726563656976652d7265717565737465642d616d6f756e742d6d69736040820152640dac2e8c6d60db1b606082015260800190565b60208082526014908201527336b83096bab73a393ab9ba32b216b632b73232b960611b604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b600061018086835280602084015285356134e081613614565b6001600160a01b0316908301526134f960208601612a70565b6135076101a0840182613074565b5060408501356101c083015260608501356101e0830152608085013561020083015261353560a08601612a70565b613543610220840182613074565b5061355160c08601866135c8565b60e061024085015261356861026085018284613081565b915050828103604084015261357d81866130f6565b91505061358d606083018461315b565b95945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156135c057fe5b604052919050565b6000808335601e198436030181126135de578283fd5b830160208101925035905067ffffffffffffffff8111156135fe57600080fd5b80360383131561360d57600080fd5b9250929050565b6001600160a01b038116811461362957600080fd5b5056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220501289e884483aeb5f7f4c6333cd4fddce7794e653c038f1f5272ad23943e1cc64736f6c63430007060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.