neo3/neo_contract/
nft_contract.rs

1use async_trait::async_trait;
2use primitive_types::H160;
3
4use crate::{
5	neo_clients::{JsonRpcProvider, RpcClient},
6	neo_contract::{
7		traits::{NonFungibleTokenTrait, SmartContractTrait, TokenTrait},
8		ContractError,
9	},
10	neo_types::NNSName,
11};
12
13#[derive(Debug)]
14pub struct NftContract<'a, P: JsonRpcProvider> {
15	script_hash: H160,
16	total_supply: Option<u64>,
17	decimals: Option<u8>,
18	symbol: Option<String>,
19	provider: Option<&'a RpcClient<P>>,
20}
21
22impl<'a, P: JsonRpcProvider> NftContract<'a, P> {
23	pub fn new(script_hash: &H160, provider: Option<&'a RpcClient<P>>) -> Self {
24		Self {
25			script_hash: script_hash.clone(),
26			total_supply: None,
27			decimals: None,
28			symbol: None,
29			provider,
30		}
31	}
32}
33
34#[async_trait]
35impl<'a, P: JsonRpcProvider> TokenTrait<'a, P> for NftContract<'a, P> {
36	fn total_supply(&self) -> Option<u64> {
37		self.total_supply
38	}
39
40	fn set_total_supply(&mut self, total_supply: u64) {
41		self.total_supply = Option::from(total_supply);
42	}
43
44	fn decimals(&self) -> Option<u8> {
45		self.decimals
46	}
47
48	fn set_decimals(&mut self, decimals: u8) {
49		self.decimals = Option::from(decimals);
50	}
51
52	fn symbol(&self) -> Option<String> {
53		self.symbol.clone()
54	}
55
56	fn set_symbol(&mut self, symbol: String) {
57		self.symbol = Option::from(symbol);
58	}
59
60	async fn resolve_nns_text_record(&self, _name: &NNSName) -> Result<H160, ContractError> {
61		// NFT contracts don't typically resolve NNS text records
62		// Return an error indicating this operation is not supported
63		Err(ContractError::UnsupportedOperation(
64			"NNS text record resolution is not supported for NFT contracts".to_string(),
65		))
66	}
67}
68
69#[async_trait]
70impl<'a, P: JsonRpcProvider> SmartContractTrait<'a> for NftContract<'a, P> {
71	type P = P;
72
73	fn script_hash(&self) -> H160 {
74		self.script_hash
75	}
76
77	fn set_script_hash(&mut self, script_hash: H160) {
78		self.script_hash = script_hash;
79	}
80
81	fn provider(&self) -> Option<&RpcClient<P>> {
82		self.provider
83	}
84}
85
86#[async_trait]
87impl<'a, P: JsonRpcProvider> NonFungibleTokenTrait<'a, P> for NftContract<'a, P> {}