neo3/neo_contract/
gas_token.rs

1use async_trait::async_trait;
2use primitive_types::H160;
3use serde::{Deserialize, Serialize};
4
5use crate::{
6	neo_clients::{JsonRpcProvider, RpcClient},
7	neo_contract::{
8		traits::{FungibleTokenTrait, SmartContractTrait, TokenTrait},
9		ContractError,
10	},
11	neo_types::{
12		serde_with_utils::{deserialize_script_hash, serialize_script_hash},
13		NNSName, ScriptHash,
14	},
15};
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct GasToken<'a, P: JsonRpcProvider> {
19	#[serde(deserialize_with = "deserialize_script_hash")]
20	#[serde(serialize_with = "serialize_script_hash")]
21	script_hash: ScriptHash,
22	#[serde(skip_serializing_if = "Option::is_none")]
23	total_supply: Option<u64>,
24	#[serde(skip_serializing_if = "Option::is_none")]
25	decimals: Option<u8>,
26	#[serde(skip_serializing_if = "Option::is_none")]
27	symbol: Option<String>,
28	#[serde(skip)]
29	provider: Option<&'a RpcClient<P>>,
30}
31
32impl<'a, P: JsonRpcProvider> GasToken<'a, P> {
33	pub const NAME: &'static str = "GasToken";
34	pub const DECIMALS: u8 = 8;
35	pub const SYMBOL: &'static str = "GAS";
36
37	pub fn new(provider: Option<&'a RpcClient<P>>) -> Self {
38		Self {
39			script_hash: Self::calc_native_contract_hash(Self::NAME).unwrap(),
40			total_supply: None,
41			decimals: Some(Self::DECIMALS),
42			symbol: Some(Self::SYMBOL.to_string()),
43			provider,
44		}
45	}
46}
47
48#[async_trait]
49impl<'a, P: JsonRpcProvider> TokenTrait<'a, P> for GasToken<'a, P> {
50	fn total_supply(&self) -> Option<u64> {
51		self.total_supply
52	}
53
54	fn set_total_supply(&mut self, total_supply: u64) {
55		self.total_supply = Option::from(total_supply);
56	}
57
58	fn decimals(&self) -> Option<u8> {
59		self.decimals
60	}
61
62	fn set_decimals(&mut self, decimals: u8) {
63		self.decimals = Option::from(decimals);
64	}
65
66	fn symbol(&self) -> Option<String> {
67		self.symbol.clone()
68	}
69
70	fn set_symbol(&mut self, symbol: String) {
71		self.symbol = Option::from(symbol);
72	}
73
74	async fn resolve_nns_text_record(&self, _name: &NNSName) -> Result<H160, ContractError> {
75		Err(ContractError::UnsupportedOperation(
76			"GAS token does not support NNS text record resolution".to_string(),
77		))
78	}
79}
80
81#[async_trait]
82impl<'a, P: JsonRpcProvider> SmartContractTrait<'a> for GasToken<'a, P> {
83	type P = P;
84
85	fn script_hash(&self) -> H160 {
86		self.script_hash
87	}
88
89	fn set_script_hash(&mut self, script_hash: H160) {
90		self.script_hash = script_hash;
91	}
92
93	fn provider(&self) -> Option<&RpcClient<P>> {
94		self.provider
95	}
96}
97
98#[async_trait]
99impl<'a, P: JsonRpcProvider> FungibleTokenTrait<'a, P> for GasToken<'a, P> {}