如何使用炼金术发送已经铸造的NFT



我在opensea上铸造了一些NFT。这些都在Polygon Mumbai网络上。现在我想使用alchemyweb3将这些内容转移到令牌到其他地址。这是我正在使用的代码。

注意:这应该在nodejs restful API中运行,因此没有可用的钱包,这就是我手动签署交易的原因。

async function main() {
require('dotenv').config();
const { API_URL,API_URL_TEST, PRIVATE_KEY } = process.env;
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const web3 = createAlchemyWeb3(API_URL_TEST);
const myAddress = '*************************'
const nonce = await web3.eth.getTransactionCount(myAddress, 'latest');
const transaction = { //I believe transaction object is not correct, and I dont know what to put here
'asset': {
'tokenId': '******************************',//NFT token id in opensea
},
'gas': 53000,
'to': '***********************', //metamask address of the user which I want to send the NFT
'quantity': 1,
'nonce': nonce,
}

const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
if (!error) {
console.log("🎉 The hash of your transaction is: ", hash, "n Check Alchemy's Mempool to view the status of your transaction!");
} else {
console.log("❗Something went wrong while submitting your transaction:", error)
}
});
}
main();

假设您的浏览器中安装了Metamask,并且NFT智能合约遵循ERC721标准

const { API_URL,API_URL_TEST, PRIVATE_KEY } = process.env;
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const {abi} = YOUR_CONTRACT_ABI
const contract_address = CONTRACT ADDRESS
require('dotenv').config();

async function main() {
const web3 = createAlchemyWeb3(API_URL_TEST);  
web3.eth.getAccounts().then(accounts => {
const account = account[0]
const nameContract = web3.eth.Contract(abi, contract_address);
nameContract.methods.transfer(account, ADDRESS_OF_WALLET_YOU_WANT_TO_SEND_TO, TOKEN_ID).send();
})
.catch(e => console.log(e));
}
main();

也有同样的问题,因为没有关于传输NFT令牌的示例。以太坊网站上有一个解释得很好的三部分示例,用于制作NFT。

在第一部分,步骤10中,它解释了如何编写合同,并提到了扩展的合同对象中的现有方法:

在我们的导入语句之后,我们有了自定义的NFT智能合约,它非常短——它只包含一个计数器、一个构造函数和一个函数!这要归功于我们继承的OpenZeppelin合同,它实现了我们创建NFT所需的大多数方法,例如ownerOf,它返回NFT的所有者,transferFrom,它将NFT的所有权从一个帐户转移到另一个帐户

因此,有了这些信息,我用我的元任务移动应用程序在两个地址之间进行了NFT转移交易。然后我通过etherscanneneneba API搜索这个交易的JSON。

通过这种方式,我可以使用以下脚本将代币转移到其他地址:

require("dotenv").config()
const API_URL = process.env.API_URL; //the alchemy app url
const PUBLIC_KEY = process.env.PUBLIC_KEY; //my metamask public key
const PRIVATE_KEY = process.env.PRIVATE_KEY;//my metamask private key
const {createAlchemyWeb3} = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")//this is the contract created from ethereum example site
const contractAddress = "" // put here the contract address
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

/**
* 
* @param tokenID the token id we want to exchange
* @param to the metamask address will own the NFT
* @returns {Promise<void>}
*/
async function exchange(tokenID, to) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY,         'latest');
//the transaction
const tx = {
'from': PUBLIC_KEY,
'to': contractAddress,
'nonce': nonce,
'gas': 500000,
'input': nftContract.methods.safeTransferFrom(PUBLIC_KEY, to, tokenID).encodeABI() //I could use also transferFrom
};
const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
signPromise
.then((signedTx) => {
web3.eth.sendSignedTransaction(
signedTx.rawTransaction,
function (err, hash) {
if (!err) {
console.log(
"The hash of your transaction is: ",
hash,
"nCheck Alchemy's Mempool to view the status of your transaction!"
)
} else {
console.log(
"Something went wrong when submitting your transaction:",
err
)
}
}
)
})
.catch((err) => {
console.log(" Promise failed:", err)
})
}

我也遇到了同样的问题。我需要在node.js后端传输NFT
我使用网络提供商使用Moralis NetworkWeb3Connector。

以下是我的存储库示例:https://github.com/HanJaeJoon/Web3API/blob/2e30e89e38b7b1f947f4977a0fe613c882099fbc/views/index.ejs#L259-L275

await Moralis.start({
serverUrl,
appId,
masterKey,
});
await Moralis.enableWeb3({
// rinkeby
chainId: 0x4,
privateKey: process.env.PRIVATE_KEY,
provider: 'network',
speedyNodeApiKey: process.env.MORALIS_SPEEDY_NODE_API_KEY,
});
const options = {
type,
receiver,
contractAddress,
tokenId,
amount: 1,
};
try {
await Moralis.transfer(options);
} catch (error) {
console.log(error);
}

您可以在
Moralis dashboad>网络>Eth Rinkeby(在我的情况下(>设置

屏幕截图

相关内容

  • 没有找到相关文章

最新更新