Skip to content

Commit c6abfd8

Browse files
authored
Support non-zero base AssetId (#71)
1 parent 01232ce commit c6abfd8

File tree

5 files changed

+35
-23
lines changed

5 files changed

+35
-23
lines changed

src/config.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use crate::constants::{
22
CAPTCHA_KEY, CAPTCHA_SECRET, DEFAULT_DISPENSE_INTERVAL, DEFAULT_FAUCET_DISPENSE_AMOUNT,
3-
DEFAULT_NODE_URL, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, FAUCET_ASSET_ID,
4-
FUEL_NODE_URL, HUMAN_LOGGING, LOG_FILTER, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, TIMEOUT_SECONDS,
3+
DEFAULT_NODE_URL, DEFAULT_PORT, DISPENSE_AMOUNT, DISPENSE_INTERVAL, FUEL_NODE_URL,
4+
HUMAN_LOGGING, LOG_FILTER, PUBLIC_FUEL_NODE_URL, SERVICE_PORT, TIMEOUT_SECONDS,
55
WALLET_SECRET_KEY,
66
};
7-
use fuels_core::types::AssetId;
87
use secrecy::Secret;
98
use std::env;
109

@@ -19,7 +18,6 @@ pub struct Config {
1918
pub public_node_url: String,
2019
pub wallet_secret_key: Option<Secret<String>>,
2120
pub dispense_amount: u64,
22-
pub dispense_asset_id: AssetId,
2321
pub dispense_limit_interval: u64,
2422
pub timeout: u64,
2523
}
@@ -44,7 +42,6 @@ impl Default for Config {
4442
.unwrap_or_else(|_| DEFAULT_FAUCET_DISPENSE_AMOUNT.to_string())
4543
.parse::<u64>()
4644
.expect("expected a valid integer for DISPENSE_AMOUNT"),
47-
dispense_asset_id: FAUCET_ASSET_ID,
4845
dispense_limit_interval: env::var(DISPENSE_INTERVAL)
4946
.unwrap_or_else(|_| DEFAULT_DISPENSE_INTERVAL.to_string())
5047
.parse::<u64>()

src/constants.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use fuels_core::types::AssetId;
2-
31
pub const LOG_FILTER: &str = "RUST_LOG";
42
pub const HUMAN_LOGGING: &str = "HUMAN_LOGGING";
53
pub const CAPTCHA_KEY: &str = "CAPTCHA_KEY";
@@ -14,7 +12,6 @@ pub const DISPENSE_AMOUNT: &str = "DISPENSE_AMOUNT";
1412
pub const DISPENSE_INTERVAL: &str = "DISPENSE_LIMIT_INTERVAL";
1513
pub const DEFAULT_DISPENSE_INTERVAL: u64 = 24 * 60 * 60;
1614
pub const DEFAULT_FAUCET_DISPENSE_AMOUNT: u64 = 10_000_000;
17-
pub const FAUCET_ASSET_ID: AssetId = AssetId::new([0; 32]);
1815
pub const SERVICE_PORT: &str = "PORT";
1916
pub const DEFAULT_PORT: u16 = 3000;
2017

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ pub async fn start_server(
9797
let provider = Provider::connect(service_config.node_url.clone())
9898
.await
9999
.expect("Should create a provider");
100+
let base_asset_id = *provider.consensus_parameters().base_asset_id();
100101

101102
// setup wallet
102103
let secret = service_config
@@ -112,7 +113,7 @@ pub async fn start_server(
112113
);
113114

114115
let balance = wallet
115-
.get_coins(service_config.dispense_asset_id)
116+
.get_coins(base_asset_id)
116117
.await
117118
.expect("Failed to fetch initial balance from fuel core")
118119
.into_iter()

src/routes.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,13 @@ fn check_and_mark_dispense_limit(
146146
Ok(())
147147
}
148148

149-
async fn get_coins(wallet: &WalletUnlocked, amount: u64) -> Result<Vec<Input>, DispenseError> {
149+
async fn get_coins(
150+
wallet: &WalletUnlocked,
151+
base_asset_id: &AssetId,
152+
amount: u64,
153+
) -> Result<Vec<Input>, DispenseError> {
150154
wallet
151-
.get_spendable_resources(AssetId::BASE, amount)
155+
.get_spendable_resources(*base_asset_id, amount)
152156
.await
153157
.map_err(|e| {
154158
error(
@@ -245,6 +249,7 @@ pub async fn dispense_tokens(
245249
});
246250

247251
let provider = wallet.provider().expect("client provider");
252+
let base_asset_id = *provider.consensus_parameters().base_asset_id();
248253

249254
let mut tx_id = None;
250255
for _ in 0..5 {
@@ -253,25 +258,25 @@ pub async fn dispense_tokens(
253258
let coin_type = CoinType::Coin(Coin {
254259
amount: previous_coin_output.amount,
255260
block_created: 0u32,
256-
asset_id: config.dispense_asset_id,
261+
asset_id: base_asset_id,
257262
utxo_id: previous_coin_output.utxo_id,
258263
owner: previous_coin_output.owner.into(),
259264
status: CoinStatus::Unspent,
260265
});
261266

262267
vec![Input::resource_signed(coin_type)]
263268
} else {
264-
get_coins(&wallet, config.dispense_amount).await?
269+
get_coins(&wallet, &base_asset_id, config.dispense_amount).await?
265270
};
266271

267272
let mut outputs = wallet.get_asset_outputs_for_amount(
268273
&address.into(),
269-
config.dispense_asset_id,
274+
base_asset_id,
270275
config.dispense_amount,
271276
);
272277
let faucet_address: Address = wallet.address().into();
273278
// Add an additional output to store the stable part of the fee change.
274-
outputs.push(Output::coin(faucet_address, 0, config.dispense_asset_id));
279+
outputs.push(Output::coin(faucet_address, 0, base_asset_id));
275280

276281
let tip = guard.next_tip();
277282

@@ -307,7 +312,7 @@ pub async fn dispense_tokens(
307312
"Overflow during calculating `TransactionFee`".to_string(),
308313
StatusCode::INTERNAL_SERVER_ERROR,
309314
))?;
310-
let available_balance = available_balance(&tx_builder.inputs, &config.dispense_asset_id);
315+
let available_balance = available_balance(&tx_builder.inputs, &base_asset_id);
311316
let stable_fee_change = available_balance
312317
.checked_sub(fee.max_fee().saturating_add(config.dispense_amount))
313318
.ok_or(error(
@@ -316,7 +321,7 @@ pub async fn dispense_tokens(
316321
))?;
317322

318323
*tx_builder.outputs.last_mut().unwrap() =
319-
Output::coin(faucet_address, stable_fee_change, config.dispense_asset_id);
324+
Output::coin(faucet_address, stable_fee_change, base_asset_id);
320325

321326
let script = tx_builder.build(provider).await.expect("Valid script");
322327

@@ -388,10 +393,14 @@ pub async fn dispense_tokens(
388393
#[tracing::instrument(skip_all)]
389394
pub async fn dispense_info(
390395
Extension(config): Extension<SharedConfig>,
396+
Extension(wallet): Extension<SharedWallet>,
391397
) -> Result<DispenseInfoResponse, DispenseError> {
398+
let provider = wallet.provider().expect("client provider");
399+
let base_asset_id = *provider.consensus_parameters().base_asset_id();
400+
392401
Ok(DispenseInfoResponse {
393402
amount: config.dispense_amount,
394-
asset_id: config.dispense_asset_id.to_string(),
403+
asset_id: base_asset_id.to_string(),
395404
})
396405
}
397406

tests/dispense.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use fuel_faucet::config::Config;
1010
use fuel_faucet::models::DispenseInfoResponse;
1111
use fuel_faucet::{start_server, Clock, THE_BIGGEST_AMOUNT};
1212
use fuel_tx::ConsensusParameters;
13-
use fuel_types::{Address, AssetId};
13+
use fuel_types::Address;
1414
use fuels_accounts::provider::Provider;
1515
use fuels_accounts::wallet::WalletUnlocked;
1616
use fuels_core::types::bech32::Bech32Address;
@@ -60,6 +60,7 @@ impl TestContext {
6060
let dispense_amount = rng.gen_range(1..10000u64);
6161
let secret_key: SecretKey = SecretKey::random(&mut rng);
6262
let wallet = WalletUnlocked::new_from_private_key(secret_key, None);
63+
let base_asset_id = [1; 32].into();
6364

6465
let mut generator = CoinConfigGenerator::new();
6566
let mut coins: Vec<_> = (0..10000)
@@ -77,7 +78,7 @@ impl TestContext {
7778
coins.push(CoinConfig {
7879
owner: wallet.address().into(),
7980
amount: 1 << 50,
80-
asset_id: Default::default(),
81+
asset_id: base_asset_id,
8182
..generator.generate()
8283
});
8384

@@ -89,6 +90,7 @@ impl TestContext {
8990
let mut consensus_parameters = ConsensusParameters::default();
9091
consensus_parameters
9192
.set_fee_params(fuel_tx::FeeParameters::default().with_gas_price_factor(1));
93+
consensus_parameters.set_base_asset_id(base_asset_id);
9294

9395
let chain_config = ChainConfig {
9496
consensus_parameters,
@@ -121,7 +123,6 @@ impl TestContext {
121123
node_url: format!("http://{}", fuel_node.bound_address),
122124
wallet_secret_key: Some(Secret::new(format!("{secret_key:x}"))),
123125
dispense_amount,
124-
dispense_asset_id: AssetId::default(),
125126
..Default::default()
126127
};
127128

@@ -157,7 +158,11 @@ async fn can_start_server() {
157158
assert_eq!(response.amount, context.faucet_config.dispense_amount);
158159
assert_eq!(
159160
response.asset_id,
160-
context.faucet_config.dispense_asset_id.to_string()
161+
context
162+
.provider
163+
.consensus_parameters()
164+
.base_asset_id()
165+
.to_string()
161166
);
162167
}
163168

@@ -208,7 +213,10 @@ async fn _dispense_sends_coins_to_valid_address(
208213

209214
let test_balance: u64 = context
210215
.provider
211-
.get_coins(&recipient_address, context.faucet_config.dispense_asset_id)
216+
.get_coins(
217+
&recipient_address,
218+
*context.provider.consensus_parameters().base_asset_id(),
219+
)
212220
.await
213221
.unwrap()
214222
.iter()

0 commit comments

Comments
 (0)