获得以下合约的所有权来完成这一关.
- Solidity Remix IDE
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "openzeppelin-contracts-06/math/SafeMath.sol";
contract Fallout {
//启用SafeMath库中的函数用于uint256类型
using SafeMath for uint256;
//定义了一个映射,记录每个地址的分配金额
mapping(address => uint256) allocations;
//定义了一个公开的可支付地址变量owner,用于存储合约所有者的地址。
address payable public owner;
/* constructor */
//Fal1out()函数,任何人都可以调用,public
function Fal1out() public payable {
//调用者成为合约拥有者
owner = msg.sender;
//记录发送到合约的金额
allocations[owner] = msg.value;
}
//修饰符确保只有合约所有者可以调用标记了onlyOwner的函数
modifier onlyOwner() {
require(msg.sender == owner, "caller is not the owner");
_;
}
//允许用户向合约发送以太币,并记录他们的分配金额
function allocate() public payable {
allocations[msg.sender] = allocations[msg.sender].add(msg.value);
}
//允许用户将他们的分配金额发送到指定的地址
function sendAllocation(address payable allocator) public {
require(allocations[allocator] > 0);
allocator.transfer(allocations[allocator]);
}
//允许合约所有者提取合约中的所有余额
function collectAllocations() public onlyOwner {
msg.sender.transfer(address(this).balance);
}
//允许查询指定地址的分配余额。
function allocatorBalance(address allocator) public view returns (uint256) {
return allocations[allocator];
}
}
很明显,在定义构造函数时,将合约名 Fallout 误写为 Fal1out ,这导致这个函数成为了一个普通的 public 函数。任何人都可以在合约创建后调用这个函数,成为合约主人。
1.contract.Fal1out()
//调用构造函数Fal1out来获取合约的ower权限
2.contract.owner()
// 查看合约拥有者