Si la función de un contrato llama a una función de otro contrato dentro de él, ¿la dirección del contrato es el msg.sender?

Por ejemplo, un contrato de venta colectiva tiene una función que crea un token ERC20 llamado "token" utilizando un contrato de token que ya está definido más adelante en el código que se está implementando. El constructor contiene

token = createTokenContract();

Y el método createTokenContract() contiene:

function createTokenContract() internal returns (TierToken) {
    return new ERC20Token();
}

Cuando dentro de una función de pago en el crowdsale ahora llama a una función de "token" dentro de mi contrato de crowdsale como

token.transfer(beneficiary, tokenAmount);

Dentro de esa llamada, ¿quién es el msg.sender? La función de transferencia es de la implementación de OpenZeppelins, por lo que contiene:

    function transfer(address _to, uint256 _value) public returns (bool success) {
      require(_to != address(0)); //not sending to burn address
      require(_value <= balances[msg.sender]); // If the sender has sufficient funds to send
      require(_value>0);// and the amount is not zero or negative

      // SafeMath.sub will throw if there is not enough balance.
      balances[msg.sender] = balances[msg.sender].sub(_value);
      balances[_to] = balances[_to].add(_value);
      Transfer(msg.sender, _to, _value);
      return true;
   }

En estas consultas de saldo y transferencias donde usa balances[msg.sender], ¿ese remitente ahora es la dirección del contrato de crowdsale que contenía la llamada a esta función? ¿O es el remitente el usuario que envió el éter al contrato (que luego hizo la llamada a la función de token)?

Esto puede ser simple, pero no puedo encontrarlo bien explicado en los documentos en términos de msg.sender en relación con las funciones de llamada de contratos de otros contratos.

Gracias por cualquier ayuda.

Respuestas (1)

Si la función de un contrato llama a una función de otro contrato dentro de él, ¿la dirección del contrato es el msg.sender?

si.

tx.origines la cuenta externa que envió la transacción.

De los documentos de Solidity:

msg.sender (dirección): remitente del mensaje (llamada actual)

tx.origin (dirección): remitente de la transacción (cadena de llamada completa)