Solidity
soldity :為已生成的 ERC-20 代幣創建 Dex
我想創建 dex(買 - 賣)功能並將其部署在另一個生成的 ERC-20 上
我有這樣的程式碼
pragma solidity ^0.8.0; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); 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); } contract ERC20Basic is IERC20 { string public constant name = "ERC20Basic"; string public constant symbol = "ERC"; uint8 public constant decimals = 18; mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed; uint256 totalSupply_ = 10 ether; constructor() { balances[msg.sender] = totalSupply_; } function totalSupply() public override view returns (uint256) { return totalSupply_; } function balanceOf(address tokenOwner) public override view returns (uint256) { return balances[tokenOwner]; } function transfer(address receiver, uint256 numTokens) public override returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender]-numTokens; balances[receiver] = balances[receiver]+numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; } function approve(address delegate, uint256 numTokens) public override returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; } function allowance(address owner, address delegate) public override view returns (uint) { return allowed[owner][delegate]; } function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner]-numTokens; allowed[owner][msg.sender] = allowed[owner][msg.sender]+numTokens; balances[buyer] = balances[buyer]+numTokens; emit Transfer(owner, buyer, numTokens); return true; } } contract DEX { event Bought(uint256 amount); event Sold(uint256 amount); IERC20 public token; constructor() { token = new ERC20Basic(); } function buy() payable public { uint256 amountTobuy = msg.value; uint256 dexBalance = token.balanceOf(address(this)); require(amountTobuy > 0, "You need to send some ether"); require(amountTobuy <= dexBalance, "Not enough tokens in the reserve"); token.transfer(msg.sender, amountTobuy); emit Bought(amountTobuy); } function sell(uint256 amount) public { require(amount > 0, "You need to sell at least some tokens"); uint256 allowance = token.allowance(msg.sender, address(this)); require(allowance >= amount, "Check the token allowance"); token.transferFrom(msg.sender, address(this), amount); payable(msg.sender).transfer(amount); emit Sold(amount); } }
問題就在這裡
Contract Dex
constructor() { token = new ERC20Basic(); }
它僅在此合約生成令牌時才有效
我想創造類似的東西
constructor() { token = 0xdAC17F958D2ee523a2206206994597C13D831ec7; //usdt token address }
之後我可以在這個合約上存入 USDT 並像 dex 一樣買賣它
但我找不到辦法做到這一點
你可以這樣做:
constructor() { token = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); //usdt token address }
因為
token
是一種類型,IERC20
您需要將其轉換address
為IERC20
我認為這樣可以幫助你:
constructor(address tokenContractAddress_) { token = IERC20(tokenContractAddress_); }