ETH Price: $1,979.83 (+0.16%)

Transaction Decoder

Block:
8347049 at Aug-14-2019 06:35:02 AM +UTC
Transaction Fee:
0.016970076 ETH $33.60
Gas Used:
1,414,173 Gas / 12 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x472c3169...393d54870
(NEST Protocol: Guardian Node Allocation)
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 83571381898943668996320784532049462876897765295023107063693388651589266847155761838428899153976343752812425415881049601642742842416759592063174732017958052103651854413498434212304091447391397474825204517198470274899998544773540654932960715372308006858119159430471990473903661872472346401619576277746138286365370117388299430627506927957615447487842537721713632682083960692008618188022092386395215882227566719084450817736309877187862382811284151609951646581717714025532677842363349174887566344723807624582258315516638510104207787333362157446881058360653238847018536813983801965690976619885462118305457593845288515576985631657911967782516629201808768926338447528284510542124385769724363080033566926515500125880446551615017797862850718725220223833206671979726267514379648035789175758367558290492151678502630740275081826052990533418933005095415428783728624099628658407153961598517207519435728225510200574167223695037878270293559009578498432570108984904282809684348445505588640123524614222789167875952301292446955245258270723894934935325978030141987263050412472526897785736680699295440731844528600200958519225566255458115968101395658413015597812648280407244792637578457908428499865050052020045473634989668601363560312250291122748752575452685229509436046841363526911664057291635532246455168132367835502859898183977091057014899874818444728772724493760438797560051895428673496869892351277470602498137937910280831757287471246305137617997505960498147191973240555608700818398861423531250324459026829796963674760448054899947144863021016572410387732873390536668851251923212981423287164787306950919880379342857201023644969964930477335933113323613258419522285005708159164817676525884259961781431796002226022552725586776816149429541303517573971324225971592270747035708919695117162966092713312371534637230005494750250972485441188939991904233856805878387181929859680364970341752081032172131105376629028226044045088470067509900372847927366821188927864370485626925820388514441202902878414672314016091590831386678547399316835408539783562192692046453576809620169831741789160853374659078553585896089918324719303226905808826017884031231886035007997043582107234006599322435224010764393132415363397156554197651851228413577925986036031592664045803721966210411354004922888276666923665724981030107259684460465576392939727996351462445697657592588702269578287600016811893698574551217082773619264299336148874930614038181297596993779965823278362211767998623419580267856641407344478243259480650432404338228910592748496026363889622165783787409442079446716605612420337782462412103710312561424589089827311691199720320931246321144842580838902897799117604521803292456670311790722568020418707166602041213041255908126807582337664324910172166121112589547831646323904260780531792180470228614459198770952597992960829139012597849608223390477597795157415227171186685016796460083998230337105644989567833971484314745599650514055410457003926997566189158743395451285294991123119153277670370509583198222229933571239594242367472198754869062095025739277060704266520434920148599989333598909994849019257412366264396593310544512182325251460533938340991111138972578111312780020004284475687140986546857703393406492688616408597344114451765705247536030832578950880915814555295171870249818075140960826886627651255397764667945936760462833756626594611102454829319218248718567588692907063616696951218517843866360444105917357224857021380221274084211957012603982449143671895545633192324367935872500402082240620919285086544261968379041188371286973235411767264759455426542458799327018965445916296911349873591762256354241760191309093727965398773530409515080442921417915610680916758457722690946300619009651154639639426746166598719536879195751622028481538635471753604258497139056477744079797099404724183612386047203316920973502174671765874923880721035554173282516793766682437069674038457211986789349569997130407855564055286406704713863530906726189265735747867407356774666034010830905534613538733371426764790866401907473301546857564014487407524666249753070658845843526686361976246961824515567073456674535912602376510121157133849178177550046958923155239362507400609654625774229686296318650493134859941583059460348847281524154472301299877500636712683212673739784789889623169170580947816926188672644611063604672983562242000211716608042022359185421122293747324167741047889597297371263282699820008352891003000784492842708501330052385486098856447068420169104264544481876661461342666321470990318985633513782551632668202713970766070467329572978362721952634317472482945852681949664248039301343566300672587618537265630057006685365181844435385717787866005254434299441064750181299559502006549796272308158939826990199578543411108056356297269149537444236034834831065774818308589498731614110555144263009544981135010898597214071643306759842243303349291227632620225170755918964494159038137948564859163199342123902196129315106614200386856721896266787439967101638839432706816087668914289707162427278966760354548958479949689812714729862576557736281152533560912617416815862849342141064201997168889795723314739144049690624822712430029971055834118579895638349089911694215013876806034089446609218736169122824085100121274120810539017043824129885595968831373189140493398550596914758237748271181784312964409918165746337600983117739744927129206155248191332475542027086434445477096374230248805093607568349832296941065515827783827984743502379915010112812953773203258409069619006798383097425327528464943946305162851529352069400656741539774954444768317659243206712364510711589053736830810527307027088364527123516234281762057984872240662108292600686743567251089868067549934148573837164187437957115187498798778867732645499021693209227322673396927600160514729436361459018153294513801368362422723524620977178208643250415136926182769238745864853918021021773611329931916041864727421128666317326103188038910852245053557679315758124702987936037382636102195176723073331418940926914795153472275538596107055047842361749932458835059950992006306360559792752643121280363714645505689574263674299116361343723977227671184561595367870043823763767129400697953252614009586378102042516802442128055275552019831395302956156308889186118241059133855198047772452789908455758107003116062964990850236475821863683824725858704356195576135163712332494698557938869813061452463520154328279115779987655283345883303242255333643986523654191169319761821554540370520398472617300268428478239731252506568611134726074526422893600135626747150327189167590441330842410348171131838632508631739533720369925573835176494647264406837338729437356424921192944103684861408741289586801724623396665292749713474377420740311168231436448485144210302721886661563477533412602266272602260966120209060118662633325372679822895483935778584083081616862006865526737381707017027249809077593711224478989766214541609854479420945788500360144558057535994557492675879248054411962430428089224124588716062554514315486915711344871588749535664346861523443058714753230032165503654977492707190963175368883234530234738551957132095390589365488358708270790792248178542416674708206964488530928252235654017318546042550397899527264361457790648721517389083491518131617824428989681415811244934962489702159255813826801946353262521431432164042473532738429116582747756792204592805618526657083410134555999888867147412717817965891277041298919407765897159157778266576187610984898447443627914793343936685342141587586774160694307109321274329931227849536084924248410008971823506015904305317320368020660377701195001853129956117098313558019951486789887357676381526849729204680821678221364784662680022846981238965692522205310805552624952054000856964052974640476343959211947521399838247764284799038576221855507664541479416194482009349450160346608388098918034772241337284058918685550163614733001266546849076317907015405407751794654036679588454079104791764420390956246110798455705649624333319809079002945143684813803337012091917729668244869516211867953027682162187609745607102002945100974558574349830403282796116405554976369783604841285312175403229946676240241698285207578679662917746627286768459155876516005521400940736440777208226193485597006420766010815098373834069296092876115599384935474393561237952585443903712472234105926428468088614009373222052555128057783171477560806740986049934846382209009964705505590110680461545619353936448660821837715158651008713803010864585624422336339163003553153274220119113547587386028992746751476737771248776825240062407993403768167343183339348526744112556000962899110246070252503066305316557165905236418351186165761825177404344946461964526567681230722317682811525316782480799188300309272089808025912101514913493484325164283493179369964110471931524776199111724194098629604739821192508818732062233022751895244122439410457568377440745099551291586234880437865112215985252380952185138305917966700744330865045647988524432425787367736500359953604681433971209499189109127718127351606389085996078448637741577758921614060879326797334342214633219789004409674986946736342110236861407033128765324176548725834949036575517075464556614704875816575409955257669548626566712117950782865099119732996687666702915169937779296399786181014837387685604386477375448308263676791727537843197787796869880425478844928984849558023988057937223276401164789466203646344350650870540653401712890976462306147494747586606126457283055593452946193303855054915785728104678450421253379123532024928966524537619776321916657000975689893462875349933135007131751648634382060677734763964296931123765359297236044786787471756902146303711172730963078769387728219114628429872947103212052847541719167490000823698051419857173177426204460203582337951853069078157434103483849508545219347726287386130617664494813660634654470143685074085758048300432050600171063287979302226233268080720931838312489192709942594107567822151942683528454418538086555527150537446173226478800525270618846270714955493789198237329322875817239575200683041439868090046075329786260763126682217724289170337550436295117562197048117765357209644845723481077353788225459022648278176772627891031939301829990915160921153996931672048113871831190002716085401481324268615129627192244076277557315983392374752243961733883990445781846611397275965993598244053533874772390619653285118057621301761611829200484738727683608964892810746731467151620078781164385916139139291364572080401863643054519575390328708906880658625105995845266012114462751469752153888152843523835546104876113900555598395763880234997976549525570097094592726093548360760455900514470873976244466673089520394307023912159390957703237545321618653607488769835621623395921032252473346473009765071528400618249882914442585544238821463497588719867257845054182962076222681451611879566776711837882267231657846675686167996071537763604427989797507795536892657740727326917180362509400552477003572559152409317836950385707915025023950212988550568454580718949273100148991241491049826760629113324462315708979345330143975120089104006282184635181065331100921732375040806395445298
(Ethpool 2)
361.516072407780575327 Eth361.533042483780575327 Eth0.016970076
0xA38afc5c...DC1054882
(Fake_Phishing462873)
5.667331656004658138 Eth
Nonce: 646
5.650361580004658138 Eth
Nonce: 647
0.016970076

Execution Trace

NEST_NodeAssignment.60806040( )
  • IBMapping.checkAddress( name=nest ) => ( contractAddress=0x04abEdA201850aC0124161F037Efd70c74ddC74C )
  • IBMapping.checkAddress( name=nestNode ) => ( contractAddress=0xC028E81e11F374f7c1A3bE6b8D2a815fa3E96E6e )
  • IBMapping.checkAddress( name=nestNodeSave ) => ( contractAddress=0x101D8b63A081dFfF2B1364864345b7F071b052ac )
  • IBMapping.checkAddress( name=nodeAssignmentData ) => ( contractAddress=0xb086F99E36c2c0ef6c051EE9E4d638717BBc6cbC )
    File 1 of 2: NEST_NodeAssignment
    pragma solidity ^0.5.10;
    
    /**
     * @title Guardian node nest storage
     */
    contract NEST_NodeSave {
        IBMapping mappingContract;                      
        IBNEST nestContract;                             
        
        /**
        * @dev Initialization method
        * @param map Mapping contract address
        */
        constructor (address map) public {
            mappingContract = IBMapping(address(map));              
            nestContract = IBNEST(address(mappingContract.checkAddress("nest")));            
        }
        
        /**
        * @dev Change mapping contract
        * @param map Mapping contract address
        */
        function changeMapping(address map) public onlyOwner {
            mappingContract = IBMapping(address(map));              
            nestContract = IBNEST(address(mappingContract.checkAddress("nest")));            
        }
        
        /**
        * @dev Transfer out nest
        * @param amount Transfer out quantity
        * @param to Transfer out target
        * @return Actual transfer out quantity
        */
        function turnOut(uint256 amount, address to) public onlyMiningCalculation returns(uint256) {
            uint256 leftNum = nestContract.balanceOf(address(this));
            if (leftNum >= amount) {
                nestContract.transfer(to, amount);
                return amount;
            } else {
                return 0;
            }
        }
        
        modifier onlyOwner(){
            require(mappingContract.checkOwners(msg.sender) == true);
            _;
        }
    
        modifier onlyMiningCalculation(){
            require(address(mappingContract.checkAddress("nodeAssignment")) == msg.sender);
            _;
        }
        
    }
    
    /**
     * @title Guardian node receives data
     */
    contract NEST_NodeAssignmentData {
        using SafeMath for uint256;
        IBMapping mappingContract;              
        uint256 nodeAllAmount = 0;                                 
        mapping(address => uint256) nodeLatestAmount;               
        
        /**
        * @dev Initialization method
        * @param map Mapping contract address
        */
        constructor (address map) public {
            mappingContract = IBMapping(map); 
        }
        
        /**
        * @dev Change mapping contract
        * @param map Mapping contract address
        */
        function changeMapping(address map) public onlyOwner{
            mappingContract = IBMapping(map); 
        }
        
        //  Add nest
        function addNest(uint256 amount) public onlyNodeAssignment {
            nodeAllAmount = nodeAllAmount.add(amount);
        }
        
        //  View cumulative total
        function checkNodeAllAmount() public view returns (uint256) {
            return nodeAllAmount;
        }
        
        //  Record last received quantity
        function addNodeLatestAmount(address add ,uint256 amount) public onlyNodeAssignment {
            nodeLatestAmount[add] = amount;
        }
        
        //  View last received quantity
        function checkNodeLatestAmount(address add) public view returns (uint256) {
            return nodeLatestAmount[address(add)];
        }
        
        modifier onlyOwner(){
            require(mappingContract.checkOwners(msg.sender) == true);
            _;
        }
        
        modifier onlyNodeAssignment(){
            require(address(msg.sender) == address(mappingContract.checkAddress("nodeAssignment")));
            _;
        }
    }
    
    /**
     * @title Guardian node assignment
     */
    contract NEST_NodeAssignment {
        
        using SafeMath for uint256;
        IBMapping mappingContract;  
        IBNEST nestContract;                                   
        SuperMan supermanContract;                              
        NEST_NodeSave nodeSave;
        NEST_NodeAssignmentData nodeAssignmentData;
    
        /**
        * @dev Initialization method
        * @param map Mapping contract address
        */
        constructor (address map) public {
            mappingContract = IBMapping(map); 
            nestContract = IBNEST(address(mappingContract.checkAddress("nest")));
            supermanContract = SuperMan(address(mappingContract.checkAddress("nestNode")));
            nodeSave = NEST_NodeSave(address(mappingContract.checkAddress("nestNodeSave")));
            nodeAssignmentData = NEST_NodeAssignmentData(address(mappingContract.checkAddress("nodeAssignmentData")));
        }
        
        /**
        * @dev Change mapping contract
        * @param map Mapping contract address
        */
        function changeMapping(address map) public onlyOwner{
            mappingContract = IBMapping(map); 
            nestContract = IBNEST(address(mappingContract.checkAddress("nest")));
            supermanContract = SuperMan(address(mappingContract.checkAddress("nestNode")));
            nodeSave = NEST_NodeSave(address(mappingContract.checkAddress("nestNodeSave")));
            nodeAssignmentData = NEST_NodeAssignmentData(address(mappingContract.checkAddress("nodeAssignmentData")));
        }
        
        /**
        * @dev Deposit in nest
        * @param amount Quantity deposited in nest
        */
        function bookKeeping(uint256 amount) public {
            require(amount > 0);
            require(nestContract.balanceOf(address(msg.sender)) >= amount);
            require(nestContract.allowance(address(msg.sender), address(this)) >= amount);
            require(nestContract.transferFrom(address(msg.sender), address(nodeSave), amount));
            nodeAssignmentData.addNest(amount);
        }
        
        /**
        * @dev Guardian node collection
        */
        function nodeGet() public {
            require(address(msg.sender) == address(tx.origin));
            require(supermanContract.balanceOf(address(msg.sender)) > 0);
            uint256 allAmount = nodeAssignmentData.checkNodeAllAmount();
            uint256 amount = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(msg.sender)));
            uint256 getAmount = amount.mul(supermanContract.balanceOf(address(msg.sender))).div(1500);
            require(nestContract.balanceOf(address(nodeSave)) >= getAmount);
            nodeSave.turnOut(getAmount,address(msg.sender));
            nodeAssignmentData.addNodeLatestAmount(address(msg.sender),allAmount);
        }
        
        /**
        * @dev Transfer settlement
        * @param fromAdd Transfer out address
        * @param toAdd Transfer in address
        */
        function nodeCount(address fromAdd, address toAdd) public {
            require(address(supermanContract) == address(msg.sender));
            require(supermanContract.balanceOf(address(fromAdd)) > 0);
            uint256 allAmount = nodeAssignmentData.checkNodeAllAmount();
            
            uint256 amountFrom = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(fromAdd)));
            uint256 getAmountFrom = amountFrom.mul(supermanContract.balanceOf(address(fromAdd))).div(1500);
            require(nestContract.balanceOf(address(nodeSave)) >= getAmountFrom);
            nodeSave.turnOut(getAmountFrom,address(fromAdd));
            nodeAssignmentData.addNodeLatestAmount(address(fromAdd),allAmount);
            
            uint256 amountTo = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(toAdd)));
            uint256 getAmountTo = amountTo.mul(supermanContract.balanceOf(address(toAdd))).div(1500);
            require(nestContract.balanceOf(address(nodeSave)) >= getAmountTo);
            nodeSave.turnOut(getAmountTo,address(toAdd));
            nodeAssignmentData.addNodeLatestAmount(address(toAdd),allAmount);
        }
        
        //  Amount available to the guardian node
        function checkNodeNum() public view returns (uint256) {
             uint256 allAmount = nodeAssignmentData.checkNodeAllAmount();
             uint256 amount = allAmount.sub(nodeAssignmentData.checkNodeLatestAmount(address(msg.sender)));
             uint256 getAmount = amount.mul(supermanContract.balanceOf(address(msg.sender))).div(1500);
             return getAmount;
        }
        
        modifier onlyOwner(){
            require(mappingContract.checkOwners(msg.sender) == true);
            _;
        }
    }
    
    
    /**
     * @title ERC20 interface
     * @dev see https://github.com/ethereum/EIPs/issues/20
     */
    interface IERC20 {
        function totalSupply() external view returns (uint256);
    
        function balanceOf(address who) external view returns (uint256);
    
        function allowance(address owner, address spender) external view returns (uint256);
    
        function transfer(address to, uint256 value) external returns (bool);
    
        function approve(address spender, uint256 value) external returns (bool);
    
        function transferFrom(address from, address to, uint256 value) external returns (bool);
    
        event Transfer(address indexed from, address indexed to, uint256 value);
    
        event Approval(address indexed owner, address indexed spender, uint256 value);
        
    }
    
    /**
     * @title Standard ERC20 token
     *
     * @dev Implementation of the basic standard token.
     * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
     * Originally based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
     *
     * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for
     * all accounts just by listening to said events. Note that this isn't required by the specification, and other
     * compliant implementations may not do it.
     */
    contract SuperMan is IERC20 {
        using SafeMath for uint256;
    
        mapping (address => uint256) private _balances;
    
        mapping (address => mapping (address => uint256)) private _allowed;
        
        IBMapping mappingContract;  //映射合约
    
        uint256 private _totalSupply = 1500;
        string public name = "NestNode";
        string public symbol = "NN";
        uint8 public decimals = 0;
    
        constructor (address map) public {
        	_balances[msg.sender] = _totalSupply;
        	mappingContract = IBMapping(map); 
        }
        
        function changeMapping(address map) public onlyOwner{
            mappingContract = IBMapping(map);
        }
        
        /**
        * @dev Total number of tokens in existence
        */
        function totalSupply() public view returns (uint256) {
            return _totalSupply;
        }
    
        /**
        * @dev Gets the balance of the specified address.
        * @param owner The address to query the balance of.
        * @return An uint256 representing the amount owned by the passed address.
        */
        function balanceOf(address owner) public view returns (uint256) {
            return _balances[owner];
        }
    
        /**
         * @dev Function to check the amount of tokens that an owner allowed to a spender.
         * @param owner address The address which owns the funds.
         * @param spender address The address which will spend the funds.
         * @return A uint256 specifying the amount of tokens still available for the spender.
         */
        function allowance(address owner, address spender) public view returns (uint256) {
            return _allowed[owner][spender];
        }
    
        /**
        * @dev Transfer token for a specified address
        * @param to The address to transfer to.
        * @param value The amount to be transferred.
        */
        function transfer(address to, uint256 value) public returns (bool) {
            _transfer(msg.sender, to, value);
            return true;
        }
    
        /**
         * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
         * Beware that changing an allowance with this method brings the risk that someone may use both the old
         * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
         * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
         * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
         * @param spender The address which will spend the funds.
         * @param value The amount of tokens to be spent.
         */
        function approve(address spender, uint256 value) public returns (bool) {
            require(spender != address(0));
    
            _allowed[msg.sender][spender] = value;
            emit Approval(msg.sender, spender, value);
            return true;
        }
    
        /**
         * @dev Transfer tokens from one address to another.
         * Note that while this function emits an Approval event, this is not required as per the specification,
         * and other compliant implementations may not emit the event.
         * @param from address The address which you want to send tokens from
         * @param to address The address which you want to transfer to
         * @param value uint256 the amount of tokens to be transferred
         */
        function transferFrom(address from, address to, uint256 value) public returns (bool) {
            _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
            _transfer(from, to, value);
            emit Approval(from, msg.sender, _allowed[from][msg.sender]);
            return true;
        }
    
        /**
         * @dev Increase the amount of tokens that an owner allowed to a spender.
         * approve should be called when allowed_[_spender] == 0. To increment
         * allowed value is better to use this function to avoid 2 calls (and wait until
         * the first transaction is mined)
         * From MonolithDAO Token.sol
         * Emits an Approval event.
         * @param spender The address which will spend the funds.
         * @param addedValue The amount of tokens to increase the allowance by.
         */
        function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
            require(spender != address(0));
    
            _allowed[msg.sender][spender] = _allowed[msg.sender][spender].add(addedValue);
            emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
            return true;
        }
    
        /**
         * @dev Decrease the amount of tokens that an owner allowed to a spender.
         * approve should be called when allowed_[_spender] == 0. To decrement
         * allowed value is better to use this function to avoid 2 calls (and wait until
         * the first transaction is mined)
         * From MonolithDAO Token.sol
         * Emits an Approval event.
         * @param spender The address which will spend the funds.
         * @param subtractedValue The amount of tokens to decrease the allowance by.
         */
        function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
            require(spender != address(0));
    
            _allowed[msg.sender][spender] = _allowed[msg.sender][spender].sub(subtractedValue);
            emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
            return true;
        }
    
        /**
        * @dev Transfer token for a specified addresses
        * @param from The address to transfer from.
        * @param to The address to transfer to.
        * @param value The amount to be transferred.
        */
        function _transfer(address from, address to, uint256 value) internal {
            require(to != address(0));
            
            NEST_NodeAssignment nodeAssignment = NEST_NodeAssignment(address(mappingContract.checkAddress("nodeAssignment")));
            nodeAssignment.nodeCount(from, to);
            
            _balances[from] = _balances[from].sub(value);
            _balances[to] = _balances[to].add(value);
            emit Transfer(from, to, value);
            
            
        }
        
        modifier onlyOwner(){
            require(mappingContract.checkOwners(msg.sender) == true);
            _;
        }
    }
    
    /**
     * @title SafeMath
     * @dev Math operations with safety checks that revert on error
     */
    library SafeMath {
        int256 constant private INT256_MIN = -2**255;
    
        /**
        * @dev Multiplies two unsigned integers, reverts on overflow.
        */
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
            if (a == 0) {
                return 0;
            }
    
            uint256 c = a * b;
            require(c / a == b);
    
            return c;
        }
    
        /**
        * @dev Multiplies two signed integers, reverts on overflow.
        */
        function mul(int256 a, int256 b) internal pure returns (int256) {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
            if (a == 0) {
                return 0;
            }
    
            require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below
    
            int256 c = a * b;
            require(c / a == b);
    
            return c;
        }
    
        /**
        * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
        */
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            // Solidity only automatically asserts when dividing by 0
            require(b > 0);
            uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    
            return c;
        }
    
        /**
        * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
        */
        function div(int256 a, int256 b) internal pure returns (int256) {
            require(b != 0); // Solidity only automatically asserts when dividing by 0
            require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow
    
            int256 c = a / b;
    
            return c;
        }
    
        /**
        * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
        */
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b <= a);
            uint256 c = a - b;
    
            return c;
        }
    
        /**
        * @dev Subtracts two signed integers, reverts on overflow.
        */
        function sub(int256 a, int256 b) internal pure returns (int256) {
            int256 c = a - b;
            require((b >= 0 && c <= a) || (b < 0 && c > a));
    
            return c;
        }
    
        /**
        * @dev Adds two unsigned integers, reverts on overflow.
        */
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a);
    
            return c;
        }
    
        /**
        * @dev Adds two signed integers, reverts on overflow.
        */
        function add(int256 a, int256 b) internal pure returns (int256) {
            int256 c = a + b;
            require((b >= 0 && c >= a) || (b < 0 && c < a));
    
            return c;
        }
    
        /**
        * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
        * reverts when dividing by zero.
        */
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b != 0);
            return a % b;
        }
    }
    
    contract IBMapping {
    	function checkAddress(string memory name) public view returns (address contractAddress);
    	function checkOwners(address man) public view returns (bool);
    }
    
    contract IBNEST {
        function totalSupply() public view returns (uint supply);
        function balanceOf( address who ) public view returns (uint value);
        function allowance( address owner, address spender ) public view returns (uint _allowance);
    
        function transfer( address to, uint256 value) external;
        function transferFrom( address from, address to, uint value) public returns (bool ok);
        function approve( address spender, uint value ) public returns (bool ok);
    
        event Transfer( address indexed from, address indexed to, uint value);
        event Approval( address indexed owner, address indexed spender, uint value);
        
        function balancesStart() public view returns(uint256);
        function balancesGetBool(uint256 num) public view returns(bool);
        function balancesGetNext(uint256 num) public view returns(uint256);
        function balancesGetValue(uint256 num) public view returns(address, uint256);
    }

    File 2 of 2: IBMapping
    pragma solidity ^0.5.1;
    
    /**
     * @title Mapping contract
     * @dev Add and delete business contract
     */
    contract IBMapping {
    	mapping(string => address) private ContractAddress;						//	Business contract address
    	mapping (address => bool) owners;										//	Superman address
    
    	/**
        * @dev Initialization method
        */
    	constructor () public {
    		owners[msg.sender] = true;
    	}
    	
        /**
        * @dev Inquiry address
        * @param name String ID
        * @return contractAddress Contract address
        */
    	function checkAddress(string memory name) public view returns (address contractAddress) {
    		return ContractAddress[name];
    	}
    	
        /**
        * @dev Add address
        * @param name String ID
        * @param contractAddress Contract address
        */
    	function addContractAddress(string memory name, address contractAddress) public {
    		require(checkOwners(msg.sender) == true);
    		ContractAddress[name] = contractAddress;
    	}
    	
    	/**
        * @dev Add superman
        * @param superMan Superman address
        */
    	function addSuperMan(address superMan) public {
    	    require(checkOwners(msg.sender) == true);
    	    owners[superMan] = true;
    	}
    	
    	/**
        * @dev Delete superman
        * @param superMan Superman address
        */
    	function deleteSuperMan(address superMan) public {
    	    require(checkOwners(msg.sender) == true);
    	    owners[superMan] = false;
    	}
    	
    	/**
        * @dev Check superman
        * @param man Superman address
        * @return Permission or not
        */
    	function checkOwners(address man) public view returns (bool){
    	    return owners[man];
    	}
    }