Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit 8d115f1

Browse files
authored
token-cli: create transfer-fee-basis-points and transfer-fee-maximum-fee flags (#7053)
* create transfer-fee-basis-points and transfer-fee-maximum-fee flags Signed-off-by: Hrushi20 <[email protected]> * revert unused import change Signed-off-by: Hrushi20 <[email protected]> remove unwanted space Signed-off-by: Hrushi20 <[email protected]> added missing comma Signed-off-by: Hrushi20 <[email protected]> * update style, refactor code Signed-off-by: Hrushi20 <[email protected]> * fix clippy error, add validation Signed-off-by: Hrushi20 <[email protected]> --------- Signed-off-by: Hrushi20 <[email protected]>
1 parent 46dacb6 commit 8d115f1

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

token/cli/src/clap_app.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,11 +763,42 @@ pub fn app<'a, 'b>(
763763
.value_names(&["FEE_IN_BASIS_POINTS", "MAXIMUM_FEE"])
764764
.takes_value(true)
765765
.number_of_values(2)
766+
.hidden(true)
767+
.conflicts_with("transfer_fee_basis_points")
768+
.conflicts_with("transfer_fee_maximum_fee")
766769
.help(
767770
"Add a transfer fee to the mint. \
768771
The mint authority can set the fee and withdraw collected fees.",
769772
),
770773
)
774+
.arg(
775+
Arg::with_name("transfer_fee_basis_points")
776+
.long("transfer-fee-basis-points")
777+
.value_names(&["FEE_IN_BASIS_POINTS"])
778+
.takes_value(true)
779+
.number_of_values(1)
780+
.conflicts_with("transfer_fee")
781+
.requires("transfer_fee_maximum_fee")
782+
.validator(is_parsable::<u16>)
783+
.help(
784+
"Add transfer fee to the mint. \
785+
The mint authority can set the fee.",
786+
),
787+
)
788+
.arg(
789+
Arg::with_name("transfer_fee_maximum_fee")
790+
.long("transfer-fee-maximum-fee")
791+
.value_names(&["MAXIMUM_FEE"])
792+
.takes_value(true)
793+
.number_of_values(1)
794+
.conflicts_with("transfer_fee")
795+
.requires("transfer_fee_basis_points")
796+
.validator(is_amount)
797+
.help(
798+
"Add a UI amount maximum transfer fee to the mint. \
799+
The mint authority can set and collect fees"
800+
)
801+
)
771802
.arg(
772803
Arg::with_name("enable_permanent_delegate")
773804
.long("enable-permanent-delegate")

token/cli/src/command.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3473,6 +3473,7 @@ pub async fn process_command<'a>(
34733473
let member_address = value_t!(arg_matches, "member_address", Pubkey).ok();
34743474

34753475
let transfer_fee = arg_matches.values_of("transfer_fee").map(|mut v| {
3476+
println_display(config,"transfer-fee has been deprecated and will be removed in a future release. Please specify --transfer-fee-basis-points and --transfer-fee-maximum-fee with a UI amount".to_string());
34763477
(
34773478
v.next()
34783479
.unwrap()
@@ -3485,6 +3486,13 @@ pub async fn process_command<'a>(
34853486
)
34863487
});
34873488

3489+
let tranfer_fee_basis_point = value_of::<u16>(arg_matches, "transfer_fee_basis_points");
3490+
let transfer_fee_maximum_fee = value_of::<f64>(arg_matches, "transfer_fee_maximum_fee")
3491+
.map(|v| spl_token::ui_amount_to_amount(v, decimals));
3492+
let transfer_fee = tranfer_fee_basis_point
3493+
.map(|v| (v, transfer_fee_maximum_fee.unwrap()))
3494+
.or(transfer_fee);
3495+
34883496
let (token_signer, token) =
34893497
get_signer(arg_matches, "token_keypair", &mut wallet_manager)
34903498
.unwrap_or_else(new_throwaway_signer);

token/cli/tests/command.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ async fn main() {
123123
async_trial!(non_transferable, test_validator, payer),
124124
async_trial!(default_account_state, test_validator, payer),
125125
async_trial!(transfer_fee, test_validator, payer),
126+
async_trial!(transfer_fee_basis_point, test_validator, payer),
126127
async_trial!(confidential_transfer, test_validator, payer),
127128
async_trial!(multisig_transfer, test_validator, payer),
128129
async_trial!(offline_multisig_transfer_with_nonce, test_validator, payer),
@@ -2521,6 +2522,54 @@ async fn transfer_fee(test_validator: &TestValidator, payer: &Keypair) {
25212522
);
25222523
}
25232524

2525+
async fn transfer_fee_basis_point(test_validator: &TestValidator, payer: &Keypair) {
2526+
let config = test_config_with_default_signer(test_validator, payer, &spl_token_2022::id());
2527+
2528+
let transfer_fee_basis_points = 100;
2529+
let maximum_fee = 1.2;
2530+
let decimal = 9;
2531+
2532+
let token = Keypair::new();
2533+
let token_keypair_file = NamedTempFile::new().unwrap();
2534+
write_keypair_file(&token, &token_keypair_file).unwrap();
2535+
let token_pubkey = token.pubkey();
2536+
process_test_command(
2537+
&config,
2538+
payer,
2539+
&[
2540+
"spl-token",
2541+
CommandName::CreateToken.into(),
2542+
token_keypair_file.path().to_str().unwrap(),
2543+
"--transfer-fee-basis-points",
2544+
&transfer_fee_basis_points.to_string(),
2545+
"--transfer-fee-maximum-fee",
2546+
&maximum_fee.to_string(),
2547+
],
2548+
)
2549+
.await
2550+
.unwrap();
2551+
2552+
let account = config.rpc_client.get_account(&token_pubkey).await.unwrap();
2553+
let test_mint = StateWithExtensionsOwned::<Mint>::unpack(account.data).unwrap();
2554+
let extension = test_mint.get_extension::<TransferFeeConfig>().unwrap();
2555+
assert_eq!(
2556+
u16::from(extension.older_transfer_fee.transfer_fee_basis_points),
2557+
transfer_fee_basis_points
2558+
);
2559+
assert_eq!(
2560+
u64::from(extension.older_transfer_fee.maximum_fee),
2561+
(maximum_fee * i32::pow(10, decimal) as f64) as u64
2562+
);
2563+
assert_eq!(
2564+
u16::from(extension.newer_transfer_fee.transfer_fee_basis_points),
2565+
transfer_fee_basis_points
2566+
);
2567+
assert_eq!(
2568+
u64::from(extension.newer_transfer_fee.maximum_fee),
2569+
(maximum_fee * i32::pow(10, decimal) as f64) as u64
2570+
);
2571+
}
2572+
25242573
async fn confidential_transfer(test_validator: &TestValidator, payer: &Keypair) {
25252574
use spl_token_2022::solana_zk_token_sdk::encryption::elgamal::ElGamalKeypair;
25262575

0 commit comments

Comments
 (0)