From 00488b512ca68be4b05b88e671204f6ed54adb51 Mon Sep 17 00:00:00 2001 From: NIKHIL B N <45630095+NBNARADHYA@users.noreply.github.com> Date: Sun, 13 Mar 2022 03:55:27 +0530 Subject: [PATCH] Add support for `anchor idl fetch` to work outside anchor workspace (#1509) --- CHANGELOG.md | 1 + Cargo.lock | 13 ++++--------- cli/Cargo.toml | 1 + cli/src/config.rs | 12 ++++++++++++ cli/src/lib.rs | 17 +++++++++++++++-- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ca01d359b..224e54e98c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ incremented for features. * lang: Add new `AccountSysvarMismatch` error code and test cases for sysvars ([#1535](https://github.com/project-serum/anchor/pull/1535)). * lang: Replace `std::io::Cursor` with a custom `Write` impl that uses the Solana mem syscalls ([#1589](https://github.com/project-serum/anchor/pull/1589)). * spl: Add support for revoke instruction ([#1493](https://github.com/project-serum/anchor/pull/1493)). +* cli: Add support for `anchor idl fetch` to work outside anchor workspace ([#1509](https://github.com/project-serum/anchor/pull/1509)). * ts: Add provider parameter to `Spl.token` factory method ([#1597](https://github.com/project-serum/anchor/pull/1597)). ### Fixes diff --git a/Cargo.lock b/Cargo.lock index f5095bd77d..2245d33e05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -165,6 +165,7 @@ dependencies = [ "serde_json", "serum-common", "shellexpand", + "solana-cli-config", "solana-client", "solana-program", "solana-sdk", @@ -1089,12 +1090,6 @@ dependencies = [ "syn 0.15.44", ] -[[package]] -name = "dtoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" - [[package]] name = "ed25519" version = "1.2.0" @@ -2844,12 +2839,12 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.21" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c608a35705a5d3cdc9fbe403147647ff34b921f8e833e49306df898f9b20af" +checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" dependencies = [ - "dtoa", "indexmap", + "ryu", "serde", "yaml-rust", ] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index f0227a3f8b..93143242f2 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -27,6 +27,7 @@ serde = { version = "1.0.122", features = ["derive"] } solana-sdk = "1.8.5" solana-program = "1.8.5" solana-client = "1.8.5" +solana-cli-config = "1.8.5" serum-common = { git = "https://github.com/project-serum/serum-dex", features = ["client"] } dirs = "3.0" heck = "0.3.1" diff --git a/cli/src/config.rs b/cli/src/config.rs index 0e828ff350..54455eab48 100644 --- a/cli/src/config.rs +++ b/cli/src/config.rs @@ -4,11 +4,13 @@ use anyhow::{anyhow, Error, Result}; use clap::{ArgEnum, Parser}; use heck::SnakeCase; use serde::{Deserialize, Serialize}; +use solana_cli_config::{Config as SolanaConfig, CONFIG_FILE}; use solana_sdk::pubkey::Pubkey; use solana_sdk::signature::{Keypair, Signer}; use std::collections::BTreeMap; use std::convert::TryFrom; use std::fs::{self, File}; +use std::io; use std::io::prelude::*; use std::ops::Deref; use std::path::Path; @@ -445,6 +447,16 @@ impl FromStr for Config { } } +pub fn get_solana_cfg_url() -> Result { + let config_file = CONFIG_FILE.as_ref().ok_or_else(|| { + io::Error::new( + io::ErrorKind::NotFound, + "Default Solana config was not found", + ) + })?; + SolanaConfig::load(config_file).map(|config| config.json_rpc_url) +} + fn ser_programs( programs: &BTreeMap>, ) -> BTreeMap> { diff --git a/cli/src/lib.rs b/cli/src/lib.rs index f8c486e1e8..3b92b5cfad 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -1400,8 +1400,21 @@ pub enum BinVerificationState { // Fetches an IDL for the given program_id. fn fetch_idl(cfg_override: &ConfigOverride, idl_addr: Pubkey) -> Result { - let cfg = Config::discover(cfg_override)?.expect("Inside a workspace"); - let url = cluster_url(&cfg); + let url = match Config::discover(cfg_override)? { + Some(cfg) => cluster_url(&cfg), + None => { + // If the command is not run inside a workspace, + // cluster_url will be used from default solana config + // provider.cluster option can be used to override this + + if let Some(cluster) = cfg_override.cluster.clone() { + cluster.url().to_string() + } else { + config::get_solana_cfg_url()? + } + } + }; + let client = RpcClient::new(url); let mut account = client