SushiSwap的MasterChef合约,用于质押挖矿,很多DeFi项目都借鉴了的质押功能,即向MasterChef合约地址发送lpToken代币,经过一个或若干个区块时间,就会有奖励币发到用户地址。用户可以提取本金与奖励币到自己的账户。质押挖矿的关键点:

  • 质押本金与奖励币,是两种不同的代币。
  • 奖励币用mint函数进行增发;
  • 奖励币的总量,不能缩减。
  • 奖励币的管理员是质押挖矿合约。

    这里创建一个GrapeMaster.sol文件用于质押挖矿,GrapeToken.sol作为奖励币,FixedSupplyToken.sol作为lpToken代币。

1、相关合约

1.1 质押合约GrapeMaster

    //GrapeMaster.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts/utils/EnumerableSet.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/access/Ownable.sol";import "./GrapeToken.sol";interface IMasterChef {function updatePool(uint256 pid) external ;function deposit(uint256 pid,uint256 amount) external;function withdraw(uint256 pid,uint256 amount) external;function emergencyWithdraw(uint256 pid) external;function massUpdatePools() external;function pendingApple(uint256 _pid, address _user) external view returns (uint256); function add(uint256 _allocPoint,IERC20 _lpToken, bool _withUpdate) external;event Deposit(address indexed user,uint256 indexed pid,uint256 amount);event Withdraw(address indexed user,uint256 indexed pid,uint256 amount);event EmergencyWithdraw(address indexed user,uint256 indexed pid,uint256 amount);
}contract GrapeMaster is IMasterChef,Ownable {using SafeMath for uint256;using SafeERC20 for IERC20;struct UserInfo {uint256 amount;      //质押金额(质押的lptoken个数)uint256 rewardDebt;  //账务(已兑现的收益叫账务,每次质押或提币时,都需要重新计算)}struct PoolInfo {IERC20 lpToken;           //质押的lpToken地址uint256 allocPoint;       //本质押池的份额uint256 lastRewardBlock;  //收取奖励币时的区块高度uint256 accApplePerShare; //单币收益(质押一个lpToken,得到的奖励币个数)}GrapeToken public grape;         //奖励币address public devaddr;          //开发者地址uint256 public bonusEndBlock;    //奖励截止的区块高度uint256 public grapePerBlock;    //每个区块的奖励币个数(随着区块高度而变化)//倍乘系数uint256 public constant BONUS_MULTIPLIER = 10;//基数uint256 public constant BASE_E12 = 1e12; //10^12PoolInfo[] public poolInfo;   //质押池数组mapping(uint256 => mapping(address => UserInfo)) public userInfo; //保存池子里每个用户的信息uint256 public totalAllocPoint = 0; //总份额uint256 public startBlock;      //奖励开始的区块高度mapping(address => bool) public isExisted; //判断质押池是否存在constructor(GrapeToken _grape,address _devaddr,uint256 _grapePerBlock,uint256 _startBlock,uint256 _bonusEndBlock) public {grape   = _grape;       //奖励币devaddr = _devaddr;     //开发者地址grapePerBlock = _grapePerBlock; //区块奖励的截止高度bonusEndBlock = _bonusEndBlock; //每个区块挖出的奖励币startBlock    = _startBlock;    //区块奖励的起始高度}//质押池的个数function poolLength() external view returns (uint256) {return poolInfo.length;}//添加质押池//设置该质押池的份额、lpToken地址、update标志//只有管理员才有权限添加,一种代币拥有一个质押池,即代币与质押池是一一对应的。//注意,不要对同一种lpToken添加多个质押池,否则奖励出现紊乱。function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) external override onlyOwner {require(address(_lpToken) != address(0),"lpToken is zero");require(!isExisted[address(_lpToken)], "repeated lpToken");if (_withUpdate) {massUpdatePools();}uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;totalAllocPoint = totalAllocPoint.add(_allocPoint);poolInfo.push(PoolInfo({lpToken: _lpToken,allocPoint: _allocPoint,lastRewardBlock: lastRewardBlock,accApplePerShare: 0}));isExisted[address(_lpToken)] = true;}//根据pid修改质押池的分配比例//即修改单个池子占总池子的奖励币份额function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {if (_withUpdate) {massUpdatePools();}totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);poolInfo[_pid].allocPoint = _allocPoint;}//这里的_from、_to是指区块高度,_from < _to//获取[_from,_to]区块里的倍乘系数function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {if (_to <= bonusEndBlock) {return _to.sub(_from).mul(BONUS_MULTIPLIER);           } else if (_from >= bonusEndBlock) {return _to.sub(_from);} else {return bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(_to.sub(bonusEndBlock));}}//待入账的收益//查看用户在pid这个池子里还未提取的收益(奖励币个数)function pendingApple(uint256 _pid, address _user) external override view returns (uint256) {PoolInfo storage pool = poolInfo[_pid];UserInfo storage user = userInfo[_pid][_user];uint256 accApplePerShare = pool.accApplePerShare;uint256 lpSupply = pool.lpToken.balanceOf(address(this));if (block.number > pool.lastRewardBlock && lpSupply != 0) {uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);uint256 appleReward = multiplier.mul(grapePerBlock).mul(pool.allocPoint).div(totalAllocPoint);accApplePerShare = accApplePerShare.add(appleReward.mul(BASE_E12).div(lpSupply));}return user.amount.mul(accApplePerShare).div(BASE_E12).sub(user.rewardDebt);}//更新所有质押池的收益function massUpdatePools() public override {uint256 length = poolInfo.length;for (uint256 pid=0; pid < length; ++pid) {updatePool(pid);}}//更新单个质押池的收益//1) 若质押的代币个数为0,则只更新lastRewardBlock;//   若质押数大于0,则先计算倍乘系数,然后计算本次的奖励appleReward,按照100:110的比例进行增发;//             即挖到 110% = 10% + 100%个奖励币//             其中,10%给开发者地址,100%给MasterChef合约地址;//             然后,更新单币收益accApplePerShare,区块奖励高度lastRewardBlockfunction updatePool(uint256 _pid) public override {PoolInfo storage pool = poolInfo[_pid];if (block.number <= pool.lastRewardBlock) {return;}uint256 lpSupply = pool.lpToken.balanceOf(address(this));if (lpSupply == 0) {pool.lastRewardBlock = block.number;return;}uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);uint256 appleReward = multiplier.mul(grapePerBlock).mul(pool.allocPoint).div(totalAllocPoint);grape.mint(devaddr,appleReward.div(10));grape.mint(address(this), appleReward);pool.accApplePerShare = pool.accApplePerShare.add(appleReward.mul(BASE_E12).div(lpSupply));pool.lastRewardBlock = block.number;}//质押代币//首先,提取上次待入账的收益(奖励币)到用户地址,//然后,将lpToken发给MasterChef合约,//同时更新质押金amount、账务rewardDebt,发送质押事件function deposit(uint256 _pid,uint256 _amount) public override {PoolInfo storage pool = poolInfo[_pid];UserInfo storage user = userInfo[_pid][msg.sender];updatePool(_pid);if (user.amount > 0) {uint256 pending = user.amount.mul(pool.accApplePerShare).div(BASE_E12).sub(user.rewardDebt);safeAppleTransfer(msg.sender, pending); //提取上次的奖励币到用户地址}pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount); //将lpToken质押到MasterChef合约里user.amount = user.amount.add(_amount);user.rewardDebt = user.amount.mul(pool.accApplePerShare).div(BASE_E12);emit Deposit(msg.sender, _pid, _amount);}//解除质押:提取本金和奖励币function withdraw(uint256 _pid, uint256 _amount) public override {PoolInfo storage pool = poolInfo[_pid];UserInfo storage user = userInfo[_pid][msg.sender];require(user.amount >= _amount, "withdraw: not good");updatePool(_pid);uint256 pending = user.amount.mul(pool.accApplePerShare).div(BASE_E12).sub(user.rewardDebt);safeAppleTransfer(msg.sender, pending);  //提取上一轮的收益(奖励币)user.amount = user.amount.sub(_amount);user.rewardDebt = user.amount.mul(pool.accApplePerShare).div(BASE_E12); //更新已兑现的收益pool.lpToken.safeTransfer(msg.sender, _amount); //提取质押代币(lpToken)emit Withdraw(msg.sender, _pid, _amount);}//紧急提币,没有收益function emergencyWithdraw(uint256 _pid) public override {PoolInfo storage pool = poolInfo[_pid];UserInfo storage user = userInfo[_pid][msg.sender];pool.lpToken.safeTransfer(msg.sender, user.amount);emit EmergencyWithdraw(msg.sender, _pid, user.amount);user.amount = 0;user.rewardDebt = 0;}//从MasterChef合约,提取_amount个奖励代币给_to地址//将MasterChef合约的奖励币余额appleBal与提取额_amount进行比较,防止超额发送//若充足,则按_amount提取;若不足,则按余额发送。function safeAppleTransfer(address _to, uint256 _amount) internal {uint256 appleBal = grape.balanceOf(address(this));if (_amount > appleBal) {grape.transfer(_to, appleBal);} else {grape.transfer(_to, _amount);}}//更换开发者地址function dev(address _devaddr) public {require(msg.sender == devaddr, "dev: wut?");devaddr = _devaddr;}
}

1.2 本金合约

    FixedSupplyToken.sol是本金合约。

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;interface IERC20 {function totalSupply() external view returns (uint256);function balanceOf(address account) external view returns (uint256);function transfer(address recipient, uint256 amount) external returns (bool);function allowance(address owner, address spender) external view returns (uint256);function approve(address spender, uint256 amount) external returns (bool);function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);event Transfer(address indexed from, address indexed to, uint256 value);event Approval(address indexed owner, address indexed spender, uint256 value);
}library SafeMath {function add(uint256 a,uint256 b) internal pure returns (uint256) {uint256 c = a+b;require(c >= a, "SafeMath: addition overflow");return c;}function sub(uint256 a,uint256 b) internal pure returns (uint256){require( b <= a,"SafeMath: subtraction overflow");uint256 c = a - b;return c;}function mul(uint256 a,uint256 b) internal pure returns (uint256) {if(a == 0) {return 0;}uint256 c = a*b;require(c / a == b, "SafeMath: multiplication overflow");return c;        }function div(uint256 a, uint256 b) internal pure returns (uint256) {// return div(a,b,"SafeMath: division by zero");require(b > 0, "SafeMath: division by zero");uint256 c = a / b;return c;}function mod(uint256 a, uint256 b) internal pure returns (uint256) {require(b != 0, "SafeMath: modu by zero");return a % b;}
}contract FixedSupplyToken is IERC20 {using SafeMath for uint256;string private _name;string private _symbol;uint8  private _decimal = 18 ;uint256 private _totalSupply;mapping (address => uint256) private _balanceOf;mapping (address => mapping(address => uint256)) private _allowances;constructor(string memory name,string memory symbol,uint256 initSupply) public {_name = name;_symbol = symbol;_totalSupply = initSupply*(10**18);_balanceOf[msg.sender] = _totalSupply;}function name() external view returns (string memory) {return _name;}function symbol() external view returns (string memory) {return _symbol;}function totalSupply() external override view returns (uint256) {return _totalSupply;}function balanceOf(address account) external override view returns (uint256) {return _balanceOf[account];}function transfer(address recipient,uint256 amount) external override returns (bool) {_transfer(msg.sender,recipient,amount);return true;}function _transfer(address sender,address recipient,uint256 amount) internal {require(sender != address(0),"ERC20: tranfer from the zero address");require(recipient != address(0),"ERC20: tranfer to the zero address");_balanceOf[sender] = _balanceOf[sender].sub(amount);_balanceOf[recipient] = _balanceOf[recipient].add(amount);emit Transfer(sender, recipient, amount);}function allowance(address owner, address spender) public override view returns (uint256) {return _allowances[owner][spender];}function approve(address spender, uint256 amount) public override returns (bool) {_approve(msg.sender,spender,amount);return true;} function _approve(address owner,address spender,uint256 amount) internal {require(owner != address(0),"ERC20: tranfer from the zero address");require(spender != address(0),"ERC20: tranfer to the zero address");_allowances[owner][spender] = amount;emit Approval(owner,spender,amount);}function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {_transfer(sender,recipient,amount);_approve(sender,msg.sender,_allowances[sender][msg.sender].sub(amount));return true;}  function increaseAllowance(address spender,uint256 amount) public returns (bool) {_approve(msg.sender,spender,_allowances[msg.sender][spender].add(amount));}function decreaseAllowance(address spender,uint256 amount) public returns (bool) {_approve(msg.sender,spender,_allowances[msg.sender][spender].sub(amount));}}

1.3 奖励币合约

    GrapeToken.sol是奖励币合约,引用了openzeppelin v3.4库。

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";contract GrapeToken is ERC20("GrapeToken","GRT"),Ownable {function mint(address _to,uint256 _amount) public onlyOwner  {_mint(_to,_amount);}
}

2、测试质押挖矿

2.1 创建工程

    a) 创建bcghat文件夹

mkdir bcghat
cd bcghat
npm init -y

    b) 修改package.json文件,主要修改devDependencies字段
    //package.json

{"name": "bcghat","version": "1.0.0","description": "","main": "","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","devDependencies": {"@nomiclabs/hardhat-ethers": "^2.0.2","@nomiclabs/hardhat-waffle": "^2.0.1","chai": "^4.3.4","ethereum-waffle": "^3.4.0","ethers": "^5.4.7","hardhat": "^2.6.5","@openzeppelin/contracts": "^3.4.2","typescript": "^4.4.4"}
}

    c) 安装依赖包

npm install

    d)用npx hardhat初始化工程

npx hardhat
## 选中Create simple project

    e) 在hardhat.config.js里指定solidity的版本

/*** @type import('hardhat/config').HardhatUserConfig*/
require("@nomiclabs/hardhat-waffle");module.exports = {solidity: "0.6.12", //指定版本networks: {// ropsten: {//   url: `https://eth-ropsten.alchemyapi.io/v2/${ALCHEMY_API_KEY}`,//   accounts: [`0x${ROPSTEN_PRIVATE_KEY}`]// },// rinkeby: {//   url: `https://eth-rinkeby.alchemyapi.io/v2/${ALCHEMY_API_KEY}`,//   accounts: [`0x${rinkeby_PRIVATE_KEY}`]// },}
};

2.2 编译合约

cd bcghat
npx hardhat compile

2.3 编写测试脚本

    a) 在bcghat/test目录里,创建一个文件夹名称为erc20,然后创建一个脚本: 4.GrapeOne.js,依次如下命令:

cd bcghat
mkdir -p test/erc20
touch 4.GrapeOne.js

    // 4.GrapeOne.js

// We import Chai to use its asserting functions here.
const { BigNumber } = require("ethers");
const { expect } = require("chai");
const { ethers } = require("hardhat");async function advanceBlock() {return ethers.provider.send("evm_mine", [])
}async function advanceBlockTo(blockNumber) {for (let i = await ethers.provider.getBlockNumber(); i < blockNumber; i++) {await advanceBlock()}
}describe("MasterChef", function() {before(async function() {this.signers = await ethers.getSigners()this.alice  = this.signers[0]this.bob    = this.signers[1]this.carol  = this.signers[2]this.dev    = this.signers[3]this.minter = this.signers[4]this.MasterChef = await ethers.getContractFactory("GrapeMaster")this.GrapeToken = await ethers.getContractFactory("GrapeToken")      this.ERC20Mock = await ethers.getContractFactory("FixedSupplyToken",this.minter)console.log('minter:',this.minter.address)console.log('alice: ',this.alice.address)console.log('bob:   ',this.bob.address)console.log('carol: ',this.carol.address)})beforeEach(async function() {this.grape = await this.GrapeToken.deploy()await this.grape.deployed()// console.log('Apple: ',this.grape.address)})// //1)it("should set correct state variables", async function() {//从区块0~1000,每个区块奖励1000个sushi代币,1000*1000 = 100万this.chef = await this.MasterChef.deploy(this.grape.address,this.dev.address,"1000","0","1000")await this.chef.deployed()await this.grape.transferOwnership(this.chef.address)const apple   = await this.chef.grape()const devaddr = await this.chef.devaddr()const owner   = await this.grape.owner()expect(apple).to.equal(this.grape.address)expect(devaddr).to.equal(this.dev.address)expect(owner).to.equal(this.chef.address)})context("With ERC/LP token added to the field",function() {beforeEach(async function() {this.lpA = await this.ERC20Mock.deploy("LPTokenA","LPA","10000000000")await this.lpA.transfer(this.alice.address,"1000")await this.lpA.transfer(this.bob.address,  "1000")await this.lpA.transfer(this.carol.address,"1000")this.lpB = await this.ERC20Mock.deploy("LPTokenB","lpB","10000000000")await this.lpB.transfer(this.alice.address,"1000")await this.lpB.transfer(this.bob.address,  "1000")await this.lpB.transfer(this.carol.address,"1000")// console.log('lpA:',this.lpA.address)// console.log('lpB:',this.lpB.address)})//5)it("should distribute GRT token properly for each staker", async function () {// 100 per block farming rate starting at block 300 with bonus until block 1000this.chef = await this.MasterChef.deploy(this.grape.address, this.dev.address, "100", "300", "1000")await this.chef.deployed()// console.log('chef:',this.chef.address)// console.log()await this.grape.transferOwnership(this.chef.address)await this.chef.add("100", this.lpA.address, true)await this.lpA.connect(this.alice).approve(this.chef.address, "1000", {from: this.alice.address,})await this.lpA.connect(this.bob).approve(this.chef.address, "1000", {from: this.bob.address,})await this.lpA.connect(this.carol).approve(this.chef.address, "1000", {from: this.carol.address,})// Alice deposits 10 LPs at block 310await advanceBlockTo("309")await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })// Bob deposits 20 LPs at block 314await advanceBlockTo("313")await this.chef.connect(this.bob).deposit(0, "20", { from: this.bob.address })// Carol deposits 30 LPs at block 318await advanceBlockTo("317")await this.chef.connect(this.carol).deposit(0, "30", { from: this.carol.address })// Alice deposits 10 more LPs at block 320. At this point://   Alice should have: 4*1000 + 4*1/3*1000 + 2*1/6*1000 = 5666//   MasterChef should have the remaining: 10000 - 5666 = 4334await advanceBlockTo("319")//每次质押时,自动提取上次的收益到对应的用户地址//每次质押之前,将池子将上次的欠款发给对应的用户//若没有发送,则表示池子对该用户的欠款,可以理解为池债(类似于国债),即池子欠用户的奖励代币//本次发送的是,上一次的欠款await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })//额外的10%给开发团队,即增发 100%+10% = 110%expect(await this.grape.totalSupply()).to.equal("11000")expect(await this.grape.balanceOf(this.alice.address)).to.equal("5666")expect(await this.grape.balanceOf(this.bob.address)).to.equal("0")expect(await this.grape.balanceOf(this.carol.address)).to.equal("0")expect(await this.grape.balanceOf(this.chef.address)).to.equal("4334")//开发团队的sushi余额expect(await this.grape.balanceOf(this.dev.address)).to.equal("1000")// Bob withdraws 5 LPs at block 330. At this point://   Bob should have: 4*2/3*1000 + 2*2/6*1000 + 10*2/7*1000 = 6190await advanceBlockTo("329")await this.chef.connect(this.bob).withdraw(0, "5", { from: this.bob.address })expect(await this.grape.totalSupply()).to.equal("22000")expect(await this.grape.balanceOf(this.alice.address)).to.equal("5666")expect(await this.grape.balanceOf(this.bob.address)).to.equal("6190")expect(await this.grape.balanceOf(this.carol.address)).to.equal("0")//309~329 区块个数:20,//池子的欠债:20*1000-5666-6190=20000-11856= 8144expect(await this.grape.balanceOf(this.chef.address)).to.equal("8144")// 20*1000*10%= 2000expect(await this.grape.balanceOf(this.dev.address)).to.equal("2000")// Alice withdraws 20 LPs at block 340. 全部提取// Bob withdraws 15 LPs at block 350. 全部提取// Carol withdraws 30 LPs at block 360. 全部提取await advanceBlockTo("339")await this.chef.connect(this.alice).withdraw(0, "20", { from: this.alice.address })await advanceBlockTo("349")await this.chef.connect(this.bob).withdraw(0, "15", { from: this.bob.address })await advanceBlockTo("359")await this.chef.connect(this.carol).withdraw(0, "30", { from: this.carol.address })//309~359 区块个数:50,铸币个数:50*1.1*100*10=55000//开发团队奖励: 50*1000*10%=5000expect(await this.grape.totalSupply()).to.equal("55000")expect(await this.grape.balanceOf(this.dev.address)).to.equal("5000")// 在309~319 质押10LPA, 则收益为4*1000+4*1/3*1000+2*1/6*1000=5666// 在319~329 又质押10LPA,则收益为10*2/7*1000=20/7*1000=2*1000=2000// 在329~339 没有增持,则收益为10*2/6.5*1000=3*1000=3000// 2857+3225= 6082// 5666 + 5934 = 11600// Alice should have: 5666 + 10*2/7*1000 + 10*2/6.5*1000 = 11600expect(await this.grape.balanceOf(this.alice.address)).to.equal("11600")// Bob should have: 6190 + 10*1.5/6.5 * 1000 + 10*1.5/4.5*1000 = 11831expect(await this.grape.balanceOf(this.bob.address)).to.equal("11831")// // Carol should have: 2*3/6*1000 + 10*3/7*1000 + 10*3/6.5*1000 + 10*3/4.5*1000 + 10*1000 = 26568expect(await this.grape.balanceOf(this.carol.address)).to.equal("26568")// All of them should have 1000 LPs back.expect(await this.lpA.balanceOf(this.alice.address)).to.equal("1000")expect(await this.lpA.balanceOf(this.bob.address)).to.equal("1000")expect(await this.lpA.balanceOf(this.carol.address)).to.equal("1000")})//7) it("should give proper GRT token allocation to each pool",async function() {// 100 per block farming rate starting at block 400 with bonus until block 1000this.chef = await this.MasterChef.deploy(this.grape.address, this.dev.address, "100", "400", "1000")// console.log("chef:",this.chef.address)// console.log()await this.grape.transferOwnership(this.chef.address)await this.lpA.connect(this.alice).approve(this.chef.address, "200", { from: this.alice.address })await this.lpB.connect(this.bob).approve(this.chef.address, "200", { from: this.bob.address })// Add first LP to the pool with allocation 1await this.chef.add("10", this.lpA.address, true)// Alice deposits 10 LPs at block 410await advanceBlockTo("409")await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })// Add lpB to the pool with allocation 2 at block 420await advanceBlockTo("419")await this.chef.add("20", this.lpB.address, true)// Alice should have 10*1000 pending rewardexpect(await this.chef.pendingApple(0, this.alice.address)).to.equal("10000")// Bob deposits 10 lpBs at block 425await advanceBlockTo("424")await this.chef.connect(this.bob).deposit(1, "5", { from: this.bob.address })// Alice should have 10000 + 1/3*5*1000 = 11666 pending rewardexpect(await this.chef.pendingApple(0, this.alice.address)).to.equal("11666")await advanceBlockTo("430")// At block 430. Bob should get 5*2/3*1000 = 3333. Alice should get ~1666 more.expect(await this.chef.pendingApple(0, this.alice.address)).to.equal("13333")expect(await this.chef.pendingApple(1, this.bob.address)).to.equal("3333")         })        // 8)it("should stop giving bonus GRT token after the bonus period ends", async function () {// 100 per block farming rate starting at block 500 with bonus until block 600this.chef = await this.MasterChef.deploy(this.grape.address, this.dev.address, "100", "500", "600")await this.grape.transferOwnership(this.chef.address)await this.lpA.connect(this.alice).approve(this.chef.address, "200", { from: this.alice.address })await this.chef.add("1", this.lpA.address, true)// Alice deposits 10 LPs at block 590await advanceBlockTo("589")await this.chef.connect(this.alice).deposit(0, "10", { from: this.alice.address })// At block 605, she should have 1000*10 + 100*5 = 10500 pending.await advanceBlockTo("605")expect(await this.chef.pendingApple(0, this.alice.address)).to.equal("10500")// At block 606, Alice withdraws all pending rewards and should get 10600.await this.chef.connect(this.alice).deposit(0, "0", { from: this.alice.address })expect(await this.chef.pendingApple(0, this.alice.address)).to.equal("0")//sushi总个数为10*1000+6*1000 = 10600expect(await this.grape.balanceOf(this.alice.address)).to.equal("10600")})})});

2.4 进行测试

npx hardhat test test/erc20/4.GrapeOne.js

    效果如下:

图(1) 质押挖矿测试

    如图(1)所示,4个案例,全部测试通过。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 从虚拟机到Ubuntu,再到vi,gcc,gdb和makefile的学习

    第一次跟着老师做项目&#xff0c;老师布置了几个学习任务&#xff0c;这么好的学习笔记&#xff0c;我私吞了多不好&#xff0c;于是又来分享学习笔记啦&#xff01; 初次接触虚拟机&#xff0c;Linux内核的Ubuntu系统 虚拟机当然是为了模拟Ubuntu系统&#xff0c;用Ubuntu是因…...

    2024/4/16 14:45:26
  2. TDengine在同花顺组合管理业务中的优化实践

    前言 同花顺每天需要接收海量交易所行情数据&#xff0c;确保行情数据的数据准确。但由于该部分数据过于庞大&#xff0c;而且使用场景颇多&#xff0c;每天会产生很多的加工数据&#xff0c;而组合管理(PMS)还会使用到历史行情数据。之前虽然采用了PostgresLevelDB作为数据的…...

    2024/4/14 23:46:53
  3. 多阶段构建:Docker 下如何实现镜像多阶级构建?

    目录 前言 使用多阶段构建 第一步&#xff0c;编译代码。 第二步&#xff0c;构建运行时镜像。 镜像构建对比 多阶段构建的其他使用方式 为构建阶段命名 停止在特定的构建阶段 使用现有镜像作为构建阶段 前言 我们知道 Docker 镜像是分层的&#xff0c;并且每一层镜像…...

    2024/4/28 4:43:03
  4. react props的简写

    <script type"text/babel">class Person extends React.Component {render() {const { name, sex, age } this.props;return (<ul><li>姓名&#xff1a;{name}</li><li>性别&#xff1a;{sex}</li><li>年龄&#xff1a;{…...

    2024/4/20 9:38:54
  5. CMake 输出路径的设置

    cmake 输出路径通常需要设置一下&#xff0c;这里记录一下&#xff1a; 1.设置可执行文件的输出路径&#xff1a; SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin) 2.静态库 lib 输出路径&#xff1a; set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/…...

    2024/4/14 23:47:09
  6. Unity(UGUI)进度条

    进度条有两种方法 第一种是用Image来制作 将Image Type选择为Filled 将Fill Method选择为Horizontal(水平) 用代码控制Fill Amount的值就行 方法2&#xff1a; 用Slider来做 想要实现进度条效果&#xff0c;就要使用代码控制Value属性。 public class Times : MonoBehav…...

    2024/4/19 9:34:53
  7. 下载安装虚拟机 + 在虚拟机上安装win7系统

    下载安装虚拟机 在虚拟机上安装Windows 7 x64系统 之 小白教程 导言 VMware是一个虚拟PC的软件&#xff0c;可以在现有的操作系统中虚拟出一个新的硬件环境&#xff0c;相当于模拟出一台新的PC&#xff0c;以此来实现在一台机器上真正同时运行两个独立的操作系统。 特点&am…...

    2024/4/16 10:28:55
  8. C语言-初阶笔记2

    初阶6&#xff1a;函数 函数声明 void func(); 返回类型 名称 (参数);函数指针&#xff1a;void (*pfunc)(); 类型 (*函数名) (参数)赋值&#xff1a;pfunc &func; 或者简写为pfuncfunc;函数名是地址&#xff0c;是执行函数代码的起始位置调用1&#xff1a;解引用 (*pf…...

    2024/4/14 23:47:39
  9. OpenMetric与时序数据库模型之主流TSDB分析

    主流TSDB分析 InfluxDB InfluxDB[9]是一个一站式的时序工具箱&#xff0c;包括了时序平台所需的一切&#xff1a;多租户时序数据库、UI和仪表板工具、后台处理和监控数据采集器。如下图9所示。 图9 InfluxDB支持动态shcema&#xff0c;也就是在写入数据之前&#xff0c;不需…...

    2024/4/20 7:30:04
  10. 短信群发平台 web网页版管理后台 路由通道搭建 源码架构的构思介绍

    一.系统根据需要开发了专业版本的功能 1&#xff1a;通道路由模块 1.1&#xff1a;通道地区设置 1.2&#xff1a;通道关键词分流 1.3&#xff1a;白名单独立通道设置 1.4&#xff1a;通道分组设置 1.5&#xff1a;通道分组分配 1.6&#xff1a;用户路由通道分流…...

    2024/4/16 10:29:33
  11. Java面向对象进阶之简单内存分析

    Java面向对象进阶之内存分析前言一、内存分析总结参考文献前言 如果没有面向对象基础&#xff0c;先看一个Java类看懂面向对象. 当new对象时&#xff0c;才会涉及到内存的分配&#xff0c;此时构造器构造对象的静态特征和动态行为。 JVM内存分为函数栈、堆、方法区。 一、内存分…...

    2024/4/16 10:29:38
  12. Java中队列的表述 (超详细)

    一 . 什么是队列 队列&#xff0c;和栈一样&#xff0c;也是一种对数据的"存"和"取"有严格要求的线性存储结构。 队列的两端都"开口"&#xff0c;要求数据只能从一端进&#xff0c;从另一端出&#xff0c;如图所示&#xff1a; 队列中…...

    2024/4/28 3:01:44
  13. 数学建模 预测方法集锦

    预测方法集锦1.移动平均法2.指数平滑法3.差分指数平滑法4.自适应滤波法5.趋势外推&#xff08;预测&#xff09;法6.回归分析7.灰色预测1.移动平均法 根据时间序列资料逐渐推移&#xff0c;依次计算包含一定项数的时序平均数&#xff0c;以反映长期趋势。 当时间序列的数值由于…...

    2024/4/7 2:19:08
  14. Linux初学者:安装anaconda添加环境变量时source错误

    1.anaconda安装 参考&#xff1a;Ubuntu 20.04安装Anaconda3及简单使用_m0_50117360的博客-CSDN博客_ubuntu20.04安装anaconda221、Anaconda安装包下载&#xff08;1&#xff09;官网下载&#xff0c;下载速度较慢&#xff08;2&#xff09;清华大学开源软件镜像站2、安装Anac…...

    2024/4/27 23:30:17
  15. 阿里云Elasticsearch智能运维系统实践

    摘要&#xff1a; 随着业务的增长与发展&#xff0c;不同的Elasticsearch集群承担着多厚多样的功能需求。尤其是当集群规模增长、业务庞大时&#xff0c;需要耗费大量的精力运维集群。阿里云Elasticsearch研发了一套智能运维系统&#xff0c;可通多专家经验与数据驱动两个重要…...

    2024/4/18 12:37:01
  16. wustctf2020_name_your_dog(数组越界劫持got)

    wustctf2020_name_your_dog: 有一道类似的叫name_your_cat&#xff0c;是数组越界 逆向分析&#xff1a; 主界面 NameWhich函数&#xff1a; 根本没检查边界&#xff0c;num我们随便取&#xff0c;依旧数组越界 后门 具体步骤&#xff1a; got表可写&#xff0c;got表就…...

    2024/4/27 22:42:38
  17. 【虚幻引擎4(UE4)实用技巧】-关于高亮显示物体轮廓线

    实际效果展示 方法 一、首先在“放置Actor”中打开查找&#xff0c;输入“Post Process Volume&#xff08;后期处理体积&#xff09;"并将其拖入场景中&#xff08;位置随意&#xff0c;因为后面会打开无边界&#xff09; 二、接着导入必须的材质&#xff01;这个很重要…...

    2024/4/28 0:52:07
  18. 疯狂Java讲义(十)----第二部分

    1.Checked异常和Runtime异常体系 Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。所有的RuntimeException类及其子类的实例被称为 Runtime异常;不是 RuntimeException类及其子类的异常实例则被称为Checked 异常。 只有Java语言提供了Checked异常&#…...

    2024/4/14 23:47:39
  19. 1218. 最长定差子序列

    题目 给你一个整数数组 arr 和一个整数 difference&#xff0c;请你找出并返回 arr 中最长等差子序列的长度&#xff0c;该子序列中相邻元素之间的差等于 difference。 子序列 是指在不改变其余元素顺序的情况下&#xff0c;通过删除一些元素或不删除任何元素而从 arr 派生出来…...

    2024/4/20 13:00:10
  20. YAPI 导入 Swagger

    first:登录YApi&#xff0c;没有账号可以注册一个 second:添加项目 third:创建项目 fourth:导入swagger Copy link adderss: end:...

    2024/4/14 23:47:44

最新文章

  1. 【ubuntu下fsearch查找工具的安装】

    目录 ubuntu下安装fsearch查找工具安装步骤安装fsearch查找工具时碰到这个提示 ubuntu下安装fsearch查找工具 fsearch是ubuntu系统下的文件搜索工具&#xff0c;类似于windows系统下的everything工具。 安装步骤 终端里依次输入下面的命令 sudo add-apt-repository ppa:chr…...

    2024/4/28 7:01:32
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 面试经典算法系列之双指针1 -- 合并两个有序数组

    面试经典算法题1 – 合并两个有序数组 LeetCode.88 公众号&#xff1a;阿Q技术站 问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#…...

    2024/4/27 20:48:48
  4. linuxday05

    1、makedile原理&#xff08;增量编译生成代码&#xff09; # &#xff08;注释符&#xff09; 目标------依赖 目标不存在//目标比依赖旧才会执行命令&#xff1b; makefile的实现 1、命名要求&#xff08;Makefile/makefile&#xff09; 2、规则的集合 目标文件&#…...

    2024/4/25 23:59:48
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57