├── .gitignore ├── README.md ├── box-img-lg.png ├── box-img-sm.png ├── bs-config.json ├── contracts ├── CorpBank.sol ├── F3Devents.sol ├── FoMo3Dlong.sol ├── FundForwarder.sol ├── ModularLong.sol ├── PlayerBook.sol ├── Team.sol ├── interface │ ├── F3DexternalSettingsInterface.sol │ ├── FundForwarderInterface.sol │ ├── FundInterfaceForForwarder.sol │ ├── HourglassInterface.sol │ ├── PlayerBookInterface.sol │ ├── PlayerBookReceiverInterface.sol │ ├── TeamInterface.sol │ └── otherFoMo3D.sol └── library │ ├── F3DKeysCalcLong.sol │ ├── F3Ddatasets.sol │ ├── MSFun.sol │ ├── NameFilter.sol │ ├── SafeMath.sol │ └── UintCompressor.sol ├── eth_config.json ├── f.json ├── flattener.sh ├── instant_seal.json ├── package-lock.json ├── package.json ├── src ├── css │ ├── alertify.css │ ├── base.css │ ├── bootstrap.min.css │ ├── custom.css │ └── ghostframe.css ├── img │ ├── purple_bg.jpg │ ├── snorting_in_progress_pepe.png │ ├── tbear.png │ ├── tbull.png │ ├── tsnek.png │ └── twhale.png ├── index.html └── js │ ├── alertify.js │ ├── bootstrap.bundle.js │ ├── bundle.js │ ├── clipboard.min.js │ ├── fontawesome-all.min.js │ ├── jquery-3.2.0.min.js │ └── srcbd.js ├── truffle.js └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | *DS_Store 2 | build/* 3 | node_modules/* 4 | test/* 5 | flat_contracts/* 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 说明 2 | 本代码核心部分从fomo3d摘取过来,分拆,按照类来存放。然后按照我的理解,裁剪了一部分的代码,特别是把跟p3d相关的东西去掉。然后重新命名了一些合约。把otherF3D_的相关逻辑干掉了,那部分收益给了社区。 3 | 4 | 具体可以对比项目 5 | https://github.com/reedhong/fomo3d_clone 6 | 7 | 前端进入src,直接: 8 | npm run dev 9 | 10 | 欢迎交流咨询:noding(微信) 11 | 12 | ![](https://github.com/reedhong/fomo3d_clone/blob/master/src/images/wechat.jpeg) 13 | 14 | 有专门的群,不过,最近加群的非常多。群内讨论热烈,已经汇集了来不少知名项目团队的核心项目人员。人员来自全球各地。为了提高群的质量,采取付费入群的方式。 15 | -------------------------------------------------------------------------------- /box-img-lg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/box-img-lg.png -------------------------------------------------------------------------------- /box-img-sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/box-img-sm.png -------------------------------------------------------------------------------- /bs-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": { 3 | "baseDir": ["./src", "./build/contracts"] 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /contracts/CorpBank.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | import 'zeppelin-solidity/contracts/ownership/Ownable.sol'; 4 | import 'zeppelin-solidity/contracts/math/SafeMath.sol'; 5 | 6 | 7 | contract CorpBank is Ownable { 8 | using SafeMath for uint256; 9 | 10 | event RefundValue(address, uint256 value); 11 | event DepositValue(address investor, uint256 value); 12 | 13 | address public wallet; 14 | 15 | constructor(address _wallet) 16 | public 17 | { 18 | require(_wallet != address(0)); 19 | wallet = _wallet; 20 | } 21 | 22 | mapping (address => uint256) public deposited; 23 | 24 | function deposit(address investor) public payable { 25 | //require(state == State.Active); 26 | emit DepositValue(investor, msg.value); 27 | } 28 | 29 | function setWallet(address _wallet) onlyOwner public { 30 | require(_wallet != address(0)); 31 | wallet = _wallet; 32 | } 33 | 34 | function migrationReceiver_setup() external 35 | returns (bool){ 36 | return true; 37 | } 38 | 39 | function refund(address investor) onlyOwner public { 40 | wallet.transfer(address(this).balance); 41 | emit RefundValue(wallet, address(this).balance); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /contracts/F3Devents.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | contract F3Devents { 4 | // fired whenever a player registers a name 5 | event onNewName 6 | ( 7 | uint256 indexed playerID, 8 | address indexed playerAddress, 9 | bytes32 indexed playerName, 10 | bool isNewPlayer, 11 | uint256 affiliateID, 12 | address affiliateAddress, 13 | bytes32 affiliateName, 14 | uint256 amountPaid, 15 | uint256 timeStamp 16 | ); 17 | 18 | // fired at end of buy or reload 19 | event onEndTx 20 | ( 21 | uint256 compressedData, 22 | uint256 compressedIDs, 23 | bytes32 playerName, 24 | address playerAddress, 25 | uint256 ethIn, 26 | uint256 keysBought, 27 | address winnerAddr, 28 | bytes32 winnerName, 29 | uint256 amountWon, 30 | uint256 newPot, 31 | uint256 P3DAmount, 32 | uint256 genAmount, 33 | uint256 potAmount, 34 | uint256 airDropPot 35 | ); 36 | 37 | // fired whenever theres a withdraw 38 | event onWithdraw 39 | ( 40 | uint256 indexed playerID, 41 | address playerAddress, 42 | bytes32 playerName, 43 | uint256 ethOut, 44 | uint256 timeStamp 45 | ); 46 | 47 | // fired whenever a withdraw forces end round to be ran 48 | event onWithdrawAndDistribute 49 | ( 50 | address playerAddress, 51 | bytes32 playerName, 52 | uint256 ethOut, 53 | uint256 compressedData, 54 | uint256 compressedIDs, 55 | address winnerAddr, 56 | bytes32 winnerName, 57 | uint256 amountWon, 58 | uint256 newPot, 59 | uint256 P3DAmount, 60 | uint256 genAmount 61 | ); 62 | 63 | // (fomo3d long only) fired whenever a player tries a buy after round timer 64 | // hit zero, and causes end round to be ran. 65 | event onBuyAndDistribute 66 | ( 67 | address playerAddress, 68 | bytes32 playerName, 69 | uint256 ethIn, 70 | uint256 compressedData, 71 | uint256 compressedIDs, 72 | address winnerAddr, 73 | bytes32 winnerName, 74 | uint256 amountWon, 75 | uint256 newPot, 76 | uint256 P3DAmount, 77 | uint256 genAmount 78 | ); 79 | 80 | // (fomo3d long only) fired whenever a player tries a reload after round timer 81 | // hit zero, and causes end round to be ran. 82 | event onReLoadAndDistribute 83 | ( 84 | address playerAddress, 85 | bytes32 playerName, 86 | uint256 compressedData, 87 | uint256 compressedIDs, 88 | address winnerAddr, 89 | bytes32 winnerName, 90 | uint256 amountWon, 91 | uint256 newPot, 92 | uint256 P3DAmount, 93 | uint256 genAmount 94 | ); 95 | 96 | // fired whenever an affiliate is paid 97 | event onAffiliatePayout 98 | ( 99 | uint256 indexed affiliateID, 100 | address affiliateAddress, 101 | bytes32 affiliateName, 102 | uint256 indexed roundID, 103 | uint256 indexed buyerID, 104 | uint256 amount, 105 | uint256 timeStamp 106 | ); 107 | 108 | // received pot swap deposit 109 | event onPotSwapDeposit 110 | ( 111 | uint256 roundID, 112 | uint256 amountAddedToPot 113 | ); 114 | } -------------------------------------------------------------------------------- /contracts/FundForwarder.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | interface FundInterfaceForForwarder { 3 | function deposit(address _addr) external payable returns (bool); 4 | function migrationReceiver_setup() external returns (bool); 5 | } 6 | 7 | contract FundForwarder { 8 | string public name = "FundForwarder"; 9 | FundInterfaceForForwarder private currentCorpBank_; 10 | address private newCorpBank_; 11 | bool needsBank_ = true; 12 | 13 | constructor() 14 | public 15 | { 16 | //constructor does nothing. 17 | } 18 | 19 | function() 20 | public 21 | payable 22 | { 23 | // done so that if any one tries to dump eth into this contract, we can 24 | // just forward it to corp bank. 25 | currentCorpBank_.deposit.value(address(this).balance)(address(currentCorpBank_)); 26 | } 27 | 28 | function deposit() 29 | public 30 | payable 31 | returns(bool) 32 | { 33 | require(msg.value > 0, "Forwarder Deposit failed - zero deposits not allowed"); 34 | require(needsBank_ == false, "Forwarder Deposit failed - no registered bank"); 35 | //wallet.transfer(toFund); 36 | if (currentCorpBank_.deposit.value(msg.value)(msg.sender) == true) 37 | return(true); 38 | else 39 | return(false); 40 | } 41 | //============================================================================== 42 | // _ _ . _ _ _ _|_. _ _ . 43 | // | | ||(_|| (_| | |(_)| | . 44 | //===========_|================================================================= 45 | function status() 46 | public 47 | view 48 | returns(address, address, bool) 49 | { 50 | return(address(currentCorpBank_), address(newCorpBank_), needsBank_); 51 | } 52 | 53 | function startMigration(address _newCorpBank) 54 | external 55 | returns(bool) 56 | { 57 | // make sure this is coming from current corp bank 58 | require(msg.sender == address(currentCorpBank_), "Forwarder startMigration failed - msg.sender must be current corp bank"); 59 | 60 | // communicate with the new corp bank and make sure it has the forwarder 61 | // registered 62 | if(FundInterfaceForForwarder(_newCorpBank).migrationReceiver_setup() == true) 63 | { 64 | // save our new corp bank address 65 | newCorpBank_ = _newCorpBank; 66 | return (true); 67 | } else 68 | return (false); 69 | } 70 | 71 | function cancelMigration() 72 | external 73 | returns(bool) 74 | { 75 | // make sure this is coming from the current corp bank (also lets us know 76 | // that current corp bank has not been killed) 77 | require(msg.sender == address(currentCorpBank_), "Forwarder cancelMigration failed - msg.sender must be current corp bank"); 78 | 79 | // erase stored new corp bank address; 80 | newCorpBank_ = address(0x0); 81 | 82 | return (true); 83 | } 84 | 85 | function finishMigration() 86 | external 87 | returns(bool) 88 | { 89 | // make sure its coming from new corp bank 90 | require(msg.sender == newCorpBank_, "Forwarder finishMigration failed - msg.sender must be new corp bank"); 91 | 92 | // update corp bank address 93 | currentCorpBank_ = (FundInterfaceForForwarder(newCorpBank_)); 94 | 95 | // erase new corp bank address 96 | newCorpBank_ = address(0x0); 97 | 98 | return (true); 99 | } 100 | //============================================================================== 101 | // . _ ._|_. _ | _ _ _|_ _ . 102 | // || || | |(_|| _\(/_ | |_||_) . (this only runs once ever) 103 | //==============================|=============================================== 104 | function setup(address _firstCorpBank) 105 | external 106 | { 107 | require(needsBank_ == true, "Forwarder setup failed - corp bank already registered"); 108 | currentCorpBank_ = FundInterfaceForForwarder(_firstCorpBank); 109 | needsBank_ = false; 110 | } 111 | } -------------------------------------------------------------------------------- /contracts/ModularLong.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | import "./F3Devents.sol"; 4 | 5 | contract ModularLong is F3Devents {} -------------------------------------------------------------------------------- /contracts/PlayerBook.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | import "./library/SafeMath.sol"; 4 | import "./library/NameFilter.sol"; 5 | import "./library/MSFun.sol"; 6 | 7 | import "./interface/TeamInterface.sol"; 8 | import "./interface/FundForwarderInterface.sol"; 9 | import "./interface/PlayerBookReceiverInterface.sol"; 10 | 11 | 12 | 13 | contract PlayerBook { 14 | using NameFilter for string; 15 | using SafeMath for uint256; 16 | 17 | address constant private DEV_1_ADDRESS = 0x006B332340d355280B3F7aa2b33ea0AB0f5706E9; 18 | bytes32 constant private DEV_1_NAME = "richer"; 19 | 20 | 21 | FundForwarderInterface constant private FundForwarder = FundForwarderInterface(0x884b2e7e1A722f03BcEa664852b33b4Eb715344e); 22 | TeamInterface constant private TeamJust = TeamInterface(0x7c26d471ffa4f6A867D7FdF11893C36c1d4810c3); 23 | 24 | MSFun.Data private msData; 25 | 26 | function multiSigDev(bytes32 _whatFunction) private returns (bool) {return(MSFun.multiSig(msData, TeamJust.requiredDevSignatures(), _whatFunction));} 27 | function deleteProposal(bytes32 _whatFunction) private {MSFun.deleteProposal(msData, _whatFunction);} 28 | function deleteAnyProposal(bytes32 _whatFunction) onlyDevs() public {MSFun.deleteProposal(msData, _whatFunction);} 29 | function checkData(bytes32 _whatFunction) onlyDevs() public view returns(bytes32, uint256) {return(MSFun.checkMsgData(msData, _whatFunction), MSFun.checkCount(msData, _whatFunction));} 30 | function checkSignersByAddress(bytes32 _whatFunction, uint256 _signerA, uint256 _signerB, uint256 _signerC) onlyDevs() public view returns(address, address, address) {return(MSFun.checkSigner(msData, _whatFunction, _signerA), MSFun.checkSigner(msData, _whatFunction, _signerB), MSFun.checkSigner(msData, _whatFunction, _signerC));} 31 | function checkSignersByName(bytes32 _whatFunction, uint256 _signerA, uint256 _signerB, uint256 _signerC) onlyDevs() public view returns(bytes32, bytes32, bytes32) {return(TeamJust.adminName(MSFun.checkSigner(msData, _whatFunction, _signerA)), TeamJust.adminName(MSFun.checkSigner(msData, _whatFunction, _signerB)), TeamJust.adminName(MSFun.checkSigner(msData, _whatFunction, _signerC)));} 32 | //============================================================================== 33 | // _| _ _|_ _ _ _ _|_ _ . 34 | // (_|(_| | (_| _\(/_ | |_||_) . 35 | //=============================|================================================ 36 | uint256 public registrationFee_ = 10 finney; // price to register a name 37 | 38 | // game 需要实现PlayerBookReceiverInterface的接口 39 | mapping(uint256 => PlayerBookReceiverInterface) public games_; // mapping of our game interfaces for sending your account info to games 40 | mapping(address => bytes32) public gameNames_; // lookup a games name 41 | mapping(address => uint256) public gameIDs_; // lokup a games ID 42 | uint256 public gID_; // total number of games 43 | uint256 public pID_; // total number of players 44 | mapping (address => uint256) public pIDxAddr_; // (addr => pID) returns player id by address 45 | mapping (bytes32 => uint256) public pIDxName_; // (name => pID) returns player id by name 46 | mapping (uint256 => Player) public plyr_; // (pID => data) player data 47 | mapping (uint256 => mapping (bytes32 => bool)) public plyrNames_; // (pID => name => bool) list of names a player owns. (used so you can change your display name amoungst any name you own) 48 | mapping (uint256 => mapping (uint256 => bytes32)) public plyrNameList_; // (pID => nameNum => name) list of names a player owns 49 | struct Player { 50 | address addr; 51 | bytes32 name; 52 | uint256 laff; 53 | uint256 names; 54 | } 55 | //============================================================================== 56 | // _ _ _ __|_ _ __|_ _ _ . 57 | // (_(_)| |_\ | | |_|(_ | (_)| . (initial data setup upon contract deploy) 58 | //============================================================================== 59 | constructor() 60 | public 61 | { 62 | // premine the dev names (sorry not sorry) 63 | // No keys are purchased with this method, it's simply locking our addresses, 64 | // PID's and names for referral codes. 65 | plyr_[1].addr = DEV_1_ADDRESS; 66 | plyr_[1].name = DEV_1_NAME; 67 | plyr_[1].names = 1; 68 | pIDxAddr_[DEV_1_ADDRESS] = 1; 69 | pIDxName_[DEV_1_NAME] = 1; 70 | plyrNames_[1][DEV_1_NAME] = true; 71 | plyrNameList_[1][1] = DEV_1_NAME; 72 | 73 | pID_ = 1; 74 | } 75 | //============================================================================== 76 | // _ _ _ _|. |`. _ _ _ . 77 | // | | |(_)(_||~|~|(/_| _\ . (these are safety checks) 78 | //============================================================================== 79 | /** 80 | * @dev prevents contracts from interacting with fomo3d 81 | */ 82 | modifier isHuman() { 83 | address _addr = msg.sender; 84 | uint256 _codeLength; 85 | 86 | assembly {_codeLength := extcodesize(_addr)} 87 | require(_codeLength == 0, "sorry humans only"); 88 | _; 89 | } 90 | 91 | modifier onlyDevs() 92 | { 93 | require(TeamJust.isDev(msg.sender) == true, "msg sender is not a dev"); 94 | _; 95 | } 96 | 97 | modifier isRegisteredGame() 98 | { 99 | require(gameIDs_[msg.sender] != 0); 100 | _; 101 | } 102 | //============================================================================== 103 | // _ _ _ _|_ _ . 104 | // (/_\/(/_| | | _\ . 105 | //============================================================================== 106 | // fired whenever a player registers a name 107 | event onNewName 108 | ( 109 | uint256 indexed playerID, 110 | address indexed playerAddress, 111 | bytes32 indexed playerName, 112 | bool isNewPlayer, 113 | uint256 affiliateID, 114 | address affiliateAddress, 115 | bytes32 affiliateName, 116 | uint256 amountPaid, 117 | uint256 timeStamp 118 | ); 119 | //============================================================================== 120 | // _ _ _|__|_ _ _ _ . 121 | // (_|(/_ | | (/_| _\ . (for UI & viewing things on etherscan) 122 | //=====_|======================================================================= 123 | function checkIfNameValid(string _nameStr) 124 | public 125 | view 126 | returns(bool) 127 | { 128 | bytes32 _name = _nameStr.nameFilter(); 129 | if (pIDxName_[_name] == 0) 130 | return (true); 131 | else 132 | return (false); 133 | } 134 | //============================================================================== 135 | // _ |_ |. _ |` _ __|_. _ _ _ . 136 | // |_)|_||_)||(_ ~|~|_|| |(_ | |(_)| |_\ . (use these to interact with contract) 137 | //====|========================================================================= 138 | /** 139 | * @dev registers a name. UI will always display the last name you registered. 140 | * but you will still own all previously registered names to use as affiliate 141 | * links. 142 | * - must pay a registration fee. 143 | * - name must be unique 144 | * - names will be converted to lowercase 145 | * - name cannot start or end with a space 146 | * - cannot have more than 1 space in a row 147 | * - cannot be only numbers 148 | * - cannot start with 0x 149 | * - name must be at least 1 char 150 | * - max length of 32 characters long 151 | * - allowed characters: a-z, 0-9, and space 152 | * -functionhash- 0x921dec21 (using ID for affiliate) 153 | * -functionhash- 0x3ddd4698 (using address for affiliate) 154 | * -functionhash- 0x685ffd83 (using name for affiliate) 155 | * @param _nameString players desired name 156 | * @param _affCode affiliate ID, address, or name of who refered you 157 | * @param _all set to true if you want this to push your info to all games 158 | * (this might cost a lot of gas) 159 | */ 160 | function registerNameXID(string _nameString, uint256 _affCode, bool _all) 161 | isHuman() 162 | public 163 | payable 164 | { 165 | // make sure name fees paid 166 | require (msg.value >= registrationFee_, "umm..... you have to pay the name fee"); 167 | 168 | // filter name + condition checks 169 | bytes32 _name = NameFilter.nameFilter(_nameString); 170 | 171 | // set up address 172 | address _addr = msg.sender; 173 | 174 | // set up our tx event data and determine if player is new or not 175 | bool _isNewPlayer = determinePID(_addr); 176 | 177 | // fetch player id 178 | uint256 _pID = pIDxAddr_[_addr]; 179 | 180 | // manage affiliate residuals 181 | // if no affiliate code was given, no new affiliate code was given, or the 182 | // player tried to use their own pID as an affiliate code, lolz 183 | if (_affCode != 0 && _affCode != plyr_[_pID].laff && _affCode != _pID) 184 | { 185 | // update last affiliate 186 | plyr_[_pID].laff = _affCode; 187 | } else if (_affCode == _pID) { 188 | _affCode = 0; 189 | } 190 | 191 | // register name 192 | registerNameCore(_pID, _addr, _affCode, _name, _isNewPlayer, _all); 193 | } 194 | 195 | function registerNameXaddr(string _nameString, address _affCode, bool _all) 196 | isHuman() 197 | public 198 | payable 199 | { 200 | // make sure name fees paid 201 | require (msg.value >= registrationFee_, "umm..... you have to pay the name fee"); 202 | 203 | // filter name + condition checks 204 | bytes32 _name = NameFilter.nameFilter(_nameString); 205 | 206 | // set up address 207 | address _addr = msg.sender; 208 | 209 | // set up our tx event data and determine if player is new or not 210 | bool _isNewPlayer = determinePID(_addr); 211 | 212 | // fetch player id 213 | uint256 _pID = pIDxAddr_[_addr]; 214 | 215 | // manage affiliate residuals 216 | // if no affiliate code was given or player tried to use their own, lolz 217 | uint256 _affID; 218 | if (_affCode != address(0) && _affCode != _addr) 219 | { 220 | // get affiliate ID from aff Code 221 | _affID = pIDxAddr_[_affCode]; 222 | 223 | // if affID is not the same as previously stored 224 | if (_affID != plyr_[_pID].laff) 225 | { 226 | // update last affiliate 227 | plyr_[_pID].laff = _affID; 228 | } 229 | } 230 | 231 | // register name 232 | registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all); 233 | } 234 | 235 | function registerNameXname(string _nameString, bytes32 _affCode, bool _all) 236 | isHuman() 237 | public 238 | payable 239 | { 240 | // make sure name fees paid 241 | require (msg.value >= registrationFee_, "umm..... you have to pay the name fee"); 242 | 243 | // filter name + condition checks 244 | bytes32 _name = NameFilter.nameFilter(_nameString); 245 | 246 | // set up address 247 | address _addr = msg.sender; 248 | 249 | // set up our tx event data and determine if player is new or not 250 | bool _isNewPlayer = determinePID(_addr); 251 | 252 | // fetch player id 253 | uint256 _pID = pIDxAddr_[_addr]; 254 | 255 | // manage affiliate residuals 256 | // if no affiliate code was given or player tried to use their own, lolz 257 | uint256 _affID; 258 | if (_affCode != "" && _affCode != _name) 259 | { 260 | // get affiliate ID from aff Code 261 | _affID = pIDxName_[_affCode]; 262 | 263 | // if affID is not the same as previously stored 264 | if (_affID != plyr_[_pID].laff) 265 | { 266 | // update last affiliate 267 | plyr_[_pID].laff = _affID; 268 | } 269 | } 270 | 271 | // register name 272 | registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all); 273 | } 274 | 275 | /** 276 | * @dev players, if you registered a profile, before a game was released, or 277 | * set the all bool to false when you registered, use this function to push 278 | * your profile to a single game. also, if you've updated your name, you 279 | * can use this to push your name to games of your choosing. 280 | * -functionhash- 0x81c5b206 281 | * @param _gameID game id 282 | */ 283 | function addMeToGame(uint256 _gameID) 284 | isHuman() 285 | public 286 | { 287 | require(_gameID <= gID_, "silly player, that game doesn't exist yet"); 288 | address _addr = msg.sender; 289 | uint256 _pID = pIDxAddr_[_addr]; 290 | require(_pID != 0, "hey there buddy, you dont even have an account"); 291 | uint256 _totalNames = plyr_[_pID].names; 292 | 293 | // add players profile and most recent name 294 | games_[_gameID].receivePlayerInfo(_pID, _addr, plyr_[_pID].name, plyr_[_pID].laff); 295 | 296 | // add list of all names 297 | if (_totalNames > 1) 298 | for (uint256 ii = 1; ii <= _totalNames; ii++) 299 | games_[_gameID].receivePlayerNameList(_pID, plyrNameList_[_pID][ii]); 300 | } 301 | 302 | /** 303 | * @dev players, use this to push your player profile to all registered games. 304 | * -functionhash- 0x0c6940ea 305 | */ 306 | function addMeToAllGames() 307 | isHuman() 308 | public 309 | { 310 | address _addr = msg.sender; 311 | uint256 _pID = pIDxAddr_[_addr]; 312 | require(_pID != 0, "hey there buddy, you dont even have an account"); 313 | uint256 _laff = plyr_[_pID].laff; 314 | uint256 _totalNames = plyr_[_pID].names; 315 | bytes32 _name = plyr_[_pID].name; 316 | 317 | for (uint256 i = 1; i <= gID_; i++) 318 | { 319 | games_[i].receivePlayerInfo(_pID, _addr, _name, _laff); 320 | if (_totalNames > 1) 321 | for (uint256 ii = 1; ii <= _totalNames; ii++) 322 | games_[i].receivePlayerNameList(_pID, plyrNameList_[_pID][ii]); 323 | } 324 | 325 | } 326 | 327 | /** 328 | * @dev players use this to change back to one of your old names. tip, you'll 329 | * still need to push that info to existing games. 330 | * -functionhash- 0xb9291296 331 | * @param _nameString the name you want to use 332 | */ 333 | function useMyOldName(string _nameString) 334 | isHuman() 335 | public 336 | { 337 | // filter name, and get pID 338 | bytes32 _name = _nameString.nameFilter(); 339 | uint256 _pID = pIDxAddr_[msg.sender]; 340 | 341 | // make sure they own the name 342 | require(plyrNames_[_pID][_name] == true, "umm... thats not a name you own"); 343 | 344 | // update their current name 345 | plyr_[_pID].name = _name; 346 | } 347 | 348 | //============================================================================== 349 | // _ _ _ _ | _ _ . _ . 350 | // (_(_)| (/_ |(_)(_||(_ . 351 | //=====================_|======================================================= 352 | function registerNameCore(uint256 _pID, address _addr, uint256 _affID, bytes32 _name, bool _isNewPlayer, bool _all) 353 | private 354 | { 355 | // if names already has been used, require that current msg sender owns the name 356 | if (pIDxName_[_name] != 0) 357 | require(plyrNames_[_pID][_name] == true, "sorry that names already taken"); 358 | 359 | // add name to player profile, registry, and name book 360 | plyr_[_pID].name = _name; 361 | pIDxName_[_name] = _pID; 362 | if (plyrNames_[_pID][_name] == false) 363 | { 364 | plyrNames_[_pID][_name] = true; 365 | plyr_[_pID].names++; 366 | plyrNameList_[_pID][plyr_[_pID].names] = _name; 367 | } 368 | 369 | // registration fee goes directly to community rewards 370 | FundForwarder.deposit.value(address(this).balance)(); 371 | 372 | // push player info to games 373 | if (_all == true) 374 | for (uint256 i = 1; i <= gID_; i++) 375 | games_[i].receivePlayerInfo(_pID, _addr, _name, _affID); 376 | 377 | // fire event 378 | emit onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, msg.value, now); 379 | } 380 | //============================================================================== 381 | // _|_ _ _ | _ . 382 | // | (_)(_)|_\ . 383 | //============================================================================== 384 | function determinePID(address _addr) 385 | private 386 | returns (bool) 387 | { 388 | if (pIDxAddr_[_addr] == 0) 389 | { 390 | pID_++; 391 | pIDxAddr_[_addr] = pID_; 392 | plyr_[pID_].addr = _addr; 393 | 394 | // set the new player bool to true 395 | return (true); 396 | } else { 397 | return (false); 398 | } 399 | } 400 | //============================================================================== 401 | // _ _|_ _ _ _ _ | _ _ || _ . 402 | // (/_>< | (/_| | |(_|| (_(_|||_\ . 403 | //============================================================================== 404 | function getPlayerID(address _addr) 405 | isRegisteredGame() 406 | external 407 | returns (uint256) 408 | { 409 | determinePID(_addr); 410 | return (pIDxAddr_[_addr]); 411 | } 412 | function getPlayerName(uint256 _pID) 413 | external 414 | view 415 | returns (bytes32) 416 | { 417 | return (plyr_[_pID].name); 418 | } 419 | function getPlayerLAff(uint256 _pID) 420 | external 421 | view 422 | returns (uint256) 423 | { 424 | return (plyr_[_pID].laff); 425 | } 426 | function getPlayerAddr(uint256 _pID) 427 | external 428 | view 429 | returns (address) 430 | { 431 | return (plyr_[_pID].addr); 432 | } 433 | function getNameFee() 434 | external 435 | view 436 | returns (uint256) 437 | { 438 | return(registrationFee_); 439 | } 440 | function registerNameXIDFromDapp(address _addr, bytes32 _name, uint256 _affCode, bool _all) 441 | isRegisteredGame() 442 | external 443 | payable 444 | returns(bool, uint256) 445 | { 446 | // make sure name fees paid 447 | require (msg.value >= registrationFee_, "umm..... you have to pay the name fee"); 448 | 449 | // set up our tx event data and determine if player is new or not 450 | bool _isNewPlayer = determinePID(_addr); 451 | 452 | // fetch player id 453 | uint256 _pID = pIDxAddr_[_addr]; 454 | 455 | // manage affiliate residuals 456 | // if no affiliate code was given, no new affiliate code was given, or the 457 | // player tried to use their own pID as an affiliate code, lolz 458 | uint256 _affID = _affCode; 459 | if (_affID != 0 && _affID != plyr_[_pID].laff && _affID != _pID) 460 | { 461 | // update last affiliate 462 | plyr_[_pID].laff = _affID; 463 | } else if (_affID == _pID) { 464 | _affID = 0; 465 | } 466 | 467 | // register name 468 | registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all); 469 | 470 | return(_isNewPlayer, _affID); 471 | } 472 | function registerNameXaddrFromDapp(address _addr, bytes32 _name, address _affCode, bool _all) 473 | isRegisteredGame() 474 | external 475 | payable 476 | returns(bool, uint256) 477 | { 478 | // make sure name fees paid 479 | require (msg.value >= registrationFee_, "umm..... you have to pay the name fee"); 480 | 481 | // set up our tx event data and determine if player is new or not 482 | bool _isNewPlayer = determinePID(_addr); 483 | 484 | // fetch player id 485 | uint256 _pID = pIDxAddr_[_addr]; 486 | 487 | // manage affiliate residuals 488 | // if no affiliate code was given or player tried to use their own, lolz 489 | uint256 _affID; 490 | if (_affCode != address(0) && _affCode != _addr) 491 | { 492 | // get affiliate ID from aff Code 493 | _affID = pIDxAddr_[_affCode]; 494 | 495 | // if affID is not the same as previously stored 496 | if (_affID != plyr_[_pID].laff) 497 | { 498 | // update last affiliate 499 | plyr_[_pID].laff = _affID; 500 | } 501 | } 502 | 503 | // register name 504 | registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all); 505 | 506 | return(_isNewPlayer, _affID); 507 | } 508 | function registerNameXnameFromDapp(address _addr, bytes32 _name, bytes32 _affCode, bool _all) 509 | isRegisteredGame() 510 | external 511 | payable 512 | returns(bool, uint256) 513 | { 514 | // make sure name fees paid 515 | require (msg.value >= registrationFee_, "umm..... you have to pay the name fee"); 516 | 517 | // set up our tx event data and determine if player is new or not 518 | bool _isNewPlayer = determinePID(_addr); 519 | 520 | // fetch player id 521 | uint256 _pID = pIDxAddr_[_addr]; 522 | 523 | // manage affiliate residuals 524 | // if no affiliate code was given or player tried to use their own, lolz 525 | uint256 _affID; 526 | if (_affCode != "" && _affCode != _name) 527 | { 528 | // get affiliate ID from aff Code 529 | _affID = pIDxName_[_affCode]; 530 | 531 | // if affID is not the same as previously stored 532 | if (_affID != plyr_[_pID].laff) 533 | { 534 | // update last affiliate 535 | plyr_[_pID].laff = _affID; 536 | } 537 | } 538 | 539 | // register name 540 | registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all); 541 | 542 | return(_isNewPlayer, _affID); 543 | } 544 | 545 | //============================================================================== 546 | // _ _ _|_ _ . 547 | // _\(/_ | |_||_) . 548 | //=============|================================================================ 549 | function addGame(address _gameAddress, string _gameNameStr) 550 | onlyDevs() 551 | public 552 | { 553 | require(gameIDs_[_gameAddress] == 0, "derp, that games already been registered"); 554 | 555 | if (multiSigDev("addGame") == true) 556 | { 557 | deleteProposal("addGame"); 558 | gID_++; 559 | bytes32 _name = _gameNameStr.nameFilter(); 560 | gameIDs_[_gameAddress] = gID_; 561 | gameNames_[_gameAddress] = _name; 562 | games_[gID_] = PlayerBookReceiverInterface(_gameAddress); 563 | 564 | games_[gID_].receivePlayerInfo(1, plyr_[1].addr, plyr_[1].name, 0); 565 | games_[gID_].receivePlayerInfo(2, plyr_[2].addr, plyr_[2].name, 0); 566 | games_[gID_].receivePlayerInfo(3, plyr_[3].addr, plyr_[3].name, 0); 567 | games_[gID_].receivePlayerInfo(4, plyr_[4].addr, plyr_[4].name, 0); 568 | } 569 | } 570 | 571 | function setRegistrationFee(uint256 _fee) 572 | onlyDevs() 573 | public 574 | { 575 | if (multiSigDev("setRegistrationFee") == true) 576 | {deleteProposal("setRegistrationFee"); 577 | registrationFee_ = _fee; 578 | } 579 | } 580 | 581 | } -------------------------------------------------------------------------------- /contracts/Team.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | /* -Team Just- v0.2.5 3 | * 4 | * ┌──────────────────────────────────────────────────────────────────────┐ 5 | * │ Que up intensely spectacular intro music... In walks, Team Just. │ 6 | * │ Everyone goes crazy. │ 7 | * │ This is a companion to MSFun. It's a central database of Devs and │ 8 | * │ Admin's that we can import to any dapp to allow them management │ 9 | * │ permissions. │ 10 | * └──────────────────────────────────────────────────────────────────────┘ 11 | * ┌────────────────────┐ 12 | * │ Setup Instructions │ 13 | * └────────────────────┘ 14 | * (Step 1) import this contracts interface into your contract 15 | * 16 | * import "./TeamInterface.sol"; 17 | * 18 | * (Step 2) set up the interface to point to the TeamJust contract 19 | * 20 | * TeamInterface constant TeamJust = TeamInterface(0x464904238b5CdBdCE12722A7E6014EC1C0B66928); 21 | * 22 | * modifier onlyAdmins() {require(TeamJust.isAdmin(msg.sender) == true, "onlyAdmins failed - msg.sender is not an admin"); _;} 23 | * modifier onlyDevs() {require(TeamJust.isDev(msg.sender) == true, "onlyDevs failed - msg.sender is not a dev"); _;} 24 | * ┌────────────────────┐ 25 | * │ Usage Instructions │ 26 | * └────────────────────┘ 27 | * use onlyAdmins() and onlyDevs() modifiers as you normally would on any function 28 | * you wish to restrict to admins/devs registered with this contract. 29 | * 30 | * to get required signatures for admins or devs 31 | * uint256 x = TeamJust.requiredSignatures(); 32 | * uint256 x = TeamJust.requiredDevSignatures(); 33 | * 34 | * to get admin count or dev count 35 | * uint256 x = TeamJust.adminCount(); 36 | * uint256 x = TeamJust.devCount(); 37 | * 38 | * to get the name of an admin (in bytes32 format) 39 | * bytes32 x = TeamJust.adminName(address); 40 | */ 41 | 42 | 43 | import "./library/SafeMath.sol"; 44 | import "./library/NameFilter.sol"; 45 | import "./library/MSFun.sol"; 46 | import "./library/F3Ddatasets.sol"; 47 | 48 | import "./interface/TeamInterface.sol"; 49 | import "./interface/FundForwarderInterface.sol"; 50 | import "./interface/PlayerBookReceiverInterface.sol"; 51 | 52 | 53 | contract Team { 54 | 55 | // set dev1 56 | address constant private DEV_1_ADDRESS = 0x006B332340d355280B3F7aa2b33ea0AB0f5706E9; 57 | bytes32 constant private DEV_1_NAME = "richer"; 58 | 59 | 60 | FundForwarderInterface private FundForwarder = FundForwarderInterface(0x0); 61 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 62 | // SET UP MSFun (note, check signers by name is modified from MSFun sdk) 63 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 64 | MSFun.Data private msData; 65 | function deleteAnyProposal(bytes32 _whatFunction) onlyDevs() public {MSFun.deleteProposal(msData, _whatFunction);} 66 | function checkData(bytes32 _whatFunction) onlyAdmins() public view returns(bytes32 message_data, uint256 signature_count) {return(MSFun.checkMsgData(msData, _whatFunction), MSFun.checkCount(msData, _whatFunction));} 67 | function checkSignersByName(bytes32 _whatFunction, uint256 _signerA, uint256 _signerB, uint256 _signerC) onlyAdmins() public view returns(bytes32, bytes32, bytes32) {return(this.adminName(MSFun.checkSigner(msData, _whatFunction, _signerA)), this.adminName(MSFun.checkSigner(msData, _whatFunction, _signerB)), this.adminName(MSFun.checkSigner(msData, _whatFunction, _signerC)));} 68 | 69 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 70 | // DATA SETUP 71 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 72 | struct Admin { 73 | bool isAdmin; 74 | bool isDev; 75 | bytes32 name; 76 | } 77 | mapping (address => Admin) admins_; 78 | 79 | uint256 adminCount_; 80 | uint256 devCount_; 81 | uint256 requiredSignatures_; 82 | uint256 requiredDevSignatures_; 83 | 84 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 85 | // CONSTRUCTOR 86 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 87 | constructor() 88 | public 89 | { 90 | 91 | admins_[DEV_1_ADDRESS] = Admin(true, true, DEV_1_NAME); 92 | 93 | adminCount_ = 1; 94 | devCount_ = 1; 95 | requiredSignatures_ = 1; 96 | requiredDevSignatures_ = 1; 97 | } 98 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 99 | // FALLBACK, SETUP, AND FORWARD 100 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 101 | // there should never be a balance in this contract. but if someone 102 | // does stupidly send eth here for some reason. we can forward it 103 | // to jekyll island 104 | function () 105 | public 106 | payable 107 | { 108 | FundForwarder.deposit.value(address(this).balance)(); 109 | } 110 | 111 | function setup(address _addr) 112 | onlyDevs() 113 | public 114 | { 115 | require( address(FundForwarder) == address(0) ); 116 | FundForwarder = FundForwarderInterface(_addr); 117 | } 118 | 119 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 120 | // MODIFIERS 121 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 122 | modifier onlyDevs() 123 | { 124 | require(admins_[msg.sender].isDev == true, "onlyDevs failed - msg.sender is not a dev"); 125 | _; 126 | } 127 | 128 | modifier onlyAdmins() 129 | { 130 | require(admins_[msg.sender].isAdmin == true, "onlyAdmins failed - msg.sender is not an admin"); 131 | _; 132 | } 133 | 134 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 135 | // DEV ONLY FUNCTIONS 136 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 137 | /** 138 | * @dev DEV - use this to add admins. this is a dev only function. 139 | * @param _who - address of the admin you wish to add 140 | * @param _name - admins name 141 | * @param _isDev - is this admin also a dev? 142 | */ 143 | function addAdmin(address _who, bytes32 _name, bool _isDev) 144 | public 145 | onlyDevs() 146 | { 147 | if (MSFun.multiSig(msData, requiredDevSignatures_, "addAdmin") == true) 148 | { 149 | MSFun.deleteProposal(msData, "addAdmin"); 150 | 151 | // must check this so we dont mess up admin count by adding someone 152 | // who is already an admin 153 | if (admins_[_who].isAdmin == false) 154 | { 155 | 156 | // set admins flag to true in admin mapping 157 | admins_[_who].isAdmin = true; 158 | 159 | // adjust admin count and required signatures 160 | adminCount_ += 1; 161 | requiredSignatures_ += 1; 162 | } 163 | 164 | // are we setting them as a dev? 165 | // by putting this outside the above if statement, we can upgrade existing 166 | // admins to devs. 167 | if (_isDev == true) 168 | { 169 | // bestow the honored dev status 170 | admins_[_who].isDev = _isDev; 171 | 172 | // increase dev count and required dev signatures 173 | devCount_ += 1; 174 | requiredDevSignatures_ += 1; 175 | } 176 | } 177 | 178 | // by putting this outside the above multisig, we can allow easy name changes 179 | // without having to bother with multisig. this will still create a proposal though 180 | // so use the deleteAnyProposal to delete it if you want to 181 | admins_[_who].name = _name; 182 | } 183 | 184 | /** 185 | * @dev DEV - use this to remove admins. this is a dev only function. 186 | * -requirements: never less than 1 admin 187 | * never less than 1 dev 188 | * never less admins than required signatures 189 | * never less devs than required dev signatures 190 | * @param _who - address of the admin you wish to remove 191 | */ 192 | function removeAdmin(address _who) 193 | public 194 | onlyDevs() 195 | { 196 | // we can put our requires outside the multisig, this will prevent 197 | // creating a proposal that would never pass checks anyway. 198 | require(adminCount_ > 1, "removeAdmin failed - cannot have less than 2 admins"); 199 | require(adminCount_ >= requiredSignatures_, "removeAdmin failed - cannot have less admins than number of required signatures"); 200 | if (admins_[_who].isDev == true) 201 | { 202 | require(devCount_ > 1, "removeAdmin failed - cannot have less than 2 devs"); 203 | require(devCount_ >= requiredDevSignatures_, "removeAdmin failed - cannot have less devs than number of required dev signatures"); 204 | } 205 | 206 | // checks passed 207 | if (MSFun.multiSig(msData, requiredDevSignatures_, "removeAdmin") == true) 208 | { 209 | MSFun.deleteProposal(msData, "removeAdmin"); 210 | 211 | // must check this so we dont mess up admin count by removing someone 212 | // who wasnt an admin to start with 213 | if (admins_[_who].isAdmin == true) { 214 | 215 | //set admins flag to false in admin mapping 216 | admins_[_who].isAdmin = false; 217 | 218 | //adjust admin count and required signatures 219 | adminCount_ -= 1; 220 | if (requiredSignatures_ > 1) 221 | { 222 | requiredSignatures_ -= 1; 223 | } 224 | } 225 | 226 | // were they also a dev? 227 | if (admins_[_who].isDev == true) { 228 | 229 | //set dev flag to false 230 | admins_[_who].isDev = false; 231 | 232 | //adjust dev count and required dev signatures 233 | devCount_ -= 1; 234 | if (requiredDevSignatures_ > 1) 235 | { 236 | requiredDevSignatures_ -= 1; 237 | } 238 | } 239 | } 240 | } 241 | 242 | /** 243 | * @dev DEV - change the number of required signatures. must be between 244 | * 1 and the number of admins. this is a dev only function 245 | * @param _howMany - desired number of required signatures 246 | */ 247 | function changeRequiredSignatures(uint256 _howMany) 248 | public 249 | onlyDevs() 250 | { 251 | // make sure its between 1 and number of admins 252 | require(_howMany > 0 && _howMany <= adminCount_, "changeRequiredSignatures failed - must be between 1 and number of admins"); 253 | 254 | if (MSFun.multiSig(msData, requiredDevSignatures_, "changeRequiredSignatures") == true) 255 | { 256 | MSFun.deleteProposal(msData, "changeRequiredSignatures"); 257 | 258 | // store new setting. 259 | requiredSignatures_ = _howMany; 260 | } 261 | } 262 | 263 | /** 264 | * @dev DEV - change the number of required dev signatures. must be between 265 | * 1 and the number of devs. this is a dev only function 266 | * @param _howMany - desired number of required dev signatures 267 | */ 268 | function changeRequiredDevSignatures(uint256 _howMany) 269 | public 270 | onlyDevs() 271 | { 272 | // make sure its between 1 and number of admins 273 | require(_howMany > 0 && _howMany <= devCount_, "changeRequiredDevSignatures failed - must be between 1 and number of devs"); 274 | 275 | if (MSFun.multiSig(msData, requiredDevSignatures_, "changeRequiredDevSignatures") == true) 276 | { 277 | MSFun.deleteProposal(msData, "changeRequiredDevSignatures"); 278 | 279 | // store new setting. 280 | requiredDevSignatures_ = _howMany; 281 | } 282 | } 283 | 284 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 285 | // EXTERNAL FUNCTIONS 286 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 287 | function requiredSignatures() external view returns(uint256) {return(requiredSignatures_);} 288 | function requiredDevSignatures() external view returns(uint256) {return(requiredDevSignatures_);} 289 | function adminCount() external view returns(uint256) {return(adminCount_);} 290 | function devCount() external view returns(uint256) {return(devCount_);} 291 | function adminName(address _who) external view returns(bytes32) {return(admins_[_who].name);} 292 | function isAdmin(address _who) external view returns(bool) {return(admins_[_who].isAdmin);} 293 | function isDev(address _who) external view returns(bool) {return(admins_[_who].isDev);} 294 | } -------------------------------------------------------------------------------- /contracts/interface/F3DexternalSettingsInterface.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface F3DexternalSettingsInterface { 4 | function getFastGap() external returns(uint256); 5 | function getLongGap() external returns(uint256); 6 | function getFastExtra() external returns(uint256); 7 | function getLongExtra() external returns(uint256); 8 | } -------------------------------------------------------------------------------- /contracts/interface/FundForwarderInterface.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface FundForwarderInterface { 4 | function deposit() external payable returns(bool); 5 | function status() external view returns(address, address, bool); 6 | function startMigration(address _newCorpBank) external returns(bool); 7 | function cancelMigration() external returns(bool); 8 | function finishMigration() external returns(bool); 9 | function setup(address _firstCorpBank) external; 10 | } -------------------------------------------------------------------------------- /contracts/interface/FundInterfaceForForwarder.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface FundInterfaceForForwarder { 4 | function deposit(address _addr) external payable returns (bool); 5 | function migrationReceiver_setup() external returns (bool); 6 | } 7 | -------------------------------------------------------------------------------- /contracts/interface/HourglassInterface.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface HourglassInterface { 4 | function() payable external; 5 | function buy(address _playerAddress) payable external returns(uint256); 6 | function sell(uint256 _amountOfTokens) external; 7 | function reinvest() external; 8 | function withdraw() external; 9 | function exit() external; 10 | function dividendsOf(address _playerAddress) external view returns(uint256); 11 | function balanceOf(address _playerAddress) external view returns(uint256); 12 | function transfer(address _toAddress, uint256 _amountOfTokens) external returns(bool); 13 | function stakingRequirement() external view returns(uint256); 14 | } -------------------------------------------------------------------------------- /contracts/interface/PlayerBookInterface.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface PlayerBookInterface { 4 | function getPlayerID(address _addr) external returns (uint256); 5 | function getPlayerName(uint256 _pID) external view returns (bytes32); 6 | function getPlayerLAff(uint256 _pID) external view returns (uint256); 7 | function getPlayerAddr(uint256 _pID) external view returns (address); 8 | function getNameFee() external view returns (uint256); 9 | function registerNameXIDFromDapp(address _addr, bytes32 _name, uint256 _affCode, bool _all) external payable returns(bool, uint256); 10 | function registerNameXaddrFromDapp(address _addr, bytes32 _name, address _affCode, bool _all) external payable returns(bool, uint256); 11 | function registerNameXnameFromDapp(address _addr, bytes32 _name, bytes32 _affCode, bool _all) external payable returns(bool, uint256); 12 | } -------------------------------------------------------------------------------- /contracts/interface/PlayerBookReceiverInterface.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface PlayerBookReceiverInterface { 4 | function receivePlayerInfo(uint256 _pID, address _addr, bytes32 _name, uint256 _laff) external; 5 | function receivePlayerNameList(uint256 _pID, bytes32 _name) external; 6 | } 7 | -------------------------------------------------------------------------------- /contracts/interface/TeamInterface.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface TeamInterface { 4 | function requiredSignatures() external view returns(uint256); 5 | function requiredDevSignatures() external view returns(uint256); 6 | function adminCount() external view returns(uint256); 7 | function devCount() external view returns(uint256); 8 | function adminName(address _who) external view returns(bytes32); 9 | function isAdmin(address _who) external view returns(bool); 10 | function isDev(address _who) external view returns(bool); 11 | } -------------------------------------------------------------------------------- /contracts/interface/otherFoMo3D.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface otherFoMo3D { 4 | function potSwap() external payable; 5 | } -------------------------------------------------------------------------------- /contracts/library/F3DKeysCalcLong.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | import './SafeMath.sol'; 4 | 5 | //============================================================================== 6 | // | _ _ _ | _ . 7 | // |<(/_\/ (_(_||(_ . 8 | //=======/====================================================================== 9 | library F3DKeysCalcLong { 10 | using SafeMath for *; 11 | /** 12 | * @dev calculates number of keys received given X eth 13 | * @param _curEth current amount of eth in contract 14 | * @param _newEth eth being spent 15 | * @return amount of ticket purchased 16 | */ 17 | function keysRec(uint256 _curEth, uint256 _newEth) 18 | internal 19 | pure 20 | returns (uint256) 21 | { 22 | return(keys((_curEth).add(_newEth)).sub(keys(_curEth))); 23 | } 24 | 25 | /** 26 | * @dev calculates amount of eth received if you sold X keys 27 | * @param _curKeys current amount of keys that exist 28 | * @param _sellKeys amount of keys you wish to sell 29 | * @return amount of eth received 30 | */ 31 | function ethRec(uint256 _curKeys, uint256 _sellKeys) 32 | internal 33 | pure 34 | returns (uint256) 35 | { 36 | return((eth(_curKeys)).sub(eth(_curKeys.sub(_sellKeys)))); 37 | } 38 | 39 | /** 40 | * @dev calculates how many keys would exist with given an amount of eth 41 | * @param _eth eth "in contract" 42 | * @return number of keys that would exist 43 | */ 44 | function keys(uint256 _eth) 45 | internal 46 | pure 47 | returns(uint256) 48 | { 49 | return ((((((_eth).mul(1000000000000000000)).mul(312500000000000000000000000)).add(5624988281256103515625000000000000000000000000000000000000000000)).sqrt()).sub(74999921875000000000000000000000)) / (156250000); 50 | } 51 | 52 | /** 53 | * @dev calculates how much eth would be in contract given a number of keys 54 | * @param _keys number of keys "in contract" 55 | * @return eth that would exists 56 | */ 57 | function eth(uint256 _keys) 58 | internal 59 | pure 60 | returns(uint256) 61 | { 62 | return ((78125000).mul(_keys.sq()).add(((149999843750000).mul(_keys.mul(1000000000000000000))) / (2))) / ((1000000000000000000).sq()); 63 | } 64 | } -------------------------------------------------------------------------------- /contracts/library/F3Ddatasets.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | //============================================================================== 4 | // __|_ _ __|_ _ . 5 | // _\ | | |_|(_ | _\ . 6 | //============================================================================== 7 | library F3Ddatasets { 8 | //compressedData key 9 | // [76-33][32][31][30][29][28-18][17][16-6][5-3][2][1][0] 10 | // 0 - new player (bool) 11 | // 1 - joined round (bool) 12 | // 2 - new leader (bool) 13 | // 3-5 - air drop tracker (uint 0-999) 14 | // 6-16 - round end time 15 | // 17 - winnerTeam 16 | // 18 - 28 timestamp 17 | // 29 - team 18 | // 30 - 0 = reinvest (round), 1 = buy (round), 2 = buy (ico), 3 = reinvest (ico) 19 | // 31 - airdrop happened bool 20 | // 32 - airdrop tier 21 | // 33 - airdrop amount won 22 | //compressedIDs key 23 | // [77-52][51-26][25-0] 24 | // 0-25 - pID 25 | // 26-51 - winPID 26 | // 52-77 - rID 27 | struct EventReturns { 28 | uint256 compressedData; 29 | uint256 compressedIDs; 30 | address winnerAddr; // winner address 31 | bytes32 winnerName; // winner name 32 | uint256 amountWon; // amount won 33 | uint256 newPot; // amount in new pot 34 | uint256 P3DAmount; // amount distributed to p3d 35 | uint256 genAmount; // amount distributed to gen 36 | uint256 potAmount; // amount added to pot 37 | } 38 | struct Player { 39 | address addr; // player address 40 | bytes32 name; // player name 41 | uint256 win; // winnings vault 42 | uint256 gen; // general vault 43 | uint256 aff; // affiliate vault 44 | uint256 lrnd; // last round played 45 | uint256 laff; // last affiliate id used 46 | } 47 | struct PlayerRounds { 48 | uint256 eth; // eth player has added to round (used for eth limiter) 49 | uint256 keys; // keys 50 | uint256 mask; // player mask 51 | uint256 ico; // ICO phase investment 52 | } 53 | struct Round { 54 | uint256 plyr; // pID of player in lead, 幸运儿 55 | uint256 team; // tID of team in lead 56 | uint256 end; // time ends/ended 57 | bool ended; // has round end function been ran 这个开关值得研究下 58 | uint256 strt; // time round started 59 | uint256 keys; // keys 60 | uint256 eth; // total eth in 61 | uint256 pot; // eth to pot (during round) / final amount paid to winner (after round ends) 62 | uint256 mask; // global mask 63 | uint256 ico; // total eth sent in during ICO phase 64 | uint256 icoGen; // total eth for gen during ICO phase 65 | uint256 icoAvg; // average key price for ICO phase 66 | } 67 | 68 | struct TeamFee { 69 | uint256 gen; // % of buy in thats paid to key holders of current round 70 | uint256 p3d; // % of buy in thats paid to p3d holders 71 | } 72 | struct PotSplit { 73 | uint256 gen; // % of pot thats paid to key holders of current round 74 | uint256 p3d; // % of pot thats paid to p3d holders 75 | } 76 | } -------------------------------------------------------------------------------- /contracts/library/MSFun.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | /** @title -MSFun- v0.2.4 4 | * 5 | * ┌──────────────────────────────────────────────────────────────────────┐ 6 | * │ MSFun, is an importable library that gives your contract the ability │ 7 | * │ add multiSig requirement to functions. │ 8 | * └──────────────────────────────────────────────────────────────────────┘ 9 | * ┌────────────────────┐ 10 | * │ Setup Instructions │ 11 | * └────────────────────┘ 12 | * (Step 1) import the library into your contract 13 | * 14 | * import "./MSFun.sol"; 15 | * 16 | * (Step 2) set up the signature data for msFun 17 | * 18 | * MSFun.Data private msData; 19 | * ┌────────────────────┐ 20 | * │ Usage Instructions │ 21 | * └────────────────────┘ 22 | * at the beginning of a function 23 | * 24 | * function functionName() 25 | * { 26 | * if (MSFun.multiSig(msData, required signatures, "functionName") == true) 27 | * { 28 | * MSFun.deleteProposal(msData, "functionName"); 29 | * 30 | * // put function body here 31 | * } 32 | * } 33 | * ┌────────────────────────────────┐ 34 | * │ Optional Wrappers For TeamJust │ 35 | * └────────────────────────────────┘ 36 | * multiSig wrapper function (cuts down on inputs, improves readability) 37 | * this wrapper is HIGHLY recommended 38 | * 39 | * function multiSig(bytes32 _whatFunction) private returns (bool) {return(MSFun.multiSig(msData, TeamJust.requiredSignatures(), _whatFunction));} 40 | * function multiSigDev(bytes32 _whatFunction) private returns (bool) {return(MSFun.multiSig(msData, TeamJust.requiredDevSignatures(), _whatFunction));} 41 | * 42 | * wrapper for delete proposal (makes code cleaner) 43 | * 44 | * function deleteProposal(bytes32 _whatFunction) private {MSFun.deleteProposal(msData, _whatFunction);} 45 | * ┌────────────────────────────┐ 46 | * │ Utility & Vanity Functions │ 47 | * └────────────────────────────┘ 48 | * delete any proposal is highly recommended. without it, if an admin calls a multiSig 49 | * function, with argument inputs that the other admins do not agree upon, the function 50 | * can never be executed until the undesirable arguments are approved. 51 | * 52 | * function deleteAnyProposal(bytes32 _whatFunction) onlyDevs() public {MSFun.deleteProposal(msData, _whatFunction);} 53 | * 54 | * for viewing who has signed a proposal & proposal data 55 | * 56 | * function checkData(bytes32 _whatFunction) onlyAdmins() public view returns(bytes32, uint256) {return(MSFun.checkMsgData(msData, _whatFunction), MSFun.checkCount(msData, _whatFunction));} 57 | * 58 | * lets you check address of up to 3 signers (address) 59 | * 60 | * function checkSignersByAddress(bytes32 _whatFunction, uint256 _signerA, uint256 _signerB, uint256 _signerC) onlyAdmins() public view returns(address, address, address) {return(MSFun.checkSigner(msData, _whatFunction, _signerA), MSFun.checkSigner(msData, _whatFunction, _signerB), MSFun.checkSigner(msData, _whatFunction, _signerC));} 61 | * 62 | * same as above but will return names in string format. 63 | * 64 | * function checkSignersByName(bytes32 _whatFunction, uint256 _signerA, uint256 _signerB, uint256 _signerC) onlyAdmins() public view returns(bytes32, bytes32, bytes32) {return(TeamJust.adminName(MSFun.checkSigner(msData, _whatFunction, _signerA)), TeamJust.adminName(MSFun.checkSigner(msData, _whatFunction, _signerB)), TeamJust.adminName(MSFun.checkSigner(msData, _whatFunction, _signerC)));} 65 | * ┌──────────────────────────┐ 66 | * │ Functions In Depth Guide │ 67 | * └──────────────────────────┘ 68 | * In the following examples, the Data is the proposal set for this library. And 69 | * the bytes32 is the name of the function. 70 | * 71 | * MSFun.multiSig(Data, uint256, bytes32) - Manages creating/updating multiSig 72 | * proposal for the function being called. The uint256 is the required 73 | * number of signatures needed before the multiSig will return true. 74 | * Upon first call, multiSig will create a proposal and store the arguments 75 | * passed with the function call as msgData. Any admins trying to sign the 76 | * function call will need to send the same argument values. Once required 77 | * number of signatures is reached this will return a bool of true. 78 | * 79 | * MSFun.deleteProposal(Data, bytes32) - once multiSig unlocks the function body, 80 | * you will want to delete the proposal data. This does that. 81 | * 82 | * MSFun.checkMsgData(Data, bytes32) - checks the message data for any given proposal 83 | * 84 | * MSFun.checkCount(Data, bytes32) - checks the number of admins that have signed 85 | * the proposal 86 | * 87 | * MSFun.checkSigners(data, bytes32, uint256) - checks the address of a given signer. 88 | * the uint256, is the log number of the signer (ie 1st signer, 2nd signer) 89 | */ 90 | 91 | library MSFun { 92 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 93 | // DATA SETS 94 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 95 | // contact data setup 96 | struct Data 97 | { 98 | mapping (bytes32 => ProposalData) proposal_; 99 | } 100 | struct ProposalData 101 | { 102 | // a hash of msg.data 103 | bytes32 msgData; 104 | // number of signers 105 | uint256 count; 106 | // tracking of wither admins have signed 107 | mapping (address => bool) admin; 108 | // list of admins who have signed 109 | mapping (uint256 => address) log; 110 | } 111 | 112 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 113 | // MULTI SIG FUNCTIONS 114 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 115 | function multiSig(Data storage self, uint256 _requiredSignatures, bytes32 _whatFunction) 116 | internal 117 | returns(bool) 118 | { 119 | // our proposal key will be a hash of our function name + our contracts address 120 | // by adding our contracts address to this, we prevent anyone trying to circumvent 121 | // the proposal's security via external calls. 122 | bytes32 _whatProposal = whatProposal(_whatFunction); 123 | 124 | // this is just done to make the code more readable. grabs the signature count 125 | uint256 _currentCount = self.proposal_[_whatProposal].count; 126 | 127 | // store the address of the person sending the function call. we use msg.sender 128 | // here as a layer of security. in case someone imports our contract and tries to 129 | // circumvent function arguments. still though, our contract that imports this 130 | // library and calls multisig, needs to use onlyAdmin modifiers or anyone who 131 | // calls the function will be a signer. 132 | address _whichAdmin = msg.sender; 133 | 134 | // prepare our msg data. by storing this we are able to verify that all admins 135 | // are approving the same argument input to be executed for the function. we hash 136 | // it and store in bytes32 so its size is known and comparable 137 | bytes32 _msgData = keccak256(msg.data); 138 | 139 | // check to see if this is a new execution of this proposal or not 140 | if (_currentCount == 0) 141 | { 142 | // if it is, lets record the original signers data 143 | self.proposal_[_whatProposal].msgData = _msgData; 144 | 145 | // record original senders signature 146 | self.proposal_[_whatProposal].admin[_whichAdmin] = true; 147 | 148 | // update log (used to delete records later, and easy way to view signers) 149 | // also useful if the calling function wants to give something to a 150 | // specific signer. 151 | self.proposal_[_whatProposal].log[_currentCount] = _whichAdmin; 152 | 153 | // track number of signatures 154 | self.proposal_[_whatProposal].count += 1; 155 | 156 | // if we now have enough signatures to execute the function, lets 157 | // return a bool of true. we put this here in case the required signatures 158 | // is set to 1. 159 | if (self.proposal_[_whatProposal].count == _requiredSignatures) { 160 | return(true); 161 | } 162 | // if its not the first execution, lets make sure the msgData matches 163 | } else if (self.proposal_[_whatProposal].msgData == _msgData) { 164 | // msgData is a match 165 | // make sure admin hasnt already signed 166 | if (self.proposal_[_whatProposal].admin[_whichAdmin] == false) 167 | { 168 | // record their signature 169 | self.proposal_[_whatProposal].admin[_whichAdmin] = true; 170 | 171 | // update log (used to delete records later, and easy way to view signers) 172 | self.proposal_[_whatProposal].log[_currentCount] = _whichAdmin; 173 | 174 | // track number of signatures 175 | self.proposal_[_whatProposal].count += 1; 176 | } 177 | 178 | // if we now have enough signatures to execute the function, lets 179 | // return a bool of true. 180 | // we put this here for a few reasons. (1) in normal operation, if 181 | // that last recorded signature got us to our required signatures. we 182 | // need to return bool of true. (2) if we have a situation where the 183 | // required number of signatures was adjusted to at or lower than our current 184 | // signature count, by putting this here, an admin who has already signed, 185 | // can call the function again to make it return a true bool. but only if 186 | // they submit the correct msg data 187 | if (self.proposal_[_whatProposal].count == _requiredSignatures) { 188 | return(true); 189 | } 190 | } 191 | } 192 | 193 | 194 | // deletes proposal signature data after successfully executing a multiSig function 195 | function deleteProposal(Data storage self, bytes32 _whatFunction) 196 | internal 197 | { 198 | //done for readability sake 199 | bytes32 _whatProposal = whatProposal(_whatFunction); 200 | address _whichAdmin; 201 | 202 | //delete the admins votes & log. i know for loops are terrible. but we have to do this 203 | //for our data stored in mappings. simply deleting the proposal itself wouldn't accomplish this. 204 | for (uint256 i=0; i < self.proposal_[_whatProposal].count; i++) { 205 | _whichAdmin = self.proposal_[_whatProposal].log[i]; 206 | delete self.proposal_[_whatProposal].admin[_whichAdmin]; 207 | delete self.proposal_[_whatProposal].log[i]; 208 | } 209 | //delete the rest of the data in the record 210 | delete self.proposal_[_whatProposal]; 211 | } 212 | 213 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 214 | // HELPER FUNCTIONS 215 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 216 | 217 | function whatProposal(bytes32 _whatFunction) 218 | private 219 | view 220 | returns(bytes32) 221 | { 222 | return(keccak256(abi.encodePacked(_whatFunction,this))); 223 | } 224 | 225 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 226 | // VANITY FUNCTIONS 227 | //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 228 | // returns a hashed version of msg.data sent by original signer for any given function 229 | function checkMsgData (Data storage self, bytes32 _whatFunction) 230 | internal 231 | view 232 | returns (bytes32 msg_data) 233 | { 234 | bytes32 _whatProposal = whatProposal(_whatFunction); 235 | return (self.proposal_[_whatProposal].msgData); 236 | } 237 | 238 | // returns number of signers for any given function 239 | function checkCount (Data storage self, bytes32 _whatFunction) 240 | internal 241 | view 242 | returns (uint256 signature_count) 243 | { 244 | bytes32 _whatProposal = whatProposal(_whatFunction); 245 | return (self.proposal_[_whatProposal].count); 246 | } 247 | 248 | // returns address of an admin who signed for any given function 249 | function checkSigner (Data storage self, bytes32 _whatFunction, uint256 _signer) 250 | internal 251 | view 252 | returns (address signer) 253 | { 254 | require(_signer > 0, "MSFun checkSigner failed - 0 not allowed"); 255 | bytes32 _whatProposal = whatProposal(_whatFunction); 256 | return (self.proposal_[_whatProposal].log[_signer - 1]); 257 | } 258 | } -------------------------------------------------------------------------------- /contracts/library/NameFilter.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | library NameFilter { 4 | /** 5 | * @dev filters name strings 6 | * -converts uppercase to lower case. 7 | * -makes sure it does not start/end with a space 8 | * -makes sure it does not contain multiple spaces in a row 9 | * -cannot be only numbers 10 | * -cannot start with 0x 11 | * -restricts characters to A-Z, a-z, 0-9, and space. 12 | * @return reprocessed string in bytes32 format 13 | */ 14 | function nameFilter(string _input) 15 | internal 16 | pure 17 | returns(bytes32) 18 | { 19 | bytes memory _temp = bytes(_input); 20 | uint256 _length = _temp.length; 21 | 22 | //sorry limited to 32 characters 23 | require (_length <= 32 && _length > 0, "string must be between 1 and 32 characters"); 24 | // make sure it doesnt start with or end with space 25 | require(_temp[0] != 0x20 && _temp[_length-1] != 0x20, "string cannot start or end with space"); 26 | // make sure first two characters are not 0x 27 | if (_temp[0] == 0x30) 28 | { 29 | require(_temp[1] != 0x78, "string cannot start with 0x"); 30 | require(_temp[1] != 0x58, "string cannot start with 0X"); 31 | } 32 | 33 | // create a bool to track if we have a non number character 34 | bool _hasNonNumber; 35 | 36 | // convert & check 37 | for (uint256 i = 0; i < _length; i++) 38 | { 39 | // if its uppercase A-Z 40 | if (_temp[i] > 0x40 && _temp[i] < 0x5b) 41 | { 42 | // convert to lower case a-z 43 | _temp[i] = byte(uint(_temp[i]) + 32); 44 | 45 | // we have a non number 46 | if (_hasNonNumber == false) 47 | _hasNonNumber = true; 48 | } else { 49 | require 50 | ( 51 | // require character is a space 52 | _temp[i] == 0x20 || 53 | // OR lowercase a-z 54 | (_temp[i] > 0x60 && _temp[i] < 0x7b) || 55 | // or 0-9 56 | (_temp[i] > 0x2f && _temp[i] < 0x3a), 57 | "string contains invalid characters" 58 | ); 59 | // make sure theres not 2x spaces in a row 60 | if (_temp[i] == 0x20) 61 | require( _temp[i+1] != 0x20, "string cannot contain consecutive spaces"); 62 | 63 | // see if we have a character other than a number 64 | if (_hasNonNumber == false && (_temp[i] < 0x30 || _temp[i] > 0x39)) 65 | _hasNonNumber = true; 66 | } 67 | } 68 | 69 | require(_hasNonNumber == true, "string cannot be only numbers"); 70 | 71 | bytes32 _ret; 72 | assembly { 73 | _ret := mload(add(_temp, 32)) 74 | } 75 | return (_ret); 76 | } 77 | } -------------------------------------------------------------------------------- /contracts/library/SafeMath.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | /** 4 | * @title SafeMath v0.1.9 5 | * @dev Math operations with safety checks that throw on error 6 | * change notes: original SafeMath library from OpenZeppelin modified by Inventor 7 | * - added sqrt 8 | * - added sq 9 | * - added pwr 10 | * - changed asserts to requires with error log outputs 11 | * - removed div, its useless 12 | */ 13 | library SafeMath { 14 | 15 | /** 16 | * @dev Multiplies two numbers, throws on overflow. 17 | */ 18 | function mul(uint256 a, uint256 b) 19 | internal 20 | pure 21 | returns (uint256 c) 22 | { 23 | if (a == 0) { 24 | return 0; 25 | } 26 | c = a * b; 27 | require(c / a == b, "SafeMath mul failed"); 28 | return c; 29 | } 30 | 31 | /** 32 | * @dev Integer division of two numbers, truncating the quotient. 33 | */ 34 | function div(uint256 a, uint256 b) internal pure returns (uint256) { 35 | // assert(b > 0); // Solidity automatically throws when dividing by 0 36 | uint256 c = a / b; 37 | // assert(a == b * c + a % b); // There is no case in which this doesn't hold 38 | return c; 39 | } 40 | 41 | /** 42 | * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). 43 | */ 44 | function sub(uint256 a, uint256 b) 45 | internal 46 | pure 47 | returns (uint256) 48 | { 49 | require(b <= a, "SafeMath sub failed"); 50 | return a - b; 51 | } 52 | 53 | /** 54 | * @dev Adds two numbers, throws on overflow. 55 | */ 56 | function add(uint256 a, uint256 b) 57 | internal 58 | pure 59 | returns (uint256 c) 60 | { 61 | c = a + b; 62 | require(c >= a, "SafeMath add failed"); 63 | return c; 64 | } 65 | 66 | /** 67 | * @dev gives square root of given x. 68 | */ 69 | function sqrt(uint256 x) 70 | internal 71 | pure 72 | returns (uint256 y) 73 | { 74 | uint256 z = ((add(x,1)) / 2); 75 | y = x; 76 | while (z < y) 77 | { 78 | y = z; 79 | z = ((add((x / z),z)) / 2); 80 | } 81 | } 82 | 83 | /** 84 | * @dev gives square. multiplies x by x 85 | */ 86 | function sq(uint256 x) 87 | internal 88 | pure 89 | returns (uint256) 90 | { 91 | return (mul(x,x)); 92 | } 93 | 94 | /** 95 | * @dev x to the power of y 96 | */ 97 | function pwr(uint256 x, uint256 y) 98 | internal 99 | pure 100 | returns (uint256) 101 | { 102 | if (x==0) 103 | return (0); 104 | else if (y==0) 105 | return (1); 106 | else 107 | { 108 | uint256 z = x; 109 | for (uint256 i=1; i < y; i++) 110 | z = mul(z,x); 111 | return (z); 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /contracts/library/UintCompressor.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | import "./SafeMath.sol"; 4 | 5 | library UintCompressor { 6 | using SafeMath for *; 7 | 8 | function insert(uint256 _var, uint256 _include, uint256 _start, uint256 _end) 9 | internal 10 | pure 11 | returns(uint256) 12 | { 13 | // check conditions 14 | require(_end < 77 && _start < 77, "start/end must be less than 77"); 15 | require(_end >= _start, "end must be >= start"); 16 | 17 | // format our start/end points 18 | _end = exponent(_end).mul(10); 19 | _start = exponent(_start); 20 | 21 | // check that the include data fits into its segment 22 | require(_include < (_end / _start)); 23 | 24 | // build middle 25 | if (_include > 0) 26 | _include = _include.mul(_start); 27 | 28 | return((_var.sub((_var / _start).mul(_start))).add(_include).add((_var / _end).mul(_end))); 29 | } 30 | 31 | function extract(uint256 _input, uint256 _start, uint256 _end) 32 | internal 33 | pure 34 | returns(uint256) 35 | { 36 | // check conditions 37 | require(_end < 77 && _start < 77, "start/end must be less than 77"); 38 | require(_end >= _start, "end must be >= start"); 39 | 40 | // format our start/end points 41 | _end = exponent(_end).mul(10); 42 | _start = exponent(_start); 43 | 44 | // return requested section 45 | return((((_input / _start).mul(_start)).sub((_input / _end).mul(_end))) / _start); 46 | } 47 | 48 | function exponent(uint256 _position) 49 | private 50 | pure 51 | returns(uint256) 52 | { 53 | return((10).pwr(_position)); 54 | } 55 | } -------------------------------------------------------------------------------- /eth_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fomo3d", 3 | "engine": { 4 | "Ethash": { 5 | "params": { 6 | "tieBreakingGas": false, 7 | "gasLimitBoundDivisor": "0x0400", 8 | "minimumDifficulty": "0x020000", 9 | "difficultyBoundDivisor": "0x0800", 10 | "durationLimit": "0x0d", 11 | "blockReward": "0x4563918244F40000", 12 | "registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b" 13 | } 14 | } 15 | }, 16 | "params": { 17 | "accountStartNonce": "0x0100000", 18 | "frontierCompatibilityModeLimit": "0x789b0", 19 | "maximumExtraDataSize": "0x20", 20 | "tieBreakingGas": false, 21 | "minGasLimit": "0x1388", 22 | "gasLimitBoundDivisor":"0x0400", 23 | "networkID" : "0x2" 24 | }, 25 | "genesis": { 26 | "seal": { 27 | "ethereum": { 28 | "nonce": "0x0000000000000042", 29 | "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" 30 | } 31 | }, 32 | "difficulty": "0x20000", 33 | "author": "0x0000000000000000000000000000000000000000", 34 | "timestamp": "0x00", 35 | "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 36 | "extraData": "0x", 37 | "gasLimit": "0x8b7d58" 38 | }, 39 | "nodes": [ 40 | "enode://b1217cbaa440e35ed471157123fe468e19e8b5ad5bedb4b1fdbcbdab6fb2f5ed3e95dd9c24a22a79fdb2352204cea207df27d92bfd21bfd41545e8b16f637499@104.44.138.37:30303" 41 | ], 42 | "accounts": { 43 | "0000000000000000000000000000000000000001": { "balance": "1000", "nonce": "1048576", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, 44 | "0000000000000000000000000000000000000002": { "balance": "1000", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, 45 | "0000000000000000000000000000000000000003": { "balance": "10000", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, 46 | "0000000000000000000000000000000000000004": { "balance": "10000", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } }, 47 | "102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376", "nonce": "1048576" } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /flattener.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd flat_contracts 4 | rm -rf * 5 | cd .. 6 | truffle-flattener contracts/CorpBank.sol >flat_contracts/CorpBankFlat.sol 7 | truffle-flattener contracts/FoMo3Dlong.sol >flat_contracts/FoMo3DlongFlat.sol 8 | truffle-flattener contracts/FundForwarder.sol >flat_contracts/FundForwarderFlat.sol 9 | truffle-flattener contracts/SettingGetter.sol >flat_contracts/SettingGetterFlat.sol 10 | truffle-flattener contracts/PlayerBook.sol >flat_contracts/PlayerBookFlat.sol 11 | truffle-flattener contracts/Team.sol >flat_contracts/TeamFlat.sol 12 | -------------------------------------------------------------------------------- /instant_seal.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "DevelopmentChain", 3 | "engine": { 4 | "instantSeal": null 5 | }, 6 | "params": { 7 | "gasLimitBoundDivisor": "0x0400", 8 | "accountStartNonce": "0x0", 9 | "maximumExtraDataSize": "0x20", 10 | "minGasLimit": "0x1388", 11 | "networkID" : "0x11", 12 | "registrar" : "0x0000000000000000000000000000000000001337", 13 | "eip150Transition": "0x0", 14 | "eip160Transition": "0x0", 15 | "eip161abcTransition": "0x0", 16 | "eip161dTransition": "0x0", 17 | "eip155Transition": "0x0", 18 | "eip98Transition": "0x7fffffffffffff", 19 | "eip86Transition": "0x7fffffffffffff", 20 | "maxCodeSize": 24576, 21 | "maxCodeSizeTransition": "0x0", 22 | "eip140Transition": "0x0", 23 | "eip211Transition": "0x0", 24 | "eip214Transition": "0x0", 25 | "eip658Transition": "0x0", 26 | "wasmActivationTransition": "0x0" 27 | }, 28 | "genesis": { 29 | "seal": { 30 | "generic": "0x0" 31 | }, 32 | "difficulty": "0x20000", 33 | "author": "0x0000000000000000000000000000000000000000", 34 | "timestamp": "0x00", 35 | "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 36 | "extraData": "0x", 37 | "gasLimit": "0x7A1200" 38 | }, 39 | "accounts": { 40 | "0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, 41 | "0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, 42 | "0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, 43 | "0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } }, 44 | "0000000000000000000000000000000000000005": { "balance": "1", "builtin": { "name": "modexp", "activate_at": 0, "pricing": { "modexp": { "divisor": 20 } } } }, 45 | "0000000000000000000000000000000000000006": { "balance": "1", "builtin": { "name": "alt_bn128_add", "activate_at": 0, "pricing": { "linear": { "base": 500, "word": 0 } } } }, 46 | "0000000000000000000000000000000000000007": { "balance": "1", "builtin": { "name": "alt_bn128_mul", "activate_at": 0, "pricing": { "linear": { "base": 40000, "word": 0 } } } }, 47 | "0000000000000000000000000000000000000008": { "balance": "1", "builtin": { "name": "alt_bn128_pairing", "activate_at": 0, "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } }, 48 | "0000000000000000000000000000000000001337": { "balance": "1", "constructor": "0x606060405233600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a764000060035534610000575b612904806100666000396000f3006060604052361561013c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306b2ff471461014157806313af40351461018c57806319362a28146101bf5780633f3935d114610248578063432ced04146102b75780634f39ca59146102eb5780636795dbcd1461032457806369fe0e2d146103c857806379ce9fac146103fd5780638da5cb5b1461045557806390b97fc1146104a457806392698814146105245780639890220b1461055d578063ac4e73f914610584578063ac72c12014610612578063c3a358251461064b578063ddca3f43146106c3578063deb931a2146106e6578063df57b74214610747578063e30bd740146107a8578063eadf976014610862578063ef5454d6146108e7578063f25eb5c114610975578063f6d339e414610984575b610000565b3461000057610172600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a1f565b604051808215151515815260200191505060405180910390f35b34610000576101bd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a81565b005b346100005761022e60048080356000191690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610ba2565b604051808215151515815260200191505060405180910390f35b346100005761029d600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610dc9565b604051808215151515815260200191505060405180910390f35b6102d1600480803560001916906020019091905050611035565b604051808215151515815260200191505060405180910390f35b346100005761030a60048080356000191690602001909190505061115f565b604051808215151515815260200191505060405180910390f35b346100005761038660048080356000191690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611378565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34610000576103e3600480803590602001909190505061140d565b604051808215151515815260200191505060405180910390f35b346100005761043b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b4565b604051808215151515815260200191505060405180910390f35b34610000576104626115fb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b346100005761050660048080356000191690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611621565b60405180826000191660001916815260200191505060405180910390f35b34610000576105436004808035600019169060200190919050506116b2565b604051808215151515815260200191505060405180910390f35b346100005761056a611715565b604051808215151515815260200191505060405180910390f35b34610000576105f8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611824565b604051808215151515815260200191505060405180910390f35b3461000057610631600480803560001916906020019091905050611d8b565b604051808215151515815260200191505060405180910390f35b34610000576106ad60048080356000191690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611dee565b6040518082815260200191505060405180910390f35b34610000576106d0611e83565b6040518082815260200191505060405180910390f35b3461000057610705600480803560001916906020019091905050611e89565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3461000057610766600480803560001916906020019091905050611ed2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34610000576107d9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f1b565b6040518080602001828103825283818151815260200191508051906020019080838360008314610828575b80518252602083111561082857602082019150602081019050602083039250610804565b505050905090810190601f1680156108545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576108cd60048080356000191690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001909190505061200c565b604051808215151515815260200191505060405180910390f35b346100005761095b600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612236565b604051808215151515815260200191505060405180910390f35b3461000057610982612425565b005b3461000057610a0560048080356000191690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612698565b604051808215151515815260200191505060405180910390f35b60006000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805460018160011615610100020316600290049050141590505b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610add57610b9f565b8073ffffffffffffffffffffffffffffffffffffffff16600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236460405180905060405180910390a380600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b6000833373ffffffffffffffffffffffffffffffffffffffff1660016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610c1d57610dc1565b82600160008760001916600019168152602001908152602001600020600201856040518082805190602001908083835b60208310610c705780518252602082019150602081019050602083039250610c4d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208160001916905550836040518082805190602001908083835b60208310610cdf5780518252602082019150602081019050602083039250610cbc565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902085600019167fb829c3e412537bbe794c048ccb9e4605bb4aaaa8e4d4c15c1a6e0c2adc1716ea866040518080602001828103825283818151815260200191508051906020019080838360008314610d82575b805182526020831115610d8257602082019150602081019050602083039250610d5e565b505050905090810190601f168015610dae5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b509392505050565b6000813373ffffffffffffffffffffffffffffffffffffffff1660016000836040518082805190602001908083835b60208310610e1b5780518252602082019150602081019050602083039250610df8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610ea45761102f565b82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610f2d57805160ff1916838001178555610f5b565b82800160010185558215610f5b579182015b82811115610f5a578251825591602001919060010190610f3f565b5b509050610f8091905b80821115610f7c576000816000905550600101610f64565b5090565b50503373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310610fcd5780518252602082019150602081019050602083039250610faa565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f098ae8581bb8bd9af1beaf7f2e9f51f31a8e5a8bfada4e303a645d71d9c9192060405180905060405180910390a3600191505b5b50919050565b600081600060016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561109b57611159565b6003543410156110aa57611158565b3360016000856000191660001916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff1683600019167f4963513eca575aba66fdcd25f267aae85958fe6fb97e75fa25d783f1a091a22160405180905060405180910390a3600191505b5b5b50919050565b6000813373ffffffffffffffffffffffffffffffffffffffff1660016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111da57611372565b6002600060016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805460018160011615610100020316600290046000825580601f1061127c57506112b3565b601f0160209004906000526020600020908101906112b291905b808211156112ae576000816000905550600101611296565b5090565b5b5060016000846000191660001916815260200190815260200160002060006000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550503373ffffffffffffffffffffffffffffffffffffffff1683600019167fef1961b4d2909dc23643b309bfe5c3e5646842d98c3a58517037ef3871185af360405180905060405180910390a3600191505b5b50919050565b6000600160008460001916600019168152602001908152602001600020600201826040518082805190602001908083835b602083106113cc57805182526020820191506020810190506020830392506113a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020546001900490505b92915050565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146b576114af565b816003819055507f6bbc57480a46553fa4d156ce702beef5f3ad66303b0ed1a5d4cb44966c6584c3826040518082815260200191505060405180910390a1600190505b5b919050565b6000823373ffffffffffffffffffffffffffffffffffffffff1660016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561152f576115f4565b8260016000866000191660001916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1685600019167f7b97c62130aa09acbbcbf7482630e756592496f1759eaf702f469cf64dfb779460405180905060405180910390a4600191505b5b5092915050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008460001916600019168152602001908152602001600020600201826040518082805190602001908083835b602083106116755780518252602082019150602081019050602083039250611652565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390205490505b92915050565b6000600060016000846000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141590505b919050565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561177357611821565b7fdef931299fe61d176f949118058530c1f3f539dcb6950b4e372c9b835c33ca073073ffffffffffffffffffffffffffffffffffffffff16316040518082815260200191505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051809050600060405180830381858888f19350505050151561181b57610000565b600190505b5b90565b60006000836040518082805190602001908083835b6020831061185c5780518252602082019150602081019050602083039250611839565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390203373ffffffffffffffffffffffffffffffffffffffff1660016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561190157611d83565b846040518082805190602001908083835b602083106119355780518252602082019150602081019050602083039250611912565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600060016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611ab4575081600019166002600060016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518082805460018160011615610100020316600290048015611aa15780601f10611a7f576101008083540402835291820191611aa1565b820191906000526020600020905b815481529060010190602001808311611a8d575b5050915050604051809103902060001916145b15611c79576002600060016000856000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805460018160011615610100020316600290046000825580601f10611b5b5750611b92565b601f016020900490600052602060002090810190611b9191905b80821115611b8d576000816000905550600101611b75565b5090565b5b5060016000836000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16856040518082805190602001908083835b60208310611c1c5780518252602082019150602081019050602083039250611bf9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f12491ad95fd945e444d88a894ffad3c21959880a4dcd8af99d4ae4ffc71d4abd60405180905060405180910390a35b8360016000846000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff16856040518082805190602001908083835b60208310611d215780518252602082019150602081019050602083039250611cfe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f728435a0031f6a04538fcdd24922a7e06bc7bc945db03e83d22122d1bc5f28df60405180905060405180910390a3600192505b5b505092915050565b6000600060016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141590505b919050565b6000600160008460001916600019168152602001908152602001600020600201826040518082805190602001908083835b60208310611e425780518252602082019150602081019050602083039250611e1f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020546001900490505b92915050565b60035481565b600060016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b600060016000836000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b6020604051908101604052806000815250600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fff5780601f10611fd457610100808354040283529160200191611fff565b820191906000526020600020905b815481529060010190602001808311611fe257829003601f168201915b505050505090505b919050565b6000833373ffffffffffffffffffffffffffffffffffffffff1660016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156120875761222e565b82600102600160008760001916600019168152602001908152602001600020600201856040518082805190602001908083835b602083106120dd57805182526020820191506020810190506020830392506120ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208160001916905550836040518082805190602001908083835b6020831061214c5780518252602082019150602081019050602083039250612129565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902085600019167fb829c3e412537bbe794c048ccb9e4605bb4aaaa8e4d4c15c1a6e0c2adc1716ea8660405180806020018281038252838181518152602001915080519060200190808383600083146121ef575b8051825260208311156121ef576020820191506020810190506020830392506121cb565b505050905090810190601f16801561221b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b509392505050565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122945761241f565b82600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061231d57805160ff191683800117855561234b565b8280016001018555821561234b579182015b8281111561234a57825182559160200191906001019061232f565b5b50905061237091905b8082111561236c576000816000905550600101612354565b5090565b50508173ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106123bd578051825260208201915060208101905060208303925061239a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f098ae8581bb8bd9af1beaf7f2e9f51f31a8e5a8bfada4e303a645d71d9c9192060405180905060405180910390a3600190505b5b92915050565b3373ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180828054600181600116156101000203166002900480156124d65780601f106124b45761010080835404028352918201916124d6565b820191906000526020600020905b8154815290600101906020018083116124c2575b505091505060405180910390207f12491ad95fd945e444d88a894ffad3c21959880a4dcd8af99d4ae4ffc71d4abd60405180905060405180910390a360016000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180828054600181600116156101000203166002900480156125b05780601f1061258e5761010080835404028352918201916125b0565b820191906000526020600020905b81548152906001019060200180831161259c575b505091505060405180910390206000191660001916815260200190815260200160002060010160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805460018160011615610100020316600290046000825580601f1061265d5750612694565b601f01602090049060005260206000209081019061269391905b8082111561268f576000816000905550600101612677565b5090565b5b505b565b6000833373ffffffffffffffffffffffffffffffffffffffff1660016000836000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612713576128d0565b8273ffffffffffffffffffffffffffffffffffffffff16600102600160008760001916600019168152602001908152602001600020600201856040518082805190602001908083835b6020831061277f578051825260208201915060208101905060208303925061275c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208160001916905550836040518082805190602001908083835b602083106127ee57805182526020820191506020810190506020830392506127cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902085600019167fb829c3e412537bbe794c048ccb9e4605bb4aaaa8e4d4c15c1a6e0c2adc1716ea866040518080602001828103825283818151815260200191508051906020019080838360008314612891575b8051825260208311156128915760208201915060208101905060208303925061286d565b505050905090810190601f1680156128bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b5093925050505600a165627a7a7230582066b2da4773a0f1d81efe071c66b51c46868a871661efd18c0f629353ff4c1f9b0029" }, 49 | "00a329c0648769a73afac7f9381e08fb43dbea72": { "balance": "1606938044258990275541962092341162602522202993782792835301376" } 50 | } 51 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fomo3d", 3 | "version": "1.0.0", 4 | "description": "本项目通过fomo3d官网合约的入口,把相关所有的合约进行汇总。\r 在通过继承的机制就行分拆开。", 5 | "main": "truffle.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "scripts": { 10 | "dev": "lite-server", 11 | "test": "echo \"Error: no test specified\" && exit 1", 12 | "flat": "sh ./flattener.sh" 13 | }, 14 | "author": "", 15 | "license": "ISC", 16 | "devDependencies": { 17 | "lite-server": "^2.3.0" 18 | }, 19 | "dependencies": { 20 | "zeppelin-solidity": "^1.4.0" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "https://gitee.com/fenghuohudong/fomo3d.git" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/css/alertify.css: -------------------------------------------------------------------------------- 1 | .alertify-logs>* { 2 | padding: 12px 24px; 3 | color: #fff; 4 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .2); 5 | border-radius: 1px 6 | } 7 | 8 | .alertify-logs>*, 9 | .alertify-logs>.default { 10 | background: rgba(0, 0, 0, .8) 11 | } 12 | 13 | .alertify-logs>.error { 14 | background: rgba(244, 67, 54, .8) 15 | } 16 | 17 | .alertify-logs>.success { 18 | background: rgba(76, 175, 80, .9) 19 | } 20 | 21 | .alertify { 22 | position: fixed; 23 | background-color: rgba(0, 0, 0, .3); 24 | left: 0; 25 | right: 0; 26 | top: 0; 27 | bottom: 0; 28 | width: 100%; 29 | height: 100%; 30 | z-index: 1 31 | } 32 | 33 | .alertify.hide { 34 | opacity: 0; 35 | pointer-events: none 36 | } 37 | 38 | .alertify, 39 | .alertify.show { 40 | box-sizing: border-box; 41 | transition: all .33s cubic-bezier(.25, .8, .25, 1) 42 | } 43 | 44 | .alertify, 45 | .alertify * { 46 | box-sizing: border-box 47 | } 48 | 49 | .alertify .dialog { 50 | padding: 12px 51 | } 52 | 53 | .alertify .alert, 54 | .alertify .dialog { 55 | width: 100%; 56 | margin: 0 auto; 57 | position: relative; 58 | top: 50%; 59 | transform: translateY(-50%) 60 | } 61 | 62 | .alertify .alert>*, 63 | .alertify .dialog>* { 64 | width: 400px; 65 | max-width: 95%; 66 | margin: 0 auto; 67 | text-align: center; 68 | padding: 12px; 69 | background: #fff; 70 | box-shadow: 0 2px 4px -1px rgba(0, 0, 0, .14), 0 4px 5px 0 rgba(0, 0, 0, .098), 0 1px 10px 0 rgba(0, 0, 0, .084) 71 | } 72 | 73 | .alertify .alert .msg, 74 | .alertify .dialog .msg { 75 | padding: 12px; 76 | margin-bottom: 12px; 77 | margin: 0; 78 | text-align: left 79 | } 80 | 81 | .alertify .alert input:not(.form-control), 82 | .alertify .dialog input:not(.form-control) { 83 | margin-bottom: 15px; 84 | width: 100%; 85 | font-size: 100%; 86 | padding: 12px 87 | } 88 | 89 | .alertify .alert input:not(.form-control):focus, 90 | .alertify .dialog input:not(.form-control):focus { 91 | outline-offset: -2px 92 | } 93 | 94 | .alertify .alert nav, 95 | .alertify .dialog nav { 96 | text-align: right 97 | } 98 | 99 | .alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button), 100 | .alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button) { 101 | background: transparent; 102 | box-sizing: border-box; 103 | color: rgba(0, 0, 0, .87); 104 | position: relative; 105 | outline: 0; 106 | border: 0; 107 | display: inline-block; 108 | -ms-flex-align: center; 109 | -ms-grid-row-align: center; 110 | align-items: center; 111 | padding: 0 6px; 112 | margin: 6px 8px; 113 | line-height: 36px; 114 | min-height: 36px; 115 | white-space: nowrap; 116 | min-width: 88px; 117 | text-align: center; 118 | text-transform: uppercase; 119 | font-size: 14px; 120 | text-decoration: none; 121 | cursor: pointer; 122 | border: 1px solid transparent; 123 | border-radius: 2px 124 | } 125 | 126 | .alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):active, 127 | .alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):hover, 128 | .alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):active, 129 | .alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):hover { 130 | background-color: rgba(0, 0, 0, .05) 131 | } 132 | 133 | .alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):focus, 134 | .alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):focus { 135 | border: 1px solid rgba(0, 0, 0, .1) 136 | } 137 | 138 | .alertify .alert nav button.btn, 139 | .alertify .dialog nav button.btn { 140 | margin: 6px 4px 141 | } 142 | 143 | .alertify-logs { 144 | position: fixed; 145 | z-index: 1 146 | } 147 | 148 | .alertify-logs.bottom, 149 | .alertify-logs:not(.top) { 150 | bottom: 16px 151 | } 152 | 153 | .alertify-logs.left, 154 | .alertify-logs:not(.right) { 155 | left: 16px 156 | } 157 | 158 | .alertify-logs.left>*, 159 | .alertify-logs:not(.right)>* { 160 | float: left; 161 | transform: translateZ(0); 162 | height: auto 163 | } 164 | 165 | .alertify-logs.left>.show, 166 | .alertify-logs:not(.right)>.show { 167 | left: 0 168 | } 169 | 170 | .alertify-logs.left>*, 171 | .alertify-logs.left>.hide, 172 | .alertify-logs:not(.right)>*, 173 | .alertify-logs:not(.right)>.hide { 174 | left: -110% 175 | } 176 | 177 | .alertify-logs.right { 178 | right: 16px 179 | } 180 | 181 | .alertify-logs.right>* { 182 | float: right; 183 | transform: translateZ(0) 184 | } 185 | 186 | .alertify-logs.right>.show { 187 | right: 0; 188 | opacity: 1 189 | } 190 | 191 | .alertify-logs.right>*, 192 | .alertify-logs.right>.hide { 193 | right: -110%; 194 | opacity: 0 195 | } 196 | 197 | .alertify-logs.top { 198 | top: 0 199 | } 200 | 201 | .alertify-logs>* { 202 | box-sizing: border-box; 203 | transition: all .4s cubic-bezier(.25, .8, .25, 1); 204 | position: relative; 205 | clear: both; 206 | backface-visibility: hidden; 207 | perspective: 1000; 208 | max-height: 0; 209 | margin: 0; 210 | padding: 0; 211 | overflow: hidden; 212 | opacity: 0; 213 | pointer-events: none 214 | } 215 | 216 | .alertify-logs>.show { 217 | margin-top: 12px; 218 | opacity: 1; 219 | max-height: 1000px; 220 | padding: 12px; 221 | pointer-events: auto 222 | } -------------------------------------------------------------------------------- /src/css/base.css: -------------------------------------------------------------------------------- 1 | .ethglitch { 2 | font-weight: bold; } 3 | 4 | .headtimer { 5 | display: block; 6 | font-size: 34px; } 7 | .headtimer a { 8 | text-decoration: underline; 9 | color: #f8f9fa; 10 | font-weight: 400; } 11 | 12 | [type=reset], [type=submit], button, html [type=button] { 13 | -webkit-appearance: initial !important; } 14 | 15 | #quotes { 16 | display: none; } 17 | #quotes.active { 18 | display: block; } 19 | 20 | .cprogress { 21 | display: none; } 22 | .cprogress .active { 23 | display: initial; } 24 | 25 | .distribution { 26 | text-align: center; } 27 | .distribution .lead { 28 | font-size: 15px; } 29 | .distribution .team { 30 | border-right: 2px #565656 solid; } 31 | .distribution .team:last-child { 32 | border-right: 0; } 33 | .distribution .team img { 34 | width: 75%; } 35 | .distribution .team p { 36 | font-size: 12px; } 37 | 38 | .skills { 39 | font-size: 10px; 40 | display: block; 41 | text-align: left; 42 | float: left; 43 | width: 100%; 44 | background: rgba(80, 88, 97, 0.62); } 45 | .skills .perc { 46 | float: right; 47 | padding-right: 2px; } 48 | .skills .label { 49 | padding-left: 2px; 50 | float: left; } 51 | -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | /* general declarations, unsorted */ 2 | body { 3 | font-family: Poppins; 4 | background-color: #302430; 5 | } 6 | .brand-logo { 7 | height: 3rem; 8 | } 9 | .modal-logo { 10 | height: 2rem; 11 | } 12 | .allcaps { 13 | text-transform: uppercase; 14 | } 15 | .blurryboy { 16 | position: fixed; 17 | display: block; 18 | z-index: -1; 19 | left:-0.75%; 20 | top:-0.5%; 21 | width: 102%; 22 | height: 102%; 23 | background-image: url('../img/purple_bg.jpg'); 24 | background-size: cover; 25 | background-repeat: no-repeat; 26 | background-position: center; 27 | -webkit-filter: blur(5px); 28 | -moz-filter: blur(5px); 29 | -o-filter: blur(5px); 30 | -ms-filter: blur(5px); 31 | filter: blur(5px); 32 | } 33 | .blurryboyblue { 34 | position: fixed; 35 | display: block; 36 | z-index: -1; 37 | left:-0.75%; 38 | top:-0.5%; 39 | width: 102%; 40 | height: 102%; 41 | background-image: url('../img/blue_bg.jpg'); 42 | background-size: cover; 43 | background-repeat: no-repeat; 44 | background-position: center; 45 | -webkit-filter: blur(5px); 46 | -moz-filter: blur(5px); 47 | -o-filter: blur(5px); 48 | -ms-filter: blur(5px); 49 | filter: blur(5px); 50 | } 51 | .blurryboybluedark { 52 | position: fixed; 53 | display: block; 54 | z-index: -1; 55 | left:-0.75%; 56 | top:-0.5%; 57 | width: 102%; 58 | height: 102%; 59 | background-image: url('../img/blue_bg_dark.jpg'); 60 | background-size: cover; 61 | background-repeat: no-repeat; 62 | background-position: center; 63 | -webkit-filter: blur(5px); 64 | -moz-filter: blur(5px); 65 | -o-filter: blur(5px); 66 | -ms-filter: blur(5px); 67 | filter: blur(5px); 68 | } 69 | .blurryboydark { 70 | position: fixed; 71 | display: block; 72 | z-index: -1; 73 | left:-0.75%; 74 | top:-0.5%; 75 | width: 102%; 76 | height: 102%; 77 | background-image: url('../img/purple_bg_dark.jpg'); 78 | background-size: cover; 79 | background-repeat: no-repeat; 80 | background-position: center; 81 | -webkit-filter: blur(5px); 82 | -moz-filter: blur(5px); 83 | -o-filter: blur(5px); 84 | -ms-filter: blur(5px); 85 | filter: blur(5px); 86 | } 87 | .p3dblurryboy { 88 | position: fixed; 89 | display: block; 90 | z-index: -1; 91 | left:-0.75%; 92 | top:-0.5%; 93 | width: 102%; 94 | height: 102%; 95 | background-image: url('../img/not_purple_bg.jpg'); 96 | background-size: cover; 97 | background-repeat: no-repeat; 98 | background-position: center; 99 | -webkit-filter: blur(5px); 100 | -moz-filter: blur(5px); 101 | -o-filter: blur(5px); 102 | -ms-filter: blur(5px); 103 | filter: blur(5px); 104 | } 105 | .outoforder { 106 | position: absolute; 107 | left: 0; 108 | top: 0; 109 | width: 100%; 110 | height: 100%; 111 | z-index: 9; 112 | } 113 | .ooo-purp { 114 | background-color: rgba(48, 36, 48, 0.8); 115 | } 116 | .ooo-grey { 117 | background-color: rgba(52, 58, 64, 0.8); 118 | } 119 | .btn-purp { 120 | color:white; 121 | background-color: #f000f0; 122 | } 123 | .btn-blu { 124 | color:white; 125 | background-color: #0055f0; 126 | } 127 | .btn-blu:hover, .btn-blu.active{ 128 | background-color: #5491ff; 129 | box-shadow: 0 0 2px #2472ff, 0 0 25px #3e82ff, 0 0 5px #5491ff; 130 | text-shadow: 0 0 2px #2472ff; 131 | color:white; 132 | } 133 | .btn-purp:hover, .btn-purp.active{ 134 | background-color: #ff4fff; 135 | box-shadow: 0 0 2px #2b002b, 0 0 25px #c0c, 0 0 5px #f0f; 136 | text-shadow: 0 0 2px #2b002b; 137 | color:white; 138 | } 139 | .btn-gren { 140 | color:white; 141 | background-color: #019001; 142 | } 143 | .btn-gren:hover, .btn-gren.active{ 144 | background-color: #00ff00; 145 | box-shadow: 0 0 2px #032b00, 0 0 25px #00cc18, 0 0 5px #f0f; 146 | text-shadow: 0 0 2px #032b00; 147 | color:white; 148 | } 149 | .btn-outline-purp { 150 | color:white; 151 | background-color: transparent; 152 | border: 1px solid #702571; 153 | } 154 | .btn-outline-purp:hover, .btn-outline-purp.active { 155 | color:white; 156 | background-color: #702571; 157 | } 158 | .btn-outline-blu { 159 | color:white; 160 | background-color: transparent; 161 | border: 1px solid #003aa4; 162 | } 163 | .btn-outline-blu:hover, .btn-outline-blu.active { 164 | color:white; 165 | background-color: #003aa4; 166 | } 167 | .btn-outline-gren { 168 | color:white; 169 | background-color: transparent; 170 | border: 1px solid #00a42a; 171 | } 172 | .btn-outline-gren:hover, .btn-outline-gren.active { 173 | color:white; 174 | background-color: #00ff00; 175 | box-shadow: 0 0 2px #032b00, 0 0 25px #00cc00, 0 0 5px #f0f; 176 | text-shadow: 0 0 2px #032b00; 177 | } 178 | .btn-outline-yel { 179 | color:#e6ae49; 180 | background-color: transparent; 181 | border: 1px solid #e6ae49; 182 | } 183 | .btn-outline-yel:hover { 184 | color:white; 185 | background-color: #e6ae49; 186 | } 187 | .btn-viol { 188 | color:white; 189 | background-color: #0B6623 ; 190 | text-shadow: 0 0 2px #1e511e; 191 | } 192 | .btn-viol:hover, .btn-viol.active{ 193 | background-color: #0ef70e; 194 | box-shadow: 0 0 2px #1e511e, 0 0 25px #2cb32c, 0 0 5px #00ff00; 195 | text-shadow: 0 0 2px #1e511e; 196 | color:white; 197 | } 198 | .fa-question-circle { 199 | color:#e6ae49; 200 | } 201 | .qbtn { 202 | background-color: transparent; 203 | border: none; 204 | } 205 | .qbtn:hover { 206 | cursor: pointer; 207 | } 208 | .qbtn:hover .fa-question-circle { 209 | color: white; 210 | filter: drop-shadow(0 0 2px #8a682b) drop-shadow(0 0 10px #cf9c41) drop-shadow(0 0 5px #e6ae49)!important; 211 | -webkit-filter: drop-shadow(0 0 2px #8a682b) drop-shadow(0 0 10px #cf9c41) drop-shadow(0 0 5px #e6ae49)!important; 212 | } 213 | a:hover{ 214 | color:white; 215 | } 216 | 217 | /* a.btn-purp:hover, button.btn-purp:hover { 218 | color: white; 219 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 10px #c0c) drop-shadow(0 0 5px #f0f); 220 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 10px #c0c) drop-shadow(0 0 5px #f0f); 221 | } */ 222 | .progress { 223 | background-color: #2d3238; 224 | border-top:1px solid #1d2024; 225 | border-bottom:1px solid #676b70; 226 | height:5px; 227 | } 228 | .progress-bar { 229 | background-color: #f000f0; 230 | } 231 | .progress-bar-glow { 232 | content: url('../img/progress_after.png'); 233 | position: absolute; 234 | height:3px; 235 | } 236 | .truncate { 237 | white-space: nowrap; 238 | overflow: hidden; 239 | text-overflow: ellipsis; 240 | } 241 | .table td, .table th { 242 | border: none; 243 | } 244 | .borderchange { 245 | border-bottom: 1px solid rgba(0,0,0,.1)!important; 246 | } 247 | thead tr:hover { 248 | text-shadow: none!important; 249 | } 250 | tbody th { 251 | font-weight: normal; 252 | } 253 | tbody tr:first-child th:before { 254 | content: url('../img/icon_filled.png'); 255 | position:absolute; 256 | left:2px; 257 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #c0c) drop-shadow(0 0 5px #f0f); 258 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #c0c) drop-shadow(0 0 5px #f0f); 259 | } 260 | tr:hover { 261 | background-color: transparent; 262 | text-shadow: 0 0 2px #2b002b, 0 0 25px #c0c, 0 0 5px #f0f; 263 | } 264 | .playername{ 265 | overflow: hidden; 266 | max-width:6.5rem; 267 | } 268 | .textshade { 269 | text-shadow: 0 0 2px #22252a, 0 0 10px #0d0e10; 270 | } 271 | .jumboshade { 272 | box-shadow: 0 0 2px #22252a; 273 | } 274 | .jumbotron-adjust { 275 | padding: 1rem!important; 276 | } 277 | .jumbotron-fix { 278 | max-height:100%; 279 | max-width: 100%; 280 | 281 | } 282 | .jumbotron2 { 283 | padding:1rem 1rem; 284 | margin-bottom:1rem; 285 | background-color:rgba(255, 255, 255, 0.85); 286 | border-radius:.3rem; 287 | } 288 | .jumbotron-dark { 289 | padding:1rem 1rem; 290 | margin-bottom:1rem; 291 | background-color:rgba(0, 0, 0, 0.19); 292 | border-radius:.3rem; 293 | } 294 | .nobg { 295 | background-color: transparent; 296 | } 297 | .tright { 298 | text-align: right; 299 | } 300 | .nav-link { 301 | border: 1px solid transparent; 302 | } 303 | .nav-link:hover { 304 | text-shadow: 0 0 2px #2b002b, 0 0 25px #c0c, 0 0 5px #f0f; 305 | color:white; 306 | } 307 | .nav-link-gren-on{ 308 | text-shadow: 0 0 2px #002b00, 0 0 25px #0c0, 0 0 5px #0f0; 309 | background-color: transparent; 310 | } 311 | .nav-link-purp-on{ 312 | text-shadow: 0 0 2px #2b002b, 0 0 25px #c0c, 0 0 5px #f0f; 313 | background-color: transparent; 314 | } 315 | 316 | .nav-link-gren:hover { 317 | text-shadow: 0 0 2px #002b00, 0 0 25px #0c0, 0 0 5px #0f0; 318 | background-color: transparent; 319 | border: 1px solid #0c0; 320 | } 321 | .nav-link-purp:hover { 322 | text-shadow: 0 0 2px #2b002b, 0 0 25px #c0c, 0 0 5px #f0f; 323 | background-color: transparent; 324 | border: 1px solid #c0c; 325 | } 326 | .nav-link-gren-shadow:hover { 327 | text-shadow: 0 0 2px #002b00, 0 0 25px #0c0, 0 0 5px #0f0 !important; 328 | background-color: transparent; 329 | } 330 | .nav-item a { 331 | color: white!important; 332 | } 333 | .nav-item > .active { 334 | background-color: #ff4fff!important; 335 | box-shadow: 0 0 2px #2b002b, 0 0 25px #c0c, 0 0 5px #f0f; 336 | } 337 | .teaser-cover { 338 | background-color: transparent; 339 | } 340 | .spacer { 341 | margin-top:6rem; 342 | } 343 | .spacerhide { 344 | margin-top:0rem !important; 345 | } 346 | .marginb{ 347 | margin-bottom:1rem; 348 | } 349 | .margint{ 350 | margin-top:1rem; 351 | } 352 | .nomarginb{ 353 | margin-bottom: 0; 354 | } 355 | .nopadding-l{ 356 | padding-left:0; 357 | } 358 | .nopadding-r{ 359 | padding-right:0; 360 | } 361 | .nomargin-l{ 362 | margin-left:0; 363 | } 364 | .nomargin-r{ 365 | margin-right:0; 366 | } 367 | .nopadding-b{ 368 | padding-bottom: 0; 369 | } 370 | .carousel-bg { 371 | background-size: cover; 372 | background-repeat: no-repeat; 373 | background-position: center; 374 | } 375 | .whales { 376 | background-image: url('../img/bg_whales.png'); 377 | } 378 | .whalescore { 379 | background-image: url('../img/twhale.png'); 380 | background-position: 50% 50%; 381 | background-size: 50px auto; 382 | background-repeat: no-repeat; 383 | } 384 | .bears { 385 | background-image: url('../img/bg_bears.png'); 386 | } 387 | .bearscore { 388 | background-image: url('../img/tbear.png'); 389 | background-position: 50% 50%; 390 | background-size: 50px auto; 391 | background-repeat: no-repeat; 392 | } 393 | .bulls { 394 | background-image: url('../img/bg_bulls.png'); 395 | } 396 | .bullscore { 397 | background-image: url('../img/tbull.png'); 398 | background-position: 50% 50%; 399 | background-size: 50px auto; 400 | background-repeat: no-repeat; 401 | } 402 | .sneks { 403 | background-image: url('../img/bg_Sneks.png'); 404 | } 405 | .snekscore { 406 | background-image: url('../img/tsnek.png'); 407 | background-position: 50% 50%; 408 | background-size: 50px auto; 409 | background-repeat: no-repeat; 410 | } 411 | .teamscore { 412 | background-color: #2d3238; 413 | border-top:1px solid #1d2024; 414 | border-bottom:1px solid #676b70; 415 | } 416 | .glow { 417 | text-shadow: 0 0 2px #2b002b, 0 0 10px #c0c, 0 0 5px #f0f; 418 | } 419 | .glow-gren { 420 | text-shadow: 0 0 2px #0b2b00, 0 0 10px #00cc00, 0 0 5px #0f0; 421 | } 422 | .glow-slow { 423 | text-shadow: 0 0 2px #0b002b, 0 0 10px #2ee1ef, 0 0 5px #008aff; 424 | } 425 | .titleglow { 426 | text-shadow: 0 0 5px #2b002b, 0 0 20px #c0c, 0 0 10px #f0f; 427 | color:white; 428 | } 429 | .titleglow-green{ 430 | text-shadow: 0 0 5px #2b002b, 0 0 20px #0c0, 0 0 10px #0f0; 431 | color:white; 432 | } 433 | .titleglow-slow { 434 | text-shadow: 0 0 5px #0b002b, 0 0 20px #2ee1ef, 0 0 10px #008aff; 435 | color:white; 436 | } 437 | .boxglow { 438 | box-shadow: 0 0 2px #2b002b, 0 0 10px #c0c, 0 0 5px #f0f; 439 | } 440 | 441 | .dropglow-yel { 442 | color: white; 443 | filter: drop-shadow(0 0 2px #8a682b) drop-shadow(0 0 10px #cf9c41) drop-shadow(0 0 5px #e6ae49)!important; 444 | -webkit-filter: drop-shadow(0 0 2px #8a682b) drop-shadow(0 0 10px #cf9c41) drop-shadow(0 0 5px #e6ae49)!important; 445 | } 446 | .glow-yel { 447 | text-shadow: 0 0 2px #8a682b, 0 0 10px #cf9c41, 0 0 5px #e6ae49; 448 | } 449 | 450 | .carousel-indicators > li.active { 451 | box-shadow: 0 0 2px #2b002b, 0 0 10px #c0c, 0 0 5px #f0f; 452 | } 453 | .carousel-control-next:hover, .carousel-control-prev:hover { 454 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #c0c) drop-shadow(0 0 5px #f0f); 455 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #c0c) drop-shadow(0 0 5px #f0f); 456 | } 457 | .tab-container { 458 | padding:1rem; 459 | } 460 | .tab-adjust { 461 | border:0!important; 462 | } 463 | .tab-rounded { 464 | border-radius:0px 0px 5px 5px!important; 465 | } 466 | .tabs-border-adjust{ 467 | border-bottom:1px solid #343a40; 468 | } 469 | .tab-link{ 470 | border: none!important; 471 | } 472 | .tab-link.active{ 473 | box-shadow: none; 474 | background-color: #343a40!important; 475 | border: none; 476 | } 477 | .tab-link:hover{ 478 | border:none; 479 | background-color:#2d3238; 480 | } 481 | .absolute-overlay { 482 | margin-top:-4rem; 483 | } 484 | .start-teaser { 485 | background-image: url('../img/landscape_bg.jpg'); 486 | background-repeat: no-repeat; 487 | background-size: cover; 488 | background-position: center; 489 | } 490 | .intro-text { 491 | padding-left:10rem; 492 | padding-right:10rem; 493 | } 494 | #quotes{ 495 | margin-top:3.9rem; 496 | z-index:-1; 497 | } 498 | .alert-purp{ 499 | background-color: #ff32ff; 500 | border-color: #f0f; 501 | } 502 | .cta-ticket{ 503 | display:none; 504 | } 505 | .pulse{ 506 | animation:pulse 0.75s infinite; 507 | } 508 | .pulse-blu{ 509 | animation:pulseblu 0.75s infinite; 510 | } 511 | .pulse-gren{ 512 | animation:pulsegren 0.75s infinite; 513 | } 514 | .teampulse{ 515 | animation:slowpulse 0.75s infinite; 516 | } 517 | .pulsetutorial{ 518 | animation:pulsedrop 0.75s infinite; 519 | position:absolute; 520 | top:0.2rem; 521 | } 522 | .form-check-label{ 523 | 524 | } 525 | .form-radio{ 526 | opacity: 0; 527 | position: absolute; 528 | } 529 | .checkmark{ 530 | position: absolute; 531 | top: -20px; 532 | left: 0; 533 | transform: scale(0.2); 534 | } 535 | .checkmark::before { 536 | position: absolute; 537 | top: 0; 538 | left: 0; 539 | } 540 | label > img{ 541 | cursor: pointer; 542 | } 543 | .bear.checkmark { 544 | transform: scale(0.17); 545 | top: -17px; 546 | } 547 | .bull.checkmark { 548 | top: -17px; 549 | } 550 | .snek.checkmark { 551 | top: -17px; 552 | } 553 | /*.whale::before{ 554 | content:url('../img/whales.png'); 555 | } 556 | .bear::before{ 557 | content:url('../img/bears.png'); 558 | } 559 | .bull::before{ 560 | content:url('../img/bulls.png'); 561 | } 562 | .snek::before{ 563 | content:url('../img/sneks.png'); 564 | }*/ 565 | .team input:checked ~ img { 566 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 15px #c0c) drop-shadow(0 0 5px #f0f); 567 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 15px #c0c) drop-shadow(0 0 5px #f0f); 568 | } 569 | .team img:hover { 570 | animation:slowpulse 1s infinite; 571 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #c0c) drop-shadow(0 0 5px #f0f); 572 | } 573 | .checkmark:after{ 574 | content: ""; 575 | position: absolute; 576 | display: none; 577 | } 578 | .ethglow{ 579 | filter: drop-shadow(0 0 2px #0b002b) drop-shadow(0 0 25px #c0c) drop-shadow(0 0 5px #f0f); 580 | -webkit-filter: drop-shadow(0 0 2px #0b002b) drop-shadow(0 0 25px #c0c) drop-shadow(0 0 5px #f0f); 581 | } 582 | .ethglow-slow{ 583 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #2ee1ef) drop-shadow(0 0 5px #008aff); 584 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #2ee1ef) drop-shadow(0 0 5px #008aff); 585 | } 586 | .ethglow-green{ 587 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #0c0) drop-shadow(0 0 5px #0f0); 588 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 25px #0c0) drop-shadow(0 0 5px #0f0); 589 | } 590 | .ethglow-calm-down-sumpunk{ 591 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 1px #c0c) drop-shadow(0 0 2px #f0f); 592 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 1px #c0c) drop-shadow(0 0 2px #f0f); 593 | } 594 | .ethglow-its-okay-justo{ 595 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 10px #c0c) drop-shadow(0 0 2px #f0f); 596 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 10px #c0c) drop-shadow(0 0 2px #f0f); 597 | } 598 | .miniloader { 599 | border-top: 2px solid #f0f; 600 | border-radius: 50%; 601 | width: 50px; 602 | height: 50px; 603 | animation: spin 0.6s linear infinite; 604 | position: absolute; 605 | top:-0.8rem; 606 | } 607 | .loader { 608 | border-top: 2px solid #f0f; 609 | border-radius: 50%; 610 | width: 50px; 611 | height: 50px; 612 | animation: spin 0.6s linear infinite; 613 | position: absolute; 614 | top: 25%; 615 | left: calc(100vw / 2 - 31px); 616 | transform: translate(-50%, -50%); 617 | } 618 | .airdropicon { 619 | color:white; 620 | font-size: 7rem; 621 | } 622 | .blur { 623 | background-color: rgba(205,205,205,0.4); 624 | width: 100vw; 625 | height: 100vw; 626 | position: fixed; 627 | overflow: hidden; 628 | z-index: 99999999; 629 | } 630 | 631 | .hidden { 632 | display: none; 633 | } 634 | .glitch { 635 | position: relative; 636 | } 637 | .glitch:after { 638 | content: attr(data-text); 639 | position: absolute; 640 | top: 3px; 641 | overflow: hidden; 642 | clip: rect(0, 900px, 0, 0); 643 | animation: noise-anim infinite linear alternate-reverse; 644 | background-color: #240624!important; 645 | } 646 | .glitch:before { 647 | content: attr(data-text); 648 | position: absolute; 649 | top: 2px; 650 | overflow: hidden; 651 | clip: rect(0, 900px, 0, 0); 652 | animation: noise-anim-2 infinite linear alternate-reverse; 653 | background-color: #240624!important; 654 | } 655 | .glitch-regular:after{ 656 | left:-1; 657 | } 658 | .glitch-regular:before{ 659 | left:0; 660 | } 661 | .glitch-center:after, .glitch-center:before{ 662 | left:0; 663 | } 664 | .afflink { 665 | overflow: hidden; 666 | text-overflow: ellipsis; 667 | } 668 | a{ 669 | color:white; 670 | } 671 | /* circular progress bar for airdrop modal */ 672 | .cprogress { 673 | width: 7rem; 674 | height: 7rem; 675 | line-height: 30px; 676 | background: none; 677 | margin: 0 auto; 678 | box-shadow: none; 679 | position: relative; 680 | } 681 | .cprogress:after { 682 | content: ""; 683 | width: 100%; 684 | height: 100%; 685 | border-radius: 50%; 686 | border: 2px solid #2d3238; 687 | position: absolute; 688 | top: 0; 689 | left: 0; 690 | } 691 | .cprogress > span { 692 | width: 50%; 693 | height: 100%; 694 | overflow: hidden; 695 | position: absolute; 696 | top: 0; 697 | z-index: 1; 698 | } 699 | .cprogress .cprogress-left { 700 | left: 0; 701 | } 702 | .cprogress .cprogress-bar { 703 | width: 100%; 704 | height: 100%; 705 | background: none; 706 | border-width: 2px; 707 | border-style: solid; 708 | position: absolute; 709 | top: 0; 710 | border-color: #f0f; 711 | } 712 | .cprogress .cprogress-left .cprogress-bar { 713 | left: 100%; 714 | border-top-right-radius: 75px; 715 | border-bottom-right-radius: 75px; 716 | border-left: 0; 717 | -webkit-transform-origin: center left; 718 | transform-origin: center left; 719 | } 720 | .cprogress .cprogress-right { 721 | right: 0; 722 | } 723 | .cprogress .cprogress-right .cprogress-bar { 724 | left: -100%; 725 | border-top-left-radius: 75px; 726 | border-bottom-left-radius: 75px; 727 | border-right: 0; 728 | -webkit-transform-origin: center right; 729 | transform-origin: center right; 730 | } 731 | .cprogress .cprogress-value { 732 | display: flex; 733 | border-radius: 50%; 734 | font-size: 7rem; 735 | text-align: center; 736 | line-height: 1rem; 737 | align-items: center; 738 | justify-content: center; 739 | font-weight: 300; 740 | } 741 | .cprogress .cprogress-value div { 742 | 743 | } 744 | .cprogress .cprogress-value span { 745 | font-size: 12px; 746 | text-transform: uppercase; 747 | } 748 | .cprogress-value{ 749 | z-index:2; 750 | } 751 | .cprogress { 752 | z-index:1; 753 | } 754 | 755 | /* This for loop creates the necessary css animation names 756 | Due to the split circle of cprogress-left and cprogress right, we must use the animations on each side. 757 | */ 758 | .cprogress[data-percentage="10"] .cprogress-right .cprogress-bar { 759 | animation: loading-1 1.5s linear forwards; 760 | } 761 | .cprogress[data-percentage="10"] .cprogress-left .cprogress-bar { 762 | animation: 0; 763 | } 764 | 765 | .cprogress[data-percentage="20"] .cprogress-right .cprogress-bar { 766 | animation: loading-2 1.5s linear forwards; 767 | } 768 | .cprogress[data-percentage="20"] .cprogress-left .cprogress-bar { 769 | animation: 0; 770 | } 771 | 772 | .cprogress[data-percentage="30"] .cprogress-right .cprogress-bar { 773 | animation: loading-3 1.5s linear forwards; 774 | } 775 | .cprogress[data-percentage="30"] .cprogress-left .cprogress-bar { 776 | animation: 0; 777 | } 778 | 779 | .cprogress[data-percentage="40"] .cprogress-right .cprogress-bar { 780 | animation: loading-4 1.5s linear forwards; 781 | } 782 | .cprogress[data-percentage="40"] .cprogress-left .cprogress-bar { 783 | animation: 0; 784 | } 785 | 786 | .cprogress[data-percentage="50"] .cprogress-right .cprogress-bar { 787 | animation: loading-5 1.5s linear forwards; 788 | } 789 | .cprogress[data-percentage="50"] .cprogress-left .cprogress-bar { 790 | animation: 0; 791 | } 792 | 793 | .cprogress[data-percentage="60"] .cprogress-right .cprogress-bar { 794 | animation: loading-5 1.5s linear forwards; 795 | } 796 | .cprogress[data-percentage="60"] .cprogress-left .cprogress-bar { 797 | animation: loading-1 1.5s linear forwards 1.5s; 798 | } 799 | 800 | .cprogress[data-percentage="70"] .cprogress-right .cprogress-bar { 801 | animation: loading-5 1.5s linear forwards; 802 | } 803 | .cprogress[data-percentage="70"] .cprogress-left .cprogress-bar { 804 | animation: loading-2 1.5s linear forwards 1.5s; 805 | } 806 | 807 | .cprogress[data-percentage="80"] .cprogress-right .cprogress-bar { 808 | animation: loading-5 1.5s linear forwards; 809 | } 810 | .cprogress[data-percentage="80"] .cprogress-left .cprogress-bar { 811 | animation: loading-3 1.5s linear forwards 1.5s; 812 | } 813 | 814 | .cprogress[data-percentage="90"] .cprogress-right .cprogress-bar { 815 | animation: loading-5 1.5s linear forwards; 816 | } 817 | .cprogress[data-percentage="90"] .cprogress-left .cprogress-bar { 818 | animation: loading-4 1.5s linear forwards 1.5s; 819 | } 820 | 821 | .cprogress[data-percentage="100"] .cprogress-right .cprogress-bar { 822 | animation: loading-5 0.5s linear forwards; 823 | } 824 | .cprogress[data-percentage="100"] .cprogress-left .cprogress-bar { 825 | animation: loading-5 0.5s linear forwards 0.5s; 826 | } 827 | .cprogress[data-percentage="100"] > .cprogress-value{ 828 | color:#fff; 829 | filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 10px #c0c) drop-shadow(0 0 5px #f0f); 830 | -webkit-filter: drop-shadow(0 0 2px #2b002b) drop-shadow(0 0 10px #c0c) drop-shadow(0 0 5px #f0f); 831 | } 832 | 833 | @keyframes loading-1 { 834 | 0% { 835 | -webkit-transform: rotate(0deg); 836 | transform: rotate(0deg); 837 | } 838 | 100% { 839 | -webkit-transform: rotate(36); 840 | transform: rotate(36deg); 841 | } 842 | } 843 | @keyframes loading-2 { 844 | 0% { 845 | -webkit-transform: rotate(0deg); 846 | transform: rotate(0deg); 847 | } 848 | 100% { 849 | -webkit-transform: rotate(72); 850 | transform: rotate(72deg); 851 | } 852 | } 853 | @keyframes loading-3 { 854 | 0% { 855 | -webkit-transform: rotate(0deg); 856 | transform: rotate(0deg); 857 | } 858 | 100% { 859 | -webkit-transform: rotate(108); 860 | transform: rotate(108deg); 861 | } 862 | } 863 | @keyframes loading-4 { 864 | 0% { 865 | -webkit-transform: rotate(0deg); 866 | transform: rotate(0deg); 867 | } 868 | 100% { 869 | -webkit-transform: rotate(144); 870 | transform: rotate(144deg); 871 | } 872 | } 873 | @keyframes loading-5 { 874 | 0% { 875 | -webkit-transform: rotate(0deg); 876 | transform: rotate(0deg); 877 | } 878 | 100% { 879 | -webkit-transform: rotate(180); 880 | transform: rotate(180deg); 881 | } 882 | } 883 | .cprogress { 884 | margin-bottom: 1em; 885 | } 886 | 887 | 888 | /* different animation durations for reusing on glitch effect */ 889 | .anim-speed-1:before { 890 | animation-duration: 1s; 891 | } 892 | .anim-speed-1:after, .anim-speed-2:before { 893 | animation-duration: 2s; 894 | } 895 | .anim-speed-2:after, .anim-speed-3:before { 896 | animation-duration: 3s; 897 | } 898 | .anim-speed-3:after, .anim-speed-4:before { 899 | animation-duration: 4s; 900 | } 901 | .anime-speed-4:after { 902 | animation-duration: 5s; 903 | } 904 | /* keyframes for various animations */ 905 | /* text-glitch */ 906 | @keyframes noise-anim { 907 | 0% { 908 | clip: rect(6px, 9999px, 44px, 0); 909 | } 910 | 5% { 911 | clip: rect(29px, 9999px, 5px, 0); 912 | } 913 | 10% { 914 | clip: rect(9px, 9999px, 60px, 0); 915 | } 916 | 15% { 917 | clip: rect(61px, 9999px, 99px, 0); 918 | } 919 | 20% { 920 | clip: rect(80px, 9999px, 49px, 0); 921 | } 922 | 25% { 923 | clip: rect(5px, 9999px, 68px, 0); 924 | } 925 | 30% { 926 | clip: rect(28px, 9999px, 54px, 0); 927 | } 928 | 35% { 929 | clip: rect(10px, 9999px, 67px, 0); 930 | } 931 | 40% { 932 | clip: rect(91px, 9999px, 60px, 0); 933 | } 934 | 45% { 935 | clip: rect(9px, 9999px, 67px, 0); 936 | } 937 | 50% { 938 | clip: rect(41px, 9999px, 79px, 0); 939 | } 940 | 55% { 941 | clip: rect(56px, 9999px, 6px, 0); 942 | } 943 | 60% { 944 | clip: rect(52px, 9999px, 58px, 0); 945 | } 946 | 65% { 947 | clip: rect(22px, 9999px, 67px, 0); 948 | } 949 | 70% { 950 | clip: rect(37px, 9999px, 15px, 0); 951 | } 952 | 75% { 953 | clip: rect(65px, 9999px, 51px, 0); 954 | } 955 | 80% { 956 | clip: rect(65px, 9999px, 75px, 0); 957 | } 958 | 85% { 959 | clip: rect(32px, 9999px, 66px, 0); 960 | } 961 | 90% { 962 | clip: rect(32px, 9999px, 17px, 0); 963 | } 964 | 95% { 965 | clip: rect(40px, 9999px, 91px, 0); 966 | } 967 | 100% { 968 | clip: rect(4px, 9999px, 99px, 0); 969 | } 970 | } 971 | 972 | 973 | @keyframes noise-anim-2 { 974 | 0% { 975 | clip: rect(89px, 9999px, 47px, 0); 976 | } 977 | 5% { 978 | clip: rect(89px, 9999px, 76px, 0); 979 | } 980 | 10% { 981 | clip: rect(26px, 9999px, 17px, 0); 982 | } 983 | 15% { 984 | clip: rect(62px, 9999px, 45px, 0); 985 | } 986 | 20% { 987 | clip: rect(63px, 9999px, 32px, 0); 988 | } 989 | 25% { 990 | clip: rect(82px, 9999px, 81px, 0); 991 | } 992 | 30% { 993 | clip: rect(48px, 9999px, 81px, 0); 994 | } 995 | 35% { 996 | clip: rect(65px, 9999px, 67px, 0); 997 | } 998 | 40% { 999 | clip: rect(78px, 9999px, 27px, 0); 1000 | } 1001 | 45% { 1002 | clip: rect(19px, 9999px, 68px, 0); 1003 | } 1004 | 50% { 1005 | clip: rect(93px, 9999px, 51px, 0); 1006 | } 1007 | 55% { 1008 | clip: rect(96px, 9999px, 17px, 0); 1009 | } 1010 | 60% { 1011 | clip: rect(2px, 9999px, 30px, 0); 1012 | } 1013 | 65% { 1014 | clip: rect(90px, 9999px, 90px, 0); 1015 | } 1016 | 70% { 1017 | clip: rect(95px, 9999px, 30px, 0); 1018 | } 1019 | 75% { 1020 | clip: rect(70px, 9999px, 39px, 0); 1021 | } 1022 | 80% { 1023 | clip: rect(13px, 9999px, 57px, 0); 1024 | } 1025 | 85% { 1026 | clip: rect(24px, 9999px, 10px, 0); 1027 | } 1028 | 90% { 1029 | clip: rect(59px, 9999px, 68px, 0); 1030 | } 1031 | 95% { 1032 | clip: rect(58px, 9999px, 28px, 0); 1033 | } 1034 | 100% { 1035 | clip: rect(92px, 9999px, 48px, 0); 1036 | } 1037 | } 1038 | 1039 | /* spinning loader */ 1040 | @keyframes spin { 1041 | 0% { transform: rotate(0deg); } 1042 | 100% { transform: rotate(360deg); } 1043 | } 1044 | /* pulse effect */ 1045 | @keyframes pulse { 1046 | 0% { 1047 | -moz-box-shadow: 0 0 0 0 rgba(204,0,204, 0.8); 1048 | box-shadow: 0 0 0 0 rgba(204,0,204, 0.8); 1049 | } 1050 | 70% { 1051 | -moz-box-shadow: 0 0 0 5px rgba(204,0,204, 0.3); 1052 | box-shadow: 0 0 0 5px rgba(204,0,204, 0.3); 1053 | } 1054 | 100% { 1055 | -moz-box-shadow: 0 0 0 10px rgba(204,0,204, 0); 1056 | box-shadow: 0 0 0 10px rgba(204,0,204, 0); 1057 | } 1058 | } 1059 | /* blue pulse for fomo3d slow mode */ 1060 | @keyframes pulseblu { 1061 | 0% { 1062 | -moz-box-shadow: 0 0 0 0 rgba(0,85,240, 0.8); 1063 | box-shadow: 0 0 0 0 rgba(0,85,240, 0.8); 1064 | } 1065 | 70% { 1066 | -moz-box-shadow: 0 0 0 5px rgba(0,85,240, 0.3); 1067 | box-shadow: 0 0 0 5px rgba(0,85,240, 0.3); 1068 | } 1069 | 100% { 1070 | -moz-box-shadow: 0 0 0 10px rgba(0,85,240, 0); 1071 | box-shadow: 0 0 0 10px rgba(0,85,240, 0); 1072 | } 1073 | } 1074 | /* green pulse for p3d awesome ui */ 1075 | @keyframes pulsegren { 1076 | 0% { 1077 | -moz-box-shadow: 0 0 0 0 rgba(0,255,0, 0.8); 1078 | box-shadow: 0 0 0 0 rgba(0,255,0, 0.8); 1079 | } 1080 | 70% { 1081 | -moz-box-shadow: 0 0 0 5px rgba(0,255,0, 0.3); 1082 | box-shadow: 0 0 0 5px rgba(0,255,0, 0.3); 1083 | } 1084 | 100% { 1085 | -moz-box-shadow: 0 0 0 10px rgba(0,255,0, 0); 1086 | box-shadow: 0 0 0 10px rgba(0,255,0, 0); 1087 | } 1088 | } 1089 | /* pulse effect for tutorialarrows */ 1090 | @keyframes pulsedrop { 1091 | 0% { 1092 | filter: drop-shadow(0 0 0 rgba(204,0,204, 0.8)); 1093 | -webkit-filter: drop-shadow(0 0 0 rgba(204,0,204, 0.8)); 1094 | left:-0.1rem; 1095 | color: #f0f; 1096 | } 1097 | 50% { 1098 | left:-0.5rem; 1099 | } 1100 | 70% { 1101 | filter: drop-shadow(0 0 25px rgba(204,0,204, 0.6)); 1102 | -webkit-filter: drop-shadow(0 0 25px rgba(204,0,204, 0.6)); 1103 | } 1104 | 100% { 1105 | filter: drop-shadow(0 0 40px rgba(204,0,204, 0)); 1106 | -webkit-filter: drop-shadow(0 0 40px rgba(204,0,204, 0)); 1107 | left:-0.1rem; 1108 | } 1109 | } 1110 | /* team select */ 1111 | @keyframes slowpulse { 1112 | 0% { 1113 | filter: drop-shadow(0 0 2px rgba(43,0,34, 0.4)) drop-shadow(0 0 10px rgba(204,0,204, 0.4)) drop-shadow(0 0 5px rgba(255,0,255, 0.4)); 1114 | -webkit-filter: drop-shadow(0 0 2px rgba(43,0,34, 0.4)) drop-shadow(0 0 10px rgba(204,0,204, 0.4)) drop-shadow(0 0 5px rgba(255,0,255, 0.4)); 1115 | } 1116 | 60% { 1117 | filter: drop-shadow(0 0 2px rgba(43,0,34, 1)) drop-shadow(0 0 10px rgba(204,0,204, 1)) drop-shadow(0 0 5px rgba(255,0,255, 1)); 1118 | -webkit-filter: drop-shadow(0 0 2px rgba(43,0,34, 1)) drop-shadow(0 0 10px rgba(204,0,204, 1)) drop-shadow(0 0 5px rgba(255,0,255, 1)); 1119 | } 1120 | 100% { 1121 | filter: drop-shadow(0 0 2px rgba(43,0,34, 0.4)) drop-shadow(0 0 10px rgba(204,0,204, 0.4)) drop-shadow(0 0 5px rgba(255,0,255, 0.4)); 1122 | -webkit-filter: drop-shadow(0 0 2px rgba(43,0,34, 0.4)) drop-shadow(0 0 10px rgba(204,0,204, 0.4)) drop-shadow(0 0 5px rgba(255,0,255, 0.4)); 1123 | } 1124 | } 1125 | 1126 | /* moving grid thing */ 1127 | .grid-container { 1128 | z-index:-1; 1129 | position: absolute; 1130 | top: 0; 1131 | right: 0; 1132 | bottom: 0; 1133 | left: 0; 1134 | margin: auto; 1135 | -webkit-transform-style: preserve-3d; 1136 | transform-style: preserve-3d; 1137 | -webkit-perspective: 800px; 1138 | perspective: 800px; 1139 | overflow: hidden; 1140 | } 1141 | 1142 | .grid-top, 1143 | .grid-bottom { 1144 | position: absolute; 1145 | top: 0; 1146 | right: 0; 1147 | bottom: 0; 1148 | left: 0; 1149 | margin: auto; 1150 | background-size: 50px 50px; 1151 | } 1152 | 1153 | .grid-top { 1154 | background-image: linear-gradient(0deg, rgba(0, 0, 0, 0) 19%, rgba(184, 1, 179, 0.5) 24%, #b900b4 25%, #b900b4 26%, rgba(184, 1, 179, 0.5) 27%, rgba(0, 0, 0, 0) 32%, rgba(0, 0, 0, 0) 69%, rgba(184, 1, 179, 0.5) 74%, #b900b4 75%, #b900b4 76%, rgba(184, 1, 179, 0.5) 77%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0)), linear-gradient(90deg, rgba(0, 0, 0, 0) 19%, rgba(184, 1, 179, 0.5) 24%, #b900b4 25%, #b900b4 26%, rgba(184, 1, 179, 0.5) 27%, rgba(0, 0, 0, 0) 32%, rgba(0, 0, 0, 0) 69%, rgba(184, 1, 179, 0.5) 74%, #b900b4 75%, #b900b4 76%, rgba(184, 1, 179, 0.5) 77%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0)); 1155 | -webkit-transform: rotateX(-70deg) scale(2); 1156 | transform: rotateX(-70deg) scale(2); 1157 | -webkit-transform-origin: top center; 1158 | transform-origin: top center; 1159 | box-shadow: inset 0px -100px 100px 100px #302430; 1160 | animation: rad 1s reverse linear infinite; 1161 | } 1162 | 1163 | .grid-bottom { 1164 | background-image: linear-gradient(0deg, rgba(0, 0, 0, 0) 19%, rgba(184, 1, 179, 0.5) 24%, #b900b4 25%, #b900b4 26%, rgba(184, 1, 179, 0.5) 27%, rgba(0, 0, 0, 0) 32%, rgba(0, 0, 0, 0) 69%, rgba(184, 1, 179, 0.5) 74%, #b900b4 75%, #b900b4 76%, rgba(184, 1, 179, 0.5) 77%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0)), linear-gradient(90deg, rgba(0, 0, 0, 0) 19%, rgba(184, 1, 179, 0.5) 24%, #b900b4 25%, #b900b4 26%, rgba(184, 1, 179, 0.5) 27%, rgba(0, 0, 0, 0) 32%, rgba(0, 0, 0, 0) 69%, rgba(184, 1, 179, 0.5) 74%, #b900b4 75%, #b900b4 76%, rgba(184, 1, 179, 0.5) 77%, rgba(0, 0, 0, 0) 82%, rgba(0, 0, 0, 0)); 1165 | -webkit-transform: rotateX(70deg) scale(2); 1166 | transform: rotateX(70deg) scale(2); 1167 | -webkit-transform-origin: bottom center; 1168 | transform-origin: bottom center; 1169 | box-shadow: inset 0px 100px 100px 100px #302430; 1170 | -webkit-animation: rad 1s linear infinite; 1171 | animation: rad 1s linear infinite; 1172 | height:40rem; 1173 | margin-top:-5rem; 1174 | } 1175 | 1176 | @keyframes rad { 1177 | 100% { 1178 | background-position: 0px 50px; 1179 | } 1180 | } 1181 | 1182 | 1183 | /* responsive things for mobile */ 1184 | @media only screen and (max-width: 750px) { 1185 | .display-1 { 1186 | font-size:4rem; 1187 | } 1188 | .mobile-image { 1189 | width: calc(5vh + 5vw) 1190 | } 1191 | } 1192 | /* hide mobile-only things */ 1193 | @media only screen and (min-width:999px){ 1194 | .only-mobile { 1195 | display: none!important; 1196 | } 1197 | .navbar-expand-lg { 1198 | flex-wrap:wrap!important; 1199 | } 1200 | } 1201 | /* adjust for smaller viewports */ 1202 | @media only screen and (max-width: 992px){ 1203 | #buyTabs, #statTabs { 1204 | font-size: 0.8rem; 1205 | } 1206 | .only-mobile { 1207 | color: white; 1208 | } 1209 | .no-mobile { 1210 | display: none!important; 1211 | } 1212 | .mobile-image { 1213 | width: calc(10vh + 10vw) 1214 | } 1215 | } 1216 | /* responsive for phonescreens */ 1217 | @media only screen and (max-width:375px){ 1218 | .no-mobile { 1219 | display: none; 1220 | } 1221 | .display-1, h4.display-4 { 1222 | font-size: 2rem; 1223 | } 1224 | .display-3 > span { 1225 | font-size: 2.5rem; 1226 | } 1227 | .headtimer { 1228 | font-size:1rem!important; 1229 | } 1230 | .ticktock { 1231 | padding-left:0!important; 1232 | min-width:25px; 1233 | } 1234 | #ceolink, #ceolinkid, #ceolinkvanity { 1235 | display: block; 1236 | overflow: hidden; 1237 | text-overflow: ellipsis; 1238 | } 1239 | #buyTabs, #statTabs { 1240 | font-size: 1rem; 1241 | -webkit-box-orient: vertical!important; 1242 | -webkit-box-direction: normal!important; 1243 | -ms-flex-direction: column!important; 1244 | flex-direction: column!important; 1245 | } 1246 | #buyTabs > .nav-item, 1247 | #statTabs > .nav-item { 1248 | background-color: #2d3238!important; 1249 | } 1250 | #buyTabs >.nav-item a, 1251 | #statTabs > .nav-item a { 1252 | color:#575a5e!important; 1253 | } 1254 | #buyTabs >.nav-item a.active, 1255 | #statTabs > .nav-item a.active { 1256 | color:white!important; 1257 | } 1258 | #buyTabs > .nav-item:first-of-type, 1259 | #statTabs > .nav-item:first-of-type { 1260 | border-top-right-radius: .25rem; 1261 | border-top-left-radius: .25rem; 1262 | } 1263 | } 1264 | 1265 | .btn { 1266 | white-space: normal; 1267 | } 1268 | 1269 | /* pepe */ 1270 | .animation { 1271 | position: fixed; 1272 | bottom:-155px; 1273 | } 1274 | 1275 | /*Image for Key Buttons*/ 1276 | .key-img { 1277 | background-image: url('../img/buyonelogo.png'); 1278 | background-position: 1% 50%; 1279 | background-size: 30px auto; 1280 | background-repeat: no-repeat; 1281 | } 1282 | 1283 | 1284 | /* fookin justo ruinin' ur css m8 */ 1285 | .tooltipyellow { 1286 | color:#cf9c41; 1287 | } 1288 | .popoverglow { 1289 | text-shadow: 0 0 2px #2b002b, 0 0 5px #c0c, 0 0 2px #f0f; 1290 | color:white; 1291 | } 1292 | .titlepopoutrightmini{ 1293 | text-shadow: 1px 1px #9d009d, 1294 | 2px 2px #9d009d, 1295 | 3px 3px #9d009d; 1296 | } 1297 | .titlepopoutrightminigreen{ 1298 | text-shadow: 1px 1px #307b30, 1299 | 2px 2px #307b30, 1300 | 3px 3px #307b30; 1301 | } 1302 | .popoverrightmini{ 1303 | text-shadow: 1px 1px #ff9fff, 1304 | 2px 2px #ff9fff; 1305 | } 1306 | .titlepopout-right-mini-grey-glow{ 1307 | text-shadow: 1px 1px #565656, 1308 | 2px 2px #565656, 1309 | 0 0 2px #2b002b, 1310 | 0 0 5px #c0c, 1311 | 0 0 2px #f0f; 1312 | color:white; 1313 | } 1314 | .titlepopout-right-mini-grey-shadow{ 1315 | text-shadow: 1px 1px #565656, 1316 | 2px 2px #565656, 1317 | 0 0 2px #565656, 1318 | 0 0 5px #565656, 1319 | 0 0 2px #565656; 1320 | color:white; 1321 | } 1322 | .titlepopout-right-mini-grey-ethereum{ 1323 | text-shadow: 1px 1px #494874, 1324 | 2px 2px #494874, 1325 | 0 0 2px #1d2033, 1326 | 0 0 5px #1d2033, 1327 | 0 0 2px #1d2033; 1328 | color:#1d2033; 1329 | } 1330 | .titlepopout-right-mini-grey{ 1331 | text-shadow: 1px 1px #565656, 1332 | 2px 2px #565656; 1333 | } 1334 | .titlepopoutrightminiinverse{ 1335 | color: #e84fe8; 1336 | text-shadow: 1px 1px #000, 1337 | 2px 2px #000, 1338 | 3px 3px #000; 1339 | } 1340 | .popover{ 1341 | width: 100%; 1342 | max-width: 500px; 1343 | } 1344 | /* Make sure that padding behaves as expected */ 1345 | * {box-sizing:border-box} 1346 | 1347 | .dropdown:toggle{ 1348 | background-color: transparent; 1349 | } 1350 | 1351 | .dropdown-menu{ 1352 | background-color: #212529; 1353 | } 1354 | 1355 | .nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { 1356 | background-color: transparent; 1357 | } 1358 | 1359 | /* The switch - the box around the slider */ 1360 | .switch { 1361 | position: relative; 1362 | display: inline-block; 1363 | width: 2rem; 1364 | height: 1rem; 1365 | margin-bottom: -.2rem; 1366 | margin-left: .3rem; 1367 | } 1368 | 1369 | /* Hide default HTML checkbox */ 1370 | .switch input { 1371 | display:none; 1372 | } 1373 | 1374 | /* The slider */ 1375 | .slider { 1376 | position: absolute; 1377 | cursor: pointer; 1378 | top: 0; 1379 | left: 0; 1380 | right: 0; 1381 | bottom: 0; 1382 | background-color: #ccc; 1383 | -webkit-transition: .4s; 1384 | transition: .4s; 1385 | } 1386 | 1387 | .slider:before { 1388 | position: absolute; 1389 | content: ""; 1390 | height: 0.8rem; 1391 | width: 0.8rem; 1392 | left: 0.2rem; 1393 | bottom: 0.1rem; 1394 | background-color: white; 1395 | -webkit-transition: .4s; 1396 | transition: .4s; 1397 | } 1398 | 1399 | input:checked + .slider { 1400 | background-color: #ab21f3; 1401 | } 1402 | 1403 | input:focus + .slider { 1404 | box-shadow: 0 0 1px #ab21f3; 1405 | } 1406 | 1407 | input:checked + .slider:before { 1408 | -webkit-transform: translateX(0.8rem); 1409 | -ms-transform: translateX(0.8rem); 1410 | transform: translateX(0.8rem); 1411 | } 1412 | 1413 | /* Rounded sliders */ 1414 | .slider.round { 1415 | border-radius: 26px; 1416 | } 1417 | 1418 | .slider.round:before { 1419 | border-radius: 50%; 1420 | } 1421 | 1422 | .dropdown-item:hover { 1423 | background-color: rgb(255, 0, 255); 1424 | color: black; 1425 | } 1426 | .dropdown-item-p3d:hover { 1427 | background-color: rgb(0, 255, 0) !important; 1428 | color: black; 1429 | } 1430 | 1431 | .nav-pills .show>.nav-link { 1432 | background-color: #f0f; 1433 | } 1434 | 1435 | /* alertify modifications for fomo3d */ 1436 | 1437 | 1438 | /*JUSTO CHANGE THE COLORS OF THE NOTIFS HERE*/ 1439 | /* .alertify-logs>*, */ 1440 | /* .alertify-logs>.default { */ 1441 | /* background: rgba(0, 0, 0, .8) */ 1442 | /* } */ 1443 | 1444 | /* .alertify-logs>.error { */ 1445 | /* background: rgba(244, 67, 54, .8) */ 1446 | /* } */ 1447 | 1448 | /* .alertify-logs>.success { */ 1449 | /* background: rgba(125, 76, 175, .9) */ 1450 | /* } */ 1451 | 1452 | .success { 1453 | background: rgba(125, 76, 175, .9); 1454 | } 1455 | 1456 | /* BASH related styling pls no change */ 1457 | #terminal { 1458 | position: absolute; 1459 | background-color: black; 1460 | color: #8e8e8e; 1461 | font-family: "Lucida Console", Monaco, monospace; 1462 | width: 100%; 1463 | height: 100%; 1464 | overflow-y:auto; 1465 | z-index: 1000000; 1466 | top:0; 1467 | position: fixed; 1468 | } 1469 | #commandLine li.intro { 1470 | white-space: pre-wrap!important; 1471 | } 1472 | #commandLine li { 1473 | list-style:none; 1474 | } 1475 | #commandLine input { 1476 | border: none; 1477 | color: #8e8e8e; 1478 | background-color: black; 1479 | width: 80%; 1480 | } 1481 | #commandLine input:focus { 1482 | outline-width:0; 1483 | } 1484 | #commandLine .error { 1485 | color: red; 1486 | } 1487 | #commandLine .good { 1488 | color: green; 1489 | } 1490 | #commandLine .ps1 { 1491 | -webkit-touch-callout: none; 1492 | -webkit-user-select: none; 1493 | -moz-user-select: none; 1494 | user-select: none; 1495 | } -------------------------------------------------------------------------------- /src/css/ghostframe.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600); 2 | 3 | .ghostframe { 4 | background: #ededeb; 5 | } 6 | .ghostframe .title { 7 | width: 600px; 8 | margin: 0 auto; 9 | text-align: center; 10 | } 11 | .ghostframe .title h1 { 12 | margin: 30px 0px 0px 0px; 13 | /* font-family: 'Source Sans Pro', sans-serif; */ 14 | font-weight: 400; 15 | color: #3d3d3d; 16 | } 17 | .ghostframe .title h2 { 18 | margin: 10px 0px 0px 0px; 19 | font-size: 18px; 20 | color: #8b8b8b; 21 | font-weight: 400; 22 | /* font-family: 'Source Sans Pro', sans-serif; */ 23 | } 24 | .ghostframe .ui { 25 | width: 900px; 26 | margin: 0 auto; 27 | margin-top: 50px; 28 | /* font-family: 'Source Sans Pro', sans-serif; */ 29 | color: white; 30 | box-shadow: none; 31 | } 32 | .ghostframe .ui ul { 33 | margin: 0px 30px 10px 0px; 34 | padding: 0; 35 | list-style-type: none; 36 | font-size: .8rem; 37 | font-weight: 400; 38 | line-height: 20px; 39 | } 40 | .ghostframe .ui .drop { 41 | opacity: 0; 42 | width: 300px; 43 | height: 8rem; 44 | background: #448f72; 45 | position: absolute; 46 | color: white; 47 | /*! bottom: 200px; */ 48 | padding: 12px 30px 21px 30px; 49 | transition-property: top, opacity; 50 | transition-duration: 1s,1s; 51 | top: 0rem; 52 | } 53 | .ghostframe .ui .drop p { 54 | color: #f8fbfa; 55 | } 56 | .ghostframe .ui .drop-container { 57 | opacity: 0; 58 | width: 300px; 59 | height: 10rem; 60 | background: #448f72; 61 | position: absolute; 62 | color: white; 63 | /*! bottom: 200px; */ 64 | padding: 12px 30px 21px 30px; 65 | transition-property: top, opacity; 66 | transition-duration: 1s; 67 | top: 4rem; 68 | } 69 | .ghostframe .ui .drop-container p { 70 | color: #f8fbfa; 71 | } 72 | .ghostframe .ui_box { 73 | width: 300px; 74 | height: 19rem; 75 | position: relative; 76 | background: #343a40; 77 | float: left; 78 | box-shadow: -1px 0px rgba(255, 255, 255, 0.07); 79 | cursor: pointer; 80 | transform: scale(1); 81 | transition-property: transform, background; 82 | transition-duration: 0.3s; 83 | } 84 | .ghostframe .ui_box__inner { 85 | padding: 25px; 86 | } 87 | .ghostframe .ui_box__inner span { 88 | font-size: 36px; 89 | font-weight: 700; 90 | } 91 | .ghostframe .ui_box__inner .progress { 92 | width: 100%; 93 | margin-top: 10px; 94 | height: 6px; 95 | background: rgba(0, 0, 0, 0.3); 96 | margin-bottom: 15px; 97 | } 98 | .ghostframe .ui_box__inner .progress_graph { 99 | float: right; 100 | border-bottom: 1px solid rgba(255, 255, 255, 0.09); 101 | width: 85px; 102 | text-align: center; 103 | position: relative; 104 | padding-left: 20px; 105 | top: 24px; 106 | } 107 | .ghostframe .ui_box__inner .progress_graph__bar--1 { 108 | width: 10px; 109 | height: 20px; 110 | background: #00a42a; 111 | float: left; 112 | margin-right: 10px; 113 | position: relative; 114 | bottom: -10px; 115 | -webkit-animation: graph 1s; 116 | } 117 | .ghostframe .ui_box__inner .progress_graph__bar--2 { 118 | width: 10px; 119 | -webkit-animation: graph2 1s; 120 | height: 30px; 121 | float: left; 122 | margin-right: 10px; 123 | background: #00a42a; 124 | } 125 | .ghostframe .ui_box__inner .progress_graph__bar--3 { 126 | width: 10px; 127 | height: 24px; 128 | margin-right: 10px; 129 | -webkit-animation: graph3 1s; 130 | background: #00a42a; 131 | float: left; 132 | position: relative; 133 | bottom: -6px; 134 | } 135 | .ghostframe .ui_box__inner .progress_graph__bar--4 { 136 | width: 10px; 137 | height: 14px; 138 | -webkit-animation: graph4 1s; 139 | bottom: -16px; 140 | position: relative; 141 | background: #00a42a; 142 | float: left; 143 | } 144 | .ghostframe .ui_box__inner .progress_bar { 145 | height: 6px; 146 | float: left; 147 | width: 10%; 148 | background: #00a42a; 149 | -webkit-animation: bar 2s; 150 | } 151 | .ghostframe .ui_box__inner .progress_bar--two { 152 | height: 6px; 153 | float: left; 154 | width: 78%; 155 | background: #00a42a; 156 | -webkit-animation: bar2 2s; 157 | } 158 | .ghostframe .ui_box h2 { 159 | font-weight: normal; 160 | font-size: 16px; 161 | margin: -4px 0px 3px 0px; 162 | } 163 | .ghostframe .ui_box p { 164 | font-size: 1rem; 165 | color: #b6b6b6; 166 | clear: left; 167 | font-weight: 300; 168 | /* width: 160px; */ 169 | margin: 2px 0px 15px 0px; 170 | } 171 | .ghostframe .ui_box i { 172 | font-size: 3rem; 173 | } 174 | .ghostframe .ui_box span { 175 | font-size: 3rem; 176 | } 177 | .ghostframe .ui_box:hover { 178 | background: #4ba361; 179 | transform: scale(1.1); 180 | transition-property: transform, background; 181 | transition-duration: 0.3s; 182 | position: relative; 183 | z-index: 1; 184 | } 185 | .ui_box:hover > .ui_box__inner p { 186 | color: #b3dacb; 187 | } 188 | .ui_box:hover > .drop { 189 | transition-property: top, opacity; 190 | transition-duration: 1s,1s; 191 | top: -7.8rem; 192 | opacity: 1; 193 | } 194 | .ui_box:hover > .drop .droptext { 195 | filter: text-shadow(0 0 2px #190019) drop-shadow(0 0 1px #494949) ; 196 | -webkit-filter: text-shadow(0 0 2px #190019) drop-shadow(0 0 1px #494949) ; 197 | } 198 | 199 | .ui_box:hover > .drop .arrow { 200 | transition-property: transform; 201 | transition-duration: 1s; 202 | transform: rotate(765deg); 203 | } 204 | .ui_box:hover > .ui_box__inner .progress_graph > div { 205 | background: white; 206 | } 207 | .ui_box:hover > .ui_box__inner .progress .progress_bar, .ui_box:hover > .ui_box__inner .progress .progress_bar--two { 208 | background: white; 209 | } 210 | .stat_left { 211 | float: left; 212 | } 213 | .arrow { 214 | width: 4px; 215 | height: 4px; 216 | transition-property: transform; 217 | transition-duration: 1s; 218 | transform: rotate(45deg); 219 | -webkit-transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55); 220 | border-top: 1px solid #cdead3; 221 | border-right: 1px solid #cdead3; 222 | float: right; 223 | position: relative; 224 | top: -24px; 225 | right: 0px; 226 | } 227 | @keyframes bar { 228 | from { 229 | width: 0px; 230 | } 231 | to { 232 | width: 58%; 233 | } 234 | } 235 | @keyframes bar2 { 236 | from { 237 | width: 0px; 238 | } 239 | to { 240 | width: 78%; 241 | } 242 | } 243 | @keyframes graph { 244 | from { 245 | height: 0px; 246 | } 247 | to { 248 | height: 20px; 249 | } 250 | } 251 | @keyframes graph2 { 252 | from { 253 | height: 0px; 254 | } 255 | to { 256 | height: 30px; 257 | } 258 | } 259 | @keyframes graph3 { 260 | from { 261 | height: 0px; 262 | } 263 | to { 264 | height: 24px; 265 | } 266 | } 267 | @keyframes graph4 { 268 | from { 269 | height: 0px; 270 | } 271 | to { 272 | height: 13px; 273 | } 274 | } 275 | .ghosttron-spacing { 276 | padding:0rem 0rem; 277 | margin-bottom:0rem; 278 | background-color:rgba(0, 0, 0, 0.0); 279 | border-radius:.0; 280 | } 281 | -------------------------------------------------------------------------------- /src/img/purple_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/src/img/purple_bg.jpg -------------------------------------------------------------------------------- /src/img/snorting_in_progress_pepe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/src/img/snorting_in_progress_pepe.png -------------------------------------------------------------------------------- /src/img/tbear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/src/img/tbear.png -------------------------------------------------------------------------------- /src/img/tbull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/src/img/tbull.png -------------------------------------------------------------------------------- /src/img/tsnek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/src/img/tsnek.png -------------------------------------------------------------------------------- /src/img/twhale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reedhong/fomo3d_mine/c5fcc7a20a46c9a27beeece5c686739323e22868/src/img/twhale.png -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 48 | 49 | F3D Go 50 | 51 | 52 | 53 | 54 | 55 |
56 | 57 |
58 | 59 | 60 |
61 | 62 | 63 | 70 | 71 | 72 | 74 | 90 | 91 | 92 | 154 | 155 | 176 |
177 |
178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 216 | 217 | 218 |
219 | 220 |
221 | 222 | 223 | 224 | 225 | 226 | 227 | 279 | 280 | 281 | 282 | -------------------------------------------------------------------------------- /src/js/alertify.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";function t(){var t={parent:document.body,version:"1.0.11",defaultOkLabel:"Ok",okLabel:"Ok",defaultCancelLabel:"Cancel",cancelLabel:"Cancel",defaultMaxLogItems:2,maxLogItems:2,promptValue:"",promptPlaceholder:"",closeLogOnClick:!1,closeLogOnClickDefault:!1,delay:5e3,defaultDelay:5e3,logContainerClass:"alertify-logs",logContainerDefaultClass:"alertify-logs",dialogs:{buttons:{holder:"",ok:"",cancel:""},input:"",message:"

{{message}}

",log:"
{{message}}
"},defaultDialogs:{buttons:{holder:"",ok:"",cancel:""},input:"",message:"

{{message}}

",log:"
{{message}}
"},build:function(t){var e=this.dialogs.buttons.ok,o="
"+this.dialogs.message.replace("{{message}}",t.message);return"confirm"!==t.type&&"prompt"!==t.type||(e=this.dialogs.buttons.cancel+this.dialogs.buttons.ok),"prompt"===t.type&&(o+=this.dialogs.input),o=(o+this.dialogs.buttons.holder+"
").replace("{{buttons}}",e).replace("{{ok}}",this.okLabel).replace("{{cancel}}",this.cancelLabel)},setCloseLogOnClick:function(t){this.closeLogOnClick=!!t},close:function(t,e){this.closeLogOnClick&&t.addEventListener("click",function(){o(t)}),e=e&&!isNaN(+e)?+e:this.delay,0>e?o(t):e>0&&setTimeout(function(){o(t)},e)},dialog:function(t,e,o,n){return this.setup({type:e,message:t,onOkay:o,onCancel:n})},log:function(t,e,o){var n=document.querySelectorAll(".alertify-logs > div");if(n){var i=n.length-this.maxLogItems;if(i>=0)for(var a=0,l=i+1;l>a;a++)this.close(n[a],-1)}this.notify(t,e,o)},setLogPosition:function(t){this.logContainerClass="alertify-logs "+t},setupLogContainer:function(){var t=document.querySelector(".alertify-logs"),e=this.logContainerClass;return t||(t=document.createElement("div"),t.className=e,this.parent.appendChild(t)),t.className!==e&&(t.className=e),t},notify:function(e,o,n){var i=this.setupLogContainer(),a=document.createElement("div");a.className=o||"default",t.logTemplateMethod?a.innerHTML=t.logTemplateMethod(e):a.innerHTML=e,"function"==typeof n&&a.addEventListener("click",n),i.appendChild(a),setTimeout(function(){a.className+=" show"},10),this.close(a,this.delay)},setup:function(t){function e(e){"function"!=typeof e&&(e=function(){}),i&&i.addEventListener("click",function(i){t.onOkay&&"function"==typeof t.onOkay&&(l?t.onOkay(l.value,i):t.onOkay(i)),e(l?{buttonClicked:"ok",inputValue:l.value,event:i}:{buttonClicked:"ok",event:i}),o(n)}),a&&a.addEventListener("click",function(i){t.onCancel&&"function"==typeof t.onCancel&&t.onCancel(i),e({buttonClicked:"cancel",event:i}),o(n)}),l&&l.addEventListener("keyup",function(t){13===t.which&&i.click()})}var n=document.createElement("div");n.className="alertify hide",n.innerHTML=this.build(t);var i=n.querySelector(".ok"),a=n.querySelector(".cancel"),l=n.querySelector("input"),s=n.querySelector("label");l&&("string"==typeof this.promptPlaceholder&&(s?s.textContent=this.promptPlaceholder:l.placeholder=this.promptPlaceholder),"string"==typeof this.promptValue&&(l.value=this.promptValue));var r;return"function"==typeof Promise?r=new Promise(e):e(),this.parent.appendChild(n),setTimeout(function(){n.classList.remove("hide"),l&&t.type&&"prompt"===t.type?(l.select(),l.focus()):i&&i.focus()},100),r},okBtn:function(t){return this.okLabel=t,this},setDelay:function(t){return t=t||0,this.delay=isNaN(t)?this.defaultDelay:parseInt(t,10),this},cancelBtn:function(t){return this.cancelLabel=t,this},setMaxLogItems:function(t){this.maxLogItems=parseInt(t||this.defaultMaxLogItems)},theme:function(t){switch(t.toLowerCase()){case"bootstrap":this.dialogs.buttons.ok="",this.dialogs.buttons.cancel="",this.dialogs.input="";break;case"purecss":this.dialogs.buttons.ok="",this.dialogs.buttons.cancel="";break;case"mdl":case"material-design-light":this.dialogs.buttons.ok="",this.dialogs.buttons.cancel="",this.dialogs.input="
";break;case"angular-material":this.dialogs.buttons.ok="",this.dialogs.buttons.cancel="",this.dialogs.input="
";break;case"default":default:this.dialogs.buttons.ok=this.defaultDialogs.buttons.ok,this.dialogs.buttons.cancel=this.defaultDialogs.buttons.cancel,this.dialogs.input=this.defaultDialogs.input}},reset:function(){this.parent=document.body,this.theme("default"),this.okBtn(this.defaultOkLabel),this.cancelBtn(this.defaultCancelLabel),this.setMaxLogItems(),this.promptValue="",this.promptPlaceholder="",this.delay=this.defaultDelay,this.setCloseLogOnClick(this.closeLogOnClickDefault),this.setLogPosition("bottom left"),this.logTemplateMethod=null},injectCSS:function(){if(!document.querySelector("#alertifyCSS")){var t=document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",e.id="alertifyCSS",e.innerHTML=".alertify-logs>*{padding:12px 24px;color:#fff;box-shadow:0 2px 5px 0 rgba(0,0,0,.2);border-radius:1px}.alertify-logs>*,.alertify-logs>.default{background:rgba(0,0,0,.8)}.alertify-logs>.error{background:rgba(244,67,54,.8)}.alertify-logs>.success{background:rgba(76,175,80,.9)}.alertify{position:fixed;background-color:rgba(0,0,0,.3);left:0;right:0;top:0;bottom:0;width:100%;height:100%;z-index:1}.alertify.hide{opacity:0;pointer-events:none}.alertify,.alertify.show{box-sizing:border-box;transition:all .33s cubic-bezier(.25,.8,.25,1)}.alertify,.alertify *{box-sizing:border-box}.alertify .dialog{padding:12px}.alertify .alert,.alertify .dialog{width:100%;margin:0 auto;position:relative;top:50%;transform:translateY(-50%)}.alertify .alert>*,.alertify .dialog>*{width:400px;max-width:95%;margin:0 auto;text-align:center;padding:12px;background:#fff;box-shadow:0 2px 4px -1px rgba(0,0,0,.14),0 4px 5px 0 rgba(0,0,0,.098),0 1px 10px 0 rgba(0,0,0,.084)}.alertify .alert .msg,.alertify .dialog .msg{padding:12px;margin-bottom:12px;margin:0;text-align:left}.alertify .alert input:not(.form-control),.alertify .dialog input:not(.form-control){margin-bottom:15px;width:100%;font-size:100%;padding:12px}.alertify .alert input:not(.form-control):focus,.alertify .dialog input:not(.form-control):focus{outline-offset:-2px}.alertify .alert nav,.alertify .dialog nav{text-align:right}.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button),.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button){background:transparent;box-sizing:border-box;color:rgba(0,0,0,.87);position:relative;outline:0;border:0;display:inline-block;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;padding:0 6px;margin:6px 8px;line-height:36px;min-height:36px;white-space:nowrap;min-width:88px;text-align:center;text-transform:uppercase;font-size:14px;text-decoration:none;cursor:pointer;border:1px solid transparent;border-radius:2px}.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):active,.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):hover,.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):active,.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):hover{background-color:rgba(0,0,0,.05)}.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):focus,.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):focus{border:1px solid rgba(0,0,0,.1)}.alertify .alert nav button.btn,.alertify .dialog nav button.btn{margin:6px 4px}.alertify-logs{position:fixed;z-index:1}.alertify-logs.bottom,.alertify-logs:not(.top){bottom:16px}.alertify-logs.left,.alertify-logs:not(.right){left:16px}.alertify-logs.left>*,.alertify-logs:not(.right)>*{float:left;transform:translateZ(0);height:auto}.alertify-logs.left>.show,.alertify-logs:not(.right)>.show{left:0}.alertify-logs.left>*,.alertify-logs.left>.hide,.alertify-logs:not(.right)>*,.alertify-logs:not(.right)>.hide{left:-110%}.alertify-logs.right{right:16px}.alertify-logs.right>*{float:right;transform:translateZ(0)}.alertify-logs.right>.show{right:0;opacity:1}.alertify-logs.right>*,.alertify-logs.right>.hide{right:-110%;opacity:0}.alertify-logs.top{top:0}.alertify-logs>*{box-sizing:border-box;transition:all .4s cubic-bezier(.25,.8,.25,1);position:relative;clear:both;backface-visibility:hidden;perspective:1000;max-height:0;margin:0;padding:0;overflow:hidden;opacity:0;pointer-events:none}.alertify-logs>.show{margin-top:12px;opacity:1;max-height:1000px;padding:12px;pointer-events:auto}",t.insertBefore(e,t.firstChild)}},removeCSS:function(){var t=document.querySelector("#alertifyCSS");t&&t.parentNode&&t.parentNode.removeChild(t)}};return t.injectCSS(),{_$$alertify:t,parent:function(e){t.parent=e},reset:function(){return t.reset(),this},alert:function(e,o,n){return t.dialog(e,"alert",o,n)||this},confirm:function(e,o,n){return t.dialog(e,"confirm",o,n)||this},prompt:function(e,o,n){return t.dialog(e,"prompt",o,n)||this},log:function(e,o){return t.log(e,"default",o),this},theme:function(e){return t.theme(e),this},success:function(e,o){return t.log(e,"success",o),this},error:function(e,o){return t.log(e,"error",o),this},cancelBtn:function(e){return t.cancelBtn(e),this},okBtn:function(e){return t.okBtn(e),this},delay:function(e){return t.setDelay(e),this},placeholder:function(e){return t.promptPlaceholder=e,this},defaultValue:function(e){return t.promptValue=e,this},maxLogItems:function(e){return t.setMaxLogItems(e),this},closeLogOnClick:function(e){return t.setCloseLogOnClick(!!e),this},logPosition:function(e){return t.setLogPosition(e||""),this},setLogTemplate:function(e){return t.logTemplateMethod=e,this},clearLogs:function(){return t.setupLogContainer().innerHTML="",this},version:t.version}}var e=500,o=function(t){if(t){var o=function(){t&&t.parentNode&&t.parentNode.removeChild(t)};t.classList.remove("show"),t.classList.add("hide"),t.addEventListener("transitionend",o),setTimeout(o,e)}};if("undefined"!=typeof module&&module&&module.exports){module.exports=function(){return new t};var n=new t;for(var i in n)module.exports[i]=n[i]}else"function"==typeof define&&define.amd?define(function(){return new t}):window.alertify=new t}(); -------------------------------------------------------------------------------- /src/js/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.1 3 | * https://zenorocha.github.io/clipboard.js 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=3)}([function(t,e,n){var o,r,i;!function(a,c){r=[t,n(7)],o=c,void 0!==(i="function"==typeof o?o.apply(e,r):o)&&(t.exports=i)}(0,function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(t){return t&&t.__esModule?t:{default:t}}(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,o.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,o.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}();t.exports=a})},function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return r(t,e,n);if(c.nodeList(t))return i(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return u(document.body,t,e,n)}var c=n(6),u=n(5);t.exports=o},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===d(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,f.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(s.default);t.exports=p})},function(t,e){function n(t,e){for(;t&&t.nodeType!==o;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var o=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=n},function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function r(t,e,n,r,i){return"function"==typeof t.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return o(t,e,n,r,i)}))}function i(t,e,n,o){return function(n){n.delegateTarget=a(n.target,e),n.delegateTarget&&o.call(t,n)}}var a=n(4);t.exports=r},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e){function n(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}t.exports=n}])}); -------------------------------------------------------------------------------- /truffle.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // See 3 | // for more about customizing your Truffle configuration! 4 | networks: { 5 | development: { 6 | host: "127.0.0.1", 7 | port: 7545, 8 | network_id: "*" // Match any network id 9 | } 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mode: 'production', 3 | entry: __dirname + "/src/js/srcbd.js",//已多次提及的唯一入口文件 4 | output: { 5 | path: __dirname + "/src/js/",//打包后的文件存放的地方 6 | filename: "bundle.js"//打包后输出文件的文件名 7 | } 8 | } --------------------------------------------------------------------------------