Tengo un contrato con una función marcada como onlyOwner (de OpenZeppelin, por lo que solo la dirección que implementó el contrato puede llamarlo).
pragma solidity ^0.4.17;
import "./Ownable.sol";
contract MyContract {
function myFunction() public onlyOwner {
dummy();
}
}
He creado una prueba unitaria de Truffle/Solidity para ese contrato, pero cuando llamo a la función aparece un error, ya que la dirección de llamada es diferente a la dirección que implementó el contrato.
pragma solidity ^0.4.17;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/MyContract.sol";
contract TestMyContract {
MyContract contract = MyContract(DeployedAddresses.MyContract());
function testCanCallFunction() public {
myContract.myFunction();
}
}
¿Hay alguna manera de usar la misma dirección? ¿Y para hacer pruebas desde diferentes direcciones? Por ejemplo si quiero probar con un dueño y con otro. Sé que se puede hacer con pruebas de Javascript.
¡Gracias!
Puede asignar un remitente (así como otros valores transaccionales) al incluir los datos en la llamada de función. En su ejemplo específico, haría:
contract TestMyContract {
MyContract contract = MyContract(DeployedAddresses.MyContract());
function testCanCallFunction() public {
myContract.myFunction({from: accounts[0]);
}
}
accounts[0]
es la cuenta de implementación predeterminada. Al hacer esto, está llamando myContract.myFunction
como propietario.
Puede usar cualquier dirección que necesite en lugar de accounts[0]
.
Patricio