From 2ace7cb4853cd5afcfba4c148c6a6564433591ea Mon Sep 17 00:00:00 2001 From: ipopescu Date: Fri, 1 Mar 2024 22:41:33 +0100 Subject: [PATCH 1/6] Fix incorrect link --- source/docs/casper/concepts/dictionaries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/docs/casper/concepts/dictionaries.md b/source/docs/casper/concepts/dictionaries.md index 4d34efa8c8..6f4ea0fc11 100644 --- a/source/docs/casper/concepts/dictionaries.md +++ b/source/docs/casper/concepts/dictionaries.md @@ -37,7 +37,7 @@ The [Casper CEP-78 Enhanced NFT Standard](https://github.com/casper-ecosystem/ce Simple examples for dictionary use within CEP-78 include the [`approve`](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/dev/contract/src/main.rs#L772) dictionary. -More advanced dictionary functionality can be found in the [CEP-78 Page System](https://github.com/casper-ecosystem/cep-78-enhanced-nft#the-cep-78-page-system), which uses a series of dictionaries to keep track of token ownership. These dictionaries form the basis of the reverse lookup mode, which allows users to easily view a list of owned tokens by account or contract. +More advanced dictionary functionality can be found in the [CEP-78 Page System](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/dev/docs/reverse-lookup.md#the-cep-78-page-system), which uses a series of dictionaries to keep track of token ownership. These dictionaries form the basis of the reverse lookup mode, which allows users to easily view a list of owned tokens by account or contract. ## Creating Dictionaries in a Contract's Context From be4cdf2f0a2790b0a3541f000689d82932c88fbb Mon Sep 17 00:00:00 2001 From: ipopescu Date: Fri, 1 Mar 2024 23:26:09 +0100 Subject: [PATCH 2/6] Add the full NFT tutorial from the cep-78 repository --- config/sidebar.config.js | 17 +- .../resources/tokens/cep78/introduction.md | 6 +- .../tokens/cep78/using-casper-client.md | 231 --- .../full-installation-tutorial.md | 1530 +++++++++++++++++ .../interacting-with-NFTs.md | 345 ++++ .../using-casper-client/querying-NFTs.md | 550 ++++++ .../using-casper-client/quickstart-guide.md | 68 + .../cep78/using-casper-client/testing-NFTs.md | 29 + source/docs/casper/resources/tokens/index.md | 2 +- .../cep-78/the-nft-contract-hash.png | Bin 0 -> 200871 bytes 10 files changed, 2543 insertions(+), 235 deletions(-) delete mode 100644 source/docs/casper/resources/tokens/cep78/using-casper-client.md create mode 100644 source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md create mode 100644 source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md create mode 100644 source/docs/casper/resources/tokens/cep78/using-casper-client/querying-NFTs.md create mode 100644 source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md create mode 100644 source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md create mode 100644 static/image/tutorials/cep-78/the-nft-contract-hash.png diff --git a/config/sidebar.config.js b/config/sidebar.config.js index 38abaf44fc..91637b38e8 100644 --- a/config/sidebar.config.js +++ b/config/sidebar.config.js @@ -319,7 +319,22 @@ module.exports = { }, items: [ "resources/tokens/cep78/modalities", - "resources/tokens/cep78/using-casper-client", + { + type: "category", + label: "On-chain Installation", + collapsible: true, + collapsed: true, + link: { + type: "doc", + id: "resources/tokens/cep78/using-casper-client/quickstart-guide", + }, + items: [ + "resources/tokens/cep78/using-casper-client/full-installation-tutorial", + "resources/tokens/cep78/using-casper-client/interacting-with-NFTs", + "resources/tokens/cep78/using-casper-client/querying-NFTs", + "resources/tokens/cep78/using-casper-client/testing-NFTs", + ], + }, "resources/tokens/cep78/reverse-lookup", "resources/tokens/cep78/js-tutorial", ], diff --git a/source/docs/casper/resources/tokens/cep78/introduction.md b/source/docs/casper/resources/tokens/cep78/introduction.md index 2fda07b83d..241a8ea984 100644 --- a/source/docs/casper/resources/tokens/cep78/introduction.md +++ b/source/docs/casper/resources/tokens/cep78/introduction.md @@ -16,6 +16,8 @@ The pre-built Wasm for the contract and all other utility session code can be fo The `call` method will install the contract with the necessary entrypoints and call the `init()` entrypoint, which allows the contract to self-initialize and set up the necessary state variables for operation. +The [Full Installation Tutorial](./using-casper-client/full-installation-tutorial.md) provides a step-by-step workflow. + ### Required Runtime Arguments The following are the required runtime arguments that must be passed to the installer session code to correctly install the NFT contract. For more information on the modalities that these arguments set, please refer to the [Modalities](./modalities.md) documentation. @@ -46,7 +48,7 @@ The following are the optional parameters that can be passed in at the time of i #### Example deploy -The following is an example of installing the NFT contract via a deploy using the Rust CLI Casper client. You can find more examples [here](./using-casper-client.md). +The following is an example of installing the NFT contract via a deploy using the Rust CLI Casper client. You can find more examples [here](./using-casper-client/full-installation-tutorial.md). ```bash casper-client put-deploy -n http://65.108.0.148:7777/rpc --chain-name "casper-test" --payment-amount 500000000000 -k keys/secret_key.pem --session-path contract/target/wasm32-unknown-unknown/release/contract.wasm \ @@ -89,7 +91,7 @@ Upgrade to v1.1.1 using a [Standard NamedKey Convention](https://github.com/casp ## Installing and Interacting with the Contract using the Rust Casper Client -You can find instructions on installing an instance of the CEP-78 contract using the Rust CLI Casper client [here](./using-casper-client.md). +You can find instructions on installing an instance of the CEP-78 contract using the Rust CLI Casper client [here](./using-casper-client/full-installation-tutorial.md). ## Test Suite and Specification diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client.md b/source/docs/casper/resources/tokens/cep78/using-casper-client.md deleted file mode 100644 index 97a975dd78..0000000000 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: On-chain Installation -slug: /resources/tokens/using-casper-client ---- - - -# Installing and Interacting with a CEP-78 Contract using the Rust Casper Client - -This documentation will guide you through the process of installing and interacting with an instance of the CEP-78 enhanced NFT standard contract through Casper's Rust CLI client. The contract code installs an instance of CEP-78 as per session arguments provided at the time of installation. It requires a minimum Rust version of `1.63.0`. - -Information on the modalities used throughout this installation process can be found in the [modalities documentation](modalities.md). - -## Installing the Contract - -Installing the enhanced NFT contract to global state requires the use of a [Deploy](/developers/cli/sending-deploys/). In this case, the session code can be compiled to Wasm by running the `make build-contract` command provided in the Makefile at the top level. The Wasm will be found in the `contract/target/wasm32-unknown-unknown/release` directory as `contract.wasm`. - -Below is an example of a `casper-client` command that provides all required session arguments to install a valid instance of the CEP-78 contract on global state. - -- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 500000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-path ~/casper/enhanced-nft/contract/target/wasm32-unknown-unknown/release/contract.wasm` - -1. `--session-arg "collection_name:string='CEP-78-collection'"` - - The name of the NFT collection as a string. In this instance, "CEP-78-collection". - -2. `--session-arg "collection_symbol:string='CEP78'"` - - The symbol representing the NFT collection as a string. In this instance, "CEP78". - -3. `--session-arg "total_token_supply:u64='100'"` - - The total supply of tokens to be minted. In this instance, 100. If the contract owner is unsure of the total number of NFTs they will require, they should err on the side of caution. - -4. `--session-arg "ownership_mode:u8='2'"` - - The ownership mode for this contract. In this instance the 2 represents "Transferable" mode. Under these conditions, users can freely transfer their NFTs between one another. - -5. `--session-arg "nft_kind:u8='1'"` - - The type of commodity represented by these NFTs. In this instance, the 1 represents a digital collection. - -6. `--session-arg "nft_metadata_kind:u8='0'"` - - The type of metadata used by this contract. In this instance, the 0 represents CEP-78 standard for metadata. - -7. `--session-arg "json_schema:string=''"` - - An empty JSON string, as the contract has awareness of the CEP-78 JSON schema. Using the custom validated modality would require passing through a valid JSON schema for your custom metadata. - -8. `--session-arg "identifier_mode:u8='0'"` - - The mode used to identify individual NFTs. For 0, this means an ordinal identification sequence rather than by hash. - -9. `--session-arg "metadata_mutability:u8='0'"` - - A setting allowing for mutability of metadata. This is only available when using the ordinal identification mode, as the hash mode depends on immutability for identification. In this instance, despite ordinal identification, the 0 represents immutable metadata. - -The session arguments match the available modalities as listed [here](./modalities.md). - -
-Casper client command without comments - -```bash -casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 500000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-path ~/casper/enhanced-nft/contract/target/wasm32-unknown-unknown/release/contract.wasm \ ---session-arg "collection_name:string='CEP-78-collection'" \ ---session-arg "collection_symbol:string='CEP78'" \ ---session-arg "total_token_supply:u64='100'" \ ---session-arg "ownership_mode:u8='2'" \ ---session-arg "nft_kind:u8='1'" \ ---session-arg "nft_metadata_kind:u8='0'" \ ---session-arg "json_schema:string=''" \ ---session-arg "identifier_mode:u8='0'" \ ---session-arg "metadata_mutability:u8='0'" -``` - -
- -## Directly Invoking Entrypoints - -With the release of CEP-78 version 1.1, users that are interacting with a CEP-78 contract that does not use `ReverseLookupMode` should opt out of using the client Wasms provided as part of the release. Opting out in this situation is recommended, as directly invoking the entrypoints incurs a lower gas cost compared against using the provided client Wasm to invoke the entrypoint. - -You may invoke the `mint`, `transfer` or `burn` entrypoints directly through either the contract package hash or the contract hash directly. - -Specifically in the case of `mint`, there are fewer runtime arguments that must be provided, thereby reducing the total gas cost of minting an NFT. - -
-Example Mint using StoredVersionByHash - -```bash - -casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ --payment-amount 7500000000 \ -k ~/secret_key.pem \ ---session-package-hash hash-b3b7a74ae9ef2ea8afc06d6a0830961259605e417e95a53c0cb1ca9737bb0ec7 \ ---session-entry-point "mint" \ ---session-arg "token_owner:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'" \ ---session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'" - -``` - -
- -
-Example Transfer using StoredContractByHash - -Based on the identifier mode for the given contract instance, either the `token_id` runtime argument must be passed in or in the case of the hash identifier mode, the `token_hash` runtime argument. - -```bash - -casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ --payment-amount 7500000000 \ -k ~/secret_key.pem \ ---session-hash hash-b3b7a74ae9ef2ea8afc06d6a0830961259605e417e95a53c0cb1ca9737bb0ec7 \ ---session-entry-point "transfer" \ ---session-arg "source_key:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'" \ ---session-arg "target_key:key='account-hash-b4782e7c47e4deca5bd90b7adb2d6e884f2d331825d5419d6cbfb59e17642aab'" \ ---session-arg "token_id:u64='0'" - -``` - -
- -## Minting an NFT - -Below is an example of a `casper-client` command that uses the `mint` function of the contract to mint an NFT for the user associated with `node-1` in an [NCTL environment](/developers/dapps/nctl-test/). - -- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-path ~/casper/enhanced-nft/client/mint_session/target/wasm32-unknown-unknown/release/mint_call.wasm` - -1. `--session-arg "nft_contract_hash:key='hash-206339c3deb8e6146974125bb271eb510795be6f250c21b1bd4b698956669f95'"` - - The contract hash of the previously installed CEP-78 NFT contract from which we will be minting. - -2. `--session-arg "collection_name:string='cep78_'"` - - The collection name of the previously installed CEP-78 NFT contract from which we will be minting. - -3. `--session-arg "token_owner:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'"` - - The collection name of the NFT to be minted. - -4. `--session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'"` - - Metadata describing the NFT to be minted, passed in as a `string`. - -
-Casper client command without comments - -```bash - -casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ ---payment-amount 5000000000 \ --k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ ---session-path ~/casper/enhanced-nft/client/mint_session/target/wasm32-unknown-unknown/release/mint_call.wasm \ ---session-arg "nft_contract_hash:key='hash-206339c3deb8e6146974125bb271eb510795be6f250c21b1bd4b698956669f95'" \ ---session-arg "collection_name:string='cep78_'"` \ ---session-arg "token_owner:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'" \ ---session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'" - -``` - -
- -## Transferring NFTs Between Users - -Below is an example of a `casper-client` command that uses the `transfer` function to transfer ownership of an NFT from one user to another. In this case, we are transferring the previously minted NFT from the user associated with `node-2` to the user associated with `node-3`. - -- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-2/keys/secret_key.pem --session-path ~/casper/enhanced-nft/client/transfer_session/target/wasm32-unknown-unknown/release/transfer_call.wasm` - -1. `--session-arg "nft_contract_hash:key='hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5'"` - - The contract hash of the CEP-78 NFT Contract associated with the NFT to be transferred. - -2. `--session-arg "source_key:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'"` - - The account hash of the user that currently owns the NFT and wishes to transfer it. - -3. `--session-arg "target_key:key='account-hash-b4772e7c47e4deca5bd90b7adb2d6e884f2d331825d5419d6cbfb59e17642aab'"` - - The account hash of the user that will receive the NFT. - -4. `--session-arg "is_hash_identifier_mode:bool='false'"` - - Argument that the hash identifier mode is ordinal, thereby requiring a `token_id` rather than a `token_hash`. - -5. `--session-arg "token_id:u64='0'"` - - The `token_id` of the NFT to be transferred. - -
-Casper client command without comments - -```bash -casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ ---payment-amount 5000000000 \ --k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-2/keys/secret_key.pem \ ---session-path ~/casper/enhanced-nft/client/transfer_session/target/wasm32-unknown-unknown/release/transfer_call.wasm \ ---session-arg "nft_contract_hash:key='hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5'" \ ---session-arg "source_key:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'" \ ---session-arg "target_key:key='account-hash-b4772e7c47e4deca5bd90b7adb2d6e884f2d331825d5419d6cbfb59e17642aab'" \ ---session-arg "is_hash_identifier_mode:bool='false'" \ ---session-arg "token_id:u64='0'" -``` - -
- -## Burning an NFT - -Below is an example of a `casper-client` command that uses the `burn` function to burn an NFT within a CEP-78 collection. If this command is used, the NFT in question will no longer be accessible by anyone. - -- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem` - -1. `--session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5` - - The session hash corresponding to the NFT's contract hash. - -2. `--session-entry-point "burn"` - - The entrypoint corresponding to the `burn` function. - -3. `--session-arg "token_id:u64='1'"` - - The token ID for the NFT to be burned. If the `identifier_mode` is not set to `Ordinal`, you must provide the `token_hash` instead. - -
-Casper client command without comments - -```bash -casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ ---payment-amount 5000000000 \ --k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ ---session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5 \ ---session-entry-point "burn" \ ---session-arg "token_id:u64='1'" -``` - -
\ No newline at end of file diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md new file mode 100644 index 0000000000..4477a33159 --- /dev/null +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md @@ -0,0 +1,1530 @@ +--- +title: Installation Workflow +--- + +# Installing an NFT Contract using the Rust Casper Client + +This documentation will guide you through installing and interacting with an instance of the CEP-78 enhanced NFT standard contract through Casper's Rust CLI client. The contract code installs an instance of CEP-78 given the session arguments provided. It requires a minimum Rust version of `1.63.0`. The code for this tutorial is available in [GitHub](https://github.com/casper-ecosystem/cep-78-enhanced-nft/). A portion of this tutorial reviews the [contract](https://github.com/casper-ecosystem/cep-78-enhanced-nft/tree/dev/contract). + +Information on the modalities used throughout this installation process can be found in the [modalities documentation](../modalities.md). + +## Table of Contents + +1. [Environment Setup](#environment-setup) + - [Prerequisites](#prerequisites) + - [Building the Contract and Tests](#building-the-contract-and-tests) +2. [Reviewing the Contract Implementation](#reviewing-the-contract-implementation) + - [Required Crates](#required-crates) + - [Initialization Flow](#Initialization-flow) + - [Contract Entrypoints](#contract-entrypoints) +3. [Installing the Contract](#installing-the-contract) + - [Querying Global State](#querying-global-state) + - [Sending the Installation Deploy](#sending-the-installation-deploy) + - [Verifying the Installation](#verifying-the-installation) +4. [Next Steps](#next-steps) + +## Environment Setup + +### Prerequisites + +Before using this guide, ensure you meet the following requirements: + +- Set up the [development prerequisites](https://docs.casper.network/developers/prerequisites/), including the [Casper client](https://docs.casper.network/developers/prerequisites/#install-casper-client) +- Get a valid [node address](https://docs.casper.network/developers/prerequisites/#acquire-node-address-from-network-peers) from the network +- Know how to install a [smart contract](https://docs.casper.network/developers/cli/sending-deploys/) on a Casper network +- Hold enough CSPR tokens to pay for transactions + +The [Writing Rust Contracts on Casper](https://docs.casper.network/developers/writing-onchain-code/simple-contract/) document outlines many aspects of this tutorial and should be read as a prerequisite. + +### Building the Contract and Tests + +First, clone the contract from GitHub: + +```bash +git clone https://github.com/casper-ecosystem/cep-78-enhanced-nft/ && cd cep-78-enhanced-nft +``` + +Prepare your environment with the following command: + +```bash +make prepare +``` + +If your environment is set up correctly, you will see this output: + +```bash +rustup target add wasm32-unknown-unknown +info: component 'rust-std' for target 'wasm32-unknown-unknown' is up to date +``` + +If you do not see this message, check the [Getting Started Guide](https://docs.casper.network/developers/writing-onchain-code/getting-started/). + +The contract code can be compiled to Wasm by running the `make build-contract` command provided in the Makefile at the top level. The Wasm will be found in the `contract/target/wasm32-unknown-unknown/release` directory as `contract.wasm`. + +You can also compile your contract and run the contract unit tests with this command: + +```bash +make test +``` + +## Reviewing the Contract Implementation + +In this repository, you will find a library and an [example NFT implementation](https://github.com/casper-ecosystem/cep-78-enhanced-nft/tree/dev/contract) for Casper networks. This section explains the example contract in more detail. + +There are four steps to follow when you intend to create your implementation of the NFT contract, as follows: + +1. Fork the code from the example repository listed above. +2. Perform any necessary customization changes on your fork of the example contract. +3. Compile the customized code to Wasm. +4. Send the customized Wasm as a deploy to a Casper network. + +### Required Crates + +This tutorial applies to the Rust implementation of the Casper NFT standard, which requires the following Casper crates: + +- [casper_contract](https://docs.rs/casper-contract/latest/casper_contract/index.html) - A Rust library for writing smart contracts on Casper networks +- [casper_types](https://docs.rs/casper-types/latest/casper_types/) - Types used to allow the creation of Wasm contracts and tests for use on Casper networks + +Here is the code snippet that imports those crates: + +```rust +use casper_contract::{ + contract_api::{ + runtime::{self, call_contract, revert}, + storage::{self}, + }, + unwrap_or_revert::UnwrapOrRevert, +}; +use casper_types::{ + contracts::NamedKeys, runtime_args, CLType, CLValue, ContractHash, ContractPackageHash, + EntryPoint, EntryPointAccess, EntryPointType, EntryPoints, Key, KeyTag, Parameter, RuntimeArgs, + Tagged, +}; +``` + +**Note**: In Rust, the keyword `use` is like an include statement in C/C++. + +The contract code defines additional modules in the `contract/src` folder: + +```rust +mod constants; +mod error; +mod events; +mod metadata; +mod modalities; +mod utils; +``` + +- `constants` - Constant values required to run the contract code +- `error` - Errors related to the NFT contract +- `events` - A library for contract-emitted events +- `metadata` - Module handling the contract's metadata and corresponding dictionary +- `modalities` - Common expectations around contract usage and behavior +- `utils` - Utility and helper functions to run the contract code + +### Initialization Flow + +Initializing the contract happens through the `call() -> install_contract() -> init()` functions inside the [main.rs](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/dev/contract/src/main.rs) contract file. The `init()` function reads the runtime arguments and defines parameters such as `collection_name`, `collection_symbol`, and `total_token_supply`, among the other required and optional arguments described [here](../introduction.md#required-runtime-arguments). + +### Contract Entrypoints + +This section briefly explains the essential entrypoints used in the Casper NFT contract. To see their full implementation, refer to the [main.rs](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/dev/contract/src/main.rs) contract file. For further questions, contact the Casper support team via the [Discord channel](https://discord.com/invite/casperblockchain). The following entrypoints are listed as they are found in the code. + +- [**approve**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1002) - Allows a spender to transfer up to an amount of the owners’s tokens +- [**balance_of**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1616) - Returns the token balance of the owner +- [**burn**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L874) - Burns tokens, reducing the total supply +- [**get_approved**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1728) - Returns the hash of the approved account for a specified token identifier +- [**init**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L81) - Sets the collection name, symbol, and total token supply; initializes the allow minting setting, minting mode, ownership mode, NFT kind, holder mode, whitelist mode and contract whitelist, JSON schema, receipt name, identifier mode, and burn mode. This entrypoint can only be called once when the contract is installed on the network +- [**metadata**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1675) - Returns the metadata associated with a token identifier +- [**mint**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L619) - Mints additional tokens if minting is allowed, increasing the total supply +- [**owner_of**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1636) - Returns the owner for a specified token identifier +- [**set_approval_for_all**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1254) - Allows a spender to transfer all of the owner's tokens +- [**set_token_metadata**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1773) - Sets the metadata associated with a token identifier +- [**set_variables**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L496) - Allows the user to set any combination of variables simultaneously, defining which variables are mutable or immutable +- [**transfer**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1359) - Transfers tokens from the token owner to a specified account. The transfer will succeed if the caller is the token owner or an approved operator. The transfer will fail if the OwnershipMode is set to Minter or Assigned + +There is also the [**migrate**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1975) entrypoint, which was needed only for migrating a 1.0 version of the NFT contract to version 1.1. + +## Installing the Contract + +Installing the enhanced NFT contract to global state requires using a [Deploy](../../../../developers/dapps/sending-deploys/). But before proceeding with the installation, verify the network state and the status of the account that will send the installation deploy. + +### Querying Global State + +This step queries information about the network state given the latest state root hash. You will also need the [IP address](../../../../developers/prerequisites/#acquire-node-address-from-network-peers) from a Testnet peer node. + +```bash +casper-client get-state-root-hash --node-address http://localhost:11101/rpc/ +``` + +### Querying the Account State + +Run the following command and supply the path to your public key in hexadecimal format to get the account hash if you don't have it already. + +```bash +casper-client account-address --public-key [PATH_TO_PUBLIC_KEY_HEX] +``` + +Use the command below to query the state of your account. + +```bash +casper-client query-global-state --node-address http:// \ +--state-root-hash [STATE_ROOT_HASH] \ +--key [ACCOUNT_HASH] +``` + +
+Expand for a sample query and response + +```bash +casper-client query-global-state --node-address http://localhost:11101/rpc/ \ +--state-root-hash 376b18e95312328f212f9966200fa40734e66118cbd34ace0a1ec14eacaea6e6 \ +--key account-hash-82729ae3b368bb2c45d23c05c872c446cbcf32b694f1d9efd3d1ea46cf227a11 +``` + +```json +{ + "jsonrpc": "2.0", + "id": -6733022256306802125, + "result": { + "api_version": "1.5.6", + "block_header": null, + "stored_value": { + "Account": { + "account_hash": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "named_keys": [], + "main_purse": "uref-11e6fc5354f61a004df98482376c45964b8b1557e8f2f13fb5f3adab5faa8be1-007", + "associated_keys": [ + { + "account_hash": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "weight": 1 + } + ], + "action_thresholds": { + "deployment": 1, + "key_management": 1 + } + } + }, + "merkle_proof": "[32706 hex chars]" + } +} +``` + +
+ + +### Sending the Installation Deploy + +Below is an example of a `casper-client` command that provides all required session arguments to install a valid instance of the CEP-78 contract on global state. + +Use the Testnet to understand the exact gas amount required for installation. Refer to the [note about gas prices](../../../../developers/cli/sending-deploys/#a-note-about-gas-price) to understand payment amounts and gas price adjustments. + +- `casper-client put-deploy -n http://localhost:11101/rpc/ --chain-name "casper-net-1" --payment-amount 500000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-2/keys/secret_key.pem --session-path contract/target/wasm32-unknown-unknown/release/contract.wasm` + +1. `--session-arg "collection_name:string='CEP-78-collection'"` + + The name of the NFT collection as a string. In this instance, "CEP-78-collection". + +2. `--session-arg "collection_symbol:string='CEP78'"` + + The symbol representing the NFT collection as a string. In this instance, "CEP78". + +3. `--session-arg "total_token_supply:u64='100'"` + + The total supply of tokens to be minted. In this instance, 100. If the contract owner is unsure of the total number of NFTs they will require, they should err on the side of caution. + +4. `--session-arg "ownership_mode:u8='2'"` + + The ownership mode for this contract. In this instance, the 2 represents "Transferable" mode. Under these conditions, users can freely transfer their NFTs between one another. + +5. `--session-arg "nft_kind:u8='1'"` + + The type of commodity represented by these NFTs. In this instance, the 1 represents a digital collection. + +6. `--session-arg "nft_metadata_kind:u8='0'"` + + The type of metadata used by this contract. In this instance, the 0 represents CEP-78 standard for metadata. + +7. `--session-arg "json_schema:string=''"` + + An empty JSON string, as the contract has awareness of the CEP-78 JSON schema. Using the custom-validated modality would require passing through a valid JSON schema for your custom metadata. + +8. `--session-arg "identifier_mode:u8='0'"` + + The mode used to identify individual NFTs. For 0, this means an ordinal identification sequence rather than by hash. + +9. `--session-arg "metadata_mutability:u8='0'"` + + A setting allowing for mutability of metadata. This is only available when using the ordinal identification mode, as the hash mode depends on immutability for identification. In this instance, despite ordinal identification, the 0 represents immutable metadata. + +The session arguments match the available [modalities](../modalities.md). + + +
+Expand for a sample query and response + +```bash +casper-client put-deploy --node-address http://localhost:11101/rpc/ \ +--chain-name "casper-net-1" \ +--payment-amount 500000000000 \ +--secret-key ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-path contract/target/wasm32-unknown-unknown/release/contract.wasm \ +--session-arg "collection_name:string='CEP-78-collection'" \ +--session-arg "collection_symbol:string='CEP78'" \ +--session-arg "total_token_supply:u64='100'" \ +--session-arg "ownership_mode:u8='2'" \ +--session-arg "nft_kind:u8='1'" \ +--session-arg "nft_metadata_kind:u8='0'" \ +--session-arg "json_schema:string='nft-schema'" \ +--session-arg "identifier_mode:u8='0'" \ +--session-arg "metadata_mutability:u8='0'" +``` + +This command will output the `deploy_hash`, which can be used in the next step to verify the installation. + +```bash +{ + "jsonrpc": "2.0", + "id": 3104428017957320684, + "result": { + "api_version": "1.0.0", + "deploy_hash": "2b084bdccbaaae2b9c6e4de2f5a6cdf06c72f0d02eaeb7d681a29ebdbe3c92b7" + } +} +``` + +
+ + +### Verifying the Installation + +Verify the sent deploy using the `get-deploy` command. + +```bash +casper-client get-deploy --node-address http://localhost:11101/rpc/ [DEPLOY_HASH] +``` + +
+Expand for sample deploy details + +```json +{ + "jsonrpc": "2.0", + "id": -7282936875867676694, + "result": { + "api_version": "1.5.6", + "deploy": { + "hash": "1d1f66b26eb648b5f15bc958a552036e8521b508706056817b0d41c71f6d7afe", + "header": { + "account": "0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf", + "timestamp": "2024-02-29T18:28:16.104Z", + "ttl": "30m", + "gas_price": 1, + "body_hash": "90866126c3dbb9a27f672307102bf651663934ee34715d46f9f02caa70226743", + "dependencies": [], + "chain_name": "casper-test" + }, + "payment": { + "ModuleBytes": { + "module_bytes": "", + "args": [ + [ + "amount", + { + "cl_type": "U512", + "bytes": "050088526a74", + "parsed": "500000000000" + } + ] + ] + } + }, + "session": { + "ModuleBytes": { + "module_bytes": "[621680 hex chars]", + "args": [ + [ + "collection_name", + { + "cl_type": "String", + "bytes": "120000004345502d37382d636f6c6c656374696f6e32", + "parsed": "CEP-78-collection" + } + ], + [ + "collection_symbol", + { + "cl_type": "String", + "bytes": "050000004345503738", + "parsed": "CEP78" + } + ], + [ + "total_token_supply", + { + "cl_type": "U64", + "bytes": "6400000000000000", + "parsed": 100 + } + ], + [ + "ownership_mode", + { + "cl_type": "U8", + "bytes": "02", + "parsed": 2 + } + ], + [ + "nft_kind", + { + "cl_type": "U8", + "bytes": "01", + "parsed": 1 + } + ], + [ + "nft_metadata_kind", + { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + ], + [ + "json_schema", + { + "cl_type": "String", + "bytes": "0a0000006e66742d736368656d61", + "parsed": "nft-schema" + } + ], + [ + "identifier_mode", + { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + ], + [ + "metadata_mutability", + { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + ] + ] + } + }, + "approvals": [ + { + "signer": "0154d828baafa6858b92919c4d78f26747430dcbecb9aa03e8b44077dc6266cabf", + "signature": "01f866dd88fd179fd214262d0451a92be2673e6d4095eb79beef9e5b8bbbc18862e76c3085dcb1b1ae669a185cb80d94c5084325913b8118338645952bb5ee2200" + } + ] + }, + "execution_results": [ + { + "block_hash": "dca9ff6e9ad7baeead715504dee098069f30dbb9975730be3d3926ab1c58f332", + "result": { + "Success": { + "effect": { + "operations": [], + "transforms": [ + { + "key": "account-hash-6174cf2e6f8fed1715c9a3bace9c50bfe572eecb763b0ed3f644532616452008", + "transform": "Identity" + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "hash-624dbe2395b9d9503fbee82162f1714ebff6b639f96d2084d26d944c354ec4c5", + "transform": "Identity" + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "hash-010c3fe81b7b862e50c77ef9a958a05bfa98444f26f96f23d37a13c96244cfb7", + "transform": "Identity" + }, + { + "key": "hash-9824d60dc3a5c44a20b9fd260a412437933835b52fc683d8ae36e4ec2114843e", + "transform": "Identity" + }, + { + "key": "hash-010c3fe81b7b862e50c77ef9a958a05bfa98444f26f96f23d37a13c96244cfb7", + "transform": "Identity" + }, + { + "key": "balance-11e6fc5354f61a004df98482376c45964b8b1557e8f2f13fb5f3adab5faa8be1", + "transform": "Identity" + }, + { + "key": "balance-98d945f5324f865243b7c02c0417ab6eac361c5c56602fd42ced834a1ba201b6", + "transform": "Identity" + }, + { + "key": "balance-11e6fc5354f61a004df98482376c45964b8b1557e8f2f13fb5f3adab5faa8be1", + "transform": { + "WriteCLValue": { + "cl_type": "U512", + "bytes": "05c2d627778f", + "parsed": "616179422914" + } + } + }, + { + "key": "balance-98d945f5324f865243b7c02c0417ab6eac361c5c56602fd42ced834a1ba201b6", + "transform": { + "AddUInt512": "500000000000" + } + }, + { + "key": "uref-e42cd3ae8b4bd60306a72f0f4e9faa4e114e2e2cce5db03bfdd109a8db888e14-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30", + "transform": "WriteContractPackage" + }, + { + "key": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "transform": { + "AddKeys": [ + { + "name": "cep78_contract_package_CEP-78-collection", + "key": "hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30" + } + ] + } + }, + { + "key": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "transform": { + "AddKeys": [ + { + "name": "cep78_contract_package_access_CEP-78-collection", + "key": "uref-e42cd3ae8b4bd60306a72f0f4e9faa4e114e2e2cce5db03bfdd109a8db888e14-007" + } + ] + } + }, + { + "key": "hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30", + "transform": "Identity" + }, + { + "key": "hash-845d3d08e29642afba35704bcb6e38f3c40f1469763bff7a88674c9a5be3f01b", + "transform": "WriteContractWasm" + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": "WriteContract" + }, + { + "key": "hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30", + "transform": "WriteContractPackage" + }, + { + "key": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "transform": { + "AddKeys": [ + { + "name": "cep78_contract_hash_CEP-78-collection", + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796" + } + ] + } + }, + { + "key": "uref-0545c60c0a55e4d8a10fe0c3b2d356150b082e2243b6795b34f67643e4ca13d0-000", + "transform": { + "WriteCLValue": { + "cl_type": "U32", + "bytes": "01000000", + "parsed": 1 + } + } + }, + { + "key": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "transform": { + "AddKeys": [ + { + "name": "cep78_contract_version_CEP-78-collection", + "key": "uref-0545c60c0a55e4d8a10fe0c3b2d356150b082e2243b6795b34f67643e4ca13d0-007" + } + ] + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": "Identity" + }, + { + "key": "hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30", + "transform": "Identity" + }, + { + "key": "hash-845d3d08e29642afba35704bcb6e38f3c40f1469763bff7a88674c9a5be3f01b", + "transform": "Identity" + }, + { + "key": "uref-5aed76a73089e7e32f6fbf5d9a9597843215d4810cd5822c0f5c6e65a0bbb7a3-000", + "transform": { + "WriteCLValue": { + "cl_type": "String", + "bytes": "120000004345502d37382d636f6c6c656374696f6e32", + "parsed": "CEP-78-collection" + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "collection_name", + "key": "uref-5aed76a73089e7e32f6fbf5d9a9597843215d4810cd5822c0f5c6e65a0bbb7a3-007" + } + ] + } + }, + { + "key": "uref-ba4247cc0354644474758d1292924c5115c61c8012cae3f094a91060d9dff779-000", + "transform": { + "WriteCLValue": { + "cl_type": "String", + "bytes": "050000004345503738", + "parsed": "CEP78" + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "collection_symbol", + "key": "uref-ba4247cc0354644474758d1292924c5115c61c8012cae3f094a91060d9dff779-007" + } + ] + } + }, + { + "key": "uref-e5f06deadcbfe5a469e7c162346580744746bfdc0ec67002e0ecba5b11096827-000", + "transform": { + "WriteCLValue": { + "cl_type": "U64", + "bytes": "6400000000000000", + "parsed": 100 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "total_token_supply", + "key": "uref-e5f06deadcbfe5a469e7c162346580744746bfdc0ec67002e0ecba5b11096827-007" + } + ] + } + }, + { + "key": "uref-89711af74265427dc65d7c5a421cedde82de69d192cad36f34efa36504108572-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "02", + "parsed": 2 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "ownership_mode", + "key": "uref-89711af74265427dc65d7c5a421cedde82de69d192cad36f34efa36504108572-007" + } + ] + } + }, + { + "key": "uref-e02c29a6120d5da7f14fb664ca60c3ade56a3171a670c292d0a4ea0f9ae4f0c8-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "01", + "parsed": 1 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "nft_kind", + "key": "uref-e02c29a6120d5da7f14fb664ca60c3ade56a3171a670c292d0a4ea0f9ae4f0c8-007" + } + ] + } + }, + { + "key": "uref-772103052d4559fcc2f8f2c2568eb75214462d463009106938e6f20e1cc0a7c0-000", + "transform": { + "WriteCLValue": { + "cl_type": "String", + "bytes": "0a0000006e66742d736368656d61", + "parsed": "nft-schema" + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "json_schema", + "key": "uref-772103052d4559fcc2f8f2c2568eb75214462d463009106938e6f20e1cc0a7c0-007" + } + ] + } + }, + { + "key": "uref-3b45a30c98d90de2c62812c6689aa2fac0cb4d08772fcfdee0584c5db2b1d12a-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "minting_mode", + "key": "uref-3b45a30c98d90de2c62812c6689aa2fac0cb4d08772fcfdee0584c5db2b1d12a-007" + } + ] + } + }, + { + "key": "uref-8443151d736bb3268815ad7848708d44ccc661799f969697c64b1cddb5ce89a7-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "02", + "parsed": 2 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "holder_mode", + "key": "uref-8443151d736bb3268815ad7848708d44ccc661799f969697c64b1cddb5ce89a7-007" + } + ] + } + }, + { + "key": "uref-a77f2ac1f5e72c6b096ca414ae2c986a5387442ddf8e89a35b787a756adc4bb4-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "whitelist_mode", + "key": "uref-a77f2ac1f5e72c6b096ca414ae2c986a5387442ddf8e89a35b787a756adc4bb4-007" + } + ] + } + }, + { + "key": "uref-1ec63ea6442d9b4ef40d926280f8b72704b763d3ef7cdaccd9ecb04af5562d99-000", + "transform": { + "WriteCLValue": { + "cl_type": "String", + "bytes": "1800000063657037385f4345502d37382d636f6c6c656374696f6e32", + "parsed": "cep78_CEP-78-collection" + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "receipt_name", + "key": "uref-1ec63ea6442d9b4ef40d926280f8b72704b763d3ef7cdaccd9ecb04af5562d99-007" + } + ] + } + }, + { + "key": "uref-ac99c07d666f45ff5c86a2c1bb6cc44b612ddd5d39a9de88045b441ff6e6b327-000", + "transform": { + "WriteCLValue": { + "cl_type": "String", + "bytes": "[170 hex chars]", + "parsed": "contract-package-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30" + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "cep78_CEP-78-collection", + "key": "uref-ac99c07d666f45ff5c86a2c1bb6cc44b612ddd5d39a9de88045b441ff6e6b327-007" + } + ] + } + }, + { + "key": "uref-45e1bc671353ae58c41a703055959da243deefc7f4c3f121f3f9828d97475bda-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "nft_metadata_kind", + "key": "uref-45e1bc671353ae58c41a703055959da243deefc7f4c3f121f3f9828d97475bda-007" + } + ] + } + }, + { + "key": "uref-05c0eb8e7ef4caa6f228e8ee91874dc64926b95926d839b458fdce356063a817-000", + "transform": { + "WriteCLValue": { + "cl_type": { + "Map": { + "key": "U8", + "value": "U8" + } + }, + "bytes": "010000000000", + "parsed": [ + { + "key": 0, + "value": 0 + } + ] + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "nft_metadata_kinds", + "key": "uref-05c0eb8e7ef4caa6f228e8ee91874dc64926b95926d839b458fdce356063a817-007" + } + ] + } + }, + { + "key": "uref-f53ea99b60ae6d046a6fb0d996475714ef03ed33b39674a8fe016c8324116baf-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "identifier_mode", + "key": "uref-f53ea99b60ae6d046a6fb0d996475714ef03ed33b39674a8fe016c8324116baf-007" + } + ] + } + }, + { + "key": "uref-2ca963a70a69df2db931b8761b4de13bd22e2fc54a415b0b57d4204c9b90dde9-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "metadata_mutability", + "key": "uref-2ca963a70a69df2db931b8761b4de13bd22e2fc54a415b0b57d4204c9b90dde9-007" + } + ] + } + }, + { + "key": "uref-eb1a7f69592881587805fde2d53e8e5b3dcbabd81311faa7b9d19ea731f83d9b-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "burn_mode", + "key": "uref-eb1a7f69592881587805fde2d53e8e5b3dcbabd81311faa7b9d19ea731f83d9b-007" + } + ] + } + }, + { + "key": "uref-f226eed9d0c5fcf58e6b481d45417721e35435c2ef5eb4d26d215209149438ba-000", + "transform": { + "WriteCLValue": { + "cl_type": "Bool", + "bytes": "00", + "parsed": false + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "operator_burn_mode", + "key": "uref-f226eed9d0c5fcf58e6b481d45417721e35435c2ef5eb4d26d215209149438ba-007" + } + ] + } + }, + { + "key": "uref-51acad53fd1a6ce6a52cf83ed7f921565311ed86cd362969bacf9457b6bf5c1a-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "events_mode", + "key": "uref-51acad53fd1a6ce6a52cf83ed7f921565311ed86cd362969bacf9457b6bf5c1a-007" + } + ] + } + }, + { + "key": "uref-dca79aa4244d0123ad52799fc4f922b2ae9fc023c9e56f999979f535a792eef5-000", + "transform": { + "WriteCLValue": { + "cl_type": "Bool", + "bytes": "01", + "parsed": true + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "allow_minting", + "key": "uref-dca79aa4244d0123ad52799fc4f922b2ae9fc023c9e56f999979f535a792eef5-007" + } + ] + } + }, + { + "key": "uref-f86e2c4057cc17d93593fb203a923d67e5bc68e6428a6d94f6eab0c35450653d-000", + "transform": { + "WriteCLValue": { + "cl_type": "U64", + "bytes": "0000000000000000", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "number_of_minted_tokens", + "key": "uref-f86e2c4057cc17d93593fb203a923d67e5bc68e6428a6d94f6eab0c35450653d-007" + } + ] + } + }, + { + "key": "uref-ff53b7094bcb6659b558d31fdf63f837b05c0ee6030bfe18ad4c3fb0462b9b17-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "token_owners", + "key": "uref-ff53b7094bcb6659b558d31fdf63f837b05c0ee6030bfe18ad4c3fb0462b9b17-007" + } + ] + } + }, + { + "key": "uref-5700d04b36eb1f50204c0d1d05c8ed6aae77eaeaa8a425c78f5a24cbae2e4d26-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "token_issuers", + "key": "uref-5700d04b36eb1f50204c0d1d05c8ed6aae77eaeaa8a425c78f5a24cbae2e4d26-007" + } + ] + } + }, + { + "key": "uref-76aac8f7224c5c1624b4255fff59ecc8ee2c7a1ba460b4f70945d7548abbffd0-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "approved", + "key": "uref-76aac8f7224c5c1624b4255fff59ecc8ee2c7a1ba460b4f70945d7548abbffd0-007" + } + ] + } + }, + { + "key": "uref-ff8ad952307b57a051ef6cb597a55cc2007e587c575584addf6a6fc12c0efd7b-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "operators", + "key": "uref-ff8ad952307b57a051ef6cb597a55cc2007e587c575584addf6a6fc12c0efd7b-007" + } + ] + } + }, + { + "key": "uref-0c144d231ac070adb2668f2a9f3d0eba32c7468efa879f0f29c832c63698966b-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "burnt_tokens", + "key": "uref-0c144d231ac070adb2668f2a9f3d0eba32c7468efa879f0f29c832c63698966b-007" + } + ] + } + }, + { + "key": "uref-3d271bac2030ddee54bf4ea92b9b854d800a10a0df5d6e328a045be19af27538-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "balances", + "key": "uref-3d271bac2030ddee54bf4ea92b9b854d800a10a0df5d6e328a045be19af27538-007" + } + ] + } + }, + { + "key": "uref-575108b0258e92ebede1e50345b608d42963bdac24379022be20b76cfde15301-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "metadata_custom_validated", + "key": "uref-575108b0258e92ebede1e50345b608d42963bdac24379022be20b76cfde15301-007" + } + ] + } + }, + { + "key": "uref-2c2176a9efd465d2e4d5de05d75d029e03040d0a5668c4e08facb0cd3442d30a-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "metadata_cep78", + "key": "uref-2c2176a9efd465d2e4d5de05d75d029e03040d0a5668c4e08facb0cd3442d30a-007" + } + ] + } + }, + { + "key": "uref-eb37c0fe3b53fa5c72b02976f2840b7bf3692954fc830f8a10dc538d0c506e63-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "metadata_nft721", + "key": "uref-eb37c0fe3b53fa5c72b02976f2840b7bf3692954fc830f8a10dc538d0c506e63-007" + } + ] + } + }, + { + "key": "uref-cdb17062423b769a7b0bc18fe0a2202b68d2ba77786291018a24fd53f4532ab8-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "metadata_raw", + "key": "uref-cdb17062423b769a7b0bc18fe0a2202b68d2ba77786291018a24fd53f4532ab8-007" + } + ] + } + }, + { + "key": "uref-e280dd23c847724422543b0d70f1ed4c95c8da9e1a71927ae39add652859775c-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "hash_by_index", + "key": "uref-e280dd23c847724422543b0d70f1ed4c95c8da9e1a71927ae39add652859775c-007" + } + ] + } + }, + { + "key": "uref-6299c9322631f374fc1a5e20920641b23f437a3c0ba8da22cc23cba11b0fa3a5-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "index_by_hash", + "key": "uref-6299c9322631f374fc1a5e20920641b23f437a3c0ba8da22cc23cba11b0fa3a5-007" + } + ] + } + }, + { + "key": "uref-00efcfa874a60b5b615b3c6d781cf69c3559b5372d15457fe4a3bb6d07c66acd-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "page_table", + "key": "uref-00efcfa874a60b5b615b3c6d781cf69c3559b5372d15457fe4a3bb6d07c66acd-007" + } + ] + } + }, + { + "key": "uref-77b5861bdc04f3c63417dd2ed1943f659f6180603982a24587f79cbc38801cf4-000", + "transform": { + "WriteCLValue": { + "cl_type": "Unit", + "bytes": "", + "parsed": null + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "acl_whitelist", + "key": "uref-77b5861bdc04f3c63417dd2ed1943f659f6180603982a24587f79cbc38801cf4-007" + } + ] + } + }, + { + "key": "uref-5e950cdd5497633c1d03284ec6e70ce436744cc172d6e26e21e4e474d1b34312-000", + "transform": { + "WriteCLValue": { + "cl_type": "Bool", + "bytes": "00", + "parsed": false + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "acl_package_mode", + "key": "uref-5e950cdd5497633c1d03284ec6e70ce436744cc172d6e26e21e4e474d1b34312-007" + } + ] + } + }, + { + "key": "uref-05c2868f179f6b2323f1d4ea069858956c9666d14073748aae4a748d27a8a894-000", + "transform": { + "WriteCLValue": { + "cl_type": "Bool", + "bytes": "00", + "parsed": false + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "package_operator_mode", + "key": "uref-05c2868f179f6b2323f1d4ea069858956c9666d14073748aae4a748d27a8a894-007" + } + ] + } + }, + { + "key": "uref-4d851152d7b89dff805dcf6eb61a33870dab9345084a5874575476a584d71b83-000", + "transform": { + "WriteCLValue": { + "cl_type": "U8", + "bytes": "00", + "parsed": 0 + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "reporting_mode", + "key": "uref-4d851152d7b89dff805dcf6eb61a33870dab9345084a5874575476a584d71b83-007" + } + ] + } + }, + { + "key": "uref-2e3b8aafb27aae47c9b7d3728d20d8815b706e2245c23b84f0e712cd1d1e9124-000", + "transform": { + "WriteCLValue": { + "cl_type": "Bool", + "bytes": "00", + "parsed": false + } + } + }, + { + "key": "hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796", + "transform": { + "AddKeys": [ + { + "name": "rlo_mflag", + "key": "uref-2e3b8aafb27aae47c9b7d3728d20d8815b706e2245c23b84f0e712cd1d1e9124-007" + } + ] + } + }, + { + "key": "deploy-1d1f66b26eb648b5f15bc958a552036e8521b508706056817b0d41c71f6d7afe", + "transform": { + "WriteDeployInfo": { + "deploy_hash": "1d1f66b26eb648b5f15bc958a552036e8521b508706056817b0d41c71f6d7afe", + "transfers": [], + "from": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "source": "uref-11e6fc5354f61a004df98482376c45964b8b1557e8f2f13fb5f3adab5faa8be1-007", + "gas": "443359442322" + } + } + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "hash-624dbe2395b9d9503fbee82162f1714ebff6b639f96d2084d26d944c354ec4c5", + "transform": "Identity" + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "balance-98d945f5324f865243b7c02c0417ab6eac361c5c56602fd42ced834a1ba201b6", + "transform": "Identity" + }, + { + "key": "hash-8cf5e4acf51f54eb59291599187838dc3bc234089c46fc6ca8ad17e762ae4401", + "transform": "Identity" + }, + { + "key": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655", + "transform": "Identity" + }, + { + "key": "hash-010c3fe81b7b862e50c77ef9a958a05bfa98444f26f96f23d37a13c96244cfb7", + "transform": "Identity" + }, + { + "key": "hash-9824d60dc3a5c44a20b9fd260a412437933835b52fc683d8ae36e4ec2114843e", + "transform": "Identity" + }, + { + "key": "hash-010c3fe81b7b862e50c77ef9a958a05bfa98444f26f96f23d37a13c96244cfb7", + "transform": "Identity" + }, + { + "key": "balance-98d945f5324f865243b7c02c0417ab6eac361c5c56602fd42ced834a1ba201b6", + "transform": "Identity" + }, + { + "key": "balance-11e6fc5354f61a004df98482376c45964b8b1557e8f2f13fb5f3adab5faa8be1", + "transform": "Identity" + }, + { + "key": "balance-98d945f5324f865243b7c02c0417ab6eac361c5c56602fd42ced834a1ba201b6", + "transform": { + "WriteCLValue": { + "cl_type": "U512", + "bytes": "055bdf0a5c67", + "parsed": "443925847899" + } + } + }, + { + "key": "balance-11e6fc5354f61a004df98482376c45964b8b1557e8f2f13fb5f3adab5faa8be1", + "transform": { + "AddUInt512": "56074152101" + } + }, + { + "key": "hash-010c3fe81b7b862e50c77ef9a958a05bfa98444f26f96f23d37a13c96244cfb7", + "transform": "Identity" + }, + { + "key": "hash-9824d60dc3a5c44a20b9fd260a412437933835b52fc683d8ae36e4ec2114843e", + "transform": "Identity" + }, + { + "key": "hash-010c3fe81b7b862e50c77ef9a958a05bfa98444f26f96f23d37a13c96244cfb7", + "transform": "Identity" + }, + { + "key": "balance-98d945f5324f865243b7c02c0417ab6eac361c5c56602fd42ced834a1ba201b6", + "transform": "Identity" + }, + { + "key": "balance-dcf5abbbe00715e9a05f7449109b1d297cb1584560ec4f3f5a86401452e40d85", + "transform": "Identity" + }, + { + "key": "balance-98d945f5324f865243b7c02c0417ab6eac361c5c56602fd42ced834a1ba201b6", + "transform": { + "WriteCLValue": { + "cl_type": "U512", + "bytes": "00", + "parsed": "0" + } + } + }, + { + "key": "balance-dcf5abbbe00715e9a05f7449109b1d297cb1584560ec4f3f5a86401452e40d85", + "transform": { + "AddUInt512": "443925847899" + } + } + ] + }, + "transfers": [], + "cost": "443359442322" + } + } + } + ] + } +} +``` + +
+ +## Next Steps + +- Learn to [Query](./querying-NFTs.md) the NFT contract +- Learn to [Mint, Transfer, and Burn](./interacting-with-NFTs.md) NFT tokens diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md new file mode 100644 index 0000000000..8989037ce9 --- /dev/null +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md @@ -0,0 +1,345 @@ +--- +title: Interaction Workflow +--- + +# Interacting with the NFT Contract using the Rust Casper Client + +This document describes interacting with NFTs on a Casper network using the Rust command-line client. + + +## Prerequisites + +- Install the contract using the [Quickstart](./quickstart-guide.md) or the [Full Installation](./full-installation-tutorial.md) tutorials +- Learn to [Query NFT Contracts](./querying-NFTs.md) and save the various hashes and URefs required throughout this document + + +## Table of Contents + +1. [Directly Invoking Entrypoints](#directly-invoking-entrypoints) + +2. [Transferring NFTs](#transferring-nfts) + +3. [Approving Another Account](#approving-another-account) + +4. [Minting NFTs](#minting-nfts) + +5. [Burning NFTs](#burning-nfts) + + +## Directly Invoking Entrypoints + +With the release of CEP-78 version 1.1, users interacting with a CEP-78 contract that does not use `ReverseLookupMode` should opt out of using the client Wasm files provided as part of the release. Opting out in this situation is recommended, as directly invoking the entrypoints incurs a lower gas cost than using the provided client Wasm to invoke the entrypoint. + +You may invoke the `mint`, `transfer`, or `burn` entrypoints directly through either the contract package hash or the contract hash directly. + +In the case of `mint`, fewer runtime arguments must be provided, thereby reducing the total gas cost of minting an NFT. + +
+Example `mint` using the stored package hash + +```bash +casper-client put-deploy --node-address http://localhost:11101/rpc/ \ +--chain-name "casper-net-1” \ +--payment-amount 5000000000 \ +--secret-key ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-package-hash hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30 \ +--session-entry-point "mint" \ +--session-arg "token_owner:key='account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655'" \ +--session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'" +``` + +
+ +
+Example `transfer` using the stored contract hash + +Based on the identifier mode for the given contract instance, either the `token_id` runtime argument must be passed in or, in the case of the hash identifier mode, the `token_hash` runtime argument. + +```bash +casper-client put-deploy --node-address http://localhost:11101/rpc/ \ +--chain-name "casper-net-1” \ +--payment-amount 5000000000 \ +--secret-key ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-hash hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796 \ +--session-entry-point "transfer" \ +--session-arg "source_key:key='account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655'" \ +--session-arg "target_key:key='account-hash-0ea7998b2822afe5b62b08a21d54c941ad791279b089f3f7ede0d72b477eca34'" \ +--session-arg "token_id:u64='0'" +``` + +
+ + +## Minting NFTs + +Below is an example of a `casper-client` command that uses the `mint` entrypoint of the contract to mint an NFT for the user associated with `node-1` in an [NCTL environment](../../../../developers/dapps/nctl-test/). + +- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-entry-point "mint"` + +1. `--session-package-hash hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30` + + The package hash of the previously installed CEP-78 NFT contract from which we will be minting. + +2. `--session-arg "token_owner:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'"` + + The collection name of the NFT to be minted. + +3. `--session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'"` + + Metadata describing the NFT to be minted, passed in as a `string`. + +
+Casper client command without comments + +```bash +casper-client put-deploy --node-address http://localhost:11101/rpc/ \ +--chain-name "casper-net-1” \ +--payment-amount 5000000000 \ +--secret-key ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-entry-point "mint" \ +--session-package-hash hash-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30 \ +--session-arg "token_owner:key='account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655'" \ +--session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'" +``` + +
+ + +### Minting NFTs using Wasm + +This example invokes the `mint_call.wasm` session code provided in the `client` folder. + +- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-path ~/casper/enhanced-nft/client/mint_session/target/wasm32-unknown-unknown/release/mint_call.wasm` + +1. `--session-arg "nft_contract_hash:key='hash-206339c3deb8e6146974125bb271eb510795be6f250c21b1bd4b698956669f95'"` + + The contract hash of the previously installed CEP-78 NFT contract from which we will be minting. + +2. `--session-arg "collection_name:string='cep78_'"` + + The collection name of the previously installed CEP-78 NFT contract from which we will be minting. + +3. `--session-arg "token_owner:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'"` + + The collection name of the NFT to be minted. + +4. `--session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'"` + + Metadata describing the NFT to be minted, passed in as a `string`. + + +
+Casper client command without comments + +```bash +casper-client put-deploy --node-address http://localhost:11101/rpc/ \ +--chain-name "casper-net-1” \ +--payment-amount 5000000000 \ +--secret-key ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-path ~/casper/enhanced-nft/client/mint_session/target/wasm32-unknown-unknown/release/mint_call.wasm \ +--session-arg "nft_contract_hash:key='hash-206339c3deb8e6146974125bb271eb510795be6f250c21b1bd4b698956669f95'" \ +--session-arg "collection_name:string='cep78_'" \ +--session-arg "token_owner:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'" \ +--session-arg "token_meta_data:string='{\"name\": \"John Doe\",\"token_uri\": \"https:\/\/www.barfoo.com\",\"checksum\": \"940bffb3f2bba35f84313aa26da09ece3ad47045c6a1292c2bbd2df4ab1a55fb\"}'" +``` + +
+ + +## Transferring NFTs + +Below is an example of a `casper-client` command that uses the `transfer` entrypoint to transfer ownership of an NFT from one user to another. + +- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-entry-point "transfer"` + +1. `--session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5'"` + + The contract hash of the CEP-78 NFT Contract associated with the NFT to be transferred. + +2. `--session-arg "source_key:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'"` + + The account hash of the user that currently owns the NFT and wishes to transfer it. + +3. `--session-arg "target_key:key='account-hash-b4772e7c47e4deca5bd90b7adb2d6e884f2d331825d5419d6cbfb59e17642aab'"` + + The account hash of the user that will receive the NFT. + +4. `--session-arg "is_hash_identifier_mode:bool='false'"` + + The argument that the hash identifier mode is ordinal, thereby requiring a `token_id` rather than a `token_hash`. + +5. `--session-arg "token_id:u64='0'"` + + The `token_id` of the NFT to be transferred. + +
+Casper client command without comments + +```bash +casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ +--payment-amount 5000000000 \ +-k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-entry-point "transfer" \ +--session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5 \ +--session-arg "source_key:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'" \ +--session-arg "target_key:key='account-hash-b4772e7c47e4deca5bd90b7adb2d6e884f2d331825d5419d6cbfb59e17642aab'" \ +--session-arg "is_hash_identifier_mode:bool='false'" \ +--session-arg "token_id:u64='0'" +``` + +
+ +This command will return a deploy hash that you can query using `casper-client get-deploy`. Querying the deploy allows you to verify execution success, but you will need to use the `balance_of` entrypoint to verify the account's balance as shown [below](#checking-the-balance). + + +### Transferring NFTs using Wasm + +This example uses the `transfer_call.wasm` session code to transfer ownership of an NFT from one user to another. + +- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/secret_key.pem --session-path ~/casper/enhanced-nft/client/transfer_session/target/wasm32-unknown-unknown/release/transfer_call.wasm` + +1. `--session-arg "nft_contract_hash:key='hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5'"` + + The contract hash of the CEP-78 NFT Contract associated with the NFT to be transferred. + +2. `--session-arg "source_key:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'"` + + The account hash of the user that currently owns the NFT and wishes to transfer it. + +3. `--session-arg "target_key:key='account-hash-b4772e7c47e4deca5bd90b7adb2d6e884f2d331825d5419d6cbfb59e17642aab'"` + + The account hash of the user that will receive the NFT. + +4. `--session-arg "is_hash_identifier_mode:bool='false'"` + + Argument that the hash identifier mode is ordinal, thereby requiring a `token_id` rather than a `token_hash`. + +5. `--session-arg "token_id:u64='0'"` + + The `token_id` of the NFT to be transferred. + +
+Casper client command without comments + +```bash +casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ +--payment-amount 5000000000 \ +-k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-2/keys/secret_key.pem \ +--session-path ~/casper/enhanced-nft/client/transfer_session/target/wasm32-unknown-unknown/release/transfer_call.wasm \ +--session-arg "nft_contract_hash:key='hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5'" \ +--session-arg "source_key:key='account-hash-e9ff87766a1d2bab2565bfd5799054946200b51b20c3ca7e54a9269e00fe7cfb'" \ +--session-arg "target_key:key='account-hash-b4772e7c47e4deca5bd90b7adb2d6e884f2d331825d5419d6cbfb59e17642aab'" \ +--session-arg "is_hash_identifier_mode:bool='false'" \ +--session-arg "token_id:u64='0'" +``` + +
+ + +## Checking the Balance + +The following command invokes the `balance_of_call.wasm` and saves the number of tokens owned under the account's named keys. + +- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-path ~/casper/enhanced-nft/client/balance_of_session/target/wasm32-unknown-unknown/release/balance_of_call.wasm` + +1. `--session-arg "nft_contract_hash:key='hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796'"` + + The contract hash of the previously installed CEP-78 NFT contract. + +2. `--session-arg "token_owner:key='account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655'"` + + The account hash of the user whose token balance we are checking. + +3. `--session-arg "key_name:string='balance'"` + + The name for the entry under the `NamedKeys` under which the balance amount will be stored. + +
+Casper client command without comments + +```bash +casper-client put-deploy -n http://localhost:11101/rpc/ \ +--chain-name "casper-net-1" \ +--payment-amount 5000000000 \ +-k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-path ~/casper/enhanced-nft/client/balance_of_session/target/wasm32-unknown-unknown/release/balance_of_call.wasm \ +--session-arg "nft_contract_hash:key='hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796'" \ +--session-arg "token_owner:key='account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655'" \ +--session-arg "key_name:string='balance'" +``` + +
+ + +## Approving an Account + +The Casper NFT contract features an `approve` entrypoint, allowing another account to manage a specific token. During contract installation, the `ownership_mode` must be set to 2, meaning `Transferable`. + +- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-entry-point "approve"` + +1. `--session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5` + + The contract hash of the previously installed CEP-78 NFT contract. + +2. `--session-arg "spender:key='account-hash-17192017d32db5dc9f598bf8ac6ac35ee4b64748669b00572d88335941479513'"` + + The hash of the account receiving the approval. + +3. `--session-arg "token_id:u64='1'"` + + The token ID of the approved NFT. + + +
+Casper client command without comments + +```bash +casper-client put-deploy -n http://localhost:11101/rpc/ \ +--chain-name "casper-net-1" \ +--payment-amount 5000000000 \ +-k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-entry-point "approve" \ +--session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5 \ +--session-arg "spender:key='account-hash-17192017d32db5dc9f598bf8ac6ac35ee4b64748669b00572d88335941479513'" \ +--session-arg "token_id:u64='1'" +``` + +
+ + +## Burning NFTs + +Below is an example of a `casper-client` command that uses the `burn` entrypoint to burn an NFT within a CEP-78 collection. If this command is used, the NFT in question will no longer be accessible by anyone. + +- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem` + +1. `--session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5` + + The session hash corresponding to the NFT's contract hash. + +2. `--session-entry-point "burn"` + + The entrypoint corresponding to the `burn` function. + +3. `--session-arg "token_id:u64='1'"` + + The token ID for the NFT to be burned. If the `identifier_mode` is not set to `Ordinal`, you must provide the `token_hash` instead. + +
+Casper client command without comments + +```bash +casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" \ +--payment-amount 5000000000 \ +-k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-hash hash-52e78ae3f6c485d036a74f65ebbb8c75fcc7c33fb42eb667fb32aeba72c63fb5 \ +--session-entry-point "burn" \ +--session-arg "token_id:u64='1'" +``` + +
+ + +## Next Steps + +- [Testing Framework for CEP-78](./testing-NFTs.md) \ No newline at end of file diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/querying-NFTs.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/querying-NFTs.md new file mode 100644 index 0000000000..7e8b9b534f --- /dev/null +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/querying-NFTs.md @@ -0,0 +1,550 @@ +--- +title: CEP-78 Contract Details +--- + +import useBaseUrl from '@docusaurus/useBaseUrl'; + +# Querying NFT Contracts + +This document covers different commands to query and interact with an NFT (CEP-78) contract instance. + +## Prerequisites + +- Install the contract using the [Quickstart](./quickstart-guide.md) or the [Full Installation](./full-installation-tutorial.md) tutorials + +## Querying the Contract + +First, identify the contract hash by looking at the account that installed the contract. Under the account's named keys, you will see a named key for the contract hash, representing the stored contract. Copy this value and save it for future queries. + +The NFT contract hash + +Next, query the contract details. + +- `casper-client query-global-state -n http://localhost:11101/rpc/` + +1. `--key [CONTRACT_HASH]` + + The contract hash, found within the `NamedKeys` of the account that sent the installing deploy. + +2. `--state-root-hash [STATE_ROOT_HASH]` + + The most up-to-date state root hash, which can be found by using the `get-state-root-hash` command in the Casper client. + +
+Expand to see the query and sample contract + + +```bash +casper-client query-global-state -n http://localhost:11101/rpc/ \ +--key hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796 \ +--state-root-hash 2a8cfc20d24b4bc629ea6d26cc820560a1baf3d4275079d5382242c9fa1e86fe +``` + +```json +{ + "jsonrpc": "2.0", + "id": -5355991397545050403, + "result": { + "api_version": "1.5.6", + "block_header": null, + "stored_value": { + "Contract": { + "contract_package_hash": "contract-package-2b61207cd0e94ce1b1d40801b0abb1ab55fd7dae94c9dcf670292243f3791a30", + "contract_wasm_hash": "contract-wasm-845d3d08e29642afba35704bcb6e38f3c40f1469763bff7a88674c9a5be3f01b", + "named_keys": [ + { + "name": "acl_package_mode", + "key": "uref-5e950cdd5497633c1d03284ec6e70ce436744cc172d6e26e21e4e474d1b34312-007" + }, + { + "name": "acl_whitelist", + "key": "uref-77b5861bdc04f3c63417dd2ed1943f659f6180603982a24587f79cbc38801cf4-007" + }, + { + "name": "allow_minting", + "key": "uref-dca79aa4244d0123ad52799fc4f922b2ae9fc023c9e56f999979f535a792eef5-007" + }, + { + "name": "approved", + "key": "uref-76aac8f7224c5c1624b4255fff59ecc8ee2c7a1ba460b4f70945d7548abbffd0-007" + }, + { + "name": "balances", + "key": "uref-3d271bac2030ddee54bf4ea92b9b854d800a10a0df5d6e328a045be19af27538-007" + }, + { + "name": "burn_mode", + "key": "uref-eb1a7f69592881587805fde2d53e8e5b3dcbabd81311faa7b9d19ea731f83d9b-007" + }, + { + "name": "burnt_tokens", + "key": "uref-0c144d231ac070adb2668f2a9f3d0eba32c7468efa879f0f29c832c63698966b-007" + }, + { + "name": "cep78_CEP-78-collection2", + "key": "uref-ac99c07d666f45ff5c86a2c1bb6cc44b612ddd5d39a9de88045b441ff6e6b327-007" + }, + { + "name": "collection_name", + "key": "uref-5aed76a73089e7e32f6fbf5d9a9597843215d4810cd5822c0f5c6e65a0bbb7a3-007" + }, + { + "name": "collection_symbol", + "key": "uref-ba4247cc0354644474758d1292924c5115c61c8012cae3f094a91060d9dff779-007" + }, + { + "name": "events_mode", + "key": "uref-51acad53fd1a6ce6a52cf83ed7f921565311ed86cd362969bacf9457b6bf5c1a-007" + }, + { + "name": "hash_by_index", + "key": "uref-e280dd23c847724422543b0d70f1ed4c95c8da9e1a71927ae39add652859775c-007" + }, + { + "name": "holder_mode", + "key": "uref-8443151d736bb3268815ad7848708d44ccc661799f969697c64b1cddb5ce89a7-007" + }, + { + "name": "identifier_mode", + "key": "uref-f53ea99b60ae6d046a6fb0d996475714ef03ed33b39674a8fe016c8324116baf-007" + }, + { + "name": "index_by_hash", + "key": "uref-6299c9322631f374fc1a5e20920641b23f437a3c0ba8da22cc23cba11b0fa3a5-007" + }, + { + "name": "installer", + "key": "account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655" + }, + { + "name": "json_schema", + "key": "uref-772103052d4559fcc2f8f2c2568eb75214462d463009106938e6f20e1cc0a7c0-007" + }, + { + "name": "metadata_cep78", + "key": "uref-2c2176a9efd465d2e4d5de05d75d029e03040d0a5668c4e08facb0cd3442d30a-007" + }, + { + "name": "metadata_custom_validated", + "key": "uref-575108b0258e92ebede1e50345b608d42963bdac24379022be20b76cfde15301-007" + }, + { + "name": "metadata_mutability", + "key": "uref-2ca963a70a69df2db931b8761b4de13bd22e2fc54a415b0b57d4204c9b90dde9-007" + }, + { + "name": "metadata_nft721", + "key": "uref-eb37c0fe3b53fa5c72b02976f2840b7bf3692954fc830f8a10dc538d0c506e63-007" + }, + { + "name": "metadata_raw", + "key": "uref-cdb17062423b769a7b0bc18fe0a2202b68d2ba77786291018a24fd53f4532ab8-007" + }, + { + "name": "minting_mode", + "key": "uref-3b45a30c98d90de2c62812c6689aa2fac0cb4d08772fcfdee0584c5db2b1d12a-007" + }, + { + "name": "nft_kind", + "key": "uref-e02c29a6120d5da7f14fb664ca60c3ade56a3171a670c292d0a4ea0f9ae4f0c8-007" + }, + { + "name": "nft_metadata_kind", + "key": "uref-45e1bc671353ae58c41a703055959da243deefc7f4c3f121f3f9828d97475bda-007" + }, + { + "name": "nft_metadata_kinds", + "key": "uref-05c0eb8e7ef4caa6f228e8ee91874dc64926b95926d839b458fdce356063a817-007" + }, + { + "name": "number_of_minted_tokens", + "key": "uref-f86e2c4057cc17d93593fb203a923d67e5bc68e6428a6d94f6eab0c35450653d-007" + }, + { + "name": "operator_burn_mode", + "key": "uref-f226eed9d0c5fcf58e6b481d45417721e35435c2ef5eb4d26d215209149438ba-007" + }, + { + "name": "operators", + "key": "uref-ff8ad952307b57a051ef6cb597a55cc2007e587c575584addf6a6fc12c0efd7b-007" + }, + { + "name": "ownership_mode", + "key": "uref-89711af74265427dc65d7c5a421cedde82de69d192cad36f34efa36504108572-007" + }, + { + "name": "package_operator_mode", + "key": "uref-05c2868f179f6b2323f1d4ea069858956c9666d14073748aae4a748d27a8a894-007" + }, + { + "name": "page_table", + "key": "uref-00efcfa874a60b5b615b3c6d781cf69c3559b5372d15457fe4a3bb6d07c66acd-007" + }, + { + "name": "receipt_name", + "key": "uref-1ec63ea6442d9b4ef40d926280f8b72704b763d3ef7cdaccd9ecb04af5562d99-007" + }, + { + "name": "reporting_mode", + "key": "uref-4d851152d7b89dff805dcf6eb61a33870dab9345084a5874575476a584d71b83-007" + }, + { + "name": "rlo_mflag", + "key": "uref-2e3b8aafb27aae47c9b7d3728d20d8815b706e2245c23b84f0e712cd1d1e9124-007" + }, + { + "name": "token_issuers", + "key": "uref-5700d04b36eb1f50204c0d1d05c8ed6aae77eaeaa8a425c78f5a24cbae2e4d26-007" + }, + { + "name": "token_owners", + "key": "uref-ff53b7094bcb6659b558d31fdf63f837b05c0ee6030bfe18ad4c3fb0462b9b17-007" + }, + { + "name": "total_token_supply", + "key": "uref-e5f06deadcbfe5a469e7c162346580744746bfdc0ec67002e0ecba5b11096827-007" + }, + { + "name": "whitelist_mode", + "key": "uref-a77f2ac1f5e72c6b096ca414ae2c986a5387442ddf8e89a35b787a756adc4bb4-007" + } + ], + "entry_points": [ + { + "name": "approve", + "args": [ + { + "name": "spender", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "balance_of", + "args": [ + { + "name": "token_owner", + "cl_type": "Key" + } + ], + "ret": "U64", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "burn", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "get_approved", + "args": [], + "ret": { + "Option": "Key" + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "init", + "args": [ + { + "name": "collection_name", + "cl_type": "String" + }, + { + "name": "collection_symbol", + "cl_type": "String" + }, + { + "name": "total_token_supply", + "cl_type": "U64" + }, + { + "name": "allow_minting", + "cl_type": "Bool" + }, + { + "name": "minting_mode", + "cl_type": "U8" + }, + { + "name": "ownership_mode", + "cl_type": "U8" + }, + { + "name": "nft_kind", + "cl_type": "U8" + }, + { + "name": "holder_mode", + "cl_type": "U8" + }, + { + "name": "whitelist_mode", + "cl_type": "U8" + }, + { + "name": "acl_whitelist", + "cl_type": { + "List": "Key" + } + }, + { + "name": "acl_package_mode", + "cl_type": "Bool" + }, + { + "name": "package_operator_mode", + "cl_type": "Bool" + }, + { + "name": "json_schema", + "cl_type": "String" + }, + { + "name": "receipt_name", + "cl_type": "String" + }, + { + "name": "identifier_mode", + "cl_type": "U8" + }, + { + "name": "burn_mode", + "cl_type": "U8" + }, + { + "name": "operator_burn_mode", + "cl_type": "Bool" + }, + { + "name": "nft_metadata_kind", + "cl_type": "U8" + }, + { + "name": "metadata_mutability", + "cl_type": "U8" + }, + { + "name": "owner_reverse_lookup_mode", + "cl_type": "U8" + }, + { + "name": "events_mode", + "cl_type": "U8" + }, + { + "name": "transfer_filter_contract", + "cl_type": { + "Option": "Key" + } + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "is_approved_for_all", + "args": [ + { + "name": "token_owner", + "cl_type": "Key" + }, + { + "name": "operator", + "cl_type": "Key" + } + ], + "ret": "Bool", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "metadata", + "args": [], + "ret": "String", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "migrate", + "args": [ + { + "name": "cep78_package_key", + "cl_type": "Any" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "mint", + "args": [ + { + "name": "token_owner", + "cl_type": "Key" + }, + { + "name": "token_meta_data", + "cl_type": "String" + } + ], + "ret": { + "Tuple3": [ + "String", + "Key", + "String" + ] + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "owner_of", + "args": [], + "ret": "Key", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "register_owner", + "args": [], + "ret": { + "Tuple2": [ + "String", + "URef" + ] + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "revoke", + "args": [], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "set_approval_for_all", + "args": [ + { + "name": "approve_all", + "cl_type": "Bool" + }, + { + "name": "operator", + "cl_type": "Key" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "set_token_metadata", + "args": [ + { + "name": "token_meta_data", + "cl_type": "String" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "set_variables", + "args": [ + { + "name": "allow_minting", + "cl_type": "Bool" + }, + { + "name": "contract_whitelist", + "cl_type": { + "List": { + "ByteArray": 32 + } + } + }, + { + "name": "acl_whitelist", + "cl_type": { + "List": "Key" + } + }, + { + "name": "acl_package_mode", + "cl_type": "Bool" + }, + { + "name": "package_operator_mode", + "cl_type": "Bool" + }, + { + "name": "operator_burn_mode", + "cl_type": "Bool" + } + ], + "ret": "Unit", + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "transfer", + "args": [ + { + "name": "source_key", + "cl_type": "Key" + }, + { + "name": "target_key", + "cl_type": "Key" + } + ], + "ret": { + "Tuple2": [ + "String", + "Key" + ] + }, + "access": "Public", + "entry_point_type": "Contract" + }, + { + "name": "updated_receipts", + "args": [], + "ret": { + "List": { + "Tuple2": [ + "String", + "Key" + ] + } + }, + "access": "Public", + "entry_point_type": "Contract" + } + ], + "protocol_version": "1.5.6" + } + }, + "merkle_proof": "[33244 hex chars]" + } +} +``` + +
+ +## Next Steps + +- Learn to [Mint, Transfer, and Burn](./interacting-with-NFTs.md) NFT tokens \ No newline at end of file diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md new file mode 100644 index 0000000000..e8f45a7892 --- /dev/null +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md @@ -0,0 +1,68 @@ +--- +title: Quick Installation +--- + +# Casper NFT Quick Installation Guide + +This quick installation guide introduces you to the Casper client commands and Wasm files necessary to deploy a CEP-78 Casper Enhanced NFT contract to the [Casper Testnet](https://testnet.cspr.live/). For greater detail into the creation and mechanics of the Casper NFT contract, see the complete [Casper NFT Tutorial](./full-installation-tutorial.md). + +To execute transactions on a Casper network involving NFTs, you will need some CSPR tokens to pay for the transactions. The Testnet provides test tokens using a [faucet](https://docs.casper.network/users/testnet-faucet/). + +## Prerequisites + +Before using this guide, ensure you meet the following requirements: + +- Set up the [development prerequisites](../../../../developers/prerequisites/), including the [Casper client](../../../../developers/prerequisites/#install-casper-client) +- Get a valid [node address](../../../../developers/prerequisites/#acquire-node-address-from-network-peers) from the network +- Know how to install a [smart contract](../../../../developers/cli/sending-deploys/) on a Casper network +- Hold enough CSPR tokens to pay for transactions + +## Setup + +Clone the Casper NFT (CEP-78) [contract repository](https://github.com/casper-ecosystem/cep-78-enhanced-nft/). + +```bash +git clone https://github.com/casper-ecosystem/cep-78-enhanced-nft/ && cd cep-78-enhanced-nft +``` + +Run the following commands to build the `contract.wasm` in the `contract/target/wasm32-unknown-unknown/release` directory and run the tests. + +```bash +make prepare +make test +``` + +The output of the command would end with the following message: + +```bash +test result: ok. 159 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.33s +``` + +## Installing the NFT Contract + +The following command will install a sample NFT contract on the Testnet: + +```bash +casper-client put-deploy --node-address http://localhost:11101/rpc/ \ +--chain-name "casper-net-1" \ +--payment-amount 5000000000 \ +--secret-key ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ +--session-path contract/target/wasm32-unknown-unknown/release/contract.wasm \ +--session-arg "collection_name:string='CEP-78-collection'" \ +--session-arg "collection_symbol:string='CEP78'" \ +--session-arg "total_token_supply:u64='100'" \ +--session-arg "ownership_mode:u8='2'" \ +--session-arg "nft_kind:u8='1'" \ +--session-arg "nft_metadata_kind:u8='0'" \ +--session-arg "json_schema:string='nft-schema'" \ +--session-arg "identifier_mode:u8='0'" \ +--session-arg "metadata_mutability:u8='0'" +``` + +## Next Steps + +Learn to query the contract, perform token transfers, set up approvals, and understand the testing framework. + +- [Query](./querying-NFTs.md) the NTF Contract +- Learn to [Mint, Transfer, and Burn](./interacting-with-NFTs.md) NFT tokens +- Review the [Tests](./testing-NFTs.md) \ No newline at end of file diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md new file mode 100644 index 0000000000..256ec3f81a --- /dev/null +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md @@ -0,0 +1,29 @@ +--- +title: Testing NFTs +--- + +# Testing NFT Contracts + +## Prerequisites + +- Install the contract using the [Quickstart](./quickstart-guide.md) or the [Full Installation](./full-installation-tutorial.md) tutorials + +## Framework Description + +The testing framework in this tutorial uses the [Casper engine test support](https://crates.io/crates/casper-engine-test-support) crate for testing the contract implementation against the Casper execution environment. + +The [tests](https://github.com/casper-ecosystem/cep-78-enhanced-nft/tree/dev/tests/src) source folder contains over 150 tests covering a variety of scenarios, including contract installation, minting and burning tokens, sending transfers, upgrading the contract, and listening to events. + +For more details about the test framework and how each test is set up, visit the [Testing Smart Contracts](../../../../developers/writing-onchain-code/testing-contracts/) documentation page. + +## Running the Tests + +To build and run the tests, issue the following command in the project folder: + +```bash +make test +``` + +The project contains a [Makefile](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/dev/Makefile), which is a custom build script that compiles the contract before running tests in _release_ mode. Then, the script copies the `contract.wasm` file to the corresponding version folder in a `tests/wasm` directory. In practice, you only need to run the `make test` command during development without building the contract separately. + +This example uses `bash`. If you use a Rust IDE, you must configure it to run the tests. \ No newline at end of file diff --git a/source/docs/casper/resources/tokens/index.md b/source/docs/casper/resources/tokens/index.md index edd77dc8d6..62a805a484 100644 --- a/source/docs/casper/resources/tokens/index.md +++ b/source/docs/casper/resources/tokens/index.md @@ -20,6 +20,6 @@ slug: /resources/tokens/ | ------------------------------------------------------------------------------ | ---------------------------------------------------------------- | | [CEP-78 Enhanced NFT Standard Introduction](./cep78/introduction.md) | An introduction to the CEP-78 Enhanced NFT Standard. | | [CEP-78 Modalities](./cep78/introduction.md) | Information on the features available when installing a CEP-78 contract instance.| -| [Installing and Interacting with a CEP-78 Contract](./cep78/using-casper-client.md)| An introduction to features present in the CEP-78 Enhanced NFT Standard.| +| [Installing and Interacting with a CEP-78 Contract](./cep78/using-casper-client/full-installation-tutorial.md)| An introduction to features present in the CEP-78 Enhanced NFT Standard.| | [Owner Reverse Lookup Functionality](./cep78/reverse-lookup.md) | Information on the Onwer Reverse Lookup feature of CEP-78 contracts.| | [A CEP-78 JavaScript Client Tutorial](./cep78/js-tutorial.md) | A tutorial for using the JavaScript CEP-78 client. | diff --git a/static/image/tutorials/cep-78/the-nft-contract-hash.png b/static/image/tutorials/cep-78/the-nft-contract-hash.png new file mode 100644 index 0000000000000000000000000000000000000000..8130d8b425866786b7aed37bf3364da1098f2a49 GIT binary patch literal 200871 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
W=Jsn0m%Js-$%i~n_J#U%@^)8hzt-)K4 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 YqV{#&jT2#4lc<10Tm7n9kt#amZ?@z-MF0Q* literal 0 HcmV?d00001 From 80427caef9da58f3d1ef03473d2915e3245af5fc Mon Sep 17 00:00:00 2001 From: ipopescu Date: Wed, 6 Mar 2024 11:19:21 +0100 Subject: [PATCH 3/6] Fix links that don't fail locally --- .../full-installation-tutorial.md | 18 +++++++++--------- .../interacting-with-NFTs.md | 2 +- .../using-casper-client/quickstart-guide.md | 8 ++++---- .../cep78/using-casper-client/testing-NFTs.md | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md index 4477a33159..01138f10f8 100644 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md @@ -15,7 +15,7 @@ Information on the modalities used throughout this installation process can be f - [Building the Contract and Tests](#building-the-contract-and-tests) 2. [Reviewing the Contract Implementation](#reviewing-the-contract-implementation) - [Required Crates](#required-crates) - - [Initialization Flow](#Initialization-flow) + - [Initialization Flow](#initialization-flow) - [Contract Entrypoints](#contract-entrypoints) 3. [Installing the Contract](#installing-the-contract) - [Querying Global State](#querying-global-state) @@ -29,12 +29,12 @@ Information on the modalities used throughout this installation process can be f Before using this guide, ensure you meet the following requirements: -- Set up the [development prerequisites](https://docs.casper.network/developers/prerequisites/), including the [Casper client](https://docs.casper.network/developers/prerequisites/#install-casper-client) -- Get a valid [node address](https://docs.casper.network/developers/prerequisites/#acquire-node-address-from-network-peers) from the network -- Know how to install a [smart contract](https://docs.casper.network/developers/cli/sending-deploys/) on a Casper network +- Set up the [development prerequisites](../../../../developers/prerequisites.md), including the [Casper client](../../../../developers/prerequisites.md#install-casper-client) +- Get a valid [node address](../../../../developers/prerequisites.md#acquire-node-address-from-network-peers) from the network +- Know how to install a [smart contract](../../../../developers/cli/sending-deploys.md) on a Casper network - Hold enough CSPR tokens to pay for transactions -The [Writing Rust Contracts on Casper](https://docs.casper.network/developers/writing-onchain-code/simple-contract/) document outlines many aspects of this tutorial and should be read as a prerequisite. +The [Writing Rust Contracts on Casper](../../../../developers/writing-onchain-code/simple-contract.md) document outlines many aspects of this tutorial and should be read as a prerequisite. ### Building the Contract and Tests @@ -57,7 +57,7 @@ rustup target add wasm32-unknown-unknown info: component 'rust-std' for target 'wasm32-unknown-unknown' is up to date ``` -If you do not see this message, check the [Getting Started Guide](https://docs.casper.network/developers/writing-onchain-code/getting-started/). +If you do not see this message, check the [Getting Started Guide](../../../../developers/writing-onchain-code/getting-started.md). The contract code can be compiled to Wasm by running the `make build-contract` command provided in the Makefile at the top level. The Wasm will be found in the `contract/target/wasm32-unknown-unknown/release` directory as `contract.wasm`. @@ -147,11 +147,11 @@ There is also the [**migrate**](https://github.com/casper-ecosystem/cep-78-enhan ## Installing the Contract -Installing the enhanced NFT contract to global state requires using a [Deploy](../../../../developers/dapps/sending-deploys/). But before proceeding with the installation, verify the network state and the status of the account that will send the installation deploy. +Installing the enhanced NFT contract to global state requires using a [Deploy](../../../../developers/cli/sending-deploys.md). But before proceeding with the installation, verify the network state and the status of the account that will send the installation deploy. ### Querying Global State -This step queries information about the network state given the latest state root hash. You will also need the [IP address](../../../../developers/prerequisites/#acquire-node-address-from-network-peers) from a Testnet peer node. +This step queries information about the network state given the latest state root hash. You will also need the [IP address](../../../../developers/prerequisites.md#acquire-node-address-from-network-peers) from a Testnet peer node. ```bash casper-client get-state-root-hash --node-address http://localhost:11101/rpc/ @@ -218,7 +218,7 @@ casper-client query-global-state --node-address http://localhost:11101/rpc/ \ Below is an example of a `casper-client` command that provides all required session arguments to install a valid instance of the CEP-78 contract on global state. -Use the Testnet to understand the exact gas amount required for installation. Refer to the [note about gas prices](../../../../developers/cli/sending-deploys/#a-note-about-gas-price) to understand payment amounts and gas price adjustments. +Use the Testnet to understand the exact gas amount required for installation. Refer to the [note about gas prices](../../../../developers/cli/sending-deploys.md#a-note-about-gas-price) to understand payment amounts and gas price adjustments. - `casper-client put-deploy -n http://localhost:11101/rpc/ --chain-name "casper-net-1" --payment-amount 500000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-2/keys/secret_key.pem --session-path contract/target/wasm32-unknown-unknown/release/contract.wasm` diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md index 8989037ce9..79057b119e 100644 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md @@ -72,7 +72,7 @@ casper-client put-deploy --node-address http://localhost:11101/rpc/ \ ## Minting NFTs -Below is an example of a `casper-client` command that uses the `mint` entrypoint of the contract to mint an NFT for the user associated with `node-1` in an [NCTL environment](../../../../developers/dapps/nctl-test/). +Below is an example of a `casper-client` command that uses the `mint` entrypoint of the contract to mint an NFT for the user associated with `node-1` in an [NCTL environment](../../../../developers/dapps/nctl-test.md). - `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-entry-point "mint"` diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md index e8f45a7892..5c39735c7a 100644 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/quickstart-guide.md @@ -6,15 +6,15 @@ title: Quick Installation This quick installation guide introduces you to the Casper client commands and Wasm files necessary to deploy a CEP-78 Casper Enhanced NFT contract to the [Casper Testnet](https://testnet.cspr.live/). For greater detail into the creation and mechanics of the Casper NFT contract, see the complete [Casper NFT Tutorial](./full-installation-tutorial.md). -To execute transactions on a Casper network involving NFTs, you will need some CSPR tokens to pay for the transactions. The Testnet provides test tokens using a [faucet](https://docs.casper.network/users/testnet-faucet/). +To execute transactions on a Casper network involving NFTs, you will need some CSPR tokens to pay for the transactions. The Testnet provides test tokens using a [faucet](../../../../users/csprlive/testnet-faucet.md). ## Prerequisites Before using this guide, ensure you meet the following requirements: -- Set up the [development prerequisites](../../../../developers/prerequisites/), including the [Casper client](../../../../developers/prerequisites/#install-casper-client) -- Get a valid [node address](../../../../developers/prerequisites/#acquire-node-address-from-network-peers) from the network -- Know how to install a [smart contract](../../../../developers/cli/sending-deploys/) on a Casper network +- Set up the [development prerequisites](../../../../developers/prerequisites.md), including the [Casper client](../../../../developers/prerequisites.md#install-casper-client) +- Get a valid [node address](../../../../developers/prerequisites.md#acquire-node-address-from-network-peers) from the network +- Know how to install a [smart contract](../../../../developers/cli/sending-deploys.md) on a Casper network - Hold enough CSPR tokens to pay for transactions ## Setup diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md index 256ec3f81a..0d7fbd53f1 100644 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/testing-NFTs.md @@ -14,7 +14,7 @@ The testing framework in this tutorial uses the [Casper engine test support](htt The [tests](https://github.com/casper-ecosystem/cep-78-enhanced-nft/tree/dev/tests/src) source folder contains over 150 tests covering a variety of scenarios, including contract installation, minting and burning tokens, sending transfers, upgrading the contract, and listening to events. -For more details about the test framework and how each test is set up, visit the [Testing Smart Contracts](../../../../developers/writing-onchain-code/testing-contracts/) documentation page. +For more details about the test framework and how each test is set up, visit the [Testing Smart Contracts](../../../../developers/writing-onchain-code/testing-contracts.md) documentation page. ## Running the Tests From 9e9d52fb25cb8b6405a35e1e2b5575ed1f5f23ba Mon Sep 17 00:00:00 2001 From: ipopescu Date: Mon, 11 Mar 2024 20:27:49 +0100 Subject: [PATCH 4/6] Review feedback and updated TOC --- .../interacting-with-NFTs.md | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md index 8989037ce9..1a33afbea2 100644 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md @@ -17,13 +17,17 @@ This document describes interacting with NFTs on a Casper network using the Rust 1. [Directly Invoking Entrypoints](#directly-invoking-entrypoints) -2. [Transferring NFTs](#transferring-nfts) +2. [Minting NFTs](#minting-nfts) -3. [Approving Another Account](#approving-another-account) +3. [Transferring NFTs](#transferring-nfts) -4. [Minting NFTs](#minting-nfts) +4. [Checking Balances](#checking-balances) -5. [Burning NFTs](#burning-nfts) +5. [Approving an Account](#approving-an-account) + +6. [Burning NFTs](#burning-nfts) + +7. [Next Steps](#next-steps) ## Directly Invoking Entrypoints @@ -236,39 +240,40 @@ casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net- -## Checking the Balance +## Checking Balances -The following command invokes the `balance_of_call.wasm` and saves the number of tokens owned under the account's named keys. +To check an account's balance, get the latest state root hash and query the `balances` dictionary given the NFT contract hash and the owner's account hash without the "account-hash-" prefix, as shown below. -- `casper-client put-deploy -n http://localhost:11101/rpc --chain-name "casper-net-1" --payment-amount 5000000000 -k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem --session-path ~/casper/enhanced-nft/client/balance_of_session/target/wasm32-unknown-unknown/release/balance_of_call.wasm` +- `casper-client get-dictionary-item -n http://localhost:11101/rpc` -1. `--session-arg "nft_contract_hash:key='hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796'"` +1. `--state-root-hash f22e8ecfb3d2700d5f902c83da456c32f130b73d0d35037fe89b2d4b4933673f` - The contract hash of the previously installed CEP-78 NFT contract. + The latest state root hash. + +2. `--contract-hash hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796` -2. `--session-arg "token_owner:key='account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655'"` + The NFT contract hash. - The account hash of the user whose token balance we are checking. +3. `--dictionary-name "balances"` -3. `--session-arg "key_name:string='balance'"` + The dictionary tracking the number of tokens for each account hash. - The name for the entry under the `NamedKeys` under which the balance amount will be stored. +4. `--dictionary-item-key "0ea7998b2822afe5b62b08a21d54c941ad791279b089f3f7ede0d72b477eca34"` + + The account hash of the user whose token balance we are checking without the `account-hash-` prefix.

-Casper client command without comments +Casper client commands without comments ```bash -casper-client put-deploy -n http://localhost:11101/rpc/ \ ---chain-name "casper-net-1" \ ---payment-amount 5000000000 \ --k ~/casper/casper-node/utils/nctl/assets/net-1/nodes/node-1/keys/secret_key.pem \ ---session-path ~/casper/enhanced-nft/client/balance_of_session/target/wasm32-unknown-unknown/release/balance_of_call.wasm \ ---session-arg "nft_contract_hash:key='hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796'" \ ---session-arg "token_owner:key='account-hash-e70dbca48c2d31bc2d754e51860ceaa8a1a49dc627b20320b0ecee1b6d9ce655'" \ ---session-arg "key_name:string='balance'" -``` +casper-client get-state-root-hash --node-address https://rpc.testnet.casperlabs.io/ -
+casper-client get-dictionary-item -n http://localhost:11101/rpc/ \ +--state-root-hash f22e8ecfb3d2700d5f902c83da456c32f130b73d0d35037fe89b2d4b4933673f \ +--contract-hash hash-378a43e38bc5129d8aa3bcd04f5c9a97be73f85b5be574182ac1346f04520796 \ +--dictionary-name "balances" \ +--dictionary-item-key "0ea7998b2822afe5b62b08a21d54c941ad791279b089f3f7ede0d72b477eca34" +``` ## Approving an Account From 6dbe506c667631d7ec1578ff82ebcd5c211e21a9 Mon Sep 17 00:00:00 2001 From: ipopescu Date: Mon, 11 Mar 2024 20:37:01 +0100 Subject: [PATCH 5/6] Add missing tag --- .../tokens/cep78/using-casper-client/interacting-with-NFTs.md | 1 + 1 file changed, 1 insertion(+) diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md index ea8ebbea6c..2dd683ae27 100644 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/interacting-with-NFTs.md @@ -275,6 +275,7 @@ casper-client get-dictionary-item -n http://localhost:11101/rpc/ \ --dictionary-item-key "0ea7998b2822afe5b62b08a21d54c941ad791279b089f3f7ede0d72b477eca34" ``` + ## Approving an Account From 4c9215d2a92833783f831d52f91e6776c536daf6 Mon Sep 17 00:00:00 2001 From: ipopescu Date: Tue, 12 Mar 2024 16:14:20 +0100 Subject: [PATCH 6/6] Add missing entrypoints; essential note; reduce crates intro --- .../full-installation-tutorial.md | 57 ++++++++----------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md b/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md index 01138f10f8..f5c20cd988 100644 --- a/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md +++ b/source/docs/casper/resources/tokens/cep78/using-casper-client/full-installation-tutorial.md @@ -14,7 +14,7 @@ Information on the modalities used throughout this installation process can be f - [Prerequisites](#prerequisites) - [Building the Contract and Tests](#building-the-contract-and-tests) 2. [Reviewing the Contract Implementation](#reviewing-the-contract-implementation) - - [Required Crates](#required-crates) + - [Included Crates and Modules](#included-crates-and-modules) - [Initialization Flow](#initialization-flow) - [Contract Entrypoints](#contract-entrypoints) 3. [Installing the Contract](#installing-the-contract) @@ -78,47 +78,19 @@ There are four steps to follow when you intend to create your implementation of 3. Compile the customized code to Wasm. 4. Send the customized Wasm as a deploy to a Casper network. -### Required Crates +### Included Crates and Modules -This tutorial applies to the Rust implementation of the Casper NFT standard, which requires the following Casper crates: +The contract implementation starts by importing the following essential Casper crates: - [casper_contract](https://docs.rs/casper-contract/latest/casper_contract/index.html) - A Rust library for writing smart contracts on Casper networks - [casper_types](https://docs.rs/casper-types/latest/casper_types/) - Types used to allow the creation of Wasm contracts and tests for use on Casper networks -Here is the code snippet that imports those crates: - -```rust -use casper_contract::{ - contract_api::{ - runtime::{self, call_contract, revert}, - storage::{self}, - }, - unwrap_or_revert::UnwrapOrRevert, -}; -use casper_types::{ - contracts::NamedKeys, runtime_args, CLType, CLValue, ContractHash, ContractPackageHash, - EntryPoint, EntryPointAccess, EntryPointType, EntryPoints, Key, KeyTag, Parameter, RuntimeArgs, - Tagged, -}; -``` - -**Note**: In Rust, the keyword `use` is like an include statement in C/C++. - The contract code defines additional modules in the `contract/src` folder: -```rust -mod constants; -mod error; -mod events; -mod metadata; -mod modalities; -mod utils; -``` - - `constants` - Constant values required to run the contract code - `error` - Errors related to the NFT contract - `events` - A library for contract-emitted events -- `metadata` - Module handling the contract's metadata and corresponding dictionary +- `metadata` - A module handling the contract's metadata and corresponding dictionary - `modalities` - Common expectations around contract usage and behavior - `utils` - Utility and helper functions to run the contract code @@ -128,23 +100,40 @@ Initializing the contract happens through the `call() -> install_contract() -> i ### Contract Entrypoints -This section briefly explains the essential entrypoints used in the Casper NFT contract. To see their full implementation, refer to the [main.rs](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/dev/contract/src/main.rs) contract file. For further questions, contact the Casper support team via the [Discord channel](https://discord.com/invite/casperblockchain). The following entrypoints are listed as they are found in the code. +This section briefly explains the essential entrypoints used in the Casper NFT contract. To see their full implementation, refer to the [main.rs](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/dev/contract/src/main.rs) contract file. For further questions, contact the Casper support team via the [Discord channel](https://discord.com/invite/casperblockchain). - [**approve**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1002) - Allows a spender to transfer up to an amount of the owners’s tokens - [**balance_of**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1616) - Returns the token balance of the owner - [**burn**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L874) - Burns tokens, reducing the total supply - [**get_approved**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1728) - Returns the hash of the approved account for a specified token identifier - [**init**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L81) - Sets the collection name, symbol, and total token supply; initializes the allow minting setting, minting mode, ownership mode, NFT kind, holder mode, whitelist mode and contract whitelist, JSON schema, receipt name, identifier mode, and burn mode. This entrypoint can only be called once when the contract is installed on the network +- [**is_approved_for_all**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1328) - Returns yes if an account is approved as an operator for a token owner - [**metadata**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1675) - Returns the metadata associated with a token identifier - [**mint**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L619) - Mints additional tokens if minting is allowed, increasing the total supply - [**owner_of**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1636) - Returns the owner for a specified token identifier +- [**register_owner**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L2159) - Register an owner for a specified token identifier. Works when the *OwnerReverseLookupMode* is set to *Complete* +- [**revoke**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1138) - Revokes an account that was approved for an identified token transfer. The *OwnershipMode* must be set to *Transferable* - [**set_approval_for_all**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1254) - Allows a spender to transfer all of the owner's tokens - [**set_token_metadata**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1773) - Sets the metadata associated with a token identifier - [**set_variables**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L496) - Allows the user to set any combination of variables simultaneously, defining which variables are mutable or immutable -- [**transfer**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1359) - Transfers tokens from the token owner to a specified account. The transfer will succeed if the caller is the token owner or an approved operator. The transfer will fail if the OwnershipMode is set to Minter or Assigned +- [**transfer**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1359) - Transfers tokens from the token owner to a specified account. The transfer will succeed if the caller is the token owner or an approved operator. The *OwnershipMode* must be set to *Transferable* +- [**updated_receipts**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L2111) - Allows an owner of one or more NFTs held by the contract instance to attain up to date receipt information for the NFTs they currently own. Works when the *OwnerReverseLookupMode* is set to *Complete* There is also the [**migrate**](https://github.com/casper-ecosystem/cep-78-enhanced-nft/blob/440bff44277ab5fd295f37229fe92278339d3753/contract/src/main.rs#L1975) entrypoint, which was needed only for migrating a 1.0 version of the NFT contract to version 1.1. +:::important + +The following entrypoints return data using `runtime::ret`, which is useful mainly if the entrypoint caller is a contract: + +- `mint` (with *OwnerReverseLookupMode* set to *Complete*) +- `transfer` (with *OwnerReverseLookupMode* set to *TransfersOnly*) +- `balance_of` +- `is_approved_for_all` +- `owner_of` +- `metadata` + +::: + ## Installing the Contract Installing the enhanced NFT contract to global state requires using a [Deploy](../../../../developers/cli/sending-deploys.md). But before proceeding with the installation, verify the network state and the status of the account that will send the installation deploy.