├── .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 | 
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 |
61 |
62 |
63 |
64 |
65 |
66 |
Please enable Javascript to play F3D+
67 |
68 |
69 |
70 |
71 |
72 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | Please check your Metamask...
81 |
82 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
Graffiti your name on the Blockchain
100 |
101 |
108 |
109 |
110 |
111 |
112 |
124 |
125 |
126 | Names must follow these rules:
127 | -Must be unique
128 | -32 Characters or Less
129 | -A-Z (lowercase)
130 | -Name cannot be just numbers, but numbers are allowed
131 | -No special characters
132 | -No more than one space between characters
133 |
134 | If the transaction fails, one of these criteria was not met properly.
135 |
136 | Names are yours permanently (for vanity URLS). But only your most recent name will show up on the leaderboard/game UI. You can own as many names as you'd like.
137 |
138 | Make it good.
139 |
140 |
141 |
142 |
143 |
144 |
145 |
Purchase for 0.01 ETH
146 |
The fee is distributed across community members who made this game possible.
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
198 |
199 |
This is the short version of Fomo3D.
200 |
We designed a more exciting rules and the limitation of game duration is just 10 minutes.
201 |
And we do not reward the p3d holders.
202 |
203 |
这里是Fomo3D短时间版本。
204 |
我们提供了更刺激的玩法,上限时间仅10分钟。
205 |
且我们将p3d持有者的奖励全部返还到奖池中。
206 |
官方中文简易指南 https://hackmd.io/s/ryFTfx-Em (Author: maojk#6803)
207 |
208 |
Contract Code
209 |
210 |
213 |
214 |
215 |
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:"{{buttons}} ",ok:"{{ok}} ",cancel:"{{cancel}} "},input:" ",message:"{{message}}
",log:"{{message}}
"},defaultDialogs:{buttons:{holder:"{{buttons}} ",ok:"{{ok}} ",cancel:"{{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="{{ok}} ",this.dialogs.buttons.cancel="{{cancel}} ",this.dialogs.input=" ";break;case"purecss":this.dialogs.buttons.ok="{{ok}} ",this.dialogs.buttons.cancel="{{cancel}} ";break;case"mdl":case"material-design-light":this.dialogs.buttons.ok="{{ok}} ",this.dialogs.buttons.cancel="{{cancel}} ",this.dialogs.input="
";break;case"angular-material":this.dialogs.buttons.ok="{{ok}} ",this.dialogs.buttons.cancel="{{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 | }
--------------------------------------------------------------------------------