【发布时间】:2022-07-31 06:16:17
【问题描述】:
我有两份合约,第一份是 openzeppelin ERC20 代币,第二份是彩票合约,玩家可以在其中下注。
lottery.sol
pragma solidity ^0.8.4;
import "./Token.sol"; //import ERC20 token
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract Lottery is Ownable {
Token token;
constructor(Token _token) public {
token = _token;
}
// store information about player's bet
struct PlayersStruct {
uint betAmount;
uint betOnNumber;
}
mapping(address => PlayersStruct) public balances;
function enterLottery(string memory _betOnNumber) public payable {
address player = msg.sender;
uint amount = msg.value;
// transfer token from player's wallet to lottery contract
token.transferFrom(player, address(this), betAmount);
balances[player].betAmount += amount ;
balances[player].betOnNumber = _betOnNumber;
}
这就是我从 ReactJS 中调用它的方式
async function stakeBet() {
const amount = ethers.utils.parseEther("10");
const maxAmount = ethers.utils.parseEther("1000000");
// approve token once so player can save on gas in future
await token.approve(stakingContract.address, maxAmount);
// bet 10 tokens on number 20
await lottery.enterLottery(20, {value: amount,});
}
这段代码有两个问题:
- 我每次都必须批准合同,即使我批准的 maxAmount 高于投注金额。我如何让 Metamask 知道合同已经获得批准?
- ERC20代币通过后,转出的代币实际是ETH,而不是Token.sol中定义的ERC20代币,如何指定ERC20为转出的代币?
我正在 Kovan 测试网上进行测试。
【问题讨论】:
标签: reactjs ethereum solidity ethers.js erc20