Source Code
Showing the last 25 transactions (View Advanced Filter)
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute Sale Eth... | 23508318 | 96 days ago | IN | 1.0175 ETH | 0.00000977 | ||||
| Execute Sale Eth... | 23150996 | 146 days ago | IN | 1.17705 ETH | 0.00001654 | ||||
| Execute Sale Eth... | 22509411 | 236 days ago | IN | 6.956 ETH | 0.00004135 | ||||
| Execute Sale Eth... | 22081239 | 296 days ago | IN | 7.13 ETH | 0.00014453 | ||||
| Execute Sale Eth... | 16688311 | 1051 days ago | IN | 2.35375 ETH | 0.0043355 | ||||
| Execute Sale Eth... | 16665746 | 1054 days ago | IN | 1.00625 ETH | 0.00157142 | ||||
| Execute Sale Eth... | 16585355 | 1065 days ago | IN | 2.0125 ETH | 0.0041346 | ||||
| Execute Sale Eth... | 16255216 | 1112 days ago | IN | 1.3125 ETH | 0.00117266 | ||||
| Execute Sale Eth... | 16144369 | 1127 days ago | IN | 4.41225 ETH | 0.00198631 | ||||
| Execute Sale Eth... | 16034825 | 1142 days ago | IN | 1.3125 ETH | 0.00185807 | ||||
| Execute Sale Eth... | 16024513 | 1144 days ago | IN | 5.24125 ETH | 0.00198667 | ||||
| Execute Sale Eth... | 15964738 | 1152 days ago | IN | 1.17 ETH | 0.00233486 | ||||
| Execute Sale Eth... | 15785356 | 1177 days ago | IN | 1.40875 ETH | 0.00231483 | ||||
| Execute Sale Eth... | 15735645 | 1184 days ago | IN | 1.225 ETH | 0.00208406 | ||||
| Execute Sale Eth... | 15678226 | 1192 days ago | IN | 2.625 ETH | 0.00203556 | ||||
| Execute Sale Eth... | 15488359 | 1220 days ago | IN | 1.05 ETH | 0.00259335 | ||||
| Execute Sale Eth... | 15343671 | 1243 days ago | IN | 4.9875 ETH | 0.00288383 | ||||
| Execute Sale Eth... | 15296816 | 1250 days ago | IN | 2.2325 ETH | 0.00106639 | ||||
| Execute Sale Eth... | 15292488 | 1251 days ago | IN | 2.625 ETH | 0.00063359 | ||||
| Execute Sale Eth... | 15278614 | 1253 days ago | IN | 1.4847875 ETH | 0.00227263 | ||||
| Execute Sale Eth... | 15201885 | 1265 days ago | IN | 1.35 ETH | 0.00069468 | ||||
| Execute Sale Eth... | 15162048 | 1271 days ago | IN | 2.28 ETH | 0.00392997 | ||||
| Execute Sale Eth... | 15160993 | 1271 days ago | IN | 1.3125 ETH | 0.00366909 | ||||
| Execute Sale Eth... | 15105497 | 1280 days ago | IN | 1.134 ETH | 0.00228096 | ||||
| Execute Sale Eth... | 15092346 | 1282 days ago | IN | 12.25 ETH | 0.00116541 |
Showing the last 25 internal transactions (View Advanced Filter)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23508318 | 96 days ago | 1.0175 ETH | ||||
| Transfer | 23150996 | 146 days ago | 1.17705 ETH | ||||
| Transfer | 22509411 | 236 days ago | 6.956 ETH | ||||
| Transfer | 22081239 | 296 days ago | 7.13 ETH | ||||
| Transfer | 16688311 | 1051 days ago | 2.35375 ETH | ||||
| Transfer | 16665746 | 1054 days ago | 1.00625 ETH | ||||
| Transfer | 16585355 | 1065 days ago | 2.0125 ETH | ||||
| Transfer | 16255216 | 1112 days ago | 1.3125 ETH | ||||
| Transfer | 16144369 | 1127 days ago | 4.41225 ETH | ||||
| Transfer | 16034825 | 1142 days ago | 1.3125 ETH | ||||
| Transfer | 16024513 | 1144 days ago | 5.24125 ETH | ||||
| Transfer | 15964738 | 1152 days ago | 1.17 ETH | ||||
| Transfer | 15785356 | 1177 days ago | 1.40875 ETH | ||||
| Transfer | 15735645 | 1184 days ago | 1.225 ETH | ||||
| Transfer | 15678226 | 1192 days ago | 2.625 ETH | ||||
| Transfer | 15488359 | 1220 days ago | 1.05 ETH | ||||
| Transfer | 15343671 | 1243 days ago | 4.9875 ETH | ||||
| Transfer | 15296816 | 1250 days ago | 2.2325 ETH | ||||
| Transfer | 15292488 | 1251 days ago | 2.625 ETH | ||||
| Transfer | 15278614 | 1253 days ago | 1.4847875 ETH | ||||
| Transfer | 15201885 | 1265 days ago | 1.35 ETH | ||||
| Transfer | 15162048 | 1271 days ago | 2.28 ETH | ||||
| Transfer | 15160993 | 1271 days ago | 1.3125 ETH | ||||
| Transfer | 15105497 | 1280 days ago | 1.134 ETH | ||||
| Transfer | 15092346 | 1282 days ago | 12.25 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NiftyExchangeExecutor
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "./single/721/Single721.sol";
import "./single/721/SingleHandler721.sol";
import "./batch/721/Batch721.sol";
import "./batch/721/BatchHandler721.sol";
import "./single/1155/Single1155.sol";
import "./single/1155/SingleHandler1155.sol";
import "./batch/1155/Batch1155.sol";
import "./batch/1155/BatchHandler1155.sol";
import "./switcher/Switcher.sol";
import "./switcher/SwitcherHandler.sol";
/**
* @notice We're hiring Solidity engineers! Let's get nifty!
* https://www.gemini.com/careers/nifty-gateway
*/
contract NiftyExchangeExecutor is Single721,
SingleHandler721,
Batch721,
BatchHandler721,
Single1155,
SingleHandler1155,
Batch1155,
BatchHandler1155,
Switcher,
SwitcherHandler {
constructor(address priceCurrencyUSD_, address recoveryAdmin_, address[] memory validSenders_) ExecutorCore(priceCurrencyUSD_, recoveryAdmin_, validSenders_) {
}
function withdraw(address recipient, uint256 value) external {
_requireOnlyValidSender();
_transferEth(recipient, value);
}
function withdraw20(address tokenContract, address recipient, uint256 amount) external {
_requireOnlyValidSender();
_transfer20(amount, tokenContract, recipient);
}
function withdraw721(address tokenContract, address recipient, uint256 tokenId) external {
_requireOnlyValidSender();
IERC721(tokenContract).safeTransferFrom(address(this), recipient, tokenId);
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract Single721 is ExecutorCore {
/**
* 0
*/
function recordSale721(
uint256 tokenId,
address tokenContract,
uint256 price,
address priceCurrency) external {
_requireOnlyValidSender();
_recordSale721(tokenContract, tokenId, price, priceCurrency);
}
/**
* #1
*/
function executeSaleUsd721(
uint256 tokenId,
address tokenContract,
uint256 price,
address seller,
address buyer) external {
_requireOnlyValidSender();
_transfer721(price, _priceCurrencyUSD, tokenId, tokenContract, seller, buyer);
}
/**
* #2
*/
function executeSaleEth721(
uint256 tokenId,
address tokenContract,
uint256 price,
address seller,
uint256 sellerProceeds,
address buyer) external payable {
_requireOnlyValidSender();
_transfer721(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
_transferEth(seller, sellerProceeds);
}
/**
* #3
*/
function executeSaleToken721(
uint256 tokenId,
address tokenContract,
uint256 price,
address priceCurrency,
address seller,
uint256 sellerProceeds,
address buyer) external {
_requireOnlyValidSender();
_transfer721(price, priceCurrency, tokenId, tokenContract, seller, buyer);
_transfer20(sellerProceeds, priceCurrency, seller);
}
/**
* #4
*/
function executeSaleReceiver1eth721(
uint256 tokenId,
address tokenContract,
uint256 price,
address seller,
uint256 sellerProceeds,
address buyer,
address receiverCreator,
uint256 receiverAmount) external payable {
_requireOnlyValidSender();
_transfer721(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
_transferEth(seller, sellerProceeds);
_transferEth(receiverCreator, receiverAmount);
}
/**
* #5
*/
function executeSaleReceiver1token721(
address receiverCreator,
uint256 receiverAmount,
address priceCurrency,
NiftyEvent calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
_transfer721(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
_transfer20(ne.sellerProceeds, priceCurrency, seller);
_transfer20(receiverAmount, priceCurrency, receiverCreator);
}
/**
* #6
*/
function executeSaleReceiverNeth721(
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
NiftyEvent calldata ne) external payable {
_requireOnlyValidSender();
address seller = ne.seller;
_transfer721(ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, ne.buyer);
_transferEth(seller, ne.sellerProceeds);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transferEth(receiverCreators[i], receiverAmounts[i]);
}
}
/**
* #7
*/
function executeSaleReceiverNtoken721(
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
address priceCurrency,
NiftyEvent calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
_transfer721(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
_transfer20(ne.sellerProceeds, priceCurrency, seller);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract SingleHandler721 is ExecutorCore {
/**
* #2x
*/
function executeSaleEth721handler(
uint256 refund,
uint256 price,
uint256 sellerProceeds,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external payable {
_requireOnlyValidSender();
bool success = _transfer721handler(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
if(success){
_transferEth(seller, sellerProceeds);
} else {
_transferEth(buyer, refund);
}
}
/**
* #3x
*/
function executeSaleToken721handler(
uint256 refund,
uint256 price,
uint256 sellerProceeds,
address priceCurrency,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external {
_requireOnlyValidSender();
bool success = _transfer721handler(price, priceCurrency, tokenId, tokenContract, seller, buyer);
if(success){
_transfer20(sellerProceeds, priceCurrency, seller);
} else {
_transfer20(refund, priceCurrency, buyer);
}
}
/**
* #4x
*/
function executeSaleReceiver1eth721handler(
uint256 refund,
address receiverCreator,
uint256 receiverAmount,
uint256 price,
uint256 sellerProceeds,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external payable {
_requireOnlyValidSender();
bool success = _transfer721handler(price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
if(success){
_transferEth(seller, sellerProceeds);
_transferEth(receiverCreator, receiverAmount);
} else {
_transferEth(buyer, refund);
}
}
/**
* #5x
*/
function executeSaleReceiver1token721handler(
address receiverCreator,
uint256 receiverAmount,
address priceCurrency,
NiftyEventHandler calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
address buyer = ne.buyer;
bool success = _transfer721handler(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, buyer);
if(success){
_transfer20(ne.sellerProceeds, priceCurrency, seller);
_transfer20(receiverAmount, priceCurrency, receiverCreator);
} else {
_transfer20(ne.refund, priceCurrency, buyer);
}
}
/**
* #6x
*/
function executeSaleReceiverNeth721handler(
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
NiftyEventHandler calldata ne) external payable {
_requireOnlyValidSender();
address seller = ne.seller;
address buyer = ne.buyer;
bool success = _transfer721handler(ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, buyer);
if(success){
_transferEth(seller, ne.sellerProceeds);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transferEth(receiverCreators[i], receiverAmounts[i]);
}
} else {
_transferEth(buyer, ne.refund);
}
}
/**
* #7x
*/
function executeSaleReceiverNtoken721handler(
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
address priceCurrency,
NiftyEventHandler calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
address buyer = ne.buyer;
bool success = _transfer721handler(ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, buyer);
if(success){
_transfer20(ne.sellerProceeds, priceCurrency, seller);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
}
} else {
_transfer20(ne.refund, priceCurrency, buyer);
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract Batch721 is ExecutorCore {
/**
* 0
*/
function recordSale721batch(
address[] calldata tokenContract,
uint256[] calldata tokenId,
uint256[] calldata price,
address[] calldata priceCurrency) external {
_requireOnlyValidSender();
for (uint256 i = 0; i < tokenContract.length; i++) {
_recordSale721(tokenContract[i], tokenId[i], price[i], priceCurrency[i]);
}
}
/**
* 1
*/
function executeSaleUsd721batch(
uint256[] calldata price,
uint256[] calldata tokenId,
address[] calldata tokenContract,
address[] calldata seller,
address[] calldata buyer) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < tokenContract.length; i++){
_transfer721(price[i], _priceCurrencyUSD, tokenId[i], tokenContract[i], seller[i], buyer[i]);
}
}
/**
* 2
*/
function executeSaleEth721batch(
uint256[] calldata price,
uint256[] calldata sellerProceeds,
uint256[] calldata tokenId,
address[] calldata tokenContract,
address[] calldata seller,
address[] calldata buyer) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < tokenContract.length; i++){
_transfer721(price[i], _priceCurrencyETH, tokenId[i], tokenContract[i], seller[i], buyer[i]);
_transferEth(seller[i], sellerProceeds[i]);
}
}
/**
* 3
*/
function executeSaleToken721batch(
address[] calldata priceCurrency,
NiftyEvent[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address currency = priceCurrency[i];
_transfer721(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
_transfer20(ne[i].sellerProceeds, currency, seller);
}
}
/**
* 6
*/
function executeSaleReceiverNeth721batch(
address[][] calldata receiverCreators,
uint256[][] calldata receiverAmounts,
NiftyEvent[] calldata ne) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
_transfer721(ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
_transferEth(seller, ne[i].sellerProceeds);
for(uint256 j = 0; j < receiverCreators[i].length; j++){
_transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
}
}
}
/**
* 7
*/
function executeSaleReceiverNtoken721batch(NiftyEventReceiver[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address currency = ne[i].priceCurrency;
_transfer721(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
_transfer20(ne[i].sellerProceeds, currency, seller);
for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
_transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
}
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract BatchHandler721 is ExecutorCore {
/**
* 2
*/
function executeSaleEth721batchHandler(NiftyEventHandler[] calldata ne) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address buyer = ne[i].buyer;
bool success = _transfer721handler(ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transferEth(seller, ne[i].sellerProceeds);
} else {
_transferEth(buyer, ne[i].refund);
}
}
}
/**
* 3
*/
function executeSaleToken721batchHandler(
address[] calldata priceCurrency,
NiftyEventHandler[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address buyer = ne[i].buyer;
address currency = priceCurrency[i];
bool success = _transfer721handler(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transfer20(ne[i].sellerProceeds, currency, seller);
} else {
_transfer20(ne[i].refund, currency, buyer);
}
}
}
/**
* 6
*/
function executeSaleReceiverNeth721batchHandler(
address[][] calldata receiverCreators,
uint256[][] calldata receiverAmounts,
NiftyEventHandler[] calldata ne) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address buyer = ne[i].buyer;
bool success = _transfer721handler(ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transferEth(seller, ne[i].sellerProceeds);
for(uint256 j = 0; j < receiverCreators[i].length; j++){
_transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
}
} else {
_transferEth(buyer, ne[i].refund);
}
}
}
/**
* 7
*/
function executeSaleReceiverNtoken721batchHandler(NiftyEventReceiverHandler[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address currency = ne[i].priceCurrency;
address buyer = ne[i].buyer;
bool success = _transfer721handler(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transfer20(ne[i].sellerProceeds, currency, seller);
for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
_transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
}
} else {
_transfer20(ne[i].refund, currency, buyer);
}
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract Single1155 is ExecutorCore {
/**
* #0.5
*/
function recordSale1155(address tokenContract, uint256 tokenId, uint256 count, uint256 price, address priceCurrency) external {
_requireOnlyValidSender();
_recordSale1155(tokenContract, tokenId, count, price, priceCurrency);
}
/**
* #1.5
*/
function executeSaleUsd1155(
uint256 count,
uint256 price,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external {
_requireOnlyValidSender();
_transfer1155(count, price, _priceCurrencyUSD, tokenId, tokenContract, seller, buyer);
}
/**
* #2.5
*/
function executeSaleEth1155(
uint256 count,
uint256 price,
uint256 sellerProceeds,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external payable {
_requireOnlyValidSender();
_transfer1155(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
_transferEth(seller, sellerProceeds);
}
/**
* #3.5
*/
function executeSaleToken1155(
uint256 count,
uint256 price,
uint256 sellerProceeds,
address priceCurrency,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external {
_requireOnlyValidSender();
_transfer1155(count, price, priceCurrency, tokenId, tokenContract, seller, buyer);
_transfer20(sellerProceeds, priceCurrency, seller);
}
/**
* #4.5
*/
function executeSaleReceiver1eth1155(
uint256 count,
address receiverCreator,
uint256 receiverAmount,
uint256 price,
uint256 sellerProceeds,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external payable {
_requireOnlyValidSender();
_transfer1155(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
_transferEth(seller, sellerProceeds);
_transferEth(receiverCreator, receiverAmount);
}
/**
* #5.5
*/
function executeSaleReceiver1token1155(
uint256 count,
address receiverCreator,
uint256 receiverAmount,
address priceCurrency,
NiftyEvent calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
_transfer1155(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
_transfer20(ne.sellerProceeds, priceCurrency, seller);
_transfer20(receiverAmount, priceCurrency, receiverCreator);
}
/**
* #6.5
*/
function executeSaleReceiverNeth1155(
uint256 count,
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
NiftyEvent calldata ne) external payable {
_requireOnlyValidSender();
address seller = ne.seller;
_transfer1155(count, ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, ne.buyer);
_transferEth(seller, ne.sellerProceeds);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transferEth(receiverCreators[i], receiverAmounts[i]);
}
}
/**
* #7.5
*/
function executeSaleReceiverNtoken1155(
uint256 count,
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
address priceCurrency,
NiftyEvent calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
_transfer1155(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
_transfer20(ne.sellerProceeds, priceCurrency, seller);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract SingleHandler1155 is ExecutorCore {
/**
* #2.5x
*/
function executeSaleEth1155handler(
uint256 count,
uint256 refund,
uint256 price,
uint256 sellerProceeds,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external payable {
_requireOnlyValidSender();
bool success = _transfer1155handler(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
if(success){
_transferEth(seller, sellerProceeds);
} else {
_transferEth(buyer, refund);
}
}
/**
* #3.5x
*/
function executeSaleToken1155handler(
uint256 count,
uint256 refund,
uint256 price,
uint256 sellerProceeds,
address priceCurrency,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external {
_requireOnlyValidSender();
bool success = _transfer1155handler(count, price, priceCurrency, tokenId, tokenContract, seller, buyer);
if(success){
_transfer20(sellerProceeds, priceCurrency, seller);
} else {
_transfer20(refund, priceCurrency, buyer);
}
}
/**
* #4.5x
*/
function executeSaleReceiver1eth1155handler(
uint256 count,
uint256 refund,
address receiverCreator,
uint256 receiverAmount,
uint256 price,
uint256 sellerProceeds,
uint256 tokenId,
address tokenContract,
address seller,
address buyer) external payable {
_requireOnlyValidSender();
bool success = _transfer1155handler(count, price, _priceCurrencyETH, tokenId, tokenContract, seller, buyer);
if(success){
_transferEth(seller, sellerProceeds);
_transferEth(receiverCreator, receiverAmount);
} else {
_transferEth(buyer, refund);
}
}
/**
* #5.5x
*/
function executeSaleReceiver1token1155handler(
uint256 count,
address receiverCreator,
uint256 receiverAmount,
address priceCurrency,
NiftyEventHandler calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
address buyer = ne.buyer;
bool success = _transfer1155handler(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, ne.buyer);
if(success){
_transfer20(ne.sellerProceeds, priceCurrency, seller);
_transfer20(receiverAmount, priceCurrency, receiverCreator);
} else {
_transfer20(ne.refund, priceCurrency, buyer);
}
}
/**
* #6.5x
*/
function executeSaleReceiverNeth1155handler(
uint256 count,
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
NiftyEventHandler calldata ne) external payable {
_requireOnlyValidSender();
address seller = ne.seller;
address buyer = ne.buyer;
bool success = _transfer1155handler(count, ne.price, _priceCurrencyETH, ne.tokenId, ne.tokenContract, seller, ne.buyer);
if(success){
_transferEth(seller, ne.sellerProceeds);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transferEth(receiverCreators[i], receiverAmounts[i]);
}
} else {
_transferEth(buyer, ne.refund);
}
}
/**
* #7.5x
*/
function executeSaleReceiverNtoken1155handler(
uint256 count,
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts,
address priceCurrency,
NiftyEventHandler calldata ne) external {
_requireOnlyValidSender();
address seller = ne.seller;
address buyer = ne.buyer;
bool success = _transfer1155handler(count, ne.price, priceCurrency, ne.tokenId, ne.tokenContract, seller, buyer);
if(success){
_transfer20(ne.sellerProceeds, priceCurrency, seller);
for(uint256 i = 0; i < receiverCreators.length; i++){
_transfer20(receiverAmounts[i], priceCurrency, receiverCreators[i]);
}
} else {
_transfer20(ne.refund, priceCurrency, buyer);
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract Batch1155 is ExecutorCore {
/**
* 0.5
*/
function recordSale1155batch(
uint256[] calldata count,
address[] calldata tokenContract,
uint256[] calldata tokenId,
uint256[] calldata price,
address[] calldata priceCurrency) external {
_requireOnlyValidSender();
for (uint256 i = 0; i < tokenContract.length; i++) {
_recordSale1155(tokenContract[i], tokenId[i], count[i], price[i], priceCurrency[i]);
}
}
/**
* 1.5
*/
function executeSaleUsd1155batch(
uint256[] calldata count,
uint256[] calldata price,
uint256[] calldata tokenId,
address[] calldata tokenContract,
address[] calldata seller,
address[] calldata buyer) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < tokenContract.length; i++){
_transfer1155(count[i], price[i], _priceCurrencyUSD, tokenId[i], tokenContract[i], seller[i], buyer[i]);
}
}
/**
* 2.5
*/
function executeSaleEth1155batch(
uint256[] calldata count,
NiftyEvent[] calldata ne) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
_transfer1155(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, ne[i].seller, ne[i].buyer);
_transferEth(ne[i].seller, ne[i].sellerProceeds);
}
}
/**
* 3.5
*/
function executeSaleToken1155batch(
uint256[] calldata count,
address[] calldata priceCurrency,
NiftyEvent[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address currency = priceCurrency[i];
_transfer1155(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
_transfer20(ne[i].sellerProceeds, currency, seller);
}
}
/**
* 6.5
*/
function executeSaleReceiverNeth1155batch(
uint256[] calldata count,
address[][] calldata receiverCreators,
uint256[][] calldata receiverAmounts,
NiftyEvent[] calldata ne) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
_transfer1155(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
_transferEth(seller, ne[i].sellerProceeds);
for(uint256 j = 0; j < receiverCreators[i].length; j++){
_transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
}
}
}
/**
* 7.5
*/
function executeSaleReceiverNtoken1155batch(uint256[] calldata count, NiftyEventReceiver[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address currency = ne[i].priceCurrency;
_transfer1155(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
_transfer20(ne[i].sellerProceeds, currency, seller);
for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
_transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
}
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../../core/ExecutorCore.sol";
/**
*
*/
abstract contract BatchHandler1155 is ExecutorCore {
/**
* 2.5x
*/
function executeSaleEth1155batchHandler(
uint256[] calldata count,
NiftyEventHandler[] calldata ne) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address buyer = ne[i].buyer;
bool success = _transfer1155handler(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transferEth(seller, ne[i].sellerProceeds);
} else {
_transferEth(buyer, ne[i].refund);
}
}
}
/**
* 3.5x
*/
function executeSaleToken1155batchHandler(
uint256[] calldata count,
address[] calldata priceCurrency,
NiftyEventHandler[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address buyer = ne[i].buyer;
address currency = priceCurrency[i];
bool success = _transfer1155handler(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transfer20(ne[i].sellerProceeds, currency, seller);
} else {
_transfer20(ne[i].refund, currency, buyer);
}
}
}
/**
* 6.5x
*/
function executeSaleReceiverNeth1155batchHandler(
uint256[] calldata count,
address[][] calldata receiverCreators,
uint256[][] calldata receiverAmounts,
NiftyEventHandler[] calldata ne) external payable {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address buyer = ne[i].buyer;
bool success = _transfer1155handler(count[i], ne[i].price, _priceCurrencyETH, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transferEth(seller, ne[i].sellerProceeds);
for(uint256 j = 0; j < receiverCreators[i].length; j++){
_transferEth(receiverCreators[i][j], receiverAmounts[i][j]);
}
} else {
_transferEth(buyer, ne[i].refund);
}
}
}
/**
* 7.5x
*/
function executeSaleReceiverNtoken1155batchHandler(uint256[] calldata count, NiftyEventReceiverHandler[] calldata ne) external {
_requireOnlyValidSender();
for(uint256 i = 0; i < ne.length; i++){
address seller = ne[i].seller;
address currency = ne[i].priceCurrency;
address buyer = ne[i].buyer;
bool success = _transfer1155handler(count[i], ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_transfer20(ne[i].sellerProceeds, currency, seller);
for(uint256 j = 0; j < ne[i].receiverCreators.length; j++){
_transfer20(ne[i].receiverAmounts[j], currency, ne[i].receiverCreators[j]);
}
} else {
_transfer20(ne[i].refund, currency, buyer);
}
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../core/ExecutorCore.sol";
/**
* 721/1155, ETH/USD/ERC-20, & 0/1/N Receivers, w/o refund
*/
abstract contract Switcher is ExecutorCore {
/**
* @dev Takes as input an array of generalized objects, consisting of
* sale events that include tokens of type ERC-721, and ERC-1155. The
* payment may have been made in ETH, USD, or an ERC-20 token. The number
* of royalty receivers can be either 0, 1 or N.
*/
function executeSaleBatch(NiftyEventBatch[] calldata ne) external payable {
_requireOnlyValidSender();
for (uint256 i = 0; i < ne.length; i++) {
address currency = ne[i].priceCurrency;
uint256 sellerProceeds = ne[i].sellerProceeds;
address seller = ne[i].seller;
if(ne[i].count == 0) {
_transfer721(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
} else {
_transfer1155(ne[i].count, ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, ne[i].buyer);
}
_executeSwitcher(currency, sellerProceeds, seller, ne[i].receiverCreators, ne[i].receiverAmounts);
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../core/ExecutorCore.sol";
/**
* 721/1155, ETH/USD/ERC-20, & 0/1/N Receivers, w/ refund
*/
abstract contract SwitcherHandler is ExecutorCore {
/**
* @dev Takes as input an array of generalized objects, consisting of
* sale events that include tokens of type ERC-721, and ERC-1155. The
* payment may have been made in ETH, USD, or an ERC-20 token. The number
* of royalty receivers can be either 0, 1 or N.
*
* @notice In the event the transfer is unsuccessful, the function will
* issue a refund to the buyer in the amount specified by the input 'refund'
* parameter.
*/
function executeSaleBatchHandler(uint256[] calldata refund, NiftyEventBatch[] calldata ne) external payable {
_requireOnlyValidSender();
for (uint256 i = 0; i < ne.length; i++) {
address currency = ne[i].priceCurrency;
uint256 sellerProceeds = ne[i].sellerProceeds;
address seller = ne[i].seller;
address buyer = ne[i].buyer;
if(ne[i].count == 0) {
bool success = _transfer721handler(ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_executeSwitcher(currency, sellerProceeds, seller, ne[i].receiverCreators, ne[i].receiverAmounts);
} else {
_executeRefund(refund[i], currency, buyer);
}
} else {
bool success = _transfer1155handler(ne[i].count, ne[i].price, currency, ne[i].tokenId, ne[i].tokenContract, seller, buyer);
if(success){
_executeSwitcher(currency, sellerProceeds, seller, ne[i].receiverCreators, ne[i].receiverAmounts);
} else {
_executeRefund(refund[i], currency, buyer);
}
}
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "../registry/Registry.sol";
interface IERC1155 {
function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
}
interface IERC721 {
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
}
struct NiftyEvent {
uint256 sellerProceeds;
uint256 price;
uint256 tokenId;
address tokenContract;
address seller;
address buyer;
}
struct NiftyEventHandler {
uint256 refund; ///
uint256 sellerProceeds;
uint256 price;
uint256 tokenId;
address tokenContract;
address seller;
address buyer;
}
struct NiftyEventReceiver {
uint256 sellerProceeds;
uint256 price;
uint256 tokenId;
address tokenContract;
address seller;
address buyer;
address priceCurrency;
address[] receiverCreators;
uint256[] receiverAmounts;
}
struct NiftyEventReceiverHandler {
uint256 refund; ///
uint256 sellerProceeds;
uint256 price;
uint256 tokenId;
address tokenContract;
address seller;
address buyer;
address priceCurrency;
address[] receiverCreators;
uint256[] receiverAmounts;
}
struct NiftyEventBatch {
uint256 tokenId;
uint256 count; /// @notice Value of '0' indicates ERC-721 token
uint256 sellerProceeds; /// @notice Amount remitted to seller
uint256 price;
address priceCurrency; /// @notice Settlement currency (USD, ETH, ERC-20)
address tokenContract;
address seller;
address buyer;
address[] receiverCreators;
uint256[] receiverAmounts;
}
/**
*
*/
abstract contract ExecutorCore is Registry {
address constant public _priceCurrencyETH = address(0);
address immutable public _priceCurrencyUSD;
event NiftySale721(address indexed tokenContract, uint256 tokenId, uint256 price, address priceCurrency);
event NiftySale1155(address indexed tokenContract, uint256 tokenId, uint256 count, uint256 price, address priceCurrency);
constructor(address priceCurrencyUSD_, address recoveryAdmin_, address[] memory validSenders_) Registry(recoveryAdmin_, validSenders_) {
_priceCurrencyUSD = priceCurrencyUSD_;
}
/**
*
*/
function _transferEth(address recipient, uint256 value) internal {
(bool success,) = payable(recipient).call{value: value}("");
require(success, "NiftyExchangeExecutor: Value transfer unsuccessful");
}
function _transfer20(uint256 value, address token, address to) internal {
(bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))));
}
function _transfer721(uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal {
IERC721(tokenContract).safeTransferFrom(seller, buyer, tokenId);
emit NiftySale721(tokenContract, tokenId, price, priceCurrency);
}
function _transfer721handler(uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal returns (bool) {
try IERC721(tokenContract).safeTransferFrom(seller, buyer, tokenId) {
emit NiftySale721(tokenContract, tokenId, price, priceCurrency);
return true;
} catch {
return false;
}
}
function _transfer1155(uint256 count, uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal {
IERC1155(tokenContract).safeTransferFrom(seller, buyer, tokenId, count, "");
emit NiftySale1155(tokenContract, tokenId, count, price, priceCurrency); /// @notice 'price' describes entire purchase.
}
function _transfer1155handler(uint256 count, uint256 price, address priceCurrency, uint256 tokenId, address tokenContract, address seller, address buyer) internal returns (bool) {
try IERC1155(tokenContract).safeTransferFrom(seller, buyer, tokenId, count, "") {
emit NiftySale1155(tokenContract, tokenId, count, price, priceCurrency);
return true;
} catch {
return false;
}
}
function _recordSale721(address tokenContract, uint256 tokenId, uint256 price, address priceCurrency) internal {
emit NiftySale721(tokenContract, tokenId, price, priceCurrency);
}
function _recordSale1155(address tokenContract, uint256 tokenId, uint256 count, uint256 price, address priceCurrency) internal {
emit NiftySale1155(tokenContract, tokenId, count, price, priceCurrency);
}
function _executeSwitcher(
address currency,
uint256 sellerProceeds,
address seller,
address[] calldata receiverCreators,
uint256[] calldata receiverAmounts) internal {
bool eth = currency == _priceCurrencyETH;
if(sellerProceeds > 0){
if(eth){
_transferEth(seller, sellerProceeds);
} else {
_transfer20(sellerProceeds, currency, seller);
}
}
uint256 receiverCount = receiverCreators.length;
if(receiverCount > 0){
for(uint256 i = 0; i < receiverCount; i++){
if(eth){
_transferEth(receiverCreators[i], receiverAmounts[i]);
} else {
_transfer20(receiverAmounts[i], currency, receiverCreators[i]);
}
}
}
}
function _executeRefund(uint256 refund, address currency, address buyer) internal {
if(refund > 0){
if(currency == _priceCurrencyETH) {
_transferEth(buyer, refund);
} else {
_transfer20(refund, currency, buyer);
}
}
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
import "./LockRequestable.sol";
struct AdminUpdateRequest {
address proposed;
}
contract Registry is LockRequestable {
address public custodian;
mapping(bytes32 => AdminUpdateRequest) public custodianChangeReqs;
event CustodianChangeRequested(
bytes32 _lockId,
address _msgSender,
address _proposedCustodian,
uint256 _lockRequestIdx
);
event CustodianChangeConfirmed(bytes32 _lockId, address _newCustodian);
mapping(address => address) public _validSenderSet;
uint256 public setSize;
address constant GUARD = address(1);
mapping(bytes32 => AdminUpdateRequest) public ownerAddReqs;
event ValidSenderAddRequested(
bytes32 _lockId,
address _msgSender,
address _proposed,
uint256 _lockRequestIdx
);
event ValidSenderAddConfirmed(bytes32 _lockId, address _newValidSender);
string internal constant ERROR_INVALID_MSG_SENDER = "Invalid msg.sender";
constructor(address custodian_, address[] memory validSenders_) LockRequestable() {
custodian = custodian_;
_validSenderSet[GUARD] = GUARD;
for(uint256 i = 0; i < validSenders_.length; i++) {
address sender = validSenders_[i];
_addValidSender(sender);
}
}
modifier onlyCustodian {
require(msg.sender == custodian, ERROR_INVALID_MSG_SENDER);
_;
}
function _requireOnlyValidSender() internal view {
require(isValidSender(msg.sender), ERROR_INVALID_MSG_SENDER);
}
function confirmCustodianChange(bytes32 lockId) external onlyCustodian {
custodian = _getRequest(custodianChangeReqs, lockId);
delete custodianChangeReqs[lockId];
emit CustodianChangeConfirmed(lockId, custodian);
}
function confirmValidSenderAdd(bytes32 lockId) external onlyCustodian {
address proposed = _getRequest(ownerAddReqs, lockId);
_addValidSender(proposed);
delete ownerAddReqs[lockId];
emit ValidSenderAddConfirmed(lockId, proposed);
}
function _getRequest(mapping(bytes32 => AdminUpdateRequest) storage _m, bytes32 _lockId) private view returns (address proposed) {
AdminUpdateRequest storage adminRequest = _m[_lockId];
// reject ‘null’ results from the map lookup
// this can only be the case if an unknown `_lockId` is received
require(adminRequest.proposed != address(0), "no such lockId");
return adminRequest.proposed;
}
function _requestChange(mapping(bytes32 => AdminUpdateRequest) storage _m, bytes4 _selector, address _proposed) private returns (bytes32 lockId, uint256 lockRequestIdx) {
require(_proposed != address(0), "zero address");
(bytes32 preLockId, uint256 idx) = generatePreLockId();
lockId = keccak256(
abi.encodePacked(
preLockId,
_selector,
_proposed
)
);
lockRequestIdx = idx;
_m[lockId] = AdminUpdateRequest({
proposed : _proposed
});
}
function requestCustodianChange(address _proposedCustodian) external returns (bytes32 lockId) {
(bytes32 preLockId, uint256 lockRequestIdx) = _requestChange(custodianChangeReqs, this.requestCustodianChange.selector, _proposedCustodian);
emit CustodianChangeRequested(preLockId, msg.sender, _proposedCustodian, lockRequestIdx);
return preLockId;
}
function requestValidSenderAdd(address _sender) external returns (bytes32 lockId) {
(bytes32 preLockId, uint256 lockRequestIdx) = _requestChange(ownerAddReqs, this.requestValidSenderAdd.selector, _sender);
emit ValidSenderAddRequested(preLockId, msg.sender, _sender, lockRequestIdx);
return preLockId;
}
function _getPrevSender(address student) private view returns(address) {
address currentAddress = GUARD;
while(_validSenderSet[currentAddress] != GUARD) {
if (_validSenderSet[currentAddress] == student) {
return currentAddress;
}
currentAddress = _validSenderSet[currentAddress];
}
return address(0);
}
function removeValidSender(address sender) external {
_requireOnlyValidSender();
_removeValidSender(sender);
}
function removeAllValidSenders() external {
_requireOnlyValidSender();
address currentAddress = GUARD;
while(_validSenderSet[currentAddress] != GUARD) {
address sender = _validSenderSet[currentAddress];
_removeValidSender(sender);
}
}
function isValidSender(address sender) public view returns (bool) {
return _validSenderSet[sender] != address(0);
}
function _addValidSender(address sender) private {
require(!isValidSender(sender));
_validSenderSet[sender] = _validSenderSet[GUARD];
_validSenderSet[GUARD] = sender;
setSize++;
}
function _removeValidSender(address sender) private {
address prevSender = _getPrevSender(sender);
_validSenderSet[prevSender] = _validSenderSet[sender];
_validSenderSet[sender] = address(0);
setSize--;
}
function getValidSenderSet() public view returns (address[] memory) {
address[] memory validSenderList = new address[](setSize);
address currentAddress = _validSenderSet[GUARD];
for(uint256 i = 0; currentAddress != GUARD; ++i) {
validSenderList[i] = currentAddress;
currentAddress = _validSenderSet[currentAddress];
}
return validSenderList;
}
}// SPDX-License-Identifier: UNLICENSED
// Copyright (c) 2022 Gemini Trust Company LLC. All Rights Reserved
pragma solidity 0.8.x;
/** @title A contract for generating unique identifiers
*
* @notice A contract that provides a identifier generation scheme,
* guaranteeing uniqueness across all contracts that inherit from it,
* as well as unpredictability of future identifiers.
*
* @dev This contract is intended to be inherited by any contract that
* implements the callback software pattern for cooperative custodianship.
*
* @author Gemini Trust Company, LLC
*/
abstract contract LockRequestable {
// MEMBERS
/// @notice the count of all invocations of `generateLockId`.
uint256 public lockRequestCount;
constructor() {
lockRequestCount = 0;
}
// FUNCTIONS
/** @notice Returns a fresh unique identifier.
*
* @dev the generation scheme uses three components.
* First, the blockhash of the previous block.
* Second, the deployed address.
* Third, the next value of the counter.
* This ensure that identifiers are unique across all contracts
* following this scheme, and that future identifiers are
* unpredictable.
*
* @return preLockId a 32-byte unique identifier.
* @return lockRequestIdx index of lock request
*/
function generatePreLockId() internal returns (bytes32 preLockId, uint256 lockRequestIdx) {
lockRequestIdx = ++lockRequestCount;
preLockId = keccak256(
abi.encodePacked(
blockhash(block.number - 1),
address(this),
lockRequestIdx
)
);
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"priceCurrencyUSD_","type":"address"},{"internalType":"address","name":"recoveryAdmin_","type":"address"},{"internalType":"address[]","name":"validSenders_","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_newCustodian","type":"address"}],"name":"CustodianChangeConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"_proposedCustodian","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockRequestIdx","type":"uint256"}],"name":"CustodianChangeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"priceCurrency","type":"address"}],"name":"NiftySale1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"priceCurrency","type":"address"}],"name":"NiftySale721","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_newValidSender","type":"address"}],"name":"ValidSenderAddConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_lockId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"_proposed","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockRequestIdx","type":"uint256"}],"name":"ValidSenderAddRequested","type":"event"},{"inputs":[],"name":"_priceCurrencyETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_priceCurrencyUSD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_validSenderSet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"name":"confirmCustodianChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"name":"confirmValidSenderAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"custodian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"custodianChangeReqs","outputs":[{"internalType":"address","name":"proposed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventBatch[]","name":"ne","type":"tuple[]"}],"name":"executeSaleBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"refund","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventBatch[]","name":"ne","type":"tuple[]"}],"name":"executeSaleBatchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleEth1155batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleEth1155batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth1155handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"uint256[]","name":"sellerProceeds","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"address[]","name":"seller","type":"address[]"},{"internalType":"address[]","name":"buyer","type":"address[]"}],"name":"executeSaleEth721batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleEth721batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleEth721handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleReceiver1eth1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleReceiver1eth1155handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"}],"name":"executeSaleReceiver1eth721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleReceiver1eth721handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token1155handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiverCreator","type":"address"},{"internalType":"uint256","name":"receiverAmount","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiver1token721handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth1155batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth1155batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth1155handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth721batch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[][]","name":"receiverCreators","type":"address[][]"},{"internalType":"uint256[][]","name":"receiverAmounts","type":"uint256[][]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNeth721batchHandler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNeth721handler","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiver[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiverHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken1155batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken1155handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiver[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"}],"internalType":"struct NiftyEventReceiverHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleReceiverNtoken721batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiverCreators","type":"address[]"},{"internalType":"uint256[]","name":"receiverAmounts","type":"uint256[]"},{"internalType":"address","name":"priceCurrency","type":"address"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler","name":"ne","type":"tuple"}],"name":"executeSaleReceiverNtoken721handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken1155batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken1155handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEvent[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"priceCurrency","type":"address[]"},{"components":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"internalType":"struct NiftyEventHandler[]","name":"ne","type":"tuple[]"}],"name":"executeSaleToken721batchHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"sellerProceeds","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleToken721handler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleUsd1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"address[]","name":"seller","type":"address[]"},{"internalType":"address[]","name":"buyer","type":"address[]"}],"name":"executeSaleUsd1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"}],"name":"executeSaleUsd721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"address[]","name":"seller","type":"address[]"},{"internalType":"address[]","name":"buyer","type":"address[]"}],"name":"executeSaleUsd721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getValidSenderSet","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isValidSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockRequestCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"ownerAddReqs","outputs":[{"internalType":"address","name":"proposed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"}],"name":"recordSale1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"count","type":"uint256[]"},{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"}],"name":"recordSale1155batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"priceCurrency","type":"address"}],"name":"recordSale721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenContract","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"price","type":"uint256[]"},{"internalType":"address[]","name":"priceCurrency","type":"address[]"}],"name":"recordSale721batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAllValidSenders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"removeValidSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proposedCustodian","type":"address"}],"name":"requestCustodianChange","outputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"requestValidSenderAdd","outputs":[{"internalType":"bytes32","name":"lockId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw721","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b5060405162005f5538038062005f558339810160408190526200003491620001d3565b6000808055600180546001600160a01b0385166001600160a01b031991821617825581835260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80549091169091179055839083908390829082905b8151811015620000e6576000828281518110620000b557620000b5620002cd565b60200260200101519050620000d0816200010360201b60201c565b5080620000dd81620002e3565b91505062000094565b5050506001600160a01b03909216608052506200030b9350505050565b6001600160a01b0380821660009081526003602052604090205416156200012957600080fd5b60036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b038381166000818152604081208054939094166001600160a01b0319938416179093556001835283549091161790915560048054916200019883620002e3565b919050555050565b80516001600160a01b0381168114620001b857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620001e957600080fd5b620001f484620001a0565b9250602062000205818601620001a0565b60408601519093506001600160401b03808211156200022357600080fd5b818701915087601f8301126200023857600080fd5b8151818111156200024d576200024d620001bd565b8060051b604051601f19603f83011681018181108582111715620002755762000275620001bd565b60405291825284820192508381018501918a8311156200029457600080fd5b938501935b82851015620002bd57620002ad85620001a0565b8452938501939285019262000299565b8096505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b6000600182016200030457634e487b7160e01b600052601160045260246000fd5b5060010190565b608051615c12620003436000396000818161089801528181611e8501528181612c7101528181612d3e01526131450152615c126000f3fe6080604052600436106103f95760003560e01c80635626283711610213578063cb81fecf11610123578063edb67d47116100ab578063f3fef3a31161007a578063f3fef3a314610b73578063f63c70ba14610b93578063fb4fb88514610bb3578063fc888f2b14610bd3578063fcc4287314610be657600080fd5b8063edb67d4714610ac7578063ee90c99f14610afd578063f01f2b8b14610b13578063f340fe9614610b5e57600080fd5b8063d7234e3b116100f2578063d7234e3b14610a25578063d81e9bdd14610a47578063defe688714610a67578063e570462114610a87578063ec4ee8a414610aa757600080fd5b8063cb81fecf146109a6578063cf6e4488146109bc578063d57ddaf4146109f2578063d6596de114610a0557600080fd5b806394ecbf1e116101a6578063a6f3766211610175578063a6f376621461092d578063b8c1e3e014610940578063b95c065b14610960578063c38766ac14610973578063c63a20151461098657600080fd5b806394ecbf1e146108ba57806397fdef42146108cd5780639d510474146108ed5780639fc1e76a1461090d57600080fd5b806373f24d98116101e257806373f24d981461081057806374ac120a146108465780638203fd4e146108665780638ad38af31461088657600080fd5b806356262837146107c25780635d6c78f2146107d55780635f825129146107e85780637327dc2b146107fb57600080fd5b806335b5f4441161030e5780634192fafb116102a15780634b47c1e5116102705780634b47c1e51461073c5780634d9728261461075c5780634fef0c471461077c5780635109718e1461079c578063519c6348146107af57600080fd5b80634192fafb146106d657806342231c0d146106e957806343f032ea1461070957806347b6c5f11461072957600080fd5b806339de0527116102dd57806339de0527146106635780633a8343ee146106835780633bba9e94146106a35780633dfb94f1146106b657600080fd5b806335b5f444146105d8578063375b74c3146105f85780633768157d14610630578063378710911461065057600080fd5b80632107b563116103915780632df36835116103605780632df3683514610545578063311007a714610565578063355007f914610585578063355588ea146105a5578063358f8592146105b857600080fd5b80632107b563146104df57806327139e94146104ff5780632a613d4c1461051f5780632d0fb04c1461053257600080fd5b80631052e3c1116103cd5780631052e3c114610459578063110b557f1461047957806315b210821461048c5780631e26ac8d146104bf57600080fd5b80628ac4c1146103fe57806306c94014146104205780630a40d0f8146104335780630a90a27514610446575b600080fd5b34801561040a57600080fd5b5061041e6104193660046146ea565b610c06565b005b61041e61042e3660046147c8565b610c99565b61041e610441366004614877565b610e05565b61041e6104543660046148e8565b610f51565b34801561046557600080fd5b5061041e61047436600461496a565b611012565b61041e6104873660046149c9565b6112fe565b34801561049857600080fd5b506104ac6104a7366004614a53565b6113f0565b6040519081526020015b60405180910390f35b3480156104cb57600080fd5b5061041e6104da3660046147c8565b611466565b3480156104eb57600080fd5b5061041e6104fa366004614a75565b6115df565b34801561050b57600080fd5b5061041e61051a366004614ac2565b61164a565b61041e61052d366004614b47565b611692565b61041e610540366004614bbb565b6116cd565b34801561055157600080fd5b5061041e610560366004614bfc565b6117f9565b34801561057157600080fd5b5061041e610580366004614c40565b61184a565b34801561059157600080fd5b5061041e6105a0366004614d30565b61191d565b61041e6105b3366004614d6c565b611989565b3480156105c457600080fd5b5061041e6105d3366004614dc5565b6119c8565b3480156105e457600080fd5b5061041e6105f3366004614dde565b611aab565b34801561060457600080fd5b50600154610618906001600160a01b031681565b6040516001600160a01b0390911681526020016104b6565b34801561063c57600080fd5b5061041e61064b366004614e2e565b611ae1565b61041e61065e366004614d6c565b611ba0565b34801561066f57600080fd5b5061041e61067e366004614eb3565b611bcc565b34801561068f57600080fd5b5061041e61069e366004614dc5565b611be1565b61041e6106b1366004614ef7565b611cb5565b3480156106c257600080fd5b5061041e6106d1366004614fba565b611e76565b61041e6106e436600461500d565b611ead565b3480156106f557600080fd5b5061041e610704366004615077565b611ef1565b34801561071557600080fd5b5061041e610724366004615126565b611f9e565b61041e6107373660046151b4565b61204a565b34801561074857600080fd5b5061041e6107573660046151e9565b612358565b34801561076857600080fd5b5061041e610777366004615224565b612372565b34801561078857600080fd5b5061041e6107973660046152bd565b6124e2565b61041e6107aa366004615342565b612574565b61041e6107bd3660046153c9565b6126c9565b61041e6107d0366004615224565b612742565b61041e6107e3366004615447565b6128b8565b61041e6107f63660046154c2565b6128e3565b34801561080757600080fd5b5061041e6129ff565b34801561081c57600080fd5b5061061861082b366004614dc5565b6005602052600090815260409020546001600160a01b031681565b34801561085257600080fd5b5061041e610861366004614dde565b612a59565b34801561087257600080fd5b5061041e6108813660046155ff565b612a7b565b34801561089257600080fd5b506106187f000000000000000000000000000000000000000000000000000000000000000081565b61041e6108c836600461564c565b612afa565b3480156108d957600080fd5b5061041e6108e83660046154c2565b612c27565b3480156108f957600080fd5b5061041e6109083660046156fb565b612d30565b34801561091957600080fd5b5061041e610928366004614a53565b612d66565b61041e61093b366004615746565b612d77565b34801561094c57600080fd5b5061041e61095b366004614d30565b612dbc565b61041e61096e3660046157d6565b612dcf565b61041e61098136600461500d565b612e78565b34801561099257600080fd5b5061041e6109a13660046151b4565b612e9a565b3480156109b257600080fd5b506104ac60005481565b3480156109c857600080fd5b506106186109d7366004614dc5565b6002602052600090815260409020546001600160a01b031681565b61041e610a0036600461584c565b6130f3565b348015610a1157600080fd5b5061041e610a20366004614c40565b613114565b348015610a3157600080fd5b50610a3a613188565b6040516104b6919061589f565b348015610a5357600080fd5b5061041e610a623660046158ec565b61327b565b348015610a7357600080fd5b5061041e610a8236600461496a565b6132f4565b348015610a9357600080fd5b506104ac610aa2366004614a53565b6134e1565b348015610ab357600080fd5b5061041e610ac23660046151b4565b61354c565b348015610ad357600080fd5b50610618610ae2366004614a53565b6003602052600090815260409020546001600160a01b031681565b348015610b0957600080fd5b506104ac60045481565b348015610b1f57600080fd5b50610b4e610b2e366004614a53565b6001600160a01b0390811660009081526003602052604090205416151590565b60405190151581526020016104b6565b348015610b6a57600080fd5b50610618600081565b348015610b7f57600080fd5b5061041e610b8e36600461597a565b613752565b348015610b9f57600080fd5b5061041e610bae366004615342565b613768565b348015610bbf57600080fd5b5061041e610bce3660046159a4565b6138a1565b61041e610be136600461496a565b6138c2565b348015610bf257600080fd5b5061041e610c01366004614877565b613be8565b610c0e613cf7565b6000610c2060c0830160a08401614a53565b90506000610c3460e0840160c08501614a53565b90506000610c5d6040850135866060870135610c5660a0890160808a01614a53565b8787613d5b565b90508015610c8457610c7484602001358685613e29565b610c7f868689613e29565b610c90565b610c9084358684613e29565b50505050505050565b610ca1613cf7565b60005b81811015610dfe576000838383818110610cc057610cc0615a07565b905060e0020160a0016020810190610cd89190614a53565b90506000848484818110610cee57610cee615a07565b905060e0020160c0016020810190610d069190614a53565b90506000610d91888886818110610d1f57610d1f615a07565b90506020020135878787818110610d3857610d38615a07565b905060e00201604001356000898989818110610d5657610d56615a07565b905060e00201606001358a8a8a818110610d7257610d72615a07565b905060e002016080016020810190610d8a9190614a53565b8888613efa565b90508015610dc357610dbe83878787818110610daf57610daf615a07565b905060e0020160200135613fc9565b610de8565b610de882878787818110610dd957610dd9615a07565b905060e0020160000135613fc9565b5050508080610df690615a33565b915050610ca4565b5050505050565b610e0d613cf7565b60005b81811015610dfe57610ef1858583818110610e2d57610e2d615a07565b90506020020135848484818110610e4657610e46615a07565b905060c00201602001356000868686818110610e6457610e64615a07565b905060c0020160400135878787818110610e8057610e80615a07565b905060c002016060016020810190610e989190614a53565b888888818110610eaa57610eaa615a07565b905060c002016080016020810190610ec29190614a53565b898989818110610ed457610ed4615a07565b905060c0020160a0016020810190610eec9190614a53565b614087565b610f3f838383818110610f0657610f06615a07565b905060c002016080016020810190610f1e9190614a53565b848484818110610f3057610f30615a07565b905060c0020160000135613fc9565b80610f4981615a33565b915050610e10565b610f59613cf7565b6000610f6b60a0830160808401614a53565b9050610fa2602083013560006040850135610f8c6080870160608801614a53565b85610f9d60c0890160a08a01614a53565b614148565b610fad818335613fc9565b60005b85811015610c9057611000878783818110610fcd57610fcd615a07565b9050602002016020810190610fe29190614a53565b868684818110610ff457610ff4615a07565b90506020020135613fc9565b8061100a81615a33565b915050610fb0565b61101a613cf7565b60005b81811015610dfe57600083838381811061103957611039615a07565b905060200281019061104b9190615a4c565b61105c9060c081019060a001614a53565b9050600084848481811061107257611072615a07565b90506020028101906110849190615a4c565b6110969061010081019060e001614a53565b905060008585858181106110ac576110ac615a07565b90506020028101906110be9190615a4c565b6110cf9060e081019060c001614a53565b9050600061117c8989878181106110e8576110e8615a07565b9050602002013588888881811061110157611101615a07565b90506020028101906111139190615a4c565b60400135858a8a8a81811061112a5761112a615a07565b905060200281019061113c9190615a4c565b606001358b8b8b81811061115257611152615a07565b90506020028101906111649190615a4c565b6111759060a0810190608001614a53565b8988613efa565b905080156112b8576111b687878781811061119957611199615a07565b90506020028101906111ab9190615a4c565b602001358486613e29565b60005b8787878181106111cb576111cb615a07565b90506020028101906111dd9190615a4c565b6111ec90610100810190615a6d565b90508110156112b2576112a088888881811061120a5761120a615a07565b905060200281019061121c9190615a4c565b61122b90610120810190615a6d565b8381811061123b5761123b615a07565b90506020020135858a8a8a81811061125557611255615a07565b90506020028101906112679190615a4c565b61127690610100810190615a6d565b8581811061128657611286615a07565b905060200201602081019061129b9190614a53565b613e29565b806112aa81615a33565b9150506111b9565b506112e7565b6112e78787878181106112cd576112cd615a07565b90506020028101906112df9190615a4c565b358484613e29565b5050505080806112f690615a33565b91505061101d565b611306613cf7565b600061131860c0830160a08401614a53565b9050600061132c60e0840160c08501614a53565b9050600061136589604086013583606088013561134f60a08a0160808b01614a53565b8861136060e08c0160c08d01614a53565b613efa565b905080156113da5761137b838560200135613fc9565b60005b878110156113d4576113c289898381811061139b5761139b615a07565b90506020020160208101906113b09190614a53565b888884818110610ff457610ff4615a07565b806113cc81615a33565b91505061137e565b506113e5565b6113e5828535613fc9565b505050505050505050565b600080806114076002630ad9084160e11b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f8286bbf6adfae598c227689d4e361af126e220106aaa15764538028b07f3a0d4906080015b60405180910390a15092915050565b61146e613cf7565b60005b81811015610dfe57600083838381811061148d5761148d615a07565b905060e0020160a00160208101906114a59190614a53565b905060008484848181106114bb576114bb615a07565b905060e0020160c00160208101906114d39190614a53565b905060008787858181106114e9576114e9615a07565b90506020020160208101906114fe9190614a53565b9050600061156f87878781811061151757611517615a07565b905060e00201604001358389898981811061153457611534615a07565b905060e00201606001358a8a8a81811061155057611550615a07565b905060e0020160800160208101906115689190614a53565b8888613d5b565b905080156115a25761159d87878781811061158c5761158c615a07565b905060e00201602001358386613e29565b6115c8565b6115c88787878181106115b7576115b7615a07565b905060e00201600001358385613e29565b5050505080806115d790615a33565b915050611471565b6115e7613cf7565b60006115f960a0830160808401614a53565b905061162b86602084013585604086013561161a6080880160608901614a53565b86610eec60c08a0160a08b01614a53565b61163782358483613e29565b611642848487613e29565b505050505050565b611652613cf7565b60006116638a898888888888613efa565b9050801561167b57611676878785613e29565b611686565b611686898784613e29565b50505050505050505050565b61169a613cf7565b60006116ac8988600088888888613efa565b905080156116c3576116be8387613fc9565b6113e5565b6113e58289613fc9565b6116d5613cf7565b60005b818110156117f45760008383838181106116f4576116f4615a07565b905060e0020160a001602081019061170c9190614a53565b9050600084848481811061172257611722615a07565b905060e0020160c001602081019061173a9190614a53565b905060006117a586868681811061175357611753615a07565b905060e0020160400135600088888881811061177157611771615a07565b905060e002016060013589898981811061178d5761178d615a07565b905060e002016080016020810190610c569190614a53565b905080156117c8576117c383878787818110610daf57610daf615a07565b6117de565b6117de82878787818110610dd957610dd9615a07565b50505080806117ec90615a33565b9150506116d8565b505050565b611801613cf7565b600061181360a0830160808401614a53565b90506118336020830135846040850135610f8c6080870160608801614a53565b61183f82358483613e29565b610dfe848487613e29565b611852613cf7565b60005b87811015611910576118fe89898381811061187257611872615a07565b90506020020160208101906118879190614a53565b88888481811061189957611899615a07565b905060200201358d8d858181106118b2576118b2615a07565b905060200201358888868181106118cb576118cb615a07565b905060200201358787878181106118e4576118e4615a07565b90506020020160208101906118f99190614a53565b6142eb565b8061190881615a33565b915050611855565b5050505050505050505050565b611925613cf7565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390528416906342842e0e90606401600060405180830381600087803b15801561197557600080fd5b505af1158015610c90573d6000803e3d6000fd5b611991613cf7565b60006119a287600087878787613d5b565b905080156119be576119b48387613fc9565b6116768989613fc9565b611686828b613fc9565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611a265760405162461bcd60e51b8152600401611a1d9190615ae2565b60405180910390fd5b506000611a34600583614346565b9050611a3f816143ad565b6000828152600560205260409081902080546001600160a01b0319169055517f3af7a1ac361fdd53acc657b974ce6047460323fcae43e3cb09d2c888dd69219a90611a9f90849084909182526001600160a01b0316602082015260400190565b60405180910390a15050565b611ab3613cf7565b6000611ac3888787878787613d5b565b90508015611ad6576116be878785613e29565b6113e5898784613e29565b611ae9613cf7565b6000611afb60c0830160a08401614a53565b90506000611b0f60e0840160c08501614a53565b90506000611b316040850135866060870135610c5660a0890160808a01614a53565b90508015611b9457611b4884602001358685613e29565b60005b888110156113d457611b82888883818110611b6857611b68615a07565b90506020020135878c8c8581811061128657611286615a07565b80611b8c81615a33565b915050611b4b565b6113e584358684613e29565b611ba8613cf7565b611bb88987600087878787614087565b611bc28286613fc9565b6113e58888613fc9565b611bd4613cf7565b610dfe85858585856142eb565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611c365760405162461bcd60e51b8152600401611a1d9190615ae2565b50611c42600282614346565b600180546001600160a01b03199081166001600160a01b039384161782556000848152600260209081526040918290208054909316909255915482518581529316908301527f9a99272c0f6b7a30ef9e76e684a7cd408bfd4f11a72f36a8e276253c920e442d910160405180910390a150565b611cbd613cf7565b60005b818110156113e5576000838383818110611cdc57611cdc615a07565b905060c002016080016020810190611cf49190614a53565b9050611d898a8a84818110611d0b57611d0b615a07565b90506020020135858585818110611d2457611d24615a07565b905060c00201602001356000878787818110611d4257611d42615a07565b905060c0020160400135888888818110611d5e57611d5e615a07565b905060c002016060016020810190611d769190614a53565b868a8a8a818110610ed457610ed4615a07565b611d9f81858585818110610f3057610f30615a07565b60005b888884818110611db457611db4615a07565b9050602002810190611dc69190615a6d565b9050811015611e6157611e4f898985818110611de457611de4615a07565b9050602002810190611df69190615a6d565b83818110611e0657611e06615a07565b9050602002016020810190611e1b9190614a53565b888886818110611e2d57611e2d615a07565b9050602002810190611e3f9190615a6d565b84818110610ff457610ff4615a07565b80611e5981615a33565b915050611da2565b50508080611e6e90615a33565b915050611cc0565b611e7e613cf7565b61164286867f000000000000000000000000000000000000000000000000000000000000000087878787614087565b611eb5613cf7565b6000611ec687600087878787613d5b565b90508015611edd57611ed88387613fc9565b611ee7565b611ee78289613fc9565b5050505050505050565b611ef9613cf7565b60005b878110156113e557611f8c898983818110611f1957611f19615a07565b9050602002016020810190611f2e9190614a53565b888884818110611f4057611f40615a07565b90506020020135878785818110611f5957611f59615a07565b90506020020135868686818110611f7257611f72615a07565b9050602002016020810190611f879190614a53565b614447565b80611f9681615a33565b915050611efc565b611fa6613cf7565b6000611fb860c0830160a08401614a53565b90506000611fcc60e0840160c08501614a53565b90506000611fef8a6040860135876060880135610d8a60a08a0160808b01614a53565b9050801561203e5761200684602001358685613e29565b60005b8881101561203857612026888883818110611b6857611b68615a07565b8061203081615a33565b915050612009565b50611686565b61168684358684613e29565b612052613cf7565b60005b818110156117f457600083838381811061207157612071615a07565b90506020028101906120839190615a4c565b6120949060a0810190608001614a53565b905060008484848181106120aa576120aa615a07565b90506020028101906120bc9190615a4c565b60400135905060008585858181106120d6576120d6615a07565b90506020028101906120e89190615a4c565b6120f99060e081019060c001614a53565b905085858581811061210d5761210d615a07565b905060200281019061211f9190615a4c565b602001356000036121ec576121e786868681811061213f5761213f615a07565b90506020028101906121519190615a4c565b606001358488888881811061216857612168615a07565b905060200281019061217a9190615a4c565b3589898981811061218d5761218d615a07565b905060200281019061219f9190615a4c565b6121b09060c081019060a001614a53565b858b8b8b8181106121c3576121c3615a07565b90506020028101906121d59190615a4c565b610f9d9061010081019060e001614a53565b6122d1565b6122d186868681811061220157612201615a07565b90506020028101906122139190615a4c565b6020013587878781811061222957612229615a07565b905060200281019061223b9190615a4c565b606001358589898981811061225257612252615a07565b90506020028101906122649190615a4c565b358a8a8a81811061227757612277615a07565b90506020028101906122899190615a4c565b61229a9060c081019060a001614a53565b868c8c8c8181106122ad576122ad615a07565b90506020028101906122bf9190615a4c565b610eec9061010081019060e001614a53565b6123428383838989898181106122e9576122e9615a07565b90506020028101906122fb9190615a4c565b61230a90610100810190615a6d565b8b8b8b81811061231c5761231c615a07565b905060200281019061232e9190615a4c565b61233d90610120810190615a6d565b61449a565b505050808061235090615a33565b915050612055565b612360613cf7565b61236c83858484614447565b50505050565b61237a613cf7565b60005b81811015610c9057600083838381811061239957612399615a07565b905060e0020160a00160208101906123b19190614a53565b905060008484848181106123c7576123c7615a07565b905060e0020160c00160208101906123df9190614a53565b905060008787858181106123f5576123f5615a07565b905060200201602081019061240a9190614a53565b905060006124948b8b8781811061242357612423615a07565b9050602002013588888881811061243c5761243c615a07565b905060e0020160400135848a8a8a81811061245957612459615a07565b905060e00201606001358b8b8b81811061247557612475615a07565b905060e00201608001602081019061248d9190614a53565b8989613efa565b905080156124b6576124b187878781811061158c5761158c615a07565b6124cb565b6124cb8787878181106115b7576115b7615a07565b5050505080806124da90615a33565b91505061237d565b6124ea613cf7565b60006124fc60a0830160808401614a53565b905061251c6020830135846040850135610f8c6080870160608801614a53565b61252882358483613e29565b60005b86811015611ee75761256286868381811061254857612548615a07565b90506020020135858a8a8581811061128657611286615a07565b8061256c81615a33565b91505061252b565b61257c613cf7565b60005b81811015610c9057600083838381811061259b5761259b615a07565b905060c0020160800160208101906125b39190614a53565b90506126478484848181106125ca576125ca615a07565b905060c002016020013560008686868181106125e8576125e8615a07565b905060c002016040013587878781811061260457612604615a07565b905060c00201606001602081019061261c9190614a53565b8589898981811061262f5761262f615a07565b905060c0020160a0016020810190610f9d9190614a53565b61265d81858585818110610f3057610f30615a07565b60005b88888481811061267257612672615a07565b90506020028101906126849190615a6d565b90508110156126b4576126a2898985818110611de457611de4615a07565b806126ac81615a33565b915050612660565b505080806126c190615a33565b91505061257f565b6126d1613cf7565b60006126e360a0830160808401614a53565b90506127058760208401356000604086013561161a6080880160608901614a53565b612710818335613fc9565b60005b85811015611ee757612730878783818110610fcd57610fcd615a07565b8061273a81615a33565b915050612713565b61274a613cf7565b60005b81811015610c9057600083838381811061276957612769615a07565b905060e0020160a00160208101906127819190614a53565b9050600084848481811061279757612797615a07565b905060e0020160c00160208101906127af9190614a53565b905060006127c886868681811061175357611753615a07565b9050801561288c576127e683878787818110610daf57610daf615a07565b60005b8a8a868181106127fb576127fb615a07565b905060200281019061280d9190615a6d565b9050811015612886576128748b8b8781811061282b5761282b615a07565b905060200281019061283d9190615a6d565b8381811061284d5761284d615a07565b90506020020160208101906128629190614a53565b8a8a88818110611e2d57611e2d615a07565b8061287e81615a33565b9150506127e9565b506128a2565b6128a282878787818110610dd957610dd9615a07565b50505080806128b090615a33565b91505061274d565b6128c0613cf7565b6128cf8660008a8a8988614148565b6128d98585613fc9565b611ee78282613fc9565b6128eb613cf7565b60005b858110156129f0576129a28d8d8381811061290b5761290b615a07565b9050602002013560008b8b8581811061292657612926615a07565b905060200201358a8a8681811061293f5761293f615a07565b90506020020160208101906129549190614a53565b89898781811061296657612966615a07565b905060200201602081019061297b9190614a53565b88888881811061298d5761298d615a07565b9050602002016020810190610f9d9190614a53565b6129de8585838181106129b7576129b7615a07565b90506020020160208101906129cc9190614a53565b8c8c84818110610ff457610ff4615a07565b806129e881615a33565b9150506128ee565b50505050505050505050505050565b612a07613cf7565b60015b6001600160a01b0381811660009081526003602052604090205416600114612a56576001600160a01b0380821660009081526003602052604090205416612a508161453e565b50612a0a565b50565b612a61613cf7565b612a7088888787878787614087565b611ee7868684613e29565b612a83613cf7565b6000612a9560c0830160a08401614a53565b90506000612aa960e0840160c08501614a53565b90506000612acc88604086013587606088013561134f60a08a0160808b01614a53565b90508015612aee57612ae384602001358685613e29565b611ed8868689613e29565b611ee784358684613e29565b612b02613cf7565b60005b818110156113e5576000838383818110612b2157612b21615a07565b905060e0020160a0016020810190612b399190614a53565b90506000848484818110612b4f57612b4f615a07565b905060e0020160c0016020810190612b679190614a53565b90506000612b808c8c86818110610d1f57610d1f615a07565b90508015612bfb57612b9e83878787818110610daf57610daf615a07565b60005b8a8a86818110612bb357612bb3615a07565b9050602002810190612bc59190615a6d565b9050811015612bf557612be38b8b8781811061282b5761282b615a07565b80612bed81615a33565b915050612ba1565b50612c11565b612c1182878787818110610dd957610dd9615a07565b5050508080612c1f90615a33565b915050612b05565b612c2f613cf7565b60005b858110156129f057612d1e8d8d83818110612c4f57612c4f615a07565b905060200201358c8c84818110612c6857612c68615a07565b905060200201357f00000000000000000000000000000000000000000000000000000000000000008c8c86818110612ca257612ca2615a07565b905060200201358b8b87818110612cbb57612cbb615a07565b9050602002016020810190612cd09190614a53565b8a8a88818110612ce257612ce2615a07565b9050602002016020810190612cf79190614a53565b898989818110612d0957612d09615a07565b9050602002016020810190610eec9190614a53565b80612d2881615a33565b915050612c32565b612d38613cf7565b610dfe837f000000000000000000000000000000000000000000000000000000000000000087878686614148565b612d6e613cf7565b612a568161453e565b612d7f613cf7565b6000612d918b88600088888888613efa565b90508015612db257612da38387613fc9565b612dad8989613fc9565b611910565b611910828b613fc9565b612dc4613cf7565b6117f4818484613e29565b612dd7613cf7565b6000612de960c0830160a08401614a53565b90506000612dfd60e0840160c08501614a53565b90506000612e1f6040850135826060870135610c5660a0890160808a01614a53565b90508015612e6d57612e35838560200135613fc9565b60005b87811015612e6757612e5589898381811061139b5761139b615a07565b80612e5f81615a33565b915050612e38565b50611ee7565b611ee7828535613fc9565b612e80613cf7565b612e908787600087878787614087565b610c908286613fc9565b612ea2613cf7565b60005b818110156117f4576000838383818110612ec157612ec1615a07565b9050602002810190612ed39190615b15565b612ee49060a0810190608001614a53565b90506000848484818110612efa57612efa615a07565b9050602002810190612f0c9190615b15565b612f1d9060e081019060c001614a53565b9050612fde858585818110612f3457612f34615a07565b9050602002810190612f469190615b15565b6020013582878787818110612f5d57612f5d615a07565b9050602002810190612f6f9190615b15565b60400135888888818110612f8557612f85615a07565b9050602002810190612f979190615b15565b612fa8906080810190606001614a53565b868a8a8a818110612fbb57612fbb615a07565b9050602002810190612fcd9190615b15565b610f9d9060c081019060a001614a53565b61300d858585818110612ff357612ff3615a07565b90506020028101906130059190615b15565b358284613e29565b60005b85858581811061302257613022615a07565b90506020028101906130349190615b15565b6130429060e0810190615a6d565b90508110156130dd576130cb86868681811061306057613060615a07565b90506020028101906130729190615b15565b61308190610100810190615a6d565b8381811061309157613091615a07565b90506020020135838888888181106130ab576130ab615a07565b90506020028101906130bd9190615b15565b6112769060e0810190615a6d565b806130d581615a33565b915050613010565b50505080806130eb90615a33565b915050612ea5565b6130fb613cf7565b61310a84600088888786614148565b6116428383613fc9565b61311c613cf7565b60005b85811015611910576131768b8b8381811061313c5761313c615a07565b905060200201357f00000000000000000000000000000000000000000000000000000000000000008b8b8581811061292657612926615a07565b8061318081615a33565b91505061311f565b606060006004546001600160401b038111156131a6576131a6615b2c565b6040519080825280602002602001820160405280156131cf578160200160208202803683370190505b506001600090815260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c549192506001600160a01b03909116905b6001600160a01b038216600114613273578183828151811061323257613232615a07565b6001600160a01b03928316602091820292909201810191909152928116600090815260039093526040909220549091169061326c81615a33565b905061320e565b509092915050565b613283613cf7565b600061329560a0830160808401614a53565b90506132b688602084013585604086013561161a6080880160608901614a53565b6132c282358483613e29565b60005b868110156113e5576132e286868381811061254857612548615a07565b806132ec81615a33565b9150506132c5565b6132fc613cf7565b60005b81811015610dfe57600083838381811061331b5761331b615a07565b905060200281019061332d9190615b15565b61333e9060a0810190608001614a53565b9050600084848481811061335457613354615a07565b90506020028101906133669190615b15565b6133779060e081019060c001614a53565b905061345187878581811061338e5761338e615a07565b905060200201358686868181106133a7576133a7615a07565b90506020028101906133b99190615b15565b60200135838888888181106133d0576133d0615a07565b90506020028101906133e29190615b15565b604001358989898181106133f8576133f8615a07565b905060200281019061340a9190615b15565b61341b906080810190606001614a53565b878b8b8b81811061342e5761342e615a07565b90506020028101906134409190615b15565b610eec9060c081019060a001614a53565b613466858585818110612ff357612ff3615a07565b60005b85858581811061347b5761347b615a07565b905060200281019061348d9190615b15565b61349b9060e0810190615a6d565b90508110156134cb576134b986868681811061306057613060615a07565b806134c381615a33565b915050613469565b50505080806134d990615a33565b9150506132ff565b600080806134f8600563e570462160e01b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f78f4cea8c2f10b967cb5bf327794223ed6ca8dc8238135f61294f1a114f8afb590608001611457565b613554613cf7565b60005b818110156117f457600083838381811061357357613573615a07565b90506020028101906135859190615a4c565b6135969060c081019060a001614a53565b905060008484848181106135ac576135ac615a07565b90506020028101906135be9190615a4c565b6135d09061010081019060e001614a53565b905060008585858181106135e6576135e6615a07565b90506020028101906135f89190615a4c565b6136099060e081019060c001614a53565b9050600061369d87878781811061362257613622615a07565b90506020028101906136349190615a4c565b604001358489898981811061364b5761364b615a07565b905060200281019061365d9190615a4c565b606001358a8a8a81811061367357613673615a07565b90506020028101906136859190615a4c565b6136969060a0810190608001614a53565b8887613d5b565b90508015613726576136ba87878781811061119957611199615a07565b60005b8787878181106136cf576136cf615a07565b90506020028101906136e19190615a4c565b6136f090610100810190615a6d565b90508110156137205761370e88888881811061120a5761120a615a07565b8061371881615a33565b9150506136bd565b5061373b565b61373b8787878181106112cd576112cd615a07565b50505050808061374a90615a33565b915050613557565b61375a613cf7565b6137648282613fc9565b5050565b613770613cf7565b60005b81811015610c9057600083838381811061378f5761378f615a07565b905060c0020160800160208101906137a79190614a53565b905060008686848181106137bd576137bd615a07565b90506020020160208101906137d29190614a53565b90506138668989858181106137e9576137e9615a07565b9050602002013586868681811061380257613802615a07565b905060c00201602001358388888881811061381f5761381f615a07565b905060c002016040013589898981811061383b5761383b615a07565b905060c0020160600160208101906138539190614a53565b878b8b8b818110610ed457610ed4615a07565b61388c85858581811061387b5761387b615a07565b905060c00201600001358284613e29565b5050808061389990615a33565b915050613773565b6138a9613cf7565b6138b7858589898786614148565b610c90828585613e29565b6138ca613cf7565b60005b81811015610dfe5760008383838181106138e9576138e9615a07565b90506020028101906138fb9190615a4c565b61390c9060a0810190608001614a53565b9050600084848481811061392257613922615a07565b90506020028101906139349190615a4c565b604001359050600085858581811061394e5761394e615a07565b90506020028101906139609190615a4c565b6139719060e081019060c001614a53565b9050600086868681811061398757613987615a07565b90506020028101906139999190615a4c565b6139ab9061010081019060e001614a53565b90508686868181106139bf576139bf615a07565b90506020028101906139d19190615a4c565b60200135600003613ae5576000613a648888888181106139f3576139f3615a07565b9050602002810190613a059190615a4c565b60600135868a8a8a818110613a1c57613a1c615a07565b9050602002810190613a2e9190615a4c565b358b8b8b818110613a4157613a41615a07565b9050602002810190613a539190615a4c565b610c569060c081019060a001614a53565b90508015613abc57613ab78585858b8b8b818110613a8457613a84615a07565b9050602002810190613a969190615a4c565b613aa590610100810190615a6d565b8d8d8d81811061231c5761231c615a07565b613adf565b613adf8a8a88818110613ad157613ad1615a07565b9050602002013586846145a8565b50613bd1565b6000613b95888888818110613afc57613afc615a07565b9050602002810190613b0e9190615a4c565b60200135898989818110613b2457613b24615a07565b9050602002810190613b369190615a4c565b60600135878b8b8b818110613b4d57613b4d615a07565b9050602002810190613b5f9190615a4c565b358c8c8c818110613b7257613b72615a07565b9050602002810190613b849190615a4c565b610d8a9060c081019060a001614a53565b90508015613bba57613bb58585858b8b8b818110613a8457613a84615a07565b613bcf565b613bcf8a8a88818110613ad157613ad1615a07565b505b505050508080613be090615a33565b9150506138cd565b613bf0613cf7565b60005b81811015610dfe576000838383818110613c0f57613c0f615a07565b905060c002016080016020810190613c279190614a53565b90506000868684818110613c3d57613c3d615a07565b9050602002016020810190613c529190614a53565b9050613ccd858585818110613c6957613c69615a07565b905060c002016020013582878787818110613c8657613c86615a07565b905060c0020160400135888888818110613ca257613ca2615a07565b905060c002016060016020810190613cba9190614a53565b868a8a8a81811061262f5761262f615a07565b613ce285858581811061387b5761387b615a07565b50508080613cef90615a33565b915050613bf3565b336000908152600360205260409020546001600160a01b031615156040518060400160405280601281526020017124b73b30b634b21036b9b39739b2b73232b960711b81525090612a565760405162461bcd60e51b8152600401611a1d9190615ae2565b604051632142170760e11b81526001600160a01b038381166004830152828116602483015260448201869052600091908516906342842e0e90606401600060405180830381600087803b158015613db157600080fd5b505af1925050508015613dc2575060015b613dce57506000613e1f565b60408051868152602081018990526001600160a01b03888116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a25060015b9695505050505050565b604080516001600160a01b038381166024830152604480830187905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290861691613e859190615b42565b6000604051808303816000865af19150503d8060008114613ec2576040519150601f19603f3d011682016040523d82523d6000602084013e613ec7565b606091505b5091509150818015613ef1575080511580613ef1575080806020019051810190613ef19190615b54565b610dfe57600080fd5b604051637921219560e11b81526000906001600160a01b0385169063f242432a90613f2f90869086908a908e90600401615b76565b600060405180830381600087803b158015613f4957600080fd5b505af1925050508015613f5a575060015b613f6657506000613fbe565b60408051868152602081018a90529081018890526001600160a01b0387811660608301528516907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25060015b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614016576040519150601f19603f3d011682016040523d82523d6000602084013e61401b565b606091505b50509050806117f45760405162461bcd60e51b815260206004820152603260248201527f4e6966747945786368616e67654578656375746f723a2056616c7565207472616044820152711b9cd9995c881d5b9cdd58d8d95cdcd99d5b60721b6064820152608401611a1d565b604051637921219560e11b81526001600160a01b0384169063f242432a906140b9908590859089908d90600401615b76565b600060405180830381600087803b1580156140d357600080fd5b505af11580156140e7573d6000803e3d6000fd5b505060408051878152602081018b90529081018990526001600160a01b038881166060830152861692507fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c7915060800160405180910390a250505050505050565b604051632142170760e11b81526001600160a01b0383811660048301528281166024830152604482018690528416906342842e0e90606401600060405180830381600087803b15801561419a57600080fd5b505af11580156141ae573d6000803e3d6000fd5b505060408051878152602081018a90526001600160a01b0389811682840152915191871693507ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae925081900360600190a2505050505050565b6000806001600160a01b03831661424f5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401611a1d565b60008061425a6145d1565b604080516020808201949094526001600160e01b031999909916898201526bffffffffffffffffffffffff19606089901b1660448a01528051808a03603801815260588a018083528151918501919091206078909a0182526001600160a01b03988916815260008a81529a909352909820905181546001600160a01b03191696169590951790945550929492505050565b60408051858152602081018590529081018390526001600160a01b0382811660608301528616907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25050505050565b600081815260208390526040812080546001600160a01b031661439c5760405162461bcd60e51b815260206004820152600e60248201526d1b9bc81cdd58da081b1bd8dad25960921b6044820152606401611a1d565b546001600160a01b03169392505050565b6001600160a01b0380821660009081526003602052604090205416156143d257600080fd5b60036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b038381166000818152604081208054939094166001600160a01b03199384161790935560018352835490911617909155600480549161443f83615a33565b919050555050565b60408051848152602081018490526001600160a01b03838116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a250505050565b6001600160a01b0387161586156144cb5780156144c0576144bb8688613fc9565b6144cb565b6144cb878988613e29565b8380156113e55760005b818110156116865782156144fd576144f8878783818110610fcd57610fcd615a07565b61452c565b61452c85858381811061451257614512615a07565b905060200201358b89898581811061128657611286615a07565b8061453681615a33565b9150506144d5565b60006145498261463c565b6001600160a01b03838116600081815260036020526040808220805486861684529183208054929095166001600160a01b0319928316179094559181528254909116909155600480549293509061459f83615bae565b91905055505050565b82156117f4576001600160a01b0382166145c6576117f48184613fc9565b6117f4838383613e29565b60008060008081546145e290615a33565b918290555090506145f4600143615bc5565b60408051914060208301526bffffffffffffffffffffffff193060601b1690820152605481018290526074016040516020818303038152906040528051906020012091509091565b600060015b6001600160a01b03818116600090815260036020526040902054166001146146ad576001600160a01b0381811660009081526003602052604090205481851691160361468d5792915050565b6001600160a01b0390811660009081526003602052604090205416614641565b50600092915050565b80356001600160a01b03811681146146cd57600080fd5b919050565b600060e082840312156146e457600080fd5b50919050565b600080600080610140858703121561470157600080fd5b61470a856146b6565b93506020850135925061471f604086016146b6565b915061472e86606087016146d2565b905092959194509250565b60008083601f84011261474b57600080fd5b5081356001600160401b0381111561476257600080fd5b6020830191508360208260051b850101111561477d57600080fd5b9250929050565b60008083601f84011261479657600080fd5b5081356001600160401b038111156147ad57600080fd5b60208301915083602060e08302850101111561477d57600080fd5b600080600080604085870312156147de57600080fd5b84356001600160401b03808211156147f557600080fd5b61480188838901614739565b9096509450602087013591508082111561481a57600080fd5b5061482787828801614784565b95989497509550505050565b60008083601f84011261484557600080fd5b5081356001600160401b0381111561485c57600080fd5b60208301915083602060c08302850101111561477d57600080fd5b6000806000806040858703121561488d57600080fd5b84356001600160401b03808211156148a457600080fd5b6148b088838901614739565b909650945060208701359150808211156148c957600080fd5b5061482787828801614833565b600060c082840312156146e457600080fd5b6000806000806000610100868803121561490157600080fd5b85356001600160401b038082111561491857600080fd5b61492489838a01614739565b9097509550602088013591508082111561493d57600080fd5b5061494a88828901614739565b909450925061495e905087604088016148d6565b90509295509295909350565b6000806000806040858703121561498057600080fd5b84356001600160401b038082111561499757600080fd5b6149a388838901614739565b909650945060208701359150808211156149bc57600080fd5b5061482787828801614739565b60008060008060008061014087890312156149e357600080fd5b8635955060208701356001600160401b0380821115614a0157600080fd5b614a0d8a838b01614739565b90975095506040890135915080821115614a2657600080fd5b50614a3389828a01614739565b9094509250614a47905088606089016146d2565b90509295509295509295565b600060208284031215614a6557600080fd5b614a6e826146b6565b9392505050565b60008060008060006101408688031215614a8e57600080fd5b85359450614a9e602087016146b6565b935060408601359250614ab3606087016146b6565b915061495e87608088016148d6565b60008060008060008060008060006101208a8c031215614ae157600080fd5b8935985060208a0135975060408a0135965060608a01359550614b0660808b016146b6565b945060a08a01359350614b1b60c08b016146b6565b9250614b2960e08b016146b6565b9150614b386101008b016146b6565b90509295985092959850929598565b600080600080600080600080610100898b031215614b6457600080fd5b8835975060208901359650604089013595506060890135945060808901359350614b9060a08a016146b6565b9250614b9e60c08a016146b6565b9150614bac60e08a016146b6565b90509295985092959890939650565b60008060208385031215614bce57600080fd5b82356001600160401b03811115614be457600080fd5b614bf085828601614784565b90969095509350505050565b6000806000806101208587031215614c1357600080fd5b614c1c856146b6565b935060208501359250614c31604086016146b6565b915061472e86606087016148d6565b60008060008060008060008060008060a08b8d031215614c5f57600080fd5b8a356001600160401b0380821115614c7657600080fd5b614c828e838f01614739565b909c509a5060208d0135915080821115614c9b57600080fd5b614ca78e838f01614739565b909a50985060408d0135915080821115614cc057600080fd5b614ccc8e838f01614739565b909850965060608d0135915080821115614ce557600080fd5b614cf18e838f01614739565b909650945060808d0135915080821115614d0a57600080fd5b50614d178d828e01614739565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215614d4557600080fd5b614d4e846146b6565b9250614d5c602085016146b6565b9150604084013590509250925092565b60008060008060008060008060006101208a8c031215614d8b57600080fd5b89359850614d9b60208b016146b6565b975060408a0135965060608a0135955060808a0135945060a08a01359350614b1b60c08b016146b6565b600060208284031215614dd757600080fd5b5035919050565b600080600080600080600080610100898b031215614dfb57600080fd5b883597506020890135965060408901359550614e1960608a016146b6565b945060808901359350614b9060a08a016146b6565b6000806000806000806101408789031215614e4857600080fd5b86356001600160401b0380821115614e5f57600080fd5b614e6b8a838b01614739565b90985096506020890135915080821115614e8457600080fd5b50614e9189828a01614739565b9095509350614ea49050604088016146b6565b9150614a4788606089016146d2565b600080600080600060a08688031215614ecb57600080fd5b614ed4866146b6565b945060208601359350604086013592506060860135915061495e608087016146b6565b6000806000806000806000806080898b031215614f1357600080fd5b88356001600160401b0380821115614f2a57600080fd5b614f368c838d01614739565b909a50985060208b0135915080821115614f4f57600080fd5b614f5b8c838d01614739565b909850965060408b0135915080821115614f7457600080fd5b614f808c838d01614739565b909650945060608b0135915080821115614f9957600080fd5b50614fa68b828c01614833565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614fd357600080fd5b863595506020870135945060408701359350614ff1606088016146b6565b9250614fff608088016146b6565b9150614a4760a088016146b6565b600080600080600080600060e0888a03121561502857600080fd5b8735965060208801359550604088013594506060880135935061504d608089016146b6565b925061505b60a089016146b6565b915061506960c089016146b6565b905092959891949750929550565b6000806000806000806000806080898b03121561509357600080fd5b88356001600160401b03808211156150aa57600080fd5b6150b68c838d01614739565b909a50985060208b01359150808211156150cf57600080fd5b6150db8c838d01614739565b909850965060408b01359150808211156150f457600080fd5b6151008c838d01614739565b909650945060608b013591508082111561511957600080fd5b50614fa68b828c01614739565b6000806000806000806000610160888a03121561514257600080fd5b8735965060208801356001600160401b038082111561516057600080fd5b61516c8b838c01614739565b909850965060408a013591508082111561518557600080fd5b506151928a828b01614739565b90955093506151a59050606089016146b6565b91506150698960808a016146d2565b600080602083850312156151c757600080fd5b82356001600160401b038111156151dd57600080fd5b614bf085828601614739565b600080600080608085870312156151ff57600080fd5b8435935061520f602086016146b6565b92506040850135915061472e606086016146b6565b6000806000806000806060878903121561523d57600080fd5b86356001600160401b038082111561525457600080fd5b6152608a838b01614739565b9098509650602089013591508082111561527957600080fd5b6152858a838b01614739565b9096509450604089013591508082111561529e57600080fd5b506152ab89828a01614784565b979a9699509497509295939492505050565b60008060008060008061012087890312156152d757600080fd5b86356001600160401b03808211156152ee57600080fd5b6152fa8a838b01614739565b9098509650602089013591508082111561531357600080fd5b5061532089828a01614739565b90955093506153339050604088016146b6565b9150614a4788606089016148d6565b6000806000806000806060878903121561535b57600080fd5b86356001600160401b038082111561537257600080fd5b61537e8a838b01614739565b9098509650602089013591508082111561539757600080fd5b6153a38a838b01614739565b909650945060408901359150808211156153bc57600080fd5b506152ab89828a01614833565b60008060008060008061012087890312156153e357600080fd5b8635955060208701356001600160401b038082111561540157600080fd5b61540d8a838b01614739565b9097509550604089013591508082111561542657600080fd5b5061543389828a01614739565b9094509250614a47905088606089016148d6565b600080600080600080600080610100898b03121561546457600080fd5b8835975061547460208a016146b6565b96506040890135955061548960608a016146b6565b94506080890135935061549e60a08a016146b6565b92506154ac60c08a016146b6565b915060e089013590509295985092959890939650565b60008060008060008060008060008060008060c08d8f0312156154e457600080fd5b6001600160401b038d3511156154f957600080fd5b6155068e8e358f01614739565b909c509a506001600160401b0360208e0135111561552357600080fd5b6155338e60208f01358f01614739565b909a5098506001600160401b0360408e0135111561555057600080fd5b6155608e60408f01358f01614739565b90985096506001600160401b0360608e0135111561557d57600080fd5b61558d8e60608f01358f01614739565b90965094506001600160401b0360808e013511156155aa57600080fd5b6155ba8e60808f01358f01614739565b90945092506001600160401b0360a08e013511156155d757600080fd5b6155e78e60a08f01358f01614739565b81935080925050509295989b509295989b509295989b565b6000806000806000610160868803121561561857600080fd5b85359450615628602087016146b6565b93506040860135925061563d606087016146b6565b915061495e87608088016146d2565b6000806000806000806000806080898b03121561566857600080fd5b88356001600160401b038082111561567f57600080fd5b61568b8c838d01614739565b909a50985060208b01359150808211156156a457600080fd5b6156b08c838d01614739565b909850965060408b01359150808211156156c957600080fd5b6156d58c838d01614739565b909650945060608b01359150808211156156ee57600080fd5b50614fa68b828c01614784565b600080600080600060a0868803121561571357600080fd5b85359450615723602087016146b6565b935060408601359250615738606087016146b6565b915061495e608087016146b6565b6000806000806000806000806000806101408b8d03121561576657600080fd5b8a35995060208b0135985061577d60408c016146b6565b975060608b0135965060808b0135955060a08b0135945060c08b013593506157a760e08c016146b6565b92506157b66101008c016146b6565b91506157c56101208c016146b6565b90509295989b9194979a5092959850565b600080600080600061012086880312156157ef57600080fd5b85356001600160401b038082111561580657600080fd5b61581289838a01614739565b9097509550602088013591508082111561582b57600080fd5b5061583888828901614739565b909450925061495e905087604088016146d2565b60008060008060008060c0878903121561586557600080fd5b86359550615875602088016146b6565b94506040870135935061588a606088016146b6565b925060808701359150614a4760a088016146b6565b6020808252825182820181905260009190848201906040850190845b818110156158e05783516001600160a01b0316835292840192918401916001016158bb565b50909695505050505050565b6000806000806000806000610140888a03121561590857600080fd5b8735965060208801356001600160401b038082111561592657600080fd5b6159328b838c01614739565b909850965060408a013591508082111561594b57600080fd5b506159588a828b01614739565b909550935061596b9050606089016146b6565b91506150698960808a016148d6565b6000806040838503121561598d57600080fd5b615996836146b6565b946020939093013593505050565b600080600080600080600060e0888a0312156159bf57600080fd5b873596506159cf602089016146b6565b9550604088013594506159e4606089016146b6565b93506159f2608089016146b6565b925060a0880135915061506960c089016146b6565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201615a4557615a45615a1d565b5060010190565b6000823561013e19833603018112615a6357600080fd5b9190910192915050565b6000808335601e19843603018112615a8457600080fd5b8301803591506001600160401b03821115615a9e57600080fd5b6020019150600581901b360382131561477d57600080fd5b60005b83811015615ad1578181015183820152602001615ab9565b8381111561236c5750506000910152565b6020815260008251806020840152615b01816040850160208701615ab6565b601f01601f19169190910160400192915050565b6000823561011e19833603018112615a6357600080fd5b634e487b7160e01b600052604160045260246000fd5b60008251615a63818460208701615ab6565b600060208284031215615b6657600080fd5b81518015158114614a6e57600080fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b600081615bbd57615bbd615a1d565b506000190190565b600082821015615bd757615bd7615a1d565b50039056fea26469706673582212202582ff801306017998602c5bef74a95c4c34ab09dd9cfbba4a20f12a0894e02e64736f6c634300080d00330000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc70000000000000000000000008fe2f09f3684284e15822285d444c13d2cb992100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000015f8733104b67f17158c417d32172eea56c3b61d
Deployed Bytecode
0x6080604052600436106103f95760003560e01c80635626283711610213578063cb81fecf11610123578063edb67d47116100ab578063f3fef3a31161007a578063f3fef3a314610b73578063f63c70ba14610b93578063fb4fb88514610bb3578063fc888f2b14610bd3578063fcc4287314610be657600080fd5b8063edb67d4714610ac7578063ee90c99f14610afd578063f01f2b8b14610b13578063f340fe9614610b5e57600080fd5b8063d7234e3b116100f2578063d7234e3b14610a25578063d81e9bdd14610a47578063defe688714610a67578063e570462114610a87578063ec4ee8a414610aa757600080fd5b8063cb81fecf146109a6578063cf6e4488146109bc578063d57ddaf4146109f2578063d6596de114610a0557600080fd5b806394ecbf1e116101a6578063a6f3766211610175578063a6f376621461092d578063b8c1e3e014610940578063b95c065b14610960578063c38766ac14610973578063c63a20151461098657600080fd5b806394ecbf1e146108ba57806397fdef42146108cd5780639d510474146108ed5780639fc1e76a1461090d57600080fd5b806373f24d98116101e257806373f24d981461081057806374ac120a146108465780638203fd4e146108665780638ad38af31461088657600080fd5b806356262837146107c25780635d6c78f2146107d55780635f825129146107e85780637327dc2b146107fb57600080fd5b806335b5f4441161030e5780634192fafb116102a15780634b47c1e5116102705780634b47c1e51461073c5780634d9728261461075c5780634fef0c471461077c5780635109718e1461079c578063519c6348146107af57600080fd5b80634192fafb146106d657806342231c0d146106e957806343f032ea1461070957806347b6c5f11461072957600080fd5b806339de0527116102dd57806339de0527146106635780633a8343ee146106835780633bba9e94146106a35780633dfb94f1146106b657600080fd5b806335b5f444146105d8578063375b74c3146105f85780633768157d14610630578063378710911461065057600080fd5b80632107b563116103915780632df36835116103605780632df3683514610545578063311007a714610565578063355007f914610585578063355588ea146105a5578063358f8592146105b857600080fd5b80632107b563146104df57806327139e94146104ff5780632a613d4c1461051f5780632d0fb04c1461053257600080fd5b80631052e3c1116103cd5780631052e3c114610459578063110b557f1461047957806315b210821461048c5780631e26ac8d146104bf57600080fd5b80628ac4c1146103fe57806306c94014146104205780630a40d0f8146104335780630a90a27514610446575b600080fd5b34801561040a57600080fd5b5061041e6104193660046146ea565b610c06565b005b61041e61042e3660046147c8565b610c99565b61041e610441366004614877565b610e05565b61041e6104543660046148e8565b610f51565b34801561046557600080fd5b5061041e61047436600461496a565b611012565b61041e6104873660046149c9565b6112fe565b34801561049857600080fd5b506104ac6104a7366004614a53565b6113f0565b6040519081526020015b60405180910390f35b3480156104cb57600080fd5b5061041e6104da3660046147c8565b611466565b3480156104eb57600080fd5b5061041e6104fa366004614a75565b6115df565b34801561050b57600080fd5b5061041e61051a366004614ac2565b61164a565b61041e61052d366004614b47565b611692565b61041e610540366004614bbb565b6116cd565b34801561055157600080fd5b5061041e610560366004614bfc565b6117f9565b34801561057157600080fd5b5061041e610580366004614c40565b61184a565b34801561059157600080fd5b5061041e6105a0366004614d30565b61191d565b61041e6105b3366004614d6c565b611989565b3480156105c457600080fd5b5061041e6105d3366004614dc5565b6119c8565b3480156105e457600080fd5b5061041e6105f3366004614dde565b611aab565b34801561060457600080fd5b50600154610618906001600160a01b031681565b6040516001600160a01b0390911681526020016104b6565b34801561063c57600080fd5b5061041e61064b366004614e2e565b611ae1565b61041e61065e366004614d6c565b611ba0565b34801561066f57600080fd5b5061041e61067e366004614eb3565b611bcc565b34801561068f57600080fd5b5061041e61069e366004614dc5565b611be1565b61041e6106b1366004614ef7565b611cb5565b3480156106c257600080fd5b5061041e6106d1366004614fba565b611e76565b61041e6106e436600461500d565b611ead565b3480156106f557600080fd5b5061041e610704366004615077565b611ef1565b34801561071557600080fd5b5061041e610724366004615126565b611f9e565b61041e6107373660046151b4565b61204a565b34801561074857600080fd5b5061041e6107573660046151e9565b612358565b34801561076857600080fd5b5061041e610777366004615224565b612372565b34801561078857600080fd5b5061041e6107973660046152bd565b6124e2565b61041e6107aa366004615342565b612574565b61041e6107bd3660046153c9565b6126c9565b61041e6107d0366004615224565b612742565b61041e6107e3366004615447565b6128b8565b61041e6107f63660046154c2565b6128e3565b34801561080757600080fd5b5061041e6129ff565b34801561081c57600080fd5b5061061861082b366004614dc5565b6005602052600090815260409020546001600160a01b031681565b34801561085257600080fd5b5061041e610861366004614dde565b612a59565b34801561087257600080fd5b5061041e6108813660046155ff565b612a7b565b34801561089257600080fd5b506106187f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc781565b61041e6108c836600461564c565b612afa565b3480156108d957600080fd5b5061041e6108e83660046154c2565b612c27565b3480156108f957600080fd5b5061041e6109083660046156fb565b612d30565b34801561091957600080fd5b5061041e610928366004614a53565b612d66565b61041e61093b366004615746565b612d77565b34801561094c57600080fd5b5061041e61095b366004614d30565b612dbc565b61041e61096e3660046157d6565b612dcf565b61041e61098136600461500d565b612e78565b34801561099257600080fd5b5061041e6109a13660046151b4565b612e9a565b3480156109b257600080fd5b506104ac60005481565b3480156109c857600080fd5b506106186109d7366004614dc5565b6002602052600090815260409020546001600160a01b031681565b61041e610a0036600461584c565b6130f3565b348015610a1157600080fd5b5061041e610a20366004614c40565b613114565b348015610a3157600080fd5b50610a3a613188565b6040516104b6919061589f565b348015610a5357600080fd5b5061041e610a623660046158ec565b61327b565b348015610a7357600080fd5b5061041e610a8236600461496a565b6132f4565b348015610a9357600080fd5b506104ac610aa2366004614a53565b6134e1565b348015610ab357600080fd5b5061041e610ac23660046151b4565b61354c565b348015610ad357600080fd5b50610618610ae2366004614a53565b6003602052600090815260409020546001600160a01b031681565b348015610b0957600080fd5b506104ac60045481565b348015610b1f57600080fd5b50610b4e610b2e366004614a53565b6001600160a01b0390811660009081526003602052604090205416151590565b60405190151581526020016104b6565b348015610b6a57600080fd5b50610618600081565b348015610b7f57600080fd5b5061041e610b8e36600461597a565b613752565b348015610b9f57600080fd5b5061041e610bae366004615342565b613768565b348015610bbf57600080fd5b5061041e610bce3660046159a4565b6138a1565b61041e610be136600461496a565b6138c2565b348015610bf257600080fd5b5061041e610c01366004614877565b613be8565b610c0e613cf7565b6000610c2060c0830160a08401614a53565b90506000610c3460e0840160c08501614a53565b90506000610c5d6040850135866060870135610c5660a0890160808a01614a53565b8787613d5b565b90508015610c8457610c7484602001358685613e29565b610c7f868689613e29565b610c90565b610c9084358684613e29565b50505050505050565b610ca1613cf7565b60005b81811015610dfe576000838383818110610cc057610cc0615a07565b905060e0020160a0016020810190610cd89190614a53565b90506000848484818110610cee57610cee615a07565b905060e0020160c0016020810190610d069190614a53565b90506000610d91888886818110610d1f57610d1f615a07565b90506020020135878787818110610d3857610d38615a07565b905060e00201604001356000898989818110610d5657610d56615a07565b905060e00201606001358a8a8a818110610d7257610d72615a07565b905060e002016080016020810190610d8a9190614a53565b8888613efa565b90508015610dc357610dbe83878787818110610daf57610daf615a07565b905060e0020160200135613fc9565b610de8565b610de882878787818110610dd957610dd9615a07565b905060e0020160000135613fc9565b5050508080610df690615a33565b915050610ca4565b5050505050565b610e0d613cf7565b60005b81811015610dfe57610ef1858583818110610e2d57610e2d615a07565b90506020020135848484818110610e4657610e46615a07565b905060c00201602001356000868686818110610e6457610e64615a07565b905060c0020160400135878787818110610e8057610e80615a07565b905060c002016060016020810190610e989190614a53565b888888818110610eaa57610eaa615a07565b905060c002016080016020810190610ec29190614a53565b898989818110610ed457610ed4615a07565b905060c0020160a0016020810190610eec9190614a53565b614087565b610f3f838383818110610f0657610f06615a07565b905060c002016080016020810190610f1e9190614a53565b848484818110610f3057610f30615a07565b905060c0020160000135613fc9565b80610f4981615a33565b915050610e10565b610f59613cf7565b6000610f6b60a0830160808401614a53565b9050610fa2602083013560006040850135610f8c6080870160608801614a53565b85610f9d60c0890160a08a01614a53565b614148565b610fad818335613fc9565b60005b85811015610c9057611000878783818110610fcd57610fcd615a07565b9050602002016020810190610fe29190614a53565b868684818110610ff457610ff4615a07565b90506020020135613fc9565b8061100a81615a33565b915050610fb0565b61101a613cf7565b60005b81811015610dfe57600083838381811061103957611039615a07565b905060200281019061104b9190615a4c565b61105c9060c081019060a001614a53565b9050600084848481811061107257611072615a07565b90506020028101906110849190615a4c565b6110969061010081019060e001614a53565b905060008585858181106110ac576110ac615a07565b90506020028101906110be9190615a4c565b6110cf9060e081019060c001614a53565b9050600061117c8989878181106110e8576110e8615a07565b9050602002013588888881811061110157611101615a07565b90506020028101906111139190615a4c565b60400135858a8a8a81811061112a5761112a615a07565b905060200281019061113c9190615a4c565b606001358b8b8b81811061115257611152615a07565b90506020028101906111649190615a4c565b6111759060a0810190608001614a53565b8988613efa565b905080156112b8576111b687878781811061119957611199615a07565b90506020028101906111ab9190615a4c565b602001358486613e29565b60005b8787878181106111cb576111cb615a07565b90506020028101906111dd9190615a4c565b6111ec90610100810190615a6d565b90508110156112b2576112a088888881811061120a5761120a615a07565b905060200281019061121c9190615a4c565b61122b90610120810190615a6d565b8381811061123b5761123b615a07565b90506020020135858a8a8a81811061125557611255615a07565b90506020028101906112679190615a4c565b61127690610100810190615a6d565b8581811061128657611286615a07565b905060200201602081019061129b9190614a53565b613e29565b806112aa81615a33565b9150506111b9565b506112e7565b6112e78787878181106112cd576112cd615a07565b90506020028101906112df9190615a4c565b358484613e29565b5050505080806112f690615a33565b91505061101d565b611306613cf7565b600061131860c0830160a08401614a53565b9050600061132c60e0840160c08501614a53565b9050600061136589604086013583606088013561134f60a08a0160808b01614a53565b8861136060e08c0160c08d01614a53565b613efa565b905080156113da5761137b838560200135613fc9565b60005b878110156113d4576113c289898381811061139b5761139b615a07565b90506020020160208101906113b09190614a53565b888884818110610ff457610ff4615a07565b806113cc81615a33565b91505061137e565b506113e5565b6113e5828535613fc9565b505050505050505050565b600080806114076002630ad9084160e11b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f8286bbf6adfae598c227689d4e361af126e220106aaa15764538028b07f3a0d4906080015b60405180910390a15092915050565b61146e613cf7565b60005b81811015610dfe57600083838381811061148d5761148d615a07565b905060e0020160a00160208101906114a59190614a53565b905060008484848181106114bb576114bb615a07565b905060e0020160c00160208101906114d39190614a53565b905060008787858181106114e9576114e9615a07565b90506020020160208101906114fe9190614a53565b9050600061156f87878781811061151757611517615a07565b905060e00201604001358389898981811061153457611534615a07565b905060e00201606001358a8a8a81811061155057611550615a07565b905060e0020160800160208101906115689190614a53565b8888613d5b565b905080156115a25761159d87878781811061158c5761158c615a07565b905060e00201602001358386613e29565b6115c8565b6115c88787878181106115b7576115b7615a07565b905060e00201600001358385613e29565b5050505080806115d790615a33565b915050611471565b6115e7613cf7565b60006115f960a0830160808401614a53565b905061162b86602084013585604086013561161a6080880160608901614a53565b86610eec60c08a0160a08b01614a53565b61163782358483613e29565b611642848487613e29565b505050505050565b611652613cf7565b60006116638a898888888888613efa565b9050801561167b57611676878785613e29565b611686565b611686898784613e29565b50505050505050505050565b61169a613cf7565b60006116ac8988600088888888613efa565b905080156116c3576116be8387613fc9565b6113e5565b6113e58289613fc9565b6116d5613cf7565b60005b818110156117f45760008383838181106116f4576116f4615a07565b905060e0020160a001602081019061170c9190614a53565b9050600084848481811061172257611722615a07565b905060e0020160c001602081019061173a9190614a53565b905060006117a586868681811061175357611753615a07565b905060e0020160400135600088888881811061177157611771615a07565b905060e002016060013589898981811061178d5761178d615a07565b905060e002016080016020810190610c569190614a53565b905080156117c8576117c383878787818110610daf57610daf615a07565b6117de565b6117de82878787818110610dd957610dd9615a07565b50505080806117ec90615a33565b9150506116d8565b505050565b611801613cf7565b600061181360a0830160808401614a53565b90506118336020830135846040850135610f8c6080870160608801614a53565b61183f82358483613e29565b610dfe848487613e29565b611852613cf7565b60005b87811015611910576118fe89898381811061187257611872615a07565b90506020020160208101906118879190614a53565b88888481811061189957611899615a07565b905060200201358d8d858181106118b2576118b2615a07565b905060200201358888868181106118cb576118cb615a07565b905060200201358787878181106118e4576118e4615a07565b90506020020160208101906118f99190614a53565b6142eb565b8061190881615a33565b915050611855565b5050505050505050505050565b611925613cf7565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390528416906342842e0e90606401600060405180830381600087803b15801561197557600080fd5b505af1158015610c90573d6000803e3d6000fd5b611991613cf7565b60006119a287600087878787613d5b565b905080156119be576119b48387613fc9565b6116768989613fc9565b611686828b613fc9565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611a265760405162461bcd60e51b8152600401611a1d9190615ae2565b60405180910390fd5b506000611a34600583614346565b9050611a3f816143ad565b6000828152600560205260409081902080546001600160a01b0319169055517f3af7a1ac361fdd53acc657b974ce6047460323fcae43e3cb09d2c888dd69219a90611a9f90849084909182526001600160a01b0316602082015260400190565b60405180910390a15050565b611ab3613cf7565b6000611ac3888787878787613d5b565b90508015611ad6576116be878785613e29565b6113e5898784613e29565b611ae9613cf7565b6000611afb60c0830160a08401614a53565b90506000611b0f60e0840160c08501614a53565b90506000611b316040850135866060870135610c5660a0890160808a01614a53565b90508015611b9457611b4884602001358685613e29565b60005b888110156113d457611b82888883818110611b6857611b68615a07565b90506020020135878c8c8581811061128657611286615a07565b80611b8c81615a33565b915050611b4b565b6113e584358684613e29565b611ba8613cf7565b611bb88987600087878787614087565b611bc28286613fc9565b6113e58888613fc9565b611bd4613cf7565b610dfe85858585856142eb565b60015460408051808201909152601281527124b73b30b634b21036b9b39739b2b73232b960711b6020820152906001600160a01b03163314611c365760405162461bcd60e51b8152600401611a1d9190615ae2565b50611c42600282614346565b600180546001600160a01b03199081166001600160a01b039384161782556000848152600260209081526040918290208054909316909255915482518581529316908301527f9a99272c0f6b7a30ef9e76e684a7cd408bfd4f11a72f36a8e276253c920e442d910160405180910390a150565b611cbd613cf7565b60005b818110156113e5576000838383818110611cdc57611cdc615a07565b905060c002016080016020810190611cf49190614a53565b9050611d898a8a84818110611d0b57611d0b615a07565b90506020020135858585818110611d2457611d24615a07565b905060c00201602001356000878787818110611d4257611d42615a07565b905060c0020160400135888888818110611d5e57611d5e615a07565b905060c002016060016020810190611d769190614a53565b868a8a8a818110610ed457610ed4615a07565b611d9f81858585818110610f3057610f30615a07565b60005b888884818110611db457611db4615a07565b9050602002810190611dc69190615a6d565b9050811015611e6157611e4f898985818110611de457611de4615a07565b9050602002810190611df69190615a6d565b83818110611e0657611e06615a07565b9050602002016020810190611e1b9190614a53565b888886818110611e2d57611e2d615a07565b9050602002810190611e3f9190615a6d565b84818110610ff457610ff4615a07565b80611e5981615a33565b915050611da2565b50508080611e6e90615a33565b915050611cc0565b611e7e613cf7565b61164286867f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc787878787614087565b611eb5613cf7565b6000611ec687600087878787613d5b565b90508015611edd57611ed88387613fc9565b611ee7565b611ee78289613fc9565b5050505050505050565b611ef9613cf7565b60005b878110156113e557611f8c898983818110611f1957611f19615a07565b9050602002016020810190611f2e9190614a53565b888884818110611f4057611f40615a07565b90506020020135878785818110611f5957611f59615a07565b90506020020135868686818110611f7257611f72615a07565b9050602002016020810190611f879190614a53565b614447565b80611f9681615a33565b915050611efc565b611fa6613cf7565b6000611fb860c0830160a08401614a53565b90506000611fcc60e0840160c08501614a53565b90506000611fef8a6040860135876060880135610d8a60a08a0160808b01614a53565b9050801561203e5761200684602001358685613e29565b60005b8881101561203857612026888883818110611b6857611b68615a07565b8061203081615a33565b915050612009565b50611686565b61168684358684613e29565b612052613cf7565b60005b818110156117f457600083838381811061207157612071615a07565b90506020028101906120839190615a4c565b6120949060a0810190608001614a53565b905060008484848181106120aa576120aa615a07565b90506020028101906120bc9190615a4c565b60400135905060008585858181106120d6576120d6615a07565b90506020028101906120e89190615a4c565b6120f99060e081019060c001614a53565b905085858581811061210d5761210d615a07565b905060200281019061211f9190615a4c565b602001356000036121ec576121e786868681811061213f5761213f615a07565b90506020028101906121519190615a4c565b606001358488888881811061216857612168615a07565b905060200281019061217a9190615a4c565b3589898981811061218d5761218d615a07565b905060200281019061219f9190615a4c565b6121b09060c081019060a001614a53565b858b8b8b8181106121c3576121c3615a07565b90506020028101906121d59190615a4c565b610f9d9061010081019060e001614a53565b6122d1565b6122d186868681811061220157612201615a07565b90506020028101906122139190615a4c565b6020013587878781811061222957612229615a07565b905060200281019061223b9190615a4c565b606001358589898981811061225257612252615a07565b90506020028101906122649190615a4c565b358a8a8a81811061227757612277615a07565b90506020028101906122899190615a4c565b61229a9060c081019060a001614a53565b868c8c8c8181106122ad576122ad615a07565b90506020028101906122bf9190615a4c565b610eec9061010081019060e001614a53565b6123428383838989898181106122e9576122e9615a07565b90506020028101906122fb9190615a4c565b61230a90610100810190615a6d565b8b8b8b81811061231c5761231c615a07565b905060200281019061232e9190615a4c565b61233d90610120810190615a6d565b61449a565b505050808061235090615a33565b915050612055565b612360613cf7565b61236c83858484614447565b50505050565b61237a613cf7565b60005b81811015610c9057600083838381811061239957612399615a07565b905060e0020160a00160208101906123b19190614a53565b905060008484848181106123c7576123c7615a07565b905060e0020160c00160208101906123df9190614a53565b905060008787858181106123f5576123f5615a07565b905060200201602081019061240a9190614a53565b905060006124948b8b8781811061242357612423615a07565b9050602002013588888881811061243c5761243c615a07565b905060e0020160400135848a8a8a81811061245957612459615a07565b905060e00201606001358b8b8b81811061247557612475615a07565b905060e00201608001602081019061248d9190614a53565b8989613efa565b905080156124b6576124b187878781811061158c5761158c615a07565b6124cb565b6124cb8787878181106115b7576115b7615a07565b5050505080806124da90615a33565b91505061237d565b6124ea613cf7565b60006124fc60a0830160808401614a53565b905061251c6020830135846040850135610f8c6080870160608801614a53565b61252882358483613e29565b60005b86811015611ee75761256286868381811061254857612548615a07565b90506020020135858a8a8581811061128657611286615a07565b8061256c81615a33565b91505061252b565b61257c613cf7565b60005b81811015610c9057600083838381811061259b5761259b615a07565b905060c0020160800160208101906125b39190614a53565b90506126478484848181106125ca576125ca615a07565b905060c002016020013560008686868181106125e8576125e8615a07565b905060c002016040013587878781811061260457612604615a07565b905060c00201606001602081019061261c9190614a53565b8589898981811061262f5761262f615a07565b905060c0020160a0016020810190610f9d9190614a53565b61265d81858585818110610f3057610f30615a07565b60005b88888481811061267257612672615a07565b90506020028101906126849190615a6d565b90508110156126b4576126a2898985818110611de457611de4615a07565b806126ac81615a33565b915050612660565b505080806126c190615a33565b91505061257f565b6126d1613cf7565b60006126e360a0830160808401614a53565b90506127058760208401356000604086013561161a6080880160608901614a53565b612710818335613fc9565b60005b85811015611ee757612730878783818110610fcd57610fcd615a07565b8061273a81615a33565b915050612713565b61274a613cf7565b60005b81811015610c9057600083838381811061276957612769615a07565b905060e0020160a00160208101906127819190614a53565b9050600084848481811061279757612797615a07565b905060e0020160c00160208101906127af9190614a53565b905060006127c886868681811061175357611753615a07565b9050801561288c576127e683878787818110610daf57610daf615a07565b60005b8a8a868181106127fb576127fb615a07565b905060200281019061280d9190615a6d565b9050811015612886576128748b8b8781811061282b5761282b615a07565b905060200281019061283d9190615a6d565b8381811061284d5761284d615a07565b90506020020160208101906128629190614a53565b8a8a88818110611e2d57611e2d615a07565b8061287e81615a33565b9150506127e9565b506128a2565b6128a282878787818110610dd957610dd9615a07565b50505080806128b090615a33565b91505061274d565b6128c0613cf7565b6128cf8660008a8a8988614148565b6128d98585613fc9565b611ee78282613fc9565b6128eb613cf7565b60005b858110156129f0576129a28d8d8381811061290b5761290b615a07565b9050602002013560008b8b8581811061292657612926615a07565b905060200201358a8a8681811061293f5761293f615a07565b90506020020160208101906129549190614a53565b89898781811061296657612966615a07565b905060200201602081019061297b9190614a53565b88888881811061298d5761298d615a07565b9050602002016020810190610f9d9190614a53565b6129de8585838181106129b7576129b7615a07565b90506020020160208101906129cc9190614a53565b8c8c84818110610ff457610ff4615a07565b806129e881615a33565b9150506128ee565b50505050505050505050505050565b612a07613cf7565b60015b6001600160a01b0381811660009081526003602052604090205416600114612a56576001600160a01b0380821660009081526003602052604090205416612a508161453e565b50612a0a565b50565b612a61613cf7565b612a7088888787878787614087565b611ee7868684613e29565b612a83613cf7565b6000612a9560c0830160a08401614a53565b90506000612aa960e0840160c08501614a53565b90506000612acc88604086013587606088013561134f60a08a0160808b01614a53565b90508015612aee57612ae384602001358685613e29565b611ed8868689613e29565b611ee784358684613e29565b612b02613cf7565b60005b818110156113e5576000838383818110612b2157612b21615a07565b905060e0020160a0016020810190612b399190614a53565b90506000848484818110612b4f57612b4f615a07565b905060e0020160c0016020810190612b679190614a53565b90506000612b808c8c86818110610d1f57610d1f615a07565b90508015612bfb57612b9e83878787818110610daf57610daf615a07565b60005b8a8a86818110612bb357612bb3615a07565b9050602002810190612bc59190615a6d565b9050811015612bf557612be38b8b8781811061282b5761282b615a07565b80612bed81615a33565b915050612ba1565b50612c11565b612c1182878787818110610dd957610dd9615a07565b5050508080612c1f90615a33565b915050612b05565b612c2f613cf7565b60005b858110156129f057612d1e8d8d83818110612c4f57612c4f615a07565b905060200201358c8c84818110612c6857612c68615a07565b905060200201357f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc78c8c86818110612ca257612ca2615a07565b905060200201358b8b87818110612cbb57612cbb615a07565b9050602002016020810190612cd09190614a53565b8a8a88818110612ce257612ce2615a07565b9050602002016020810190612cf79190614a53565b898989818110612d0957612d09615a07565b9050602002016020810190610eec9190614a53565b80612d2881615a33565b915050612c32565b612d38613cf7565b610dfe837f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc787878686614148565b612d6e613cf7565b612a568161453e565b612d7f613cf7565b6000612d918b88600088888888613efa565b90508015612db257612da38387613fc9565b612dad8989613fc9565b611910565b611910828b613fc9565b612dc4613cf7565b6117f4818484613e29565b612dd7613cf7565b6000612de960c0830160a08401614a53565b90506000612dfd60e0840160c08501614a53565b90506000612e1f6040850135826060870135610c5660a0890160808a01614a53565b90508015612e6d57612e35838560200135613fc9565b60005b87811015612e6757612e5589898381811061139b5761139b615a07565b80612e5f81615a33565b915050612e38565b50611ee7565b611ee7828535613fc9565b612e80613cf7565b612e908787600087878787614087565b610c908286613fc9565b612ea2613cf7565b60005b818110156117f4576000838383818110612ec157612ec1615a07565b9050602002810190612ed39190615b15565b612ee49060a0810190608001614a53565b90506000848484818110612efa57612efa615a07565b9050602002810190612f0c9190615b15565b612f1d9060e081019060c001614a53565b9050612fde858585818110612f3457612f34615a07565b9050602002810190612f469190615b15565b6020013582878787818110612f5d57612f5d615a07565b9050602002810190612f6f9190615b15565b60400135888888818110612f8557612f85615a07565b9050602002810190612f979190615b15565b612fa8906080810190606001614a53565b868a8a8a818110612fbb57612fbb615a07565b9050602002810190612fcd9190615b15565b610f9d9060c081019060a001614a53565b61300d858585818110612ff357612ff3615a07565b90506020028101906130059190615b15565b358284613e29565b60005b85858581811061302257613022615a07565b90506020028101906130349190615b15565b6130429060e0810190615a6d565b90508110156130dd576130cb86868681811061306057613060615a07565b90506020028101906130729190615b15565b61308190610100810190615a6d565b8381811061309157613091615a07565b90506020020135838888888181106130ab576130ab615a07565b90506020028101906130bd9190615b15565b6112769060e0810190615a6d565b806130d581615a33565b915050613010565b50505080806130eb90615a33565b915050612ea5565b6130fb613cf7565b61310a84600088888786614148565b6116428383613fc9565b61311c613cf7565b60005b85811015611910576131768b8b8381811061313c5761313c615a07565b905060200201357f0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc78b8b8581811061292657612926615a07565b8061318081615a33565b91505061311f565b606060006004546001600160401b038111156131a6576131a6615b2c565b6040519080825280602002602001820160405280156131cf578160200160208202803683370190505b506001600090815260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c549192506001600160a01b03909116905b6001600160a01b038216600114613273578183828151811061323257613232615a07565b6001600160a01b03928316602091820292909201810191909152928116600090815260039093526040909220549091169061326c81615a33565b905061320e565b509092915050565b613283613cf7565b600061329560a0830160808401614a53565b90506132b688602084013585604086013561161a6080880160608901614a53565b6132c282358483613e29565b60005b868110156113e5576132e286868381811061254857612548615a07565b806132ec81615a33565b9150506132c5565b6132fc613cf7565b60005b81811015610dfe57600083838381811061331b5761331b615a07565b905060200281019061332d9190615b15565b61333e9060a0810190608001614a53565b9050600084848481811061335457613354615a07565b90506020028101906133669190615b15565b6133779060e081019060c001614a53565b905061345187878581811061338e5761338e615a07565b905060200201358686868181106133a7576133a7615a07565b90506020028101906133b99190615b15565b60200135838888888181106133d0576133d0615a07565b90506020028101906133e29190615b15565b604001358989898181106133f8576133f8615a07565b905060200281019061340a9190615b15565b61341b906080810190606001614a53565b878b8b8b81811061342e5761342e615a07565b90506020028101906134409190615b15565b610eec9060c081019060a001614a53565b613466858585818110612ff357612ff3615a07565b60005b85858581811061347b5761347b615a07565b905060200281019061348d9190615b15565b61349b9060e0810190615a6d565b90508110156134cb576134b986868681811061306057613060615a07565b806134c381615a33565b915050613469565b50505080806134d990615a33565b9150506132ff565b600080806134f8600563e570462160e01b86614207565b604080518381523360208201526001600160a01b038816918101919091526060810182905291935091507f78f4cea8c2f10b967cb5bf327794223ed6ca8dc8238135f61294f1a114f8afb590608001611457565b613554613cf7565b60005b818110156117f457600083838381811061357357613573615a07565b90506020028101906135859190615a4c565b6135969060c081019060a001614a53565b905060008484848181106135ac576135ac615a07565b90506020028101906135be9190615a4c565b6135d09061010081019060e001614a53565b905060008585858181106135e6576135e6615a07565b90506020028101906135f89190615a4c565b6136099060e081019060c001614a53565b9050600061369d87878781811061362257613622615a07565b90506020028101906136349190615a4c565b604001358489898981811061364b5761364b615a07565b905060200281019061365d9190615a4c565b606001358a8a8a81811061367357613673615a07565b90506020028101906136859190615a4c565b6136969060a0810190608001614a53565b8887613d5b565b90508015613726576136ba87878781811061119957611199615a07565b60005b8787878181106136cf576136cf615a07565b90506020028101906136e19190615a4c565b6136f090610100810190615a6d565b90508110156137205761370e88888881811061120a5761120a615a07565b8061371881615a33565b9150506136bd565b5061373b565b61373b8787878181106112cd576112cd615a07565b50505050808061374a90615a33565b915050613557565b61375a613cf7565b6137648282613fc9565b5050565b613770613cf7565b60005b81811015610c9057600083838381811061378f5761378f615a07565b905060c0020160800160208101906137a79190614a53565b905060008686848181106137bd576137bd615a07565b90506020020160208101906137d29190614a53565b90506138668989858181106137e9576137e9615a07565b9050602002013586868681811061380257613802615a07565b905060c00201602001358388888881811061381f5761381f615a07565b905060c002016040013589898981811061383b5761383b615a07565b905060c0020160600160208101906138539190614a53565b878b8b8b818110610ed457610ed4615a07565b61388c85858581811061387b5761387b615a07565b905060c00201600001358284613e29565b5050808061389990615a33565b915050613773565b6138a9613cf7565b6138b7858589898786614148565b610c90828585613e29565b6138ca613cf7565b60005b81811015610dfe5760008383838181106138e9576138e9615a07565b90506020028101906138fb9190615a4c565b61390c9060a0810190608001614a53565b9050600084848481811061392257613922615a07565b90506020028101906139349190615a4c565b604001359050600085858581811061394e5761394e615a07565b90506020028101906139609190615a4c565b6139719060e081019060c001614a53565b9050600086868681811061398757613987615a07565b90506020028101906139999190615a4c565b6139ab9061010081019060e001614a53565b90508686868181106139bf576139bf615a07565b90506020028101906139d19190615a4c565b60200135600003613ae5576000613a648888888181106139f3576139f3615a07565b9050602002810190613a059190615a4c565b60600135868a8a8a818110613a1c57613a1c615a07565b9050602002810190613a2e9190615a4c565b358b8b8b818110613a4157613a41615a07565b9050602002810190613a539190615a4c565b610c569060c081019060a001614a53565b90508015613abc57613ab78585858b8b8b818110613a8457613a84615a07565b9050602002810190613a969190615a4c565b613aa590610100810190615a6d565b8d8d8d81811061231c5761231c615a07565b613adf565b613adf8a8a88818110613ad157613ad1615a07565b9050602002013586846145a8565b50613bd1565b6000613b95888888818110613afc57613afc615a07565b9050602002810190613b0e9190615a4c565b60200135898989818110613b2457613b24615a07565b9050602002810190613b369190615a4c565b60600135878b8b8b818110613b4d57613b4d615a07565b9050602002810190613b5f9190615a4c565b358c8c8c818110613b7257613b72615a07565b9050602002810190613b849190615a4c565b610d8a9060c081019060a001614a53565b90508015613bba57613bb58585858b8b8b818110613a8457613a84615a07565b613bcf565b613bcf8a8a88818110613ad157613ad1615a07565b505b505050508080613be090615a33565b9150506138cd565b613bf0613cf7565b60005b81811015610dfe576000838383818110613c0f57613c0f615a07565b905060c002016080016020810190613c279190614a53565b90506000868684818110613c3d57613c3d615a07565b9050602002016020810190613c529190614a53565b9050613ccd858585818110613c6957613c69615a07565b905060c002016020013582878787818110613c8657613c86615a07565b905060c0020160400135888888818110613ca257613ca2615a07565b905060c002016060016020810190613cba9190614a53565b868a8a8a81811061262f5761262f615a07565b613ce285858581811061387b5761387b615a07565b50508080613cef90615a33565b915050613bf3565b336000908152600360205260409020546001600160a01b031615156040518060400160405280601281526020017124b73b30b634b21036b9b39739b2b73232b960711b81525090612a565760405162461bcd60e51b8152600401611a1d9190615ae2565b604051632142170760e11b81526001600160a01b038381166004830152828116602483015260448201869052600091908516906342842e0e90606401600060405180830381600087803b158015613db157600080fd5b505af1925050508015613dc2575060015b613dce57506000613e1f565b60408051868152602081018990526001600160a01b03888116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a25060015b9695505050505050565b604080516001600160a01b038381166024830152604480830187905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290861691613e859190615b42565b6000604051808303816000865af19150503d8060008114613ec2576040519150601f19603f3d011682016040523d82523d6000602084013e613ec7565b606091505b5091509150818015613ef1575080511580613ef1575080806020019051810190613ef19190615b54565b610dfe57600080fd5b604051637921219560e11b81526000906001600160a01b0385169063f242432a90613f2f90869086908a908e90600401615b76565b600060405180830381600087803b158015613f4957600080fd5b505af1925050508015613f5a575060015b613f6657506000613fbe565b60408051868152602081018a90529081018890526001600160a01b0387811660608301528516907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25060015b979650505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614016576040519150601f19603f3d011682016040523d82523d6000602084013e61401b565b606091505b50509050806117f45760405162461bcd60e51b815260206004820152603260248201527f4e6966747945786368616e67654578656375746f723a2056616c7565207472616044820152711b9cd9995c881d5b9cdd58d8d95cdcd99d5b60721b6064820152608401611a1d565b604051637921219560e11b81526001600160a01b0384169063f242432a906140b9908590859089908d90600401615b76565b600060405180830381600087803b1580156140d357600080fd5b505af11580156140e7573d6000803e3d6000fd5b505060408051878152602081018b90529081018990526001600160a01b038881166060830152861692507fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c7915060800160405180910390a250505050505050565b604051632142170760e11b81526001600160a01b0383811660048301528281166024830152604482018690528416906342842e0e90606401600060405180830381600087803b15801561419a57600080fd5b505af11580156141ae573d6000803e3d6000fd5b505060408051878152602081018a90526001600160a01b0389811682840152915191871693507ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae925081900360600190a2505050505050565b6000806001600160a01b03831661424f5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401611a1d565b60008061425a6145d1565b604080516020808201949094526001600160e01b031999909916898201526bffffffffffffffffffffffff19606089901b1660448a01528051808a03603801815260588a018083528151918501919091206078909a0182526001600160a01b03988916815260008a81529a909352909820905181546001600160a01b03191696169590951790945550929492505050565b60408051858152602081018590529081018390526001600160a01b0382811660608301528616907fc1d7f60447c28539e88fcba0e9120b121409ccca4f3cfaaf54fa68ade306d4c79060800160405180910390a25050505050565b600081815260208390526040812080546001600160a01b031661439c5760405162461bcd60e51b815260206004820152600e60248201526d1b9bc81cdd58da081b1bd8dad25960921b6044820152606401611a1d565b546001600160a01b03169392505050565b6001600160a01b0380821660009081526003602052604090205416156143d257600080fd5b60036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b038381166000818152604081208054939094166001600160a01b03199384161790935560018352835490911617909155600480549161443f83615a33565b919050555050565b60408051848152602081018490526001600160a01b03838116828401529151918616917ff6935d13435d179652aef36125593f81c762921c3ab20abcf15149f22295f9ae9181900360600190a250505050565b6001600160a01b0387161586156144cb5780156144c0576144bb8688613fc9565b6144cb565b6144cb878988613e29565b8380156113e55760005b818110156116865782156144fd576144f8878783818110610fcd57610fcd615a07565b61452c565b61452c85858381811061451257614512615a07565b905060200201358b89898581811061128657611286615a07565b8061453681615a33565b9150506144d5565b60006145498261463c565b6001600160a01b03838116600081815260036020526040808220805486861684529183208054929095166001600160a01b0319928316179094559181528254909116909155600480549293509061459f83615bae565b91905055505050565b82156117f4576001600160a01b0382166145c6576117f48184613fc9565b6117f4838383613e29565b60008060008081546145e290615a33565b918290555090506145f4600143615bc5565b60408051914060208301526bffffffffffffffffffffffff193060601b1690820152605481018290526074016040516020818303038152906040528051906020012091509091565b600060015b6001600160a01b03818116600090815260036020526040902054166001146146ad576001600160a01b0381811660009081526003602052604090205481851691160361468d5792915050565b6001600160a01b0390811660009081526003602052604090205416614641565b50600092915050565b80356001600160a01b03811681146146cd57600080fd5b919050565b600060e082840312156146e457600080fd5b50919050565b600080600080610140858703121561470157600080fd5b61470a856146b6565b93506020850135925061471f604086016146b6565b915061472e86606087016146d2565b905092959194509250565b60008083601f84011261474b57600080fd5b5081356001600160401b0381111561476257600080fd5b6020830191508360208260051b850101111561477d57600080fd5b9250929050565b60008083601f84011261479657600080fd5b5081356001600160401b038111156147ad57600080fd5b60208301915083602060e08302850101111561477d57600080fd5b600080600080604085870312156147de57600080fd5b84356001600160401b03808211156147f557600080fd5b61480188838901614739565b9096509450602087013591508082111561481a57600080fd5b5061482787828801614784565b95989497509550505050565b60008083601f84011261484557600080fd5b5081356001600160401b0381111561485c57600080fd5b60208301915083602060c08302850101111561477d57600080fd5b6000806000806040858703121561488d57600080fd5b84356001600160401b03808211156148a457600080fd5b6148b088838901614739565b909650945060208701359150808211156148c957600080fd5b5061482787828801614833565b600060c082840312156146e457600080fd5b6000806000806000610100868803121561490157600080fd5b85356001600160401b038082111561491857600080fd5b61492489838a01614739565b9097509550602088013591508082111561493d57600080fd5b5061494a88828901614739565b909450925061495e905087604088016148d6565b90509295509295909350565b6000806000806040858703121561498057600080fd5b84356001600160401b038082111561499757600080fd5b6149a388838901614739565b909650945060208701359150808211156149bc57600080fd5b5061482787828801614739565b60008060008060008061014087890312156149e357600080fd5b8635955060208701356001600160401b0380821115614a0157600080fd5b614a0d8a838b01614739565b90975095506040890135915080821115614a2657600080fd5b50614a3389828a01614739565b9094509250614a47905088606089016146d2565b90509295509295509295565b600060208284031215614a6557600080fd5b614a6e826146b6565b9392505050565b60008060008060006101408688031215614a8e57600080fd5b85359450614a9e602087016146b6565b935060408601359250614ab3606087016146b6565b915061495e87608088016148d6565b60008060008060008060008060006101208a8c031215614ae157600080fd5b8935985060208a0135975060408a0135965060608a01359550614b0660808b016146b6565b945060a08a01359350614b1b60c08b016146b6565b9250614b2960e08b016146b6565b9150614b386101008b016146b6565b90509295985092959850929598565b600080600080600080600080610100898b031215614b6457600080fd5b8835975060208901359650604089013595506060890135945060808901359350614b9060a08a016146b6565b9250614b9e60c08a016146b6565b9150614bac60e08a016146b6565b90509295985092959890939650565b60008060208385031215614bce57600080fd5b82356001600160401b03811115614be457600080fd5b614bf085828601614784565b90969095509350505050565b6000806000806101208587031215614c1357600080fd5b614c1c856146b6565b935060208501359250614c31604086016146b6565b915061472e86606087016148d6565b60008060008060008060008060008060a08b8d031215614c5f57600080fd5b8a356001600160401b0380821115614c7657600080fd5b614c828e838f01614739565b909c509a5060208d0135915080821115614c9b57600080fd5b614ca78e838f01614739565b909a50985060408d0135915080821115614cc057600080fd5b614ccc8e838f01614739565b909850965060608d0135915080821115614ce557600080fd5b614cf18e838f01614739565b909650945060808d0135915080821115614d0a57600080fd5b50614d178d828e01614739565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215614d4557600080fd5b614d4e846146b6565b9250614d5c602085016146b6565b9150604084013590509250925092565b60008060008060008060008060006101208a8c031215614d8b57600080fd5b89359850614d9b60208b016146b6565b975060408a0135965060608a0135955060808a0135945060a08a01359350614b1b60c08b016146b6565b600060208284031215614dd757600080fd5b5035919050565b600080600080600080600080610100898b031215614dfb57600080fd5b883597506020890135965060408901359550614e1960608a016146b6565b945060808901359350614b9060a08a016146b6565b6000806000806000806101408789031215614e4857600080fd5b86356001600160401b0380821115614e5f57600080fd5b614e6b8a838b01614739565b90985096506020890135915080821115614e8457600080fd5b50614e9189828a01614739565b9095509350614ea49050604088016146b6565b9150614a4788606089016146d2565b600080600080600060a08688031215614ecb57600080fd5b614ed4866146b6565b945060208601359350604086013592506060860135915061495e608087016146b6565b6000806000806000806000806080898b031215614f1357600080fd5b88356001600160401b0380821115614f2a57600080fd5b614f368c838d01614739565b909a50985060208b0135915080821115614f4f57600080fd5b614f5b8c838d01614739565b909850965060408b0135915080821115614f7457600080fd5b614f808c838d01614739565b909650945060608b0135915080821115614f9957600080fd5b50614fa68b828c01614833565b999c989b5096995094979396929594505050565b60008060008060008060c08789031215614fd357600080fd5b863595506020870135945060408701359350614ff1606088016146b6565b9250614fff608088016146b6565b9150614a4760a088016146b6565b600080600080600080600060e0888a03121561502857600080fd5b8735965060208801359550604088013594506060880135935061504d608089016146b6565b925061505b60a089016146b6565b915061506960c089016146b6565b905092959891949750929550565b6000806000806000806000806080898b03121561509357600080fd5b88356001600160401b03808211156150aa57600080fd5b6150b68c838d01614739565b909a50985060208b01359150808211156150cf57600080fd5b6150db8c838d01614739565b909850965060408b01359150808211156150f457600080fd5b6151008c838d01614739565b909650945060608b013591508082111561511957600080fd5b50614fa68b828c01614739565b6000806000806000806000610160888a03121561514257600080fd5b8735965060208801356001600160401b038082111561516057600080fd5b61516c8b838c01614739565b909850965060408a013591508082111561518557600080fd5b506151928a828b01614739565b90955093506151a59050606089016146b6565b91506150698960808a016146d2565b600080602083850312156151c757600080fd5b82356001600160401b038111156151dd57600080fd5b614bf085828601614739565b600080600080608085870312156151ff57600080fd5b8435935061520f602086016146b6565b92506040850135915061472e606086016146b6565b6000806000806000806060878903121561523d57600080fd5b86356001600160401b038082111561525457600080fd5b6152608a838b01614739565b9098509650602089013591508082111561527957600080fd5b6152858a838b01614739565b9096509450604089013591508082111561529e57600080fd5b506152ab89828a01614784565b979a9699509497509295939492505050565b60008060008060008061012087890312156152d757600080fd5b86356001600160401b03808211156152ee57600080fd5b6152fa8a838b01614739565b9098509650602089013591508082111561531357600080fd5b5061532089828a01614739565b90955093506153339050604088016146b6565b9150614a4788606089016148d6565b6000806000806000806060878903121561535b57600080fd5b86356001600160401b038082111561537257600080fd5b61537e8a838b01614739565b9098509650602089013591508082111561539757600080fd5b6153a38a838b01614739565b909650945060408901359150808211156153bc57600080fd5b506152ab89828a01614833565b60008060008060008061012087890312156153e357600080fd5b8635955060208701356001600160401b038082111561540157600080fd5b61540d8a838b01614739565b9097509550604089013591508082111561542657600080fd5b5061543389828a01614739565b9094509250614a47905088606089016148d6565b600080600080600080600080610100898b03121561546457600080fd5b8835975061547460208a016146b6565b96506040890135955061548960608a016146b6565b94506080890135935061549e60a08a016146b6565b92506154ac60c08a016146b6565b915060e089013590509295985092959890939650565b60008060008060008060008060008060008060c08d8f0312156154e457600080fd5b6001600160401b038d3511156154f957600080fd5b6155068e8e358f01614739565b909c509a506001600160401b0360208e0135111561552357600080fd5b6155338e60208f01358f01614739565b909a5098506001600160401b0360408e0135111561555057600080fd5b6155608e60408f01358f01614739565b90985096506001600160401b0360608e0135111561557d57600080fd5b61558d8e60608f01358f01614739565b90965094506001600160401b0360808e013511156155aa57600080fd5b6155ba8e60808f01358f01614739565b90945092506001600160401b0360a08e013511156155d757600080fd5b6155e78e60a08f01358f01614739565b81935080925050509295989b509295989b509295989b565b6000806000806000610160868803121561561857600080fd5b85359450615628602087016146b6565b93506040860135925061563d606087016146b6565b915061495e87608088016146d2565b6000806000806000806000806080898b03121561566857600080fd5b88356001600160401b038082111561567f57600080fd5b61568b8c838d01614739565b909a50985060208b01359150808211156156a457600080fd5b6156b08c838d01614739565b909850965060408b01359150808211156156c957600080fd5b6156d58c838d01614739565b909650945060608b01359150808211156156ee57600080fd5b50614fa68b828c01614784565b600080600080600060a0868803121561571357600080fd5b85359450615723602087016146b6565b935060408601359250615738606087016146b6565b915061495e608087016146b6565b6000806000806000806000806000806101408b8d03121561576657600080fd5b8a35995060208b0135985061577d60408c016146b6565b975060608b0135965060808b0135955060a08b0135945060c08b013593506157a760e08c016146b6565b92506157b66101008c016146b6565b91506157c56101208c016146b6565b90509295989b9194979a5092959850565b600080600080600061012086880312156157ef57600080fd5b85356001600160401b038082111561580657600080fd5b61581289838a01614739565b9097509550602088013591508082111561582b57600080fd5b5061583888828901614739565b909450925061495e905087604088016146d2565b60008060008060008060c0878903121561586557600080fd5b86359550615875602088016146b6565b94506040870135935061588a606088016146b6565b925060808701359150614a4760a088016146b6565b6020808252825182820181905260009190848201906040850190845b818110156158e05783516001600160a01b0316835292840192918401916001016158bb565b50909695505050505050565b6000806000806000806000610140888a03121561590857600080fd5b8735965060208801356001600160401b038082111561592657600080fd5b6159328b838c01614739565b909850965060408a013591508082111561594b57600080fd5b506159588a828b01614739565b909550935061596b9050606089016146b6565b91506150698960808a016148d6565b6000806040838503121561598d57600080fd5b615996836146b6565b946020939093013593505050565b600080600080600080600060e0888a0312156159bf57600080fd5b873596506159cf602089016146b6565b9550604088013594506159e4606089016146b6565b93506159f2608089016146b6565b925060a0880135915061506960c089016146b6565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201615a4557615a45615a1d565b5060010190565b6000823561013e19833603018112615a6357600080fd5b9190910192915050565b6000808335601e19843603018112615a8457600080fd5b8301803591506001600160401b03821115615a9e57600080fd5b6020019150600581901b360382131561477d57600080fd5b60005b83811015615ad1578181015183820152602001615ab9565b8381111561236c5750506000910152565b6020815260008251806020840152615b01816040850160208701615ab6565b601f01601f19169190910160400192915050565b6000823561011e19833603018112615a6357600080fd5b634e487b7160e01b600052604160045260246000fd5b60008251615a63818460208701615ab6565b600060208284031215615b6657600080fd5b81518015158114614a6e57600080fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b600081615bbd57615bbd615a1d565b506000190190565b600082821015615bd757615bd7615a1d565b50039056fea26469706673582212202582ff801306017998602c5bef74a95c4c34ab09dd9cfbba4a20f12a0894e02e64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc70000000000000000000000008fe2f09f3684284e15822285d444c13d2cb992100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000015f8733104b67f17158c417d32172eea56c3b61d
-----Decoded View---------------
Arg [0] : priceCurrencyUSD_ (address): 0x2d5D20c50320de5c9861350c4F760E26dE0c2dC7
Arg [1] : recoveryAdmin_ (address): 0x8FE2F09f3684284e15822285d444c13d2CB99210
Arg [2] : validSenders_ (address[]): 0x15F8733104b67F17158c417d32172Eea56C3b61D
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000002d5d20c50320de5c9861350c4f760e26de0c2dc7
Arg [1] : 0000000000000000000000008fe2f09f3684284e15822285d444c13d2cb99210
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000015f8733104b67f17158c417d32172eea56c3b61d
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.