Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
UserProxy
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "./utils/UserProxyStorage.sol";
import "./utils/Multicall.sol";
/**
* @dev UserProxy contract
*/
contract UserProxy is Multicall {
// Below are the variables which consume storage slots.
address public operator;
string public version; // Current version of the contract
address private nominatedOperator;
// Operator events
event OperatorNominated(address indexed newOperator);
event OperatorChanged(address indexed oldOperator, address indexed newOperator);
event SetAMMStatus(bool enable);
event UpgradeAMMWrapper(address newAMMWrapper);
event SetPMMStatus(bool enable);
event UpgradePMM(address newPMM);
event SetRFQStatus(bool enable);
event UpgradeRFQ(address newRFQ);
event SetLimitOrderStatus(bool enable);
event UpgradeLimitOrder(address newLimitOrder);
receive() external payable {}
/************************************************************
* Access control and ownership management *
*************************************************************/
modifier onlyOperator() {
require(operator == msg.sender, "UserProxy: not the operator");
_;
}
function nominateNewOperator(address _newOperator) external onlyOperator {
require(_newOperator != address(0), "UserProxy: operator can not be zero address");
nominatedOperator = _newOperator;
emit OperatorNominated(_newOperator);
}
function acceptOwnership() external {
require(msg.sender == nominatedOperator, "UserProxy: not nominated");
emit OperatorChanged(operator, nominatedOperator);
operator = nominatedOperator;
nominatedOperator = address(0);
}
/************************************************************
* Constructor and init functions *
*************************************************************/
/// @dev Replacing constructor and initialize the contract. This function should only be called once.
function initialize(address _operator) external {
require(keccak256(abi.encodePacked(version)) == keccak256(abi.encodePacked("")), "UserProxy: not upgrading from empty");
require(_operator != address(0), "UserProxy: operator can not be zero address");
operator = _operator;
// Upgrade version
version = "5.3.0";
}
/************************************************************
* Getter functions *
*************************************************************/
function ammWrapperAddr() public view returns (address) {
return AMMWrapperStorage.getStorage().ammWrapperAddr;
}
function isAMMEnabled() public view returns (bool) {
return AMMWrapperStorage.getStorage().isEnabled;
}
function pmmAddr() public view returns (address) {
return PMMStorage.getStorage().pmmAddr;
}
function isPMMEnabled() public view returns (bool) {
return PMMStorage.getStorage().isEnabled;
}
function rfqAddr() public view returns (address) {
return RFQStorage.getStorage().rfqAddr;
}
function isRFQEnabled() public view returns (bool) {
return RFQStorage.getStorage().isEnabled;
}
function limitOrderAddr() public view returns (address) {
return LimitOrderStorage.getStorage().limitOrderAddr;
}
function isLimitOrderEnabled() public view returns (bool) {
return LimitOrderStorage.getStorage().isEnabled;
}
/************************************************************
* Management functions for Operator *
*************************************************************/
function setAMMStatus(bool _enable) public onlyOperator {
AMMWrapperStorage.getStorage().isEnabled = _enable;
emit SetAMMStatus(_enable);
}
/**
* @dev Update AMMWrapper contract address. Used only when ABI of AMMWrapeer remain unchanged.
* Otherwise, UserProxy contract should be upgraded altogether.
*/
function upgradeAMMWrapper(address _newAMMWrapperAddr, bool _enable) external onlyOperator {
AMMWrapperStorage.getStorage().ammWrapperAddr = _newAMMWrapperAddr;
AMMWrapperStorage.getStorage().isEnabled = _enable;
emit UpgradeAMMWrapper(_newAMMWrapperAddr);
emit SetAMMStatus(_enable);
}
function setPMMStatus(bool _enable) public onlyOperator {
PMMStorage.getStorage().isEnabled = _enable;
emit SetPMMStatus(_enable);
}
/**
* @dev Update PMM contract address. Used only when ABI of PMM remain unchanged.
* Otherwise, UserProxy contract should be upgraded altogether.
*/
function upgradePMM(address _newPMMAddr, bool _enable) external onlyOperator {
PMMStorage.getStorage().pmmAddr = _newPMMAddr;
PMMStorage.getStorage().isEnabled = _enable;
emit UpgradePMM(_newPMMAddr);
emit SetPMMStatus(_enable);
}
function setRFQStatus(bool _enable) public onlyOperator {
RFQStorage.getStorage().isEnabled = _enable;
emit SetRFQStatus(_enable);
}
/**
* @dev Update RFQ contract address. Used only when ABI of RFQ remain unchanged.
* Otherwise, UserProxy contract should be upgraded altogether.
*/
function upgradeRFQ(address _newRFQAddr, bool _enable) external onlyOperator {
RFQStorage.getStorage().rfqAddr = _newRFQAddr;
RFQStorage.getStorage().isEnabled = _enable;
emit UpgradeRFQ(_newRFQAddr);
emit SetRFQStatus(_enable);
}
function setLimitOrderStatus(bool _enable) public onlyOperator {
LimitOrderStorage.getStorage().isEnabled = _enable;
emit SetLimitOrderStatus(_enable);
}
/**
* @dev Update Limit Order contract address. Used only when ABI of Limit Order remain unchanged.
* Otherwise, UserProxy contract should be upgraded altogether.
*/
function upgradeLimitOrder(address _newLimitOrderAddr, bool _enable) external onlyOperator {
LimitOrderStorage.getStorage().limitOrderAddr = _newLimitOrderAddr;
LimitOrderStorage.getStorage().isEnabled = _enable;
emit UpgradeLimitOrder(_newLimitOrderAddr);
emit SetLimitOrderStatus(_enable);
}
/************************************************************
* External functions *
*************************************************************/
/**
* @dev proxy the call to AMM
*/
function toAMM(bytes calldata _payload) external payable {
require(isAMMEnabled(), "UserProxy: AMM is disabled");
(bool callSucceed, ) = ammWrapperAddr().call{ value: msg.value }(_payload);
if (!callSucceed) {
// Get the error message returned
assembly {
let ptr := mload(0x40)
let size := returndatasize()
returndatacopy(ptr, 0, size)
revert(ptr, size)
}
}
}
/**
* @dev proxy the call to PMM
*/
function toPMM(bytes calldata _payload) external payable {
require(isPMMEnabled(), "UserProxy: PMM is disabled");
require(msg.sender == tx.origin, "UserProxy: only EOA");
(bool callSucceed, ) = pmmAddr().call{ value: msg.value }(_payload);
if (!callSucceed) {
// Get the error message returned
assembly {
let ptr := mload(0x40)
let size := returndatasize()
returndatacopy(ptr, 0, size)
revert(ptr, size)
}
}
}
/**
* @dev proxy the call to RFQ
*/
function toRFQ(bytes calldata _payload) external payable {
require(isRFQEnabled(), "UserProxy: RFQ is disabled");
require(msg.sender == tx.origin, "UserProxy: only EOA");
(bool callSucceed, ) = rfqAddr().call{ value: msg.value }(_payload);
if (!callSucceed) {
// Get the error message returned
assembly {
let ptr := mload(0x40)
let size := returndatasize()
returndatacopy(ptr, 0, size)
revert(ptr, size)
}
}
}
function toLimitOrder(bytes calldata _payload) external {
require(isLimitOrderEnabled(), "UserProxy: Limit Order is disabled");
require(msg.sender == tx.origin, "UserProxy: only EOA");
(bool callSucceed, ) = limitOrderAddr().call(_payload);
if (!callSucceed) {
// Get the error message returned
assembly {
let ptr := mload(0x40)
let size := returndatasize()
returndatacopy(ptr, 0, size)
revert(ptr, size)
}
}
}
}pragma solidity >=0.7.0;
pragma abicoder v2;
interface IMulticall {
event MulticallFailure(uint256 index, string reason);
function multicall(bytes[] calldata data, bool revertOnFail) external returns (bool[] memory successes, bytes[] memory results);
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "../interfaces/IMulticall.sol";
// Modified from https://github.com/Uniswap/uniswap-v3-periphery/blob/v1.1.1/contracts/base/Multicall.sol
abstract contract Multicall is IMulticall {
function multicall(bytes[] calldata data, bool revertOnFail) external override returns (bool[] memory successes, bytes[] memory results) {
successes = new bool[](data.length);
results = new bytes[](data.length);
for (uint256 i = 0; i < data.length; ++i) {
(bool success, bytes memory result) = address(this).delegatecall(data[i]);
successes[i] = success;
results[i] = result;
if (!success) {
// Get failed reason
string memory revertReason;
if (result.length < 68) {
revertReason = "Delegatecall failed";
} else {
assembly {
result := add(result, 0x04)
}
revertReason = abi.decode(result, (string));
}
if (revertOnFail) {
revert(revertReason);
}
emit MulticallFailure(i, revertReason);
}
}
}
}pragma solidity ^0.7.6;
library AMMWrapperStorage {
bytes32 private constant STORAGE_SLOT = 0xbf49677e3150252dfa801a673d2d5ec21eaa360a4674864e55e79041e3f65a6b;
/// @dev Storage bucket for proxy contract.
struct Storage {
// The address of the AMMWrapper contract.
address ammWrapperAddr;
// Is AMM enabled
bool isEnabled;
}
/// @dev Get the storage bucket for this contract.
function getStorage() internal pure returns (Storage storage stor) {
assert(STORAGE_SLOT == bytes32(uint256(keccak256("userproxy.ammwrapper.storage")) - 1));
bytes32 slot = STORAGE_SLOT;
// Dip into assembly to change the slot pointed to by the local
// variable `stor`.
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
assembly {
stor.slot := slot
}
}
}
library PMMStorage {
bytes32 private constant STORAGE_SLOT = 0x8f135983375ba6442123d61647e7325c1753eabc2e038e44d3b888a970def89a;
/// @dev Storage bucket for proxy contract.
struct Storage {
// The address of the PMM contract.
address pmmAddr;
// Is PMM enabled
bool isEnabled;
}
/// @dev Get the storage bucket for this contract.
function getStorage() internal pure returns (Storage storage stor) {
assert(STORAGE_SLOT == bytes32(uint256(keccak256("userproxy.pmm.storage")) - 1));
bytes32 slot = STORAGE_SLOT;
// Dip into assembly to change the slot pointed to by the local
// variable `stor`.
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
assembly {
stor.slot := slot
}
}
}
library RFQStorage {
bytes32 private constant STORAGE_SLOT = 0x857df08bd185dc66e3cc5e11acb4e1dd65290f3fee6426f52f84e8faccf229cf;
/// @dev Storage bucket for proxy contract.
struct Storage {
// The address of the RFQ contract.
address rfqAddr;
// Is RFQ enabled
bool isEnabled;
}
/// @dev Get the storage bucket for this contract.
function getStorage() internal pure returns (Storage storage stor) {
assert(STORAGE_SLOT == bytes32(uint256(keccak256("userproxy.rfq.storage")) - 1));
bytes32 slot = STORAGE_SLOT;
// Dip into assembly to change the slot pointed to by the local
// variable `stor`.
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
assembly {
stor.slot := slot
}
}
}
library LimitOrderStorage {
bytes32 private constant STORAGE_SLOT = 0xf1a59a985b4002cdf0db464f05bed7182ee06372a999d820ea1883b8bf067ce5;
/// @dev Storage bucket for proxy contract.
struct Storage {
// The address of the Limit Order contract.
address limitOrderAddr;
// Is Limit Order enabled
bool isEnabled;
}
/// @dev Get the storage bucket for this contract.
function getStorage() internal pure returns (Storage storage stor) {
assert(STORAGE_SLOT == bytes32(uint256(keccak256("userproxy.limitorder.storage")) - 1));
bytes32 slot = STORAGE_SLOT;
// Dip into assembly to change the slot pointed to by the local
// variable `stor`.
// See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
assembly {
stor.slot := slot
}
}
}{
"remappings": [
"@ensdomains/=node_modules/@ensdomains/",
"@openzeppelin/=node_modules/@openzeppelin/",
"contracts-test/=contracts/test/",
"contracts/=contracts/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 1000
},
"metadata": {
"bytecodeHash": "ipfs"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "istanbul",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"MulticallFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"SetAMMStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"SetLimitOrderStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"SetPMMStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"SetRFQStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAMMWrapper","type":"address"}],"name":"UpgradeAMMWrapper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLimitOrder","type":"address"}],"name":"UpgradeLimitOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPMM","type":"address"}],"name":"UpgradePMM","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRFQ","type":"address"}],"name":"UpgradeRFQ","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ammWrapperAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isAMMEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLimitOrderEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPMMEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRFQEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitOrderAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bool","name":"revertOnFail","type":"bool"}],"name":"multicall","outputs":[{"internalType":"bool[]","name":"successes","type":"bool[]"},{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOperator","type":"address"}],"name":"nominateNewOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pmmAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rfqAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setAMMStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setLimitOrderStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setPMMStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setRFQStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"toAMM","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"toLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"toPMM","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"toRFQ","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAMMWrapperAddr","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"upgradeAMMWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newLimitOrderAddr","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"upgradeLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPMMAddr","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"upgradePMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRFQAddr","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"upgradeRFQ","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b5061192f806100206000396000f3fe6080604052600436106101a55760003560e01c80638014bd97116100e1578063b6f732ae1161008a578063c4d66de811610064578063c4d66de814610429578063de83cd5414610449578063e47d166c14610469578063ec5590841461047c576101ac565b8063b6f732ae146103df578063bbd3f638146103f4578063c3e9207514610409576101ac565b8063a32fe0a1116100bb578063a32fe0a114610397578063a9204ecf146103aa578063a9dc9f69146103ca576101ac565b80638014bd971461035a578063994dd72e1461036f578063a1728b0d14610384576101ac565b80634daadf121161014e578063706b4eb811610128578063706b4eb8146102e357806379ba5097146103035780637c305b1d146103185780637f54479a14610338576101ac565b80634daadf121461028c57806354fd4d50146102ac578063570ca735146102ce576101ac565b8063298a91fd1161017f578063298a91fd1461022a57806341fc048d1461024c57806346f041701461026c576101ac565b80630d6274ac146101b15780631e9701d4146101d3578063223196b31461020a576101ac565b366101ac57005b600080fd5b3480156101bd57600080fd5b506101d16101cc3660046112b5565b610491565b005b3480156101df57600080fd5b506101f36101ee3660046112e7565b610581565b604051610201929190611546565b60405180910390f35b34801561021657600080fd5b506101d1610225366004611294565b6107a3565b34801561023657600080fd5b5061023f61083d565b6040516102019190611532565b34801561025857600080fd5b506101d1610267366004611365565b610856565b34801561027857600080fd5b506101d16102873660046112b5565b6108de565b34801561029857600080fd5b506101d16102a7366004611365565b6109b9565b3480156102b857600080fd5b506102c1610a36565b60405161020191906115e8565b3480156102da57600080fd5b5061023f610ac3565b3480156102ef57600080fd5b506101d16102fe36600461137f565b610ad2565b34801561030f57600080fd5b506101d1610b95565b34801561032457600080fd5b506101d16103333660046112b5565b610c23565b34801561034457600080fd5b5061034d610cfe565b60405161020191906115dd565b34801561036657600080fd5b5061023f610d18565b34801561037b57600080fd5b5061023f610d22565b6101d161039236600461137f565b610d2c565b6101d16103a536600461137f565b610dd0565b3480156103b657600080fd5b506101d16103c5366004611365565b610e1d565b3480156103d657600080fd5b5061034d610e9a565b3480156103eb57600080fd5b5061023f610ea4565b34801561040057600080fd5b5061034d610eae565b34801561041557600080fd5b506101d16104243660046112b5565b610eb8565b34801561043557600080fd5b506101d1610444366004611294565b610f93565b34801561045557600080fd5b506101d1610464366004611365565b611086565b6101d161047736600461137f565b611103565b34801561048857600080fd5b5061034d611131565b6000546001600160a01b031633146104c45760405162461bcd60e51b81526004016104bb90611791565b60405180910390fd5b816104cd611137565b80546001600160a01b0319166001600160a01b0392909216919091179055806104f4611137565b8054911515600160a01b0260ff60a01b199092169190911790556040517f28e34087108910d7a3d1de15bdebe33e9b7ce4be78c6987103983875f4fbb9039061053e908490611532565b60405180910390a17f85600615329dbd38415d95ab88a1870aa23283ed03ea8339bbaf7c53cb6889eb8160405161057591906115dd565b60405180910390a15050565b6060808367ffffffffffffffff8111801561059b57600080fd5b506040519080825280602002602001820160405280156105c5578160200160208202803683370190505b5091508367ffffffffffffffff811180156105df57600080fd5b5060405190808252806020026020018201604052801561061357816020015b60608152602001906001900390816105fe5790505b50905060005b8481101561079a576000803088888581811061063157fe5b9050602002810190610643919061187d565b6040516106519291906114af565b600060405180830381855af49150503d806000811461068c576040519150601f19603f3d011682016040523d82523d6000602084013e610691565b606091505b5091509150818584815181106106a357fe5b602002602001019015159081151581525050808484815181106106c257fe5b602002602001018190525081610790576060604482511015610718575060408051808201909152601381527f44656c656761746563616c6c206661696c6564000000000000000000000000006020820152610735565b6004820191508180602001905181019061073291906113ec565b90505b8615610755578060405162461bcd60e51b81526004016104bb91906115e8565b7f8227e69dc43e5a3dff3c9e10930295a5383b9e7736b0508e15d46d05efecb4a6848260405161078692919061185c565b60405180910390a1505b5050600101610619565b50935093915050565b6000546001600160a01b031633146107cd5760405162461bcd60e51b81526004016104bb90611791565b6001600160a01b0381166107f35760405162461bcd60e51b81526004016104bb906115fb565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f8cc0f93a743dada018f348511be65ee8585206ca96e058f4d70c41f276e57bde90600090a250565b6000610847611137565b546001600160a01b0316905090565b6000546001600160a01b031633146108805760405162461bcd60e51b81526004016104bb90611791565b8061088961115b565b8054911515600160a01b0260ff60a01b199092169190911790556040517f69013db8b04c8782a3bfb1988607e4cb48e1476125c4a9f2e08199916281becf906108d39083906115dd565b60405180910390a150565b6000546001600160a01b031633146109085760405162461bcd60e51b81526004016104bb90611791565b8161091161117f565b80546001600160a01b0319166001600160a01b03929092169190911790558061093861117f565b8054911515600160a01b0260ff60a01b199092169190911790556040517f474dbe0e44f4b1a24e66b1a543293f696f5f72651de8895adf45233e3c6948bb90610982908490611532565b60405180910390a17f75f3afb50142265ab5ffa96a1281463cb3a39821dfcafd44d5bcda0dbf1c48258160405161057591906115dd565b6000546001600160a01b031633146109e35760405162461bcd60e51b81526004016104bb90611791565b806109ec61117f565b8054911515600160a01b0260ff60a01b199092169190911790556040517f75f3afb50142265ab5ffa96a1281463cb3a39821dfcafd44d5bcda0dbf1c4825906108d39083906115dd565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b505050505081565b6000546001600160a01b031681565b610ada610e9a565b610af65760405162461bcd60e51b81526004016104bb90611658565b333214610b155760405162461bcd60e51b81526004016104bb906116b5565b6000610b1f610d22565b6001600160a01b03168383604051610b389291906114af565b6000604051808303816000865af19150503d8060008114610b75576040519150601f19603f3d011682016040523d82523d6000602084013e610b7a565b606091505b5050905080610b90576040513d806000833e8082fd5b505050565b6002546001600160a01b03163314610bbf5760405162461bcd60e51b81526004016104bb90611723565b600254600080546040516001600160a01b0393841693909116917fd58299b712891143e76310d5e664c4203c940a67db37cf856bdaa3c5c76a802c91a360028054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314610c4d5760405162461bcd60e51b81526004016104bb90611791565b81610c566111a3565b80546001600160a01b0319166001600160a01b039290921691909117905580610c7d6111a3565b8054911515600160a01b0260ff60a01b199092169190911790556040517fc4b713388b13f13226268ec85c363aa606bfc124242892bef245909669b35d0c90610cc7908490611532565b60405180910390a17f77a57cd075e1e4d27ea05938d55fc48c8967f71d9edeeb249010daccce25e45b8160405161057591906115dd565b6000610d0861117f565b54600160a01b900460ff16919050565b600061084761117f565b60006108476111a3565b610d34611131565b610d505760405162461bcd60e51b81526004016104bb9061175a565b333214610d6f5760405162461bcd60e51b81526004016104bb906116b5565b6000610d7961083d565b6001600160a01b0316348484604051610d939291906114af565b60006040518083038185875af1925050503d8060008114610b75576040519150601f19603f3d011682016040523d82523d6000602084013e610b7a565b610dd8610cfe565b610df45760405162461bcd60e51b81526004016104bb906116ec565b333214610e135760405162461bcd60e51b81526004016104bb906116b5565b6000610d79610d18565b6000546001600160a01b03163314610e475760405162461bcd60e51b81526004016104bb90611791565b80610e506111a3565b8054911515600160a01b0260ff60a01b199092169190911790556040517f77a57cd075e1e4d27ea05938d55fc48c8967f71d9edeeb249010daccce25e45b906108d39083906115dd565b6000610d086111a3565b600061084761115b565b6000610d0861115b565b6000546001600160a01b03163314610ee25760405162461bcd60e51b81526004016104bb90611791565b81610eeb61115b565b80546001600160a01b0319166001600160a01b039290921691909117905580610f1261115b565b8054911515600160a01b0260ff60a01b199092169190911790556040517fe3f9ba76e59e03b4e1255783bc2d5340338b8bc071086d3e32e5ddff4fc8555390610f5c908490611532565b60405180910390a17f69013db8b04c8782a3bfb1988607e4cb48e1476125c4a9f2e08199916281becf8160405161057591906115dd565b604051602001610fa29061152f565b604051602081830303815290604052805190602001206001604051602001610fca91906114bf565b6040516020818303038152906040528051906020012014610ffd5760405162461bcd60e51b81526004016104bb906117ff565b6001600160a01b0381166110235760405162461bcd60e51b81526004016104bb906115fb565b600080546001600160a01b0319166001600160a01b0383161790556040805180820190915260058082527f352e332e300000000000000000000000000000000000000000000000000000006020909201918252611082916001916111c7565b5050565b6000546001600160a01b031633146110b05760405162461bcd60e51b81526004016104bb90611791565b806110b9611137565b8054911515600160a01b0260ff60a01b199092169190911790556040517f85600615329dbd38415d95ab88a1870aa23283ed03ea8339bbaf7c53cb6889eb906108d39083906115dd565b61110b610eae565b6111275760405162461bcd60e51b81526004016104bb906117c8565b6000610d79610ea4565b6000610d085b7f857df08bd185dc66e3cc5e11acb4e1dd65290f3fee6426f52f84e8faccf229cf90565b7fbf49677e3150252dfa801a673d2d5ec21eaa360a4674864e55e79041e3f65a6b90565b7f8f135983375ba6442123d61647e7325c1753eabc2e038e44d3b888a970def89a90565b7ff1a59a985b4002cdf0db464f05bed7182ee06372a999d820ea1883b8bf067ce590565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826111fd5760008555611243565b82601f1061121657805160ff1916838001178555611243565b82800160010185558215611243579182015b82811115611243578251825591602001919060010190611228565b5061124f929150611253565b5090565b5b8082111561124f5760008155600101611254565b80356001600160a01b038116811461127f57600080fd5b919050565b8035801515811461127f57600080fd5b6000602082840312156112a5578081fd5b6112ae82611268565b9392505050565b600080604083850312156112c7578081fd5b6112d083611268565b91506112de60208401611284565b90509250929050565b6000806000604084860312156112fb578081fd5b833567ffffffffffffffff80821115611312578283fd5b818601915086601f830112611325578283fd5b813581811115611333578384fd5b8760208083028501011115611346578384fd5b60209283019550935061135c9186019050611284565b90509250925092565b600060208284031215611376578081fd5b6112ae82611284565b60008060208385031215611391578182fd5b823567ffffffffffffffff808211156113a8578384fd5b818501915085601f8301126113bb578384fd5b8135818111156113c9578485fd5b8660208285010111156113da578485fd5b60209290920196919550909350505050565b6000602082840312156113fd578081fd5b815167ffffffffffffffff80821115611414578283fd5b818401915084601f830112611427578283fd5b81518181111561143357fe5b604051601f8201601f19168101602001838111828210171561145157fe5b604052818152838201602001871015611468578485fd5b6114798260208301602087016118c9565b9695505050505050565b6000815180845261149b8160208601602086016118c9565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008083546001808216600081146114de57600181146114f557611524565b60ff198316865260028304607f1686019350611524565b600283048786526020808720875b8381101561151c5781548a820152908501908201611503565b505050860193505b509195945050505050565b90565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015611581578151151584529284019290840190600101611563565b5050508381038285015284518082528282019080840283018401878501865b838110156115ce57601f198684030185526115bc838351611483565b948701949250908601906001016115a0565b50909998505050505050505050565b901515815260200190565b6000602082526112ae6020830184611483565b6020808252602b908201527f5573657250726f78793a206f70657261746f722063616e206e6f74206265207a60408201527f65726f2061646472657373000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5573657250726f78793a204c696d6974204f726465722069732064697361626c60408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f5573657250726f78793a206f6e6c7920454f4100000000000000000000000000604082015260600190565b6020808252601a908201527f5573657250726f78793a20504d4d2069732064697361626c6564000000000000604082015260600190565b60208082526018908201527f5573657250726f78793a206e6f74206e6f6d696e617465640000000000000000604082015260600190565b6020808252601a908201527f5573657250726f78793a205246512069732064697361626c6564000000000000604082015260600190565b6020808252601b908201527f5573657250726f78793a206e6f7420746865206f70657261746f720000000000604082015260600190565b6020808252601a908201527f5573657250726f78793a20414d4d2069732064697361626c6564000000000000604082015260600190565b60208082526023908201527f5573657250726f78793a206e6f7420757067726164696e672066726f6d20656d60408201527f7074790000000000000000000000000000000000000000000000000000000000606082015260800190565b6000838252604060208301526118756040830184611483565b949350505050565b6000808335601e19843603018112611893578283fd5b83018035915067ffffffffffffffff8211156118ad578283fd5b6020019150368190038213156118c257600080fd5b9250929050565b60005b838110156118e45781810151838201526020016118cc565b838111156118f3576000848401525b5050505056fea264697066735822122073c320ab70fb1fcbab4c9e313486f0be0084888c9bcacb1a78abb29510e4b2d264736f6c63430007060033
Deployed Bytecode
0x6080604052600436106101a55760003560e01c80638014bd97116100e1578063b6f732ae1161008a578063c4d66de811610064578063c4d66de814610429578063de83cd5414610449578063e47d166c14610469578063ec5590841461047c576101ac565b8063b6f732ae146103df578063bbd3f638146103f4578063c3e9207514610409576101ac565b8063a32fe0a1116100bb578063a32fe0a114610397578063a9204ecf146103aa578063a9dc9f69146103ca576101ac565b80638014bd971461035a578063994dd72e1461036f578063a1728b0d14610384576101ac565b80634daadf121161014e578063706b4eb811610128578063706b4eb8146102e357806379ba5097146103035780637c305b1d146103185780637f54479a14610338576101ac565b80634daadf121461028c57806354fd4d50146102ac578063570ca735146102ce576101ac565b8063298a91fd1161017f578063298a91fd1461022a57806341fc048d1461024c57806346f041701461026c576101ac565b80630d6274ac146101b15780631e9701d4146101d3578063223196b31461020a576101ac565b366101ac57005b600080fd5b3480156101bd57600080fd5b506101d16101cc3660046112b5565b610491565b005b3480156101df57600080fd5b506101f36101ee3660046112e7565b610581565b604051610201929190611546565b60405180910390f35b34801561021657600080fd5b506101d1610225366004611294565b6107a3565b34801561023657600080fd5b5061023f61083d565b6040516102019190611532565b34801561025857600080fd5b506101d1610267366004611365565b610856565b34801561027857600080fd5b506101d16102873660046112b5565b6108de565b34801561029857600080fd5b506101d16102a7366004611365565b6109b9565b3480156102b857600080fd5b506102c1610a36565b60405161020191906115e8565b3480156102da57600080fd5b5061023f610ac3565b3480156102ef57600080fd5b506101d16102fe36600461137f565b610ad2565b34801561030f57600080fd5b506101d1610b95565b34801561032457600080fd5b506101d16103333660046112b5565b610c23565b34801561034457600080fd5b5061034d610cfe565b60405161020191906115dd565b34801561036657600080fd5b5061023f610d18565b34801561037b57600080fd5b5061023f610d22565b6101d161039236600461137f565b610d2c565b6101d16103a536600461137f565b610dd0565b3480156103b657600080fd5b506101d16103c5366004611365565b610e1d565b3480156103d657600080fd5b5061034d610e9a565b3480156103eb57600080fd5b5061023f610ea4565b34801561040057600080fd5b5061034d610eae565b34801561041557600080fd5b506101d16104243660046112b5565b610eb8565b34801561043557600080fd5b506101d1610444366004611294565b610f93565b34801561045557600080fd5b506101d1610464366004611365565b611086565b6101d161047736600461137f565b611103565b34801561048857600080fd5b5061034d611131565b6000546001600160a01b031633146104c45760405162461bcd60e51b81526004016104bb90611791565b60405180910390fd5b816104cd611137565b80546001600160a01b0319166001600160a01b0392909216919091179055806104f4611137565b8054911515600160a01b0260ff60a01b199092169190911790556040517f28e34087108910d7a3d1de15bdebe33e9b7ce4be78c6987103983875f4fbb9039061053e908490611532565b60405180910390a17f85600615329dbd38415d95ab88a1870aa23283ed03ea8339bbaf7c53cb6889eb8160405161057591906115dd565b60405180910390a15050565b6060808367ffffffffffffffff8111801561059b57600080fd5b506040519080825280602002602001820160405280156105c5578160200160208202803683370190505b5091508367ffffffffffffffff811180156105df57600080fd5b5060405190808252806020026020018201604052801561061357816020015b60608152602001906001900390816105fe5790505b50905060005b8481101561079a576000803088888581811061063157fe5b9050602002810190610643919061187d565b6040516106519291906114af565b600060405180830381855af49150503d806000811461068c576040519150601f19603f3d011682016040523d82523d6000602084013e610691565b606091505b5091509150818584815181106106a357fe5b602002602001019015159081151581525050808484815181106106c257fe5b602002602001018190525081610790576060604482511015610718575060408051808201909152601381527f44656c656761746563616c6c206661696c6564000000000000000000000000006020820152610735565b6004820191508180602001905181019061073291906113ec565b90505b8615610755578060405162461bcd60e51b81526004016104bb91906115e8565b7f8227e69dc43e5a3dff3c9e10930295a5383b9e7736b0508e15d46d05efecb4a6848260405161078692919061185c565b60405180910390a1505b5050600101610619565b50935093915050565b6000546001600160a01b031633146107cd5760405162461bcd60e51b81526004016104bb90611791565b6001600160a01b0381166107f35760405162461bcd60e51b81526004016104bb906115fb565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f8cc0f93a743dada018f348511be65ee8585206ca96e058f4d70c41f276e57bde90600090a250565b6000610847611137565b546001600160a01b0316905090565b6000546001600160a01b031633146108805760405162461bcd60e51b81526004016104bb90611791565b8061088961115b565b8054911515600160a01b0260ff60a01b199092169190911790556040517f69013db8b04c8782a3bfb1988607e4cb48e1476125c4a9f2e08199916281becf906108d39083906115dd565b60405180910390a150565b6000546001600160a01b031633146109085760405162461bcd60e51b81526004016104bb90611791565b8161091161117f565b80546001600160a01b0319166001600160a01b03929092169190911790558061093861117f565b8054911515600160a01b0260ff60a01b199092169190911790556040517f474dbe0e44f4b1a24e66b1a543293f696f5f72651de8895adf45233e3c6948bb90610982908490611532565b60405180910390a17f75f3afb50142265ab5ffa96a1281463cb3a39821dfcafd44d5bcda0dbf1c48258160405161057591906115dd565b6000546001600160a01b031633146109e35760405162461bcd60e51b81526004016104bb90611791565b806109ec61117f565b8054911515600160a01b0260ff60a01b199092169190911790556040517f75f3afb50142265ab5ffa96a1281463cb3a39821dfcafd44d5bcda0dbf1c4825906108d39083906115dd565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b505050505081565b6000546001600160a01b031681565b610ada610e9a565b610af65760405162461bcd60e51b81526004016104bb90611658565b333214610b155760405162461bcd60e51b81526004016104bb906116b5565b6000610b1f610d22565b6001600160a01b03168383604051610b389291906114af565b6000604051808303816000865af19150503d8060008114610b75576040519150601f19603f3d011682016040523d82523d6000602084013e610b7a565b606091505b5050905080610b90576040513d806000833e8082fd5b505050565b6002546001600160a01b03163314610bbf5760405162461bcd60e51b81526004016104bb90611723565b600254600080546040516001600160a01b0393841693909116917fd58299b712891143e76310d5e664c4203c940a67db37cf856bdaa3c5c76a802c91a360028054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314610c4d5760405162461bcd60e51b81526004016104bb90611791565b81610c566111a3565b80546001600160a01b0319166001600160a01b039290921691909117905580610c7d6111a3565b8054911515600160a01b0260ff60a01b199092169190911790556040517fc4b713388b13f13226268ec85c363aa606bfc124242892bef245909669b35d0c90610cc7908490611532565b60405180910390a17f77a57cd075e1e4d27ea05938d55fc48c8967f71d9edeeb249010daccce25e45b8160405161057591906115dd565b6000610d0861117f565b54600160a01b900460ff16919050565b600061084761117f565b60006108476111a3565b610d34611131565b610d505760405162461bcd60e51b81526004016104bb9061175a565b333214610d6f5760405162461bcd60e51b81526004016104bb906116b5565b6000610d7961083d565b6001600160a01b0316348484604051610d939291906114af565b60006040518083038185875af1925050503d8060008114610b75576040519150601f19603f3d011682016040523d82523d6000602084013e610b7a565b610dd8610cfe565b610df45760405162461bcd60e51b81526004016104bb906116ec565b333214610e135760405162461bcd60e51b81526004016104bb906116b5565b6000610d79610d18565b6000546001600160a01b03163314610e475760405162461bcd60e51b81526004016104bb90611791565b80610e506111a3565b8054911515600160a01b0260ff60a01b199092169190911790556040517f77a57cd075e1e4d27ea05938d55fc48c8967f71d9edeeb249010daccce25e45b906108d39083906115dd565b6000610d086111a3565b600061084761115b565b6000610d0861115b565b6000546001600160a01b03163314610ee25760405162461bcd60e51b81526004016104bb90611791565b81610eeb61115b565b80546001600160a01b0319166001600160a01b039290921691909117905580610f1261115b565b8054911515600160a01b0260ff60a01b199092169190911790556040517fe3f9ba76e59e03b4e1255783bc2d5340338b8bc071086d3e32e5ddff4fc8555390610f5c908490611532565b60405180910390a17f69013db8b04c8782a3bfb1988607e4cb48e1476125c4a9f2e08199916281becf8160405161057591906115dd565b604051602001610fa29061152f565b604051602081830303815290604052805190602001206001604051602001610fca91906114bf565b6040516020818303038152906040528051906020012014610ffd5760405162461bcd60e51b81526004016104bb906117ff565b6001600160a01b0381166110235760405162461bcd60e51b81526004016104bb906115fb565b600080546001600160a01b0319166001600160a01b0383161790556040805180820190915260058082527f352e332e300000000000000000000000000000000000000000000000000000006020909201918252611082916001916111c7565b5050565b6000546001600160a01b031633146110b05760405162461bcd60e51b81526004016104bb90611791565b806110b9611137565b8054911515600160a01b0260ff60a01b199092169190911790556040517f85600615329dbd38415d95ab88a1870aa23283ed03ea8339bbaf7c53cb6889eb906108d39083906115dd565b61110b610eae565b6111275760405162461bcd60e51b81526004016104bb906117c8565b6000610d79610ea4565b6000610d085b7f857df08bd185dc66e3cc5e11acb4e1dd65290f3fee6426f52f84e8faccf229cf90565b7fbf49677e3150252dfa801a673d2d5ec21eaa360a4674864e55e79041e3f65a6b90565b7f8f135983375ba6442123d61647e7325c1753eabc2e038e44d3b888a970def89a90565b7ff1a59a985b4002cdf0db464f05bed7182ee06372a999d820ea1883b8bf067ce590565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826111fd5760008555611243565b82601f1061121657805160ff1916838001178555611243565b82800160010185558215611243579182015b82811115611243578251825591602001919060010190611228565b5061124f929150611253565b5090565b5b8082111561124f5760008155600101611254565b80356001600160a01b038116811461127f57600080fd5b919050565b8035801515811461127f57600080fd5b6000602082840312156112a5578081fd5b6112ae82611268565b9392505050565b600080604083850312156112c7578081fd5b6112d083611268565b91506112de60208401611284565b90509250929050565b6000806000604084860312156112fb578081fd5b833567ffffffffffffffff80821115611312578283fd5b818601915086601f830112611325578283fd5b813581811115611333578384fd5b8760208083028501011115611346578384fd5b60209283019550935061135c9186019050611284565b90509250925092565b600060208284031215611376578081fd5b6112ae82611284565b60008060208385031215611391578182fd5b823567ffffffffffffffff808211156113a8578384fd5b818501915085601f8301126113bb578384fd5b8135818111156113c9578485fd5b8660208285010111156113da578485fd5b60209290920196919550909350505050565b6000602082840312156113fd578081fd5b815167ffffffffffffffff80821115611414578283fd5b818401915084601f830112611427578283fd5b81518181111561143357fe5b604051601f8201601f19168101602001838111828210171561145157fe5b604052818152838201602001871015611468578485fd5b6114798260208301602087016118c9565b9695505050505050565b6000815180845261149b8160208601602086016118c9565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008083546001808216600081146114de57600181146114f557611524565b60ff198316865260028304607f1686019350611524565b600283048786526020808720875b8381101561151c5781548a820152908501908201611503565b505050860193505b509195945050505050565b90565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015611581578151151584529284019290840190600101611563565b5050508381038285015284518082528282019080840283018401878501865b838110156115ce57601f198684030185526115bc838351611483565b948701949250908601906001016115a0565b50909998505050505050505050565b901515815260200190565b6000602082526112ae6020830184611483565b6020808252602b908201527f5573657250726f78793a206f70657261746f722063616e206e6f74206265207a60408201527f65726f2061646472657373000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5573657250726f78793a204c696d6974204f726465722069732064697361626c60408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f5573657250726f78793a206f6e6c7920454f4100000000000000000000000000604082015260600190565b6020808252601a908201527f5573657250726f78793a20504d4d2069732064697361626c6564000000000000604082015260600190565b60208082526018908201527f5573657250726f78793a206e6f74206e6f6d696e617465640000000000000000604082015260600190565b6020808252601a908201527f5573657250726f78793a205246512069732064697361626c6564000000000000604082015260600190565b6020808252601b908201527f5573657250726f78793a206e6f7420746865206f70657261746f720000000000604082015260600190565b6020808252601a908201527f5573657250726f78793a20414d4d2069732064697361626c6564000000000000604082015260600190565b60208082526023908201527f5573657250726f78793a206e6f7420757067726164696e672066726f6d20656d60408201527f7074790000000000000000000000000000000000000000000000000000000000606082015260800190565b6000838252604060208301526118756040830184611483565b949350505050565b6000808335601e19843603018112611893578283fd5b83018035915067ffffffffffffffff8211156118ad578283fd5b6020019150368190038213156118c257600080fd5b9250929050565b60005b838110156118e45781810151838201526020016118cc565b838111156118f3576000848401525b5050505056fea264697066735822122073c320ab70fb1fcbab4c9e313486f0be0084888c9bcacb1a78abb29510e4b2d264736f6c63430007060033
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
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.