ETH Price: $2,157.11 (+1.08%)

Transaction Decoder

Block:
11744777 at Jan-28-2021 02:18:22 PM +UTC
Transaction Fee:
0.023360438 ETH $50.39
Gas Used:
191,479 Gas / 122 Gwei

Emitted Events:

319 Token.Transfer( from=[Receiver] 0x5513ff35b8cc25f126bfbccc8d2bf91fcc023522, to=0x85dfDc9579e21a87013956ED584483468f5969d6, value=251100000000 )
320 Token.Transfer( from=[Receiver] 0x5513ff35b8cc25f126bfbccc8d2bf91fcc023522, to=0xFFcbF62c00B6EC4dA7CBef6D61f68F890030017c, value=100000000000000 )
321 Token.Transfer( from=[Receiver] 0x5513ff35b8cc25f126bfbccc8d2bf91fcc023522, to=0x76e275fbb8bC233d4EFb9C20B6e2DDB408402ACe, value=0 )
322 Token.Transfer( from=[Receiver] 0x5513ff35b8cc25f126bfbccc8d2bf91fcc023522, to=0x509347488209F80dC1d97076591DB92A023556ef, value=0 )
323 0x5513ff35b8cc25f126bfbccc8d2bf91fcc023522.0x7acbcd6278cc39b736e5516c8ca327715768f5f5830e3f6961a7b268a9c671fe( 0x7acbcd6278cc39b736e5516c8ca327715768f5f5830e3f6961a7b268a9c671fe, 0xa485565417ed3c5eb6336f4dbac2b3426205a34a4012c5230e77ec75fee32d25, 0x00000000000000000000000085dfdc9579e21a87013956ed584483468f5969d6, 0x00000000000000000000000048f0a8748c520510417585496ab1735b767c02cc, 0000000000000000000000005513ff35b8cc25f126bfbccc8d2bf91fcc023522, a485565417ed3c5eb6336f4dbac2b3426205a34a4012c5230e77ec75fee32d25, 00000000000000000000000085dfdc9579e21a87013956ed584483468f5969d6, 0000000000000000000000000000000000000000000000000000003a76b9ef00, 00000000000000000000000048f0a8748c520510417585496ab1735b767c02cc, 00000000000000000000000000000000000000000000000000005af3107a4000, 00000000000000000000000010b117eb2efc3f7c188fe014f9c85a9464bf52bd, 000000000000000000000000d884d152387f5cf90007d4972ceaba632d712330, c0c32ee279a28dc578403965688b24323b13b264e0dcf08641f425c8035f6a8c, 3c2d326ef84e537448b97b1764cacabb98ca2b77e4d2e5d0d70b62eeaa9ca46b, 0000000000000000000000000000000000000000000000000000000000000001, 000000000000000000000000ffcbf62c00b6ec4da7cbef6d61f68f890030017c, 000000000000000000000000000000000000000000000000000000006012c769, a485565417ed3c5eb6336f4dbac2b3426205a34a4012c5230e77ec75fee32d25, 0000000000000000000000000000000000000000000000000000000000000001, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000003a76b9ef00, 00000000000000000000000000000000000000000000000000005af3107a4000, 0000000000000000000000000000000000000000000000000000000000000000, c0c32ee279a28dc578403965688b24323b13b264e0dcf08641f425c8035f6a8c, 3c2d326ef84e537448b97b1764cacabb98ca2b77e4d2e5d0d70b62eeaa9ca46b, 0000000000000000000000000000000000000000000000000000000000000002, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000006, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000009, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000003a76b9ef00, 00000000000000000000000000000000000000000000000000005af3107a4000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 00000000000000000000000085dfdc9579e21a87013956ed584483468f5969d6, 000000000000000000000000ffcbf62c00b6ec4da7cbef6d61f68f890030017c, 00000000000000000000000076e275fbb8bc233d4efb9c20b6e2ddb408402ace, 0000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000509347488209f80dc1d97076591db92a023556ef, 0000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000006012c7ae, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x48F0A874...b767c02cc
7.45195239937654127 Eth
Nonce: 8913
7.42859196137654127 Eth
Nonce: 8914
0.023360438
0x5513FF35...fcC023522
(Babel Pool)
8,934.084154331377092051 Eth8,934.107514769377092051 Eth0.023360438
0xe6a51Bd4...4971d8D4E

Execution Trace

0x5513ff35b8cc25f126bfbccc8d2bf91fcc023522.e841e4ce( )
  • Null: 0x000...001.ce70cb50( )
  • Null: 0x000...001.d86902ac( )
  • 0x10b117eb2efc3f7c188fe014f9c85a9464bf52bd.CALL( )
  • 0x87a3d34e694cf061cd98cdf1621ca8945679337d.cd223289( )
  • 0x10b117eb2efc3f7c188fe014f9c85a9464bf52bd.CALL( )
  • 0x10b117eb2efc3f7c188fe014f9c85a9464bf52bd.CALL( )
  • 0x74b303dd79bbf44d23d60891bdd0f31df87bc7b8.CALL( )
  • Token.transfer( _to=0x85dfDc9579e21a87013956ED584483468f5969d6, _value=251100000000 ) => ( success=True )
    • 0x74b303dd79bbf44d23d60891bdd0f31df87bc7b8.beabacc8( )
      • Ledger.transfer( _from=0x5513FF35B8cC25F126BFBccc8D2bF91fcC023522, _to=0x85dfDc9579e21a87013956ED584483468f5969d6, _value=251100000000 ) => ( success=True )
      • Token.transfer( _to=0xFFcbF62c00B6EC4dA7CBef6D61f68F890030017c, _value=100000000000000 ) => ( success=True )
        • 0x74b303dd79bbf44d23d60891bdd0f31df87bc7b8.beabacc8( )
          • Ledger.transfer( _from=0x5513FF35B8cC25F126BFBccc8D2bF91fcC023522, _to=0xFFcbF62c00B6EC4dA7CBef6D61f68F890030017c, _value=100000000000000 ) => ( success=True )
          • Token.transfer( _to=0x76e275fbb8bC233d4EFb9C20B6e2DDB408402ACe, _value=0 ) => ( success=True )
            • 0x74b303dd79bbf44d23d60891bdd0f31df87bc7b8.beabacc8( )
              • Ledger.transfer( _from=0x5513FF35B8cC25F126BFBccc8D2bF91fcC023522, _to=0x76e275fbb8bC233d4EFb9C20B6e2DDB408402ACe, _value=0 ) => ( success=True )
              • Token.transfer( _to=0x509347488209F80dC1d97076591DB92A023556ef, _value=0 ) => ( success=True )
                • 0x74b303dd79bbf44d23d60891bdd0f31df87bc7b8.beabacc8( )
                  • Ledger.transfer( _from=0x5513FF35B8cC25F126BFBccc8D2bF91fcC023522, _to=0x509347488209F80dC1d97076591DB92A023556ef, _value=0 ) => ( success=True )
                    File 1 of 2: Token
                    pragma solidity >=0.4.4;
                    
                    //from Zeppelin
                    contract SafeMath {
                        function safeMul(uint a, uint b) internal returns (uint) {
                            uint c = a * b;
                            assert(a == 0 || c / a == b);
                            return c;
                        }
                    
                        function safeSub(uint a, uint b) internal returns (uint) {
                            assert(b <= a);
                            return a - b;
                        }
                    
                        function safeAdd(uint a, uint b) internal returns (uint) {
                            uint c = a + b;
                            assert(c>=a && c>=b);
                            return c;
                        }
                    
                        function assert(bool assertion) internal {
                            if (!assertion) throw;
                        }
                    }
                    
                    contract Owned {
                        address public owner;
                    
                        function Owned() {
                            owner = msg.sender;
                        }
                    
                        modifier onlyOwner() {
                            if (msg.sender != owner) throw;
                            _;
                        }
                    
                        address newOwner;
                    
                        function changeOwner(address _newOwner) onlyOwner {
                            newOwner = _newOwner;
                        }
                    
                        function acceptOwnership() {
                            if (msg.sender == newOwner) {
                                owner = newOwner;
                            }
                        }
                    }
                    
                    contract Finalizable is Owned {
                        bool public finalized;
                    
                        function finalize() onlyOwner {
                            finalized = true;
                        }
                    
                        modifier notFinalized() {
                            if (finalized) throw;
                            _;
                        }
                    }
                    
                    contract IToken {
                        function transfer(address _to, uint _value) returns (bool);
                        function balanceOf(address owner) returns(uint);
                    }
                    
                    contract TokenReceivable is Owned {
                        event logTokenTransfer(address token, address to, uint amount);
                    
                        function claimTokens(address _token, address _to) onlyOwner returns (bool) {
                            IToken token = IToken(_token);
                            uint balance = token.balanceOf(this);
                            if (token.transfer(_to, balance)) {
                                logTokenTransfer(_token, _to, balance);
                                return true;
                            }
                            return false;
                        }
                    }
                    
                    contract EventDefinitions {
                        event Transfer(address indexed from, address indexed to, uint value);
                        event Approval(address indexed owner, address indexed spender, uint value);
                    }
                    
                    contract Token is Finalizable, TokenReceivable, SafeMath, EventDefinitions {
                    
                        string public name = "FunFair";
                        uint8 public decimals = 8;
                        string public symbol = "FUN";
                    
                        Controller controller;
                        address owner;
                    
                        modifier onlyController() {
                            assert(msg.sender == address(controller));
                            _;
                        }
                    
                        function setController(address _c) onlyOwner notFinalized {
                            controller = Controller(_c);
                        }
                    
                        function balanceOf(address a) constant returns (uint) {
                            return controller.balanceOf(a);
                        }
                    
                        function totalSupply() constant returns (uint) {
                            return controller.totalSupply();
                        }
                    
                        function allowance(address _owner, address _spender) constant returns (uint) {
                            return controller.allowance(_owner, _spender);
                        }
                    
                        function transfer(address _to, uint _value)
                        onlyPayloadSize(2)
                        returns (bool success) {
                           success = controller.transfer(msg.sender, _to, _value);
                            if (success) {
                                Transfer(msg.sender, _to, _value);
                            }
                        }
                    
                        function transferFrom(address _from, address _to, uint _value)
                        onlyPayloadSize(3)
                        returns (bool success) {
                           success = controller.transferFrom(msg.sender, _from, _to, _value);
                            if (success) {
                                Transfer(_from, _to, _value);
                            }
                        }
                    
                        function approve(address _spender, uint _value)
                        onlyPayloadSize(2)
                        returns (bool success) {
                            //promote safe user behavior
                            if (controller.allowance(msg.sender, _spender) > 0) throw;
                    
                            success = controller.approve(msg.sender, _spender, _value);
                            if (success) {
                                Approval(msg.sender, _spender, _value);
                            }
                        }
                    
                        function increaseApproval (address _spender, uint _addedValue)
                        onlyPayloadSize(2)
                        returns (bool success) {
                            success = controller.increaseApproval(msg.sender, _spender, _addedValue);
                            if (success) {
                                uint newval = controller.allowance(msg.sender, _spender);
                                Approval(msg.sender, _spender, newval);
                            }
                        }
                    
                        function decreaseApproval (address _spender, uint _subtractedValue)
                        onlyPayloadSize(2)
                        returns (bool success) {
                            success = controller.decreaseApproval(msg.sender, _spender, _subtractedValue);
                            if (success) {
                                uint newval = controller.allowance(msg.sender, _spender);
                                Approval(msg.sender, _spender, newval);
                            }
                        }
                    
                        modifier onlyPayloadSize(uint numwords) {
                            assert(msg.data.length >= numwords * 32 + 4);
                            _;
                        }
                    
                        function burn(uint _amount) {
                            controller.burn(msg.sender, _amount);
                            Transfer(msg.sender, 0x0, _amount);
                        }
                    
                        function controllerTransfer(address _from, address _to, uint _value)
                        onlyController {
                            Transfer(_from, _to, _value);
                        }
                    
                        function controllerApprove(address _owner, address _spender, uint _value)
                        onlyController {
                            Approval(_owner, _spender, _value);
                        }
                    
                        // multi-approve, multi-transfer
                    
                        bool public multilocked;
                    
                        modifier notMultilocked {
                            assert(!multilocked);
                            _;
                        }
                    
                        //do we want lock permanent? I think so.
                        function lockMultis() onlyOwner {
                            multilocked = true;
                        }
                    
                        // multi functions just issue events, to fix initial event history
                    
                        function multiTransfer(uint[] bits) onlyOwner notMultilocked {
                            if (bits.length % 3 != 0) throw;
                            for (uint i=0; i<bits.length; i += 3) {
                                address from = address(bits[i]);
                                address to = address(bits[i+1]);
                                uint amount = bits[i+2];
                                Transfer(from, to, amount);
                            }
                        }
                    
                        function multiApprove(uint[] bits) onlyOwner notMultilocked {
                            if (bits.length % 3 != 0) throw;
                            for (uint i=0; i<bits.length; i += 3) {
                                address owner = address(bits[i]);
                                address spender = address(bits[i+1]);
                                uint amount = bits[i+2];
                                Approval(owner, spender, amount);
                            }
                        }
                    
                        string public motd;
                        event Motd(string message);
                        function setMotd(string _m) onlyOwner {
                            motd = _m;
                            Motd(_m);
                        }
                    }
                    
                    contract Controller is Owned, Finalizable {
                        Ledger public ledger;
                        address public token;
                    
                        function setToken(address _token) onlyOwner {
                            token = _token;
                        }
                    
                        function setLedger(address _ledger) onlyOwner {
                            ledger = Ledger(_ledger);
                        }
                    
                        modifier onlyToken() {
                            if (msg.sender != token) throw;
                            _;
                        }
                    
                        function totalSupply() constant returns (uint) {
                            return ledger.totalSupply();
                        }
                    
                        function balanceOf(address _a) onlyToken constant returns (uint) {
                            return Ledger(ledger).balanceOf(_a);
                        }
                    
                        function allowance(address _owner, address _spender)
                        onlyToken constant returns (uint) {
                            return ledger.allowance(_owner, _spender);
                        }
                    
                        function transfer(address _from, address _to, uint _value)
                        onlyToken
                        returns (bool success) {
                            return ledger.transfer(_from, _to, _value);
                        }
                    
                        function transferFrom(address _spender, address _from, address _to, uint _value)
                        onlyToken
                        returns (bool success) {
                            return ledger.transferFrom(_spender, _from, _to, _value);
                        }
                    
                        function approve(address _owner, address _spender, uint _value)
                        onlyToken
                        returns (bool success) {
                            return ledger.approve(_owner, _spender, _value);
                        }
                    
                        function increaseApproval (address _owner, address _spender, uint _addedValue)
                        onlyToken
                        returns (bool success) {
                            return ledger.increaseApproval(_owner, _spender, _addedValue);
                        }
                    
                        function decreaseApproval (address _owner, address _spender, uint _subtractedValue)
                        onlyToken
                        returns (bool success) {
                            return ledger.decreaseApproval(_owner, _spender, _subtractedValue);
                        }
                    
                    
                        function burn(address _owner, uint _amount) onlyToken {
                            ledger.burn(_owner, _amount);
                        }
                    }
                    
                    contract Ledger is Owned, SafeMath, Finalizable {
                        address public controller;
                        mapping(address => uint) public balanceOf;
                        mapping (address => mapping (address => uint)) public allowance;
                        uint public totalSupply;
                    
                        function setController(address _controller) onlyOwner notFinalized {
                            controller = _controller;
                        }
                    
                        modifier onlyController() {
                            if (msg.sender != controller) throw;
                            _;
                        }
                    
                        function transfer(address _from, address _to, uint _value)
                        onlyController
                        returns (bool success) {
                            if (balanceOf[_from] < _value) return false;
                    
                            balanceOf[_from] = safeSub(balanceOf[_from], _value);
                            balanceOf[_to] = safeAdd(balanceOf[_to], _value);
                            return true;
                        }
                    
                        function transferFrom(address _spender, address _from, address _to, uint _value)
                        onlyController
                        returns (bool success) {
                            if (balanceOf[_from] < _value) return false;
                    
                            var allowed = allowance[_from][_spender];
                            if (allowed < _value) return false;
                    
                            balanceOf[_to] = safeAdd(balanceOf[_to], _value);
                            balanceOf[_from] = safeSub(balanceOf[_from], _value);
                            allowance[_from][_spender] = safeSub(allowed, _value);
                            return true;
                        }
                    
                        function approve(address _owner, address _spender, uint _value)
                        onlyController
                        returns (bool success) {
                            //require user to set to zero before resetting to nonzero
                            if ((_value != 0) && (allowance[_owner][_spender] != 0)) {
                                return false;
                            }
                    
                            allowance[_owner][_spender] = _value;
                            return true;
                        }
                    
                        function increaseApproval (address _owner, address _spender, uint _addedValue)
                        onlyController
                        returns (bool success) {
                            uint oldValue = allowance[_owner][_spender];
                            allowance[_owner][_spender] = safeAdd(oldValue, _addedValue);
                            return true;
                        }
                    
                        function decreaseApproval (address _owner, address _spender, uint _subtractedValue)
                        onlyController
                        returns (bool success) {
                            uint oldValue = allowance[_owner][_spender];
                            if (_subtractedValue > oldValue) {
                                allowance[_owner][_spender] = 0;
                            } else {
                                allowance[_owner][_spender] = safeSub(oldValue, _subtractedValue);
                            }
                            return true;
                        }
                    
                        event LogMint(address indexed owner, uint amount);
                        event LogMintingStopped();
                    
                        function mint(address _a, uint _amount) onlyOwner mintingActive {
                            balanceOf[_a] += _amount;
                            totalSupply += _amount;
                            LogMint(_a, _amount);
                        }
                    
                        bool public mintingStopped;
                    
                        function stopMinting() onlyOwner {
                            mintingStopped = true;
                            LogMintingStopped();
                        }
                    
                        modifier mintingActive() {
                            if (mintingStopped) throw;
                            _;
                        }
                    
                        function burn(address _owner, uint _amount) onlyController {
                            balanceOf[_owner] = safeSub(balanceOf[_owner], _amount);
                            totalSupply = safeSub(totalSupply, _amount);
                        }
                    }

                    File 2 of 2: Ledger
                    pragma solidity >=0.4.4;
                    
                    //from Zeppelin
                    contract SafeMath {
                        function safeMul(uint a, uint b) internal returns (uint) {
                            uint c = a * b;
                            assert(a == 0 || c / a == b);
                            return c;
                        }
                    
                        function safeSub(uint a, uint b) internal returns (uint) {
                            assert(b <= a);
                            return a - b;
                        }
                    
                        function safeAdd(uint a, uint b) internal returns (uint) {
                            uint c = a + b;
                            assert(c>=a && c>=b);
                            return c;
                        }
                    
                        function assert(bool assertion) internal {
                            if (!assertion) throw;
                        }
                    }
                    
                    contract Owned {
                        address public owner;
                    
                        function Owned() {
                            owner = msg.sender;
                        }
                    
                        modifier onlyOwner() {
                            if (msg.sender != owner) throw;
                            _;
                        }
                    
                        address newOwner;
                    
                        function changeOwner(address _newOwner) onlyOwner {
                            newOwner = _newOwner;
                        }
                    
                        function acceptOwnership() {
                            if (msg.sender == newOwner) {
                                owner = newOwner;
                            }
                        }
                    }
                    
                    contract Finalizable is Owned {
                        bool public finalized;
                    
                        function finalize() onlyOwner {
                            finalized = true;
                        }
                    
                        modifier notFinalized() {
                            if (finalized) throw;
                            _;
                        }
                    }
                    
                    contract IToken {
                        function transfer(address _to, uint _value) returns (bool);
                        function balanceOf(address owner) returns(uint);
                    }
                    
                    contract TokenReceivable is Owned {
                        event logTokenTransfer(address token, address to, uint amount);
                    
                        function claimTokens(address _token, address _to) onlyOwner returns (bool) {
                            IToken token = IToken(_token);
                            uint balance = token.balanceOf(this);
                            if (token.transfer(_to, balance)) {
                                logTokenTransfer(_token, _to, balance);
                                return true;
                            }
                            return false;
                        }
                    }
                    
                    contract EventDefinitions {
                        event Transfer(address indexed from, address indexed to, uint value);
                        event Approval(address indexed owner, address indexed spender, uint value);
                    }
                    
                    contract Token is Finalizable, TokenReceivable, SafeMath, EventDefinitions {
                    
                        string public name = "FunFair";
                        uint8 public decimals = 8;
                        string public symbol = "FUN";
                    
                        Controller controller;
                        address owner;
                    
                        function setController(address _c) onlyOwner notFinalized {
                            controller = Controller(_c);
                        }
                    
                        function balanceOf(address a) constant returns (uint) {
                            return controller.balanceOf(a);
                        }
                    
                        function totalSupply() constant returns (uint) {
                            return controller.totalSupply();
                        }
                    
                        function allowance(address _owner, address _spender) constant returns (uint) {
                            return controller.allowance(_owner, _spender);
                        }
                    
                        function transfer(address _to, uint _value)
                        onlyPayloadSize(2)
                        returns (bool success) {
                           success = controller.transfer(msg.sender, _to, _value);
                            if (success) {
                                Transfer(msg.sender, _to, _value);
                            }
                        }
                    
                        function transferFrom(address _from, address _to, uint _value)
                        onlyPayloadSize(3)
                        returns (bool success) {
                           success = controller.transferFrom(msg.sender, _from, _to, _value);
                            if (success) {
                                Transfer(_from, _to, _value);
                            }
                        }
                    
                        function approve(address _spender, uint _value)
                        onlyPayloadSize(2)
                        returns (bool success) {
                            //promote safe user behavior
                            if (controller.allowance(msg.sender, _spender) > 0) throw;
                    
                            success = controller.approve(msg.sender, _spender, _value);
                            if (success) {
                                Approval(msg.sender, _spender, _value);
                            }
                        }
                    
                        function increaseApproval (address _spender, uint _addedValue)
                        onlyPayloadSize(2)
                        returns (bool success) {
                            success = controller.increaseApproval(msg.sender, _spender, _addedValue);
                            if (success) {
                                uint newval = controller.allowance(msg.sender, _spender);
                                Approval(msg.sender, _spender, newval);
                            }
                        }
                    
                        function decreaseApproval (address _spender, uint _subtractedValue)
                        onlyPayloadSize(2)
                        returns (bool success) {
                            success = controller.decreaseApproval(msg.sender, _spender, _subtractedValue);
                            if (success) {
                                uint newval = controller.allowance(msg.sender, _spender);
                                Approval(msg.sender, _spender, newval);
                            }
                        }
                    
                        modifier onlyPayloadSize(uint numwords) {
                        assert(msg.data.length == numwords * 32 + 4);
                            _;
                        }
                    
                        function burn(uint _amount) {
                            controller.burn(msg.sender, _amount);
                            Transfer(msg.sender, 0x0, _amount);
                        }
                    }
                    
                    contract Controller is Owned, Finalizable {
                        Ledger public ledger;
                        address public token;
                    
                        function setToken(address _token) onlyOwner {
                            token = _token;
                        }
                    
                        function setLedger(address _ledger) onlyOwner {
                            ledger = Ledger(_ledger);
                        }
                    
                        modifier onlyToken() {
                            if (msg.sender != token) throw;
                            _;
                        }
                    
                        function totalSupply() constant returns (uint) {
                            return ledger.totalSupply();
                        }
                    
                        function balanceOf(address _a) onlyToken constant returns (uint) {
                            return Ledger(ledger).balanceOf(_a);
                        }
                    
                        function allowance(address _owner, address _spender)
                        onlyToken constant returns (uint) {
                            return ledger.allowance(_owner, _spender);
                        }
                    
                        function transfer(address _from, address _to, uint _value)
                        onlyToken
                        returns (bool success) {
                            return ledger.transfer(_from, _to, _value);
                        }
                    
                        function transferFrom(address _spender, address _from, address _to, uint _value)
                        onlyToken
                        returns (bool success) {
                            return ledger.transferFrom(_spender, _from, _to, _value);
                        }
                    
                        function approve(address _owner, address _spender, uint _value)
                        onlyToken
                        returns (bool success) {
                            return ledger.approve(_owner, _spender, _value);
                        }
                    
                        function increaseApproval (address _owner, address _spender, uint _addedValue)
                        onlyToken
                        returns (bool success) {
                            return ledger.increaseApproval(_owner, _spender, _addedValue);
                        }
                    
                        function decreaseApproval (address _owner, address _spender, uint _subtractedValue)
                        onlyToken
                        returns (bool success) {
                            return ledger.decreaseApproval(_owner, _spender, _subtractedValue);
                        }
                    
                    
                        function burn(address _owner, uint _amount) onlyToken {
                            ledger.burn(_owner, _amount);
                        }
                    }
                    
                    contract Ledger is Owned, SafeMath, Finalizable {
                        address public controller;
                        mapping(address => uint) public balanceOf;
                        mapping (address => mapping (address => uint)) public allowance;
                        uint public totalSupply;
                    
                        function setController(address _controller) onlyOwner notFinalized {
                            controller = _controller;
                        }
                    
                        modifier onlyController() {
                            if (msg.sender != controller) throw;
                            _;
                        }
                    
                        function transfer(address _from, address _to, uint _value)
                        onlyController
                        returns (bool success) {
                            if (balanceOf[_from] < _value) return false;
                    
                            balanceOf[_from] = safeSub(balanceOf[_from], _value);
                            balanceOf[_to] = safeAdd(balanceOf[_to], _value);
                            return true;
                        }
                    
                        function transferFrom(address _spender, address _from, address _to, uint _value)
                        onlyController
                        returns (bool success) {
                            if (balanceOf[_from] < _value) return false;
                    
                            var allowed = allowance[_from][_spender];
                            if (allowed < _value) return false;
                    
                            balanceOf[_to] = safeAdd(balanceOf[_to], _value);
                            balanceOf[_from] = safeSub(balanceOf[_from], _value);
                            allowance[_from][_spender] = safeSub(allowed, _value);
                            return true;
                        }
                    
                        function approve(address _owner, address _spender, uint _value)
                        onlyController
                        returns (bool success) {
                            //require user to set to zero before resetting to nonzero
                            if ((_value != 0) && (allowance[_owner][_spender] != 0)) {
                                return false;
                            }
                    
                            allowance[_owner][_spender] = _value;
                            return true;
                        }
                    
                        function increaseApproval (address _owner, address _spender, uint _addedValue)
                        onlyController
                        returns (bool success) {
                            uint oldValue = allowance[_owner][_spender];
                            allowance[_owner][_spender] = safeAdd(oldValue, _addedValue);
                            return true;
                        }
                    
                        function decreaseApproval (address _owner, address _spender, uint _subtractedValue)
                        onlyController
                        returns (bool success) {
                            uint oldValue = allowance[_owner][_spender];
                            if (_subtractedValue > oldValue) {
                                allowance[_owner][_spender] = 0;
                            } else {
                                allowance[_owner][_spender] = safeSub(oldValue, _subtractedValue);
                            }
                            return true;
                        }
                    
                        event LogMint(address indexed owner, uint amount);
                        event LogMintingStopped();
                    
                        function mint(address _a, uint _amount) onlyOwner mintingActive {
                            balanceOf[_a] += _amount;
                            totalSupply += _amount;
                            LogMint(_a, _amount);
                        }
                    
                        function multiMint(uint[] bits) onlyOwner mintingActive {
                            for (uint i=0; i<bits.length; i++) {
                    	    address a = address(bits[i]>>96);
                    	    uint amount = bits[i]&((1<<96) - 1);
                    	    mint(a, amount);
                            }
                        }
                    
                        bool public mintingStopped;
                    
                        function stopMinting() onlyOwner {
                            mintingStopped = true;
                            LogMintingStopped();
                        }
                    
                        modifier mintingActive() {
                            if (mintingStopped) throw;
                            _;
                        }
                    
                        function burn(address _owner, uint _amount) onlyController {
                            balanceOf[_owner] = safeSub(balanceOf[_owner], _amount);
                            totalSupply = safeSub(totalSupply, _amount);
                        }
                    }