Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 551 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Kill | 9020816 | 1913 days ago | IN | 0 ETH | 0.00027238 | ||||
Settle Bet | 9013816 | 1914 days ago | IN | 0 ETH | 0.00045243 | ||||
Place Bet | 9013814 | 1914 days ago | IN | 0.1 ETH | 0.00132796 | ||||
Settle Bet | 9008758 | 1915 days ago | IN | 0 ETH | 0.00045045 | ||||
Place Bet | 9008755 | 1915 days ago | IN | 0.02 ETH | 0.00132741 | ||||
Withdraw Funds | 9007991 | 1915 days ago | IN | 0 ETH | 0.00044648 | ||||
Settle Bet | 9007543 | 1915 days ago | IN | 0 ETH | 0.00045128 | ||||
Place Bet | 9007541 | 1915 days ago | IN | 0.02 ETH | 0.00132818 | ||||
Settle Bet | 9007537 | 1915 days ago | IN | 0 ETH | 0.00045011 | ||||
Place Bet | 9007536 | 1915 days ago | IN | 0.02 ETH | 0.00132818 | ||||
Settle Bet | 9007394 | 1915 days ago | IN | 0 ETH | 0.00045191 | ||||
Place Bet | 9007392 | 1915 days ago | IN | 0.1 ETH | 0.00133027 | ||||
Settle Bet | 9007387 | 1915 days ago | IN | 0 ETH | 0.00045178 | ||||
Place Bet | 9007386 | 1915 days ago | IN | 0.1 ETH | 0.0013272 | ||||
Settle Bet | 9007381 | 1915 days ago | IN | 0 ETH | 0.00045275 | ||||
Place Bet | 9007380 | 1915 days ago | IN | 0.1 ETH | 0.00132796 | ||||
Settle Bet | 9007375 | 1915 days ago | IN | 0 ETH | 0.00045178 | ||||
Place Bet | 9007373 | 1915 days ago | IN | 0.1 ETH | 0.00132796 | ||||
Settle Bet | 9007368 | 1915 days ago | IN | 0 ETH | 0.00045243 | ||||
Place Bet | 9007365 | 1915 days ago | IN | 0.1 ETH | 0.0013272 | ||||
Settle Bet | 9007361 | 1915 days ago | IN | 0 ETH | 0.00045178 | ||||
Place Bet | 9007359 | 1915 days ago | IN | 0.1 ETH | 0.00132796 | ||||
Settle Bet | 9007347 | 1915 days ago | IN | 0 ETH | 0.00045191 | ||||
Place Bet | 9007345 | 1915 days ago | IN | 0.2 ETH | 0.0013272 | ||||
Settle Bet | 9007345 | 1915 days ago | IN | 0 ETH | 0.00045052 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
9020816 | 1913 days ago | 1.26469741 ETH | ||||
9013816 | 1914 days ago | 1 wei | ||||
9008758 | 1915 days ago | 1 wei | ||||
9007991 | 1915 days ago | 30 ETH | ||||
9007543 | 1915 days ago | 1 wei | ||||
9007537 | 1915 days ago | 0.0394 ETH | ||||
9007394 | 1915 days ago | 0.196 ETH | ||||
9007387 | 1915 days ago | 1 wei | ||||
9007381 | 1915 days ago | 0.294 ETH | ||||
9007375 | 1915 days ago | 1 wei | ||||
9007368 | 1915 days ago | 1 wei | ||||
9007361 | 1915 days ago | 1 wei | ||||
9007347 | 1915 days ago | 0.394 ETH | ||||
9007345 | 1915 days ago | 1 wei | ||||
9007340 | 1915 days ago | 0.099 ETH | ||||
9007328 | 1915 days ago | 0.099 ETH | ||||
9007323 | 1915 days ago | 1 wei | ||||
9005380 | 1915 days ago | 0.1782 ETH | ||||
9005009 | 1915 days ago | 1 wei | ||||
9004060 | 1916 days ago | 0.0394 ETH | ||||
9003813 | 1916 days ago | 0.0194 ETH | ||||
9003684 | 1916 days ago | 0.0394 ETH | ||||
9003284 | 1916 days ago | 0.196 ETH | ||||
9002997 | 1916 days ago | 0.04 ETH | ||||
9002978 | 1916 days ago | 1 wei |
Loading...
Loading
Contract Self Destruct called at Txn Hash 0xdf50f2ca7523be252fef1a92a62ec74a15e5bc7185cc75373a34c7bd2e02cfad
Contract Source Code Verified (Exact Match)
Contract Name:
FomoFeastBet
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-11-17 */ pragma solidity ^0.4.24; // * bet.fomofeast.top - fair games that pay Ether. // // * Uses hybrid commit-reveal + block hash random number generation that is immune // to tampering by players, house and miners. Apart from being fully transparent, // this also allows arbitrarily high bets. contract FomoFeastBet { /// *** Constants section // Each bet is deducted 1% in favour of the house, but no less than some minimum. // The lower bound is dictated by gas costs of the settleBet transaction, providing // headroom for up to 10 Gwei prices. uint constant HOUSE_EDGE_PERCENT = 1; uint constant HOUSE_EDGE_MINIMUM_AMOUNT = 0.0003 ether; // Bets lower than this amount do not participate in jackpot rolls (and are // not deducted JACKPOT_FEE). uint constant MIN_JACKPOT_BET = 0.1 ether; // Chance to win jackpot (currently 0.1%) and fee deducted into jackpot fund. uint constant JACKPOT_MODULO = 1000; uint constant JACKPOT_FEE = 0.001 ether; // There is minimum and maximum bets. uint constant MIN_BET = 0.01 ether; uint constant MAX_AMOUNT = 300000 ether; // Modulo is a number of equiprobable outcomes in a game: // - 2 for coin flip // - 6 for dice // - 6*6 = 36 for double dice // - 100 for etheroll // - 37 for roulette // etc. // It's called so because 256-bit entropy is treated like a huge integer and // the remainder of its division by modulo is considered bet outcome. uint constant MAX_MODULO = 100; // For modulos below this threshold rolls are checked against a bit mask, // thus allowing betting on any combination of outcomes. For example, given // modulo 6 for dice, 101000 mask (base-2, big endian) means betting on // 4 and 6; for games with modulos higher than threshold (Etheroll), a simple // limit is used, allowing betting on any outcome in [0, N) range. // // The specific value is dictated by the fact that 256-bit intermediate // multiplication result allows implementing population count efficiently // for numbers that are up to 42 bits, and 40 is the highest multiple of // eight below 42. uint constant MAX_MASK_MODULO = 40; // This is a check on bet mask overflow. uint constant MAX_BET_MASK = 2 ** MAX_MASK_MODULO; // EVM BLOCKHASH opcode can query no further than 256 blocks into the // past. Given that settleBet uses block hash of placeBet as one of // complementary entropy sources, we cannot process bets older than this // threshold. On rare occasions bet.fomofeast.top croupier may fail to invoke // settleBet in this timespan due to technical issues or extreme Ethereum // congestion; such bets can be refunded via invoking refundBet. uint constant BET_EXPIRATION_BLOCKS = 250; // Some deliberately invalid address to initialize the secret signer with. // Forces maintainers to invoke setSecretSigner before processing any bets. address constant DUMMY_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // Standard contract ownership transfer. address public owner; address private nextOwner; // Adjustable max bet profit. Used to cap bets against dynamic odds. uint public maxProfit; // The address corresponding to a private key used to sign placeBet commits. address public secretSigner; // Accumulated jackpot fund. uint128 public jackpotSize; // Funds that are locked in potentially winning bets. Prevents contract from // committing to bets it cannot pay out. uint128 public lockedInBets; // A structure representing a single bet. struct Bet { // Wager amount in wei. uint amount; // Modulo of a game. uint8 modulo; // Number of winning outcomes, used to compute winning payment (* modulo/rollUnder), // and used instead of mask for games with modulo > MAX_MASK_MODULO. uint8 rollUnder; // Block number of placeBet tx. uint40 placeBlockNumber; // Bit mask representing winning bet outcomes (see MAX_MASK_MODULO comment). uint40 mask; // Address of a gambler, used to pay out winning bets. address gambler; } // Mapping from commits to all currently active & processed bets. mapping (uint => Bet) bets; // Croupier account. address public croupier; // Events that are issued to make statistic recovery easier. event FailedPayment(address indexed beneficiary, uint amount); event Payment(address indexed beneficiary, uint amount); event JackpotPayment(address indexed beneficiary, uint amount); // This event is emitted in placeBet to record commit in the logs. event Commit(uint commit); // Constructor. Deliberately does not take any parameters. constructor () public { owner = msg.sender; secretSigner = DUMMY_ADDRESS; croupier = DUMMY_ADDRESS; } // Standard modifier on methods invokable only by contract owner. modifier onlyOwner { require (msg.sender == owner, "OnlyOwner methods called by non-owner."); _; } // Standard modifier on methods invokable only by contract owner. modifier onlyCroupier { require (msg.sender == croupier, "OnlyCroupier methods called by non-croupier."); _; } // Standard contract ownership transfer implementation, function approveNextOwner(address _nextOwner) external onlyOwner { require (_nextOwner != owner, "Cannot approve current owner."); nextOwner = _nextOwner; } function acceptNextOwner() external { require (msg.sender == nextOwner, "Can only accept preapproved new owner."); owner = nextOwner; } // Fallback function deliberately left empty. It's primary use case // is to top up the bank roll. function () public payable { } // See comment for "secretSigner" variable. function setSecretSigner(address newSecretSigner) external onlyOwner { secretSigner = newSecretSigner; } // Change the croupier address. function setCroupier(address newCroupier) external onlyOwner { croupier = newCroupier; } // Change max bet reward. Setting this to zero effectively disables betting. function setMaxProfit(uint _maxProfit) public onlyOwner { require (_maxProfit < MAX_AMOUNT, "maxProfit should be a sane number."); maxProfit = _maxProfit; } // This function is used to bump up the jackpot fund. Cannot be used to lower it. function increaseJackpot(uint increaseAmount) external onlyOwner { require (increaseAmount <= address(this).balance, "Increase amount larger than balance."); require (jackpotSize + lockedInBets + increaseAmount <= address(this).balance, "Not enough funds."); jackpotSize += uint128(increaseAmount); } // Funds withdrawal to cover costs of bet.fomofeast.top operation. function withdrawFunds(address beneficiary, uint withdrawAmount) external onlyOwner { require (withdrawAmount <= address(this).balance, "Increase amount larger than balance."); require (jackpotSize + lockedInBets + withdrawAmount <= address(this).balance, "Not enough funds."); sendFunds(beneficiary, withdrawAmount, withdrawAmount); } // Contract may be destroyed only when there are no ongoing bets, // either settled or refunded. All funds are transferred to contract owner. function kill() external onlyOwner { require (lockedInBets == 0, "All bets should be processed (settled or refunded) before self-destruct."); selfdestruct(owner); } /// *** Betting logic // Bet states: // amount == 0 && gambler == 0 - 'clean' (can place a bet) // amount != 0 && gambler != 0 - 'active' (can be settled or refunded) // amount == 0 && gambler != 0 - 'processed' (can clean storage) // // NOTE: Storage cleaning is not implemented in this contract version; it will be added // with the next upgrade to prevent polluting Ethereum state with expired bets. // Bet placing transaction - issued by the player. // betMask - bet outcomes bit mask for modulo <= MAX_MASK_MODULO, // [0, betMask) for larger modulos. // modulo - game modulo. // commitLastBlock - number of the maximum block where "commit" is still considered valid. // commit - Keccak256 hash of some secret "reveal" random number, to be supplied // by the bet.fomofeast.top croupier bot in the settleBet transaction. Supplying // "commit" ensures that "reveal" cannot be changed behind the scenes // after placeBet have been mined. // r, s - components of ECDSA signature of (commitLastBlock, commit). v is // guaranteed to always equal 27. // // Commit, being essentially random 256-bit number, is used as a unique bet identifier in // the 'bets' mapping. // // Commits are signed with a block limit to ensure that they are used at most once - otherwise // it would be possible for a miner to place a bet with a known commit/reveal pair and tamper // with the blockhash. Croupier guarantees that commitLastBlock will always be not greater than // placeBet block number plus BET_EXPIRATION_BLOCKS. See whitepaper for details. function checkSecretSigner(uint commitLastBlock, uint commit, uint8 v, bytes32 r, bytes32 s) private view { bytes32 signatureHash = keccak256(abi.encodePacked(uint40(commitLastBlock), commit)); signatureHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", signatureHash)); require (secretSigner == ecrecover(signatureHash, v, r, s), "ECDSA signature is not valid."); } function placeBet(uint betMask, uint modulo, uint commitLastBlock, uint commit, uint8 v, bytes32 r, bytes32 s) external payable { // Check that the bet is in 'clean' state. Bet storage bet = bets[commit]; require (bet.gambler == address(0), "Bet should be in a 'clean' state."); // Validate input data ranges. uint amount = msg.value; require (modulo > 1 && modulo <= MAX_MODULO, "Modulo should be within range."); require (amount >= MIN_BET && amount <= MAX_AMOUNT, "Amount should be within range."); require (betMask > 0 && betMask < MAX_BET_MASK, "Mask should be within range."); // Check that commit is valid - it has not expired and its signature is valid. require (block.number <= commitLastBlock, "Commit has expired."); checkSecretSigner(commitLastBlock, commit, v, r, s); uint rollUnder; uint mask; if (modulo <= MAX_MASK_MODULO) { // Small modulo games specify bet outcomes via bit mask. // rollUnder is a number of 1 bits in this mask (population count). // This magic looking formula is an efficient way to compute population // count on EVM for numbers below 2**40. rollUnder = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO; mask = betMask; } else { // Larger modulos specify the right edge of half-open interval of // winning bet outcomes. require (betMask > 0 && betMask <= modulo, "High modulo range, betMask larger than modulo."); rollUnder = betMask; } // Winning amount and jackpot increase. uint possibleWinAmount; uint jackpotFee; (possibleWinAmount, jackpotFee) = getDiceWinAmount(amount, modulo, rollUnder); // Enforce max profit limit. require (possibleWinAmount <= amount + maxProfit, "maxProfit limit violation."); // Lock funds. lockedInBets += uint128(possibleWinAmount); jackpotSize += uint128(jackpotFee); // Check whether contract has enough funds to process this bet. require (jackpotSize + lockedInBets <= address(this).balance, "Cannot afford to lose this bet."); // Record commit in logs. emit Commit(commit); // Store bet parameters on blockchain. bet.amount = amount; bet.modulo = uint8(modulo); bet.rollUnder = uint8(rollUnder); bet.placeBlockNumber = uint40(block.number); bet.mask = uint40(mask); bet.gambler = msg.sender; } // This is the method used to settle 99% of bets. To process a bet with a specific // "commit", settleBet should supply a "reveal" number that would Keccak256-hash to // "commit". "blockHash" is the block hash of placeBet block as seen by croupier; it // is additionally asserted to prevent changing the bet outcomes on Ethereum reorgs. function settleBet(uint reveal, bytes32 blockHash) external onlyCroupier { uint commit = uint(keccak256(abi.encodePacked(reveal))); Bet storage bet = bets[commit]; uint placeBlockNumber = bet.placeBlockNumber; // Check that bet has not expired yet (see comment to BET_EXPIRATION_BLOCKS). require (block.number > placeBlockNumber, "settleBet in the same block as placeBet, or before."); require (block.number <= placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); require (blockhash(placeBlockNumber) == blockHash); // Settle bet using reveal and blockHash as entropy sources. settleBetCommon(bet, reveal, blockHash); } // This method is used to settle a bet that was mined into an uncle block. At this // point the player was shown some bet outcome, but the blockhash at placeBet height // is different because of Ethereum chain reorg. We supply a full merkle proof of the // placeBet transaction receipt to provide untamperable evidence that uncle block hash // indeed was present on-chain at some point. function settleBetUncleMerkleProof(uint reveal, uint40 canonicalBlockNumber) external onlyCroupier { // "commit" for bet settlement can only be obtained by hashing a "reveal". uint commit = uint(keccak256(abi.encodePacked(reveal))); Bet storage bet = bets[commit]; // Check that canonical block hash can still be verified. require (block.number <= canonicalBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); // Verify placeBet receipt. requireCorrectReceipt(4 + 32 + 32 + 4); // Reconstruct canonical & uncle block hashes from a receipt merkle proof, verify them. bytes32 canonicalHash; bytes32 uncleHash; (canonicalHash, uncleHash) = verifyMerkleProof(commit, 4 + 32 + 32); require (blockhash(canonicalBlockNumber) == canonicalHash); // Settle bet using reveal and uncleHash as entropy sources. settleBetCommon(bet, reveal, uncleHash); } // Common settlement code for settleBet & settleBetUncleMerkleProof. function settleBetCommon(Bet storage bet, uint reveal, bytes32 entropyBlockHash) private { // Fetch bet parameters into local variables (to save gas). uint amount = bet.amount; uint modulo = bet.modulo; uint rollUnder = bet.rollUnder; address gambler = bet.gambler; // Check that bet is in 'active' state. require (amount != 0, "Bet should be in an 'active' state"); // Move bet into 'processed' state already. bet.amount = 0; // The RNG - combine "reveal" and blockhash of placeBet using Keccak256. Miners // are not aware of "reveal" and cannot deduce it from "commit" (as Keccak256 // preimage is intractable), and house is unable to alter the "reveal" after // placeBet have been mined (as Keccak256 collision finding is also intractable). bytes32 entropy = keccak256(abi.encodePacked(reveal, entropyBlockHash)); // Do a roll by taking a modulo of entropy. Compute winning amount. uint dice = uint(entropy) % modulo; uint diceWinAmount; uint _jackpotFee; (diceWinAmount, _jackpotFee) = getDiceWinAmount(amount, modulo, rollUnder); uint diceWin = 0; uint jackpotWin = 0; // Determine dice outcome. if (modulo <= MAX_MASK_MODULO) { // For small modulo games, check the outcome against a bit mask. if ((2 ** dice) & bet.mask != 0) { diceWin = diceWinAmount; } } else { // For larger modulos, check inclusion into half-open interval. if (dice < rollUnder) { diceWin = diceWinAmount; } } // Unlock the bet amount, regardless of the outcome. lockedInBets -= uint128(diceWinAmount); // Roll for a jackpot (if eligible). if (amount >= MIN_JACKPOT_BET) { // The second modulo, statistically independent from the "main" dice roll. // Effectively you are playing two games at once! uint jackpotRng = (uint(entropy) / modulo) % JACKPOT_MODULO; // Bingo! if (jackpotRng == 0) { jackpotWin = jackpotSize; jackpotSize = 0; } } // Log jackpot win. if (jackpotWin > 0) { emit JackpotPayment(gambler, jackpotWin); } // Send the funds to gambler. sendFunds(gambler, diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin, diceWin); } // Refund transaction - return the bet amount of a roll that was not processed in a // due timeframe. Processing such blocks is not possible due to EVM limitations (see // BET_EXPIRATION_BLOCKS comment above for details). In case you ever find yourself // in a situation like this, just contact the bet.fomofeast.top support, however nothing // precludes you from invoking this method yourself. function refundBet(uint commit) external { // Check that bet is in 'active' state. Bet storage bet = bets[commit]; uint amount = bet.amount; require (amount != 0, "Bet should be in an 'active' state"); // Check that bet has already expired. require (block.number > bet.placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); // Move bet into 'processed' state, release funds. bet.amount = 0; uint diceWinAmount; uint jackpotFee; (diceWinAmount, jackpotFee) = getDiceWinAmount(amount, bet.modulo, bet.rollUnder); lockedInBets -= uint128(diceWinAmount); jackpotSize -= uint128(jackpotFee); // Send the refund. sendFunds(bet.gambler, amount, amount); } // Get the expected win amount after house edge is subtracted. function getDiceWinAmount(uint amount, uint modulo, uint rollUnder) private pure returns (uint winAmount, uint jackpotFee) { require (0 < rollUnder && rollUnder <= modulo, "Win probability out of range."); jackpotFee = amount >= MIN_JACKPOT_BET ? JACKPOT_FEE : 0; uint houseEdge = amount * HOUSE_EDGE_PERCENT / 100; if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) { houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT; } require (houseEdge + jackpotFee <= amount, "Bet doesn't even cover house edge."); winAmount = (amount - houseEdge - jackpotFee) * modulo / rollUnder; } // Helper routine to process the payment. function sendFunds(address beneficiary, uint amount, uint successLogAmount) private { if (beneficiary.send(amount)) { emit Payment(beneficiary, successLogAmount); } else { emit FailedPayment(beneficiary, amount); } } // This are some constants making O(1) population count in placeBet possible. // See whitepaper for intuition and proofs behind it. uint constant POPCNT_MULT = 0x0000000000002000000000100000000008000000000400000000020000000001; uint constant POPCNT_MASK = 0x0001041041041041041041041041041041041041041041041041041041041041; uint constant POPCNT_MODULO = 0x3F; // *** Merkle proofs. // This helpers are used to verify cryptographic proofs of placeBet inclusion into // uncle blocks. They are used to prevent bet outcome changing on Ethereum reorgs without // compromising the security of the smart contract. Proof data is appended to the input data // in a simple prefix length format and does not adhere to the ABI. // Invariants checked: // - receipt trie entry contains a (1) successful transaction (2) directed at this smart // contract (3) containing commit as a payload. // - receipt trie entry is a part of a valid merkle proof of a block header // - the block header is a part of uncle list of some block on canonical chain // The implementation is optimized for gas cost and relies on the specifics of Ethereum internal data structures. // Read the whitepaper for details. // Helper to verify a full merkle proof starting from some seedHash (usually commit). "offset" is the location of the proof // beginning in the calldata. function verifyMerkleProof(uint seedHash, uint offset) pure private returns (bytes32 blockHash, bytes32 uncleHash) { // (Safe) assumption - nobody will write into RAM during this method invocation. uint scratchBuf1; assembly { scratchBuf1 := mload(0x40) } uint uncleHeaderLength; uint blobLength; uint shift; uint hashSlot; // Verify merkle proofs up to uncle block header. Calldata layout is: // - 2 byte big-endian slice length // - 2 byte big-endian offset to the beginning of previous slice hash within the current slice (should be zeroed) // - followed by the current slice verbatim for (;; offset += blobLength) { assembly { blobLength := and(calldataload(sub(offset, 30)), 0xffff) } if (blobLength == 0) { // Zero slice length marks the end of uncle proof. break; } assembly { shift := and(calldataload(sub(offset, 28)), 0xffff) } require (shift + 32 <= blobLength, "Shift bounds check."); offset += 4; assembly { hashSlot := calldataload(add(offset, shift)) } require (hashSlot == 0, "Non-empty hash slot."); assembly { calldatacopy(scratchBuf1, offset, blobLength) mstore(add(scratchBuf1, shift), seedHash) seedHash := sha3(scratchBuf1, blobLength) uncleHeaderLength := blobLength } } // At this moment the uncle hash is known. uncleHash = bytes32(seedHash); // Construct the uncle list of a canonical block. uint scratchBuf2 = scratchBuf1 + uncleHeaderLength; uint unclesLength; assembly { unclesLength := and(calldataload(sub(offset, 28)), 0xffff) } uint unclesShift; assembly { unclesShift := and(calldataload(sub(offset, 26)), 0xffff) } require (unclesShift + uncleHeaderLength <= unclesLength, "Shift bounds check."); offset += 6; assembly { calldatacopy(scratchBuf2, offset, unclesLength) } memcpy(scratchBuf2 + unclesShift, scratchBuf1, uncleHeaderLength); assembly { seedHash := sha3(scratchBuf2, unclesLength) } offset += unclesLength; // Verify the canonical block header using the computed sha3Uncles. assembly { blobLength := and(calldataload(sub(offset, 30)), 0xffff) shift := and(calldataload(sub(offset, 28)), 0xffff) } require (shift + 32 <= blobLength, "Shift bounds check."); offset += 4; assembly { hashSlot := calldataload(add(offset, shift)) } require (hashSlot == 0, "Non-empty hash slot."); assembly { calldatacopy(scratchBuf1, offset, blobLength) mstore(add(scratchBuf1, shift), seedHash) // At this moment the canonical block hash is known. blockHash := sha3(scratchBuf1, blobLength) } } // Helper to check the placeBet receipt. "offset" is the location of the proof beginning in the calldata. // RLP layout: [triePath, str([status, cumGasUsed, bloomFilter, [[address, [topics], data]])] function requireCorrectReceipt(uint offset) view private { uint leafHeaderByte; assembly { leafHeaderByte := byte(0, calldataload(offset)) } require (leafHeaderByte >= 0xf7, "Receipt leaf longer than 55 bytes."); offset += leafHeaderByte - 0xf6; uint pathHeaderByte; assembly { pathHeaderByte := byte(0, calldataload(offset)) } if (pathHeaderByte <= 0x7f) { offset += 1; } else { require (pathHeaderByte >= 0x80 && pathHeaderByte <= 0xb7, "Path is an RLP string."); offset += pathHeaderByte - 0x7f; } uint receiptStringHeaderByte; assembly { receiptStringHeaderByte := byte(0, calldataload(offset)) } require (receiptStringHeaderByte == 0xb9, "Receipt string is always at least 256 bytes long, but less than 64k."); offset += 3; uint receiptHeaderByte; assembly { receiptHeaderByte := byte(0, calldataload(offset)) } require (receiptHeaderByte == 0xf9, "Receipt is always at least 256 bytes long, but less than 64k."); offset += 3; uint statusByte; assembly { statusByte := byte(0, calldataload(offset)) } require (statusByte == 0x1, "Status should be success."); offset += 1; uint cumGasHeaderByte; assembly { cumGasHeaderByte := byte(0, calldataload(offset)) } if (cumGasHeaderByte <= 0x7f) { offset += 1; } else { require (cumGasHeaderByte >= 0x80 && cumGasHeaderByte <= 0xb7, "Cumulative gas is an RLP string."); offset += cumGasHeaderByte - 0x7f; } uint bloomHeaderByte; assembly { bloomHeaderByte := byte(0, calldataload(offset)) } require (bloomHeaderByte == 0xb9, "Bloom filter is always 256 bytes long."); offset += 256 + 3; uint logsListHeaderByte; assembly { logsListHeaderByte := byte(0, calldataload(offset)) } require (logsListHeaderByte == 0xf8, "Logs list is less than 256 bytes long."); offset += 2; uint logEntryHeaderByte; assembly { logEntryHeaderByte := byte(0, calldataload(offset)) } require (logEntryHeaderByte == 0xf8, "Log entry is less than 256 bytes long."); offset += 2; uint addressHeaderByte; assembly { addressHeaderByte := byte(0, calldataload(offset)) } require (addressHeaderByte == 0x94, "Address is 20 bytes long."); uint logAddress; assembly { logAddress := and(calldataload(sub(offset, 11)), 0xffffffffffffffffffffffffffffffffffffffff) } require (logAddress == uint(address(this))); } // Memory copy. function memcpy(uint dest, uint src, uint len) pure private { // Full 32 byte words for(; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secretSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jackpotSize","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"croupier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"},{"name":"canonicalBlockNumber","type":"uint40"}],"name":"settleBetUncleMerkleProof","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"betMask","type":"uint256"},{"name":"modulo","type":"uint256"},{"name":"commitLastBlock","type":"uint256"},{"name":"commit","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxProfit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"},{"name":"blockHash","type":"bytes32"}],"name":"settleBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nextOwner","type":"address"}],"name":"approveNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"increaseAmount","type":"uint256"}],"name":"increaseJackpot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newSecretSigner","type":"address"}],"name":"setSecretSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lockedInBets","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"commit","type":"uint256"}],"name":"refundBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCroupier","type":"address"}],"name":"setCroupier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxProfit","type":"uint256"}],"name":"setMaxProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"FailedPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Payment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"JackpotPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"commit","type":"uint256"}],"name":"Commit","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506138248061010a6000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b5146100fe5780634d61537f1461011557806357246d231461016c5780636b5c5f39146101bb57806374e048d5146102125780637cee9ee8146102505780638da5cb5b146102b7578063b539cd551461030e578063c107532914610339578063ca722cdc14610386578063d06c54fb146103c1578063d579fd44146103d8578063d6d30a511461041b578063d702087f14610448578063df88126f1461048b578063e1fdb4b4146104da578063f8bb201c14610507578063fbd668a91461054a575b005b34801561010a57600080fd5b50610113610577565b005b34801561012157600080fd5b5061012a61078f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561017857600080fd5b506101816107b5565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101c757600080fd5b506101d06107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561021e57600080fd5b5061024e60048036038101908080359060200190929190803564ffffffffff1690602001909291905050506107fd565b005b6102b560048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050610a81565b005b3480156102c357600080fd5b506102cc6111fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031a57600080fd5b5061032361121f565b6040518082815260200191505060405180910390f35b34801561034557600080fd5b50610384600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611225565b005b34801561039257600080fd5b506103bf6004803603810190808035906020019092919080356000191690602001909291905050506114b4565b005b3480156103cd57600080fd5b506103d66117c7565b005b3480156103e457600080fd5b50610419600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611916565b005b34801561042757600080fd5b5061044660048036038101908080359060200190929190505050611b09565b005b34801561045457600080fd5b50610489600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611de6565b005b34801561049757600080fd5b506104a0611f14565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104e657600080fd5b5061050560048036038101908080359060200190929190505050611f36565b005b34801561051357600080fd5b50610548600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121e2565b005b34801561055657600080fd5b5061057560048036038101908080359060200190929190505050612310565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600460109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16141515610755576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001807f416c6c20626574732073686f756c642062652070726f6365737365642028736581526020017f74746c6564206f7220726566756e64656429206265666f72652073656c662d6481526020017f657374727563742e00000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b85604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515610943578051825260208201915060208101905060208303925061091e565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004935060056000858152602001908152602001600020925060fa8564ffffffffff16014311151515610a33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610a3d60486124ab565b610a48846044612b91565b809250819350505081600019168564ffffffffff164060001916141515610a6e57600080fd5b610a79838783612ed2565b505050505050565b600080600080600080600560008b81526020019081526020016000209550600073ffffffffffffffffffffffffffffffffffffffff1686600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b34945060018c118015610ba1575060648c11155b1515610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b662386f26fc100008510158015610c365750693f870857a3e0e38000008511155b1515610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008d118015610cbd5750602860020a8d105b1515610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b8a4311151515610da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f436f6d6d69742068617320657870697265642e0000000000000000000000000081525060200191505060405180910390fd5b610db68b8b8b8b8b61327d565b60288c111515610e1457603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018f0216811515610e0957fe5b0693508c9250610ec2565b60008d118015610e2457508b8d11155b1515610ebe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b8c93505b610ecd858d86613538565b809250819350505060025485018211151515610f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e00000000000081525060200191505060405180910390fd5b81600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff16111515156110e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878a6040518082815260200191505060405180910390a18486600001819055508b8660010160006101000a81548160ff021916908360ff160217905550838660010160016101000a81548160ff021916908360ff160217905550438660010160026101000a81548164ffffffffff021916908364ffffffffff160217905550828660010160076101000a81548164ffffffffff021916908364ffffffffff1602179055503386600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561130f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1601111515156114a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b6114b08282836136cc565b5050565b6000806000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b84604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156115f957805182526020820191506020810190506020830392506115d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900492506005600084815260200190815260200160002091508160010160029054906101000a900464ffffffffff1664ffffffffff16905080431115156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f736574746c6542657420696e207468652073616d6520626c6f636b206173207081526020017f6c6163654265742c206f72206265666f72652e0000000000000000000000000081525060400191505060405180910390fd5b60fa8101431115151561179e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b83600019168140600019161415156117b557600080fd5b6117c0828686612ed2565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e206f6e6c792061636365707420707265617070726f766564206e65772081526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ac5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420617070726f76652063757272656e74206f776e65722e00000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16318111151515611ca8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611d89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b80600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ed0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000806005600086815260200190815260200160002093508360000154925060008314151515611ff7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60fa8460010160029054906101000a900464ffffffffff1664ffffffffff1601431115156120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600084600001819055506120f0838560010160009054906101000a900460ff1660ff168660010160019054906101000a900460ff1660ff16613538565b809250819350505081600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506121db84600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684856136cc565b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b693f870857a3e0e3800000811015156124a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d617850726f6669742073686f756c6420626520612073616e65206e756d626581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60008060008060008060008060008060008b3560001a9a5060f78b10151515612562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f52656365697074206c656166206c6f6e676572207468616e203535206279746581526020017f732e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60f68b038c019b508b3560001a9950607f8a1115156125865760018c019b50612615565b60808a10158015612598575060b78a11155b151561260c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061746820697320616e20524c5020737472696e672e0000000000000000000081525060200191505060405180910390fd5b607f8a038c019b505b8b3560001a985060b9891415156126e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f5265636569707420737472696e6720697320616c77617973206174206c65617381526020017f7420323536206279746573206c6f6e672c20627574206c657373207468616e2081526020017f36346b2e0000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60038c019b508b3560001a975060f98814151561278b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f5265636569707420697320616c77617973206174206c6561737420323536206281526020017f79746573206c6f6e672c20627574206c657373207468616e2036346b2e00000081525060400191505060405180910390fd5b60038c019b508b3560001a9650600187141515612810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374617475732073686f756c6420626520737563636573732e0000000000000081525060200191505060405180910390fd5b60018c019b508b3560001a9550607f861115156128325760018c019b506128c1565b60808610158015612844575060b78611155b15156128b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43756d756c61746976652067617320697320616e20524c5020737472696e672e81525060200191505060405180910390fd5b607f86038c019b505b8b3560001a945060b985141515612966576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f426c6f6f6d2066696c74657220697320616c776179732032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6101038c019b508b3560001a935060f884141515612a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6773206c697374206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a925060f883141515612abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6720656e747279206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a9150609482141515612b42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973203230206279746573206c6f6e672e0000000000000081525060200191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff1681141515612b8357600080fd5b505050505050505050505050565b60008060008060008060008060008060405197505b61ffff601e8c03351695506000861415612bbf57612ce4565b61ffff601c8c0335169450856020860111151515612c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515612cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b858901528588209b50859650858b019a50612ba6565b8b6001029850868801925061ffff601c8c033516915061ffff601a8c03351690508187820111151515612d7f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60068b019a50818b8437612d9681840189896137ad565b8183209b50818b019a5061ffff601e8c033516955061ffff601c8c0335169450856020860111151515612e31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515612eb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008060008060008060008060008060008d600001549a508d60010160009054906101000a900460ff1660ff1699508d60010160019054906101000a900460ff1660ff1698508d600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16975060008b14151515612fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008e600001819055508c8c604051602001808381526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310151561304d5780518252602082019150602081019050602083039250613028565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020965089876001900481151561308b57fe5b0695506130998b8b8b613538565b8095508196505050600092506000915060288a1115156130e75760008e60010160079054906101000a900464ffffffffff1664ffffffffff168760020a161415156130e2578492505b6130f4565b888610156130f3578492505b5b84600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555067016345785d8a00008b1015156131f6576103e88a886001900481151561317157fe5b0481151561317b57fe5b06905060008114156131f557600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506000600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5b600082111561324e578773ffffffffffffffffffffffffffffffffffffffff167fc388db0e8aa560a59633c094a0d0aa21322cd6234836fd5bac00fc5ae63b5783836040518082815260200191505060405180910390a25b61326d8860008486011461326457838501613267565b60015b856136cc565b5050505050505050505050505050565b60008585604051602001808364ffffffffff1664ffffffffff167b01000000000000000000000000000000000000000000000000000000028152600501828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310151561330857805182526020820191506020810190506020830392506132e3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902090508060405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156133bc5780518252602082019150602081019050602083039250613397565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600181858585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015613462573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4543445341207369676e6174757265206973206e6f742076616c69642e00000081525060200191505060405180910390fd5b505050505050565b600080600083600010801561354d5750848411155b15156135c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57696e2070726f626162696c697479206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b67016345785d8a00008610156135d85760006135e1565b66038d7ea4c680005b91506064600187028115156135f257fe5b049050660110d9316ec00081101561360f57660110d9316ec00090505b85828201111515156136af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f42657420646f65736e2774206576656e20636f76657220686f7573652065646781526020017f652e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b83858383890303028115156136c057fe5b04925050935093915050565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015613759578273ffffffffffffffffffffffffffffffffffffffff167fd4f43975feb89f48dd30cabbb32011045be187d1e11c8ea9faa43efc35282519826040518082815260200191505060405180910390a26137a8565b8273ffffffffffffffffffffffffffffffffffffffff167fac464fe4d3a86b9121261ac0a01dd981bfe0777c7c9d9c8f4473d31a9c0f9d2d836040518082815260200191505060405180910390a25b505050565b60005b6020821015156137d557825184526020840193506020830192506020820391506137b0565b6001826020036101000a03905080198351168185511681811786525050505050505600a165627a7a72305820da2a108470a513a4646f3e95dff089ad6b9ae2b62c45fae43008e0deef2bf7e10029
Deployed Bytecode
0x6080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b5146100fe5780634d61537f1461011557806357246d231461016c5780636b5c5f39146101bb57806374e048d5146102125780637cee9ee8146102505780638da5cb5b146102b7578063b539cd551461030e578063c107532914610339578063ca722cdc14610386578063d06c54fb146103c1578063d579fd44146103d8578063d6d30a511461041b578063d702087f14610448578063df88126f1461048b578063e1fdb4b4146104da578063f8bb201c14610507578063fbd668a91461054a575b005b34801561010a57600080fd5b50610113610577565b005b34801561012157600080fd5b5061012a61078f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561017857600080fd5b506101816107b5565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101c757600080fd5b506101d06107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561021e57600080fd5b5061024e60048036038101908080359060200190929190803564ffffffffff1690602001909291905050506107fd565b005b6102b560048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050610a81565b005b3480156102c357600080fd5b506102cc6111fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031a57600080fd5b5061032361121f565b6040518082815260200191505060405180910390f35b34801561034557600080fd5b50610384600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611225565b005b34801561039257600080fd5b506103bf6004803603810190808035906020019092919080356000191690602001909291905050506114b4565b005b3480156103cd57600080fd5b506103d66117c7565b005b3480156103e457600080fd5b50610419600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611916565b005b34801561042757600080fd5b5061044660048036038101908080359060200190929190505050611b09565b005b34801561045457600080fd5b50610489600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611de6565b005b34801561049757600080fd5b506104a0611f14565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104e657600080fd5b5061050560048036038101908080359060200190929190505050611f36565b005b34801561051357600080fd5b50610548600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121e2565b005b34801561055657600080fd5b5061057560048036038101908080359060200190929190505050612310565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600460109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16141515610755576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001807f416c6c20626574732073686f756c642062652070726f6365737365642028736581526020017f74746c6564206f7220726566756e64656429206265666f72652073656c662d6481526020017f657374727563742e00000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a90046fffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b85604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515610943578051825260208201915060208101905060208303925061091e565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004935060056000858152602001908152602001600020925060fa8564ffffffffff16014311151515610a33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610a3d60486124ab565b610a48846044612b91565b809250819350505081600019168564ffffffffff164060001916141515610a6e57600080fd5b610a79838783612ed2565b505050505050565b600080600080600080600560008b81526020019081526020016000209550600073ffffffffffffffffffffffffffffffffffffffff1686600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610b8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b34945060018c118015610ba1575060648c11155b1515610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b662386f26fc100008510158015610c365750693f870857a3e0e38000008511155b1515610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008d118015610cbd5750602860020a8d105b1515610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b8a4311151515610da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f436f6d6d69742068617320657870697265642e0000000000000000000000000081525060200191505060405180910390fd5b610db68b8b8b8b8b61327d565b60288c111515610e1457603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018f0216811515610e0957fe5b0693508c9250610ec2565b60008d118015610e2457508b8d11155b1515610ebe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b8c93505b610ecd858d86613538565b809250819350505060025485018211151515610f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e00000000000081525060200191505060405180910390fd5b81600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff16111515156110e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878a6040518082815260200191505060405180910390a18486600001819055508b8660010160006101000a81548160ff021916908360ff160217905550838660010160016101000a81548160ff021916908360ff160217905550438660010160026101000a81548164ffffffffff021916908364ffffffffff160217905550828660010160076101000a81548164ffffffffff021916908364ffffffffff1602179055503386600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561130f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff1601111515156114a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b6114b08282836136cc565b5050565b6000806000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b84604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156115f957805182526020820191506020810190506020830392506115d4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900492506005600084815260200190815260200160002091508160010160029054906101000a900464ffffffffff1664ffffffffff16905080431115156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f736574746c6542657420696e207468652073616d6520626c6f636b206173207081526020017f6c6163654265742c206f72206265666f72652e0000000000000000000000000081525060400191505060405180910390fd5b60fa8101431115151561179e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b83600019168140600019161415156117b557600080fd5b6117c0828686612ed2565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e206f6e6c792061636365707420707265617070726f766564206e65772081526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ac5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420617070726f76652063757272656e74206f776e65722e00000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16318111151515611ca8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611d89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b80600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ed0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000806005600086815260200190815260200160002093508360000154925060008314151515611ff7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60fa8460010160029054906101000a900464ffffffffff1664ffffffffff1601431115156120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600084600001819055506120f0838560010160009054906101000a900460ff1660ff168660010160019054906101000a900460ff1660ff16613538565b809250819350505081600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506121db84600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684856136cc565b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b693f870857a3e0e3800000811015156124a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d617850726f6669742073686f756c6420626520612073616e65206e756d626581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60008060008060008060008060008060008b3560001a9a5060f78b10151515612562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f52656365697074206c656166206c6f6e676572207468616e203535206279746581526020017f732e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60f68b038c019b508b3560001a9950607f8a1115156125865760018c019b50612615565b60808a10158015612598575060b78a11155b151561260c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061746820697320616e20524c5020737472696e672e0000000000000000000081525060200191505060405180910390fd5b607f8a038c019b505b8b3560001a985060b9891415156126e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f5265636569707420737472696e6720697320616c77617973206174206c65617381526020017f7420323536206279746573206c6f6e672c20627574206c657373207468616e2081526020017f36346b2e0000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60038c019b508b3560001a975060f98814151561278b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f5265636569707420697320616c77617973206174206c6561737420323536206281526020017f79746573206c6f6e672c20627574206c657373207468616e2036346b2e00000081525060400191505060405180910390fd5b60038c019b508b3560001a9650600187141515612810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374617475732073686f756c6420626520737563636573732e0000000000000081525060200191505060405180910390fd5b60018c019b508b3560001a9550607f861115156128325760018c019b506128c1565b60808610158015612844575060b78611155b15156128b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43756d756c61746976652067617320697320616e20524c5020737472696e672e81525060200191505060405180910390fd5b607f86038c019b505b8b3560001a945060b985141515612966576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f426c6f6f6d2066696c74657220697320616c776179732032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6101038c019b508b3560001a935060f884141515612a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6773206c697374206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a925060f883141515612abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6720656e747279206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a9150609482141515612b42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973203230206279746573206c6f6e672e0000000000000081525060200191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff1681141515612b8357600080fd5b505050505050505050505050565b60008060008060008060008060008060405197505b61ffff601e8c03351695506000861415612bbf57612ce4565b61ffff601c8c0335169450856020860111151515612c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515612cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b858901528588209b50859650858b019a50612ba6565b8b6001029850868801925061ffff601c8c033516915061ffff601a8c03351690508187820111151515612d7f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60068b019a50818b8437612d9681840189896137ad565b8183209b50818b019a5061ffff601e8c033516955061ffff601c8c0335169450856020860111151515612e31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515612eb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008060008060008060008060008060008d600001549a508d60010160009054906101000a900460ff1660ff1699508d60010160019054906101000a900460ff1660ff1698508d600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16975060008b14151515612fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008e600001819055508c8c604051602001808381526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310151561304d5780518252602082019150602081019050602083039250613028565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020965089876001900481151561308b57fe5b0695506130998b8b8b613538565b8095508196505050600092506000915060288a1115156130e75760008e60010160079054906101000a900464ffffffffff1664ffffffffff168760020a161415156130e2578492505b6130f4565b888610156130f3578492505b5b84600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555067016345785d8a00008b1015156131f6576103e88a886001900481151561317157fe5b0481151561317b57fe5b06905060008114156131f557600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506000600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5b600082111561324e578773ffffffffffffffffffffffffffffffffffffffff167fc388db0e8aa560a59633c094a0d0aa21322cd6234836fd5bac00fc5ae63b5783836040518082815260200191505060405180910390a25b61326d8860008486011461326457838501613267565b60015b856136cc565b5050505050505050505050505050565b60008585604051602001808364ffffffffff1664ffffffffff167b01000000000000000000000000000000000000000000000000000000028152600501828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310151561330857805182526020820191506020810190506020830392506132e3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902090508060405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156133bc5780518252602082019150602081019050602083039250613397565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600181858585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015613462573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4543445341207369676e6174757265206973206e6f742076616c69642e00000081525060200191505060405180910390fd5b505050505050565b600080600083600010801561354d5750848411155b15156135c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57696e2070726f626162696c697479206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b67016345785d8a00008610156135d85760006135e1565b66038d7ea4c680005b91506064600187028115156135f257fe5b049050660110d9316ec00081101561360f57660110d9316ec00090505b85828201111515156136af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f42657420646f65736e2774206576656e20636f76657220686f7573652065646781526020017f652e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b83858383890303028115156136c057fe5b04925050935093915050565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015613759578273ffffffffffffffffffffffffffffffffffffffff167fd4f43975feb89f48dd30cabbb32011045be187d1e11c8ea9faa43efc35282519826040518082815260200191505060405180910390a26137a8565b8273ffffffffffffffffffffffffffffffffffffffff167fac464fe4d3a86b9121261ac0a01dd981bfe0777c7c9d9c8f4473d31a9c0f9d2d836040518082815260200191505060405180910390a25b505050565b60005b6020821015156137d557825184526020840193506020830192506020820391506137b0565b6001826020036101000a03905080198351168185511681811786525050505050505600a165627a7a72305820da2a108470a513a4646f3e95dff089ad6b9ae2b62c45fae43008e0deef2bf7e10029
Deployed Bytecode Sourcemap
303:27863:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7684:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7684:187:0;;;;;;3425:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3425:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3495:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3495:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4479:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4479:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14307:1004;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14307:1004:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10128:2655;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3178:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3178:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3313:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3313:21:0;;;;;;;;;;;;;;;;;;;;;;;7157:367;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7157:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13148:739;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13148:739:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5749:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5749:158:0;;;;;;5562:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5562:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6745:332;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6745:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;6116:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6116:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3658:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3658:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18426:826;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18426:826:0;;;;;;;;;;;;;;;;;;;;;;;;;;6279:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6279:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6471:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6471:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;7684:187;5213:5;;;;;;;;;;;5199:19;;:10;:19;;;5190:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7755:1;7739:12;;;;;;;;;;;:17;;;7730:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7857:5;;;;;;;;;;;7844:19;;;3425:27;;;;;;;;;;;;;:::o;3495:26::-;;;;;;;;;;;;;:::o;4479:23::-;;;;;;;;;;;;;:::o;14307:1004::-;14501:11;14569:15;14985:21;15017:17;5416:8;;;;;;;;;;;5402:22;;:10;:22;;;5393:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14547:6;14530:24;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14530:24:0;;;14520:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14520:35:0;;;;;;;;;;;;;;;;14515:41;;;14501:55;;14587:4;:12;14592:6;14587:12;;;;;;;;;;;14569:30;;2875:3;14704:20;:44;;;14688:12;:60;;14679:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14837:38;14859:15;14837:21;:38::i;:::-;15074;15092:6;15100:11;15074:17;:38::i;:::-;15045:67;;;;;;;;15167:13;15132:48;;;15142:20;15132:31;;;:48;;;;15123:58;;;;;;;;15264:39;15280:3;15285:6;15293:9;15264:15;:39::i;:::-;14307:1004;;;;;;:::o;10128:2655::-;10319:15;10485:11;11023:14;11048:9;11851:22;11884:15;10337:4;:12;10342:6;10337:12;;;;;;;;;;;10319:30;;10392:1;10369:25;;:3;:11;;;;;;;;;;;;:25;;;10360:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10499:9;10485:23;;10537:1;10528:6;:10;:34;;;;;1562:3;10542:6;:20;;10528:34;10519:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1096:10;10617:6;:17;;:41;;;;;1140:12;10638:6;:20;;10617:41;10608:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10723:1;10713:7;:11;:37;;;;;2264:2;2350:1;:20;10728:7;:22;10713:37;10704:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10909:15;10893:12;:31;;10884:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10959:51;10977:15;10994:6;11002:1;11005;11008;10959:17;:51::i;:::-;2264:2;11074:6;:25;;11070:720;;;20681:4;20578:66;20477;11420:7;:21;11419:37;11418:55;;;;;;;;11406:67;;11495:7;11488:14;;11070:720;;;11671:1;11661:7;:11;:32;;;;;11687:6;11676:7;:17;;11661:32;11652:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11771:7;11759:19;;11070:720;11946:43;11963:6;11971;11979:9;11946:16;:43::i;:::-;11912:77;;;;;;;;12079:9;;12070:6;:18;12049:17;:39;;12040:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12180:17;12156:12;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12232:10;12209:11;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12376:4;12368:21;;;12352:12;;;;;;;;;;;12338:11;;;;;;;;;;;:26;:51;;;;12329:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12478:14;12485:6;12478:14;;;;;;;;;;;;;;;;;;12566:6;12553:3;:10;;:19;;;;12602:6;12583:3;:10;;;:26;;;;;;;;;;;;;;;;;;12642:9;12620:3;:13;;;:32;;;;;;;;;;;;;;;;;;12693:12;12663:3;:20;;;:43;;;;;;;;;;;;;;;;;;12735:4;12717:3;:8;;;:23;;;;;;;;;;;;;;;;;;12765:10;12751:3;:11;;;:24;;;;;;;;;;;;;;;;;;10128:2655;;;;;;;;;;;;;:::o;3178:20::-;;;;;;;;;;;;;:::o;3313:21::-;;;;:::o;7157:367::-;5213:5;;;;;;;;;;;5199:19;;:10;:19;;;5190:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7287:4;7279:21;;;7261:14;:39;;7252:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7416:4;7408:21;;;7390:14;7375:12;;;;;;;;;;;7361:11;;;;;;;;;;;:26;:43;;;:68;;7352:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7462:54;7472:11;7485:14;7501;7462:9;:54::i;:::-;7157:367;;:::o;13148:739::-;13232:11;13300:15;13341:21;5416:8;;;;;;;;;;;5402:22;;:10;:22;;;5393:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13278:6;13261:24;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13261:24:0;;;13251:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;13251:35:0;;;;;;;;;;;;;;;;13246:41;;;13232:55;;13318:4;:12;13323:6;13318:12;;;;;;;;;;;13300:30;;13365:3;:20;;;;;;;;;;;;13341:44;;;;13509:16;13494:12;:31;13485:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2875:3;13617:16;:40;13601:12;:56;;13592:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13747:9;13716:40;;;13726:16;13716:27;:40;;;;13707:50;;;;;;;;13840:39;13856:3;13861:6;13869:9;13840:15;:39::i;:::-;13148:739;;;;;:::o;5749:158::-;5819:9;;;;;;;;;;;5805:23;;:10;:23;;;5796:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5890:9;;;;;;;;;;;5882:5;;:17;;;;;;;;;;;;;;;;;;5749:158::o;5562:179::-;5213:5;;;;;;;;;;;5199:19;;:10;:19;;;5190:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5661:5;;;;;;;;;;;5647:19;;:10;:19;;;;5638:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5723:10;5711:9;;:22;;;;;;;;;;;;;;;;;;5562:179;:::o;6745:332::-;5213:5;;;;;;;;;;;5199:19;;:10;:19;;;5190:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6856:4;6848:21;;;6830:14;:39;;6821:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6985:4;6977:21;;;6959:14;6944:12;;;;;;;;;;;6930:11;;;;;;;;;;;:26;:43;;;:68;;6921:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7054:14;7031:11;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6745:332;:::o;6116:118::-;5213:5;;;;;;;;;;;5199:19;;:10;:19;;;5190:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6211:15;6196:12;;:30;;;;;;;;;;;;;;;;;;6116:118;:::o;3658:27::-;;;;;;;;;;;;;:::o;18426:826::-;18527:15;18568:11;18932:18;18961:15;18545:4;:12;18550:6;18545:12;;;;;;;;;;;18527:30;;18582:3;:10;;;18568:24;;18624:1;18614:6;:11;;18605:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2875:3;18749;:20;;;;;;;;;;;;:44;;;18734:12;:59;18725:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18918:1;18905:3;:10;;:14;;;;19017:51;19034:6;19042:3;:10;;;;;;;;;;;;19017:51;;19054:3;:13;;;;;;;;;;;;19017:51;;:16;:51::i;:::-;18987:81;;;;;;;;19105:13;19081:12;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19153:10;19130:11;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19206:38;19216:3;:11;;;;;;;;;;;;19229:6;19237;19206:9;:38::i;:::-;18426:826;;;;;:::o;6279:102::-;5213:5;;;;;;;;;;;5199:19;;:10;:19;;;5190:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6362:11;6351:8;;:22;;;;;;;;;;;;;;;;;;6279:102;:::o;6471:179::-;5213:5;;;;;;;;;;;5199:19;;:10;:19;;;5190:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1140:12;6547:10;:23;6538:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6632:10;6620:9;:22;;;;6471:179;:::o;25006:2631::-;25074:19;25292;25628:28;25885:22;26117:15;26291:21;26647:20;26856:23;27068;27280:22;27454:15;25145:6;25132:20;25129:1;25124:29;25106:47;;25194:4;25176:14;:22;;25167:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25275:4;25258:14;:21;25248:31;;;;25363:6;25350:20;25347:1;25342:29;25324:47;;25407:4;25389:14;:22;;25385:231;;;25438:1;25428:11;;;;25385:231;;;25501:4;25483:14;:22;;:48;;;;;25527:4;25509:14;:22;;25483:48;25474:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25600:4;25583:14;:21;25573:31;;;;25385:231;25717:6;25704:20;25701:1;25696:29;25669:56;;25773:4;25746:23;:31;25737:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25871:1;25861:11;;;;25962:6;25949:20;25946:1;25941:29;25920:50;;26012:4;25991:17;:25;25982:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26103:1;26093:11;;;;26180:6;26167:20;26164:1;26159:29;26145:43;;26223:3;26209:10;:17;26200:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26277:1;26267:11;;;;26366:6;26353:20;26350:1;26345:29;26325:49;;26410:4;26390:16;:24;;26386:249;;;26441:1;26431:11;;;;26386:249;;;26506:4;26486:16;:24;;:52;;;;;26534:4;26514:16;:24;;26486:52;26477:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26619:4;26600:16;:23;26590:33;;;;26386:249;26720:6;26707:20;26704:1;26699:29;26680:48;;26768:4;26749:15;:23;26740:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26836:7;26826:17;;;;26935:6;26922:20;26919:1;26914:29;26892:51;;26986:4;26964:18;:26;26955:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27054:1;27044:11;;;;27147:6;27134:20;27131:1;27126:29;27104:51;;27198:4;27176:18;:26;27167:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27266:1;27256:11;;;;27357:6;27344:20;27341:1;27336:29;27315:50;;27407:4;27386:17;:25;27377:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27531:42;27525:2;27517:6;27513:15;27500:29;27496:78;27482:92;;27622:4;27609:19;;27595:10;:33;27586:43;;;;;;;;25006:2631;;;;;;;;;;;;:::o;21749:3039::-;21826:17;21845;21965:16;22035:22;22059:15;22076:10;22088:13;23434:16;23495:17;23595:16;22016:4;22010:11;21995:26;;22417:852;22522:6;22516:2;22508:6;22504:15;22491:29;22487:42;22473:56;;22563:1;22549:10;:15;22545:129;;;22653:5;;22545:129;22745:6;22739:2;22731:6;22727:15;22714:29;22710:42;22701:51;;22791:10;22785:2;22777:5;:10;:24;;22768:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22852:1;22842:11;;;;22916:5;22908:6;22904:18;22891:32;22879:44;;22960:1;22948:8;:13;22939:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23065:10;23057:6;23044:11;23031:45;23126:8;23118:5;23105:11;23101:23;23094:41;23183:10;23170:11;23165:29;23153:41;;23233:10;23212:31;;22435:10;22425:20;;;;22417:852;;;23353:8;23345:17;;23333:29;;23467:17;23453:11;:31;23434:50;;23576:6;23570:2;23562:6;23558:15;23545:29;23541:42;23525:58;;23675:6;23669:2;23661:6;23657:15;23644:29;23640:42;23625:57;;23738:12;23717:17;23703:11;:31;:47;;23694:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23797:1;23787:11;;;;23854:12;23846:6;23833:11;23820:47;23879:65;23900:11;23886;:25;23913:11;23926:17;23879:6;:65::i;:::-;23998:12;23985:11;23980:31;23968:43;;24035:12;24025:22;;;;24210:6;24204:2;24196:6;24192:15;24179:29;24175:42;24161:56;;24275:6;24269:2;24261:6;24257:15;24244:29;24240:42;24231:51;;24326:10;24320:2;24312:5;:10;:24;;24303:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24383:1;24373:11;;;;24443:5;24435:6;24431:18;24418:32;24406:44;;24483:1;24471:8;:13;24462:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24580:10;24572:6;24559:11;24546:45;24637:8;24629:5;24616:11;24612:23;24605:41;24759:10;24746:11;24741:29;24728:42;;24531:250;;;;;;;;;;;;;:::o;15393:2605::-;15562:11;15597;15632:14;15673:15;16269;16430:9;16477:18;16506:16;16620:12;16647:15;17502;15576:3;:10;;;15562:24;;15611:3;:10;;;;;;;;;;;;15597:24;;;;15649:3;:13;;;;;;;;;;;;15632:30;;;;15691:3;:11;;;;;;;;;;;;15673:29;;15783:1;15773:6;:11;;15764:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15902:1;15889:3;:10;;:14;;;;16314:6;16322:16;16297:42;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16297:42:0;;;16287:53;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;16287:53:0;;;;;;;;;;;;;;;;16269:71;;16458:6;16447:7;16442:13;;;:22;;;;;;;;16430:34;;16564:43;16581:6;16589;16597:9;16564:16;:43::i;:::-;16533:74;;;;;;;;16635:1;16620:16;;16665:1;16647:19;;2264:2;16719:6;:25;;16715:419;;;16869:1;16857:3;:8;;;;;;;;;;;;16843:22;;16849:4;16844:1;:9;16843:22;:27;;16839:91;;;16901:13;16891:23;;16839:91;16715:419;;;17052:9;17045:4;:16;17041:80;;;17092:13;17082:23;;17041:80;16715:419;17232:13;17208:12;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;838:9;17309:6;:25;;17305:421;;;970:4;17537:6;17526:7;17521:13;;;:22;;;;;;;;17520:41;;;;;;;;17502:59;;17619:1;17605:10;:15;17601:114;;;17654:11;;;;;;;;;;;17641:24;;;;17698:1;17684:11;;:15;;;;;;;;;;;;;;;;;;17601:114;17305:421;17784:1;17771:10;:14;17767:87;;;17822:7;17807:35;;;17831:10;17807:35;;;;;;;;;;;;;;;;;;17767:87;17905:85;17915:7;17948:1;17934:10;17924:7;:20;:25;:56;;17970:10;17960:7;:20;17924:56;;;17952:5;17924:56;17982:7;17905:9;:85::i;:::-;15393:2605;;;;;;;;;;;;;;:::o;9699:417::-;9816:21;9874:15;9892:6;9850:49;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9850::0;;;9840:60;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9840:60:0;;;;;;;;;;;;;;;;9816:84;;9990:13;9937:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9937:67:0;;;9927:78;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9927:78:0;;;;;;;;;;;;;;;;9911:94;;10041:33;10051:13;10066:1;10069;10072;10041:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10041:33:0;;;;;;;;10025:49;;:12;;;;;;;;;;;:49;;;10016:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9699:417;;;;;;:::o;19328:642::-;19418:14;19434:15;19623:14;19475:9;19471:1;:13;:36;;;;;19501:6;19488:9;:19;;19471:36;19462:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;838:9;19567:6;:25;;:43;;19609:1;19567:43;;;1009:11;19567:43;19554:56;;19670:3;619:1;19640:6;:27;:33;;;;;;;;19623:50;;669:12;19690:9;:37;19686:107;;;669:12;19744:37;;19686:107;19840:6;19826:10;19814:9;:22;:32;;19805:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19953:9;19944:6;19930:10;19918:9;19909:6;:18;:31;19908:42;:54;;;;;;;;19896:66;;19328:642;;;;;;;:::o;20025:274::-;20124:11;:16;;:24;20141:6;20124:24;;;;;;;;;;;;;;;;;;;;;;;20120:172;;;20178:11;20170:38;;;20191:16;20170:38;;;;;;;;;;;;;;;;;;20120:172;;;20260:11;20246:34;;;20273:6;20246:34;;;;;;;;;;;;;;;;;;20120:172;20025:274;;;:::o;27666:497::-;27935:9;27768:127;27781:2;27774:3;:9;;27768:127;;;27841:3;27835:10;27829:4;27822:24;27870:2;27862:10;;;;27881:2;27874:9;;;;27792:2;27785:9;;;;27768:127;;;27967:1;27960:3;27955:2;:8;27947:3;:17;:21;27935:33;;28038:4;28034:9;28028:3;28022:10;28018:26;28091:4;28084;28078:11;28074:22;28136:7;28126:8;28123:21;28117:4;28110:35;27988:168;;;;;;:::o
Swarm Source
bzzr://da2a108470a513a4646f3e95dff089ad6b9ae2b62c45fae43008e0deef2bf7e1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.