What changed, and why it matters
This is a large cleanup commit titled 'chore: fix warning'. It removes compiler warnings across many Rust modules by deleting unused imports, switching to modern Rust syntax, and fixing minor style issues. The most notable functional change is in the Monero code, where randomness for key-image generation and encryption now comes from the operating system's secure random source (OsRng) instead of a deterministic seed derived from the request data. That change is a security improvement, not a vulnerability. There is no clear evidence in the commit of an exploitable security bug.
Treat as routine maintenance. Review the Monero OsRng change to confirm it is used consistently across all ring-signature and encryption paths, and verify that no other modules still derive randomness from attacker-influenced data.
Security signals we found
Monero randomness source changed from deterministic ChaCha20Rng seed to OsRng (security-hardening)
Large warning-cleanup refactor touching Bitcoin, Solana, Cardano, Monero, Aptos, IOTA, Arweave, Avalanche, Sui, and keystore code
No explicit security relevance stated by vendor
Evidence from the diff
The commit is a broad lint/refactoring pass. It removes #![feature(error_in_core)] from several crates, replaces format! placeholders with inline captures, removes unused imports, replaces .get(0) with .first(), .len() == 0 with .is_empty(), etc. The only behavior-affecting change visible is in rust/apps/monero: ChaCha20Rng seeded from keccak256(request_data/data) is replaced with OsRng for key-image generation and encryption nonce/signature randomness. This removes a potential deterministic-randomness weakness. No memory-safety, cryptographic, or transaction-validation vulnerabilities are introduced by the diff. The commit message and diff do not frame any change as a security fix.
Changed components
rust/apps/aptosrust/apps/arweaverust/apps/avalancherust/apps/bitcoinrust/apps/cardanorust/apps/iotarust/apps/monerorust/apps/solanarust/apps/suirust/keystoreInspect captured patch +733 / −1224
diff --git a/rust/apps/aptos/src/lib.rs b/rust/apps/aptos/src/lib.rs
index 9c753d8..eb37d8e 100644
--- a/rust/apps/aptos/src/lib.rs
+++ b/rust/apps/aptos/src/lib.rs
@@ -1,5 +1,4 @@
#![no_std]
-#![feature(error_in_core)]
#[allow(unused_imports)]
#[macro_use]
diff --git a/rust/apps/arweave/src/ao_transaction.rs b/rust/apps/arweave/src/ao_transaction.rs
index 50773ff..8ac439c 100644
--- a/rust/apps/arweave/src/ao_transaction.rs
+++ b/rust/apps/arweave/src/ao_transaction.rs
@@ -29,7 +29,7 @@ impl TryFrom<DataItem> for AOTransferTransaction {
let recipient = tags.iter().find(|i| i.get_name().eq("Recipient"));
let quantity = tags.iter().find(|i| i.get_name().eq("Quantity"));
let token_id = value.get_target();
- let mut rest_tags = tags.iter().filter(|v| {
+ let rest_tags = tags.iter().filter(|v| {
v.get_name().ne("DataProtocol")
&& v.get_name().ne("Action")
&& v.get_name().ne("Recipient")
diff --git a/rust/apps/avalanche/src/transactions/P_chain/validator.rs b/rust/apps/avalanche/src/transactions/P_chain/validator.rs
index ce0313b..1be12bc 100644
--- a/rust/apps/avalanche/src/transactions/P_chain/validator.rs
+++ b/rust/apps/avalanche/src/transactions/P_chain/validator.rs
@@ -35,6 +35,8 @@ impl TryFrom<Bytes> for Validator {
#[cfg(test)]
mod tests {
+ use crate::encode::cb58::Cb58Encodable;
+
use super::*;
extern crate std;
diff --git a/rust/apps/bitcoin/src/addresses/address.rs b/rust/apps/bitcoin/src/addresses/address.rs
index cb3ea12..2550829 100644
--- a/rust/apps/bitcoin/src/addresses/address.rs
+++ b/rust/apps/bitcoin/src/addresses/address.rs
@@ -49,8 +49,7 @@ impl Address {
},
}),
_ => Err(BitcoinError::AddressError(format!(
- "Invalid network for p2pkh {:?}",
- network
+ "Invalid network for p2pkh {network:?}"
))),
}
}
@@ -60,16 +59,15 @@ impl Address {
Network::Bitcoin | Network::BitcoinTestnet | Network::AvaxBtcBridge => {
let payload = Payload::Segwit {
witness_program: WitnessProgram::p2wpkh(
- &CompressedPublicKey::try_from(pk.clone()).map_err(|e| {
- BitcoinError::AddressError(format!("invalid payload for p2wpkh: {}", e))
+ &CompressedPublicKey::try_from(*pk).map_err(|e| {
+ BitcoinError::AddressError(format!("invalid payload for p2wpkh: {e}"))
})?,
),
};
Ok(Address { network, payload })
}
_ => Err(BitcoinError::AddressError(format!(
- "Invalid network for p2wpkh {:?}",
- network
+ "Invalid network for p2wpkh {network:?}"
))),
}
}
@@ -88,8 +86,7 @@ impl Address {
Ok(Address { network, payload })
}
_ => Err(BitcoinError::AddressError(format!(
- "Invalid network for p2tr {:?}",
- network
+ "Invalid network for p2tr {network:?}"
))),
}
}
@@ -108,8 +105,7 @@ impl Address {
Ok(Address { network, payload })
}
_ => Err(BitcoinError::AddressError(format!(
- "Invalid network for p2tr {:?}",
- network
+ "Invalid network for p2tr {network:?}"
))),
}
}
@@ -122,17 +118,14 @@ impl Address {
.push_int(0)
.push_slice(pk.wpubkey_hash().map_err(|e| {
BitcoinError::AddressError(format!(
- "invalid payload for p2shwpkh: {}",
- e
+ "invalid payload for p2shwpkh: {e}"
))
})?);
let script_hash = builder.as_script().script_hash();
let payload = Payload::P2sh { script_hash };
Ok(Address { network, payload })
}
- _ => Err(BitcoinError::AddressError(format!(
- "Invalid network for p2wpkh"
- ))),
+ _ => Err(BitcoinError::AddressError("Invalid network for p2wpkh".to_string())),
}
}
@@ -161,7 +154,7 @@ impl Address {
.expect("is_witness_program guarantees len > 4");
let version = WitnessVersion::try_from(opcode).map_err(|e| {
- BitcoinError::AddressError(format!("invalid witness version: {}", e))
+ BitcoinError::AddressError(format!("invalid witness version: {e}"))
})?;
let program = WitnessProgram::new(version, &script.as_bytes()[2..])?;
Ok(Address {
@@ -171,7 +164,7 @@ impl Address {
},
})
} else {
- Err(BitcoinError::AddressError(format!("unrecognized script")))
+ Err(BitcoinError::AddressError("unrecognized script".to_string()))
}
}
@@ -331,70 +324,70 @@ impl FromStr for Address {
if s.len() > 50 {
return Err(Self::Err::AddressError(format!(
"invalid base58 length {}",
- (s.len() as u8).to_string()
+ (s.len() as u8)
)));
}
let data = base58::decode_check(s)
- .map_err(|_e| Self::Err::AddressError(format!("invalid base58 check")))?;
+ .map_err(|_e| Self::Err::AddressError("invalid base58 check".to_string()))?;
if data.len() != 21 {
return Err(Self::Err::AddressError(format!(
"invalid base58 length {}",
- (data.len() as u8).to_string()
+ (data.len() as u8)
)));
}
- let (network, payload) = match data[0].clone() {
+ let (network, payload) = match data[0] {
PUBKEY_ADDRESS_PREFIX_BTC => {
let pubkey_hash = PubkeyHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get pubkey hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get pubkey hash".to_string()))?;
(Network::Bitcoin, Payload::P2pkh { pubkey_hash })
}
PUBKEY_ADDRESS_PREFIX_TEST => {
let pubkey_hash = PubkeyHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get pubkey hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get pubkey hash".to_string()))?;
(Network::BitcoinTestnet, Payload::P2pkh { pubkey_hash })
}
PUBKEY_ADDRESS_PREFIX_DASH => {
let pubkey_hash = PubkeyHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get pubkey hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get pubkey hash".to_string()))?;
(Network::Dash, Payload::P2pkh { pubkey_hash })
}
PUBKEY_ADDRESS_PREFIX_DASH_P2SH => {
let script_hash = ScriptHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get script hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get script hash".to_string()))?;
(Network::Dash, Payload::P2sh { script_hash })
}
SCRIPT_ADDRESS_PREFIX_LTC_P2PKH => {
let pubkey_hash = PubkeyHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get pubkey hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get pubkey hash".to_string()))?;
(Network::Litecoin, Payload::P2pkh { pubkey_hash })
}
SCRIPT_ADDRESS_PREFIX_LTC => {
let script_hash = ScriptHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get script hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get script hash".to_string()))?;
(Network::Litecoin, Payload::P2sh { script_hash })
}
SCRIPT_ADDRESS_PREFIX_BTC => {
let script_hash = ScriptHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get script hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get script hash".to_string()))?;
(Network::Bitcoin, Payload::P2sh { script_hash })
}
SCRIPT_ADDRESS_PREFIX_TEST => {
let script_hash = ScriptHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get script hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get script hash".to_string()))?;
(Network::BitcoinTestnet, Payload::P2sh { script_hash })
}
PUBKEY_ADDRESS_PREFIX_DOGE => {
let pubkey_hash = PubkeyHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get pubkey hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get pubkey hash".to_string()))?;
(Network::Dogecoin, Payload::P2pkh { pubkey_hash })
}
SCRIPT_ADDRESS_PREFIX_DOGE => {
let script_hash = ScriptHash::from_slice(&data[1..])
- .map_err(|_| Self::Err::AddressError(format!("failed to get script hash")))?;
+ .map_err(|_| Self::Err::AddressError("failed to get script hash".to_string()))?;
(Network::Dogecoin, Payload::P2sh { script_hash })
}
- _x => return Err(Self::Err::AddressError(format!("invalid address version"))),
+ _x => return Err(Self::Err::AddressError("invalid address version".to_string())),
};
Ok(Address { network, payload })
diff --git a/rust/apps/bitcoin/src/addresses/cashaddr.rs b/rust/apps/bitcoin/src/addresses/cashaddr.rs
index 715bddb..b7b1681 100644
--- a/rust/apps/bitcoin/src/addresses/cashaddr.rs
+++ b/rust/apps/bitcoin/src/addresses/cashaddr.rs
@@ -11,6 +11,7 @@ use bitcoin::address::AddressData as Payload;
use bitcoin::PubkeyHash;
use bitcoin_hashes::Hash;
use core::{fmt, str};
+use alloc::format;
// Prefixes
const DASH_PREFIX: &str = "bitcoincash";
@@ -110,7 +111,7 @@ fn expand_prefix(prefix: &str) -> Vec<u8> {
fn convert_bits(data: &[u8], inbits: u8, outbits: u8, pad: bool) -> Vec<u8> {
assert!(inbits <= 8 && outbits <= 8);
- let num_bytes = (data.len() * inbits as usize + outbits as usize - 1) / outbits as usize;
+ let num_bytes = (data.len() * inbits as usize).div_ceil(outbits as usize);
let mut ret = Vec::with_capacity(num_bytes);
let mut acc: u16 = 0; // accumulator of bits
let mut num: u8 = 0; // num bits in acc
@@ -148,12 +149,12 @@ fn from_base58_str(data: &str) -> Result<Vec<u8>> {
for d58 in data.bytes() {
// Compute "X = X * 58 + next_digit" in base 256
if d58 as usize > BASE58_DIGITS.len() {
- return Err(BitcoinError::AddressError(format!("invalid char")));
+ return Err(BitcoinError::AddressError("invalid char".to_string()));
}
let mut carry = match BASE58_DIGITS[d58 as usize] {
Some(d58) => u32::from(d58),
None => {
- return Err(BitcoinError::AddressError(format!("invalid char")));
+ return Err(BitcoinError::AddressError("invalid char".to_string()));
}
};
for d256 in scratch.iter_mut().rev() {
@@ -186,15 +187,13 @@ impl Base58Codec {
let length = raw.len();
if length != 25 {
return Err(BitcoinError::AddressError(format!(
- "BCH addresses decode error: invalid length {:?}",
- length
+ "BCH addresses decode error: invalid length {length:?}"
)));
}
let version_byte = raw[0];
if version_byte != PUBKEY_ADDRESS_PREFIX_BCH {
return Err(BitcoinError::AddressError(format!(
- "invalid version {:?}",
- version_byte
+ "invalid version {version_byte:?}"
)));
};
// Verify checksum
@@ -202,7 +201,7 @@ impl Base58Codec {
let checksum_actual = &raw[raw.len() - 4..];
let checksum_expected = &bitcoin_hashes::sha256d::Hash::hash(payload)[0..4];
if checksum_expected != checksum_actual {
- return Err(BitcoinError::AddressError(format!("checksum failed")));
+ return Err(BitcoinError::AddressError("checksum failed".to_string()));
}
let body = payload[1..].to_vec();
@@ -213,7 +212,7 @@ impl Base58Codec {
impl CashAddrCodec {
pub fn encode_to_fmt(fmt: &mut fmt::Formatter, raw: Vec<u8>) -> fmt::Result {
let encoded = CashAddrCodec::encode(raw).map_err(|_| fmt::Error)?;
- write!(fmt, "{}", encoded)
+ write!(fmt, "{encoded}")
}
pub fn encode(raw: Vec<u8>) -> Result<String> {
@@ -272,13 +271,13 @@ impl CashAddrCodec {
if let Some(first_char) = payload_chars.next() {
if first_char.is_lowercase() {
if payload_chars.any(|c| c.is_uppercase()) {
- return Err(BitcoinError::AddressError(format!("mixed case")));
+ return Err(BitcoinError::AddressError("mixed case".to_string()));
}
} else if payload_chars.any(|c| c.is_lowercase()) {
- return Err(BitcoinError::AddressError(format!("mixed case")));
+ return Err(BitcoinError::AddressError("mixed case".to_string()));
}
} else {
- return Err(BitcoinError::AddressError(format!("invalid length")));
+ return Err(BitcoinError::AddressError("invalid length".to_string()));
}
// Decode payload to 5 bit array
@@ -287,9 +286,9 @@ impl CashAddrCodec {
.map(|c| {
let i = c as usize;
if let Some(Some(d)) = CHARSET_REV.get(i) {
- Ok(*d as u8)
+ Ok(*d)
} else {
- return Err(BitcoinError::AddressError(format!("invalid char")));
+ Err(BitcoinError::AddressError("invalid char".to_string()))
}
})
.collect();
@@ -298,7 +297,7 @@ impl CashAddrCodec {
// Verify the checksum
let checksum = polymod(&[&expand_prefix(prefix), &payload_5_bits[..]].concat());
if checksum != 0 {
- return Err(BitcoinError::AddressError(format!("invalid checksum")));
+ return Err(BitcoinError::AddressError("invalid checksum".to_string()));
}
// Convert from 5 bit array to byte array
@@ -322,8 +321,7 @@ impl CashAddrCodec {
|| (version_size == version_byte_flags::SIZE_512 && body_len != 64)
{
return Err(BitcoinError::AddressError(format!(
- "invalid length {:?}",
- body_len
+ "invalid length {body_len:?}"
)));
}
@@ -331,12 +329,11 @@ impl CashAddrCodec {
let version_type = version & version_byte_flags::TYPE_MASK;
if version_type != version_byte_flags::TYPE_P2PKH {
return Err(BitcoinError::AddressError(format!(
- "invalid version {:?}",
- version_type
+ "invalid version {version_type:?}"
)));
};
- let publickey_hash = PubkeyHash::from_slice(&body.to_vec())
- .map_err(|_| BitcoinError::AddressError(format!("invalid public key hash")))?;
+ let publickey_hash = PubkeyHash::from_slice(body)
+ .map_err(|_| BitcoinError::AddressError("invalid public key hash".to_string()))?;
Ok(Address {
payload: Payload::P2pkh {
pubkey_hash: publickey_hash,
diff --git a/rust/apps/bitcoin/src/addresses/mod.rs b/rust/apps/bitcoin/src/addresses/mod.rs
index 4050b76..f82472a 100644
--- a/rust/apps/bitcoin/src/addresses/mod.rs
+++ b/rust/apps/bitcoin/src/addresses/mod.rs
@@ -22,7 +22,7 @@ pub fn derive_public_key(xpub: &String, path: String) -> Result<PublicKey> {
let converted_xpub = convert_version(xpub, &Version::Xpub)
.map_err(|_| BitcoinError::AddressError(String::from("xpub is not valid")))?;
let secp256k1_pubkey = secp256k1::derive_public_key(&converted_xpub, &path).map_err(|_| {
- BitcoinError::AddressError(format!("failed to derive public key {:?}", xpub))
+ BitcoinError::AddressError(format!("failed to derive public key {xpub:?}"))
})?;
PublicKey::from_slice(secp256k1_pubkey.serialize().as_slice())
.map_err(|e| BitcoinError::GetKeyError(e.to_string()))
diff --git a/rust/apps/bitcoin/src/addresses/xyzpub.rs b/rust/apps/bitcoin/src/addresses/xyzpub.rs
index a78ad02..9d9cf62 100644
--- a/rust/apps/bitcoin/src/addresses/xyzpub.rs
+++ b/rust/apps/bitcoin/src/addresses/xyzpub.rs
@@ -195,7 +195,7 @@ impl FromStr for Version {
"Zprv" => Ok(Version::ZprvMultisig),
"Uprv" => Ok(Version::UprvMultisig),
"Vprv" => Ok(Version::VprvMultisig),
- _ => Err(Self::Err::Base58Error(format!("unknown version prefix"))),
+ _ => Err(Self::Err::Base58Error("unknown version prefix".to_string())),
}
}
}
diff --git a/rust/apps/bitcoin/src/errors.rs b/rust/apps/bitcoin/src/errors.rs
index a4d85b0..ec4d744 100644
--- a/rust/apps/bitcoin/src/errors.rs
+++ b/rust/apps/bitcoin/src/errors.rs
@@ -85,37 +85,37 @@ pub enum BitcoinError {
impl From<io::Error> for BitcoinError {
fn from(value: io::Error) -> Self {
- Self::TransactionConsensusEncodeError(format!("{}", value))
+ Self::TransactionConsensusEncodeError(format!("{value}"))
}
}
impl From<bitcoin::io::Error> for BitcoinError {
fn from(value: bitcoin::io::Error) -> Self {
- Self::TransactionConsensusEncodeError(format!("{}", value))
+ Self::TransactionConsensusEncodeError(format!("{value}"))
}
}
impl From<PushBytesError> for BitcoinError {
fn from(value: PushBytesError) -> Self {
- Self::PushBytesFailed(format!("{}", value))
+ Self::PushBytesFailed(format!("{value}"))
}
}
impl From<HexToArrayError> for BitcoinError {
fn from(value: HexToArrayError) -> Self {
- Self::InvalidHex(format!("{}", value))
+ Self::InvalidHex(format!("{value}"))
}
}
impl From<bech32::segwit::DecodeError> for BitcoinError {
fn from(value: bech32::segwit::DecodeError) -> Self {
- Self::Bech32DecodeError(format!("{}", value))
+ Self::Bech32DecodeError(format!("{value}"))
}
}
impl From<bitcoin::witness_program::Error> for BitcoinError {
fn from(value: bitcoin::witness_program::Error) -> Self {
- Self::WitnessProgramError(format!("{}", value))
+ Self::WitnessProgramError(format!("{value}"))
}
}
@@ -123,11 +123,11 @@ impl From<Base58Error> for BitcoinError {
fn from(value: Base58Error) -> Self {
match value {
Base58Error::IncorrectChecksum(e) => {
- Self::Base58Error(format!("incorrect checksum: {}", e))
+ Self::Base58Error(format!("incorrect checksum: {e}"))
}
- Base58Error::TooShort(e) => Self::Base58Error(format!("too short: {}", e)),
- Base58Error::Decode(e) => Self::Base58Error(format!("invalid character: {}", e)),
- _ => Self::Base58Error(format!(": {}", value)),
+ Base58Error::TooShort(e) => Self::Base58Error(format!("too short: {e}")),
+ Base58Error::Decode(e) => Self::Base58Error(format!("invalid character: {e}")),
+ _ => Self::Base58Error(format!(": {value}")),
}
}
}
@@ -135,8 +135,8 @@ impl From<Base58Error> for BitcoinError {
impl From<KeystoreError> for BitcoinError {
fn from(value: KeystoreError) -> Self {
match value {
- KeystoreError::DerivePubKey(data) => Self::KeystoreError(format!("{}", data)),
- KeystoreError::InvalidDerivationPath(data) => Self::KeystoreError(format!("{}", data)),
+ KeystoreError::DerivePubKey(data) => Self::KeystoreError(data.to_string()),
+ KeystoreError::InvalidDerivationPath(data) => Self::KeystoreError(data.to_string()),
KeystoreError::XPubError(data) => Self::KeystoreError(data),
KeystoreError::SeedError(data) => Self::KeystoreError(data),
KeystoreError::DerivationError(data) => Self::KeystoreError(data),
diff --git a/rust/apps/bitcoin/src/lib.rs b/rust/apps/bitcoin/src/lib.rs
index d8f77a3..9a0035f 100644
--- a/rust/apps/bitcoin/src/lib.rs
+++ b/rust/apps/bitcoin/src/lib.rs
@@ -20,7 +20,6 @@ use bitcoin::secp256k1::ecdsa::{RecoverableSignature, RecoveryId};
use bitcoin::secp256k1::Message;
use bitcoin::sign_message;
use either::{Left, Right};
-use hex;
pub use transactions::legacy::sign_legacy_tx;
pub use transactions::parsed_tx;
pub use transactions::psbt::parsed_psbt;
diff --git a/rust/apps/bitcoin/src/macros.rs b/rust/apps/bitcoin/src/macros.rs
index 1b6a77f..a70d164 100644
--- a/rust/apps/bitcoin/src/macros.rs
+++ b/rust/apps/bitcoin/src/macros.rs
@@ -23,7 +23,7 @@ macro_rules! check_hd_path {
macro_rules! derivation_address_path {
($t: expr) => {{
let parts = $t.split("/").collect::<Vec<&str>>();
- let result: Result<String> = match crate::check_hd_path!(parts) {
+ let result: Result<String> = match $crate::check_hd_path!(parts) {
Ok(_) => {
let path = parts.as_slice()[parts.len() - 2..].to_vec().join("/");
Ok(format!("{}{}", "m/", path))
@@ -38,7 +38,7 @@ macro_rules! derivation_address_path {
macro_rules! derivation_account_path {
($t: expr) => {{
let parts = $t.split("/").collect::<Vec<&str>>();
- let result: Result<String> = match crate::check_hd_path!(parts) {
+ let result: Result<String> = match $crate::check_hd_path!(parts) {
Ok(_) => {
let path = parts.as_slice()[1..parts.len() - 2].to_vec().join("/");
Ok(format!("{}{}", "m/", path))
diff --git a/rust/apps/bitcoin/src/multi_sig/address.rs b/rust/apps/bitcoin/src/multi_sig/address.rs
index 76cadea..43820a1 100644
--- a/rust/apps/bitcoin/src/multi_sig/address.rs
+++ b/rust/apps/bitcoin/src/multi_sig/address.rs
@@ -90,10 +90,10 @@ pub fn calculate_multi_address_with_network(
}
fn derive_pub_key(xpub: &String, change: u32, account: u32) -> Result<PublicKey, BitcoinError> {
- Ok(derive_public_key(
+ derive_public_key(
xpub,
- format!("m/{}/{}", change, account),
- )?)
+ format!("m/{change}/{account}"),
+ )
}
fn crate_p2ms_script(pub_keys: &Vec<&PublicKey>, threshold: u32) -> ScriptBuf {
diff --git a/rust/apps/bitcoin/src/multi_sig/mod.rs b/rust/apps/bitcoin/src/multi_sig/mod.rs
index ddb4ac2..9b8d69c 100644
--- a/rust/apps/bitcoin/src/multi_sig/mod.rs
+++ b/rust/apps/bitcoin/src/multi_sig/mod.rs
@@ -83,8 +83,7 @@ impl MultiSigFormat {
"P2SH-P2WSH" => Ok(MultiSigFormat::P2wshP2sh),
"P2WSH" => Ok(MultiSigFormat::P2wsh),
_ => Err(BitcoinError::MultiSigWalletFormatError(format!(
- "not support this format {}",
- format_str
+ "not support this format {format_str}"
))),
}
}
@@ -151,15 +150,13 @@ pub fn extract_xpub_info_from_str(
.get(deriv_field_name)
.ok_or_else(|| {
BitcoinError::MultiSigWalletImportXpubError(format!(
- "have no {} field in json",
- deriv_field_name
+ "have no {deriv_field_name} field in json"
))
})?
.as_str()
.ok_or_else(|| {
BitcoinError::MultiSigWalletImportXpubError(format!(
- "{} field is not a string",
- deriv_field_name
+ "{deriv_field_name} field is not a string"
))
})?
.to_string();
@@ -168,15 +165,13 @@ pub fn extract_xpub_info_from_str(
.get(xpub_field_name)
.ok_or_else(|| {
BitcoinError::MultiSigWalletImportXpubError(format!(
- "have no {} field in json",
- xpub_field_name
+ "have no {xpub_field_name} field in json"
))
})?
.as_str()
.ok_or_else(|| {
BitcoinError::MultiSigWalletImportXpubError(format!(
- "{} field is not a string",
- xpub_field_name
+ "{xpub_field_name} field is not a string"
))
})?
.to_string();
@@ -257,13 +252,12 @@ pub fn export_xpub_by_crypto_account(
}
_ => {
return Err(URError::UrEncodeError(format!(
- "not supported path:{}",
- path.to_string()
+ "not supported path:{path}"
)));
}
}
}
- Ok(CryptoAccount::new(master_fingerprint.clone(), outputs))
+ Ok(CryptoAccount::new(*master_fingerprint, outputs))
}
fn crypto_output_to_multi_sig_xpub_info(
@@ -325,7 +319,7 @@ fn crypto_output_to_multi_sig_xpub_info(
ret[0..4].copy_from_slice(&VERSION_XPUB);
ret[4] = depth;
ret[5..9].copy_from_slice(&parent_fingerprint);
- ret[9..13].copy_from_slice(&u32::from(child_number).to_be_bytes());
+ ret[9..13].copy_from_slice(&child_number.to_be_bytes());
ret[13..45].copy_from_slice(&chain_code);
ret[45..78].copy_from_slice(&key);
@@ -471,7 +465,7 @@ fn generate_multi_sig_crypto_hd_key(
let origin = CryptoKeyPath::new(
path_components,
- Some(master_fingerprint.clone()),
+ Some(*master_fingerprint),
Some(bip32_extended_pub_key.depth as u32),
);
@@ -491,7 +485,7 @@ fn generate_multi_sig_crypto_hd_key(
}
fn get_path_component(index: Option<u32>, hardened: bool) -> URResult<PathComponent> {
- PathComponent::new(index, hardened).map_err(|e| URError::CborEncodeError(e))
+ PathComponent::new(index, hardened).map_err(URError::CborEncodeError)
}
#[allow(unused)]
diff --git a/rust/apps/bitcoin/src/multi_sig/wallet.rs b/rust/apps/bitcoin/src/multi_sig/wallet.rs
index abab2c8..a993326 100644
--- a/rust/apps/bitcoin/src/multi_sig/wallet.rs
+++ b/rust/apps/bitcoin/src/multi_sig/wallet.rs
@@ -89,7 +89,7 @@ impl MultiSigWalletConfig {
pub fn get_derivation_by_index(&self, index: usize) -> Option<String> {
let path = if self.derivations.len() == 1 {
- self.derivations.get(0)
+ self.derivations.first()
} else {
self.derivations.get(index)
};
@@ -132,7 +132,7 @@ fn _parse_plain_xpub_config(content: &str) -> Result<BsmsWallet, BitcoinError> {
let derivation_path = &line[9..=end_bracket_pos - 1].trim();
let extended_pubkey = &line[end_bracket_pos + 1..].trim();
bsms_wallet.xfp = xfp.to_string();
- bsms_wallet.derivation_path = format!("m{}", derivation_path);
+ bsms_wallet.derivation_path = format!("m{derivation_path}");
bsms_wallet.extended_pubkey = extended_pubkey.to_string();
return Ok(bsms_wallet);
}
@@ -230,22 +230,16 @@ fn _parse_plain_wallet_config(content: &str) -> Result<MultiSigWalletConfig, Bit
}
}
- for (_, xpub_item) in wallet.xpub_items.iter().enumerate() {
+ for xpub_item in wallet.xpub_items.iter() {
let this_network = detect_network(&xpub_item.xpub);
if this_network == Network::TestNet {
- return Err(BitcoinError::MultiSigWalletParseError(format!(
- "we don't support testnet for multisig yet"
- )));
+ return Err(BitcoinError::MultiSigWalletParseError("we don't support testnet for multisig yet".to_string()));
}
if is_first {
wallet.network = this_network;
is_first = false;
- } else {
- if wallet.network != this_network {
- return Err(BitcoinError::MultiSigWalletParseError(format!(
- "xpub networks inconsistent"
- )));
- }
+ } else if wallet.network != this_network {
+ return Err(BitcoinError::MultiSigWalletParseError("xpub networks inconsistent".to_string()));
}
}
@@ -282,12 +276,12 @@ pub fn generate_config_data(
));
config_data.push_str("#\n");
config_data.push_str(&format!("Name: {}\n", config.name));
- config_data.push_str(&format!("Policy: {}\n", policy));
+ config_data.push_str(&format!("Policy: {policy}\n"));
if config.derivations.len() == 1 {
config_data.push_str(&format!("Derivation: {}\n", config.derivations[0]));
config_data.push_str(&format!("Format: {}\n", config.format));
- config_data.push_str("\n");
+ config_data.push('\n');
let xpub_items = config
.xpub_items
.iter()
@@ -331,7 +325,7 @@ pub fn is_valid_xpub_config(bytes: &Bytes) -> bool {
if let Ok(d) = String::from_utf8(bytes.get_bytes())
.map_err(|e| BitcoinError::MultiSigWalletImportXpubError(e.to_string()))
{
- if let Ok(_) = _parse_plain_xpub_config(&d) {
+ if _parse_plain_xpub_config(&d).is_ok() {
return true;
}
}
@@ -342,7 +336,7 @@ pub fn is_valid_wallet_config(bytes: &Bytes) -> bool {
if let Ok(d) = String::from_utf8(bytes.get_bytes())
.map_err(|e| BitcoinError::MultiSigWalletImportXpubError(e.to_string()))
{
- if let Ok(_) = _parse_plain_wallet_config(&d) {
+ if _parse_plain_wallet_config(&d).is_ok() {
return true;
}
}
@@ -363,8 +357,8 @@ fn parse_and_set_policy(
})?;
if is_valid_multi_sig_policy(total, threshold) {
- wallet.threshold = threshold.clone();
- wallet.total = total.clone();
+ wallet.threshold = threshold;
+ wallet.total = total;
} else {
return Err(BitcoinError::MultiSigWalletParseError(
"this is not a valid policy".to_string(),
@@ -382,13 +376,11 @@ fn process_xpub_and_xfp(
) -> Result<(), BitcoinError> {
if is_valid_xfp(label) {
if is_valid_xyzpub(value) {
- for (_, xpub_item) in wallet.xpub_items.iter().enumerate() {
+ for xpub_item in wallet.xpub_items.iter() {
let result1 = xyzpub::convert_version(xpub_item.xpub.clone(), &Version::Xpub)?;
let result2 = xyzpub::convert_version(value, &Version::Xpub)?;
if result1.eq_ignore_ascii_case(&result2) {
- return Err(BitcoinError::MultiSigWalletParseError(format!(
- "found duplicated xpub"
- )));
+ return Err(BitcoinError::MultiSigWalletParseError("found duplicated xpub".to_string()));
}
}
wallet.xpub_items.push(MultiSigXPubItem {
@@ -409,7 +401,7 @@ fn process_xpub_and_xfp(
}
fn is_valid_multi_sig_policy(total: u32, threshold: u32) -> bool {
- total <= 15 && total >= 2 && threshold <= total || threshold >= 1
+ (2..=15).contains(&total) && threshold <= total || threshold >= 1
}
fn is_valid_xfp(xfp: &str) -> bool {
@@ -417,7 +409,7 @@ fn is_valid_xfp(xfp: &str) -> bool {
return false;
}
for c in xfp.chars() {
- if !c.is_digit(16) {
+ if !c.is_ascii_hexdigit() {
return false;
}
}
@@ -526,8 +518,8 @@ pub fn calculate_multi_sig_verify_code(
};
let data = match xfp {
- Some(xfp) => format!("{}{}{}of{}{}", xfp, join_xpubs, threshold, total, path),
- None => format!("{}{}of{}{}", join_xpubs, threshold, total, path),
+ Some(xfp) => format!("{xfp}{join_xpubs}{threshold}of{total}{path}"),
+ None => format!("{join_xpubs}{threshold}of{total}{path}"),
};
Ok(hex::encode(sha256(data.as_bytes()))[0..8].to_string())
@@ -547,20 +539,18 @@ pub fn strict_verify_wallet_config(
false => index,
};
let true_derivation = wallet.derivations.get(true_index).ok_or(
- BitcoinError::MultiSigWalletParseError(format!("Invalid derivations")),
+ BitcoinError::MultiSigWalletParseError("Invalid derivations".to_string()),
)?;
let true_xpub =
get_extended_public_key_by_seed(seed, true_derivation).map_err(|e| {
BitcoinError::MultiSigWalletParseError(format!(
- "Unable to generate xpub, {}",
- e.to_string()
+ "Unable to generate xpub, {e}"
))
})?;
let this_xpub = xyzpub::convert_version(&xpub_item.xpub, &Version::Xpub)?;
if !true_xpub.to_string().eq(&this_xpub) {
return Err(BitcoinError::MultiSigWalletParseError(format!(
- "extended public key not match, xfp: {}",
- xfp
+ "extended public key not match, xfp: {xfp}"
)));
}
}
diff --git a/rust/apps/bitcoin/src/network.rs b/rust/apps/bitcoin/src/network.rs
index 8ddccd4..f099e81 100644
--- a/rust/apps/bitcoin/src/network.rs
+++ b/rust/apps/bitcoin/src/network.rs
@@ -74,7 +74,7 @@ impl FromStr for Network {
"BTC_SEGWIT" => Ok(Self::Bitcoin),
"BTC_LEGACY" => Ok(Self::Bitcoin),
"AVAX" => Ok(Self::AvaxBtcBridge),
- _ => Err(BitcoinError::UnsupportedNetwork(format!("{:?}", network))),
+ _ => Err(BitcoinError::UnsupportedNetwork(format!("{network:?}"))),
}
}
}
diff --git a/rust/apps/bitcoin/src/transactions/legacy/input.rs b/rust/apps/bitcoin/src/transactions/legacy/input.rs
index cd33830..f2c39b8 100644
--- a/rust/apps/bitcoin/src/transactions/legacy/input.rs
+++ b/rust/apps/bitcoin/src/transactions/legacy/input.rs
@@ -79,7 +79,7 @@ impl TryInto<bitcoin::TxIn> for TxIn {
fn try_into(self) -> Result<bitcoin::TxIn> {
let tx_id = bitcoin::Txid::from_str(self.previous_output.as_str())
- .map_err(|_| BitcoinError::InvalidTransaction(format!("invalid txid")))?;
+ .map_err(|_| BitcoinError::InvalidTransaction("invalid txid".to_string()))?;
Ok(bitcoin::TxIn {
previous_output: bitcoin::OutPoint {
txid: tx_id,
@@ -132,10 +132,10 @@ impl TryFrom<Input> for TxIn {
fn try_from(value: protoc::Input) -> Result<Self> {
let utxo = value
.utxo
- .ok_or(BitcoinError::InvalidRawTxCryptoBytes(format!("empty utxo")))?;
- let _ = negative_check!("utxo value".to_string(), utxo.value)?;
+ .ok_or(BitcoinError::InvalidRawTxCryptoBytes("empty utxo".to_string()))?;
+ negative_check!("utxo value".to_string(), utxo.value)?;
let utxo_value = utxo.value as u64;
- let _ = negative_check!("utxo index".to_string(), value.index)?;
+ negative_check!("utxo index".to_string(), value.index)?;
let index = value.index as u32;
Ok(Self {
previous_output: value.hash,
diff --git a/rust/apps/bitcoin/src/transactions/legacy/mod.rs b/rust/apps/bitcoin/src/transactions/legacy/mod.rs
index 2349ca5..11e00ea 100644
--- a/rust/apps/bitcoin/src/transactions/legacy/mod.rs
+++ b/rust/apps/bitcoin/src/transactions/legacy/mod.rs
@@ -17,24 +17,22 @@ pub fn sign_legacy_tx(tx_data: &mut TxData, seed: &[u8]) -> Result<Vec<u8>> {
let input_len = tx_data.inputs.len();
for index in 0..input_len {
let raw_input = &tx_data.inputs[index].clone();
- let sig_hash = tx_data.signature_hash(index.clone())?;
+ let sig_hash = tx_data.signature_hash(index)?;
let message = match sig_hash {
either::Left(s) => Message::from_digest_slice(s.as_ref()).map_err(|_e| {
BitcoinError::SignFailure(format!(
- "invalid sig hash for input #{}",
- (index as u8).to_string()
+ "invalid sig hash for input #{index}"
))
})?,
either::Right(r) => Message::from_digest_slice(r.as_ref()).map_err(|_e| {
BitcoinError::SignFailure(format!(
- "invalid sig hash for input #{}",
- (index as u8).to_string()
+ "invalid sig hash for input #{index}"
))
})?,
};
let (_, signature) =
&secp256k1::sign_message_by_seed(seed, &raw_input.hd_path.to_string(), &message)?;
- tx_data.add_signature(index.clone(), signature)?;
+ tx_data.add_signature(index, signature)?;
}
Ok(serialize(&tx_data.transaction))
}
diff --git a/rust/apps/bitcoin/src/transactions/legacy/tx_data.rs b/rust/apps/bitcoin/src/transactions/legacy/tx_data.rs
index 60bd40b..4e4e6b7 100644
--- a/rust/apps/bitcoin/src/transactions/legacy/tx_data.rs
+++ b/rust/apps/bitcoin/src/transactions/legacy/tx_data.rs
@@ -85,7 +85,7 @@ impl TxData {
collect!(outputs);
let extended_pubkey =
convert_version(context.extended_public_key.to_string(), &Version::Xpub)?;
- return Ok(Self {
+ Ok(Self {
inputs,
outputs,
script_type: script_type.to_string(),
@@ -98,11 +98,11 @@ impl TxData {
input: transaction_mapped_input?,
output: transaction_mapped_output?,
},
- });
+ })
}
pub fn check_inputs(&self, context: &keystone::ParseContext) -> Result<()> {
- if self.inputs.len() == 0 {
+ if self.inputs.is_empty() {
return Err(BitcoinError::NoInputs);
}
if self.xfp.to_uppercase() != hex::encode(context.master_fingerprint).to_uppercase() {
@@ -115,8 +115,7 @@ impl TxData {
let has_my_input = self
.inputs
.iter()
- .enumerate()
- .map(|(_, inp)| self.check_my_input(inp, context))
+ .map(|inp| self.check_my_input(inp, context))
.fold(Ok(false), |acc, cur| match (acc, cur) {
(Ok(b1), Ok(b2)) => Ok(b1 | b2),
(a, b) => a.and(b),
@@ -139,13 +138,12 @@ impl TxData {
}
pub fn check_outputs(&self, _context: &keystone::ParseContext) -> Result<()> {
- if self.outputs.len() == 0 {
+ if self.outputs.is_empty() {
return Err(BitcoinError::NoOutputs);
}
self.outputs
.iter()
- .enumerate()
- .map(|(_, output)| self.judge_then_check_my_output(output))
+ .map(|output| self.judge_then_check_my_output(output))
.fold(Ok(()), |acc, cur| acc.and(cur))
}
@@ -192,7 +190,7 @@ impl TxData {
script: &Script,
sig_hash_type: u32,
) -> Result<SegwitV0Sighash> {
- let raw_input = &self.inputs[input_index.clone()].clone();
+ let raw_input = &self.inputs[input_index].clone();
let mut enc = SegwitV0Sighash::engine();
self.transaction.version.consensus_encode(&mut enc)?;
let common_cache = self.common_cache()?;
@@ -225,7 +223,7 @@ impl TxData {
&mut self,
input_index: usize,
) -> Result<Either<LegacySighash, SegwitV0Sighash>> {
- let raw_input = &self.inputs[input_index.clone()].clone();
+ let raw_input = &self.inputs[input_index].clone();
let mut sig_hasher = SighashCache::new(&self.transaction);
let script_type = ScriptType::from_str(&self.script_type)?;
let pubkey_slice =
@@ -240,21 +238,20 @@ impl TxData {
&script,
sig_hash_type,
)
- .map(|v| Right(v))
+ .map(Right)
} else {
sig_hasher
.legacy_signature_hash(
- input_index.clone(),
+ input_index,
&script,
EcdsaSighashType::All.to_u32(),
)
.map_err(|_e| {
BitcoinError::SignLegacyTxError(format!(
- "invalid sig hash for {:?}",
- script_type
+ "invalid sig hash for {script_type:?}"
))
})
- .map(|v| Left(v))
+ .map(Left)
}
}
ScriptType::P2WPKH | ScriptType::P2SHP2WPKH => {
@@ -266,17 +263,15 @@ impl TxData {
Amount::from_sat(raw_input.value),
EcdsaSighashType::All,
)
- .map(|v| Right(v))
+ .map(Right)
.map_err(|_e| {
BitcoinError::SignLegacyTxError(format!(
- "invalid sig hash for {:?}",
- script_type
+ "invalid sig hash for {script_type:?}"
))
})
}
_ => Err(BitcoinError::SignLegacyTxError(format!(
- "invalid script type sig hash {:?}",
- script_type
+ "invalid script type sig hash {script_type:?}"
))),
}
}
@@ -301,7 +296,7 @@ impl TxData {
let signature_type = self.sig_hash_type();
let pubkey_slice =
hex::decode(&raw_input.pubkey).map_err(|_e| BitcoinError::InvalidInput)?;
- let input = &mut self.transaction.input[input_index.clone()];
+ let input = &mut self.transaction.input[input_index];
if script_type == ScriptType::P2PKH {
input.script_sig = raw_input.script_sig(signature, signature_type, &script_type)?;
} else if script_type == ScriptType::P2WPKH {
@@ -321,11 +316,10 @@ impl TxData {
input.script_sig = raw_input.script_sig(signature, signature_type, &script_type)?;
} else {
return Err(BitcoinError::SignFailure(format!(
- "invalid script type {:?}",
- script_type
+ "invalid script type {script_type:?}"
)));
}
- return Ok(self);
+ Ok(self)
}
}
diff --git a/rust/apps/bitcoin/src/transactions/parsed_tx.rs b/rust/apps/bitcoin/src/transactions/parsed_tx.rs
index 66e9962..53f16bf 100644
--- a/rust/apps/bitcoin/src/transactions/parsed_tx.rs
+++ b/rust/apps/bitcoin/src/transactions/parsed_tx.rs
@@ -87,7 +87,7 @@ impl ParseContext {
}
}
-pub const DIVIDER: f64 = 100_000_000 as f64;
+pub const DIVIDER: f64 = 100_000_000_f64;
pub trait TxParser {
fn format_amount(value: u64, network: &dyn NetworkT) -> String {
@@ -95,7 +95,7 @@ pub trait TxParser {
}
fn format_sat(value: u64) -> String {
- format!("{} sats", value)
+ format!("{value} sats")
}
fn parse(&self, context: Option<&ParseContext>) -> Result<ParsedTx>;
@@ -110,7 +110,7 @@ pub trait TxParser {
let first_multi_status = parsed_inputs[0].sign_status;
//none of inputs is signed
if parsed_inputs.iter().all(|input| input.sign_status.0 == 0) {
- return Some(String::from("Unsigned"));
+ Some(String::from("Unsigned"))
}
//or some inputs are signed and completed
else if parsed_inputs
@@ -134,12 +134,12 @@ pub trait TxParser {
}
fn is_need_sign(parsed_inputs: &[ParsedInput]) -> bool {
- for (_index, input) in parsed_inputs.iter().enumerate() {
+ for input in parsed_inputs.iter() {
if input.need_sign {
return true;
}
}
- return false;
+ false
}
fn normalize(
@@ -152,8 +152,7 @@ pub trait TxParser {
let total_output_value = outputs.iter().fold(0, |acc, cur| acc + cur.value);
let has_anyone_can_pay = inputs
.iter()
- .find(|v| v.ecdsa_sighash_type & 0x80 > 0)
- .is_some();
+ .any(|v| v.ecdsa_sighash_type & 0x80 > 0);
let fee = if has_anyone_can_pay {
0
} else {
@@ -179,8 +178,7 @@ pub trait TxParser {
});
let mut overview_from = inputs
.iter()
- .filter(|v| v.address.is_some())
- .map(|v| v.address.clone().unwrap_or("Unknown Address".to_string()))
+ .filter_map(|v| v.address.clone())
.collect::<Vec<String>>();
overview_from.sort();
overview_from.dedup();
diff --git a/rust/apps/bitcoin/src/transactions/psbt/parsed_psbt.rs b/rust/apps/bitcoin/src/transactions/psbt/parsed_psbt.rs
index f64622b..f97edee 100644
--- a/rust/apps/bitcoin/src/transactions/psbt/parsed_psbt.rs
+++ b/rust/apps/bitcoin/src/transactions/psbt/parsed_psbt.rs
@@ -6,11 +6,12 @@ use alloc::vec::Vec;
use bitcoin::bip32::ChildNumber;
use bitcoin::NetworkKind;
use core::ops::Index;
+use alloc::string::ToString;
impl TxParser for WrappedPsbt {
fn parse(&self, context: Option<&ParseContext>) -> Result<ParsedTx> {
let network = self.determine_network()?;
- let context = context.ok_or(BitcoinError::InvalidParseContext(format!("empty context")))?;
+ let context = context.ok_or(BitcoinError::InvalidParseContext("empty context".to_string()))?;
let inputs = self
.psbt
.inputs
@@ -70,13 +71,11 @@ impl TxParser for WrappedPsbt {
60 => Ok(Network::AvaxBtcBridge),
145 => Ok(Network::BitcoinCash),
_ => Err(BitcoinError::InvalidTransaction(format!(
- "unknown network {}",
- index
+ "unknown network {index}"
))),
},
_ => Err(BitcoinError::InvalidTransaction(format!(
- "unsupported derivation path {}",
- path
+ "unsupported derivation path {path}"
))),
}
}
diff --git a/rust/apps/bitcoin/src/transactions/psbt/wrapped_psbt.rs b/rust/apps/bitcoin/src/transactions/psbt/wrapped_psbt.rs
index 061ae11..80d0800 100644
--- a/rust/apps/bitcoin/src/transactions/psbt/wrapped_psbt.rs
+++ b/rust/apps/bitcoin/src/transactions/psbt/wrapped_psbt.rs
@@ -63,12 +63,10 @@ impl GetKey for Keystore {
.map_err(|e| BitcoinError::GetKeyError(e.to_string()))?;
Ok(Some(PrivateKey::new(key, Network::Bitcoin)))
} else {
- Err(BitcoinError::GetKeyError(format!("mfp is not match")))
+ Err(BitcoinError::GetKeyError("mfp is not match".to_string()))
}
}
- _ => Err(BitcoinError::GetKeyError(format!(
- "get private key by public key is not supported"
- ))),
+ _ => Err(BitcoinError::GetKeyError("get private key by public key is not supported".to_string())),
}
}
}
@@ -81,7 +79,7 @@ impl WrappedPsbt {
};
self.psbt
.sign(&k, &secp256k1::Secp256k1::new())
- .map_err(|_| BitcoinError::SignFailure(format!("unknown error")))?;
+ .map_err(|_| BitcoinError::SignFailure("unknown error".to_string()))?;
Ok(self.psbt.clone())
}
@@ -108,11 +106,8 @@ impl WrappedPsbt {
return Err(BitcoinError::InvalidInput);
}
let prevout = prev_tx.output.get(tx_in.previous_output.vout as usize);
- match prevout {
- Some(out) => {
- value = out.value.to_sat();
- }
- None => {}
+ if let Some(out) = prevout {
+ value = out.value.to_sat();
}
}
if let Some(utxo) = &input.witness_utxo {
@@ -132,7 +127,7 @@ impl WrappedPsbt {
path: path.clone().map(|v| v.0),
sign_status,
is_multisig,
- is_external: path.clone().map_or(false, |v| v.1),
+ is_external: path.is_some_and(|(_, external)| external),
need_sign,
ecdsa_sighash_type: input
.sighash_type
@@ -143,7 +138,7 @@ impl WrappedPsbt {
}
pub fn check_inputs(&self, context: &ParseContext) -> Result<()> {
- if self.psbt.inputs.len() == 0 {
+ if self.psbt.inputs.is_empty() {
return Err(BitcoinError::NoInputs);
}
let has_my_input = self
@@ -182,14 +177,11 @@ impl WrappedPsbt {
}
fn get_my_input_verify_code(&self, input: &Input) -> Option<String> {
- return if input.bip32_derivation.len() > 1 {
- match self.get_multi_sig_input_verify_code(input) {
- Ok(verify_code) => Some(verify_code),
- Err(_) => None,
- }
+ if input.bip32_derivation.len() > 1 {
+ self.get_multi_sig_input_verify_code(input).ok()
} else {
None
- };
+ }
}
fn check_my_wallet_type(&self, input: &Input, context: &ParseContext) -> Result<()> {
@@ -220,10 +212,9 @@ impl WrappedPsbt {
None => "null".to_string(),
Some(verify_code) => verify_code.to_string(),
};
- return Err(BitcoinError::WalletTypeError(format!(
- "wallet type mismatch wallet verify code is {} input verify code is {}",
- wallet_verify_code, input_verify_code
- )));
+ Err(BitcoinError::WalletTypeError(format!(
+ "wallet type mismatch wallet verify code is {wallet_verify_code} input verify code is {input_verify_code}"
+ )))
}
pub fn check_my_input_script(&self, _input: &Input, _index: usize) -> Result<()> {
@@ -270,25 +261,20 @@ impl WrappedPsbt {
.contains_key(&(x_only_pubkey, *leasfhash))
{
return Err(BitcoinError::InvalidTransaction(format!(
- "input #{} has already been signed",
- index
+ "input #{index} has already been signed"
)));
}
}
}
if input.tap_key_sig.is_some() {
return Err(BitcoinError::InvalidTransaction(format!(
- "input #{} has already been signed",
- index
- )));
- }
- } else {
- if input.partial_sigs.len() > 0 {
- return Err(BitcoinError::InvalidTransaction(format!(
- "input #{} has already been signed",
- index
+ "input #{index} has already been signed"
)));
}
+ } else if !input.partial_sigs.is_empty() {
+ return Err(BitcoinError::InvalidTransaction(format!(
+ "input #{index} has already been signed"
+ )));
}
Ok(())
}
@@ -302,10 +288,9 @@ impl WrappedPsbt {
.output
.get(this_tx_in.previous_output.vout as usize)
.ok_or(BitcoinError::InvalidInput)?;
- if !prev_tx_out_value.eq(&utxo) {
+ if !prev_tx_out_value.eq(utxo) {
return Err(BitcoinError::InputValueTampered(format!(
- "input #{}'s value does not match the value in previous transaction",
- index
+ "input #{index}'s value does not match the value in previous transaction"
)));
}
}
@@ -422,15 +407,14 @@ impl WrappedPsbt {
.get(key)
.ok_or(BitcoinError::InvalidInput)?;
- if fingerprint.eq(&context.master_fingerprint) {
- if input.partial_sigs.contains_key(&PublicKey::new(*key)) {
+ if fingerprint.eq(&context.master_fingerprint)
+ && input.partial_sigs.contains_key(&PublicKey::new(*key)) {
return Ok(false);
}
- }
}
Ok(true)
} else {
- Ok(input.partial_sigs.len() < 1)
+ Ok(input.partial_sigs.is_empty())
}
}
@@ -451,13 +435,10 @@ impl WrappedPsbt {
}
}
while let Some(Ok(instruction)) = instructions.next() {
- match instruction {
- Instruction::Op(op) => {
- if op.to_u8() >= 0x51 && op.to_u8() <= 0x60 {
- total = op.to_u8() - 0x50;
- }
+ if let Instruction::Op(op) = instruction {
+ if op.to_u8() >= 0x51 && op.to_u8() <= 0x60 {
+ total = op.to_u8() - 0x50;
}
- _ => {}
}
}
Ok((required_sigs, total))
@@ -518,14 +499,14 @@ impl WrappedPsbt {
));
};
- Ok(calculate_multi_sig_verify_code(
+ calculate_multi_sig_verify_code(
&xpubs,
threshold,
total,
format,
&crate::multi_sig::Network::try_from(&network)?,
None,
- )?)
+ )
}
pub fn get_overall_sign_status(&self) -> Option<String> {
@@ -541,12 +522,12 @@ impl WrappedPsbt {
.collect();
//none of inputs is signed
if all_inputs_status.iter().all(|(sigs, _)| sigs.eq(&0)) {
- return Some(String::from("Unsigned"));
+ Some(String::from("Unsigned"))
}
//or some inputs are signed and completed
else if all_inputs_status
.iter()
- .all(|(sigs, requires)| sigs.ge(&requires))
+ .all(|(sigs, requires)| sigs.ge(requires))
{
return Some(String::from("Completed"));
}
@@ -555,7 +536,7 @@ impl WrappedPsbt {
.iter()
.all(|(sigs, requires)| sigs.eq(&first_sigs) && requires.eq(&first_requires))
{
- return Some(format!("{}/{} Signed", first_sigs, first_requires));
+ return Some(format!("{first_sigs}/{first_requires} Signed"));
} else {
return Some(String::from("Partly Signed"));
}
@@ -565,7 +546,7 @@ impl WrappedPsbt {
if let Some(res) = self.get_overall_sign_status() {
return res.eq("Completed");
}
- return false;
+ false
}
pub fn calculate_address_for_input(
@@ -591,14 +572,14 @@ impl WrappedPsbt {
ChildNumber::Hardened { index: _i } => match _i {
0 | 3 => Ok(Some(
Address::p2pkh(
- &bitcoin::PublicKey::new(pubkey.clone()),
+ &bitcoin::PublicKey::new(*pubkey),
network.clone(),
)?
.to_string(),
)),
60 => Ok(Some(
Address::p2wpkh(
- &bitcoin::PublicKey::new(pubkey.clone()),
+ &bitcoin::PublicKey::new(*pubkey),
network.clone(),
)?
.to_string(),
@@ -609,14 +590,14 @@ impl WrappedPsbt {
},
49 => Ok(Some(
Address::p2shp2wpkh(
- &bitcoin::PublicKey::new(pubkey.clone()),
+ &bitcoin::PublicKey::new(*pubkey),
network.clone(),
)?
.to_string(),
)),
84 => Ok(Some(
Address::p2wpkh(
- &bitcoin::PublicKey::new(pubkey.clone()),
+ &bitcoin::PublicKey::new(*pubkey),
network.clone(),
)?
.to_string(),
@@ -648,7 +629,7 @@ impl WrappedPsbt {
amount: Self::format_amount(tx_out.value.to_sat(), network),
value: tx_out.value.to_sat(),
path: path.clone().map(|v| v.0),
- is_external: path.clone().map_or(false, |v| v.1),
+ is_external: path.clone().is_some_and(|v| v.1),
})
}
@@ -669,13 +650,10 @@ impl WrappedPsbt {
index: usize,
context: &ParseContext,
) -> Result<Option<(String, bool)>> {
- if context.multisig_wallet_config.is_some() {
- if self.is_taproot_input(input) {
- return Err(BitcoinError::InvalidPsbt(format!(
- "multisig with taproot is not supported"
- )));
+ if context.multisig_wallet_config.is_some()
+ && self.is_taproot_input(input) {
+ return Err(BitcoinError::InvalidPsbt("multisig with taproot is not supported".to_string()));
}
- }
if self.is_taproot_input(input) {
self.get_my_key_path_for_taproot(&input.tap_key_origins, index, "input", context)
} else {
@@ -715,12 +693,12 @@ impl WrappedPsbt {
.iter()
.map(|v| v.xfp.clone())
.sorted()
- .fold("".to_string(), |acc, cur| format!("{}{}", acc, cur));
+ .fold("".to_string(), |acc, cur| format!("{acc}{cur}"));
let xfps = bip32_derivation
.values()
.map(|(fp, _)| fp.to_string())
.sorted()
- .fold("".to_string(), |acc, cur| format!("{}{}", acc, cur));
+ .fold("".to_string(), |acc, cur| format!("{acc}{cur}"));
// not my multisig key
if !wallet_xfps.eq_ignore_ascii_case(&xfps) {
return Ok(None);
@@ -748,8 +726,7 @@ impl WrappedPsbt {
}
}
return Err(BitcoinError::InvalidTransaction(format!(
- "invalid {} #{}, fingerprint matched but cannot derive associated public key",
- purpose, index
+ "invalid {purpose} #{index}, fingerprint matched but cannot derive associated public key"
)));
}
None => {
@@ -762,8 +739,7 @@ impl WrappedPsbt {
}
}
return Err(BitcoinError::InvalidTransaction(format!(
- "invalid {} #{}, fingerprint matched but cannot derive associated public key",
- purpose, index
+ "invalid {purpose} #{index}, fingerprint matched but cannot derive associated public key"
)));
}
}
@@ -805,8 +781,7 @@ impl WrappedPsbt {
}
}
return Err(BitcoinError::InvalidTransaction(format!(
- "invalid {} #{}, fingerprint matched but cannot derive associated public key",
- purpose, index
+ "invalid {purpose} #{index}, fingerprint matched but cannot derive associated public key"
)));
}
}
@@ -820,7 +795,7 @@ impl WrappedPsbt {
) -> Option<(XOnlyPublicKey, Vec<TapLeafHash>)> {
for (pk, (leaf_hashes, (fingerprint, _))) in input.tap_key_origins.iter() {
if *fingerprint == context.master_fingerprint && !leaf_hashes.is_empty() {
- return Some((pk.clone(), leaf_hashes.clone()));
+ return Some((*pk, leaf_hashes.clone()));
}
}
None
@@ -830,7 +805,7 @@ impl WrappedPsbt {
if let Some(witness_utxo) = &input.witness_utxo {
return witness_utxo.script_pubkey.is_p2tr();
}
- return false;
+ false
}
// use global unknown for some custom usage
@@ -865,7 +840,7 @@ fn derive_public_key_by_path(
.ok_or(BitcoinError::InvalidPsbt(hd_path.to_string()))?
.to_string();
- let public_key = derive_public_key(&xpub.to_string(), &format!("m/{}", sub_path))
+ let public_key = derive_public_key(&xpub.to_string(), &format!("m/{sub_path}"))
.map_err(|e| BitcoinError::DerivePublicKeyError(e.to_string()))?;
Ok(public_key)
diff --git a/rust/apps/bitcoin/src/transactions/script_type.rs b/rust/apps/bitcoin/src/transactions/script_type.rs
index 315edb0..76ff8de 100644
--- a/rust/apps/bitcoin/src/transactions/script_type.rs
+++ b/rust/apps/bitcoin/src/transactions/script_type.rs
@@ -33,11 +33,11 @@ impl ScriptType {
pub fn to_derivation_path(&self, network: &Network) -> Result<DerivationPath> {
let coin_type = network.bip44_coin_type();
let path_str = match self {
- ScriptType::P2PKH => Ok(format!("m/44'/{}'/0'", coin_type)),
+ ScriptType::P2PKH => Ok(format!("m/44'/{coin_type}'/0'")),
ScriptType::P2SHP2WPKH | ScriptType::P2SH | ScriptType::P2SHP2WSH => {
- Ok(format!("m/49'/{}'/0'", coin_type))
+ Ok(format!("m/49'/{coin_type}'/0'"))
}
- ScriptType::P2WPKH | ScriptType::P2WSH => Ok(format!("m/84'/{}'/0'", coin_type)),
+ ScriptType::P2WPKH | ScriptType::P2WSH => Ok(format!("m/84'/{coin_type}'/0'")),
ScriptType::RAW => Err(BitcoinError::UnsupportedScriptType("raw".to_string())),
}?;
DerivationPath::from_str(path_str.as_str())
@@ -57,8 +57,7 @@ impl FromStr for ScriptType {
"P2SH" => Ok(Self::P2SH),
"RAW" => Ok(Self::RAW),
_ => Err(BitcoinError::UnsupportedScriptType(format!(
- "{:?}",
- script_type
+ "{script_type:?}"
))),
}
}
@@ -76,6 +75,6 @@ impl fmt::Display for ScriptType {
ScriptType::RAW => "RAW",
}
.to_string();
- write!(f, "{}", script_type_str)
+ write!(f, "{script_type_str}")
}
}
diff --git a/rust/apps/cardano/src/address.rs b/rust/apps/cardano/src/address.rs
index a774324..73e331a 100644
--- a/rust/apps/cardano/src/address.rs
+++ b/rust/apps/cardano/src/address.rs
@@ -261,7 +261,7 @@ mod tests {
fn test_address_from_slip39_ms() {
let path = "m/1852'/1815'/0'";
let seed = hex::decode("c080e9d40873204bb1bb5837dc88886b").unwrap();
- let xpub = from_seed_slip23_path(&seed, path)
+ let xpub = crate::slip23::from_seed_slip23_path(&seed, path)
.unwrap()
.xprv
.public()
diff --git a/rust/apps/cardano/src/lib.rs b/rust/apps/cardano/src/lib.rs
index 79363ce..3c65669 100644
--- a/rust/apps/cardano/src/lib.rs
+++ b/rust/apps/cardano/src/lib.rs
@@ -1,5 +1,4 @@
#![no_std]
-#![feature(error_in_core)]
extern crate alloc;
#[cfg(test)]
diff --git a/rust/apps/iota/src/lib.rs b/rust/apps/iota/src/lib.rs
index ce3553f..1d1c2d3 100644
--- a/rust/apps/iota/src/lib.rs
+++ b/rust/apps/iota/src/lib.rs
@@ -1,5 +1,4 @@
#![no_std]
-#![feature(error_in_core)]
extern crate alloc;
#[cfg(test)]
diff --git a/rust/apps/monero/src/key_images.rs b/rust/apps/monero/src/key_images.rs
index 3e7318c..4d64774 100644
--- a/rust/apps/monero/src/key_images.rs
+++ b/rust/apps/monero/src/key_images.rs
@@ -4,7 +4,7 @@ use crate::outputs::{ExportedTransferDetail, ExportedTransferDetails};
use crate::utils::{
constants::*,
decrypt_data_with_pvk, encrypt_data_with_pvk,
- hash::{hash_to_scalar, keccak256},
+ hash::hash_to_scalar,
sign::generate_ring_signature,
varinteger::*,
};
@@ -16,7 +16,7 @@ use curve25519_dalek::scalar::Scalar;
use curve25519_dalek::EdwardsPoint;
use hex;
use monero_serai::generators::hash_to_point;
-use rand_core::SeedableRng;
+use rand_core::OsRng;
use rand_core::{CryptoRng, RngCore};
#[derive(Debug, Clone, Copy)]
@@ -306,12 +306,10 @@ pub fn generate_export_ur_data(keypair: KeyPair, request_data: Vec<u8>) -> Resul
let outputs = ExportedTransferDetails::from_bytes(&decrypted_data.data)?;
let mut key_images: KeyImages = KeyImages(vec![]);
- let rng_seed = keccak256(request_data.as_slice());
- let mut rng = rand_chacha::ChaCha20Rng::from_seed(rng_seed.try_into().unwrap());
for output in outputs.details.iter() {
key_images
.0
- .push(output.key_image(&keypair.clone(), &mut rng));
+ .push(output.key_image(&keypair.clone(), OsRng));
}
Ok(encrypt_data_with_pvk(
diff --git a/rust/apps/monero/src/transfer.rs b/rust/apps/monero/src/transfer.rs
index 7dcfdf0..d966d65 100644
--- a/rust/apps/monero/src/transfer.rs
+++ b/rust/apps/monero/src/transfer.rs
@@ -756,7 +756,7 @@ pub fn parse_unsigned(
pub fn sign_tx(keypair: KeyPair, request_data: Vec<u8>) -> Result<Vec<u8>> {
let decrypted_data = match decrypt_data_with_pvk(
- keypair.view.to_bytes().try_into().unwrap(),
+ keypair.view.to_bytes(),
request_data.clone(),
UNSIGNED_TX_PREFIX,
) {
diff --git a/rust/apps/monero/src/utils/mod.rs b/rust/apps/monero/src/utils/mod.rs
index 843be33..80b6e38 100644
--- a/rust/apps/monero/src/utils/mod.rs
+++ b/rust/apps/monero/src/utils/mod.rs
@@ -14,7 +14,7 @@ use curve25519_dalek::edwards::EdwardsPoint;
use curve25519_dalek::scalar::Scalar;
use curve25519_dalek::traits::{IsIdentity, MultiscalarMul};
use monero_serai::transaction::Input;
-use rand_core::{CryptoRng, RngCore, SeedableRng};
+use rand_core::{CryptoRng, OsRng, RngCore};
pub mod constants;
pub mod hash;
@@ -63,9 +63,7 @@ pub fn decrypt_data_with_pincode(data: Vec<u8>, pin: [u8; 6]) -> String {
pub fn encrypt_data_with_pvk(keypair: KeyPair, data: Vec<u8>, magic: &str) -> Vec<u8> {
let pvk_hash = cryptonight_hash_v0(&keypair.view.to_bytes());
let magic_bytes = magic.as_bytes();
- let rng_seed = keccak256(&data.clone());
- let mut rng = rand_chacha::ChaCha20Rng::from_seed(rng_seed);
- let nonce_num = rng.next_u64().to_be_bytes();
+ let nonce_num = OsRng.next_u64().to_be_bytes();
let key = GenericArray::from_slice(&pvk_hash);
let nonce = GenericArray::from_slice(&nonce_num);
@@ -90,14 +88,11 @@ pub fn encrypt_data_with_pvk(keypair: KeyPair, data: Vec<u8>, magic: &str) -> Ve
unsigned_buffer.extend_from_slice(&nonce_num.clone());
unsigned_buffer.extend_from_slice(&buffer.clone());
- let rng_seed = keccak256(&data);
- let mut rng = rand_chacha::ChaCha20Rng::from_seed(rng_seed);
-
let signature = generate_signature(
&keccak256(&unsigned_buffer),
&keypair.view.get_public_key(),
&PrivateKey::from_bytes(&keypair.view.to_bytes()),
- &mut rng,
+ &mut OsRng,
)
.unwrap();
buffer.extend_from_slice(&signature.0);
diff --git a/rust/apps/solana/src/address.rs b/rust/apps/solana/src/address.rs
index 147efb3..1c5d29b 100644
--- a/rust/apps/solana/src/address.rs
+++ b/rust/apps/solana/src/address.rs
@@ -6,7 +6,7 @@ use bitcoin::base58;
pub fn get_address(pub_key: &String) -> Result<String> {
let pubkey = hex::decode(pub_key)?;
if pubkey.len() != 32 {
- SolanaError::AddressError(format!("bad public key {:?}", pub_key));
+ SolanaError::AddressError(format!("bad public key {pub_key:?}"));
}
Ok(base58::encode(pubkey.as_slice()))
}
diff --git a/rust/apps/solana/src/compact.rs b/rust/apps/solana/src/compact.rs
index e41ed26..5231a8c 100644
--- a/rust/apps/solana/src/compact.rs
+++ b/rust/apps/solana/src/compact.rs
@@ -1,7 +1,8 @@
use crate::errors::{Result, SolanaError};
use crate::read::Read;
use alloc::vec::Vec;
-use alloc::{format, vec};
+use alloc::vec;
+use alloc::string::ToString;
pub struct Compact<T> {
compact_length: u32,
@@ -25,8 +26,8 @@ impl<T: Read<T>> Compact<T> {
let mut len: u32 = 0;
let mut size: u32 = 0;
loop {
- if raw.len() < 1 {
- return Err(SolanaError::InvalidData(format!("compact length")));
+ if raw.is_empty() {
+ return Err(SolanaError::InvalidData("compact length".to_string()));
}
let element: u32 = raw.remove(0) as u32;
len |= (element & 0x7f) << (size * 7);
diff --git a/rust/apps/solana/src/errors.rs b/rust/apps/solana/src/errors.rs
index 248a4e3..04b32ec 100644
--- a/rust/apps/solana/src/errors.rs
+++ b/rust/apps/solana/src/errors.rs
@@ -33,7 +33,7 @@ pub type Result<T> = core::result::Result<T, SolanaError>;
impl From<Base58Error> for SolanaError {
fn from(value: Base58Error) -> Self {
- Self::AddressError(format!("base58Error: {}", value.to_string()))
+ Self::AddressError(format!("base58Error: {value}"))
}
}
@@ -45,7 +45,7 @@ impl From<KeystoreError> for SolanaError {
impl From<hex::FromHexError> for SolanaError {
fn from(value: hex::FromHexError) -> Self {
- Self::InvalidData(format!("hex operation failed {}", value))
+ Self::InvalidData(format!("hex operation failed {value}"))
}
}
diff --git a/rust/apps/solana/src/instruction.rs b/rust/apps/solana/src/instruction.rs
index cf07f01..b62385d 100644
--- a/rust/apps/solana/src/instruction.rs
+++ b/rust/apps/solana/src/instruction.rs
@@ -68,8 +68,8 @@ impl SupportedProgram {
}
impl Instruction {
- pub fn parse(&self, program_id: &String, accounts: Vec<String>) -> Result<SolanaDetail> {
- let program = SupportedProgram::from_program_id(program_id.clone())?;
+ pub fn parse(&self, program_id: &str, accounts: Vec<String>) -> Result<SolanaDetail> {
+ let program = SupportedProgram::from_program_id(program_id.to_string())?;
match program {
SupportedProgram::SystemProgram => {
let instruction =
diff --git a/rust/apps/solana/src/lib.rs b/rust/apps/solana/src/lib.rs
index 726f0ff..ecd04f6 100644
--- a/rust/apps/solana/src/lib.rs
+++ b/rust/apps/solana/src/lib.rs
@@ -32,7 +32,7 @@ pub mod utils;
pub fn parse_message(tx_hex: Vec<u8>, from_key: &String) -> errors::Result<SolanaMessage> {
let raw_message = hex::encode(tx_hex.clone());
let mut utf8_message =
- String::from_utf8(tx_hex).map_or_else(|_| "".to_string(), |utf8_msg| utf8_msg);
+ String::from_utf8(tx_hex).unwrap_or_else(|_| "".to_string());
if app_utils::is_cjk(&utf8_message) {
utf8_message = "".to_string();
}
@@ -48,7 +48,7 @@ pub fn parse(data: &Vec<u8>) -> errors::Result<ParsedSolanaTx> {
}
pub fn sign(message: Vec<u8>, hd_path: &String, seed: &[u8]) -> errors::Result<[u8; 64]> {
- keystore::algorithms::ed25519::slip10_ed25519::sign_message_by_seed(&seed, hd_path, &message)
+ keystore::algorithms::ed25519::slip10_ed25519::sign_message_by_seed(seed, hd_path, &message)
.map_err(|e| errors::SolanaError::KeystoreError(format!("sign failed {:?}", e.to_string())))
}
diff --git a/rust/apps/solana/src/message.rs b/rust/apps/solana/src/message.rs
index fd978ce..dbf0839 100644
--- a/rust/apps/solana/src/message.rs
+++ b/rust/apps/solana/src/message.rs
@@ -19,7 +19,7 @@ struct Signature {
impl Read<Signature> for Signature {
fn read(raw: &mut Vec<u8>) -> Result<Signature> {
if raw.len() < 64 {
- return Err(SolanaError::InvalidData(format!("signature")));
+ return Err(SolanaError::InvalidData("signature".to_string()));
}
Ok(Signature {
value: raw.splice(0..64, []).collect(),
@@ -35,7 +35,7 @@ pub struct Account {
impl Read<Account> for Account {
fn read(raw: &mut Vec<u8>) -> Result<Account> {
if raw.len() < 32 {
- return Err(SolanaError::InvalidData(format!("account")));
+ return Err(SolanaError::InvalidData("account".to_string()));
}
Ok(Account {
value: raw.splice(0..32, []).collect(),
@@ -51,7 +51,7 @@ pub struct BlockHash {
impl Read<BlockHash> for BlockHash {
fn read(raw: &mut Vec<u8>) -> Result<BlockHash> {
if raw.len() < 32 {
- return Err(SolanaError::InvalidData(format!("blockhash")));
+ return Err(SolanaError::InvalidData("blockhash".to_string()));
}
Ok(BlockHash {
value: raw.splice(0..32, []).collect(),
@@ -71,7 +71,7 @@ pub struct Message {
impl Read<Message> for Message {
fn read(raw: &mut Vec<u8>) -> Result<Message> {
- let first_byte = raw.get(0);
+ let first_byte = raw.first();
let is_versioned = match first_byte {
Some(0x80) => true,
Some(_) => false,
diff --git a/rust/apps/solana/src/parser/mod.rs b/rust/apps/solana/src/parser/mod.rs
index 958c23c..9f01995 100644
--- a/rust/apps/solana/src/parser/mod.rs
+++ b/rust/apps/solana/src/parser/mod.rs
@@ -45,7 +45,7 @@ impl ParsedSolanaTx {
.iter()
.filter(|d| Self::is_sqauds_v4_detail(&d.common))
.collect::<Vec<&SolanaDetail>>();
- if squads.len() >= 1 {
+ if !squads.is_empty() {
return SolanaTxDisplayType::SquadsV4;
}
@@ -53,7 +53,7 @@ impl ParsedSolanaTx {
.iter()
.filter(|d| Self::is_jupiter_v6_detail(&d.common))
.collect::<Vec<&SolanaDetail>>();
- if jupiter.len() >= 1 {
+ if !jupiter.is_empty() {
return SolanaTxDisplayType::JupiterV6;
}
@@ -104,11 +104,11 @@ impl ParsedSolanaTx {
}
fn is_unknown_detail(common: &CommonDetail) -> bool {
- common.program.eq("Unknown") && common.method.eq("")
+ common.program.eq("Unknown") && common.method.is_empty()
}
fn is_instructions_detail(common: &CommonDetail) -> bool {
- common.program.eq("Instructions") && common.method.eq("")
+ common.program.eq("Instructions") && common.method.is_empty()
}
fn is_sqauds_v4_detail(common: &CommonDetail) -> bool {
@@ -126,7 +126,7 @@ impl ParsedSolanaTx {
return SolanaDetail {
common: d.common.clone(),
kind: ProgramDetail::GeneralUnknown(
- ProgramDetailGeneralUnknown::from_unknown_detail(&v),
+ ProgramDetailGeneralUnknown::from_unknown_detail(v),
),
};
}
@@ -456,7 +456,7 @@ impl ParsedSolanaTx {
_ => {}
}
}
- return Ok(SolanaOverview::SquadsV4Proposal(proposal_overview_vec));
+ Ok(SolanaOverview::SquadsV4Proposal(proposal_overview_vec))
}
fn build_squads_v4_multisig_overview(details: &[SolanaDetail]) -> Result<SolanaOverview> {
let mut transfer_overview_vec: Vec<ProgramOverviewTransfer> = Vec::new();
@@ -494,7 +494,7 @@ impl ParsedSolanaTx {
.iter()
.map(|m| m.key.to_string())
.collect::<Vec<String>>();
- let total_value = format!("~{:.3} SOL", total_value);
+ let total_value = format!("~{total_value:.3} SOL");
return Ok(SolanaOverview::SquadsV4MultisigCreate(
ProgramOverviewMultisigCreate {
wallet_name,
@@ -522,7 +522,7 @@ impl ParsedSolanaTx {
.iter()
.map(|m| m.key.to_string())
.collect::<Vec<String>>();
- let total_value = format!("~{:.3} SOL", total_value);
+ let total_value = format!("~{total_value:.3} SOL");
return Ok(SolanaOverview::SquadsV4MultisigCreate(
ProgramOverviewMultisigCreate {
wallet_name,
@@ -536,7 +536,7 @@ impl ParsedSolanaTx {
));
}
}
- return Self::build_instructions_overview(details);
+ Self::build_instructions_overview(details)
}
fn build_squads_overview(details: &[SolanaDetail]) -> Result<SolanaOverview> {
if details.iter().any(|d| {
@@ -563,7 +563,7 @@ impl ParsedSolanaTx {
}) {
return Self::build_squads_v4_proposal_overview(details);
}
- return Self::build_instructions_overview(details);
+ Self::build_instructions_overview(details)
}
// util function to check the account is exist in the address lookup table
@@ -700,7 +700,7 @@ impl ParsedSolanaTx {
let token_b_mint = v.accounts[5].clone();
return Ok(Self::genreate_jupiter_swap_overview(
"JupiterV6Route",
- &token_a_mint,
+ token_a_mint,
&token_b_mint,
v.args.slippage_bps,
v.args.platform_fee_bps as u16,
@@ -711,7 +711,7 @@ impl ParsedSolanaTx {
_ => {}
}
}
- return Self::build_instructions_overview(details);
+ Self::build_instructions_overview(details)
}
fn build_instructions_overview(details: &[SolanaDetail]) -> Result<SolanaOverview> {
diff --git a/rust/apps/solana/src/resolvers/mod.rs b/rust/apps/solana/src/resolvers/mod.rs
index 503cb11..3b73124 100644
--- a/rust/apps/solana/src/resolvers/mod.rs
+++ b/rust/apps/solana/src/resolvers/mod.rs
@@ -21,7 +21,6 @@ pub fn format_amount(value: String) -> Result<String> {
return Ok(format!("{} {}", value.div(DIVIDER), "SOL"));
}
Err(SolanaError::ParseTxError(format!(
- "invalid value {:?}",
- value
+ "invalid value {value:?}"
)))
}
diff --git a/rust/apps/solana/src/resolvers/stake.rs b/rust/apps/solana/src/resolvers/stake.rs
index adaad64..23c9ba3 100644
--- a/rust/apps/solana/src/resolvers/stake.rs
+++ b/rust/apps/solana/src/resolvers/stake.rs
@@ -8,7 +8,6 @@ use crate::parser::detail::{
ProgramDetailStakeSetLockup, ProgramDetailStakeSetLockupChecked, ProgramDetailStakeSplit,
ProgramDetailStakeWithdraw, SolanaDetail,
};
-use crate::solana_lib::solana_program::clock::{Epoch, UnixTimestamp};
use crate::solana_lib::solana_program::pubkey::Pubkey;
use crate::solana_lib::solana_program::stake::instruction::{
AuthorizeCheckedWithSeedArgs, AuthorizeWithSeedArgs, LockupArgs, LockupCheckedArgs,
@@ -71,18 +70,15 @@ fn resolve_initialize(
lockup: Lockup,
) -> Result<SolanaDetail> {
let method_name = "Initialize".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let sysvar_rent = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_rent",
- method_name
+ "{method_name}.sysvar_rent"
)))?
.to_string();
let staker = authorized.staker.to_string();
@@ -113,25 +109,20 @@ fn resolve_authorize(
stake_authorize: StakeAuthorize,
) -> Result<SolanaDetail> {
let method_name = "Authorize".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let old_authority_pubkey = accounts
.get(2)
- .ok_or(SolanaError::AccountNotFound(format!(
- "Authorize.old_authority_pubkey"
- )))?
+ .ok_or(SolanaError::AccountNotFound("Authorize.old_authority_pubkey".to_string()))?
.to_string();
let lockup_authority_pubkey = accounts.get(3).unwrap_or(&"".to_string()).to_string();
let new_authority_pubkey = pubkey.to_string();
@@ -158,46 +149,39 @@ fn resolve_authorize(
fn resolve_delegate_stake(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "DelegateStake".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let vote_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let sysvar_stake_history = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_stake_history",
- method_name
+ "{method_name}.sysvar_stake_history"
)))?
.to_string();
let config_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.config_account",
- method_name
+ "{method_name}.config_account"
)))?
.to_string();
let stake_authority_pubkey = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_authority_pubkey",
- method_name
+ "{method_name}.stake_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -218,25 +202,21 @@ fn resolve_delegate_stake(accounts: Vec<String>) -> Result<SolanaDetail> {
fn resolve_split(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail> {
let method_name = "Split".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let target_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.target_account",
- method_name
+ "{method_name}.target_account"
)))?
.to_string();
let stake_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_authority_pubkey",
- method_name
+ "{method_name}.stake_authority_pubkey"
)))?
.to_string();
let amount = lamports.to_string();
@@ -256,39 +236,33 @@ fn resolve_split(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail> {
fn resolve_withdraw(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail> {
let method_name = "Withdraw".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let recipient = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let sysvar_stake_history = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_stake_history",
- method_name
+ "{method_name}.sysvar_stake_history"
)))?
.to_string();
let withdraw_authority_pubkey = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.withdraw_authority_pubkey",
- method_name
+ "{method_name}.withdraw_authority_pubkey"
)))?
.to_string();
let stake_authority_pubkey = accounts.get(5).unwrap_or(&"".to_string()).to_string();
@@ -312,25 +286,21 @@ fn resolve_withdraw(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail
fn resolve_deactivate(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "Deactivate".to_string();
- let delegated_stake_account = accounts
- .get(0)
+ let delegated_stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.delegated_stake_account",
- method_name
+ "{method_name}.delegated_stake_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let stake_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_authority_pubkey",
- method_name
+ "{method_name}.stake_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -348,22 +318,19 @@ fn resolve_deactivate(accounts: Vec<String>) -> Result<SolanaDetail> {
fn resolve_set_lockup(accounts: Vec<String>, lockup: LockupArgs) -> Result<SolanaDetail> {
let method_name = "SetLockup".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let lockup_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lockup_authority_pubkey",
- method_name
+ "{method_name}.lockup_authority_pubkey"
)))?
.to_string();
- let unix_timestamp = lockup.unix_timestamp.unwrap_or(UnixTimestamp::default());
- let epoch = lockup.epoch.unwrap_or(Epoch::default());
+ let unix_timestamp = lockup.unix_timestamp.unwrap_or_default();
+ let epoch = lockup.epoch.unwrap_or_default();
let custodian = lockup
.custodian
.map_or_else(|| "".to_string(), |v| v.to_string());
@@ -384,39 +351,33 @@ fn resolve_set_lockup(accounts: Vec<String>, lockup: LockupArgs) -> Result<Solan
fn resolve_merge(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "Merge".to_string();
- let destination_stake_account = accounts
- .get(0)
+ let destination_stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_stake_account",
- method_name
+ "{method_name}.destination_stake_account"
)))?
.to_string();
let source_stake_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_stake_account",
- method_name
+ "{method_name}.source_stake_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let sysvar_stake_history = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_stake_history",
- method_name
+ "{method_name}.sysvar_stake_history"
)))?
.to_string();
let stake_authority_pubkey = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_authority_pubkey",
- method_name
+ "{method_name}.stake_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -439,25 +400,21 @@ fn resolve_authorize_with_seed(
args: AuthorizeWithSeedArgs,
) -> Result<SolanaDetail> {
let method_name = "AuthorizeWithSeed".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let old_base_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_base_pubkey",
- method_name
+ "{method_name}.old_base_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let lockup_authority_pubkey = accounts.get(3).unwrap_or(&"".to_string()).to_string();
@@ -489,32 +446,27 @@ fn resolve_authorize_with_seed(
fn resolve_initialize_checked(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "InitializeChecked".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let sysvar_rent = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_rent",
- method_name
+ "{method_name}.sysvar_rent"
)))?
.to_string();
let stake_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_authority_pubkey",
- method_name
+ "{method_name}.stake_authority_pubkey"
)))?
.to_string();
let withdraw_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.withdraw_authority_pubkey",
- method_name
+ "{method_name}.withdraw_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -536,32 +488,27 @@ fn resolve_authorize_checked(
stake_authorize: StakeAuthorize,
) -> Result<SolanaDetail> {
let method_name = "AuthorizeChecked".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let old_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_authority_pubkey",
- method_name
+ "{method_name}.old_authority_pubkey"
)))?
.to_string();
let new_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.new_authority_pubkey",
- method_name
+ "{method_name}.new_authority_pubkey"
)))?
.to_string();
let lockup_authority_pubkey = accounts.get(4).unwrap_or(&"".to_string()).to_string();
@@ -591,32 +538,27 @@ fn resolve_authorize_checked_with_seed(
args: AuthorizeCheckedWithSeedArgs,
) -> Result<SolanaDetail> {
let method_name = "AuthorizeCheckedWithSeed".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let old_base_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_base_pubkey",
- method_name
+ "{method_name}.old_base_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let new_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.new_authority_pubkey",
- method_name
+ "{method_name}.new_authority_pubkey"
)))?
.to_string();
let lockup_authority = accounts.get(4).unwrap_or(&"".to_string()).to_string();
@@ -652,24 +594,21 @@ fn resolve_set_lockup_checked(
args: LockupCheckedArgs,
) -> Result<SolanaDetail> {
let method_name = "SetLockupChecked".to_string();
- let stake_account = accounts
- .get(0)
+ let stake_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.stake_account",
- method_name
+ "{method_name}.stake_account"
)))?
.to_string();
let lockup_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.authority_pubkey",
- method_name
+ "{method_name}.authority_pubkey"
)))?
.to_string();
let new_lockup_authority_pubkey = accounts.get(2).unwrap_or(&"".to_string()).to_string();
- let timestamp = args.unix_timestamp.unwrap_or(UnixTimestamp::default());
- let epoch = args.epoch.unwrap_or(Epoch::default());
+ let timestamp = args.unix_timestamp.unwrap_or_default();
+ let epoch = args.epoch.unwrap_or_default();
Ok(SolanaDetail {
common: CommonDetail {
method: method_name.to_string(),
diff --git a/rust/apps/solana/src/resolvers/system.rs b/rust/apps/solana/src/resolvers/system.rs
index 34608d9..739f05d 100644
--- a/rust/apps/solana/src/resolvers/system.rs
+++ b/rust/apps/solana/src/resolvers/system.rs
@@ -69,8 +69,7 @@ fn resolve_create_account(
owner: Pubkey,
) -> Result<SolanaDetail> {
let method_name = "CreateAccount".to_string();
- let funding_account = accounts
- .get(0)
+ let funding_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(
"CreateAccount.funding_account".to_string(),
))?
@@ -101,9 +100,8 @@ fn resolve_create_account(
fn resolve_assign(accounts: Vec<String>, owner: Pubkey) -> Result<SolanaDetail> {
let method_name = "Assign".to_string();
- let account = accounts.get(0).ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ let account = accounts.first().ok_or(SolanaError::AccountNotFound(format!(
+ "{method_name}.account"
)))?;
let new_owner = owner.to_string();
Ok(SolanaDetail {
@@ -120,18 +118,15 @@ fn resolve_assign(accounts: Vec<String>, owner: Pubkey) -> Result<SolanaDetail>
fn resolve_transfer(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail> {
let method_name = "Transfer".to_string();
- let from = accounts
- .get(0)
+ let from = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.from",
- method_name
+ "{method_name}.from"
)))?
.to_string();
let to = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let value = format_amount(lamports.to_string())?;
@@ -153,18 +148,15 @@ fn resolve_create_account_with_seed(
owner: Pubkey,
) -> Result<SolanaDetail> {
let method_name = "CreateAccountWithSeed".to_string();
- let funding_account = accounts
- .get(0)
+ let funding_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.funding_account",
- method_name
+ "{method_name}.funding_account"
)))?
.to_string();
let new_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.new_account",
- method_name
+ "{method_name}.new_account"
)))?
.to_string();
let base_account = accounts.get(2).unwrap_or(&"".to_string()).to_string();
@@ -194,25 +186,21 @@ fn resolve_create_account_with_seed(
fn resolve_advance_nonce_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "AdvanceNonceAccount".to_string();
- let nonce_account = accounts
- .get(0)
+ let nonce_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.nonce_account",
- method_name
+ "{method_name}.nonce_account"
)))?
.to_string();
let recent_blockhashes_sysvar = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recent_blockhashes_sysvar",
- method_name
+ "{method_name}.recent_blockhashes_sysvar"
)))?
.to_string();
let nonce_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.nonce_authority_pubkey",
- method_name
+ "{method_name}.nonce_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -230,39 +218,33 @@ fn resolve_advance_nonce_account(accounts: Vec<String>) -> Result<SolanaDetail>
fn resolve_withdraw_nonce_account(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail> {
let method_name = "WithdrawNonceAccount".to_string();
- let nonce_account = accounts
- .get(0)
+ let nonce_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.nonce_account",
- method_name
+ "{method_name}.nonce_account"
)))?
.to_string();
let recipient = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let recent_blockhashes_sysvar = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recent_blockhashes_sysvar",
- method_name
+ "{method_name}.recent_blockhashes_sysvar"
)))?
.to_string();
let rent_sysvar = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.rent_sysvar",
- method_name
+ "{method_name}.rent_sysvar"
)))?
.to_string();
let nonce_authority_pubkey = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.nonce_authority_pubkey",
- method_name
+ "{method_name}.nonce_authority_pubkey"
)))?
.to_string();
let amount = lamports.to_string();
@@ -284,25 +266,21 @@ fn resolve_withdraw_nonce_account(accounts: Vec<String>, lamports: u64) -> Resul
fn resolve_initialize_nonce_account(accounts: Vec<String>, pubkey: Pubkey) -> Result<SolanaDetail> {
let method_name = "InitializeNonceAccount".to_string();
- let nonce_account = accounts
- .get(0)
+ let nonce_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.nonce_account",
- method_name
+ "{method_name}.nonce_account"
)))?
.to_string();
let sysvar_recent_blockhashes = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_recent_blockhashes",
- method_name
+ "{method_name}.sysvar_recent_blockhashes"
)))?
.to_string();
let sysvar_rent = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_rent",
- method_name
+ "{method_name}.sysvar_rent"
)))?
.to_string();
let nonce_authority_pubkey = pubkey.to_string();
@@ -324,18 +302,15 @@ fn resolve_initialize_nonce_account(accounts: Vec<String>, pubkey: Pubkey) -> Re
fn resolve_authorize_nonce_account(accounts: Vec<String>, pubkey: Pubkey) -> Result<SolanaDetail> {
let method_name = "AuthorizeNonceAccount".to_string();
- let nonce_account = accounts
- .get(0)
+ let nonce_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.nonce_account",
- method_name
+ "{method_name}.nonce_account"
)))?
.to_string();
let old_nonce_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_nonce_authority_pubkey",
- method_name
+ "{method_name}.old_nonce_authority_pubkey"
)))?
.to_string();
let new_nonce_authority_pubkey = pubkey.to_string();
@@ -356,11 +331,9 @@ fn resolve_authorize_nonce_account(accounts: Vec<String>, pubkey: Pubkey) -> Res
fn resolve_allocate(accounts: Vec<String>, space: u64) -> Result<SolanaDetail> {
let method_name = "Allocate".to_string();
- let new_account = accounts
- .get(0)
+ let new_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
Ok(SolanaDetail {
@@ -383,18 +356,15 @@ fn resolve_allocate_with_seed(
space: u64,
) -> Result<SolanaDetail> {
let method_name = "AllocateWithSeed".to_string();
- let allocated_account = accounts
- .get(0)
+ let allocated_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.allocated_account",
- method_name
+ "{method_name}.allocated_account"
)))?
.to_string();
let base_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.base_account",
- method_name
+ "{method_name}.base_account"
)))?
.to_string();
let owner = owner.to_string();
@@ -423,18 +393,15 @@ fn resolve_assign_with_seed(
base_pubkey: Pubkey,
) -> Result<SolanaDetail> {
let method_name = "AssignWithSeed".to_string();
- let assigned_account = accounts
- .get(0)
+ let assigned_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.assigned_account",
- method_name
+ "{method_name}.assigned_account"
)))?
.to_string();
let base_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.base_account",
- method_name
+ "{method_name}.base_account"
)))?
.to_string();
Ok(SolanaDetail {
@@ -459,25 +426,21 @@ fn resolve_transfer_with_seed(
from_owner: Pubkey,
) -> Result<SolanaDetail> {
let method_name = "TransferWithSeed".to_string();
- let from = accounts
- .get(0)
+ let from = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.from",
- method_name
+ "{method_name}.from"
)))?
.to_string();
let from_base_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.from_base_pubkey",
- method_name
+ "{method_name}.from_base_pubkey"
)))?
.to_string();
let recipient = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let amount = format_amount(lamports.to_string())?;
@@ -500,8 +463,7 @@ fn resolve_transfer_with_seed(
fn resolve_upgrade_nonce_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "UpgradeNonceAccount".to_string();
- let nonce_account = accounts
- .get(0)
+ let nonce_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(
"UpgradeNonceAccount.nonce_account".to_string(),
))?
diff --git a/rust/apps/solana/src/resolvers/token.rs b/rust/apps/solana/src/resolvers/token.rs
index 7fab364..1e10f65 100644
--- a/rust/apps/solana/src/resolvers/token.rs
+++ b/rust/apps/solana/src/resolvers/token.rs
@@ -82,18 +82,15 @@ fn initialize_mint(
freeze_authority_pubkey: COption<Pubkey>,
) -> Result<SolanaDetail> {
let method_name = "InitializeMint";
- let mint = accounts
- .get(0)
+ let mint = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let sysver_rent = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysver_rent",
- method_name
+ "{method_name}.sysver_rent"
)))?
.to_string();
let mint_authority_pubkey = mint_authority_pubkey.to_string().to_string();
@@ -118,32 +115,27 @@ fn initialize_mint(
fn initialize_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "InitializeAccount";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let sysver_rent = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysver_rent",
- method_name
+ "{method_name}.sysver_rent"
)))?
.to_string();
Ok(SolanaDetail {
@@ -163,18 +155,15 @@ fn initialize_account(accounts: Vec<String>) -> Result<SolanaDetail> {
fn initialize_multisig(accounts: Vec<String>, m: u8) -> Result<SolanaDetail> {
let method_name = "InitializeMultisig";
- let multisig_account = accounts
- .get(0)
+ let multisig_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.multisig_account",
- method_name
+ "{method_name}.multisig_account"
)))?
.to_string();
let sysvar_rent = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_rent",
- method_name
+ "{method_name}.sysvar_rent"
)))?
.to_string();
let attendees = accounts[2..].to_vec();
@@ -196,18 +185,15 @@ fn initialize_multisig(accounts: Vec<String>, m: u8) -> Result<SolanaDetail> {
fn transfer(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let method_name = "Transfer";
- let source_account = accounts
- .get(0)
+ let source_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_account",
- method_name
+ "{method_name}.source_account"
)))?
.to_string();
let recipient = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let amount = amount.to_string();
@@ -215,8 +201,7 @@ fn transfer(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -236,7 +221,7 @@ fn transfer(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
}
let owner = accounts
.get(2)
- .ok_or(SolanaError::AccountNotFound(format!("Transfer.owner")))?
+ .ok_or(SolanaError::AccountNotFound("Transfer.owner".to_string()))?
.to_string();
Ok(SolanaDetail {
common: CommonDetail {
@@ -256,18 +241,15 @@ fn transfer(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
fn approve(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let method_name = "Approve";
- let source_account = accounts
- .get(0)
+ let source_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_account",
- method_name
+ "{method_name}.source_account"
)))?
.to_string();
let delegate_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.delegate_account",
- method_name
+ "{method_name}.delegate_account"
)))?
.to_string();
let amount = amount.to_string();
@@ -275,8 +257,7 @@ fn approve(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -297,8 +278,7 @@ fn approve(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
Ok(SolanaDetail {
@@ -319,19 +299,16 @@ fn approve(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
fn revoke(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "Revoke";
- let source_account = accounts
- .get(0)
+ let source_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_account",
- method_name
+ "{method_name}.source_account"
)))?
.to_string();
if is_multisig(&accounts, 2) {
let owner = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[2..].to_vec());
@@ -350,8 +327,7 @@ fn revoke(accounts: Vec<String>) -> Result<SolanaDetail> {
let owner = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
Ok(SolanaDetail {
@@ -374,11 +350,9 @@ fn set_authority(
) -> Result<SolanaDetail> {
let method_name = "SetAuthority";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let authority_type = match authority_type {
@@ -394,8 +368,7 @@ fn set_authority(
let old_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_authority_pubkey",
- method_name
+ "{method_name}.old_authority_pubkey"
)))?
.to_string();
let signers = Some(accounts[2..].to_vec());
@@ -416,8 +389,7 @@ fn set_authority(
let old_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_authority_pubkey",
- method_name
+ "{method_name}.old_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -439,18 +411,15 @@ fn set_authority(
fn mint_to(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let method_name = "MintTo";
- let mint = accounts
- .get(0)
+ let mint = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let mint_to_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_to_account",
- method_name
+ "{method_name}.mint_to_account"
)))?
.to_string();
let amount = amount.to_string();
@@ -458,8 +427,7 @@ fn mint_to(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let mint_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_authority_pubkey",
- method_name
+ "{method_name}.mint_authority_pubkey"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -480,8 +448,7 @@ fn mint_to(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let mint_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_authority_pubkey",
- method_name
+ "{method_name}.mint_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -503,18 +470,15 @@ fn mint_to(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
fn burn(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let method_name = "Burn";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let amount = amount.to_string();
@@ -522,8 +486,7 @@ fn burn(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -544,8 +507,7 @@ fn burn(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
Ok(SolanaDetail {
@@ -566,26 +528,22 @@ fn burn(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
fn close_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "CloseAccount";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let recipient = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
if is_multisig(&accounts, 3) {
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -604,7 +562,7 @@ fn close_account(accounts: Vec<String>) -> Result<SolanaDetail> {
} else {
let owner = accounts
.get(2)
- .ok_or(SolanaError::AccountNotFound(format!("CloseAccount.owner")))?
+ .ok_or(SolanaError::AccountNotFound("CloseAccount.owner".to_string()))?
.to_string();
Ok(SolanaDetail {
common: CommonDetail {
@@ -623,26 +581,22 @@ fn close_account(accounts: Vec<String>) -> Result<SolanaDetail> {
fn freeze_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "FreezeAccount";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
if is_multisig(&accounts, 3) {
let mint_freeze_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_freeze_authority_pubkey",
- method_name
+ "{method_name}.mint_freeze_authority_pubkey"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -662,8 +616,7 @@ fn freeze_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let mint_freeze_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_freeze_authority_pubkey",
- method_name
+ "{method_name}.mint_freeze_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -683,26 +636,22 @@ fn freeze_account(accounts: Vec<String>) -> Result<SolanaDetail> {
fn thaw_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "ThawAccount";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
if is_multisig(&accounts, 3) {
let mint_freeze_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_freeze_authority_pubkey",
- method_name
+ "{method_name}.mint_freeze_authority_pubkey"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -722,8 +671,7 @@ fn thaw_account(accounts: Vec<String>) -> Result<SolanaDetail> {
let mint_freeze_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_freeze_authority_pubkey",
- method_name
+ "{method_name}.mint_freeze_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -744,32 +692,27 @@ fn thaw_account(accounts: Vec<String>) -> Result<SolanaDetail> {
fn transfer_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<SolanaDetail> {
let method_name = "TransferChecked";
if is_multisig(&accounts, 4) {
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let recipient = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let owner = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[4..].to_vec());
@@ -790,32 +733,27 @@ fn transfer_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<
}),
})
} else {
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let recipient = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let owner = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let amount = amount.to_string();
@@ -840,32 +778,27 @@ fn transfer_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<
fn approve_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<SolanaDetail> {
let method_name = "ApproveChecked";
if is_multisig(&accounts, 4) {
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let delegate = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.delegate",
- method_name
+ "{method_name}.delegate"
)))?
.to_string();
let owner = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[4..].to_vec());
@@ -886,32 +819,27 @@ fn approve_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<S
}),
})
} else {
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let delegate = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.delegate",
- method_name
+ "{method_name}.delegate"
)))?
.to_string();
let owner = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let amount = amount.to_string();
@@ -935,18 +863,15 @@ fn approve_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<S
fn mint_to_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<SolanaDetail> {
let method_name = "MintToChecked";
- let mint = accounts
- .get(0)
+ let mint = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let mint_to_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_to_account",
- method_name
+ "{method_name}.mint_to_account"
)))?
.to_string();
let amount = amount.to_string();
@@ -954,8 +879,7 @@ fn mint_to_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<S
let mint_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_authority_pubkey",
- method_name
+ "{method_name}.mint_authority_pubkey"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -977,8 +901,7 @@ fn mint_to_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<S
let mint_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint_authority_pubkey",
- method_name
+ "{method_name}.mint_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -1000,18 +923,15 @@ fn mint_to_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<S
fn burn_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<SolanaDetail> {
let method_name = "BurnChecked";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let amount = amount.to_string();
@@ -1019,8 +939,7 @@ fn burn_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<Sola
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
let signers = Some(accounts[3..].to_vec());
@@ -1042,8 +961,7 @@ fn burn_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<Sola
let owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.owner",
- method_name
+ "{method_name}.owner"
)))?
.to_string();
Ok(SolanaDetail {
@@ -1065,25 +983,21 @@ fn burn_checked(accounts: Vec<String>, decimals: u8, amount: u64) -> Result<Sola
fn initialize_account_2(accounts: Vec<String>, owner: Pubkey) -> Result<SolanaDetail> {
let method_name = "InitializeAccount2";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let sysver_rent = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysver_rent",
- method_name
+ "{method_name}.sysver_rent"
)))?
.to_string();
let owner = owner.to_string();
@@ -1103,11 +1017,9 @@ fn initialize_account_2(accounts: Vec<String>, owner: Pubkey) -> Result<SolanaDe
fn sync_native(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "SyncNative";
- let account_to_sync = accounts
- .get(0)
+ let account_to_sync = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account_to_sync",
- method_name
+ "{method_name}.account_to_sync"
)))?
.to_string();
Ok(SolanaDetail {
@@ -1121,18 +1033,15 @@ fn sync_native(accounts: Vec<String>) -> Result<SolanaDetail> {
fn initialize_account_3(accounts: Vec<String>, owner: Pubkey) -> Result<SolanaDetail> {
let method_name = "InitializeAccount3";
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let mint = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let owner = owner.to_string();
@@ -1151,11 +1060,9 @@ fn initialize_account_3(accounts: Vec<String>, owner: Pubkey) -> Result<SolanaDe
fn initialize_multisig_2(accounts: Vec<String>, m: u8) -> Result<SolanaDetail> {
let method_name = "InitializeMultisig2";
- let multisig_account = accounts
- .get(0)
+ let multisig_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.multisig_account",
- method_name
+ "{method_name}.multisig_account"
)))?
.to_string();
let attendees = accounts[1..].to_vec();
@@ -1180,11 +1087,9 @@ fn initialize_mint_2(
freeze_authority_pubkey: COption<Pubkey>,
) -> Result<SolanaDetail> {
let method_name = "InitializeMint2";
- let mint = accounts
- .get(0)
+ let mint = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.mint",
- method_name
+ "{method_name}.mint"
)))?
.to_string();
let mint_authority_pubkey = mint_authority_pubkey.to_string();
diff --git a/rust/apps/solana/src/resolvers/token_lending.rs b/rust/apps/solana/src/resolvers/token_lending.rs
index 11162b2..2288363 100644
--- a/rust/apps/solana/src/resolvers/token_lending.rs
+++ b/rust/apps/solana/src/resolvers/token_lending.rs
@@ -66,37 +66,32 @@ fn init_lending_market(
quote_currency: [u8; 32],
) -> Result<SolanaDetail> {
let method_name = "InitLendingMarket";
- let lending_market_account = accounts
- .get(0)
+ let lending_market_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name,
+ "{method_name}.lending_market_account",
)))?
.to_string();
let sysvar_rent = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let token_program_id = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
let oracle_program_id = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.oracle_program_id",
- method_name
+ "{method_name}.oracle_program_id"
)))?
.to_string();
let owner = owner.to_string();
let quote_currency = str::from_utf8("e_currency)
- .map_err(|_| SolanaError::InvalidData(format!("{}.quote_currency", method_name)))?
+ .map_err(|_| SolanaError::InvalidData(format!("{method_name}.quote_currency")))?
.to_string();
Ok(SolanaDetail {
common: CommonDetail {
@@ -116,18 +111,15 @@ fn init_lending_market(
fn set_lending_market_owner(accounts: Vec<String>, new_owner: Pubkey) -> Result<SolanaDetail> {
let method_name = "SetLendingMarketOwner";
- let lending_market_account = accounts
- .get(0)
+ let lending_market_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name,
+ "{method_name}.lending_market_account",
)))?
.to_string();
let current_owner = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.current_owner",
- method_name
+ "{method_name}.current_owner"
)))?
.to_string();
let new_owner = new_owner.to_string();
@@ -152,123 +144,105 @@ fn init_reserve(
config: ReserveConfig,
) -> Result<SolanaDetail> {
let method_name = "SetLendingMarketOwner";
- let source_liquidity_account = accounts
- .get(0)
+ let source_liquidity_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_liquidity_account",
- method_name,
+ "{method_name}.source_liquidity_account",
)))?
.to_string();
let destination_collateral_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_collateral_account",
- method_name
+ "{method_name}.destination_collateral_account"
)))?
.to_string();
let reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_account",
- method_name
+ "{method_name}.reserve_account"
)))?
.to_string();
let reserve_liquidity_mint = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_liquidity_mint",
- method_name
+ "{method_name}.reserve_liquidity_mint"
)))?
.to_string();
let reserve_liquidity_supply_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_liquidity_supply_account",
- method_name
+ "{method_name}.reserve_liquidity_supply_account"
)))?
.to_string();
let reserve_liquidity_fee_receiver = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_liquidity_fee_receiver",
- method_name
+ "{method_name}.reserve_liquidity_fee_receiver"
)))?
.to_string();
let reserve_collateral_mint = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_collateral_mint",
- method_name
+ "{method_name}.reserve_collateral_mint"
)))?
.to_string();
let reserve_collateral_supply_pubkey = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_collateral_supply_pubkey",
- method_name
+ "{method_name}.reserve_collateral_supply_pubkey"
)))?
.to_string();
let pyth_product_account = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pyth_product_account",
- method_name
+ "{method_name}.pyth_product_account"
)))?
.to_string();
let pyth_price_account = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pyth_price_account",
- method_name
+ "{method_name}.pyth_price_account"
)))?
.to_string();
let lending_market_account = accounts
.get(10)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let lending_market_authority_pubkey = accounts
.get(11)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let lending_market_owner = accounts
.get(12)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_owner",
- method_name
+ "{method_name}.lending_market_owner"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(13)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(14)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let sysvar_rent = accounts
.get(15)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_rent",
- method_name
+ "{method_name}.sysvar_rent"
)))?
.to_string();
let token_program_id = accounts
.get(16)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
let liquidity_amount = liquidity_amount.to_string();
@@ -303,25 +277,21 @@ fn init_reserve(
fn refresh_reserve(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "RefreshReserve";
- let reserve_account = accounts
- .get(0)
+ let reserve_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_account",
- method_name,
+ "{method_name}.reserve_account",
)))?
.to_string();
let reserve_liquidity_oracle_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_liquidity_oracle_account",
- method_name
+ "{method_name}.reserve_liquidity_oracle_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
Ok(SolanaDetail {
@@ -339,74 +309,63 @@ fn refresh_reserve(accounts: Vec<String>) -> Result<SolanaDetail> {
fn deposit_reserve_liquidity(accounts: Vec<String>, liquidity_amount: u64) -> Result<SolanaDetail> {
let method_name = "DepositReserveLiquidity";
- let source_liquidity_account = accounts
- .get(0)
+ let source_liquidity_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_liquidity_account",
- method_name,
+ "{method_name}.source_liquidity_account",
)))?
.to_string();
let destination_collateral_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_collateral_account",
- method_name
+ "{method_name}.destination_collateral_account"
)))?
.to_string();
let reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_account",
- method_name
+ "{method_name}.reserve_account"
)))?
.to_string();
let reserve_liquidity_supply_account = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_liquidity_supply_account",
- method_name
+ "{method_name}.reserve_liquidity_supply_account"
)))?
.to_string();
let reserve_collateral_mint = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_collateral_mint",
- method_name
+ "{method_name}.reserve_collateral_mint"
)))?
.to_string();
let lending_market_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let lending_market_authority_pubkey = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let token_program_id = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
let liquidity_amount = liquidity_amount.to_string();
@@ -438,74 +397,63 @@ fn redeem_reserve_collateral(
collateral_amount: u64,
) -> Result<SolanaDetail> {
let method_name = "RedeemReserveCollateral";
- let source_collateral_account = accounts
- .get(0)
+ let source_collateral_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_collateral_account",
- method_name,
+ "{method_name}.source_collateral_account",
)))?
.to_string();
let destination_liquidity_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_liquidity_account",
- method_name
+ "{method_name}.destination_liquidity_account"
)))?
.to_string();
let reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_account",
- method_name
+ "{method_name}.reserve_account"
)))?
.to_string();
let reserve_collateral_mint = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_collateral_mint",
- method_name
+ "{method_name}.reserve_collateral_mint"
)))?
.to_string();
let reserve_liquidity_supply_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_liquidity_supply_account",
- method_name
+ "{method_name}.reserve_liquidity_supply_account"
)))?
.to_string();
let lending_market_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let lending_market_authority_pubkey = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let token_program_id = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
Ok(SolanaDetail {
@@ -533,46 +481,39 @@ fn redeem_reserve_collateral(
fn init_obligation(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "InitObligation";
- let obligation_account = accounts
- .get(0)
+ let obligation_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_account",
- method_name,
+ "{method_name}.obligation_account",
)))?
.to_string();
let lending_market_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let obligation_owner = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_owner",
- method_name
+ "{method_name}.obligation_owner"
)))?
.to_string();
let sysvar_clock = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let sysvar_rent = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_rent",
- method_name
+ "{method_name}.sysvar_rent"
)))?
.to_string();
let token_program_id = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -593,18 +534,15 @@ fn init_obligation(accounts: Vec<String>) -> Result<SolanaDetail> {
fn refresh_obligation(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "RefreshObligation";
- let obligation_account = accounts
- .get(0)
+ let obligation_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_account",
- method_name,
+ "{method_name}.obligation_account",
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let keys = accounts[2..].to_vec();
@@ -626,67 +564,57 @@ fn deposit_obligation_collateral(
collateral_amount: u64,
) -> Result<SolanaDetail> {
let method_name = "DepositObligationCollateral";
- let source_collateral_account = accounts
- .get(0)
+ let source_collateral_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_collateral_account",
- method_name,
+ "{method_name}.source_collateral_account",
)))?
.to_string();
let destination_collateral_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_collateral_account",
- method_name
+ "{method_name}.destination_collateral_account"
)))?
.to_string();
let deposit_reserve_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.deposit_reserve_pubkey",
- method_name
+ "{method_name}.deposit_reserve_pubkey"
)))?
.to_string();
let obligation_account = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_account",
- method_name
+ "{method_name}.obligation_account"
)))?
.to_string();
let lending_market_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let obligation_owner = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_owner",
- method_name
+ "{method_name}.obligation_owner"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let token_program_id = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -716,67 +644,57 @@ fn withdraw_obligation_collateral(
collateral_amount: u64,
) -> Result<SolanaDetail> {
let method_name = "WithdrawObligationCollateral";
- let source_collateral_account = accounts
- .get(0)
+ let source_collateral_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_collateral_account",
- method_name,
+ "{method_name}.source_collateral_account",
)))?
.to_string();
let destination_collateral_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_collateral_account",
- method_name
+ "{method_name}.destination_collateral_account"
)))?
.to_string();
let withdraw_reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.deposit_reserve_pubkey",
- method_name
+ "{method_name}.deposit_reserve_pubkey"
)))?
.to_string();
let obligation_account = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_account",
- method_name
+ "{method_name}.obligation_account"
)))?
.to_string();
let lending_market_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let lending_market_authority_pubkey = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let obligation_owner = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_owner",
- method_name
+ "{method_name}.obligation_owner"
)))?
.to_string();
let sysvar_clock = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let token_program_id = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -806,74 +724,63 @@ fn borrow_obligation_liquidity(
liquidity_amount: u64,
) -> Result<SolanaDetail> {
let method_name = "BorrowObligationLiquidity";
- let source_liquidity_account = accounts
- .get(0)
+ let source_liquidity_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_liquidity_account",
- method_name,
+ "{method_name}.source_liquidity_account",
)))?
.to_string();
let destination_liquidity_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_liquidity_account",
- method_name
+ "{method_name}.destination_liquidity_account"
)))?
.to_string();
let borrow_reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.borrow_reserve_account",
- method_name
+ "{method_name}.borrow_reserve_account"
)))?
.to_string();
let borrow_reserve_liquidity_fee_receiver_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.borrow_reserve_liquidity_fee_receiver_pubkey",
- method_name
+ "{method_name}.borrow_reserve_liquidity_fee_receiver_pubkey"
)))?
.to_string();
let obligation_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_account",
- method_name
+ "{method_name}.obligation_account"
)))?
.to_string();
let lending_market_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let lending_market_authority_pubkey = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let obligation_owner = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_owner",
- method_name
+ "{method_name}.obligation_owner"
)))?
.to_string();
let sysvar_clock = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let token_program_id = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
let host_fee_receiver = accounts.get(10).unwrap_or(&"".to_string()).to_string();
@@ -907,60 +814,51 @@ fn repay_obligation_liquidity(
) -> Result<SolanaDetail> {
let method_name = "RepayObligationLiquidity";
- let source_liquidity_account = accounts
- .get(0)
+ let source_liquidity_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_liquidity_account",
- method_name,
+ "{method_name}.source_liquidity_account",
)))?
.to_string();
let destination_liquidity_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_liquidity_account",
- method_name
+ "{method_name}.destination_liquidity_account"
)))?
.to_string();
let repay_reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.repay_reserve_account",
- method_name
+ "{method_name}.repay_reserve_account"
)))?
.to_string();
let obligation_account = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_account",
- method_name
+ "{method_name}.obligation_account"
)))?
.to_string();
let lending_market_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let token_program_id = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -986,88 +884,75 @@ fn repay_obligation_liquidity(
fn liquidate_obligation(accounts: Vec<String>, liquidity_amount: u64) -> Result<SolanaDetail> {
let method_name = "LiquidateObligation";
- let source_liquidity_account = accounts
- .get(0)
+ let source_liquidity_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_liquidity_account",
- method_name,
+ "{method_name}.source_liquidity_account",
)))?
.to_string();
let destination_collateral_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_collateral_account",
- method_name
+ "{method_name}.destination_collateral_account"
)))?
.to_string();
let repay_reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.repay_reserve_account",
- method_name
+ "{method_name}.repay_reserve_account"
)))?
.to_string();
let repay_reserve_liquidity_supply_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.repay_reserve_liquidity_supply_pubkey",
- method_name
+ "{method_name}.repay_reserve_liquidity_supply_pubkey"
)))?
.to_string();
let withdraw_reserve_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.withdraw_reserve_account",
- method_name
+ "{method_name}.withdraw_reserve_account"
)))?
.to_string();
let withdraw_reserve_collateral_supply_pubkey = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.withdraw_reserve_collateral_supply_pubkey",
- method_name
+ "{method_name}.withdraw_reserve_collateral_supply_pubkey"
)))?
.to_string();
let obligation_account = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.obligation_account",
- method_name
+ "{method_name}.obligation_account"
)))?
.to_string();
let lending_market_account = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let lending_market_authority_pubkey = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let sysvar_clock = accounts
.get(10)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let token_program_id = accounts
.get(11)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -1095,67 +980,57 @@ fn liquidate_obligation(accounts: Vec<String>, liquidity_amount: u64) -> Result<
fn flash_loan(accounts: Vec<String>, amount: u64) -> Result<SolanaDetail> {
let method_name = "FlashLoan";
- let source_liquidity_account = accounts
- .get(0)
+ let source_liquidity_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_liquidity_account",
- method_name,
+ "{method_name}.source_liquidity_account",
)))?
.to_string();
let destination_liquidity_account = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_liquidity_account",
- method_name
+ "{method_name}.destination_liquidity_account"
)))?
.to_string();
let reserve_account = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_account",
- method_name
+ "{method_name}.reserve_account"
)))?
.to_string();
let reserve_liquidity_fee_receiver = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.reserve_liquidity_fee_receiver",
- method_name
+ "{method_name}.reserve_liquidity_fee_receiver"
)))?
.to_string();
let host_fee_receiver = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.host_fee_receiver",
- method_name
+ "{method_name}.host_fee_receiver"
)))?
.to_string();
let lending_market_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_account",
- method_name
+ "{method_name}.lending_market_account"
)))?
.to_string();
let lending_market_authority_pubkey = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.lending_market_authority_pubkey",
- method_name
+ "{method_name}.lending_market_authority_pubkey"
)))?
.to_string();
let token_program_id = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
let flash_loan_receiver_program_id = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.flash_loan_receiver_program_id",
- method_name
+ "{method_name}.flash_loan_receiver_program_id"
)))?
.to_string();
let flash_loan_receiver_program_accounts = accounts[9..].to_vec();
diff --git a/rust/apps/solana/src/resolvers/token_swap_v3.rs b/rust/apps/solana/src/resolvers/token_swap_v3.rs
index 0efad5c..662a1cc 100644
--- a/rust/apps/solana/src/resolvers/token_swap_v3.rs
+++ b/rust/apps/solana/src/resolvers/token_swap_v3.rs
@@ -32,60 +32,51 @@ pub fn resolve(instruction: SwapInstruction, accounts: Vec<String>) -> Result<So
fn initialize(accounts: Vec<String>, initialize: Initialize) -> Result<SolanaDetail> {
let method_name = "Initialize";
- let token_swap = accounts
- .get(0)
+ let token_swap = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_swap",
- method_name
+ "{method_name}.token_swap"
)))?
.to_string();
let swap_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.swap_authority_pubkey",
- method_name
+ "{method_name}.swap_authority_pubkey"
)))?
.to_string();
let token_a = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_a",
- method_name
+ "{method_name}.token_a"
)))?
.to_string();
let token_b = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_b",
- method_name
+ "{method_name}.token_b"
)))?
.to_string();
let pool_mint = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_mint",
- method_name
+ "{method_name}.pool_mint"
)))?
.to_string();
let pool_token_account_1 = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_token_account_1",
- method_name
+ "{method_name}.pool_token_account_1"
)))?
.to_string();
let pool_token_account_2 = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_token_account_2",
- method_name
+ "{method_name}.pool_token_account_2"
)))?
.to_string();
let token_program_id = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -109,74 +100,63 @@ fn initialize(accounts: Vec<String>, initialize: Initialize) -> Result<SolanaDet
fn swap(accounts: Vec<String>, swap: Swap) -> Result<SolanaDetail> {
let method_name = "Swap";
- let token_swap = accounts
- .get(0)
+ let token_swap = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_swap",
- method_name
+ "{method_name}.token_swap"
)))?
.to_string();
let swap_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.swap_authority_pubkey",
- method_name
+ "{method_name}.swap_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let source_account = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_account",
- method_name
+ "{method_name}.source_account"
)))?
.to_string();
let source_token = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_token",
- method_name
+ "{method_name}.source_token"
)))?
.to_string();
let destination_token = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_token",
- method_name
+ "{method_name}.destination_token"
)))?
.to_string();
let destination_account = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.destination_account",
- method_name
+ "{method_name}.destination_account"
)))?
.to_string();
let pool_mint = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_mint",
- method_name
+ "{method_name}.pool_mint"
)))?
.to_string();
let fee_account = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.fee_account",
- method_name
+ "{method_name}.fee_account"
)))?
.to_string();
let token_program_id = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
let host_fee_account = accounts.get(10).unwrap_or(&"".to_string()).to_string();
@@ -207,74 +187,63 @@ fn deposit_all_token_types(
args: DepositAllTokenTypes,
) -> Result<SolanaDetail> {
let method_name = "DepositAllTokenTypes";
- let token_swap = accounts
- .get(0)
+ let token_swap = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_swap",
- method_name
+ "{method_name}.token_swap"
)))?
.to_string();
let swap_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.swap_authority_pubkey",
- method_name
+ "{method_name}.swap_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let token_a_user_transfer_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_a_user_transfer_authority_pubkey",
- method_name
+ "{method_name}.token_a_user_transfer_authority_pubkey"
)))?
.to_string();
let token_b_user_transfer_authority_pubkey = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_b_user_transfer_authority_pubkey",
- method_name
+ "{method_name}.token_b_user_transfer_authority_pubkey"
)))?
.to_string();
let token_a_base_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_a_base_account",
- method_name
+ "{method_name}.token_a_base_account"
)))?
.to_string();
let token_b_base_account = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_b_base_account",
- method_name
+ "{method_name}.token_b_base_account"
)))?
.to_string();
let pool_mint = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_mint",
- method_name
+ "{method_name}.pool_mint"
)))?
.to_string();
let pool_account = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_account",
- method_name
+ "{method_name}.pool_account"
)))?
.to_string();
let token_program_id = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -303,81 +272,69 @@ fn withdraw_all_token_types(
args: WithdrawAllTokenTypes,
) -> Result<SolanaDetail> {
let method_name = "WithdrawAllTokenTypes";
- let token_swap = accounts
- .get(0)
+ let token_swap = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_swap",
- method_name
+ "{method_name}.token_swap"
)))?
.to_string();
let swap_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.swap_authority_pubkey",
- method_name
+ "{method_name}.swap_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let pool_mint = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_mint",
- method_name
+ "{method_name}.pool_mint"
)))?
.to_string();
let source_pool_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.source_pool_account",
- method_name
+ "{method_name}.source_pool_account"
)))?
.to_string();
let token_a_swap_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_a_swap_account",
- method_name
+ "{method_name}.token_a_swap_account"
)))?
.to_string();
let token_b_swap_account = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_b_swap_account",
- method_name
+ "{method_name}.token_b_swap_account"
)))?
.to_string();
let token_a_user_account = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_a_user_account",
- method_name
+ "{method_name}.token_a_user_account"
)))?
.to_string();
let token_b_user_account = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_b_user_account",
- method_name
+ "{method_name}.token_b_user_account"
)))?
.to_string();
let fee_account = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.fee_account",
- method_name
+ "{method_name}.fee_account"
)))?
.to_string();
let token_program_id = accounts
.get(10)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -409,67 +366,57 @@ fn deposit_single_token_type_exact_amount_in(
args: DepositSingleTokenTypeExactAmountIn,
) -> Result<SolanaDetail> {
let method_name = "DepositSingleTokenTypeExactAmountIn";
- let token_swap = accounts
- .get(0)
+ let token_swap = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_swap",
- method_name
+ "{method_name}.token_swap"
)))?
.to_string();
let swap_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.swap_authority_pubkey",
- method_name
+ "{method_name}.swap_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let token_source_account = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_source_account",
- method_name
+ "{method_name}.token_source_account"
)))?
.to_string();
let token_a_swap_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_a_swap_account",
- method_name
+ "{method_name}.token_a_swap_account"
)))?
.to_string();
let token_b_swap_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_b_swap_account",
- method_name
+ "{method_name}.token_b_swap_account"
)))?
.to_string();
let pool_mint = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_mint",
- method_name
+ "{method_name}.pool_mint"
)))?
.to_string();
let pool_account = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_account",
- method_name
+ "{method_name}.pool_account"
)))?
.to_string();
let token_program_id = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
@@ -499,74 +446,63 @@ fn withdraw_single_token_type_exact_amount_out(
args: WithdrawSingleTokenTypeExactAmountOut,
) -> Result<SolanaDetail> {
let method_name = "WithdrawSingleTokenTypeExactAmountOut";
- let token_swap = accounts
- .get(0)
+ let token_swap = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_swap",
- method_name
+ "{method_name}.token_swap"
)))?
.to_string();
let swap_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.swap_authority_pubkey",
- method_name
+ "{method_name}.swap_authority_pubkey"
)))?
.to_string();
let user_transfer_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.user_transfer_authority_pubkey",
- method_name
+ "{method_name}.user_transfer_authority_pubkey"
)))?
.to_string();
let pool_mint = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_source_account",
- method_name
+ "{method_name}.token_source_account"
)))?
.to_string();
let source_pool_account = accounts
.get(4)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_a_swap_account",
- method_name
+ "{method_name}.token_a_swap_account"
)))?
.to_string();
let token_a_swap_account = accounts
.get(5)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_b_swap_account",
- method_name
+ "{method_name}.token_b_swap_account"
)))?
.to_string();
let token_b_swap_account = accounts
.get(6)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_mint",
- method_name
+ "{method_name}.pool_mint"
)))?
.to_string();
let token_user_account = accounts
.get(7)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.pool_account",
- method_name
+ "{method_name}.pool_account"
)))?
.to_string();
let fee_account = accounts
.get(8)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
let token_program_id = accounts
.get(9)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.token_program_id",
- method_name
+ "{method_name}.token_program_id"
)))?
.to_string();
Ok(SolanaDetail {
diff --git a/rust/apps/solana/src/resolvers/vote.rs b/rust/apps/solana/src/resolvers/vote.rs
index c3e1e7f..8c4ff03 100644
--- a/rust/apps/solana/src/resolvers/vote.rs
+++ b/rust/apps/solana/src/resolvers/vote.rs
@@ -53,32 +53,27 @@ pub fn resolve(instruction: VoteInstruction, accounts: Vec<String>) -> Result<So
fn resolve_initialize_account(accounts: Vec<String>, vote_init: VoteInit) -> Result<SolanaDetail> {
let method_name = "InitializeAccount".to_string();
- let account = accounts
- .get(0)
+ let account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.account",
- method_name
+ "{method_name}.account"
)))?
.to_string();
let sysvar_rent = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_rent",
- method_name
+ "{method_name}.sysvar_rent"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let new_validator_identity = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.new_validator_identity",
- method_name
+ "{method_name}.new_validator_identity"
)))?
.to_string();
let node_pubkey = vote_init.node_pubkey.to_string();
@@ -109,25 +104,21 @@ fn resolve_authorize(
vote_authority: VoteAuthorize,
) -> Result<SolanaDetail> {
let method_name = "Authorize".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let old_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_authority_pubkey",
- method_name
+ "{method_name}.old_authority_pubkey"
)))?
.to_string();
let authority_type = match vote_authority {
@@ -153,32 +144,27 @@ fn resolve_authorize(
fn resolve_vote(accounts: Vec<String>, vote: Vote) -> Result<SolanaDetail> {
let method_name = "Vote".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let sysvar_slot_hashes = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_slot_hashes",
- method_name
+ "{method_name}.sysvar_slot_hashes"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let vote_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_authority_pubkey",
- method_name
+ "{method_name}.vote_authority_pubkey"
)))?
.to_string();
let vote_slots = vote
@@ -210,25 +196,21 @@ fn resolve_vote(accounts: Vec<String>, vote: Vote) -> Result<SolanaDetail> {
fn resolve_withdraw(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail> {
let method_name = "Withdraw";
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let recipient = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.recipient",
- method_name
+ "{method_name}.recipient"
)))?
.to_string();
let withdraw_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.withdraw_authority_pubkey",
- method_name
+ "{method_name}.withdraw_authority_pubkey"
)))?
.to_string();
let amount = lamports.to_string();
@@ -249,25 +231,21 @@ fn resolve_withdraw(accounts: Vec<String>, lamports: u64) -> Result<SolanaDetail
fn resolve_update_validator_identity(accounts: Vec<String>) -> Result<SolanaDetail> {
let method_name = "UpdateValidatorIdentity".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let new_validator_identity = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.new_validator_identity",
- method_name
+ "{method_name}.new_validator_identity"
)))?
.to_string();
let withdraw_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.withdraw_authority_pubkey",
- method_name
+ "{method_name}.withdraw_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -288,18 +266,15 @@ fn resolve_update_validator_identity(accounts: Vec<String>) -> Result<SolanaDeta
fn resolve_update_commission(accounts: Vec<String>, new_commission: u8) -> Result<SolanaDetail> {
let method_name = "UpdateCommission".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let withdraw_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.withdraw_authority_pubkey",
- method_name
+ "{method_name}.withdraw_authority_pubkey"
)))?
.to_string();
Ok(SolanaDetail {
@@ -322,32 +297,27 @@ fn resolve_vote_switch(
) -> Result<SolanaDetail> {
let method_name = "VoteSwitch".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let sysvar_slot_hashes = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_slot_hashes",
- method_name
+ "{method_name}.sysvar_slot_hashes"
)))?
.to_string();
let sysvar_clock = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let vote_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_authority_pubkey",
- method_name
+ "{method_name}.vote_authority_pubkey"
)))?
.to_string();
let vote_slots = vote
@@ -384,32 +354,27 @@ fn resolve_authorize_checked(
) -> Result<SolanaDetail> {
let method_name = "AuthorizeChecked".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let old_authority_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_authority_pubkey",
- method_name
+ "{method_name}.old_authority_pubkey"
)))?
.to_string();
let new_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.new_authority_pubkey",
- method_name
+ "{method_name}.new_authority_pubkey"
)))?
.to_string();
let authority_type = match vote_authority {
@@ -438,18 +403,15 @@ fn resolve_update_vote_state(
) -> Result<SolanaDetail> {
let method_name = "UpdateVoteState".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let vote_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_authority_pubkey",
- method_name
+ "{method_name}.vote_authority_pubkey"
)))?
.to_string();
@@ -489,18 +451,15 @@ fn resolve_update_vote_state_switch(
) -> Result<SolanaDetail> {
let method_name = "UpdateVoteStateSwitch".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let vote_authority_pubkey = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_authority_pubkey",
- method_name
+ "{method_name}.vote_authority_pubkey"
)))?
.to_string();
let lockouts = state
@@ -540,25 +499,21 @@ fn resolve_authorize_with_seed(
) -> Result<SolanaDetail> {
let method_name = "AuthorizeWithSeed".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let old_base_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_base_pubkey",
- method_name
+ "{method_name}.old_base_pubkey"
)))?
.to_string();
@@ -593,32 +548,27 @@ fn resolve_authorize_checked_with_seed(
) -> Result<SolanaDetail> {
let method_name = "AuthorizeCheckedWithSeed".to_string();
- let vote_account = accounts
- .get(0)
+ let vote_account = accounts.first()
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.vote_account",
- method_name
+ "{method_name}.vote_account"
)))?
.to_string();
let sysvar_clock = accounts
.get(1)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.sysvar_clock",
- method_name
+ "{method_name}.sysvar_clock"
)))?
.to_string();
let old_base_pubkey = accounts
.get(2)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.old_base_pubkey",
- method_name
+ "{method_name}.old_base_pubkey"
)))?
.to_string();
let new_authority_pubkey = accounts
.get(3)
.ok_or(SolanaError::AccountNotFound(format!(
- "{}.new_authority_pubkey",
- method_name
+ "{method_name}.new_authority_pubkey"
)))?
.to_string();
diff --git a/rust/apps/sui/src/lib.rs b/rust/apps/sui/src/lib.rs
index ceb8bed..51b9d46 100644
--- a/rust/apps/sui/src/lib.rs
+++ b/rust/apps/sui/src/lib.rs
@@ -1,6 +1,4 @@
#![no_std]
-#![feature(error_in_core)]
-
#[allow(unused_imports)]
#[macro_use]
extern crate alloc;
diff --git a/rust/keystore/src/algorithms/ed25519/bip32_ed25519.rs b/rust/keystore/src/algorithms/ed25519/bip32_ed25519.rs
index 5fbf0ba..57c22e7 100644
--- a/rust/keystore/src/algorithms/ed25519/bip32_ed25519.rs
+++ b/rust/keystore/src/algorithms/ed25519/bip32_ed25519.rs
@@ -29,7 +29,7 @@ pub fn get_extended_private_key_by_entropy(
let icarus_master_key = get_icarus_master_key_by_entropy(entropy, passphrase)?;
let path = normalize_path(path);
let derivation_path = DerivationPath::from_str(path.as_str())
- .map_err(|e| KeystoreError::InvalidDerivationPath(format!("{}", e)))?;
+ .map_err(|e| KeystoreError::InvalidDerivationPath(format!("{e}")))?;
let childrens: Vec<ChildNumber> = derivation_path.into();
let key = childrens
.iter()
@@ -153,7 +153,7 @@ pub fn derive_extended_privkey_by_xprv(xprv: &XPrv, path: &String) -> Result<XPr
fn derive_bip32_ed25519_privkey(root: XPrv, path: &String) -> Result<XPrv> {
let path = normalize_path(path);
let derivation_path = DerivationPath::from_str(path.as_str())
- .map_err(|e| KeystoreError::InvalidDerivationPath(format!("{}", e)))?;
+ .map_err(|e| KeystoreError::InvalidDerivationPath(format!("{e}")))?;
let childrens: Vec<ChildNumber> = derivation_path.into();
let key = childrens.iter().fold(root, |acc, cur| match cur {
ChildNumber::Hardened { index } => acc.derive(DerivationScheme::V2, index + 0x80000000),
diff --git a/rust/keystore/src/algorithms/ed25519/slip10_ed25519.rs b/rust/keystore/src/algorithms/ed25519/slip10_ed25519.rs
index af0f8c7..dedde87 100644
--- a/rust/keystore/src/algorithms/ed25519/slip10_ed25519.rs
+++ b/rust/keystore/src/algorithms/ed25519/slip10_ed25519.rs
@@ -1,4 +1,4 @@
-use alloc::string::String;
+use alloc::string::{String, ToString};
use alloc::vec::Vec;
use core::str::FromStr;
@@ -12,7 +12,7 @@ pub fn get_private_key_by_seed(seed: &[u8], path: &String) -> Result<[u8; 32]> {
let i = get_master_key_by_seed(seed);
let path = normalize_path(path);
let derivation_path = DerivationPath::from_str(path.as_str())
- .map_err(|e| KeystoreError::InvalidDerivationPath(format!("{}", e)))?;
+ .map_err(|e| KeystoreError::InvalidDerivationPath(format!("{e}")))?;
let children: Vec<ChildNumber> = derivation_path.into();
let indexes: Vec<u32> = children.iter().fold(Ok(vec![]), |acc, cur| match acc {
Ok(vec) => {
@@ -21,9 +21,7 @@ pub fn get_private_key_by_seed(seed: &[u8], path: &String) -> Result<[u8; 32]> {
new_vec.push(index + 0x80000000);
return Ok(new_vec);
}
- Err(KeystoreError::InvalidDerivationPath(format!(
- "non hardened derivation is not supported for slip10-ed25519"
- )))
+ Err(KeystoreError::InvalidDerivationPath("non hardened derivation is not supported for slip10-ed25519".to_string()))
}
e => e,
})?;
diff --git a/rust/keystore/src/algorithms/rsa/mod.rs b/rust/keystore/src/algorithms/rsa/mod.rs
index eb5098d..114ffff 100644
--- a/rust/keystore/src/algorithms/rsa/mod.rs
+++ b/rust/keystore/src/algorithms/rsa/mod.rs
@@ -4,7 +4,7 @@ use alloc::string::ToString;
use alloc::vec::Vec;
use arrayref::array_ref;
use rand_chacha::ChaCha20Rng;
-use rand_core::SeedableRng;
+use rand_core::{OsRng, SeedableRng};
use num_bigint_dig::traits::ModInverse;
use num_bigint_dig::BigUint;
@@ -49,29 +49,27 @@ pub fn sign_message(
) -> Result<Vec<u8>> {
let private_key = build_rsa_private_key_from_primes(p, q)?;
match signing_option {
- SigningOption::PSS { salt_len } => {
+ SigningOption::Transaction { salt_len } | SigningOption::DataItem { salt_len } => {
let parsed_salt_len: usize = (*salt_len)
.try_into()
.map_err(|_| KeystoreError::RSASignError)?;
let signing_key = SigningKey::<Sha256>::new_with_salt_len(private_key, parsed_salt_len);
- let mut rng = ChaCha20Rng::from_seed([42; 32]);
let mut digest = sha2::Sha256::new();
digest.update(data);
- let signature = signing_key.sign_digest_with_rng(&mut rng, digest);
+ let signature = signing_key.sign_digest_with_rng(&mut OsRng, digest);
Ok(Vec::from(signature.to_bytes()))
}
- SigningOption::RSA { salt_len } => {
+ SigningOption::Message { salt_len } => {
let parsed_salt_len: usize = (*salt_len)
.try_into()
.map_err(|_| KeystoreError::RSASignError)?;
let signing_key = SigningKey::<Sha256>::new_with_salt_len(private_key, parsed_salt_len);
- let mut rng = ChaCha20Rng::from_seed([42; 32]);
let mut digest = sha2::Sha256::new();
digest.update(data);
let hash = digest.finalize().to_vec();
- let result = signing_key.sign_with_rng(&mut rng, &hash);
+ let result = signing_key.sign_with_rng(&mut OsRng, &hash);
Ok(Vec::from(result.to_bytes()))
- } // _ => Err(KeystoreError::RSASignError),
+ }
}
}
@@ -123,7 +121,7 @@ impl RSA {
PRIME_LENGTH_IN_BYTE * 2 + MODULUS_LENGTH_IN_BYTE,
MODULUS_LENGTH_IN_BYTE
];
- let e = vec![01, 00, 01];
+ let e = vec![0x01, 0x00, 0x01];
let private_key = RsaPrivateKey::from_components(
BigUint::from_bytes_be(n),
BigUint::from_bytes_be(&e),
@@ -139,8 +137,9 @@ impl RSA {
#[derive(Clone, Copy)]
pub enum SigningOption {
- PSS { salt_len: i32 },
- RSA { salt_len: i32 },
+ Transaction { salt_len: i32 },
+ DataItem { salt_len: i32 },
+ Message { salt_len: i32 },
}
#[cfg(test)]
@@ -148,9 +147,8 @@ mod tests {
use super::*;
use bitcoin::hex::DisplayHex;
use hex;
-
-
-
+ use rsa::pss::{Signature as PssSignature, VerifyingKey};
+ use rsa::signature::Verifier;
#[test]
fn test_private_key_recover() {
@@ -169,15 +167,26 @@ mod tests {
let p = hex::decode("EA8E3612876ED1433E5909D25F699F7C5D4984CF0D2F268B185141F0E29CE65237EAD8236C94A0A9547F1FEABD4F54399C626C0FB813249BC74A3082F8637A9E9A3C9D4F6E1858ED29770FE95418ED66F07A9F2F378D43D31ED37A0E6942727394A87B93540E421742ADE9630E26500FD2C01502DF8E3F869C70DAA97D4583048DD367E2977851052F6A991182318015557EC81B58E81B668E3A715212C807A1D7835FCB2B87B5DEFAC0948B220D340D6B2DA0DCFC7123DE1F1424F6F5B8EAFA719B3DE8B9B6FEC196E2E393CE30204267A586625541C7B1433F8FA7873B51B3E65462831BF34A4E5912297A06B2E91B31657DFA3CCFDB5F94D438D9904CFD27").unwrap();
let q = hex::decode("E360BFD757FF6FCF844AF226DCA7CFBD353A89112079C9C5A17C4F354DE0B1BE38BBFD73EAA77C4E2FFC681A79CEC8C8E79A5A00E32113A77748F435717BE6AD04AEF473BCE05DC3B742AAB853C02C565847133AFFD451B472B13031300978606F74BE8761A69733BEF8C2CCD6F396A0CCE23CDC73A8FF4609F47C18FE4626B788C4BFB73B9CF10BC5D6F80E9B9847530973CF5212D8EB142EAA155D774417D7BF89E1F229472926EA539AC3BAF42CF63EF18A6D85915727E9A77B4EA31B577B1E4A35C40CCCE72F5ECE426709E976DAEDBE7B76291F89EB85903182035CA98EB156563E392D0D1E427C59657B9EDF1DDB049BBB9620B881D8715982AD257D29").unwrap();
let data = b"hello world";
- let result = sign_message(
+ let salt_len = 32;
+ let sig = sign_message(
data,
p.as_slice(),
q.as_slice(),
- &SigningOption::PSS { salt_len: 32 },
+ &SigningOption::Message { salt_len },
)
.unwrap();
- let result = hex::encode(result);
- assert_eq!(result, "986ffe8b2da3326c82ff6972b1ed4d510498ee0fb8abb3c30c7a952a14357aa5d7cb9bfcb0c5b2223ceb586f86e6dfac2c57acc98f5dad881853dc996e1e6fbcec167e4bc7deb1290352f221301ae89c1a336a57dc2980485ceac90a688a85cce497774db51a207620e185d84176e312c94ba3188afbb0885b6f6bcf42e40039269b7bf2550c68aecc0122901f707d61ab0c92174e4f463a446cdeff85ac8d1cfc828fba08cd6ab97a19ac79a1be85567bda4829096d188eab045d1967c245210e51ef7add10dd0c93adbae7829ad7ae3ad291633d4fb007f931a5def9ffb79198dde26b7ab6a76ab54f2ea4fd0b4b658aae37f37481bc253f335a549562c729df1b1736c09c74212133ccd1580c79f6e90a229c64edbb232f2685ebae72466d9312365560c88e5dffd576526b38cb899287aafb2e99698981cf595d582903d850181e25535899fc50105540e37068f9dcdd1cc1f490e72a80120550612e3c08b3b648b7edbcb5bb033ab7ca42cc5cb3ce3aa0f218d4cd46b947cc2bd484db55fa1cfa1e76f33ebea3ec4887247a00be1128f633167efede7ad420ac59f6d667b60cdf2aa444d8645966d931d62f20534c0247ee28d9d93b71d67a05c0b0285a1921471973142764c130c230de0cfd52d3e7b817555272762fc53a00711a8600990490414bcd36188c203e9454f6ccf28b79a08e0df867a3030be4162300d639");
+
+ let sk = build_rsa_private_key_from_primes(p.as_slice(), q.as_slice()).unwrap();
+ let pk = sk.to_public_key();
+ let vk = VerifyingKey::<Sha256>::new(pk);
+
+ let mut digest = Sha256::new();
+ digest.update(data);
+ let hash = digest.finalize().to_vec();
+
+ assert!(vk
+ .verify(&hash, &PssSignature::try_from(sig.as_slice()).unwrap())
+ .is_ok());
}
#[test]
@@ -185,20 +194,25 @@ mod tests {
let p = hex::decode("FDEC3A1AEE520780CA4058402D0422B5CD5950B715728F532499DD4BBCB68E5D44650818B43656782237316C4B0E2FAA2B15C245FB82D10CF4F5B420F1F293BA75B2C8D8CEF6AD899C34CE9DE482CB248CC5AB802FD93094A63577590D812D5DD781846EF7D4F5D9018199C293966371C2349B0F847C818EC99CAAD800116E02085D35A39A913BC735327705161761AE30A4EC775F127FBB5165418C0FE08E54AE0AFF8B2DAB2B82D3B4B9C807DE5FAE116096075CF6D5B77450D743D743E7DCC56E7CAFDCC555F228E57B363488E171D099876993E93E37A94983CCC12DBA894C58CA84AC154C1343922C6A99008FABD0FA7010D3CC34F69884FEC902984771").unwrap();
let q = hex::decode("C5B50031BA31AB7C8B76453CE771F048B84FB89A3E4D44C222C3D8C823C683988B0DBF354D8B8CBF65F3DB53E1365D3C5E043F0155B41D1EBECA6E20B2D6778600B5C98FFDBA33961DAE73B018307EF2BCE9D217BBDF32964080F8DB6F0CF7EF27AC825FCAF98D5143690A5D7E138F4875280ED6DE581E66ED17F83371C268A073E4594814BCC88A33CBB4EC8819CC722EA15490312B85FED06E39274C4F73AC91C7F4D1B899729691CCE616FB1A5FEEE1972456ADDCB51AC830E947FCC1B823468F0EEFBAF195AC3B34F0BAF96AFC6FA77EE2E176081D6D91CE8C93C3D0F3547E48D059C9DA447BA05EE3984703BEBFD6D704B7F327FFAEA7D0F63D0D3C6D65").unwrap();
- let message = hex::decode("00f41cfa7bfad3d7b097fcc28ed08cb4ca7d0c544ec760cc6cc5c4f3780d0ec43cc011eaaab0868393c3c813ab8c04df").unwrap();
- let signing_option = SigningOption::PSS { salt_len: 0 };
- let seed = hex::decode("5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc19a5ac40b389cd370d086206dec8aa6c43daea6690f20ad3d8d48b2d2ce9e38e4").unwrap();
- let signature = sign_message(
- message.as_slice(),
+ let transaction = hex::decode("00f41cfa7bfad3d7b097fcc28ed08cb4ca7d0c544ec760cc6cc5c4f3780d0ec43cc011eaaab0868393c3c813ab8c04df").unwrap();
+ let signing_option = SigningOption::Transaction { salt_len: 0 };
+ let sig = sign_message(
+ transaction.as_slice(),
p.as_slice(),
q.as_slice(),
&signing_option,
)
.unwrap();
- assert_eq!(hex::encode(signature.clone()), "a8e58c9aa9a74039f239f49adca18ea5d54b9d28852b7d39b098a96230ebe4b07bf1f66eea2ef3ee29ab912f90508917703ca9838f228b0f75014ea5d41101f7dff194d8086010aa92b6e6d04a56ed6cb7bd63c3dc15f833c0fcbeb03a16892ed715f7b178c20dbb6cd9923ddd0ab4b1c8753a554a8165ff34224fb630445582d3b588581deca41dbcf2144dcf10a362510178af9923e9f6cdf30dfaafa5642a20f777a4a9bff7170517d9a4347a2f0e360a38bf90a8b5d10f80f2581422798aa7b77d959f237a77d71b35558349e35f9c1193154bcf252d79171abeec6f37858584f878503af44a3553eb218b86dc31dfcca66dea947364580515bb2543d2403d53866ee16bba1b8e51ba060a5ecfef3ef4617d96fa3a3f67176621e638ad7e33bf08c56409f0ce01ef345ac4b49ba4fd94dbaf11b544f4ce089d9adcebf5b592afd2f8cecf22f21539975e50441fe3bf5f77d7d0fcfa2bd3c6e2cbf1bb59ed141b5c0f257be5958c5b46c9f08ec1e912b7fa6ff7182aa9010ce9f0cd6fc4845760a37f97197ea8ad3fa8a75b742e9ad61f877acd5771e7c43e0c75a422eb7d96153d4c561469c0f6011d0fe74f718b2db26894e3c5daf72784d34374c4dab78c3ff7619f883085a45efe1781cfcdb80b64b4c8aa96f86225144ca9430a499e96c607a77538ad7fb920fdd1126cdc8c5574ed3c2b1fb1dadac51ad4e13fdd9d");
- // let result = verify(signature.as_slice(), message.as_slice());
- // println!("verify result {:?}", result);
- // assert_eq!(result.ok(), Some(()));
+ let sk = build_rsa_private_key_from_primes(p.as_slice(), q.as_slice()).unwrap();
+ let pk = sk.to_public_key();
+ let vk = VerifyingKey::<Sha256>::new(pk);
+
+ assert!(vk
+ .verify(
+ transaction.as_slice(),
+ &PssSignature::try_from(sig.as_slice()).unwrap()
+ )
+ .is_ok());
}
#[test]
@@ -206,17 +220,24 @@ mod tests {
let p = hex::decode("FDEC3A1AEE520780CA4058402D0422B5CD5950B715728F532499DD4BBCB68E5D44650818B43656782237316C4B0E2FAA2B15C245FB82D10CF4F5B420F1F293BA75B2C8D8CEF6AD899C34CE9DE482CB248CC5AB802FD93094A63577590D812D5DD781846EF7D4F5D9018199C293966371C2349B0F847C818EC99CAAD800116E02085D35A39A913BC735327705161761AE30A4EC775F127FBB5165418C0FE08E54AE0AFF8B2DAB2B82D3B4B9C807DE5FAE116096075CF6D5B77450D743D743E7DCC56E7CAFDCC555F228E57B363488E171D099876993E93E37A94983CCC12DBA894C58CA84AC154C1343922C6A99008FABD0FA7010D3CC34F69884FEC902984771").unwrap();
let q = hex::decode("C5B50031BA31AB7C8B76453CE771F048B84FB89A3E4D44C222C3D8C823C683988B0DBF354D8B8CBF65F3DB53E1365D3C5E043F0155B41D1EBECA6E20B2D6778600B5C98FFDBA33961DAE73B018307EF2BCE9D217BBDF32964080F8DB6F0CF7EF27AC825FCAF98D5143690A5D7E138F4875280ED6DE581E66ED17F83371C268A073E4594814BCC88A33CBB4EC8819CC722EA15490312B85FED06E39274C4F73AC91C7F4D1B899729691CCE616FB1A5FEEE1972456ADDCB51AC830E947FCC1B823468F0EEFBAF195AC3B34F0BAF96AFC6FA77EE2E176081D6D91CE8C93C3D0F3547E48D059C9DA447BA05EE3984703BEBFD6D704B7F327FFAEA7D0F63D0D3C6D65").unwrap();
- let signing_option = SigningOption::PSS { salt_len: 32 };
- let message = hex::decode("00f41cfa7bfad3d7b097fcc28ed08cb4ca7d0c544ec760cc6cc5c4f3780d0ec43cc011eaaab0868393c3c813ab8c04df").unwrap();
- let seed = hex::decode("5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc19a5ac40b389cd370d086206dec8aa6c43daea6690f20ad3d8d48b2d2ce9e38e4").unwrap();
- let signature = sign_message(
- message.as_slice(),
+ let signing_option = SigningOption::Transaction { salt_len: 32 };
+ let transaction = hex::decode("00f41cfa7bfad3d7b097fcc28ed08cb4ca7d0c544ec760cc6cc5c4f3780d0ec43cc011eaaab0868393c3c813ab8c04df").unwrap();
+ let sig = sign_message(
+ transaction.as_slice(),
p.as_slice(),
q.as_slice(),
&signing_option,
)
.unwrap();
- // let result = verify(&signature.as_ref(), message.as_slice());
- // assert_eq!(result.ok(), Some(()));
+
+ let sk = build_rsa_private_key_from_primes(p.as_slice(), q.as_slice()).unwrap();
+ let pk = sk.to_public_key();
+ let vk = VerifyingKey::<Sha256>::new(pk);
+ assert!(vk
+ .verify(
+ transaction.as_slice(),
+ &PssSignature::try_from(sig.as_slice()).unwrap()
+ )
+ .is_ok());
}
}
diff --git a/rust/keystore/src/algorithms/secp256k1.rs b/rust/keystore/src/algorithms/secp256k1.rs
index 1d6bc21..bf9a41d 100644
--- a/rust/keystore/src/algorithms/secp256k1.rs
+++ b/rust/keystore/src/algorithms/secp256k1.rs
@@ -111,7 +111,7 @@ pub fn get_share_key(private_key: &[u8], pubkey: &[u8]) -> Result<[u8; 32]> {
let pk = PublicKey::from_slice(pubkey)
.map_err(|e| KeystoreError::InvalidDataError(e.to_string()))?;
let shared_secret1 = SharedSecret::new(&pk, &sk);
- share_key.copy_from_slice(&shared_secret1.as_ref());
+ share_key.copy_from_slice(shared_secret1.as_ref());
Ok(share_key)
}
diff --git a/rust/keystore/src/algorithms/zcash/mod.rs b/rust/keystore/src/algorithms/zcash/mod.rs
index 30d8ed0..ce881bd 100644
--- a/rust/keystore/src/algorithms/zcash/mod.rs
+++ b/rust/keystore/src/algorithms/zcash/mod.rs
@@ -24,8 +24,7 @@ pub fn derive_ufvk<P: consensus::Parameters>(
.map_err(|e| KeystoreError::DerivationError(e.to_string()))?;
if account_path.len() != 3 {
return Err(KeystoreError::DerivationError(format!(
- "invalid account path: {}",
- account_path
+ "invalid account path: {account_path}"
)));
}
//should be hardened(32) hardened(133) hardened(account_id)
@@ -46,8 +45,7 @@ pub fn derive_ufvk<P: consensus::Parameters>(
Ok(ufvk.encode(params))
}
_ => Err(KeystoreError::DerivationError(format!(
- "invalid account path: {}",
- account_path
+ "invalid account path: {account_path}"
))),
}
}
@@ -80,13 +78,12 @@ pub fn sign_message_orchard<R: RngCore + CryptoRng>(
action
.sign(sighash, &osak, rng)
- .map_err(|e| KeystoreError::ZcashOrchardSign(format!("{:?}", e)))
+ .map_err(|e| KeystoreError::ZcashOrchardSign(format!("{e:?}")))
} else {
// Keystone only generates UFVKs at the above path; ignore all other signature
// requests.
Err(KeystoreError::ZcashOrchardSign(format!(
- "invalid orchard account path: {:?}",
- path
+ "invalid orchard account path: {path:?}"
)))
}
}
diff --git a/rust/rust_c/Cargo.toml b/rust/rust_c/Cargo.toml
index 627a9bd..54876e3 100644
--- a/rust/rust_c/Cargo.toml
+++ b/rust/rust_c/Cargo.toml
@@ -128,7 +128,7 @@ simulator-multi-coins = ["simulator", "multi-coins"]
simulator-btc-only = ["simulator", "btc-only"]
simulator-cypherpunk = ["simulator", "cypherpunk"]
# make IDE happy
-default = ["simulator-cypherpunk"]
+default = ["simulator-multi-coins"]
[dev-dependencies]
keystore = { path = "../keystore" }
diff --git a/rust/rust_c/src/arweave/mod.rs b/rust/rust_c/src/arweave/mod.rs
index 686ed75..d91bb38 100644
--- a/rust/rust_c/src/arweave/mod.rs
+++ b/rust/rust_c/src/arweave/mod.rs
@@ -248,10 +248,10 @@ unsafe fn build_sign_result(
SaltLen::Digest => 32,
};
let signature_data = parse_sign_data(ptr)?;
- let sign_type = sign_request.get_sign_type();
- let signing_option = match sign_type {
- SignType::Transaction | SignType::DataItem => SigningOption::PSS { salt_len },
- SignType::Message => SigningOption::RSA { salt_len },
+ let signing_option = match sign_request.get_sign_type() {
+ SignType::Transaction => SigningOption::Transaction { salt_len },
+ SignType::DataItem => SigningOption::DataItem { salt_len },
+ SignType::Message => SigningOption::Message { salt_len },
};
let signature = sign_message(&signature_data, p, q, &signing_option)?;
Why this scored 26/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.