token-cli: infer program_id based on cli args
This commit is contained in:
parent
191977e2c6
commit
d2c33e26a4
|
@ -1,7 +1,7 @@
|
||||||
use crate::{signers_of, Error, MULTISIG_SIGNER_ARG};
|
use crate::{signers_of, Error, MULTISIG_SIGNER_ARG};
|
||||||
use clap::ArgMatches;
|
use clap::ArgMatches;
|
||||||
use solana_clap_utils::{
|
use solana_clap_utils::{
|
||||||
input_parsers::{pubkey_of, pubkey_of_signer, value_of},
|
input_parsers::{pubkey_of_signer, value_of},
|
||||||
input_validators::normalize_to_url_if_moniker,
|
input_validators::normalize_to_url_if_moniker,
|
||||||
keypair::{signer_from_path, signer_from_path_with_config, SignerFromPathConfig},
|
keypair::{signer_from_path, signer_from_path_with_config, SignerFromPathConfig},
|
||||||
nonce::{NONCE_ARG, NONCE_AUTHORITY_ARG},
|
nonce::{NONCE_ARG, NONCE_AUTHORITY_ARG},
|
||||||
|
@ -43,12 +43,12 @@ pub(crate) struct Config<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Config<'a> {
|
impl<'a> Config<'a> {
|
||||||
pub(crate) fn new(
|
pub(crate) async fn new(
|
||||||
matches: &ArgMatches,
|
matches: &ArgMatches<'_>,
|
||||||
wallet_manager: &mut Option<Arc<RemoteWalletManager>>,
|
wallet_manager: &mut Option<Arc<RemoteWalletManager>>,
|
||||||
bulk_signers: &mut Vec<Arc<dyn Signer>>,
|
bulk_signers: &mut Vec<Arc<dyn Signer>>,
|
||||||
multisigner_ids: &'a mut Vec<Pubkey>,
|
multisigner_ids: &'a mut Vec<Pubkey>,
|
||||||
) -> Self {
|
) -> Config<'a> {
|
||||||
let cli_config = if let Some(config_file) = matches.value_of("config_file") {
|
let cli_config = if let Some(config_file) = matches.value_of("config_file") {
|
||||||
solana_cli_config::Config::load(config_file).unwrap_or_else(|_| {
|
solana_cli_config::Config::load(config_file).unwrap_or_else(|_| {
|
||||||
eprintln!("error: Could not find config file `{}`", config_file);
|
eprintln!("error: Could not find config file `{}`", config_file);
|
||||||
|
@ -89,17 +89,18 @@ impl<'a> Config<'a> {
|
||||||
program_client,
|
program_client,
|
||||||
websocket_url,
|
websocket_url,
|
||||||
)
|
)
|
||||||
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn new_with_clients_and_ws_url(
|
pub(crate) async fn new_with_clients_and_ws_url(
|
||||||
matches: &ArgMatches,
|
matches: &ArgMatches<'_>,
|
||||||
wallet_manager: &mut Option<Arc<RemoteWalletManager>>,
|
wallet_manager: &mut Option<Arc<RemoteWalletManager>>,
|
||||||
bulk_signers: &mut Vec<Arc<dyn Signer>>,
|
bulk_signers: &mut Vec<Arc<dyn Signer>>,
|
||||||
multisigner_ids: &'a mut Vec<Pubkey>,
|
multisigner_ids: &'a mut Vec<Pubkey>,
|
||||||
rpc_client: Arc<RpcClient>,
|
rpc_client: Arc<RpcClient>,
|
||||||
program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>>,
|
program_client: Arc<dyn ProgramClient<ProgramRpcClientSendTransaction>>,
|
||||||
websocket_url: String,
|
websocket_url: String,
|
||||||
) -> Self {
|
) -> Config<'a> {
|
||||||
let cli_config = if let Some(config_file) = matches.value_of("config_file") {
|
let cli_config = if let Some(config_file) = matches.value_of("config_file") {
|
||||||
solana_cli_config::Config::load(config_file).unwrap_or_else(|_| {
|
solana_cli_config::Config::load(config_file).unwrap_or_else(|_| {
|
||||||
eprintln!("error: Could not find config file `{}`", config_file);
|
eprintln!("error: Could not find config file `{}`", config_file);
|
||||||
|
@ -207,7 +208,26 @@ impl<'a> Config<'a> {
|
||||||
|
|
||||||
let sign_only = matches.is_present(SIGN_ONLY_ARG.name);
|
let sign_only = matches.is_present(SIGN_ONLY_ARG.name);
|
||||||
let dump_transaction_message = matches.is_present(DUMP_TRANSACTION_MESSAGE.name);
|
let dump_transaction_message = matches.is_present(DUMP_TRANSACTION_MESSAGE.name);
|
||||||
let program_id = pubkey_of(matches, "program_id").unwrap();
|
|
||||||
|
let default_program_id = spl_token::id();
|
||||||
|
let program_id = if let Some(program_id) = value_of(matches, "program_id") {
|
||||||
|
program_id
|
||||||
|
} else if !sign_only {
|
||||||
|
if let Some(address) = value_of(matches, "token")
|
||||||
|
.or_else(|| value_of(matches, "account"))
|
||||||
|
.or_else(|| value_of(matches, "address"))
|
||||||
|
{
|
||||||
|
rpc_client
|
||||||
|
.get_account(&address)
|
||||||
|
.await
|
||||||
|
.map(|account| account.owner)
|
||||||
|
.unwrap_or(default_program_id)
|
||||||
|
} else {
|
||||||
|
default_program_id
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
default_program_id
|
||||||
|
};
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
default_signer,
|
default_signer,
|
||||||
|
|
|
@ -1960,7 +1960,6 @@ fn multisig_member_help_string() -> String {
|
||||||
|
|
||||||
fn app<'a, 'b>(
|
fn app<'a, 'b>(
|
||||||
default_decimals: &'a str,
|
default_decimals: &'a str,
|
||||||
default_program_id: &'a str,
|
|
||||||
minimum_signers_help: &'b str,
|
minimum_signers_help: &'b str,
|
||||||
multisig_member_help: &'b str,
|
multisig_member_help: &'b str,
|
||||||
) -> App<'a, 'b> {
|
) -> App<'a, 'b> {
|
||||||
|
@ -2001,7 +2000,6 @@ fn app<'a, 'b>(
|
||||||
.value_name("ADDRESS")
|
.value_name("ADDRESS")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.global(true)
|
.global(true)
|
||||||
.default_value(default_program_id)
|
|
||||||
.validator(is_valid_pubkey)
|
.validator(is_valid_pubkey)
|
||||||
.help("SPL Token program id"),
|
.help("SPL Token program id"),
|
||||||
)
|
)
|
||||||
|
@ -2842,12 +2840,10 @@ fn app<'a, 'b>(
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Error> {
|
async fn main() -> Result<(), Error> {
|
||||||
let default_decimals = format!("{}", spl_token_2022::native_mint::DECIMALS);
|
let default_decimals = format!("{}", spl_token_2022::native_mint::DECIMALS);
|
||||||
let default_program_id = spl_token::id().to_string();
|
|
||||||
let minimum_signers_help = minimum_signers_help_string();
|
let minimum_signers_help = minimum_signers_help_string();
|
||||||
let multisig_member_help = multisig_member_help_string();
|
let multisig_member_help = multisig_member_help_string();
|
||||||
let app_matches = app(
|
let app_matches = app(
|
||||||
&default_decimals,
|
&default_decimals,
|
||||||
&default_program_id,
|
|
||||||
&minimum_signers_help,
|
&minimum_signers_help,
|
||||||
&multisig_member_help,
|
&multisig_member_help,
|
||||||
)
|
)
|
||||||
|
@ -2866,7 +2862,8 @@ async fn main() -> Result<(), Error> {
|
||||||
&mut wallet_manager,
|
&mut wallet_manager,
|
||||||
&mut bulk_signers,
|
&mut bulk_signers,
|
||||||
&mut multisigner_ids,
|
&mut multisigner_ids,
|
||||||
);
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
solana_logger::setup_with_default("solana=info");
|
solana_logger::setup_with_default("solana=info");
|
||||||
let result =
|
let result =
|
||||||
|
@ -3677,13 +3674,11 @@ mod tests {
|
||||||
args: &[&str],
|
args: &[&str],
|
||||||
) -> CommandResult {
|
) -> CommandResult {
|
||||||
let default_decimals = format!("{}", spl_token_2022::native_mint::DECIMALS);
|
let default_decimals = format!("{}", spl_token_2022::native_mint::DECIMALS);
|
||||||
let default_program_id = spl_token::id().to_string();
|
|
||||||
let minimum_signers_help = minimum_signers_help_string();
|
let minimum_signers_help = minimum_signers_help_string();
|
||||||
let multisig_member_help = multisig_member_help_string();
|
let multisig_member_help = multisig_member_help_string();
|
||||||
|
|
||||||
let app_matches = app(
|
let app_matches = app(
|
||||||
&default_decimals,
|
&default_decimals,
|
||||||
&default_program_id,
|
|
||||||
&minimum_signers_help,
|
&minimum_signers_help,
|
||||||
&multisig_member_help,
|
&multisig_member_help,
|
||||||
)
|
)
|
||||||
|
@ -3699,13 +3694,11 @@ mod tests {
|
||||||
|
|
||||||
async fn exec_test_cmd(config: &Config<'_>, args: &[&str]) -> CommandResult {
|
async fn exec_test_cmd(config: &Config<'_>, args: &[&str]) -> CommandResult {
|
||||||
let default_decimals = format!("{}", spl_token_2022::native_mint::DECIMALS);
|
let default_decimals = format!("{}", spl_token_2022::native_mint::DECIMALS);
|
||||||
let default_program_id = spl_token::id().to_string();
|
|
||||||
let minimum_signers_help = minimum_signers_help_string();
|
let minimum_signers_help = minimum_signers_help_string();
|
||||||
let multisig_member_help = multisig_member_help_string();
|
let multisig_member_help = multisig_member_help_string();
|
||||||
|
|
||||||
let app_matches = app(
|
let app_matches = app(
|
||||||
&default_decimals,
|
&default_decimals,
|
||||||
&default_program_id,
|
|
||||||
&minimum_signers_help,
|
&minimum_signers_help,
|
||||||
&multisig_member_help,
|
&multisig_member_help,
|
||||||
)
|
)
|
||||||
|
@ -3726,7 +3719,8 @@ mod tests {
|
||||||
config.rpc_client.clone(),
|
config.rpc_client.clone(),
|
||||||
config.program_client.clone(),
|
config.program_client.clone(),
|
||||||
config.websocket_url.clone(),
|
config.websocket_url.clone(),
|
||||||
);
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
process_command(&sub_command, matches, &config, wallet_manager, bulk_signers).await
|
process_command(&sub_command, matches, &config, wallet_manager, bulk_signers).await
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue