contract SHx is UpgradeableToken {
  string public name;
  string public symbol;
  uint public decimals;

  /** Name and symbol were updated. */
  event UpdatedTokenInformation(string newName, string newSymbol);

  constructor(address _owner, string memory _name, string memory _symbol, uint _totalSupply, uint _decimals) public UpgradeableToken(_owner) {
    name = _name;
    symbol = _symbol;
    totalSupply = _totalSupply;
    decimals = _decimals;

    // Allocate initial balance to the owner
    balances[_owner] = _totalSupply;
  }

  /**
   * Owner can update token information here.
   *
   * It is often useful to conceal the actual token association, until
   * the token operations, like central issuance or reissuance have been completed.
   * In this case the initial token can be supplied with empty name and symbol information.
   *
   * This function allows the token owner to rename the token after the operations
   * have been completed and then point the audience to use the token contract.
   */
  function setTokenInformation(string memory _name, string memory _symbol) public {
    require(msg.sender == upgradeMaster);

    require(bytes(name).length == 0 && bytes(symbol).length == 0);

    name = _name;
    symbol = _symbol;
    emit UpdatedTokenInformation(name, symbol);
  }
}
/**
 * Centrally issued Ethereum token. The SHx issued here are 'cross-issued' from Stellar.
 * (GDSTRSHXHGJ7ZIVRBXEYE5Q74XUVCUSEKEBR7UCHEUUEK72N7I7KJ6JH:SHX)
 *
 * We mix in burnable and upgradeable traits.
 *
 * Token supply is created in the token contract creation and allocated to owner.
 * The owner can then transfer from its supply to crowdsale participants.
 * The owner, or anybody, can burn any excessive tokens they are holding.
 *
 */
function setTokenInformation(string memory _name, string memory _symbol) public {
  require(msg.sender == upgradeMaster);

  require(bytes(name).length == 0 && bytes(symbol).length == 0);

  name = _name;
  symbol = _symbol;
  emit UpdatedTokenInformation(name, symbol);
}

/**
 * Owner can update token information here.
 *
 * It is often useful to conceal the actual token association, until
 * the token operations, like central issuance or reissuance have been completed.
 * In this case the initial token can be supplied with empty name and symbol information.
 *
 * This function allows the token owner to rename the token after the operations
 * have been completed and then point the audience to use the token contract.
 */