我正在编写一份智能合同,在购买NFT时使用USDC (因此USDC从卖方转移到买方)。
我试图测试它在草帽,但我有麻烦时,使用USDC在我的安全帽测试。我分叉了goerli测试网,冒充钱包有它在goerli有USDC。
当我用我的帐户进行NFT购买时,它会出现一个错误"ERC20:“,因此我试图显示USDC余额,以了解问题在哪里,但是当我的帐户中有USDC时,USDC余额将返回0。
我遗漏了什么?
这是我的稳固功能:
function createMarketSale(uint256 tokenId)
public
{
uint priceUSD = idToMarketItem[tokenId].priceUSD;
address seller = idToMarketItem[tokenId].seller;
USDc.transfer(seller, priceUSD * 10 ** 6);
_transfer(idToMarketItem[tokenId].owner, msg.sender, tokenId);
idToMarketItem[tokenId].owner = msg.sender;
idToMarketItem[tokenId].sold = true;
_itemsSold.increment();
}这是我的安全帽测试:
const USDC_ADDRESS = "0x98339D8C260052B7ad81c28c16C0b98420f2B46a";
const USDC_WHALE = "0x682...";
const ERC20ABI = require('./ERC20.json');
beforeEach(async () => {
[owner, addr1, addr2] = await ethers.getSigners();
const ArtworkContract = await ethers.getContractFactory("Artwork");
artworkcontract = await ArtworkContract.deploy();
// This should send USDC to addr1 but addr1 is not receiving USDC (or I cannot see it!)
await impersonateFundErc20(
USDC_ADDRESS,
USDC_WHALE,
addr1,
"50.0",
6
);
})
describe("MarketPlace", () => {
it("Should create an NFT", async function () {
const [owner, addr1, addr2] = await ethers.getSigners();
const whaleAddress = await ethers.getSigner(USDC_WHALE);
await artworkcontract.deployed();
await owner.sendTransaction({
to: whaleAddress.address,
value: ethers.utils.parseEther("1000.0"), // Send more ether to impersonated account
});
const USDC = new ethers.Contract(USDC_ADDRESS, ERC20ABI, ethers.provider);
USDCBalance = await USDC.balanceOf(USDC_WHALE);
console.log("USDCBalance: " + USDCBalance); // This is returning 0
await artworkcontract.connect(addr1).createToken("uri1","url1",2)
const allItems = await artworkcontract.fetchAllItems()
console.log("allItems:",allItems)
const ETHBalance = await ethers.provider.getBalance(USDC_WHALE);
console.log("ETHBalance: ",ETHBalance);
await artworkcontract.connect(whaleAddress).createMarketSale(1) // reverts with error ERC20: transfer amount exceeds balance
});发布于 2022-11-23 15:23:20
首先,您必须批准USDC合同上的USDC金额,从发件人钱包的前端。然后,您可以在您的合同上调用这个createMarketSale函数,它将把USDC从发送方转移到您的合同,然后从您的合同转移到卖方。
function createMarketSale(uint256 tokenId) public {
uint256 priceUSD = idToMarketItem[tokenId].priceUSD;
address seller = idToMarketItem[tokenId].seller;
// transfer amount from buyer to contract
USDc.transferFrom(msg.sender, address(this), priceUSD * 10**6);
// then send from the contract to seller
USDc.transfer(seller, priceUSD * 10**6);
_transfer(idToMarketItem[tokenId].owner, msg.sender, tokenId);
idToMarketItem[tokenId].owner = msg.sender;
idToMarketItem[tokenId].sold = true;
_itemsSold.increment();
}https://ethereum.stackexchange.com/questions/139879
复制相似问题