练习2:实现锁定机制和资金撤回
正如我们之前所说,这个合约的最终目标是实现一个质押dApp,当满足一些条件,用户就可以质押 ETH。如果没有达到这些条件,用户可以撤回他们的 ETH 。
这些条件是:
public
或 external
,你可以从 web3 app 或直接从另一个合约调用它们。rollback
。public timeLeft()
函数,用于返回剩余时间,直到时间到 deadline 为止execute()
方法,将资金从质押合约转移到外部合约并执行另一个合约外部函数当你在本地测试合约是一定要注意:区块链的状态只有在区块被打包时才会更新。区块编号和区块时间都只有在交易完成后才会更新。这意味着
timeLeft()
只有在交易完成后才会更新。如果你想模拟真实场景,可以改变 Hardhat 配置来模拟区块自动挖矿。如果你想了解更多,请看mining-mode 文档。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "hardhat/console.sol";
import "./ExampleExternalContract.sol";
/**
* @title Stacker Contract
* @author scaffold-eth
* @notice A contract that allow users to stack ETH
*/
contract Staker {
// External contract that will old stacked funds
ExampleExternalContract public exampleExternalContract;
// 用户质押余额
mapping(address => uint256) public balances;
// Staking threshold
uint256 public constant threshold = 1 ether;
// Staking deadline
uint256 public deadline = block.timestamp + 30 seconds;
// 合约事件
event Stake(address indexed sender, uint256 amount);
// Contract's Modifiers
/**
* @notice Modifier that require the deadline to be reached or not
* @param requireReached Check if the deadline has reached or not
*/
modifier deadlineReached( bool requireReached ) {
uin...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!