From a9179600cd0546f29b1af60026ff08c87bd48577 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 23 May 2021 10:00:24 -0700 Subject: [PATCH] cli: Add provider section to Anchor.toml (#305) --- CHANGELOG.md | 3 +- cli/src/config.rs | 38 ++++++++++++------ cli/src/main.rs | 56 +++++++++++++-------------- cli/src/template.rs | 8 +--- examples/cashiers-check/Anchor.toml | 1 + examples/chat/Anchor.toml | 1 + examples/composite/Anchor.toml | 1 + examples/errors/Anchor.toml | 1 + examples/events/Anchor.toml | 1 + examples/ido-pool/Anchor.toml | 1 + examples/interface/Anchor.toml | 1 + examples/lockup/Anchor.toml | 1 + examples/misc/Anchor.toml | 1 + examples/multisig/Anchor.toml | 1 + examples/pyth/Anchor.toml | 1 + examples/spl/token-proxy/Anchor.toml | 1 + examples/swap/Anchor.toml | 1 + examples/sysvars/Anchor.toml | 1 + examples/tutorial/basic-0/Anchor.toml | 1 + examples/tutorial/basic-1/Anchor.toml | 1 + examples/tutorial/basic-2/Anchor.toml | 1 + examples/tutorial/basic-3/Anchor.toml | 1 + examples/tutorial/basic-4/Anchor.toml | 1 + examples/tutorial/basic-5/Anchor.toml | 1 + examples/typescript/Anchor.toml | 1 + examples/zero-copy/Anchor.toml | 1 + 26 files changed, 80 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a80314d..833396be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,12 +18,13 @@ incremented for features. * cli: Add yarn flag to test command ([#267](https://github.com/project-serum/anchor/pull/267)). * cli: Add `--skip-build` flag to test command ([301](https://github.com/project-serum/anchor/pull/301)). * cli: Add `anchor shell` command to spawn a node shell populated with an Anchor.toml based environment ([#303](https://github.com/project-serum/anchor/pull/303)). +* ts: Replace deprecated `web3.Account` with `web3.Signer` in public APIs ([#296](https://github.com/project-serum/anchor/pull/296)). ## Breaking Changes +* cli: The Anchor.toml's `wallet` and `cluster` settings must now be under the `[provider]` table ([#305](https://github.com/project-serum/anchor/pull/305)). * ts: Event coder `decode` API changed to decode strings directly instead of buffers ([#292](https://github.com/project-serum/anchor/pull/292)). * ts: Event coder `encode` API removed ([#292](https://github.com/project-serum/anchor/pull/292)). -* ts: Replace deprecated `web3.Account` with `web3.Signer` in public APIs ([#296](https://github.com/project-serum/anchor/pull/296)). ## [0.5.0] - 2021-05-07 diff --git a/cli/src/config.rs b/cli/src/config.rs index aa4a61bc..335d76df 100644 --- a/cli/src/config.rs +++ b/cli/src/config.rs @@ -13,12 +13,19 @@ use std::str::FromStr; #[derive(Debug, Default)] pub struct Config { - pub cluster: Cluster, - pub clusters: Clusters, - pub wallet: WalletPath, + pub provider: ProviderConfig, + pub clusters: ClustersConfig, pub test: Option, } +#[derive(Debug, Default)] +pub struct ProviderConfig { + pub cluster: Cluster, + pub wallet: WalletPath, +} + +pub type ClustersConfig = BTreeMap>; + impl Config { // Searches all parent directories for an Anchor.toml file. pub fn discover() -> Result)>> { @@ -64,7 +71,7 @@ impl Config { } pub fn wallet_kp(&self) -> Result { - solana_sdk::signature::read_keypair_file(&self.wallet.to_string()) + solana_sdk::signature::read_keypair_file(&self.provider.wallet.to_string()) .map_err(|_| anyhow!("Unable to read keypair file")) } } @@ -73,12 +80,17 @@ impl Config { // into base 58 strings. #[derive(Debug, Serialize, Deserialize)] struct _Config { - cluster: String, - wallet: String, + provider: Provider, test: Option, clusters: Option>>, } +#[derive(Debug, Serialize, Deserialize)] +struct Provider { + cluster: String, + wallet: String, +} + impl ToString for Config { fn to_string(&self) -> String { let clusters = { @@ -90,8 +102,10 @@ impl ToString for Config { } }; let cfg = _Config { - cluster: format!("{}", self.cluster), - wallet: self.wallet.to_string(), + provider: Provider { + cluster: format!("{}", self.provider.cluster), + wallet: self.provider.wallet.to_string(), + }, test: self.test.clone(), clusters, }; @@ -107,8 +121,10 @@ impl FromStr for Config { let cfg: _Config = toml::from_str(s) .map_err(|e| anyhow::format_err!("Unable to deserialize config: {}", e.to_string()))?; Ok(Config { - cluster: cfg.cluster.parse()?, - wallet: shellexpand::tilde(&cfg.wallet).parse()?, + provider: ProviderConfig { + cluster: cfg.provider.cluster.parse()?, + wallet: shellexpand::tilde(&cfg.provider.wallet).parse()?, + }, test: cfg.test, clusters: cfg .clusters @@ -233,8 +249,6 @@ impl Program { } } -pub type Clusters = BTreeMap>; - #[derive(Debug, Default)] pub struct ProgramDeployment { pub name: String, diff --git a/cli/src/main.rs b/cli/src/main.rs index c20a7e71..ec75dc62 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -540,7 +540,7 @@ fn verify(program_id: Pubkey) -> Result<()> { let bin_path = program_dir .join("../../target/deploy/") .join(format!("{}.so", local_idl.name)); - let is_buffer = verify_bin(program_id, &bin_path, cfg.cluster.url())?; + let is_buffer = verify_bin(program_id, &bin_path, cfg.provider.cluster.url())?; // Verify IDL (only if it's not a buffer account). if !is_buffer { @@ -610,7 +610,7 @@ fn verify_bin(program_id: Pubkey, bin_path: &Path, cluster: &str) -> Result Result { let cfg = Config::discover()?.expect("Inside a workspace").0; - let client = RpcClient::new(cfg.cluster.url().to_string()); + let client = RpcClient::new(cfg.provider.cluster.url().to_string()); let mut account = client .get_account_with_commitment(&idl_addr, CommitmentConfig::processed())? @@ -669,7 +669,7 @@ fn idl(subcmd: IdlCommand) -> Result<()> { fn idl_init(program_id: Pubkey, idl_filepath: String) -> Result<()> { with_workspace(|cfg, _path, _cargo| { - let keypair = cfg.wallet.to_string(); + let keypair = cfg.provider.wallet.to_string(); let bytes = std::fs::read(idl_filepath)?; let idl: Idl = serde_json::from_reader(&*bytes)?; @@ -683,7 +683,7 @@ fn idl_init(program_id: Pubkey, idl_filepath: String) -> Result<()> { fn idl_write_buffer(program_id: Pubkey, idl_filepath: String) -> Result { with_workspace(|cfg, _path, _cargo| { - let keypair = cfg.wallet.to_string(); + let keypair = cfg.provider.wallet.to_string(); let bytes = std::fs::read(idl_filepath)?; let idl: Idl = serde_json::from_reader(&*bytes)?; @@ -699,9 +699,9 @@ fn idl_write_buffer(program_id: Pubkey, idl_filepath: String) -> Result fn idl_set_buffer(program_id: Pubkey, buffer: Pubkey) -> Result<()> { with_workspace(|cfg, _path, _cargo| { - let keypair = solana_sdk::signature::read_keypair_file(&cfg.wallet.to_string()) + let keypair = solana_sdk::signature::read_keypair_file(&cfg.provider.wallet.to_string()) .map_err(|_| anyhow!("Unable to read keypair file"))?; - let client = RpcClient::new(cfg.cluster.url().to_string()); + let client = RpcClient::new(cfg.provider.cluster.url().to_string()); // Instruction to set the buffer onto the IdlAccount. let set_buffer_ix = { @@ -749,7 +749,7 @@ fn idl_upgrade(program_id: Pubkey, idl_filepath: String) -> Result<()> { fn idl_authority(program_id: Pubkey) -> Result<()> { with_workspace(|cfg, _path, _cargo| { - let client = RpcClient::new(cfg.cluster.url().to_string()); + let client = RpcClient::new(cfg.provider.cluster.url().to_string()); let idl_address = { let account = client .get_account_with_commitment(&program_id, CommitmentConfig::processed())? @@ -783,9 +783,9 @@ fn idl_set_authority( None => IdlAccount::address(&program_id), Some(addr) => addr, }; - let keypair = solana_sdk::signature::read_keypair_file(&cfg.wallet.to_string()) + let keypair = solana_sdk::signature::read_keypair_file(&cfg.provider.wallet.to_string()) .map_err(|_| anyhow!("Unable to read keypair file"))?; - let client = RpcClient::new(cfg.cluster.url().to_string()); + let client = RpcClient::new(cfg.provider.cluster.url().to_string()); // Instruction data. let data = @@ -853,9 +853,9 @@ fn idl_write(cfg: &Config, program_id: &Pubkey, idl: &Idl, idl_address: Pubkey) idl.metadata = None; // Misc. - let keypair = solana_sdk::signature::read_keypair_file(&cfg.wallet.to_string()) + let keypair = solana_sdk::signature::read_keypair_file(&cfg.provider.wallet.to_string()) .map_err(|_| anyhow!("Unable to read keypair file"))?; - let client = RpcClient::new(cfg.cluster.url().to_string()); + let client = RpcClient::new(cfg.provider.cluster.url().to_string()); // Serialize and compress the idl. let idl_data = { @@ -950,7 +950,7 @@ fn test( ) -> Result<()> { with_workspace(|cfg, _path, _cargo| { // Bootup validator, if needed. - let validator_handle = match cfg.cluster.url() { + let validator_handle = match cfg.provider.cluster.url() { "http://127.0.0.1:8899" => { match skip_build { true => None, @@ -975,7 +975,7 @@ fn test( }; // Setup log reader. - let log_streams = stream_logs(&cfg.cluster.url()); + let log_streams = stream_logs(&cfg.provider.cluster.url()); // Check to see if yarn is installed, panic if not. if use_yarn { @@ -999,7 +999,7 @@ fn test( .arg("-p") .arg("./tsconfig.json") .args(args) - .env("ANCHOR_PROVIDER_URL", cfg.cluster.url()) + .env("ANCHOR_PROVIDER_URL", cfg.provider.cluster.url()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .output() @@ -1008,7 +1008,7 @@ fn test( (false, true) => std::process::Command::new("yarn") .arg("mocha") .args(args) - .env("ANCHOR_PROVIDER_URL", cfg.cluster.url()) + .env("ANCHOR_PROVIDER_URL", cfg.provider.cluster.url()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .output() @@ -1018,7 +1018,7 @@ fn test( .arg("-p") .arg("./tsconfig.json") .args(args) - .env("ANCHOR_PROVIDER_URL", cfg.cluster.url()) + .env("ANCHOR_PROVIDER_URL", cfg.provider.cluster.url()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .output() @@ -1026,7 +1026,7 @@ fn test( .with_context(|| "ts-mocha"), (false, false) => std::process::Command::new("mocha") .args(args) - .env("ANCHOR_PROVIDER_URL", cfg.cluster.url()) + .env("ANCHOR_PROVIDER_URL", cfg.provider.cluster.url()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .output() @@ -1198,8 +1198,8 @@ fn _deploy( ) -> Result> { with_workspace(|cfg, _path, _cargo| { // Fallback to config vars if not provided via CLI. - let url = url.unwrap_or_else(|| cfg.cluster.url().to_string()); - let keypair = keypair.unwrap_or_else(|| cfg.wallet.to_string()); + let url = url.unwrap_or_else(|| cfg.provider.cluster.url().to_string()); + let keypair = keypair.unwrap_or_else(|| cfg.provider.wallet.to_string()); // Deploy the programs. println!("Deploying workspace: {}", url); @@ -1277,9 +1277,9 @@ fn upgrade(program_id: Pubkey, program_filepath: String) -> Result<()> { .arg("program") .arg("deploy") .arg("--url") - .arg(cfg.cluster.url()) + .arg(cfg.provider.cluster.url()) .arg("--keypair") - .arg(&cfg.wallet.to_string()) + .arg(&cfg.provider.wallet.to_string()) .arg("--program-id") .arg(program_id.to_string()) .arg(&program_filepath) @@ -1306,8 +1306,8 @@ fn launch( let programs = _deploy(url.clone(), keypair.clone(), program_name.clone())?; with_workspace(|cfg, _path, _cargo| { - let url = url.unwrap_or_else(|| cfg.cluster.url().to_string()); - let keypair = keypair.unwrap_or_else(|| cfg.wallet.to_string()); + let url = url.unwrap_or_else(|| cfg.provider.cluster.url().to_string()); + let keypair = keypair.unwrap_or_else(|| cfg.provider.wallet.to_string()); // Add metadata to all IDLs. for (address, program) in programs { @@ -1370,7 +1370,7 @@ fn create_idl_account( let idl_address = IdlAccount::address(program_id); let keypair = solana_sdk::signature::read_keypair_file(keypair_path) .map_err(|_| anyhow!("Unable to read keypair file"))?; - let client = RpcClient::new(cfg.cluster.url().to_string()); + let client = RpcClient::new(cfg.provider.cluster.url().to_string()); let idl_data = serialize_idl(idl)?; // Run `Create instruction. @@ -1423,7 +1423,7 @@ fn create_idl_buffer( ) -> Result { let keypair = solana_sdk::signature::read_keypair_file(keypair_path) .map_err(|_| anyhow!("Unable to read keypair file"))?; - let client = RpcClient::new(cfg.cluster.url().to_string()); + let client = RpcClient::new(cfg.provider.cluster.url().to_string()); let buffer = Keypair::generate(&mut OsRng); @@ -1496,7 +1496,7 @@ fn migrate(url: Option) -> Result<()> { with_workspace(|cfg, _path, _cargo| { println!("Running migration deploy script"); - let url = url.unwrap_or_else(|| cfg.cluster.url().to_string()); + let url = url.unwrap_or_else(|| cfg.provider.cluster.url().to_string()); let cur_dir = std::env::current_dir()?; let module_path = cur_dir.join("migrations/deploy.js"); @@ -1607,11 +1607,11 @@ fn cluster(_cmd: ClusterCommand) -> Result<()> { fn shell(cluster: Option, wallet: Option) -> Result<()> { with_workspace(|cfg, _path, _cargo| { let cluster = match cluster { - None => cfg.cluster.clone(), + None => cfg.provider.cluster.clone(), Some(c) => Cluster::from_str(&c)?, }; let wallet = match wallet { - None => cfg.wallet.to_string(), + None => cfg.provider.wallet.to_string(), Some(c) => c, }; let programs = { diff --git a/cli/src/template.rs b/cli/src/template.rs index 59853f48..e8b987c0 100644 --- a/cli/src/template.rs +++ b/cli/src/template.rs @@ -182,15 +182,11 @@ pub fn ts_config() -> &'static str { } pub fn git_ignore() -> &'static str { - r#"# ignore Mac OS noise + r#" .DS_Store - -# ignore the build directory for Rust/Anchor target - -# Ignore backup files creates by cargo fmt. **/*.rs.bk - "# +"# } pub fn node_shell( diff --git a/examples/cashiers-check/Anchor.toml b/examples/cashiers-check/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/cashiers-check/Anchor.toml +++ b/examples/cashiers-check/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/chat/Anchor.toml b/examples/chat/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/chat/Anchor.toml +++ b/examples/chat/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/composite/Anchor.toml b/examples/composite/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/composite/Anchor.toml +++ b/examples/composite/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/errors/Anchor.toml b/examples/errors/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/errors/Anchor.toml +++ b/examples/errors/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/events/Anchor.toml b/examples/events/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/events/Anchor.toml +++ b/examples/events/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/ido-pool/Anchor.toml b/examples/ido-pool/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/ido-pool/Anchor.toml +++ b/examples/ido-pool/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/interface/Anchor.toml b/examples/interface/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/interface/Anchor.toml +++ b/examples/interface/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/lockup/Anchor.toml b/examples/lockup/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/lockup/Anchor.toml +++ b/examples/lockup/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/misc/Anchor.toml b/examples/misc/Anchor.toml index c9cf4702..8c266da8 100644 --- a/examples/misc/Anchor.toml +++ b/examples/misc/Anchor.toml @@ -1,3 +1,4 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/multisig/Anchor.toml b/examples/multisig/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/multisig/Anchor.toml +++ b/examples/multisig/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/pyth/Anchor.toml b/examples/pyth/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/pyth/Anchor.toml +++ b/examples/pyth/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/spl/token-proxy/Anchor.toml b/examples/spl/token-proxy/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/spl/token-proxy/Anchor.toml +++ b/examples/spl/token-proxy/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/swap/Anchor.toml b/examples/swap/Anchor.toml index 171d8134..959ea7b4 100644 --- a/examples/swap/Anchor.toml +++ b/examples/swap/Anchor.toml @@ -1,3 +1,4 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/sysvars/Anchor.toml b/examples/sysvars/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/sysvars/Anchor.toml +++ b/examples/sysvars/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/tutorial/basic-0/Anchor.toml b/examples/tutorial/basic-0/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/tutorial/basic-0/Anchor.toml +++ b/examples/tutorial/basic-0/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/tutorial/basic-1/Anchor.toml b/examples/tutorial/basic-1/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/tutorial/basic-1/Anchor.toml +++ b/examples/tutorial/basic-1/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/tutorial/basic-2/Anchor.toml b/examples/tutorial/basic-2/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/tutorial/basic-2/Anchor.toml +++ b/examples/tutorial/basic-2/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/tutorial/basic-3/Anchor.toml b/examples/tutorial/basic-3/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/tutorial/basic-3/Anchor.toml +++ b/examples/tutorial/basic-3/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/tutorial/basic-4/Anchor.toml b/examples/tutorial/basic-4/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/tutorial/basic-4/Anchor.toml +++ b/examples/tutorial/basic-4/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/tutorial/basic-5/Anchor.toml b/examples/tutorial/basic-5/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/tutorial/basic-5/Anchor.toml +++ b/examples/tutorial/basic-5/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/typescript/Anchor.toml b/examples/typescript/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/typescript/Anchor.toml +++ b/examples/typescript/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/examples/zero-copy/Anchor.toml b/examples/zero-copy/Anchor.toml index 2ebd5af9..b9705f03 100644 --- a/examples/zero-copy/Anchor.toml +++ b/examples/zero-copy/Anchor.toml @@ -1,2 +1,3 @@ +[provider] cluster = "localnet" wallet = "~/.config/solana/id.json"