我正在尝试在 Hardhat 中测试我的智能合约,但为了做到这一点,我首先需要向我的合约发送一些 ERC20 代币(对于此测试,我使用 USDC)。
在我的测试中,我模拟了 USDC 鲸鱼,但如何实际将 USDC 转移到我的合约中?
it("USDC test", async function () {
const testContract =
await ethers.getContractFactory("TestContract")
.then(contract => contract.deploy());
await testContract.deployed();
// Impersonate USDC whale
await network.provider.request({
method: "hardhat_impersonateAccount",
params: [USDC_WHALE_ADDRESS],
});
const usdcWhale = await ethers.provider.getSigner(USDC_WHALE_ADDRESS);
// Need to transfer USDC from usdcWhale to testContract
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建自己的 NFT 合约工厂,但在主网上失败了。我的钱包里有 ETH。在测试中它工作正常。这是我的合同:
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract NFT is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("NFT", "NFT") {}
function mintNFT(address recipient, string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的合约部署脚本
const MyNFT = await ethers.getContractFactory("NFT");
const gasPrice = await MyNFT.signer.getGasPrice();
const estimatedGas2 = await ethers.provider.estimateGas(MyNFT.getDeployTransaction().data)
const …Run Code Online (Sandbox Code Playgroud) 我正在构建一个铸造网站,要求我检查铸造的 NFT 数量并向用户实时显示该数字。
起初,我只是每隔几秒钟发出一次请求来检索号码,但后来我想我可以使用事件侦听器来减少请求,因为人们只会在短时间内进行铸造。
然而,使用事件监听器后,请求量大幅增加。看起来它一直在调用 blockNumber、chainId 和 getLogs。这就是事件侦听器在幕后工作的方式吗?或者我在这里做错了什么?
这是下一个 js API 路线,代码如下:
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import { ethers } from 'ethers'
import { contractAddress } from '../../helpers'
import type { NextApiRequest, NextApiResponse } from 'next'
import abi from '../../data/abi.json'
const NEXT_PUBLIC_ALCHEMY_KEY_GOERLI =
process.env.NEXT_PUBLIC_ALCHEMY_KEY_GOERLI
let count = 0
let lastUpdate = 0
const provider = new ethers.providers.JsonRpcProvider(
NEXT_PUBLIC_ALCHEMY_KEY_GOERLI,
'goerli'
)
const getNumberMinted = async () => {
console.log('RUNNING NUMBER MINTED - MAKING REQUEST', Date.now())
const provider = new …Run Code Online (Sandbox Code Playgroud) 我在 transactionContext.jsx 文件中是这样的,
import React, {useState, useEffect} from 'react';
import {BrowserProvider,ethers} from "ethers";
import { contractABI, contractAddr } from '../utils/constants';
const {ethereum} = window;
export const TransactionContext = React.createContext();
const getEthereumContract = () => {
console.log("get contract start");
const provider = new ethers.providers.Web3Provider(ethereum);
console.log(provider);
const signer = provider.getSigner();
const transactionsContract = new ethers.Contract(contractAddr, contractABI,
signer);
console.log(provider,signer,transactionsContract);
};
// code ...
Run Code Online (Sandbox Code Playgroud)
我正在创建一个反应上下文,我将其传递给我的其他组件。但问题是,const provider = new ethers.providers.Web3Provider(ethereum);根本不起作用。就好像执行到这一行后就停止了。我知道这一点是因为“开始”日志正在打印,但仅此而已。没有错误,没有例外,它只是在那之后停止。我尝试在网上搜索,但没有找到与此相关的任何问题。那么这是怎么回事呢?我搞砸了什么?
请询问是否需要更多上下文或代码示例。
我正在尝试为以太坊混合BitcoinJ和创建一个确定性钱包Web3j。确定性密钥使用生成BitcoinJ,以太坊凭证使用生成Web3j。但是用Web3j凭证生成的地址与预期的不一样。
String seedCode = "yard impulse luxury drive today throw farm pepper survey wreck glass federal";
// BitcoinJ
DeterministicSeed seed = new DeterministicSeed(seedCode, null, "", 1409478661L);
DeterministicKeyChain chain = DeterministicKeyChain.builder().seed(seed).build();
DeterministicKey key = chain.getKey(KeyPurpose.RECEIVE_FUNDS);
BigInteger privKey = key.getPrivKey();
// Web3j
Credentials credentials = Credentials.create(privKey.toString(16));
System.out.println("Address: " + credentials.getAddress());
Run Code Online (Sandbox Code Playgroud)
输出:0x2c4186d0422d0462a48c92cd559cbc30f528855b
预期:0x72445fcFdEB1Fff79496D7Ce66089d663Ff90E26
代码中的误解在哪里?
我想创建自己的加密货币钱包。我知道钱包中使用的私钥和公钥概念,但我无法理解我的钱包如何验证其他公共地址?我的钱包如何验证其他用户?coinomi 如何管理他们的钱包来存储各种货币?谁能解释一下钱包的完整逻辑?
所以我已经连接到合同,这似乎工作正常,我正在尝试使用这个类:来自https://web3py.readthedocs.io/en/stable/web3.personal.html 的web3.personal.Personal和我似乎不明白我错了什么......当我打印(web3.personal.Personal)给我一个类对象但我似乎无法使用与这个类相关的任何函数,说我缺少“self”参数
contract_abi = my_abi
w3 = Web3(HTTPProvider(myurl))
myContract = w3.eth.contract(address ,abi)
ref = ref = web3.personal.Personal('web3')
print(ref) #this works
print(ref.newAccount(password='the-passphrase')) #This crashes
TypeError: newAccount() missing 1 required positional argument: 'self'
TypeError: 'property' object is not callable
Run Code Online (Sandbox Code Playgroud) 我正在做一个主题为“销售”的项目。所以,对于前端(React)和后端(PHP)。
我在理解如何在项目中使用我的智能合约时遇到了问题。为了部署,我使用以太坊钱包 0.9.0 和测试网络 Rinkeby。他在 EW 工作。
假设我的代码中有购买按钮,并且我的合约中有如下功能:
function Buy()
public
payable
{
require (msg.sender != seller);
require (msg.value >= price);
orderNum++;
safePay +=msg.value;
}
Run Code Online (Sandbox Code Playgroud)
现在,我该如何使用它?我听说过 web3.js,但是(我不确定)我需要 php 请求。
或者,如果我的合约部署在以太坊钱包 Rinkeby 中,我可以直接通过代码使用它,不需要再次部署。
我是这个主题的初学者,可能会犯错误(即使在视图中),但如果有人可以解释这一点,我会非常高兴。
谢谢。
更新:下面是我要检查令牌是否存在的代码。如果是,那么我将检查钱包所有者是否是令牌所有者。现在的问题是它没有检查第二个函数“ contract.methods.ownerOf(tokenId).call(function(err,res)”),因此最终结果不是正确的结果。
async function doesTokenIdExist(tokenId, contract, walletAddress) {
var tokenExists = false;
await contract.methods.exists(tokenId).call(async function (err, res) {
if (res) {
await contract.methods.ownerOf(tokenId).call(function (err, res) {
if (!err) {
tokenAddress = res.toLowerCase();
walletAddress = walletAddress.toLowerCase();
if (tokenAddress.localeCompare(walletAddress) == 0){
tokenExists = true;
} else {
tokenExists = false;
}
} else {
tokenExists = false;
}
});
} else {
tokenExists = false;
}
});
return tokenExists;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 OpenZeppelin ERC721Full 合约编写 NFT 智能合约。我可以铸造 NFT,但我想要一个可以购买它们的按钮。我正在尝试编写此功能:
function buyNFT(uint _id) public payable{
//Get NFT owner address
address payable _seller = ownerOf(_id);
// aprove nft sell
approve(_seller, _id);
setApprovalForAll(msg.sender, true);
//transfer NFT
transferFrom(_seller, msg.sender, _id);
// transfer price in ETH
address(_seller).transfer(msg.value);
emit NftBought(_seller, msg.sender, msg.value);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为功能批准必须由所有者或已批准的地址调用。我不知道应该如何构建购买功能。我知道我必须使用一些需求,但首先我希望该功能可以用于测试,然后我将编写需求。
购买功能应该如何编码?因为我找到的唯一解决方案是覆盖批准函数并省略谁可以调用此函数的要求。但看起来这不是应该的方式。
谢谢!
ethereum ×10
blockchain ×3
ethers.js ×3
hardhat ×2
javascript ×2
solidity ×2
async-await ×1
asynchronous ×1
bitcoin ×1
bitcoinj ×1
cryptography ×1
django ×1
erc20 ×1
java ×1
nft ×1
php ×1
python ×1
wallet ×1
web3js ×1