asharma
December 5, 2022, 6:54am
#1
Could anyone suggest me what I’m missing as I’m unable to add NFT to market place, here I’m sharing the screenshot of the error and here is my add-market.json file format
{
"nft_contract_address": { "index": 2109, "subindex": 0 },
"token_id": "00000157",
"price": "1",
"quantity":"1"
}
abizjak
December 6, 2022, 12:42pm
#2
Without access to the contract we cannot be sure. But this looks like you are passing it incorrect arguments.
If you show me the contract or at least the schema for the entrypoint I can help debugging it.
asharma
December 6, 2022, 12:54pm
#3
@abizjak I was using the concordium client here is my command:
./concordium-client --grpc-ip 35.90.185.212 --grpc-port 10001 contract update 2113 --entrypoint add --parameter-json ./nft-artifacts/add-marketplace.json --schema ./dist/marketplace-contract/schema.bin --sender 4B7MN4Btj7mnSwYPXxCH8Aa46oL4FW7JtdNXE8SNi1GutgNf46 --energy 10000
asharma
December 6, 2022, 12:59pm
#4
Could you please suggest me Which parameters I’m missing?
As I’m running the command using concordium client which is giving me error:
Error: Updating contract instance failed: ‘add’ in ‘Market-Place-NFT’ at {“index”:2113,“subindex”:0} failed with code -1
abizjak
December 6, 2022, 1:10pm
#5
What is ./dist/marketplace-contract/schema.bin
?
asharma
December 6, 2022, 1:27pm
#6
@abizjak this is the location of the file where the schema of the contract resides
abizjak
December 6, 2022, 1:56pm
#7
Yes, I want to get the contents of that file.
asharma
December 6, 2022, 3:36pm
#8
@abizjak Can you please provide me your email so I can share the file with you as it is not supported here in the attachment.
blue
December 7, 2022, 9:08am
#9
I may be wrong but if token_id , price, quantity are integers then you don’t need double quotes in parameter.json (“00000157”)
asharma
December 7, 2022, 11:56am
#10
@blue Okay Let me check and Update you
asharma
December 8, 2022, 5:17am
#11
Hello @abizjak I’m now able to add NFT using the old contract but Could you please suggest me What I’m missing in the Transfer Function (Transfer NFT to Another Account in market Place)
Payload:
{
“nft_contract_address”: {
"index": 1625,
"subindex": 0
},
“to”: “3yowPBLpS6nPXSPTEqq11ADrmQz8Yd2MEcgzXYYZYNtfjKV4u4”,
“token_id”: “00000201”
}
Command:
./concordium-client --grpc-ip 35.90.185.212 --grpc-port 10001 contract update 1817 --entrypoint transfer --parameter-json ./nft-artifacts/transfer-marketplace.json --schema ./dist/marketplace-contract/schema.bin --sender 4oJDR7mgQf5m7vtvVUMt3hbBc8je1VhsJsFDbJfWiBux9Ljge7 --energy 6000
abizjak
December 8, 2022, 9:06am
#12
I would need to see the contract to understand what error code -6
means. That is defined by the contract. If you can share the Rust code then I can help.
asharma
December 8, 2022, 9:18am
#13
@abizjak Its from the NFT Minting Tutorial from the medium, let me share you the file.
This is the Transfer Function in Which I’m facing error:
#[receive(
contract = "Market-NFT",
name = "transfer",
parameter = "TransferParams",
mutable,
payable
)]
fn transfer<S: HasStateApi>(
ctx: &impl HasReceiveContext,
host: &mut impl HasHost<State<S>, StateApiType = S>,
amount: Amount,
) → ContractResult<()> {
let params: TransferParams = ctx
.parameter_cursor()
.get()
.map_err(|_e| MarketplaceError::ParseParams)?;
let token: TokenState = host
.state()
.get_token(params.token_id, params.nft_contract_address)
.ok_or(MarketplaceError::TokenNotListed)?
.to_owned();
if let state::TokenListState::Listed(price) = token.get_curr_state() {
ensure!(
amount.cmp(&price).is_ge(),
MarketplaceError::InvalidAmountPaid
);
let amounts = calculate_amounts(&amount, &host.state().commission);
Cis2Client::transfer(
host,
params.token_id,
params.nft_contract_address,
concordium_cis2::TokenAmountU8(1),
token.get_owner(),
concordium_cis2::Receiver::Account(params.to),
)
.map_err(MarketplaceError::Cis2ClientError)?;
host.invoke_transfer(&token.get_owner(), amounts.to_owner)
.map_err(|_| MarketplaceError::InvokeTransferError)?;
host.invoke_transfer(&ctx.owner(), amounts.to_marketplace)
.map_err(|_| MarketplaceError::InvokeTransferError)?;
host.state_mut()
.delist_token(params.token_id, params.nft_contract_address, params.to);
} else {
bail!(MarketplaceError::TokenNotListed)
};
ContractResult::Ok(())
}
abizjak
December 8, 2022, 9:53am
#14
Can you show what the ContractResult
type is?
I assume it is something like
type ContractResult<A> = Result<A, ContractError>
Can you show what the ContractError
is?
abizjak
December 8, 2022, 2:24pm
#16
From this I guess that this fails
ensure!(
amount.cmp(&price).is_ge(),
MarketplaceError::InvalidAmountPaid
);
which means you probably have not transferred enough CCD. Does that make sense?
abizjak
December 8, 2022, 2:25pm
#17
You should add an --amount
flag to the concordium-client
invocation, with the amount you wish to transfer.
asharma
December 8, 2022, 3:25pm
#18
@abizjak Okay Let me try as you mentioned but I have a question we are transferring an NFT to Other account address so do we have to add amount or the amount will de deducted from the another account address.
abizjak
December 8, 2022, 6:42pm
#19
You cannot withdraw CCD from somebody else’s account. They have to authorize that.
You could write your contract in a way that you authorize the sale, and then the buyer needs to come and transfer CCD to the the contract to actual affect the sale. But I don’t see that being done in your contract.
asharma
December 12, 2022, 4:41am
#20
@abizjak This worked for me Thank You for the Support