반응형
문제
- ownership
- 잔액을 0으로 만들기
owner가 되어서 모든 금액 인출하기
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Fallback {
mapping(address => uint) public contributions;
address public owner;
constructor() {
owner = msg.sender;
contributions[msg.sender] = 1000 * (1 ether);
}
modifier onlyOwner {
require(
msg.sender == owner,
"caller is not the owner"
);
_;
}
function contribute() public payable {
require(msg.value < 0.001 ether);
contributions[msg.sender] += msg.value;
if(contributions[msg.sender] > contributions[owner]) {
owner = msg.sender;
}
}
function getContribution() public view returns (uint) {
return contributions[msg.sender];
}
function withdraw() public onlyOwner {
payable(owner).transfer(address(this).balance);
}
receive() external payable {
require(msg.value > 0 && contributions[msg.sender] > 0);
owner = msg.sender;
}
풀이
- constructor
배포자의 contributions 배열에 1000 ether 저장
- contribute func
0.001 미만 ether를 전송받을 수 있음
전송받은 금액은 contributions 배열에 저장됨
owner 보다 값이 클 경우에 msg.sender가 owner가 됨
- withdraw func
모든 잔액을 owner에게 전송
- receive
msg.value>0, msg.sender의 contributions 값이 0 초과일 때, msg.sender가 owner 됨
-> owner가 되어 withdraw 함수를 실행시키면 됨
- owner
contributions 배열 값이 0 초과이어야 하기 때문에 contribute 함수를 한번 실행시켜야 함
receive 함수 실행 -> owner 변경됨
- withdraw 함수 실행
withdraw 함수 실행 -> 출금하여 잔액 0으로 만들기
반응형
'blockchain' 카테고리의 다른 글
[ethernaut] Coin Flip (0) | 2024.09.01 |
---|---|
[ethernaut] Fallout (0) | 2023.04.05 |
[ethernaut] Hello Ethernaut (0) | 2023.04.02 |
remix - Deploy & At Address (0) | 2023.03.18 |
IPFS (0) | 2023.03.03 |