Sponsored:   Ubex.com - World roadshow: Seoul Sep 17-19, Singapore Sep 19-20, Dubai 18-23. Meet us!.
Contract Overview | Fomo3D_2
Balance: 0 Ether
Ether Value: $0
Transactions: 830 txns
 Latest 25 txns From a total of 830 Transactions

TxHash Age From To Value [TxFee]
0x869561b8b3218cc58b1f03f5f117704894087491ea37bb2c0dc8c76aabe824722 days 7 hrs ago0x0ebcf026946a4de6155961d66d53b0100c6271a1  IN   Fomo3D_20 Ether0.001170036
0x6678e0b2368c01ac0d8539d3f5707d2a7f483a409c88306634e35d71b248150014 days 2 hrs ago0x0ebcf026946a4de6155961d66d53b0100c6271a1  IN   Fomo3D_20.01 Ether0.003500792
0xc6a5088876fdb077770aa495924d6bef02d5973701a3b6865528a2dc3776223c14 days 22 hrs ago0x0ebcf026946a4de6155961d66d53b0100c6271a1  IN   Fomo3D_20.01 Ether0.003958677
0x4463c52c90e76a5d7fb75fe173791103c3d44ee08fca972541b003c29494dbc627 days 5 hrs ago0x4eabb8dc0ce6b7c0ca2161e73d1d726761b6097b  IN   Fomo3D_20 Ether0.000135164
0x6fc3156675fe0fbc993319d61fd26cff04d82eb1d66533d943355b44f2cecfff30 days 17 hrs ago0x64c0f52effdc8602d57089d0918f6a8aff56b385  IN   Fomo3D_20.01 Ether0.002689168
0x17a6cdf6fb1599a7d4614e2bd2017b576992d4b5220a041d12e13e1a25bedf9c37 days 2 hrs ago0x9cfb8c29221b3ca1678f1990e262df577e447e5a  IN   Fomo3D_20.01 Ether0.0020301856
0x59846df33bf8f60cda229acfd6d7ed471352a1bc0524e271fc67e21f546d13ad37 days 6 hrs ago0x6182b3afbc7873e7a2616b173c682ba142cfa87b  IN   Fomo3D_20.01 Ether0.002032095
0x99ba6e3f5878dad07881db6b01cafbc42048494970e154bf152ced5780cf8c1a37 days 23 hrs ago0xc765be1b65becf5446f17f312442b349580e05d0  IN   Fomo3D_20.01 Ether0.001833555
0x103f2084cfc6ec8017902c2e6651b094956b560883b25bc61573f216bbbdf41139 days 5 hrs ago0xefd461284524c6689a4cff91e5ccd4882715a2bf  IN   Fomo3D_20.01 Ether0.001430992
0x16314f3e45d4ac6a4a5dba9e9e381feb192996c6ec784f0ae902283ff399e7d739 days 8 hrs ago0x693d861d88067ccd93bbb746d93da00066980aa9  IN   Fomo3D_20.01 Ether0.0022936
0x4d7d273bcfabd258abf6b3ad678fee1ebbb5937196206e92836ae3edd4554aa639 days 8 hrs ago0x693d861d88067ccd93bbb746d93da00066980aa9  IN   Fomo3D_20.01 Ether0.006
0x4925fd3d5e62081c2e842de3d9c0b38467a7341d1b9e7c45c771311c14c960d842 days 14 mins ago0x023c74b67dfcf4c20875a079e59873d8bbe42449  IN   Fomo3D_20.01 Ether0.00117253
0x4a1389c438e2f6ef2c9c8f75f679ef79950610226d125d5d724486ee2f0e3de442 days 17 hrs ago0x71768dda29bdbc31f17d3fb2d6b6eab718d8a7a5  IN   Fomo3D_20 Ether0.000778506
0x95956ca72125f3bb3d5cc8700c7358a63321fa121dea825799ac426bc01d150c43 days 2 hrs ago0x36c85bcc27cc648205502934c249bf1e3761f7d5  IN   Fomo3D_20.01 Ether0.00848862
0x6cc63ca2c982d2e29f27ec062bdb54cb3b03acca5fe52ba1c471bec57642e7c444 days 13 hrs ago0x33d6a8843a0819b5fe892477115c27f13759c95f  IN   Fomo3D_20.01 Ether0.03978228
0x0e98fbe5b866ae9640908f0bab156baa0ec1fd61741023ce0ac3b968decf962a45 days 16 hrs ago0x71768dda29bdbc31f17d3fb2d6b6eab718d8a7a5  IN   Fomo3D_20 Ether0.00844012
0xbd25d4d31d3ebcf7068d329a3f094258d6ff17e4cc56a52d315b0bb46aaf930e45 days 16 hrs ago0x71768dda29bdbc31f17d3fb2d6b6eab718d8a7a5  IN   Fomo3D_20.01 Ether0.01566877
0x97f8986ee9f4eff69ad2d844ce72f93778978d9bef527498fd958dd8143cf26746 days 9 hrs ago0x36c85bcc27cc648205502934c249bf1e3761f7d5  IN   Fomo3D_20 Ether0.00032501
0x3f92ae5e65ee92f3631b2a06f3c559561d90650e31e5acf1a7bb601ee20a64d547 days 17 hrs ago0x80e3443b7cfa1646c05206f724e8032e9ade780e  IN   Fomo3D_20 Ether0.0001389153
0x041fd212d74fd39e04be8a826ba5773d59db787d9eb40f3cf6e23aaa50001ccf47 days 17 hrs ago0x80e3443b7cfa1646c05206f724e8032e9ade780e  IN   Fomo3D_20 Ether0.0000546552
0x1ea26b6cea3e9aea08b3fe75cc4f02483845ccf0fb718fa5c6c14c29e0d56f3649 days 15 hrs ago0x36c85bcc27cc648205502934c249bf1e3761f7d5  IN   Fomo3D_20.01 Ether0.001739164
0xd8080cc7fce9e0fb292135b6acd5d778f82cf94c9e03d5285db7a9d8f9e4eb1d50 days 32 mins ago0x83a1d4ebfe74de7879d105855e19bc4d9d791816  IN   Fomo3D_20 Ether0.000045546
0x19dcd13f44bb764db9129a40249e9996964766682bd6a8c79a5999b851b9762350 days 2 hrs ago0x18e90fc6f70344f53ebd4f6070bf6aa23e2d748c  IN   Fomo3D_20 Ether0.00055124
0x099cc317da12359a458c9c17034e3ce79d5b325018b7cac6e1a6cad58de385b950 days 2 hrs ago0x18e90fc6f70344f53ebd4f6070bf6aa23e2d748c  IN   Fomo3D_20 Ether0.000101036
0x10713409b2b71a9927a662dc6581b49e9865ef47678909eb636df42a368f79b450 days 5 hrs ago0x0ebcf026946a4de6155961d66d53b0100c6271a1  IN   Fomo3D_20.01 Ether0.003592072
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click Here To View More View All
ParentTxHash Block Age From To Value
0x76edfcb2e8bd70af4026bf05f85008c3625e3e3aadf1b9108363de7fe3ed0d57637814710 hrs 48 mins ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x76edfcb2e8bd70af4026bf05f85008c3625e3e3aadf1b9108363de7fe3ed0d57637814710 hrs 48 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xf127e823f17d907cf5470761dd7ac630627eb11096631c3689a3fea4f69c48a7637663416 hrs 50 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x42b55504ea7d8c307d767a989b4fcdf35a4460b86163b1788dd999d2a00fb530637662416 hrs 52 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x1315a9741966ba3cc2d9007bf4cf2c14f66393a367d6d833bc193356e40e27ce637552221 hrs 22 mins ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x1315a9741966ba3cc2d9007bf4cf2c14f66393a367d6d833bc193356e40e27ce637552221 hrs 22 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x99020498058db6394cf253f45090119e2d7e26cc75e754d59729acf9bc86d5ca637551921 hrs 22 mins ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x99020498058db6394cf253f45090119e2d7e26cc75e754d59729acf9bc86d5ca637551921 hrs 22 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xef8c04af642b0b2cbf68273e88ddfb12c1a01507df5457118be92a64b629947463726321 day 8 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xef8c04af642b0b2cbf68273e88ddfb12c1a01507df5457118be92a64b629947463726321 day 8 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xa5e3121d0de867dacb21f28dde4945daf0cf4cbc1291f38fafa6c40e2330ccbc63706661 day 16 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xa5e3121d0de867dacb21f28dde4945daf0cf4cbc1291f38fafa6c40e2330ccbc63706661 day 16 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x54fab564c42b032423c110806ed0b42945c27f56c05e3116521641d83b260bd163703501 day 17 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x50e3db5773213e79591a9f62a445a2946d0ac05ed272c94bda49ece5302afe2a63673082 days 5 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x50e3db5773213e79591a9f62a445a2946d0ac05ed272c94bda49ece5302afe2a63673082 days 5 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xbd1adc9e327ed0d0c4a6eb87b3089bdb7c3f351f18904feb3de7978a61dce11563662802 days 10 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xbd1adc9e327ed0d0c4a6eb87b3089bdb7c3f351f18904feb3de7978a61dce11563662802 days 10 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x0cfd41251cbdcf2bef1b169caacc0b03b581f67b5e71c00fac7d405561ee94f263616903 days 4 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x0cfd41251cbdcf2bef1b169caacc0b03b581f67b5e71c00fac7d405561ee94f263616903 days 4 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x705839abc46ffa82584de1e4eb37edfac4e33cdd9c00acaa86f94b9d42a4c68e63606343 days 8 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x705839abc46ffa82584de1e4eb37edfac4e33cdd9c00acaa86f94b9d42a4c68e63606343 days 8 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x3dc63a300b325732e38cde696bf6879055f1c5833c8a36922373379068a8409963598273 days 11 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x3dc63a300b325732e38cde696bf6879055f1c5833c8a36922373379068a8409963598273 days 11 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xa2f4579904b6f68cce6625e4c2479fe22478de68355fb9f5c6ddc8bb1465bfec63588073 days 15 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xa2f4579904b6f68cce6625e4c2479fe22478de68355fb9f5c6ddc8bb1465bfec63588073 days 15 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: PlayerBook
Compiler Text: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimiser):  50



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.24;
/*
 * -PlayerBook - v0.3.14
 * ┌┬┐┌─┐┌─┐┌┬┐   ╦╦ ╦╔═╗╔╦╗  ┌─┐┬─┐┌─┐┌─┐┌─┐┌┐┌┌┬┐┌─┐
 *  │ ├┤ ├─┤│││   ║║ ║╚═╗ ║   ├─┘├┬┘├┤ └─┐├┤ │││ │ └─┐
 *  ┴ └─┘┴ ┴┴ ┴  ╚╝╚═╝╚═╝ ╩   ┴  ┴└─└─┘└─┘└─┘┘└┘ ┴ └─┘
 *                                  _____                      _____
 *                                 (, /     /)       /) /)    (, /      /)          /)
 *          ┌─┐                      /   _ (/_      // //       /  _   // _   __  _(/
 *          ├─┤                  ___/___(/_/(__(_/_(/_(/_   ___/__/_)_(/_(_(_/ (_(_(_
 *          ┴ ┴                /   /          .-/ _____   (__ /
 *                            (__ /          (_/ (, /                                      /)™
 *                                                 /  __  __ __ __  _   __ __  _  _/_ _  _(/
 * ┌─┐┬─┐┌─┐┌┬┐┬ ┬┌─┐┌┬┐                          /__/ (_(__(_)/ (_/_)_(_)/ (_(_(_(__(/_(_(_
 * ├─┘├┬┘│ │ │││ ││   │                      (__ /              .-/  © Jekyll Island Inc. 2018
 * ┴  ┴└─└─┘─┴┘└─┘└─┘ ┴                                        (_/
 *     ______   _                                 ______                 _          
 *====(_____ \=| |===============================(____  \===============| |=============*
 *     _____) )| |  _____  _   _  _____   ____    ____)  )  ___    ___  | |  _
 *    |  ____/ | | (____ || | | || ___ | / ___)  |  __  (  / _ \  / _ \ | |_/ )
 *    | |      | | / ___ || |_| || ____|| |      | |__)  )| |_| || |_| ||  _ (
 *====|_|=======\_)\_____|=\__  ||_____)|_|======|______/==\___/==\___/=|_|=\_)=========*
 *                        (____/
 * ╔═╗┌─┐┌┐┌┌┬┐┬─┐┌─┐┌─┐┌┬┐  ╔═╗┌─┐┌┬┐┌─┐ ┌──────────┐                       
 * ║  │ ││││ │ ├┬┘├─┤│   │   ║  │ │ ││├┤  │ Inventor │                      
 * ╚═╝└─┘┘└┘ ┴ ┴└─┴ ┴└─┘ ┴   ╚═╝└─┘─┴┘└─┘ └──────────┘    
 */

interface JIincForwarderInterface {
    function deposit() external payable returns(bool);
    function status() external view returns(address, address, bool);
    function startMigration(address _newCorpBank) external returns(bool);
    function cancelMigration() external returns(bool);
    function finishMigration() external returns(bool);
    function setup(address _firstCorpBank) external;
}

interface PlayerBookReceiverInterface {
    function receivePlayerInfo(uint256 _pID, address _addr, bytes32 _name, uint256 _laff) external;
    function receivePlayerNameList(uint256 _pID, bytes32 _name) external;
}

interface TeamJustInterface {
    function requiredSignatures() external view returns(uint256);
    function requiredDevSignatures() external view returns(uint256);
    function adminCount() external view returns(uint256);
    function devCount() external view returns(uint256);
    function adminName(address _who) external view returns(bytes32);
    function isAdmin(address _who) external view returns(bool);
    function isDev(address _who) external view returns(bool);
}

contract PlayerBook {
    using NameFilter for string;
    using SafeMath for uint256;
    
    JIincForwarderInterface constant private Jekyll_Island_Inc = JIincForwarderInterface(0xdd4950F977EE28D2C132f1353D1595035Db444EE);
    TeamJustInterface constant private TeamJust = TeamJustInterface(0x464904238b5CdBdCE12722A7E6014EC1C0B66928);
    
    MSFun.Data private msData;
    function multiSigDev(bytes32 _whatFunction) private returns (bool) {return(MSFun.multiSig(msData, TeamJust.requiredDevSignatures(), _whatFunction));}
    function deleteProposal(bytes32 _whatFunction) private {MSFun.deleteProposal(msData, _whatFunction);}
    function deleteAnyProposal(bytes32 _whatFunction) onlyDevs() public {MSFun.deleteProposal(msData, _whatFunction);}
    function checkData(bytes32 _whatFunction) onlyDevs() public view returns(bytes32, uint256) {return(MSFun.checkMsgData(msData, _whatFunction), MSFun.checkCount(msData, _whatFunction));}
    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));}
    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)));}
//==============================================================================
//     _| _ _|_ _    _ _ _|_    _   .
//    (_|(_| | (_|  _\(/_ | |_||_)  .
//=============================|================================================    
    uint256 public registrationFee_ = 10 finney;            // price to register a name
    mapping(uint256 => PlayerBookReceiverInterface) public games_;  // mapping of our game interfaces for sending your account info to games
    mapping(address => bytes32) public gameNames_;          // lookup a games name
    mapping(address => uint256) public gameIDs_;            // lokup a games ID
    uint256 public gID_;        // total number of games
    uint256 public pID_;        // total number of players
    mapping (address => uint256) public pIDxAddr_;          // (addr => pID) returns player id by address
    mapping (bytes32 => uint256) public pIDxName_;          // (name => pID) returns player id by name
    mapping (uint256 => Player) public plyr_;               // (pID => data) player data
    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)
    mapping (uint256 => mapping (uint256 => bytes32)) public plyrNameList_; // (pID => nameNum => name) list of names a player owns
    struct Player {
        address addr;
        bytes32 name;
        uint256 laff;
        uint256 names;
    }
//==============================================================================
//     _ _  _  __|_ _    __|_ _  _  .
//    (_(_)| |_\ | | |_|(_ | (_)|   .  (initial data setup upon contract deploy)
//==============================================================================    
    constructor()
        public
    {
        // premine the dev names (sorry not sorry)
            // No keys are purchased with this method, it's simply locking our addresses,
            // PID's and names for referral codes.
        plyr_[1].addr = 0x8e0d985f3Ec1857BEc39B76aAabDEa6B31B67d53;
        plyr_[1].name = "justo";
        plyr_[1].names = 1;
        pIDxAddr_[0x8e0d985f3Ec1857BEc39B76aAabDEa6B31B67d53] = 1;
        pIDxName_["justo"] = 1;
        plyrNames_[1]["justo"] = true;
        plyrNameList_[1][1] = "justo";
        
        plyr_[2].addr = 0x8b4DA1827932D71759687f925D17F81Fc94e3A9D;
        plyr_[2].name = "mantso";
        plyr_[2].names = 1;
        pIDxAddr_[0x8b4DA1827932D71759687f925D17F81Fc94e3A9D] = 2;
        pIDxName_["mantso"] = 2;
        plyrNames_[2]["mantso"] = true;
        plyrNameList_[2][1] = "mantso";
        
        plyr_[3].addr = 0x7ac74Fcc1a71b106F12c55ee8F802C9F672Ce40C;
        plyr_[3].name = "sumpunk";
        plyr_[3].names = 1;
        pIDxAddr_[0x7ac74Fcc1a71b106F12c55ee8F802C9F672Ce40C] = 3;
        pIDxName_["sumpunk"] = 3;
        plyrNames_[3]["sumpunk"] = true;
        plyrNameList_[3][1] = "sumpunk";
        
        plyr_[4].addr = 0x18E90Fc6F70344f53EBd4f6070bf6Aa23e2D748C;
        plyr_[4].name = "inventor";
        plyr_[4].names = 1;
        pIDxAddr_[0x18E90Fc6F70344f53EBd4f6070bf6Aa23e2D748C] = 4;
        pIDxName_["inventor"] = 4;
        plyrNames_[4]["inventor"] = true;
        plyrNameList_[4][1] = "inventor";
        
        pID_ = 4;
    }
//==============================================================================
//     _ _  _  _|. |`. _  _ _  .
//    | | |(_)(_||~|~|(/_| _\  .  (these are safety checks)
//==============================================================================    
    /**
     * @dev prevents contracts from interacting with fomo3d 
     */
    modifier isHuman() {
        address _addr = msg.sender;
        uint256 _codeLength;
        
        assembly {_codeLength := extcodesize(_addr)}
        require(_codeLength == 0, "sorry humans only");
        _;
    }
    
    modifier onlyDevs() 
    {
        require(TeamJust.isDev(msg.sender) == true, "msg sender is not a dev");
        _;
    }
    
    modifier isRegisteredGame()
    {
        require(gameIDs_[msg.sender] != 0);
        _;
    }
//==============================================================================
//     _    _  _ _|_ _  .
//    (/_\/(/_| | | _\  .
//==============================================================================    
    // fired whenever a player registers a name
    event onNewName
    (
        uint256 indexed playerID,
        address indexed playerAddress,
        bytes32 indexed playerName,
        bool isNewPlayer,
        uint256 affiliateID,
        address affiliateAddress,
        bytes32 affiliateName,
        uint256 amountPaid,
        uint256 timeStamp
    );
//==============================================================================
//     _  _ _|__|_ _  _ _  .
//    (_|(/_ |  | (/_| _\  . (for UI & viewing things on etherscan)
//=====_|=======================================================================
    function checkIfNameValid(string _nameStr)
        public
        view
        returns(bool)
    {
        bytes32 _name = _nameStr.nameFilter();
        if (pIDxName_[_name] == 0)
            return (true);
        else 
            return (false);
    }
//==============================================================================
//     _    |_ |. _   |`    _  __|_. _  _  _  .
//    |_)|_||_)||(_  ~|~|_|| |(_ | |(_)| |_\  .  (use these to interact with contract)
//====|=========================================================================    
    /**
     * @dev registers a name.  UI will always display the last name you registered.
     * but you will still own all previously registered names to use as affiliate 
     * links.
     * - must pay a registration fee.
     * - name must be unique
     * - names will be converted to lowercase
     * - name cannot start or end with a space 
     * - cannot have more than 1 space in a row
     * - cannot be only numbers
     * - cannot start with 0x 
     * - name must be at least 1 char
     * - max length of 32 characters long
     * - allowed characters: a-z, 0-9, and space
     * -functionhash- 0x921dec21 (using ID for affiliate)
     * -functionhash- 0x3ddd4698 (using address for affiliate)
     * -functionhash- 0x685ffd83 (using name for affiliate)
     * @param _nameString players desired name
     * @param _affCode affiliate ID, address, or name of who refered you
     * @param _all set to true if you want this to push your info to all games 
     * (this might cost a lot of gas)
     */
    function registerNameXID(string _nameString, uint256 _affCode, bool _all)
        isHuman()
        public
        payable 
    {
        // make sure name fees paid
        require (msg.value >= registrationFee_, "umm.....  you have to pay the name fee");
        
        // filter name + condition checks
        bytes32 _name = NameFilter.nameFilter(_nameString);
        
        // set up address 
        address _addr = msg.sender;
        
        // set up our tx event data and determine if player is new or not
        bool _isNewPlayer = determinePID(_addr);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[_addr];
        
        // manage affiliate residuals
        // if no affiliate code was given, no new affiliate code was given, or the 
        // player tried to use their own pID as an affiliate code, lolz
        if (_affCode != 0 && _affCode != plyr_[_pID].laff && _affCode != _pID) 
        {
            // update last affiliate 
            plyr_[_pID].laff = _affCode;
        } else if (_affCode == _pID) {
            _affCode = 0;
        }
        
        // register name 
        registerNameCore(_pID, _addr, _affCode, _name, _isNewPlayer, _all);
    }
    
    function registerNameXaddr(string _nameString, address _affCode, bool _all)
        isHuman()
        public
        payable 
    {
        // make sure name fees paid
        require (msg.value >= registrationFee_, "umm.....  you have to pay the name fee");
        
        // filter name + condition checks
        bytes32 _name = NameFilter.nameFilter(_nameString);
        
        // set up address 
        address _addr = msg.sender;
        
        // set up our tx event data and determine if player is new or not
        bool _isNewPlayer = determinePID(_addr);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[_addr];
        
        // manage affiliate residuals
        // if no affiliate code was given or player tried to use their own, lolz
        uint256 _affID;
        if (_affCode != address(0) && _affCode != _addr)
        {
            // get affiliate ID from aff Code 
            _affID = pIDxAddr_[_affCode];
            
            // if affID is not the same as previously stored 
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }
        
        // register name 
        registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all);
    }
    
    function registerNameXname(string _nameString, bytes32 _affCode, bool _all)
        isHuman()
        public
        payable 
    {
        // make sure name fees paid
        require (msg.value >= registrationFee_, "umm.....  you have to pay the name fee");
        
        // filter name + condition checks
        bytes32 _name = NameFilter.nameFilter(_nameString);
        
        // set up address 
        address _addr = msg.sender;
        
        // set up our tx event data and determine if player is new or not
        bool _isNewPlayer = determinePID(_addr);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[_addr];
        
        // manage affiliate residuals
        // if no affiliate code was given or player tried to use their own, lolz
        uint256 _affID;
        if (_affCode != "" && _affCode != _name)
        {
            // get affiliate ID from aff Code 
            _affID = pIDxName_[_affCode];
            
            // if affID is not the same as previously stored 
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }
        
        // register name 
        registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all);
    }
    
    /**
     * @dev players, if you registered a profile, before a game was released, or
     * set the all bool to false when you registered, use this function to push
     * your profile to a single game.  also, if you've  updated your name, you
     * can use this to push your name to games of your choosing.
     * -functionhash- 0x81c5b206
     * @param _gameID game id 
     */
    function addMeToGame(uint256 _gameID)
        isHuman()
        public
    {
        require(_gameID <= gID_, "silly player, that game doesn't exist yet");
        address _addr = msg.sender;
        uint256 _pID = pIDxAddr_[_addr];
        require(_pID != 0, "hey there buddy, you dont even have an account");
        uint256 _totalNames = plyr_[_pID].names;
        
        // add players profile and most recent name
        games_[_gameID].receivePlayerInfo(_pID, _addr, plyr_[_pID].name, plyr_[_pID].laff);
        
        // add list of all names
        if (_totalNames > 1)
            for (uint256 ii = 1; ii <= _totalNames; ii++)
                games_[_gameID].receivePlayerNameList(_pID, plyrNameList_[_pID][ii]);
    }
    
    /**
     * @dev players, use this to push your player profile to all registered games.
     * -functionhash- 0x0c6940ea
     */
    function addMeToAllGames()
        isHuman()
        public
    {
        address _addr = msg.sender;
        uint256 _pID = pIDxAddr_[_addr];
        require(_pID != 0, "hey there buddy, you dont even have an account");
        uint256 _laff = plyr_[_pID].laff;
        uint256 _totalNames = plyr_[_pID].names;
        bytes32 _name = plyr_[_pID].name;
        
        for (uint256 i = 1; i <= gID_; i++)
        {
            games_[i].receivePlayerInfo(_pID, _addr, _name, _laff);
            if (_totalNames > 1)
                for (uint256 ii = 1; ii <= _totalNames; ii++)
                    games_[i].receivePlayerNameList(_pID, plyrNameList_[_pID][ii]);
        }
                
    }
    
    /**
     * @dev players use this to change back to one of your old names.  tip, you'll
     * still need to push that info to existing games.
     * -functionhash- 0xb9291296
     * @param _nameString the name you want to use 
     */
    function useMyOldName(string _nameString)
        isHuman()
        public 
    {
        // filter name, and get pID
        bytes32 _name = _nameString.nameFilter();
        uint256 _pID = pIDxAddr_[msg.sender];
        
        // make sure they own the name 
        require(plyrNames_[_pID][_name] == true, "umm... thats not a name you own");
        
        // update their current name 
        plyr_[_pID].name = _name;
    }
    
//==============================================================================
//     _ _  _ _   | _  _ . _  .
//    (_(_)| (/_  |(_)(_||(_  . 
//=====================_|=======================================================    
    function registerNameCore(uint256 _pID, address _addr, uint256 _affID, bytes32 _name, bool _isNewPlayer, bool _all)
        private
    {
        // if names already has been used, require that current msg sender owns the name
        if (pIDxName_[_name] != 0)
            require(plyrNames_[_pID][_name] == true, "sorry that names already taken");
        
        // add name to player profile, registry, and name book
        plyr_[_pID].name = _name;
        pIDxName_[_name] = _pID;
        if (plyrNames_[_pID][_name] == false)
        {
            plyrNames_[_pID][_name] = true;
            plyr_[_pID].names++;
            plyrNameList_[_pID][plyr_[_pID].names] = _name;
        }
        
        // registration fee goes directly to community rewards
        Jekyll_Island_Inc.deposit.value(address(this).balance)();
        
        // push player info to games
        if (_all == true)
            for (uint256 i = 1; i <= gID_; i++)
                games_[i].receivePlayerInfo(_pID, _addr, _name, _affID);
        
        // fire event
        emit onNewName(_pID, _addr, _name, _isNewPlayer, _affID, plyr_[_affID].addr, plyr_[_affID].name, msg.value, now);
    }
//==============================================================================
//    _|_ _  _ | _  .
//     | (_)(_)|_\  .
//==============================================================================    
    function determinePID(address _addr)
        private
        returns (bool)
    {
        if (pIDxAddr_[_addr] == 0)
        {
            pID_++;
            pIDxAddr_[_addr] = pID_;
            plyr_[pID_].addr = _addr;
            
            // set the new player bool to true
            return (true);
        } else {
            return (false);
        }
    }
//==============================================================================
//   _   _|_ _  _ _  _ |   _ _ || _  .
//  (/_>< | (/_| | |(_||  (_(_|||_\  .
//==============================================================================
    function getPlayerID(address _addr)
        isRegisteredGame()
        external
        returns (uint256)
    {
        determinePID(_addr);
        return (pIDxAddr_[_addr]);
    }
    function getPlayerName(uint256 _pID)
        external
        view
        returns (bytes32)
    {
        return (plyr_[_pID].name);
    }
    function getPlayerLAff(uint256 _pID)
        external
        view
        returns (uint256)
    {
        return (plyr_[_pID].laff);
    }
    function getPlayerAddr(uint256 _pID)
        external
        view
        returns (address)
    {
        return (plyr_[_pID].addr);
    }
    function getNameFee()
        external
        view
        returns (uint256)
    {
        return(registrationFee_);
    }
    function registerNameXIDFromDapp(address _addr, bytes32 _name, uint256 _affCode, bool _all)
        isRegisteredGame()
        external
        payable
        returns(bool, uint256)
    {
        // make sure name fees paid
        require (msg.value >= registrationFee_, "umm.....  you have to pay the name fee");
        
        // set up our tx event data and determine if player is new or not
        bool _isNewPlayer = determinePID(_addr);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[_addr];
        
        // manage affiliate residuals
        // if no affiliate code was given, no new affiliate code was given, or the 
        // player tried to use their own pID as an affiliate code, lolz
        uint256 _affID = _affCode;
        if (_affID != 0 && _affID != plyr_[_pID].laff && _affID != _pID) 
        {
            // update last affiliate 
            plyr_[_pID].laff = _affID;
        } else if (_affID == _pID) {
            _affID = 0;
        }
        
        // register name 
        registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all);
        
        return(_isNewPlayer, _affID);
    }
    function registerNameXaddrFromDapp(address _addr, bytes32 _name, address _affCode, bool _all)
        isRegisteredGame()
        external
        payable
        returns(bool, uint256)
    {
        // make sure name fees paid
        require (msg.value >= registrationFee_, "umm.....  you have to pay the name fee");
        
        // set up our tx event data and determine if player is new or not
        bool _isNewPlayer = determinePID(_addr);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[_addr];
        
        // manage affiliate residuals
        // if no affiliate code was given or player tried to use their own, lolz
        uint256 _affID;
        if (_affCode != address(0) && _affCode != _addr)
        {
            // get affiliate ID from aff Code 
            _affID = pIDxAddr_[_affCode];
            
            // if affID is not the same as previously stored 
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }
        
        // register name 
        registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all);
        
        return(_isNewPlayer, _affID);
    }
    function registerNameXnameFromDapp(address _addr, bytes32 _name, bytes32 _affCode, bool _all)
        isRegisteredGame()
        external
        payable
        returns(bool, uint256)
    {
        // make sure name fees paid
        require (msg.value >= registrationFee_, "umm.....  you have to pay the name fee");
        
        // set up our tx event data and determine if player is new or not
        bool _isNewPlayer = determinePID(_addr);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[_addr];
        
        // manage affiliate residuals
        // if no affiliate code was given or player tried to use their own, lolz
        uint256 _affID;
        if (_affCode != "" && _affCode != _name)
        {
            // get affiliate ID from aff Code 
            _affID = pIDxName_[_affCode];
            
            // if affID is not the same as previously stored 
            if (_affID != plyr_[_pID].laff)
            {
                // update last affiliate
                plyr_[_pID].laff = _affID;
            }
        }
        
        // register name 
        registerNameCore(_pID, _addr, _affID, _name, _isNewPlayer, _all);
        
        return(_isNewPlayer, _affID);
    }
    
//==============================================================================
//   _ _ _|_    _   .
//  _\(/_ | |_||_)  .
//=============|================================================================
    function addGame(address _gameAddress, string _gameNameStr)
        onlyDevs()
        public
    {
        require(gameIDs_[_gameAddress] == 0, "derp, that games already been registered");
        
        if (multiSigDev("addGame") == true)
        {deleteProposal("addGame");
            gID_++;
            bytes32 _name = _gameNameStr.nameFilter();
            gameIDs_[_gameAddress] = gID_;
            gameNames_[_gameAddress] = _name;
            games_[gID_] = PlayerBookReceiverInterface(_gameAddress);
        
            games_[gID_].receivePlayerInfo(1, plyr_[1].addr, plyr_[1].name, 0);
            games_[gID_].receivePlayerInfo(2, plyr_[2].addr, plyr_[2].name, 0);
            games_[gID_].receivePlayerInfo(3, plyr_[3].addr, plyr_[3].name, 0);
            games_[gID_].receivePlayerInfo(4, plyr_[4].addr, plyr_[4].name, 0);
        }
    }
    
    function setRegistrationFee(uint256 _fee)
        onlyDevs()
        public
    {
        if (multiSigDev("setRegistrationFee") == true)
        {deleteProposal("setRegistrationFee");
            registrationFee_ = _fee;
        }
    }
        
} 

/**
* @title -Name Filter- v0.1.9
* ┌┬┐┌─┐┌─┐┌┬┐   ╦╦ ╦╔═╗╔╦╗  ┌─┐┬─┐┌─┐┌─┐┌─┐┌┐┌┌┬┐┌─┐
*  │ ├┤ ├─┤│││   ║║ ║╚═╗ ║   ├─┘├┬┘├┤ └─┐├┤ │││ │ └─┐
*  ┴ └─┘┴ ┴┴ ┴  ╚╝╚═╝╚═╝ ╩   ┴  ┴└─└─┘└─┘└─┘┘└┘ ┴ └─┘
*                                  _____                      _____
*                                 (, /     /)       /) /)    (, /      /)          /)
*          ┌─┐                      /   _ (/_      // //       /  _   // _   __  _(/
*          ├─┤                  ___/___(/_/(__(_/_(/_(/_   ___/__/_)_(/_(_(_/ (_(_(_
*          ┴ ┴                /   /          .-/ _____   (__ /                               
*                            (__ /          (_/ (, /                                      /)™ 
*                                                 /  __  __ __ __  _   __ __  _  _/_ _  _(/
* ┌─┐┬─┐┌─┐┌┬┐┬ ┬┌─┐┌┬┐                          /__/ (_(__(_)/ (_/_)_(_)/ (_(_(_(__(/_(_(_
* ├─┘├┬┘│ │ │││ ││   │                      (__ /              .-/  © Jekyll Island Inc. 2018
* ┴  ┴└─└─┘─┴┘└─┘└─┘ ┴                                        (_/
*              _       __    _      ____      ____  _   _    _____  ____  ___  
*=============| |\ |  / /\  | |\/| | |_ =====| |_  | | | |    | |  | |_  | |_)==============*
*=============|_| \| /_/--\ |_|  | |_|__=====|_|   |_| |_|__  |_|  |_|__ |_| \==============*
*
* ╔═╗┌─┐┌┐┌┌┬┐┬─┐┌─┐┌─┐┌┬┐  ╔═╗┌─┐┌┬┐┌─┐ ┌──────────┐
* ║  │ ││││ │ ├┬┘├─┤│   │   ║  │ │ ││├┤  │ Inventor │
* ╚═╝└─┘┘└┘ ┴ ┴└─┴ ┴└─┘ ┴   ╚═╝└─┘─┴┘└─┘ └──────────┘
*/
library NameFilter {
    
    /**
     * @dev filters name strings
     * -converts uppercase to lower case.  
     * -makes sure it does not start/end with a space
     * -makes sure it does not contain multiple spaces in a row
     * -cannot be only numbers
     * -cannot start with 0x 
     * -restricts characters to A-Z, a-z, 0-9, and space.
     * @return reprocessed string in bytes32 format
     */
    function nameFilter(string _input)
        internal
        pure
        returns(bytes32)
    {
        bytes memory _temp = bytes(_input);
        uint256 _length = _temp.length;
        
        //sorry limited to 32 characters
        require (_length <= 32 && _length > 0, "string must be between 1 and 32 characters");
        // make sure it doesnt start with or end with space
        require(_temp[0] != 0x20 && _temp[_length-1] != 0x20, "string cannot start or end with space");
        // make sure first two characters are not 0x
        if (_temp[0] == 0x30)
        {
            require(_temp[1] != 0x78, "string cannot start with 0x");
            require(_temp[1] != 0x58, "string cannot start with 0X");
        }
        
        // create a bool to track if we have a non number character
        bool _hasNonNumber;
        
        // convert & check
        for (uint256 i = 0; i < _length; i++)
        {
            // if its uppercase A-Z
            if (_temp[i] > 0x40 && _temp[i] < 0x5b)
            {
                // convert to lower case a-z
                _temp[i] = byte(uint(_temp[i]) + 32);
                
                // we have a non number
                if (_hasNonNumber == false)
                    _hasNonNumber = true;
            } else {
                require
                (
                    // require character is a space
                    _temp[i] == 0x20 || 
                    // OR lowercase a-z
                    (_temp[i] > 0x60 && _temp[i] < 0x7b) ||
                    // or 0-9
                    (_temp[i] > 0x2f && _temp[i] < 0x3a),
                    "string contains invalid characters"
                );
                // make sure theres not 2x spaces in a row
                if (_temp[i] == 0x20)
                    require( _temp[i+1] != 0x20, "string cannot contain consecutive spaces");
                
                // see if we have a character other than a number
                if (_hasNonNumber == false && (_temp[i] < 0x30 || _temp[i] > 0x39))
                    _hasNonNumber = true;    
            }
        }
        
        require(_hasNonNumber == true, "string cannot be only numbers");
        
        bytes32 _ret;
        assembly {
            _ret := mload(add(_temp, 32))
        }
        return (_ret);
    }
}

/**
 * @title SafeMath v0.1.9
 * @dev Math operations with safety checks that throw on error
 * change notes:  original SafeMath library from OpenZeppelin modified by Inventor
 * - added sqrt
 * - added sq
 * - added pwr 
 * - changed asserts to requires with error log outputs
 * - removed div, its useless
 */
library SafeMath {
    
    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) 
        internal 
        pure 
        returns (uint256 c) 
    {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b, "SafeMath mul failed");
        return c;
    }

    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b)
        internal
        pure
        returns (uint256) 
    {
        require(b <= a, "SafeMath sub failed");
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b)
        internal
        pure
        returns (uint256 c) 
    {
        c = a + b;
        require(c >= a, "SafeMath add failed");
        return c;
    }
    
    /**
     * @dev gives square root of given x.
     */
    function sqrt(uint256 x)
        internal
        pure
        returns (uint256 y) 
    {
        uint256 z = ((add(x,1)) / 2);
        y = x;
        while (z < y) 
        {
            y = z;
            z = ((add((x / z),z)) / 2);
        }
    }
    
    /**
     * @dev gives square. multiplies x by x
     */
    function sq(uint256 x)
        internal
        pure
        returns (uint256)
    {
        return (mul(x,x));
    }
    
    /**
     * @dev x to the power of y 
     */
    function pwr(uint256 x, uint256 y)
        internal 
        pure 
        returns (uint256)
    {
        if (x==0)
            return (0);
        else if (y==0)
            return (1);
        else 
        {
            uint256 z = x;
            for (uint256 i=1; i < y; i++)
                z = mul(z,x);
            return (z);
        }
    }
}

/** @title -MSFun- v0.2.4
 * ┌┬┐┌─┐┌─┐┌┬┐   ╦╦ ╦╔═╗╔╦╗  ┌─┐┬─┐┌─┐┌─┐┌─┐┌┐┌┌┬┐┌─┐
 *  │ ├┤ ├─┤│││   ║║ ║╚═╗ ║   ├─┘├┬┘├┤ └─┐├┤ │││ │ └─┐
 *  ┴ └─┘┴ ┴┴ ┴  ╚╝╚═╝╚═╝ ╩   ┴  ┴└─└─┘└─┘└─┘┘└┘ ┴ └─┘
 *                                  _____                      _____
 *                                 (, /     /)       /) /)    (, /      /)          /)
 *          ┌─┐                      /   _ (/_      // //       /  _   // _   __  _(/
 *          ├─┤                  ___/___(/_/(__(_/_(/_(/_   ___/__/_)_(/_(_(_/ (_(_(_
 *          ┴ ┴                /   /          .-/ _____   (__ /                               
 *                            (__ /          (_/ (, /                                      /)™ 
 *                                                 /  __  __ __ __  _   __ __  _  _/_ _  _(/
 * ┌─┐┬─┐┌─┐┌┬┐┬ ┬┌─┐┌┬┐                          /__/ (_(__(_)/ (_/_)_(_)/ (_(_(_(__(/_(_(_
 * ├─┘├┬┘│ │ │││ ││   │                      (__ /              .-/  © Jekyll Island Inc. 2018
 * ┴  ┴└─└─┘─┴┘└─┘└─┘ ┴                                        (_/
 *  _           _             _  _  _  _             _  _  _  _  _                                      
 *=(_) _     _ (_)==========_(_)(_)(_)(_)_==========(_)(_)(_)(_)(_)================================*
 * (_)(_)   (_)(_)         (_)          (_)         (_)       _         _    _  _  _  _                 
 * (_) (_)_(_) (_)         (_)_  _  _  _            (_) _  _ (_)       (_)  (_)(_)(_)(_)_               
 * (_)   (_)   (_)           (_)(_)(_)(_)_          (_)(_)(_)(_)       (_)  (_)        (_)              
 * (_)         (_)  _  _    _           (_)  _  _   (_)      (_)       (_)  (_)        (_)  _  _        
 *=(_)=========(_)=(_)(_)==(_)_  _  _  _(_)=(_)(_)==(_)======(_)_  _  _(_)_ (_)========(_)=(_)(_)==*
 * (_)         (_) (_)(_)    (_)(_)(_)(_)   (_)(_)  (_)        (_)(_)(_) (_)(_)        (_) (_)(_)
 *
 * ╔═╗┌─┐┌┐┌┌┬┐┬─┐┌─┐┌─┐┌┬┐  ╔═╗┌─┐┌┬┐┌─┐ ┌──────────┐
 * ║  │ ││││ │ ├┬┘├─┤│   │   ║  │ │ ││├┤  │ Inventor │
 * ╚═╝└─┘┘└┘ ┴ ┴└─┴ ┴└─┘ ┴   ╚═╝└─┘─┴┘└─┘ └──────────┘
 *  
 *         ┌──────────────────────────────────────────────────────────────────────┐
 *         │ MSFun, is an importable library that gives your contract the ability │
 *         │ add multiSig requirement to functions.                               │
 *         └──────────────────────────────────────────────────────────────────────┘
 *                                ┌────────────────────┐
 *                                │ Setup Instructions │
 *                                └────────────────────┘
 * (Step 1) import the library into your contract
 * 
 *    import "./MSFun.sol";
 *
 * (Step 2) set up the signature data for msFun
 * 
 *     MSFun.Data private msData;
 *                                ┌────────────────────┐
 *                                │ Usage Instructions │
 *                                └────────────────────┘
 * at the beginning of a function
 * 
 *     function functionName() 
 *     {
 *         if (MSFun.multiSig(msData, required signatures, "functionName") == true)
 *         {
 *             MSFun.deleteProposal(msData, "functionName");
 * 
 *             // put function body here 
 *         }
 *     }
 *                           ┌────────────────────────────────┐
 *                           │ Optional Wrappers For TeamJust │
 *                           └────────────────────────────────┘
 * multiSig wrapper function (cuts down on inputs, improves readability)
 * this wrapper is HIGHLY recommended
 * 
 *     function multiSig(bytes32 _whatFunction) private returns (bool) {return(MSFun.multiSig(msData, TeamJust.requiredSignatures(), _whatFunction));}
 *     function multiSigDev(bytes32 _whatFunction) private returns (bool) {return(MSFun.multiSig(msData, TeamJust.requiredDevSignatures(), _whatFunction));}
 *
 * wrapper for delete proposal (makes code cleaner)
 *     
 *     function deleteProposal(bytes32 _whatFunction) private {MSFun.deleteProposal(msData, _whatFunction);}
 *                             ┌────────────────────────────┐
 *                             │ Utility & Vanity Functions │
 *                             └────────────────────────────┘
 * delete any proposal is highly recommended.  without it, if an admin calls a multiSig
 * function, with argument inputs that the other admins do not agree upon, the function
 * can never be executed until the undesirable arguments are approved.
 * 
 *     function deleteAnyProposal(bytes32 _whatFunction) onlyDevs() public {MSFun.deleteProposal(msData, _whatFunction);}
 * 
 * for viewing who has signed a proposal & proposal data
 *     
 *     function checkData(bytes32 _whatFunction) onlyAdmins() public view returns(bytes32, uint256) {return(MSFun.checkMsgData(msData, _whatFunction), MSFun.checkCount(msData, _whatFunction));}
 *
 * lets you check address of up to 3 signers (address)
 * 
 *     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));}
 *
 * same as above but will return names in string format.
 *
 *     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)));}
 *                             ┌──────────────────────────┐
 *                             │ Functions In Depth Guide │
 *                             └──────────────────────────┘
 * In the following examples, the Data is the proposal set for this library.  And
 * the bytes32 is the name of the function.
 *
 * MSFun.multiSig(Data, uint256, bytes32) - Manages creating/updating multiSig 
 *      proposal for the function being called.  The uint256 is the required 
 *      number of signatures needed before the multiSig will return true.  
 *      Upon first call, multiSig will create a proposal and store the arguments 
 *      passed with the function call as msgData.  Any admins trying to sign the 
 *      function call will need to send the same argument values. Once required
 *      number of signatures is reached this will return a bool of true.
 * 
 * MSFun.deleteProposal(Data, bytes32) - once multiSig unlocks the function body,
 *      you will want to delete the proposal data.  This does that.
 *
 * MSFun.checkMsgData(Data, bytes32) - checks the message data for any given proposal 
 * 
 * MSFun.checkCount(Data, bytes32) - checks the number of admins that have signed
 *      the proposal 
 * 
 * MSFun.checkSigners(data, bytes32, uint256) - checks the address of a given signer.
 *      the uint256, is the log number of the signer (ie 1st signer, 2nd signer)
 */

library MSFun {
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // DATA SETS
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // contact data setup
    struct Data 
    {
        mapping (bytes32 => ProposalData) proposal_;
    }
    struct ProposalData 
    {
        // a hash of msg.data 
        bytes32 msgData;
        // number of signers
        uint256 count;
        // tracking of wither admins have signed
        mapping (address => bool) admin;
        // list of admins who have signed
        mapping (uint256 => address) log;
    }
    
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // MULTI SIG FUNCTIONS
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    function multiSig(Data storage self, uint256 _requiredSignatures, bytes32 _whatFunction)
        internal
        returns(bool) 
    {
        // our proposal key will be a hash of our function name + our contracts address 
        // by adding our contracts address to this, we prevent anyone trying to circumvent
        // the proposal's security via external calls.
        bytes32 _whatProposal = whatProposal(_whatFunction);
        
        // this is just done to make the code more readable.  grabs the signature count
        uint256 _currentCount = self.proposal_[_whatProposal].count;
        
        // store the address of the person sending the function call.  we use msg.sender 
        // here as a layer of security.  in case someone imports our contract and tries to 
        // circumvent function arguments.  still though, our contract that imports this
        // library and calls multisig, needs to use onlyAdmin modifiers or anyone who
        // calls the function will be a signer. 
        address _whichAdmin = msg.sender;
        
        // prepare our msg data.  by storing this we are able to verify that all admins
        // are approving the same argument input to be executed for the function.  we hash 
        // it and store in bytes32 so its size is known and comparable
        bytes32 _msgData = keccak256(msg.data);
        
        // check to see if this is a new execution of this proposal or not
        if (_currentCount == 0)
        {
            // if it is, lets record the original signers data
            self.proposal_[_whatProposal].msgData = _msgData;
            
            // record original senders signature
            self.proposal_[_whatProposal].admin[_whichAdmin] = true;        
            
            // update log (used to delete records later, and easy way to view signers)
            // also useful if the calling function wants to give something to a 
            // specific signer.  
            self.proposal_[_whatProposal].log[_currentCount] = _whichAdmin;  
            
            // track number of signatures
            self.proposal_[_whatProposal].count += 1;  
            
            // if we now have enough signatures to execute the function, lets
            // return a bool of true.  we put this here in case the required signatures
            // is set to 1.
            if (self.proposal_[_whatProposal].count == _requiredSignatures) {
                return(true);
            }            
        // if its not the first execution, lets make sure the msgData matches
        } else if (self.proposal_[_whatProposal].msgData == _msgData) {
            // msgData is a match
            // make sure admin hasnt already signed
            if (self.proposal_[_whatProposal].admin[_whichAdmin] == false) 
            {
                // record their signature
                self.proposal_[_whatProposal].admin[_whichAdmin] = true;        
                
                // update log (used to delete records later, and easy way to view signers)
                self.proposal_[_whatProposal].log[_currentCount] = _whichAdmin;  
                
                // track number of signatures
                self.proposal_[_whatProposal].count += 1;  
            }
            
            // if we now have enough signatures to execute the function, lets
            // return a bool of true.
            // we put this here for a few reasons.  (1) in normal operation, if 
            // that last recorded signature got us to our required signatures.  we 
            // need to return bool of true.  (2) if we have a situation where the 
            // required number of signatures was adjusted to at or lower than our current 
            // signature count, by putting this here, an admin who has already signed,
            // can call the function again to make it return a true bool.  but only if
            // they submit the correct msg data
            if (self.proposal_[_whatProposal].count == _requiredSignatures) {
                return(true);
            }
        }
    }
    
    
    // deletes proposal signature data after successfully executing a multiSig function
    function deleteProposal(Data storage self, bytes32 _whatFunction)
        internal
    {
        //done for readability sake
        bytes32 _whatProposal = whatProposal(_whatFunction);
        address _whichAdmin;
        
        //delete the admins votes & log.   i know for loops are terrible.  but we have to do this 
        //for our data stored in mappings.  simply deleting the proposal itself wouldn't accomplish this.
        for (uint256 i=0; i < self.proposal_[_whatProposal].count; i++) {
            _whichAdmin = self.proposal_[_whatProposal].log[i];
            delete self.proposal_[_whatProposal].admin[_whichAdmin];
            delete self.proposal_[_whatProposal].log[i];
        }
        //delete the rest of the data in the record
        delete self.proposal_[_whatProposal];
    }
    
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // HELPER FUNCTIONS
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    function whatProposal(bytes32 _whatFunction)
        private
        view
        returns(bytes32)
    {
        return(keccak256(abi.encodePacked(_whatFunction,this)));
    }
    
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // VANITY FUNCTIONS
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // returns a hashed version of msg.data sent by original signer for any given function
    function checkMsgData (Data storage self, bytes32 _whatFunction)
        internal
        view
        returns (bytes32 msg_data)
    {
        bytes32 _whatProposal = whatProposal(_whatFunction);
        return (self.proposal_[_whatProposal].msgData);
    }
    
    // returns number of signers for any given function
    function checkCount (Data storage self, bytes32 _whatFunction)
        internal
        view
        returns (uint256 signature_count)
    {
        bytes32 _whatProposal = whatProposal(_whatFunction);
        return (self.proposal_[_whatProposal].count);
    }
    
    // returns address of an admin who signed for any given function
    function checkSigner (Data storage self, bytes32 _whatFunction, uint256 _signer)
        internal
        view
        returns (address signer)
    {
        require(_signer > 0, "MSFun checkSigner failed - 0 not allowed");
        bytes32 _whatProposal = whatProposal(_whatFunction);
        return (self.proposal_[_whatProposal].log[_signer - 1]);
    }
}

    Contract ABI  
[{"constant":false,"inputs":[],"name":"addMeToAllGames","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_whatFunction","type":"bytes32"}],"name":"deleteAnyProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pIDxAddr_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registrationFee_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNameFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"}],"name":"plyrNames_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"gameNames_","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pIDxName_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"address"},{"name":"_all","type":"bool"}],"name":"registerNameXaddr","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_gameAddress","type":"address"},{"name":"_gameNameStr","type":"string"}],"name":"addGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pID_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerAddr","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"bytes32"},{"name":"_all","type":"bool"}],"name":"registerNameXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_nameStr","type":"string"}],"name":"checkIfNameValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_affCode","type":"bytes32"},{"name":"_all","type":"bool"}],"name":"registerNameXnameFromDapp","outputs":[{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_whatFunction","type":"bytes32"},{"name":"_signerA","type":"uint256"},{"name":"_signerB","type":"uint256"},{"name":"_signerC","type":"uint256"}],"name":"checkSignersByAddress","outputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_gameID","type":"uint256"}],"name":"addMeToGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerName","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"uint256"},{"name":"_all","type":"bool"}],"name":"registerNameXID","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"plyrNameList_","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_whatFunction","type":"bytes32"}],"name":"checkData","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_affCode","type":"address"},{"name":"_all","type":"bool"}],"name":"registerNameXaddrFromDapp","outputs":[{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"}],"name":"useMyOldName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gID_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_affCode","type":"uint256"},{"name":"_all","type":"bool"}],"name":"registerNameXIDFromDapp","outputs":[{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setRegistrationFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"games_","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"gameIDs_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"plyr_","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"laff","type":"uint256"},{"name":"names","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerLAff","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"getPlayerID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_whatFunction","type":"bytes32"},{"name":"_signerA","type":"uint256"},{"name":"_signerB","type":"uint256"},{"name":"_signerC","type":"uint256"}],"name":"checkSignersByName","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"bytes32"},{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":true,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"isNewPlayer","type":"bool"},{"indexed":false,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"affiliateAddress","type":"address"},{"indexed":false,"name":"affiliateName","type":"bytes32"},{"indexed":false,"name":"amountPaid","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onNewName","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6080604052662386f26fc1000060015534801561001b57600080fd5b507f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a368054600160a060020a0319908116738e0d985f3ec1857bec39b76aaabdea6b31b67d53179091557f6a7573746f0000000000000000000000000000000000000000000000000000007f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3781905560017f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a398190557f7945588bb2738ba9b8b221747234545c54f0e4c7ac3784d43094467f615b51678190557f762d6d82485f8ba728a5500d760dfdb7168471b2894400e1df49c93b495b4f888190557f16d8e9bd91f15d01a7566839f41a231f80f11c69224644ab0930ac26636557c7805460ff1990811683179091557f6bd9ce7c7c44b510ee825857e9b7d0dbc77ffc0dcbb487d9763a092e420c9a18929092557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c380548416738b4da1827932d71759687f925d17f81fc94e3a9d1790557f6d616e74736f00000000000000000000000000000000000000000000000000007f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c48190557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c682905560027fb879adb6fe669e16d6aeb7a19aad65badbb92fd7b2b1f1f5ba729495b236748f8190557f6580451f8c1533c98975a12cfa65f28f7e3151f60699355b6b7674c57d81c21a557fe8fcf9acd692d87e1f7051e6b260929b78ae5d958b2e3fdea5b77a29f79fd95080548416831790557f5ec873723cdc64ab6619ea2fcbca33beef9a820510f97aa9ecb9e3ff0f638853557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e780548416737ac74fcc1a71b106f12c55ee8f802c9f672ce40c1790557f73756d70756e6b000000000000000000000000000000000000000000000000007fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e88190557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61ea82905560037f1c974634a525cc45258a231bf2a0c4c330809704175b5c917fc36ea991564a328190557f26bda8dc9fb5cccb812d17f150de8a6180eab480db7f39d0f264318349138645557f41d6a92976668d608e8cb8d112aced96732d01f6081942e52ea08ab8277f341880548416831790557f960add1d2a4af75b2cd16bfb54d92ee5d4c29427a1bf605fa9b667906b27d701557f8dc18c4ccfd75f5c815b63770fa542fd953e8fef7e0e44bbdd4913470ce7e9cb80549093167318e90fc6f70344f53ebd4f6070bf6aa23e2d748c179092557f696e76656e746f720000000000000000000000000000000000000000000000007f8dc18c4ccfd75f5c815b63770fa542fd953e8fef7e0e44bbdd4913470ce7e9cc8190557f8dc18c4ccfd75f5c815b63770fa542fd953e8fef7e0e44bbdd4913470ce7e9ce83905560047f0997b017d9262bcd076672939714e360066ae7d695d955ecc1821a61f36f7b818190557f3b067eeadfc88d599c85e61eaac8075a0e270e6830b20fa50e1f309ebbfe9c468190557fa766fb1d802397cd20bbb5606a44354e813d310108e6e51ed92a4ae966722d53805490931684179092556000929092527f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c7846020527f2c4ff72984b96d6e24887abcd47b1c2fb2b1bd600b7f7d037d1a2ac35568baab919091556006556131158061055a6000396000f30060806040526004361061017c5763ffffffff60e060020a6000350416630c6940ea81146101815780630efcf2951461019857806310f01eba146101b0578063180603eb146101e35780632614195f146101f85780632660316e1461020d57806327249e611461023c5780632e19ebdc1461025d5780633ddd4698146102755780633fda926e146102d15780634b227176146103385780634d0d35ff1461034d578063685ffd83146103815780636c52660d146103d4578063745ea0c11461042d578063768f930d1461046757806381c5b206146104b357806382e37b2c146104cb578063921dec21146104e3578063a448ed4b14610536578063a553506e14610551578063aa4d490b14610582578063b9291296146105a5578063b9eca0c8146105fe578063c0942dfd14610613578063c320c72714610632578063d52412791461064a578063dbbcaa9714610662578063de7874f314610683578063e3c08adf146106cb578063e56556a9146106e3578063ed3643d614610704575b600080fd5b34801561018d57600080fd5b50610196610743565b005b3480156101a457600080fd5b5061019660043561098f565b3480156101bc57600080fd5b506101d1600160a060020a0360043516610a60565b60408051918252519081900360200190f35b3480156101ef57600080fd5b506101d1610a72565b34801561020457600080fd5b506101d1610a78565b34801561021957600080fd5b50610228600435602435610a7e565b604080519115158252519081900360200190f35b34801561024857600080fd5b506101d1600160a060020a0360043516610a9e565b34801561026957600080fd5b506101d1600435610ab0565b6040805160206004803580820135601f810184900484028501840190955284845261019694369492936024939284019190819084018382808284375094975050600160a060020a03853516955050505050602001351515610ac2565b3480156102dd57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610196958335600160a060020a0316953695604494919390910191908190840183828082843750949750610c2a9650505050505050565b34801561034457600080fd5b506101d161115d565b34801561035957600080fd5b50610365600435611163565b60408051600160a060020a039092168252519081900360200190f35b6040805160206004803580820135601f8101849004840285018401909552848452610196943694929360249392840191908190840183828082843750949750508435955050505050602001351515611181565b3480156103e057600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102289436949293602493928401919081908401838280828437509497506112bd9650505050505050565b61044c600160a060020a036004351660243560443560643515156112f5565b60408051921515835260208301919091528051918290030190f35b34801561047357600080fd5b50610488600435602435604435606435611407565b60408051600160a060020a039485168152928416602084015292168183015290519081900360600190f35b3480156104bf57600080fd5b50610196600435611505565b3480156104d757600080fd5b506101d16004356117b0565b6040805160206004803580820135601f81018490048402850184019095528484526101969436949293602493928401919081908401838280828437509497505084359550505050506020013515156117c5565b34801561054257600080fd5b506101d1600435602435611905565b34801561055d57600080fd5b50610569600435611922565b6040805192835260208301919091528051918290030190f35b61044c600160a060020a0360043581169060243590604435166064351515611a08565b3480156105b157600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610196943694929360249392840191908190840183828082843750949750611b299650505050505050565b34801561060a57600080fd5b506101d1611c1b565b61044c600160a060020a03600435166024356044356064351515611c21565b34801561063e57600080fd5b50610196600435611d2b565b34801561065657600080fd5b50610365600435611e4f565b34801561066e57600080fd5b506101d1600160a060020a0360043516611e6a565b34801561068f57600080fd5b5061069b600435611e7c565b60408051600160a060020a0390951685526020850193909352838301919091526060830152519081900360800190f35b3480156106d757600080fd5b506101d1600435611ead565b3480156106ef57600080fd5b506101d1600160a060020a0360043516611ec2565b34801561071057600080fd5b50610725600435602435604435606435611f03565b60408051938452602084019290925282820152519081900360600190f35b600080808080808033803b8015610792576040805160e560020a62461bcd02815260206004820152601160248201526000805160206130ca833981519152604482015290519081900360640190fd5b336000818152600760205260409020549099509750871515610818576040805160e560020a62461bcd02815260206004820152602e60248201527f6865792074686572652062756464792c20796f7520646f6e74206576656e20686044820152609260020a6d185d9948185b881858d8dbdd5b9d02606482015290519081900360840190fd5b6000888152600960205260409020600281015460038201546001928301549199509750955093505b60055484116109845760008481526002602052604080822054815160e060020a6349cc635d028152600481018c9052600160a060020a038d81166024830152604482018a9052606482018c9052925192909116926349cc635d9260848084019382900301818387803b1580156108b557600080fd5b505af11580156108c9573d6000803e3d6000fd5b50505050600186111561097957600192505b858311610979576000848152600260209081526040808320548b8452600b835281842087855290925280832054815160e160020a6347b8a075028152600481018d905260248101919091529051600160a060020a0390921692638f7140ea9260448084019382900301818387803b15801561095557600080fd5b505af1158015610969573d6000803e3d6000fd5b5050600190940193506108db9050565b600190930192610840565b505050505050505050565b6040805160e060020a630c3f64bf02815233600482015290516000805160206130aa83398151915291630c3f64bf9160248083019260209291908290030181600087803b1580156109df57600080fd5b505af11580156109f3573d6000803e3d6000fd5b505050506040513d6020811015610a0957600080fd5b50511515600114610a52576040805160e560020a62461bcd028152602060048201526017602482015260008051602061308a833981519152604482015290519081900360640190fd5b610a5d6000826121a2565b50565b60076020526000908152604090205481565b60015481565b60015490565b600a60209081526000928352604080842090915290825290205460ff1681565b60036020526000908152604090205481565b60086020526000908152604090205481565b60008080808033803b8015610b0f576040805160e560020a62461bcd02815260206004820152601160248201526000805160206130ca833981519152604482015290519081900360640190fd5b600154341015610b69576040805160e560020a62461bcd028152602060048201526026602482015260008051602061306a833981519152604482015260d060020a656d652066656502606482015290519081900360840190fd5b610b728a612247565b9650339550610b8086612962565b600160a060020a03808816600090815260076020526040902054919650909450891615801590610bc2575085600160a060020a031689600160a060020a031614155b15610c1057600160a060020a0389166000908152600760209081526040808320548784526009909252909120600201549093508314610c105760008481526009602052604090206002018390555b610c1e8487858a898d6129d7565b50505050505050505050565b6040805160e060020a630c3f64bf02815233600482015290516000916000805160206130aa83398151915291630c3f64bf9160248082019260209290919082900301818787803b158015610c7d57600080fd5b505af1158015610c91573d6000803e3d6000fd5b505050506040513d6020811015610ca757600080fd5b50511515600114610cf0576040805160e560020a62461bcd028152602060048201526017602482015260008051602061308a833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526004602052604090205415610d84576040805160e560020a62461bcd02815260206004820152602860248201527f646572702c20746861742067616d657320616c7265616479206265656e20726560448201527f6769737465726564000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610d9a60c860020a6661646447616d6502612ca5565b15156001141561115857610dba60c860020a6661646447616d6502610a52565b600580546001019055610dcc82612247565b60058054600160a060020a038087166000818152600460208181526040808420969096556003815285832088905586548352600281528583208054600160a060020a0319169094179093559454815283812054600180835260099093527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36547f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3754865160e060020a6349cc635d0281529788019490945284166024870152604486019290925260648501819052925194955016926349cc635d92608480820193929182900301818387803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b505060055460009081526002602081815260408084205483855260099092527f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c3547f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c454825160e060020a6349cc635d0281526004810195909552600160a060020a0391821660248601526044850152606484018590529051911694506349cc635d93506084808301939282900301818387803b158015610f9657600080fd5b505af1158015610faa573d6000803e3d6000fd5b5050600554600090815260026020908152604080832054600380855260099093527fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e7547fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e854835160e060020a6349cc635d0281526004810195909552600160a060020a0391821660248601526044850152606484018590529151911694506349cc635d93506084808301939282900301818387803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b5050600554600090815260026020908152604080832054600480855260099093527f8dc18c4ccfd75f5c815b63770fa542fd953e8fef7e0e44bbdd4913470ce7e9cb547f8dc18c4ccfd75f5c815b63770fa542fd953e8fef7e0e44bbdd4913470ce7e9cc54835160e060020a6349cc635d02815280860195909552600160a060020a0391821660248601526044850152606484018590529151911694506349cc635d93506084808301939282900301818387803b15801561113f57600080fd5b505af1158015611153573d6000803e3d6000fd5b505050505b505050565b60065481565b600081815260096020526040902054600160a060020a03165b919050565b60008080808033803b80156111ce576040805160e560020a62461bcd02815260206004820152601160248201526000805160206130ca833981519152604482015290519081900360640190fd5b600154341015611228576040805160e560020a62461bcd028152602060048201526026602482015260008051602061306a833981519152604482015260d060020a656d652066656502606482015290519081900360840190fd5b6112318a612247565b965033955061123f86612962565b600160a060020a0387166000908152600760205260409020549095509350881580159061126c5750888714155b15610c10576000898152600860209081526040808320548784526009909252909120600201549093508314610c10576000848152600960205260409020600201839055610c1e8487858a898d6129d7565b6000806112c983612247565b60008181526008602052604090205490915015156112ea57600191506112ef565b600091505b50919050565b336000908152600460205260408120548190819081908190151561131857600080fd5b600154341015611372576040805160e560020a62461bcd028152602060048201526026602482015260008051602061306a833981519152604482015260d060020a656d652066656502606482015290519081900360840190fd5b61137b89612962565b600160a060020a038a16600090815260076020526040902054909350915086158015906113a85750868814155b156113ea575060008681526008602090815260408083205484845260099092529091206002015481146113ea5760008281526009602052604090206002018190555b6113f8828a838b878b6129d7565b91989197509095505050505050565b6040805160e060020a630c3f64bf0281523360048201529051600091829182916000805160206130aa83398151915291630c3f64bf9160248082019260209290919082900301818787803b15801561145e57600080fd5b505af1158015611472573d6000803e3d6000fd5b505050506040513d602081101561148857600080fd5b505115156001146114d1576040805160e560020a62461bcd028152602060048201526017602482015260008051602061308a833981519152604482015290519081900360640190fd5b6114dd60008888612d30565b6114e960008988612d30565b6114f560008a88612d30565b9250925092509450945094915050565b600080808033803b8015611551576040805160e560020a62461bcd02815260206004820152601160248201526000805160206130ca833981519152604482015290519081900360640190fd5b6005548711156115d1576040805160e560020a62461bcd02815260206004820152602960248201527f73696c6c7920706c617965722c20746861742067616d6520646f65736e27742060448201527f6578697374207965740000000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152600760205260409020549096509450841515611657576040805160e560020a62461bcd02815260206004820152602e60248201527f6865792074686572652062756464792c20796f7520646f6e74206576656e20686044820152609260020a6d185d9948185b881858d8dbdd5b9d02606482015290519081900360840190fd5b600085815260096020818152604080842060038101548c86526002808552838720548c88529590945260018201549390910154825160e060020a6349cc635d028152600481018c9052600160a060020a038d8116602483015260448201959095526064810191909152915190985091909216926349cc635d926084808201939182900301818387803b1580156116ec57600080fd5b505af1158015611700573d6000803e3d6000fd5b50505050600184111561115357600192505b83831161115357600087815260026020908152604080832054888452600b835281842087855290925280832054815160e160020a6347b8a075028152600481018a905260248101919091529051600160a060020a0390921692638f7140ea9260448084019382900301818387803b15801561178c57600080fd5b505af11580156117a0573d6000803e3d6000fd5b5050600190940193506117129050565b60009081526009602052604090206001015490565b600080808033803b8015611811576040805160e560020a62461bcd02815260206004820152601160248201526000805160206130ca833981519152604482015290519081900360640190fd5b60015434101561186b576040805160e560020a62461bcd028152602060048201526026602482015260008051602061306a833981519152604482015260d060020a656d652066656502606482015290519081900360840190fd5b61187489612247565b955033945061188285612962565b600160a060020a038616600090815260076020526040902054909450925087158015906118c057506000838152600960205260409020600201548814155b80156118cc5750828814155b156118ea5760008381526009602052604090206002018890556118f7565b828814156118f757600097505b61098483868a89888c6129d7565b600b60209081526000928352604080842090915290825290205481565b6040805160e060020a630c3f64bf028152336004820152905160009182916000805160206130aa83398151915291630c3f64bf91602480830192602092919082900301818787803b15801561197657600080fd5b505af115801561198a573d6000803e3d6000fd5b505050506040513d60208110156119a057600080fd5b505115156001146119e9576040805160e560020a62461bcd028152602060048201526017602482015260008051602061308a833981519152604482015290519081900360640190fd5b6119f4600084612ded565b6119ff600085612e11565b91509150915091565b3360009081526004602052604081205481908190819081901515611a2b57600080fd5b600154341015611a85576040805160e560020a62461bcd028152602060048201526026602482015260008051602061306a833981519152604482015260d060020a656d652066656502606482015290519081900360840190fd5b611a8e89612962565b600160a060020a03808b16600090815260076020526040902054919450909250871615801590611ad0575088600160a060020a031687600160a060020a031614155b156113ea5750600160a060020a03861660009081526007602090815260408083205484845260099092529091206002015481146113ea5760008281526009602052604090206002018190556113f8828a838b878b6129d7565b60008033803b8015611b73576040805160e560020a62461bcd02815260206004820152601160248201526000805160206130ca833981519152604482015290519081900360640190fd5b611b7c85612247565b33600090815260076020908152604080832054808452600a835281842085855290925290912054919550935060ff161515600114611c04576040805160e560020a62461bcd02815260206004820152601f60248201527f756d6d2e2e2e207468617473206e6f742061206e616d6520796f75206f776e00604482015290519081900360640190fd5b505060009081526009602052604090206001015550565b60055481565b3360009081526004602052604081205481908190819081901515611c4457600080fd5b600154341015611c9e576040805160e560020a62461bcd028152602060048201526026602482015260008051602061306a833981519152604482015260d060020a656d652066656502606482015290519081900360840190fd5b611ca789612962565b600160a060020a038a1660009081526007602052604090205490935091508690508015801590611ce857506000828152600960205260409020600201548114155b8015611cf45750818114155b15611d125760008281526009602052604090206002018190556113ea565b818114156113ea575060006113f8828a838b878b6129d7565b6040805160e060020a630c3f64bf02815233600482015290516000805160206130aa83398151915291630c3f64bf9160248083019260209291908290030181600087803b158015611d7b57600080fd5b505af1158015611d8f573d6000803e3d6000fd5b505050506040513d6020811015611da557600080fd5b50511515600114611dee576040805160e560020a62461bcd028152602060048201526017602482015260008051602061308a833981519152604482015290519081900360640190fd5b611e177f736574526567697374726174696f6e4665650000000000000000000000000000612ca5565b151560011415610a5d57611e4a7f736574526567697374726174696f6e4665650000000000000000000000000000610a52565b600155565b600260205260009081526040902054600160a060020a031681565b60046020526000908152604090205481565b6009602052600090815260409020805460018201546002830154600390930154600160a060020a0390921692909184565b60009081526009602052604090206002015490565b336000908152600460205260408120541515611edd57600080fd5b611ee682612962565b5050600160a060020a031660009081526007602052604090205490565b6040805160e060020a630c3f64bf0281523360048201529051600091829182916000805160206130aa83398151915291630c3f64bf9160248082019260209290919082900301818787803b158015611f5a57600080fd5b505af1158015611f6e573d6000803e3d6000fd5b505050506040513d6020811015611f8457600080fd5b50511515600114611fcd576040805160e560020a62461bcd028152602060048201526017602482015260008051602061308a833981519152604482015290519081900360640190fd5b6000805160206130aa83398151915263af1c084d611fed60008a8a612d30565b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561203857600080fd5b505af115801561204c573d6000803e3d6000fd5b505050506040513d602081101561206257600080fd5b50516000805160206130aa83398151915263af1c084d61208460008b8a612d30565b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156120cf57600080fd5b505af11580156120e3573d6000803e3d6000fd5b505050506040513d60208110156120f957600080fd5b50516000805160206130aa83398151915263af1c084d61211b60008c8a612d30565b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561216657600080fd5b505af115801561217a573d6000803e3d6000fd5b505050506040513d602081101561219057600080fd5b50519199909850909650945050505050565b60008060006121b084612e38565b9250600090505b60008381526020869052604090206001015481101561222c57600083815260208681526040808320848452600381018084528285208054600160a060020a031680875260029093018552928520805460ff1916905593859052929091528054600160a060020a031916905591506001016121b7565b50506000908152602092909252506040812081815560010155565b80516000908290828080602084118015906122625750600084115b15156122de576040805160e560020a62461bcd02815260206004820152602a60248201527f737472696e67206d757374206265206265747765656e203120616e642033322060448201527f6368617261637465727300000000000000000000000000000000000000000000606482015290519081900360840190fd5b8460008151811015156122ed57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a02141580156123545750846001850381518110151561232c57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214155b15156123bb576040805160e560020a62461bcd02815260206004820152602560248201527f737472696e672063616e6e6f74207374617274206f7220656e64207769746820604482015260d860020a64737061636502606482015290519081900360840190fd5b8460008151811015156123ca57fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a02141561250d5784600181518110151561240457fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515612481576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030780000000000604482015290519081900360640190fd5b84600181518110151561249057fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a021415151561250d576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030580000000000604482015290519081900360640190fd5b600091505b838210156128fa57845160fe60020a9086908490811061252e57fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156125895750845160f860020a605b029086908490811061256a57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b156125f657848281518110151561259c57fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a0285838151811015156125cd57fe5b906020010190600160f860020a031916908160001a9053508215156125f157600192505b6128ef565b848281518110151561260457fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214806126a25750845160fd60020a6003029086908490811061264757fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156126a25750845160f860020a607b029086908490811061268357fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b8061271a5750845160f860020a602f02908690849081106126bf57fe5b90602001015160f860020a900460f860020a02600160f860020a03191611801561271a5750845160f960020a601d02908690849081106126fb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b151561277e576040805160e560020a62461bcd02815260206004820152602260248201527f737472696e6720636f6e7461696e7320696e76616c6964206368617261637465604482015260f060020a61727302606482015290519081900360840190fd5b848281518110151561278c57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a02141561286b5784826001018151811015156127c857fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415151561286b576040805160e560020a62461bcd02815260206004820152602860248201527f737472696e672063616e6e6f7420636f6e7461696e20636f6e7365637574697660448201527f6520737061636573000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b821580156128e55750845160fc60020a6003029086908490811061288b57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610806128e55750845160f860020a603902908690849081106128c657fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b156128ef57600192505b600190910190612512565b600183151514612954576040805160e560020a62461bcd02815260206004820152601d60248201527f737472696e672063616e6e6f74206265206f6e6c79206e756d62657273000000604482015290519081900360640190fd5b505050506020015192915050565b600160a060020a03811660009081526007602052604081205415156129cf575060068054600190810191829055600160a060020a038316600081815260076020908152604080832086905594825260099052929092208054600160a060020a03191690921790915561117c565b50600061117c565b60008381526008602052604081205415612a61576000878152600a6020908152604080832087845290915290205460ff161515600114612a61576040805160e560020a62461bcd02815260206004820152601e60248201527f736f7272792074686174206e616d657320616c72656164792074616b656e0000604482015290519081900360640190fd5b6000878152600960209081526040808320600101879055868352600882528083208a9055898352600a825280832087845290915290205460ff161515612af1576000878152600a602090815260408083208784528252808320805460ff191660019081179091558a845260098352818420600301805490910190819055600b835281842090845290915290208490555b73dd4950f977ee28d2c132f1353d1595035db444ee600160a060020a031663d0e30db030600160a060020a0316316040518263ffffffff1660e060020a0281526004016020604051808303818588803b158015612b4d57600080fd5b505af1158015612b61573d6000803e3d6000fd5b50505050506040513d6020811015612b7857600080fd5b505060018215151415612c22575060015b6005548111612c225760008181526002602052604080822054815160e060020a6349cc635d028152600481018b9052600160a060020a038a8116602483015260448201899052606482018a9052925192909116926349cc635d9260848084019382900301818387803b158015612bfe57600080fd5b505af1158015612c12573d6000803e3d6000fd5b505060019092019150612b899050565b600085815260096020908152604091829020805460019091015483518715158152928301899052600160a060020a039182168385015260608301523460808301524260a0830152915186928916918a917fdd6176433ff5026bbce96b068584b7bbe3514227e72df9c630b749ae87e644429181900360c00190a450505050505050565b6000612d2a60006000805160206130aa833981519152600160a060020a031663fcf2f85f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612cf857600080fd5b505af1158015612d0c573d6000803e3d6000fd5b505050506040513d6020811015612d2257600080fd5b505184612ecc565b92915050565b600080808311612db0576040805160e560020a62461bcd02815260206004820152602860248201527f4d5346756e20636865636b5369676e6572206661696c6564202d2030206e6f7460448201527f20616c6c6f776564000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b612db984612e38565b60008181526020878152604080832060001988018452600301909152902054600160a060020a031692509050509392505050565b600080612df983612e38565b60009081526020949094525050604090912054919050565b600080612e1d83612e38565b60009081526020949094525050604090912060010154919050565b6040805160208082018490526c01000000000000000000000000300282840152825160348184030181526054909201928390528151600093918291908401908083835b60208310612e9a5780518252601f199092019160209182019101612e7b565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b6000806000806000612edd86612e38565b600081815260208a905260408082206001015490519296509450339350903690808383808284376040519201829003909120945050508415159150612f9a905057600084815260208981526040808320848155600160a060020a038616808552600282018452828520805460ff191660019081179091558886526003830185529285208054600160a060020a031916909117905592879052908a9052908101805490910190819055871415612f95576001945061305e565b61305e565b60008481526020899052604090205481141561305e57600084815260208981526040808320600160a060020a038616845260020190915290205460ff16151561304057600084815260208981526040808320600160a060020a038616808552600282018452828520805460ff191660019081179091558886526003830185529285208054600160a060020a031916909117905592879052908a9052908101805490910190555b60008481526020899052604090206001015487141561305e57600194505b5050505093925050505600756d6d2e2e2e2e2e2020796f75206861766520746f2070617920746865206e616d73672073656e646572206973206e6f74206120646576000000000000000000000000000000000000000000464904238b5cdbdce12722a7e6014ec1c0b66928736f7272792068756d616e73206f6e6c79000000000000000000000000000000a165627a7a7230582097065aea54ddc3fa5093a0bf70701f3c4c4f8d2e0bc994abfbeddeb8210432fd0029

   Swarm Source:
bzzr://97065aea54ddc3fa5093a0bf70701f3c4c4f8d2e0bc994abfbeddeb8210432fd

 

View All
Block Age transaction Difficulty Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.