首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >白帽试验中如何获得冒充钱包的USDC平衡

白帽试验中如何获得冒充钱包的USDC平衡
EN

Ethereum用户
提问于 2022-11-23 11:47:38
回答 1查看 377关注 0票数 0

我正在编写一份智能合同,在购买NFT时使用USDC (因此USDC从卖方转移到买方)。

我试图测试它在草帽,但我有麻烦时,使用USDC在我的安全帽测试。我分叉了goerli测试网,冒充钱包有它在goerli有USDC。

当我用我的帐户进行NFT购买时,它会出现一个错误"ERC20:“,因此我试图显示USDC余额,以了解问题在哪里,但是当我的帐户中有USDC时,USDC余额将返回0。

我遗漏了什么?

这是我的稳固功能:

代码语言:javascript
复制
     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();
    }

这是我的安全帽测试:

代码语言:javascript
复制
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

    });
EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-11-23 15:23:20

首先,您必须批准USDC合同上的USDC金额,从发件人钱包的前端。然后,您可以在您的合同上调用这个createMarketSale函数,它将把USDC从发送方转移到您的合同,然后从您的合同转移到卖方。

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/139879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档