Here’s an article on how to pass arguments to a contract file in Solidity, along with an example of what might go wrong when testing a contract.
Passing Arguments to a Contract File in Solidity
When writing smart contracts in Solidity, one common task is passing arguments from the application that deployed the contract. This can be done using function calls on the contract instance or by modifying the contract code itself.
In this article, we’ll cover how to pass arguments to a contract file and troubleshoot when testing a contract returns 0.
Passing Arguments in the Deployed Contract
First, let’s assume that your deployed contract is HelioToken
with an event emitted called TotalSupply
. To call this function from another contract, you need to create an instance of HelioToken. However, it seems like you’re missing some code, so I’ll provide a basic example.
// 2_deploy_contract.js
const HelioToken = artifacts.require("HelioToken");
module.exports = function (deploy) {
const intialSupply = 1000000;
deployer.deploy(HelioToken, intialSupply);
// Now you can call the TotalSupply event
HelioToken.totalSupply().then(totalSupply => {
console.log("Total Supply: %s", totalSupply);
});
};
Testing a Contract with Passing Arguments
Now that we’ve deployed our contract and passed an argument, let’s test it using Truffle’s built-in testing environment. We’ll create two contracts: HelioToken
and ContractWithPassedArgument
.
// HelioToken.sol
pragma solidity ^0.6.0;
contract HelioToken {
mapping(address => uint256) public balances;
function totalSupply() external view returns (uint256) {
return balances[msg.sender];
}
function addBalance(uint256 amount, address who) public {
balances[who] += amount;
}
}
// ContractWithPassedArgument.sol
pragma solidity ^0.6.0;
contract ContractWithPassedArgument {
uint256 public passedAmount = 0;
mapping(address => uint256) public passedBalances;
function addBalance(uint256 amount, address who) public {
passedBalances[who] += amount;
}
function totalSupply() external view returns (uint256) {
return passedBalances[msg.sender];
}
}
Now let’s test our contracts.
// 1_deploy_contract.js
const HelioToken = artifacts.require("HelioToken"");
ContractWithPassedArgument calldata contractWithPassedArgument;
module.exports = function (deploy) {
const intialSupply = 1000000;
deployer.deploy(HelioToken, intialSupply);
// Now we can test our contract
contractWithPassedArgument.addBalance(intialSupply, msg.sender);
}
In the above example, when you run 1_deploy_contract.js
, it will deploy two contracts: HelioToken
and ContractWithPassedArgument
. Then, it adds a certain amount of HelioToken to the ContractWithPassedArgument
instance.
Troubleshooting Passing Arguments
Now that we’ve tested our contract, let’s troubleshoot why it returns 0 when testing. There are several reasons for this:
totalSupply()
and addBalance()
functions defined correctly, or if they’re not accessible from another contract, then passing arguments won’t work.HelioToken.totalSupply()
, but it’s actually an external call.To fix these issues: