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



我正在尝试从Elrond智能合约调用函数来创建NFT,我正在使用他们的JavaScript SDK。

这是我得到的错误:

TransactionCompletionStrategy.isCompleted(), found event: signalError

事务返回码:user error

这是我的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()

我正在使用这个存储库中的NFT Minter示例https://github.com/ElrondNetwork/elrond-wasm-rs/blob/master/contracts/examples/nft-minter/src/lib.rs

智能合约部署到Devnet https://devnet-explorer.elrond.com/accounts/erd1qqqqqqqqqqqqqpgqlsd27rdekm3px5aydfahf9lcau0wrss3rfyqtvvxke

非常感谢帮助,因为我现在卡住了,尝试了不同的变化来调用合同,但总是得到相同的错误。

以错误的顺序调用智能合约方法

最初我需要调用issueToken,然后是setLocalRoles,然后是createNft。