【合約互動】
我們可以使用 address()
將 contract
型態轉為 address
型態。
如果今天要使用同一個檔案裏面其他合約的函數,可以使用以下方法:
contract A {
function foo() view external returns(uint) {...}
}
contract B {
function callFoo(address addrA) external {
uint result = A(addrA).foo();
}
}
甚至可以在一個合約裡面宣告其他合約。
contract A {
constructor(uint a) {...}
function foo() external {...}
}
contract B {
function createA(uint a) external {
A AInstance = new A(a); //pass constructor argument(s) if any
}
}
Modifier, Inheritance, Importing
pragma solidity ^0.8.11;
contract Owned {
address owner;
constructor() public {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "You are not allowed");
_;
}
}
contract InheritanceModifierExample is Owned {
mapping(address => uint) public tokenBalance;
uint tokenPrice = 1 ether;
constructor() public {
tokenBalance[owner] = 100;
}
function createNewToken() public onlyOwner{
// require statement is originally here
tokenBalance[owner]++;
}
function burnToken() public onlyOwner{
// require statement is originally here
tokenBalance[owner]--;
}
function purchaseToken() public payable {
require((tokenBalance[owner] * tokenPrice) / msg.value > 0, "not enoug
h tokens");
tokenBalance[owner] -= msg.value / tokenPrice;
tokenBalance[msg.sender] += msg.value / tokenPrice;
}
function sendToken(address _to, uint _amount) public {
require(tokenBalance[msg.sender] >= _amount, "Not enough tokens");
assert(tokenBalance[_to] + _amount >= tokenBalance[_to]);
assert(tokenBalance[msg.sender] - _amount <= tokenBalance[msg.sender])
;
tokenBalance[msg.sender] -= _amount;
tokenBalance[_to] += _amount;
}
}
Or we can clip the code to two parts(solidity file, Owned.sol and Modifier.sol)
Owned.sol
contract Owned {
address owner;
constructor() public {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "You are not allowed");
_;
}
}
Modifier.sol
pragma solidity ^0.8.11;
import "./Owned.sol"
contract InheritanceModifierExample is Owned {
mapping(address => uint) public tokenBalance;
uint tokenPrice = 1 ether;
constructor() public {
tokenBalance[owner] = 100;
}
function createNewToken() public onlyOwner{
// require statement is originally here
tokenBalance[owner]++;
}
function burnToken() public onlyOwner{
// require statement is originally here
tokenBalance[owner]--;
}
function purchaseToken() public payable {
require((tokenBalance[owner] * tokenPrice) / msg.value > 0, "not enoug
h tokens");
tokenBalance[owner] -= msg.value / tokenPrice;
tokenBalance[msg.sender] += msg.value / tokenPrice;
}
function sendToken(address _to, uint _amount) public {
require(tokenBalance[msg.sender] >= _amount, "Not enough tokens");
assert(tokenBalance[_to] + _amount >= tokenBalance[_to]);
assert(tokenBalance[msg.sender] - _amount <= tokenBalance[msg.sender])
;
tokenBalance[msg.sender] -= _amount;
tokenBalance[_to] += _amount;
}
}
Last updated