More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Dig | 7405329 | 40 mins ago | IN | 0.00003 ETH | 0.000062 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
7405329 | 40 mins ago | 0.000019 ETH | ||||
7405329 | 40 mins ago | 0.00003 ETH | ||||
7400959 | 1 hr ago | 0.000019 ETH | ||||
7400959 | 1 hr ago | 0.00003 ETH | ||||
7400939 | 1 hr ago | 0.000019 ETH | ||||
7400939 | 1 hr ago | 0.00003 ETH | ||||
7400921 | 1 hr ago | 0.000019 ETH | ||||
7400921 | 1 hr ago | 0.00003 ETH | ||||
7400902 | 1 hr ago | 0.000019 ETH | ||||
7400902 | 1 hr ago | 0.00003 ETH | ||||
7400532 | 2 hrs ago | 0.000019 ETH | ||||
7400532 | 2 hrs ago | 0.00003 ETH | ||||
7400514 | 2 hrs ago | 0.000019 ETH | ||||
7400514 | 2 hrs ago | 0.00003 ETH | ||||
7400482 | 2 hrs ago | 0.000019 ETH | ||||
7400482 | 2 hrs ago | 0.00003 ETH | ||||
7400451 | 2 hrs ago | 0.000019 ETH | ||||
7400451 | 2 hrs ago | 0.00003 ETH | ||||
7400377 | 2 hrs ago | 0.000019 ETH | ||||
7400377 | 2 hrs ago | 0.00003 ETH | ||||
7400341 | 2 hrs ago | 0.000019 ETH | ||||
7400341 | 2 hrs ago | 0.00003 ETH | ||||
7400324 | 2 hrs ago | 0.000019 ETH | ||||
7400324 | 2 hrs ago | 0.00003 ETH | ||||
7394879 | 3 hrs ago | 0.000019 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
DiggingGame
Compiler Version
v0.8.24+commit.e11b9ed9
ZkSolc Version
v1.5.12
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.22; import {MathHelper} from "./libraries/MathHelper.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IEntropyConsumer} from "@pythnetwork/entropy-sdk-solidity/IEntropyConsumer.sol"; import {IEntropy} from "@pythnetwork/entropy-sdk-solidity/IEntropy.sol"; interface IDiggaToken is IERC20 { function burnFrom(address account, uint256 amount) external; function mint(address to, uint256 amount) external; } contract DiggingGame is ReentrancyGuard, AccessControl, IEntropyConsumer { bytes32 public constant REFEREE_ROLE = keccak256("REFEREE_ROLE"); bytes32 public constant AIRDROP_CLAIMER = keccak256("AIRDROP_CLAIMER"); // Constants uint64 private constant MINES = 3; uint256 private constant FREE_DIGGING_WIN = 3; uint256 private constant AIRDROP_PERCENTAGE = 10; // 0,1% of each bet goes to airdrop uint256 private constant REFERRAL_DIVISOR = 20; // 100 / REFERRAL_PERCENTAGE for gas optimization // Ranges for artefact distribution - optimized to use less storage uint256 private constant RANGE_0 = 450; uint256 private constant RANGE_1 = 600; uint256 private constant RANGE_2 = 750; uint256 private constant RANGE_3 = 850; uint256 private constant RANGE_4 = 930; uint256 private constant RANGE_5 = 950; uint256 private constant RANGE_6 = 970; // State variables uint256 private minimalStake; IEntropy private entropy; IDiggaToken private digga; uint256 private airdropPool; uint256 private rngFees; // Multipliers for each artefact - optimized as constant uint256[7] private multipliers = [5, 10, 20, 50, 250, 1000, 0]; // Combined user state mapping to reduce storage slots struct UserState { uint256 freeDigging; uint256 freeDiggingStake; uint256[3] lastDigging; address referrer; } mapping(address => UserState) private userStates; // Random number generation state - optimized structure struct Request { address user; uint64 sequenceNumber; uint64 numMines; bytes32 userRandomNumber; uint256[3] randomNumber; // Fixed size array instead of dynamic uint256 stake; } struct Result { uint256[3] artefacts; address winner; uint256 winStake; bool isWin; } // Combined mappings to reduce storage slots struct RequestState { Request request; bool completed; Result result; } mapping(uint64 => RequestState) public requestStates; // Events event NewBaseStake(uint256 indexed minimalStake); event RandomNumberRequested( uint64 indexed sequenceNumber, address indexed user, uint256 stake ); event DiggingResult( uint256[3] artefacts, address indexed winner, uint256 winStake, bool indexed isWin ); event RNG(uint256[3] rngs); event FreeDiggingAwarded(address indexed user, uint256 amount); constructor( address entropyAddress, address diggaAddress ) { minimalStake = 1e18; entropy = IEntropy(entropyAddress); digga = IDiggaToken(diggaAddress); rngFees = 0.00003 ether; _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); } function dig(uint256 stake) external payable nonReentrant { require(stake >= minimalStake, "Stake too low!"); require(msg.value >= rngFees, "Insufficient gas balance"); require(digga.balanceOf(_msgSender()) >= stake, "Insufficient DIGGA balance"); digga.burnFrom(_msgSender(), stake); airdropPool += (stake * AIRDROP_PERCENTAGE) / 10000; _requestRandomNumbers(stake); } function freeDig() external payable nonReentrant { require( userStates[_msgSender()].freeDigging > 0, "No free digging available" ); require(msg.value >= rngFees, "Insufficient gas balance"); uint256 stake = userStates[_msgSender()].freeDiggingStake; require(stake > 0, "Stake too low!"); _requestRandomNumbers(stake); userStates[_msgSender()].freeDigging -= 1; } function _requestRandomNumbers(uint256 stake) private { bytes32 userRandomNumber = keccak256( abi.encodePacked(block.timestamp, block.prevrandao, msg.sender) ); address entropyProvider = entropy.getDefaultProvider(); uint256 fee = entropy.getFee(entropyProvider); uint64 sequenceNumber = entropy.requestWithCallback{value: fee}( entropyProvider, userRandomNumber ); requestStates[sequenceNumber] = RequestState({ request: Request( _msgSender(), sequenceNumber, MINES, userRandomNumber, [uint256(0), uint256(0), uint256(0)], stake ), completed: false, result: Result( [uint256(0), uint256(0), uint256(0)], address(0), 0, false ) }); emit RandomNumberRequested(sequenceNumber, _msgSender(), stake); } function entropyCallback( uint64 sequenceNumber, address provider, bytes32 randomNumber ) internal virtual override { RequestState storage state = requestStates[sequenceNumber]; require(state.request.user != address(0), "Invalid request"); require(!state.completed, "Request already completed"); for (uint i = 0; i < state.request.numMines; i++) { state.request.randomNumber[i] = uint256( keccak256(abi.encodePacked(randomNumber, i)) ); } emit RNG(state.request.randomNumber); _processDigging( sequenceNumber, state.request.stake, state.request.randomNumber ); state.completed = true; } function getEntropy() internal view override returns (address) { return address(entropy); } function _processDigging( uint64 sequenceNumber, uint256 stake, uint256[3] memory randomWords ) private { uint256[3] memory artefacts; address digger = requestStates[sequenceNumber].request.user; for (uint256 i = 0; i < MINES; i++) { uint256 rng = randomWords[i] % RANGE_6; artefacts[i] = _getArtefact(rng); if (artefacts[i] == 6) { userStates[digger].freeDigging += FREE_DIGGING_WIN; emit FreeDiggingAwarded(digger, FREE_DIGGING_WIN); } } uint256 winStake = stake * multipliers[artefacts[0]]; bool isWin = (artefacts[0] == artefacts[1] && artefacts[0] == artefacts[2]); if (isWin && winStake > 0) { _distributeRewards(digger, winStake); } if (userStates[digger].freeDigging > 0) { userStates[digger].freeDiggingStake = stake; } requestStates[sequenceNumber].result = Result( artefacts, digger, winStake, isWin ); userStates[digger].lastDigging = artefacts; emit DiggingResult(artefacts, digger, isWin ? winStake : 0, isWin); } function _getArtefact(uint256 random) private pure returns (uint256) { if (random < RANGE_0) return 0; if (random < RANGE_1) return 1; if (random < RANGE_2) return 2; if (random < RANGE_3) return 3; if (random < RANGE_4) return 4; if (random < RANGE_5) return 5; return 6; } function _distributeRewards(address digger, uint256 winStake) private { address referrer = userStates[digger].referrer; digga.mint(digger, winStake); // if (referrer != address(0)) { // digga.mint(referrer, winStake / REFERRAL_DIVISOR); // } } // View functions function getUserState( address user ) external view returns (UserState memory) { return userStates[user]; } function getMinimalStake() external view returns (uint256) { return minimalStake; } function getMultipliers() external view returns (uint256[7] memory) { return multipliers; } function isRequestCompleted( uint64 sequenceNumber ) external view returns (bool) { return requestStates[sequenceNumber].completed; } function getRequest( uint64 sequenceNumber ) external view returns (Request memory) { return requestStates[sequenceNumber].request; } function getResult( uint64 sequenceNumber ) external view returns (Result memory) { return requestStates[sequenceNumber].result; } function getAirdropPool() external view returns (uint256) { return airdropPool; } function getRngFees() external view returns (uint256) { return rngFees; } // Admin functions function setMinimalStake( uint256 amount ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(amount > 0, "Stake must be greater than 0"); minimalStake = amount; emit NewBaseStake(amount); } function setReferrer( address referrer, address user ) external onlyRole(REFEREE_ROLE) { require(referrer != address(0), "Invalid address"); require(user != address(0), "Invalid address"); require( userStates[user].referrer == address(0), "User already has a referrer" ); userStates[user].referrer = referrer; } function newOwner( address newAddress ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(newAddress != address(0), "Invalid address"); _grantRole(DEFAULT_ADMIN_ROLE, newAddress); _revokeRole(DEFAULT_ADMIN_ROLE, msg.sender); } function setRngFees( uint256 newRngFees ) external onlyRole(DEFAULT_ADMIN_ROLE) { rngFees = newRngFees; } function deposit() external payable {} receive() external payable {} function withdraw(uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) { (bool success, ) = payable(msg.sender).call{value: amount}(""); require(success, "Transfer failed"); } function claimAirdropReserves() external onlyRole(AIRDROP_CLAIMER) { digga.mint(msg.sender, airdropPool); airdropPool = 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library MathHelper { function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = (x + 1) / 2; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } function calculFeeReduction( uint256 price, uint256 userStake ) internal pure returns (uint256) { uint256 percentReduce = 12500; // Pas besoin de multiplier par BIG_NUM ici car on va simplifier uint256 MaxStakedReduce = 10000; // de même pour cette valeur if (userStake > MaxStakedReduce) { userStake = MaxStakedReduce; } // Simplification des calculs en évitant la multiplication/division par BIG_NUM // On utilise le fait que (userStake / percentReduce) * price est mathématiquement équivalent à // (userStake * price) / percentReduce uint256 reduction = (userStake * price) / percentReduce; // On soustrait ensuite la réduction du prix initial return price - reduction; } function calculRewardToShare( uint256 amount, uint256 share ) internal pure returns (uint256) { uint256 percent = 100; // La multiplication par BIG_NUM suivie d'une division par BIG_NUM est inutile // si vous divisez d'abord par percent puis multipliez par share, // cela revient au même et est plus efficace. // Calculez la part en pourcentage de la quantité sans perte de précision inutile. return (amount * share) / percent; } function addBonusPercent( uint256 amount, uint8 bonus ) internal pure returns (uint256) { uint256 percent = 100; // Si bonus est supérieur à 0, ajoutez le pourcentage bonus à amount // La formule pour ajouter un bonus est : amount + (amount * bonus / percent) if (bonus > 0) { return amount + ((amount * uint256(bonus)) / percent); } else { // Si bonus est 0, retournez simplement le montant initial sans modification return amount; } } function addBonusPercent256( uint256 amount, uint256 bonus ) internal pure returns (uint256) { uint256 percent = 100; // Si bonus est supérieur à 0, ajoutez le pourcentage bonus à amount // La formule pour ajouter un bonus est : amount + (amount * bonus / percent) if (bonus > 0) { return amount + ((amount * bonus) / percent); } else { // Si bonus est 0, retournez simplement le montant initial sans modification return amount; } } function removeBonusPercent( uint256 amount, uint8 bonus ) internal pure returns (uint256) { uint256 percent = 100; // Si le bonus est supérieur à 0, soustrayez le pourcentage bonus de amount // La formule pour soustraire un bonus est : amount - (amount * bonus / percent) if (bonus > 0) { // S'assurer que le bonus n'est pas plus grand que le montant après conversion pour éviter un underflow uint256 bonusAmount = (amount * uint256(bonus)) / percent; require( amount >= bonusAmount, "Bonus is greater than amount, causing underflow" ); return amount - bonusAmount; } else { // Si le bonus est 0, retournez simplement le montant initial sans modification return amount; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.3.0) (access/AccessControl.sol) pragma solidity ^0.8.20; import {IAccessControl} from "./IAccessControl.sol"; import {Context} from "../utils/Context.sol"; import {ERC165} from "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ 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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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 EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * 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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); 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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
// SPDX-License-Identifier: Apache 2 pragma solidity ^0.8.0; import "./EntropyEvents.sol"; interface IEntropy is EntropyEvents { // Register msg.sender as a randomness provider. The arguments are the provider's configuration parameters // and initial commitment. Re-registering the same provider rotates the provider's commitment (and updates // the feeInWei). // // chainLength is the number of values in the hash chain *including* the commitment, that is, chainLength >= 1. function register( uint128 feeInWei, bytes32 commitment, bytes calldata commitmentMetadata, uint64 chainLength, bytes calldata uri ) external; // Withdraw a portion of the accumulated fees for the provider msg.sender. // Calling this function will transfer `amount` wei to the caller (provided that they have accrued a sufficient // balance of fees in the contract). function withdraw(uint128 amount) external; // Withdraw a portion of the accumulated fees for provider. The msg.sender must be the fee manager for this provider. // Calling this function will transfer `amount` wei to the caller (provided that they have accrued a sufficient // balance of fees in the contract). function withdrawAsFeeManager(address provider, uint128 amount) external; // As a user, request a random number from `provider`. Prior to calling this method, the user should // generate a random number x and keep it secret. The user should then compute hash(x) and pass that // as the userCommitment argument. (You may call the constructUserCommitment method to compute the hash.) // // This method returns a sequence number. The user should pass this sequence number to // their chosen provider (the exact method for doing so will depend on the provider) to retrieve the provider's // number. The user should then call fulfillRequest to construct the final random number. // // This method will revert unless the caller provides a sufficient fee (at least getFee(provider)) as msg.value. // Note that excess value is *not* refunded to the caller. function request( address provider, bytes32 userCommitment, bool useBlockHash ) external payable returns (uint64 assignedSequenceNumber); // Request a random number. The method expects the provider address and a secret random number // in the arguments. It returns a sequence number. // // The address calling this function should be a contract that inherits from the IEntropyConsumer interface. // The `entropyCallback` method on that interface will receive a callback with the generated random number. // // This method will revert unless the caller provides a sufficient fee (at least getFee(provider)) as msg.value. // Note that excess value is *not* refunded to the caller. function requestWithCallback( address provider, bytes32 userRandomNumber ) external payable returns (uint64 assignedSequenceNumber); // Fulfill a request for a random number. This method validates the provided userRandomness and provider's proof // against the corresponding commitments in the in-flight request. If both values are validated, this function returns // the corresponding random number. // // Note that this function can only be called once per in-flight request. Calling this function deletes the stored // request information (so that the contract doesn't use a linear amount of storage in the number of requests). // If you need to use the returned random number more than once, you are responsible for storing it. function reveal( address provider, uint64 sequenceNumber, bytes32 userRevelation, bytes32 providerRevelation ) external returns (bytes32 randomNumber); // Fulfill a request for a random number. This method validates the provided userRandomness // and provider's revelation against the corresponding commitment in the in-flight request. If both values are validated // and the requestor address is a contract address, this function calls the requester's entropyCallback method with the // sequence number, provider address and the random number as arguments. Else if the requestor is an EOA, it won't call it. // // Note that this function can only be called once per in-flight request. Calling this function deletes the stored // request information (so that the contract doesn't use a linear amount of storage in the number of requests). // If you need to use the returned random number more than once, you are responsible for storing it. // // Anyone can call this method to fulfill a request, but the callback will only be made to the original requester. function revealWithCallback( address provider, uint64 sequenceNumber, bytes32 userRandomNumber, bytes32 providerRevelation ) external; function getProviderInfo( address provider ) external view returns (EntropyStructs.ProviderInfo memory info); function getDefaultProvider() external view returns (address provider); function getRequest( address provider, uint64 sequenceNumber ) external view returns (EntropyStructs.Request memory req); function getFee(address provider) external view returns (uint128 feeAmount); function getAccruedPythFees() external view returns (uint128 accruedPythFeesInWei); function setProviderFee(uint128 newFeeInWei) external; function setProviderFeeAsFeeManager( address provider, uint128 newFeeInWei ) external; function setProviderUri(bytes calldata newUri) external; // Set manager as the fee manager for the provider msg.sender. // After calling this function, manager will be able to set the provider's fees and withdraw them. // Only one address can be the fee manager for a provider at a time -- calling this function again with a new value // will override the previous value. Call this function with the all-zero address to disable the fee manager role. function setFeeManager(address manager) external; function constructUserCommitment( bytes32 userRandomness ) external pure returns (bytes32 userCommitment); function combineRandomValues( bytes32 userRandomness, bytes32 providerRandomness, bytes32 blockHash ) external pure returns (bytes32 combinedRandomness); }
// SPDX-License-Identifier: Apache 2 pragma solidity ^0.8.0; abstract contract IEntropyConsumer { // This method is called by Entropy to provide the random number to the consumer. // It asserts that the msg.sender is the Entropy contract. It is not meant to be // override by the consumer. function _entropyCallback( uint64 sequence, address provider, bytes32 randomNumber ) external { address entropy = getEntropy(); require(entropy != address(0), "Entropy address not set"); require(msg.sender == entropy, "Only Entropy can call this function"); entropyCallback(sequence, provider, randomNumber); } // getEntropy returns Entropy contract address. The method is being used to check that the // callback is indeed from Entropy contract. The consumer is expected to implement this method. // Entropy address can be found here - https://docs.pyth.network/entropy/contract-addresses function getEntropy() internal view virtual returns (address); // This method is expected to be implemented by the consumer to handle the random number. // It will be called by _entropyCallback after _entropyCallback ensures that the call is // indeed from Entropy contract. function entropyCallback( uint64 sequence, address provider, bytes32 randomNumber ) internal virtual; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.3.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted to signal this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import "./EntropyStructs.sol"; interface EntropyEvents { event Registered(EntropyStructs.ProviderInfo provider); event Requested(EntropyStructs.Request request); event RequestedWithCallback( address indexed provider, address indexed requestor, uint64 indexed sequenceNumber, bytes32 userRandomNumber, EntropyStructs.Request request ); event Revealed( EntropyStructs.Request request, bytes32 userRevelation, bytes32 providerRevelation, bytes32 blockHash, bytes32 randomNumber ); event RevealedWithCallback( EntropyStructs.Request request, bytes32 userRandomNumber, bytes32 providerRevelation, bytes32 randomNumber ); event ProviderFeeUpdated(address provider, uint128 oldFee, uint128 newFee); event ProviderUriUpdated(address provider, bytes oldUri, bytes newUri); event ProviderFeeManagerUpdated( address provider, address oldFeeManager, address newFeeManager ); event Withdrawal( address provider, address recipient, uint128 withdrawnAmount ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * 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[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: Apache 2 pragma solidity ^0.8.0; contract EntropyStructs { struct ProviderInfo { uint128 feeInWei; uint128 accruedFeesInWei; // The commitment that the provider posted to the blockchain, and the sequence number // where they committed to this. This value is not advanced after the provider commits, // and instead is stored to help providers track where they are in the hash chain. bytes32 originalCommitment; uint64 originalCommitmentSequenceNumber; // Metadata for the current commitment. Providers may optionally use this field to help // manage rotations (i.e., to pick the sequence number from the correct hash chain). bytes commitmentMetadata; // Optional URI where clients can retrieve revelations for the provider. // Client SDKs can use this field to automatically determine how to retrieve random values for each provider. // TODO: specify the API that must be implemented at this URI bytes uri; // The first sequence number that is *not* included in the current commitment (i.e., an exclusive end index). // The contract maintains the invariant that sequenceNumber <= endSequenceNumber. // If sequenceNumber == endSequenceNumber, the provider must rotate their commitment to add additional random values. uint64 endSequenceNumber; // The sequence number that will be assigned to the next inbound user request. uint64 sequenceNumber; // The current commitment represents an index/value in the provider's hash chain. // These values are used to verify requests for future sequence numbers. Note that // currentCommitmentSequenceNumber < sequenceNumber. // // The currentCommitment advances forward through the provider's hash chain as values // are revealed on-chain. bytes32 currentCommitment; uint64 currentCommitmentSequenceNumber; // An address that is authorized to set / withdraw fees on behalf of this provider. address feeManager; } struct Request { // Storage slot 1 // address provider; uint64 sequenceNumber; // The number of hashes required to verify the provider revelation. uint32 numHashes; // Storage slot 2 // // The commitment is keccak256(userCommitment, providerCommitment). Storing the hash instead of both saves 20k gas by // eliminating 1 store. bytes32 commitment; // Storage slot 3 // // The number of the block where this request was created. // Note that we're using a uint64 such that we have an additional space for an address and other fields in // this storage slot. Although block.number returns a uint256, 64 bits should be plenty to index all of the // blocks ever generated. uint64 blockNumber; // The address that requested this random number. address requester; // If true, incorporate the blockhash of blockNumber into the generated random value. bool useBlockhash; // If true, the requester will be called back with the generated random value. bool isRequestWithCallback; // There are 2 remaining bytes of free space in this slot. } }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"entropyAddress","type":"address"},{"internalType":"address","name":"diggaAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[3]","name":"artefacts","type":"uint256[3]"},{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"winStake","type":"uint256"},{"indexed":true,"internalType":"bool","name":"isWin","type":"bool"}],"name":"DiggingResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FreeDiggingAwarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"minimalStake","type":"uint256"}],"name":"NewBaseStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[3]","name":"rngs","type":"uint256[3]"}],"name":"RNG","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"}],"name":"RandomNumberRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"AIRDROP_CLAIMER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFEREE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequence","type":"uint64"},{"internalType":"address","name":"provider","type":"address"},{"internalType":"bytes32","name":"randomNumber","type":"bytes32"}],"name":"_entropyCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAirdropReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stake","type":"uint256"}],"name":"dig","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeDig","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAirdropPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimalStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultipliers","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequenceNumber","type":"uint64"}],"name":"getRequest","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"internalType":"uint64","name":"numMines","type":"uint64"},{"internalType":"bytes32","name":"userRandomNumber","type":"bytes32"},{"internalType":"uint256[3]","name":"randomNumber","type":"uint256[3]"},{"internalType":"uint256","name":"stake","type":"uint256"}],"internalType":"struct DiggingGame.Request","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequenceNumber","type":"uint64"}],"name":"getResult","outputs":[{"components":[{"internalType":"uint256[3]","name":"artefacts","type":"uint256[3]"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"winStake","type":"uint256"},{"internalType":"bool","name":"isWin","type":"bool"}],"internalType":"struct DiggingGame.Result","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRngFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserState","outputs":[{"components":[{"internalType":"uint256","name":"freeDigging","type":"uint256"},{"internalType":"uint256","name":"freeDiggingStake","type":"uint256"},{"internalType":"uint256[3]","name":"lastDigging","type":"uint256[3]"},{"internalType":"address","name":"referrer","type":"address"}],"internalType":"struct DiggingGame.UserState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequenceNumber","type":"uint64"}],"name":"isRequestCompleted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"newOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"requestStates","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"internalType":"uint64","name":"numMines","type":"uint64"},{"internalType":"bytes32","name":"userRandomNumber","type":"bytes32"},{"internalType":"uint256[3]","name":"randomNumber","type":"uint256[3]"},{"internalType":"uint256","name":"stake","type":"uint256"}],"internalType":"struct DiggingGame.Request","name":"request","type":"tuple"},{"internalType":"bool","name":"completed","type":"bool"},{"components":[{"internalType":"uint256[3]","name":"artefacts","type":"uint256[3]"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"winStake","type":"uint256"},{"internalType":"bool","name":"isWin","type":"bool"}],"internalType":"struct DiggingGame.Result","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinimalStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"setReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRngFees","type":"uint256"}],"name":"setRngFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b00000000000000000000000000000000000000000000000000000000000000000100037f8d558998422e7a08ce1734808b88f3bde2b2d622f5539b583cc54ee0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000400000000000000000000000005a4a369f4db5df2054994af031b7b23949b98c0e0000000000000000000000008fa5e5a0ae757d23e2403228e4e0da4ca8b9a9a3
Deployed Bytecode
0x0002000000000002000c00000000000200010000000103550000006003100270000003000030019d000003000330019700000001002001900000001f0000c13d0000008004000039000000400040043f000000040030008c000000500000413d000000000201043b000000e0022002700000030d0020009c000000540000213d000003210020009c000000640000213d0000032b0020009c000000880000a13d0000032c0020009c000001020000213d0000032f0020009c0000020e0000613d000003300020009c000003c20000c13d0000000001000416000000000001004b000003c20000c13d0000000201000039000002a40000013d0000000002000416000000000002004b000003c20000c13d0000001f0230003900000301022001970000008002200039000000400020043f0000001f0430018f00000302053001980000008002500039000000300000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000002c0000c13d000000000004004b0000003d0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c000003c20000413d000000800100043d000003030010009c000003c20000213d000000a00200043d000003030020009c000003c20000213d0000000103000039000000000030041b000000400300043d000003040030009c000001a40000a13d0000035801000041000000000010043f0000004101000039000000040010043f000003590100004100000bff00010430000000000003004b000003c20000c13d000000000100001900000bfe0001042e0000030e0020009c000000730000213d000003180020009c000000af0000a13d000003190020009c000001290000213d0000031c0020009c000002540000613d0000031d0020009c000003c20000c13d0000000001000416000000000001004b000003c20000c13d000000800000043f000003370100004100000bfe0001042e000003220020009c000000d20000a13d000003230020009c000001510000213d000003260020009c000002590000613d000003270020009c000003c20000c13d0000000001000416000000000001004b000003c20000c13d0000034901000041000000800010043f000003370100004100000bfe0001042e0000030f0020009c000000f70000a13d000003100020009c000001730000213d000003130020009c0000026a0000613d000003140020009c000003c20000c13d000000240030008c000003c20000413d0000000001000416000000000001004b000003c20000c13d0bfd09300000040f00000004010000390000000101100367000000000101043b0000000602000039000000000012041b000000000100001900000bfe0001042e000003310020009c000002850000613d000003320020009c000002960000613d000003330020009c000003c20000c13d000000240030008c000003c20000413d0000000001000416000000000001004b000003c20000c13d0000000001000411000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000002c30000613d00000004010000390000000101100367000000000301043b0000000001000414000003000010009c0000030001008041000000c001100210000000000003004b0000044a0000c13d00000000020004110000044e0000013d0000031e0020009c000002a80000613d0000031f0020009c000002d00000613d000003200020009c000003c20000c13d000000000100041a000000020010008c000002f60000613d0000000201000039000000000010041b0000000001000411000000000010043f0000000e01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000000001004b000003f40000c13d000000400100043d00000044021000390000034203000041000000000032043500000024021000390000001903000039000004860000013d000003280020009c000002ef0000613d000003290020009c000002fa0000613d0000032a0020009c000003c20000c13d000000640030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000402100370000000000202043b000800000002001d000003340020009c000003c20000213d0000002402100370000000000202043b000003030020009c000003c20000213d0000004401100370000000000101043b000b00000001001d0000000301000039000000000101041a0000030301100198000004580000c13d0000033b01000041000000800010043f0000002001000039000000840010043f0000001701000039000000a40010043f0000035b01000041000000c40010043f0000035c0100004100000bff00010430000003150020009c0000034c0000613d000003160020009c000000520000613d000003170020009c000003c20000c13d0000000001000416000000000001004b000003c20000c13d0000000601000039000002a40000013d0000032d0020009c000003780000613d0000032e0020009c000003c20000c13d000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000c00000001001d0000000001000411000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000002c30000613d0000000c05000029000000000005004b000004700000c13d000000400100043d00000044021000390000036403000041000000000032043500000024021000390000001c03000039000004860000013d0000031a0020009c000003890000613d0000031b0020009c000003c20000c13d000000440030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000402100370000000000202043b000c00000002001d000003030020009c000003c20000213d0000002401100370000000000101043b000b00000001001d000003030010009c000003c20000213d0000000001000411000000000010043f0000033901000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000005140000c13d000000400100043d00000024021000390000033d030000410000016c0000013d000003240020009c000003900000613d000003250020009c000003c20000c13d0000000001000416000000000001004b000003c20000c13d0000000001000411000000000010043f0000034501000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000004000000c13d000000400100043d0000002402100039000003490300004100000000003204350000033e020000410000000000210435000000040210003900000000030004110000000000320435000002cb0000013d000003110020009c000003b80000613d000003120020009c000003c20000c13d000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000003340010009c000003c20000213d000000000010043f0000000f01000039000000200010043f000000400200003900000000010000190bfd0bde0000040f000c00000001001d0bfd08d30000040f0000000c030000290000000702300039000000000202041a000b00000002001d000900000001001d00000008013000390bfd09050000040f000a00000001001d000000400200043d000c00000002001d00000009010000290bfd087a0000040f0000000b01000029000000ff001001900000000001000039000000010100c0390000000c030000290000010002300039000000000012043500000120023000390000000a010000290bfd089a0000040f0000000c01000029000003000010009c0000030001008041000000400110021000000335011001c700000bfe0001042e000000e004300039000000400040043f000000a004300039000003e80500003900000000005404350000008004300039000000fa06000039000000000064043500000060043000390000003207000039000000000074043500000040043000390000001408000039000000000084043500000020043000390000000a09000039000000000094043500000005040000390000000000430435000000c00330003900000000000304350000000703000039000000000043041b0000000803000039000000000093041b0000000903000039000000000083041b000000000079041b0000000b03000039000000000063041b0000000c03000039000000000053041b0000000d03000039000000000003041b00000305030000410000000204000039000000000034041b0000000303000039000000000403041a0000030604400197000000000114019f000000000013041b0000000401000039000000000301041a0000030603300197000000000223019f000000000021041b00000307010000410000000602000039000000000012041b00000000010004110000030301100197000c00000001001d000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000002090000c13d0000000c01000029000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000201041a0000036b0220019700000001022001bf000000000021041b0000000001000414000003000010009c0000030001008041000000c0011002100000030a011001c70000800d0200003900000004030000390000030b0400004100000000050000190000000c0600002900000000070004110bfd0bf30000040f0000000100200190000003c20000613d0000002001000039000001000010044300000120000004430000030c0100004100000bfe0001042e000000440030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000402100370000000000202043b000c00000002001d0000002401100370000000000101043b000b00000001001d000003030010009c000003c20000213d0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b0000000101100039000000000101041a000a00000001001d000000000010043f0000000101000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000005bd0000c13d000000400100043d00000024021000390000000a0300002900000000003204350000033e0200004100000000002104350000000002000411000003030220019700000004031000390000000000230435000002cb0000013d0000000001000416000000000001004b000003c20000c13d0000000501000039000002a40000013d000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000003340010009c000003c20000213d000000000010043f0000000f01000039000000200010043f000000400200003900000000010000190bfd0bde0000040f0000000701100039000002e80000013d000000440030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000002402100370000000000202043b000c00000002001d000003030020009c000003c20000213d0000000401100370000000000101043b000b00000001001d000000000010043f0000000101000039000000200010043f000000400200003900000000010000190bfd0bde0000040f0000000101100039000000000101041a0bfd09510000040f0000000b010000290000000c020000290bfd09820000040f000000000100001900000bfe0001042e000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b0000036800100198000003c20000c13d000003690010009c000000000200003900000001020060390000036a0010009c00000001022061bf000000800020043f000003370100004100000bfe0001042e000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000000000010043f0000000101000039000000200010043f000000400200003900000000010000190bfd0bde0000040f0000000101100039000000000101041a000000800010043f000003370100004100000bfe0001042e000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000c00000001001d000003030010009c000003c20000213d0000000001000411000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff001001900000047d0000c13d000000400100043d0000033e02000041000000000021043500000004021000390000000003000411000000000032043500000024021000390000000000020435000003000010009c000003000100804100000040011002100000033f011001c700000bff00010430000000440030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000002402100370000000000202043b000c00000002001d000003030020009c000003c20000213d0000000401100370000000000101043b000000000010043f0000000101000039000000200010043f000000400200003900000000010000190bfd0bde0000040f0000000c02000029000000000020043f000000200010043f000000000100001900000040020000390bfd0bde0000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f000003370100004100000bfe0001042e000000240030008c000003c20000413d0000000401100370000000000301043b000000000100041a000000020010008c000003c40000c13d0000036101000041000000800010043f000003620100004100000bff00010430000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000c00000001001d000003030010009c000003c20000213d0000010001000039000000400010043f000000800000043f000000a00000043f0bfd08c80000040f000001000300003900000000010000310000000101100367000000001201043c0000000003230436000001600030008c0000030c0000c13d0000010001000039000000c00010043f000000e00000043f0000000c01000029000000000010043f0000000e01000039000000200010043f000000400200003900000000010000190bfd0bde0000040f000b00000001001d000000400100043d000c00000001001d0bfd08bd0000040f0000000b03000029000000000103041a0000000c020000290000000002120436000900000002001d0000000101300039000000000101041a0000000000120435000000400200043d000a00000002001d00000002013000390bfd08b30000040f0000000a010000290bfd08c80000040f0000000c0300002900000040013000390000000a0200002900000000002104350000000b020000290000000502200039000000000202041a00000303022001970000006004300039000b00000004001d00000000002404350000000002030433000000400400043d000c00000004001d0000000002240436000000090300002900000000030304330000000000320435000000000101043300000040024000390bfd08710000040f0000000b01000029000000000101043300000303011001970000000c03000029000000a0023000390000000000120435000003000030009c0000030003008041000000400130021000000336011001c700000bfe0001042e000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000c00000001001d000003340010009c000003c20000213d0000014001000039000000400010043f000000800000043f000000a00000043f000000c00000043f000000e00000043f0bfd08c80000040f000001400300003900000000010000310000000101100367000000001201043c0000000003230436000001a00030008c000003600000c13d0000014001000039000001000010043f000001200000043f0000000c01000029000000000010043f0000000f01000039000000200010043f000000400200003900000000010000190bfd0bde0000040f0bfd08d30000040f000000400200043d000c00000002001d0bfd087a0000040f0000000c01000029000003000010009c0000030001008041000000400110021000000338011001c700000bfe0001042e000000440030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000002402100370000000000302043b000003030030009c000003c20000213d0000000002000411000000000023004b000004370000c13d0000000401100370000000000101043b0bfd09820000040f000000000100001900000bfe0001042e0000000001000416000000000001004b000003c20000c13d0000033d01000041000000800010043f000003370100004100000bfe0001042e0000000002000416000000000002004b000003c20000c13d000000000131034f000000001201043c0000000004240436000001600040008c000003940000c13d0000000701000039000000000101041a000001600010043f0000000802000039000000000202041a000001800020043f0000000903000039000000000303041a000001a00030043f0000000a04000039000000000404041a000001c00040043f0000000b05000039000000000505041a000001e00050043f0000000c06000039000000000606041a000002000060043f0000000d07000039000000000707041a000002200070043f0000024008000039000000400080043f000002400010043f000002600020043f000002800030043f000002a00040043f000002c00050043f000002e00060043f000003000070043f0000034a0100004100000bfe0001042e000000240030008c000003c20000413d0000000002000416000000000002004b000003c20000c13d0000000401100370000000000101043b000c00000001001d000003340010009c000003d30000a13d000000000100001900000bff000104300000000201000039000000000010041b000000000101041a000000000013004b0000043b0000813d0000033b01000041000000800010043f0000002001000039000000840010043f0000000e01000039000000a40010043f0000034001000041000000c40010043f0000035c0100004100000bff000104300000010001000039000000400010043f0bfd08c80000040f000001000300003900000000010000310000000101100367000000001201043c0000000003230436000001600030008c000003d90000c13d0000010001000039000000800010043f000000a00000043f000000c00000043f000000e00000043f0000000c01000029000000000010043f0000000f01000039000000200010043f000000400200003900000000010000190bfd0bde0000040f00000008011000390bfd09050000040f000000400200043d000c00000002001d0bfd089a0000040f0000000c01000029000003000010009c0000030001008041000000400110021000000336011001c700000bfe0001042e0000000601000039000000000101041a0000000002000416000000000012004b000004910000813d000000400100043d00000044021000390000034103000041000000000032043500000024021000390000001803000039000004860000013d0000000501000039000000000101041a000b00000001001d0000000401000039000000000101041a000003460200004100000000002004430000030301100197000c00000001001d00000004001004430000000001000414000003000010009c0000030001008041000000c00110021000000347011001c700008002020000390bfd0bf80000040f0000000100200190000008630000613d000000000101043b000000000001004b000003c20000613d000000400300043d00000024013000390000000b020000290000000000210435000003480100004100000000001304350000000001000411000003030110019700000004023000390000000000120435000003000030009c000b00000003001d0000030001000041000000000103401900000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f0000033f011001c70000000c020000290bfd0bf30000040f0000000100200190000006060000613d0000000b01000029000003340010009c0000004a0000213d000000400010043f0000000501000039000000000001041b000000000100001900000bfe0001042e0000036501000041000000800010043f000003620100004100000bff000104300000000601000039000000000101041a0000000002000416000000000012004b000004aa0000813d0000033b01000041000000800010043f0000002001000039000000840010043f0000001801000039000000a40010043f0000034101000041000000c40010043f0000035c0100004100000bff000104300000030a011001c70000800902000039000000000400041100000000050000190bfd0bf30000040f00000060031002700000030003300198000004ee0000c13d0000000100200190000000520000c13d000000400100043d00000044021000390000036703000041000004830000013d0000000002000411000000000012004b000005380000c13d0000000801000029000000000010043f0000000f01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000201043b000000000102041a00000303001001980000063e0000c13d000000400100043d00000044021000390000035a03000041000004830000013d0000000203000039000000000053041b0000000001000414000003000010009c0000030001008041000000c0011002100000030a011001c70000800d0200003900000363040000410bfd0bf30000040f0000000100200190000000520000c13d000003c20000013d0000000c01000029000000000001004b000005440000c13d000000400100043d00000044021000390000034403000041000000000032043500000024021000390000000f0300003900000000003204350000033b020000410000000000210435000000040210003900000020030000390000000000320435000003000010009c000003000100804100000040011002100000033c011001c700000bff000104300000000001000411000000000010043f0000000e01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b0000000101100039000000000101041a000000000001004b000006260000c13d000000400100043d00000044021000390000034003000041000000000032043500000024021000390000000e03000039000004860000013d000c00000003001d0000000401000039000000000101041a0000035d02000041000000800020043f0000000002000411000000840020043f00000000030004140000030302100197000003000030009c0000030003008041000000c0013002100000035e011001c7000b00000002001d0bfd0bf80000040f00000060031002700000030003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000004c80000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000004c40000c13d000000000006004b000004d50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000005a30000613d0000001f01400039000000600210018f00000080012001bf000000400010043f000000200030008c000003c20000413d000000800300043d0000000c0030006c000006ed0000813d0000033b03000041000000000031043500000084032001bf00000020040000390000000000430435000000c40320003900000360040000410000000000430435000000a4022000390000001a03000039000000000032043500000040011002100000033c011001c700000bff000104300000001f0430003900000301044001970000003f044000390000036604400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000003340040009c0000004a0000213d00000001006001900000004a0000c13d000000400040043f0000001f0430018f000000000635043600000302053001980000000003560019000005060000613d000000000701034f000000007807043c0000000006860436000000000036004b000005020000c13d000000000004004b000004520000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000004520000013d0000000c0000006b000004800000613d0000000b0000006b000004800000613d0000000b01000029000000000010043f0000000e01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b0000000501100039000000000101041a00000303001001980000072c0000c13d0000000b01000029000000000010043f0000000e01000039000000200010043f000000400200003900000000010000190bfd0bde0000040f0000000501100039000000000201041a00000306022001970000000c022001af000000000021041b000000000100001900000bfe0001042e0000033b01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000034b01000041000000c40010043f0000034c01000041000000e40010043f0000034d0100004100000bff00010430000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000005740000c13d0000000c01000029000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000201041a0000036b0220019700000001022001bf000000000021041b0000000001000414000003000010009c0000030001008041000000c0011002100000030a011001c70000800d0200003900000004030000390000030b0400004100000000050000190000000c0600002900000000070004110bfd0bf30000040f0000000100200190000003c20000613d00000000010004110000030301100197000c00000001001d000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000000520000613d0000000c01000029000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000201041a0000036b02200197000000000021041b0000000001000414000003000010009c0000030001008041000000c0011002100000030a011001c70000800d020000390000000403000039000003430400004100000000050000190000000c06000029000006040000013d0000001f0530018f0000030206300198000000400200043d0000000004620019000005ae0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005aa0000c13d000000000005004b000005bb0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006210000013d0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000101041a000000ff00100190000000520000c13d0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000201041a0000036b0220019700000001022001bf000000000021041b0000000001000414000003000010009c0000030001008041000000c0011002100000030a011001c70000800d0200003900000004030000390000030b040000410000000c050000290000000b060000290000000007000411000004790000013d00000060061002700000001f0460018f0000030205600198000000400200043d0000000003520019000006120000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000060e0000c13d0000030006600197000000000004004b000006200000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000003000020009c00000300020080410000004002200210000000000112019f00000bff000104300bfd09d30000040f0000000001000411000000000010043f0000000e01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000201041a000000000002004b000007330000c13d0000035801000041000000000010043f0000001101000039000000040010043f000003590100004100000bff00010430000700000002001d0000000701200039000600000001001d000000000101041a000000ff00100190000007390000c13d0000000701000029000a00030010003d0000000101100039000900000001001d000000000101041a00000334001001980000073d0000c13d0000000a01000029000000000101041a000000400200043d000000000112043600000007040000290000000403400039000c00000003001d000000000303041a000000000031043500000005034000390000004001200039000b00000003001d000000000303041a0000000000310435000003000020009c000003000200804100000040012002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f00000350011001c70000800d02000039000000010300003900000351040000410bfd0bf30000040f0000000100200190000003c20000613d00000007010000290000000601100039000000000101041a000700000001001d0000000a01000029000000000101041a000000400300043d00000000011304360000000c02000029000000000202041a00000000002104350000000b01000029000000000101041a00000040023000390000000000120435000a00000003001d0000034f0030009c0000004a0000213d0000000a010000290000006002100039000900000002001d000000400020043f000003520010009c0000004a0000213d0000000a01000029000000c001100039000000400010043f0000000903000029000000600130003900000000020000310000000102200367000000002402043c0000000003430436000000000013004b000006870000c13d0000000801000029000000000010043f0000000f01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f00000001002001900000000a0400002900000009050000290000000106000039000003c20000613d000000000101043b000000000101041a000c03030010019b000000020700003900000004080000390000000009000019000006a60000013d0000000000310435000000020090008c0000000109900039000007760000813d000000050190021000000000024100190000000002020433000003ca2020011a000001c20020008c00000000015100190000000003000019000006a20000413d000002580020008c0000000003060019000006a20000413d000002ee0020008c0000000003070019000006a20000413d000003520020008c0000000303000039000006a20000413d000003a20020008c0000000003080019000006a20000413d000003b50020008c0000000503000039000006a20000a13d000000060200003900000000002104350000000c01000029000000000010043f0000000e01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c70000801002000039000b00000009001d0bfd0bf80000040f00000002030000390000000100200190000003c20000613d000000000101043b000000000201041a0000036c0020009c000006380000213d0000000302200039000000000021041b000000400100043d00000003020000390000000000210435000003000010009c000003000100804100000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f00000353011001c70000800d0200003900000354040000410000000c050000290bfd0bf30000040f000000020700003900000001002001900000000a040000290000000905000029000000010600003900000004080000390000000b09000029000006a30000c13d000003c20000013d000003460100004100000000001004430000000b0100002900000004001004430000000001000414000003000010009c0000030001008041000000c00110021000000347011001c700008002020000390bfd0bf80000040f0000000100200190000008630000613d000000000101043b000000000001004b000003c20000613d000000400300043d00000024013000390000000c0200002900000000002104350000035f0100004100000000001304350000000001000411000003030110019700000004023000390000000000120435000003000030009c000a00000003001d0000030001000041000000000103401900000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f0000033f011001c70000000b020000290bfd0bf30000040f0000000100200190000007690000613d0000000a01000029000003340010009c0000004a0000213d0000000a01000029000000400010043f0000000c020000290000000a012000c9000000000002004b000007220000613d0000000c021000fa0000000a0020008c000006380000c13d000027100110011a0000000502000039000000000302041a000000000013001a000006380000413d0000000001130019000000000012041b0000000c010000290bfd09d30000040f000007350000013d000000400100043d00000044021000390000033a03000041000000000032043500000024021000390000001b03000039000004860000013d000000010220008a000000000021041b0000000101000039000000000010041b000000000100001900000bfe0001042e000000400100043d00000044021000390000034e03000041000000ce0000013d0000000003000019000000400100043d0000004002100039000c00000003001d0000000000320435000000400200003900000000022104360000000b0300002900000000003204350000034f0010009c0000004a0000213d0000006003100039000000400030043f000003000020009c000003000200804100000040022002100000000001010433000003000010009c00000300010080410000006001100210000000000121019f0000000002000414000003000020009c0000030002008041000000c002200210000000000112019f0000030a011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d0000000c03000029000000030030008c000007790000813d0000000a02300029000000000101043b000000000012041b00000001033000390000000901000029000000000101041a0000033401100197000000000013004b0000073e0000413d0000064b0000013d00000060061002700000001f0460018f0000030205600198000000400200043d0000000003520019000006120000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000007710000c13d000006120000013d0000000001050433000000060010008c0000077f0000a13d0000035801000041000000000010043f0000003201000039000000040010043f000003590100004100000bff000104300000000702100039000000000202041a000b0007002000bd000000070000006b000007880000613d0000000b0400002900000007034000fa000000000032004b000006380000c13d0000000a020000290000008002200039000400000002001d0000000002020433000000000021004b000007980000c13d0000000a02000029000000a0022000390000000002020433000000000021004b000007980000c13d000500010000003d0000000b0000006b0000082e0000c13d0003000b0000002d0000079a0000013d000300000000001d000500000000001d0000000c01000029000000000010043f0000000e01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b000000000201041a000000000002004b000007ae0000613d00000001011000390000000702000029000000000021041b000000400100043d000700000001001d000003550010009c0000004a0000213d00000007030000290000008001300039000000400010043f00000040023000390000000b01000029000200000002001d000000000012043500000020023000390000000c01000029000100000002001d00000000001204350000000901000029000000000013043500000060023000390000000501000029000b00000002001d00000000001204350000000801000029000000000010043f0000000f01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000003c20000613d000000000101043b0000000702000029000000000202043300000000430204340000000805100039000000000035041b00000000030404330000000904100039000000000034041b000000400220003900000000020204330000000a03100039000000000023041b0000000102000029000000000202043300000303022001970000000b03100039000000000403041a0000030604400197000000000224019f000000000023041b000000020200002900000000020204330000000c03100039000000000023041b0000000d01100039000000000201041a0000036b022001970000000b030000290000000003030433000000000003004b000000010220c1bf000000000021041b0000000c01000029000000000010043f0000000e01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f00000009030000290000000a050000290000000100200190000003c20000613d0000000002030433000000000101043b0000000203100039000000000023041b000000030310003900000004060000290000000004060433000000000043041b0000000401100039000000a0035000390000000004030433000000000041041b000000400100043d000000000221043600000000040604330000000000420435000000000203043300000060031000390000000304000029000000000043043500000040031000390000000000230435000003000010009c000003000100804100000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f00000356011001c70000800d02000039000000030300003900000357040000410000000c0500002900000005060000290bfd0bf30000040f0000000100200190000003c20000613d0000000602000029000000000102041a0000036b0110019700000001011001bf000000000012041b000000000100001900000bfe0001042e0000000c01000029000000000010043f0000000e01000039000000200010043f0000000401000039000000000101041a000003460200004100000000002004430000030301100197000300000001001d00000004001004430000000001000414000003000010009c0000030001008041000000c00110021000000347011001c700008002020000390bfd0bf80000040f0000000100200190000008630000613d000000000101043b000000000001004b000003c20000613d000000400300043d00000024013000390000000b0200002900000000002104350000034801000041000000000013043500000004013000390000000c020000290000000000210435000003000030009c000200000003001d0000030001000041000000000103401900000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f0000033f011001c700000003020000290bfd0bf30000040f0000000100200190000008640000613d0000000201000029000003340010009c0000004a0000213d0000000201000029000000400010043f000007960000013d000000000001042f00000060061002700000001f0460018f0000030205600198000000400200043d0000000003520019000006120000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000086c0000c13d000006120000013d00000000430104340000000003320436000000000404043300000000004304350000004002200039000000400110003900000000010104330000000000120435000000000001042d000000004301043400000303033001970000000003320436000000000404043300000334044001970000000000430435000000400310003900000000030304330000033403300197000000400420003900000000003404350000006003100039000000000303043300000060042000390000000000340435000000800310003900000000030304330000008004200039000000006503043400000000005404350000000004060433000000a005200039000000000045043500000040033000390000000003030433000000c0042000390000000000340435000000e002200039000000a00110003900000000010104330000000000120435000000000001042d00000000430104340000000065030434000000000552043600000000060604330000000000650435000000400330003900000000030304330000004005200039000000000035043500000000030404330000030303300197000000600420003900000000003404350000004003100039000000000303043300000080042000390000000000340435000000a00220003900000060011000390000000001010433000000000001004b0000000001000039000000010100c0390000000000120435000000000001042d000000000301041a00000000033204360000000104100039000000000404041a000000000043043500000040022000390000000201100039000000000101041a0000000000120435000000000001042d0000036d0010009c000008c20000813d0000008001100039000000400010043f000000000001042d0000035801000041000000000010043f0000004101000039000000040010043f000003590100004100000bff000104300000036e0010009c000008cd0000813d0000006001100039000000400010043f000000000001042d0000035801000041000000000010043f0000004101000039000000040010043f000003590100004100000bff000104300000000002010019000000400100043d0000036f0010009c000008ff0000813d000000c003100039000000400030043f000000000302041a000000a004300270000003340440019700000020051000390000000000450435000003030330019700000000003104350000000103200039000000000303041a00000334033001970000004004100039000000000034043500000060031000390000000204200039000000000404041a00000000004304350000000303200039000000000403041a000000400300043d00000000044304360000000405200039000000000505041a00000000005404350000000504200039000000000404041a000000400530003900000000004504350000034f0030009c000008ff0000213d0000006004300039000000400040043f000000800410003900000000003404350000000602200039000000000202041a000000a0031000390000000000230435000000000001042d0000035801000041000000000010043f0000004101000039000000040010043f000003590100004100000bff000104300000000002010019000000400100043d0000036d0010009c0000092a0000813d0000008003100039000000400030043f000000000402041a00000000004304350000000104200039000000000404041a000000a00510003900000000004504350000000204200039000000000404041a000000c0051000390000000000450435000003040010009c0000092a0000213d000000e004100039000000400040043f00000000033104360000000304200039000000000404041a000003030440019700000000004304350000000403200039000000000303041a000000400410003900000000003404350000000502200039000000000202041a000000ff002001900000000002000039000000010200c03900000060031000390000000000230435000000000001042d0000035801000041000000000010043f0000004101000039000000040010043f000003590100004100000bff000104300000000001000411000000000010043f0000030801000041000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000009420000613d000000000101043b000000000101041a000000ff00100190000009440000613d000000000001042d000000000100001900000bff00010430000000400100043d0000033e02000041000000000021043500000004021000390000000003000411000000000032043500000024021000390000000000020435000003000010009c000003000100804100000040011002100000033f011001c700000bff000104300001000000000002000100000001001d000000000010043f0000000101000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000009710000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000009710000613d000000000101043b000000000101041a000000ff00100190000009730000613d000000000001042d000000000100001900000bff00010430000000400100043d0000002402100039000000010300002900000000003204350000033e0200004100000000002104350000000002000411000003030220019700000004031000390000000000230435000003000010009c000003000100804100000040011002100000033f011001c700000bff000104300002000000000002000100000002001d000200000001001d000000000010043f0000000101000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000009d10000613d000000000101043b00000001020000290000030302200197000100000002001d000000000020043f000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000009d10000613d000000000101043b000000000101041a000000ff00100190000009d00000613d0000000201000029000000000010043f0000000101000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000009d10000613d000000000101043b0000000102000029000000000020043f000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c700008010020000390bfd0bf80000040f0000000100200190000009d10000613d000000000101043b000000000201041a0000036b02200197000000000021041b0000000001000414000003000010009c0000030001008041000000c0011002100000030a011001c70000800d02000039000000040300003900000000070004110000034304000041000000020500002900000001060000290bfd0bf30000040f0000000100200190000009d10000613d000000000001042d000000000100001900000bff000104300005000000000002000300000001001d000000400100043d000500000001001d000003700100004100000000001004430000000001000414000003000010009c0000030001008041000000c00110021000000371011001c70000800b020000390bfd0bf80000040f000000010020019000000b940000613d00000005020000290000002002200039000000000101043b000400000002001d0000000000120435000003720100004100000000001004430000000001000414000003000010009c0000030001008041000000c00110021000000371011001c70000800b020000390bfd0bf80000040f000000010020019000000b940000613d000000000101043b0000000002000411000000600220021000000005040000290000006003400039000000000023043500000040024000390000000000120435000000540100003900000000001404350000036d0040009c00000b8c0000813d00000005020000290000008001200039000000400010043f0000000401000029000003000010009c000003000100804100000040011002100000000002020433000003000020009c00000300020080410000006002200210000000000112019f0000000002000414000003000020009c0000030002008041000000c002200210000000000112019f0000030a011001c700008010020000390bfd0bf80000040f000000010020019000000b920000613d000000000101043b000400000001001d0000000301000039000000000201041a000000400300043d000200000003001d00000373010000410000000000130435000003000030009c0000030001000041000000000103401900000040011002100000000003000414000003000030009c0000030003008041000000c003300210000000000113019f00000374011001c70000030302200197000500000002001d0bfd0bf80000040f000000020b00002900000060031002700000030003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900000a390000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000a350000c13d000000000006004b00000a460000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000b950000613d0000001f01400039000000600110018f0000000004b10019000000000014004b00000000010000390000000101004039000003340040009c00000b8c0000213d000000010010019000000b8c0000c13d000000400040043f000000200030008c00000b920000413d00000000020b0433000003030020009c00000b920000213d000003750100004100000000001404350000000401400039000100000002001d0000000000210435000003000040009c0000030001000041000000000104401900000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f00000359011001c70000000502000029000200000004001d0bfd0bf80000040f000000020b00002900000060031002700000030003300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900000a7a0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000a760000c13d000000000006004b00000a870000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000ba10000613d0000001f01400039000000600110018f0000000004b10019000003340040009c000000010500002900000b8c0000213d000000400040043f000000200030008c00000b920000413d00000000030b0433000003760030009c00000b920000213d0000002401400039000000040200002900000000002104350000037701000041000000000014043500000004014000390000000000510435000003000040009c000200000004001d0000030001000041000000000104401900000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f000000000003004b00000aad0000613d00000378011001c700008009020000390000000504000029000000000500001900000aaf0000013d0000033f011001c700000005020000290bfd0bf30000040f00000060031002700000030003300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000020b00002900000000057b001900000ac00000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000abc0000c13d000000000006004b00000acd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000bbf0000613d0000001f01400039000000600110018f0000000002b10019000003340020009c00000b8c0000213d000000400020043f000000200030008c00000b920000413d00000000050b0433000003340050009c00000b920000213d0000034f0020009c00000b8c0000213d0000006001200039000000400010043f00000040012000390000000000010435000000200120003900000000000104350000000000020435000000400100043d000003520010009c00000b8c0000213d000000c003100039000000400030043f000000a00310003900000003040000290000000000430435000000800310003900000000002304350000006002100039000000040300002900000000003204350000004002100039000000030300003900000000003204350000002002100039000000000052043500000000020004110000000000210435000000400300043d0000034f0030009c00000b8c0000213d0000006002300039000000400020043f00000040023000390000000000020435000000200230003900000000000204350000000000030435000000400200043d000003550020009c00000b8c0000213d0000008004200039000000400040043f000000000332043600000060042000390000000000040435000000400420003900000000000404350000000000030435000000400400043d0000034f0040009c00000b8c0000213d0000006003400039000000400030043f0000004003400039000400000003001d0000000000230435000100000004001d0000000001140436000200000001001d0000000000010435000000000050043f0000000f01000039000000200010043f0000000001000414000003000010009c0000030001008041000000c00110021000000309011001c70000801002000039000500000005001d0bfd0bf80000040f0000000509000029000000010020019000000b920000613d0000000102000029000000000202043300000000430204340000030303300197000000000101043b000000000501041a0000037905500197000000000335019f0000000004040433000000a0044002100000037a04400197000000000343019f000000000031041b0000004003200039000000000303043300000334033001970000000104100039000000000504041a0000037b05500197000000000335019f000000000034041b000000600320003900000000030304330000000204100039000000000034041b0000008003200039000000000303043300000003041000390000000065030434000000000054041b00000000040604330000000405100039000000000045041b000000400330003900000000030304330000000504100039000000000034041b000000a00220003900000000020204330000000603100039000000000023041b0000000703100039000000000403041a0000036b0440019700000002050000290000000005050433000000000005004b000000010440c1bf000000000043041b00000004030000290000000003030433000000080410003900000000650304340000000087050434000000000074041b00000000040804330000000907100039000000000047041b000000400450003900000000040404330000000a05100039000000000045041b000000000406043300000303044001970000000b05100039000000000605041a0000030606600197000000000446019f000000000045041b000000400430003900000000040404330000000c05100039000000000045041b0000000d01100039000000000401041a0000036b0240019700000060033000390000000003030433000000000003004b000000010220c1bf000000000021041b000000400100043d00000003020000290000000000210435000003000010009c000003000100804100000040011002100000000002000414000003000020009c0000030002008041000000c002200210000000000112019f00000353011001c70000800d0200003900000003030000390000037c04000041000000000509001900000000060004110bfd0bf30000040f000000010020019000000b920000613d000000000001042d0000035801000041000000000010043f0000004101000039000000040010043f000003590100004100000bff00010430000000000100001900000bff00010430000000000001042f0000001f0530018f0000030206300198000000400200043d000000000462001900000bac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b9c0000c13d00000bac0000013d0000001f0530018f0000030206300198000000400200043d000000000462001900000bac0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000ba80000c13d000000000005004b00000bb90000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000003000020009c00000300020080410000004002200210000000000112019f00000bff000104300000001f0530018f0000030206300198000000400200043d000000000462001900000bca0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000bc60000c13d000000000005004b00000bd70000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000003000020009c00000300020080410000004002200210000000000121019f00000bff00010430000000000001042f000003000010009c00000300010080410000004001100210000003000020009c00000300020080410000006002200210000000000112019f0000000002000414000003000020009c0000030002008041000000c002200210000000000112019f0000030a011001c700008010020000390bfd0bf80000040f000000010020019000000bf10000613d000000000101043b000000000001042d000000000100001900000bff0001043000000bf6002104210000000102000039000000000001042d0000000002000019000000000001042d00000bfb002104230000000102000039000000000001042d0000000002000019000000000001042d00000bfd0000043200000bfe0001042e00000bff0001043000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff1f0000000000000000000000000000000000000000000000000de0b6b3a7640000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b48eb57e000a6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49020000000000000000000000000000000000004000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000008595245300000000000000000000000000000000000000000000000000000000cbbf67eb00000000000000000000000000000000000000000000000000000000d547741e00000000000000000000000000000000000000000000000000000000edff42d500000000000000000000000000000000000000000000000000000000edff42d600000000000000000000000000000000000000000000000000000000fcdb9d3600000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000e6ce5b0800000000000000000000000000000000000000000000000000000000cbbf67ec00000000000000000000000000000000000000000000000000000000d0e30db000000000000000000000000000000000000000000000000000000000d30c077c000000000000000000000000000000000000000000000000000000009d56652200000000000000000000000000000000000000000000000000000000af74bc1300000000000000000000000000000000000000000000000000000000af74bc1400000000000000000000000000000000000000000000000000000000bbddaca3000000000000000000000000000000000000000000000000000000009d56652300000000000000000000000000000000000000000000000000000000a217fddf00000000000000000000000000000000000000000000000000000000859524540000000000000000000000000000000000000000000000000000000091d1485400000000000000000000000000000000000000000000000000000000945ffa2f0000000000000000000000000000000000000000000000000000000040517082000000000000000000000000000000000000000000000000000000006318754c0000000000000000000000000000000000000000000000000000000079873f890000000000000000000000000000000000000000000000000000000079873f8a000000000000000000000000000000000000000000000000000000007c293a02000000000000000000000000000000000000000000000000000000006318754d0000000000000000000000000000000000000000000000000000000071104c36000000000000000000000000000000000000000000000000000000004051708300000000000000000000000000000000000000000000000000000000416ae7680000000000000000000000000000000000000000000000000000000052a5f1f8000000000000000000000000000000000000000000000000000000002f2ff15c0000000000000000000000000000000000000000000000000000000036568abd0000000000000000000000000000000000000000000000000000000036568abe000000000000000000000000000000000000000000000000000000003d6ec65e000000000000000000000000000000000000000000000000000000002f2ff15d0000000000000000000000000000000000000000000000000000000031ff060c0000000000000000000000000000000000000000000000000000000001ffc9a700000000000000000000000000000000000000000000000000000000248a9ca3000000000000000000000000000000000000000000000000000000002e1a7d4d000000000000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000010000000000000000000000000010ea85154006456bfe61c9ffd8c24e922e9e5e9e50e9e3d08e549c4da10928645573657220616c7265616479206861732061207265666572726572000000000008c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000aef88082b8671e875d97d0d6c81d06fb9e76f97b3ad7523a55a378e5298aeeeee2517d3f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000005374616b6520746f6f206c6f7721000000000000000000000000000000000000496e73756666696369656e74206761732062616c616e636500000000000000004e6f20667265652064696767696e6720617661696c61626c6500000000000000f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b496e76616c696420616464726573730000000000000000000000000000000000c5ad8dd1f16cc47918f42cf61044c43eaea25ce563873bb78f5edb11af44b57c1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000040c10f1900000000000000000000000000000000000000000000000000000000617b7366a53d5e938aa39800cda5d5b3cb5a765907174ff1971dcbc731804e0600000000000000000000000000000000000000e00000024000000000000000004f6e6c7920456e74726f70792063616e2063616c6c20746869732066756e6374696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000008000000000000000005265717565737420616c726561647920636f6d706c6574656400000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f020000000000000000000000000000000000006000000000000000000000000016b7d399f4b22dcf6075547ce54cf37ef74972d0619db98e53f6e554994970c7000000000000000000000000000000000000000000000000ffffffffffffff3f02000000000000000000000000000000000000200000000000000000000000007d59302855169e2aa2c2ed65c707a8eb3cb656bed234d53b57892fa3b5ecaf50000000000000000000000000000000000000000000000000ffffffffffffff7f02000000000000000000000000000000000000800000000000000000000000000df44d63ad8d9866a7f5694aefe0d36e74712d33621557248a7a331db86dd8814e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000496e76616c696420726571756573740000000000000000000000000000000000456e74726f70792061646472657373206e6f7420736574000000000000000000000000000000000000000000000000000000006400000080000000000000000070a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000080000000000000000079cc679000000000000000000000000000000000000000000000000000000000496e73756666696369656e742044494747412062616c616e63650000000000003ee5aeb5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000bd249363dcf68d3781deb8de6ddf794b2eb3f769e65757014396e6644f1aef475374616b65206d7573742062652067726561746572207468616e2030000000006697b2320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe05472616e73666572206661696c6564000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000007965db0b00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000000000000000000000000000000000000ffffffffffffff80000000000000000000000000000000000000000000000000ffffffffffffffa0000000000000000000000000000000000000000000000000ffffffffffffff40796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000019cae4629a2dd7890036d0d1f6a82742845b778b7184e38d5bebfd4cce3b181e82ee990c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b88c91480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff19cb825f000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000044000000000000000000000000ffffffff0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000f6b7c0fb5b0ec81ae8130ca80094285dc0c383f6d02f2019000734e33f61b1d70000000000000000000000000000000000000000000000000000000000000000874351a7c68e8908f37aa3280c4a17e028dcf997ff9172a386e855c6f8b45590
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005a4a369f4db5df2054994af031b7b23949b98c0e0000000000000000000000008fa5e5a0ae757d23e2403228e4e0da4ca8b9a9a3
-----Decoded View---------------
Arg [0] : entropyAddress (address): 0x5a4a369F4db5df2054994AF031b7b23949b98c0e
Arg [1] : diggaAddress (address): 0x8FA5E5a0AE757D23e2403228e4e0dA4ca8b9A9a3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a4a369f4db5df2054994af031b7b23949b98c0e
Arg [1] : 0000000000000000000000008fa5e5a0ae757d23e2403228e4e0da4ca8b9a9a3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.