use near_api_types::{
AccessKeyPermission, AccountId, Action, PublicKey, Reference,
json::U64,
transaction::actions::{AccessKey, AddKeyAction, DeleteAccountAction, DeleteKeyAction},
};
use crate::advanced::{query_request::QueryRequest, query_rpc::SimpleQueryRpc};
use crate::common::query::{
AccessKeyHandler, AccessKeyListHandler, AccountViewHandler, RequestBuilder, RpcBuilder,
};
use crate::transactions::ConstructTransaction;
use self::create::CreateAccountBuilder;
mod create;
#[derive(Clone, Debug)]
pub struct Account(pub AccountId);
impl Account {
pub const fn account_id(&self) -> &AccountId {
&self.0
}
pub fn as_contract(&self) -> crate::contract::Contract {
crate::contract::Contract(self.0.clone())
}
pub fn tokens(&self) -> crate::tokens::Tokens {
crate::tokens::Tokens::account(self.0.clone())
}
pub fn delegation(&self) -> crate::stake::Delegation {
crate::stake::Delegation(self.0.clone())
}
pub fn view(&self) -> RequestBuilder<AccountViewHandler> {
let request = QueryRequest::ViewAccount {
account_id: self.0.clone(),
};
RequestBuilder::new(
SimpleQueryRpc { request },
Reference::Optimistic,
Default::default(),
)
}
pub fn access_key(
&self,
signer_public_key: impl Into<PublicKey>,
) -> RequestBuilder<AccessKeyHandler> {
let request = QueryRequest::ViewAccessKey {
account_id: self.0.clone(),
public_key: signer_public_key.into().into(),
};
RpcBuilder::new(
SimpleQueryRpc { request },
Reference::Optimistic,
Default::default(),
)
}
pub fn list_keys(&self) -> RequestBuilder<AccessKeyListHandler> {
let request = QueryRequest::ViewAccessKeyList {
account_id: self.0.clone(),
};
RpcBuilder::new(
SimpleQueryRpc { request },
Reference::Optimistic,
Default::default(),
)
}
pub fn add_key(
&self,
permission: AccessKeyPermission,
public_key: impl Into<PublicKey>,
) -> ConstructTransaction {
ConstructTransaction::new(self.0.clone(), self.0.clone()).add_action(Action::AddKey(
Box::new(AddKeyAction {
access_key: AccessKey {
nonce: U64::from(0),
permission,
},
public_key: public_key.into(),
}),
))
}
pub fn delete_key(&self, public_key: impl Into<PublicKey>) -> ConstructTransaction {
ConstructTransaction::new(self.0.clone(), self.0.clone()).add_action(Action::DeleteKey(
Box::new(DeleteKeyAction {
public_key: public_key.into(),
}),
))
}
pub fn delete_keys(&self, public_keys: Vec<PublicKey>) -> ConstructTransaction {
let actions = public_keys
.into_iter()
.map(|public_key| Action::DeleteKey(Box::new(DeleteKeyAction { public_key })))
.collect();
ConstructTransaction::new(self.0.clone(), self.0.clone()).add_actions(actions)
}
pub fn delete_account_with_beneficiary(
&self,
beneficiary_id: AccountId,
) -> ConstructTransaction {
ConstructTransaction::new(self.0.clone(), self.0.clone()).add_action(Action::DeleteAccount(
DeleteAccountAction { beneficiary_id },
))
}
pub const fn create_account(account_id: AccountId) -> CreateAccountBuilder {
CreateAccountBuilder { account_id }
}
}