How to burn nft

my code is here

let balances = wallet.get_balances().await.unwrap();
     println!("balances: {:?}", balances);
    let asset_id = contract_instance.methods().asset_id(sub_id).call().await.unwrap();
    let asset = asset_id.value;
    println!("asset {:?}",asset);
    let burn = contract_instance.methods().burn(sub_id,1).with_variable_output_policy(VariableOutputPolicy::EstimateMinimum).with_tx_policies(TxPolicies::default()).call().await;
    dbg!(&burn);

response is here

asset e38ca8877350a706e45d1b7905f0167529914f6955bc2f1fb2c9242101956d56
balances: {"603b0679e65e6bb3a0fdc6ab370fc2f692978c62f8f4a9ac9a240ecfe5b297b5": 1, "e38ca8877350a706e45d1b7905f0167529914f6955bc2f1fb2c9242101956d56": 1, "4925923ac3f80e8bc180c5d2a470238cbb532af91919e10257c971717f80f170": 9000000000, "f8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07": 5181897}
asset e38ca8877350a706e45d1b7905f0167529914f6955bc2f1fb2c9242101956d56
[examples/contract.rs:64:5] &burn = Err(
    Transaction(
        Reverted {
            reason: "NotEnoughCoins",
            revert_id: 18446744073709486080,
            receipts: [
                Call {
                    id: 0x0000000000000000000000000000000000000000000000000000000000000000,
                    to: 0x20667443791e287f39703462e179904ba106063fd7c16c5188e9a5ba9e6faa78,
                    amount: 0,
                    asset_id: 0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07,
                    gas: 9158,
                    param1: 10480,
                    param2: 10492,
                    pc: 11712,
                    is: 11712,
                },
                LogData {
                    id: 0x20667443791e287f39703462e179904ba106063fd7c16c5188e9a5ba9e6faa78,
                    ra: 0,
                    rb: 4237256875605624201,
                    ptr: 67107328,
                    len: 8,
                    digest: 0xaf5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc,
                    pc: 28916,
                    is: 11712,
                    data: Some(0000000000000000),
                },
                Revert {
                    id: 0x20667443791e287f39703462e179904ba106063fd7c16c5188e9a5ba9e6faa78,
                    ra: 18446744073709486080,
                    pc: 28924,
                    is: 11712,
                },
                ScriptResult {
                    result: Revert,
                    gas_used: 33237,
                },
            ],
        },
    ),
)

just want to confirm are you on the latest version of rust SDK ie 0.64.0?

yes,its‘s rust sdk 0.64.0

Has anyone ever encountered this?

Can you please share your codebase, so that I can directly run it and reproduce it locally?

my test


#[warn(unused_imports)]
use fuels::{crypto::SecretKey, prelude::*, types::{Bits256,Bytes32, ContractId, Identity}};
use std::str::FromStr;

#[tokio::main]
async fn main() {
    abigen!(Contract(
        name = "MyContract",
        abi = "out/debug/src7_token-abi.json"
    ));
    let provider = Provider::connect("https://testnet.fuel.network/v1/graphql").await.unwrap();
    let secret =
        SecretKey::from_str("cc74e38f91112c34aa913592888e3a582850bfeaaa04cbb6914a746a9eb564e1")
            .unwrap();

    // Create the wallet
    let wallet = WalletUnlocked::new_from_private_key(secret, Some(provider.clone()));

    let contract_id: ContractId  =
        "0x20667443791e287f39703462e179904ba106063fd7c16c5188e9a5ba9e6faa78"
            .parse()
            .expect("Invalid ID");

    let hex_str = format!("{:064x}", 1);

    // 添加 '0x' 前缀
    let hex_str_with_prefix = format!("0x{}", hex_str);
    println!("hex_str_with_prefix {}",hex_str_with_prefix);
    let sub_id = Bits256::from_hex_str(&hex_str_with_prefix).unwrap();


    let contract_instance = MyContract::new(contract_id, wallet.clone());
    let asset_id = contract_instance.methods().asset_id(sub_id).call().await.unwrap();
    let asset = asset_id.value;
    println!("asset {:?}",asset);
    let form = Identity::Address(wallet.address().into());
    let init = contract_instance.methods().constructor(form).call().await.unwrap();
    // 将数字转换为十六进制字符串
    let burn = contract_instance.methods().burn(sub_id,1).with_variable_output_policy(VariableOutputPolicy::EstimateMinimum).with_tx_policies(TxPolicies::default()).call().await;

    dbg!(&burn);


}

src7_token-abi.json

code

Is there a solution to my problem?

Hey @lopo1, tests are passing for me Warp

You should use cargo run-- example nft_burn

What is the cause of this, can you help me to see

Hey @lopo1, i have asked the team and will keep you posted

1 Like

You need to include the asset that is burned in the call pararmeters:

let call_params = CallParameters::new(amount, asset_id, 1_000_000);
    let burn = contract_instance
.methods()
.burn(sub_id,1)
.with_variable_output_policy(VariableOutputPolicy::EstimateMinimum)
.with_tx_policies(TxPolicies::default())
.call_params(call_params)
.call()
.await;
1 Like

Can this be an asset that can only be burned at your own address? If you have contractual authority, can’t you burn nft at other addresses?

Only the minting contract has the ability to burn as the AssetId is the hash of the ContractId and SubId

If there is an nft AssetId on address A, address B has contract burn authority, can address B burn off A’s AssetId?

For any asset to be burned, it must be sent to or owned by the contract that minted it.

That is, if address A does not have this nft asset, it cannot burn the asset at address B, unless address B transfers the asset back to address A, or the contract, address A has the right to burn this asset