Overview
ETH Balance
0.95 ETH
Eth Value
$3,239.13 (@ $3,409.61/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 36,609 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Funds | 9309118 | 1801 days ago | IN | 0 ETH | 0.00015469 | ||||
Settle Bet | 9225081 | 1813 days ago | IN | 0 ETH | 0.00025604 | ||||
Place Bet | 9225074 | 1813 days ago | IN | 0.02 ETH | 0.00031497 | ||||
Settle Bet | 9224946 | 1813 days ago | IN | 0 ETH | 0.00025604 | ||||
Place Bet | 9224937 | 1813 days ago | IN | 0.01 ETH | 0.00055258 | ||||
Settle Bet | 9224926 | 1813 days ago | IN | 0 ETH | 0.00029281 | ||||
Place Bet | 9224917 | 1813 days ago | IN | 0.01 ETH | 0.00027625 | ||||
Settle Bet | 9224872 | 1814 days ago | IN | 0 ETH | 0.00034833 | ||||
Place Bet | 9224865 | 1814 days ago | IN | 0.4 ETH | 0.0002302 | ||||
Settle Bet | 9224850 | 1814 days ago | IN | 0 ETH | 0.00036617 | ||||
Place Bet | 9224842 | 1814 days ago | IN | 0.19 ETH | 0.00019336 | ||||
Settle Bet | 9224833 | 1814 days ago | IN | 0 ETH | 0.00022014 | ||||
Place Bet | 9224824 | 1814 days ago | IN | 0.1 ETH | 0.00018416 | ||||
Settle Bet | 9224815 | 1814 days ago | IN | 0 ETH | 0.00021939 | ||||
Place Bet | 9224806 | 1814 days ago | IN | 0.02 ETH | 0.00018417 | ||||
Settle Bet | 9224790 | 1814 days ago | IN | 0 ETH | 0.00021942 | ||||
Place Bet | 9224781 | 1814 days ago | IN | 0.05 ETH | 0.00018418 | ||||
Settle Bet | 9224774 | 1814 days ago | IN | 0 ETH | 0.00021949 | ||||
Place Bet | 9224765 | 1814 days ago | IN | 0.03 ETH | 0.00018415 | ||||
Settle Bet | 9224761 | 1814 days ago | IN | 0 ETH | 0.0002197 | ||||
Place Bet | 9224754 | 1814 days ago | IN | 0.1 ETH | 0.00018416 | ||||
Settle Bet | 9224750 | 1814 days ago | IN | 0 ETH | 0.00021956 | ||||
Place Bet | 9224741 | 1814 days ago | IN | 0.05 ETH | 0.00018418 | ||||
Settle Bet | 9224734 | 1814 days ago | IN | 0 ETH | 0.00021949 | ||||
Place Bet | 9224726 | 1814 days ago | IN | 0.05 ETH | 0.00018418 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
9309118 | 1801 days ago | 72.84170237 ETH | ||||
9225081 | 1813 days ago | 1 wei | ||||
9224946 | 1813 days ago | 0.01455 ETH | ||||
9224926 | 1813 days ago | 0.01455 ETH | ||||
9224872 | 1814 days ago | 1 wei | ||||
9224850 | 1814 days ago | 1 wei | ||||
9224833 | 1814 days ago | 0.147 ETH | ||||
9224815 | 1814 days ago | 1 wei | ||||
9224790 | 1814 days ago | 1 wei | ||||
9224774 | 1814 days ago | 0.04455 ETH | ||||
9224761 | 1814 days ago | 1 wei | ||||
9224750 | 1814 days ago | 0.07425 ETH | ||||
9224734 | 1814 days ago | 0.07425 ETH | ||||
9224637 | 1814 days ago | 0.147 ETH | ||||
9224623 | 1814 days ago | 0.10395 ETH | ||||
9224591 | 1814 days ago | 1 wei | ||||
9224506 | 1814 days ago | 0.07425 ETH | ||||
9224460 | 1814 days ago | 0.07425 ETH | ||||
9224385 | 1814 days ago | 0.04455 ETH | ||||
9224268 | 1814 days ago | 0.07425 ETH | ||||
9224123 | 1814 days ago | 0.0394 ETH | ||||
9224024 | 1814 days ago | 0.0891 ETH | ||||
9223997 | 1814 days ago | 0.0591 ETH | ||||
9223898 | 1814 days ago | 1 wei | ||||
9223803 | 1814 days ago | 1 wei |
Loading...
Loading
Contract Name:
FairWin
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-06-13 */ pragma solidity ^0.4.24; // * 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 FairWin { /// *** 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 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 fairwin 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 fairwin 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 placeBet(uint betMask, uint modulo, uint commitLastBlock, uint commit, 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."); bytes32 signatureHash = keccak256(abi.encodePacked(uint40(commitLastBlock), commit)); require (secretSigner == ecrecover(signatureHash, 27, r, s), "ECDSA signature is not valid."); uint rollUnder; uint mask; if (modulo <= MAX_MASK_MODULO) { 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 fairwin 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":false,"inputs":[{"name":"betMask","type":"uint256"},{"name":"modulo","type":"uint256"},{"name":"commitLastBlock","type":"uint256"},{"name":"commit","type":"uint256"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","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":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
608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061374c8061010a6000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b5146100fe5780634d61537f1461011557806357246d231461016c5780635e83b463146101bb5780636b5c5f391461021557806374e048d51461026c5780638da5cb5b146102aa578063b539cd5514610301578063c10753291461032c578063ca722cdc14610379578063d06c54fb146103b4578063d579fd44146103cb578063d6d30a511461040e578063d702087f1461043b578063df88126f1461047e578063e1fdb4b4146104cd578063f8bb201c146104fa578063fbd668a91461053d575b005b34801561010a57600080fd5b5061011361056a565b005b34801561012157600080fd5b5061012a610782565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561017857600080fd5b506101816107a8565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61021360048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560001916906020019092919080356000191690602001909291905050506107ca565b005b34801561022157600080fd5b5061022a611133565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561027857600080fd5b506102a860048036038101908080359060200190929190803564ffffffffff169060200190929190505050611159565b005b3480156102b657600080fd5b506102bf6113dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030d57600080fd5b50610316611402565b6040518082815260200191505060405180910390f35b34801561033857600080fd5b50610377600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611408565b005b34801561038557600080fd5b506103b2600480360381019080803590602001909291908035600019169060200190929190505050611697565b005b3480156103c057600080fd5b506103c96119aa565b005b3480156103d757600080fd5b5061040c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611af9565b005b34801561041a57600080fd5b5061043960048036038101908080359060200190929190505050611cec565b005b34801561044757600080fd5b5061047c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc9565b005b34801561048a57600080fd5b506104936120f7565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104d957600080fd5b506104f860048036038101908080359060200190929190505050612119565b005b34801561050657600080fd5b5061053b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123c5565b005b34801561054957600080fd5b50610568600480360381019080803590602001909291905050506124f3565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610654576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600460109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16141515610748576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001807f416c6c20626574732073686f756c642062652070726f6365737365642028736581526020017f74746c6564206f7220726566756e64656429206265666f72652073656c662d6481526020017f657374727563742e00000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000806000806000600560008b81526020019081526020016000209650600073ffffffffffffffffffffffffffffffffffffffff1687600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b34955060018c1180156108ec575060648c11155b1515610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b662386f26fc1000086101580156109815750693f870857a3e0e38000008611155b15156109f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008d118015610a085750602860020a8d105b1515610a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b8a4311151515610af4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f436f6d6d69742068617320657870697265642e0000000000000000000000000081525060200191505060405180910390fd5b8a8a604051602001808364ffffffffff1664ffffffffff167b01000000000000000000000000000000000000000000000000000000028152600501828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083101515610b7d5780518252602082019150602081019050602083039250610b58565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209450600185601b8b8b604051600081526020016040526040518085600019166000191681526020018460ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015610c21573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4543445341207369676e6174757265206973206e6f742076616c69642e00000081525060200191505060405180910390fd5b60288c111515610d4d57603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018f0216811515610d4257fe5b0693508c9250610dfb565b60008d118015610d5d57508b8d11155b1515610df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b8c93505b610e06868d8661268e565b809250819350505060025486018211151515610e8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e00000000000081525060200191505060405180910390fd5b81600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff161115151561101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878a6040518082815260200191505060405180910390a18587600001819055508b8760010160006101000a81548160ff021916908360ff160217905550838760010160016101000a81548160ff021916908360ff160217905550438760010160026101000a81548164ffffffffff021916908364ffffffffff160217905550828760010160076101000a81548164ffffffffff021916908364ffffffffff1602179055503387600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b85604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310151561129f578051825260208201915060208101905060208303925061127a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004935060056000858152602001908152602001600020925060fa8564ffffffffff1601431115151561138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6113996048612822565b6113a4846044612f08565b809250819350505081600019168564ffffffffff1640600019161415156113ca57600080fd5b6113d5838783613249565b505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156115a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611688576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b6116938282836135f4565b5050565b6000806000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b84604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156117dc57805182526020820191506020810190506020830392506117b7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900492506005600084815260200190815260200160002091508160010160029054906101000a900464ffffffffff1664ffffffffff16905080431115156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f736574746c6542657420696e207468652073616d6520626c6f636b206173207081526020017f6c6163654265742c206f72206265666f72652e0000000000000000000000000081525060400191505060405180910390fd5b60fa81014311151515611981576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b836000191681406000191614151561199857600080fd5b6119a3828686613249565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e206f6e6c792061636365707420707265617070726f766564206e65772081526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420617070726f76652063757272656e74206f776e65722e00000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16318111151515611e8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611f6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b80600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460109054906101000a90046fffffffffffffffffffffffffffffffff1681565b60008060008060056000868152602001908152602001600020935083600001549250600083141515156121da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60fa8460010160029054906101000a900464ffffffffff1664ffffffffff160143111515612296576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600084600001819055506122d3838560010160009054906101000a900460ff1660ff168660010160019054906101000a900460ff1660ff1661268e565b809250819350505081600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506123be84600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684856135f4565b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b693f870857a3e0e380000081101515612684576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d617850726f6669742073686f756c6420626520612073616e65206e756d626581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60008060008360001080156126a35750848411155b1515612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57696e2070726f626162696c697479206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b67016345785d8a000086101561272e576000612737565b66038d7ea4c680005b915060646001870281151561274857fe5b049050660110d9316ec00081101561276557660110d9316ec00090505b8582820111151515612805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f42657420646f65736e2774206576656e20636f76657220686f7573652065646781526020017f652e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b838583838903030281151561281657fe5b04925050935093915050565b60008060008060008060008060008060008b3560001a9a5060f78b101515156128d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f52656365697074206c656166206c6f6e676572207468616e203535206279746581526020017f732e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60f68b038c019b508b3560001a9950607f8a1115156128fd5760018c019b5061298c565b60808a1015801561290f575060b78a11155b1515612983576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061746820697320616e20524c5020737472696e672e0000000000000000000081525060200191505060405180910390fd5b607f8a038c019b505b8b3560001a985060b989141515612a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f5265636569707420737472696e6720697320616c77617973206174206c65617381526020017f7420323536206279746573206c6f6e672c20627574206c657373207468616e2081526020017f36346b2e0000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60038c019b508b3560001a975060f988141515612b02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f5265636569707420697320616c77617973206174206c6561737420323536206281526020017f79746573206c6f6e672c20627574206c657373207468616e2036346b2e00000081525060400191505060405180910390fd5b60038c019b508b3560001a9650600187141515612b87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374617475732073686f756c6420626520737563636573732e0000000000000081525060200191505060405180910390fd5b60018c019b508b3560001a9550607f86111515612ba95760018c019b50612c38565b60808610158015612bbb575060b78611155b1515612c2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43756d756c61746976652067617320697320616e20524c5020737472696e672e81525060200191505060405180910390fd5b607f86038c019b505b8b3560001a945060b985141515612cdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f426c6f6f6d2066696c74657220697320616c776179732032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6101038c019b508b3560001a935060f884141515612d89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6773206c697374206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a925060f883141515612e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6720656e747279206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a9150609482141515612eb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973203230206279746573206c6f6e672e0000000000000081525060200191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff1681141515612efa57600080fd5b505050505050505050505050565b60008060008060008060008060008060405197505b61ffff601e8c03351695506000861415612f365761305b565b61ffff601c8c0335169450856020860111151515612fbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515613040576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b858901528588209b50859650858b019a50612f1d565b8b6001029850868801925061ffff601c8c033516915061ffff601a8c033516905081878201111515156130f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60068b019a50818b843761310d81840189896136d5565b8183209b50818b019a5061ffff601e8c033516955061ffff601c8c03351694508560208601111515156131a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b0135935060008414151561322c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008060008060008060008060008060008d600001549a508d60010160009054906101000a900460ff1660ff1699508d60010160019054906101000a900460ff1660ff1698508d600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16975060008b14151515613355576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008e600001819055508c8c604051602001808381526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831015156133c4578051825260208201915060208101905060208303925061339f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020965089876001900481151561340257fe5b0695506134108b8b8b61268e565b8095508196505050600092506000915060288a11151561345e5760008e60010160079054906101000a900464ffffffffff1664ffffffffff168760020a16141515613459578492505b61346b565b8886101561346a578492505b5b84600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555067016345785d8a00008b10151561356d576103e88a88600190048115156134e857fe5b048115156134f257fe5b069050600081141561356c57600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506000600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5b60008211156135c5578773ffffffffffffffffffffffffffffffffffffffff167fc388db0e8aa560a59633c094a0d0aa21322cd6234836fd5bac00fc5ae63b5783836040518082815260200191505060405180910390a25b6135e4886000848601146135db578385016135de565b60015b856135f4565b5050505050505050505050505050565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015613681578273ffffffffffffffffffffffffffffffffffffffff167fd4f43975feb89f48dd30cabbb32011045be187d1e11c8ea9faa43efc35282519826040518082815260200191505060405180910390a26136d0565b8273ffffffffffffffffffffffffffffffffffffffff167fac464fe4d3a86b9121261ac0a01dd981bfe0777c7c9d9c8f4473d31a9c0f9d2d836040518082815260200191505060405180910390a25b505050565b60005b6020821015156136fd57825184526020840193506020830192506020820391506136d8565b6001826020036101000a03905080198351168185511681811786525050505050505600a165627a7a7230582073660b76a1456eaf4875e489a76633061f18c1899b241f6b53c4e43228ba817f0029
Deployed Bytecode
0x6080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b5146100fe5780634d61537f1461011557806357246d231461016c5780635e83b463146101bb5780636b5c5f391461021557806374e048d51461026c5780638da5cb5b146102aa578063b539cd5514610301578063c10753291461032c578063ca722cdc14610379578063d06c54fb146103b4578063d579fd44146103cb578063d6d30a511461040e578063d702087f1461043b578063df88126f1461047e578063e1fdb4b4146104cd578063f8bb201c146104fa578063fbd668a91461053d575b005b34801561010a57600080fd5b5061011361056a565b005b34801561012157600080fd5b5061012a610782565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561017857600080fd5b506101816107a8565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61021360048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803560001916906020019092919080356000191690602001909291905050506107ca565b005b34801561022157600080fd5b5061022a611133565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561027857600080fd5b506102a860048036038101908080359060200190929190803564ffffffffff169060200190929190505050611159565b005b3480156102b657600080fd5b506102bf6113dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030d57600080fd5b50610316611402565b6040518082815260200191505060405180910390f35b34801561033857600080fd5b50610377600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611408565b005b34801561038557600080fd5b506103b2600480360381019080803590602001909291908035600019169060200190929190505050611697565b005b3480156103c057600080fd5b506103c96119aa565b005b3480156103d757600080fd5b5061040c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611af9565b005b34801561041a57600080fd5b5061043960048036038101908080359060200190929190505050611cec565b005b34801561044757600080fd5b5061047c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc9565b005b34801561048a57600080fd5b506104936120f7565b60405180826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104d957600080fd5b506104f860048036038101908080359060200190929190505050612119565b005b34801561050657600080fd5b5061053b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123c5565b005b34801561054957600080fd5b50610568600480360381019080803590602001909291905050506124f3565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610654576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600460109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16141515610748576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001807f416c6c20626574732073686f756c642062652070726f6365737365642028736581526020017f74746c6564206f7220726566756e64656429206265666f72652073656c662d6481526020017f657374727563742e00000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000806000806000600560008b81526020019081526020016000209650600073ffffffffffffffffffffffffffffffffffffffff1687600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4265742073686f756c6420626520696e20612027636c65616e2720737461746581526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b34955060018c1180156108ec575060648c11155b1515610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b662386f26fc1000086101580156109815750693f870857a3e0e38000008611155b15156109f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f416d6f756e742073686f756c642062652077697468696e2072616e67652e000081525060200191505060405180910390fd5b60008d118015610a085750602860020a8d105b1515610a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d61736b2073686f756c642062652077697468696e2072616e67652e0000000081525060200191505060405180910390fd5b8a4311151515610af4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f436f6d6d69742068617320657870697265642e0000000000000000000000000081525060200191505060405180910390fd5b8a8a604051602001808364ffffffffff1664ffffffffff167b01000000000000000000000000000000000000000000000000000000028152600501828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083101515610b7d5780518252602082019150602081019050602083039250610b58565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209450600185601b8b8b604051600081526020016040526040518085600019166000191681526020018460ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015610c21573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4543445341207369676e6174757265206973206e6f742076616c69642e00000081525060200191505060405180910390fd5b60288c111515610d4d57603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018f0216811515610d4257fe5b0693508c9250610dfb565b60008d118015610d5d57508b8d11155b1515610df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676581526020017f72207468616e206d6f64756c6f2e00000000000000000000000000000000000081525060400191505060405180910390fd5b8c93505b610e06868d8661268e565b809250819350505060025486018211151515610e8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d617850726f666974206c696d69742076696f6c6174696f6e2e00000000000081525060200191505060405180910390fd5b81600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff1631600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff161115151561101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e0081525060200191505060405180910390fd5b7f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f878a6040518082815260200191505060405180910390a18587600001819055508b8760010160006101000a81548160ff021916908360ff160217905550838760010160016101000a81548160ff021916908360ff160217905550438760010160026101000a81548164ffffffffff021916908364ffffffffff160217905550828760010160076101000a81548164ffffffffff021916908364ffffffffff1602179055503387600101600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b85604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310151561129f578051825260208201915060208101905060208303925061127a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060019004935060056000858152602001908152602001600020925060fa8564ffffffffff1601431115151561138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6113996048612822565b6113a4846044612f08565b809250819350505081600019168564ffffffffff1640600019161415156113ca57600080fd5b6113d5838783613249565b505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181111515156115a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611688576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b6116938282836135f4565b5050565b6000806000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e81526020017f6f6e2d63726f75706965722e000000000000000000000000000000000000000081525060400191505060405180910390fd5b84604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156117dc57805182526020820191506020810190506020830392506117b7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900492506005600084815260200190815260200160002091508160010160029054906101000a900464ffffffffff1664ffffffffff16905080431115156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f736574746c6542657420696e207468652073616d6520626c6f636b206173207081526020017f6c6163654265742c206f72206265666f72652e0000000000000000000000000081525060400191505060405180910390fd5b60fa81014311151515611981576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b836000191681406000191614151561199857600080fd5b6119a3828686613249565b5050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e206f6e6c792061636365707420707265617070726f766564206e65772081526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e6e6f7420617070726f76652063757272656e74206f776e65722e00000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16318111151515611e8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6181526020017f6e63652e0000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff163181600460109054906101000a90046fffffffffffffffffffffffffffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff16016fffffffffffffffffffffffffffffffff160111151515611f6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420656e6f7567682066756e64732e00000000000000000000000000000081525060200191505060405180910390fd5b80600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460109054906101000a90046fffffffffffffffffffffffffffffffff1681565b60008060008060056000868152602001908152602001600020935083600001549250600083141515156121da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60fa8460010160029054906101000a900464ffffffffff1664ffffffffff160143111515612296576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426c6f636b686173682063616e2774206265207175657269656420627920455681526020017f4d2e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600084600001819055506122d3838560010160009054906101000a900460ff1660ff168660010160019054906101000a900460ff1660ff1661268e565b809250819350505081600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555080600460008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506123be84600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684856135f4565b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d81526020017f6f776e65722e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b693f870857a3e0e380000081101515612684576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f6d617850726f6669742073686f756c6420626520612073616e65206e756d626581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60008060008360001080156126a35750848411155b1515612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57696e2070726f626162696c697479206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b67016345785d8a000086101561272e576000612737565b66038d7ea4c680005b915060646001870281151561274857fe5b049050660110d9316ec00081101561276557660110d9316ec00090505b8582820111151515612805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f42657420646f65736e2774206576656e20636f76657220686f7573652065646781526020017f652e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b838583838903030281151561281657fe5b04925050935093915050565b60008060008060008060008060008060008b3560001a9a5060f78b101515156128d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f52656365697074206c656166206c6f6e676572207468616e203535206279746581526020017f732e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60f68b038c019b508b3560001a9950607f8a1115156128fd5760018c019b5061298c565b60808a1015801561290f575060b78a11155b1515612983576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5061746820697320616e20524c5020737472696e672e0000000000000000000081525060200191505060405180910390fd5b607f8a038c019b505b8b3560001a985060b989141515612a57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260448152602001807f5265636569707420737472696e6720697320616c77617973206174206c65617381526020017f7420323536206279746573206c6f6e672c20627574206c657373207468616e2081526020017f36346b2e0000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60038c019b508b3560001a975060f988141515612b02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f5265636569707420697320616c77617973206174206c6561737420323536206281526020017f79746573206c6f6e672c20627574206c657373207468616e2036346b2e00000081525060400191505060405180910390fd5b60038c019b508b3560001a9650600187141515612b87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5374617475732073686f756c6420626520737563636573732e0000000000000081525060200191505060405180910390fd5b60018c019b508b3560001a9550607f86111515612ba95760018c019b50612c38565b60808610158015612bbb575060b78611155b1515612c2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43756d756c61746976652067617320697320616e20524c5020737472696e672e81525060200191505060405180910390fd5b607f86038c019b505b8b3560001a945060b985141515612cdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f426c6f6f6d2066696c74657220697320616c776179732032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6101038c019b508b3560001a935060f884141515612d89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6773206c697374206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a925060f883141515612e34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6f6720656e747279206973206c657373207468616e2032353620627974657381526020017f206c6f6e672e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028c019b508b3560001a9150609482141515612eb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f41646472657373206973203230206279746573206c6f6e672e0000000000000081525060200191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600b8d03351690503073ffffffffffffffffffffffffffffffffffffffff1681141515612efa57600080fd5b505050505050505050505050565b60008060008060008060008060008060405197505b61ffff601e8c03351695506000861415612f365761305b565b61ffff601c8c0335169450856020860111151515612fbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b01359350600084141515613040576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b858901528588209b50859650858b019a50612f1d565b8b6001029850868801925061ffff601c8c033516915061ffff601a8c033516905081878201111515156130f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60068b019a50818b843761310d81840189896136d5565b8183209b50818b019a5061ffff601e8c033516955061ffff601c8c03351694508560208601111515156131a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f536869667420626f756e647320636865636b2e0000000000000000000000000081525060200191505060405180910390fd5b60048b019a50848b0135935060008414151561322c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e6f6e2d656d707479206861736820736c6f742e00000000000000000000000081525060200191505060405180910390fd5b858b89378b85890152858820995050505050505050509250929050565b60008060008060008060008060008060008d600001549a508d60010160009054906101000a900460ff1660ff1699508d60010160019054906101000a900460ff1660ff1698508d600101600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16975060008b14151515613355576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4265742073686f756c6420626520696e20616e2027616374697665272073746181526020017f746500000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008e600001819055508c8c604051602001808381526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831015156133c4578051825260208201915060208101905060208303925061339f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020965089876001900481151561340257fe5b0695506134108b8b8b61268e565b8095508196505050600092506000915060288a11151561345e5760008e60010160079054906101000a900464ffffffffff1664ffffffffff168760020a16141515613459578492505b61346b565b8886101561346a578492505b5b84600460108282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555067016345785d8a00008b10151561356d576103e88a88600190048115156134e857fe5b048115156134f257fe5b069050600081141561356c57600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506000600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b5b60008211156135c5578773ffffffffffffffffffffffffffffffffffffffff167fc388db0e8aa560a59633c094a0d0aa21322cd6234836fd5bac00fc5ae63b5783836040518082815260200191505060405180910390a25b6135e4886000848601146135db578385016135de565b60015b856135f4565b5050505050505050505050505050565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015613681578273ffffffffffffffffffffffffffffffffffffffff167fd4f43975feb89f48dd30cabbb32011045be187d1e11c8ea9faa43efc35282519826040518082815260200191505060405180910390a26136d0565b8273ffffffffffffffffffffffffffffffffffffffff167fac464fe4d3a86b9121261ac0a01dd981bfe0777c7c9d9c8f4473d31a9c0f9d2d836040518082815260200191505060405180910390a25b505050565b60005b6020821015156136fd57825184526020840193506020830192506020820391506136d8565b6001826020036101000a03905080198351168185511681811786525050505050505600a165627a7a7230582073660b76a1456eaf4875e489a76633061f18c1899b241f6b53c4e43228ba817f0029
Deployed Bytecode Sourcemap
246:27221:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7594:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7594:187:0;;;;;;3345:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3345:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3415:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3415:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9599:2495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4399:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4399:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13618:1004;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13618:1004:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3098:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3098:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3233:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3233:21:0;;;;;;;;;;;;;;;;;;;;;;;7067:367;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7067:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12459:739;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12459:739:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5669:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5669:158:0;;;;;;5482:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5482:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6665:332;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6665:332:0;;;;;;;;;;;;;;;;;;;;;;;;;;6036:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6036:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3578:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3578:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17727:826;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17727:826:0;;;;;;;;;;;;;;;;;;;;;;;;;;6199:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6199:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6391:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6391:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;7594:187;5133:5;;;;;;;;;;;5119:19;;:10;:19;;;5110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7665:1;7649:12;;;;;;;;;;;:17;;;7640:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7767:5;;;;;;;;;;;7754:19;;;3345:27;;;;;;;;;;;;;:::o;3415:26::-;;;;;;;;;;;;;:::o;9599:2495::-;9781:15;9947:11;10421:21;10622:14;10647:9;11162:22;11195:15;9799:4;:12;9804:6;9799:12;;;;;;;;;;;9781:30;;9854:1;9831:25;;:3;:11;;;;;;;;;;;;:25;;;9822:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9961:9;9947:23;;9999:1;9990:6;:10;:34;;;;;1500:3;10004:6;:20;;9990:34;9981:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1034:10;10079:6;:17;;:41;;;;;1078:12;10100:6;:20;;10079:41;10070:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10185:1;10175:7;:11;:37;;;;;2202:2;2288:1;:20;10190:7;:22;10175:37;10166:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10371:15;10355:12;:31;;10346:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10479:15;10497:6;10455:49;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10455::0;;;10445: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;;;10445:60:0;;;;;;;;;;;;;;;;10421:84;;10541:34;10551:13;10566:2;10570:1;10573;10541:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10541:34:0;;;;;;;;10525:50;;:12;;;;;;;;;;;:50;;;10516:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2202:2;10673:6;:25;;10669:432;;;19982:4;19879:66;19778;10731:7;:21;10730:37;10729:55;;;;;;;;10717:67;;10806:7;10799:14;;10669:432;;;10982:1;10972:7;:11;:32;;;;;10998:6;10987:7;:17;;10972:32;10963:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11082:7;11070:19;;10669:432;11257:43;11274:6;11282;11290:9;11257:16;:43::i;:::-;11223:77;;;;;;;;11390:9;;11381:6;:18;11360:17;:39;;11351:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11491:17;11467:12;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11543:10;11520:11;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11687:4;11679:21;;;11663:12;;;;;;;;;;;11649:11;;;;;;;;;;;:26;:51;;;;11640:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11789:14;11796:6;11789:14;;;;;;;;;;;;;;;;;;11877:6;11864:3;:10;;:19;;;;11913:6;11894:3;:10;;;:26;;;;;;;;;;;;;;;;;;11953:9;11931:3;:13;;;:32;;;;;;;;;;;;;;;;;;12004:12;11974:3;:20;;;:43;;;;;;;;;;;;;;;;;;12046:4;12028:3;:8;;;:23;;;;;;;;;;;;;;;;;;12076:10;12062:3;:11;;;:24;;;;;;;;;;;;;;;;;;9599:2495;;;;;;;;;;;;;:::o;4399:23::-;;;;;;;;;;;;;:::o;13618:1004::-;13812:11;13880:15;14296:21;14328:17;5336:8;;;;;;;;;;;5322:22;;:10;:22;;;5313:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13858:6;13841:24;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13841:24:0;;;13831: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;;;13831:35:0;;;;;;;;;;;;;;;;13826:41;;;13812:55;;13898:4;:12;13903:6;13898:12;;;;;;;;;;;13880:30;;2795:3;14015:20;:44;;;13999:12;:60;;13990:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14148:38;14170:15;14148:21;:38::i;:::-;14385;14403:6;14411:11;14385:17;:38::i;:::-;14356:67;;;;;;;;14478:13;14443:48;;;14453:20;14443:31;;;:48;;;;14434:58;;;;;;;;14575:39;14591:3;14596:6;14604:9;14575:15;:39::i;:::-;13618:1004;;;;;;:::o;3098:20::-;;;;;;;;;;;;;:::o;3233:21::-;;;;:::o;7067:367::-;5133:5;;;;;;;;;;;5119:19;;:10;:19;;;5110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7197:4;7189:21;;;7171:14;:39;;7162:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7326:4;7318:21;;;7300:14;7285:12;;;;;;;;;;;7271:11;;;;;;;;;;;:26;:43;;;:68;;7262:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7372:54;7382:11;7395:14;7411;7372:9;:54::i;:::-;7067:367;;:::o;12459:739::-;12543:11;12611:15;12652:21;5336:8;;;;;;;;;;;5322:22;;:10;:22;;;5313:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12589:6;12572:24;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12572:24:0;;;12562: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;;;12562:35:0;;;;;;;;;;;;;;;;12557:41;;;12543:55;;12629:4;:12;12634:6;12629:12;;;;;;;;;;;12611:30;;12676:3;:20;;;;;;;;;;;;12652:44;;;;12820:16;12805:12;:31;12796:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2795:3;12928:16;:40;12912:12;:56;;12903:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13058:9;13027:40;;;13037:16;13027:27;:40;;;;13018:50;;;;;;;;13151:39;13167:3;13172:6;13180:9;13151:15;:39::i;:::-;12459:739;;;;;:::o;5669:158::-;5739:9;;;;;;;;;;;5725:23;;:10;:23;;;5716:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5810:9;;;;;;;;;;;5802:5;;:17;;;;;;;;;;;;;;;;;;5669:158::o;5482:179::-;5133:5;;;;;;;;;;;5119:19;;:10;:19;;;5110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5581:5;;;;;;;;;;;5567:19;;:10;:19;;;;5558:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5643:10;5631:9;;:22;;;;;;;;;;;;;;;;;;5482:179;:::o;6665:332::-;5133:5;;;;;;;;;;;5119:19;;:10;:19;;;5110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6776:4;6768:21;;;6750:14;:39;;6741:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6905:4;6897:21;;;6879:14;6864:12;;;;;;;;;;;6850:11;;;;;;;;;;;:26;:43;;;:68;;6841:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6974:14;6951:11;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6665:332;:::o;6036:118::-;5133:5;;;;;;;;;;;5119:19;;:10;:19;;;5110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6131:15;6116:12;;:30;;;;;;;;;;;;;;;;;;6036:118;:::o;3578:27::-;;;;;;;;;;;;;:::o;17727:826::-;17828:15;17869:11;18233:18;18262:15;17846:4;:12;17851:6;17846:12;;;;;;;;;;;17828:30;;17883:3;:10;;;17869:24;;17925:1;17915:6;:11;;17906:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2795:3;18050;:20;;;;;;;;;;;;:44;;;18035:12;:59;18026:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18219:1;18206:3;:10;;:14;;;;18318:51;18335:6;18343:3;:10;;;;;;;;;;;;18318:51;;18355:3;:13;;;;;;;;;;;;18318:51;;:16;:51::i;:::-;18288:81;;;;;;;;18406:13;18382:12;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18454:10;18431:11;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18507:38;18517:3;:11;;;;;;;;;;;;18530:6;18538;18507:9;:38::i;:::-;17727:826;;;;;:::o;6199:102::-;5133:5;;;;;;;;;;;5119:19;;:10;:19;;;5110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6282:11;6271:8;;:22;;;;;;;;;;;;;;;;;;6199:102;:::o;6391:179::-;5133:5;;;;;;;;;;;5119:19;;:10;:19;;;5110:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1078:12;6467:10;:23;6458:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6552:10;6540:9;:22;;;;6391:179;:::o;18629:642::-;18719:14;18735:15;18924:14;18776:9;18772:1;:13;:36;;;;;18802:6;18789:9;:19;;18772:36;18763:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;776:9;18868:6;:25;;:43;;18910:1;18868:43;;;947:11;18868:43;18855:56;;18971:3;557:1;18941:6;:27;:33;;;;;;;;18924:50;;607:12;18991:9;:37;18987:107;;;607:12;19045:37;;18987:107;19141:6;19127:10;19115:9;:22;:32;;19106:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19254:9;19245:6;19231:10;19219:9;19210:6;:18;:31;19209:42;:54;;;;;;;;19197:66;;18629:642;;;;;;;:::o;24307:2631::-;24375:19;24593;24929:28;25186:22;25418:15;25592:21;25948:20;26157:23;26369;26581:22;26755:15;24446:6;24433:20;24430:1;24425:29;24407:47;;24495:4;24477:14;:22;;24468:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24576:4;24559:14;:21;24549:31;;;;24664:6;24651:20;24648:1;24643:29;24625:47;;24708:4;24690:14;:22;;24686:231;;;24739:1;24729:11;;;;24686:231;;;24802:4;24784:14;:22;;:48;;;;;24828:4;24810:14;:22;;24784:48;24775:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24901:4;24884:14;:21;24874:31;;;;24686:231;25018:6;25005:20;25002:1;24997:29;24970:56;;25074:4;25047:23;:31;25038:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25172:1;25162:11;;;;25263:6;25250:20;25247:1;25242:29;25221:50;;25313:4;25292:17;:25;25283:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25404:1;25394:11;;;;25481:6;25468:20;25465:1;25460:29;25446:43;;25524:3;25510:10;:17;25501:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25578:1;25568:11;;;;25667:6;25654:20;25651:1;25646:29;25626:49;;25711:4;25691:16;:24;;25687:249;;;25742:1;25732:11;;;;25687:249;;;25807:4;25787:16;:24;;:52;;;;;25835:4;25815:16;:24;;25787:52;25778:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25920:4;25901:16;:23;25891:33;;;;25687:249;26021:6;26008:20;26005:1;26000:29;25981:48;;26069:4;26050:15;:23;26041:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26137:7;26127:17;;;;26236:6;26223:20;26220:1;26215:29;26193:51;;26287:4;26265:18;:26;26256:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26355:1;26345:11;;;;26448:6;26435:20;26432:1;26427:29;26405:51;;26499:4;26477:18;:26;26468:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26567:1;26557:11;;;;26658:6;26645:20;26642:1;26637:29;26616:50;;26708:4;26687:17;:25;26678:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26832:42;26826:2;26818:6;26814:15;26801:29;26797:78;26783:92;;26923:4;26910:19;;26896:10;:33;26887:43;;;;;;;;24307:2631;;;;;;;;;;;;:::o;21050:3039::-;21127:17;21146;21266:16;21336:22;21360:15;21377:10;21389:13;22735:16;22796:17;22896:16;21317:4;21311:11;21296:26;;21718:852;21823:6;21817:2;21809:6;21805:15;21792:29;21788:42;21774:56;;21864:1;21850:10;:15;21846:129;;;21954:5;;21846:129;22046:6;22040:2;22032:6;22028:15;22015:29;22011:42;22002:51;;22092:10;22086:2;22078:5;:10;:24;;22069:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22153:1;22143:11;;;;22217:5;22209:6;22205:18;22192:32;22180:44;;22261:1;22249:8;:13;22240:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22366:10;22358:6;22345:11;22332:45;22427:8;22419:5;22406:11;22402:23;22395:41;22484:10;22471:11;22466:29;22454:41;;22534:10;22513:31;;21736:10;21726:20;;;;21718:852;;;22654:8;22646:17;;22634:29;;22768:17;22754:11;:31;22735:50;;22877:6;22871:2;22863:6;22859:15;22846:29;22842:42;22826:58;;22976:6;22970:2;22962:6;22958:15;22945:29;22941:42;22926:57;;23039:12;23018:17;23004:11;:31;:47;;22995:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23098:1;23088:11;;;;23155:12;23147:6;23134:11;23121:47;23180:65;23201:11;23187;:25;23214:11;23227:17;23180:6;:65::i;:::-;23299:12;23286:11;23281:31;23269:43;;23336:12;23326:22;;;;23511:6;23505:2;23497:6;23493:15;23480:29;23476:42;23462:56;;23576:6;23570:2;23562:6;23558:15;23545:29;23541:42;23532:51;;23627:10;23621:2;23613:5;:10;:24;;23604:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23684:1;23674:11;;;;23744:5;23736:6;23732:18;23719:32;23707:44;;23784:1;23772:8;:13;23763:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23881:10;23873:6;23860:11;23847:45;23938:8;23930:5;23917:11;23913:23;23906:41;24060:10;24047:11;24042:29;24029:42;;23832:250;;;;;;;;;;;;;:::o;14704:2605::-;14873:11;14908;14943:14;14984:15;15580;15741:9;15788:18;15817:16;15931:12;15958:15;16813;14887:3;:10;;;14873:24;;14922:3;:10;;;;;;;;;;;;14908:24;;;;14960:3;:13;;;;;;;;;;;;14943:30;;;;15002:3;:11;;;;;;;;;;;;14984:29;;15094:1;15084:6;:11;;15075:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15213:1;15200:3;:10;;:14;;;;15625:6;15633:16;15608:42;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15608:42:0;;;15598: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;;;15598:53:0;;;;;;;;;;;;;;;;15580:71;;15769:6;15758:7;15753:13;;;:22;;;;;;;;15741:34;;15875:43;15892:6;15900;15908:9;15875:16;:43::i;:::-;15844:74;;;;;;;;15946:1;15931:16;;15976:1;15958:19;;2202:2;16030:6;:25;;16026:419;;;16180:1;16168:3;:8;;;;;;;;;;;;16154:22;;16160:4;16155:1;:9;16154:22;:27;;16150:91;;;16212:13;16202:23;;16150:91;16026:419;;;16363:9;16356:4;:16;16352:80;;;16403:13;16393:23;;16352:80;16026:419;16543:13;16519:12;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;776:9;16620:6;:25;;16616:421;;;908:4;16848:6;16837:7;16832:13;;;:22;;;;;;;;16831:41;;;;;;;;16813:59;;16930:1;16916:10;:15;16912:114;;;16965:11;;;;;;;;;;;16952:24;;;;17009:1;16995:11;;:15;;;;;;;;;;;;;;;;;;16912:114;16616:421;17095:1;17082:10;:14;17078:87;;;17133:7;17118:35;;;17142:10;17118:35;;;;;;;;;;;;;;;;;;17078:87;17216:85;17226:7;17259:1;17245:10;17235:7;:20;:25;:56;;17281:10;17271:7;:20;17235:56;;;17263:5;17235:56;17293:7;17216:9;:85::i;:::-;14704:2605;;;;;;;;;;;;;;:::o;19326:274::-;19425:11;:16;;:24;19442:6;19425:24;;;;;;;;;;;;;;;;;;;;;;;19421:172;;;19479:11;19471:38;;;19492:16;19471:38;;;;;;;;;;;;;;;;;;19421:172;;;19561:11;19547:34;;;19574:6;19547:34;;;;;;;;;;;;;;;;;;19421:172;19326:274;;;:::o;26967:497::-;27236:9;27069:127;27082:2;27075:3;:9;;27069:127;;;27142:3;27136:10;27130:4;27123:24;27171:2;27163:10;;;;27182:2;27175:9;;;;27093:2;27086:9;;;;27069:127;;;27268:1;27261:3;27256:2;:8;27248:3;:17;:21;27236:33;;27339:4;27335:9;27329:3;27323:10;27319:26;27392:4;27385;27379:11;27375:22;27437:7;27427:8;27424:21;27418:4;27411:35;27289:168;;;;;;:::o
Swarm Source
bzzr://73660b76a1456eaf4875e489a76633061f18c1899b241f6b53c4e43228ba817f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,413.16 | 0.95 | $3,242.5 |
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.