1use fuels::{
2 accounts::wallet::WalletUnlocked,
3 prelude::{abigen, Contract, LoadConfiguration, TxParameters},
4 types::SizedAsciiString,
5};
6
7abigen!(Contract(
8 name = "TokenContract",
9 abi = "contract/out/debug/FRC20-abi.json"
10));
11pub struct DeployTokenConfig {
12 pub name: String,
13 pub symbol: String,
14 pub decimals: u8,
15}
16
17pub async fn deploy_token_contract(
18 wallet: &WalletUnlocked,
19 deploy_config: &DeployTokenConfig,
20 bin_path: &str,
21) -> TokenContract<WalletUnlocked> {
22 let mut name = deploy_config.name.clone();
23 name.push_str(" ".repeat(32 - name.len()).as_str());
24 let name = SizedAsciiString::<32>::new(name).unwrap();
25
26 let mut symbol = deploy_config.symbol.clone();
27 symbol.push_str(" ".repeat(8 - symbol.len()).as_str());
28 let symbol = SizedAsciiString::<8>::new(symbol).unwrap();
29
30 let configurables = TokenContractConfigurables::new()
31 .set_DECIMALS(deploy_config.decimals)
32 .set_NAME(name)
33 .set_SYMBOL(symbol)
34 .set_OWNER(wallet.address().into());
35
36 let config = LoadConfiguration::default().set_configurables(configurables);
37 let id = Contract::load_from(bin_path, config)
38 .unwrap()
39 .deploy(wallet, TxParameters::default().set_gas_price(1))
40 .await
41 .unwrap();
42
43 TokenContract::new(id, wallet.clone())
44}
45
46pub mod token_abi_calls {
47
48 use fuels::{programs::call_response::FuelCallResponse, types::Address};
49
50 use super::*;
51
52 pub async fn mint(
53 instance: &TokenContract<WalletUnlocked>,
54 amount: u64,
55 recipient: Address,
56 ) -> Result<FuelCallResponse<()>, fuels::types::errors::Error> {
57 instance
58 .methods()
59 ._mint(amount, recipient)
60 .tx_params(TxParameters::default().set_gas_price(1))
61 .append_variable_outputs(1)
62 .call()
63 .await
64 }
65}