Source Code
Overview
POL Balance
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
Contract Name:
TransactionLedger
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./interface/IEventEmitter.sol"; import './interface/IOrchestrator.sol'; import "./interface/ITransactionLedger.sol"; import './interface/ICIC.sol'; /** * @title TransactionLedger * @dev Contract for managing transaction ledgers, updating ledgers, adding rules, and disbursing payments. * Inherits Ownable, ITransactionLedger, and ReentrancyGuard. */ contract TransactionLedger is Initializable, ITransactionLedger, ReentrancyGuard { address internal constant ZERO_ADDRESS = address(0); mapping(uint256 => string) public ledgerKeys; mapping(string => Ledger) public ledgerData; mapping(uint256 => Rule) public rulesData; DisburseDetails public disburseDetails; DisburseData public disburseData; IEventEmitter public iEventEmitter; IOrchestrator public iOrchestrator; uint256 internal ledgerCounter; uint256 public rulesCounter; bool public paymentDisbursed; bool public isInitialized; bool public isRuleAdded; bool public ledgerLock; ICIC public CIC; address public impl; /** * @dev Constructor to initialize the contract. Also gives the listing functionality */ constructor() { _disableInitializers(); } /** * @dev Initializes the ledger with provided keys and values. * @param eventEmitter THe event emitter contract address. * @param CICAddress The CIC contract address. * @param ledgerKeysParam Array of ledger keys. * @param ledgerValuesParam Array of ledger values. * @param uniqueSecret Unique secret for verification. * @param signature Signature for authorization. */ function initLedger( address eventEmitter, address CICAddress, address iOrchestratorAddress, string[] memory ledgerKeysParam, string[] memory ledgerValuesParam, uint256 uniqueSecret, bytes memory signature ) public override nonReentrant initializer{ require(eventEmitter != ZERO_ADDRESS, 'TransactionLedger: Address cannot be zero'); require(CICAddress != ZERO_ADDRESS, 'TransactionLedger: Address cannot be zero'); uint256 length = ledgerKeysParam.length; require(length > 0, 'TransactionLedger: values can not be empty'); require(length == ledgerValuesParam.length, 'TransactionLedger: invalid data'); for (uint256 index = 0; index < length; index++) { ledgerKeys[index] = ledgerKeysParam[index]; ledgerData[ledgerKeys[index]] = Ledger(ledgerValuesParam[index], true); } ledgerCounter = length - 1; paymentDisbursed = false; isRuleAdded = false; ledgerLock = false; isInitialized = true; iEventEmitter = IEventEmitter(eventEmitter); CIC = ICIC(CICAddress); iOrchestrator = IOrchestrator(iOrchestratorAddress); iEventEmitter.emitInitLedgerEvent(ledgerKeysParam, ledgerValuesParam, uniqueSecret, signature); } /** * @dev Updates the ledger with new values and payment details. * @param ledgerKeysParam Array of ledger keys. * @param ledgerValuesParam Array of ledger values. * @param uniqueSecret Unique secret for verification. * @param signature Signature for authorization. */ function updateLedger( string[] memory ledgerKeysParam, string[] memory ledgerValuesParam, uint256 uniqueSecret, bytes memory signature ) external override nonReentrant onlyAdmin { uint256 keysLength = ledgerKeysParam.length; require(!ledgerLock, 'TransactionLedger: Ledger is locked'); require(isInitialized, 'TransactionLedger: Ledger not initialized'); require(keysLength > 0, 'TransactionLedger: values can not be empty'); require(keysLength == ledgerValuesParam.length, 'TransactionLedger: invalid data'); for (uint256 index = 0; index < keysLength; index++) { require(ledgerData[ledgerKeysParam[index]].isExist, 'TransactionLedger: Invalid ledger key'); ledgerData[ledgerKeysParam[index]] = Ledger(ledgerValuesParam[index], true); } iEventEmitter.emitUpdateLedgerEvent(ledgerKeysParam, ledgerValuesParam, uniqueSecret, signature); } /** * @dev Adds new rules to the system. * @param rules Array of Rule structures defining the new rules. * @param uniqueSecret Unique secret for verification. * @param signature Signature for authorization. */ function addNewRules( Rule[] calldata rules, uint256 uniqueSecret, bytes memory signature ) external override nonReentrant onlyAdmin { uint256 keysLength = rules.length; require(isInitialized, 'TransactionLedger: Ledger not initialized'); require(!isRuleAdded, 'TransactionLedger: Rules already added'); require(!ledgerLock, 'TransactionLedger: Ledger is locked'); require(keysLength > 0, 'TransactionLedger: rules can not be empty'); for (uint256 index = 0; index < rules.length; index++) { rulesData[rulesCounter] = rules[index]; } rulesCounter = keysLength - 1; isRuleAdded = true; iEventEmitter.emitNewRuleAddedEvent(rules, uniqueSecret, signature); } /** * @dev Add details of a disbursement. * @param disbursementDetail A struct containing the details of the disbursement address. * @param disbursementData A struct containing the details of the disbursement amount. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function addDisburseDetails( DisburseDetails memory disbursementDetail, DisburseData memory disbursementData, uint256 uniqueSecret, bytes memory signature ) external override nonReentrant { require(disbursementDetail.sellerWallet != address(0), "TransactionLedger: Invalid seller address"); require(disbursementData.seller > 0, "TransactionLedger: Invalid seller amount"); require(disburseDetails.sellerWallet == address(0), "TransactionLedger: Disburse details already exists"); disburseDetails = disbursementDetail; disburseData = disbursementData; iEventEmitter.emitDisburseDetailsAddedEvent(disburseDetails, disburseData, uniqueSecret, signature); } /** * @dev Disburses payment according to the specified rule. * @param ruleId Identifier of the rule for payment disbursement. * @param uniqueSecret Unique secret for verification. * @param signature Signature for authorization. */ function disbursePayment( uint256 ruleId, uint256 uniqueSecret, bytes memory signature ) external override nonReentrant onlyAdmin { require(isInitialized, 'TransactionLedger: Ledger not initialized'); require(!paymentDisbursed, 'TransactionLedger: Payment already disbursed'); require(!ledgerLock, 'TransactionLedger: Ledger is lock'); require(disburseDetails.sellerWallet != address(0), "TransactionLedger: Disburse details not exists"); uint256 totalAmount = 0; if (ruleId == 0) { paymentDisbursed = true; totalAmount = disburseData.royalty + disburseData.affiliate + disburseData.seller + disburseData.CIP + disburseData.shipping + disburseData.tax; require(CIC.balanceOf(address(this)) >= totalAmount, "TransactionLedger: Insufficient CIC"); CIC.approve(impl, totalAmount); transferIfNotZero(disburseDetails.royaltyWallet, disburseData.royalty); transferIfNotZero(disburseDetails.affiliateWallet, disburseData.affiliate); transferIfNotZero(disburseDetails.sellerWallet, disburseData.seller); transferIfNotZero(disburseDetails.CIPWallet, disburseData.CIP); transferIfNotZero(disburseDetails.shippingWallet, disburseData.shipping); transferIfNotZero(disburseDetails.taxWallet, disburseData.tax); transferIfNotZero(disburseDetails.BITWallet, disburseData.BIT); transferIfNotZero(disburseDetails.ChainITWallet, disburseData.ChainIT); transferIfNotZero(disburseDetails.rewardWallet, disburseData.reward); iEventEmitter.emitFullPaymentDisbursedEvent(ledgerData['ledgerId'].value, uniqueSecret, signature); lockLedger(uniqueSecret, signature); if (compareStrings(ledgerData['tokenType'].value, 'ERC1155')) { IERC1155(disburseDetails.vdtContract).safeTransferFrom( address(this), disburseDetails.buyerWallet, disburseData.assetId, disburseData.quantity, '' ); } else { IERC721(disburseDetails.vdtContract).safeTransferFrom( address(this), disburseDetails.buyerWallet, disburseData.assetId ); } } else { Rule storage rule = rulesData[ruleId]; require(!rule.isDisbursed, 'TransactionLedger: Rule already disbursed'); rule.isDisbursed = true; rulesData[ruleId] = rule; uint256 toWalletLength = rule.toWallet.length; for (uint256 index = 0; index < toWalletLength; index++) { totalAmount += rule.disburseValue[index]; } // Check if the contract has sufficient CIC balance require(CIC.balanceOf(address(this)) >= totalAmount, "TransactionLedger: Insufficient CIC"); // Transfer CIC to each recipient for (uint256 index = 0; index < toWalletLength; index++) { transferIfNotZero(rule.toWallet[index], rule.disburseValue[index]); } } } /** * @dev Delist the product. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function delist(uint256 uniqueSecret, bytes memory signature) external override nonReentrant onlyAdmin { require(isInitialized, 'TransactionLedger: Ledger not initialized'); require(!paymentDisbursed, 'TransactionLedger: Payment already disbursed'); require(!ledgerLock, 'TransactionLedger: Ledger is lock'); string[] memory tempKey = new string[](1); string[] memory tempValue = new string[](1); tempKey[0] = 'transactionStatus'; tempValue[0] = 'ORDER_DELISTED'; require(compareStrings(ledgerData[tempKey[0]].value, 'ORDER_DELISTED'), 'TransactionLedger: Already delisted'); ledgerData[tempKey[0]] = Ledger(tempValue[0], true); lockLedger(uniqueSecret, signature); iEventEmitter.emitUpdateLedgerEvent(tempKey, tempValue, uniqueSecret, signature); iEventEmitter.emitDelistedEvent(ledgerData['listingId'].value, uniqueSecret, signature); IERC721(disburseDetails.vdtContract).safeTransferFrom( address(this), disburseDetails.sellerWallet, disburseData.assetId ); } /** * @dev Locks the ledger to prevent further modifications. * @param uniqueSecret Unique secret for verification. * @param signature Signature for authorization. */ function lockLedger(uint256 uniqueSecret, bytes memory signature) public onlyAdmin { require(!ledgerLock, 'TransactionLedger: Ledger is already lock'); ledgerLock = true; iEventEmitter.emitLedgerLockEvent(ledgerLock, uniqueSecret, signature); } function addOrchestrator(address orchestratorAddress) external { iOrchestrator = IOrchestrator(orchestratorAddress); } function isAdmin(address wallet) external view returns (bool) { return iOrchestrator.isAdminAddress(wallet); } /** * @dev Retrieve the ledger data as a JSON string. * @return A JSON string representing the ledger data. */ function getLedger() external view returns (string memory) { if (ledgerCounter <= 0) { return '{}'; } bytes memory jsonData = abi.encodePacked('{'); for (uint256 index = 0; index <= ledgerCounter; index++) { string memory key = ledgerKeys[index]; string memory value = ledgerData[key].value; jsonData = abi.encodePacked(jsonData, '"', key, '":"', value, '"'); if ((index + 1) <= ledgerCounter) { jsonData = abi.encodePacked(jsonData, ','); } } jsonData = abi.encodePacked(jsonData, '}'); return string(jsonData); } function compareStrings(string memory a, string memory b) internal pure returns (bool) { return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b)); } function transferIfNotZero(address to, uint256 amount) internal { if(to != ZERO_ADDRESS) CIC.transferFrom(address(this), to, amount); } function updateIMPL (address newImpl) external { impl = newImpl; } modifier onlyAdmin() { require(iOrchestrator.isAdminAddress(msg.sender), "TransactionLedger: Only admin can call this function"); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IOrchestrator { function isAdminAddress(address wallet) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import './IBase.sol'; interface ITransactionLedger is IBase { /** * @dev Structure to store ledger details. * @param value The value associated with the ledger entry. * @param isExist A boolean indicating if the ledger entry exists. */ struct Ledger { string value; bool isExist; } /** * @dev Initializes the ledger with provided keys and values. * @param eventEmitter THe event emitter contract address. * @param CICAddress The CIC contract address. * @param ledgerKeysParam An array of strings representing ledger keys. * @param ledgerValuesParam An array of strings representing ledger values. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function initLedger( address eventEmitter, address CICAddress, address iOrchestratorAddress, string[] memory ledgerKeysParam, string[] memory ledgerValuesParam, uint256 uniqueSecret, bytes memory signature ) external; /** * @dev Updates the ledger with new values and payment details. * @param ledgerKeysParam An array of strings representing ledger keys. * @param ledgerValuesParam An array of strings representing ledger values. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function updateLedger( string[] memory ledgerKeysParam, string[] memory ledgerValuesParam, uint256 uniqueSecret, bytes memory signature ) external; /** * @dev Adds new rules to the system. * @param rules An array of Rule structures defining the new rules. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function addNewRules(Rule[] calldata rules, uint256 uniqueSecret, bytes memory signature) external; /** * @dev Disburses payment according to the specified rule. * @param ruleId The identifier of the rule for payment disbursement. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function disbursePayment(uint256 ruleId, uint256 uniqueSecret, bytes memory signature) external; /** * @dev Delist the product. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function delist(uint256 uniqueSecret, bytes memory signature) external; /** * @dev Add details of a disbursement. * @param disburseDetails A struct containing the details of the disbursement. * @param uniqueSecret A unique secret used for verification. * @param signature A cryptographic signature for authorization. */ function addDisburseDetails( DisburseDetails memory disburseDetails, DisburseData memory disburseData, uint256 uniqueSecret, bytes memory signature ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface ICIC is IERC20 { }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "./IBase.sol"; import "./IBaseOrchestrator.sol"; interface IEventEmitter is IBase, IBaseOrchestrator { /** * @notice Emits the InitLedger event with the provided keys, values, unique secret and signature.. * @param keys An array of string keys to be logged in the event. * @param values An array of string values corresponding to the keys to be logged in the event. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature used to validate the caller. */ function emitInitLedgerEvent(string[] memory keys, string[] memory values, uint256 uniqueSecret, bytes memory signature) external; /** * @notice Emits the UpdateLedger event event with the provided keys, values, unique secret, and signature.. * @param keys An array of string keys to be logged in the event. * @param values An array of string values corresponding to the keys to be logged in the event. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature used to validate the caller. */ function emitUpdateLedgerEvent(string[] memory keys, string[] memory values, uint256 uniqueSecret, bytes memory signature) external; /** * @notice Emits the LockLedger event with the provided lock status, unique secret and signature.. * @param isLocked A boolean indicating whether the ledger is locked or not. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature used to validate the caller. */ function emitLedgerLockEvent(bool isLocked, uint256 uniqueSecret, bytes memory signature) external; /** * @notice Emits the NewRuleAdded event with the provided rule keys, values, unique secret, signature.. * @param rule The rules which is newly added. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature used to validate the caller. */ function emitNewRuleAddedEvent(Rule[] memory rule, uint256 uniqueSecret, bytes memory signature) external; /** * @notice Emits the FullPaymentDisbursed event for the given listing ID. * @param listingId The unique identifier for the listing for which the event is emitted. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature to validate the caller. */ function emitFullPaymentDisbursedEvent(string memory listingId, uint256 uniqueSecret, bytes memory signature) external; /** * @notice Emits the Delisted event for the given listing ID. * @param listingId The unique identifier for the listing that is being delisted. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature to validate the caller. */ function emitDelistedEvent(string memory listingId, uint256 uniqueSecret, bytes memory signature) external; /** * @notice Emits the RuleDisbursed event for the given rule ID. * @param ruleId The unique identifier for the rule for which the event is emitted. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature to validate the caller. */ function emitRulePaymentDisbursedEvent(uint256 ruleId, uint256 uniqueSecret, bytes memory signature) external; /** * @notice Emits the VDTMinted event with the VDT details. * @param vdtContractAddress The address of the VDT contract * @param businessRecipient The address to the business recipient * @param consumerRecipient The address to the consumer recipient * @param nftTokenURI The URI of the NFT metadata * @param tokenId The token ID of the minted NFT */ function emitVDTMintedEvent(address vdtContractAddress, address businessRecipient, address consumerRecipient, string memory nftTokenURI, uint256 tokenId) external; /** * @notice Emits the VDTMinted event with the VDT details. * @param vdtContractAddress The address of the VDT contract * @param businessRecipient The address to the business recipient * @param sellerRecipient The address to the seller recipient * @param consumerRecipient The address to the consumer recipient * @param nftTokenURI The URI of the NFT metadata * @param tokenId The token ID of the minted NFT */ function emitServiceVDTMintedEvent(address vdtContractAddress, address businessRecipient, address sellerRecipient, address consumerRecipient, string memory nftTokenURI, uint256 tokenId) external; /** * @notice Emits the TokenURIUpdated event with the new tokenURI details. * @param vdtContractAddress The address of the VDT contract * @param tokenId The ID of the token to update * @param nftTokenURI The new URI of the NFT metadata */ function emitTokenURIUpdatedEvent(address vdtContractAddress, string memory nftTokenURI, uint256 tokenId) external; /** * @notice Emits the VDTCreated event with the VDT details. * @param VDTTokenDetails The details of the VDTs created. */ function emitMultiVDTCreated(VDTTokenDetail[] memory VDTTokenDetails) external; /** * @notice Emits the VDTTransfer event with the VDT details. * @param vdtContractAddress The address of the VDT contract * @param from The address of the sender * @param to The address of the recipient * @param tokenId The token Id of the token transferred */ function emitVDTTransferEvent(address vdtContractAddress, address from, address to, uint256 tokenId) external; /** * @notice Emits the ListVDT event with the provided data. * @param vdtName The name of the VDT to be logged in the event. * @param vdtAddress The address of the VDT to be logged in the event. * @param listingId The unique identifier for the listing for which the event is emitted. * @param from The address from which the VDT is being transferred. * @param to The address to which the VDT is being transferred. * @param tokenId The unique identifier of the token being transferred. */ function emitListVDT(string memory vdtName, address vdtAddress, string memory listingId, address from, address to, uint256 tokenId) external; /** * @notice Emits the DisburseDetailsAdded event with the provided disbursement details. * @param disburseDetail A struct containing the details of the disbursement to be logged in the event. * @param disburseData A struct containing the data of the disbursement amount to be logged in the event. * @param uniqueSecret The unique secret used to validate the signature. * @param signature A cryptographic signature used to validate the caller. */ function emitDisburseDetailsAddedEvent(DisburseDetails memory disburseDetail, DisburseData memory disburseData, uint256 uniqueSecret, bytes memory signature) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @title IBase * @dev Interface defining structures and enumerations for payment disbursement * and transaction rules involving ERC721 and ERC1155 tokens. */ interface IBase { /** * @dev Enumeration specifying the type of rule value. * PERCENT - Represents a percentage-based value. * FIX - Represents a fixed value. */ enum RuleValueType { PERCENT, FIX } /** * @dev Struct defining the details for disbursing payments in a transaction. * @param royaltyWallet Address where royalty payments are sent. * @param affiliateWallet Address where affiliate payments are sent. * @param sellerWallet Address of the seller who will receive payment. * @param buyerWallet Address of the buyer involved in the transaction. * @param bitWallet Address used for platform fees or additional charges. * @param vdtContract Address of a contract, possibly involved in managing disbursement. * @param royalty Amount allocated for royalties. * @param affiliate Amount allocated for affiliate commission. * @param seller Amount allocated for the seller. * @param bit Amount allocated for platform or additional fees. * @param assetId Identifier for the asset being transacted. * @param quantity Number of tokens or assets being transferred. */ struct DisburseDetails { address royaltyWallet; address affiliateWallet; address sellerWallet; address buyerWallet; address CIPWallet; address ChainITWallet; address BITWallet; address shippingWallet; address taxWallet; address rewardWallet; address vdtContract; } struct DisburseData { uint256 royalty; uint256 affiliate; uint256 seller; uint256 CIP; uint256 shipping; uint256 tax; uint256 assetId; uint256 quantity; uint256 ChainIT; uint256 BIT; uint256 reward; } /** * @dev Struct defining a rule for payment disbursement. * @param ruleId Unique identifier for the rule. * @param ruleValue Array of values associated with the rule (e.g., thresholds, limits). * @param disburseValue Array of values determining how much to disburse according to the rule. * @param toWallet Array of wallet addresses where the payments will be sent. * @param valueType Array indicating if each disbursement is a percentage or fixed amount. * @param isDisbursed Flag indicating if the disbursement has already been completed. */ struct Rule { string ruleId; uint256[] ruleValue; uint256[] disburseValue; address[] toWallet; RuleValueType[] valueType; bool isDisbursed; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IBaseOrchestrator { struct VDTTokenDetail { address user; address vdtContract; uint256 vdtId; string vdtName; string metadataURI; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[],"name":"CIC","outputs":[{"internalType":"contract ICIC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"royaltyWallet","type":"address"},{"internalType":"address","name":"affiliateWallet","type":"address"},{"internalType":"address","name":"sellerWallet","type":"address"},{"internalType":"address","name":"buyerWallet","type":"address"},{"internalType":"address","name":"CIPWallet","type":"address"},{"internalType":"address","name":"ChainITWallet","type":"address"},{"internalType":"address","name":"BITWallet","type":"address"},{"internalType":"address","name":"shippingWallet","type":"address"},{"internalType":"address","name":"taxWallet","type":"address"},{"internalType":"address","name":"rewardWallet","type":"address"},{"internalType":"address","name":"vdtContract","type":"address"}],"internalType":"struct IBase.DisburseDetails","name":"disbursementDetail","type":"tuple"},{"components":[{"internalType":"uint256","name":"royalty","type":"uint256"},{"internalType":"uint256","name":"affiliate","type":"uint256"},{"internalType":"uint256","name":"seller","type":"uint256"},{"internalType":"uint256","name":"CIP","type":"uint256"},{"internalType":"uint256","name":"shipping","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"},{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"ChainIT","type":"uint256"},{"internalType":"uint256","name":"BIT","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"internalType":"struct IBase.DisburseData","name":"disbursementData","type":"tuple"},{"internalType":"uint256","name":"uniqueSecret","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"addDisburseDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"ruleId","type":"string"},{"internalType":"uint256[]","name":"ruleValue","type":"uint256[]"},{"internalType":"uint256[]","name":"disburseValue","type":"uint256[]"},{"internalType":"address[]","name":"toWallet","type":"address[]"},{"internalType":"enum IBase.RuleValueType[]","name":"valueType","type":"uint8[]"},{"internalType":"bool","name":"isDisbursed","type":"bool"}],"internalType":"struct IBase.Rule[]","name":"rules","type":"tuple[]"},{"internalType":"uint256","name":"uniqueSecret","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"addNewRules","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"orchestratorAddress","type":"address"}],"name":"addOrchestrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"uniqueSecret","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"delist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disburseData","outputs":[{"internalType":"uint256","name":"royalty","type":"uint256"},{"internalType":"uint256","name":"affiliate","type":"uint256"},{"internalType":"uint256","name":"seller","type":"uint256"},{"internalType":"uint256","name":"CIP","type":"uint256"},{"internalType":"uint256","name":"shipping","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"},{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"ChainIT","type":"uint256"},{"internalType":"uint256","name":"BIT","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disburseDetails","outputs":[{"internalType":"address","name":"royaltyWallet","type":"address"},{"internalType":"address","name":"affiliateWallet","type":"address"},{"internalType":"address","name":"sellerWallet","type":"address"},{"internalType":"address","name":"buyerWallet","type":"address"},{"internalType":"address","name":"CIPWallet","type":"address"},{"internalType":"address","name":"ChainITWallet","type":"address"},{"internalType":"address","name":"BITWallet","type":"address"},{"internalType":"address","name":"shippingWallet","type":"address"},{"internalType":"address","name":"taxWallet","type":"address"},{"internalType":"address","name":"rewardWallet","type":"address"},{"internalType":"address","name":"vdtContract","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ruleId","type":"uint256"},{"internalType":"uint256","name":"uniqueSecret","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"disbursePayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLedger","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iEventEmitter","outputs":[{"internalType":"contract IEventEmitter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iOrchestrator","outputs":[{"internalType":"contract IOrchestrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"impl","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"eventEmitter","type":"address"},{"internalType":"address","name":"CICAddress","type":"address"},{"internalType":"address","name":"iOrchestratorAddress","type":"address"},{"internalType":"string[]","name":"ledgerKeysParam","type":"string[]"},{"internalType":"string[]","name":"ledgerValuesParam","type":"string[]"},{"internalType":"uint256","name":"uniqueSecret","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"initLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRuleAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"ledgerData","outputs":[{"internalType":"string","name":"value","type":"string"},{"internalType":"bool","name":"isExist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ledgerKeys","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ledgerLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"uniqueSecret","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"lockLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paymentDisbursed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rulesCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rulesData","outputs":[{"internalType":"string","name":"ruleId","type":"string"},{"internalType":"bool","name":"isDisbursed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImpl","type":"address"}],"name":"updateIMPL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"ledgerKeysParam","type":"string[]"},{"internalType":"string[]","name":"ledgerValuesParam","type":"string[]"},{"internalType":"uint256","name":"uniqueSecret","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"updateLedger","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50600180556200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61406d80620000f86000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806387b209b7116100de578063d578dddd11610097578063e683b7f211610071578063e683b7f214610493578063ea535e80146104a0578063f36f235d146104d0578063f945fed0146104d857600080fd5b8063d578dddd14610444578063d615d1c014610465578063def51dc21461047857600080fd5b806387b209b7146103b1578063885bff7b146103c857806388d99337146103db5780638abf60771461040b578063c54cdb011461041e578063c74111911461043157600080fd5b80633bd5b669116101305780633bd5b66914610332578063402c2ecc1461034557806349bd604e14610358578063737733e31461036b5780637fdd66941461038b57806382d13d6d1461039e57600080fd5b80631ecd33d71461017857806322b8e5b71461018d57806324d7806c146101bd5780632d11ee14146101e0578063381a0ee014610265578063392e53cd14610320575b600080fd5b61018b6101863660046128f7565b6104ec565b005b601c546101a0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d06101cb366004612965565b610a56565b60405190151581526020016101b4565b601054601154601254601354601454601554601654601754601854601954601a546102129a999897969594939291908b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830152610140820152610160016101b4565b600554600654600754600854600954600a54600b54600c54600d54600e54600f546102b59a6001600160a01b039081169a811699811698811697811696811695811694811693811692811691168b565b604080516001600160a01b039c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015284166101008401528316610120830152909116610140820152610160016101b4565b601f546101d090610100900460ff1681565b61018b6103403660046128f7565b610acb565b61018b610353366004612a1a565b610c44565b61018b610366366004612bf0565b611068565b61037e610379366004612cb7565b6113fd565b6040516101b49190612d20565b61018b610399366004612d33565b611497565b61018b6103ac366004612db8565b6117c6565b6103ba601e5481565b6040519081526020016101b4565b601f546101d09062010000900460ff1681565b61018b6103e9366004612965565b602080546001600160a01b0319166001600160a01b0392909216919091179055565b6020546101a0906001600160a01b031681565b601b546101a0906001600160a01b031681565b61018b61043f366004612e07565b612064565b610457610452366004612cb7565b6122e5565b6040516101b4929190612e8e565b610457610473366004612eb2565b61238c565b601f546101a09064010000000090046001600160a01b031681565b601f546101d09060ff1681565b61018b6104ae366004612965565b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b61037e61243e565b601f546101d0906301000000900460ff1681565b6002600154036105175760405162461bcd60e51b815260040161050e90612eee565b60405180910390fd5b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015610564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105889190612f33565b6105a45760405162461bcd60e51b815260040161050e90612f50565b601f54610100900460ff166105cb5760405162461bcd60e51b815260040161050e90612fa4565b601f5460ff16156105ee5760405162461bcd60e51b815260040161050e90612fed565b601f546301000000900460ff16156106185760405162461bcd60e51b815260040161050e90613039565b604080516001808252818301909252600091816020015b606081526020019060019003908161062f57505060408051600180825281830190925291925060009190602082015b606081526020019060019003908161065e579050509050604051806040016040528060118152602001707472616e73616374696f6e53746174757360781b815250826000815181106106b2576106b261307a565b60200260200101819052506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b815250816000815181106106f7576106f761307a565b60200260200101819052506107f360038360008151811061071a5761071a61307a565b602002602001015160405161072f9190613090565b9081526040519081900360200190208054610749906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610775906130ac565b80156107c25780601f10610797576101008083540402835291602001916107c2565b820191906000526020600020905b8154815290600101906020018083116107a557829003601f168201915b50505050506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b815250612673565b61084b5760405162461bcd60e51b815260206004820152602360248201527f5472616e73616374696f6e4c65646765723a20416c72656164792064656c69736044820152621d195960ea1b606482015260840161050e565b6040518060400160405280826000815181106108695761086961307a565b60200260200101518152602001600115158152506003836000815181106108925761089261307a565b60200260200101516040516108a79190613090565b908152604051908190036020019020815181906108c49082613150565b50602091909101516001909101805460ff19169115159190911790556108ea8484610acb565b601b5460405163098c667960e21b81526001600160a01b039091169063263199e49061092090859085908990899060040161325e565b600060405180830381600087803b15801561093a57600080fd5b505af115801561094e573d6000803e3d6000fd5b5050601b5460408051681b1a5cdd1a5b99d25960ba1b8152600360098201529051908190036029018120635b862f0560e11b82526001600160a01b03909216935063b70c5e0a92506109a79190889088906004016132a8565b600060405180830381600087803b1580156109c157600080fd5b505af11580156109d5573d6000803e3d6000fd5b5050600f54600754601654604051632142170760e11b81523060048201526001600160a01b0392831660248201526044810191909152911692506342842e0e91506064015b600060405180830381600087803b158015610a3457600080fd5b505af1158015610a48573d6000803e3d6000fd5b505060018055505050505050565b601c5460405163011b5dad60e11b81526001600160a01b0383811660048301526000921690630236bb5a90602401602060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190612f33565b92915050565b601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b379190612f33565b610b535760405162461bcd60e51b815260040161050e90612f50565b601f546301000000900460ff1615610bbf5760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a204c656467657220697320616c7260448201526865616479206c6f636b60b81b606482015260840161050e565b601f805463ff0000001916630100000090811791829055601b5460405163fc7050eb60e01b81526001600160a01b039091169263fc7050eb92610c0e92910460ff16908690869060040161334e565b600060405180830381600087803b158015610c2857600080fd5b505af1158015610c3c573d6000803e3d6000fd5b505050505050565b600260015403610c665760405162461bcd60e51b815260040161050e90612eee565b600260015560408401516001600160a01b0316610cd75760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c6560448201526872206164647265737360b81b606482015260840161050e565b6000836040015111610d3c5760405162461bcd60e51b815260206004820152602860248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c656044820152671c88185b5bdd5b9d60c21b606482015260840161050e565b6007546001600160a01b031615610db05760405162461bcd60e51b815260206004820152603260248201527f5472616e73616374696f6e4c65646765723a2044697362757273652064657461604482015271696c7320616c72656164792065786973747360701b606482015260840161050e565b83600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050826010600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155905050601b60009054906101000a90046001600160a01b03166001600160a01b0316639840fcbc6005601085856040518563ffffffff1660e01b8152600401610a1a9493929190613378565b60026001540361108a5760405162461bcd60e51b815260040161050e90612eee565b6002600155600054610100900460ff16158080156110af5750600054600160ff909116105b806110c95750303b1580156110c9575060005460ff166001145b61112c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161050e565b6000805460ff19166001179055801561114f576000805461ff0019166101001790555b6001600160a01b0388166111755760405162461bcd60e51b815260040161050e9061355e565b6001600160a01b03871661119b5760405162461bcd60e51b815260040161050e9061355e565b8451806111ba5760405162461bcd60e51b815260040161050e906135a7565b8451811461120a5760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c6964206461746100604482015260640161050e565b60005b818110156112ed578681815181106112275761122761307a565b602002602001015160026000838152602001908152602001600020908161124e9190613150565b50604051806040016040528087838151811061126c5761126c61307a565b60200260200101518152602001600115158152506003600260008481526020019081526020016000206040516112a291906135f1565b908152604051908190036020019020815181906112bf9082613150565b50602091909101516001909101805460ff1916911515919091179055806112e58161367d565b91505061120d565b506112f9600182613696565b601d55601f8054601b80546001600160a01b03199081166001600160a01b038e81169182179093556101006001600160c01b03199094166401000000008e8516021793909317909355601c8054909316908a161790915560405163225f921960e21b815263897e48649061137790899089908990899060040161325e565b600060405180830381600087803b15801561139157600080fd5b505af11580156113a5573d6000803e3d6000fd5b50505050508015610a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505060018055505050505050565b60026020526000908152604090208054611416906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611442906130ac565b801561148f5780601f106114645761010080835404028352916020019161148f565b820191906000526020600020905b81548152906001019060200180831161147257829003601f168201915b505050505081565b6002600154036114b95760405162461bcd60e51b815260040161050e90612eee565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190612f33565b6115465760405162461bcd60e51b815260040161050e90612f50565b8351601f546301000000900460ff16156115725760405162461bcd60e51b815260040161050e906136a9565b601f54610100900460ff166115995760405162461bcd60e51b815260040161050e90612fa4565b600081116115b95760405162461bcd60e51b815260040161050e906135a7565b835181146116095760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c6964206461746100604482015260640161050e565b60005b818110156117525760038682815181106116285761162861307a565b602002602001015160405161163d9190613090565b9081526040519081900360200190206001015460ff166116ad5760405162461bcd60e51b815260206004820152602560248201527f5472616e73616374696f6e4c65646765723a20496e76616c6964206c6564676560448201526472206b657960d81b606482015260840161050e565b60405180604001604052808683815181106116ca576116ca61307a565b602002602001015181526020016001151581525060038783815181106116f2576116f261307a565b60200260200101516040516117079190613090565b908152604051908190036020019020815181906117249082613150565b50602091909101516001909101805460ff19169115159190911790558061174a8161367d565b91505061160c565b50601b5460405163098c667960e21b81526001600160a01b039091169063263199e49061178990889088908890889060040161325e565b600060405180830381600087803b1580156117a357600080fd5b505af11580156117b7573d6000803e3d6000fd5b50506001805550505050505050565b6002600154036117e85760405162461bcd60e51b815260040161050e90612eee565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015611835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118599190612f33565b6118755760405162461bcd60e51b815260040161050e90612f50565b601f54610100900460ff1661189c5760405162461bcd60e51b815260040161050e90612fa4565b601f5460ff16156118bf5760405162461bcd60e51b815260040161050e90612fed565b601f546301000000900460ff16156118e95760405162461bcd60e51b815260040161050e90613039565b6007546001600160a01b03166119585760405162461bcd60e51b815260206004820152602e60248201527f5472616e73616374696f6e4c65646765723a204469736275727365206465746160448201526d696c73206e6f742065786973747360901b606482015260840161050e565b600083600003611df257601f805460ff1916600117905560155460145460135460125460115460105461198b91906136ec565b61199591906136ec565b61199f91906136ec565b6119a991906136ec565b6119b391906136ec565b601f546040516370a0823160e01b815230600482015291925082916401000000009091046001600160a01b0316906370a0823190602401602060405180830381865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b91906136ff565b1015611a495760405162461bcd60e51b815260040161050e90613718565b601f5460205460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052640100000000909204169063095ea7b3906044016020604051808303816000875af1158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca9190612f33565b50600554601054611ae4916001600160a01b0316906126cc565b600654601154611afd916001600160a01b0316906126cc565b600754601254611b16916001600160a01b0316906126cc565b600954601354611b2f916001600160a01b0316906126cc565b600c54601454611b48916001600160a01b0316906126cc565b600d54601554611b61916001600160a01b0316906126cc565b600b54601954611b7a916001600160a01b0316906126cc565b600a54601854611b93916001600160a01b0316906126cc565b600e54601a54611bac916001600160a01b0316906126cc565b601b5460408051671b195919d95c925960c21b8152600360088201529051908190036028018120635f61f3a360e11b82526001600160a01b039092169163bec3e74691611c009190879087906004016132a8565b600060405180830381600087803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b50505050611c3c8383610acb565b611d1a6003604051611c5d9068746f6b656e5479706560b81b815260090190565b9081526040519081900360200190208054611c77906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca3906130ac565b8015611cf05780601f10611cc557610100808354040283529160200191611cf0565b820191906000526020600020905b815481529060010190602001808311611cd357829003601f168201915b5050505050604051806040016040528060078152602001664552433131353560c81b815250612673565b15611dad57600f54600854601654601754604051637921219560e11b81523060048201526001600160a01b0393841660248201526044810192909252606482015260a06084820152600060a482015291169063f242432a9060c4015b600060405180830381600087803b158015611d9057600080fd5b505af1158015611da4573d6000803e3d6000fd5b5050505061205a565b600f54600854601654604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e90606401611d76565b6000848152600460205260409020600581015460ff1615611e675760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2052756c6520616c726561647920604482015268191a5cd89d5c9cd95960ba1b606482015260840161050e565b60058101805460ff191660011790556000858152600460205260409020819080611e91838261375b565b5060018281018054611ea69284019190612767565b5060028281018054611ebb9284019190612767565b5060038281018054611ed09284019190612767565b5060048281018054611ee592840191906127b7565b506005918201549101805460ff191660ff9092161515919091179055600381015460005b81811015611f5057826002018181548110611f2657611f2661307a565b906000526020600020015484611f3c91906136ec565b935080611f488161367d565b915050611f09565b50601f546040516370a0823160e01b8152306004820152849164010000000090046001600160a01b0316906370a0823190602401602060405180830381865afa158015611fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc591906136ff565b1015611fe35760405162461bcd60e51b815260040161050e90613718565b60005b81811015612056576120448360030182815481106120065761200661307a565b6000918252602090912001546002850180546001600160a01b0390921691849081106120345761203461307a565b90600052602060002001546126cc565b8061204e8161367d565b915050611fe6565b5050505b5050600180555050565b6002600154036120865760405162461bcd60e51b815260040161050e90612eee565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa1580156120d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f79190612f33565b6121135760405162461bcd60e51b815260040161050e90612f50565b601f548390610100900460ff1661213c5760405162461bcd60e51b815260040161050e90612fa4565b601f5462010000900460ff16156121a45760405162461bcd60e51b815260206004820152602660248201527f5472616e73616374696f6e4c65646765723a2052756c657320616c726561647960448201526508185919195960d21b606482015260840161050e565b601f546301000000900460ff16156121ce5760405162461bcd60e51b815260040161050e906136a9565b600081116122305760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2072756c65732063616e206e6f7460448201526820626520656d70747960b81b606482015260840161050e565b60005b8481101561228f5785858281811061224d5761224d61307a565b905060200281019061225f9190613827565b601e54600090815260046020526040902061227a8282613bbe565b508190506122878161367d565b915050612233565b5061229b600182613696565b601e55601f805462ff0000191662010000179055601b546040516332644bf360e11b81526001600160a01b03909116906364c897e690611789908890889088908890600401613dfd565b600460205260009081526040902080548190612300906130ac565b80601f016020809104026020016040519081016040528092919081815260200182805461232c906130ac565b80156123795780601f1061234e57610100808354040283529160200191612379565b820191906000526020600020905b81548152906001019060200180831161235c57829003601f168201915b5050506005909301549192505060ff1682565b80516020818301810180516003825292820191909301209152805481906123b2906130ac565b80601f01602080910402602001604051908101604052809291908181526020018280546123de906130ac565b801561242b5780601f106124005761010080835404028352916020019161242b565b820191906000526020600020905b81548152906001019060200180831161240e57829003601f168201915b5050506001909301549192505060ff1682565b60606000601d541161246757506040805180820190915260028152617b7d60f01b602082015290565b60408051607b60f81b602082015281516001818303018152602190910190915260005b601d54811161264b57600081815260026020526040812080546124ac906130ac565b80601f01602080910402602001604051908101604052809291908181526020018280546124d8906130ac565b80156125255780601f106124fa57610100808354040283529160200191612525565b820191906000526020600020905b81548152906001019060200180831161250857829003601f168201915b50505050509050600060038260405161253e9190613090565b9081526040519081900360200190208054612558906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612584906130ac565b80156125d15780601f106125a6576101008083540402835291602001916125d1565b820191906000526020600020905b8154815290600101906020018083116125b457829003601f168201915b505050505090508382826040516020016125ed93929190613f82565b6040516020818303038152906040529350601d5483600161260e91906136ec565b1161263657836040516020016126249190613fed565b60405160208183030381529060405293505b505080806126439061367d565b91505061248a565b508060405160200161265d9190614012565b60408051601f1981840301815291905292915050565b6000816040516020016126869190613090565b60405160208183030381529060405280519060200120836040516020016126ad9190613090565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b0382161561276357601f546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201849052640100000000909204909116906323b872dd906064016020604051808303816000875af115801561273d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127619190612f33565b505b5050565b8280548282559060005260206000209081019282156127a75760005260206000209182015b828111156127a757825482559160010191906001019061278c565b506127b3929150612804565b5090565b82805482825590600052602060002090601f016020900481019282156127a757600052602060002091601f01602090048201828111156127a757825482559160010191906001019061278c565b5b808211156127b35760008155600101612805565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561285257612852612819565b60405290565b604051601f8201601f191681016001600160401b038111828210171561288057612880612819565b604052919050565b600082601f83011261289957600080fd5b81356001600160401b038111156128b2576128b2612819565b6128c5601f8201601f1916602001612858565b8181528460208386010111156128da57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561290a57600080fd5b8235915060208301356001600160401b0381111561292757600080fd5b61293385828601612888565b9150509250929050565b6001600160a01b038116811461295257600080fd5b50565b80356129608161293d565b919050565b60006020828403121561297757600080fd5b81356129828161293d565b9392505050565b6000610160828403121561299c57600080fd5b6129a461282f565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b600080600080848603610300811215612a3257600080fd5b61016080821215612a4257600080fd5b612a4a61282f565b9150612a5587612955565b8252612a6360208801612955565b6020830152612a7460408801612955565b6040830152612a8560608801612955565b6060830152612a9660808801612955565b6080830152612aa760a08801612955565b60a0830152612ab860c08801612955565b60c0830152612ac960e08801612955565b60e0830152610100612adc818901612955565b90830152610120612aee888201612955565b90830152610140612b00888201612955565b8184015250819550612b1488828901612989565b945050506102c085013591506102e08501356001600160401b03811115612b3a57600080fd5b612b4687828801612888565b91505092959194509250565b600082601f830112612b6357600080fd5b813560206001600160401b0380831115612b7f57612b7f612819565b8260051b612b8e838201612858565b9384528581018301938381019088861115612ba857600080fd5b84880192505b85831015612be457823584811115612bc65760008081fd5b612bd48a87838c0101612888565b8352509184019190840190612bae565b98975050505050505050565b600080600080600080600060e0888a031215612c0b57600080fd5b8735612c168161293d565b96506020880135612c268161293d565b9550612c3460408901612955565b945060608801356001600160401b0380821115612c5057600080fd5b612c5c8b838c01612b52565b955060808a0135915080821115612c7257600080fd5b612c7e8b838c01612b52565b945060a08a0135935060c08a0135915080821115612c9b57600080fd5b50612ca88a828b01612888565b91505092959891949750929550565b600060208284031215612cc957600080fd5b5035919050565b60005b83811015612ceb578181015183820152602001612cd3565b50506000910152565b60008151808452612d0c816020860160208601612cd0565b601f01601f19169290920160200192915050565b6020815260006129826020830184612cf4565b60008060008060808587031215612d4957600080fd5b84356001600160401b0380821115612d6057600080fd5b612d6c88838901612b52565b95506020870135915080821115612d8257600080fd5b612d8e88838901612b52565b9450604087013593506060870135915080821115612dab57600080fd5b50612b4687828801612888565b600080600060608486031215612dcd57600080fd5b833592506020840135915060408401356001600160401b03811115612df157600080fd5b612dfd86828701612888565b9150509250925092565b60008060008060608587031215612e1d57600080fd5b84356001600160401b0380821115612e3457600080fd5b818701915087601f830112612e4857600080fd5b813581811115612e5757600080fd5b8860208260051b8501011115612e6c57600080fd5b60209283019650945090860135925060408601359080821115612dab57600080fd5b604081526000612ea16040830185612cf4565b905082151560208301529392505050565b600060208284031215612ec457600080fd5b81356001600160401b03811115612eda57600080fd5b612ee684828501612888565b949350505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b801515811461295257600080fd5b600060208284031215612f4557600080fd5b815161298281612f25565b60208082526034908201527f5472616e73616374696f6e4c65646765723a204f6e6c792061646d696e206361604082015273371031b0b636103a3434b990333ab731ba34b7b760611b606082015260800190565b60208082526029908201527f5472616e73616374696f6e4c65646765723a204c6564676572206e6f7420696e6040820152681a5d1a585b1a5e995960ba1b606082015260800190565b6020808252602c908201527f5472616e73616374696f6e4c65646765723a205061796d656e7420616c72656160408201526b191e48191a5cd89d5c9cd95960a21b606082015260800190565b60208082526021908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152606b60f81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600082516130a2818460208701612cd0565b9190910192915050565b600181811c908216806130c057607f821691505b6020821081036130e057634e487b7160e01b600052602260045260246000fd5b50919050565b5b8181101561276357600081556001016130e7565b601f82111561276157806000526020600020601f840160051c810160208510156131225750805b613134601f850160051c8301826130e6565b5050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561316957613169612819565b61317d8161317784546130ac565b846130fb565b602080601f8311600181146131ac576000841561319a5750858301515b6131a4858261313b565b865550610c3c565b600085815260208120601f198616915b828110156131db578886015182559484019460019091019084016131bc565b50858210156131f95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526020808501808196508360051b8101915082860160005b8581101561325157828403895261323f848351612cf4565b98850198935090840190600101613227565b5091979650505050505050565b6080815260006132716080830187613209565b82810360208401526132838187613209565b9050846040840152828103606084015261329d8185612cf4565b979650505050505050565b6060815260008085546132ba816130ac565b80606086015260806001808416600081146132dc57600181146132f657613327565b60ff1985168884015283151560051b880183019550613327565b8a60005260208060002060005b8681101561331e5781548b8201870152908401908201613303565b8a018501975050505b505050505084602084015282810360408401526133448185612cf4565b9695505050505050565b831515815282602082015260606040820152600061336f6060830184612cf4565b95945050505050565b600061030061339f8361339289546001600160a01b031690565b6001600160a01b03169052565b60018701546001600160a01b03166001600160a01b03811660208501525060028701546001600160a01b03166001600160a01b03811660408501525060038701546001600160a01b03166001600160a01b03811660608501525060048701546001600160a01b03166001600160a01b03811660808501525060058701546001600160a01b03166001600160a01b03811660a08501525060068701546001600160a01b03166001600160a01b03811660c08501525060078701546001600160a01b03166001600160a01b03811660e08501525060088701546001600160a01b03166001600160a01b0381166101008501525060098701546001600160a01b03166001600160a01b03811661012085015250600a8701546001600160a01b03166001600160a01b038116610140850152508554610160840152600186015461018084015260028601546101a084015260038601546101c084015260048601546101e084015260058601546102008401526006860154610220840152600786015461024084015260088601546102608401526009860154610280840152600a8601546102a0840152846102c0840152806102e084015261329d81840185612cf4565b60208082526029908201527f5472616e73616374696f6e4c65646765723a20416464726573732063616e6e6f60408201526874206265207a65726f60b81b606082015260800190565b6020808252602a908201527f5472616e73616374696f6e4c65646765723a2076616c7565732063616e206e6f6040820152697420626520656d70747960b01b606082015260800190565b60008083546135ff816130ac565b60018281168015613617576001811461362c5761365b565b60ff198416875282151583028701945061365b565b8760005260208060002060005b858110156136525781548a820152908401908201613639565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b60006001820161368f5761368f613667565b5060010190565b81810381811115610ac557610ac5613667565b60208082526023908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152621ad95960ea1b606082015260800190565b80820180821115610ac557610ac5613667565b60006020828403121561371157600080fd5b5051919050565b60208082526023908201527f5472616e73616374696f6e4c65646765723a20496e73756666696369656e742060408201526243494360e81b606082015260800190565b818103613766575050565b61377082546130ac565b6001600160401b0381111561378757613787612819565b6137958161317784546130ac565b6000601f8211600181146137c357600083156137b15750848201545b6137bb848261313b565b855550613134565b600085815260209020601f19841690600086815260209020845b838110156137fd57828601548255600195860195909101906020016137dd565b50858310156131f95793015460001960f8600387901b161c19169092555050600190811b01905550565b6000823560be198336030181126130a257600080fd5b6001600160401b0383111561385457613854612819565b6138688361386283546130ac565b836130fb565b6000601f84116001811461389657600085156138845750838201355b61388e868261313b565b845550613134565b600083815260209020601f19861690835b828110156138c757868501358255602094850194600190920191016138a7565b50868210156138e45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000808335601e1984360301811261390d57600080fd5b8301803591506001600160401b0382111561392757600080fd5b6020019150600581901b360382131561393f57600080fd5b9250929050565b81831015612761578060005260206000206139658382018583016130e6565b50505050565b6001600160401b0383111561398257613982612819565b600160401b83111561399657613996612819565b80548382556139a6848284613946565b50818160005260208060002060005b868110156139cf57833582820155928201926001016139b5565b50505050505050565b6001600160401b038311156139ef576139ef612819565b600160401b831115613a0357613a03612819565b8054838255613a13848284613946565b50818160005260208060002060005b868110156139cf578335613a358161293d565b8282015592820192600101613a22565b600160401b821115613a5957613a59612819565b80548282558083101561276157816000526020600020601f840160051c8101601f85168015613a99576000198083018054828460200360031b1c16815550505b50613134601f840160051c8301826130e6565b6002811061295257600080fd5b60008135610ac581613aac565b6001600160401b03831115613add57613add612819565b613ae78382613a45565b60008181526020902082908460051c60005b81811015613b51576000805b6020808210613b145750613b44565b613b37613b2088613ab9565b60ff600385901b90811b801987169290911b161790565b9601959150600101613b05565b5083820155600101613af9565b50601f198616808703818814613ba7576000805b82811015613ba157613b90613b7988613ab9565b60ff600384901b90811b801986169290911b161790565b602097909701969150600101613b65565b50848401555b5050505050505050565b60008135610ac581612f25565b8135601e19833603018112613bd257600080fd5b820180356001600160401b03811115613bea57600080fd5b602082019150803603821315613bff57600080fd5b613c0a81838561383d565b5050613c1960208301836138f6565b613c2781836001860161396b565b5050613c3660408301836138f6565b613c4481836002860161396b565b5050613c5360608301836138f6565b613c618183600386016139d8565b5050613c7060808301836138f6565b613c7e818360048601613ac6565b5050612763613c8f60a08401613bb1565b6005830160ff1981541660ff8315151681178255505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e19843603018112613ce857600080fd5b83016020810192503590506001600160401b03811115613d0757600080fd5b8060051b360382131561393f57600080fd5b81835260006001600160fb1b03831115613d3257600080fd5b8260051b80836020870137939093016020019392505050565b8183526000602080850194508260005b85811015613d89578135613d6e8161293d565b6001600160a01b031687529582019590820190600101613d5b565b509495945050505050565b818352600060208085019450826000805b86811015613de6578235613db881613aac565b60028110613dd457634e487b7160e01b83526021600452602483fd5b88529683019691830191600101613da5565b50959695505050505050565b803561296081612f25565b60608082528181018590526000906080808401600588901b8501820189855b8a811015613f5a57878303607f190184528135368d900360be19018112613e4257600080fd5b8c0160c0813536839003601e19018112613e5b57600080fd5b820160208181019135906001600160401b03821115613e7957600080fd5b813603831315613e8857600080fd5b838852613e988489018385613ca8565b9350613ea681860186613cd1565b9350915087840381890152613ebc848484613d19565b935060409250613ece83860186613cd1565b9250888503848a0152613ee2858483613d19565b945050613ef18b860186613cd1565b935091508784038b890152613f07848484613d4b565b9350613f158a860186613cd1565b935091508784038a890152613f2b848484613d94565b935060a09250613f3c838601613df2565b15159290970191909152509484019493929092019150600101613e1c565b50508760208701528581036040870152613f748188612cf4565b9a9950505050505050505050565b60008451613f94818460208901612cd0565b601160f91b9083018181528551909190613fb5816001850160208a01612cd0565b62111d1160e91b600193909101928301528451613fd9816004850160208901612cd0565b600492019182015260050195945050505050565b60008251613fff818460208701612cd0565b600b60fa1b920191825250600101919050565b60008251614024818460208701612cd0565b607d60f81b92019182525060010191905056fea26469706673582212203b8376ab1dcaaa799db958c95b51270ff0f7609178dac8918b8da3e991058f0064736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806387b209b7116100de578063d578dddd11610097578063e683b7f211610071578063e683b7f214610493578063ea535e80146104a0578063f36f235d146104d0578063f945fed0146104d857600080fd5b8063d578dddd14610444578063d615d1c014610465578063def51dc21461047857600080fd5b806387b209b7146103b1578063885bff7b146103c857806388d99337146103db5780638abf60771461040b578063c54cdb011461041e578063c74111911461043157600080fd5b80633bd5b669116101305780633bd5b66914610332578063402c2ecc1461034557806349bd604e14610358578063737733e31461036b5780637fdd66941461038b57806382d13d6d1461039e57600080fd5b80631ecd33d71461017857806322b8e5b71461018d57806324d7806c146101bd5780632d11ee14146101e0578063381a0ee014610265578063392e53cd14610320575b600080fd5b61018b6101863660046128f7565b6104ec565b005b601c546101a0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d06101cb366004612965565b610a56565b60405190151581526020016101b4565b601054601154601254601354601454601554601654601754601854601954601a546102129a999897969594939291908b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830152610140820152610160016101b4565b600554600654600754600854600954600a54600b54600c54600d54600e54600f546102b59a6001600160a01b039081169a811699811698811697811696811695811694811693811692811691168b565b604080516001600160a01b039c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015284166101008401528316610120830152909116610140820152610160016101b4565b601f546101d090610100900460ff1681565b61018b6103403660046128f7565b610acb565b61018b610353366004612a1a565b610c44565b61018b610366366004612bf0565b611068565b61037e610379366004612cb7565b6113fd565b6040516101b49190612d20565b61018b610399366004612d33565b611497565b61018b6103ac366004612db8565b6117c6565b6103ba601e5481565b6040519081526020016101b4565b601f546101d09062010000900460ff1681565b61018b6103e9366004612965565b602080546001600160a01b0319166001600160a01b0392909216919091179055565b6020546101a0906001600160a01b031681565b601b546101a0906001600160a01b031681565b61018b61043f366004612e07565b612064565b610457610452366004612cb7565b6122e5565b6040516101b4929190612e8e565b610457610473366004612eb2565b61238c565b601f546101a09064010000000090046001600160a01b031681565b601f546101d09060ff1681565b61018b6104ae366004612965565b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b61037e61243e565b601f546101d0906301000000900460ff1681565b6002600154036105175760405162461bcd60e51b815260040161050e90612eee565b60405180910390fd5b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015610564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105889190612f33565b6105a45760405162461bcd60e51b815260040161050e90612f50565b601f54610100900460ff166105cb5760405162461bcd60e51b815260040161050e90612fa4565b601f5460ff16156105ee5760405162461bcd60e51b815260040161050e90612fed565b601f546301000000900460ff16156106185760405162461bcd60e51b815260040161050e90613039565b604080516001808252818301909252600091816020015b606081526020019060019003908161062f57505060408051600180825281830190925291925060009190602082015b606081526020019060019003908161065e579050509050604051806040016040528060118152602001707472616e73616374696f6e53746174757360781b815250826000815181106106b2576106b261307a565b60200260200101819052506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b815250816000815181106106f7576106f761307a565b60200260200101819052506107f360038360008151811061071a5761071a61307a565b602002602001015160405161072f9190613090565b9081526040519081900360200190208054610749906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610775906130ac565b80156107c25780601f10610797576101008083540402835291602001916107c2565b820191906000526020600020905b8154815290600101906020018083116107a557829003601f168201915b50505050506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b815250612673565b61084b5760405162461bcd60e51b815260206004820152602360248201527f5472616e73616374696f6e4c65646765723a20416c72656164792064656c69736044820152621d195960ea1b606482015260840161050e565b6040518060400160405280826000815181106108695761086961307a565b60200260200101518152602001600115158152506003836000815181106108925761089261307a565b60200260200101516040516108a79190613090565b908152604051908190036020019020815181906108c49082613150565b50602091909101516001909101805460ff19169115159190911790556108ea8484610acb565b601b5460405163098c667960e21b81526001600160a01b039091169063263199e49061092090859085908990899060040161325e565b600060405180830381600087803b15801561093a57600080fd5b505af115801561094e573d6000803e3d6000fd5b5050601b5460408051681b1a5cdd1a5b99d25960ba1b8152600360098201529051908190036029018120635b862f0560e11b82526001600160a01b03909216935063b70c5e0a92506109a79190889088906004016132a8565b600060405180830381600087803b1580156109c157600080fd5b505af11580156109d5573d6000803e3d6000fd5b5050600f54600754601654604051632142170760e11b81523060048201526001600160a01b0392831660248201526044810191909152911692506342842e0e91506064015b600060405180830381600087803b158015610a3457600080fd5b505af1158015610a48573d6000803e3d6000fd5b505060018055505050505050565b601c5460405163011b5dad60e11b81526001600160a01b0383811660048301526000921690630236bb5a90602401602060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190612f33565b92915050565b601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b379190612f33565b610b535760405162461bcd60e51b815260040161050e90612f50565b601f546301000000900460ff1615610bbf5760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a204c656467657220697320616c7260448201526865616479206c6f636b60b81b606482015260840161050e565b601f805463ff0000001916630100000090811791829055601b5460405163fc7050eb60e01b81526001600160a01b039091169263fc7050eb92610c0e92910460ff16908690869060040161334e565b600060405180830381600087803b158015610c2857600080fd5b505af1158015610c3c573d6000803e3d6000fd5b505050505050565b600260015403610c665760405162461bcd60e51b815260040161050e90612eee565b600260015560408401516001600160a01b0316610cd75760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c6560448201526872206164647265737360b81b606482015260840161050e565b6000836040015111610d3c5760405162461bcd60e51b815260206004820152602860248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c656044820152671c88185b5bdd5b9d60c21b606482015260840161050e565b6007546001600160a01b031615610db05760405162461bcd60e51b815260206004820152603260248201527f5472616e73616374696f6e4c65646765723a2044697362757273652064657461604482015271696c7320616c72656164792065786973747360701b606482015260840161050e565b83600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050826010600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155905050601b60009054906101000a90046001600160a01b03166001600160a01b0316639840fcbc6005601085856040518563ffffffff1660e01b8152600401610a1a9493929190613378565b60026001540361108a5760405162461bcd60e51b815260040161050e90612eee565b6002600155600054610100900460ff16158080156110af5750600054600160ff909116105b806110c95750303b1580156110c9575060005460ff166001145b61112c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161050e565b6000805460ff19166001179055801561114f576000805461ff0019166101001790555b6001600160a01b0388166111755760405162461bcd60e51b815260040161050e9061355e565b6001600160a01b03871661119b5760405162461bcd60e51b815260040161050e9061355e565b8451806111ba5760405162461bcd60e51b815260040161050e906135a7565b8451811461120a5760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c6964206461746100604482015260640161050e565b60005b818110156112ed578681815181106112275761122761307a565b602002602001015160026000838152602001908152602001600020908161124e9190613150565b50604051806040016040528087838151811061126c5761126c61307a565b60200260200101518152602001600115158152506003600260008481526020019081526020016000206040516112a291906135f1565b908152604051908190036020019020815181906112bf9082613150565b50602091909101516001909101805460ff1916911515919091179055806112e58161367d565b91505061120d565b506112f9600182613696565b601d55601f8054601b80546001600160a01b03199081166001600160a01b038e81169182179093556101006001600160c01b03199094166401000000008e8516021793909317909355601c8054909316908a161790915560405163225f921960e21b815263897e48649061137790899089908990899060040161325e565b600060405180830381600087803b15801561139157600080fd5b505af11580156113a5573d6000803e3d6000fd5b50505050508015610a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505060018055505050505050565b60026020526000908152604090208054611416906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611442906130ac565b801561148f5780601f106114645761010080835404028352916020019161148f565b820191906000526020600020905b81548152906001019060200180831161147257829003601f168201915b505050505081565b6002600154036114b95760405162461bcd60e51b815260040161050e90612eee565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190612f33565b6115465760405162461bcd60e51b815260040161050e90612f50565b8351601f546301000000900460ff16156115725760405162461bcd60e51b815260040161050e906136a9565b601f54610100900460ff166115995760405162461bcd60e51b815260040161050e90612fa4565b600081116115b95760405162461bcd60e51b815260040161050e906135a7565b835181146116095760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c6964206461746100604482015260640161050e565b60005b818110156117525760038682815181106116285761162861307a565b602002602001015160405161163d9190613090565b9081526040519081900360200190206001015460ff166116ad5760405162461bcd60e51b815260206004820152602560248201527f5472616e73616374696f6e4c65646765723a20496e76616c6964206c6564676560448201526472206b657960d81b606482015260840161050e565b60405180604001604052808683815181106116ca576116ca61307a565b602002602001015181526020016001151581525060038783815181106116f2576116f261307a565b60200260200101516040516117079190613090565b908152604051908190036020019020815181906117249082613150565b50602091909101516001909101805460ff19169115159190911790558061174a8161367d565b91505061160c565b50601b5460405163098c667960e21b81526001600160a01b039091169063263199e49061178990889088908890889060040161325e565b600060405180830381600087803b1580156117a357600080fd5b505af11580156117b7573d6000803e3d6000fd5b50506001805550505050505050565b6002600154036117e85760405162461bcd60e51b815260040161050e90612eee565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015611835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118599190612f33565b6118755760405162461bcd60e51b815260040161050e90612f50565b601f54610100900460ff1661189c5760405162461bcd60e51b815260040161050e90612fa4565b601f5460ff16156118bf5760405162461bcd60e51b815260040161050e90612fed565b601f546301000000900460ff16156118e95760405162461bcd60e51b815260040161050e90613039565b6007546001600160a01b03166119585760405162461bcd60e51b815260206004820152602e60248201527f5472616e73616374696f6e4c65646765723a204469736275727365206465746160448201526d696c73206e6f742065786973747360901b606482015260840161050e565b600083600003611df257601f805460ff1916600117905560155460145460135460125460115460105461198b91906136ec565b61199591906136ec565b61199f91906136ec565b6119a991906136ec565b6119b391906136ec565b601f546040516370a0823160e01b815230600482015291925082916401000000009091046001600160a01b0316906370a0823190602401602060405180830381865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b91906136ff565b1015611a495760405162461bcd60e51b815260040161050e90613718565b601f5460205460405163095ea7b360e01b81526001600160a01b03918216600482015260248101849052640100000000909204169063095ea7b3906044016020604051808303816000875af1158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aca9190612f33565b50600554601054611ae4916001600160a01b0316906126cc565b600654601154611afd916001600160a01b0316906126cc565b600754601254611b16916001600160a01b0316906126cc565b600954601354611b2f916001600160a01b0316906126cc565b600c54601454611b48916001600160a01b0316906126cc565b600d54601554611b61916001600160a01b0316906126cc565b600b54601954611b7a916001600160a01b0316906126cc565b600a54601854611b93916001600160a01b0316906126cc565b600e54601a54611bac916001600160a01b0316906126cc565b601b5460408051671b195919d95c925960c21b8152600360088201529051908190036028018120635f61f3a360e11b82526001600160a01b039092169163bec3e74691611c009190879087906004016132a8565b600060405180830381600087803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b50505050611c3c8383610acb565b611d1a6003604051611c5d9068746f6b656e5479706560b81b815260090190565b9081526040519081900360200190208054611c77906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca3906130ac565b8015611cf05780601f10611cc557610100808354040283529160200191611cf0565b820191906000526020600020905b815481529060010190602001808311611cd357829003601f168201915b5050505050604051806040016040528060078152602001664552433131353560c81b815250612673565b15611dad57600f54600854601654601754604051637921219560e11b81523060048201526001600160a01b0393841660248201526044810192909252606482015260a06084820152600060a482015291169063f242432a9060c4015b600060405180830381600087803b158015611d9057600080fd5b505af1158015611da4573d6000803e3d6000fd5b5050505061205a565b600f54600854601654604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e90606401611d76565b6000848152600460205260409020600581015460ff1615611e675760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2052756c6520616c726561647920604482015268191a5cd89d5c9cd95960ba1b606482015260840161050e565b60058101805460ff191660011790556000858152600460205260409020819080611e91838261375b565b5060018281018054611ea69284019190612767565b5060028281018054611ebb9284019190612767565b5060038281018054611ed09284019190612767565b5060048281018054611ee592840191906127b7565b506005918201549101805460ff191660ff9092161515919091179055600381015460005b81811015611f5057826002018181548110611f2657611f2661307a565b906000526020600020015484611f3c91906136ec565b935080611f488161367d565b915050611f09565b50601f546040516370a0823160e01b8152306004820152849164010000000090046001600160a01b0316906370a0823190602401602060405180830381865afa158015611fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc591906136ff565b1015611fe35760405162461bcd60e51b815260040161050e90613718565b60005b81811015612056576120448360030182815481106120065761200661307a565b6000918252602090912001546002850180546001600160a01b0390921691849081106120345761203461307a565b90600052602060002001546126cc565b8061204e8161367d565b915050611fe6565b5050505b5050600180555050565b6002600154036120865760405162461bcd60e51b815260040161050e90612eee565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa1580156120d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f79190612f33565b6121135760405162461bcd60e51b815260040161050e90612f50565b601f548390610100900460ff1661213c5760405162461bcd60e51b815260040161050e90612fa4565b601f5462010000900460ff16156121a45760405162461bcd60e51b815260206004820152602660248201527f5472616e73616374696f6e4c65646765723a2052756c657320616c726561647960448201526508185919195960d21b606482015260840161050e565b601f546301000000900460ff16156121ce5760405162461bcd60e51b815260040161050e906136a9565b600081116122305760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2072756c65732063616e206e6f7460448201526820626520656d70747960b81b606482015260840161050e565b60005b8481101561228f5785858281811061224d5761224d61307a565b905060200281019061225f9190613827565b601e54600090815260046020526040902061227a8282613bbe565b508190506122878161367d565b915050612233565b5061229b600182613696565b601e55601f805462ff0000191662010000179055601b546040516332644bf360e11b81526001600160a01b03909116906364c897e690611789908890889088908890600401613dfd565b600460205260009081526040902080548190612300906130ac565b80601f016020809104026020016040519081016040528092919081815260200182805461232c906130ac565b80156123795780601f1061234e57610100808354040283529160200191612379565b820191906000526020600020905b81548152906001019060200180831161235c57829003601f168201915b5050506005909301549192505060ff1682565b80516020818301810180516003825292820191909301209152805481906123b2906130ac565b80601f01602080910402602001604051908101604052809291908181526020018280546123de906130ac565b801561242b5780601f106124005761010080835404028352916020019161242b565b820191906000526020600020905b81548152906001019060200180831161240e57829003601f168201915b5050506001909301549192505060ff1682565b60606000601d541161246757506040805180820190915260028152617b7d60f01b602082015290565b60408051607b60f81b602082015281516001818303018152602190910190915260005b601d54811161264b57600081815260026020526040812080546124ac906130ac565b80601f01602080910402602001604051908101604052809291908181526020018280546124d8906130ac565b80156125255780601f106124fa57610100808354040283529160200191612525565b820191906000526020600020905b81548152906001019060200180831161250857829003601f168201915b50505050509050600060038260405161253e9190613090565b9081526040519081900360200190208054612558906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612584906130ac565b80156125d15780601f106125a6576101008083540402835291602001916125d1565b820191906000526020600020905b8154815290600101906020018083116125b457829003601f168201915b505050505090508382826040516020016125ed93929190613f82565b6040516020818303038152906040529350601d5483600161260e91906136ec565b1161263657836040516020016126249190613fed565b60405160208183030381529060405293505b505080806126439061367d565b91505061248a565b508060405160200161265d9190614012565b60408051601f1981840301815291905292915050565b6000816040516020016126869190613090565b60405160208183030381529060405280519060200120836040516020016126ad9190613090565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b0382161561276357601f546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201849052640100000000909204909116906323b872dd906064016020604051808303816000875af115801561273d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127619190612f33565b505b5050565b8280548282559060005260206000209081019282156127a75760005260206000209182015b828111156127a757825482559160010191906001019061278c565b506127b3929150612804565b5090565b82805482825590600052602060002090601f016020900481019282156127a757600052602060002091601f01602090048201828111156127a757825482559160010191906001019061278c565b5b808211156127b35760008155600101612805565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b038111828210171561285257612852612819565b60405290565b604051601f8201601f191681016001600160401b038111828210171561288057612880612819565b604052919050565b600082601f83011261289957600080fd5b81356001600160401b038111156128b2576128b2612819565b6128c5601f8201601f1916602001612858565b8181528460208386010111156128da57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561290a57600080fd5b8235915060208301356001600160401b0381111561292757600080fd5b61293385828601612888565b9150509250929050565b6001600160a01b038116811461295257600080fd5b50565b80356129608161293d565b919050565b60006020828403121561297757600080fd5b81356129828161293d565b9392505050565b6000610160828403121561299c57600080fd5b6129a461282f565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b600080600080848603610300811215612a3257600080fd5b61016080821215612a4257600080fd5b612a4a61282f565b9150612a5587612955565b8252612a6360208801612955565b6020830152612a7460408801612955565b6040830152612a8560608801612955565b6060830152612a9660808801612955565b6080830152612aa760a08801612955565b60a0830152612ab860c08801612955565b60c0830152612ac960e08801612955565b60e0830152610100612adc818901612955565b90830152610120612aee888201612955565b90830152610140612b00888201612955565b8184015250819550612b1488828901612989565b945050506102c085013591506102e08501356001600160401b03811115612b3a57600080fd5b612b4687828801612888565b91505092959194509250565b600082601f830112612b6357600080fd5b813560206001600160401b0380831115612b7f57612b7f612819565b8260051b612b8e838201612858565b9384528581018301938381019088861115612ba857600080fd5b84880192505b85831015612be457823584811115612bc65760008081fd5b612bd48a87838c0101612888565b8352509184019190840190612bae565b98975050505050505050565b600080600080600080600060e0888a031215612c0b57600080fd5b8735612c168161293d565b96506020880135612c268161293d565b9550612c3460408901612955565b945060608801356001600160401b0380821115612c5057600080fd5b612c5c8b838c01612b52565b955060808a0135915080821115612c7257600080fd5b612c7e8b838c01612b52565b945060a08a0135935060c08a0135915080821115612c9b57600080fd5b50612ca88a828b01612888565b91505092959891949750929550565b600060208284031215612cc957600080fd5b5035919050565b60005b83811015612ceb578181015183820152602001612cd3565b50506000910152565b60008151808452612d0c816020860160208601612cd0565b601f01601f19169290920160200192915050565b6020815260006129826020830184612cf4565b60008060008060808587031215612d4957600080fd5b84356001600160401b0380821115612d6057600080fd5b612d6c88838901612b52565b95506020870135915080821115612d8257600080fd5b612d8e88838901612b52565b9450604087013593506060870135915080821115612dab57600080fd5b50612b4687828801612888565b600080600060608486031215612dcd57600080fd5b833592506020840135915060408401356001600160401b03811115612df157600080fd5b612dfd86828701612888565b9150509250925092565b60008060008060608587031215612e1d57600080fd5b84356001600160401b0380821115612e3457600080fd5b818701915087601f830112612e4857600080fd5b813581811115612e5757600080fd5b8860208260051b8501011115612e6c57600080fd5b60209283019650945090860135925060408601359080821115612dab57600080fd5b604081526000612ea16040830185612cf4565b905082151560208301529392505050565b600060208284031215612ec457600080fd5b81356001600160401b03811115612eda57600080fd5b612ee684828501612888565b949350505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b801515811461295257600080fd5b600060208284031215612f4557600080fd5b815161298281612f25565b60208082526034908201527f5472616e73616374696f6e4c65646765723a204f6e6c792061646d696e206361604082015273371031b0b636103a3434b990333ab731ba34b7b760611b606082015260800190565b60208082526029908201527f5472616e73616374696f6e4c65646765723a204c6564676572206e6f7420696e6040820152681a5d1a585b1a5e995960ba1b606082015260800190565b6020808252602c908201527f5472616e73616374696f6e4c65646765723a205061796d656e7420616c72656160408201526b191e48191a5cd89d5c9cd95960a21b606082015260800190565b60208082526021908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152606b60f81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600082516130a2818460208701612cd0565b9190910192915050565b600181811c908216806130c057607f821691505b6020821081036130e057634e487b7160e01b600052602260045260246000fd5b50919050565b5b8181101561276357600081556001016130e7565b601f82111561276157806000526020600020601f840160051c810160208510156131225750805b613134601f850160051c8301826130e6565b5050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561316957613169612819565b61317d8161317784546130ac565b846130fb565b602080601f8311600181146131ac576000841561319a5750858301515b6131a4858261313b565b865550610c3c565b600085815260208120601f198616915b828110156131db578886015182559484019460019091019084016131bc565b50858210156131f95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526020808501808196508360051b8101915082860160005b8581101561325157828403895261323f848351612cf4565b98850198935090840190600101613227565b5091979650505050505050565b6080815260006132716080830187613209565b82810360208401526132838187613209565b9050846040840152828103606084015261329d8185612cf4565b979650505050505050565b6060815260008085546132ba816130ac565b80606086015260806001808416600081146132dc57600181146132f657613327565b60ff1985168884015283151560051b880183019550613327565b8a60005260208060002060005b8681101561331e5781548b8201870152908401908201613303565b8a018501975050505b505050505084602084015282810360408401526133448185612cf4565b9695505050505050565b831515815282602082015260606040820152600061336f6060830184612cf4565b95945050505050565b600061030061339f8361339289546001600160a01b031690565b6001600160a01b03169052565b60018701546001600160a01b03166001600160a01b03811660208501525060028701546001600160a01b03166001600160a01b03811660408501525060038701546001600160a01b03166001600160a01b03811660608501525060048701546001600160a01b03166001600160a01b03811660808501525060058701546001600160a01b03166001600160a01b03811660a08501525060068701546001600160a01b03166001600160a01b03811660c08501525060078701546001600160a01b03166001600160a01b03811660e08501525060088701546001600160a01b03166001600160a01b0381166101008501525060098701546001600160a01b03166001600160a01b03811661012085015250600a8701546001600160a01b03166001600160a01b038116610140850152508554610160840152600186015461018084015260028601546101a084015260038601546101c084015260048601546101e084015260058601546102008401526006860154610220840152600786015461024084015260088601546102608401526009860154610280840152600a8601546102a0840152846102c0840152806102e084015261329d81840185612cf4565b60208082526029908201527f5472616e73616374696f6e4c65646765723a20416464726573732063616e6e6f60408201526874206265207a65726f60b81b606082015260800190565b6020808252602a908201527f5472616e73616374696f6e4c65646765723a2076616c7565732063616e206e6f6040820152697420626520656d70747960b01b606082015260800190565b60008083546135ff816130ac565b60018281168015613617576001811461362c5761365b565b60ff198416875282151583028701945061365b565b8760005260208060002060005b858110156136525781548a820152908401908201613639565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b60006001820161368f5761368f613667565b5060010190565b81810381811115610ac557610ac5613667565b60208082526023908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152621ad95960ea1b606082015260800190565b80820180821115610ac557610ac5613667565b60006020828403121561371157600080fd5b5051919050565b60208082526023908201527f5472616e73616374696f6e4c65646765723a20496e73756666696369656e742060408201526243494360e81b606082015260800190565b818103613766575050565b61377082546130ac565b6001600160401b0381111561378757613787612819565b6137958161317784546130ac565b6000601f8211600181146137c357600083156137b15750848201545b6137bb848261313b565b855550613134565b600085815260209020601f19841690600086815260209020845b838110156137fd57828601548255600195860195909101906020016137dd565b50858310156131f95793015460001960f8600387901b161c19169092555050600190811b01905550565b6000823560be198336030181126130a257600080fd5b6001600160401b0383111561385457613854612819565b6138688361386283546130ac565b836130fb565b6000601f84116001811461389657600085156138845750838201355b61388e868261313b565b845550613134565b600083815260209020601f19861690835b828110156138c757868501358255602094850194600190920191016138a7565b50868210156138e45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000808335601e1984360301811261390d57600080fd5b8301803591506001600160401b0382111561392757600080fd5b6020019150600581901b360382131561393f57600080fd5b9250929050565b81831015612761578060005260206000206139658382018583016130e6565b50505050565b6001600160401b0383111561398257613982612819565b600160401b83111561399657613996612819565b80548382556139a6848284613946565b50818160005260208060002060005b868110156139cf57833582820155928201926001016139b5565b50505050505050565b6001600160401b038311156139ef576139ef612819565b600160401b831115613a0357613a03612819565b8054838255613a13848284613946565b50818160005260208060002060005b868110156139cf578335613a358161293d565b8282015592820192600101613a22565b600160401b821115613a5957613a59612819565b80548282558083101561276157816000526020600020601f840160051c8101601f85168015613a99576000198083018054828460200360031b1c16815550505b50613134601f840160051c8301826130e6565b6002811061295257600080fd5b60008135610ac581613aac565b6001600160401b03831115613add57613add612819565b613ae78382613a45565b60008181526020902082908460051c60005b81811015613b51576000805b6020808210613b145750613b44565b613b37613b2088613ab9565b60ff600385901b90811b801987169290911b161790565b9601959150600101613b05565b5083820155600101613af9565b50601f198616808703818814613ba7576000805b82811015613ba157613b90613b7988613ab9565b60ff600384901b90811b801986169290911b161790565b602097909701969150600101613b65565b50848401555b5050505050505050565b60008135610ac581612f25565b8135601e19833603018112613bd257600080fd5b820180356001600160401b03811115613bea57600080fd5b602082019150803603821315613bff57600080fd5b613c0a81838561383d565b5050613c1960208301836138f6565b613c2781836001860161396b565b5050613c3660408301836138f6565b613c4481836002860161396b565b5050613c5360608301836138f6565b613c618183600386016139d8565b5050613c7060808301836138f6565b613c7e818360048601613ac6565b5050612763613c8f60a08401613bb1565b6005830160ff1981541660ff8315151681178255505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e19843603018112613ce857600080fd5b83016020810192503590506001600160401b03811115613d0757600080fd5b8060051b360382131561393f57600080fd5b81835260006001600160fb1b03831115613d3257600080fd5b8260051b80836020870137939093016020019392505050565b8183526000602080850194508260005b85811015613d89578135613d6e8161293d565b6001600160a01b031687529582019590820190600101613d5b565b509495945050505050565b818352600060208085019450826000805b86811015613de6578235613db881613aac565b60028110613dd457634e487b7160e01b83526021600452602483fd5b88529683019691830191600101613da5565b50959695505050505050565b803561296081612f25565b60608082528181018590526000906080808401600588901b8501820189855b8a811015613f5a57878303607f190184528135368d900360be19018112613e4257600080fd5b8c0160c0813536839003601e19018112613e5b57600080fd5b820160208181019135906001600160401b03821115613e7957600080fd5b813603831315613e8857600080fd5b838852613e988489018385613ca8565b9350613ea681860186613cd1565b9350915087840381890152613ebc848484613d19565b935060409250613ece83860186613cd1565b9250888503848a0152613ee2858483613d19565b945050613ef18b860186613cd1565b935091508784038b890152613f07848484613d4b565b9350613f158a860186613cd1565b935091508784038a890152613f2b848484613d94565b935060a09250613f3c838601613df2565b15159290970191909152509484019493929092019150600101613e1c565b50508760208701528581036040870152613f748188612cf4565b9a9950505050505050505050565b60008451613f94818460208901612cd0565b601160f91b9083018181528551909190613fb5816001850160208a01612cd0565b62111d1160e91b600193909101928301528451613fd9816004850160208901612cd0565b600492019182015260050195945050505050565b60008251613fff818460208701612cd0565b600b60fa1b920191825250600101919050565b60008251614024818460208701612cd0565b607d60f81b92019182525060010191905056fea26469706673582212203b8376ab1dcaaa799db958c95b51270ff0f7609178dac8918b8da3e991058f0064736f6c63430008110033
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.