Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LosslessControllerV2
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-15 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.0; abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } interface ProtectionStrategy { function isTransferAllowed(address token, address sender, address recipient, uint256 amount) external; } contract LosslessControllerV2 is Initializable, ContextUpgradeable, PausableUpgradeable { address public pauseAdmin; address public admin; address public recoveryAdmin; // --- V2 VARIABLES --- address public guardian; mapping(address => Protections) private tokenProtections; struct Protection { bool isProtected; ProtectionStrategy strategy; } struct Protections { mapping(address => Protection) protections; } // --- EVENTS --- event AdminChanged(address indexed previousAdmin, address indexed newAdmin); event RecoveryAdminChanged(address indexed previousAdmin, address indexed newAdmin); event PauseAdminChanged(address indexed previousAdmin, address indexed newAdmin); // --- V2 EVENTS --- event GuardianSet(address indexed oldGuardian, address indexed newGuardian); event ProtectedAddressSet(address indexed token, address indexed protectedAddress, address indexed strategy); event RemovedProtectedAddress(address indexed token, address indexed protectedAddress); // --- MODIFIERS --- modifier onlyLosslessRecoveryAdmin() { require(msg.sender == recoveryAdmin, "LOSSLESS: Must be recoveryAdmin"); _; } modifier onlyLosslessAdmin() { require(admin == msg.sender, "LOSSLESS: Must be admin"); _; } modifier onlyPauseAdmin() { require(msg.sender == pauseAdmin, "LOSSLESS: Must be pauseAdmin"); _; } // --- V2 MODIFIERS --- modifier onlyGuardian() { require(msg.sender == guardian, "LOSSLESS: Must be Guardian"); _; } // --- VIEWS --- function getVersion() external pure returns (uint256) { return 2; } // --- V2 VIEWS --- function isAddressProtected(address token, address protectedAddress) external view returns (bool) { return tokenProtections[token].protections[protectedAddress].isProtected; } function getProtectedAddressStrategy(address token, address protectedAddress) external view returns (address) { return address(tokenProtections[token].protections[protectedAddress].strategy); } // --- ADMINISTRATION --- function pause() external onlyPauseAdmin { _pause(); } function unpause() external onlyPauseAdmin { _unpause(); } function setAdmin(address newAdmin) external onlyLosslessRecoveryAdmin { require(newAdmin != address(0), "LERC20: Cannot be zero address"); emit AdminChanged(admin, newAdmin); admin = newAdmin; } function setRecoveryAdmin(address newRecoveryAdmin) external onlyLosslessRecoveryAdmin { require(newRecoveryAdmin != address(0), "LERC20: Cannot be zero address"); emit RecoveryAdminChanged(recoveryAdmin, newRecoveryAdmin); recoveryAdmin = newRecoveryAdmin; } function setPauseAdmin(address newPauseAdmin) external onlyLosslessRecoveryAdmin { require(newPauseAdmin != address(0), "LERC20: Cannot be zero address"); emit PauseAdminChanged(pauseAdmin, newPauseAdmin); pauseAdmin = newPauseAdmin; } // --- GUARD --- // @notice Set a guardian contract. // @dev Guardian contract must be trusted as it has some access rights and can modify controller's state. function setGuardian(address newGuardian) external onlyLosslessAdmin whenNotPaused { require(newGuardian != address(0), "LSS: Cannot be zero address"); emit GuardianSet(guardian, newGuardian); guardian = newGuardian; } // @notice Sets protection for an address with the choosen strategy. // @dev Strategies are verified in the guardian contract. // @dev This call is initiated from a strategy, but guardian proxies it. function setProtectedAddress(address token, address protectedAddresss, ProtectionStrategy strategy) external onlyGuardian whenNotPaused { Protection storage protection = tokenProtections[token].protections[protectedAddresss]; protection.isProtected = true; protection.strategy = strategy; emit ProtectedAddressSet(token, protectedAddresss, address(strategy)); } // @notice Remove the protection from the address. // @dev Strategies are verified in the guardian contract. // @dev This call is initiated from a strategy, but guardian proxies it. function removeProtectedAddress(address token, address protectedAddresss) external onlyGuardian whenNotPaused { delete tokenProtections[token].protections[protectedAddresss]; emit RemovedProtectedAddress(token, protectedAddresss); } // --- BEFORE HOOKS --- // @notice If address is protected, transfer validation rules have to be run inside the strategy. // @dev isTransferAllowed reverts in case transfer can not be done by the defined rules. function beforeTransfer(address sender, address recipient, uint256 amount) external { if (tokenProtections[msg.sender].protections[sender].isProtected) { tokenProtections[msg.sender].protections[sender].strategy.isTransferAllowed(msg.sender, sender, recipient, amount); } } // @notice If address is protected, transfer validation rules have to be run inside the strategy. // @dev isTransferAllowed reverts in case transfer can not be done by the defined rules. function beforeTransferFrom(address msgSender, address sender, address recipient, uint256 amount) external { if (tokenProtections[msg.sender].protections[sender].isProtected) { tokenProtections[msg.sender].protections[sender].strategy.isTransferAllowed(msg.sender, sender, recipient, amount); } } function beforeApprove(address sender, address spender, uint256 amount) external {} function beforeIncreaseAllowance(address msgSender, address spender, uint256 addedValue) external {} function beforeDecreaseAllowance(address msgSender, address spender, uint256 subtractedValue) external {} // --- AFTER HOOKS --- // * After hooks are deprecated in LERC20 but we have to keep them // here in order to support legacy LERC20. function afterApprove(address sender, address spender, uint256 amount) external {} function afterTransfer(address sender, address recipient, uint256 amount) external {} function afterTransferFrom(address msgSender, address sender, address recipient, uint256 amount) external {} function afterIncreaseAllowance(address sender, address spender, uint256 addedValue) external {} function afterDecreaseAllowance(address sender, address spender, uint256 subtractedValue) external {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGuardian","type":"address"},{"indexed":true,"internalType":"address","name":"newGuardian","type":"address"}],"name":"GuardianSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"PauseAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"protectedAddress","type":"address"},{"indexed":true,"internalType":"address","name":"strategy","type":"address"}],"name":"ProtectedAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"RecoveryAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"protectedAddress","type":"address"}],"name":"RemovedProtectedAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"afterApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"afterDecreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"afterIncreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"afterTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"afterTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"beforeApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"beforeDecreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"beforeIncreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"beforeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"beforeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddress","type":"address"}],"name":"getProtectedAddressStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddress","type":"address"}],"name":"isAddressProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoveryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddresss","type":"address"}],"name":"removeProtectedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGuardian","type":"address"}],"name":"setGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPauseAdmin","type":"address"}],"name":"setPauseAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddresss","type":"address"},{"internalType":"contract ProtectionStrategy","name":"strategy","type":"address"}],"name":"setProtectedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecoveryAdmin","type":"address"}],"name":"setRecoveryAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50610dfa806100206000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806361c1ce06116100de578063af1bf34711610097578063cf5961bb11610071578063cf5961bb146101db578063ded1f4d0146101db578063f49062ca146101db578063f851a440146102e15761018e565b8063af1bf347146102a8578063b75bb0d6146102bb578063c5a07b92146102ce5761018e565b806361c1ce0614610254578063704b6c02146102675780638456cb591461027a5780638a0dac4a14610282578063900f66ef146101db578063a56e8adf146102955761018e565b80633f4ba83a1161014b578063568c75a911610125578063568c75a9146101db5780635937f650146102245780635c975abb146102375780635f6529a31461024c5761018e565b80633f4ba83a14610214578063452a93201461021c57806347abf3be146101db5761018e565b80630d8e6e2c146101935780631ffb811f146101b15780632f11d653146101c657806334d01aa8146101db578063379f5c69146101ee5780633835b4d514610201575b600080fd5b61019b6102e9565b6040516101a89190610da3565b60405180910390f35b6101c46101bf366004610b78565b6102ee565b005b6101ce6103a5565b6040516101a89190610bb8565b6101c46101e9366004610b78565b6103a0565b6101c46101fc366004610ade565b6103b4565b6101c461020f366004610b2e565b61046c565b6101c461053d565b6101ce610571565b6101c4610232366004610a83565b610580565b61023f61062c565b6040516101a89190610bf6565b6101ce610635565b6101c4610262366004610aa6565b610644565b6101c4610275366004610a83565b6106f3565b6101c461079f565b6101c4610290366004610a83565b6107d1565b6101c46102a3366004610ade565b610466565b6101c46102b6366004610a83565b6108a2565b6101ce6102c9366004610aa6565b61094e565b61023f6102dc366004610aa6565b61097d565b6101ce6109ab565b600290565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff16156103a0573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab3039161036d9190879087908790600401610bcc565b600060405180830381600087803b15801561038757600080fd5b505af115801561039b573d6000803e3d6000fd5b505050505b505050565b6065546001600160a01b031681565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff1615610466573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab303916104339190879087908790600401610bcc565b600060405180830381600087803b15801561044d57600080fd5b505af1158015610461573d6000803e3d6000fd5b505050505b50505050565b6068546001600160a01b0316331461049f5760405162461bcd60e51b815260040161049690610cc7565b60405180910390fd5b6104a761062c565b156104c45760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b03838116600081815260696020908152604080832087861680855292528083208054600160ff1990911617610100600160a81b031916610100968816968702178155905190949391927f2fb7c91e605d5a69479e668b07c4c8edcdcb4ac3111a53c018a2eaf25cd088d891a450505050565b6065546001600160a01b031633146105675760405162461bcd60e51b815260040161049690610d6c565b61056f6109ba565b565b6068546001600160a01b031681565b6067546001600160a01b031633146105aa5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166105d05760405162461bcd60e51b815260040161049690610c59565b6067546040516001600160a01b038084169216907f1c7f382531621f02aefb4212478bba8871ffad078202bdbba87f3e21d639aebb90600090a3606780546001600160a01b0319166001600160a01b0392909216919091179055565b60335460ff1690565b6067546001600160a01b031681565b6068546001600160a01b0316331461066e5760405162461bcd60e51b815260040161049690610cc7565b61067661062c565b156106935760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0380831660008181526069602090815260408083209486168084529490915280822080546001600160a81b0319169055517fa2971d1046995b3a7aa03439118589e13f8f1f3d35889ad7420b0966c5bc97819190a35050565b6067546001600160a01b0316331461071d5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166107435760405162461bcd60e51b815260040161049690610c59565b6066546040516001600160a01b038084169216907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f90600090a3606680546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031633146107c95760405162461bcd60e51b815260040161049690610d6c565b61056f610a28565b6066546001600160a01b031633146107fb5760405162461bcd60e51b815260040161049690610d35565b61080361062c565b156108205760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0381166108465760405162461bcd60e51b815260040161049690610c90565b6068546040516001600160a01b038084169216907fc3ce29e3ab42e524b6f6f1b4d3674898d503ee3577a64ac87b555904ebc1413890600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b6067546001600160a01b031633146108cc5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166108f25760405162461bcd60e51b815260040161049690610c59565b6065546040516001600160a01b038084169216907f3e3c23bddf712ae8e73d99dd08fb2e57109143a29c9258dda76a897076e596f590600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0391821660009081526069602090815260408083209385168352929052205461010090041690565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b6066546001600160a01b031681565b6109c261062c565b6109de5760405162461bcd60e51b815260040161049690610c01565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610a11610a7f565b604051610a1e9190610bb8565b60405180910390a1565b610a3061062c565b15610a4d5760405162461bcd60e51b815260040161049690610c2f565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a115b3390565b600060208284031215610a94578081fd5b8135610a9f81610dac565b9392505050565b60008060408385031215610ab8578081fd5b8235610ac381610dac565b91506020830135610ad381610dac565b809150509250929050565b60008060008060808587031215610af3578182fd5b8435610afe81610dac565b93506020850135610b0e81610dac565b92506040850135610b1e81610dac565b9396929550929360600135925050565b600080600060608486031215610b42578283fd5b8335610b4d81610dac565b92506020840135610b5d81610dac565b91506040840135610b6d81610dac565b809150509250925092565b600080600060608486031215610b8c578283fd5b8335610b9781610dac565b92506020840135610ba781610dac565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b901515815260200190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601e908201527f4c45524332303a2043616e6e6f74206265207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f4c53533a2043616e6e6f74206265207a65726f20616464726573730000000000604082015260600190565b6020808252601a908201527f4c4f53534c4553533a204d75737420626520477561726469616e000000000000604082015260600190565b6020808252601f908201527f4c4f53534c4553533a204d757374206265207265636f7665727941646d696e00604082015260600190565b60208082526017908201527f4c4f53534c4553533a204d7573742062652061646d696e000000000000000000604082015260600190565b6020808252601c908201527f4c4f53534c4553533a204d75737420626520706175736541646d696e00000000604082015260600190565b90815260200190565b6001600160a01b0381168114610dc157600080fd5b5056fea2646970667358221220b4d4e6342db60e940f855b162f5ddbff6f9ab71866bdbf31fe5443df9fc4b74d64736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806361c1ce06116100de578063af1bf34711610097578063cf5961bb11610071578063cf5961bb146101db578063ded1f4d0146101db578063f49062ca146101db578063f851a440146102e15761018e565b8063af1bf347146102a8578063b75bb0d6146102bb578063c5a07b92146102ce5761018e565b806361c1ce0614610254578063704b6c02146102675780638456cb591461027a5780638a0dac4a14610282578063900f66ef146101db578063a56e8adf146102955761018e565b80633f4ba83a1161014b578063568c75a911610125578063568c75a9146101db5780635937f650146102245780635c975abb146102375780635f6529a31461024c5761018e565b80633f4ba83a14610214578063452a93201461021c57806347abf3be146101db5761018e565b80630d8e6e2c146101935780631ffb811f146101b15780632f11d653146101c657806334d01aa8146101db578063379f5c69146101ee5780633835b4d514610201575b600080fd5b61019b6102e9565b6040516101a89190610da3565b60405180910390f35b6101c46101bf366004610b78565b6102ee565b005b6101ce6103a5565b6040516101a89190610bb8565b6101c46101e9366004610b78565b6103a0565b6101c46101fc366004610ade565b6103b4565b6101c461020f366004610b2e565b61046c565b6101c461053d565b6101ce610571565b6101c4610232366004610a83565b610580565b61023f61062c565b6040516101a89190610bf6565b6101ce610635565b6101c4610262366004610aa6565b610644565b6101c4610275366004610a83565b6106f3565b6101c461079f565b6101c4610290366004610a83565b6107d1565b6101c46102a3366004610ade565b610466565b6101c46102b6366004610a83565b6108a2565b6101ce6102c9366004610aa6565b61094e565b61023f6102dc366004610aa6565b61097d565b6101ce6109ab565b600290565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff16156103a0573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab3039161036d9190879087908790600401610bcc565b600060405180830381600087803b15801561038757600080fd5b505af115801561039b573d6000803e3d6000fd5b505050505b505050565b6065546001600160a01b031681565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff1615610466573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab303916104339190879087908790600401610bcc565b600060405180830381600087803b15801561044d57600080fd5b505af1158015610461573d6000803e3d6000fd5b505050505b50505050565b6068546001600160a01b0316331461049f5760405162461bcd60e51b815260040161049690610cc7565b60405180910390fd5b6104a761062c565b156104c45760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b03838116600081815260696020908152604080832087861680855292528083208054600160ff1990911617610100600160a81b031916610100968816968702178155905190949391927f2fb7c91e605d5a69479e668b07c4c8edcdcb4ac3111a53c018a2eaf25cd088d891a450505050565b6065546001600160a01b031633146105675760405162461bcd60e51b815260040161049690610d6c565b61056f6109ba565b565b6068546001600160a01b031681565b6067546001600160a01b031633146105aa5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166105d05760405162461bcd60e51b815260040161049690610c59565b6067546040516001600160a01b038084169216907f1c7f382531621f02aefb4212478bba8871ffad078202bdbba87f3e21d639aebb90600090a3606780546001600160a01b0319166001600160a01b0392909216919091179055565b60335460ff1690565b6067546001600160a01b031681565b6068546001600160a01b0316331461066e5760405162461bcd60e51b815260040161049690610cc7565b61067661062c565b156106935760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0380831660008181526069602090815260408083209486168084529490915280822080546001600160a81b0319169055517fa2971d1046995b3a7aa03439118589e13f8f1f3d35889ad7420b0966c5bc97819190a35050565b6067546001600160a01b0316331461071d5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166107435760405162461bcd60e51b815260040161049690610c59565b6066546040516001600160a01b038084169216907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f90600090a3606680546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031633146107c95760405162461bcd60e51b815260040161049690610d6c565b61056f610a28565b6066546001600160a01b031633146107fb5760405162461bcd60e51b815260040161049690610d35565b61080361062c565b156108205760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0381166108465760405162461bcd60e51b815260040161049690610c90565b6068546040516001600160a01b038084169216907fc3ce29e3ab42e524b6f6f1b4d3674898d503ee3577a64ac87b555904ebc1413890600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b6067546001600160a01b031633146108cc5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166108f25760405162461bcd60e51b815260040161049690610c59565b6065546040516001600160a01b038084169216907f3e3c23bddf712ae8e73d99dd08fb2e57109143a29c9258dda76a897076e596f590600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0391821660009081526069602090815260408083209385168352929052205461010090041690565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b6066546001600160a01b031681565b6109c261062c565b6109de5760405162461bcd60e51b815260040161049690610c01565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610a11610a7f565b604051610a1e9190610bb8565b60405180910390a1565b610a3061062c565b15610a4d5760405162461bcd60e51b815260040161049690610c2f565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a115b3390565b600060208284031215610a94578081fd5b8135610a9f81610dac565b9392505050565b60008060408385031215610ab8578081fd5b8235610ac381610dac565b91506020830135610ad381610dac565b809150509250929050565b60008060008060808587031215610af3578182fd5b8435610afe81610dac565b93506020850135610b0e81610dac565b92506040850135610b1e81610dac565b9396929550929360600135925050565b600080600060608486031215610b42578283fd5b8335610b4d81610dac565b92506020840135610b5d81610dac565b91506040840135610b6d81610dac565b809150509250925092565b600080600060608486031215610b8c578283fd5b8335610b9781610dac565b92506020840135610ba781610dac565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b901515815260200190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601e908201527f4c45524332303a2043616e6e6f74206265207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f4c53533a2043616e6e6f74206265207a65726f20616464726573730000000000604082015260600190565b6020808252601a908201527f4c4f53534c4553533a204d75737420626520477561726469616e000000000000604082015260600190565b6020808252601f908201527f4c4f53534c4553533a204d757374206265207265636f7665727941646d696e00604082015260600190565b60208082526017908201527f4c4f53534c4553533a204d7573742062652061646d696e000000000000000000604082015260600190565b6020808252601c908201527f4c4f53534c4553533a204d75737420626520706175736541646d696e00000000604082015260600190565b90815260200190565b6001600160a01b0381168114610dc157600080fd5b5056fea2646970667358221220b4d4e6342db60e940f855b162f5ddbff6f9ab71866bdbf31fe5443df9fc4b74d64736f6c63430008000033
Deployed Bytecode Sourcemap
3438:6826:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5157:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8439:309;;;;;;:::i;:::-;;:::i;:::-;;3533:25;;;:::i;:::-;;;;;;;:::i;10056:96::-;;;;;;:::i;:::-;;:::i;8953:332::-;;;;;;:::i;:::-;;:::i;7341:402::-;;;;;;:::i;:::-;;:::i;5803:72::-;;;:::i;3660:23::-;;;:::i;6118:291::-;;;;;;:::i;:::-;;:::i;2075:86::-;;;:::i;:::-;;;;;;;:::i;3592:28::-;;;:::i;7948:255::-;;;;;;:::i;:::-;;:::i;5883:227::-;;;;;;:::i;:::-;;:::i;5718:69::-;;;:::i;6868:250::-;;;;;;:::i;:::-;;:::i;9940:108::-;;;;;;:::i;:::-;;:::i;6417:267::-;;;;;;:::i;:::-;;:::i;5470:207::-;;;;;;:::i;:::-;;:::i;5273:189::-;;;;;;:::i;:::-;;:::i;3565:20::-;;;:::i;5157:81::-;5229:1;5157:81;:::o;8439:309::-;8555:10;8538:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;8538:48:0;;;;;;;;;:60;;;8534:207;;;8632:10;8615:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;8615:48:0;;;;;;;;;;;:57;:114;;-1:-1:-1;;;8615:114:0;;:57;;;;;;:75;;:114;;8632:10;8656:6;;8711:9;;8722:6;;8615:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8534:207;8439:309;;;:::o;3533:25::-;;;-1:-1:-1;;;;;3533:25:0;;:::o;8953:332::-;9092:10;9075:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;9075:48:0;;;;;;;;;:60;;;9071:207;;;9169:10;9152:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;9152:48:0;;;;;;;;;;;:57;:114;;-1:-1:-1;;;9152:114:0;;:57;;;;;;:75;;:114;;9169:10;9193:6;;9248:9;;9259:6;;9152:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9071:207;8953:332;;;;:::o;7341:402::-;5066:8;;-1:-1:-1;;;;;5066:8:0;5052:10;:22;5044:61;;;;-1:-1:-1;;;5044:61:0;;;;;;;:::i;:::-;;;;;;;;;2401:8:::1;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1::0;;;2392:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7520:23:0;;::::2;7488:29;7520:23:::0;;;:16:::2;:23;::::0;;;;;;;:54;;::::2;::::0;;;;;;;;7585:29;;7610:4:::2;-1:-1:-1::0;;7585:29:0;;::::2;;-1:-1:-1::0;;;;;;7625:30:0::2;7585:29;7625:30:::0;;::::2;::::0;;::::2;;::::0;;7671:64;;7520:54;;7625:30;7520:54;;7671:64:::2;::::0;::::2;2441:1;7341:402:::0;;;:::o;5803:72::-;4907:10;;-1:-1:-1;;;;;4907:10:0;4893;:24;4885:65;;;;-1:-1:-1;;;4885:65:0;;;;;;;:::i;:::-;5857:10:::1;:8;:10::i;:::-;5803:72::o:0;3660:23::-;;;-1:-1:-1;;;;;3660:23:0;;:::o;6118:291::-;4648:13;;-1:-1:-1;;;;;4648:13:0;4634:10;:27;4626:71;;;;-1:-1:-1;;;4626:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6224:30:0;::::1;6216:73;;;;-1:-1:-1::0;;;6216:73:0::1;;;;;;;:::i;:::-;6326:13;::::0;6305:53:::1;::::0;-1:-1:-1;;;;;6305:53:0;;::::1;::::0;6326:13:::1;::::0;6305:53:::1;::::0;6326:13:::1;::::0;6305:53:::1;6369:13;:32:::0;;-1:-1:-1;;;;;;6369:32:0::1;-1:-1:-1::0;;;;;6369:32:0;;;::::1;::::0;;;::::1;::::0;;6118:291::o;2075:86::-;2146:7;;;;2075:86;:::o;3592:28::-;;;-1:-1:-1;;;;;3592:28:0;;:::o;7948:255::-;5066:8;;-1:-1:-1;;;;;5066:8:0;5052:10;:22;5044:61;;;;-1:-1:-1;;;5044:61:0;;;;;;;:::i;:::-;2401:8:::1;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1::0;;;2392:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8076:23:0;;::::2;;::::0;;;:16:::2;:23;::::0;;;;;;;:54;;::::2;::::0;;;;;;;;;;8069:61;;-1:-1:-1;;;;;;8069:61:0;;;8146:49;::::2;::::0;8076:23;8146:49:::2;7948:255:::0;;:::o;5883:227::-;4648:13;;-1:-1:-1;;;;;4648:13:0;4634:10;:27;4626:71;;;;-1:-1:-1;;;4626:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5973:22:0;::::1;5965:65;;;;-1:-1:-1::0;;;5965:65:0::1;;;;;;;:::i;:::-;6059:5;::::0;6046:29:::1;::::0;-1:-1:-1;;;;;6046:29:0;;::::1;::::0;6059:5:::1;::::0;6046:29:::1;::::0;6059:5:::1;::::0;6046:29:::1;6086:5;:16:::0;;-1:-1:-1;;;;;;6086:16:0::1;-1:-1:-1::0;;;;;6086:16:0;;;::::1;::::0;;;::::1;::::0;;5883:227::o;5718:69::-;4907:10;;-1:-1:-1;;;;;4907:10:0;4893;:24;4885:65;;;;-1:-1:-1;;;4885:65:0;;;;;;;:::i;:::-;5771:8:::1;:6;:8::i;6868:250::-:0;4773:5;;-1:-1:-1;;;;;4773:5:0;4782:10;4773:19;4765:55;;;;-1:-1:-1;;;4765:55:0;;;;;;;:::i;:::-;2401:8:::1;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1::0;;;2392:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6970:25:0;::::2;6962:65;;;;-1:-1:-1::0;;;6962:65:0::2;;;;;;;:::i;:::-;7055:8;::::0;7043:34:::2;::::0;-1:-1:-1;;;;;7043:34:0;;::::2;::::0;7055:8:::2;::::0;7043:34:::2;::::0;7055:8:::2;::::0;7043:34:::2;7088:8;:22:::0;;-1:-1:-1;;;;;;7088:22:0::2;-1:-1:-1::0;;;;;7088:22:0;;;::::2;::::0;;;::::2;::::0;;6868:250::o;6417:267::-;4648:13;;-1:-1:-1;;;;;4648:13:0;4634:10;:27;4626:71;;;;-1:-1:-1;;;4626:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6517:27:0;::::1;6509:70;;;;-1:-1:-1::0;;;6509:70:0::1;;;;;;;:::i;:::-;6613:10;::::0;6595:44:::1;::::0;-1:-1:-1;;;;;6595:44:0;;::::1;::::0;6613:10:::1;::::0;6595:44:::1;::::0;6613:10:::1;::::0;6595:44:::1;6650:10;:26:::0;;-1:-1:-1;;;;;;6650:26:0::1;-1:-1:-1::0;;;;;6650:26:0;;;::::1;::::0;;;::::1;::::0;;6417:267::o;5470:207::-;-1:-1:-1;;;;;5606:23:0;;;5571:7;5606:23;;;:16;:23;;;;;;;;:53;;;;;;;;;:62;;;;;;5470:207::o;5273:189::-;-1:-1:-1;;;;;5389:23:0;;;5365:4;5389:23;;;:16;:23;;;;;;;;:53;;;;;;;;;;;:65;;;;5273:189::o;3565:20::-;;;-1:-1:-1;;;;;3565:20:0;;:::o;3134:120::-;2678:8;:6;:8::i;:::-;2670:41;;;;-1:-1:-1;;;2670:41:0;;;;;;;:::i;:::-;3193:7:::1;:15:::0;;-1:-1:-1;;3193:15:0::1;::::0;;3224:22:::1;3233:12;:10;:12::i;:::-;3224:22;;;;;;:::i;:::-;;;;;;;;3134:120::o:0;2875:118::-;2401:8;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1;;;2392:38:0;;;;;;;:::i;:::-;2935:7:::1;:14:::0;;-1:-1:-1;;2935:14:0::1;2945:4;2935:14;::::0;;2965:20:::1;2972:12;1075:98:::0;1155:10;1075:98;:::o;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;:::-;262:5;84:189;-1:-1:-1;;;84:189:1:o;278:402::-;;;407:2;395:9;386:7;382:23;378:32;375:2;;;428:6;420;413:22;375:2;472:9;459:23;491:33;518:5;491:33;:::i;:::-;543:5;-1:-1:-1;600:2:1;585:18;;572:32;613:35;572:32;613:35;:::i;:::-;667:7;657:17;;;365:315;;;;;:::o;685:614::-;;;;;848:3;836:9;827:7;823:23;819:33;816:2;;;870:6;862;855:22;816:2;914:9;901:23;933:33;960:5;933:33;:::i;:::-;985:5;-1:-1:-1;1042:2:1;1027:18;;1014:32;1055:35;1014:32;1055:35;:::i;:::-;1109:7;-1:-1:-1;1168:2:1;1153:18;;1140:32;1181:35;1140:32;1181:35;:::i;:::-;806:493;;;;-1:-1:-1;1235:7:1;;1289:2;1274:18;1261:32;;-1:-1:-1;;806:493:1:o;1304:571::-;;;;1476:2;1464:9;1455:7;1451:23;1447:32;1444:2;;;1497:6;1489;1482:22;1444:2;1541:9;1528:23;1560:33;1587:5;1560:33;:::i;:::-;1612:5;-1:-1:-1;1669:2:1;1654:18;;1641:32;1682:35;1641:32;1682:35;:::i;:::-;1736:7;-1:-1:-1;1795:2:1;1780:18;;1767:32;1808:35;1767:32;1808:35;:::i;:::-;1862:7;1852:17;;;1434:441;;;;;:::o;1880:470::-;;;;2026:2;2014:9;2005:7;2001:23;1997:32;1994:2;;;2047:6;2039;2032:22;1994:2;2091:9;2078:23;2110:33;2137:5;2110:33;:::i;:::-;2162:5;-1:-1:-1;2219:2:1;2204:18;;2191:32;2232:35;2191:32;2232:35;:::i;:::-;1984:366;;2286:7;;-1:-1:-1;;;2340:2:1;2325:18;;;;2312:32;;1984:366::o;2355:203::-;-1:-1:-1;;;;;2519:32:1;;;;2501:51;;2489:2;2474:18;;2456:102::o;2563:456::-;-1:-1:-1;;;;;2850:15:1;;;2832:34;;2902:15;;;2897:2;2882:18;;2875:43;2954:15;;2949:2;2934:18;;2927:43;3001:2;2986:18;;2979:34;;;;2781:3;2766:19;;2748:271::o;3024:187::-;3189:14;;3182:22;3164:41;;3152:2;3137:18;;3119:92::o;3216:344::-;3418:2;3400:21;;;3457:2;3437:18;;;3430:30;-1:-1:-1;;;3491:2:1;3476:18;;3469:50;3551:2;3536:18;;3390:170::o;3565:340::-;3767:2;3749:21;;;3806:2;3786:18;;;3779:30;-1:-1:-1;;;3840:2:1;3825:18;;3818:46;3896:2;3881:18;;3739:166::o;3910:354::-;4112:2;4094:21;;;4151:2;4131:18;;;4124:30;4190:32;4185:2;4170:18;;4163:60;4255:2;4240:18;;4084:180::o;4269:351::-;4471:2;4453:21;;;4510:2;4490:18;;;4483:30;4549:29;4544:2;4529:18;;4522:57;4611:2;4596:18;;4443:177::o;4625:350::-;4827:2;4809:21;;;4866:2;4846:18;;;4839:30;4905:28;4900:2;4885:18;;4878:56;4966:2;4951:18;;4799:176::o;4980:355::-;5182:2;5164:21;;;5221:2;5201:18;;;5194:30;5260:33;5255:2;5240:18;;5233:61;5326:2;5311:18;;5154:181::o;5340:347::-;5542:2;5524:21;;;5581:2;5561:18;;;5554:30;5620:25;5615:2;5600:18;;5593:53;5678:2;5663:18;;5514:173::o;5692:352::-;5894:2;5876:21;;;5933:2;5913:18;;;5906:30;5972;5967:2;5952:18;;5945:58;6035:2;6020:18;;5866:178::o;6049:177::-;6195:25;;;6183:2;6168:18;;6150:76::o;6231:133::-;-1:-1:-1;;;;;6308:31:1;;6298:42;;6288:2;;6354:1;6351;6344:12;6288:2;6278:86;:::o
Swarm Source
ipfs://b4d4e6342db60e940f855b162f5ddbff6f9ab71866bdbf31fe5443df9fc4b74d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.