|
|
@@ -52,6 +52,7 @@ fn test_transfer() {
|
|
|
from: 0,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
|
|
nonce_account: None,
|
|
|
@@ -71,6 +72,7 @@ fn test_transfer() {
|
|
|
from: 0,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
|
|
nonce_account: None,
|
|
|
@@ -102,6 +104,7 @@ fn test_transfer() {
|
|
|
from: 0,
|
|
|
sign_only: true,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::None(blockhash),
|
|
|
nonce_account: None,
|
|
|
@@ -122,6 +125,7 @@ fn test_transfer() {
|
|
|
from: 0,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::FeeCalculator(blockhash_query::Source::Cluster, blockhash),
|
|
|
nonce_account: None,
|
|
|
@@ -167,6 +171,7 @@ fn test_transfer() {
|
|
|
from: 0,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::FeeCalculator(
|
|
|
blockhash_query::Source::NonceAccount(nonce_account.pubkey()),
|
|
|
@@ -219,6 +224,7 @@ fn test_transfer() {
|
|
|
from: 0,
|
|
|
sign_only: true,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::None(nonce_hash),
|
|
|
nonce_account: Some(nonce_account.pubkey()),
|
|
|
@@ -238,6 +244,7 @@ fn test_transfer() {
|
|
|
from: 0,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::FeeCalculator(
|
|
|
blockhash_query::Source::NonceAccount(nonce_account.pubkey()),
|
|
|
@@ -307,6 +314,7 @@ fn test_transfer_multisession_signing() {
|
|
|
from: 1,
|
|
|
sign_only: true,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::None(blockhash),
|
|
|
nonce_account: None,
|
|
|
@@ -336,6 +344,7 @@ fn test_transfer_multisession_signing() {
|
|
|
from: 1,
|
|
|
sign_only: true,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::None(blockhash),
|
|
|
nonce_account: None,
|
|
|
@@ -362,6 +371,7 @@ fn test_transfer_multisession_signing() {
|
|
|
from: 1,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::FeeCalculator(blockhash_query::Source::Cluster, blockhash),
|
|
|
nonce_account: None,
|
|
|
@@ -410,6 +420,7 @@ fn test_transfer_all() {
|
|
|
from: 0,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
|
|
nonce_account: None,
|
|
|
@@ -423,6 +434,53 @@ fn test_transfer_all() {
|
|
|
check_recent_balance(49_999, &rpc_client, &recipient_pubkey);
|
|
|
}
|
|
|
|
|
|
+#[test]
|
|
|
+fn test_transfer_unfunded_recipient() {
|
|
|
+ solana_logger::setup();
|
|
|
+ let mint_keypair = Keypair::new();
|
|
|
+ let test_validator = TestValidator::with_custom_fees(mint_keypair.pubkey(), 1);
|
|
|
+ let faucet_addr = run_local_faucet(mint_keypair, None);
|
|
|
+
|
|
|
+ let rpc_client =
|
|
|
+ RpcClient::new_with_commitment(test_validator.rpc_url(), CommitmentConfig::processed());
|
|
|
+
|
|
|
+ let default_signer = Keypair::new();
|
|
|
+
|
|
|
+ let mut config = CliConfig::recent_for_tests();
|
|
|
+ config.json_rpc_url = test_validator.rpc_url();
|
|
|
+ config.signers = vec![&default_signer];
|
|
|
+
|
|
|
+ let sender_pubkey = config.signers[0].pubkey();
|
|
|
+ let recipient_pubkey = Pubkey::new(&[1u8; 32]);
|
|
|
+
|
|
|
+ request_and_confirm_airdrop(&rpc_client, &faucet_addr, &sender_pubkey, 50_000, &config)
|
|
|
+ .unwrap();
|
|
|
+ check_recent_balance(50_000, &rpc_client, &sender_pubkey);
|
|
|
+ check_recent_balance(0, &rpc_client, &recipient_pubkey);
|
|
|
+
|
|
|
+ check_ready(&rpc_client);
|
|
|
+
|
|
|
+ // Plain ole transfer
|
|
|
+ config.command = CliCommand::Transfer {
|
|
|
+ amount: SpendAmount::All,
|
|
|
+ to: recipient_pubkey,
|
|
|
+ from: 0,
|
|
|
+ sign_only: false,
|
|
|
+ dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: false,
|
|
|
+ no_wait: false,
|
|
|
+ blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
|
|
+ nonce_account: None,
|
|
|
+ nonce_authority: 0,
|
|
|
+ fee_payer: 0,
|
|
|
+ derived_address_seed: None,
|
|
|
+ derived_address_program_id: None,
|
|
|
+ };
|
|
|
+
|
|
|
+ // Expect failure due to unfunded recipient and the lack of the `allow_unfunded_recipient` flag
|
|
|
+ process_command(&config).unwrap_err();
|
|
|
+}
|
|
|
+
|
|
|
#[test]
|
|
|
fn test_transfer_with_seed() {
|
|
|
solana_logger::setup();
|
|
|
@@ -466,6 +524,7 @@ fn test_transfer_with_seed() {
|
|
|
from: 0,
|
|
|
sign_only: false,
|
|
|
dump_transaction_message: false,
|
|
|
+ allow_unfunded_recipient: true,
|
|
|
no_wait: false,
|
|
|
blockhash_query: BlockhashQuery::All(blockhash_query::Source::Cluster),
|
|
|
nonce_account: None,
|