Solidity

soldity :為已生成的 ERC-20 代幣創建 Dex

  • April 22, 2022

我想創建 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您需要將其轉換addressIERC20

我認為這樣可以幫助你:

constructor(address tokenContractAddress_) {
   token = IERC20(tokenContractAddress_);
}

引用自:https://ethereum.stackexchange.com/questions/124705