简体   繁体   English

通过 JavaScript SDK 调用 Elrond 智能合约返回用户错误

[英]Elrond Smart Contract call via JavaScript SDK returns a user error

I am trying to call a function from a Elrond Smart Contract to create a NFT, I am using their JavaScript SDK.我正在尝试从 Elrond 智能合约调用函数来创建 NFT,我正在使用他们的 JavaScript SDK。

This is the error I get:这是我得到的错误:

TransactionCompletionStrategy.isCompleted(), found event: signalError TransactionCompletionStrategy.isCompleted(),发现事件:signalError

Transaction return code: user error交易返回码:用户错误

This is my JavaScript code:这是我的 JavaScript 代码:

const {
  Transaction,
  BytesValue,
  ContractCallPayloadBuilder,
  ContractFunction,
  BigUIntValue,
  Account,
  Address,
  TransactionWatcher,
  ResultsParser,
} = require('@elrondnetwork/erdjs')
const { BigNumber } = require('bignumber.js')
const fs = require('fs')
const {
  UserSecretKey,
  UserSigner,
  parseUserKey,
} = require('@elrondnetwork/erdjs-walletcore')
const {
  ProxyNetworkProvider,
} = require('@elrondnetwork/erdjs-network-providers')

const contractAddress = new Address(
  'erd1qqqqqqqqqqqqqpgqlsd27rdekm3px5aydfahf9lcau0wrss3rfyqtvvxke',
)
const specialOpertationsGasLimit = 3_000_000
let attributes, hash

const setup = async () => {
  const pemKeyFileName = './mypemfile.pem'
  const walletPemKey = fs.readFileSync(pemKeyFileName, 'utf8')
  const pemKey = UserSecretKey.fromPem(walletPemKey)
  const signer = new UserSigner(pemKey)

  const provider = new ProxyNetworkProvider('https://devnet-gateway.elrond.com')

  const userKey = parseUserKey(walletPemKey)
  const account = new Account(userKey.generatePublicKey().toAddress())
  let accountOnNetwork = await provider.getAccount(
    userKey.generatePublicKey().toAddress(),
  )
  account.update(accountOnNetwork)

  return {
    signer,
    account,
    provider,
  }
}

const commonTxOperations = async (tx, account, signer, provider) => {
  tx.setNonce(account.getNonceThenIncrement())
  signer.sign(tx)
  await provider.sendTransaction(tx)
  const watcher = new TransactionWatcher(provider)
  const transactionOnNetwork = await watcher.awaitCompleted(tx)

  const txHash = transactionOnNetwork.hash
  const txStatus = transactionOnNetwork.status

  let { returnCode } = new ResultsParser().parseUntypedOutcome(
    transactionOnNetwork,
  )

  console.log(`\nTransaction return code: ${returnCode}`)
  console.log(`\nTransaction status: ${txStatus}`)
  console.log(
    `Transaction link: https://devnet-explorer.elrond.com/transactions/${txHash}\n`,
  )
}

const createNft = async () => {
  try {
    const { name, royalties, uri, sellingPrice } = {
      name: 'testifulify',
      royalties: 5,
      uri:
        'https://dweb.link/ipfs/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi',
      sellingPrice: 50000000000000000n, //(0.05 EGLD)
    }

    const { signer, account, provider } = await setup()

    const args = [
      BytesValue.fromUTF8(name),
      new BigUIntValue(new BigNumber(Number(royalties) * 100 || 0)),
      BytesValue.fromUTF8(uri || ''),
      new BigUIntValue(new BigNumber(Number(sellingPrice) || 0)),
    ]

    const data = new ContractCallPayloadBuilder()
      .setFunction(new ContractFunction('createNft'))
      .setArgs(args)
      .build()

    const tx = new Transaction({
      data,
      gasLimit:
        specialOpertationsGasLimit +
        data.length() * 1500 +
        (attributes?.length || 0 + hash?.length || 0) * 50000,
      receiver: contractAddress,
      sender: signer.getAddress(),
      value: 0,
      chainID: 'D',
    })

    await commonTxOperations(tx, account, signer, provider)
  } catch (e) {
    console.log(e?.message)
  }
}

createNft()

I am using their NFT Minter example from this repository https://github.com/ElrondNetwork/elrond-wasm-rs/blob/master/contracts/examples/nft-minter/src/lib.rs我正在使用此存储库中的 NFT Minter 示例https://github.com/ElrondNetwork/elrond-wasm-rs/blob/master/contracts/examples/nft-minter/src/lib.rs

The Smart Contract is deployed to the Devnet https://devnet-explorer.elrond.com/accounts/erd1qqqqqqqqqqqqqpgqlsd27rdekm3px5aydfahf9lcau0wrss3rfyqtvvxke智能合约部署到 Devnet https://devnet-explorer.elrond.com/accounts/erd1qqqqqqqqqqqqpgqlsd27rdekm3px5aydfahf9lcau0wrss3rfyqtvvxke

Really appreciate help, because I am stuck at the moment, tried different variations to call the contract but getting always the same error.非常感谢帮助,因为我现在被困住了,尝试了不同的变体来调用合同,但总是得到同样的错误。

Called the Smart Contract methods in the wrong order.以错误的顺序调用智能合约方法。

Initially I needed to call issueToken, then setLocalRoles and afterwards createNft.最初我需要调用 issueToken,然后是 setLocalRoles,然后是 createNft。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试使用 javascript 调用智能合约时出错 - Error when attempting to call smart contract with javascript 通过Javascript SDK共享Facebook链接返回错误500 - Sharing Facebook Link via Javascript SDK returns Error 500 通过javascript(web3.js)从部署的智能合约中调用特定的solidity函数 - Call specific solidity function from deployed smart contract within react through javascript (web3.js) 接受JavaScript中的参数以发送到Solidity智能合约 - Accepting parameters in javascript to send to solidity smart contract 使用 nodejs 进行智能合约测试失败并显示错误消息 - Smart Contract test with nodejs fails with an error message 测试智能合约时 Mocha 中的断言错误 - Assertion error in Mocha while testing the smart contract 从我的智能合约中调用已部署的智能合约的功能 - Call function of a already deployed smart contract from within my smart contract 通过 web3.js 调用和访问智能合约功能? - Call and access smart contract function through web3.js? web3.js调用智能合约函数无响应 - Call smart contract function by web3.js without response 如何从 Web 应用程序签署和调用锚 (solana) 智能合约 - How to Sign and call anchor (solana) smart contract from web app
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM