ETH Price: $1,873.40 (-0.25%)

Transaction Decoder

Block:
16980614 at Apr-05-2023 05:46:11 AM +UTC
Transaction Fee:
0.00130364883002498 ETH $2.44
Gas Used:
44,615 Gas / 29.219967052 Gwei

Emitted Events:

164 AdminUpgradeabilityProxy.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x00000000000000000000000020e241eea0a386264e3262e53e08938491f52580, 0x00000000000000000000000056e1b883a7ee8c948d014af899e2710b8b89de6d, 0000000000000000000000000000000000000000000000000000000001c9c380 )

Account State Difference:

  Address   Before After State Difference Code
0x20e241ee...491f52580
0.021042666415547845 Eth
Nonce: 12
0.019739017585522865 Eth
Nonce: 13
0.00130364883002498
(builder0x69)
2.145777238231033347 Eth2.145781699731033347 Eth0.0000044615
0x9BE89D2a...995C22541

Execution Trace

AdminUpgradeabilityProxy.a9059cbb( )
  • BinancePeggyToken.transfer( _to=0x56e1b883a7ee8c948d014aF899E2710B8B89dE6d, _value=30000000 ) => ( True )
    File 1 of 2: AdminUpgradeabilityProxy
    // File: contracts/ethereum/AdminUpgradeabilityProxy.sol
    
    /**
     *Submitted for verification at Etherscan.io on 2019-09-09
    */
    
    // File: contracts/zeppelin/Proxy.sol
    
    pragma solidity 0.4.24;
    
    /**
     * @title Proxy
     * @dev Implements delegation of calls to other contracts, with proper
     * forwarding of return values and bubbling of failures.
     * It defines a fallback function that delegates all calls to the address
     * returned by the abstract _implementation() internal function.
     */
    contract Proxy {
        /**
         * @dev Fallback function.
         * Implemented entirely in `_fallback`.
         */
        function () payable external {
            _fallback();
        }
    
        /**
         * @return The Address of the implementation.
         */
        function _implementation() internal view returns (address);
    
        /**
         * @dev Delegates execution to an implementation contract.
         * This is a low level function that doesn't return to its internal call site.
         * It will return to the external caller whatever the implementation returns.
         * @param implementation Address to delegate.
         */
        function _delegate(address implementation) internal {
            assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
                calldatacopy(0, 0, calldatasize)
    
            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
                let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0)
    
            // Copy the returned data.
                returndatacopy(0, 0, returndatasize)
    
                switch result
                // delegatecall returns 0 on error.
                case 0 { revert(0, returndatasize) }
                default { return(0, returndatasize) }
            }
        }
    
        /**
         * @dev Function that is run as the first thing in the fallback function.
         * Can be redefined in derived contracts to add functionality.
         * Redefinitions must call super._willFallback().
         */
        function _willFallback() internal {
        }
    
        /**
         * @dev fallback implementation.
         * Extracted to enable manual triggering.
         */
        function _fallback() internal {
            _willFallback();
            _delegate(_implementation());
        }
    }
    
    // File: contracts/zeppelin/AddressUtils.sol
    
    pragma solidity 0.4.24;
    
    
    /**
     * Utility library of inline functions on addresses
     */
    library AddressUtils {
    
        /**
         * Returns whether the target address is a contract
         * @dev This function will return false if invoked during the constructor of a contract,
         * as the code is not actually created until after the constructor finishes.
         * @param addr address to check
         * @return whether the target address is a contract
         */
        function isContract(address addr) internal view returns (bool) {
            uint256 size;
            // XXX Currently there is no better way to check if there is a contract in an address
            // than to check the size of the code at that address.
            // See https://ethereum.stackexchange.com/a/14016/36603
            // for more details about how this works.
            // TODO Check this again before the Serenity release, because all addresses will be
            // contracts then.
            // solium-disable-next-line security/no-inline-assembly
            assembly { size := extcodesize(addr) }
            return size > 0;
        }
    
    }
    
    // File: contracts/zeppelin/UpgradeabilityProxy.sol
    
    pragma solidity 0.4.24;
    
    
    
    /**
     * @title UpgradeabilityProxy
     * @dev This contract implements a proxy that allows to change the
     * implementation address to which it will delegate.
     * Such a change is called an implementation upgrade.
     */
    contract UpgradeabilityProxy is Proxy {
        /**
         * @dev Emitted when the implementation is upgraded.
         * @param implementation Address of the new implementation.
         */
        event Upgraded(address implementation);
    
        /**
         * @dev Storage slot with the address of the current implementation.
         * This is the keccak-256 hash of "org.zeppelinos.proxy.implementation", and is
         * validated in the constructor.
         */
        bytes32 private constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3;
    
        /**
         * @dev Contract constructor.
         * @param _implementation Address of the initial implementation.
         */
        constructor(address _implementation) public {
            assert(IMPLEMENTATION_SLOT == keccak256("org.zeppelinos.proxy.implementation"));
    
            _setImplementation(_implementation);
        }
    
        /**
         * @dev Returns the current implementation.
         * @return Address of the current implementation
         */
        function _implementation() internal view returns (address impl) {
            bytes32 slot = IMPLEMENTATION_SLOT;
            assembly {
                impl := sload(slot)
            }
        }
    
        /**
         * @dev Upgrades the proxy to a new implementation.
         * @param newImplementation Address of the new implementation.
         */
        function _upgradeTo(address newImplementation) internal {
            _setImplementation(newImplementation);
            emit Upgraded(newImplementation);
        }
    
        /**
         * @dev Sets the implementation address of the proxy.
         * @param newImplementation Address of the new implementation.
         */
        function _setImplementation(address newImplementation) private {
            require(AddressUtils.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address");
    
            bytes32 slot = IMPLEMENTATION_SLOT;
    
            assembly {
                sstore(slot, newImplementation)
            }
        }
    }
    
    // File: contracts/zeppelin/AdminUpgradeabilityProxy.sol
    
    pragma solidity 0.4.24;
    
    
    /**
     * @title AdminUpgradeabilityProxy
     * @dev This contract combines an upgradeability proxy with an authorization
     * mechanism for administrative tasks.
     * All external functions in this contract must be guarded by the
     * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity
     * feature proposal that would enable this to be done automatically.
     */
    contract AdminUpgradeabilityProxy is UpgradeabilityProxy {
        /**
         * @dev Emitted when the administration has been transferred.
         * @param previousAdmin Address of the previous admin.
         * @param newAdmin Address of the new admin.
         */
        event AdminChanged(address previousAdmin, address newAdmin);
    
        /**
         * @dev Storage slot with the admin of the contract.
         * This is the keccak-256 hash of "org.zeppelinos.proxy.admin", and is
         * validated in the constructor.
         */
        bytes32 private constant ADMIN_SLOT = 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b;
    
        /**
         * @dev Modifier to check whether the `msg.sender` is the admin.
         * If it is, it will run the function. Otherwise, it will delegate the call
         * to the implementation.
         */
        modifier ifAdmin() {
            if (msg.sender == _admin()) {
                _;
            } else {
                _fallback();
            }
        }
    
        /**
         * Contract constructor.
         * It sets the `msg.sender` as the proxy administrator.
         * @param _implementation address of the initial implementation.
         */
        constructor(address _implementation) UpgradeabilityProxy(_implementation) public {
            assert(ADMIN_SLOT == keccak256("org.zeppelinos.proxy.admin"));
    
            _setAdmin(msg.sender);
        }
    
        /**
         * @return The address of the proxy admin.
         */
        function admin() external view ifAdmin returns (address) {
            return _admin();
        }
    
        /**
         * @return The address of the implementation.
         */
        function implementation() external view ifAdmin returns (address) {
            return _implementation();
        }
    
        /**
         * @dev Changes the admin of the proxy.
         * Only the current admin can call this function.
         * @param newAdmin Address to transfer proxy administration to.
         */
        function changeAdmin(address newAdmin) external ifAdmin {
            require(newAdmin != address(0), "Cannot change the admin of a proxy to the zero address");
            emit AdminChanged(_admin(), newAdmin);
            _setAdmin(newAdmin);
        }
    
        /**
         * @dev Upgrade the backing implementation of the proxy.
         * Only the admin can call this function.
         * @param newImplementation Address of the new implementation.
         */
        function upgradeTo(address newImplementation) external ifAdmin {
            _upgradeTo(newImplementation);
        }
    
        /**
         * @dev Upgrade the backing implementation of the proxy and call a function
         * on the new implementation.
         * This is useful to initialize the proxied contract.
         * @param newImplementation Address of the new implementation.
         * @param data Data to send as msg.data in the low level call.
         * It should include the signature and the parameters of the function to be
         * called, as described in
         * https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector-and-argument-encoding.
         */
        function upgradeToAndCall(address newImplementation, bytes data) payable external ifAdmin {
            _upgradeTo(newImplementation);
            require(address(this).call.value(msg.value)(data));
        }
    
        /**
         * @return The admin slot.
         */
        function _admin() internal view returns (address adm) {
            bytes32 slot = ADMIN_SLOT;
            assembly {
                adm := sload(slot)
            }
        }
    
        /**
         * @dev Sets the address of the proxy admin.
         * @param newAdmin Address of the new proxy admin.
         */
        function _setAdmin(address newAdmin) internal {
            bytes32 slot = ADMIN_SLOT;
    
            assembly {
                sstore(slot, newAdmin)
            }
        }
    
        /**
         * @dev Only fall back when the sender is not the admin.
         */
        function _willFallback() internal {
            require(msg.sender != _admin(), "Cannot call fallback function from the proxy admin");
            super._willFallback();
        }
    }

    File 2 of 2: BinancePeggyToken
    // File: contracts/ethereum/BinancePeggyToken.sol
    
    /**
     *Submitted for verification at Etherscan.io on 2018-11-24
    */
    
    pragma solidity 0.4.24;
    
    // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol
    
    /**
     * @title ERC20Basic
     * @dev Simpler version of ERC20 interface
     * See https://github.com/ethereum/EIPs/issues/179
     */
    contract ERC20Basic {
        function totalSupply() public view returns (uint256);
        function balanceOf(address _who) public view returns (uint256);
        function transfer(address _to, uint256 _value) public returns (bool);
        event Transfer(address indexed from, address indexed to, uint256 value);
    }
    
    // File: openzeppelin-solidity/contracts/math/SafeMath.sol
    
    /**
     * @title SafeMath
     * @dev Math operations with safety checks that throw on error
     */
    library SafeMath {
    
        /**
        * @dev Multiplies two numbers, throws on overflow.
        */
        function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
            // Gas optimization: this is cheaper than asserting '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;
            }
    
            c = _a * _b;
            assert(c / _a == _b);
            return c;
        }
    
        /**
        * @dev Integer division of two numbers, truncating the quotient.
        */
        function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
            // assert(_b > 0); // Solidity automatically throws when dividing by 0
            // uint256 c = _a / _b;
            // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
            return _a / _b;
        }
    
        /**
        * @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) {
            assert(_b <= _a);
            return _a - _b;
        }
    
        /**
        * @dev Adds two numbers, throws on overflow.
        */
        function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
            c = _a + _b;
            assert(c >= _a);
            return c;
        }
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol
    
    /**
     * @title Basic token
     * @dev Basic version of StandardToken, with no allowances.
     */
    contract BasicToken is ERC20Basic {
        using SafeMath for uint256;
    
        mapping(address => uint256) internal balances;
    
        uint256 internal totalSupply_;
    
        /**
        * @dev Total number of tokens in existence
        */
        function totalSupply() public view returns (uint256) {
            return totalSupply_;
        }
    
        /**
        * @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) {
            require(_value <= balances[msg.sender]);
            require(_to != address(0));
    
            balances[msg.sender] = balances[msg.sender].sub(_value);
            balances[_to] = balances[_to].add(_value);
            emit Transfer(msg.sender, _to, _value);
            return true;
        }
    
        /**
        * @dev Gets the balance of the specified address.
        * @param _owner The address to query the 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];
        }
    
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol
    
    /**
     * @title ERC20 interface
     * @dev see https://github.com/ethereum/EIPs/issues/20
     */
    contract ERC20 is ERC20Basic {
        function allowance(address _owner, address _spender)
        public view returns (uint256);
    
        function transferFrom(address _from, address _to, uint256 _value)
        public returns (bool);
    
        function approve(address _spender, uint256 _value) public returns (bool);
        event Approval(
            address indexed owner,
            address indexed spender,
            uint256 value
        );
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol
    
    /**
     * @title Standard ERC20 token
     *
     * @dev Implementation of the basic standard token.
     * https://github.com/ethereum/EIPs/issues/20
     * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
     */
    contract StandardToken is ERC20, BasicToken {
    
        mapping (address => mapping (address => uint256)) internal allowed;
    
    
        /**
         * @dev Transfer tokens from one address to another
         * @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)
        {
            require(_value <= balances[_from]);
            require(_value <= allowed[_from][msg.sender]);
            require(_to != address(0));
    
            balances[_from] = balances[_from].sub(_value);
            balances[_to] = balances[_to].add(_value);
            allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
            emit Transfer(_from, _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) {
            allowed[msg.sender][_spender] = _value;
            emit Approval(msg.sender, _spender, _value);
            return true;
        }
    
        /**
         * @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 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
         * @param _spender The address which will spend the funds.
         * @param _addedValue The amount of tokens to increase the allowance by.
         */
        function increaseApproval(
            address _spender,
            uint256 _addedValue
        )
        public
        returns (bool)
        {
            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
         * @param _spender The address which will spend the funds.
         * @param _subtractedValue The amount of tokens to decrease the allowance by.
         */
        function decreaseApproval(
            address _spender,
            uint256 _subtractedValue
        )
        public
        returns (bool)
        {
            uint256 oldValue = allowed[msg.sender][_spender];
            if (_subtractedValue >= oldValue) {
                allowed[msg.sender][_spender] = 0;
            } else {
                allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
            }
            emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
            return true;
        }
    
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/DetailedERC20.sol
    
    /**
     * @title DetailedERC20 token
     * @dev The decimals are only for visualization purposes.
     * All the operations are done using the smallest and indivisible token unit,
     * just as on Ethereum all the operations are done in wei.
     */
    contract DetailedERC20 is ERC20 {
        string public name;
        string public symbol;
        uint8 public decimals;
    
        constructor() public {
        }
    
        function initializeDetailedERC20(string memory _name, string memory _symbol, uint8 _decimals) internal {
            name = _name;
            symbol = _symbol;
            decimals = _decimals;
        }
    }
    
    // File: openzeppelin-solidity/contracts/ownership/Ownable.sol
    
    /**
     * @title Ownable
     * @dev The Ownable contract has an owner address, and provides basic authorization control
     * functions, this simplifies the implementation of "user permissions".
     */
    contract Ownable {
        address public owner;
    
    
        event OwnershipRenounced(address indexed previousOwner);
        event OwnershipTransferred(
            address indexed previousOwner,
            address indexed newOwner
        );
    
    
        /**
         * @dev The Ownable constructor sets the original `owner` of the contract to the sender
         * account.
         */
        constructor() public {
        }
    
        function initializeOwnable(address _owner) internal {
            owner = _owner;
        }
    
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            require(msg.sender == owner);
            _;
        }
    
        /**
         * @dev Allows the current owner to relinquish control of the contract.
         * @notice Renouncing to ownership will leave the contract without an owner.
         * It will not be possible to call the functions with the `onlyOwner`
         * modifier anymore.
         */
        function renounceOwnership() public onlyOwner {
            emit OwnershipRenounced(owner);
            owner = address(0);
        }
    
        /**
         * @dev Allows the current owner to transfer control of the contract to a newOwner.
         * @param _newOwner The address to transfer ownership to.
         */
        function transferOwnership(address _newOwner) public onlyOwner {
            _transferOwnership(_newOwner);
        }
    
        /**
         * @dev Transfers control of the contract to a newOwner.
         * @param _newOwner The address to transfer ownership to.
         */
        function _transferOwnership(address _newOwner) internal {
            require(_newOwner != address(0));
            emit OwnershipTransferred(owner, _newOwner);
            owner = _newOwner;
        }
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol
    
    /**
     * @title Mintable token
     * @dev Simple ERC20 Token example, with mintable token creation
     * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
     */
    contract MintableToken is StandardToken, Ownable {
        event Mint(address indexed to, uint256 amount);
        event MintFinished();
    
        bool public mintingFinished = false;
    
    
        modifier canMint() {
            require(!mintingFinished);
            _;
        }
    
        modifier hasMintPermission() {
            require(msg.sender == owner);
            _;
        }
    
        /**
         * @dev Function to mint tokens
         * @param _to The address that will receive the minted tokens.
         * @param _amount The amount of tokens to mint.
         * @return A boolean that indicates if the operation was successful.
         */
        function mint(
            address _to,
            uint256 _amount
        )
        public
        hasMintPermission
        canMint
        returns (bool)
        {
            totalSupply_ = totalSupply_.add(_amount);
            balances[_to] = balances[_to].add(_amount);
            emit Mint(_to, _amount);
            emit Transfer(address(0), _to, _amount);
            return true;
        }
    
        /**
         * @dev Function to stop minting new tokens.
         * @return True if the operation was successful.
         */
        function finishMinting() public onlyOwner canMint returns (bool) {
            mintingFinished = true;
            emit MintFinished();
            return true;
        }
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol
    
    /**
     * @title Burnable Token
     * @dev Token that can be irreversibly burned (destroyed).
     */
    contract BurnableToken is BasicToken {
    
        event Burn(address indexed burner, uint256 value);
    
        /**
         * @dev Burns a specific amount of tokens.
         * @param _value The amount of token to be burned.
         */
        function burn(uint256 _value) public {
            _burn(msg.sender, _value);
        }
    
        function _burn(address _who, uint256 _value) internal {
            require(_value <= balances[_who]);
            // no need to require value <= totalSupply, since that would imply the
            // sender's balance is greater than the totalSupply, which *should* be an assertion failure
    
            balances[_who] = balances[_who].sub(_value);
            totalSupply_ = totalSupply_.sub(_value);
            emit Burn(_who, _value);
            emit Transfer(_who, address(0), _value);
        }
    }
    
    // File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol
    
    /**
     * @title Pausable
     * @dev Base contract which allows children to implement an emergency stop mechanism.
     */
    contract Pausable is Ownable {
        event Pause();
        event Unpause();
    
        bool public paused = false;
    
    
        /**
         * @dev Modifier to make a function callable only when the contract is not paused.
         */
        modifier whenNotPaused() {
            require(!paused);
            _;
        }
    
        /**
         * @dev Modifier to make a function callable only when the contract is paused.
         */
        modifier whenPaused() {
            require(paused);
            _;
        }
    
        /**
         * @dev called by the owner to pause, triggers stopped state
         */
        function pause() public onlyOwner whenNotPaused {
            paused = true;
            emit Pause();
        }
    
        /**
         * @dev called by the owner to unpause, returns to normal state
         */
        function unpause() public onlyOwner whenPaused {
            paused = false;
            emit Unpause();
        }
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/PausableToken.sol
    
    /**
     * @title Pausable token
     * @dev StandardToken modified with pausable transfers.
     **/
    contract PausableToken is StandardToken, Pausable {
    
        function transfer(
            address _to,
            uint256 _value
        )
        public
        whenNotPaused
        returns (bool)
        {
            return super.transfer(_to, _value);
        }
    
        function transferFrom(
            address _from,
            address _to,
            uint256 _value
        )
        public
        whenNotPaused
        returns (bool)
        {
            return super.transferFrom(_from, _to, _value);
        }
    
        function approve(
            address _spender,
            uint256 _value
        )
        public
        whenNotPaused
        returns (bool)
        {
            return super.approve(_spender, _value);
        }
    
        function increaseApproval(
            address _spender,
            uint _addedValue
        )
        public
        whenNotPaused
        returns (bool success)
        {
            return super.increaseApproval(_spender, _addedValue);
        }
    
        function decreaseApproval(
            address _spender,
            uint _subtractedValue
        )
        public
        whenNotPaused
        returns (bool success)
        {
            return super.decreaseApproval(_spender, _subtractedValue);
        }
    }
    
    // File: openzeppelin-solidity/contracts/ownership/Claimable.sol
    
    /**
     * @title Claimable
     * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
     * This allows the new owner to accept the transfer.
     */
    contract Claimable is Ownable {
        address public pendingOwner;
    
        /**
         * @dev Modifier throws if called by any account other than the pendingOwner.
         */
        modifier onlyPendingOwner() {
            require(msg.sender == pendingOwner);
            _;
        }
    
        /**
         * @dev Allows the current owner to set the pendingOwner address.
         * @param newOwner The address to transfer ownership to.
         */
        function transferOwnership(address newOwner) public onlyOwner {
            pendingOwner = newOwner;
        }
    
        /**
         * @dev Allows the pendingOwner address to finalize the transfer.
         */
        function claimOwnership() public onlyPendingOwner {
            emit OwnershipTransferred(owner, pendingOwner);
            owner = pendingOwner;
            pendingOwner = address(0);
        }
    }
    
    // File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol
    
    /**
     * @title SafeERC20
     * @dev Wrappers around ERC20 operations that throw on failure.
     * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
     * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
     */
    library SafeERC20 {
        function safeTransfer(
            ERC20Basic _token,
            address _to,
            uint256 _value
        )
        internal
        {
            require(_token.transfer(_to, _value));
        }
    
        function safeTransferFrom(
            ERC20 _token,
            address _from,
            address _to,
            uint256 _value
        )
        internal
        {
            require(_token.transferFrom(_from, _to, _value));
        }
    
        function safeApprove(
            ERC20 _token,
            address _spender,
            uint256 _value
        )
        internal
        {
            require(_token.approve(_spender, _value));
        }
    }
    
    // File: openzeppelin-solidity/contracts/ownership/CanReclaimToken.sol
    
    /**
     * @title Contracts that should be able to recover tokens
     * @author SylTi
     * @dev This allow a contract to recover any ERC20 token received in a contract by transferring the balance to the contract owner.
     * This will prevent any accidental loss of tokens.
     */
    contract CanReclaimToken is Ownable {
        using SafeERC20 for ERC20Basic;
    
        /**
         * @dev Reclaim all ERC20Basic compatible tokens
         * @param _token ERC20Basic The address of the token contract
         */
        function reclaimToken(ERC20Basic _token) external onlyOwner {
            uint256 balance = _token.balanceOf(this);
            _token.safeTransfer(owner, balance);
        }
    
    }
    
    // File: contracts/utils/OwnableContract.sol
    
    // empty block is used as this contract just inherits others.
    contract OwnableContract is CanReclaimToken, Claimable { } /* solhint-disable-line no-empty-blocks */
    
    contract BinancePeggyToken is StandardToken, DetailedERC20,
    MintableToken, BurnableToken, PausableToken, OwnableContract {
    
        // INITIALIZATION DATA
        bool public initialized = false;
        /**
         * @dev sets 0 initials tokens, the owner, and the supplyController.
         * this serves as the constructor for the proxy but compiles to the
         * memory model of the Implementation contract.
         */
        function initialize(string name, string symbol, uint8 decimals, address owner) public {
            require(!initialized, "already initialized");
            initializeDetailedERC20(name, symbol, decimals);
            initializeOwnable(owner);
            initialized = true;
        }
    
        function burn(uint value) public onlyOwner {
            super.burn(value);
        }
    
        function finishMinting() public onlyOwner returns (bool) {
            return false;
        }
    
        function renounceOwnership() public onlyOwner {
            revert("renouncing ownership is blocked");
        }
    }