neo3/neo_contract/
fungible_token_contract.rs

1use async_trait::async_trait;
2use primitive_types::H160;
3
4use crate::{
5	neo_clients::{JsonRpcProvider, RpcClient},
6	neo_contract::{
7		traits::{FungibleTokenTrait, SmartContractTrait, TokenTrait},
8		ContractError,
9	},
10	neo_types::NNSName,
11};
12
13#[derive(Debug)]
14pub struct FungibleTokenContract<'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> FungibleTokenContract<'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 FungibleTokenContract<'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		Err(ContractError::UnsupportedOperation(
62							"NNS text record resolution requires comprehensive domain name integration for fungible tokens".to_string(),
63		))
64	}
65}
66
67#[async_trait]
68impl<'a, P: JsonRpcProvider> SmartContractTrait<'a> for FungibleTokenContract<'a, P> {
69	type P = P;
70
71	fn script_hash(&self) -> H160 {
72		self.script_hash
73	}
74
75	fn set_script_hash(&mut self, script_hash: H160) {
76		self.script_hash = script_hash;
77	}
78
79	fn provider(&self) -> Option<&RpcClient<P>> {
80		self.provider
81	}
82}
83
84#[async_trait]
85impl<'a, P: JsonRpcProvider> FungibleTokenTrait<'a, P> for FungibleTokenContract<'a, P> {}