Latest 25 from a total of 99,930 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0x48656c6c | 20508795 | 559 days ago | IN | 0 ETH | 0.00003098 | ||||
| Transfer | 18833095 | 794 days ago | IN | 0.0000001 ETH | 0.00099963 | ||||
| Multi Asset Swap | 16742238 | 1087 days ago | IN | 0 ETH | 0.00362363 | ||||
| Multi Asset Swap | 16742222 | 1087 days ago | IN | 0 ETH | 0.00427497 | ||||
| Multi Asset Swap | 16742117 | 1087 days ago | IN | 0 ETH | 0.00482821 | ||||
| Multi Asset Swap | 16742062 | 1087 days ago | IN | 0 ETH | 0.00420177 | ||||
| Multi Asset Swap | 16082539 | 1179 days ago | IN | 0.1066 ETH | 0.00828471 | ||||
| Multi Asset Swap | 16080559 | 1180 days ago | IN | 0.1292 ETH | 0.00495007 | ||||
| Multi Asset Swap | 16080310 | 1180 days ago | IN | 0.0929 ETH | 0.00676691 | ||||
| Multi Asset Swap | 16080183 | 1180 days ago | IN | 0.2887 ETH | 0.02199567 | ||||
| Multi Asset Swap | 16073771 | 1181 days ago | IN | 0.0422 ETH | 0.01221073 | ||||
| Multi Asset Swap | 16072709 | 1181 days ago | IN | 0.84975933 ETH | 0.01079228 | ||||
| Multi Asset Swap | 16072282 | 1181 days ago | IN | 0.00424999 ETH | 0.01041593 | ||||
| Multi Asset Swap | 16070654 | 1181 days ago | IN | 0.08075122 ETH | 0.013309 | ||||
| Multi Asset Swap | 16070632 | 1181 days ago | IN | 0.0968 ETH | 0.01209847 | ||||
| Multi Asset Swap | 16070610 | 1181 days ago | IN | 0.14859 ETH | 0.0196449 | ||||
| Multi Asset Swap | 16070144 | 1181 days ago | IN | 0.00155945 ETH | 0.00770236 | ||||
| Multi Asset Swap | 16069808 | 1181 days ago | IN | 0.0605 ETH | 0.01302753 | ||||
| Multi Asset Swap | 16068970 | 1181 days ago | IN | 0.0338 ETH | 0.01111408 | ||||
| Multi Asset Swap | 16068823 | 1181 days ago | IN | 0.27497732 ETH | 0.00672483 | ||||
| Multi Asset Swap | 16067037 | 1182 days ago | IN | 0.1239999 ETH | 0.00551684 | ||||
| Multi Asset Swap | 16065297 | 1182 days ago | IN | 0.0169 ETH | 0.00429273 | ||||
| Multi Asset Swap | 16065247 | 1182 days ago | IN | 0.4046 ETH | 0.04595249 | ||||
| Multi Asset Swap | 16064625 | 1182 days ago | IN | 0.0816 ETH | 0.01010947 | ||||
| Multi Asset Swap | 16064618 | 1182 days ago | IN | 0.0749 ETH | 0.00836105 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Buy Assets For E... | 16082539 | 1179 days ago | 0.0408 ETH | ||||
| Fulfill Availabl... | 16082539 | 1179 days ago | 0.0658 ETH | ||||
| Transfer | 16080559 | 1180 days ago | 0.086 ETH | ||||
| 0x8840e19e | 16080559 | 1180 days ago | 0.0432 ETH | ||||
| Transfer | 16080559 | 1180 days ago | 0.086 ETH | ||||
| Fulfill Availabl... | 16080559 | 1180 days ago | 0.086 ETH | ||||
| Transfer | 16080310 | 1180 days ago | 0.031 ETH | ||||
| Transfer | 16080310 | 1180 days ago | 0.031 ETH | ||||
| 0x8840e19e | 16080310 | 1180 days ago | 0.0624 ETH | ||||
| Fulfill Advanced... | 16080310 | 1180 days ago | 0.0305 ETH | ||||
| 0x8840e19e | 16080183 | 1180 days ago | 0.2602 ETH | ||||
| Fulfill Advanced... | 16080183 | 1180 days ago | 0.0285 ETH | ||||
| 0x8840e19e | 16073771 | 1181 days ago | 0.0286 ETH | ||||
| Fulfill Availabl... | 16073771 | 1181 days ago | 0.0136 ETH | ||||
| Transfer | 16072709 | 1181 days ago | 0.00005638 ETH | ||||
| 0x8840e19e | 16072709 | 1181 days ago | 0.065799 ETH | ||||
| Transfer | 16072709 | 1181 days ago | 0.00005638 ETH | ||||
| Swap ETH For Exa... | 16072709 | 1181 days ago | 0.78396033 ETH | ||||
| 0x8840e19e | 16072282 | 1181 days ago | 0.00055 ETH | ||||
| Buy Assets For E... | 16072282 | 1181 days ago | 0.00099999 ETH | ||||
| Fulfill Availabl... | 16072282 | 1181 days ago | 0.0027 ETH | ||||
| Transfer | 16070654 | 1181 days ago | 0.00047278 ETH | ||||
| Fulfill Availabl... | 16070654 | 1181 days ago | 0.033 ETH | ||||
| Transfer | 16070654 | 1181 days ago | 0.00047278 ETH | ||||
| Swap ETH For Exa... | 16070654 | 1181 days ago | 0.04775122 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GenieSwap
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./markets/MarketRegistry.sol";
import "./SpecialTransferHelper.sol";
import "../../interfaces/markets/tokens/IERC20.sol";
import "../../interfaces/markets/tokens/IERC721.sol";
import "../../interfaces/markets/tokens/IERC1155.sol";
contract GenieSwap is SpecialTransferHelper, Ownable, ReentrancyGuard {
struct ERC20Details {
address[] tokenAddrs;
uint256[] amounts;
}
struct ERC1155Details {
address tokenAddr;
uint256[] ids;
uint256[] amounts;
}
struct ConverstionDetails {
bytes conversionData;
}
struct AffiliateDetails {
address affiliate;
bool isActive;
}
struct SponsoredMarket {
uint256 marketId;
bool isActive;
}
address public constant GOV = 0xE43aA28716b0B7531293557D5397F8b12f3F5aBc;
address public guardian;
address public converter;
address public punkProxy;
uint256 public baseFees;
bool public openForTrades;
bool public openForFreeTrades;
MarketRegistry public marketRegistry;
AffiliateDetails[] public affiliates;
SponsoredMarket[] public sponsoredMarkets;
modifier isOpenForTrades() {
require(openForTrades, "trades not allowed");
_;
}
modifier isOpenForFreeTrades() {
require(openForFreeTrades, "free trades not allowed");
_;
}
constructor(address _marketRegistry, address _converter, address _guardian) {
marketRegistry = MarketRegistry(_marketRegistry);
converter = _converter;
guardian = _guardian;
baseFees = 0;
openForTrades = true;
openForFreeTrades = true;
affiliates.push(AffiliateDetails(GOV, true));
}
function setUp() external onlyOwner {
// Create CryptoPunk Proxy
IWrappedPunk(0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6).registerProxy();
punkProxy = IWrappedPunk(0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6).proxyInfo(address(this));
// approve wrapped mooncats rescue to Acclimated​MoonCats contract
IERC721(0x7C40c393DC0f283F318791d746d894DdD3693572).setApprovalForAll(0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69, true);
}
// @audit This function is used to approve specific tokens to specific market contracts with high volume.
// This is done in very rare cases for the gas optimization purposes.
function setOneTimeApproval(IERC20 token, address operator, uint256 amount) external onlyOwner {
token.approve(operator, amount);
}
function updateGuardian(address _guardian) external onlyOwner {
guardian = _guardian;
}
function addAffiliate(address _affiliate) external onlyOwner {
affiliates.push(AffiliateDetails(_affiliate, true));
}
function updateAffiliate(uint256 _affiliateIndex, address _affiliate, bool _IsActive) external onlyOwner {
affiliates[_affiliateIndex] = AffiliateDetails(_affiliate, _IsActive);
}
function addSponsoredMarket(uint256 _marketId) external onlyOwner {
sponsoredMarkets.push(SponsoredMarket(_marketId, true));
}
function updateSponsoredMarket(uint256 _marketIndex, uint256 _marketId, bool _isActive) external onlyOwner {
sponsoredMarkets[_marketIndex] = SponsoredMarket(_marketId, _isActive);
}
function setBaseFees(uint256 _baseFees) external onlyOwner {
baseFees = _baseFees;
}
function setOpenForTrades(bool _openForTrades) external onlyOwner {
openForTrades = _openForTrades;
}
function setOpenForFreeTrades(bool _openForFreeTrades) external onlyOwner {
openForFreeTrades = _openForFreeTrades;
}
// @audit we will setup a system that will monitor the contract for any leftover
// assets. In case any asset is leftover, the system should be able to trigger this
// function to close all the trades until the leftover assets are rescued.
function closeAllTrades() external {
require(_msgSender() == guardian);
openForTrades = false;
openForFreeTrades = false;
}
function setConverter(address _converter) external onlyOwner {
converter = _converter;
}
function setMarketRegistry(MarketRegistry _marketRegistry) external onlyOwner {
marketRegistry = _marketRegistry;
}
function _transferEth(address _to, uint256 _amount) internal {
(bool success, ) = _to.call{value: _amount}('');
require(success, "_transferEth: Eth transfer failed");
}
function _collectFee(uint256[2] memory feeDetails) internal {
require(feeDetails[1] >= baseFees, "Insufficient fee");
if (feeDetails[1] > 0) {
AffiliateDetails memory affiliateDetails = affiliates[feeDetails[0]];
affiliateDetails.isActive
? _transferEth(affiliateDetails.affiliate, feeDetails[1])
: _transferEth(GOV, feeDetails[1]);
}
}
function _checkCallResult(bool _success) internal pure {
if (!_success) {
// Copy revert reason from call
assembly {
returndatacopy(0, 0, returndatasize())
revert(0, returndatasize())
}
}
}
function _transferFromHelper(
ERC20Details memory erc20Details,
SpecialTransferHelper.ERC721Details[] memory erc721Details,
ERC1155Details[] memory erc1155Details
) internal {
// transfer ERC20 tokens from the sender to this contract
for (uint256 i = 0; i < erc20Details.tokenAddrs.length; i++) {
IERC20(erc20Details.tokenAddrs[i]).transferFrom(
_msgSender(),
address(this),
erc20Details.amounts[i]
);
}
// transfer ERC721 tokens from the sender to this contract
for (uint256 i = 0; i < erc721Details.length; i++) {
// accept CryptoPunks
if (erc721Details[i].tokenAddr == 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB) {
_acceptCryptoPunk(erc721Details[i]);
}
// accept Mooncat
else if (erc721Details[i].tokenAddr == 0x60cd862c9C687A9dE49aecdC3A99b74A4fc54aB6) {
_acceptMoonCat(erc721Details[i]);
}
// default
else {
for (uint256 j = 0; j < erc721Details[i].ids.length; j++) {
IERC721(erc721Details[i].tokenAddr).transferFrom(
_msgSender(),
address(this),
erc721Details[i].ids[j]
);
}
}
}
// transfer ERC1155 tokens from the sender to this contract
for (uint256 i = 0; i < erc1155Details.length; i++) {
IERC1155(erc1155Details[i].tokenAddr).safeBatchTransferFrom(
_msgSender(),
address(this),
erc1155Details[i].ids,
erc1155Details[i].amounts,
""
);
}
}
function _conversionHelper(
ConverstionDetails[] memory _converstionDetails
) internal {
for (uint256 i = 0; i < _converstionDetails.length; i++) {
// convert to desired asset
(bool success, ) = converter.delegatecall(_converstionDetails[i].conversionData);
// check if the call passed successfully
_checkCallResult(success);
}
}
function _trade(
MarketRegistry.TradeDetails[] memory _tradeDetails
) internal {
for (uint256 i = 0; i < _tradeDetails.length; i++) {
// get market details
(address _proxy, bool _isLib, bool _isActive) = marketRegistry.markets(_tradeDetails[i].marketId);
// market should be active
require(_isActive, "_trade: InActive Market");
// execute trade
(bool success, ) = _isLib
? _proxy.delegatecall(_tradeDetails[i].tradeData)
: _proxy.call{value:_tradeDetails[i].value}(_tradeDetails[i].tradeData);
// check if the call passed successfully
_checkCallResult(success);
}
}
function _tradeSponsored(
MarketRegistry.TradeDetails[] memory _tradeDetails,
uint256 sponsoredMarketId
) internal returns (bool isSponsored) {
for (uint256 i = 0; i < _tradeDetails.length; i++) {
// check if the trade is for the sponsored market
if (_tradeDetails[i].marketId == sponsoredMarketId) {
isSponsored = true;
}
// get market details
(address _proxy, bool _isLib, bool _isActive) = marketRegistry.markets(_tradeDetails[i].marketId);
// market should be active
require(_isActive, "_trade: InActive Market");
// execute trade
(bool success, ) = _isLib
? _proxy.delegatecall(_tradeDetails[i].tradeData)
: _proxy.call{value:_tradeDetails[i].value}(_tradeDetails[i].tradeData);
// check if the call passed successfully
_checkCallResult(success);
}
}
function _returnDust(address[] memory _tokens) internal {
for (uint256 i = 0; i < _tokens.length; i++) {
if(_tokens[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
_transferEth(_msgSender(), address(this).balance);
}
else {
IERC20(_tokens[i]).transfer(_msgSender(), IERC20(_tokens[i]).balanceOf(address(this)));
}
}
}
// swaps any combination of ERC-20/721/1155
// User needs to approve assets before invoking swap
// WARNING: DO NOT SEND TOKENS TO THIS FUNCTION DIRECTLY!!!
function multiAssetSwap(
ERC20Details memory erc20Details,
SpecialTransferHelper.ERC721Details[] memory erc721Details,
ERC1155Details[] memory erc1155Details,
ConverstionDetails[] memory converstionDetails,
MarketRegistry.TradeDetails[] memory tradeDetails,
address[] memory dustTokens,
uint256[2] memory feeDetails // [affiliateIndex, ETH fee in Wei]
) payable external isOpenForTrades nonReentrant {
// collect fees
_collectFee(feeDetails);
// transfer all tokens
_transferFromHelper(
erc20Details,
erc721Details,
erc1155Details
);
// Convert any assets if needed
_conversionHelper(converstionDetails);
// execute trades
_trade(tradeDetails);
// return dust tokens (if any)
_returnDust(dustTokens);
}
// Utility function that is used for free swaps for sponsored markets
// WARNING: DO NOT SEND TOKENS TO THIS FUNCTION DIRECTLY!!!
function multiAssetSwapWithoutFee(
ERC20Details memory erc20Details,
SpecialTransferHelper.ERC721Details[] memory erc721Details,
ERC1155Details[] memory erc1155Details,
ConverstionDetails[] memory converstionDetails,
MarketRegistry.TradeDetails[] memory tradeDetails,
address[] memory dustTokens,
uint256 sponsoredMarketIndex
) payable external isOpenForFreeTrades nonReentrant {
// fetch the marketId of the sponsored market
SponsoredMarket memory sponsoredMarket = sponsoredMarkets[sponsoredMarketIndex];
// check if the market is active
require(sponsoredMarket.isActive, "multiAssetSwapWithoutFee: InActive sponsored market");
// transfer all tokens
_transferFromHelper(
erc20Details,
erc721Details,
erc1155Details
);
// Convert any assets if needed
_conversionHelper(converstionDetails);
// execute trades
bool isSponsored = _tradeSponsored(tradeDetails, sponsoredMarket.marketId);
// check if the trades include the sponsored market
require(isSponsored, "multiAssetSwapWithoutFee: trades do not include sponsored market");
// return dust tokens (if any)
_returnDust(dustTokens);
}
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) public virtual returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) public virtual returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return 0x150b7a02;
}
// Used by ERC721BasicToken.sol
function onERC721Received(
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return 0xf0b9e5ba;
}
function supportsInterface(bytes4 interfaceId)
external
virtual
view
returns (bool)
{
return interfaceId == this.supportsInterface.selector;
}
receive() external payable {}
// Emergency function: In case any ETH get stuck in the contract unintentionally
// Only owner can retrieve the asset balance to a recipient address
function rescueETH(address recipient) onlyOwner external {
_transferEth(recipient, address(this).balance);
}
// Emergency function: In case any ERC20 tokens get stuck in the contract unintentionally
// Only owner can retrieve the asset balance to a recipient address
function rescueERC20(address asset, address recipient) onlyOwner external {
IERC20(asset).transfer(recipient, IERC20(asset).balanceOf(address(this)));
}
// Emergency function: In case any ERC721 tokens get stuck in the contract unintentionally
// Only owner can retrieve the asset balance to a recipient address
function rescueERC721(address asset, uint256[] calldata ids, address recipient) onlyOwner external {
for (uint256 i = 0; i < ids.length; i++) {
IERC721(asset).transferFrom(address(this), recipient, ids[i]);
}
}
// Emergency function: In case any ERC1155 tokens get stuck in the contract unintentionally
// Only owner can retrieve the asset balance to a recipient address
function rescueERC1155(address asset, uint256[] calldata ids, uint256[] calldata amounts, address recipient) onlyOwner external {
for (uint256 i = 0; i < ids.length; i++) {
IERC1155(asset).safeTransferFrom(address(this), recipient, ids[i], amounts[i], "");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
import "@openzeppelin/contracts/access/Ownable.sol";
contract MarketRegistry is Ownable {
struct TradeDetails {
uint256 marketId;
uint256 value;
bytes tradeData;
}
struct Market {
address proxy;
bool isLib;
bool isActive;
}
Market[] public markets;
constructor(address[] memory proxies, bool[] memory isLibs) {
for (uint256 i = 0; i < proxies.length; i++) {
markets.push(Market(proxies[i], isLibs[i], true));
}
}
function addMarket(address proxy, bool isLib) external onlyOwner {
markets.push(Market(proxy, isLib, true));
}
function setMarketStatus(uint256 marketId, bool newStatus) external onlyOwner {
Market storage market = markets[marketId];
market.isActive = newStatus;
}
function setMarketProxy(uint256 marketId, address newProxy, bool isLib) external onlyOwner {
Market storage market = markets[marketId];
market.proxy = newProxy;
market.isLib = isLib;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
import "@openzeppelin/contracts/utils/Context.sol";
import "../../interfaces/punks/ICryptoPunks.sol";
import "../../interfaces/punks/IWrappedPunk.sol";
import "../../interfaces/mooncats/IMoonCatsRescue.sol";
contract SpecialTransferHelper is Context {
struct ERC721Details {
address tokenAddr;
address[] to;
uint256[] ids;
}
function _uintToBytes5(uint256 id)
internal
pure
returns (bytes5 slicedDataBytes5)
{
bytes memory _bytes = new bytes(32);
assembly {
mstore(add(_bytes, 32), id)
}
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// The first word of the slice result is potentially a partial
// word read from the original array. To read it, we calculate
// the length of that partial word and start copying that many
// bytes into the array. The first word we copy will start with
// data we don't care about, but the last `lengthmod` bytes will
// land at the beginning of the contents of the new array. When
// we're done copying, we overwrite the full first word with
// the actual length of the slice.
let lengthmod := and(5, 31)
// The multiplication in the next line is necessary
// because when slicing multiples of 32 bytes (lengthmod == 0)
// the following copy loop was copying the origin's length
// and then ending prematurely not copying everything it should.
let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
let end := add(mc, 5)
for {
// The multiplication in the next line has the same exact purpose
// as the one above.
let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), 27)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
mstore(tempBytes, 5)
//update free-memory pointer
//allocating the array padded to 32 bytes like the compiler does now
mstore(0x40, and(add(mc, 31), not(31)))
}
assembly {
slicedDataBytes5 := mload(add(tempBytes, 32))
}
}
function _acceptMoonCat(ERC721Details memory erc721Details) internal {
for (uint256 i = 0; i < erc721Details.ids.length; i++) {
bytes5 catId = _uintToBytes5(erc721Details.ids[i]);
address owner = IMoonCatsRescue(erc721Details.tokenAddr).catOwners(catId);
require(owner == _msgSender(), "_acceptMoonCat: invalid mooncat owner");
IMoonCatsRescue(erc721Details.tokenAddr).acceptAdoptionOffer(catId);
}
}
function _transferMoonCat(ERC721Details memory erc721Details) internal {
for (uint256 i = 0; i < erc721Details.ids.length; i++) {
IMoonCatsRescue(erc721Details.tokenAddr).giveCat(_uintToBytes5(erc721Details.ids[i]), erc721Details.to[i]);
}
}
function _acceptCryptoPunk(ERC721Details memory erc721Details) internal {
for (uint256 i = 0; i < erc721Details.ids.length; i++) {
address owner = ICryptoPunks(erc721Details.tokenAddr).punkIndexToAddress(erc721Details.ids[i]);
require(owner == _msgSender(), "_acceptCryptoPunk: invalid punk owner");
ICryptoPunks(erc721Details.tokenAddr).buyPunk(erc721Details.ids[i]);
}
}
function _transferCryptoPunk(ERC721Details memory erc721Details) internal {
for (uint256 i = 0; i < erc721Details.ids.length; i++) {
ICryptoPunks(erc721Details.tokenAddr).transferPunk(erc721Details.to[i], erc721Details.ids[i]);
}
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
interface IERC20 {
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
interface IERC721 {
/// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
/// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
/// THEY MAY BE PERMANENTLY LOST
/// @dev Throws unless `msg.sender` is the current owner, an authorized
/// operator, or the approved address for this NFT. Throws if `_from` is
/// not the current owner. Throws if `_to` is the zero address. Throws if
/// `_tokenId` is not a valid NFT.
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) external;
function setApprovalForAll(address operator, bool approved) external;
function approve(address to, uint256 tokenId) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
interface IERC1155 {
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
interface ICryptoPunks {
function punkIndexToAddress(uint index) external view returns(address owner);
function offerPunkForSaleToAddress(uint punkIndex, uint minSalePriceInWei, address toAddress) external;
function buyPunk(uint punkIndex) external payable;
function transferPunk(address to, uint punkIndex) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
interface IWrappedPunk {
/**
* @dev Mints a wrapped punk
*/
function mint(uint256 punkIndex) external;
/**
* @dev Burns a specific wrapped punk
*/
function burn(uint256 punkIndex) external;
/**
* @dev Registers proxy
*/
function registerProxy() external;
/**
* @dev Gets proxy address
*/
function proxyInfo(address user) external view returns (address);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.4;
interface IMoonCatsRescue {
function acceptAdoptionOffer(bytes5 catId) payable external;
function makeAdoptionOfferToAddress(bytes5 catId, uint price, address to) external;
function giveCat(bytes5 catId, address to) external;
function catOwners(bytes5 catId) external view returns(address);
function rescueOrder(uint256 rescueIndex) external view returns(bytes5 catId);
}{
"evmVersion": "berlin",
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_marketRegistry","type":"address"},{"internalType":"address","name":"_converter","type":"address"},{"internalType":"address","name":"_guardian","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"GOV","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_affiliate","type":"address"}],"name":"addAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"addSponsoredMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"affiliates","outputs":[{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeAllTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"converter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketRegistry","outputs":[{"internalType":"contract MarketRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"tokenAddrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC20Details","name":"erc20Details","type":"tuple"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"internalType":"struct SpecialTransferHelper.ERC721Details[]","name":"erc721Details","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC1155Details[]","name":"erc1155Details","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"conversionData","type":"bytes"}],"internalType":"struct GenieSwap.ConverstionDetails[]","name":"converstionDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"tradeData","type":"bytes"}],"internalType":"struct MarketRegistry.TradeDetails[]","name":"tradeDetails","type":"tuple[]"},{"internalType":"address[]","name":"dustTokens","type":"address[]"},{"internalType":"uint256[2]","name":"feeDetails","type":"uint256[2]"}],"name":"multiAssetSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"tokenAddrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC20Details","name":"erc20Details","type":"tuple"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"internalType":"struct SpecialTransferHelper.ERC721Details[]","name":"erc721Details","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC1155Details[]","name":"erc1155Details","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"conversionData","type":"bytes"}],"internalType":"struct GenieSwap.ConverstionDetails[]","name":"converstionDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"tradeData","type":"bytes"}],"internalType":"struct MarketRegistry.TradeDetails[]","name":"tradeDetails","type":"tuple[]"},{"internalType":"address[]","name":"dustTokens","type":"address[]"},{"internalType":"uint256","name":"sponsoredMarketIndex","type":"uint256"}],"name":"multiAssetSwapWithoutFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openForFreeTrades","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openForTrades","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseFees","type":"uint256"}],"name":"setBaseFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"setConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MarketRegistry","name":"_marketRegistry","type":"address"}],"name":"setMarketRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setOneTimeApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_openForFreeTrades","type":"bool"}],"name":"setOpenForFreeTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_openForTrades","type":"bool"}],"name":"setOpenForTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sponsoredMarkets","outputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_affiliateIndex","type":"uint256"},{"internalType":"address","name":"_affiliate","type":"address"},{"internalType":"bool","name":"_IsActive","type":"bool"}],"name":"updateAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_guardian","type":"address"}],"name":"updateGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketIndex","type":"uint256"},{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"updateSponsoredMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162003951380380620039518339810160408190526200003491620001a3565b6200003f3362000136565b600180805560068054600380546001600160a01b039687166001600160a01b0319918216179091556002805495871695909116949094179093556000600581905561ff001960ff1996861662010000029690961661ff01600160b01b031990941693909317821794909416610100179093556040805180820190915273e43aa28716b0b7531293557d5397f8b12f3f5abc815260208101848152600780549586018155909252517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909301805491511515600160a01b026001600160a81b03199092169390921692909217919091179055620001ec565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200019e57600080fd5b919050565b600080600060608486031215620001b8578283fd5b620001c38462000186565b9250620001d36020850162000186565b9150620001e36040850162000186565b90509250925092565b61375580620001fc6000396000f3fe60806040526004361061021e5760003560e01c80639f2ba09b11610123578063d8579704116100ab578063ecb96fe61161006f578063ecb96fe61461069a578063f0b9e5ba146106c0578063f23a6e61146106eb578063f2fde38b14610718578063fc5253951461073857600080fd5b8063d8579704146105ee578063dad9a7cd1461060e578063ddb382f914610621578063e4dd4b8a14610645578063e6041f9a1461067a57600080fd5b8063b9277963116100f2578063b92779631461054a578063bc197c811461056a578063bd38837b14610599578063c5cadd7f146105b9578063ccf3dc82146105ce57600080fd5b80639f2ba09b146104d0578063a1b62797146104f0578063b19337a41461050a578063b7ce33a21461052a57600080fd5b80633a5750b6116101a65780636335f25e116101755780636335f25e1461043d578063715018a61461045d57806381ea4ea61461047257806383206e80146104925780638da5cb5b146104b257600080fd5b80633a5750b6146103bd578063452a9320146103dd578063565528d7146103fd5780635d799f871461041d57600080fd5b8063150b7a02116101ed578063150b7a02146102c6578063180cb47f1461030b578063186b100c1461034b5780631bd787481461035e57806326e2dca21461039d57600080fd5b806301ffc9a71461022a57806304824e70146102705780630a9254e41461029257806311f85417146102a757600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061025b61024536600461322e565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561027c57600080fd5b5061029061028b366004612e41565b610758565b005b34801561029e57600080fd5b50610290610798565b3480156102b357600080fd5b5060065461025b90610100900460ff1681565b3480156102d257600080fd5b506102f26102e1366004612f72565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610267565b34801561031757600080fd5b5061033373e43aa28716b0b7531293557d5397f8b12f3f5abc81565b6040516001600160a01b039091168152602001610267565b610290610359366004613296565b61094e565b34801561036a57600080fd5b5061037e61037936600461348f565b610a29565b604080516001600160a01b039093168352901515602083015201610267565b3480156103a957600080fd5b506102906103b836600461305b565b610a5e565b3480156103c957600080fd5b506102906103d836600461348f565b610b4d565b3480156103e957600080fd5b50600254610333906001600160a01b031681565b34801561040957600080fd5b506102906104183660046134bf565b610bfc565b34801561042957600080fd5b50610290610438366004612e80565b610ca8565b34801561044957600080fd5b50600454610333906001600160a01b031681565b34801561046957600080fd5b50610290610dd6565b34801561047e57600080fd5b5061029061048d366004612e41565b610e0c565b34801561049e57600080fd5b506102906104ad3660046131f6565b610eaa565b3480156104be57600080fd5b506000546001600160a01b0316610333565b3480156104dc57600080fd5b506102906104eb366004613256565b610ee7565b3480156104fc57600080fd5b5060065461025b9060ff1681565b34801561051657600080fd5b50610290610525366004612e41565b610f93565b34801561053657600080fd5b506102906105453660046130c0565b610fdf565b34801561055657600080fd5b5061029061056536600461348f565b61110d565b34801561057657600080fd5b506102f2610585366004612eb8565b63bc197c8160e01b98975050505050505050565b3480156105a557600080fd5b50600354610333906001600160a01b031681565b3480156105c557600080fd5b5061029061113c565b3480156105da57600080fd5b506102906105e93660046134f5565b611169565b3480156105fa57600080fd5b50610290610609366004612e41565b6111fe565b61029061061c366004613397565b611252565b34801561062d57600080fd5b5061063760055481565b604051908152602001610267565b34801561065157600080fd5b5061066561066036600461348f565b611472565b60408051928352901515602083015201610267565b34801561068657600080fd5b506102906106953660046131f6565b6114a3565b3480156106a657600080fd5b50600654610333906201000090046001600160a01b031681565b3480156106cc57600080fd5b506102f26106db36600461319d565b63785cf2dd60e11b949350505050565b3480156106f757600080fd5b506102f2610706366004612fe2565b63f23a6e6160e01b9695505050505050565b34801561072457600080fd5b50610290610733366004612e41565b6114e7565b34801561074457600080fd5b50610290610753366004612e41565b61157f565b6000546001600160a01b0316331461078b5760405162461bcd60e51b8152600401610782906135ed565b60405180910390fd5b61079581476115cb565b50565b6000546001600160a01b031633146107c25760405162461bcd60e51b8152600401610782906135ed565b73b7f7f6c52f2e2fdb1963eab30438024864c313f66001600160a01b031663ddd81f826040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561081157600080fd5b505af1158015610825573d6000803e3d6000fd5b5050604051631538f65960e31b815230600482015273b7f7f6c52f2e2fdb1963eab30438024864c313f6925063a9c7b2c8915060240160206040518083038186803b15801561087357600080fd5b505afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190612e64565b600480546001600160a01b0319166001600160a01b039290921691909117815560405163a22cb46560e01b815273c3f733ca98e0dad0386979eb96fb1722a1a05e699181019190915260016024820152737c40c393dc0f283f318791d746d894ddd36935729063a22cb46590604401600060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b50505050565b60065460ff166109955760405162461bcd60e51b81526020600482015260126024820152711d1c9859195cc81b9bdd08185b1b1bddd95960721b6044820152606401610782565b600260015414156109e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b60026001556109f681611678565b610a01878787611765565b610a0a84611c07565b610a1383611cbe565b610a1c82611f40565b5050600180555050505050565b60078181548110610a3957600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900460ff1682565b6000546001600160a01b03163314610a885760405162461bcd60e51b8152600401610782906135ed565b60005b82811015610b4657846001600160a01b03166323b872dd3084878786818110610ac457634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610b1b57600080fd5b505af1158015610b2f573d6000803e3d6000fd5b505050508080610b3e906136bf565b915050610a8b565b5050505050565b6000546001600160a01b03163314610b775760405162461bcd60e51b8152600401610782906135ed565b6040805180820190915290815260016020820181815260088054928301815560005291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360029092029182015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4909101805460ff1916911515919091179055565b6000546001600160a01b03163314610c265760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280836001600160a01b0316815260200182151581525060078481548110610c6757634e487b7160e01b600052603260045260246000fd5b600091825260209182902083519101805493909201511515600160a01b026001600160a81b03199093166001600160a01b0390911617919091179055505050565b6000546001600160a01b03163314610cd25760405162461bcd60e51b8152600401610782906135ed565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b158015610d1b57600080fd5b505afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5391906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd19190613212565b505050565b6000546001600160a01b03163314610e005760405162461bcd60e51b8152600401610782906135ed565b610e0a6000612122565b565b6000546001600160a01b03163314610e365760405162461bcd60e51b8152600401610782906135ed565b604080518082019091526001600160a01b03918216815260016020820181815260078054928301815560005291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909101805492511515600160a01b026001600160a81b03199093169190931617179055565b6000546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610782906135ed565b6006805460ff1916911515919091179055565b6000546001600160a01b03163314610f115760405162461bcd60e51b8152600401610782906135ed565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401602060405180830381600087803b158015610f5b57600080fd5b505af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613212565b6000546001600160a01b03163314610fbd5760405162461bcd60e51b8152600401610782906135ed565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110095760405162461bcd60e51b8152600401610782906135ed565b60005b8481101561110457866001600160a01b031663f242432a308489898681811061104557634e487b7160e01b600052603260045260246000fd5b9050602002013588888781811061106c57634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e089901b1681526001600160a01b03968716600482015295909416602486015250604484019190915260209091020135606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b5050505080806110fc906136bf565b91505061100c565b50505050505050565b6000546001600160a01b031633146111375760405162461bcd60e51b8152600401610782906135ed565b600555565b6002546001600160a01b0316336001600160a01b03161461115c57600080fd5b6006805461ffff19169055565b6000546001600160a01b031633146111935760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280838152602001821515815250600884815481106111cb57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600292909202019081559101516001909101805460ff1916911515919091179055505050565b6000546001600160a01b031633146112285760405162461bcd60e51b8152600401610782906135ed565b600680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600654610100900460ff166112a95760405162461bcd60e51b815260206004820152601760248201527f6672656520747261646573206e6f7420616c6c6f7765640000000000000000006044820152606401610782565b600260015414156112fc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b600260018190555060006008828154811061132757634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051808201909152600290920201805482526001015460ff16151591810182905291506113bf5760405162461bcd60e51b815260206004820152603360248201527f6d756c7469417373657453776170576974686f75744665653a20496e416374696044820152721d99481cdc1bdb9cdbdc9959081b585c9ad95d606a1b6064820152608401610782565b6113ca888888611765565b6113d385611c07565b60006113e3858360000151612172565b90508061145a576040805162461bcd60e51b81526020600482015260248101919091527f6d756c7469417373657453776170576974686f75744665653a2074726164657360448201527f20646f206e6f7420696e636c7564652073706f6e736f726564206d61726b65746064820152608401610782565b61146384611f40565b50506001805550505050505050565b6008818154811061148257600080fd5b60009182526020909120600290910201805460019091015490915060ff1682565b6000546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610782906135ed565b600680549115156101000261ff0019909216919091179055565b6000546001600160a01b031633146115115760405162461bcd60e51b8152600401610782906135ed565b6001600160a01b0381166115765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610782565b61079581612122565b6000546001600160a01b031633146115a95760405162461bcd60e51b8152600401610782906135ed565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611618576040519150601f19603f3d011682016040523d82523d6000602084013e61161d565b606091505b5050905080610dd15760405162461bcd60e51b815260206004820152602160248201527f5f7472616e736665724574683a20457468207472616e73666572206661696c656044820152601960fa1b6064820152608401610782565b600554602082015110156116c15760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610782565b602081015115610795578051600780546000929081106116f157634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b900460ff16151591810182905291506117575761175373e43aa28716b0b7531293557d5397f8b12f3f5abc8360015b60200201516115cb565b5050565b805161175390836001611749565b60005b83515181101561187b57835180518290811061179457634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166323b872dd6117b13390565b30876020015185815181106117d657634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561183057600080fd5b505af1158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190613212565b5080611873816136bf565b915050611768565b5060005b8251811015611afc578281815181106118a857634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031673b47e3cd837ddf8e4c57f05d70ab865de6e193bbb6001600160a01b031614156119165761191183828151811061190457634e487b7160e01b600052603260045260246000fd5b6020026020010151612434565b611aea565b82818151811061193657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03167360cd862c9c687a9de49aecdc3a99b74a4fc54ab66001600160a01b0316141561199f5761191183828151811061199257634e487b7160e01b600052603260045260246000fd5b60200260200101516125fe565b60005b8382815181106119c257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015151811015611ae8578382815181106119f657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03166323b872dd611a173390565b30878681518110611a3857634e487b7160e01b600052603260045260246000fd5b6020026020010151604001518581518110611a6357634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050508080611ae0906136bf565b9150506119a2565b505b80611af4816136bf565b91505061187f565b5060005b815181101561094857818181518110611b2957634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316632eb2c2d6611b4a3390565b30858581518110611b6b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151868681518110611b9757634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040518563ffffffff1660e01b8152600401611bc29493929190613595565b600060405180830381600087803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b505050508080611bff906136bf565b915050611b00565b60005b81518110156117535760035482516000916001600160a01b031690849084908110611c4557634e487b7160e01b600052603260045260246000fd5b602002602001015160000151604051611c5e919061355c565b600060405180830381855af49150503d8060008114611c99576040519150601f19603f3d011682016040523d82523d6000602084013e611c9e565b606091505b50509050611cab816127b1565b5080611cb6816136bf565b915050611c0a565b60005b8151811015611753576000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e77868681518110611d1357634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b8152600401611d3d91815260200190565b60606040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d9190613151565b92509250925080611dda5760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b600082611e9857836001600160a01b0316868681518110611e0b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151878781518110611e3757634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611e50919061355c565b60006040518083038185875af1925050503d8060008114611e8d576040519150601f19603f3d011682016040523d82523d6000602084013e611e92565b606091505b50611f1d565b836001600160a01b0316868681518110611ec257634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611edb919061355c565b600060405180830381855af49150503d8060008114611f16576040519150601f19603f3d011682016040523d82523d6000602084013e611f1b565b606091505b505b509050611f29816127b1565b505050508080611f38906136bf565b915050611cc1565b60005b815181101561175357818181518110611f6c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03161415611fb057611fab33476115cb565b612110565b818181518110611fd057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031663a9059cbb611fed3390565b84848151811061200d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561205857600080fd5b505afa15801561206c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209091906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156120d657600080fd5b505af11580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e9190613212565b505b8061211a816136bf565b915050611f43565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000805b835181101561242d57828482815181106121a057634e487b7160e01b600052603260045260246000fd5b60200260200101516000015114156121b757600191505b6000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e7788868151811061220057634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b815260040161222a91815260200190565b60606040518083038186803b15801561224257600080fd5b505afa158015612256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227a9190613151565b925092509250806122c75760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b60008261238557836001600160a01b03168886815181106122f857634e487b7160e01b600052603260045260246000fd5b60200260200101516020015189878151811061232457634e487b7160e01b600052603260045260246000fd5b60200260200101516040015160405161233d919061355c565b60006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5061240a565b836001600160a01b03168886815181106123af57634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040516123c8919061355c565b600060405180830381855af49150503d8060008114612403576040519150601f19603f3d011682016040523d82523d6000602084013e612408565b606091505b505b509050612416816127b1565b505050508080612425906136bf565b915050612176565b5092915050565b60005b81604001515181101561175357600082600001516001600160a01b031663581781688460400151848151811061247d57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016124a391815260200190565b60206040518083038186803b1580156124bb57600080fd5b505afa1580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f39190612e64565b90506001600160a01b038116331461255b5760405162461bcd60e51b815260206004820152602560248201527f5f61636365707443727970746f50756e6b3a20696e76616c69642070756e6b2060448201526437bbb732b960d91b6064820152608401610782565b82600001516001600160a01b0316638264fe988460400151848151811061259257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016125b891815260200190565b600060405180830381600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b505050505080806125f6906136bf565b915050612437565b60005b8160400151518110156117535760006126448360400151838151811061263757634e487b7160e01b600052603260045260246000fd5b60200260200101516127c0565b8351604051633894ca5760e01b81526001600160d81b0319831660048201529192506000916001600160a01b0390911690633894ca579060240160206040518083038186803b15801561269657600080fd5b505afa1580156126aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ce9190612e64565b90506001600160a01b03811633146127365760405162461bcd60e51b815260206004820152602560248201527f5f6163636570744d6f6f6e4361743a20696e76616c6964206d6f6f6e6361742060448201526437bbb732b960d91b6064820152608401610782565b83516040516301be705160e41b81526001600160d81b0319841660048201526001600160a01b0390911690631be7051090602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50505050505080806127a9906136bf565b915050612601565b80610795573d6000803e3d6000fd5b6040805160208082528183019092526000918291906020820181803683375050506020810184815260405191925060059081830190600a8401905b818310156128135780518352602092830192016127fb565b505060058352601f01601f191660405250602001519392505050565b600082601f83011261283f578081fd5b8135602061285461284f8361369c565b61366c565b80838252828201915082860187848660051b8901011115612873578586fd5b855b8581101561289a578135612888816136fc565b84529284019290840190600101612875565b5090979650505050505050565b600082601f8301126128b7578081fd5b813560206128c761284f8361369c565b80838252828201915082860187848660051b89010111156128e6578586fd5b855b8581101561289a5781356001600160401b0380821115612906578889fd5b90890190818b03601f190187131561291c578889fd5b612924613622565b8783013582811115612934578a8bfd5b6129428d8a83870101612d4f565b8252508652505092840192908401906001016128e8565b600082601f830112612969578081fd5b8135602061297961284f8361369c565b80838252828201915082860187848660051b8901011115612998578586fd5b855b8581101561289a5781356001600160401b03808211156129b8578889fd5b908901906060828c03601f19018113156129d057898afd5b6129d861364a565b888401356129e5816136fc565b8152604084810135848111156129f9578c8dfd5b612a078f8c83890101612cb3565b838c015250918401359183831115612a1d578b8cfd5b612a2b8e8b85880101612cb3565b908201528752505050928401929084019060010161299a565b600082601f830112612a54578081fd5b81356020612a6461284f8361369c565b80838252828201915082860187848660051b8901011115612a83578586fd5b855b8581101561289a5781356001600160401b0380821115612aa3578889fd5b908901906060828c03601f1901811315612abb57898afd5b612ac361364a565b88840135612ad0816136fc565b815260408481013584811115612ae4578c8dfd5b612af28f8c8389010161282f565b838c015250918401359183831115612b08578b8cfd5b612b168e8b85880101612cb3565b9082015287525050509284019290840190600101612a85565b600082601f830112612b3f578081fd5b81356020612b4f61284f8361369c565b80838252828201915082860187848660051b8901011115612b6e578586fd5b855b8581101561289a5781356001600160401b0380821115612b8e578889fd5b908901906060828c03601f1901811315612ba657898afd5b612bae61364a565b838901358152604080850135828b0152918401359183831115612bcf578b8cfd5b612bdd8e8b85880101612d4f565b9082015287525050509284019290840190600101612b70565b600082601f830112612c06578081fd5b604051604081018181106001600160401b0382111715612c2857612c286136e6565b8060405250808385604086011115612c3e578384fd5b835b6002811015612c5f578135835260209283019290910190600101612c40565b509195945050505050565b60008083601f840112612c7b578182fd5b5081356001600160401b03811115612c91578182fd5b6020830191508360208260051b8501011115612cac57600080fd5b9250929050565b600082601f830112612cc3578081fd5b81356020612cd361284f8361369c565b80838252828201915082860187848660051b8901011115612cf2578586fd5b855b8581101561289a57813584529284019290840190600101612cf4565b60008083601f840112612d21578182fd5b5081356001600160401b03811115612d37578182fd5b602083019150836020828501011115612cac57600080fd5b600082601f830112612d5f578081fd5b81356001600160401b03811115612d7857612d786136e6565b612d8b601f8201601f191660200161366c565b818152846020838601011115612d9f578283fd5b816020850160208301379081016020019190915292915050565b600060408284031215612dca578081fd5b604051604081016001600160401b038282108183111715612ded57612ded6136e6565b816040528293508435915080821115612e0557600080fd5b612e118683870161282f565b83526020850135915080821115612e2757600080fd5b50612e3485828601612cb3565b6020830152505092915050565b600060208284031215612e52578081fd5b8135612e5d816136fc565b9392505050565b600060208284031215612e75578081fd5b8151612e5d816136fc565b60008060408385031215612e92578081fd5b8235612e9d816136fc565b91506020830135612ead816136fc565b809150509250929050565b60008060008060008060008060a0898b031215612ed3578384fd5b8835612ede816136fc565b97506020890135612eee816136fc565b965060408901356001600160401b0380821115612f09578586fd5b612f158c838d01612c6a565b909850965060608b0135915080821115612f2d578586fd5b612f398c838d01612c6a565b909650945060808b0135915080821115612f51578384fd5b50612f5e8b828c01612d10565b999c989b5096995094979396929594505050565b600080600080600060808688031215612f89578283fd5b8535612f94816136fc565b94506020860135612fa4816136fc565b93506040860135925060608601356001600160401b03811115612fc5578182fd5b612fd188828901612d10565b969995985093965092949392505050565b60008060008060008060a08789031215612ffa578384fd5b8635613005816136fc565b95506020870135613015816136fc565b9450604087013593506060870135925060808701356001600160401b0381111561303d578283fd5b61304989828a01612d10565b979a9699509497509295939492505050565b60008060008060608587031215613070578182fd5b843561307b816136fc565b935060208501356001600160401b03811115613095578283fd5b6130a187828801612c6a565b90945092505060408501356130b5816136fc565b939692955090935050565b600080600080600080608087890312156130d8578384fd5b86356130e3816136fc565b955060208701356001600160401b03808211156130fe578586fd5b61310a8a838b01612c6a565b90975095506040890135915080821115613122578384fd5b5061312f89828a01612c6a565b9094509250506060870135613143816136fc565b809150509295509295509295565b600080600060608486031215613165578081fd5b8351613170816136fc565b602085015190935061318181613711565b604085015190925061319281613711565b809150509250925092565b600080600080606085870312156131b2578182fd5b84356131bd816136fc565b93506020850135925060408501356001600160401b038111156131de578283fd5b6131ea87828801612d10565b95989497509550505050565b600060208284031215613207578081fd5b8135612e5d81613711565b600060208284031215613223578081fd5b8151612e5d81613711565b60006020828403121561323f578081fd5b81356001600160e01b031981168114612e5d578182fd5b60008060006060848603121561326a578081fd5b8335613275816136fc565b92506020840135613285816136fc565b929592945050506040919091013590565b6000806000806000806000610100888a0312156132b1578081fd5b87356001600160401b03808211156132c7578283fd5b6132d38b838c01612db9565b985060208a01359150808211156132e8578283fd5b6132f48b838c01612a44565b975060408a0135915080821115613309578283fd5b6133158b838c01612959565b965060608a013591508082111561332a578283fd5b6133368b838c016128a7565b955060808a013591508082111561334b578283fd5b6133578b838c01612b2f565b945060a08a013591508082111561336c578283fd5b506133798a828b0161282f565b9250506133898960c08a01612bf6565b905092959891949750929550565b600080600080600080600060e0888a0312156133b1578081fd5b87356001600160401b03808211156133c7578283fd5b6133d38b838c01612db9565b985060208a01359150808211156133e8578283fd5b6133f48b838c01612a44565b975060408a0135915080821115613409578283fd5b6134158b838c01612959565b965060608a013591508082111561342a578283fd5b6134368b838c016128a7565b955060808a013591508082111561344b578283fd5b6134578b838c01612b2f565b945060a08a013591508082111561346c578283fd5b506134798a828b0161282f565b92505060c0880135905092959891949750929550565b6000602082840312156134a0578081fd5b5035919050565b6000602082840312156134b8578081fd5b5051919050565b6000806000606084860312156134d3578081fd5b8335925060208401356134e5816136fc565b9150604084013561319281613711565b600080600060608486031215613509578081fd5b8335925060208401359150604084013561319281613711565b6000815180845260208085019450808401835b8381101561355157815187529582019590820190600101613535565b509495945050505050565b60008251815b8181101561357c5760208186018101518583015201613562565b8181111561358a5782828501525b509190910192915050565b6001600160a01b0385811682528416602082015260a0604082018190526000906135c190830185613522565b82810360608401526135d38185613522565b838103608090940193909352508152602001949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051602081016001600160401b0381118282101715613644576136446136e6565b60405290565b604051606081016001600160401b0381118282101715613644576136446136e6565b604051601f8201601f191681016001600160401b0381118282101715613694576136946136e6565b604052919050565b60006001600160401b038211156136b5576136b56136e6565b5060051b60200190565b60006000198214156136df57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079557600080fd5b801515811461079557600080fdfea264697066735822122049f99a43371e601fa6857fe3fa02b1d8f54f9120105565b4c04e9d5de625ab1f64736f6c6343000804003300000000000000000000000003660bce8fb9f76d4b87c406c264e5e70d4186340000000000000000000000006a53e553e2ee4562efda99ba215ed65505faeee8000000000000000000000000073ab1c0cad3677cde9bdb0cdeedc2085c029579
Deployed Bytecode
0x60806040526004361061021e5760003560e01c80639f2ba09b11610123578063d8579704116100ab578063ecb96fe61161006f578063ecb96fe61461069a578063f0b9e5ba146106c0578063f23a6e61146106eb578063f2fde38b14610718578063fc5253951461073857600080fd5b8063d8579704146105ee578063dad9a7cd1461060e578063ddb382f914610621578063e4dd4b8a14610645578063e6041f9a1461067a57600080fd5b8063b9277963116100f2578063b92779631461054a578063bc197c811461056a578063bd38837b14610599578063c5cadd7f146105b9578063ccf3dc82146105ce57600080fd5b80639f2ba09b146104d0578063a1b62797146104f0578063b19337a41461050a578063b7ce33a21461052a57600080fd5b80633a5750b6116101a65780636335f25e116101755780636335f25e1461043d578063715018a61461045d57806381ea4ea61461047257806383206e80146104925780638da5cb5b146104b257600080fd5b80633a5750b6146103bd578063452a9320146103dd578063565528d7146103fd5780635d799f871461041d57600080fd5b8063150b7a02116101ed578063150b7a02146102c6578063180cb47f1461030b578063186b100c1461034b5780631bd787481461035e57806326e2dca21461039d57600080fd5b806301ffc9a71461022a57806304824e70146102705780630a9254e41461029257806311f85417146102a757600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061025b61024536600461322e565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561027c57600080fd5b5061029061028b366004612e41565b610758565b005b34801561029e57600080fd5b50610290610798565b3480156102b357600080fd5b5060065461025b90610100900460ff1681565b3480156102d257600080fd5b506102f26102e1366004612f72565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610267565b34801561031757600080fd5b5061033373e43aa28716b0b7531293557d5397f8b12f3f5abc81565b6040516001600160a01b039091168152602001610267565b610290610359366004613296565b61094e565b34801561036a57600080fd5b5061037e61037936600461348f565b610a29565b604080516001600160a01b039093168352901515602083015201610267565b3480156103a957600080fd5b506102906103b836600461305b565b610a5e565b3480156103c957600080fd5b506102906103d836600461348f565b610b4d565b3480156103e957600080fd5b50600254610333906001600160a01b031681565b34801561040957600080fd5b506102906104183660046134bf565b610bfc565b34801561042957600080fd5b50610290610438366004612e80565b610ca8565b34801561044957600080fd5b50600454610333906001600160a01b031681565b34801561046957600080fd5b50610290610dd6565b34801561047e57600080fd5b5061029061048d366004612e41565b610e0c565b34801561049e57600080fd5b506102906104ad3660046131f6565b610eaa565b3480156104be57600080fd5b506000546001600160a01b0316610333565b3480156104dc57600080fd5b506102906104eb366004613256565b610ee7565b3480156104fc57600080fd5b5060065461025b9060ff1681565b34801561051657600080fd5b50610290610525366004612e41565b610f93565b34801561053657600080fd5b506102906105453660046130c0565b610fdf565b34801561055657600080fd5b5061029061056536600461348f565b61110d565b34801561057657600080fd5b506102f2610585366004612eb8565b63bc197c8160e01b98975050505050505050565b3480156105a557600080fd5b50600354610333906001600160a01b031681565b3480156105c557600080fd5b5061029061113c565b3480156105da57600080fd5b506102906105e93660046134f5565b611169565b3480156105fa57600080fd5b50610290610609366004612e41565b6111fe565b61029061061c366004613397565b611252565b34801561062d57600080fd5b5061063760055481565b604051908152602001610267565b34801561065157600080fd5b5061066561066036600461348f565b611472565b60408051928352901515602083015201610267565b34801561068657600080fd5b506102906106953660046131f6565b6114a3565b3480156106a657600080fd5b50600654610333906201000090046001600160a01b031681565b3480156106cc57600080fd5b506102f26106db36600461319d565b63785cf2dd60e11b949350505050565b3480156106f757600080fd5b506102f2610706366004612fe2565b63f23a6e6160e01b9695505050505050565b34801561072457600080fd5b50610290610733366004612e41565b6114e7565b34801561074457600080fd5b50610290610753366004612e41565b61157f565b6000546001600160a01b0316331461078b5760405162461bcd60e51b8152600401610782906135ed565b60405180910390fd5b61079581476115cb565b50565b6000546001600160a01b031633146107c25760405162461bcd60e51b8152600401610782906135ed565b73b7f7f6c52f2e2fdb1963eab30438024864c313f66001600160a01b031663ddd81f826040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561081157600080fd5b505af1158015610825573d6000803e3d6000fd5b5050604051631538f65960e31b815230600482015273b7f7f6c52f2e2fdb1963eab30438024864c313f6925063a9c7b2c8915060240160206040518083038186803b15801561087357600080fd5b505afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190612e64565b600480546001600160a01b0319166001600160a01b039290921691909117815560405163a22cb46560e01b815273c3f733ca98e0dad0386979eb96fb1722a1a05e699181019190915260016024820152737c40c393dc0f283f318791d746d894ddd36935729063a22cb46590604401600060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b50505050565b60065460ff166109955760405162461bcd60e51b81526020600482015260126024820152711d1c9859195cc81b9bdd08185b1b1bddd95960721b6044820152606401610782565b600260015414156109e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b60026001556109f681611678565b610a01878787611765565b610a0a84611c07565b610a1383611cbe565b610a1c82611f40565b5050600180555050505050565b60078181548110610a3957600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900460ff1682565b6000546001600160a01b03163314610a885760405162461bcd60e51b8152600401610782906135ed565b60005b82811015610b4657846001600160a01b03166323b872dd3084878786818110610ac457634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610b1b57600080fd5b505af1158015610b2f573d6000803e3d6000fd5b505050508080610b3e906136bf565b915050610a8b565b5050505050565b6000546001600160a01b03163314610b775760405162461bcd60e51b8152600401610782906135ed565b6040805180820190915290815260016020820181815260088054928301815560005291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360029092029182015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4909101805460ff1916911515919091179055565b6000546001600160a01b03163314610c265760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280836001600160a01b0316815260200182151581525060078481548110610c6757634e487b7160e01b600052603260045260246000fd5b600091825260209182902083519101805493909201511515600160a01b026001600160a81b03199093166001600160a01b0390911617919091179055505050565b6000546001600160a01b03163314610cd25760405162461bcd60e51b8152600401610782906135ed565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b158015610d1b57600080fd5b505afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5391906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd19190613212565b505050565b6000546001600160a01b03163314610e005760405162461bcd60e51b8152600401610782906135ed565b610e0a6000612122565b565b6000546001600160a01b03163314610e365760405162461bcd60e51b8152600401610782906135ed565b604080518082019091526001600160a01b03918216815260016020820181815260078054928301815560005291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909101805492511515600160a01b026001600160a81b03199093169190931617179055565b6000546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610782906135ed565b6006805460ff1916911515919091179055565b6000546001600160a01b03163314610f115760405162461bcd60e51b8152600401610782906135ed565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401602060405180830381600087803b158015610f5b57600080fd5b505af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613212565b6000546001600160a01b03163314610fbd5760405162461bcd60e51b8152600401610782906135ed565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110095760405162461bcd60e51b8152600401610782906135ed565b60005b8481101561110457866001600160a01b031663f242432a308489898681811061104557634e487b7160e01b600052603260045260246000fd5b9050602002013588888781811061106c57634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e089901b1681526001600160a01b03968716600482015295909416602486015250604484019190915260209091020135606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b5050505080806110fc906136bf565b91505061100c565b50505050505050565b6000546001600160a01b031633146111375760405162461bcd60e51b8152600401610782906135ed565b600555565b6002546001600160a01b0316336001600160a01b03161461115c57600080fd5b6006805461ffff19169055565b6000546001600160a01b031633146111935760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280838152602001821515815250600884815481106111cb57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600292909202019081559101516001909101805460ff1916911515919091179055505050565b6000546001600160a01b031633146112285760405162461bcd60e51b8152600401610782906135ed565b600680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600654610100900460ff166112a95760405162461bcd60e51b815260206004820152601760248201527f6672656520747261646573206e6f7420616c6c6f7765640000000000000000006044820152606401610782565b600260015414156112fc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b600260018190555060006008828154811061132757634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051808201909152600290920201805482526001015460ff16151591810182905291506113bf5760405162461bcd60e51b815260206004820152603360248201527f6d756c7469417373657453776170576974686f75744665653a20496e416374696044820152721d99481cdc1bdb9cdbdc9959081b585c9ad95d606a1b6064820152608401610782565b6113ca888888611765565b6113d385611c07565b60006113e3858360000151612172565b90508061145a576040805162461bcd60e51b81526020600482015260248101919091527f6d756c7469417373657453776170576974686f75744665653a2074726164657360448201527f20646f206e6f7420696e636c7564652073706f6e736f726564206d61726b65746064820152608401610782565b61146384611f40565b50506001805550505050505050565b6008818154811061148257600080fd5b60009182526020909120600290910201805460019091015490915060ff1682565b6000546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610782906135ed565b600680549115156101000261ff0019909216919091179055565b6000546001600160a01b031633146115115760405162461bcd60e51b8152600401610782906135ed565b6001600160a01b0381166115765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610782565b61079581612122565b6000546001600160a01b031633146115a95760405162461bcd60e51b8152600401610782906135ed565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611618576040519150601f19603f3d011682016040523d82523d6000602084013e61161d565b606091505b5050905080610dd15760405162461bcd60e51b815260206004820152602160248201527f5f7472616e736665724574683a20457468207472616e73666572206661696c656044820152601960fa1b6064820152608401610782565b600554602082015110156116c15760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610782565b602081015115610795578051600780546000929081106116f157634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b900460ff16151591810182905291506117575761175373e43aa28716b0b7531293557d5397f8b12f3f5abc8360015b60200201516115cb565b5050565b805161175390836001611749565b60005b83515181101561187b57835180518290811061179457634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166323b872dd6117b13390565b30876020015185815181106117d657634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561183057600080fd5b505af1158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190613212565b5080611873816136bf565b915050611768565b5060005b8251811015611afc578281815181106118a857634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031673b47e3cd837ddf8e4c57f05d70ab865de6e193bbb6001600160a01b031614156119165761191183828151811061190457634e487b7160e01b600052603260045260246000fd5b6020026020010151612434565b611aea565b82818151811061193657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03167360cd862c9c687a9de49aecdc3a99b74a4fc54ab66001600160a01b0316141561199f5761191183828151811061199257634e487b7160e01b600052603260045260246000fd5b60200260200101516125fe565b60005b8382815181106119c257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015151811015611ae8578382815181106119f657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03166323b872dd611a173390565b30878681518110611a3857634e487b7160e01b600052603260045260246000fd5b6020026020010151604001518581518110611a6357634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050508080611ae0906136bf565b9150506119a2565b505b80611af4816136bf565b91505061187f565b5060005b815181101561094857818181518110611b2957634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316632eb2c2d6611b4a3390565b30858581518110611b6b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151868681518110611b9757634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040518563ffffffff1660e01b8152600401611bc29493929190613595565b600060405180830381600087803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b505050508080611bff906136bf565b915050611b00565b60005b81518110156117535760035482516000916001600160a01b031690849084908110611c4557634e487b7160e01b600052603260045260246000fd5b602002602001015160000151604051611c5e919061355c565b600060405180830381855af49150503d8060008114611c99576040519150601f19603f3d011682016040523d82523d6000602084013e611c9e565b606091505b50509050611cab816127b1565b5080611cb6816136bf565b915050611c0a565b60005b8151811015611753576000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e77868681518110611d1357634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b8152600401611d3d91815260200190565b60606040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d9190613151565b92509250925080611dda5760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b600082611e9857836001600160a01b0316868681518110611e0b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151878781518110611e3757634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611e50919061355c565b60006040518083038185875af1925050503d8060008114611e8d576040519150601f19603f3d011682016040523d82523d6000602084013e611e92565b606091505b50611f1d565b836001600160a01b0316868681518110611ec257634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611edb919061355c565b600060405180830381855af49150503d8060008114611f16576040519150601f19603f3d011682016040523d82523d6000602084013e611f1b565b606091505b505b509050611f29816127b1565b505050508080611f38906136bf565b915050611cc1565b60005b815181101561175357818181518110611f6c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03161415611fb057611fab33476115cb565b612110565b818181518110611fd057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031663a9059cbb611fed3390565b84848151811061200d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561205857600080fd5b505afa15801561206c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209091906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156120d657600080fd5b505af11580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e9190613212565b505b8061211a816136bf565b915050611f43565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000805b835181101561242d57828482815181106121a057634e487b7160e01b600052603260045260246000fd5b60200260200101516000015114156121b757600191505b6000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e7788868151811061220057634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b815260040161222a91815260200190565b60606040518083038186803b15801561224257600080fd5b505afa158015612256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227a9190613151565b925092509250806122c75760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b60008261238557836001600160a01b03168886815181106122f857634e487b7160e01b600052603260045260246000fd5b60200260200101516020015189878151811061232457634e487b7160e01b600052603260045260246000fd5b60200260200101516040015160405161233d919061355c565b60006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5061240a565b836001600160a01b03168886815181106123af57634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040516123c8919061355c565b600060405180830381855af49150503d8060008114612403576040519150601f19603f3d011682016040523d82523d6000602084013e612408565b606091505b505b509050612416816127b1565b505050508080612425906136bf565b915050612176565b5092915050565b60005b81604001515181101561175357600082600001516001600160a01b031663581781688460400151848151811061247d57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016124a391815260200190565b60206040518083038186803b1580156124bb57600080fd5b505afa1580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f39190612e64565b90506001600160a01b038116331461255b5760405162461bcd60e51b815260206004820152602560248201527f5f61636365707443727970746f50756e6b3a20696e76616c69642070756e6b2060448201526437bbb732b960d91b6064820152608401610782565b82600001516001600160a01b0316638264fe988460400151848151811061259257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016125b891815260200190565b600060405180830381600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b505050505080806125f6906136bf565b915050612437565b60005b8160400151518110156117535760006126448360400151838151811061263757634e487b7160e01b600052603260045260246000fd5b60200260200101516127c0565b8351604051633894ca5760e01b81526001600160d81b0319831660048201529192506000916001600160a01b0390911690633894ca579060240160206040518083038186803b15801561269657600080fd5b505afa1580156126aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ce9190612e64565b90506001600160a01b03811633146127365760405162461bcd60e51b815260206004820152602560248201527f5f6163636570744d6f6f6e4361743a20696e76616c6964206d6f6f6e6361742060448201526437bbb732b960d91b6064820152608401610782565b83516040516301be705160e41b81526001600160d81b0319841660048201526001600160a01b0390911690631be7051090602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50505050505080806127a9906136bf565b915050612601565b80610795573d6000803e3d6000fd5b6040805160208082528183019092526000918291906020820181803683375050506020810184815260405191925060059081830190600a8401905b818310156128135780518352602092830192016127fb565b505060058352601f01601f191660405250602001519392505050565b600082601f83011261283f578081fd5b8135602061285461284f8361369c565b61366c565b80838252828201915082860187848660051b8901011115612873578586fd5b855b8581101561289a578135612888816136fc565b84529284019290840190600101612875565b5090979650505050505050565b600082601f8301126128b7578081fd5b813560206128c761284f8361369c565b80838252828201915082860187848660051b89010111156128e6578586fd5b855b8581101561289a5781356001600160401b0380821115612906578889fd5b90890190818b03601f190187131561291c578889fd5b612924613622565b8783013582811115612934578a8bfd5b6129428d8a83870101612d4f565b8252508652505092840192908401906001016128e8565b600082601f830112612969578081fd5b8135602061297961284f8361369c565b80838252828201915082860187848660051b8901011115612998578586fd5b855b8581101561289a5781356001600160401b03808211156129b8578889fd5b908901906060828c03601f19018113156129d057898afd5b6129d861364a565b888401356129e5816136fc565b8152604084810135848111156129f9578c8dfd5b612a078f8c83890101612cb3565b838c015250918401359183831115612a1d578b8cfd5b612a2b8e8b85880101612cb3565b908201528752505050928401929084019060010161299a565b600082601f830112612a54578081fd5b81356020612a6461284f8361369c565b80838252828201915082860187848660051b8901011115612a83578586fd5b855b8581101561289a5781356001600160401b0380821115612aa3578889fd5b908901906060828c03601f1901811315612abb57898afd5b612ac361364a565b88840135612ad0816136fc565b815260408481013584811115612ae4578c8dfd5b612af28f8c8389010161282f565b838c015250918401359183831115612b08578b8cfd5b612b168e8b85880101612cb3565b9082015287525050509284019290840190600101612a85565b600082601f830112612b3f578081fd5b81356020612b4f61284f8361369c565b80838252828201915082860187848660051b8901011115612b6e578586fd5b855b8581101561289a5781356001600160401b0380821115612b8e578889fd5b908901906060828c03601f1901811315612ba657898afd5b612bae61364a565b838901358152604080850135828b0152918401359183831115612bcf578b8cfd5b612bdd8e8b85880101612d4f565b9082015287525050509284019290840190600101612b70565b600082601f830112612c06578081fd5b604051604081018181106001600160401b0382111715612c2857612c286136e6565b8060405250808385604086011115612c3e578384fd5b835b6002811015612c5f578135835260209283019290910190600101612c40565b509195945050505050565b60008083601f840112612c7b578182fd5b5081356001600160401b03811115612c91578182fd5b6020830191508360208260051b8501011115612cac57600080fd5b9250929050565b600082601f830112612cc3578081fd5b81356020612cd361284f8361369c565b80838252828201915082860187848660051b8901011115612cf2578586fd5b855b8581101561289a57813584529284019290840190600101612cf4565b60008083601f840112612d21578182fd5b5081356001600160401b03811115612d37578182fd5b602083019150836020828501011115612cac57600080fd5b600082601f830112612d5f578081fd5b81356001600160401b03811115612d7857612d786136e6565b612d8b601f8201601f191660200161366c565b818152846020838601011115612d9f578283fd5b816020850160208301379081016020019190915292915050565b600060408284031215612dca578081fd5b604051604081016001600160401b038282108183111715612ded57612ded6136e6565b816040528293508435915080821115612e0557600080fd5b612e118683870161282f565b83526020850135915080821115612e2757600080fd5b50612e3485828601612cb3565b6020830152505092915050565b600060208284031215612e52578081fd5b8135612e5d816136fc565b9392505050565b600060208284031215612e75578081fd5b8151612e5d816136fc565b60008060408385031215612e92578081fd5b8235612e9d816136fc565b91506020830135612ead816136fc565b809150509250929050565b60008060008060008060008060a0898b031215612ed3578384fd5b8835612ede816136fc565b97506020890135612eee816136fc565b965060408901356001600160401b0380821115612f09578586fd5b612f158c838d01612c6a565b909850965060608b0135915080821115612f2d578586fd5b612f398c838d01612c6a565b909650945060808b0135915080821115612f51578384fd5b50612f5e8b828c01612d10565b999c989b5096995094979396929594505050565b600080600080600060808688031215612f89578283fd5b8535612f94816136fc565b94506020860135612fa4816136fc565b93506040860135925060608601356001600160401b03811115612fc5578182fd5b612fd188828901612d10565b969995985093965092949392505050565b60008060008060008060a08789031215612ffa578384fd5b8635613005816136fc565b95506020870135613015816136fc565b9450604087013593506060870135925060808701356001600160401b0381111561303d578283fd5b61304989828a01612d10565b979a9699509497509295939492505050565b60008060008060608587031215613070578182fd5b843561307b816136fc565b935060208501356001600160401b03811115613095578283fd5b6130a187828801612c6a565b90945092505060408501356130b5816136fc565b939692955090935050565b600080600080600080608087890312156130d8578384fd5b86356130e3816136fc565b955060208701356001600160401b03808211156130fe578586fd5b61310a8a838b01612c6a565b90975095506040890135915080821115613122578384fd5b5061312f89828a01612c6a565b9094509250506060870135613143816136fc565b809150509295509295509295565b600080600060608486031215613165578081fd5b8351613170816136fc565b602085015190935061318181613711565b604085015190925061319281613711565b809150509250925092565b600080600080606085870312156131b2578182fd5b84356131bd816136fc565b93506020850135925060408501356001600160401b038111156131de578283fd5b6131ea87828801612d10565b95989497509550505050565b600060208284031215613207578081fd5b8135612e5d81613711565b600060208284031215613223578081fd5b8151612e5d81613711565b60006020828403121561323f578081fd5b81356001600160e01b031981168114612e5d578182fd5b60008060006060848603121561326a578081fd5b8335613275816136fc565b92506020840135613285816136fc565b929592945050506040919091013590565b6000806000806000806000610100888a0312156132b1578081fd5b87356001600160401b03808211156132c7578283fd5b6132d38b838c01612db9565b985060208a01359150808211156132e8578283fd5b6132f48b838c01612a44565b975060408a0135915080821115613309578283fd5b6133158b838c01612959565b965060608a013591508082111561332a578283fd5b6133368b838c016128a7565b955060808a013591508082111561334b578283fd5b6133578b838c01612b2f565b945060a08a013591508082111561336c578283fd5b506133798a828b0161282f565b9250506133898960c08a01612bf6565b905092959891949750929550565b600080600080600080600060e0888a0312156133b1578081fd5b87356001600160401b03808211156133c7578283fd5b6133d38b838c01612db9565b985060208a01359150808211156133e8578283fd5b6133f48b838c01612a44565b975060408a0135915080821115613409578283fd5b6134158b838c01612959565b965060608a013591508082111561342a578283fd5b6134368b838c016128a7565b955060808a013591508082111561344b578283fd5b6134578b838c01612b2f565b945060a08a013591508082111561346c578283fd5b506134798a828b0161282f565b92505060c0880135905092959891949750929550565b6000602082840312156134a0578081fd5b5035919050565b6000602082840312156134b8578081fd5b5051919050565b6000806000606084860312156134d3578081fd5b8335925060208401356134e5816136fc565b9150604084013561319281613711565b600080600060608486031215613509578081fd5b8335925060208401359150604084013561319281613711565b6000815180845260208085019450808401835b8381101561355157815187529582019590820190600101613535565b509495945050505050565b60008251815b8181101561357c5760208186018101518583015201613562565b8181111561358a5782828501525b509190910192915050565b6001600160a01b0385811682528416602082015260a0604082018190526000906135c190830185613522565b82810360608401526135d38185613522565b838103608090940193909352508152602001949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051602081016001600160401b0381118282101715613644576136446136e6565b60405290565b604051606081016001600160401b0381118282101715613644576136446136e6565b604051601f8201601f191681016001600160401b0381118282101715613694576136946136e6565b604052919050565b60006001600160401b038211156136b5576136b56136e6565b5060051b60200190565b60006000198214156136df57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079557600080fd5b801515811461079557600080fdfea264697066735822122049f99a43371e601fa6857fe3fa02b1d8f54f9120105565b4c04e9d5de625ab1f64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000003660bce8fb9f76d4b87c406c264e5e70d4186340000000000000000000000006a53e553e2ee4562efda99ba215ed65505faeee8000000000000000000000000073ab1c0cad3677cde9bdb0cdeedc2085c029579
-----Decoded View---------------
Arg [0] : _marketRegistry (address): 0x03660bce8Fb9F76d4b87C406c264E5E70D418634
Arg [1] : _converter (address): 0x6a53E553e2eE4562EfDa99bA215Ed65505faEEe8
Arg [2] : _guardian (address): 0x073Ab1C0CAd3677cDe9BDb0cDEEDC2085c029579
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000003660bce8fb9f76d4b87c406c264e5e70d418634
Arg [1] : 0000000000000000000000006a53e553e2ee4562efda99ba215ed65505faeee8
Arg [2] : 000000000000000000000000073ab1c0cad3677cde9bdb0cdeedc2085c029579
Loading...
Loading
Loading...
Loading
Net Worth in USD
$207.28
Net Worth in ETH
0.104818
Token Allocations
BNB
97.97%
AVAX
1.63%
POL
0.40%
Others
0.00%
Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.