client: use any Signer instead of only Keypair (#975)

This commit is contained in:
Drew Nutter 2021-12-20 16:41:21 -03:00 committed by GitHub
parent 483999e870
commit 34c4e50917
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 13 deletions

View File

@ -24,6 +24,7 @@ incremented for features.
### Breaking
* client: Client::new and Client::new_with_options now accept `Rc<dyn Signer>` instead of `Keypair` ([#975](https://github.com/project-serum/anchor/pull/975)).
* lang, ts: Change error enum name and message for 'wrong program ownership' account validation ([#1154](https://github.com/project-serum/anchor/pull/1154)).
## [0.19.0] - 2021-12-08

View File

@ -22,6 +22,7 @@ use composite::accounts::{Bar, CompositeUpdate, Foo, Initialize};
use composite::instruction as composite_instruction;
use composite::{DummyA, DummyB};
use rand::rngs::OsRng;
use std::rc::Rc;
use std::time::Duration;
#[derive(Parser, Debug)]
@ -51,7 +52,7 @@ fn main() -> Result<()> {
);
// Client.
let client = Client::new_with_options(url, payer, CommitmentConfig::processed());
let client = Client::new_with_options(url, Rc::new(payer), CommitmentConfig::processed());
// Run tests.
composite(&client, opts.composite_pid)?;

View File

@ -13,9 +13,10 @@ use solana_client::rpc_client::RpcClient;
use solana_client::rpc_config::{RpcTransactionLogsConfig, RpcTransactionLogsFilter};
use solana_client::rpc_response::{Response as RpcResponse, RpcLogsResponse};
use solana_sdk::commitment_config::CommitmentConfig;
use solana_sdk::signature::{Keypair, Signature, Signer};
use solana_sdk::signature::{Signature, Signer};
use solana_sdk::transaction::Transaction;
use std::convert::Into;
use std::rc::Rc;
use thiserror::Error;
pub use anchor_lang;
@ -36,7 +37,7 @@ pub struct Client {
}
impl Client {
pub fn new(cluster: Cluster, payer: Keypair) -> Self {
pub fn new(cluster: Cluster, payer: Rc<dyn Signer>) -> Self {
Self {
cfg: Config {
cluster,
@ -46,7 +47,11 @@ impl Client {
}
}
pub fn new_with_options(cluster: Cluster, payer: Keypair, options: CommitmentConfig) -> Self {
pub fn new_with_options(
cluster: Cluster,
payer: Rc<dyn Signer>,
options: CommitmentConfig,
) -> Self {
Self {
cfg: Config {
cluster,
@ -62,7 +67,7 @@ impl Client {
cfg: Config {
cluster: self.cfg.cluster.clone(),
options: self.cfg.options,
payer: Keypair::from_bytes(&self.cfg.payer.to_bytes()).unwrap(),
payer: self.cfg.payer.clone(),
},
}
}
@ -72,7 +77,7 @@ impl Client {
#[derive(Debug)]
struct Config {
cluster: Cluster,
payer: Keypair,
payer: Rc<dyn Signer>,
options: Option<CommitmentConfig>,
}
@ -93,7 +98,7 @@ impl Program {
RequestBuilder::from(
self.program_id,
self.cfg.cluster.url(),
Keypair::from_bytes(&self.cfg.payer.to_bytes()).unwrap(),
self.cfg.payer.clone(),
self.cfg.options,
RequestNamespace::Global,
)
@ -104,7 +109,7 @@ impl Program {
RequestBuilder::from(
self.program_id,
self.cfg.cluster.url(),
Keypair::from_bytes(&self.cfg.payer.to_bytes()).unwrap(),
self.cfg.payer.clone(),
self.cfg.options,
RequestNamespace::State { new: false },
)
@ -323,7 +328,7 @@ pub struct RequestBuilder<'a> {
accounts: Vec<AccountMeta>,
options: CommitmentConfig,
instructions: Vec<Instruction>,
payer: Keypair,
payer: Rc<dyn Signer>,
// Serialized instruction data for the target RPC.
instruction_data: Option<Vec<u8>>,
signers: Vec<&'a dyn Signer>,
@ -345,7 +350,7 @@ impl<'a> RequestBuilder<'a> {
pub fn from(
program_id: Pubkey,
cluster: &str,
payer: Keypair,
payer: Rc<dyn Signer>,
options: Option<CommitmentConfig>,
namespace: RequestNamespace,
) -> Self {
@ -363,7 +368,7 @@ impl<'a> RequestBuilder<'a> {
}
#[must_use]
pub fn payer(mut self, payer: Keypair) -> Self {
pub fn payer(mut self, payer: Rc<dyn Signer>) -> Self {
self.payer = payer;
self
}
@ -462,7 +467,7 @@ impl<'a> RequestBuilder<'a> {
let instructions = self.instructions()?;
let mut signers = self.signers;
signers.push(&self.payer);
signers.push(&*self.payer);
let rpc_client = RpcClient::new_with_commitment(self.cluster, self.options);

View File

@ -1,6 +1,7 @@
#![cfg(feature = "test-bpf")]
use {
std::rc::Rc,
anchor_client::{
anchor_lang::Discriminator,
solana_sdk::{
@ -42,7 +43,7 @@ async fn update_foo() {
let client = Client::new_with_options(
Cluster::Debug,
Keypair::new(),
Rc::new(Keypair::new()),
CommitmentConfig::processed(),
);
let program = client.program(zero_copy::id());