mail@pastecode.io avatarunknown
a month ago
2.7 kB
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "./TestToken.sol";

// Learn more about the ERC20 implementation 
// on OpenZeppelin docs: https://docs.openzeppelin.com/contracts/4.x/api/access#Ownable
import "@openzeppelin/contracts/access/Ownable.sol";

contract Vendor is Ownable {

  // Our Token Contract
  testToken myToken;

  // token price = 0.45 BNB
  //uint256 public tokenPrice = 450000000 gwei;
  //This is token price during test: 0.025 BNB
  uint256 public tokenPrice = 2500000 gwei;

  // Event that log buy operation
  event BuyTokens(address buyer, uint256 amountOfBNB, uint256 amountOfTokens);

  constructor(address tokenAddress) {
    myToken = testToken(tokenAddress);

  * @notice Allow users to check the contract balance

  function getVendorBalance() public view returns (uint256 vendorBalance) {
    vendorBalance = myToken.balanceOf(address(this));
    return vendorBalance;

  * @notice Allow users to buy token for BNB

  function buyTokens() public payable returns (uint256 tokenAmount) {
    //we sell at 0.45 BNB -- 0.025 BNB for testing phase
    require(msg.value >= tokenPrice, "Not enough BNB sent, check price !");

    //C'est quand je fais cette opération que ça semble foirer
    uint256 amountToBuy = msg.value * tokenPrice;

    //Si je décommente ça et je vire le calcul au dessus ça fonctionne nickel 
    //uint256 amountToBuy = 1;

    // check if the Vendor Contract has enough amount of tokens for the transaction
    uint256 vendorBalance = getVendorBalance();
    //uint256 seedBuyLimit = 15;
    require(vendorBalance >= amountToBuy, "Test contract has not enough tokens in its balance");
   // require(amountToBuy <= seedBuyLimit, "You can't buy more than 15 tokens at once");

    // Transfer token to the msg.sender
    (bool sent) = myToken.transfer(msg.sender, amountToBuy);
    require(sent, "Failed to transfer token to user");

    // emit the event
    emit BuyTokens(msg.sender, msg.value, amountToBuy);

    return amountToBuy;

  * @notice Allow the owner of the contract to withdraw BNB
  function withdraw() public onlyOwner {
    uint256 ownerBalance = address(this).balance;
    require(ownerBalance > 0, "Owner has not balance to withdraw");

    (bool sent,) = msg.sender.call{value: address(this).balance}("");
    require(sent, "Failed to send user balance back to the owner");