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

Commit d235652

Browse files
committed
create transfer-fee-basis-points and transfer-fee-maximum-fee flags
Signed-off-by: Hrushi20 <[email protected]>
1 parent d1fa4d5 commit d235652

File tree

3 files changed

+113
-2
lines changed

3 files changed

+113
-2
lines changed

token/cli/src/clap_app.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,11 +763,34 @@ 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)
766767
.help(
767768
"Add a transfer fee to the mint. \
768769
The mint authority can set the fee and withdraw collected fees.",
769770
),
770771
)
772+
.arg(
773+
Arg::with_name("transfer_fee_basis_points")
774+
.long("transfer-fee-basis-points")
775+
.value_names(&["FEE_IN_BASIS_POINTS"])
776+
.takes_value(true)
777+
.number_of_values(1)
778+
.help(
779+
"Add transfer fee to the mint. \
780+
The mint authority can set the fee.",
781+
),
782+
)
783+
.arg(
784+
Arg::with_name("transfer_fee_maximum_fee")
785+
.long("transfer-fee-maximum-fee")
786+
.value_names(&["MAXIMUM_FEE"])
787+
.takes_value(true)
788+
.number_of_values(1)
789+
.help(
790+
"Add a UI amount transfer fee to the mint. \
791+
The mint authority can set the fee and collected fee"
792+
)
793+
)
771794
.arg(
772795
Arg::with_name("enable_permanent_delegate")
773796
.long("enable-permanent-delegate")

token/cli/src/command.rs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ use {
6262
encryption::{
6363
auth_encryption::AeKey,
6464
elgamal::{self, ElGamalKeypair},
65-
},
66-
zk_token_elgamal::pod::ElGamalPubkey,
65+
}, instruction::transfer, zk_token_elgamal::pod::ElGamalPubkey
6766
},
6867
state::{Account, AccountState, Mint},
6968
},
@@ -3472,6 +3471,7 @@ pub async fn process_command<'a>(
34723471
let member_address = value_t!(arg_matches, "member_address", Pubkey).ok();
34733472

34743473
let transfer_fee = arg_matches.values_of("transfer_fee").map(|mut v| {
3474+
println_display(config,"transfer_fee flag has been deprecated".to_string());
34753475
(
34763476
v.next()
34773477
.unwrap()
@@ -3484,6 +3484,45 @@ pub async fn process_command<'a>(
34843484
)
34853485
});
34863486

3487+
let transfer_fee_basis_point = arg_matches.values_of("transfer_fee_basis_points").map(|mut v| {
3488+
v.next()
3489+
.unwrap()
3490+
.parse::<u16>()
3491+
.unwrap_or_else(print_error_and_exit)
3492+
});
3493+
3494+
let transfer_fee_maximum_fee = arg_matches.values_of("transfer_fee_maximum_fee").map(|mut v| {
3495+
v.next()
3496+
.unwrap()
3497+
.parse::<f64>()
3498+
.unwrap_or_else(print_error_and_exit)
3499+
});
3500+
3501+
let transfer_fee = match transfer_fee.is_some() {
3502+
true => match transfer_fee_basis_point.is_some() || transfer_fee_maximum_fee.is_some() {
3503+
true => Err("transfer-fee-basis-point and transfer-fee-maximum-fee flag disable when using transfer-fee flag"),
3504+
false => Ok(transfer_fee)
3505+
},
3506+
false => match transfer_fee_basis_point.is_some() && transfer_fee_maximum_fee.is_some() {
3507+
true => Ok(Some((transfer_fee_basis_point.unwrap(), (transfer_fee_maximum_fee.unwrap() * (u64::pow(10, decimals.into())) as f64) as u64))),
3508+
false => if transfer_fee_basis_point.is_some() {
3509+
Err("Missing transfer_fee_maximum_fee flag")
3510+
}else if transfer_fee_maximum_fee.is_some() {
3511+
Err("Missing transfer_fee_basis_point")
3512+
}else{
3513+
Ok(None)
3514+
}
3515+
}
3516+
};
3517+
3518+
let transfer_fee = match transfer_fee {
3519+
Ok(result) => result,
3520+
Err(e) => {
3521+
eprintln!("{}",e);
3522+
exit(1);
3523+
}
3524+
};
3525+
34873526
let (token_signer, token) =
34883527
get_signer(arg_matches, "token_keypair", &mut wallet_manager)
34893528
.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,8 @@ 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),
127+
// async_trial!(transfer_fee_maximum_fee, test_validator, payer),
126128
async_trial!(confidential_transfer, test_validator, payer),
127129
async_trial!(multisig_transfer, test_validator, payer),
128130
async_trial!(offline_multisig_transfer_with_nonce, test_validator, payer),
@@ -2521,6 +2523,53 @@ async fn transfer_fee(test_validator: &TestValidator, payer: &Keypair) {
25212523
);
25222524
}
25232525

2526+
async fn transfer_fee_basis_point(test_validator: &TestValidator, payer: &Keypair) {
2527+
let config = test_config_with_default_signer(test_validator, payer, &spl_token_2022::id());
2528+
2529+
let transfer_fee_basis_points = 100;
2530+
let maximum_fee = 1.2;
2531+
let decimal = 9;
2532+
2533+
let token = Keypair::new();
2534+
let token_keypair_file = NamedTempFile::new().unwrap();
2535+
write_keypair_file(&token, &token_keypair_file);
2536+
let token_pubkey = token.pubkey();
2537+
process_test_command(
2538+
&config,
2539+
payer,
2540+
&[
2541+
"spl-token",
2542+
CommandName::CreateToken.into(),
2543+
token_keypair_file.path().to_str().unwrap(),
2544+
"--transfer-fee-basis-points",
2545+
&transfer_fee_basis_points.to_string(),
2546+
"--transfer-fee-maximum-fee",
2547+
&maximum_fee.to_string()
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)