- panacea-core
- Docker
- Rust
- jq
This document covers:
- How to create Panacea NFT contracts for minting/transferring NFTs.
- How to create Panacea NFT Redeem contracts for exchanging NFTs for MED.
You must go to the panacea-nft directory and compile it.
cd panacea-nft
docker run --rm -v "$(pwd)":/code \
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
cosmwasm/rust-optimizer:0.11.5
cd artifacts/
You will see that two files were generated as below.
checksums.txt panacea_nft.wasm
Store this contract in panacea.
TX_FLAG=(--chain-id {your chainID} --gas auto --gas-prices 5umed --gas-adjustment 1.3)
MINTER=$(panacead keys show {your address or key} -a)
RES=$(panacead tx wasm store panacea_nft.wasm --from $MINTER $TX_FLAG -y) # 10MED used fee...
NFT_CODE=$(echo $RES | jq -r '.logs[].events[].attributes[] | select(.key == "code_id") | .value')
echo $NFT_CODE
Instantiate contract
INIT=$(jq -n --arg name "panacea nft" --arg symbol "p_nft" --arg minter $MINTER '{"name":$name,"symbol":$symbol,"minter":$minter}')
INIT_RES=$(panacead tx wasm instantiate $NFT_CODE "$INIT" \
--label 'panacea-nft' \
--from $MINTER \
$TX_FLAG -y) # 0.8MED used fee
NFT_CONTRACT=$(echo $INIT_RES | jq -r '.logs[].events[].attributes[0] | select(.key == "contract_address").value')
echo $NFT_CONTRACT
Mint NFT
MINT=$(jq -n --arg owner $MINTER --arg name "panacea_nft_1" --arg denom "umed" --arg amount "1000000000" '{"mint":{"owner":$owner, "name":$name, "price":{"denom":$denom, "amount":$amount}}}')
MINT_RES=$(panacead tx wasm execute $NFT_CONTRACT $MINT --from $MINTER $TX_FLAG -y)
TOKEN_ID=$(echo $MINT_RES | jq -r '.logs[].events[].attributes[] | select(.key == "token_id")'.value) # 0.8MED used fee
echo $TOKEN_ID
# Get contract info
QUERY_CONTRACT_INFO='{"contract_info":{}}'
panacead q wasm contract-state smart $NFT_CONTRACT $QUERY_CONTRACT_INFO
# Get token info
QUERY_TOKEN_INFO=$(jq -n --arg token_id $TOKEN_ID '{"nft_info":{"token_id":$token_id}}')
panacead q wasm contract-state smart $NFT_CONTRACT $QUERY_TOKEN_INFO
# Get owner info
QUERY_OWNER_OF=$(jq -n --arg token_id $TOKEN_ID '{"owner_of":{"token_id":$token_id}}')
panacead q wasm contract-state smart $NFT_CONTRACT $QUERY_OWNER_OF
Transfer ownership of the NFT
# make transfer_owner key
panacead keys add transfer_owner
TRANSFER_OWNER=$(panacead keys show transfer_owner -a)
panacead tx bank send $MINTER $TRANSFER_OWNER 2000000umed --from $MINTER $TX_FLAG -y
echo $MINTER
echo $TRANSFER_OWNER
TRANSFER=$(jq -n --arg recipient $TRANSFER_OWNER --arg token_id $TOKEN_ID '{"transfer_nft":{"recipient":$recipient, "token_id":$token_id}}')
TRANSFER_RES=$(panacead tx wasm execute $NFT_CONTRACT $TRANSFER --from $MINTER $TX_FLAG -y)
echo $TRANSFER_RES | jq
# Get owner info
QUERY_OWNER_OF=$(jq -n --arg token_id $TOKEN_ID '{"owner_of":{"token_id":$token_id}}')
panacead q wasm contract-state smart $NFT_CONTRACT $QUERY_OWNER_OF # Changed transfer_owner
echo $TRANSFER_OWNER
You must go to the panacea-nft-redeem path and compile it.
cd panacea-nft-redeem
docker run --rm -v "$(pwd)":/code \
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
cosmwasm/rust-optimizer:0.11.5
cd artifacts/
You will see that two files were generated as below.
checksums.txt panacea_nft_redeem.wasm
Store this contract in panacea.
TX_FLAG=(--chain-id {your chainID} --gas auto --gas-prices 5umed --gas-adjustment 1.3)
CREATOR=$(panacead keys show {your address or key} -a)
echo $CREATOR
STORE_RES=$(panacead tx wasm store payment_guarantee.wasm --from $CREATOR $TX_FLAG -y) # 6.5MED used fee
echo $STORE_RES | jq
PAYMENT_CODE=$(echo $STORE_RES | jq -r '.logs[].events[].attributes[] | select(.key == "code_id") | .value')
echo $PAYMENT_CODE
Instantiate contract
PAYMENT_INIT=$(jq -n --arg contracts "$NFT_CONTRACT" '{"source_contracts":$contracts | split(" ")}')
INIT_RES=$(panacead tx wasm instantiate $PAYMENT_CODE "$PAYMENT_INIT" \
--from $CREATOR \
$TX_FLAG -y \
--label 'payments guarantee') #0.8MED used fee
PAYMENT_CONTRACT=$(echo $INIT_RES | jq -r '.logs[].events[].attributes[0] | select(.key == "contract_address").value')
echo $PAYMENT_CONTRACT
You have to put the deposit in contract.
You can add the deposit as below or directly to the contract address.
DEPOSIT_RES=$(panacead tx wasm execute $PAYMENT_CONTRACT '{"deposit":{}}' --amount 1000000000umed --from $CREATOR $TX_FLAG -y)
# Get balances
panacead q bank balances $PAYMENT_CONTRACT
In order to receive the reward, the NFT must be sent (returned) to the payment-guarantee
contract. For that, the contract address and token_id are required.
If the transaction is successful, the owner of the NFT will be changed and the amount specified in the NFT will be paid to the NFT exchange requester.
(Unimplemented) If the transaction fails, the owner of the NFT becomes the exchange requester.
# before
panacead q bank balances $TRANSFER_OWNER # Deposit amount excluding fees
REWARD_NFT=$(jq -n --arg contract $PAYMENT_CONTRACT --arg token_id $TOKEN_ID '{"send_nft":{"contract":$contract,"token_id":$token_id}}')
echo $REWARD_NFT
REWARD_NFT_RES=$(panacead tx wasm execute $NFT_CONTRACT "$REWARD_NFT" --from $TRANSFER_OWNER $TX_FLAG -y)
# after
QUERY_OWNER_OF=$(jq -n --arg token_id $TOKEN_ID '{"owner_of":{"token_id":$token_id}}')
panacead q wasm contract-state smart $NFT_CONTRACT $QUERY_OWNER_OF # owner is 'creator'
panacead q bank balances $PAYMENT_CONTRACT
panacead q bank balances $TRANSFER_OWNER # Deposit amount excluding fees