contract Token1st {

  address public currentTradingSystem;
  address public currentExchangeSystem;

  mapping(address => uint) public balanceOf;
  mapping(address => mapping (address => uint)) public allowance;
  mapping(address => mapping (address => uint)) public tradingBalanceOf;
  mapping(address => mapping (address => uint)) public exchangeBalanceOf;

  /* @notice get balance of a specific address */
  function getBalanceOf(address _address) view public returns (uint amount){
    return balanceOf[_address];
  }

  event Transfer (address _to, address _from, uint _decimalAmount);

  /* A contract or user attempts to get the coins */
  function transferDecimalAmountFrom(address _from, address _to, uint _value) public returns (bool success) {
    require(balanceOf[_from]
      - tradingBalanceOf[_from][currentTradingSystem]
      - exchangeBalanceOf[_from][currentExchangeSystem] >= _value);                 // Check if the sender has enough
    require(balanceOf[_to] + (_value) >= balanceOf[_to]);  // Check for overflows
    require(_value <= allowance[_from][msg.sender]);   // Check allowance
    balanceOf[_from] -= _value;                          // Subtract from the sender
    balanceOf[_to] += _value;                            // Add the same to the recipient
    allowance[_from][msg.sender] -= _value;
    Transfer(_to, _from, _value);
    return true;
  }

    /* Allow another contract or user to spend some tokens in your behalf */
  function approveSpenderDecimalAmount(address _spender, uint _value) public returns (bool success) {
    allowance[msg.sender][_spender] = _value;
    return true;
  }

}
function transferDecimalAmountFrom(address _from, address _to, uint _value) public returns (bool success) {
  require(balanceOf[_from]
    - tradingBalanceOf[_from][currentTradingSystem]
    - exchangeBalanceOf[_from][currentExchangeSystem] >= _value);                 // Check if the sender has enough
  require(balanceOf[_to] + (_value) >= balanceOf[_to]);  // Check for overflows
  require(_value <= allowance[_from][msg.sender]);   // Check allowance
  balanceOf[_from] -= _value;                          // Subtract from the sender
  balanceOf[_to] += _value;                            // Add the same to the recipient
  allowance[_from][msg.sender] -= _value;
  Transfer(_to, _from, _value);
  return true;
}

/* A contract or user attempts to get the coins */