Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 10869023 | 1990 days ago | 0.00007 ETH | ||||
| - | 10869023 | 1990 days ago | 0.00735 ETH | ||||
| - | 10869023 | 1990 days ago | 0.00735 ETH | ||||
| - | 10868910 | 1990 days ago | 0.00728 ETH | ||||
| - | 10868910 | 1990 days ago | 0.00728 ETH | ||||
| - | 10868892 | 1990 days ago | 0.00728 ETH | ||||
| - | 10868892 | 1990 days ago | 0.00728 ETH | ||||
| - | 10862130 | 1991 days ago | 1.03357567 ETH | ||||
| - | 10862130 | 1991 days ago | 0.42090567 ETH | ||||
| - | 10862130 | 1991 days ago | 0.61267 ETH | ||||
| - | 10862130 | 1991 days ago | 0.62058 ETH | ||||
| - | 10862130 | 1991 days ago | 0.62058 ETH | ||||
| - | 10853221 | 1992 days ago | 8.03309971 ETH | ||||
| - | 10853221 | 1992 days ago | 3.22175971 ETH | ||||
| - | 10853221 | 1992 days ago | 4.81134 ETH | ||||
| - | 10853221 | 1992 days ago | 4.81134 ETH | ||||
| - | 10853221 | 1992 days ago | 4.81134 ETH | ||||
| - | 10848371 | 1993 days ago | 21.27941109 ETH | ||||
| - | 10848371 | 1993 days ago | 8.27941109 ETH | ||||
| - | 10848371 | 1993 days ago | 13 ETH | ||||
| - | 10848371 | 1993 days ago | 13 ETH | ||||
| - | 10847719 | 1993 days ago | 2.82514217 ETH | ||||
| - | 10847719 | 1993 days ago | 0.81779217 ETH | ||||
| - | 10847719 | 1993 days ago | 2.00735 ETH | ||||
| - | 10847719 | 1993 days ago | 2.01372 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MCDCreateFlashLoan
Compiler Version
v0.6.10+commit.00c0fcaf
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-08-26
*/
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
contract DSMath {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x);
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x);
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x);
}
function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
return x / y;
}
uint256 constant WAD = 10**18;
uint256 constant RAY = 10**27;
function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, y), WAD / 2) / WAD;
}
function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, y), RAY / 2) / RAY;
}
function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, WAD), y / 2) / y;
}
function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, RAY), y / 2) / y;
}
} abstract contract TokenInterface {
function allowance(address, address) public virtual returns (uint256);
function balanceOf(address) public virtual returns (uint256);
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 virtual payable;
function withdraw(uint256) public virtual;
} interface ExchangeInterfaceV2 {
function sell(address _srcAddr, address _destAddr, uint _srcAmount) external payable returns (uint);
function buy(address _srcAddr, address _destAddr, uint _destAmount) external payable returns(uint);
function getSellRate(address _srcAddr, address _destAddr, uint _srcAmount) external view returns (uint);
function getBuyRate(address _srcAddr, address _destAddr, uint _srcAmount) external view returns (uint);
} interface ERC20 {
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);
} library Address {
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
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;
}
}
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(ERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*/
function safeApprove(ERC20 token, address spender, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function _callOptionalReturn(ERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
} contract AdminAuth {
using SafeERC20 for ERC20;
address public owner;
address public admin;
modifier onlyOwner() {
require(owner == msg.sender);
_;
}
constructor() public {
owner = msg.sender;
}
/// @notice Admin is set by owner first time, after that admin is super role and has permission to change owner
/// @param _admin Address of multisig that becomes admin
function setAdminByOwner(address _admin) public {
require(msg.sender == owner);
require(admin == address(0));
admin = _admin;
}
/// @notice Admin is able to set new admin
/// @param _admin Address of multisig that becomes new admin
function setAdminByAdmin(address _admin) public {
require(msg.sender == admin);
admin = _admin;
}
/// @notice Admin is able to change owner
/// @param _owner Address of new owner
function setOwnerByAdmin(address _owner) public {
require(msg.sender == admin);
owner = _owner;
}
/// @notice Destroy the contract
function kill() public onlyOwner {
selfdestruct(payable(owner));
}
/// @notice withdraw stuck funds
function withdrawStuckFunds(address _token, uint _amount) public onlyOwner {
if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
payable(owner).transfer(_amount);
} else {
ERC20(_token).safeTransfer(owner, _amount);
}
}
} contract ZrxAllowlist is AdminAuth {
mapping (address => bool) public zrxAllowlist;
function setAllowlistAddr(address _zrxAddr, bool _state) public onlyOwner {
zrxAllowlist[_zrxAddr] = _state;
}
function isZrxAddr(address _zrxAddr) public view returns (bool) {
return zrxAllowlist[_zrxAddr];
}
} contract Discount {
address public owner;
mapping(address => CustomServiceFee) public serviceFees;
uint256 constant MAX_SERVICE_FEE = 400;
struct CustomServiceFee {
bool active;
uint256 amount;
}
constructor() public {
owner = msg.sender;
}
function isCustomFeeSet(address _user) public view returns (bool) {
return serviceFees[_user].active;
}
function getCustomServiceFee(address _user) public view returns (uint256) {
return serviceFees[_user].amount;
}
function setServiceFee(address _user, uint256 _fee) public {
require(msg.sender == owner, "Only owner");
require(_fee >= MAX_SERVICE_FEE || _fee == 0);
serviceFees[_user] = CustomServiceFee({active: true, amount: _fee});
}
function disableServiceFee(address _user) public {
require(msg.sender == owner, "Only owner");
serviceFees[_user] = CustomServiceFee({active: false, amount: 0});
}
} contract SaverExchangeHelper {
using SafeERC20 for ERC20;
address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address payable public constant WALLET_ID = 0x322d58b9E75a6918f7e7849AEe0fF09369977e08;
address public constant DISCOUNT_ADDRESS = 0x1b14E8D511c9A4395425314f849bD737BAF8208F;
address public constant SAVER_EXCHANGE_REGISTRY = 0x25dd3F51e0C3c3Ff164DDC02A8E4D65Bb9cBB12D;
address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF;
address public constant ZRX_ALLOWLIST_ADDR = 0x019739e288973F92bDD3c1d87178E206E51fd911;
function getDecimals(address _token) internal view returns (uint256) {
if (_token == KYBER_ETH_ADDRESS) return 18;
return ERC20(_token).decimals();
}
function getBalance(address _tokenAddr) internal view returns (uint balance) {
if (_tokenAddr == KYBER_ETH_ADDRESS) {
balance = address(this).balance;
} else {
balance = ERC20(_tokenAddr).balanceOf(address(this));
}
}
function approve0xProxy(address _tokenAddr, uint _amount) internal {
if (_tokenAddr != KYBER_ETH_ADDRESS) {
ERC20(_tokenAddr).safeApprove(address(ERC20_PROXY_0X), _amount);
}
}
function sendLeftover(address _srcAddr, address _destAddr, address payable _to) internal {
// send back any leftover ether or tokens
if (address(this).balance > 0) {
_to.transfer(address(this).balance);
}
if (getBalance(_srcAddr) > 0) {
ERC20(_srcAddr).safeTransfer(_to, getBalance(_srcAddr));
}
if (getBalance(_destAddr) > 0) {
ERC20(_destAddr).safeTransfer(_to, getBalance(_destAddr));
}
}
function sliceUint(bytes memory bs, uint256 start) internal pure returns (uint256) {
require(bs.length >= start + 32, "slicing out of range");
uint256 x;
assembly {
x := mload(add(bs, add(0x20, start)))
}
return x;
}
} contract SaverExchangeRegistry is AdminAuth {
mapping(address => bool) private wrappers;
constructor() public {
wrappers[0x880A845A85F843a5c67DB2061623c6Fc3bB4c511] = true;
wrappers[0x4c9B55f2083629A1F7aDa257ae984E03096eCD25] = true;
wrappers[0x42A9237b872368E1bec4Ca8D26A928D7d39d338C] = true;
}
function addWrapper(address _wrapper) public onlyOwner {
wrappers[_wrapper] = true;
}
function removeWrapper(address _wrapper) public onlyOwner {
wrappers[_wrapper] = false;
}
function isWrapper(address _wrapper) public view returns(bool) {
return wrappers[_wrapper];
}
}
contract SaverExchangeCore is SaverExchangeHelper, DSMath {
// first is empty to keep the legacy order in place
enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX }
enum ActionType { SELL, BUY }
struct ExchangeData {
address srcAddr;
address destAddr;
uint srcAmount;
uint destAmount;
uint minPrice;
address wrapper;
address exchangeAddr;
bytes callData;
uint256 price0x;
}
/// @notice Internal method that preforms a sell on 0x/on-chain
/// @dev Usefull for other DFS contract to integrate for exchanging
/// @param exData Exchange data struct
/// @return (address, uint) Address of the wrapper used and destAmount
function _sell(ExchangeData memory exData) internal returns (address, uint) {
address wrapper;
uint swapedTokens;
bool success;
uint tokensLeft = exData.srcAmount;
// if selling eth, convert to weth
if (exData.srcAddr == KYBER_ETH_ADDRESS) {
exData.srcAddr = ethToWethAddr(exData.srcAddr);
TokenInterface(WETH_ADDRESS).deposit.value(exData.srcAmount)();
}
// Try 0x first and then fallback on specific wrapper
if (exData.price0x > 0) {
approve0xProxy(exData.srcAddr, exData.srcAmount);
(success, swapedTokens, tokensLeft) = takeOrder(exData, address(this).balance, ActionType.SELL);
if (success) {
wrapper = exData.exchangeAddr;
}
}
// fallback to desired wrapper if 0x failed
if (!success) {
swapedTokens = saverSwap(exData, ActionType.SELL);
wrapper = exData.wrapper;
}
require(getBalance(exData.destAddr) >= wmul(exData.minPrice, exData.srcAmount), "Final amount isn't correct");
// if anything is left in weth, pull it to user as eth
if (getBalance(WETH_ADDRESS) > 0) {
TokenInterface(WETH_ADDRESS).withdraw(
TokenInterface(WETH_ADDRESS).balanceOf(address(this))
);
}
return (wrapper, swapedTokens);
}
/// @notice Takes order from 0x and returns bool indicating if it is successful
/// @param _exData Exchange data
/// @param _ethAmount Ether fee needed for 0x order
function takeOrder(
ExchangeData memory _exData,
uint256 _ethAmount,
ActionType _type
) private returns (bool success, uint256, uint256) {
// write in the exact amount we are selling/buing in an order
if (_type == ActionType.SELL) {
writeUint256(_exData.callData, 36, _exData.srcAmount);
} else {
writeUint256(_exData.callData, 36, _exData.destAmount);
}
if (ZrxAllowlist(ZRX_ALLOWLIST_ADDR).isZrxAddr(_exData.exchangeAddr)) {
(success, ) = _exData.exchangeAddr.call{value: _ethAmount}(_exData.callData);
} else {
success = false;
}
uint256 tokensSwaped = 0;
uint256 tokensLeft = _exData.srcAmount;
if (success) {
// check to see if any _src tokens are left over after exchange
tokensLeft = getBalance(_exData.srcAddr);
// convert weth -> eth if needed
if (_exData.destAddr == KYBER_ETH_ADDRESS) {
TokenInterface(WETH_ADDRESS).withdraw(
TokenInterface(WETH_ADDRESS).balanceOf(address(this))
);
}
// get the current balance of the swaped tokens
tokensSwaped = getBalance(_exData.destAddr);
}
return (success, tokensSwaped, tokensLeft);
}
/// @notice Calls wraper contract for exchage to preform an on-chain swap
/// @param _exData Exchange data struct
/// @param _type Type of action SELL|BUY
/// @return swapedTokens For Sell that the destAmount, for Buy thats the srcAmount
function saverSwap(ExchangeData memory _exData, ActionType _type) internal returns (uint swapedTokens) {
require(SaverExchangeRegistry(SAVER_EXCHANGE_REGISTRY).isWrapper(_exData.wrapper), "Wrapper is not valid");
uint ethValue = 0;
ERC20(_exData.srcAddr).safeTransfer(_exData.wrapper, _exData.srcAmount);
if (_type == ActionType.SELL) {
swapedTokens = ExchangeInterfaceV2(_exData.wrapper).
sell{value: ethValue}(_exData.srcAddr, _exData.destAddr, _exData.srcAmount);
} else {
swapedTokens = ExchangeInterfaceV2(_exData.wrapper).
buy{value: ethValue}(_exData.srcAddr, _exData.destAddr, _exData.destAmount);
}
}
function writeUint256(bytes memory _b, uint256 _index, uint _input) internal pure {
if (_b.length < _index + 32) {
revert("Incorrent lengt while writting bytes32");
}
bytes32 input = bytes32(_input);
_index += 32;
// Read the bytes32 from array memory
assembly {
mstore(add(_b, _index), input)
}
}
/// @notice Converts Kybers Eth address -> Weth
/// @param _src Input address
function ethToWethAddr(address _src) internal pure returns (address) {
return _src == KYBER_ETH_ADDRESS ? WETH_ADDRESS : _src;
}
// solhint-disable-next-line no-empty-blocks
receive() external virtual payable {}
} abstract contract GemLike {
function approve(address, uint256) public virtual;
function transfer(address, uint256) public virtual;
function transferFrom(address, address, uint256) public virtual;
function deposit() public virtual payable;
function withdraw(uint256) public virtual;
}
abstract contract ManagerLike {
function cdpCan(address, uint256, address) public virtual view returns (uint256);
function ilks(uint256) public virtual view returns (bytes32);
function owns(uint256) public virtual view returns (address);
function urns(uint256) public virtual view returns (address);
function vat() public virtual view 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;
}
abstract contract VatLike {
function can(address, address) public virtual view returns (uint256);
function ilks(bytes32) public virtual view returns (uint256, uint256, uint256, uint256, uint256);
function dai(address) public virtual view returns (uint256);
function urns(bytes32, address) public virtual view returns (uint256, uint256);
function frob(bytes32, address, address, address, int256, int256) public virtual;
function hope(address) public virtual;
function move(address, address, uint256) public virtual;
}
abstract contract GemJoinLike {
function dec() public virtual returns (uint256);
function gem() public virtual returns (GemLike);
function join(address, uint256) public virtual payable;
function exit(address, uint256) public virtual;
}
abstract contract GNTJoinLike {
function bags(address) public virtual view returns (address);
function make(address) public virtual returns (address);
}
abstract contract DaiJoinLike {
function vat() public virtual returns (VatLike);
function dai() public virtual returns (GemLike);
function join(address, uint256) public virtual payable;
function exit(address, uint256) public virtual;
}
abstract contract HopeLike {
function hope(address) public virtual;
function nope(address) public virtual;
}
abstract contract ProxyRegistryInterface {
function build(address) public virtual returns (address);
}
abstract contract EndLike {
function fix(bytes32) public virtual view returns (uint256);
function cash(bytes32, uint256) public virtual;
function free(bytes32) public virtual;
function pack(uint256) public virtual;
function skim(bytes32, address) public virtual;
}
abstract contract JugLike {
function drip(bytes32) public virtual returns (uint256);
}
abstract contract PotLike {
function pie(address) public virtual view returns (uint256);
function drip() public virtual returns (uint256);
function join(uint256) public virtual;
function exit(uint256) public virtual;
}
abstract contract ProxyRegistryLike {
function proxies(address) public virtual view returns (address);
function build(address) public virtual returns (address);
}
abstract contract ProxyLike {
function owner() public virtual view returns (address);
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// WARNING: These functions meant to be used as a a library for a DSProxy. Some are unsafe if you call them directly.
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
contract Common {
uint256 constant RAY = 10**27;
// Internal functions
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "mul-overflow");
}
// Public functions
// solhint-disable-next-line func-name-mixedcase
function daiJoin_join(address apt, address urn, uint256 wad) public {
// Gets DAI from the user's wallet
DaiJoinLike(apt).dai().transferFrom(msg.sender, address(this), wad);
// Approves adapter to take the DAI amount
DaiJoinLike(apt).dai().approve(apt, wad);
// Joins DAI into the vat
DaiJoinLike(apt).join(urn, wad);
}
}
contract MCDCreateProxyActions is Common {
// Internal functions
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x, "sub-overflow");
}
function toInt(uint256 x) internal pure returns (int256 y) {
y = int256(x);
require(y >= 0, "int-overflow");
}
function toRad(uint256 wad) internal pure returns (uint256 rad) {
rad = mul(wad, 10**27);
}
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 = mul(amt, 10**(18 - GemJoinLike(gemJoin).dec()));
}
function _getDrawDart(address vat, address jug, address urn, bytes32 ilk, uint256 wad)
internal
returns (int256 dart)
{
// Updates stability fee rate
uint256 rate = JugLike(jug).drip(ilk);
// Gets DAI balance of the urn in the vat
uint256 dai = VatLike(vat).dai(urn);
// If there was already enough DAI in the vat balance, just exits it without adding more debt
if (dai < mul(wad, RAY)) {
// Calculates the needed dart so together with the existing dai in the vat is enough to exit wad amount of DAI tokens
dart = toInt(sub(mul(wad, RAY), 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 = mul(uint256(dart), rate) < mul(wad, RAY) ? dart + 1 : dart;
}
}
function _getWipeDart(address vat, uint256 dai, address urn, bytes32 ilk)
internal
view
returns (int256 dart)
{
// Gets actual rate from the vat
(, uint256 rate, , , ) = VatLike(vat).ilks(ilk);
// Gets actual art value of the urn
(, uint256 art) = VatLike(vat).urns(ilk, urn);
// Uses the whole dai balance in the vat to reduce the debt
dart = toInt(dai / rate);
// Checks the calculated dart is not higher than urn.art (total debt), otherwise uses its value
dart = uint256(dart) <= art ? -dart : -toInt(art);
}
function _getWipeAllWad(address vat, address usr, address urn, bytes32 ilk)
internal
view
returns (uint256 wad)
{
// Gets actual rate from the vat
(, uint256 rate, , , ) = VatLike(vat).ilks(ilk);
// Gets actual art value of the urn
(, uint256 art) = VatLike(vat).urns(ilk, urn);
// Gets actual dai amount in the urn
uint256 dai = VatLike(vat).dai(usr);
uint256 rad = sub(mul(art, rate), dai);
wad = rad / RAY;
// If the rad precision has some dust, it will need to request for 1 extra wad wei
wad = mul(wad, RAY) < rad ? wad + 1 : wad;
}
// Public functions
function transfer(address gem, address dst, uint256 wad) public {
GemLike(gem).transfer(dst, wad);
}
// solhint-disable-next-line func-name-mixedcase
function ethJoin_join(address apt, address urn) public payable {
// Wraps ETH in WETH
GemJoinLike(apt).gem().deposit{value: msg.value}();
// Approves adapter to take the WETH amount
GemJoinLike(apt).gem().approve(address(apt), msg.value);
// Joins WETH collateral into the vat
GemJoinLike(apt).join(urn, msg.value);
}
// solhint-disable-next-line func-name-mixedcase
function gemJoin_join(address apt, address urn, uint256 wad, bool transferFrom) public {
// Only executes for tokens that have approval/transferFrom implementation
if (transferFrom) {
// Gets token from the user's wallet
GemJoinLike(apt).gem().transferFrom(msg.sender, address(this), wad);
// Approves adapter to take the token amount
GemJoinLike(apt).gem().approve(apt, wad);
}
// Joins token collateral into the vat
GemJoinLike(apt).join(urn, wad);
}
function hope(address obj, address usr) public {
HopeLike(obj).hope(usr);
}
function nope(address obj, address usr) public {
HopeLike(obj).nope(usr);
}
function open(address manager, bytes32 ilk, address usr) public returns (uint256 cdp) {
cdp = ManagerLike(manager).open(ilk, usr);
}
function give(address manager, uint256 cdp, address usr) public {
ManagerLike(manager).give(cdp, usr);
}
function move(address manager, uint256 cdp, address dst, uint256 rad) public {
ManagerLike(manager).move(cdp, dst, rad);
}
function frob(address manager, uint256 cdp, int256 dink, int256 dart) public {
ManagerLike(manager).frob(cdp, dink, dart);
}
function lockETH(address manager, address ethJoin, uint256 cdp) public payable {
// Receives ETH amount, converts it to WETH and joins it into the vat
ethJoin_join(ethJoin, address(this));
// Locks WETH amount into the CDP
VatLike(ManagerLike(manager).vat()).frob(
ManagerLike(manager).ilks(cdp),
ManagerLike(manager).urns(cdp),
address(this),
address(this),
toInt(msg.value),
0
);
}
function lockGem(address manager, address gemJoin, uint256 cdp, uint256 wad, bool transferFrom)
public
{
// Takes token amount from user's wallet and joins into the vat
gemJoin_join(gemJoin, address(this), wad, transferFrom);
// Locks token amount into the CDP
VatLike(ManagerLike(manager).vat()).frob(
ManagerLike(manager).ilks(cdp),
ManagerLike(manager).urns(cdp),
address(this),
address(this),
toInt(convertTo18(gemJoin, wad)),
0
);
}
function draw(address manager, address jug, address daiJoin, uint256 cdp, uint256 wad) public {
address urn = ManagerLike(manager).urns(cdp);
address vat = ManagerLike(manager).vat();
bytes32 ilk = ManagerLike(manager).ilks(cdp);
// Generates debt in the CDP
frob(manager, cdp, 0, _getDrawDart(vat, jug, urn, ilk, wad));
// Moves the DAI amount (balance in the vat in rad) to proxy's address
move(manager, cdp, address(this), toRad(wad));
// Allows adapter to access to proxy's DAI balance in the vat
if (VatLike(vat).can(address(this), address(daiJoin)) == 0) {
VatLike(vat).hope(daiJoin);
}
// Exits DAI to the user's wallet as a token
DaiJoinLike(daiJoin).exit(msg.sender, wad);
}
function lockETHAndDraw(
address manager,
address jug,
address ethJoin,
address daiJoin,
uint256 cdp,
uint256 wadD
) public payable {
address urn = ManagerLike(manager).urns(cdp);
address vat = ManagerLike(manager).vat();
bytes32 ilk = ManagerLike(manager).ilks(cdp);
// Receives ETH amount, converts it to WETH and joins it into the vat
ethJoin_join(ethJoin, urn);
// Locks WETH amount into the CDP and generates debt
frob(manager, cdp, toInt(msg.value), _getDrawDart(vat, jug, urn, ilk, wadD));
// Moves the DAI amount (balance in the vat in rad) to proxy's address
move(manager, cdp, address(this), toRad(wadD));
// Allows adapter to access to proxy's DAI balance in the vat
if (VatLike(vat).can(address(this), address(daiJoin)) == 0) {
VatLike(vat).hope(daiJoin);
}
// Exits DAI to the user's wallet as a token
DaiJoinLike(daiJoin).exit(msg.sender, wadD);
}
function openLockETHAndDraw(
address manager,
address jug,
address ethJoin,
address daiJoin,
bytes32 ilk,
uint256 wadD,
address owner
) public payable returns (uint256 cdp) {
cdp = open(manager, ilk, address(this));
lockETHAndDraw(manager, jug, ethJoin, daiJoin, cdp, wadD);
give(manager, cdp, owner);
}
function lockGemAndDraw(
address manager,
address jug,
address gemJoin,
address daiJoin,
uint256 cdp,
uint256 wadC,
uint256 wadD,
bool transferFrom
) public {
address urn = ManagerLike(manager).urns(cdp);
address vat = ManagerLike(manager).vat();
bytes32 ilk = ManagerLike(manager).ilks(cdp);
// Takes token amount from user's wallet and joins into the vat
gemJoin_join(gemJoin, urn, wadC, transferFrom);
// Locks token amount into the CDP and generates debt
frob(
manager,
cdp,
toInt(convertTo18(gemJoin, wadC)),
_getDrawDart(vat, jug, urn, ilk, wadD)
);
// Moves the DAI amount (balance in the vat in rad) to proxy's address
move(manager, cdp, address(this), toRad(wadD));
// Allows adapter to access to proxy's DAI balance in the vat
if (VatLike(vat).can(address(this), address(daiJoin)) == 0) {
VatLike(vat).hope(daiJoin);
}
// Exits DAI to the user's wallet as a token
DaiJoinLike(daiJoin).exit(msg.sender, wadD);
}
function openLockGemAndDraw(
address manager,
address jug,
address gemJoin,
address daiJoin,
bytes32 ilk,
uint256 wadC,
uint256 wadD,
bool transferFrom,
address owner
) public returns (uint256 cdp) {
cdp = open(manager, ilk, address(this));
lockGemAndDraw(manager, jug, gemJoin, daiJoin, cdp, wadC, wadD, transferFrom);
give(manager, cdp, owner);
}
} interface IFlashLoanReceiver {
function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external;
}
abstract contract ILendingPoolAddressesProvider {
function getLendingPool() public view virtual returns (address);
function setLendingPoolImpl(address _pool) public virtual;
function getLendingPoolCore() public virtual view returns (address payable);
function setLendingPoolCoreImpl(address _lendingPoolCore) public virtual;
function getLendingPoolConfigurator() public virtual view returns (address);
function setLendingPoolConfiguratorImpl(address _configurator) public virtual;
function getLendingPoolDataProvider() public virtual view returns (address);
function setLendingPoolDataProviderImpl(address _provider) public virtual;
function getLendingPoolParametersProvider() public virtual view returns (address);
function setLendingPoolParametersProviderImpl(address _parametersProvider) public virtual;
function getTokenDistributor() public virtual view returns (address);
function setTokenDistributor(address _tokenDistributor) public virtual;
function getFeeProvider() public virtual view returns (address);
function setFeeProviderImpl(address _feeProvider) public virtual;
function getLendingPoolLiquidationManager() public virtual view returns (address);
function setLendingPoolLiquidationManager(address _manager) public virtual;
function getLendingPoolManager() public virtual view returns (address);
function setLendingPoolManager(address _lendingPoolManager) public virtual;
function getPriceOracle() public virtual view returns (address);
function setPriceOracle(address _priceOracle) public virtual;
function getLendingRateOracle() public view virtual returns (address);
function setLendingRateOracle(address _lendingRateOracle) public virtual;
}
library EthAddressLib {
function ethAddress() internal pure returns(address) {
return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
}
}
abstract contract FlashLoanReceiverBase is IFlashLoanReceiver {
using SafeERC20 for ERC20;
using SafeMath for uint256;
ILendingPoolAddressesProvider public addressesProvider;
constructor(ILendingPoolAddressesProvider _provider) public {
addressesProvider = _provider;
}
receive () external virtual payable {}
function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal {
address payable core = addressesProvider.getLendingPoolCore();
transferInternal(core,_reserve, _amount);
}
function transferInternal(address payable _destination, address _reserve, uint256 _amount) internal {
if(_reserve == EthAddressLib.ethAddress()) {
//solium-disable-next-line
_destination.call{value: _amount}("");
return;
}
ERC20(_reserve).safeTransfer(_destination, _amount);
}
function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) {
if(_reserve == EthAddressLib.ethAddress()) {
return _target.balance;
}
return ERC20(_reserve).balanceOf(_target);
}
} abstract contract Manager {
function last(address) virtual public returns (uint);
function cdpCan(address, uint, address) virtual public view returns (uint);
function ilks(uint) virtual public view returns (bytes32);
function owns(uint) virtual public view returns (address);
function urns(uint) virtual public view returns (address);
function vat() virtual public view returns (address);
function open(bytes32, address) virtual public returns (uint);
function give(uint, address) virtual public;
function cdpAllow(uint, address, uint) virtual public;
function urnAllow(address, uint) virtual public;
function frob(uint, int, int) virtual public;
function flux(uint, address, uint) virtual public;
function move(uint, address, uint) virtual public;
function exit(address, uint, address, uint) virtual public;
function quit(uint, address) virtual public;
function enter(address, uint) virtual public;
function shift(uint, uint) virtual public;
} abstract contract Gem {
function dec() virtual public returns (uint);
function gem() virtual public returns (Gem);
function join(address, uint) virtual public payable;
function exit(address, uint) virtual public;
function approve(address, uint) virtual public;
function transfer(address, uint) virtual public returns (bool);
function transferFrom(address, address, uint) virtual public returns (bool);
function deposit() virtual public payable;
function withdraw(uint) virtual public;
function allowance(address, address) virtual public returns (uint);
} abstract contract Join {
bytes32 public ilk;
function dec() virtual public view returns (uint);
function gem() virtual public view returns (Gem);
function join(address, uint) virtual public payable;
function exit(address, uint) virtual public;
} abstract contract DSAuthority {
function canCall(address src, address dst, bytes4 sig) public virtual view returns (bool);
} contract DSAuthEvents {
event LogSetAuthority(address indexed authority);
event LogSetOwner(address indexed owner);
}
contract DSAuth is DSAuthEvents {
DSAuthority public authority;
address public owner;
constructor() public {
owner = msg.sender;
emit LogSetOwner(msg.sender);
}
function setOwner(address owner_) public auth {
owner = owner_;
emit LogSetOwner(owner);
}
function setAuthority(DSAuthority authority_) public auth {
authority = authority_;
emit LogSetAuthority(address(authority));
}
modifier auth {
require(isAuthorized(msg.sender, msg.sig));
_;
}
function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
if (src == address(this)) {
return true;
} else if (src == owner) {
return true;
} else if (authority == DSAuthority(0)) {
return false;
} else {
return authority.canCall(src, address(this), sig);
}
}
} contract DSNote {
event LogNote(
bytes4 indexed sig,
address indexed guy,
bytes32 indexed foo,
bytes32 indexed bar,
uint256 wad,
bytes fax
) anonymous;
modifier note {
bytes32 foo;
bytes32 bar;
assembly {
foo := calldataload(4)
bar := calldataload(36)
}
emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);
_;
}
} abstract contract DSProxy is DSAuth, DSNote {
DSProxyCache public cache; // global cache for contracts
constructor(address _cacheAddr) public {
require(setCache(_cacheAddr));
}
// solhint-disable-next-line no-empty-blocks
receive() external payable {}
// use the proxy to execute calldata _data on contract _code
// function execute(bytes memory _code, bytes memory _data)
// public
// payable
// virtual
// returns (address target, bytes32 response);
function execute(address _target, bytes memory _data)
public
payable
virtual
returns (bytes32 response);
//set new cache
function setCache(address _cacheAddr) public virtual payable returns (bool);
}
contract DSProxyCache {
mapping(bytes32 => address) cache;
function read(bytes memory _code) public view returns (address) {
bytes32 hash = keccak256(_code);
return cache[hash];
}
function write(bytes memory _code) public returns (address target) {
assembly {
target := create(0, add(_code, 0x20), mload(_code))
switch iszero(extcodesize(target))
case 1 {
// throw if contract failed to deploy
revert(0, 0)
}
}
bytes32 hash = keccak256(_code);
cache[hash] = target;
}
}
contract MCDCreateFlashLoan is SaverExchangeCore, AdminAuth, FlashLoanReceiverBase {
address public constant CREATE_PROXY_ACTIONS = 0x6d0984E80a86f26c0dd564ca0CF74a8E9Da03305;
uint public constant SERVICE_FEE = 400; // 0.25% Fee
address public constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
ILendingPoolAddressesProvider public LENDING_POOL_ADDRESS_PROVIDER = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
address public constant ETH_JOIN_ADDRESS = 0x2F0b23f53734252Bda2277357e97e1517d6B042A;
address public constant DAI_JOIN_ADDRESS = 0x9759A6Ac90977b93B58547b4A71c78317f391A28;
address public constant JUG_ADDRESS = 0x19c0976f590D67707E62397C87829d896Dc0f1F1;
address public constant MANAGER_ADDRESS = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39;
constructor() FlashLoanReceiverBase(LENDING_POOL_ADDRESS_PROVIDER) public {}
function executeOperation(
address _reserve,
uint256 _amount,
uint256 _fee,
bytes calldata _params)
external override {
//check the contract has the specified balance
require(_amount <= getBalanceInternal(address(this), _reserve),
"Invalid balance for the contract");
(
uint[6] memory numData,
address[5] memory addrData,
bytes memory callData,
address proxy
)
= abi.decode(_params, (uint256[6],address[5],bytes,address));
ExchangeData memory exchangeData = ExchangeData({
srcAddr: addrData[0],
destAddr: addrData[1],
srcAmount: numData[2],
destAmount: numData[3],
minPrice: numData[4],
wrapper: addrData[3],
exchangeAddr: addrData[2],
callData: callData,
price0x: numData[5]
});
openAndLeverage(numData[0], numData[1] + _fee, addrData[4], proxy, exchangeData);
transferFundsBackToPoolInternal(_reserve, _amount.add(_fee));
// if there is some eth left (0x fee), return it to user
if (address(this).balance > 0) {
tx.origin.transfer(address(this).balance);
}
}
function openAndLeverage(
uint _collAmount,
uint _daiAmountAndFee,
address _joinAddr,
address _proxy,
ExchangeData memory _exchangeData
) public {
uint dfsFee = getFee(_exchangeData.srcAmount, DSProxy(payable(_proxy)).owner());
_exchangeData.srcAmount = (_exchangeData.srcAmount - dfsFee);
(, uint256 collSwaped) = _sell(_exchangeData);
bytes32 ilk = Join(_joinAddr).ilk();
if (_joinAddr == ETH_JOIN_ADDRESS) {
MCDCreateProxyActions(CREATE_PROXY_ACTIONS).openLockETHAndDraw{value: address(this).balance}(
MANAGER_ADDRESS,
JUG_ADDRESS,
ETH_JOIN_ADDRESS,
DAI_JOIN_ADDRESS,
ilk,
_daiAmountAndFee,
_proxy
);
} else {
Join(_joinAddr).gem().approve(CREATE_PROXY_ACTIONS, uint256(-1));
MCDCreateProxyActions(CREATE_PROXY_ACTIONS).openLockGemAndDraw(
MANAGER_ADDRESS,
JUG_ADDRESS,
_joinAddr,
DAI_JOIN_ADDRESS,
ilk,
(_collAmount + collSwaped),
_daiAmountAndFee,
true,
_proxy
);
}
}
function getFee(uint _amount, address _owner) internal returns (uint feeAmount) {
uint fee = SERVICE_FEE;
if (Discount(DISCOUNT_ADDRESS).isCustomFeeSet(_owner)) {
fee = Discount(DISCOUNT_ADDRESS).getCustomServiceFee(_owner);
}
feeAmount = (fee == 0) ? 0 : (_amount / fee);
// fee can't go over 20% of the whole amount
if (feeAmount > (_amount / 5)) {
feeAmount = _amount / 5;
}
ERC20(DAI_ADDRESS).transfer(WALLET_ID, feeAmount);
}
receive() external override(FlashLoanReceiverBase, SaverExchangeCore) payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CREATE_PROXY_ACTIONS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI_JOIN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISCOUNT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC20_PROXY_0X","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_JOIN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JUG_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KYBER_ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LENDING_POOL_ADDRESS_PROVIDER","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAVER_EXCHANGE_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_ID","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZRX_ALLOWLIST_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressesProvider","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reserve","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"bytes","name":"_params","type":"bytes"}],"name":"executeOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"uint256","name":"_daiAmountAndFee","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"},{"internalType":"address","name":"_proxy","type":"address"},{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"price0x","type":"uint256"}],"internalType":"struct SaverExchangeCore.ExchangeData","name":"_exchangeData","type":"tuple"}],"name":"openAndLeverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwnerByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052600380546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c817905534801561003657600080fd5b50600354600080546001600160a01b03199081163317909155600280549091166001600160a01b03909216919091179055612333806100766000396000f3fe60806040526004361061016a5760003560e01c806398ab3d49116100d1578063cfac57c71161008a578063deca5f8811610064578063deca5f8814610380578063ee872558146103a0578063f1d25396146103c0578063f851a440146103d557610171565b8063cfac57c714610341578063d0cc728914610356578063d3661fa51461036b57610171565b806398ab3d49146102b857806399532ae7146102cd578063a46a66c9146102e2578063a7304bf7146102f7578063acbeba6114610317578063c72c4d101461032c57610171565b8063380d424411610123578063380d4244146102225780633a1283221461023757806341c0e1b51461025757806350c86de51461026c5780638c8a79581461028e5780638da5cb5b146102a357610171565b8063040141e5146101765780631e48907b146101a157806329f7fc9e146101c35780632a4c0a1a146101d8578063303ffcbb146101ed578063314b63321461020d57610171565b3661017157005b600080fd5b34801561018257600080fd5b5061018b6103ea565b6040516101989190611fc1565b60405180910390f35b3480156101ad57600080fd5b506101c16101bc366004611c98565b610402565b005b3480156101cf57600080fd5b5061018b61043b565b3480156101e457600080fd5b5061018b610453565b3480156101f957600080fd5b506101c1610208366004611e87565b61046b565b34801561021957600080fd5b5061018b610868565b34801561022e57600080fd5b5061018b610880565b34801561024357600080fd5b506101c1610252366004611cd0565b610898565b34801561026357600080fd5b506101c1610937565b34801561027857600080fd5b5061028161095c565b6040516101989190612268565b34801561029a57600080fd5b5061018b610962565b3480156102af57600080fd5b5061018b61097a565b3480156102c457600080fd5b5061018b610989565b3480156102d957600080fd5b5061018b610998565b3480156102ee57600080fd5b5061018b6109b0565b34801561030357600080fd5b506101c1610312366004611c98565b6109c8565b34801561032357600080fd5b5061018b610a01565b34801561033857600080fd5b5061018b610a19565b34801561034d57600080fd5b5061018b610a28565b34801561036257600080fd5b5061018b610a40565b34801561037757600080fd5b5061018b610a58565b34801561038c57600080fd5b506101c161039b366004611c98565b610a70565b3480156103ac57600080fd5b506101c16103bb366004611cfb565b610a9d565b3480156103cc57600080fd5b5061018b610be3565b3480156103e157600080fd5b5061018b610bfb565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6001546001600160a01b0316331461041957600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b60006104eb8260400151846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190611cb4565b610c0a565b60408301805182900390529050600061050383610dfa565b9150506000856001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561054157600080fd5b505afa158015610555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105799190611e6f565b90506001600160a01b038616732f0b23f53734252bda2277357e97e1517d6b042a141561069557736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b03166318df6c4e47735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f1732f0b23f53734252bda2277357e97e1517d6b042a739759a6ac90977b93b58547b4a71c78317f391a28878e8d6040518963ffffffff1660e01b815260040161063d9796959493929190611fee565b6020604051808303818588803b15801561065657600080fd5b505af115801561066a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061068f9190611e6f565b5061085e565b856001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ce57600080fd5b505afa1580156106e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107069190611cb4565b6001600160a01b031663095ea7b3736d0984e80a86f26c0dd564ca0cf74a8e9da033056000196040518363ffffffff1660e01b8152600401610749929190611fd5565b600060405180830381600087803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b50505050736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b031663a7ce406e735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f189739759a6ac90977b93b58547b4a71c78317f391a2886888f018e60018e6040518a63ffffffff1660e01b815260040161080a9998979695949392919061202b565b602060405180830381600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190611e6f565b505b5050505050505050565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b6000546001600160a01b031633146108af57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038316141561091357600080546040516001600160a01b039091169183156108fc02918491818181858888f1935050505015801561090d573d6000803e3d6000fd5b50610933565b600054610933906001600160a01b0384811691168363ffffffff61105916565b5050565b6000546001600160a01b0316331461094e57600080fd5b6000546001600160a01b0316ff5b61019081565b73019739e288973f92bdd3c1d87178e206e51fd91181565b6000546001600160a01b031681565b6003546001600160a01b031681565b736d0984e80a86f26c0dd564ca0cf74a8e9da0330581565b731b14e8d511c9a4395425314f849bd737baf8208f81565b6001546001600160a01b031633146109df57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b7319c0976f590d67707e62397c87829d896dc0f1f181565b6002546001600160a01b031681565b739759a6ac90977b93b58547b4a71c78317f391a2881565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b6000546001600160a01b03163314610a8757600080fd5b6001546001600160a01b0316156109df57600080fd5b610aa730866110b4565b841115610acf5760405162461bcd60e51b8152600401610ac6906121b2565b60405180910390fd5b610ad7611b15565b610adf611b33565b60606000610aef85870187611d8f565b9350935093509350610aff611b51565b50604080516101208101825284516001600160a01b0390811682526020808701518216818401528784015183850152606080890151818501526080808a01518186015290880151831660a0808601919091529488015190921660c084015260e0830186905292870151610100830152865192870151908601519192610b8a9290918b0190858561046b565b610ba38a610b9e8b8b63ffffffff61116d16565b611192565b4715610bd75760405132904780156108fc02916000818181858888f19350505050158015610bd5573d6000803e3d6000fd5b505b50505050505050505050565b732f0b23f53734252bda2277357e97e1517d6b042a81565b6001546001600160a01b031681565b604051632cdc77ab60e21b815260009061019090731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac90610c48908690600401611fc1565b60206040518083038186803b158015610c6057600080fd5b505afa158015610c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c989190611e4f565b15610d2757604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb543190610cd4908690600401611fc1565b60206040518083038186803b158015610cec57600080fd5b505afa158015610d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d249190611e6f565b90505b8015610d3c57808481610d3657fe5b04610d3f565b60005b915060058404821115610d53576005840491505b60405163a9059cbb60e01b8152736b175474e89094c44da98b954eedeac495271d0f9063a9059cbb90610da09073322d58b9e75a6918f7e7849aee0ff09369977e08908690600401611fd5565b602060405180830381600087803b158015610dba57600080fd5b505af1158015610dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df29190611e4f565b505092915050565b604081015181516000918291829182918291906001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610eb2578651610e3c9061121c565b6001600160a01b031687526040808801518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b50505050505b61010087015115610ef157610ecf87600001518860400151611266565b610edb874760006112b8565b90945090925090508115610ef1578660c0015193505b81610f0b57610f01876000611542565b92508660a0015193505b610f1d87608001518860400151611760565b610f2a8860200151611795565b1015610f485760405162461bcd60e51b8152600401610ac690612135565b6000610f6773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611795565b111561104d576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190610fac903090600401611fc1565b602060405180830381600087803b158015610fc657600080fd5b505af1158015610fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffe9190611e6f565b6040518263ffffffff1660e01b815260040161101a9190612268565b600060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050505b50919350915050915091565b6110af8363a9059cbb60e01b8484604051602401611078929190611fd5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261183f565b505050565b60006110be6118ce565b6001600160a01b0316826001600160a01b031614156110e857506001600160a01b03821631611167565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611114908690600401611fc1565b60206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190611e6f565b90505b92915050565b6000828201838110156111645760405162461bcd60e51b8152600401610ac6906120d0565b6002546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b1580156111d757600080fd5b505afa1580156111eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120f9190611cb4565b90506110af8184846118e6565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611248578161125e565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b90505b919050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610933576109336001600160a01b0383167395e6f48254609a6ee006f7d493c8e5fb97094cef8363ffffffff61198216565b60008080808460018111156112c957fe5b14156112e8576112e38660e00151602488604001516119a1565b6112fc565b6112fc8660e00151602488606001516119a1565b60c08601516040516302f5cc7960e11b815273019739e288973f92bdd3c1d87178e206e51fd911916305eb98f2916113379190600401611fc1565b60206040518083038186803b15801561134f57600080fd5b505afa158015611363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113879190611e4f565b156113fa578560c001516001600160a01b0316858760e001516040516113ad9190611fa2565b60006040518083038185875af1925050503d80600081146113ea576040519150601f19603f3d011682016040523d82523d6000602084013e6113ef565b606091505b5050809350506113ff565b600092505b6040860151600090841561153457875161141890611795565b60208901519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611524576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190611483903090600401611fc1565b602060405180830381600087803b15801561149d57600080fd5b505af11580156114b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d59190611e6f565b6040518263ffffffff1660e01b81526004016114f19190612268565b600060405180830381600087803b15801561150b57600080fd5b505af115801561151f573d6000803e3d6000fd5b505050505b6115318860200151611795565b91505b909250905093509350939050565b60a082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa27979161157f91600401611fc1565b60206040518083038186803b15801561159757600080fd5b505afa1580156115ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cf9190611e4f565b6115eb5760405162461bcd60e51b8152600401610ac690612107565b60a083015160408401518451600092611615926001600160a01b039092169163ffffffff61105916565b600083600181111561162357fe5b14156116c3578360a001516001600160a01b031663cae270b6828660000151876020015188604001516040518563ffffffff1660e01b815260040161166a93929190612079565b6020604051808303818588803b15801561168357600080fd5b505af1158015611697573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116bc9190611e6f565b9150611759565b8360a001516001600160a01b031663153e66e6828660000151876020015188606001516040518563ffffffff1660e01b815260040161170493929190612079565b6020604051808303818588803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117569190611e6f565b91505b5092915050565b6000670de0b6b3a764000061178661177885856119cd565b6706f05b59d3b200006119f1565b8161178d57fe5b049392505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156117c3575047611261565b6040516370a0823160e01b81526001600160a01b038316906370a08231906117ef903090600401611fc1565b60206040518083038186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125e9190611e6f565b6060611894826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a019092919063ffffffff16565b8051909150156110af57808060200190518101906118b29190611e4f565b6110af5760405162461bcd60e51b8152600401610ac69061221e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b6118ee6118ce565b6001600160a01b0316826001600160a01b0316141561196857826001600160a01b03168160405161191e90611fbe565b60006040518083038185875af1925050503d806000811461195b576040519150601f19603f3d011682016040523d82523d6000602084013e611960565b606091505b5050506110af565b6110af6001600160a01b038316848363ffffffff61105916565b6110af8363095ea7b360e01b8484604051602401611078929190611fd5565b81602001835110156119c55760405162461bcd60e51b8152600401610ac69061216c565b910160200152565b60008115806119e8575050808202828282816119e557fe5b04145b61116757600080fd5b8082018281101561116757600080fd5b6060611a108484600085611a18565b949350505050565b6060611a2385611adc565b611a3f5760405162461bcd60e51b8152600401610ac6906121e7565b60006060866001600160a01b03168587604051611a5c9190611fa2565b60006040518083038185875af1925050503d8060008114611a99576040519150601f19603f3d011682016040523d82523d6000602084013e611a9e565b606091505b50915091508115611ab2579150611a109050565b805115611ac25780518082602001fd5b8360405162461bcd60e51b8152600401610ac6919061209d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611a10575050151592915050565b6040518060c001604052806006906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600081525090565b8035611167816122e5565b600082601f830112611bdc578081fd5b611be660a0612271565b905080828460a085011115611bfa57600080fd5b60005b6005811015611c26578135611c11816122e5565b83526020928301929190910190600101611bfd565b50505092915050565b600082601f830112611c3f578081fd5b813567ffffffffffffffff811115611c55578182fd5b611c68601f8201601f1916602001612271565b9150808252836020828501011115611c7f57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611ca9578081fd5b8135611164816122e5565b600060208284031215611cc5578081fd5b8151611164816122e5565b60008060408385031215611ce2578081fd5b8235611ced816122e5565b946020939093013593505050565b600080600080600060808688031215611d12578081fd5b8535611d1d816122e5565b94506020860135935060408601359250606086013567ffffffffffffffff80821115611d47578283fd5b81880189601f820112611d58578384fd5b8035925081831115611d68578384fd5b896020848301011115611d79578384fd5b6020810194505050809150509295509295909350565b6000806000806101a08587031215611da5578384fd5b85601f860112611db3578384fd5b6006611dc6611dc182612298565b612271565b808760c089018a811115611dd8578889fd5b885b85811015611df8578235855260209485019490920191600101611dda565b50829850611e068b82611bcc565b9750505050505061016085013567ffffffffffffffff811115611e27578283fd5b611e3387828801611c2f565b925050611e44866101808701611bc1565b905092959194509250565b600060208284031215611e60578081fd5b81518015158114611164578182fd5b600060208284031215611e80578081fd5b5051919050565b600080600080600060a08688031215611e9e578283fd5b85359450602086013593506040860135611eb7816122e5565b92506060860135611ec7816122e5565b9150608086013567ffffffffffffffff80821115611ee3578283fd5b610120918801808a03831315611ef7578384fd5b611f0083612271565b611f0a8b83611bc1565b8152611f198b60208401611bc1565b6020820152604082013560408201526060820135606082015260808201356080820152611f498b60a08401611bc1565b60a0820152611f5b8b60c08401611bc1565b60c082015260e0820135935082841115611f73578485fd5b611f7f8b858401611c2f565b60e082015261010093508382013584820152809450505050509295509295909350565b60008251611fb48184602087016122b5565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039788168152958716602087015293861660408601529185166060850152608084015260a083015290911660c082015260e00190565b6001600160a01b03998a168152978916602089015295881660408801529387166060870152608086019290925260a085015260c0840152151560e08301529091166101008201526101200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020825282518060208401526120bc8160408501602087016122b5565b601f01601f19169190910160400192915050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527315dc985c1c195c881a5cc81b9bdd081d985b1a5960621b604082015260600190565b6020808252601a908201527f46696e616c20616d6f756e742069736e277420636f7272656374000000000000604082015260600190565b60208082526026908201527f496e636f7272656e74206c656e6774207768696c65207772697474696e6720626040820152653cba32b9999960d11b606082015260800190565b6020808252818101527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561229057600080fd5b604052919050565b600067ffffffffffffffff8211156122ae578081fd5b5060200290565b60005b838110156122d05781810151838201526020016122b8565b838111156122df576000848401525b50505050565b6001600160a01b03811681146122fa57600080fd5b5056fea2646970667358221220021c34778fddbe8e002c9d07ac207b25d117ba2ecf1717c28fd89f911be5329264736f6c634300060a0033
Deployed Bytecode
0x60806040526004361061016a5760003560e01c806398ab3d49116100d1578063cfac57c71161008a578063deca5f8811610064578063deca5f8814610380578063ee872558146103a0578063f1d25396146103c0578063f851a440146103d557610171565b8063cfac57c714610341578063d0cc728914610356578063d3661fa51461036b57610171565b806398ab3d49146102b857806399532ae7146102cd578063a46a66c9146102e2578063a7304bf7146102f7578063acbeba6114610317578063c72c4d101461032c57610171565b8063380d424411610123578063380d4244146102225780633a1283221461023757806341c0e1b51461025757806350c86de51461026c5780638c8a79581461028e5780638da5cb5b146102a357610171565b8063040141e5146101765780631e48907b146101a157806329f7fc9e146101c35780632a4c0a1a146101d8578063303ffcbb146101ed578063314b63321461020d57610171565b3661017157005b600080fd5b34801561018257600080fd5b5061018b6103ea565b6040516101989190611fc1565b60405180910390f35b3480156101ad57600080fd5b506101c16101bc366004611c98565b610402565b005b3480156101cf57600080fd5b5061018b61043b565b3480156101e457600080fd5b5061018b610453565b3480156101f957600080fd5b506101c1610208366004611e87565b61046b565b34801561021957600080fd5b5061018b610868565b34801561022e57600080fd5b5061018b610880565b34801561024357600080fd5b506101c1610252366004611cd0565b610898565b34801561026357600080fd5b506101c1610937565b34801561027857600080fd5b5061028161095c565b6040516101989190612268565b34801561029a57600080fd5b5061018b610962565b3480156102af57600080fd5b5061018b61097a565b3480156102c457600080fd5b5061018b610989565b3480156102d957600080fd5b5061018b610998565b3480156102ee57600080fd5b5061018b6109b0565b34801561030357600080fd5b506101c1610312366004611c98565b6109c8565b34801561032357600080fd5b5061018b610a01565b34801561033857600080fd5b5061018b610a19565b34801561034d57600080fd5b5061018b610a28565b34801561036257600080fd5b5061018b610a40565b34801561037757600080fd5b5061018b610a58565b34801561038c57600080fd5b506101c161039b366004611c98565b610a70565b3480156103ac57600080fd5b506101c16103bb366004611cfb565b610a9d565b3480156103cc57600080fd5b5061018b610be3565b3480156103e157600080fd5b5061018b610bfb565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6001546001600160a01b0316331461041957600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b60006104eb8260400151846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e69190611cb4565b610c0a565b60408301805182900390529050600061050383610dfa565b9150506000856001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561054157600080fd5b505afa158015610555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105799190611e6f565b90506001600160a01b038616732f0b23f53734252bda2277357e97e1517d6b042a141561069557736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b03166318df6c4e47735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f1732f0b23f53734252bda2277357e97e1517d6b042a739759a6ac90977b93b58547b4a71c78317f391a28878e8d6040518963ffffffff1660e01b815260040161063d9796959493929190611fee565b6020604051808303818588803b15801561065657600080fd5b505af115801561066a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061068f9190611e6f565b5061085e565b856001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ce57600080fd5b505afa1580156106e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107069190611cb4565b6001600160a01b031663095ea7b3736d0984e80a86f26c0dd564ca0cf74a8e9da033056000196040518363ffffffff1660e01b8152600401610749929190611fd5565b600060405180830381600087803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b50505050736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b031663a7ce406e735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f189739759a6ac90977b93b58547b4a71c78317f391a2886888f018e60018e6040518a63ffffffff1660e01b815260040161080a9998979695949392919061202b565b602060405180830381600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190611e6f565b505b5050505050505050565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b6000546001600160a01b031633146108af57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038316141561091357600080546040516001600160a01b039091169183156108fc02918491818181858888f1935050505015801561090d573d6000803e3d6000fd5b50610933565b600054610933906001600160a01b0384811691168363ffffffff61105916565b5050565b6000546001600160a01b0316331461094e57600080fd5b6000546001600160a01b0316ff5b61019081565b73019739e288973f92bdd3c1d87178e206e51fd91181565b6000546001600160a01b031681565b6003546001600160a01b031681565b736d0984e80a86f26c0dd564ca0cf74a8e9da0330581565b731b14e8d511c9a4395425314f849bd737baf8208f81565b6001546001600160a01b031633146109df57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b7319c0976f590d67707e62397c87829d896dc0f1f181565b6002546001600160a01b031681565b739759a6ac90977b93b58547b4a71c78317f391a2881565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b6000546001600160a01b03163314610a8757600080fd5b6001546001600160a01b0316156109df57600080fd5b610aa730866110b4565b841115610acf5760405162461bcd60e51b8152600401610ac6906121b2565b60405180910390fd5b610ad7611b15565b610adf611b33565b60606000610aef85870187611d8f565b9350935093509350610aff611b51565b50604080516101208101825284516001600160a01b0390811682526020808701518216818401528784015183850152606080890151818501526080808a01518186015290880151831660a0808601919091529488015190921660c084015260e0830186905292870151610100830152865192870151908601519192610b8a9290918b0190858561046b565b610ba38a610b9e8b8b63ffffffff61116d16565b611192565b4715610bd75760405132904780156108fc02916000818181858888f19350505050158015610bd5573d6000803e3d6000fd5b505b50505050505050505050565b732f0b23f53734252bda2277357e97e1517d6b042a81565b6001546001600160a01b031681565b604051632cdc77ab60e21b815260009061019090731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac90610c48908690600401611fc1565b60206040518083038186803b158015610c6057600080fd5b505afa158015610c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c989190611e4f565b15610d2757604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb543190610cd4908690600401611fc1565b60206040518083038186803b158015610cec57600080fd5b505afa158015610d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d249190611e6f565b90505b8015610d3c57808481610d3657fe5b04610d3f565b60005b915060058404821115610d53576005840491505b60405163a9059cbb60e01b8152736b175474e89094c44da98b954eedeac495271d0f9063a9059cbb90610da09073322d58b9e75a6918f7e7849aee0ff09369977e08908690600401611fd5565b602060405180830381600087803b158015610dba57600080fd5b505af1158015610dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df29190611e4f565b505092915050565b604081015181516000918291829182918291906001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610eb2578651610e3c9061121c565b6001600160a01b031687526040808801518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b50505050505b61010087015115610ef157610ecf87600001518860400151611266565b610edb874760006112b8565b90945090925090508115610ef1578660c0015193505b81610f0b57610f01876000611542565b92508660a0015193505b610f1d87608001518860400151611760565b610f2a8860200151611795565b1015610f485760405162461bcd60e51b8152600401610ac690612135565b6000610f6773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611795565b111561104d576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190610fac903090600401611fc1565b602060405180830381600087803b158015610fc657600080fd5b505af1158015610fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffe9190611e6f565b6040518263ffffffff1660e01b815260040161101a9190612268565b600060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050505b50919350915050915091565b6110af8363a9059cbb60e01b8484604051602401611078929190611fd5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261183f565b505050565b60006110be6118ce565b6001600160a01b0316826001600160a01b031614156110e857506001600160a01b03821631611167565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611114908690600401611fc1565b60206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190611e6f565b90505b92915050565b6000828201838110156111645760405162461bcd60e51b8152600401610ac6906120d0565b6002546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b1580156111d757600080fd5b505afa1580156111eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120f9190611cb4565b90506110af8184846118e6565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611248578161125e565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b90505b919050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610933576109336001600160a01b0383167395e6f48254609a6ee006f7d493c8e5fb97094cef8363ffffffff61198216565b60008080808460018111156112c957fe5b14156112e8576112e38660e00151602488604001516119a1565b6112fc565b6112fc8660e00151602488606001516119a1565b60c08601516040516302f5cc7960e11b815273019739e288973f92bdd3c1d87178e206e51fd911916305eb98f2916113379190600401611fc1565b60206040518083038186803b15801561134f57600080fd5b505afa158015611363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113879190611e4f565b156113fa578560c001516001600160a01b0316858760e001516040516113ad9190611fa2565b60006040518083038185875af1925050503d80600081146113ea576040519150601f19603f3d011682016040523d82523d6000602084013e6113ef565b606091505b5050809350506113ff565b600092505b6040860151600090841561153457875161141890611795565b60208901519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611524576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190611483903090600401611fc1565b602060405180830381600087803b15801561149d57600080fd5b505af11580156114b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d59190611e6f565b6040518263ffffffff1660e01b81526004016114f19190612268565b600060405180830381600087803b15801561150b57600080fd5b505af115801561151f573d6000803e3d6000fd5b505050505b6115318860200151611795565b91505b909250905093509350939050565b60a082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa27979161157f91600401611fc1565b60206040518083038186803b15801561159757600080fd5b505afa1580156115ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cf9190611e4f565b6115eb5760405162461bcd60e51b8152600401610ac690612107565b60a083015160408401518451600092611615926001600160a01b039092169163ffffffff61105916565b600083600181111561162357fe5b14156116c3578360a001516001600160a01b031663cae270b6828660000151876020015188604001516040518563ffffffff1660e01b815260040161166a93929190612079565b6020604051808303818588803b15801561168357600080fd5b505af1158015611697573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116bc9190611e6f565b9150611759565b8360a001516001600160a01b031663153e66e6828660000151876020015188606001516040518563ffffffff1660e01b815260040161170493929190612079565b6020604051808303818588803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117569190611e6f565b91505b5092915050565b6000670de0b6b3a764000061178661177885856119cd565b6706f05b59d3b200006119f1565b8161178d57fe5b049392505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156117c3575047611261565b6040516370a0823160e01b81526001600160a01b038316906370a08231906117ef903090600401611fc1565b60206040518083038186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125e9190611e6f565b6060611894826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a019092919063ffffffff16565b8051909150156110af57808060200190518101906118b29190611e4f565b6110af5760405162461bcd60e51b8152600401610ac69061221e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b6118ee6118ce565b6001600160a01b0316826001600160a01b0316141561196857826001600160a01b03168160405161191e90611fbe565b60006040518083038185875af1925050503d806000811461195b576040519150601f19603f3d011682016040523d82523d6000602084013e611960565b606091505b5050506110af565b6110af6001600160a01b038316848363ffffffff61105916565b6110af8363095ea7b360e01b8484604051602401611078929190611fd5565b81602001835110156119c55760405162461bcd60e51b8152600401610ac69061216c565b910160200152565b60008115806119e8575050808202828282816119e557fe5b04145b61116757600080fd5b8082018281101561116757600080fd5b6060611a108484600085611a18565b949350505050565b6060611a2385611adc565b611a3f5760405162461bcd60e51b8152600401610ac6906121e7565b60006060866001600160a01b03168587604051611a5c9190611fa2565b60006040518083038185875af1925050503d8060008114611a99576040519150601f19603f3d011682016040523d82523d6000602084013e611a9e565b606091505b50915091508115611ab2579150611a109050565b805115611ac25780518082602001fd5b8360405162461bcd60e51b8152600401610ac6919061209d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611a10575050151592915050565b6040518060c001604052806006906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600081525090565b8035611167816122e5565b600082601f830112611bdc578081fd5b611be660a0612271565b905080828460a085011115611bfa57600080fd5b60005b6005811015611c26578135611c11816122e5565b83526020928301929190910190600101611bfd565b50505092915050565b600082601f830112611c3f578081fd5b813567ffffffffffffffff811115611c55578182fd5b611c68601f8201601f1916602001612271565b9150808252836020828501011115611c7f57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611ca9578081fd5b8135611164816122e5565b600060208284031215611cc5578081fd5b8151611164816122e5565b60008060408385031215611ce2578081fd5b8235611ced816122e5565b946020939093013593505050565b600080600080600060808688031215611d12578081fd5b8535611d1d816122e5565b94506020860135935060408601359250606086013567ffffffffffffffff80821115611d47578283fd5b81880189601f820112611d58578384fd5b8035925081831115611d68578384fd5b896020848301011115611d79578384fd5b6020810194505050809150509295509295909350565b6000806000806101a08587031215611da5578384fd5b85601f860112611db3578384fd5b6006611dc6611dc182612298565b612271565b808760c089018a811115611dd8578889fd5b885b85811015611df8578235855260209485019490920191600101611dda565b50829850611e068b82611bcc565b9750505050505061016085013567ffffffffffffffff811115611e27578283fd5b611e3387828801611c2f565b925050611e44866101808701611bc1565b905092959194509250565b600060208284031215611e60578081fd5b81518015158114611164578182fd5b600060208284031215611e80578081fd5b5051919050565b600080600080600060a08688031215611e9e578283fd5b85359450602086013593506040860135611eb7816122e5565b92506060860135611ec7816122e5565b9150608086013567ffffffffffffffff80821115611ee3578283fd5b610120918801808a03831315611ef7578384fd5b611f0083612271565b611f0a8b83611bc1565b8152611f198b60208401611bc1565b6020820152604082013560408201526060820135606082015260808201356080820152611f498b60a08401611bc1565b60a0820152611f5b8b60c08401611bc1565b60c082015260e0820135935082841115611f73578485fd5b611f7f8b858401611c2f565b60e082015261010093508382013584820152809450505050509295509295909350565b60008251611fb48184602087016122b5565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039788168152958716602087015293861660408601529185166060850152608084015260a083015290911660c082015260e00190565b6001600160a01b03998a168152978916602089015295881660408801529387166060870152608086019290925260a085015260c0840152151560e08301529091166101008201526101200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020825282518060208401526120bc8160408501602087016122b5565b601f01601f19169190910160400192915050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527315dc985c1c195c881a5cc81b9bdd081d985b1a5960621b604082015260600190565b6020808252601a908201527f46696e616c20616d6f756e742069736e277420636f7272656374000000000000604082015260600190565b60208082526026908201527f496e636f7272656e74206c656e6774207768696c65207772697474696e6720626040820152653cba32b9999960d11b606082015260800190565b6020808252818101527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561229057600080fd5b604052919050565b600067ffffffffffffffff8211156122ae578081fd5b5060200290565b60005b838110156122d05781810151838201526020016122b8565b838111156122df576000848401525b50505050565b6001600160a01b03811681146122fa57600080fd5b5056fea2646970667358221220021c34778fddbe8e002c9d07ac207b25d117ba2ecf1717c28fd89f911be5329264736f6c634300060a0033
Deployed Bytecode Sourcemap
44280:4241:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12606:81;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;10481:122;;;;;;;;;;-1:-1:-1;10481:122:0;;;;;;;;:::i;:::-;;12513:86;;;;;;;;;;;;;:::i;44526:80::-;;;;;;;;;;;;;:::i;46544:1337::-;;;;;;;;;;-1:-1:-1;46544:1337:0;;;;;;;;:::i;12881:92::-;;;;;;;;;;;;;:::i;45037:84::-;;;;;;;;;;;;;:::i;10776:285::-;;;;;;;;;;-1:-1:-1;10776:285:0;;;;;;;;:::i;10649:80::-;;;;;;;;;;;;;:::i;44468:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;13072:87;;;;;;;;;;;;;:::i;9588:20::-;;;;;;;;;;;;;:::i;44615:142::-;;;;;;;;;;;;;:::i;44370:89::-;;;;;;;;;;;;;:::i;12789:85::-;;;;;;;;;;;;;:::i;10260:122::-;;;;;;;;;;-1:-1:-1;10260:122:0;;;;;;;;:::i;44950:80::-;;;;;;;;;;;;;:::i;38092:54::-;;;;;;;;;;;;;:::i;44858:85::-;;;;;;;;;;;;;:::i;12982:83::-;;;;;;;;;;;;;:::i;12696:86::-;;;;;;;;;;;;;:::i;9977:161::-;;;;;;;;;;-1:-1:-1;9977:161:0;;;;;;;;:::i;45214:1322::-;;;;;;;;;;-1:-1:-1;45214:1322:0;;;;;;;;:::i;44766:85::-;;;;;;;;;;;;;:::i;9615:20::-;;;;;;;;;;;;;:::i;12606:81::-;12645:42;12606:81;:::o;10481:122::-;10562:5;;-1:-1:-1;;;;;10562:5:0;10548:10;:19;10540:28;;;;;;10581:5;:14;;-1:-1:-1;;;;;;10581:14:0;-1:-1:-1;;;;;10581:14:0;;;;;;;;;;10481:122::o;12513:86::-;12557:42;12513:86;:::o;44526:80::-;44564:42;44526:80;:::o;46544:1337::-;46752:11;46766:65;46773:13;:23;;;46814:6;-1:-1:-1;;;;;46798:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46766:6;:65::i;:::-;46871:23;;;;;:32;;;46844:60;;46752:79;-1:-1:-1;;46940:20:0;46871:13;46940:5;:20::i;:::-;46915:45;;;46973:11;46992:9;-1:-1:-1;;;;;46987:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46973:35;-1:-1:-1;;;;;;47025:29:0;;44809:42;47025:29;47021:853;;;44417:42;-1:-1:-1;;;;;47071:62:0;;47141:21;45079:42;44988;44809;44901;47316:3;47338:16;47373:6;47071:323;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47021:853;;;47432:9;-1:-1:-1;;;;;47427:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47427:29:0;;44417:42;-1:-1:-1;;47427:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44417:42;-1:-1:-1;;;;;47508:62:0;;45079:42;44988;47653:9;44901:42;47716:3;47753:10;47739:11;:24;47783:16;47818:4;47841:6;47508:354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47021:853;46544:1337;;;;;;;;:::o;12881:92::-;12931:42;12881:92;:::o;45037:84::-;45079:42;45037:84;:::o;10776:285::-;9684:5;;-1:-1:-1;;;;;9684:5:0;9693:10;9684:19;9676:28;;;;;;10876:42:::1;-1:-1:-1::0;;;;;10866:52:0;::::1;;10862:192;;;10943:5;::::0;;10935:32:::1;::::0;-1:-1:-1;;;;;10943:5:0;;::::1;::::0;10935:32;::::1;;;::::0;10959:7;;10935:32;10943:5;10935:32;10959:7;10943:5;10935:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;10862:192;;;11027:5;::::0;11000:42:::1;::::0;-1:-1:-1;;;;;11000:26:0;;::::1;::::0;11027:5:::1;11034:7:::0;11000:42:::1;:26;:42;:::i;:::-;10776:285:::0;;:::o;10649:80::-;9684:5;;-1:-1:-1;;;;;9684:5:0;9693:10;9684:19;9676:28;;;;;;10714:5:::1;::::0;-1:-1:-1;;;;;10714:5:0::1;10693:28;44468:38:::0;44503:3;44468:38;:::o;13072:87::-;13117:42;13072:87;:::o;9588:20::-;;;-1:-1:-1;;;;;9588:20:0;;:::o;44615:142::-;;;-1:-1:-1;;;;;44615:142:0;;:::o;44370:89::-;44417:42;44370:89;:::o;12789:85::-;12832:42;12789:85;:::o;10260:122::-;10341:5;;-1:-1:-1;;;;;10341:5:0;10327:10;:19;10319:28;;;;;;10360:5;:14;;-1:-1:-1;;;;;;10360:14:0;-1:-1:-1;;;;;10360:14:0;;;;;;;;;;10260:122::o;44950:80::-;44988:42;44950:80;:::o;38092:54::-;;;-1:-1:-1;;;;;38092:54:0;;:::o;44858:85::-;44901:42;44858:85;:::o;12982:83::-;13023:42;12982:83;:::o;12696:86::-;12740:42;12696:86;:::o;9977:161::-;10058:5;;-1:-1:-1;;;;;10058:5:0;10044:10;:19;10036:28;;;;;;10083:5;;-1:-1:-1;;;;;10083:5:0;:19;10075:28;;;;;45214:1322;45461:43;45488:4;45495:8;45461:18;:43::i;:::-;45450:7;:54;;45442:112;;;;-1:-1:-1;;;45442:112:0;;;;;;;;;;;;;;;;;45582:22;;:::i;:::-;45619:26;;:::i;:::-;45660:21;45696:13;45733:58;;;;45744:7;45733:58;;;45567:224;;;;;;;;45804:32;;:::i;:::-;-1:-1:-1;45839:346:0;;;;;;;;45876:11;;-1:-1:-1;;;;;45839:346:0;;;;;45876:11;45912;;;;45839:346;;;;;;45949:10;;;;45839:346;;;;;45986:10;;;;45839:346;;;;;46021:10;;;;45839:346;;;;46055:11;;;;45839:346;;;;;;;;;;46095:11;;;;45839:346;;;;;;;;;;;;;46163:10;;;;45839:346;;;;46214:10;;46226;;;;46245:11;;;;45839:346;;46198:80;;46214:10;;46226:17;;;46258:5;45839:346;46198:15;:80::i;:::-;46291:60;46323:8;46333:17;:7;46345:4;46333:17;:11;:17;:::i;:::-;46291:31;:60::i;:::-;46434:21;:25;46430:99;;46476:41;;:9;;46495:21;46476:41;;;;;;;;;46495:21;46476:9;:41;;;;;;;;;;;;;;;;;;;;;46430:99;45214:1322;;;;;;;;;;:::o;44766:85::-;44809:42;44766:85;:::o;9615:20::-;;;-1:-1:-1;;;;;9615:20:0;;:::o;47889:541::-;48019:49;;-1:-1:-1;;;48019:49:0;;47953:14;;44503:3;;12832:42;;48019:41;;:49;;48061:6;;48019:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48015:142;;;48091:54;;-1:-1:-1;;;48091:54:0;;12832:42;;48091:46;;:54;;48138:6;;48091:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48085:60;;48015:142;48182:8;;48181:32;;48209:3;48199:7;:13;;;;;;48181:32;;;48194:1;48181:32;48169:44;-1:-1:-1;48307:1:0;48297:7;:11;48284:9;:25;48280:81;;;48348:1;48338:7;:11;48326:23;;48280:81;48373:49;;-1:-1:-1;;;48373:49:0;;44564:42;;48373:27;;:49;;12740:42;;48412:9;;48373:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47889:541;;;;;:::o;16041:1454::-;16225:16;;;;16302:14;;16102:7;;;;;;;;;;16225:16;-1:-1:-1;;;;;16302:35:0;12557:42;16302:35;16298:191;;;16385:14;;16371:29;;:13;:29::i;:::-;-1:-1:-1;;;;;16354:46:0;;;16458:16;;;;;16415:62;;-1:-1:-1;;;16415:62:0;;;;12645:42;;16415:36;;16458:16;16415:62;;;;;16354:14;;16415:62;;;;;;;16458:16;12645:42;16415:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16298:191;16568:14;;;;:18;16564:304;;16603:48;16618:6;:14;;;16634:6;:16;;;16603:14;:48::i;:::-;16706:57;16716:6;16724:21;16747:15;16706:9;:57::i;:::-;16668:95;;-1:-1:-1;16668:95:0;;-1:-1:-1;16668:95:0;-1:-1:-1;16780:77:0;;;;16822:6;:19;;;16812:29;;16780:77;16938:7;16933:129;;16977:34;16987:6;16995:15;16977:9;:34::i;:::-;16962:49;;17036:6;:14;;;17026:24;;16933:129;17113:39;17118:6;:15;;;17135:6;:16;;;17113:4;:39::i;:::-;17082:27;17093:6;:15;;;17082:10;:27::i;:::-;:70;;17074:109;;;;-1:-1:-1;;;17074:109:0;;;;;;;;;17291:1;17264:24;12645:42;17264:10;:24::i;:::-;:28;17260:185;;;17365:53;;-1:-1:-1;;;17365:53:0;;12645:42;;17309:37;;12645:42;;17365:38;;:53;;17412:4;;17365:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17309:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17260:185;-1:-1:-1;17465:7:0;;-1:-1:-1;17474:12:0;-1:-1:-1;;16041:1454:0;;;:::o;7731:176::-;7813:86;7833:5;7863:23;;;7888:2;7892:5;7840:58;;;;;;;;;;;;;;-1:-1:-1;;7840:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;7840:58:0;-1:-1:-1;;;;;;7840:58:0;;;;;;;;;;7813:19;:86::i;:::-;7731:176;;;:::o;38908:262::-;38993:7;39028:26;:24;:26::i;:::-;-1:-1:-1;;;;;39016:38:0;:8;-1:-1:-1;;;;;39016:38:0;;39013:94;;;-1:-1:-1;;;;;;39080:15:0;;;39073:22;;39013:94;39126:34;;-1:-1:-1;;;39126:34:0;;-1:-1:-1;;;;;39126:25:0;;;;;:34;;39152:7;;39126:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39119:41;;38908:262;;;;;:::o;5878:181::-;5936:7;5968:5;;;5992:6;;;;5984:46;;;;-1:-1:-1;;;5984:46:0;;;;;;;;38317:220;38438:17;;:38;;;-1:-1:-1;;;38438:38:0;;;;38415:20;;-1:-1:-1;;;;;38438:17:0;;:36;;:38;;;;;;;;;;;;;;:17;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38415:61;;38489:40;38506:4;38511:8;38521:7;38489:16;:40::i;20587:142::-;20647:7;-1:-1:-1;;;;;20674:25:0;;12557:42;20674:25;:47;;20717:4;20674:47;;;12645:42;20674:47;20667:54;;20587:142;;;;:::o;13635:212::-;-1:-1:-1;;;;;13717:31:0;;12557:42;13717:31;13713:127;;13765:63;-1:-1:-1;;;;;13765:29:0;;13023:42;13820:7;13765:63;:29;:63;:::i;17685:1393::-;17822:12;;;;17942:5;:24;;;;;;;;;17938:197;;;17983:53;17996:7;:16;;;18014:2;18018:7;:17;;;17983:12;:53::i;:::-;17938:197;;;18069:54;18082:7;:16;;;18100:2;18104:7;:18;;;18069:12;:54::i;:::-;18194:20;;;;18151:64;;-1:-1:-1;;;18151:64:0;;13117:42;;18151;;:64;;18194:20;18151:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18147:221;;;18246:7;:20;;;-1:-1:-1;;;;;18246:25:0;18279:10;18291:7;:16;;;18246:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18232:76;;;;;18147:221;;;18351:5;18341:15;;18147:221;18436:17;;;;18380:20;;18466:550;;;;18595:15;;18584:27;;:10;:27::i;:::-;18678:16;;;;18571:40;;-1:-1:-1;;;;;;18678:37:0;12557:42;18678:37;18674:210;;;18796:53;;-1:-1:-1;;;18796:53:0;;12645:42;;18736:37;;12645:42;;18796:38;;:53;;18843:4;;18796:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18736:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18674:210;18976:28;18987:7;:16;;;18976:10;:28::i;:::-;18961:43;;18466:550;19045:12;;-1:-1:-1;19059:10:0;-1:-1:-1;17685:1393:0;;;;;;;:::o;19344:742::-;19523:15;;;;19466:73;;-1:-1:-1;;;19466:73:0;;19428:17;;12931:42;;19466:56;;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19458:106;;;;-1:-1:-1;;;19458:106:0;;;;;;;;;19643:15;;;;19660:17;;;;19613:15;;19577:13;;19607:71;;-1:-1:-1;;;;;19607:35:0;;;;:71;:35;:71;:::i;:::-;19704:15;19695:5;:24;;;;;;;;;19691:388;;;19771:7;:15;;;-1:-1:-1;;;;;19751:63:0;;19822:8;19832:7;:15;;;19849:7;:16;;;19867:7;:17;;;19751:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19736:149;;19691:388;;;19953:7;:15;;;-1:-1:-1;;;;;19933:62:0;;20003:8;20013:7;:15;;;20030:7;:16;;;20048:7;:18;;;19933:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19918:149;;19691:388;19344:742;;;;;:::o;646:122::-;705:9;595:6;731:23;735:9;739:1;742;735:3;:9::i;:::-;746:7;731:3;:23::i;:::-;:29;;;;;;;646:122;-1:-1:-1;;;646:122:0:o;13352:275::-;13415:12;-1:-1:-1;;;;;13444:31:0;;12557:42;13444:31;13440:180;;;-1:-1:-1;13502:21:0;13440:180;;;13566:42;;-1:-1:-1;;;13566:42:0;;-1:-1:-1;;;;;13566:27:0;;;;;:42;;13602:4;;13566:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9103:419;9185:23;9211:69;9239:4;9211:69;;;;;;;;;;;;;;;;;9219:5;-1:-1:-1;;;;;9211:27:0;;;:69;;;;;:::i;:::-;9295:17;;9185:95;;-1:-1:-1;9295:21:0;9291:224;;9437:10;9426:30;;;;;;;;;;;;;;9418:85;;;;-1:-1:-1;;;9418:85:0;;;;;;;;37826:121;37897:42;37826:121;:::o;38545:355::-;38672:26;:24;:26::i;:::-;-1:-1:-1;;;;;38660:38:0;:8;-1:-1:-1;;;;;38660:38:0;;38657:168;;;38755:12;-1:-1:-1;;;;;38755:17:0;38780:7;38755:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38807:7;;38657:168;38837:51;-1:-1:-1;;;;;38837:28:0;;38866:12;38880:7;38837:51;:28;:51;:::i;8280:184::-;8366:90;8386:5;8416:22;;;8440:7;8449:5;8393:62;;;;;;;;;;20094:397;20203:6;20212:2;20203:11;20191:2;:9;:23;20187:104;;;20231:48;;-1:-1:-1;;;20231:48:0;;;;;;;;20187:104;20450:15;;20357:2;20450:15;20443:30;20428:56::o;327:127::-;385:9;415:6;;;:30;;-1:-1:-1;;430:5:0;;;444:1;439;430:5;439:1;425:15;;;;;:20;415:30;407:39;;;;;85:113;178:5;;;173:16;;;;165:25;;;;;4102:196;4205:12;4237:53;4260:6;4268:4;4274:1;4277:12;4237:22;:53::i;:::-;4230:60;4102:196;-1:-1:-1;;;;4102:196:0:o;4864:979::-;4994:12;5027:18;5038:6;5027:10;:18::i;:::-;5019:60;;;;-1:-1:-1;;;5019:60:0;;;;;;;;;5153:12;5167:23;5194:6;-1:-1:-1;;;;;5194:11:0;5214:8;5225:4;5194:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5152:78;;;;5245:7;5241:595;;;5276:10;-1:-1:-1;5269:17:0;;-1:-1:-1;5269:17:0;5241:595;5390:17;;:21;5386:439;;5653:10;5647:17;5714:15;5701:10;5697:2;5693:19;5686:44;5601:148;5796:12;5789:20;;-1:-1:-1;;;5789:20:0;;;;;;;;;2889:619;2949:4;3417:20;;3260:66;3457:23;;;;;;:42;;-1:-1:-1;;3484:15:0;;;3449:51;-1:-1:-1;;2889:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;;612:616;;727:3;720:4;712:6;708:17;704:27;694:2;;-1:-1;;735:12;694:2;788:78;23129:17;788:78;;;779:87;;872:16;931:17;989:3;23129:17;964:3;960:27;957:36;954:2;;;1006:1;;996:12;954:2;1031:1;1016:206;769:4;1038:1;1035:13;1016:206;;;85:6;72:20;97:33;124:5;97:33;;;1109:50;;23141:4;1173:14;;;;1201;;;;;1063:1;1056:9;1016:206;;;1020:14;;;687:541;;;;;2514:440;;2615:3;2608:4;2600:6;2596:17;2592:27;2582:2;;-1:-1;;2623:12;2582:2;2670:6;2657:20;23562:18;23554:6;23551:30;23548:2;;;-1:-1;;23584:12;23548:2;2692:64;23657:9;23638:17;;-1:-1;;23634:33;23725:4;23715:15;2692:64;;;2683:73;;2776:6;2769:5;2762:21;2880:3;23725:4;2871:6;2804;2862:16;;2859:25;2856:2;;;2897:1;;2887:12;2856:2;25839:6;23725:4;2804:6;2800:17;23725:4;2838:5;2834:16;25816:30;25895:1;25877:16;;;23725:4;25877:16;25870:27;2838:5;2575:379;-1:-1;;2575:379;5082:241;;5186:2;5174:9;5165:7;5161:23;5157:32;5154:2;;;-1:-1;;5192:12;5154:2;85:6;72:20;97:33;124:5;97:33;;5330:263;;5445:2;5433:9;5424:7;5420:23;5416:32;5413:2;;;-1:-1;;5451:12;5413:2;226:6;220:13;238:33;265:5;238:33;;5886:366;;;6007:2;5995:9;5986:7;5982:23;5978:32;5975:2;;;-1:-1;;6013:12;5975:2;85:6;72:20;97:33;124:5;97:33;;;6065:63;6165:2;6204:22;;;;4871:20;;-1:-1;;;5969:283;6259:741;;;;;;6433:3;6421:9;6412:7;6408:23;6404:33;6401:2;;;-1:-1;;6440:12;6401:2;85:6;72:20;97:33;124:5;97:33;;;6492:63;-1:-1;6592:2;6631:22;;4871:20;;-1:-1;6700:2;6739:22;;4871:20;;-1:-1;6836:2;6821:18;;6808:32;6860:18;6849:30;;;6846:2;;;-1:-1;;6882:12;6846:2;6967:6;6956:9;6952:22;2283:3;2276:4;2268:6;2264:17;2260:27;2250:2;;-1:-1;;2291:12;2250:2;2334:6;2321:20;2311:30;;6860:18;2353:6;2350:30;2347:2;;;-1:-1;;2383:12;2347:2;2478:3;6592:2;2458:17;2419:6;2444:32;;2441:41;2438:2;;;-1:-1;;2485:12;2438:2;6592;2419:6;2415:17;6910:74;;;;;;;;6395:605;;;;;;;;;7007:832;;;;;7225:3;7213:9;7204:7;7200:23;7196:33;7193:2;;;-1:-1;;7232:12;7193:2;1370:3;1363:4;1355:6;1351:17;1347:27;1337:2;;-1:-1;;1378:12;1337:2;1412:4;1431:78;1446:62;1412:4;1446:62;;;1431:78;;;1515:16;1574:17;1612;1607:3;1603:27;1632:3;1603:27;1600:36;1597:2;;;-1:-1;;1639:12;1597:2;-1:-1;1659:206;1412:4;1681:1;1678:13;1659:206;;;4871:20;;1752:50;;1624:4;1816:14;;;;1844;;;;1706:1;1699:9;1659:206;;;1663:14;7284:86;;;7426:76;7494:7;7470:22;7426:76;;;7416:86;;;;;;;7567:3;7556:9;7552:19;7539:33;7592:18;7584:6;7581:30;7578:2;;;-1:-1;;7614:12;7578:2;7644:62;7698:7;7689:6;7678:9;7674:22;7644:62;;;7634:72;;;7762:61;7815:7;7743:3;7795:9;7791:22;7762:61;;;7752:71;;7187:652;;;;;;;;7846:257;;7958:2;7946:9;7937:7;7933:23;7929:32;7926:2;;;-1:-1;;7964:12;7926:2;1960:6;1954:13;26638:5;24599:13;24592:21;26616:5;26613:32;26603:2;;-1:-1;;26649:12;8110:263;;8225:2;8213:9;8204:7;8200:23;8196:32;8193:2;;;-1:-1;;8231:12;8193:2;-1:-1;2092:13;;8187:186;-1:-1;8187:186;8944:889;;;;;;9146:3;9134:9;9125:7;9121:23;9117:33;9114:2;;;-1:-1;;9153:12;9114:2;4884:6;4871:20;9205:63;;9305:2;9348:9;9344:22;4871:20;9313:63;;9413:2;9456:9;9452:22;72:20;97:33;124:5;97:33;;;9421:63;-1:-1;9521:2;9560:22;;72:20;97:33;72:20;97:33;;;9529:63;-1:-1;9657:3;9642:19;;9629:33;9682:18;9671:30;;;9668:2;;;-1:-1;;9704:12;9668:2;3290:6;;9785:22;;3269:19;;;3265:32;-1:-1;3262:2;;;-1:-1;;3300:12;3262:2;3328:22;3290:6;3328:22;;;3435:49;3480:3;3456:22;3435:49;;;3417:16;3410:75;3583:49;3628:3;9305:2;3608:9;3604:22;3583:49;;;9305:2;3569:5;3565:16;3558:75;9413:2;3757:9;3753:22;4871:20;9413:2;3718:5;3714:16;3707:75;9521:2;3907:9;3903:22;4871:20;9521:2;3868:5;3864:16;3857:75;9657:3;4056:9;4052:22;4871:20;9657:3;4017:5;4013:16;4006:75;4179:49;4224:3;9146;4204:9;4200:22;4179:49;;;9146:3;4165:5;4161:16;4154:75;4332:49;4377:3;4298;4357:9;4353:22;4332:49;;;4298:3;4318:5;4314:16;4307:75;4475:3;4464:9;4460:19;4447:33;4433:47;;9682:18;4492:6;4489:30;4486:2;;;-1:-1;;4522:12;4486:2;4567:58;4621:3;4612:6;4601:9;4597:22;4567:58;;;4475:3;4553:5;4549:16;4542:84;4690:3;;;;4751:9;4747:22;4871:20;4690:3;4710:5;4706:18;4699:77;9724:93;;;;;;;9108:725;;;;;;;;;14286:271;;10644:5;23834:12;10755:52;10800:6;10795:3;10788:4;10781:5;10777:16;10755:52;;;10819:16;;;;;14420:137;-1:-1;;14420:137;14564:379;14928:10;14752:191;14950:222;-1:-1;;;;;24876:54;;;;10076:45;;15077:2;15062:18;;15048:124;15685:349;-1:-1;;;;;24876:54;;;;9919:58;;16020:2;16005:18;;10435:37;15848:2;15833:18;;15819:215;16041:892;-1:-1;;;;;24876:54;;;10076:45;;24876:54;;;16501:2;16486:18;;10076:45;24876:54;;;16584:2;16569:18;;10076:45;24876:54;;;16667:2;16652:18;;10076:45;16750:3;16735:19;;10435:37;24887:42;16819:19;;10435:37;24876:54;;;16918:3;16903:19;;10076:45;16336:3;16321:19;;16307:626;16940:1104;-1:-1;;;;;24876:54;;;10076:45;;24876:54;;;17450:2;17435:18;;10076:45;24876:54;;;17533:2;17518:18;;10076:45;24876:54;;;17616:2;17601:18;;10076:45;17699:3;17684:19;;10435:37;;;;24887:42;17768:19;;10435:37;17867:3;17852:19;;10435:37;24599:13;24592:21;17945:3;17930:19;;10318:34;24876:54;;;18029:3;18014:19;;10076:45;17285:3;17270:19;;17256:788;18051:444;-1:-1;;;;;24876:54;;;10076:45;;24876:54;;;;18398:2;18383:18;;10076:45;18481:2;18466:18;;10435:37;;;;18234:2;18219:18;;18205:290;19147:310;;19294:2;19315:17;19308:47;11201:5;23834:12;24273:6;19294:2;19283:9;19279:18;24261:19;11295:52;11340:6;24301:14;19283:9;24301:14;19294:2;11321:5;11317:16;11295:52;;;23657:9;26256:14;-1:-1;;26252:28;11359:39;;;;24301:14;11359:39;;19265:192;-1:-1;;19265:192;19464:416;19664:2;19678:47;;;11635:2;19649:18;;;24261:19;11671:29;24301:14;;;11651:50;11720:12;;;19635:245;19887:416;20087:2;20101:47;;;11971:2;20072:18;;;24261:19;-1:-1;;;24301:14;;;11987:43;12049:12;;;20058:245;20310:416;20510:2;20524:47;;;12300:2;20495:18;;;24261:19;12336:28;24301:14;;;12316:49;12384:12;;;20481:245;20733:416;20933:2;20947:47;;;12635:2;20918:18;;;24261:19;12671:34;24301:14;;;12651:55;-1:-1;;;12726:12;;;12719:30;12768:12;;;20904:245;21156:416;21356:2;21370:47;;;21341:18;;;24261:19;13055:34;24301:14;;;13035:55;13109:12;;;21327:245;21579:416;21779:2;21793:47;;;13665:2;21764:18;;;24261:19;13701:31;24301:14;;;13681:52;13752:12;;;21750:245;22002:416;22202:2;22216:47;;;14003:2;22187:18;;;24261:19;14039:34;24301:14;;;14019:55;-1:-1;;;14094:12;;;14087:34;14140:12;;;22173:245;22425:222;10435:37;;;22552:2;22537:18;;22523:124;22654:256;22716:2;22710:9;22742:17;;;22817:18;22802:34;;22838:22;;;22799:62;22796:2;;;22874:1;;22864:12;22796:2;22716;22883:22;22694:216;;-1:-1;22694:216;22917:244;;23074:18;23066:6;23063:30;23060:2;;;-1:-1;;23096:12;23060:2;-1:-1;23141:4;23129:17;;22997:164;25912:268;25977:1;25984:101;25998:6;25995:1;25992:13;25984:101;;;26065:11;;;26059:18;26046:11;;;26039:39;26020:2;26013:10;25984:101;;;26100:6;26097:1;26094:13;26091:2;;;25977:1;26156:6;26151:3;26147:16;26140:27;26091:2;;25961:219;;;;26293:117;-1:-1;;;;;24876:54;;26352:35;;26342:2;;26401:1;;26391:12;26342:2;26336:74;
Swarm Source
ipfs://021c34778fddbe8e002c9d07ac207b25d117ba2ecf1717c28fd89f911be53292
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.