Contract Overview | Fomo3D_2
Balance: 0 Ether
Ether Value: $0
Transactions: 872 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xf39e044e1ab204460e06e87c6dca2c6319fc69e3at txn 0xf5994bcea16e79c2f84b312f04b0b823910a2c42136976acb4facdb549d634f3
 Latest 25 transactions from a total of 872 transactions

TxHash Age From To Value [TxFee]
0x7adf922b2b68f0a2430b82241fcee89e9c1770e0fe48852cc1cdb30c885882be2 days 6 hrs ago0x8f0b5b4777c4a3bdf4c81f50fe871b5fd02d61ac  IN   Fomo3D_20 Ether0.001996666
0x94b804f4e3786dea1afe9463879474ccb3f187db8cd1b4619aabc824894c04e02 days 6 hrs ago0x8f0b5b4777c4a3bdf4c81f50fe871b5fd02d61ac  IN   Fomo3D_20 Ether0.000288624
0x70441e5e2a7b903be6172aa7dd3e8d424b3ced474b5c15a1fcc8966d3602182f6 days 20 hrs ago0x9ebf2fb16c47c265af1fdc839b54d2f90578910f  IN   Fomo3D_20.01 Ether0.00761288
0x3569b3e0a6e558f8d06419edda167b034244272e533b0b0f632bb2082d42110120 days 16 hrs ago0x315cea9d9c15b126a96dbaea663b5eb538fdd090  IN   Fomo3D_20.01 Ether0.002718924
0xb8213ee368a886907391be65ce169da3e0f3ddca495519becceedc8fd7cf246027 days 3 hrs ago0xdd537d6a359e25c59278fa6fe0c1ffd3d602fc4a  IN   Fomo3D_20.01 Ether0.0039887
0x71ec7458589b9f56ece8f7e2bb2ba64ad31475db1b02794869fbae07ad1ce45727 days 9 hrs ago0x1b654346c6101e723bdcd613c04c04461d40e659  IN   Fomo3D_20.01 Ether0.002413017
0x899341dca40c02769e7c3f303140d0e5d1807666b419dae1773b86c876dc572f28 days 17 hrs ago0x04c770f5b1121e5a6d8a88f94d909338d71fdfcd  IN   Fomo3D_20.01 Ether0.002141604
0xf4d2bf40eab1aa892a38f640f670f74f48b666b6307662540855ed751593617e29 days 20 hrs ago0xb0632a01ee778e09625bce2a257e221b49e79696  IN   Fomo3D_20.01 Ether0.0025269588
0xead04ab05042c81c69cb5816dbe2cc51f9e1aa2c1cd27dbbcf5ce9ca2dd7fc4c31 days 6 hrs ago0x77ddbb0d09b948142e1b20f369f4abbc264bb382  IN   Fomo3D_20.01 Ether0.003884985
0x20f7b71433da4229277ea37c6ea3c712c12d728981c6d2d9d3aa9205995b7a4a35 days 18 hrs ago0x1b07ea2e592cbdb22f2cec872ba34eb761319b0d  IN   Fomo3D_20.01 Ether0.008000145
0xd8c6511f538cbf1c6ea1e0f6292a182b02bf4adfc1282272a0cc11442d4ca36a36 days 4 mins ago0x90a082cff4c43d7dc0786c1445c83d8bf1ae7f19  IN   Fomo3D_20.01 Ether0.00874421
0xbd64a6c76bec338cd7e4bfcce3fc0f51d707475b36d60193f7080391aa58132a36 days 10 hrs ago0x8b625faad1e3dad266c4e33020d1be0277018b6c  IN   Fomo3D_20.01 Ether0.006120947
0xd74d89a4e12f2637f49954a39a22ea8b9259078ae6fb8397d8da24abb15d171d36 days 14 hrs ago0xd9369e74ffae45412fd2c75cb055fdd7876fb2b7  IN   Fomo3D_20.01 Ether0.001917897
0x99ab51b121bb3774da9c14bad5a8b62a75d947fe1f94fec975f6c27dc4b4314b37 days 16 hrs ago0x6c4f55865d3dd870370c72f8c1c78a76537df277  IN   Fomo3D_20.01 Ether0.003839345
0xad35c5251972bd2f6835ec25412a164ee9abdd96ff8f9728fe4af0442ee6df6139 days 8 hrs ago0xb0632a01ee778e09625bce2a257e221b49e79696  IN   Fomo3D_20.01 Ether0.0080586792
0xd8eb3970cfb2c5c5d8ac145c52b858a8ef72e747f8b65dbb0d12e9b8c750da4440 days 39 mins ago0x026f549694ccbdac252436b611b75c463ea497ec  IN   Fomo3D_20.01 Ether0.003139314
0x102cbd99826da355f45a2e58715712c7e8eef83a9bfd3e26b22f0fe1746d245040 days 14 hrs ago0xff77c5277c1ae715745d5a3f401dc848cdc89b86  IN   Fomo3D_20.01 Ether0.00147611
0x427837768a78c452750cf8f4c4ef6b004a8cecaef09fecf691cf7ed00bba1d6441 days 2 hrs ago0x10c60b50f0d19e20c23e167c554ca30cb8906fe4  IN   Fomo3D_20.01 Ether0.0040000725
0xb020668bc23003e1d7cb8ae5133f2101e97b1de7fa1a0528c56d85349e7308b641 days 2 hrs ago0x9e629cf36e87e1c91f5d3c4034951792ebbe50bd  IN   Fomo3D_20.01 Ether0.004423374
0x3b5afeb9da6fe277977f90aab67d76f738124678ab99a0eb2374f0a94a8a16cc41 days 23 hrs ago0x674ec0ea9e288289b0523aac263411157fbdc83a  IN   Fomo3D_20.01 Ether0.002870754
0xd0c2ead8ea24416aa4c45d6430625c76942f594ed3135c1779ed83cb225a21a543 days 7 hrs ago0x26976e2722c24d66f87b717efe552cdaaa5b5cb9  IN   Fomo3D_20.01 Ether0.005290092
0xef52614b0d9f7e28e3cb820c3f6f60fc14f0b3373b28b187b38a5fd1b9c728b443 days 8 hrs ago0x0fb72c9b937a6c5f5df77b3bc2e26bf1fef34a8f  IN   Fomo3D_20.01 Ether0.006284943
0xf5a7eb18804ef14093a33e239481e9f12ce933b0913f1df838799a999b32fb4c43 days 8 hrs ago0x8c30c6c7d386a7d87683f087ff839d10ab55f121  IN   Fomo3D_20.01 Ether0.006188539
0x48bfdc462fea0862c94514b2558d55b2de5147548dc36e7c5d2ca13d1390595b44 days 3 hrs ago0x7ccf173012bfe53f16f4d6a2a4aea32abafcd04c  IN   Fomo3D_20.01 Ether0.002799933
0x3c9c7de797f7e0bdeee9ad3a8e03d3562ab6eb2ec9c5151cac92c4b3d6d4536645 days 22 mins ago0xf6d44482c95190caebb37b31caf57cf6b5315bd1  IN   Fomo3D_20.01 Ether0.0016954245
[ 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
0x00fcaa4b13ff284d4bd2d517a7742f4061802fdcafc584cccc738362a8e3218d686072023 hrs 27 mins ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x00fcaa4b13ff284d4bd2d517a7742f4061802fdcafc584cccc738362a8e3218d686072023 hrs 27 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xde7039fd19da822a657cfb946d0aa50255031cb453f3686796f109a4cd0cca4c686065923 hrs 42 mins ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xde7039fd19da822a657cfb946d0aa50255031cb453f3686796f109a4cd0cca4c686065923 hrs 42 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x6c77b56acb1b9ae7a74c8fa1104b62f0de750c786e0d9e7caef90d341f67c5d368604791 day 31 mins ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x6c77b56acb1b9ae7a74c8fa1104b62f0de750c786e0d9e7caef90d341f67c5d368604791 day 31 mins ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x97dfe6d0b5848fe9787595e83445a2dbf7c6a6af023b8f017d52078f39b44ee868530562 days 5 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x97dfe6d0b5848fe9787595e83445a2dbf7c6a6af023b8f017d52078f39b44ee868530562 days 5 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xbf2248931ae134f0ad2e56afdbc197eca0a5ee83ce1b9f78d5302b2ed6eac8f468480063 days 1 hr ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xbf2248931ae134f0ad2e56afdbc197eca0a5ee83ce1b9f78d5302b2ed6eac8f468480063 days 1 hr ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x7a26c7466703bd4b512f61d70864cb4df1cc2d145fe422d4ba0bef0126cc92b268410374 days 5 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x7a26c7466703bd4b512f61d70864cb4df1cc2d145fe422d4ba0bef0126cc92b268410374 days 5 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x354067f12a23bbe39a26aac027a4ae715224eb008d797d4d6ed1288a45c566c168347905 days 6 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x354067f12a23bbe39a26aac027a4ae715224eb008d797d4d6ed1288a45c566c168347905 days 6 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x1878de40c52dd3af15d02b5b5d6b79821bb19a491ce9eb371abc03c8ce460ace68319555 days 17 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x1878de40c52dd3af15d02b5b5d6b79821bb19a491ce9eb371abc03c8ce460ace68319555 days 17 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xfb8f3873ddfc3b42caa14add96cbadc76d029178ebac2132dee4776ff10858ea68319465 days 17 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xfb8f3873ddfc3b42caa14add96cbadc76d029178ebac2132dee4776ff10858ea68319465 days 17 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0xa233517c496fb11e4643bcdeaa48f4aaa20baee2a76083a5422c4771104de6c068318945 days 17 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xa233517c496fb11e4643bcdeaa48f4aaa20baee2a76083a5422c4771104de6c068318945 days 17 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x70441e5e2a7b903be6172aa7dd3e8d424b3ced474b5c15a1fcc8966d3602182f68251666 days 20 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xdb5b8825182b3f64f762295b11415292e1793d854a6a09e7063c134e14fbe13468219237 days 9 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0xdb5b8825182b3f64f762295b11415292e1793d854a6a09e7063c134e14fbe13468219237 days 9 hrs ago0xa62142888aba8370742be823c1782d17a0389da10xd60d353610d9a5ca478769d371b53cefaa7b6e4c0.01 Ether
0x8e5028c563b7976ede6b2b3fda3cafe651bf018ea5090d57012efc5a3d6d5d1b68105869 days 6 hrs ago0xd60d353610d9a5ca478769d371b53cefaa7b6e4c0xdd4950f977ee28d2c132f1353d1595035db444ee0.01 Ether
0x8e5028c563b7976ede6b2b3fda3cafe651bf018ea5090d57012efc5a3d6d5d1b68105869 days 6 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 GasUsed 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.