Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x0b5dA756938E334c97Ce20715e32a4a8FEa12ba9
Balance 1.3094 ETH
Nonce 1
Code Size 21017 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

21017 bytes
0x6080604052600436106101c15763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663018a25e8811461035f57806306fdde0314610386578063079ce327146104105780630f15f4c01461043057806310f01eba1461044557806311a09ae71461046657806324c33d331461047b5780632660316e146104f25780632ce21999146105215780632e19ebdc14610552578063349cdcac1461056a5780633ccfd60b146105885780633ddd46981461059d57806349cc635d146105f95780635893d48114610623578063624ae5c01461063e5780636306643414610653578063685ffd8314610689578063747dff42146106dc57806382bfc739146107675780638f38f3091461078e5780638f7140ea1461079c578063921dec21146107b757806395d89b411461038657806398a0871d1461080a578063a2bccae914610821578063a65b37a114610862578063c519500e14610870578063c7e284b814610888578063ce89c80c1461089d578063cf808000146108b8578063d53b2679146108d0578063d87574e0146108e5578063de7874f3146108fa578063ed78cf4a14610954578063ee0b5d8b1461095c575b6101c96150f4565b600f5460009060ff16151560011461022d576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b8015610274576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b34633b9aca008110156102cc576040805160e560020a62461bcd028152602060048201526021602482015260008051602061516e833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af680000081111561031c576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206151ae833981519152604482015290519081900360640190fd5b610325856109b5565b33600090815260066020818152604080842054808552600890925290922001549196509450610358908590600288610c69565b5050505050005b34801561036b57600080fd5b50610374610ea3565b60408051918252519081900360200190f35b34801561039257600080fd5b5061039b610f68565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d55781810151838201526020016103bd565b50505050905090810190601f1680156104025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041c57600080fd5b5061042e600435602435604435610f9f565b005b34801561043c57600080fd5b5061042e6111ab565b34801561045157600080fd5b50610374600160a060020a03600435166112de565b34801561047257600080fd5b506103746112f0565b34801561048757600080fd5b506104936004356112f6565b604080519c8d5260208d019b909b528b8b019990995296151560608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b3480156104fe57600080fd5b5061050d600435602435611359565b604080519115158252519081900360200190f35b34801561052d57600080fd5b50610539600435611379565b6040805192835260208301919091528051918290030190f35b34801561055e57600080fd5b50610374600435611392565b34801561057657600080fd5b5061042e6004356024356044356113a4565b34801561059457600080fd5b5061042e61158a565b6040805160206004803580820135601f810184900484028501840190955284845261042e94369492936024939284019190819084018382808284375094975050600160a060020a0385351695505050505060200135151561190b565b34801561060557600080fd5b5061042e600435600160a060020a0360243516604435606435611ac4565b34801561062f57600080fd5b50610374600435602435611cb5565b34801561064a57600080fd5b50610374611cd2565b34801561065f57600080fd5b5061066b600435611cd8565b60408051938452602084019290925282820152519081900360600190f35b6040805160206004803580820135601f810184900484028501840190955284845261042e943694929360249392840191908190840183828082843750949750508435955050505050602001351515611e7e565b3480156106e857600080fd5b506106f1611f5e565b604080519e8f5260208f019d909d528d8d019b909b5260608d019990995260808c019790975260a08b019590955260c08a0193909352600160a060020a0390911660e08901526101008801526101208701526101408601526101608501526101808401526101a083015251908190036101c00190f35b34801561077357600080fd5b5061042e600160a060020a036004351660243560443561215c565b61042e600435602435612356565b3480156107a857600080fd5b5061042e60043560243561253d565b6040805160206004803580820135601f810184900484028501840190955284845261042e94369492936024939284019190819084018382808284375094975050843595505050505060200135151561261a565b61042e600160a060020a03600435166024356126fa565b34801561082d57600080fd5b5061083c60043560243561290f565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61042e600435602435612941565b34801561087c57600080fd5b50610539600435612b3e565b34801561089457600080fd5b50610374612b57565b3480156108a957600080fd5b50610374600435602435612be6565b3480156108c457600080fd5b50610374600435612c8e565b3480156108dc57600080fd5b5061050d612d40565b3480156108f157600080fd5b50610374612d49565b34801561090657600080fd5b50610912600435612d4f565b60408051600160a060020a0390981688526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61042e612d96565b34801561096857600080fd5b5061097d600160a060020a0360043516612e13565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6109bd6150f4565b336000908152600660205260408120549080821515610c6057604080517fe56556a9000000000000000000000000000000000000000000000000000000008152336004820152905173ba0f428d3cbe8804c4f068ec1a96e2c6b7771f839163e56556a99160248083019260209291908290030181600087803b158015610a4257600080fd5b505af1158015610a56573d6000803e3d6000fd5b505050506040513d6020811015610a6c57600080fd5b5051604080517f82e37b2c00000000000000000000000000000000000000000000000000000000815260048101839052905191945073ba0f428d3cbe8804c4f068ec1a96e2c6b7771f83916382e37b2c916024808201926020929091908290030181600087803b158015610adf57600080fd5b505af1158015610af3573d6000803e3d6000fd5b505050506040513d6020811015610b0957600080fd5b5051604080517fe3c08adf00000000000000000000000000000000000000000000000000000000815260048101869052905191935073ba0f428d3cbe8804c4f068ec1a96e2c6b7771f839163e3c08adf916024808201926020929091908290030181600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b505050506040513d6020811015610ba657600080fd5b505133600081815260066020908152604080832088905587835260089091529020805473ffffffffffffffffffffffffffffffffffffffff1916909117905590508115610c2f576000828152600760209081526040808320869055858352600882528083206001908101869055600a8352818420868552909252909120805460ff191690911790555b8015801590610c3e5750828114155b15610c585760008381526008602052604090206006018190555b845160010185525b50929392505050565b6005546002546000828152600b602052604090206004015442910181118015610cd457506000828152600b602052604090206002015481111580610cd457506000828152600b602052604090206002015481118015610cd457506000828152600b6020526040902054155b15610cec57610ce7828734888888612ee8565b610e9b565b6000828152600b602052604090206002015481118015610d1e57506000828152600b602052604090206003015460ff16155b15610e66576000828152600b60205260409020600301805460ff19166001179055610d4883613439565b925080670de0b6b3a764000002836000015101836000018181525050858360200151018360200181815250507fa7801a70b37e729a11492aad44fd3dba89b4149f0609dc0f6837bf9e57e2671a3360086000898152602001908152602001600020600101543486600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a15b600086815260086020526040902060030154610e88903463ffffffff61381c16565b6000878152600860205260409020600301555b505050505050565b6005546002546000828152600b602052604081206004015490929142910181118015610f1157506000828152600b602052604090206002015481111580610f1157506000828152600b602052604090206002015481118015610f1157506000828152600b6020526040902054155b15610f59576000828152600b6020526040902060050154610f5290670de0b6b3a764000090610f46908263ffffffff61381c16565b9063ffffffff61387d16565b9250610f63565b6544364c5bb00092505b505090565b60408051808201909152600881527f663364756c747261000000000000000000000000000000000000000000000000602082015281565b610fa76150f4565b600f54600090819060ff16151560011461100d576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b8015611054576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b85633b9aca008110156110ac576040805160e560020a62461bcd028152602060048201526021602482015260008051602061516e833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af68000008111156110fc576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206151ae833981519152604482015290519081900360640190fd5b33600090815260066020526040902054945088158061112b575060008581526008602052604090206001015489145b15611149576000858152600860205260409020600601549350611188565b60008981526007602090815260408083205488845260089092529091206006015490945084146111885760008581526008602052604090206006018490555b611191886138aa565b97506111a085858a8a8a6138cf565b505050505050505050565b600054600160a060020a0316331461120d576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c792061646d696e2063616e206163746976617465000000000000000000604482015290519081900360640190fd5b600f5460ff1615611268576040805160e560020a62461bcd02815260206004820152601c60248201527f464f4d4f2053686f727420616c72656164792061637469766174656400000000604482015290519081900360640190fd5b600f805460ff1916600190811790915560058190556002548154600092909252600b602052429091019081037f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d355610258017f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d155565b60066020526000908152604090205481565b60045481565b600b60208190526000918252604090912080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b01549a909b0154989a9799969860ff90961697949693959294919390928c565b600a60209081526000928352604080842090915290825290205460ff1681565b600d602052600090815260409020805460019091015482565b60076020526000908152604090205481565b6113ac6150f4565b600f5460009060ff161515600114611410576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b8015611457576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b84633b9aca008110156114af576040805160e560020a62461bcd028152602060048201526021602482015260008051602061516e833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af68000008111156114ff576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206151ae833981519152604482015290519081900360640190fd5b33600090815260066020526040902054935087158061151d57508388145b1561153b576000848152600860205260409020600601549750611568565b60008481526008602052604090206006015488146115685760008481526008602052604090206006018890555b611571876138aa565b965061158084898989896138cf565b5050505050505050565b6000806000806115986150f4565b600f5460ff1615156001146115f9576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b8015611640576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b60055433600090815260066020908152604080832054848452600b9092529091206002015491985042975095508611801561168d57506000878152600b602052604090206003015460ff16155b80156116a657506000878152600b602052604090205415155b1561184c576000878152600b60205260409020600301805460ff191660011790556116d083613439565b92506116db85613aeb565b9350600084111561172c57600085815260086020526040808220549051600160a060020a039091169186156108fc02918791818181858888f1935050505015801561172a573d6000803e3d6000fd5b505b85670de0b6b3a764000002836000015101836000018181525050848360200151018360200181815250507f0bd0dba8ab932212fa78150cdb7b0275da72e255875967b5cad11464cf71bedc3360086000888152602001908152602001600020600101548686600001518760200151886040015189606001518a608001518b60a001518c60c001518d60e00151604051808c600160a060020a0316600160a060020a031681526020018b600019166000191681526020018a815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390a1611902565b61185585613aeb565b935060008411156118a657600085815260086020526040808220549051600160a060020a039091169186156108fc02918791818181858888f193505050501580156118a4573d6000803e3d6000fd5b505b6000858152600860209081526040918290206001015482513381529182015280820186905260608101889052905186917f8f36579a548bc439baa172a6521207464154da77f411e2da3db2f53affe6cc3a919081900360800190a25b50505050505050565b6000808080808033803b8015611959576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b6119628b613b72565b604080517faa4d490b000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052600160a060020a038e1660448301528c151560648301528251939b50995034985073ba0f428d3cbe8804c4f068ec1a96e2c6b7771f839263aa4d490b928a926084808201939182900301818588803b1580156119f357600080fd5b505af1158015611a07573d6000803e3d6000fd5b50505050506040513d6040811015611a1e57600080fd5b508051602091820151600160a060020a03808b1660008181526006865260408082205485835260088852918190208054600190910154825188151581529889018790529416878201526060870193909352608086018c90524260a0870152915193995091975095508a92909186917fdd6176433ff5026bbce96b068584b7bbe3514227e72df9c630b749ae87e64442919081900360c00190a45050505050505050505050565b3373ba0f428d3cbe8804c4f068ec1a96e2c6b7771f8314611b55576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0383166000908152600660205260409020548414611b9057600160a060020a03831660009081526006602052604090208490555b6000828152600760205260409020548414611bb75760008281526007602052604090208490555b600084815260086020526040902054600160a060020a03848116911614611c0d576000848152600860205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b6000848152600860205260409020600101548214611c3a5760008481526008602052604090206001018290555b6000848152600860205260409020600601548114611c675760008481526008602052604090206006018190555b6000848152600a6020908152604080832085845290915290205460ff161515611caf576000848152600a602090815260408083208584529091529020805460ff191660011790555b50505050565b600c60209081526000928352604080842090915290825290205481565b60055481565b6005546000818152600b60205260408120600201549091829182919042118015611d1457506000818152600b602052604090206003015460ff16155b8015611d2d57506000818152600b602052604090205415155b15611e4e576000818152600b6020526040902054851415611e12576000818152600b6020526040902060070154611d9b90606490611d7290603063ffffffff61438516565b811515611d7b57fe5b60008881526008602052604090206002015491900463ffffffff61381c16565b6000868152600960209081526040808320858452909152902060020154611df490611dd690611dca89866143fc565b9063ffffffff6144ca16565b6000888152600860205260409020600301549063ffffffff61381c16565b60008781526008602052604090206004015491955093509150611e76565b600085815260086020908152604080832060029081015460098452828520868652909352922090910154611df490611dd690611dca89866143fc565b60008581526008602052604090206002810154600590910154611df490611dd690889061452a565b509193909250565b6000808080808033803b8015611ecc576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b611ed58b613b72565b604080517f745ea0c1000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073ba0f428d3cbe8804c4f068ec1a96e2c6b7771f839263745ea0c1928a926084808201939182900301818588803b1580156119f357600080fd5b60008060008060008060008060008060008060008060006005549050600b60008281526020019081526020016000206009015481600b600084815260200190815260200160002060050154600b600085815260200190815260200160002060020154600b600086815260200190815260200160002060040154600b600087815260200190815260200160002060070154600b600088815260200190815260200160002060000154600a02600b6000898152602001908152602001600020600101540160086000600b60008b815260200190815260200160002060000154815260200190815260200160002060000160009054906101000a9004600160a060020a031660086000600b60008c815260200190815260200160002060000154815260200190815260200160002060010154600c60008b8152602001908152602001600020600080815260200190815260200160002054600c60008c815260200190815260200160002060006001815260200190815260200160002054600c60008d815260200190815260200160002060006002815260200190815260200160002054600c60008e8152602001908152602001600020600060038152602001908152602001600020546003546103e802600454019e509e509e509e509e509e509e509e509e509e509e509e509e509e5050909192939495969798999a9b9c9d565b6121646150f4565b600f54600090819060ff1615156001146121ca576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b8015612211576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b85633b9aca00811015612269576040805160e560020a62461bcd028152602060048201526021602482015260008051602061516e833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af68000008111156122b9576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206151ae833981519152604482015290519081900360640190fd5b336000908152600660205260409020549450600160a060020a03891615806122e95750600160a060020a03891633145b15612307576000858152600860205260409020600601549350611188565b600160a060020a038916600090815260066020818152604080842054898552600890925290922001549094508414611188576000858152600860205260409020600601849055611191886138aa565b61235e6150f4565b600f5460009060ff1615156001146123c2576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b8015612409576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b34633b9aca00811015612461576040805160e560020a62461bcd028152602060048201526021602482015260008051602061516e833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af68000008111156124b1576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206151ae833981519152604482015290519081900360640190fd5b6124ba856109b5565b3360009081526006602052604090205490955093508615806124db57508387145b156124f9576000848152600860205260409020600601549650612526565b60008481526008602052604090206006015487146125265760008481526008602052604090206006018790555b61252f866138aa565b955061190284888888610c69565b3373ba0f428d3cbe8804c4f068ec1a96e2c6b7771f83146125ce576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000828152600a6020908152604080832084845290915290205460ff161515612616576000828152600a602090815260408083208484529091529020805460ff191660011790555b5050565b6000808080808033803b8015612668576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b6126718b613b72565b604080517fc0942dfd000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052604482018e90528c151560648301528251939b50995034985073ba0f428d3cbe8804c4f068ec1a96e2c6b7771f839263c0942dfd928a926084808201939182900301818588803b1580156119f357600080fd5b6127026150f4565b600f54600090819060ff161515600114612768576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b80156127af576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b34633b9aca00811015612807576040805160e560020a62461bcd028152602060048201526021602482015260008051602061516e833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612857576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206151ae833981519152604482015290519081900360640190fd5b612860866109b5565b336000908152600660205260409020549096509450600160a060020a03881615806128935750600160a060020a03881633145b156128b15760008581526008602052604090206006015493506128f8565b600160a060020a0388166000908152600660208181526040808420548985526008909252909220015490945084146128f85760008581526008602052604090206006018490555b612901876138aa565b965061158085858989610c69565b600960209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6129496150f4565b600f54600090819060ff1615156001146129af576040805160e560020a62461bcd028152602060048201526029602482015260008051602061518e833981519152604482015260008051602061514e833981519152606482015290519081900360840190fd5b33803b80156129f6576040805160e560020a62461bcd02815260206004820152601160248201526000805160206151ce833981519152604482015290519081900360640190fd5b34633b9aca00811015612a4e576040805160e560020a62461bcd028152602060048201526021602482015260008051602061516e833981519152604482015260f860020a607902606482015290519081900360840190fd5b69152d02c7e14af6800000811115612a9e576040805160e560020a62461bcd02815260206004820152600e60248201526000805160206151ae833981519152604482015290519081900360640190fd5b612aa7866109b5565b336000908152600660205260409020549096509450871580612ad9575060008581526008602052604090206001015488145b15612af75760008581526008602052604090206006015493506128f8565b60008881526007602090815260408083205488845260089092529091206006015490945084146128f8576000858152600860205260409020600601849055612901876138aa565b600e602052600090815260409020805460019091015482565b6005546000818152600b60205260408120600201549091904290811015612bdd576002546000838152600b602052604090206004015401811115612bb7576000828152600b6020526040902060020154610f52908263ffffffff6144ca16565b6002546000838152600b6020526040902060040154610f5291018263ffffffff6144ca16565b60009250610f63565b6002546000838152600b6020526040812060040154909142910181118015612c5057506000848152600b602052604090206002015481111580612c5057506000848152600b602052604090206002015481118015612c5057506000848152600b6020526040902054155b15612c7e576000848152600b6020526040902060060154612c77908463ffffffff61458716565b9150612c87565b612c77836145a8565b5092915050565b6005546002546000828152600b602052604081206004015490929142910181118015612cfc57506000828152600b602052604090206002015481111580612cfc57506000828152600b602052604090206002015481118015612cfc57506000828152600b6020526040902054155b15612d30576000828152600b6020526040902060050154612d29908590610f46908263ffffffff61381c16565b9250612d39565b612d2984614620565b5050919050565b600f5460ff1681565b60035481565b6008602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919087565b6005546001016000818152600b6020526040902060070154612dbe903463ffffffff61381c16565b6000828152600b6020908152604091829020600701929092558051838152349281019290925280517f74b1d2f771e0eff1b2c36c38499febdbea80fe4013bdace4fc4b653322c2895c9281900390910190a150565b6000806000806000806000806000600554915050600160a060020a038916600090815260066020908152604080832054808452600880845282852060018082015460098752858820898952875294872001549583905293526002830154600590930154909384939091612ea990612e8b90869061452a565b6000878152600860205260409020600301549063ffffffff61381c16565b600095865260086020908152604080882060040154600983528189209989529890915290952054939e929d50909b509950919750919550909350915050565b60008581526009602090815260408083208984529091528120600101548190819081901515612f1e57612f1b898661468d565b94505b60008a8152600b60205260409020600601546802b5e3af16b1880000118015612f78575060008981526009602090815260408083208d84529091529020546714d1120d7b16000090612f76908a63ffffffff61381c16565b115b15612fff5760008981526009602090815260408083208d8452909152902054612fb0906714d1120d7b1600009063ffffffff6144ca16565b9350612fc2888563ffffffff6144ca16565b60008a815260086020526040902060030154909350612fe7908463ffffffff61381c16565b60008a81526008602052604090206003015592965086925b633b9aca0088111561342d5760008a8152600b602052604090206006015461302d908963ffffffff61458716565b9150670de0b6b3a764000082106130a457613048828b6146ec565b60008a8152600b6020526040902054891461306f5760008a8152600b602052604090208990555b60008a8152600b6020526040902060010154861461309c5760008a8152600b602052604090206001018690555b845160640185525b67016345785d8a000088106132e4576004805460010190556130c46147c8565b1515600114156132e457678ac7230489e800008810613165576003546064906130f490604b63ffffffff61438516565b8115156130fd57fe5b60008b8152600860205260409020600201549190049150613124908263ffffffff61381c16565b60008a815260086020526040902060020155600354613149908263ffffffff6144ca16565b60035584516d0eca8847c4129106ce83000000000185526132b9565b670de0b6b3a764000088101580156131845750678ac7230489e8000088105b15613211576003546064906131a090603263ffffffff61438516565b8115156131a957fe5b60008b81526008602052604090206002015491900491506131d0908263ffffffff61381c16565b60008a8152600860205260409020600201556003546131f5908263ffffffff6144ca16565b60035584516d09dc5ada82b70b59df02000000000185526132b9565b67016345785d8a000088101580156132305750670de0b6b3a764000088105b156132b95760035460649061324c90601963ffffffff61438516565b81151561325557fe5b60008b815260086020526040902060020154919004915061327c908263ffffffff61381c16565b60008a8152600860205260409020600201556003546132a1908263ffffffff6144ca16565b60035584516d0eca8847c4129106ce83000000000185525b84516d314dc6448d9338c15b0a000000008202016c7e37be2022c0914b268000000001855260006004555b60045485516103e890910201855260008981526009602090815260408083208d845290915290206001015461332090839063ffffffff61381c16565b60008a81526009602090815260408083208e8452909152902060018101919091555461334d90899061381c565b60008a81526009602090815260408083208e8452825280832093909355600b9052206005015461338490839063ffffffff61381c16565b60008b8152600b602052604090206005810191909155600601546133af90899063ffffffff61381c16565b60008b8152600b6020908152604080832060060193909355600c8152828220898352905220546133e690899063ffffffff61381c16565b60008b8152600c602090815260408083208a845290915290205561340e8a8a8a8a8a8a6149df565b945061341e8a8a8a89868a614be9565b945061342d89878a8589614d57565b50505050505050505050565b6134416150f4565b6005546000818152600b60205260408120805460018201546007909201549092808080808080606461347a89603063ffffffff61438516565b81151561348357fe5b04965060328860008b8152600e602052604090205491900496506064906134b1908a9063ffffffff61438516565b8115156134ba57fe5b60008b8152600e602052604090206001015491900495506064906134e5908a9063ffffffff61438516565b8115156134ee57fe5b04935061350984611dca87818a818e8e63ffffffff6144ca16565b60008c8152600b602052604090206005015490935061353686670de0b6b3a764000063ffffffff61438516565b81151561353f57fe5b60008d8152600b6020526040902060050154919004925061358d90670de0b6b3a76400009061357590859063ffffffff61438516565b81151561357e57fe5b8791900463ffffffff6144ca16565b905060008111156135bd576135a8858263ffffffff6144ca16565b94506135ba838263ffffffff61381c16565b92505b60008a8152600860205260409020600201546135e090889063ffffffff61381c16565b60008b815260086020526040902060029081019190915561361290613605908661357e565b879063ffffffff61381c16565b60008054604051929850600160a060020a03169188156108fc0291899190818181858888f1935050505015801561364d573d6000803e3d6000fd5b506136646002855b8591900463ffffffff61381c16565b60008c8152600b602052604090206008015490935061368a90839063ffffffff61381c16565b600b60008d815260200190815260200160002060080181905550600b60008c815260200190815260200160002060020154620f4240028d60000151018d60000181815250508867016345785d8a0000028a6a52b7d2dcc80cd2e4000000028e6020015101018d6020018181525050600860008b815260200190815260200160002060000160009054906101000a9004600160a060020a03168d60400190600160a060020a03169081600160a060020a031681525050600860008b8152602001908152602001600020600101548d606001906000191690816000191681525050868d6080018181525050848d60e0018181525050838d60c0018181525050828d60a00181815250506005600081548092919060010191905055508a806001019b505042600b60008d8152602001908152602001600020600401819055506137ed6002546137e16102584261381c90919063ffffffff16565b9063ffffffff61381c16565b60008c8152600b6020526040902060028101919091556007018390558c9b505050505050505050505050919050565b81810182811015613877576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820616464206661696c656400000000000000000000000000604482015290519081900360640190fd5b92915050565b60006138a361389a613895858563ffffffff6144ca16565b614620565b611dca85614620565b9392505050565b6000808210806138ba5750600382115b156138c7575060026138ca565b50805b919050565b6005546002546000828152600b60205260409020600401544291018111801561393a57506000828152600b60205260409020600201548111158061393a57506000828152600b60205260409020600201548111801561393a57506000828152600b6020526040902054155b156139715761394c84611dca89613aeb565b60008881526008602052604090206003015561396c828886898988612ee8565b611902565b6000828152600b6020526040902060020154811180156139a357506000828152600b602052604090206003015460ff16155b15611902576000828152600b60205260409020600301805460ff191660011790556139cd83613439565b925080670de0b6b3a764000002836000015101836000018181525050868360200151018360200181815250507f88261ac70d02d5ea73e54fa6da17043c974de1021109573ec1f6f57111c823dd33600860008a815260200190815260200160002060010154856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e00151604051808b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a150505050505050565b6000818152600860205260408120600501548190613b0a908490614ec5565b600083815260086020526040902060048101546003820154600290920154613b3c926137e1919063ffffffff61381c16565b90506000811115613b685760008381526008602052604081206002810182905560038101829055600401555b8091505b50919050565b8051600090829082808060208411801590613b8d5750600084115b1515613c09576040805160e560020a62461bcd02815260206004820152602a60248201527f737472696e67206d757374206265206265747765656e203120616e642033322060448201527f6368617261637465727300000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515613c1857fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214158015613c7f57508460018503815181101515613c5757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214155b1515613cfb576040805160e560020a62461bcd02815260206004820152602560248201527f737472696e672063616e6e6f74207374617274206f7220656e6420776974682060448201527f7370616365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515613d0a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a021415613e4d57846001815181101515613d4457fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515613dc1576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030780000000000604482015290519081900360640190fd5b846001815181101515613dd057fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a0214151515613e4d576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030580000000000604482015290519081900360640190fd5b600091505b8382101561431d5784517f400000000000000000000000000000000000000000000000000000000000000090869084908110613e8a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015613efe575084517f5b0000000000000000000000000000000000000000000000000000000000000090869084908110613edf57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b15613f6b578482815181101515613f1157fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a028583815181101515613f4257fe5b906020010190600160f860020a031916908160001a905350821515613f6657600192505b614312565b8482815181101515613f7957fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021480614049575084517f600000000000000000000000000000000000000000000000000000000000000090869084908110613fd557fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015614049575084517f7b000000000000000000000000000000000000000000000000000000000000009086908490811061402a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b806140f3575084517f2f000000000000000000000000000000000000000000000000000000000000009086908490811061407f57fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156140f3575084517f3a00000000000000000000000000000000000000000000000000000000000000908690849081106140d457fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b151561416f576040805160e560020a62461bcd02815260206004820152602260248201527f737472696e6720636f6e7461696e7320696e76616c696420636861726163746560448201527f7273000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b848281518110151561417d57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a02141561425c5784826001018151811015156141b957fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415151561425c576040805160e560020a62461bcd02815260206004820152602860248201527f737472696e672063616e6e6f7420636f6e7461696e20636f6e7365637574697660448201527f6520737061636573000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82158015614308575084517f30000000000000000000000000000000000000000000000000000000000000009086908490811061429557fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080614308575084517f3900000000000000000000000000000000000000000000000000000000000000908690849081106142e957fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b1561431257600192505b600190910190613e52565b600183151514614377576040805160e560020a62461bcd02815260206004820152601d60248201527f737472696e672063616e6e6f74206265206f6e6c79206e756d62657273000000604482015290519081900360640190fd5b505050506020015192915050565b600082151561439657506000613877565b508181028183828115156143a657fe5b0414613877576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d617468206d756c206661696c656400000000000000000000000000604482015290519081900360640190fd5b60008281526009602090815260408083208484528252808320600190810154600b8085528386206005810154938101548752600e8652938620548787529452600790920154670de0b6b3a7640000936144b993926144ad92909161448491879160649161446e9163ffffffff61438516565b81151561447757fe5b049063ffffffff61438516565b81151561448d57fe5b6000888152600b602052604090206008015491900463ffffffff61381c16565b9063ffffffff61438516565b8115156144c257fe5b049392505050565b600082821115614524576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820737562206661696c656400000000000000000000000000604482015290519081900360640190fd5b50900390565b600082815260096020908152604080832084845282528083206002810154600190910154600b909352908320600801546138a392670de0b6b3a76400009161457191614385565b81151561457a57fe5b049063ffffffff6144ca16565b60006138a3614595846145a8565b611dca6145a8868663ffffffff61381c16565b60006309502f906146106d03b2a1d15167e7c5699bfde00000611dca61460b7a0dac7055469777a6122ee4310dd6c14410500f29048400000000006137e16b01027e72f1f12813088000006144ad8a670de0b6b3a764000063ffffffff61438516565b614f5c565b81151561461957fe5b0492915050565b6000614633670de0b6b3a7640000614faf565b614610600261466661465386670de0b6b3a764000063ffffffff61438516565b65886c8f6730709063ffffffff61438516565b81151561466f57fe5b046137e161467c86614faf565b6304a817c89063ffffffff61438516565b6146956150f4565b600083815260086020526040902060050154156146c9576000838152600860205260409020600501546146c9908490614ec5565b506005805460009384526008602052604090932001919091558051600a01815290565b6000818152600b60205260408120600201544291908211801561471b57506000838152600b6020526040902054155b1561473f57614738826137e16001670de0b6b3a764000088614477565b905061476c565b6000838152600b6020526040902060020154614769906137e16001670de0b6b3a764000088614477565b90505b61477e6104b08363ffffffff61381c16565b81101561479e576000838152600b60205260409020600201819055611caf565b6147b06104b08363ffffffff61381c16565b6000848152600b602052604090206002015550505050565b600080614939436137e142336040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b602083106148435780518252601f199092019160209182019101614824565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209250505081151561487957fe5b046137e1456137e142416040516020018082600160a060020a0316600160a060020a03166c010000000000000000000000000281526014019150506040516020818303038152906040526040518082805190602001908083835b602083106148f25780518252601f1990920191602091820191016148d3565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209250505081151561492857fe5b046137e1424463ffffffff61381c16565b604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106149875780518252601f199092019160209182019101614968565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912060045490945092506103e89150839050046103e802820310156149d657600191506149db565b600091505b5090565b6149e76150f4565b6064850460328604600080806149fd848661381c565b60008054604051929650600160a060020a031691869181818185875af1925050501515614a2a5760009392505b600a8a0491508a8914158015614a50575060008981526008602052604090206001015415155b15614af057600089815260086020526040902060040154614a7890839063ffffffff61381c16565b60008a815260086020908152604091829020600481019390935582546001909301548251600160a060020a03909416845290830152818101849052426060830152518c918e918c917f590bbc0fc16915a85269a48f74783c39842b7ae9eceb7c295c95dbe8b3ec7331919081900360800190a4614b03565b614b00838363ffffffff61381c16565b92505b6000888152600d6020526040902060010154614b3690606490614b2d908d9063ffffffff61438516565b81151561365557fe5b92506000831115614bd957506000546002830490600160a060020a03166108fc614b6085846144ca565b6040518115909202916000818181858888f19350505050158015614b88573d6000803e3d6000fd5b5060008c8152600b6020526040902060070154614bab908263ffffffff61381c16565b60008d8152600b602052604090206007015560c0870151614bd390849063ffffffff61381c16565b60c08801525b50949a9950505050505050505050565b614bf16150f4565b6000848152600d6020526040812054819081908190606490614c1a908b9063ffffffff61438516565b811515614c2357fe5b049350606489049250614c418360035461381c90919063ffffffff16565b6003556000888152600d6020526040902060010154614cb290614ca590606490614c72908d9063ffffffff61438516565b811515614c7b57fe5b046064614c8f8d600e63ffffffff61438516565b811515614c9857fe5b049063ffffffff61381c16565b8a9063ffffffff6144ca16565b9850614cc4898563ffffffff6144ca16565b9150614cd28b8b868a614fbb565b90506000811115614cf057614ced848263ffffffff6144ca16565b93505b60008b8152600b6020526040902060070154614d16906137e1848463ffffffff61381c16565b60008c8152600b602052604090206007015560e0860151614d3e90859063ffffffff61381c16565b60e0870152506101008501525091979650505050505050565b836c01431e0fae6d7217caa00000000242670de0b6b3a76400000282600001510101816000018181525050600554751aba4714957d300d0e549208b31adb100000000000000285826020015101018160200181815250507f500e72a0e114930aebdbcb371ccdbf43922c49f979794b5de4257ff7e310c7468160000151826020015160086000898152602001908152602001600020600101543387878760400151886060015189608001518a60a001518b60c001518c60e001518d6101000151600354604051808f81526020018e81526020018d600019166000191681526020018c600160a060020a0316600160a060020a031681526020018b81526020018a815260200189600160a060020a0316600160a060020a0316815260200188600019166000191681526020018781526020018681526020018581526020018481526020018381526020018281526020019e50505050505050505050505050505060405180910390a15050505050565b6000614ed1838361452a565b90506000811115614f5757600083815260086020526040902060030154614eff90829063ffffffff61381c16565b6000848152600860209081526040808320600301939093556009815282822085835290522060020154614f3990829063ffffffff61381c16565b60008481526009602090815260408083208684529091529020600201555b505050565b6000806002614f6c84600161381c565b811515614f7557fe5b0490508291505b81811015613b6c578091506002614f9e8285811515614f9757fe5b048361381c565b811515614fa757fe5b049050614f7c565b60006138778283614385565b6000848152600b602052604081206005015481908190614fe986670de0b6b3a764000063ffffffff61438516565b811515614ff257fe5b6000898152600b6020526040902060080154919004925061501a90839063ffffffff61381c16565b6000888152600b6020526040902060080155670de0b6b3a7640000615045838663ffffffff61438516565b81151561504e57fe5b60008881526009602090815260408083208c8452825280832060020154600b909252909120600801549290910492506150a1916137e1908490670de0b6b3a764000090614571908a63ffffffff61438516565b60008781526009602090815260408083208b8452825280832060020193909355600b905220600501546150e990670de0b6b3a76400009061357590859063ffffffff61438516565b979650505050505050565b6101206040519081016040528060008152602001600081526020016000600160a060020a03168152602001600080191681526020016000815260200160008152602001600081526020016000815260200160008152509056006e20646973636f72640000000000000000000000000000000000000000000000706f636b6574206c696e743a206e6f7420612076616c69642063757272656e63697473206e6f74207265616479207965742e2020636865636b203f65746120696e6f20766974616c696b2c206e6f000000000000000000000000000000000000736f7272792068756d616e73206f6e6c79000000000000000000000000000000a165627a7a723058208e27e8307017a51b05b9ca0c6054f55cdee70313c679c9ff1d3633e1884cacdf0029

Verified Source Code Partial Match

Compiler: v0.4.24+commit.e67f0147 EVM: byzantium Optimization: Yes (200 runs)
F3Dultra.sol 1929 lines
pragma solidity ^0.4.24;

contract F3Devents {
    // fired whenever a player registers a name
    event onNewName
    (
        uint256 indexed playerID,
        address indexed playerAddress,
        bytes32 indexed playerName,
        bool isNewPlayer,
        uint256 affiliateID,
        address affiliateAddress,
        bytes32 affiliateName,
        uint256 amountPaid,
        uint256 timeStamp
    );

    // fired at end of buy or reload
    event onEndTx
    (
        uint256 compressedData,
        uint256 compressedIDs,
        bytes32 playerName,
        address playerAddress,
        uint256 ethIn,
        uint256 keysBought,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 P3DAmount,
        uint256 genAmount,
        uint256 potAmount,
        uint256 airDropPot
    );

	// fired whenever theres a withdraw
    event onWithdraw
    (
        uint256 indexed playerID,
        address playerAddress,
        bytes32 playerName,
        uint256 ethOut,
        uint256 timeStamp
    );

    // fired whenever a withdraw forces end round to be ran
    event onWithdrawAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 ethOut,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 P3DAmount,
        uint256 genAmount
    );

    // (fomo3d short only) fired whenever a player tries a buy after round timer
    // hit zero, and causes end round to be ran.
    event onBuyAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 ethIn,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 P3DAmount,
        uint256 genAmount
    );

    // (fomo3d short only) fired whenever a player tries a reload after round timer
    // hit zero, and causes end round to be ran.
    event onReLoadAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 newPot,
        uint256 P3DAmount,
        uint256 genAmount
    );

    // fired whenever an affiliate is paid
    event onAffiliatePayout
    (
        uint256 indexed affiliateID,
        address affiliateAddress,
        bytes32 affiliateName,
        uint256 indexed roundID,
        uint256 indexed buyerID,
        uint256 amount,
        uint256 timeStamp
    );

    // received pot swap deposit
    event onPotSwapDeposit
    (
        uint256 roundID,
        uint256 amountAddedToPot
    );
}

//==============================================================================
//   _ _  _ _|_ _ _  __|_   _ _ _|_    _   .
//  (_(_)| | | | (_|(_ |   _\(/_ | |_||_)  .
//====================================|=========================================

contract modularShort is F3Devents {}

contract F3Dultra is modularShort {
    using SafeMath for *;
    using NameFilter for string;
    using F3DKeysCalcShort for uint256;

    PlayerBookInterface constant private PlayerBook = PlayerBookInterface(0x00ba0f428d3cbe8804c4f068ec1a96e2c6b7771f83);

//==============================================================================
//     _ _  _  |`. _     _ _ |_ | _  _  .
//    (_(_)| |~|~|(_||_|| (_||_)|(/__\  .  (game settings)
//=================_|===========================================================
    address private admin = msg.sender;
    string constant public name = "f3dultra";
    string constant public symbol = "f3dultra";
    uint256 private rndExtra_ = 0;     // length of the very first ICO
    uint256 private rndGap_ = 0;         // length of ICO phase, set to 1 year for EOS.
    uint256 constant private rndInit_ = 10 minutes;                // round timer starts at this
    uint256 constant private rndInc_ = 1 seconds;              // every full key purchased adds this much to the timer
    uint256 constant private rndMax_ = 20 minutes;                // max length a round timer can be

    uint256 constant private preIcoMax_ = 50000000000000000000; // max ico num
    uint256 constant private preIcoPerEth_ = 1500000000000000000; // in ico, per addr eth
    
//==============================================================================
//     _| _ _|_ _    _ _ _|_    _   .
//    (_|(_| | (_|  _\(/_ | |_||_)  .  (data used to store game info that changes)
//=============================|================================================
    uint256 public airDropPot_;             // person who gets the airdrop wins part of this pot
    uint256 public airDropTracker_ = 0;     // incremented each time a "qualified" tx occurs.  used to determine winning air drop
    uint256 public rID_;    // round id number / total rounds that have happened
//****************
// PLAYER DATA
//****************
    mapping (address => uint256) public pIDxAddr_;          // (addr => pID) returns player id by address
    mapping (bytes32 => uint256) public pIDxName_;          // (name => pID) returns player id by name
    mapping (uint256 => F3Ddatasets.Player) public plyr_;   // (pID => data) player data
    mapping (uint256 => mapping (uint256 => F3Ddatasets.PlayerRounds)) public plyrRnds_;    // (pID => rID => data) player round data by player id & round id
    mapping (uint256 => mapping (bytes32 => bool)) public plyrNames_; // (pID => name => bool) list of names a player owns.  (used so you can change your display name amongst any name you own)
//****************
// ROUND DATA
//****************
    mapping (uint256 => F3Ddatasets.Round) public round_;   // (rID => data) round data
    mapping (uint256 => mapping(uint256 => uint256)) public rndTmEth_;      // (rID => tID => data) eth in per team, by round id and team id
//****************
// TEAM FEE DATA
//****************
    mapping (uint256 => F3Ddatasets.TeamFee) public fees_;          // (team => fees) fee distribution by team
    mapping (uint256 => F3Ddatasets.PotSplit) public potSplit_;     // (team => fees) pot split distribution by team
//==============================================================================
//     _ _  _  __|_ _    __|_ _  _  .
//    (_(_)| |_\ | | |_|(_ | (_)|   .  (initial data setup upon contract deploy)
//==============================================================================
    constructor()
        public
    {
		// Team allocation structures
        // 0 = whales
        // 1 = bears
        // 2 = sneks
        // 3 = bulls

		// Team allocation percentages
        // (F3D, P3D) + (Pot , Referrals, Community)
            // Referrals / Community rewards are mathematically designed to come from the winner's share of the pot.
        fees_[0] = F3Ddatasets.TeamFee(22,6);   //50% to pot, 10% to aff, 2% to com, 1% to pot swap, 1% to air drop pot
        fees_[1] = F3Ddatasets.TeamFee(38,0);   //43% to pot, 10% to aff, 2% to com, 1% to pot swap, 1% to air drop pot
        fees_[2] = F3Ddatasets.TeamFee(68,8);   //35% to pot, 10% to aff, 2% to com, 1% to pot swap, 1% to air drop pot
        fees_[3] = F3Ddatasets.TeamFee(52,10);  //20% to pot, 10% to aff, 2% to com, 1% to pot swap, 1% to air drop pot

        // how to split up the final pot based on which team was picked
        // (F3D, P3D)
        potSplit_[0] = F3Ddatasets.PotSplit(15,10);  //48% to winner, 25% to next round, 2% to com
        potSplit_[1] = F3Ddatasets.PotSplit(25,0);   //48% to winner, 25% to next round, 2% to com
        potSplit_[2] = F3Ddatasets.PotSplit(30,10);  //48% to winner, 10% to next round, 2% to com
        potSplit_[3] = F3Ddatasets.PotSplit(20,20);  //48% to winner, 10% to next round, 2% to com
	}
//==============================================================================
//     _ _  _  _|. |`. _  _ _  .
//    | | |(_)(_||~|~|(/_| _\  .  (these are safety checks)
//==============================================================================
    /**
     * @dev used to make sure no one can interact with contract until it has
     * been activated.
     */
    modifier isActivated() {
        require(activated_ == true, "its not ready yet.  check ?eta in discord");
        _;
    }

    /**
     * @dev prevents contracts from interacting with fomo3d
     */
    modifier isHuman() {
        address _addr = msg.sender;
        uint256 _codeLength;

        assembly {_codeLength := extcodesize(_addr)}
        require(_codeLength == 0, "sorry humans only");
        _;
    }

    /**
     * @dev sets boundaries for incoming tx
     */
    modifier isWithinLimits(uint256 _eth) {
        require(_eth >= 1000000000, "pocket lint: not a valid currency");
        require(_eth <= 100000000000000000000000, "no vitalik, no");
        _;
    }

//==============================================================================
//     _    |_ |. _   |`    _  __|_. _  _  _  .
//    |_)|_||_)||(_  ~|~|_|| |(_ | |(_)| |_\  .  (use these to interact with contract)
//====|=========================================================================
    /**
     * @dev emergency buy uses last stored affiliate ID and team snek
     */
    function()
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);

        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];

        // buy core
        buyCore(_pID, plyr_[_pID].laff, 2, _eventData_);
    }

    /**
     * @dev converts all incoming ethereum to keys.
     * -functionhash- 0x8f38f309 (using ID for affiliate)
     * -functionhash- 0x98a0871d (using address for affiliate)
     * -functionhash- 0xa65b37a1 (using name for affiliate)
     * @param _affCode the ID/address/name of the player who gets the affiliate fee
     * @param _team what team is the player playing for?
     */
    function buyXid(uint256 _affCode, uint256 _team)
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);

        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];

        // manage affiliate residuals
        // if no affiliate code was given or player tried to use their own, lolz
        if (_affCode == 0 || _affCode == _pID)
        {
            // use last stored affiliate code
            _affCode = plyr_[_pID].laff;

        // if affiliate code was given & its not the same as previously stored
        } else if (_affCode != plyr_[_pID].laff) {
            // update last affiliate
            plyr_[_pID].laff = _affCode;
        }

        // verify a valid team was selected
        _team = verifyTeam(_team);

        // buy core
        buyCore(_pID, _affCode, _team, _eventData_);
    }

    function buyXaddr(address _affCode, uint256 _team)
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);

        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];

        // manage affiliate residuals
        uint256 _affID;
        // if no affiliate code was given or player tried to use their own, lolz
        if (_affCode == address(0) || _affCode == msg.sender)
        {
            // use last stored affiliate code
            _affID = plyr_[_pID].laff;

        // if affiliate code was given
        } else {
            // get affiliate ID from aff Code
            _affID = pIDxAddr_[_affCode];

            // if affID is not the same as previously stored
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }

        // verify a valid team was selected
        _team = verifyTeam(_team);

        // buy core
        buyCore(_pID, _affID, _team, _eventData_);
    }

    function buyXname(bytes32 _affCode, uint256 _team)
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);

        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];

        // manage affiliate residuals
        uint256 _affID;
        // if no affiliate code was given or player tried to use their own, lolz
        if (_affCode == '' || _affCode == plyr_[_pID].name)
        {
            // use last stored affiliate code
            _affID = plyr_[_pID].laff;

        // if affiliate code was given
        } else {
            // get affiliate ID from aff Code
            _affID = pIDxName_[_affCode];

            // if affID is not the same as previously stored
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }

        // verify a valid team was selected
        _team = verifyTeam(_team);

        // buy core
        buyCore(_pID, _affID, _team, _eventData_);
    }

    /**
     * @dev essentially the same as buy, but instead of you sending ether
     * from your wallet, it uses your unwithdrawn earnings.
     * -functionhash- 0x349cdcac (using ID for affiliate)
     * -functionhash- 0x82bfc739 (using address for affiliate)
     * -functionhash- 0x079ce327 (using name for affiliate)
     * @param _affCode the ID/address/name of the player who gets the affiliate fee
     * @param _team what team is the player playing for?
     * @param _eth amount of earnings to use (remainder returned to gen vault)
     */
    function reLoadXid(uint256 _affCode, uint256 _team, uint256 _eth)
        isActivated()
        isHuman()
        isWithinLimits(_eth)
        public
    {
        // set up our tx event data
        F3Ddatasets.EventReturns memory _eventData_;

        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];

        // manage affiliate residuals
        // if no affiliate code was given or player tried to use their own, lolz
        if (_affCode == 0 || _affCode == _pID)
        {
            // use last stored affiliate code
            _affCode = plyr_[_pID].laff;

        // if affiliate code was given & its not the same as previously stored
        } else if (_affCode != plyr_[_pID].laff) {
            // update last affiliate
            plyr_[_pID].laff = _affCode;
        }

        // verify a valid team was selected
        _team = verifyTeam(_team);

        // reload core
        reLoadCore(_pID, _affCode, _team, _eth, _eventData_);
    }

    function reLoadXaddr(address _affCode, uint256 _team, uint256 _eth)
        isActivated()
        isHuman()
        isWithinLimits(_eth)
        public
    {
        // set up our tx event data
        F3Ddatasets.EventReturns memory _eventData_;

        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];

        // manage affiliate residuals
        uint256 _affID;
        // if no affiliate code was given or player tried to use their own, lolz
        if (_affCode == address(0) || _affCode == msg.sender)
        {
            // use last stored affiliate code
            _affID = plyr_[_pID].laff;

        // if affiliate code was given
        } else {
            // get affiliate ID from aff Code
            _affID = pIDxAddr_[_affCode];

            // if affID is not the same as previously stored
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }

        // verify a valid team was selected
        _team = verifyTeam(_team);

        // reload core
        reLoadCore(_pID, _affID, _team, _eth, _eventData_);
    }

    function reLoadXname(bytes32 _affCode, uint256 _team, uint256 _eth)
        isActivated()
        isHuman()
        isWithinLimits(_eth)
        public
    {
        // set up our tx event data
        F3Ddatasets.EventReturns memory _eventData_;

        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];

        // manage affiliate residuals
        uint256 _affID;
        // if no affiliate code was given or player tried to use their own, lolz
        if (_affCode == '' || _affCode == plyr_[_pID].name)
        {
            // use last stored affiliate code
            _affID = plyr_[_pID].laff;

        // if affiliate code was given
        } else {
            // get affiliate ID from aff Code
            _affID = pIDxName_[_affCode];

            // if affID is not the same as previously stored
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }

        // verify a valid team was selected
        _team = verifyTeam(_team);

        // reload core
        reLoadCore(_pID, _affID, _team, _eth, _eventData_);
    }

    /**
     * @dev withdraws all of your earnings.
     * -functionhash- 0x3ccfd60b
     */
    function withdraw()
        isActivated()
        isHuman()
        public
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];

        // setup temp var for player eth
        uint256 _eth;

        // check to see if round has ended and no one has run round end yet
        if (_now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].plyr != 0)
        {
            // set up our tx event data
            F3Ddatasets.EventReturns memory _eventData_;

            // end the round (distributes pot)
			round_[_rID].ended = true;
            _eventData_ = endRound(_eventData_);

			// get their earnings
            _eth = withdrawEarnings(_pID);

            // gib moni
            if (_eth > 0)
                plyr_[_pID].addr.transfer(_eth);

            // build event data
            _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
            _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;

            // fire withdraw and distribute event
            emit F3Devents.onWithdrawAndDistribute
            (
                msg.sender,
                plyr_[_pID].name,
                _eth,
                _eventData_.compressedData,
                _eventData_.compressedIDs,
                _eventData_.winnerAddr,
                _eventData_.winnerName,
                _eventData_.amountWon,
                _eventData_.newPot,
                _eventData_.P3DAmount,
                _eventData_.genAmount
            );

        // in any other situation
        } else {
            // get their earnings
            _eth = withdrawEarnings(_pID);

            // gib moni
            if (_eth > 0)
                plyr_[_pID].addr.transfer(_eth);

            // fire withdraw event
            emit F3Devents.onWithdraw(_pID, msg.sender, plyr_[_pID].name, _eth, _now);
        }
    }

    /**
     * @dev use these to register names.  they are just wrappers that will send the
     * registration requests to the PlayerBook contract.  So registering here is the
     * same as registering there.  UI will always display the last name you registered.
     * but you will still own all previously registered names to use as affiliate
     * links.
     * - must pay a registration fee.
     * - name must be unique
     * - names will be converted to lowercase
     * - name cannot start or end with a space
     * - cannot have more than 1 space in a row
     * - cannot be only numbers
     * - cannot start with 0x
     * - name must be at least 1 char
     * - max length of 32 characters long
     * - allowed characters: a-z, 0-9, and space
     * -functionhash- 0x921dec21 (using ID for affiliate)
     * -functionhash- 0x3ddd4698 (using address for affiliate)
     * -functionhash- 0x685ffd83 (using name for affiliate)
     * @param _nameString players desired name
     * @param _affCode affiliate ID, address, or name of who referred you
     * @param _all set to true if you want this to push your info to all games
     * (this might cost a lot of gas)
     */
    function registerNameXID(string _nameString, uint256 _affCode, bool _all)
        isHuman()
        public
        payable
    {
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXIDFromDapp.value(_paid)(_addr, _name, _affCode, _all);

        uint256 _pID = pIDxAddr_[_addr];

        // fire event
        emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, _paid, now);
    }

    function registerNameXaddr(string _nameString, address _affCode, bool _all)
        isHuman()
        public
        payable
    {
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXaddrFromDapp.value(msg.value)(msg.sender, _name, _affCode, _all);

        uint256 _pID = pIDxAddr_[_addr];

        // fire event
        emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, _paid, now);
    }

    function registerNameXname(string _nameString, bytes32 _affCode, bool _all)
        isHuman()
        public
        payable
    {
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        (bool _isNewPlayer, uint256 _affID) = PlayerBook.registerNameXnameFromDapp.value(msg.value)(msg.sender, _name, _affCode, _all);

        uint256 _pID = pIDxAddr_[_addr];

        // fire event
        emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, _paid, now);
    }
//==============================================================================
//     _  _ _|__|_ _  _ _  .
//    (_|(/_ |  | (/_| _\  . (for UI & viewing things on etherscan)
//=====_|=======================================================================
    /**
     * @dev return the price buyer will pay for next 1 individual key.
     * -functionhash- 0x018a25e8
     * @return price for next key bought (in wei format)
     */
    function getBuyPrice()
        public
        view
        returns(uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // are we in a round?
        if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].keys.add(1000000000000000000)).ethRec(1000000000000000000) );
        else // rounds over.  need price for new round
            return ( 75000000000000 ); // init
    }

    /**
     * @dev returns time left.  dont spam this, you'll ddos yourself from your node
     * provider
     * -functionhash- 0xc7e284b8
     * @return time left in seconds
     */
    function getTimeLeft()
        public
        view
        returns(uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        if (_now < round_[_rID].end)
            if (_now > round_[_rID].strt + rndGap_)
                return( (round_[_rID].end).sub(_now) );
            else
                return( (round_[_rID].strt + rndGap_).sub(_now) );
        else
            return(0);
    }

    /**
     * @dev returns player earnings per vaults
     * -functionhash- 0x63066434
     * @return winnings vault
     * @return general vault
     * @return affiliate vault
     */
    function getPlayerVaults(uint256 _pID)
        public
        view
        returns(uint256 ,uint256, uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // if round has ended.  but round end has not been run (so contract has not distributed winnings)
        if (now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].plyr != 0)
        {
            // if player is winner
            if (round_[_rID].plyr == _pID)
            {
                return
                (
                    (plyr_[_pID].win).add( ((round_[_rID].pot).mul(48)) / 100 ),
                    (plyr_[_pID].gen).add(  getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask)   ),
                    plyr_[_pID].aff
                );
            // if player is not the winner
            } else {
                return
                (
                    plyr_[_pID].win,
                    (plyr_[_pID].gen).add(  getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask)  ),
                    plyr_[_pID].aff
                );
            }

        // if round is still going on, or round has ended and round end has been ran
        } else {
            return
            (
                plyr_[_pID].win,
                (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd)),
                plyr_[_pID].aff
            );
        }
    }

    /**
     * solidity hates stack limits.  this lets us avoid that hate
     */
    function getPlayerVaultsHelper(uint256 _pID, uint256 _rID)
        private
        view
        returns(uint256)
    {
        return(  ((((round_[_rID].mask).add(((((round_[_rID].pot).mul(potSplit_[round_[_rID].team].gen)) / 100).mul(1000000000000000000)) / (round_[_rID].keys))).mul(plyrRnds_[_pID][_rID].keys)) / 1000000000000000000)  );
    }

    /**
     * @dev returns all current round info needed for front end
     * -functionhash- 0x747dff42
     * @return eth invested during ICO phase
     * @return round id
     * @return total keys for round
     * @return time round ends
     * @return time round started
     * @return current pot
     * @return current team ID & player ID in lead
     * @return current player in leads address
     * @return current player in leads name
     * @return whales eth in for round
     * @return bears eth in for round
     * @return sneks eth in for round
     * @return bulls eth in for round
     * @return airdrop tracker # & airdrop pot
     */
    function getCurrentRoundInfo()
        public
        view
        returns(uint256, uint256, uint256, uint256, uint256, uint256, uint256, address, bytes32, uint256, uint256, uint256, uint256, uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        return
        (
            round_[_rID].ico,               //0
            _rID,                           //1
            round_[_rID].keys,              //2
            round_[_rID].end,               //3
            round_[_rID].strt,              //4
            round_[_rID].pot,               //5
            (round_[_rID].team + (round_[_rID].plyr * 10)),     //6
            plyr_[round_[_rID].plyr].addr,  //7
            plyr_[round_[_rID].plyr].name,  //8
            rndTmEth_[_rID][0],             //9
            rndTmEth_[_rID][1],             //10
            rndTmEth_[_rID][2],             //11
            rndTmEth_[_rID][3],             //12
            airDropTracker_ + (airDropPot_ * 1000)              //13
        );
    }

    /**
     * @dev returns player info based on address.  if no address is given, it will
     * use msg.sender
     * -functionhash- 0xee0b5d8b
     * @param _addr address of the player you want to lookup
     * @return player ID
     * @return player name
     * @return keys owned (current round)
     * @return winnings vault
     * @return general vault
     * @return affiliate vault
	 * @return player round eth
     */
    function getPlayerInfoByAddress(address _addr)
        public
        view
        returns(uint256, bytes32, uint256, uint256, uint256, uint256, uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        if (_addr == address(0))
        {
            _addr == msg.sender;
        }
        uint256 _pID = pIDxAddr_[_addr];

        return
        (
            _pID,                               //0
            plyr_[_pID].name,                   //1
            plyrRnds_[_pID][_rID].keys,         //2
            plyr_[_pID].win,                    //3
            (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd)),       //4
            plyr_[_pID].aff,                    //5
            plyrRnds_[_pID][_rID].eth           //6
        );
    }

//==============================================================================
//     _ _  _ _   | _  _ . _  .
//    (_(_)| (/_  |(_)(_||(_  . (this + tools + calcs + modules = our softwares engine)
//=====================_|=======================================================
    /**
     * @dev logic runs whenever a buy order is executed.  determines how to handle
     * incoming eth depending on if we are in an active round or not
     */
    function buyCore(uint256 _pID, uint256 _affID, uint256 _team, F3Ddatasets.EventReturns memory _eventData_)
        private
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // if round is active
        if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
        {
            // call core
            core(_rID, _pID, msg.value, _affID, _team, _eventData_);

        // if round is not active
        } else {
            // check to see if end round needs to be ran
            if (_now > round_[_rID].end && round_[_rID].ended == false)
            {
                // end the round (distributes pot) & start new round
			    round_[_rID].ended = true;
                _eventData_ = endRound(_eventData_);

                // build event data
                _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
                _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;

                // fire buy and distribute event
                emit F3Devents.onBuyAndDistribute
                (
                    msg.sender,
                    plyr_[_pID].name,
                    msg.value,
                    _eventData_.compressedData,
                    _eventData_.compressedIDs,
                    _eventData_.winnerAddr,
                    _eventData_.winnerName,
                    _eventData_.amountWon,
                    _eventData_.newPot,
                    _eventData_.P3DAmount,
                    _eventData_.genAmount
                );
            }

            // put eth in players vault
            plyr_[_pID].gen = plyr_[_pID].gen.add(msg.value);
        }
    }

    /**
     * @dev logic runs whenever a reload order is executed.  determines how to handle
     * incoming eth depending on if we are in an active round or not
     */
    function reLoadCore(uint256 _pID, uint256 _affID, uint256 _team, uint256 _eth, F3Ddatasets.EventReturns memory _eventData_)
        private
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // if round is active
        if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
        {
            // get earnings from all vaults and return unused to gen vault
            // because we use a custom safemath library.  this will throw if player
            // tried to spend more eth than they have.
            plyr_[_pID].gen = withdrawEarnings(_pID).sub(_eth);

            // call core
            core(_rID, _pID, _eth, _affID, _team, _eventData_);

        // if round is not active and end round needs to be ran
        } else if (_now > round_[_rID].end && round_[_rID].ended == false) {
            // end the round (distributes pot) & start new round
            round_[_rID].ended = true;
            _eventData_ = endRound(_eventData_);

            // build event data
            _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
            _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;

            // fire buy and distribute event
            emit F3Devents.onReLoadAndDistribute
            (
                msg.sender,
                plyr_[_pID].name,
                _eventData_.compressedData,
                _eventData_.compressedIDs,
                _eventData_.winnerAddr,
                _eventData_.winnerName,
                _eventData_.amountWon,
                _eventData_.newPot,
                _eventData_.P3DAmount,
                _eventData_.genAmount
            );
        }
    }

    /**
     * @dev this is the core logic for any buy/reload that happens while a round
     * is live.
     */
    function core(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _affID, uint256 _team, F3Ddatasets.EventReturns memory _eventData_)
        private
    {
        // if player is new to round
        if (plyrRnds_[_pID][_rID].keys == 0)
            _eventData_ = managePlayer(_pID, _eventData_);

        // early round eth limiter
        if (round_[_rID].eth < preIcoMax_ && plyrRnds_[_pID][_rID].eth.add(_eth) > preIcoPerEth_)
        {
            uint256 _availableLimit = (preIcoPerEth_).sub(plyrRnds_[_pID][_rID].eth);
            uint256 _refund = _eth.sub(_availableLimit);
            plyr_[_pID].gen = plyr_[_pID].gen.add(_refund);
            _eth = _availableLimit;
        }

        // if eth left is greater than min eth allowed (sorry no pocket lint)
        if (_eth > 1000000000)
        {

            // mint the new keys
            uint256 _keys = (round_[_rID].eth).keysRec(_eth);

            // if they bought at least 1 whole key
            if (_keys >= 1000000000000000000)
            {
            updateTimer(_keys, _rID);

            // set new leaders
            if (round_[_rID].plyr != _pID)
                round_[_rID].plyr = _pID;
            if (round_[_rID].team != _team)
                round_[_rID].team = _team;

            // set the new leader bool to true
            _eventData_.compressedData = _eventData_.compressedData + 100;
        }

            // manage airdrops
            if (_eth >= 100000000000000000)
            {
            airDropTracker_++;
            if (airdrop() == true)
            {
                // gib muni
                uint256 _prize;
                if (_eth >= 10000000000000000000)
                {
                    // calculate prize and give it to winner
                    _prize = ((airDropPot_).mul(75)) / 100;
                    plyr_[_pID].win = (plyr_[_pID].win).add(_prize);

                    // adjust airDropPot
                    airDropPot_ = (airDropPot_).sub(_prize);

                    // let event know a tier 3 prize was won
                    _eventData_.compressedData += 300000000000000000000000000000000;
                } else if (_eth >= 1000000000000000000 && _eth < 10000000000000000000) {
                    // calculate prize and give it to winner
                    _prize = ((airDropPot_).mul(50)) / 100;
                    plyr_[_pID].win = (plyr_[_pID].win).add(_prize);

                    // adjust airDropPot
                    airDropPot_ = (airDropPot_).sub(_prize);

                    // let event know a tier 2 prize was won
                    _eventData_.compressedData += 200000000000000000000000000000000;
                } else if (_eth >= 100000000000000000 && _eth < 1000000000000000000) {
                    // calculate prize and give it to winner
                    _prize = ((airDropPot_).mul(25)) / 100;
                    plyr_[_pID].win = (plyr_[_pID].win).add(_prize);

                    // adjust airDropPot
                    airDropPot_ = (airDropPot_).sub(_prize);

                    // let event know a tier 3 prize was won
                    _eventData_.compressedData += 300000000000000000000000000000000;
                }
                // set airdrop happened bool to true
                _eventData_.compressedData += 10000000000000000000000000000000;
                // let event know how much was won
                _eventData_.compressedData += _prize * 1000000000000000000000000000000000;

                // reset air drop tracker
                airDropTracker_ = 0;
            }
        }

            // store the air drop tracker number (number of buys since last airdrop)
            _eventData_.compressedData = _eventData_.compressedData + (airDropTracker_ * 1000);

            // update player
            plyrRnds_[_pID][_rID].keys = _keys.add(plyrRnds_[_pID][_rID].keys);
            plyrRnds_[_pID][_rID].eth = _eth.add(plyrRnds_[_pID][_rID].eth);

            // update round
            round_[_rID].keys = _keys.add(round_[_rID].keys);
            round_[_rID].eth = _eth.add(round_[_rID].eth);
            rndTmEth_[_rID][_team] = _eth.add(rndTmEth_[_rID][_team]);

            // distribute eth
            _eventData_ = distributeExternal(_rID, _pID, _eth, _affID, _team, _eventData_);
            _eventData_ = distributeInternal(_rID, _pID, _eth, _team, _keys, _eventData_);

            // call end tx function to fire end tx event.
		    endTx(_pID, _team, _eth, _keys, _eventData_);
        }
    }
//==============================================================================
//     _ _ | _   | _ _|_ _  _ _  .
//    (_(_||(_|_||(_| | (_)| _\  .
//==============================================================================
    /**
     * @dev calculates unmasked earnings (just calculates, does not update mask)
     * @return earnings in wei format
     */
    function calcUnMaskedEarnings(uint256 _pID, uint256 _rIDlast)
        private
        view
        returns(uint256)
    {
        return(  (((round_[_rIDlast].mask).mul(plyrRnds_[_pID][_rIDlast].keys)) / (1000000000000000000)).sub(plyrRnds_[_pID][_rIDlast].mask)  );
    }

    /**
     * @dev returns the amount of keys you would get given an amount of eth.
     * -functionhash- 0xce89c80c
     * @param _rID round ID you want price for
     * @param _eth amount of eth sent in
     * @return keys received
     */
    function calcKeysReceived(uint256 _rID, uint256 _eth)
        public
        view
        returns(uint256)
    {
        // grab time
        uint256 _now = now;

        // are we in a round?
        if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].eth).keysRec(_eth) );
        else // rounds over.  need keys for new round
            return ( (_eth).keys() );
    }

    /**
     * @dev returns current eth price for X keys.
     * -functionhash- 0xcf808000
     * @param _keys number of keys desired (in 18 decimal format)
     * @return amount of eth needed to send
     */
    function iWantXKeys(uint256 _keys)
        public
        view
        returns(uint256)
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab time
        uint256 _now = now;

        // are we in a round?
        if (_now > round_[_rID].strt + rndGap_ && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].keys.add(_keys)).ethRec(_keys) );
        else // rounds over.  need price for new round
            return ( (_keys).eth() );
    }
//==============================================================================
//    _|_ _  _ | _  .
//     | (_)(_)|_\  .
//==============================================================================
    /**
	 * @dev receives name/player info from names contract
     */
    function receivePlayerInfo(uint256 _pID, address _addr, bytes32 _name, uint256 _laff)
        external
    {
        require (msg.sender == address(PlayerBook), "your not playerNames contract... hmmm..");
        if (pIDxAddr_[_addr] != _pID)
            pIDxAddr_[_addr] = _pID;
        if (pIDxName_[_name] != _pID)
            pIDxName_[_name] = _pID;
        if (plyr_[_pID].addr != _addr)
            plyr_[_pID].addr = _addr;
        if (plyr_[_pID].name != _name)
            plyr_[_pID].name = _name;
        if (plyr_[_pID].laff != _laff)
            plyr_[_pID].laff = _laff;
        if (plyrNames_[_pID][_name] == false)
            plyrNames_[_pID][_name] = true;
    }

    /**
     * @dev receives entire player name list
     */
    function receivePlayerNameList(uint256 _pID, bytes32 _name)
        external
    {
        require (msg.sender == address(PlayerBook), "your not playerNames contract... hmmm..");
        if(plyrNames_[_pID][_name] == false)
            plyrNames_[_pID][_name] = true;
    }

    /**
     * @dev gets existing or registers new pID.  use this when a player may be new
     * @return pID
     */
    function determinePID(F3Ddatasets.EventReturns memory _eventData_)
        private
        returns (F3Ddatasets.EventReturns)
    {
        uint256 _pID = pIDxAddr_[msg.sender];
        // if player is new to this version of fomo3d
        if (_pID == 0)
        {
            // grab their player ID, name and last aff ID, from player names contract
            _pID = PlayerBook.getPlayerID(msg.sender);
            bytes32 _name = PlayerBook.getPlayerName(_pID);
            uint256 _laff = PlayerBook.getPlayerLAff(_pID);

            // set up player account
            pIDxAddr_[msg.sender] = _pID;
            plyr_[_pID].addr = msg.sender;

            if (_name != "")
            {
                pIDxName_[_name] = _pID;
                plyr_[_pID].name = _name;
                plyrNames_[_pID][_name] = true;
            }

            if (_laff != 0 && _laff != _pID)
                plyr_[_pID].laff = _laff;

            // set the new player bool to true
            _eventData_.compressedData = _eventData_.compressedData + 1;
        }
        return (_eventData_);
    }

    /**
     * @dev checks to make sure user picked a valid team.  if not sets team
     * to default (sneks)
     */
    function verifyTeam(uint256 _team)
        private
        pure
        returns (uint256)
    {
        if (_team < 0 || _team > 3)
            return(2);
        else
            return(_team);
    }

    /**
     * @dev decides if round end needs to be run & new round started.  and if
     * player unmasked earnings from previously played rounds need to be moved.
     */
    function managePlayer(uint256 _pID, F3Ddatasets.EventReturns memory _eventData_)
        private
        returns (F3Ddatasets.EventReturns)
    {
        // if player has played a previous round, move their unmasked earnings
        // from that round to gen vault.
        if (plyr_[_pID].lrnd != 0)
            updateGenVault(_pID, plyr_[_pID].lrnd);

        // update player's last round played
        plyr_[_pID].lrnd = rID_;

        // set the joined round bool to true
        _eventData_.compressedData = _eventData_.compressedData + 10;

        return(_eventData_);
    }

    /**
     * @dev ends the round. manages paying out winner/splitting up pot
     */
    function endRound(F3Ddatasets.EventReturns memory _eventData_)
        private
        returns (F3Ddatasets.EventReturns)
    {
        // setup local rID
        uint256 _rID = rID_;

        // grab our winning player and team id's
        uint256 _winPID = round_[_rID].plyr;
        uint256 _winTID = round_[_rID].team;

        // grab our pot amount
        uint256 _pot = round_[_rID].pot;

        // calculate our winner share, community rewards, gen share,
        // p3d share, and amount reserved for next pot
        uint256 _win = (_pot.mul(48)) / 100;
        uint256 _com = (_pot / 50);
        uint256 _gen = (_pot.mul(potSplit_[_winTID].gen)) / 100;
        uint256 _p3d = (_pot.mul(potSplit_[_winTID].p3d)) / 100;
        uint256 _res = (((_pot.sub(_win)).sub(_com)).sub(_gen)).sub(_p3d);

        // calculate ppt for round mask
        uint256 _ppt = (_gen.mul(1000000000000000000)) / (round_[_rID].keys);
        uint256 _dust = _gen.sub((_ppt.mul(round_[_rID].keys)) / 1000000000000000000);
        if (_dust > 0)
        {
            _gen = _gen.sub(_dust);
            _res = _res.add(_dust);
        }

        // pay our winner
        plyr_[_winPID].win = _win.add(plyr_[_winPID].win);

        // community rewards
        _com = _com.add(_p3d.sub(_p3d / 2));
        admin.transfer(_com);

        _res = _res.add(_p3d / 2);

        // distribute gen portion to key holders
        round_[_rID].mask = _ppt.add(round_[_rID].mask);

        // prepare event data
        _eventData_.compressedData = _eventData_.compressedData + (round_[_rID].end * 1000000);
        _eventData_.compressedIDs = _eventData_.compressedIDs + (_winPID * 100000000000000000000000000) + (_winTID * 100000000000000000);
        _eventData_.winnerAddr = plyr_[_winPID].addr;
        _eventData_.winnerName = plyr_[_winPID].name;
        _eventData_.amountWon = _win;
        _eventData_.genAmount = _gen;
        _eventData_.P3DAmount = _p3d;
        _eventData_.newPot = _res;

        // start next round
        rID_++;
        _rID++;
        round_[_rID].strt = now;
        round_[_rID].end = now.add(rndInit_).add(rndGap_);
        round_[_rID].pot = _res;

        return(_eventData_);
    }

    /**
     * @dev moves any unmasked earnings to gen vault.  updates earnings mask
     */
    function updateGenVault(uint256 _pID, uint256 _rIDlast)
        private
    {
        uint256 _earnings = calcUnMaskedEarnings(_pID, _rIDlast);
        if (_earnings > 0)
        {
            // put in gen vault
            plyr_[_pID].gen = _earnings.add(plyr_[_pID].gen);
            // zero out their earnings by updating mask
            plyrRnds_[_pID][_rIDlast].mask = _earnings.add(plyrRnds_[_pID][_rIDlast].mask);
        }
    }

    /**
     * @dev updates round timer based on number of whole keys bought.
     */
    function updateTimer(uint256 _keys, uint256 _rID)
        private
    {
        // grab time
        uint256 _now = now;

        // calculate time based on number of keys bought
        uint256 _newTime;
        if (_now > round_[_rID].end && round_[_rID].plyr == 0)
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(_now);
        else
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(round_[_rID].end);

        // compare to max and set new end time
        if (_newTime < (rndMax_).add(_now))
            round_[_rID].end = _newTime;
        else
            round_[_rID].end = rndMax_.add(_now);
    }

    /**
     * @dev generates a random number between 0-99 and checks to see if thats
     * resulted in an airdrop win
     * @return do we have a winner?
     */
    function airdrop()
        private
        view
        returns(bool)
    {
        uint256 seed = uint256(keccak256(abi.encodePacked(

            (block.timestamp).add
            (block.difficulty).add
            ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add
            (block.gaslimit).add
            ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).add
            (block.number)

        )));
        if((seed - ((seed / 1000) * 1000)) < airDropTracker_)
            return(true);
        else
            return(false);
    }

    /**
     * @dev distributes eth based on fees to com, aff, and p3d
     */
    function distributeExternal(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _affID, uint256 _team, F3Ddatasets.EventReturns memory _eventData_)
        private
        returns(F3Ddatasets.EventReturns)
    {
        // pay 3% out to community rewards
        uint256 _p1 = _eth / 100;
        uint256 _com = _eth / 50;
        _com = _com.add(_p1);

        uint256 _p3d;
        if (!address(admin)...

// [truncated — 70422 bytes total]

Read Contract

activated_ 0xd53b2679 → bool
airDropPot_ 0xd87574e0 → uint256
airDropTracker_ 0x11a09ae7 → uint256
calcKeysReceived 0xce89c80c → uint256
fees_ 0x2ce21999 → uint256, uint256
getBuyPrice 0x018a25e8 → uint256
getCurrentRoundInfo 0x747dff42 → uint256, uint256, uint256, uint256, uint256, uint256, uint256, address, bytes32, uint256, uint256, uint256, uint256, uint256
getPlayerInfoByAddress 0xee0b5d8b → uint256, bytes32, uint256, uint256, uint256, uint256, uint256
getPlayerVaults 0x63066434 → uint256, uint256, uint256
getTimeLeft 0xc7e284b8 → uint256
iWantXKeys 0xcf808000 → uint256
name 0x06fdde03 → string
pIDxAddr_ 0x10f01eba → uint256
pIDxName_ 0x2e19ebdc → uint256
plyrNames_ 0x2660316e → bool
plyrRnds_ 0xa2bccae9 → uint256, uint256, uint256, uint256
plyr_ 0xde7874f3 → address, bytes32, uint256, uint256, uint256, uint256, uint256
potSplit_ 0xc519500e → uint256, uint256
rID_ 0x624ae5c0 → uint256
rndTmEth_ 0x5893d481 → uint256
round_ 0x24c33d33 → uint256, uint256, uint256, bool, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256
symbol 0x95d89b41 → string

Write Contract 14 functions

These functions modify contract state and require a wallet transaction to execute.

activate 0x0f15f4c0
No parameters
buyXaddr 0x98a0871d
address _affCode
uint256 _team
buyXid 0x8f38f309
uint256 _affCode
uint256 _team
buyXname 0xa65b37a1
bytes32 _affCode
uint256 _team
potSwap 0xed78cf4a
No parameters
reLoadXaddr 0x82bfc739
address _affCode
uint256 _team
uint256 _eth
reLoadXid 0x349cdcac
uint256 _affCode
uint256 _team
uint256 _eth
reLoadXname 0x079ce327
bytes32 _affCode
uint256 _team
uint256 _eth
receivePlayerInfo 0x49cc635d
uint256 _pID
address _addr
bytes32 _name
uint256 _laff
receivePlayerNameList 0x8f7140ea
uint256 _pID
bytes32 _name
registerNameXID 0x921dec21
string _nameString
uint256 _affCode
bool _all
registerNameXaddr 0x3ddd4698
string _nameString
address _affCode
bool _all
registerNameXname 0x685ffd83
string _nameString
bytes32 _affCode
bool _all
withdraw 0x3ccfd60b
No parameters

Token Balances (1)

View Transfers →
WETH 0

Recent Transactions

No transactions found for this address