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; /** * @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"); 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); } modifier onlyAdmin() { require(iOrchestrator.isAdminAddress(msg.sender), "TransactionLedger: Only admin can call this function"); _; } }
// 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 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 '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface ICIC is IERC20 { }
// 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 // 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.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) (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) (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 // 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 (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 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 (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); } } } }
// 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); }
{ "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":[{"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":"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
60806040523480156200001157600080fd5b50600180556200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b613f8280620000f86000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806382d13d6d116100c3578063d615d1c01161007c578063d615d1c0146103fc578063def51dc21461040f578063e683b7f21461042a578063ea535e8014610437578063f36f235d14610467578063f945fed01461046f57600080fd5b806382d13d6d1461037857806387b209b71461038b578063885bff7b146103a2578063c54cdb01146103b5578063c7411191146103c8578063d578dddd146103db57600080fd5b8063392e53cd11610115578063392e53cd146102fa5780633bd5b6691461030c578063402c2ecc1461031f57806349bd604e14610332578063737733e3146103455780637fdd66941461036557600080fd5b80631ecd33d71461015257806322b8e5b71461016757806324d7806c146101975780632d11ee14146101ba578063381a0ee01461023f575b600080fd5b61016561016036600461280c565b610483565b005b601c5461017a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101aa6101a536600461287a565b6109ed565b604051901515815260200161018e565b601054601154601254601354601454601554601654601754601854601954601a546101ec9a999897969594939291908b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e08501526101008401526101208301526101408201526101600161018e565b600554600654600754600854600954600a54600b54600c54600d54600e54600f5461028f9a6001600160a01b039081169a811699811698811697811696811695811694811693811692811691168b565b604080516001600160a01b039c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e0850152841661010084015283166101208301529091166101408201526101600161018e565b601f546101aa90610100900460ff1681565b61016561031a36600461280c565b610a62565b61016561032d36600461292f565b610bdb565b610165610340366004612b05565b610fff565b610358610353366004612bcc565b611394565b60405161018e9190612c35565b610165610373366004612c48565b61142e565b610165610386366004612ccd565b61175d565b610394601e5481565b60405190815260200161018e565b601f546101aa9062010000900460ff1681565b601b5461017a906001600160a01b031681565b6101656103d6366004612d1c565b611f79565b6103ee6103e9366004612bcc565b6121fa565b60405161018e929190612da3565b6103ee61040a366004612dc7565b6122a1565b601f5461017a9064010000000090046001600160a01b031681565b601f546101aa9060ff1681565b61016561044536600461287a565b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b610358612353565b601f546101aa906301000000900460ff1681565b6002600154036104ae5760405162461bcd60e51b81526004016104a590612e03565b60405180910390fd5b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa1580156104fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f9190612e48565b61053b5760405162461bcd60e51b81526004016104a590612e65565b601f54610100900460ff166105625760405162461bcd60e51b81526004016104a590612eb9565b601f5460ff16156105855760405162461bcd60e51b81526004016104a590612f02565b601f546301000000900460ff16156105af5760405162461bcd60e51b81526004016104a590612f4e565b604080516001808252818301909252600091816020015b60608152602001906001900390816105c657505060408051600180825281830190925291925060009190602082015b60608152602001906001900390816105f5579050509050604051806040016040528060118152602001707472616e73616374696f6e53746174757360781b8152508260008151811061064957610649612f8f565b60200260200101819052506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b8152508160008151811061068e5761068e612f8f565b602002602001018190525061078a6003836000815181106106b1576106b1612f8f565b60200260200101516040516106c69190612fa5565b90815260405190819003602001902080546106e090612fc1565b80601f016020809104026020016040519081016040528092919081815260200182805461070c90612fc1565b80156107595780601f1061072e57610100808354040283529160200191610759565b820191906000526020600020905b81548152906001019060200180831161073c57829003601f168201915b50505050506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b815250612588565b6107e25760405162461bcd60e51b815260206004820152602360248201527f5472616e73616374696f6e4c65646765723a20416c72656164792064656c69736044820152621d195960ea1b60648201526084016104a5565b60405180604001604052808260008151811061080057610800612f8f565b602002602001015181526020016001151581525060038360008151811061082957610829612f8f565b602002602001015160405161083e9190612fa5565b9081526040519081900360200190208151819061085b9082613065565b50602091909101516001909101805460ff19169115159190911790556108818484610a62565b601b5460405163098c667960e21b81526001600160a01b039091169063263199e4906108b7908590859089908990600401613173565b600060405180830381600087803b1580156108d157600080fd5b505af11580156108e5573d6000803e3d6000fd5b5050601b5460408051681b1a5cdd1a5b99d25960ba1b8152600360098201529051908190036029018120635b862f0560e11b82526001600160a01b03909216935063b70c5e0a925061093e9190889088906004016131bd565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050600f54600754601654604051632142170760e11b81523060048201526001600160a01b0392831660248201526044810191909152911692506342842e0e91506064015b600060405180830381600087803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b505060018055505050505050565b601c5460405163011b5dad60e11b81526001600160a01b0383811660048301526000921690630236bb5a90602401602060405180830381865afa158015610a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5c9190612e48565b92915050565b601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190612e48565b610aea5760405162461bcd60e51b81526004016104a590612e65565b601f546301000000900460ff1615610b565760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a204c656467657220697320616c7260448201526865616479206c6f636b60b81b60648201526084016104a5565b601f805463ff0000001916630100000090811791829055601b5460405163fc7050eb60e01b81526001600160a01b039091169263fc7050eb92610ba592910460ff169086908690600401613263565b600060405180830381600087803b158015610bbf57600080fd5b505af1158015610bd3573d6000803e3d6000fd5b505050505050565b600260015403610bfd5760405162461bcd60e51b81526004016104a590612e03565b600260015560408401516001600160a01b0316610c6e5760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c6560448201526872206164647265737360b81b60648201526084016104a5565b6000836040015111610cd35760405162461bcd60e51b815260206004820152602860248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c656044820152671c88185b5bdd5b9d60c21b60648201526084016104a5565b6007546001600160a01b031615610d475760405162461bcd60e51b815260206004820152603260248201527f5472616e73616374696f6e4c65646765723a2044697362757273652064657461604482015271696c7320616c72656164792065786973747360701b60648201526084016104a5565b83600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050826010600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155905050601b60009054906101000a90046001600160a01b03166001600160a01b0316639840fcbc6005601085856040518563ffffffff1660e01b81526004016109b1949392919061328d565b6002600154036110215760405162461bcd60e51b81526004016104a590612e03565b6002600155600054610100900460ff16158080156110465750600054600160ff909116105b806110605750303b158015611060575060005460ff166001145b6110c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a5565b6000805460ff1916600117905580156110e6576000805461ff0019166101001790555b6001600160a01b03881661110c5760405162461bcd60e51b81526004016104a590613473565b6001600160a01b0387166111325760405162461bcd60e51b81526004016104a590613473565b8451806111515760405162461bcd60e51b81526004016104a5906134bc565b845181146111a15760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c696420646174610060448201526064016104a5565b60005b81811015611284578681815181106111be576111be612f8f565b60200260200101516002600083815260200190815260200160002090816111e59190613065565b50604051806040016040528087838151811061120357611203612f8f565b60200260200101518152602001600115158152506003600260008481526020019081526020016000206040516112399190613506565b908152604051908190036020019020815181906112569082613065565b50602091909101516001909101805460ff19169115159190911790558061127c81613592565b9150506111a4565b506112906001826135ab565b601d55601f8054601b80546001600160a01b03199081166001600160a01b038e81169182179093556101006001600160c01b03199094166401000000008e8516021793909317909355601c8054909316908a161790915560405163225f921960e21b815263897e48649061130e908990899089908990600401613173565b600060405180830381600087803b15801561132857600080fd5b505af115801561133c573d6000803e3d6000fd5b505050505080156109df576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505060018055505050505050565b600260205260009081526040902080546113ad90612fc1565b80601f01602080910402602001604051908101604052809291908181526020018280546113d990612fc1565b80156114265780601f106113fb57610100808354040283529160200191611426565b820191906000526020600020905b81548152906001019060200180831161140957829003601f168201915b505050505081565b6002600154036114505760405162461bcd60e51b81526004016104a590612e03565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa15801561149d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c19190612e48565b6114dd5760405162461bcd60e51b81526004016104a590612e65565b8351601f546301000000900460ff16156115095760405162461bcd60e51b81526004016104a5906135be565b601f54610100900460ff166115305760405162461bcd60e51b81526004016104a590612eb9565b600081116115505760405162461bcd60e51b81526004016104a5906134bc565b835181146115a05760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c696420646174610060448201526064016104a5565b60005b818110156116e95760038682815181106115bf576115bf612f8f565b60200260200101516040516115d49190612fa5565b9081526040519081900360200190206001015460ff166116445760405162461bcd60e51b815260206004820152602560248201527f5472616e73616374696f6e4c65646765723a20496e76616c6964206c6564676560448201526472206b657960d81b60648201526084016104a5565b604051806040016040528086838151811061166157611661612f8f565b6020026020010151815260200160011515815250600387838151811061168957611689612f8f565b602002602001015160405161169e9190612fa5565b908152604051908190036020019020815181906116bb9082613065565b50602091909101516001909101805460ff1916911515919091179055806116e181613592565b9150506115a3565b50601b5460405163098c667960e21b81526001600160a01b039091169063263199e490611720908890889088908890600401613173565b600060405180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b50506001805550505050505050565b60026001540361177f5760405162461bcd60e51b81526004016104a590612e03565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f09190612e48565b61180c5760405162461bcd60e51b81526004016104a590612e65565b601f54610100900460ff166118335760405162461bcd60e51b81526004016104a590612eb9565b601f5460ff16156118565760405162461bcd60e51b81526004016104a590612f02565b601f546301000000900460ff16156118805760405162461bcd60e51b81526004016104a590612f4e565b6007546001600160a01b03166118ef5760405162461bcd60e51b815260206004820152602e60248201527f5472616e73616374696f6e4c65646765723a204469736275727365206465746160448201526d696c73206e6f742065786973747360901b60648201526084016104a5565b600083600003611d0757601f805460ff191660011790556015546014546013546012546011546010546119229190613601565b61192c9190613601565b6119369190613601565b6119409190613601565b61194a9190613601565b601f546040516370a0823160e01b815230600482015291925082916401000000009091046001600160a01b0316906370a0823190602401602060405180830381865afa15801561199e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c29190613614565b10156119e05760405162461bcd60e51b81526004016104a59061362d565b6005546010546119f9916001600160a01b0316906125e1565b600654601154611a12916001600160a01b0316906125e1565b600754601254611a2b916001600160a01b0316906125e1565b600954601354611a44916001600160a01b0316906125e1565b600c54601454611a5d916001600160a01b0316906125e1565b600d54601554611a76916001600160a01b0316906125e1565b600b54601954611a8f916001600160a01b0316906125e1565b600a54601854611aa8916001600160a01b0316906125e1565b600e54601a54611ac1916001600160a01b0316906125e1565b601b5460408051671b195919d95c925960c21b8152600360088201529051908190036028018120635f61f3a360e11b82526001600160a01b039092169163bec3e74691611b159190879087906004016131bd565b600060405180830381600087803b158015611b2f57600080fd5b505af1158015611b43573d6000803e3d6000fd5b50505050611b518383610a62565b611c2f6003604051611b729068746f6b656e5479706560b81b815260090190565b9081526040519081900360200190208054611b8c90612fc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb890612fc1565b8015611c055780601f10611bda57610100808354040283529160200191611c05565b820191906000526020600020905b815481529060010190602001808311611be857829003601f168201915b5050505050604051806040016040528060078152602001664552433131353560c81b815250612588565b15611cc257600f54600854601654601754604051637921219560e11b81523060048201526001600160a01b0393841660248201526044810192909252606482015260a06084820152600060a482015291169063f242432a9060c4015b600060405180830381600087803b158015611ca557600080fd5b505af1158015611cb9573d6000803e3d6000fd5b50505050611f6f565b600f54600854601654604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e90606401611c8b565b6000848152600460205260409020600581015460ff1615611d7c5760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2052756c6520616c726561647920604482015268191a5cd89d5c9cd95960ba1b60648201526084016104a5565b60058101805460ff191660011790556000858152600460205260409020819080611da68382613670565b5060018281018054611dbb928401919061267c565b5060028281018054611dd0928401919061267c565b5060038281018054611de5928401919061267c565b5060048281018054611dfa92840191906126cc565b506005918201549101805460ff191660ff9092161515919091179055600381015460005b81811015611e6557826002018181548110611e3b57611e3b612f8f565b906000526020600020015484611e519190613601565b935080611e5d81613592565b915050611e1e565b50601f546040516370a0823160e01b8152306004820152849164010000000090046001600160a01b0316906370a0823190602401602060405180830381865afa158015611eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eda9190613614565b1015611ef85760405162461bcd60e51b81526004016104a59061362d565b60005b81811015611f6b57611f59836003018281548110611f1b57611f1b612f8f565b6000918252602090912001546002850180546001600160a01b039092169184908110611f4957611f49612f8f565b90600052602060002001546125e1565b80611f6381613592565b915050611efb565b5050505b5050600180555050565b600260015403611f9b5760405162461bcd60e51b81526004016104a590612e03565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015611fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200c9190612e48565b6120285760405162461bcd60e51b81526004016104a590612e65565b601f548390610100900460ff166120515760405162461bcd60e51b81526004016104a590612eb9565b601f5462010000900460ff16156120b95760405162461bcd60e51b815260206004820152602660248201527f5472616e73616374696f6e4c65646765723a2052756c657320616c726561647960448201526508185919195960d21b60648201526084016104a5565b601f546301000000900460ff16156120e35760405162461bcd60e51b81526004016104a5906135be565b600081116121455760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2072756c65732063616e206e6f7460448201526820626520656d70747960b81b60648201526084016104a5565b60005b848110156121a45785858281811061216257612162612f8f565b9050602002810190612174919061373c565b601e54600090815260046020526040902061218f8282613ad3565b5081905061219c81613592565b915050612148565b506121b06001826135ab565b601e55601f805462ff0000191662010000179055601b546040516332644bf360e11b81526001600160a01b03909116906364c897e690611720908890889088908890600401613d12565b60046020526000908152604090208054819061221590612fc1565b80601f016020809104026020016040519081016040528092919081815260200182805461224190612fc1565b801561228e5780601f106122635761010080835404028352916020019161228e565b820191906000526020600020905b81548152906001019060200180831161227157829003601f168201915b5050506005909301549192505060ff1682565b80516020818301810180516003825292820191909301209152805481906122c790612fc1565b80601f01602080910402602001604051908101604052809291908181526020018280546122f390612fc1565b80156123405780601f1061231557610100808354040283529160200191612340565b820191906000526020600020905b81548152906001019060200180831161232357829003601f168201915b5050506001909301549192505060ff1682565b60606000601d541161237c57506040805180820190915260028152617b7d60f01b602082015290565b60408051607b60f81b602082015281516001818303018152602190910190915260005b601d54811161256057600081815260026020526040812080546123c190612fc1565b80601f01602080910402602001604051908101604052809291908181526020018280546123ed90612fc1565b801561243a5780601f1061240f5761010080835404028352916020019161243a565b820191906000526020600020905b81548152906001019060200180831161241d57829003601f168201915b5050505050905060006003826040516124539190612fa5565b908152604051908190036020019020805461246d90612fc1565b80601f016020809104026020016040519081016040528092919081815260200182805461249990612fc1565b80156124e65780601f106124bb576101008083540402835291602001916124e6565b820191906000526020600020905b8154815290600101906020018083116124c957829003601f168201915b5050505050905083828260405160200161250293929190613e97565b6040516020818303038152906040529350601d548360016125239190613601565b1161254b57836040516020016125399190613f02565b60405160208183030381529060405293505b5050808061255890613592565b91505061239f565b50806040516020016125729190613f27565b60408051601f1981840301815291905292915050565b60008160405160200161259b9190612fa5565b60405160208183030381529060405280519060200120836040516020016125c29190612fa5565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b0382161561267857601f546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201849052640100000000909204909116906323b872dd906064016020604051808303816000875af1158015612652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126769190612e48565b505b5050565b8280548282559060005260206000209081019282156126bc5760005260206000209182015b828111156126bc5782548255916001019190600101906126a1565b506126c8929150612719565b5090565b82805482825590600052602060002090601f016020900481019282156126bc57600052602060002091601f01602090048201828111156126bc5782548255916001019190600101906126a1565b5b808211156126c8576000815560010161271a565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156127675761276761272e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156127955761279561272e565b604052919050565b600082601f8301126127ae57600080fd5b81356001600160401b038111156127c7576127c761272e565b6127da601f8201601f191660200161276d565b8181528460208386010111156127ef57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561281f57600080fd5b8235915060208301356001600160401b0381111561283c57600080fd5b6128488582860161279d565b9150509250929050565b6001600160a01b038116811461286757600080fd5b50565b803561287581612852565b919050565b60006020828403121561288c57600080fd5b813561289781612852565b9392505050565b600061016082840312156128b157600080fd5b6128b9612744565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b60008060008084860361030081121561294757600080fd5b6101608082121561295757600080fd5b61295f612744565b915061296a8761286a565b82526129786020880161286a565b60208301526129896040880161286a565b604083015261299a6060880161286a565b60608301526129ab6080880161286a565b60808301526129bc60a0880161286a565b60a08301526129cd60c0880161286a565b60c08301526129de60e0880161286a565b60e08301526101006129f181890161286a565b90830152610120612a0388820161286a565b90830152610140612a1588820161286a565b8184015250819550612a298882890161289e565b945050506102c085013591506102e08501356001600160401b03811115612a4f57600080fd5b612a5b8782880161279d565b91505092959194509250565b600082601f830112612a7857600080fd5b813560206001600160401b0380831115612a9457612a9461272e565b8260051b612aa383820161276d565b9384528581018301938381019088861115612abd57600080fd5b84880192505b85831015612af957823584811115612adb5760008081fd5b612ae98a87838c010161279d565b8352509184019190840190612ac3565b98975050505050505050565b600080600080600080600060e0888a031215612b2057600080fd5b8735612b2b81612852565b96506020880135612b3b81612852565b9550612b496040890161286a565b945060608801356001600160401b0380821115612b6557600080fd5b612b718b838c01612a67565b955060808a0135915080821115612b8757600080fd5b612b938b838c01612a67565b945060a08a0135935060c08a0135915080821115612bb057600080fd5b50612bbd8a828b0161279d565b91505092959891949750929550565b600060208284031215612bde57600080fd5b5035919050565b60005b83811015612c00578181015183820152602001612be8565b50506000910152565b60008151808452612c21816020860160208601612be5565b601f01601f19169290920160200192915050565b6020815260006128976020830184612c09565b60008060008060808587031215612c5e57600080fd5b84356001600160401b0380821115612c7557600080fd5b612c8188838901612a67565b95506020870135915080821115612c9757600080fd5b612ca388838901612a67565b9450604087013593506060870135915080821115612cc057600080fd5b50612a5b8782880161279d565b600080600060608486031215612ce257600080fd5b833592506020840135915060408401356001600160401b03811115612d0657600080fd5b612d128682870161279d565b9150509250925092565b60008060008060608587031215612d3257600080fd5b84356001600160401b0380821115612d4957600080fd5b818701915087601f830112612d5d57600080fd5b813581811115612d6c57600080fd5b8860208260051b8501011115612d8157600080fd5b60209283019650945090860135925060408601359080821115612cc057600080fd5b604081526000612db66040830185612c09565b905082151560208301529392505050565b600060208284031215612dd957600080fd5b81356001600160401b03811115612def57600080fd5b612dfb8482850161279d565b949350505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b801515811461286757600080fd5b600060208284031215612e5a57600080fd5b815161289781612e3a565b60208082526034908201527f5472616e73616374696f6e4c65646765723a204f6e6c792061646d696e206361604082015273371031b0b636103a3434b990333ab731ba34b7b760611b606082015260800190565b60208082526029908201527f5472616e73616374696f6e4c65646765723a204c6564676572206e6f7420696e6040820152681a5d1a585b1a5e995960ba1b606082015260800190565b6020808252602c908201527f5472616e73616374696f6e4c65646765723a205061796d656e7420616c72656160408201526b191e48191a5cd89d5c9cd95960a21b606082015260800190565b60208082526021908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152606b60f81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008251612fb7818460208701612be5565b9190910192915050565b600181811c90821680612fd557607f821691505b602082108103612ff557634e487b7160e01b600052602260045260246000fd5b50919050565b5b818110156126785760008155600101612ffc565b601f82111561267657806000526020600020601f840160051c810160208510156130375750805b613049601f850160051c830182612ffb565b5050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561307e5761307e61272e565b6130928161308c8454612fc1565b84613010565b602080601f8311600181146130c157600084156130af5750858301515b6130b98582613050565b865550610bd3565b600085815260208120601f198616915b828110156130f0578886015182559484019460019091019084016130d1565b508582101561310e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526020808501808196508360051b8101915082860160005b85811015613166578284038952613154848351612c09565b9885019893509084019060010161313c565b5091979650505050505050565b608081526000613186608083018761311e565b8281036020840152613198818761311e565b905084604084015282810360608401526131b28185612c09565b979650505050505050565b6060815260008085546131cf81612fc1565b80606086015260806001808416600081146131f1576001811461320b5761323c565b60ff1985168884015283151560051b88018301955061323c565b8a60005260208060002060005b868110156132335781548b8201870152908401908201613218565b8a018501975050505b505050505084602084015282810360408401526132598185612c09565b9695505050505050565b83151581528260208201526060604082015260006132846060830184612c09565b95945050505050565b60006103006132b4836132a789546001600160a01b031690565b6001600160a01b03169052565b60018701546001600160a01b03166001600160a01b03811660208501525060028701546001600160a01b03166001600160a01b03811660408501525060038701546001600160a01b03166001600160a01b03811660608501525060048701546001600160a01b03166001600160a01b03811660808501525060058701546001600160a01b03166001600160a01b03811660a08501525060068701546001600160a01b03166001600160a01b03811660c08501525060078701546001600160a01b03166001600160a01b03811660e08501525060088701546001600160a01b03166001600160a01b0381166101008501525060098701546001600160a01b03166001600160a01b03811661012085015250600a8701546001600160a01b03166001600160a01b038116610140850152508554610160840152600186015461018084015260028601546101a084015260038601546101c084015260048601546101e084015260058601546102008401526006860154610220840152600786015461024084015260088601546102608401526009860154610280840152600a8601546102a0840152846102c0840152806102e08401526131b281840185612c09565b60208082526029908201527f5472616e73616374696f6e4c65646765723a20416464726573732063616e6e6f60408201526874206265207a65726f60b81b606082015260800190565b6020808252602a908201527f5472616e73616374696f6e4c65646765723a2076616c7565732063616e206e6f6040820152697420626520656d70747960b01b606082015260800190565b600080835461351481612fc1565b6001828116801561352c576001811461354157613570565b60ff1984168752821515830287019450613570565b8760005260208060002060005b858110156135675781548a82015290840190820161354e565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016135a4576135a461357c565b5060010190565b81810381811115610a5c57610a5c61357c565b60208082526023908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152621ad95960ea1b606082015260800190565b80820180821115610a5c57610a5c61357c565b60006020828403121561362657600080fd5b5051919050565b60208082526023908201527f5472616e73616374696f6e4c65646765723a20496e73756666696369656e742060408201526243494360e81b606082015260800190565b81810361367b575050565b6136858254612fc1565b6001600160401b0381111561369c5761369c61272e565b6136aa8161308c8454612fc1565b6000601f8211600181146136d857600083156136c65750848201545b6136d08482613050565b855550613049565b600085815260209020601f19841690600086815260209020845b8381101561371257828601548255600195860195909101906020016136f2565b508583101561310e5793015460001960f8600387901b161c19169092555050600190811b01905550565b6000823560be19833603018112612fb757600080fd5b6001600160401b038311156137695761376961272e565b61377d836137778354612fc1565b83613010565b6000601f8411600181146137ab57600085156137995750838201355b6137a38682613050565b845550613049565b600083815260209020601f19861690835b828110156137dc57868501358255602094850194600190920191016137bc565b50868210156137f95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000808335601e1984360301811261382257600080fd5b8301803591506001600160401b0382111561383c57600080fd5b6020019150600581901b360382131561385457600080fd5b9250929050565b818310156126765780600052602060002061387a838201858301612ffb565b50505050565b6001600160401b038311156138975761389761272e565b600160401b8311156138ab576138ab61272e565b80548382556138bb84828461385b565b50818160005260208060002060005b868110156138e457833582820155928201926001016138ca565b50505050505050565b6001600160401b038311156139045761390461272e565b600160401b8311156139185761391861272e565b805483825561392884828461385b565b50818160005260208060002060005b868110156138e457833561394a81612852565b8282015592820192600101613937565b600160401b82111561396e5761396e61272e565b80548282558083101561267657816000526020600020601f840160051c8101601f851680156139ae576000198083018054828460200360031b1c16815550505b50613049601f840160051c830182612ffb565b6002811061286757600080fd5b60008135610a5c816139c1565b6001600160401b038311156139f2576139f261272e565b6139fc838261395a565b60008181526020902082908460051c60005b81811015613a66576000805b6020808210613a295750613a59565b613a4c613a35886139ce565b60ff600385901b90811b801987169290911b161790565b9601959150600101613a1a565b5083820155600101613a0e565b50601f198616808703818814613abc576000805b82811015613ab657613aa5613a8e886139ce565b60ff600384901b90811b801986169290911b161790565b602097909701969150600101613a7a565b50848401555b5050505050505050565b60008135610a5c81612e3a565b8135601e19833603018112613ae757600080fd5b820180356001600160401b03811115613aff57600080fd5b602082019150803603821315613b1457600080fd5b613b1f818385613752565b5050613b2e602083018361380b565b613b3c818360018601613880565b5050613b4b604083018361380b565b613b59818360028601613880565b5050613b68606083018361380b565b613b768183600386016138ed565b5050613b85608083018361380b565b613b938183600486016139db565b5050612678613ba460a08401613ac6565b6005830160ff1981541660ff8315151681178255505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e19843603018112613bfd57600080fd5b83016020810192503590506001600160401b03811115613c1c57600080fd5b8060051b360382131561385457600080fd5b81835260006001600160fb1b03831115613c4757600080fd5b8260051b80836020870137939093016020019392505050565b8183526000602080850194508260005b85811015613c9e578135613c8381612852565b6001600160a01b031687529582019590820190600101613c70565b509495945050505050565b818352600060208085019450826000805b86811015613cfb578235613ccd816139c1565b60028110613ce957634e487b7160e01b83526021600452602483fd5b88529683019691830191600101613cba565b50959695505050505050565b803561287581612e3a565b60608082528181018590526000906080808401600588901b8501820189855b8a811015613e6f57878303607f190184528135368d900360be19018112613d5757600080fd5b8c0160c0813536839003601e19018112613d7057600080fd5b820160208181019135906001600160401b03821115613d8e57600080fd5b813603831315613d9d57600080fd5b838852613dad8489018385613bbd565b9350613dbb81860186613be6565b9350915087840381890152613dd1848484613c2e565b935060409250613de383860186613be6565b9250888503848a0152613df7858483613c2e565b945050613e068b860186613be6565b935091508784038b890152613e1c848484613c60565b9350613e2a8a860186613be6565b935091508784038a890152613e40848484613ca9565b935060a09250613e51838601613d07565b15159290970191909152509484019493929092019150600101613d31565b50508760208701528581036040870152613e898188612c09565b9a9950505050505050505050565b60008451613ea9818460208901612be5565b601160f91b9083018181528551909190613eca816001850160208a01612be5565b62111d1160e91b600193909101928301528451613eee816004850160208901612be5565b600492019182015260050195945050505050565b60008251613f14818460208701612be5565b600b60fa1b920191825250600101919050565b60008251613f39818460208701612be5565b607d60f81b92019182525060010191905056fea264697066735822122014422a7e997b52464727f126b0dfcbd142bb91ba3f9885d07d4e6902445672db64736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806382d13d6d116100c3578063d615d1c01161007c578063d615d1c0146103fc578063def51dc21461040f578063e683b7f21461042a578063ea535e8014610437578063f36f235d14610467578063f945fed01461046f57600080fd5b806382d13d6d1461037857806387b209b71461038b578063885bff7b146103a2578063c54cdb01146103b5578063c7411191146103c8578063d578dddd146103db57600080fd5b8063392e53cd11610115578063392e53cd146102fa5780633bd5b6691461030c578063402c2ecc1461031f57806349bd604e14610332578063737733e3146103455780637fdd66941461036557600080fd5b80631ecd33d71461015257806322b8e5b71461016757806324d7806c146101975780632d11ee14146101ba578063381a0ee01461023f575b600080fd5b61016561016036600461280c565b610483565b005b601c5461017a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101aa6101a536600461287a565b6109ed565b604051901515815260200161018e565b601054601154601254601354601454601554601654601754601854601954601a546101ec9a999897969594939291908b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e08501526101008401526101208301526101408201526101600161018e565b600554600654600754600854600954600a54600b54600c54600d54600e54600f5461028f9a6001600160a01b039081169a811699811698811697811696811695811694811693811692811691168b565b604080516001600160a01b039c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e0850152841661010084015283166101208301529091166101408201526101600161018e565b601f546101aa90610100900460ff1681565b61016561031a36600461280c565b610a62565b61016561032d36600461292f565b610bdb565b610165610340366004612b05565b610fff565b610358610353366004612bcc565b611394565b60405161018e9190612c35565b610165610373366004612c48565b61142e565b610165610386366004612ccd565b61175d565b610394601e5481565b60405190815260200161018e565b601f546101aa9062010000900460ff1681565b601b5461017a906001600160a01b031681565b6101656103d6366004612d1c565b611f79565b6103ee6103e9366004612bcc565b6121fa565b60405161018e929190612da3565b6103ee61040a366004612dc7565b6122a1565b601f5461017a9064010000000090046001600160a01b031681565b601f546101aa9060ff1681565b61016561044536600461287a565b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b610358612353565b601f546101aa906301000000900460ff1681565b6002600154036104ae5760405162461bcd60e51b81526004016104a590612e03565b60405180910390fd5b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa1580156104fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f9190612e48565b61053b5760405162461bcd60e51b81526004016104a590612e65565b601f54610100900460ff166105625760405162461bcd60e51b81526004016104a590612eb9565b601f5460ff16156105855760405162461bcd60e51b81526004016104a590612f02565b601f546301000000900460ff16156105af5760405162461bcd60e51b81526004016104a590612f4e565b604080516001808252818301909252600091816020015b60608152602001906001900390816105c657505060408051600180825281830190925291925060009190602082015b60608152602001906001900390816105f5579050509050604051806040016040528060118152602001707472616e73616374696f6e53746174757360781b8152508260008151811061064957610649612f8f565b60200260200101819052506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b8152508160008151811061068e5761068e612f8f565b602002602001018190525061078a6003836000815181106106b1576106b1612f8f565b60200260200101516040516106c69190612fa5565b90815260405190819003602001902080546106e090612fc1565b80601f016020809104026020016040519081016040528092919081815260200182805461070c90612fc1565b80156107595780601f1061072e57610100808354040283529160200191610759565b820191906000526020600020905b81548152906001019060200180831161073c57829003601f168201915b50505050506040518060400160405280600e81526020016d13d491115497d111531254d5115160921b815250612588565b6107e25760405162461bcd60e51b815260206004820152602360248201527f5472616e73616374696f6e4c65646765723a20416c72656164792064656c69736044820152621d195960ea1b60648201526084016104a5565b60405180604001604052808260008151811061080057610800612f8f565b602002602001015181526020016001151581525060038360008151811061082957610829612f8f565b602002602001015160405161083e9190612fa5565b9081526040519081900360200190208151819061085b9082613065565b50602091909101516001909101805460ff19169115159190911790556108818484610a62565b601b5460405163098c667960e21b81526001600160a01b039091169063263199e4906108b7908590859089908990600401613173565b600060405180830381600087803b1580156108d157600080fd5b505af11580156108e5573d6000803e3d6000fd5b5050601b5460408051681b1a5cdd1a5b99d25960ba1b8152600360098201529051908190036029018120635b862f0560e11b82526001600160a01b03909216935063b70c5e0a925061093e9190889088906004016131bd565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050600f54600754601654604051632142170760e11b81523060048201526001600160a01b0392831660248201526044810191909152911692506342842e0e91506064015b600060405180830381600087803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b505060018055505050505050565b601c5460405163011b5dad60e11b81526001600160a01b0383811660048301526000921690630236bb5a90602401602060405180830381865afa158015610a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5c9190612e48565b92915050565b601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190612e48565b610aea5760405162461bcd60e51b81526004016104a590612e65565b601f546301000000900460ff1615610b565760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a204c656467657220697320616c7260448201526865616479206c6f636b60b81b60648201526084016104a5565b601f805463ff0000001916630100000090811791829055601b5460405163fc7050eb60e01b81526001600160a01b039091169263fc7050eb92610ba592910460ff169086908690600401613263565b600060405180830381600087803b158015610bbf57600080fd5b505af1158015610bd3573d6000803e3d6000fd5b505050505050565b600260015403610bfd5760405162461bcd60e51b81526004016104a590612e03565b600260015560408401516001600160a01b0316610c6e5760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c6560448201526872206164647265737360b81b60648201526084016104a5565b6000836040015111610cd35760405162461bcd60e51b815260206004820152602860248201527f5472616e73616374696f6e4c65646765723a20496e76616c69642073656c6c656044820152671c88185b5bdd5b9d60c21b60648201526084016104a5565b6007546001600160a01b031615610d475760405162461bcd60e51b815260206004820152603260248201527f5472616e73616374696f6e4c65646765723a2044697362757273652064657461604482015271696c7320616c72656164792065786973747360701b60648201526084016104a5565b83600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050826010600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155905050601b60009054906101000a90046001600160a01b03166001600160a01b0316639840fcbc6005601085856040518563ffffffff1660e01b81526004016109b1949392919061328d565b6002600154036110215760405162461bcd60e51b81526004016104a590612e03565b6002600155600054610100900460ff16158080156110465750600054600160ff909116105b806110605750303b158015611060575060005460ff166001145b6110c35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a5565b6000805460ff1916600117905580156110e6576000805461ff0019166101001790555b6001600160a01b03881661110c5760405162461bcd60e51b81526004016104a590613473565b6001600160a01b0387166111325760405162461bcd60e51b81526004016104a590613473565b8451806111515760405162461bcd60e51b81526004016104a5906134bc565b845181146111a15760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c696420646174610060448201526064016104a5565b60005b81811015611284578681815181106111be576111be612f8f565b60200260200101516002600083815260200190815260200160002090816111e59190613065565b50604051806040016040528087838151811061120357611203612f8f565b60200260200101518152602001600115158152506003600260008481526020019081526020016000206040516112399190613506565b908152604051908190036020019020815181906112569082613065565b50602091909101516001909101805460ff19169115159190911790558061127c81613592565b9150506111a4565b506112906001826135ab565b601d55601f8054601b80546001600160a01b03199081166001600160a01b038e81169182179093556101006001600160c01b03199094166401000000008e8516021793909317909355601c8054909316908a161790915560405163225f921960e21b815263897e48649061130e908990899089908990600401613173565b600060405180830381600087803b15801561132857600080fd5b505af115801561133c573d6000803e3d6000fd5b505050505080156109df576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505060018055505050505050565b600260205260009081526040902080546113ad90612fc1565b80601f01602080910402602001604051908101604052809291908181526020018280546113d990612fc1565b80156114265780601f106113fb57610100808354040283529160200191611426565b820191906000526020600020905b81548152906001019060200180831161140957829003601f168201915b505050505081565b6002600154036114505760405162461bcd60e51b81526004016104a590612e03565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa15801561149d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c19190612e48565b6114dd5760405162461bcd60e51b81526004016104a590612e65565b8351601f546301000000900460ff16156115095760405162461bcd60e51b81526004016104a5906135be565b601f54610100900460ff166115305760405162461bcd60e51b81526004016104a590612eb9565b600081116115505760405162461bcd60e51b81526004016104a5906134bc565b835181146115a05760405162461bcd60e51b815260206004820152601f60248201527f5472616e73616374696f6e4c65646765723a20696e76616c696420646174610060448201526064016104a5565b60005b818110156116e95760038682815181106115bf576115bf612f8f565b60200260200101516040516115d49190612fa5565b9081526040519081900360200190206001015460ff166116445760405162461bcd60e51b815260206004820152602560248201527f5472616e73616374696f6e4c65646765723a20496e76616c6964206c6564676560448201526472206b657960d81b60648201526084016104a5565b604051806040016040528086838151811061166157611661612f8f565b6020026020010151815260200160011515815250600387838151811061168957611689612f8f565b602002602001015160405161169e9190612fa5565b908152604051908190036020019020815181906116bb9082613065565b50602091909101516001909101805460ff1916911515919091179055806116e181613592565b9150506115a3565b50601b5460405163098c667960e21b81526001600160a01b039091169063263199e490611720908890889088908890600401613173565b600060405180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b50506001805550505050505050565b60026001540361177f5760405162461bcd60e51b81526004016104a590612e03565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f09190612e48565b61180c5760405162461bcd60e51b81526004016104a590612e65565b601f54610100900460ff166118335760405162461bcd60e51b81526004016104a590612eb9565b601f5460ff16156118565760405162461bcd60e51b81526004016104a590612f02565b601f546301000000900460ff16156118805760405162461bcd60e51b81526004016104a590612f4e565b6007546001600160a01b03166118ef5760405162461bcd60e51b815260206004820152602e60248201527f5472616e73616374696f6e4c65646765723a204469736275727365206465746160448201526d696c73206e6f742065786973747360901b60648201526084016104a5565b600083600003611d0757601f805460ff191660011790556015546014546013546012546011546010546119229190613601565b61192c9190613601565b6119369190613601565b6119409190613601565b61194a9190613601565b601f546040516370a0823160e01b815230600482015291925082916401000000009091046001600160a01b0316906370a0823190602401602060405180830381865afa15801561199e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c29190613614565b10156119e05760405162461bcd60e51b81526004016104a59061362d565b6005546010546119f9916001600160a01b0316906125e1565b600654601154611a12916001600160a01b0316906125e1565b600754601254611a2b916001600160a01b0316906125e1565b600954601354611a44916001600160a01b0316906125e1565b600c54601454611a5d916001600160a01b0316906125e1565b600d54601554611a76916001600160a01b0316906125e1565b600b54601954611a8f916001600160a01b0316906125e1565b600a54601854611aa8916001600160a01b0316906125e1565b600e54601a54611ac1916001600160a01b0316906125e1565b601b5460408051671b195919d95c925960c21b8152600360088201529051908190036028018120635f61f3a360e11b82526001600160a01b039092169163bec3e74691611b159190879087906004016131bd565b600060405180830381600087803b158015611b2f57600080fd5b505af1158015611b43573d6000803e3d6000fd5b50505050611b518383610a62565b611c2f6003604051611b729068746f6b656e5479706560b81b815260090190565b9081526040519081900360200190208054611b8c90612fc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bb890612fc1565b8015611c055780601f10611bda57610100808354040283529160200191611c05565b820191906000526020600020905b815481529060010190602001808311611be857829003601f168201915b5050505050604051806040016040528060078152602001664552433131353560c81b815250612588565b15611cc257600f54600854601654601754604051637921219560e11b81523060048201526001600160a01b0393841660248201526044810192909252606482015260a06084820152600060a482015291169063f242432a9060c4015b600060405180830381600087803b158015611ca557600080fd5b505af1158015611cb9573d6000803e3d6000fd5b50505050611f6f565b600f54600854601654604051632142170760e11b81523060048201526001600160a01b03928316602482015260448101919091529116906342842e0e90606401611c8b565b6000848152600460205260409020600581015460ff1615611d7c5760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2052756c6520616c726561647920604482015268191a5cd89d5c9cd95960ba1b60648201526084016104a5565b60058101805460ff191660011790556000858152600460205260409020819080611da68382613670565b5060018281018054611dbb928401919061267c565b5060028281018054611dd0928401919061267c565b5060038281018054611de5928401919061267c565b5060048281018054611dfa92840191906126cc565b506005918201549101805460ff191660ff9092161515919091179055600381015460005b81811015611e6557826002018181548110611e3b57611e3b612f8f565b906000526020600020015484611e519190613601565b935080611e5d81613592565b915050611e1e565b50601f546040516370a0823160e01b8152306004820152849164010000000090046001600160a01b0316906370a0823190602401602060405180830381865afa158015611eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eda9190613614565b1015611ef85760405162461bcd60e51b81526004016104a59061362d565b60005b81811015611f6b57611f59836003018281548110611f1b57611f1b612f8f565b6000918252602090912001546002850180546001600160a01b039092169184908110611f4957611f49612f8f565b90600052602060002001546125e1565b80611f6381613592565b915050611efb565b5050505b5050600180555050565b600260015403611f9b5760405162461bcd60e51b81526004016104a590612e03565b6002600155601c5460405163011b5dad60e11b81523360048201526001600160a01b0390911690630236bb5a90602401602060405180830381865afa158015611fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200c9190612e48565b6120285760405162461bcd60e51b81526004016104a590612e65565b601f548390610100900460ff166120515760405162461bcd60e51b81526004016104a590612eb9565b601f5462010000900460ff16156120b95760405162461bcd60e51b815260206004820152602660248201527f5472616e73616374696f6e4c65646765723a2052756c657320616c726561647960448201526508185919195960d21b60648201526084016104a5565b601f546301000000900460ff16156120e35760405162461bcd60e51b81526004016104a5906135be565b600081116121455760405162461bcd60e51b815260206004820152602960248201527f5472616e73616374696f6e4c65646765723a2072756c65732063616e206e6f7460448201526820626520656d70747960b81b60648201526084016104a5565b60005b848110156121a45785858281811061216257612162612f8f565b9050602002810190612174919061373c565b601e54600090815260046020526040902061218f8282613ad3565b5081905061219c81613592565b915050612148565b506121b06001826135ab565b601e55601f805462ff0000191662010000179055601b546040516332644bf360e11b81526001600160a01b03909116906364c897e690611720908890889088908890600401613d12565b60046020526000908152604090208054819061221590612fc1565b80601f016020809104026020016040519081016040528092919081815260200182805461224190612fc1565b801561228e5780601f106122635761010080835404028352916020019161228e565b820191906000526020600020905b81548152906001019060200180831161227157829003601f168201915b5050506005909301549192505060ff1682565b80516020818301810180516003825292820191909301209152805481906122c790612fc1565b80601f01602080910402602001604051908101604052809291908181526020018280546122f390612fc1565b80156123405780601f1061231557610100808354040283529160200191612340565b820191906000526020600020905b81548152906001019060200180831161232357829003601f168201915b5050506001909301549192505060ff1682565b60606000601d541161237c57506040805180820190915260028152617b7d60f01b602082015290565b60408051607b60f81b602082015281516001818303018152602190910190915260005b601d54811161256057600081815260026020526040812080546123c190612fc1565b80601f01602080910402602001604051908101604052809291908181526020018280546123ed90612fc1565b801561243a5780601f1061240f5761010080835404028352916020019161243a565b820191906000526020600020905b81548152906001019060200180831161241d57829003601f168201915b5050505050905060006003826040516124539190612fa5565b908152604051908190036020019020805461246d90612fc1565b80601f016020809104026020016040519081016040528092919081815260200182805461249990612fc1565b80156124e65780601f106124bb576101008083540402835291602001916124e6565b820191906000526020600020905b8154815290600101906020018083116124c957829003601f168201915b5050505050905083828260405160200161250293929190613e97565b6040516020818303038152906040529350601d548360016125239190613601565b1161254b57836040516020016125399190613f02565b60405160208183030381529060405293505b5050808061255890613592565b91505061239f565b50806040516020016125729190613f27565b60408051601f1981840301815291905292915050565b60008160405160200161259b9190612fa5565b60405160208183030381529060405280519060200120836040516020016125c29190612fa5565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b0382161561267857601f546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201849052640100000000909204909116906323b872dd906064016020604051808303816000875af1158015612652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126769190612e48565b505b5050565b8280548282559060005260206000209081019282156126bc5760005260206000209182015b828111156126bc5782548255916001019190600101906126a1565b506126c8929150612719565b5090565b82805482825590600052602060002090601f016020900481019282156126bc57600052602060002091601f01602090048201828111156126bc5782548255916001019190600101906126a1565b5b808211156126c8576000815560010161271a565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b03811182821017156127675761276761272e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156127955761279561272e565b604052919050565b600082601f8301126127ae57600080fd5b81356001600160401b038111156127c7576127c761272e565b6127da601f8201601f191660200161276d565b8181528460208386010111156127ef57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561281f57600080fd5b8235915060208301356001600160401b0381111561283c57600080fd5b6128488582860161279d565b9150509250929050565b6001600160a01b038116811461286757600080fd5b50565b803561287581612852565b919050565b60006020828403121561288c57600080fd5b813561289781612852565b9392505050565b600061016082840312156128b157600080fd5b6128b9612744565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525092915050565b60008060008084860361030081121561294757600080fd5b6101608082121561295757600080fd5b61295f612744565b915061296a8761286a565b82526129786020880161286a565b60208301526129896040880161286a565b604083015261299a6060880161286a565b60608301526129ab6080880161286a565b60808301526129bc60a0880161286a565b60a08301526129cd60c0880161286a565b60c08301526129de60e0880161286a565b60e08301526101006129f181890161286a565b90830152610120612a0388820161286a565b90830152610140612a1588820161286a565b8184015250819550612a298882890161289e565b945050506102c085013591506102e08501356001600160401b03811115612a4f57600080fd5b612a5b8782880161279d565b91505092959194509250565b600082601f830112612a7857600080fd5b813560206001600160401b0380831115612a9457612a9461272e565b8260051b612aa383820161276d565b9384528581018301938381019088861115612abd57600080fd5b84880192505b85831015612af957823584811115612adb5760008081fd5b612ae98a87838c010161279d565b8352509184019190840190612ac3565b98975050505050505050565b600080600080600080600060e0888a031215612b2057600080fd5b8735612b2b81612852565b96506020880135612b3b81612852565b9550612b496040890161286a565b945060608801356001600160401b0380821115612b6557600080fd5b612b718b838c01612a67565b955060808a0135915080821115612b8757600080fd5b612b938b838c01612a67565b945060a08a0135935060c08a0135915080821115612bb057600080fd5b50612bbd8a828b0161279d565b91505092959891949750929550565b600060208284031215612bde57600080fd5b5035919050565b60005b83811015612c00578181015183820152602001612be8565b50506000910152565b60008151808452612c21816020860160208601612be5565b601f01601f19169290920160200192915050565b6020815260006128976020830184612c09565b60008060008060808587031215612c5e57600080fd5b84356001600160401b0380821115612c7557600080fd5b612c8188838901612a67565b95506020870135915080821115612c9757600080fd5b612ca388838901612a67565b9450604087013593506060870135915080821115612cc057600080fd5b50612a5b8782880161279d565b600080600060608486031215612ce257600080fd5b833592506020840135915060408401356001600160401b03811115612d0657600080fd5b612d128682870161279d565b9150509250925092565b60008060008060608587031215612d3257600080fd5b84356001600160401b0380821115612d4957600080fd5b818701915087601f830112612d5d57600080fd5b813581811115612d6c57600080fd5b8860208260051b8501011115612d8157600080fd5b60209283019650945090860135925060408601359080821115612cc057600080fd5b604081526000612db66040830185612c09565b905082151560208301529392505050565b600060208284031215612dd957600080fd5b81356001600160401b03811115612def57600080fd5b612dfb8482850161279d565b949350505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b801515811461286757600080fd5b600060208284031215612e5a57600080fd5b815161289781612e3a565b60208082526034908201527f5472616e73616374696f6e4c65646765723a204f6e6c792061646d696e206361604082015273371031b0b636103a3434b990333ab731ba34b7b760611b606082015260800190565b60208082526029908201527f5472616e73616374696f6e4c65646765723a204c6564676572206e6f7420696e6040820152681a5d1a585b1a5e995960ba1b606082015260800190565b6020808252602c908201527f5472616e73616374696f6e4c65646765723a205061796d656e7420616c72656160408201526b191e48191a5cd89d5c9cd95960a21b606082015260800190565b60208082526021908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152606b60f81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008251612fb7818460208701612be5565b9190910192915050565b600181811c90821680612fd557607f821691505b602082108103612ff557634e487b7160e01b600052602260045260246000fd5b50919050565b5b818110156126785760008155600101612ffc565b601f82111561267657806000526020600020601f840160051c810160208510156130375750805b613049601f850160051c830182612ffb565b5050505050565b600019600383901b1c191660019190911b1790565b81516001600160401b0381111561307e5761307e61272e565b6130928161308c8454612fc1565b84613010565b602080601f8311600181146130c157600084156130af5750858301515b6130b98582613050565b865550610bd3565b600085815260208120601f198616915b828110156130f0578886015182559484019460019091019084016130d1565b508582101561310e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526020808501808196508360051b8101915082860160005b85811015613166578284038952613154848351612c09565b9885019893509084019060010161313c565b5091979650505050505050565b608081526000613186608083018761311e565b8281036020840152613198818761311e565b905084604084015282810360608401526131b28185612c09565b979650505050505050565b6060815260008085546131cf81612fc1565b80606086015260806001808416600081146131f1576001811461320b5761323c565b60ff1985168884015283151560051b88018301955061323c565b8a60005260208060002060005b868110156132335781548b8201870152908401908201613218565b8a018501975050505b505050505084602084015282810360408401526132598185612c09565b9695505050505050565b83151581528260208201526060604082015260006132846060830184612c09565b95945050505050565b60006103006132b4836132a789546001600160a01b031690565b6001600160a01b03169052565b60018701546001600160a01b03166001600160a01b03811660208501525060028701546001600160a01b03166001600160a01b03811660408501525060038701546001600160a01b03166001600160a01b03811660608501525060048701546001600160a01b03166001600160a01b03811660808501525060058701546001600160a01b03166001600160a01b03811660a08501525060068701546001600160a01b03166001600160a01b03811660c08501525060078701546001600160a01b03166001600160a01b03811660e08501525060088701546001600160a01b03166001600160a01b0381166101008501525060098701546001600160a01b03166001600160a01b03811661012085015250600a8701546001600160a01b03166001600160a01b038116610140850152508554610160840152600186015461018084015260028601546101a084015260038601546101c084015260048601546101e084015260058601546102008401526006860154610220840152600786015461024084015260088601546102608401526009860154610280840152600a8601546102a0840152846102c0840152806102e08401526131b281840185612c09565b60208082526029908201527f5472616e73616374696f6e4c65646765723a20416464726573732063616e6e6f60408201526874206265207a65726f60b81b606082015260800190565b6020808252602a908201527f5472616e73616374696f6e4c65646765723a2076616c7565732063616e206e6f6040820152697420626520656d70747960b01b606082015260800190565b600080835461351481612fc1565b6001828116801561352c576001811461354157613570565b60ff1984168752821515830287019450613570565b8760005260208060002060005b858110156135675781548a82015290840190820161354e565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016135a4576135a461357c565b5060010190565b81810381811115610a5c57610a5c61357c565b60208082526023908201527f5472616e73616374696f6e4c65646765723a204c6564676572206973206c6f636040820152621ad95960ea1b606082015260800190565b80820180821115610a5c57610a5c61357c565b60006020828403121561362657600080fd5b5051919050565b60208082526023908201527f5472616e73616374696f6e4c65646765723a20496e73756666696369656e742060408201526243494360e81b606082015260800190565b81810361367b575050565b6136858254612fc1565b6001600160401b0381111561369c5761369c61272e565b6136aa8161308c8454612fc1565b6000601f8211600181146136d857600083156136c65750848201545b6136d08482613050565b855550613049565b600085815260209020601f19841690600086815260209020845b8381101561371257828601548255600195860195909101906020016136f2565b508583101561310e5793015460001960f8600387901b161c19169092555050600190811b01905550565b6000823560be19833603018112612fb757600080fd5b6001600160401b038311156137695761376961272e565b61377d836137778354612fc1565b83613010565b6000601f8411600181146137ab57600085156137995750838201355b6137a38682613050565b845550613049565b600083815260209020601f19861690835b828110156137dc57868501358255602094850194600190920191016137bc565b50868210156137f95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000808335601e1984360301811261382257600080fd5b8301803591506001600160401b0382111561383c57600080fd5b6020019150600581901b360382131561385457600080fd5b9250929050565b818310156126765780600052602060002061387a838201858301612ffb565b50505050565b6001600160401b038311156138975761389761272e565b600160401b8311156138ab576138ab61272e565b80548382556138bb84828461385b565b50818160005260208060002060005b868110156138e457833582820155928201926001016138ca565b50505050505050565b6001600160401b038311156139045761390461272e565b600160401b8311156139185761391861272e565b805483825561392884828461385b565b50818160005260208060002060005b868110156138e457833561394a81612852565b8282015592820192600101613937565b600160401b82111561396e5761396e61272e565b80548282558083101561267657816000526020600020601f840160051c8101601f851680156139ae576000198083018054828460200360031b1c16815550505b50613049601f840160051c830182612ffb565b6002811061286757600080fd5b60008135610a5c816139c1565b6001600160401b038311156139f2576139f261272e565b6139fc838261395a565b60008181526020902082908460051c60005b81811015613a66576000805b6020808210613a295750613a59565b613a4c613a35886139ce565b60ff600385901b90811b801987169290911b161790565b9601959150600101613a1a565b5083820155600101613a0e565b50601f198616808703818814613abc576000805b82811015613ab657613aa5613a8e886139ce565b60ff600384901b90811b801986169290911b161790565b602097909701969150600101613a7a565b50848401555b5050505050505050565b60008135610a5c81612e3a565b8135601e19833603018112613ae757600080fd5b820180356001600160401b03811115613aff57600080fd5b602082019150803603821315613b1457600080fd5b613b1f818385613752565b5050613b2e602083018361380b565b613b3c818360018601613880565b5050613b4b604083018361380b565b613b59818360028601613880565b5050613b68606083018361380b565b613b768183600386016138ed565b5050613b85608083018361380b565b613b938183600486016139db565b5050612678613ba460a08401613ac6565b6005830160ff1981541660ff8315151681178255505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e19843603018112613bfd57600080fd5b83016020810192503590506001600160401b03811115613c1c57600080fd5b8060051b360382131561385457600080fd5b81835260006001600160fb1b03831115613c4757600080fd5b8260051b80836020870137939093016020019392505050565b8183526000602080850194508260005b85811015613c9e578135613c8381612852565b6001600160a01b031687529582019590820190600101613c70565b509495945050505050565b818352600060208085019450826000805b86811015613cfb578235613ccd816139c1565b60028110613ce957634e487b7160e01b83526021600452602483fd5b88529683019691830191600101613cba565b50959695505050505050565b803561287581612e3a565b60608082528181018590526000906080808401600588901b8501820189855b8a811015613e6f57878303607f190184528135368d900360be19018112613d5757600080fd5b8c0160c0813536839003601e19018112613d7057600080fd5b820160208181019135906001600160401b03821115613d8e57600080fd5b813603831315613d9d57600080fd5b838852613dad8489018385613bbd565b9350613dbb81860186613be6565b9350915087840381890152613dd1848484613c2e565b935060409250613de383860186613be6565b9250888503848a0152613df7858483613c2e565b945050613e068b860186613be6565b935091508784038b890152613e1c848484613c60565b9350613e2a8a860186613be6565b935091508784038a890152613e40848484613ca9565b935060a09250613e51838601613d07565b15159290970191909152509484019493929092019150600101613d31565b50508760208701528581036040870152613e898188612c09565b9a9950505050505050505050565b60008451613ea9818460208901612be5565b601160f91b9083018181528551909190613eca816001850160208a01612be5565b62111d1160e91b600193909101928301528451613eee816004850160208901612be5565b600492019182015260050195945050505050565b60008251613f14818460208701612be5565b600b60fa1b920191825250600101919050565b60008251613f39818460208701612be5565b607d60f81b92019182525060010191905056fea264697066735822122014422a7e997b52464727f126b0dfcbd142bb91ba3f9885d07d4e6902445672db64736f6c63430008110033
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.