首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从javascript文件中批准ERC20令牌的开销?

如何从javascript文件中批准ERC20令牌的开销?
EN

Stack Overflow用户
提问于 2022-01-12 09:56:44
回答 1查看 540关注 0票数 1

我有两个合同ERC20和ERC721。每次调用ERC721 transferFrom函数时,我都希望向erc721的创建者(minter)发送一些erc20令牌。

经过一番研究,我发现我必须做两件事。

function

  • Approve
  1. 调用erc20 20从ERC721 transferFrom

中转移erc20代币

第二个问题似乎给了我一些问题。请看我的代码如下:您的帮助将非常感谢。

++我也不太确定我是否从ERC721合同中正确调用了ERC721 20。这样做对吗?

ERC721合同:

代码语言:javascript
复制
import "../openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";
import "../openzeppelin-contracts/contracts/token/ERC721/ERC721.sol";
import "../openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol";
import "../openzeppelin-contracts/contracts/math/SafeMath.sol";
import "../openzeppelin-contracts/contracts/utils/Address.sol";
import "../openzeppelin-contracts/contracts/utils/Counters.sol";
import "./ERC20Token.sol";

contract NFTtoken is ERC721 {
.
.
.
    ERC20Token Erc20Contract;

    constructor(address tokenAddress) ERC721("NC NFT example", "NCNFT") {
        owner = msg.sender;
        decimals = 0;
        Erc20Contract = ERC20Token(tokenAddress);
    }
function mint(string calldata nftName) external payable {
        uint256 newItemId = _tokenIds.current();
        _mint(msg.sender, newItemId);

        nftInfo[msg.sender].name = nftName;
        nftInfo[msg.sender].creator = msg.sender;

        allValidTokenIndex[newItemId] = allValidTokenIds.length;
        allValidTokenIds.push(newItemId);
        _tokenIds.increment();
    }
    function transferNFT(address from, address to, uint256 tokenId)  public returns (bool){
        transferFrom(from, to, tokenId);
        Erc20Contract.transferFrom(to, nftInfo[from].creator, 10);
    }
}
.
.
.

app.js

代码语言:javascript
复制
transferNFT: function() {
  NFTContract.deployed().then(function(contractInstance) {
    let toAddress = $("#to-address").val();
    //    function transferFrom(address _from, address _to, uint256 _tokenId) public payable {
    let NFTid_temp = $("#nft-id").val();
    let NFTid = NFTid_temp.substring(7);
    console.log("to = " + toAddress);
    console.log("nftid = " + NFTid);
    Voting.deployed().then(function(votingcontractInstance) { votingcontractInstance.approve(contractInstance.address, votingcontractInstance.balanceOf(web3.eth.accounts[1]))});
    contractInstance.transferNFT(web3.currentProvider.selectedAddress, toAddress, NFTid, {gas: 140000, from: web3.eth.accounts[0]});
  })
}

错误信息

代码语言:javascript
复制
app.js:10169 Uncaught (in promise) BigNumber Error: new BigNumber() not a number: [object Object]
    at raise (http://localhost:8080/app.js:10169:25)
    at http://localhost:8080/app.js:10157:33
    at new BigNumber (http://localhost:8080/app.js:9184:67)
    at new BigNumber (http://localhost:8080/app.js:9194:25)
    at toBigNumber (http://localhost:8080/app.js:2084:12)
    at Object.toTwosComplement (http://localhost:8080/app.js:2095:21)
    at SolidityTypeAddress.formatInputInt [as _inputFormatter] (http://localhost:8080/app.js:2995:38)
    at SolidityTypeAddress.SolidityType.encode (http://localhost:8080/app.js:3648:17)
    at http://localhost:8080/app.js:15577:29
    at Array.map (<anonymous>)
EN

回答 1

Stack Overflow用户

发布于 2022-01-12 16:18:11

我怀疑这句话:

代码语言:javascript
复制
votingcontractInstance.balanceOf(web3.eth.accounts[1]))

你能检查一下它的型号吗?我认为它返回“字符串”,但它必须是数字。如果是字符串,可以用Number包装它。

代码语言:javascript
复制
 Number(votingcontractInstance.balanceOf(web3.eth.accounts[1])))

或者使用web3.utils.toBN()

代码语言:javascript
复制
  web3.utils.toBN(votingcontractInstance.balanceOf(web3.eth.accounts[1])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70679521

复制
相关文章

相似问题

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