src20_sdk/
lib.rs

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}