Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 338 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 10420805 | 1598 days ago | IN | 0 ETH | 0.00154428 | ||||
Destroy Tourname... | 8980073 | 1827 days ago | IN | 0 ETH | 0.0018754 | ||||
Conjure Wizard | 8892633 | 1842 days ago | IN | 0 ETH | 0.0000215 | ||||
Transfer | 8887099 | 1842 days ago | IN | 0 ETH | 0.0000231 | ||||
Transfer | 8887097 | 1842 days ago | IN | 0 ETH | 0.0000315 | ||||
Conjure Wizard | 8878190 | 1844 days ago | IN | 0.07 ETH | 0.00149677 | ||||
Conjure Wizard | 8878190 | 1844 days ago | IN | 0.07 ETH | 0.00149677 | ||||
Conjure Wizard | 8878190 | 1844 days ago | IN | 0.07 ETH | 0.00149677 | ||||
Conjure Wizard | 8878186 | 1844 days ago | IN | 0.07 ETH | 0.00149677 | ||||
Conjure Wizard | 8878186 | 1844 days ago | IN | 0.07 ETH | 0.00149677 | ||||
Conjure Wizard | 8878186 | 1844 days ago | IN | 0.07 ETH | 0.00149677 | ||||
Conjure Wizard | 8878183 | 1844 days ago | IN | 0.07 ETH | 0.0021409 | ||||
Conjure Wizard | 8878183 | 1844 days ago | IN | 0.07 ETH | 0.0021409 | ||||
Conjure Wizard | 8878183 | 1844 days ago | IN | 0.07 ETH | 0.0021409 | ||||
Conjure Wizard | 8878180 | 1844 days ago | IN | 0.07 ETH | 0.0021409 | ||||
Conjure Wizard | 8878180 | 1844 days ago | IN | 0.07 ETH | 0.0021409 | ||||
Conjure Wizard | 8878180 | 1844 days ago | IN | 0.07 ETH | 0.0021409 | ||||
Conjure Wizard | 8878179 | 1844 days ago | IN | 0.07 ETH | 0.00178408 | ||||
Conjure Wizard | 8878179 | 1844 days ago | IN | 0.07 ETH | 0.00178408 | ||||
Conjure Wizard | 8878177 | 1844 days ago | IN | 0.07 ETH | 0.00178408 | ||||
Conjure Wizard | 8878177 | 1844 days ago | IN | 0.07 ETH | 0.00178408 | ||||
Conjure Wizard | 8878170 | 1844 days ago | IN | 0.07 ETH | 0.00178408 | ||||
Conjure Wizard | 8878170 | 1844 days ago | IN | 0.07 ETH | 0.00178408 | ||||
Conjure Wizard | 8878164 | 1844 days ago | IN | 0.07 ETH | 0.00178408 | ||||
Conjure Wizard | 8878164 | 1844 days ago | IN | 0.07 ETH | 0.00178408 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10420805 | 1598 days ago | 11.93263034 ETH | ||||
8980073 | 1827 days ago | 0 ETH | ||||
8878190 | 1844 days ago | 0.035 ETH | ||||
8878190 | 1844 days ago | 0.035 ETH | ||||
8878190 | 1844 days ago | 0.035 ETH | ||||
8878186 | 1844 days ago | 0.035 ETH | ||||
8878186 | 1844 days ago | 0.035 ETH | ||||
8878186 | 1844 days ago | 0.035 ETH | ||||
8878183 | 1844 days ago | 0.035 ETH | ||||
8878183 | 1844 days ago | 0.035 ETH | ||||
8878183 | 1844 days ago | 0.035 ETH | ||||
8878180 | 1844 days ago | 0.035 ETH | ||||
8878180 | 1844 days ago | 0.035 ETH | ||||
8878180 | 1844 days ago | 0.035 ETH | ||||
8878179 | 1844 days ago | 0.035 ETH | ||||
8878179 | 1844 days ago | 0.035 ETH | ||||
8878177 | 1844 days ago | 0.035 ETH | ||||
8878177 | 1844 days ago | 0.035 ETH | ||||
8878170 | 1844 days ago | 0.035 ETH | ||||
8878170 | 1844 days ago | 0.035 ETH | ||||
8878164 | 1844 days ago | 0.035 ETH | ||||
8878164 | 1844 days ago | 0.035 ETH | ||||
8878159 | 1844 days ago | 0.035 ETH | ||||
8878159 | 1844 days ago | 0.035 ETH | ||||
8878157 | 1844 days ago | 0.035 ETH |
Loading...
Loading
Contract Name:
InauguralGateKeeper
Compiler Version
v0.5.8+commit.23d335f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-10-12 */ pragma solidity >=0.5.6 <0.6.0; /// @title Shared constants used throughout the Cheeze Wizards contracts contract WizardConstants { // Wizards normally have their affinity set when they are first created, // but for example Exclusive Wizards can be created with no set affinity. // In this case the affinity can be set by the owner. uint8 internal constant ELEMENT_NOTSET = 0; //000 // A neutral Wizard has no particular strength or weakness with specific // elements. uint8 internal constant ELEMENT_NEUTRAL = 1; //001 // The fire, water and wind elements are used both to reflect an affinity // of Elemental Wizards for a specific element, and as the moves a // Wizard can make during a duel. // Note that if these values change then `moveMask` and `moveDelta` in // ThreeAffinityDuelResolver would need to be updated accordingly. uint8 internal constant ELEMENT_FIRE = 2; //010 uint8 internal constant ELEMENT_WATER = 3; //011 uint8 internal constant ELEMENT_WIND = 4; //100 uint8 internal constant MAX_ELEMENT = ELEMENT_WIND; } /** * @title IERC165 * @dev https://eips.ethereum.org/EIPS/eip-165 */ interface IERC165 { /** * @notice Query if a contract implements an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) public view returns (uint256 balance); function ownerOf(uint256 tokenId) public view returns (address owner); function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function transferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } contract WizardGuildInterfaceId { bytes4 internal constant _INTERFACE_ID_WIZARDGUILD = 0x41d4d437; } /// @title The public interface of the Wizard Guild /// @notice The methods listed in this interface (including the inherited ERC-721 interface), /// make up the public interface of the Wizard Guild contract. Any contracts that wish /// to make use of Cheeze Wizard NFTs (such as Cheeze Wizards Tournaments!) should use /// these methods to ensure they are working correctly with the base NFTs. contract WizardGuildInterface is IERC721, WizardGuildInterfaceId { /// @notice Returns the information associated with the given Wizard /// owner - The address that owns this Wizard /// innatePower - The innate power level of this Wizard, set when minted and entirely /// immutable /// affinity - The Elemental Affinity of this Wizard. For most Wizards, this is set /// when they are minted, but some exclusive Wizards are minted with an affinity /// of 0 (ELEMENT_NOTSET). A Wizard with an NOTSET affinity should NOT be able /// to participate in Tournaments. Once the affinity of a Wizard is set to a non-zero /// value, it can never be changed again. /// metadata - A 256-bit hash of the Wizard's metadata, which is stored off chain. This /// contract doesn't specify format of this hash, nor the off-chain storage mechanism /// but, let's be honest, it's probably an IPFS SHA-256 hash. /// /// NOTE: Series zero Wizards have one of four Affinities: Neutral (1), Fire (2), Water (3) /// or Air (4, sometimes called "Wind" in the code). Future Wizard Series may have /// additional Affinities, and clients of this API should be prepared for that /// eventuality. function getWizard(uint256 id) external view returns (address owner, uint88 innatePower, uint8 affinity, bytes32 metadata); /// @notice Sets the affinity for a Wizard that doesn't already have its elemental affinity chosen. /// Only usable for Exclusive Wizards (all non-Exclusives must have their affinity chosen when /// conjured.) Even Exclusives can't change their affinity once it's been chosen. /// /// NOTE: This function can only be called by the series minter, and (therefore) only while the /// series is open. A Wizard that has no affinity when a series is closed will NEVER have an Affinity. /// BTW- This implies that a minter is responsible for either never minting ELEMENT_NOTSET /// Wizards, or having some public mechanism for a Wizard owner to set the Affinity after minting. /// @param wizardId The id of the wizard /// @param newAffinity The new affinity of the wizard function setAffinity(uint256 wizardId, uint8 newAffinity) external; /// @notice A function to be called that conjures a whole bunch of Wizards at once! You know how /// there's "a pride of lions", "a murder of crows", and "a parliament of owls"? Well, with this /// here function you can conjure yourself "a stench of Cheeze Wizards"! /// /// Unsurprisingly, this method can only be called by the registered minter for a Series. /// @param powers the power level of each wizard /// @param affinities the Elements of the wizards to create /// @param owner the address that will own the newly created Wizards function mintWizards( uint88[] calldata powers, uint8[] calldata affinities, address owner ) external returns (uint256[] memory wizardIds); /// @notice A function to be called that conjures a series of Wizards in the reserved ID range. /// @param wizardIds the ID values to use for each Wizard, must be in the reserved range of the current Series /// @param affinities the Elements of the wizards to create /// @param powers the power level of each wizard /// @param owner the address that will own the newly created Wizards function mintReservedWizards( uint256[] calldata wizardIds, uint88[] calldata powers, uint8[] calldata affinities, address owner ) external; /// @notice Sets the metadata values for a list of Wizards. The metadata for a Wizard can only be set once, /// can only be set by the COO or Minter, and can only be set while the Series is still open. Once /// a Series is closed, the metadata is locked forever! /// @param wizardIds the ID values of the Wizards to apply metadata changes to. /// @param metadata the raw metadata values for each Wizard. This contract does not define how metadata /// should be interpreted, but it is likely to be a 256-bit hash of a complete metadata package /// accessible via IPFS or similar. function setMetadata(uint256[] calldata wizardIds, bytes32[] calldata metadata) external; /// @notice Returns true if the given "spender" address is allowed to manipulate the given token /// (either because it is the owner of that token, has been given approval to manage that token) function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool); /// @notice Verifies that a given signature represents authority to control the given Wizard ID, /// reverting otherwise. It handles three cases: /// - The simplest case: The signature was signed with the private key associated with /// an external address that is the owner of this Wizard. /// - The signature was generated with the private key associated with an external address /// that is "approved" for working with this Wizard ID. (See the Wizard Guild and/or /// the ERC-721 spec for more information on "approval".) /// - The owner or approval address (as in cases one or two) is a smart contract /// that conforms to ERC-1654, and accepts the given signature as being valid /// using its own internal logic. /// /// NOTE: This function DOES NOT accept a signature created by an address that was given "operator /// status" (as granted by ERC-721's setApprovalForAll() functionality). Doing so is /// considered an extreme edge case that can be worked around where necessary. /// @param wizardId The Wizard ID whose control is in question /// @param hash The message hash we are authenticating against /// @param sig the signature data; can be longer than 65 bytes for ERC-1654 function verifySignature(uint256 wizardId, bytes32 hash, bytes calldata sig) external view; /// @notice Convenience function that verifies signatures for two wizards using equivalent logic to /// verifySignature(). Included to save on cross-contract calls in the common case where we /// are verifying the signatures of two Wizards who wish to enter into a Duel. /// @param wizardId1 The first Wizard ID whose control is in question /// @param wizardId2 The second Wizard ID whose control is in question /// @param hash1 The message hash we are authenticating against for the first Wizard /// @param hash2 The message hash we are authenticating against for the first Wizard /// @param sig1 the signature data corresponding to the first Wizard; can be longer than 65 bytes for ERC-1654 /// @param sig2 the signature data corresponding to the second Wizard; can be longer than 65 bytes for ERC-1654 function verifySignatures( uint256 wizardId1, uint256 wizardId2, bytes32 hash1, bytes32 hash2, bytes calldata sig1, bytes calldata sig2) external view; } /// @title ERC165Interface /// @dev https://eips.ethereum.org/EIPS/eip-165 interface ERC165Interface { /// @notice Query if a contract implements an interface /// @param interfaceId The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. function supportsInterface(bytes4 interfaceId) external view returns (bool); } // This is kind of a hacky way to expose this constant, but it's the best that Solidity offers! contract TournamentInterfaceId { bytes4 internal constant _INTERFACE_ID_TOURNAMENT = 0xbd059098; } /// @title Tournament interface, known to GateKeeper contract TournamentInterface is TournamentInterfaceId, ERC165Interface { // function enter(uint256 tokenId, uint96 power, uint8 affinity) external payable; function revive(uint256 wizardId) external payable; function enterWizards(uint256[] calldata wizardIds, uint88[] calldata powers) external payable; // Returns true if the Tournament is currently running and active. function isActive() external view returns (bool); function powerScale() external view returns (uint256); function destroy() external; } /// @title Contract that manages addresses and access modifiers for certain operations. /// @author Dapper Labs Inc. (https://www.dapperlabs.com) contract AccessControl { /// @dev The address of the master administrator account that has the power to /// update itself and all of the other administrator addresses. /// The CEO account is not expected to be used regularly, and is intended to /// be stored offline (i.e. a hardware device kept in a safe). address public ceoAddress; /// @dev The address of the "day-to-day" operator of various privileged /// functions inside the smart contract. Although the CEO has the power /// to replace the COO, the CEO address doesn't actually have the power /// to do "COO-only" operations. This is to discourage the regular use /// of the CEO account. address public cooAddress; /// @dev The address that is allowed to move money around. Kept separate from /// the COO because the COO address typically lives on an internet-connected /// computer. address payable public cfoAddress; // Events to indicate when access control role addresses are updated. event CEOTransferred(address previousCeo, address newCeo); event COOTransferred(address previousCoo, address newCoo); event CFOTransferred(address previousCfo, address newCfo); /// @dev The AccessControl constructor sets the `ceoAddress` to the sender account. Also /// initializes the COO and CFO to the passed values (CFO is optional and can be address(0)). /// @param newCooAddress The initial COO address to set /// @param newCfoAddress The initial CFO to set (optional) constructor(address newCooAddress, address payable newCfoAddress) public { _setCeo(msg.sender); setCoo(newCooAddress); if (newCfoAddress != address(0)) { setCfo(newCfoAddress); } } /// @notice Access modifier for CEO-only functionality modifier onlyCEO() { require(msg.sender == ceoAddress, "Only CEO"); _; } /// @notice Access modifier for COO-only functionality modifier onlyCOO() { require(msg.sender == cooAddress, "Only COO"); _; } /// @notice Access modifier for CFO-only functionality modifier onlyCFO() { require(msg.sender == cfoAddress, "Only CFO"); _; } function checkControlAddress(address newController) internal view { require(newController != address(0) && newController != ceoAddress, "Invalid CEO address"); } /// @notice Assigns a new address to act as the CEO. Only available to the current CEO. /// @param newCeo The address of the new CEO function setCeo(address newCeo) external onlyCEO { checkControlAddress(newCeo); _setCeo(newCeo); } /// @dev An internal utility function that updates the CEO variable and emits the /// transfer event. Used from both the public setCeo function and the constructor. function _setCeo(address newCeo) private { emit CEOTransferred(ceoAddress, newCeo); ceoAddress = newCeo; } /// @notice Assigns a new address to act as the COO. Only available to the current CEO. /// @param newCoo The address of the new COO function setCoo(address newCoo) public onlyCEO { checkControlAddress(newCoo); emit COOTransferred(cooAddress, newCoo); cooAddress = newCoo; } /// @notice Assigns a new address to act as the CFO. Only available to the current CEO. /// @param newCfo The address of the new CFO function setCfo(address payable newCfo) public onlyCEO { checkControlAddress(newCfo); emit CFOTransferred(cfoAddress, newCfo); cfoAddress = newCfo; } } /// @title WizardPresaleInterface /// @notice This interface represents the single method that the final tournament and master Wizard contracts /// will use to import the presale wizards when those contracts have been finalized a released on /// mainnet. Once all presale Wizards have been absorbed, this temporary pre-sale contract can be /// destroyed. contract WizardPresaleInterface { // See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md on how // to calculate this bytes4 public constant _INTERFACE_ID_WIZARDPRESALE = 0x4df71efb; /// @notice This function is used to bring a presale Wizard into the final contracts. It can /// ONLY be called by the official gatekeeper contract (as set by the Owner of the presale /// contract). It does a number of things: /// 1. Check that the presale Wizard exists, and has not already been absorbed /// 2. Transfer the Eth used to create the presale Wizard to the caller /// 3. Mark the Wizard as having been absorbed, reclaiming the storage used by the presale info /// 4. Return the Wizard information (its owner, minting price, and elemental alignment) /// @param id the id of the presale Wizard to be absorbed function absorbWizard(uint256 id) external returns (address owner, uint256 power, uint8 affinity); /// @notice A convenience function that allows multiple Wizards to be moved to the final contracts /// simultaneously, works the same as the previous function, but in a batch. /// @param ids An array of ids indicating which presale Wizards are to be absorbed function absorbWizardMulti(uint256[] calldata ids) external returns (address[] memory owners, uint256[] memory powers, uint8[] memory affinities); function powerToCost(uint256 power) public pure returns (uint256 cost); function costToPower(uint256 cost) public pure returns (uint256 power); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safeTransfer`. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } /// Utility library of inline functions on address payables. /// Modified from original by OpenZeppelin. contract Address { /// @notice Returns whether the target address is a contract. /// @dev This function will return false if invoked during the constructor of a contract, /// as the code is not actually created until after the constructor finishes. /// @param account address of the account to check /// @return whether the target address is a contract function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } // solium-disable-line security/no-inline-assembly return size > 0; } } /// @title The Inaugural Cheeze Wizards Gate Keeper contract /// @notice The GateKeeper is responsible for determining which Wizards are allowed to enter into /// a Tournament. This particular GateKeeper is designed to manage the first, official /// Cheeze Wizards Tournament! It's much more complicated than a typical GateKeeper /// implementation because it needs to juggle two additional issues that most GateKeepers /// don't need to deal with: Importing Wizards from the Presale contract and minting tokens /// to represent newly conjured Wizards. contract InauguralGateKeeper is AccessControl, WizardConstants, Address, WizardGuildInterfaceId, TournamentInterfaceId { // The Tournament contract. TournamentInterface public tournament; // The Wizard guild contract. // TODO: Replace with the address of the contract once it's deployed. WizardGuildInterface public constant WIZARD_GUILD = WizardGuildInterface(address(0x35B7838dd7507aDA69610397A85310AE0abD5034)); // The Wizard presale contract. WizardPresaleInterface public constant WIZARD_PRESALE = WizardPresaleInterface(address(0x2F4Bdafb22bd92AA7b7552d270376dE8eDccbc1E)); /// @dev The ratio between the cost of a Wizard (in wei) and the power of the Wizard. /// power = cost / MAX_POWER_SCALE /// cost = power * MAX_POWER_SCALE uint256 internal constant MAX_POWER_SCALE = 1000; uint256 internal tournamentPowerScale; function getTournamentPowerScale() external view returns (uint256) { return tournamentPowerScale; } /// @dev The constant conversion factor used for elementalWizardIncrement uint256 private constant TENTH_BASIS_POINTS = 100000; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // We pack these values together to save storage costs (and since they are all access together) struct WizardCosts { /// @dev The cost of Neutral Wizards (in wei). uint96 neutralWizardCost; /// @dev The cost of the _next_ Elemental Wizard (in wei); increases with each Elemental Wizard /// sold, at the rate defined in `elementalWizardIncrement` uint96 elementalWizardCost; /// @dev The increment ratio in cost between sequential Elemental Wizards, multiplied by 100k for /// greater granularity (TENTH_BASIS_POINTS) uint32 elementalWizardIncrement; } WizardCosts public wizardCosts; /// @param setCooAddress The initial COO address. /// @param setCfoAddress The initial CFO address. /// @param setNeutralWizardCost The cost of the Neutral Wizards, in wei. /// @param setElementalWizardCost The starting cost of the Elemental Wizards, in wei. /// @param setElementalWizardIncrement The rate at which the Elemental Wizards cost increases. constructor( address setCooAddress, address payable setCfoAddress, uint256 setNeutralWizardCost, uint256 setElementalWizardCost, uint256 setElementalWizardIncrement) public AccessControl(setCooAddress, setCfoAddress) { wizardCosts = WizardCosts ({ neutralWizardCost: uint96(setNeutralWizardCost), elementalWizardCost: uint96(setElementalWizardCost), elementalWizardIncrement: uint32(setElementalWizardIncrement) }); } modifier onlyWizardController(uint256 wizardId) { require(WIZARD_GUILD.isApprovedOrOwner(msg.sender, wizardId), "Must be Wizard controller"); _; } /// @dev The presale contract will be sending Ether directly to this contract, /// so we need it to have a payable fallback. function() external payable { require(msg.sender == address(WIZARD_PRESALE) || msg.sender == address(tournament), "Don't send funds to GateKeeper"); } /// @notice Registers the address of the Tournament with the GateKeeper. This can't be passed /// into the constructor, because the Tournament itself needs a reference to the GateKeeper /// in its constructor! /// /// NOTE: Technically, most of the functions below should have some kind of modifier /// that ensures that the Tournament is set before they are called, but that /// just adds gas. In practice, multiple draft Gatekeeper contracts may be /// deployed, so what matters is that we call this function before sharing /// the address of this contract publicly. No need to enforce that on chain, /// with its associated gas costs! function registerTournament(address setTournament) external onlyCOO { require(address(tournament) == address(0), "Tournament already registered"); tournament = TournamentInterface(setTournament); require( (setTournament != address(0)) && tournament.supportsInterface(_INTERFACE_ID_TOURNAMENT), "Invalid Tournament"); tournamentPowerScale = tournament.powerScale(); require(tournamentPowerScale <= MAX_POWER_SCALE, "Power scale too high"); } /// @notice This is it folks, the main event! The way for the world to get new Wizards! Does /// pretty much what it says on the box; let's you conjure a new Wizard with a specified /// elemental affinity. The call must include enough Ether to cover the cost of the new /// Wizard, and any excess is refunded. The power of the Wizard is derived from /// the cost. YOU CAN NOT PAY EXTRA TO RAISE INITIAL POWER LATER. Returns the ID /// of the newly conjured Wizard. /// /// While you cannot increase power later, you can conjure some more Wizards! /// @param affinity The elemental affinity you want for the Wizard. Valid elements are /// defined in `WizardConstants`, see the constants with names starting `ELEMENT_`. /// ELEMENT_NOTSET is not valid for regular Wizards (unlike Exclusive Wizards). function conjureWizard(uint8 affinity) external payable returns (uint256) { uint8[] memory affinities = new uint8[](1); affinities[0] = affinity; uint256[] memory wizardIds = conjureWizardMulti(affinities); return wizardIds[0]; } /// @notice A convenience function that allows you to conjure a whole bunch of Wizards at once! You know how /// there's "a pride of lions", "a murder of crows", and "a parliament of owls"? Well, with this /// here function you can conjure yourself "a stench of Cheeze Wizards"! /// @dev This function is careful to bundle all of the external calls (_transferRefund() and onERC721Received()) /// at the end of the function to limit the risk of reentrancy attacks. /// @param affinities The elemental affinities of the Wizards, can mix and match any valid types. /// Valid elements are defined in `WizardConstants`, see the constants with names starting /// `ELEMENT_`. ELEMENT_NOTSET is not valid for regular Wizards (unlike Exclusive Wizards). function conjureWizardMulti(uint8[] memory affinities) public payable returns (uint256[] memory wizardIds) { (uint256 totalCost, uint256 contribution, uint88[] memory powers) = _computeWizardPowers(affinities); require(msg.value >= totalCost, "Insufficient funds"); // Mint the requested Wizards in the guild contract, assigning ownership to the sender wizardIds = WIZARD_GUILD.mintWizards(powers, affinities, msg.sender); // Enter the new Wizards into the Tournament tournament.enterWizards.value(contribution)(wizardIds, powers); // Ensure the Wizards are being assigned to an ERC-721 aware address (either an external address, // or a smart contract that implements onERC721Received()). We must call onERC721Received() for // each token minted because it's allowed for an ERC-721 receiving contract to reject the // transfer based on the properties of the token. if (isContract(msg.sender)) { for (uint256 i = 0; i < wizardIds.length; i++) { bytes4 transferAccepted = IERC721Receiver(msg.sender).onERC721Received(msg.sender, address(0), wizardIds[i], ""); require(transferAccepted == _ERC721_RECEIVED, "Contract owner didn't accept ERC721 transfer"); } } // NOTE: _transferRefund() is only safe if msg.value >= totalCost. See the require() near the // beginning of the function to feel better about this fact. _transferRefund(totalCost); } /// @notice Allows for the creation of Exclusive Wizards. This can only be done by the COO, who still has /// to pay for the power imbued in these Wizards! Reverts if the owner address is a smart contract /// that is not ERC-721 aware. /// @param wizardIds An array of IDs of the Wizards being conjured. /// @param powers The power levels of the Wizards, corresponding 1:1 to Wizard IDs. /// @param affinities The elemental affinities of the Wizards, corresponding 1:1 to Wizard IDs. /// Valid elements are defined in `WizardConstants`, see the constants with /// names starting `ELEMENT_`. ELEMENT_NOTSET is valid for Exclusive Wizards, /// unlike regular Wizards. /// @param owner The recipient address of the newly conjured Cheeze Wizards. function conjureExclusiveMulti( uint256[] calldata wizardIds, uint256[] calldata powers, uint8[] calldata affinities, address owner ) external payable onlyCOO { // Ensure the arrays are all of the same length require(wizardIds.length == powers.length && powers.length == affinities.length, "Inconsistent parameter lengths"); uint256 totalCost = 0; uint256 contribution = 0; uint88[] memory localPowers = new uint88[](powers.length); for (uint256 i = 0; i < powers.length; i++) { require(affinities[i] <= MAX_ELEMENT, "Invalid affinity"); require(powers[i] < (1 << 88), "Invalid power level"); localPowers[i] = uint88(powers[i]); uint256 wizardCost = powerToCost(localPowers[i]); totalCost += wizardCost; contribution += _potContribution(localPowers[i]); } require(msg.value >= totalCost, "Insufficient funds"); // Mint the requested Wizards via the guild contract WIZARD_GUILD.mintReservedWizards(wizardIds, localPowers, affinities, owner); // Enter the new Wizards into the Tournament tournament.enterWizards.value(contribution)(wizardIds, localPowers); // Ensure the Wizards are being assigned to an ERC-721 aware address (either an external address, // or a smart contract that implements onERC721Received()). We must call onERC721Received for // each token minted because it's allowed for an ERC-721 receiving contract to reject the // transfer based on the properties of the token. if (isContract(owner)) { for (uint256 i = 0; i < wizardIds.length; i++) { bytes4 transferAccepted = IERC721Receiver(owner).onERC721Received(msg.sender, address(0), wizardIds[i], ""); require(transferAccepted == _ERC721_RECEIVED, "Contract owner didn't accept ERC721 transfer"); } } // NOTE: _transferRefund() is only safe if msg.value >= totalCost. See the require() near the // middle of the function to feel better about this fact. _transferRefund(totalCost); } /// @notice Computes the powers, total cost, and prize pot contribution for an array of new Wizards /// based on the provided affinities. This also checks that the affinity values are valid /// for the Tournament, and updates the elementalWizardCost storage variable as relevant. function _computeWizardPowers(uint8[] memory affinities) internal returns(uint256 totalCost, uint256 contribution, uint88[] memory powers) { // Cache the Wizard costs in order to reduce the gas costs from reads and writes to storage. uint256 neutralWizardCost = wizardCosts.neutralWizardCost; uint256 elementalWizardCost = wizardCosts.elementalWizardCost; uint256 elementalWizardIncrement = wizardCosts.elementalWizardIncrement; totalCost = 0; contribution = 0; powers = new uint88[](affinities.length); for (uint256 i = 0; i < affinities.length; i++) { uint8 affinity = affinities[i]; uint256 wizardCost; require(affinity > ELEMENT_NOTSET && affinity <= MAX_ELEMENT, "Invalid affinity"); // Determine the price of the Wizard if (affinity == ELEMENT_NEUTRAL) { wizardCost = neutralWizardCost; } else { wizardCost = elementalWizardCost; // Update the cost of the next Elemental Wizard // NOTE: This math can't overflow because the total Ether supply in wei is well less than // 2^128. Multiplying a valid cost in wei by some number <100k // cannot possibly overflow 256 bits. As cost is calculated // ourselves (rather than user provided) we know it must // be in the valid range. elementalWizardCost += (elementalWizardCost * elementalWizardIncrement) / TENTH_BASIS_POINTS; } powers[i] = costToPower(wizardCost); // IMPORTANT! Mathematically, you'd think we could just compute the pot contribution at the // end of the loop, but this risks rounding differences between // conjuring Wizards individually compared to conjuring them as a stench. contribution += _potContribution(powers[i]); totalCost += wizardCost; } // Update the cached elemental cost to storage. Conveniently this costs very little if // the value isn't actually changed. wizardCosts.elementalWizardCost = uint96(elementalWizardCost); } /// @notice Absorbs a number of presale Wizards into the final NFT contract, while also entering them into /// the Tournament. Can handle any number of Wizards in a batch BUT THEY MUST ALL HAVE THE SAME OWNER. /// Callable by anyone. /// @param wizardIds The IDs of the presale Wizards; note that all Wizards MUST have the same owner. function absorbPresaleWizards(uint256[] calldata wizardIds) external { // Bulk fetch the Wizards from the presale contract. Note that this will also delete those Wizards from the // presale contract, and will also transfer the funds used to purchase those Wizards to this contract. // Obviously, a failed require() statement later in this function will undo that transfer and those deletes. ( address[] memory owners, uint256[] memory powers, uint8[] memory affinities ) = WIZARD_PRESALE.absorbWizardMulti(wizardIds); uint256 contribution = 0; address theOwner = owners[0]; uint88[] memory localPowers = new uint88[](powers.length); for (uint256 i = 0; i < powers.length; i++) { require(owners[i] == theOwner, "All Wizards must have same owner"); localPowers[i] = uint88(powers[i]); contribution += _potContribution(localPowers[i]); } // Mint the requested Wizards in the guild contract WIZARD_GUILD.mintReservedWizards(wizardIds, localPowers, affinities, theOwner); // Enter the new Wizards into the Tournament tournament.enterWizards.value(contribution)(wizardIds, localPowers); } /// @notice Revive a tired Wizard so they can duel again. The caller must own /// the Wizard. /// @param wizardId The ID of the Wizard to revive. function revive(uint256 wizardId) external payable onlyWizardController(wizardId) { // We don't need to do any validation here, we can let the Tournament decide // if the pot contribution amount derived from msg.value represents a valid // power level to use for reviving this Wizard. uint88 purchasedPower = costToPower(msg.value); uint256 potContributionValue = _potContribution(purchasedPower); tournament.revive.value(potContributionValue)(wizardId); } /// @notice Sets the affinity for a Wizard that doesn't already have its elemental affinity chosen. /// As a rule this is only ever expected to apply to Exclusive Wizards, as regular wizards /// have their affinity set when they are conjured. function setAffinity(uint256 wizardId, uint8 newAffinity) external onlyWizardController(wizardId) { require(newAffinity > ELEMENT_NOTSET && newAffinity <= MAX_ELEMENT, "Must choose a valid affinity"); // The guild will enforce the Wizard doesn't already have an affinity set. WIZARD_GUILD.setAffinity(wizardId, newAffinity); } /// @notice Determine the power of a Wizard based on their price. /// @param cost The price of the Wizard in wei. /// @return The power of the Wizard (cast to uint88). function costToPower(uint256 cost) public pure returns (uint88 power) { return uint88(cost / MAX_POWER_SCALE); } /// @param power The power of the Wizard. /// @return The cost of the Wizard in wei. function powerToCost(uint88 power) public pure returns (uint256 cost) { return power * MAX_POWER_SCALE; } /// @notice Computes the number of wei required to be sent to the Tournament /// in order to match a given power level. /// @param wizardPower The power level /// @return The prize pot contribution necessary to match the given power function _potContribution(uint88 wizardPower) internal view returns (uint256) { return wizardPower * tournamentPowerScale; } /// @notice Allows the CFO to withdraw funds from this contract. function withdraw() external onlyCFO { // All of the pot contributions go directly into the Tournament contract, so // we can safely withdraw everything, with no hold-backs. msg.sender.transfer(address(this).balance); } /// @notice Allows the COO to destroy this contract if it's not needed anymore. /// @notice Can't be destoryed if the Tournament still exists. function destroy() external onlyCOO { require(address(this).balance == 0, "Drain the funds first"); require(address(tournament) == address(0), "Destroy Tournament first"); selfdestruct(msg.sender); } /// @notice Allow the COO to destroy the Tournament contract. function destroyTournament() external onlyCOO { if (address(tournament) != address(0)) { require(tournament.isActive() == false, "Tournament active"); tournament.destroy(); tournament = TournamentInterface(0); } } /// @notice Utility function that refunds any overpayment to the sender; smart /// enough to only send the excess if the amount we are returning is more than the /// cost of sending it! /// @dev Warning! This does not check for underflows (msg.value < actualPrice) - so /// be sure to call this with correct values! /// @param actualPrice The actual price owed for the conjured Wizards. function _transferRefund(uint256 actualPrice) private { uint256 refund = msg.value - actualPrice; // Make sure the amount we're trying to refund is less than the actual cost of sending it! // See https://github.com/ethereum/wiki/wiki/Subtleties for magic values costs. We can // safely ignore the 25000 additional gas cost for new accounts, as msg.sender is // guaranteed to exist at this point! if (refund > (tx.gasprice * (9000+700))) { msg.sender.transfer(refund); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"wizardIds","type":"uint256[]"},{"name":"powers","type":"uint256[]"},{"name":"affinities","type":"uint8[]"},{"name":"owner","type":"address"}],"name":"conjureExclusiveMulti","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"tournament","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"power","type":"uint88"}],"name":"powerToCost","outputs":[{"name":"cost","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newCfo","type":"address"}],"name":"setCfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_PRESALE","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"affinity","type":"uint8"}],"name":"conjureWizard","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCeo","type":"address"}],"name":"setCeo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wizardId","type":"uint256"}],"name":"revive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"wizardId","type":"uint256"},{"name":"newAffinity","type":"uint8"}],"name":"setAffinity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"setTournament","type":"address"}],"name":"registerTournament","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCoo","type":"address"}],"name":"setCoo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTournamentPowerScale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wizardCosts","outputs":[{"name":"neutralWizardCost","type":"uint96"},{"name":"elementalWizardCost","type":"uint96"},{"name":"elementalWizardIncrement","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroyTournament","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_GUILD","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"affinities","type":"uint8[]"}],"name":"conjureWizardMulti","outputs":[{"name":"wizardIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"cost","type":"uint256"}],"name":"costToPower","outputs":[{"name":"power","type":"uint88"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"wizardIds","type":"uint256[]"}],"name":"absorbPresaleWizards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"setCooAddress","type":"address"},{"name":"setCfoAddress","type":"address"},{"name":"setNeutralWizardCost","type":"uint256"},{"name":"setElementalWizardCost","type":"uint256"},{"name":"setElementalWizardIncrement","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousCeo","type":"address"},{"indexed":false,"name":"newCeo","type":"address"}],"name":"CEOTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousCoo","type":"address"},{"indexed":false,"name":"newCoo","type":"address"}],"name":"COOTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousCfo","type":"address"},{"indexed":false,"name":"newCfo","type":"address"}],"name":"CFOTransferred","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405160a080620029da833981018060405260a08110156200003357600080fd5b50805160208083015160408401516060850151608090950151939491939092859085906200006790339062000135811b901c565b62000078826200019f60201b60201c565b6001600160a01b03811615620000995762000099816200029460201b60201c565b5050604080516060810182526001600160601b03948516808252939094166020850181905263ffffffff929092169301839052600580546001600160601b031916909217600160601b600160c01b0319166c0100000000000000000000000090910217600160c01b63ffffffff0219167801000000000000000000000000000000000000000000000000909202919091179055506200041f9050565b600054604080516001600160a01b039283168152918316602083015280517f9d05f170f1d545b1aa21c4a4f79f17ff737f5f020ea1b333d88f29f0bbfa9fc69281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146200021957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f6e6c792043454f000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6200022a816200038960201b60201c565b600154604080516001600160a01b039283168152918316602083015280517f1cd3afc04e6ae479d2b9f74533351b52218c5b2ae4f847f681a5eac514fe11849281900390910190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146200030e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f6e6c792043454f000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6200031f816200038960201b60201c565b600254604080516001600160a01b039283168152918316602083015280517fe1033d3cc535efc343c53636bdc05c52a44d9e70b089d4ad6e974379f2c651d69281900390910190a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811615801590620003b057506000546001600160a01b03828116911614155b6200041c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642043454f206164647265737300000000000000000000000000604482015290519081900360640190fd5b50565b6125ab806200042f6000396000f3fe6080604052600436106101405760003560e01c80638baecc21116100b6578063b83a0c441161006f578063b83a0c441461051e578063b95dbeb614610563578063c9eb068b14610578578063ce6991fd1461058d578063e5a604bf1461067e578063f4038ec7146106c457610140565b80638baecc211461043e57806398d7a4141461045b5780639934d7c31461048e5780639986a0c6146104c1578063a60a9159146104f4578063b047fb501461050957610140565b80632d46ed56116101085780632d46ed56146103795780633ccfd60b146103ac57806352a71ac9146103c1578063573f322f146103d657806383197ef0146103f6578063889751981461040b57610140565b80630519ce79146101c25780630a0f8168146101f35780630cff2fd0146102085780631e0197e21461031f5780632b81860b14610334575b33732f4bdafb22bd92aa7b7552d270376de8edccbc1e148061016c57506003546001600160a01b031633145b6101c05760408051600160e51b62461bcd02815260206004820152601e60248201527f446f6e27742073656e642066756e647320746f20476174654b65657065720000604482015290519081900360640190fd5b005b3480156101ce57600080fd5b506101d761073f565b604080516001600160a01b039092168252519081900360200190f35b3480156101ff57600080fd5b506101d761074e565b6101c06004803603608081101561021e57600080fd5b810190602081018135600160201b81111561023857600080fd5b82018360208201111561024a57600080fd5b803590602001918460208302840111600160201b8311171561026b57600080fd5b919390929091602081019035600160201b81111561028857600080fd5b82018360208201111561029a57600080fd5b803590602001918460208302840111600160201b831117156102bb57600080fd5b919390929091602081019035600160201b8111156102d857600080fd5b8201836020820111156102ea57600080fd5b803590602001918460208302840111600160201b8311171561030b57600080fd5b9193509150356001600160a01b031661075d565b34801561032b57600080fd5b506101d7610d70565b34801561034057600080fd5b506103676004803603602081101561035757600080fd5b50356001600160581b0316610d7f565b60408051918252519081900360200190f35b34801561038557600080fd5b506101c06004803603602081101561039c57600080fd5b50356001600160a01b0316610d92565b3480156103b857600080fd5b506101c0610e55565b3480156103cd57600080fd5b506101d7610ed5565b610367600480360360208110156103ec57600080fd5b503560ff16610eed565b34801561040257600080fd5b506101c0610f60565b34801561041757600080fd5b506101c06004803603602081101561042e57600080fd5b50356001600160a01b031661106b565b6101c06004803603602081101561045457600080fd5b50356110cd565b34801561046757600080fd5b506101c06004803603604081101561047e57600080fd5b508035906020013560ff16611236565b34801561049a57600080fd5b506101c0600480360360208110156104b157600080fd5b50356001600160a01b03166113fa565b3480156104cd57600080fd5b506101c0600480360360208110156104e457600080fd5b50356001600160a01b0316611683565b34801561050057600080fd5b50610367611746565b34801561051557600080fd5b506101d761174c565b34801561052a57600080fd5b5061053361175b565b604080516001600160601b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b34801561056f57600080fd5b506101c0611785565b34801561058457600080fd5b506101d7611930565b61062e600480360360208110156105a357600080fd5b810190602081018135600160201b8111156105bd57600080fd5b8201836020820111156105cf57600080fd5b803590602001918460208302840111600160201b831117156105f057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611948945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561066a578181015183820152602001610652565b505050509050019250505060405180910390f35b34801561068a57600080fd5b506106a8600480360360208110156106a157600080fd5b5035611d67565b604080516001600160581b039092168252519081900360200190f35b3480156106d057600080fd5b506101c0600480360360208110156106e757600080fd5b810190602081018135600160201b81111561070157600080fd5b82018360208201111561071357600080fd5b803590602001918460208302840111600160201b8311171561073457600080fd5b509092509050611d6f565b6002546001600160a01b031681565b6000546001600160a01b031681565b6001546001600160a01b031633146107ad5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b85841480156107bb57508382145b61080f5760408051600160e51b62461bcd02815260206004820152601e60248201527f496e636f6e73697374656e7420706172616d65746572206c656e677468730000604482015290519081900360640190fd5b6040805185815260208087028201019091526000908190606090878015610840578160200160208202803883390190505b50905060005b878110156109af57600487878381811061085c57fe5b9050602002013560ff1660ff1611156108b55760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b600160581b8989838181106108c657fe5b90506020020135106109225760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c696420706f776572206c6576656c00000000000000000000000000604482015290519081900360640190fd5b88888281811061092e57fe5b9050602002013582828151811061094157fe5b60200260200101906001600160581b031690816001600160581b031681525050600061097f83838151811061097257fe5b6020026020010151610d7f565b905080850194506109a283838151811061099557fe5b6020026020010151612275565b9093019250600101610846565b5082341015610a005760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b7335b7838dd7507ada69610397a85310ae0abd50346001600160a01b0316639d1580238b8b848a8a8a6040518763ffffffff1660e01b815260040180806020018060200180602001856001600160a01b03166001600160a01b0316815260200184810384528a8a828181526020019250602002808284376000838201819052601f909101601f191690920186810385528a5181528a51602091820193828d0193509102908190849084905b83811015610ac3578181015183820152602001610aab565b505050509050018481038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018e90526001600160a01b03909216935063b9d95abb925085918e918e91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b83811015610bd1578181015183820152602001610bb9565b50505050905001955050505050506000604051808303818588803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b5050505050610c1a84612288565b15610d5b5760005b89811015610d59576000856001600160a01b031663150b7a023360008f8f87818110610c4a57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015610ccd57600080fd5b505af1158015610ce1573d6000803e3d6000fd5b505050506040513d6020811015610cf757600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214610d5057604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612554602c913960400191505060405180910390fd5b50600101610c22565b505b610d648361228e565b50505050505050505050565b6003546001600160a01b031681565b6001600160581b0381166103e802919050565b6000546001600160a01b03163314610de25760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b610deb816122d1565b600254604080516001600160a01b039283168152918316602083015280517fe1033d3cc535efc343c53636bdc05c52a44d9e70b089d4ad6e974379f2c651d69281900390910190a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314610ea55760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043464f02604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f19350505050158015610ed2573d6000803e3d6000fd5b50565b732f4bdafb22bd92aa7b7552d270376de8edccbc1e81565b60408051600180825281830190925260009160609190602080830190803883390190505090508281600081518110610f2157fe5b602002602001019060ff16908160ff16815250506060610f4082611948565b905080600081518110610f4f57fe5b602002602001015192505050919050565b6001546001600160a01b03163314610fb05760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b3031156110075760408051600160e51b62461bcd02815260206004820152601560248201527f447261696e207468652066756e64732066697273740000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0316156110685760408051600160e51b62461bcd02815260206004820152601860248201527f44657374726f7920546f75726e616d656e742066697273740000000000000000604482015290519081900360640190fd5b33ff5b6000546001600160a01b031633146110bb5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b6110c4816122d1565b610ed28161234b565b60408051600160e01b63430c208102815233600482015260248101839052905182917335b7838dd7507ada69610397a85310ae0abd50349163430c208191604480820192602092909190829003018186803b15801561112b57600080fd5b505afa15801561113f573d6000803e3d6000fd5b505050506040513d602081101561115557600080fd5b50516111ab5760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b60006111b634611d67565b905060006111c382612275565b60035460408051600160e01b638baecc210281526004810188905290519293506001600160a01b0390911691638baecc21918491602480830192600092919082900301818588803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050505050505050565b60408051600160e01b63430c208102815233600482015260248101849052905183917335b7838dd7507ada69610397a85310ae0abd50349163430c208191604480820192602092909190829003018186803b15801561129457600080fd5b505afa1580156112a8573d6000803e3d6000fd5b505050506040513d60208110156112be57600080fd5b50516113145760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b60ff82161580159061132a5750600460ff831611155b61137e5760408051600160e51b62461bcd02815260206004820152601c60248201527f4d7573742063686f6f736520612076616c696420616666696e69747900000000604482015290519081900360640190fd5b60408051600160e21b632635e9050281526004810185905260ff8416602482015290517335b7838dd7507ada69610397a85310ae0abd5034916398d7a41491604480830192600092919082900301818387803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b0316331461144a5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b0316156114ab5760408051600160e51b62461bcd02815260206004820152601d60248201527f546f75726e616d656e7420616c72656164792072656769737465726564000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b03831690811790915515801590611557575060035460408051600160e01b6301ffc9a7028152600160e31b6317a0b21302600482015290516001600160a01b03909216916301ffc9a791602480820192602092909190829003018186803b15801561152a57600080fd5b505afa15801561153e573d6000803e3d6000fd5b505050506040513d602081101561155457600080fd5b50515b6115ab5760408051600160e51b62461bcd02815260206004820152601260248201527f496e76616c696420546f75726e616d656e740000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663ad81e4d66040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d602081101561162357600080fd5b505160048190556103e81015610ed25760408051600160e51b62461bcd02815260206004820152601460248201527f506f776572207363616c6520746f6f2068696768000000000000000000000000604482015290519081900360640190fd5b6000546001600160a01b031633146116d35760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b6116dc816122d1565b600154604080516001600160a01b039283168152918316602083015280517f1cd3afc04e6ae479d2b9f74533351b52218c5b2ae4f847f681a5eac514fe11849281900390910190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b60045490565b6001546001600160a01b031681565b6005546001600160601b0380821691600160601b810490911690600160c01b900463ffffffff1683565b6001546001600160a01b031633146117d55760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b03161561192e57600360009054906101000a90046001600160a01b03166001600160a01b03166322f3e2d46040518163ffffffff1660e01b815260040160206040518083038186803b15801561183457600080fd5b505afa158015611848573d6000803e3d6000fd5b505050506040513d602081101561185e57600080fd5b5051156118b55760408051600160e51b62461bcd02815260206004820152601160248201527f546f75726e616d656e7420616374697665000000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561190557600080fd5b505af1158015611919573d6000803e3d6000fd5b5050600380546001600160a01b031916905550505b565b7335b7838dd7507ada69610397a85310ae0abd503481565b60606000806060611958856123b5565b925092509250823410156119ae5760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b604051600160e21b63157f6fbb02815233604482018190526060600483019081528351606484015283517335b7838dd7507ada69610397a85310ae0abd5034936355fdbeec9386938b9391929091829160248101916084909101906020808901910280838360005b83811015611a2e578181015183820152602001611a16565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015611a6d578181015183820152602001611a55565b5050505090500195505050505050600060405180830381600087803b158015611a9557600080fd5b505af1158015611aa9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ad257600080fd5b810190808051600160201b811115611ae957600080fd5b82016020810184811115611afc57600080fd5b81518560208202830111600160201b82111715611b1857600080fd5b505060035460408051600160e01b63b9d95abb02815260048101918252835160448201528351939a506001600160a01b03909216955063b9d95abb94508793508992879282916024820191606401906020808801910280838360005b83811015611b8c578181015183820152602001611b74565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611bcb578181015183820152602001611bb3565b505050509050019450505050506000604051808303818588803b158015611bf157600080fd5b505af1158015611c05573d6000803e3d6000fd5b5050505050611c1333612288565b15611d565760005b8451811015611d54576000336001600160a01b031663150b7a02336000898681518110611c4457fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015611cc857600080fd5b505af1158015611cdc573d6000803e3d6000fd5b505050506040513d6020811015611cf257600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214611d4b57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612554602c913960400191505060405180910390fd5b50600101611c1b565b505b611d5f8361228e565b505050919050565b6103e8900490565b6060806060732f4bdafb22bd92aa7b7552d270376de8edccbc1e6001600160a01b031663476c4a5e86866040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015611dfd57600080fd5b505af1158015611e11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526060811015611e3a57600080fd5b810190808051600160201b811115611e5157600080fd5b82016020810184811115611e6457600080fd5b81518560208202830111600160201b82111715611e8057600080fd5b50509291906020018051600160201b811115611e9b57600080fd5b82016020810184811115611eae57600080fd5b81518560208202830111600160201b82111715611eca57600080fd5b50509291906020018051600160201b811115611ee557600080fd5b82016020810184811115611ef857600080fd5b81518560208202830111600160201b82111715611f1457600080fd5b50509291905050509250925092506000809050600084600081518110611f3657fe5b6020026020010151905060608451604051908082528060200260200182016040528015611f6d578160200160208202803883390190505b50905060005b855181101561205357826001600160a01b0316878281518110611f9257fe5b60200260200101516001600160a01b031614611ff85760408051600160e51b62461bcd02815260206004820181905260248201527f416c6c2057697a61726473206d75737420686176652073616d65206f776e6572604482015290519081900360640190fd5b85818151811061200457fe5b602002602001015182828151811061201857fe5b60200260200101906001600160581b031690816001600160581b03168152505061204782828151811061099557fe5b90930192600101611f73565b50604051600160e01b639d1580230281526001600160a01b0383166064820152608060048201908152608482018990527335b7838dd7507ada69610397a85310ae0abd503491639d158023918b918b9186918a91899181906024810190604481019060a4018960208a02808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b8381101561210d5781810151838201526020016120f5565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561214c578181015183820152602001612134565b5050505090500198505050505050505050600060405180830381600087803b15801561217757600080fd5b505af115801561218b573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018c90526001600160a01b03909216935063b9d95abb925086918c918c91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b8381101561222b578181015183820152602001612213565b50505050905001955050505050506000604051808303818588803b15801561225257600080fd5b505af1158015612266573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160581b03821602919050565b3b151590565b348190036125e43a028111156122cd57604051339082156108fc029083906000818181858888f193505050501580156122cb573d6000803e3d6000fd5b505b5050565b6001600160a01b038116158015906122f757506000546001600160a01b03828116911614155b610ed25760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c69642043454f206164647265737300000000000000000000000000604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f9d05f170f1d545b1aa21c4a4f79f17ff737f5f020ea1b333d88f29f0bbfa9fc69281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600554815160408051828152602080840282010190915260009283926060926001600160601b0380841693600160601b810490911692600160c01b90910463ffffffff1691908015612411578160200160208202803883390190505b50935060005b875181101561251157600088828151811061242e57fe5b6020026020010151905060008060ff168260ff161180156124535750600460ff831611155b61249d5760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b60ff8216600114156124b05750846124bd565b50620186a0838502048401935b6124c681611d67565b8784815181106124d257fe5b60200260200101906001600160581b031690816001600160581b03168152505061250187848151811061099557fe5b9801979096019550600101612417565b5050600580546001600160601b03909216600160601b0277ffffffffffffffffffffffff0000000000000000000000001990921691909117905550919390925056fe436f6e7472616374206f776e6572206469646e27742061636365707420455243373231207472616e73666572a165627a7a723058204fdb1ce11c52e14d2d1fe388b00dbe113224064cd82988b9982bdc589ed019fa0029000000000000000000000000d880d895ce716afc1e5e21cb901b5093701842e4000000000000000000000000c09f4f0eae0b92ec1e3d93baeac46d8a5391483b00000000000000000000000000000000000000000000000000f8b0a10e4700000000000000000000000000000000000000000000000000000ffda09703098e300000000000000000000000000000000000000000000000000000000000000082
Deployed Bytecode
0x6080604052600436106101405760003560e01c80638baecc21116100b6578063b83a0c441161006f578063b83a0c441461051e578063b95dbeb614610563578063c9eb068b14610578578063ce6991fd1461058d578063e5a604bf1461067e578063f4038ec7146106c457610140565b80638baecc211461043e57806398d7a4141461045b5780639934d7c31461048e5780639986a0c6146104c1578063a60a9159146104f4578063b047fb501461050957610140565b80632d46ed56116101085780632d46ed56146103795780633ccfd60b146103ac57806352a71ac9146103c1578063573f322f146103d657806383197ef0146103f6578063889751981461040b57610140565b80630519ce79146101c25780630a0f8168146101f35780630cff2fd0146102085780631e0197e21461031f5780632b81860b14610334575b33732f4bdafb22bd92aa7b7552d270376de8edccbc1e148061016c57506003546001600160a01b031633145b6101c05760408051600160e51b62461bcd02815260206004820152601e60248201527f446f6e27742073656e642066756e647320746f20476174654b65657065720000604482015290519081900360640190fd5b005b3480156101ce57600080fd5b506101d761073f565b604080516001600160a01b039092168252519081900360200190f35b3480156101ff57600080fd5b506101d761074e565b6101c06004803603608081101561021e57600080fd5b810190602081018135600160201b81111561023857600080fd5b82018360208201111561024a57600080fd5b803590602001918460208302840111600160201b8311171561026b57600080fd5b919390929091602081019035600160201b81111561028857600080fd5b82018360208201111561029a57600080fd5b803590602001918460208302840111600160201b831117156102bb57600080fd5b919390929091602081019035600160201b8111156102d857600080fd5b8201836020820111156102ea57600080fd5b803590602001918460208302840111600160201b8311171561030b57600080fd5b9193509150356001600160a01b031661075d565b34801561032b57600080fd5b506101d7610d70565b34801561034057600080fd5b506103676004803603602081101561035757600080fd5b50356001600160581b0316610d7f565b60408051918252519081900360200190f35b34801561038557600080fd5b506101c06004803603602081101561039c57600080fd5b50356001600160a01b0316610d92565b3480156103b857600080fd5b506101c0610e55565b3480156103cd57600080fd5b506101d7610ed5565b610367600480360360208110156103ec57600080fd5b503560ff16610eed565b34801561040257600080fd5b506101c0610f60565b34801561041757600080fd5b506101c06004803603602081101561042e57600080fd5b50356001600160a01b031661106b565b6101c06004803603602081101561045457600080fd5b50356110cd565b34801561046757600080fd5b506101c06004803603604081101561047e57600080fd5b508035906020013560ff16611236565b34801561049a57600080fd5b506101c0600480360360208110156104b157600080fd5b50356001600160a01b03166113fa565b3480156104cd57600080fd5b506101c0600480360360208110156104e457600080fd5b50356001600160a01b0316611683565b34801561050057600080fd5b50610367611746565b34801561051557600080fd5b506101d761174c565b34801561052a57600080fd5b5061053361175b565b604080516001600160601b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b34801561056f57600080fd5b506101c0611785565b34801561058457600080fd5b506101d7611930565b61062e600480360360208110156105a357600080fd5b810190602081018135600160201b8111156105bd57600080fd5b8201836020820111156105cf57600080fd5b803590602001918460208302840111600160201b831117156105f057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611948945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561066a578181015183820152602001610652565b505050509050019250505060405180910390f35b34801561068a57600080fd5b506106a8600480360360208110156106a157600080fd5b5035611d67565b604080516001600160581b039092168252519081900360200190f35b3480156106d057600080fd5b506101c0600480360360208110156106e757600080fd5b810190602081018135600160201b81111561070157600080fd5b82018360208201111561071357600080fd5b803590602001918460208302840111600160201b8311171561073457600080fd5b509092509050611d6f565b6002546001600160a01b031681565b6000546001600160a01b031681565b6001546001600160a01b031633146107ad5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b85841480156107bb57508382145b61080f5760408051600160e51b62461bcd02815260206004820152601e60248201527f496e636f6e73697374656e7420706172616d65746572206c656e677468730000604482015290519081900360640190fd5b6040805185815260208087028201019091526000908190606090878015610840578160200160208202803883390190505b50905060005b878110156109af57600487878381811061085c57fe5b9050602002013560ff1660ff1611156108b55760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b600160581b8989838181106108c657fe5b90506020020135106109225760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c696420706f776572206c6576656c00000000000000000000000000604482015290519081900360640190fd5b88888281811061092e57fe5b9050602002013582828151811061094157fe5b60200260200101906001600160581b031690816001600160581b031681525050600061097f83838151811061097257fe5b6020026020010151610d7f565b905080850194506109a283838151811061099557fe5b6020026020010151612275565b9093019250600101610846565b5082341015610a005760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b7335b7838dd7507ada69610397a85310ae0abd50346001600160a01b0316639d1580238b8b848a8a8a6040518763ffffffff1660e01b815260040180806020018060200180602001856001600160a01b03166001600160a01b0316815260200184810384528a8a828181526020019250602002808284376000838201819052601f909101601f191690920186810385528a5181528a51602091820193828d0193509102908190849084905b83811015610ac3578181015183820152602001610aab565b505050509050018481038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018e90526001600160a01b03909216935063b9d95abb925085918e918e91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b83811015610bd1578181015183820152602001610bb9565b50505050905001955050505050506000604051808303818588803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b5050505050610c1a84612288565b15610d5b5760005b89811015610d59576000856001600160a01b031663150b7a023360008f8f87818110610c4a57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015610ccd57600080fd5b505af1158015610ce1573d6000803e3d6000fd5b505050506040513d6020811015610cf757600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214610d5057604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612554602c913960400191505060405180910390fd5b50600101610c22565b505b610d648361228e565b50505050505050505050565b6003546001600160a01b031681565b6001600160581b0381166103e802919050565b6000546001600160a01b03163314610de25760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b610deb816122d1565b600254604080516001600160a01b039283168152918316602083015280517fe1033d3cc535efc343c53636bdc05c52a44d9e70b089d4ad6e974379f2c651d69281900390910190a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314610ea55760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043464f02604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f19350505050158015610ed2573d6000803e3d6000fd5b50565b732f4bdafb22bd92aa7b7552d270376de8edccbc1e81565b60408051600180825281830190925260009160609190602080830190803883390190505090508281600081518110610f2157fe5b602002602001019060ff16908160ff16815250506060610f4082611948565b905080600081518110610f4f57fe5b602002602001015192505050919050565b6001546001600160a01b03163314610fb05760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b3031156110075760408051600160e51b62461bcd02815260206004820152601560248201527f447261696e207468652066756e64732066697273740000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0316156110685760408051600160e51b62461bcd02815260206004820152601860248201527f44657374726f7920546f75726e616d656e742066697273740000000000000000604482015290519081900360640190fd5b33ff5b6000546001600160a01b031633146110bb5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b6110c4816122d1565b610ed28161234b565b60408051600160e01b63430c208102815233600482015260248101839052905182917335b7838dd7507ada69610397a85310ae0abd50349163430c208191604480820192602092909190829003018186803b15801561112b57600080fd5b505afa15801561113f573d6000803e3d6000fd5b505050506040513d602081101561115557600080fd5b50516111ab5760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b60006111b634611d67565b905060006111c382612275565b60035460408051600160e01b638baecc210281526004810188905290519293506001600160a01b0390911691638baecc21918491602480830192600092919082900301818588803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050505050505050565b60408051600160e01b63430c208102815233600482015260248101849052905183917335b7838dd7507ada69610397a85310ae0abd50349163430c208191604480820192602092909190829003018186803b15801561129457600080fd5b505afa1580156112a8573d6000803e3d6000fd5b505050506040513d60208110156112be57600080fd5b50516113145760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b60ff82161580159061132a5750600460ff831611155b61137e5760408051600160e51b62461bcd02815260206004820152601c60248201527f4d7573742063686f6f736520612076616c696420616666696e69747900000000604482015290519081900360640190fd5b60408051600160e21b632635e9050281526004810185905260ff8416602482015290517335b7838dd7507ada69610397a85310ae0abd5034916398d7a41491604480830192600092919082900301818387803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b0316331461144a5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b0316156114ab5760408051600160e51b62461bcd02815260206004820152601d60248201527f546f75726e616d656e7420616c72656164792072656769737465726564000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b03831690811790915515801590611557575060035460408051600160e01b6301ffc9a7028152600160e31b6317a0b21302600482015290516001600160a01b03909216916301ffc9a791602480820192602092909190829003018186803b15801561152a57600080fd5b505afa15801561153e573d6000803e3d6000fd5b505050506040513d602081101561155457600080fd5b50515b6115ab5760408051600160e51b62461bcd02815260206004820152601260248201527f496e76616c696420546f75726e616d656e740000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663ad81e4d66040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d602081101561162357600080fd5b505160048190556103e81015610ed25760408051600160e51b62461bcd02815260206004820152601460248201527f506f776572207363616c6520746f6f2068696768000000000000000000000000604482015290519081900360640190fd5b6000546001600160a01b031633146116d35760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b6116dc816122d1565b600154604080516001600160a01b039283168152918316602083015280517f1cd3afc04e6ae479d2b9f74533351b52218c5b2ae4f847f681a5eac514fe11849281900390910190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b60045490565b6001546001600160a01b031681565b6005546001600160601b0380821691600160601b810490911690600160c01b900463ffffffff1683565b6001546001600160a01b031633146117d55760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b03161561192e57600360009054906101000a90046001600160a01b03166001600160a01b03166322f3e2d46040518163ffffffff1660e01b815260040160206040518083038186803b15801561183457600080fd5b505afa158015611848573d6000803e3d6000fd5b505050506040513d602081101561185e57600080fd5b5051156118b55760408051600160e51b62461bcd02815260206004820152601160248201527f546f75726e616d656e7420616374697665000000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561190557600080fd5b505af1158015611919573d6000803e3d6000fd5b5050600380546001600160a01b031916905550505b565b7335b7838dd7507ada69610397a85310ae0abd503481565b60606000806060611958856123b5565b925092509250823410156119ae5760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b604051600160e21b63157f6fbb02815233604482018190526060600483019081528351606484015283517335b7838dd7507ada69610397a85310ae0abd5034936355fdbeec9386938b9391929091829160248101916084909101906020808901910280838360005b83811015611a2e578181015183820152602001611a16565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015611a6d578181015183820152602001611a55565b5050505090500195505050505050600060405180830381600087803b158015611a9557600080fd5b505af1158015611aa9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ad257600080fd5b810190808051600160201b811115611ae957600080fd5b82016020810184811115611afc57600080fd5b81518560208202830111600160201b82111715611b1857600080fd5b505060035460408051600160e01b63b9d95abb02815260048101918252835160448201528351939a506001600160a01b03909216955063b9d95abb94508793508992879282916024820191606401906020808801910280838360005b83811015611b8c578181015183820152602001611b74565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611bcb578181015183820152602001611bb3565b505050509050019450505050506000604051808303818588803b158015611bf157600080fd5b505af1158015611c05573d6000803e3d6000fd5b5050505050611c1333612288565b15611d565760005b8451811015611d54576000336001600160a01b031663150b7a02336000898681518110611c4457fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015611cc857600080fd5b505af1158015611cdc573d6000803e3d6000fd5b505050506040513d6020811015611cf257600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214611d4b57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612554602c913960400191505060405180910390fd5b50600101611c1b565b505b611d5f8361228e565b505050919050565b6103e8900490565b6060806060732f4bdafb22bd92aa7b7552d270376de8edccbc1e6001600160a01b031663476c4a5e86866040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015611dfd57600080fd5b505af1158015611e11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526060811015611e3a57600080fd5b810190808051600160201b811115611e5157600080fd5b82016020810184811115611e6457600080fd5b81518560208202830111600160201b82111715611e8057600080fd5b50509291906020018051600160201b811115611e9b57600080fd5b82016020810184811115611eae57600080fd5b81518560208202830111600160201b82111715611eca57600080fd5b50509291906020018051600160201b811115611ee557600080fd5b82016020810184811115611ef857600080fd5b81518560208202830111600160201b82111715611f1457600080fd5b50509291905050509250925092506000809050600084600081518110611f3657fe5b6020026020010151905060608451604051908082528060200260200182016040528015611f6d578160200160208202803883390190505b50905060005b855181101561205357826001600160a01b0316878281518110611f9257fe5b60200260200101516001600160a01b031614611ff85760408051600160e51b62461bcd02815260206004820181905260248201527f416c6c2057697a61726473206d75737420686176652073616d65206f776e6572604482015290519081900360640190fd5b85818151811061200457fe5b602002602001015182828151811061201857fe5b60200260200101906001600160581b031690816001600160581b03168152505061204782828151811061099557fe5b90930192600101611f73565b50604051600160e01b639d1580230281526001600160a01b0383166064820152608060048201908152608482018990527335b7838dd7507ada69610397a85310ae0abd503491639d158023918b918b9186918a91899181906024810190604481019060a4018960208a02808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b8381101561210d5781810151838201526020016120f5565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561214c578181015183820152602001612134565b5050505090500198505050505050505050600060405180830381600087803b15801561217757600080fd5b505af115801561218b573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018c90526001600160a01b03909216935063b9d95abb925086918c918c91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b8381101561222b578181015183820152602001612213565b50505050905001955050505050506000604051808303818588803b15801561225257600080fd5b505af1158015612266573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160581b03821602919050565b3b151590565b348190036125e43a028111156122cd57604051339082156108fc029083906000818181858888f193505050501580156122cb573d6000803e3d6000fd5b505b5050565b6001600160a01b038116158015906122f757506000546001600160a01b03828116911614155b610ed25760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c69642043454f206164647265737300000000000000000000000000604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f9d05f170f1d545b1aa21c4a4f79f17ff737f5f020ea1b333d88f29f0bbfa9fc69281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600554815160408051828152602080840282010190915260009283926060926001600160601b0380841693600160601b810490911692600160c01b90910463ffffffff1691908015612411578160200160208202803883390190505b50935060005b875181101561251157600088828151811061242e57fe5b6020026020010151905060008060ff168260ff161180156124535750600460ff831611155b61249d5760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b60ff8216600114156124b05750846124bd565b50620186a0838502048401935b6124c681611d67565b8784815181106124d257fe5b60200260200101906001600160581b031690816001600160581b03168152505061250187848151811061099557fe5b9801979096019550600101612417565b5050600580546001600160601b03909216600160601b0277ffffffffffffffffffffffff0000000000000000000000001990921691909117905550919390925056fe436f6e7472616374206f776e6572206469646e27742061636365707420455243373231207472616e73666572a165627a7a723058204fdb1ce11c52e14d2d1fe388b00dbe113224064cd82988b9982bdc589ed019fa0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d880d895ce716afc1e5e21cb901b5093701842e4000000000000000000000000c09f4f0eae0b92ec1e3d93baeac46d8a5391483b00000000000000000000000000000000000000000000000000f8b0a10e4700000000000000000000000000000000000000000000000000000ffda09703098e300000000000000000000000000000000000000000000000000000000000000082
-----Decoded View---------------
Arg [0] : setCooAddress (address): 0xD880d895Ce716AfC1E5e21cb901b5093701842e4
Arg [1] : setCfoAddress (address): 0xc09F4f0eAE0B92ec1e3D93BAeac46D8a5391483B
Arg [2] : setNeutralWizardCost (uint256): 70000000000000000
Arg [3] : setElementalWizardCost (uint256): 1152253650128178736
Arg [4] : setElementalWizardIncrement (uint256): 130
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000d880d895ce716afc1e5e21cb901b5093701842e4
Arg [1] : 000000000000000000000000c09f4f0eae0b92ec1e3d93baeac46d8a5391483b
Arg [2] : 00000000000000000000000000000000000000000000000000f8b0a10e470000
Arg [3] : 0000000000000000000000000000000000000000000000000ffda09703098e30
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000082
Deployed Bytecode Sourcemap
21045:20201:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24433:10;21618:42;24433:37;;:74;;-1:-1:-1;24496:10:0;;-1:-1:-1;;;;;24496:10:0;24474;:33;24433:74;24425:117;;;;;-1:-1:-1;;;;;24425:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21045:20201;13236:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13236:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;13236:33:0;;;;;;;;;;;;;;12618:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12618:25:0;;;:::i;30335:2261::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;30335:2261:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30335:2261:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30335:2261:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30335:2261:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30335:2261:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30335:2261:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30335:2261:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30335:2261:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30335:2261:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30335:2261:0;;-1:-1:-1;30335:2261:0;-1:-1:-1;30335:2261:0;-1:-1:-1;;;;;30335:2261:0;;:::i;21204:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21204:37:0;;;:::i;38647:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38647:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38647:119:0;-1:-1:-1;;;;;38647:119:0;;:::i;:::-;;;;;;;;;;;;;;;;15842:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15842:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15842:181:0;-1:-1:-1;;;;;15842:181:0;;:::i;39251:251::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39251:251:0;;;:::i;21531:131::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21531:131:0;;;:::i;26781:276::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26781:276:0;;;;:::i;39665:233::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39665:233:0;;;:::i;14929:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14929:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14929:121:0;-1:-1:-1;;;;;14929:121:0;;:::i;37068:517::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37068:517:0;;:::i;37867:360::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37867:360:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37867:360:0;;;;;;;;;:::i;25340:518::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25340:518:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25340:518:0;-1:-1:-1;;;;;25340:518:0;;:::i;15518:173::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15518:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15518:173:0;-1:-1:-1;;;;;15518:173:0;;:::i;21953:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21953:113:0;;;:::i;13008:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13008:25:0;;;:::i;23105:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23105:30:0;;;:::i;:::-;;;;-1:-1:-1;;;;;23105:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39973:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39973:275:0;;;:::i;21360:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21360:125:0;;;:::i;27888:1576::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27888:1576:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27888:1576:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27888:1576:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27888:1576:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27888:1576:0;;-1:-1:-1;27888:1576:0;;-1:-1:-1;;;;;27888:1576:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27888:1576:0;;;;;;;;;;;;;;;;;38418:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38418:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38418:126:0;;:::i;:::-;;;;-1:-1:-1;;;;;38418:126:0;;;;;;;;;;;;;;35590:1301;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35590:1301:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35590:1301:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;35590:1301:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35590:1301:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;35590:1301:0;;-1:-1:-1;35590:1301:0;-1:-1:-1;35590:1301:0;:::i;13236:33::-;;;-1:-1:-1;;;;;13236:33:0;;:::o;12618:25::-;;;-1:-1:-1;;;;;12618:25:0;;:::o;30335:2261::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;30625:33;;;:71;;;;-1:-1:-1;30662:34:0;;;30625:71;30617:114;;;;;-1:-1:-1;;;;;30617:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30841:27;;;;;;;;;;;;;;;;30744:17;;;;30811:27;;30854:6;30841:27;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;30841:27:0;-1:-1:-1;30811:57:0;-1:-1:-1;30886:9:0;30881:413;30901:17;;;30881:413;;;1048:1;30948:10;;30959:1;30948:13;;;;;;;;;;;;;;;:28;;;;30940:57;;;;;-1:-1:-1;;;;;30940:57:0;;;;;;;;;;;;-1:-1:-1;;;;;30940:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;31022:6:0;;31029:1;31022:9;;;;;;;;;;;;;:21;31014:53;;;;;-1:-1:-1;;;;;31014:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31106:6;;31113:1;31106:9;;;;;;;;;;;;;31082:11;31094:1;31082:14;;;;;;;;;;;;;:34;-1:-1:-1;;;;;31082:34:0;;;-1:-1:-1;;;;;31082:34:0;;;;;31131:18;31152:27;31164:11;31176:1;31164:14;;;;;;;;;;;;;;31152:11;:27::i;:::-;31131:48;;31209:10;31196:23;;;;31250:32;31267:11;31279:1;31267:14;;;;;;;;;;;;;;31250:16;:32::i;:::-;31234:48;;;;-1:-1:-1;30920:3:0;;30881:413;;;;31327:9;31314;:22;;31306:53;;;;;-1:-1:-1;;;;;31306:53:0;;;;;;;;;;;;-1:-1:-1;;;;;31306:53:0;;;;;;;;;;;;;;;21441:42;-1:-1:-1;;;;;31434:32:0;;31467:9;;31478:11;31491:10;;31503:5;31434:75;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31434:75:0;-1:-1:-1;;;;;31434:75:0;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;31434:75:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31434:75:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31434:75:0;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;31434:75:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31434:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;31576:10:0;;:67;;;-1:-1:-1;;;;;31576:67:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31576:10:0;;;;-1:-1:-1;31576:23:0;;-1:-1:-1;31606:12:0;;31620:9;;;;31631:11;;31576:67;;;;;;;;;31620:9;31576:67;;;;31620:9;31576:67;1:33:-1;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;31576:67:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31576:67:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31576:67:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31576:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31576:67:0;;;;;32028:17;32039:5;32028:10;:17::i;:::-;32024:350;;;32067:9;32062:301;32082:20;;;32062:301;;;32128:23;32170:5;-1:-1:-1;;;;;32154:39:0;;32194:10;32214:1;32218:9;;32228:1;32218:12;;;;;;;;;;;;;32154:81;;;;;;;;;;;;;-1:-1:-1;;;;;32154:81:0;-1:-1:-1;;;;;32154:81:0;;;;;;-1:-1:-1;;;;;32154:81:0;-1:-1:-1;;;;;32154:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32154:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32154:81:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32154:81:0;;-1:-1:-1;;;;;;;32262:36:0;;-1:-1:-1;;;;;32262:36:0;32254:93;;;;-1:-1:-1;;;;;32254:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32104:3:0;;32062:301;;;;32024:350;32562:26;32578:9;32562:15;:26::i;:::-;14423:1;;;30335:2261;;;;;;;:::o;21204:37::-;;;-1:-1:-1;;;;;21204:37:0;;:::o;38647:119::-;-1:-1:-1;;;;;38735:23:0;;21896:4;38735:23;38647:119;;;:::o;15842:181::-;14226:10;;-1:-1:-1;;;;;14226:10:0;14212;:24;14204:45;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;;;;15908:27;15928:6;15908:19;:27::i;:::-;15966:10;;15951:34;;;-1:-1:-1;;;;;15966:10:0;;;15951:34;;;;;;;;;;;;;;;;;;;;;15996:10;:19;;-1:-1:-1;;;;;;15996:19:0;-1:-1:-1;;;;;15996:19:0;;;;;;;;;;15842:181::o;39251:251::-;14552:10;;-1:-1:-1;;;;;14552:10:0;14538;:24;14530:45;;;;;-1:-1:-1;;;;;14530:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14530:45:0;;;;;;;;;;;;;;;39452:42;;:10;;39480:4;39472:21;39452:42;;;;;;;;;39472:21;39452:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39452:42:0;39251:251::o;21531:131::-;21618:42;21531:131;:::o;26781:276::-;26894:14;;;26906:1;26894:14;;;;;;;;;26846:7;;26866:25;;26894:14;;;;;;;105:10:-1;26894:14:0;88:34:-1;136:17;;-1:-1;26894:14:0;26866:42;;26937:8;26921:10;26932:1;26921:13;;;;;;;;;;;;;:24;;;;;;;;;;;26958:26;26987:30;27006:10;26987:18;:30::i;:::-;26958:59;;27037:9;27047:1;27037:12;;;;;;;;;;;;;;27030:19;;;;26781:276;;;:::o;39665:233::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;39728:4;39720:21;:26;39712:60;;;;;-1:-1:-1;;;;;39712:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39799:10;;-1:-1:-1;;;;;39799:10:0;39791:33;39783:70;;;;;-1:-1:-1;;;;;39783:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39879:10;39866:24;14929:121;14226:10;;-1:-1:-1;;;;;14226:10:0;14212;:24;14204:45;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;;;;14989:27;15009:6;14989:19;:27::i;:::-;15027:15;15035:6;15027:7;:15::i;37068:517::-;24136:52;;;-1:-1:-1;;;;;24136:52:0;;24167:10;24136:52;;;;;;;;;;;;37140:8;;21441:42;;24136:30;;:52;;;;;;;;;;;;;;;21441:42;24136:52;;;5:2:-1;;;;30:1;27;20:12;5:2;24136:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24136:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24136:52:0;24128:90;;;;;-1:-1:-1;;;;;24128:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37389:21;37413:22;37425:9;37413:11;:22::i;:::-;37389:46;;37446:28;37477:32;37494:14;37477:16;:32::i;:::-;37522:10;;:55;;;-1:-1:-1;;;;;37522:55:0;;;;;;;;;;37446:63;;-1:-1:-1;;;;;;37522:10:0;;;;:17;;37446:63;;37522:55;;;;;:10;;:55;;;;;;;37446:63;37522:10;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;37522:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37522:55:0;;;;;24229:1;;37068:517;;:::o;37867:360::-;24136:52;;;-1:-1:-1;;;;;24136:52:0;;24167:10;24136:52;;;;;;;;;;;;37955:8;;21441:42;;24136:30;;:52;;;;;;;;;;;;;;;21441:42;24136:52;;;5:2:-1;;;;30:1;27;20:12;5:2;24136:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24136:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24136:52:0;24128:90;;;;;-1:-1:-1;;;;;24128:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37984:28;;;;;;;:58;;-1:-1:-1;1048:1:0;38016:26;;;;;37984:58;37976:99;;;;;-1:-1:-1;;;;;37976:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38172:47;;;-1:-1:-1;;;;;38172:47:0;;;;;;;;;;;;;;;;;21441:42;;38172:24;;:47;;;;;-1:-1:-1;;38172:47:0;;;;;;;-1:-1:-1;21441:42:0;38172:47;;;5:2:-1;;;;30:1;27;20:12;5:2;38172:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38172:47:0;;;;37867:360;;;:::o;25340:518::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;25435:10;;-1:-1:-1;;;;;25435:10:0;25427:33;25419:75;;;;;-1:-1:-1;;;;;25419:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25505:10;:47;;-1:-1:-1;;;;;;25505:47:0;-1:-1:-1;;;;;25505:47:0;;;;;;;;25586:27;;;;25585:100;;-1:-1:-1;25631:10:0;;:54;;;-1:-1:-1;;;;;25631:54:0;;-1:-1:-1;;;;;25631:54:0;;;;;;-1:-1:-1;;;;;25631:10:0;;;;:28;;:54;;;;;;;;;;;;;;;:10;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;25631:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25631:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25631:54:0;25585:100;25563:145;;;;;-1:-1:-1;;;;;25563:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25744:10;;;;;;;;;-1:-1:-1;;;;;25744:10:0;-1:-1:-1;;;;;25744:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25744:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25744:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25744:23:0;25721:20;:46;;;21896:4;-1:-1:-1;25786:39:0;25778:72;;;;;-1:-1:-1;;;;;25778:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15518:173;14226:10;;-1:-1:-1;;;;;14226:10:0;14212;:24;14204:45;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;;;;15576:27;15596:6;15576:19;:27::i;:::-;15634:10;;15619:34;;;-1:-1:-1;;;;;15634:10:0;;;15619:34;;;;;;;;;;;;;;;;;;;;;15664:10;:19;;-1:-1:-1;;;;;;15664:19:0;-1:-1:-1;;;;;15664:19:0;;;;;;;;;;15518:173::o;21953:113::-;22038:20;;21953:113;:::o;13008:25::-;;;-1:-1:-1;;;;;13008:25:0;;:::o;23105:30::-;;;-1:-1:-1;;;;;23105:30:0;;;;-1:-1:-1;;;23105:30:0;;;;;;-1:-1:-1;;;23105:30:0;;;;;:::o;39973:275::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;40042:10;;-1:-1:-1;;;;;40042:10:0;40034:33;40030:211;;40092:10;;;;;;;;;-1:-1:-1;;;;;40092:10:0;-1:-1:-1;;;;;40092:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40092:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40092:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40092:21:0;:30;40084:60;;;;;-1:-1:-1;;;;;40084:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40159:10;;;;;;;;;-1:-1:-1;;;;;40159:10:0;-1:-1:-1;;;;;40159:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40159:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;40194:10:0;:35;;-1:-1:-1;;;;;;40194:35:0;;;-1:-1:-1;;40030:211:0;39973:275::o;21360:125::-;21441:42;21360:125;:::o;27888:1576::-;27980:26;28025:17;28044:20;28066:22;28092:32;28113:10;28092:20;:32::i;:::-;28024:100;;;;;;28158:9;28145;:22;;28137:53;;;;;-1:-1:-1;;;;;28137:53:0;;;;;;;;;;;;-1:-1:-1;;;;;28137:53:0;;;;;;;;;;;;;;;28311:56;;-1:-1:-1;;;;;28311:56:0;;28356:10;28311:56;;;;;;;;;;;;;;;;;;;;;21441:42;;28311:24;;28336:6;;28344:10;;28356;;28311:56;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28311:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28311:56:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28311:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28311:56:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;28311:56:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;28311:56:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;-1:-1;;28434:10:0;;:62;;;-1:-1:-1;;;;;28434:62:0;;;;;;;;;;;;;;;;28311:56;;-1:-1:-1;;;;;;28434:10:0;;;;-1:-1:-1;28434:23:0;;-1:-1:-1;28464:12:0;;-1:-1:-1;28311:56:0;;28489:6;;28434:62;;;;;;;;;;;;;;;;;;:10;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28434:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28434:62:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28434:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28434:62:0;;;;;28883:22;28894:10;28883;:22::i;:::-;28879:360;;;28927:9;28922:306;28946:9;:16;28942:1;:20;28922:306;;;28988:23;29030:10;-1:-1:-1;;;;;29014:44:0;;29059:10;29079:1;29083:9;29093:1;29083:12;;;;;;;;;;;;;;29014:86;;;;;;;;;;;;;-1:-1:-1;;;;;29014:86:0;-1:-1:-1;;;;;29014:86:0;;;;;;-1:-1:-1;;;;;29014:86:0;-1:-1:-1;;;;;29014:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29014:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29014:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29014:86:0;;-1:-1:-1;;;;;;;29127:36:0;;-1:-1:-1;;;;;29127:36:0;29119:93;;;;-1:-1:-1;;;;;29119:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28964:3:0;;28922:306;;;;28879:360;29430:26;29446:9;29430:15;:26::i;:::-;27888:1576;;;;;;:::o;38418:126::-;21896:4;38513:22;;;38418:126::o;35590:1301::-;36032:23;36071;36110:25;21618:42;-1:-1:-1;;;;;36149:32:0;;36182:9;;36149:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;36149:43:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36149:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36149:43:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;36149:43:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;36149:43:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;36149:43:0;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;36149:43:0;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;36149:43:0;;;;;;36017:175;;;;;;36205:20;36228:1;36205:24;;36240:16;36259:6;36266:1;36259:9;;;;;;;;;;;;;;36240:28;;36279:27;36322:6;:13;36309:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36309:27:0;-1:-1:-1;36279:57:0;-1:-1:-1;36354:9:0;36349:249;36373:6;:13;36369:1;:17;36349:249;;;36429:8;-1:-1:-1;;;;;36416:21:0;:6;36423:1;36416:9;;;;;;;;;;;;;;-1:-1:-1;;;;;36416:21:0;;36408:66;;;;;-1:-1:-1;;;;;36408:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36513:6;36520:1;36513:9;;;;;;;;;;;;;;36489:11;36501:1;36489:14;;;;;;;;;;;;;:34;-1:-1:-1;;;;;36489:34:0;;;-1:-1:-1;;;;;36489:34:0;;;;;36554:32;36571:11;36583:1;36571:14;;;;;;;36554:32;36538:48;;;;36388:3;;36349:249;;;-1:-1:-1;36671:78:0;;-1:-1:-1;;;;;36671:78:0;;-1:-1:-1;;;;;36671:78:0;;;;;;;;;;;;;;;;;;;21441:42;;36671:32;;36704:9;;;;36715:11;;36728:10;;36740:8;;36671:78;;;;;;;;;;;;36704:9;36671:78;;;;36704:9;36671:78;1:33:-1;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;36671:78:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36671:78:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36671:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36671:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36671:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;36816:10:0;;:67;;;-1:-1:-1;;;;;36816:67:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36816:10:0;;;;-1:-1:-1;36816:23:0;;-1:-1:-1;36846:12:0;;36860:9;;;;36871:11;;36816:67;;;;;;;;;36860:9;36816:67;;;;36860:9;36816:67;1:33:-1;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;36816:67:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36816:67:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36816:67:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36816:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36816:67:0;;;;;35590:1301;;;;;;;;:::o;39035:138::-;39145:20;;-1:-1:-1;;;;;39131:34:0;;;39035:138;;;:::o;19758:678::-;20330:20;20420:8;;;19758:678::o;40688:555::-;40770:9;:23;;;41170:8;41155:11;:24;41145:35;;41141:95;;;41197:27;;:10;;:27;;;;;41217:6;;41197:27;;;;41217:6;41197:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41197:27:0;41141:95;40688:555;;:::o;14603:175::-;-1:-1:-1;;;;;14688:27:0;;;;;;:58;;-1:-1:-1;14736:10:0;;-1:-1:-1;;;;;14719:27:0;;;14736:10;;14719:27;;14688:58;14680:90;;;;;-1:-1:-1;;;;;14680:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15238:129;15310:10;;15295:34;;;-1:-1:-1;;;;;15310:10:0;;;15295:34;;;;;;;;;;;;;;;;;;;;;15340:10;:19;;-1:-1:-1;;;;;;15340:19:0;-1:-1:-1;;;;;15340:19:0;;;;;;;;;;15238:129::o;32915:2296::-;33213:11;:29;33482:17;;33469:31;;;;;;;;;;;;;;;;33002:17;;;;33043:22;;-1:-1:-1;;;;;33213:29:0;;;;-1:-1:-1;;;33283:31:0;;;;;;-1:-1:-1;;;33360:36:0;;;;;;33469:31;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;33469:31:0;-1:-1:-1;33460:40:0;-1:-1:-1;33518:9:0;33513:1475;33537:10;:17;33533:1;:21;33513:1475;;;33576:14;33593:10;33604:1;33593:13;;;;;;;;;;;;;;33576:30;;33621:18;398:1;33664:25;;:8;:25;;;:52;;;;-1:-1:-1;1048:1:0;33693:23;;;;;33664:52;33656:81;;;;;-1:-1:-1;;;;;33656:81:0;;;;;;;;;;;;-1:-1:-1;;;;;33656:81:0;;;;;;;;;;;;;;;33808:27;;;550:1;33808:27;33804:754;;;-1:-1:-1;33869:17:0;33804:754;;;-1:-1:-1;22199:6:0;34474:46;;;34473:69;34450:92;;;33804:754;34586:23;34598:10;34586:11;:23::i;:::-;34574:6;34581:1;34574:9;;;;;;;;;;;;;:35;-1:-1:-1;;;;;34574:35:0;;;-1:-1:-1;;;;;34574:35:0;;;;;34911:27;34928:6;34935:1;34928:9;;;;;;;34911:27;34953:23;;;34895:43;;;;-1:-1:-1;33556:3:0;;33513:1475;;;-1:-1:-1;;35142:11:0;:61;;-1:-1:-1;;;;;35142:61:0;;;-1:-1:-1;;;35142:61:0;-1:-1:-1;;35142:61:0;;;;;;;;;-1:-1:-1;32915:2296:0;;;;-1:-1:-1;32915:2296:0:o
Swarm Source
bzzr://4fdb1ce11c52e14d2d1fe388b00dbe113224064cd82988b9982bdc589ed019fa
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.