增加一个erc20换取ceg的合约

This commit is contained in:
CounterFire2023 2023-07-27 16:33:41 +08:00
parent dc971a4d5c
commit 7e836a135c
5 changed files with 20839 additions and 8 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,108 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "../utils/UInt.sol";
import "./MallBase.sol";
interface ICurrency is IERC20 {
function decimals() external view returns (uint256);
}
contract BETokenMall is MallBase, ReentrancyGuard {
using SafeERC20 for IERC20;
using UInt for uint256;
uint256 constant ROUND = 1000000;
address public tokenAddress;
address public seller;
// currency => price
mapping(address => uint256) public prices;
// Events
event BuyTransaction(
address indexed buyer,
address tokenAddress,
address currency,
uint256 amount
);
event TokenAddressUpdated(address tokenAddress);
event SellerUpdated(address seller);
event UpdateTokenPrice(address currency, uint256 price, uint256 pricePre);
/**
* @dev Constructor
*/
constructor(address _tokenAddress, address _seller) {
tokenAddress = _tokenAddress;
seller = _seller;
}
/**
* @dev Update token address
*/
function updateTokenAddress(address _tokenAddress) external onlyOwner {
tokenAddress = _tokenAddress;
emit TokenAddressUpdated(_tokenAddress);
}
/**
* @dev Update seller address
*/
function updateSeller(address _seller) external onlyOwner {
seller = _seller;
emit SellerUpdated(_seller);
}
/**
* @dev Update token price
*/
function updateTokenPrice(
address currency,
uint256 price
) external onlyOwner {
uint256 pricePre = prices[currency];
prices[currency] = price;
emit UpdateTokenPrice(currency, price, pricePre);
}
/**
* @dev Buy token
*/
function buyToken(address currency, uint256 amount) external nonReentrant {
require(amount > 0, "BETokenMall: invalid amount");
require(erc20Supported[currency], "BETokenMall: invalid payment method");
require(prices[currency] > 0, "BETokenMall: invalid token price");
// calc currency amount
uint256 currencyDecimal = ICurrency(currency).decimals();
uint256 tokenAmount = (prices[currency] *
amount *
(10 ** (18 - currencyDecimal))) / ROUND;
address buyer = _msgSender();
require(
IERC20(tokenAddress).balanceOf(seller) >= tokenAmount,
"BETokenMall: seller doesn't have enough token to sell this item"
);
require(
IERC20(tokenAddress).allowance(seller, address(this)) >= tokenAmount,
"BETokenMall: seller doesn't approve enough token to sell this item"
);
// Check payment approval and buyer balance
require(
IERC20(currency).balanceOf(buyer) >= amount,
"BETokenMall: buyer doesn't have enough token to buy this item"
);
require(
IERC20(currency).allowance(buyer, address(this)) >= amount,
"BETokenMall: buyer doesn't approve enough token to buy this item"
);
// Transfer payment to seller
IERC20(currency).safeTransferFrom(buyer, feeToAddress, amount);
// Transfer token to buyer
IERC20(tokenAddress).safeTransferFrom(seller, buyer, tokenAmount);
// emit buy event
emit BuyTransaction(buyer, tokenAddress, currency, amount);
}
}

View File

@ -2,6 +2,9 @@ const BENftMarket = artifacts.require("market/BENftMarket");
const BENftMall = artifacts.require("market/BENftMall"); const BENftMall = artifacts.require("market/BENftMall");
const GameItemMarket = artifacts.require("market/GameItemMarket"); const GameItemMarket = artifacts.require("market/GameItemMarket");
const GameItemMall = artifacts.require("market/GameItemMall"); const GameItemMall = artifacts.require("market/GameItemMall");
const FT = artifacts.require("tokens/erc20/FT");
const BETokenMall = artifacts.require("market/BETokenMall");
const config = require("../config/config");
const base = require("../scripts/base"); const base = require("../scripts/base");
module.exports = async function (deployer, network, accounts) { module.exports = async function (deployer, network, accounts) {
@ -18,16 +21,40 @@ module.exports = async function (deployer, network, accounts) {
// network, // network,
// }); // });
await deployer.deploy(BENftMall); // await deployer.deploy(BENftMall);
const nftMallInstance = await BENftMall.deployed(); // const nftMallInstance = await BENftMall.deployed();
if (nftMallInstance) { // if (nftMallInstance) {
console.log("BENftMall successfully deployed."); // console.log("BENftMall successfully deployed.");
// }
// base.updateArray({
// name: "BENftMall",
// type: "logic",
// json: "assets/contracts/BENftMall.json",
// address: nftMallInstance.address,
// network,
// });
let cfgs = base.loadData({ network });
const cegInstance = await FT.at(cfgs.find((c) => c.name === "CEG").address);
await deployer.deploy(
BETokenMall,
cegInstance.address,
config.market.feeToAddress
);
const tokenMallInstance = await BETokenMall.deployed();
if (tokenMallInstance) {
console.log("BETokenMall successfully deployed.");
} }
await tokenMallInstance.setFeeToAddress(config.market.feeToAddress);
const usdcInstance = await FT.at(
cfgs.find((c) => c.name === "BEUSDC").address
);
await tokenMallInstance.addERC20Support(usdcInstance.address);
await tokenMallInstance.updateTokenPrice(usdcInstance.address, "10000000");
base.updateArray({ base.updateArray({
name: "BENftMall", name: "BETokenMall",
type: "logic", type: "logic",
json: "assets/contracts/BENftMall.json", json: "assets/contracts/BETokenMall.json",
address: nftMallInstance.address, address: tokenMallInstance.address,
network, network,
}); });

View File

@ -99,7 +99,7 @@
"name": "BEMultiSigWallet", "name": "BEMultiSigWallet",
"type": "logic", "type": "logic",
"json": "assets/contracts/BEMultiSigWallet.json", "json": "assets/contracts/BEMultiSigWallet.json",
"address": "0xE68F149daF2F314d9960c08496D8701BC7671850" "address": "0x2419c58F3542E69c3f10dfe6C1Bb1fBd4D54Db5A"
}, },
{ {
"name": "TestBadge", "name": "TestBadge",
@ -118,5 +118,11 @@
"type": "erc20", "type": "erc20",
"json": "assets/contracts/FT.json", "json": "assets/contracts/FT.json",
"address": "0x944D0A8463B2c955F90F7252bBb99A3395087155" "address": "0x944D0A8463B2c955F90F7252bBb99A3395087155"
},
{
"name": "BETokenMall",
"type": "logic",
"json": "assets/contracts/BETokenMall.json",
"address": "0x9110Bc91942E559eebBF19B91cdAf67eEee3F93D"
} }
] ]