Skip to content

Commit

Permalink
Parse more token-2022 extensions and instructions (solana-labs#26746)
Browse files Browse the repository at this point in the history
* Bump spl-token-2022

* Support parsing InterestBearingConfig extension

* Parse InitializeNonTransferableMint instructions

* Parse InterestBearingMint instructions

* Bump solana-program rebuild threshold
  • Loading branch information
Tyera Eulberg authored Jul 25, 2022
1 parent d695ac5 commit dbd3b6b
Show file tree
Hide file tree
Showing 14 changed files with 277 additions and 110 deletions.
96 changes: 53 additions & 43 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion account-decoder/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ solana-config-program = { path = "../programs/config", version = "=1.11.5" }
solana-sdk = { path = "../sdk", version = "=1.11.5" }
solana-vote-program = { path = "../programs/vote", version = "=1.11.5" }
spl-token = { version = "=3.3.0", features = ["no-entrypoint"] }
spl-token-2022 = { version = "=0.3.0", features = ["no-entrypoint"] }
spl-token-2022 = { version = "=0.4.1", features = ["no-entrypoint"] }
thiserror = "1.0"
zstd = "0.11.2"

Expand Down
10 changes: 7 additions & 3 deletions account-decoder/src/parse_token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -552,8 +552,10 @@ mod test {
account_state.pack_base();
account_state.init_account_type().unwrap();

account_state.init_extension::<ImmutableOwner>().unwrap();
let mut memo_transfer = account_state.init_extension::<MemoTransfer>().unwrap();
account_state
.init_extension::<ImmutableOwner>(true)
.unwrap();
let mut memo_transfer = account_state.init_extension::<MemoTransfer>(true).unwrap();
memo_transfer.require_incoming_transfer_memos = true.into();

assert!(parse_token(&account_data, None).is_err());
Expand Down Expand Up @@ -620,7 +622,9 @@ mod test {
let mut mint_state =
StateWithExtensionsMut::<Mint>::unpack_uninitialized(&mut mint_data).unwrap();

let mut mint_close_authority = mint_state.init_extension::<MintCloseAuthority>().unwrap();
let mut mint_close_authority = mint_state
.init_extension::<MintCloseAuthority>(true)
.unwrap();
mint_close_authority.close_authority =
OptionalNonZeroPubkey::try_from(Some(owner_pubkey)).unwrap();

Expand Down
38 changes: 38 additions & 0 deletions account-decoder/src/parse_token_extension.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use {
crate::parse_token::UiAccountState,
solana_sdk::clock::UnixTimestamp,
spl_token_2022::{
extension::{self, BaseState, ExtensionType, StateWithExtensions},
solana_program::pubkey::Pubkey,
Expand All @@ -18,6 +19,8 @@ pub enum UiExtension {
DefaultAccountState(UiDefaultAccountState),
ImmutableOwner,
MemoTransfer(UiMemoTransfer),
NonTransferable,
InterestBearingConfig(UiInterestBearingConfig),
UnparseableExtension,
}

Expand Down Expand Up @@ -50,6 +53,11 @@ pub fn parse_extension<S: BaseState>(
.get_extension::<extension::memo_transfer::MemoTransfer>()
.map(|&extension| UiExtension::MemoTransfer(extension.into()))
.unwrap_or(UiExtension::UnparseableExtension),
ExtensionType::NonTransferable => UiExtension::NonTransferable,
ExtensionType::InterestBearingConfig => account
.get_extension::<extension::interest_bearing_mint::InterestBearingConfig>()
.map(|&extension| UiExtension::InterestBearingConfig(extension.into()))
.unwrap_or(UiExtension::UnparseableExtension),
}
}

Expand Down Expand Up @@ -159,3 +167,33 @@ impl From<extension::memo_transfer::MemoTransfer> for UiMemoTransfer {
}
}
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct UiInterestBearingConfig {
pub rate_authority: Option<String>,
pub initialization_timestamp: UnixTimestamp,
pub pre_update_average_rate: i16,
pub last_update_timestamp: UnixTimestamp,
pub current_rate: i16,
}

impl From<extension::interest_bearing_mint::InterestBearingConfig> for UiInterestBearingConfig {
fn from(
interest_bearing_config: extension::interest_bearing_mint::InterestBearingConfig,
) -> Self {
let rate_authority: Option<Pubkey> = interest_bearing_config.rate_authority.into();

Self {
rate_authority: rate_authority.map(|pubkey| pubkey.to_string()),
initialization_timestamp: UnixTimestamp::from(
interest_bearing_config.initialization_timestamp,
),
pre_update_average_rate: i16::from(interest_bearing_config.pre_update_average_rate),
last_update_timestamp: UnixTimestamp::from(
interest_bearing_config.last_update_timestamp,
),
current_rate: i16::from(interest_bearing_config.current_rate),
}
}
}
2 changes: 1 addition & 1 deletion ci/test-stable.sh
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ test-stable-bpf)
# latest mainbeta release version.
solana_program_count=$(grep -c 'solana-program v' cargo.log)
rm -f cargo.log
if ((solana_program_count > 4)); then
if ((solana_program_count > 10)); then
echo "Regression of build redundancy ${solana_program_count}."
echo "Review dependency features that trigger redundant rebuilds of solana-program."
exit 1
Expand Down
2 changes: 1 addition & 1 deletion client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ solana-streamer = { path = "../streamer", version = "=1.11.5" }
solana-transaction-status = { path = "../transaction-status", version = "=1.11.5" }
solana-version = { path = "../version", version = "=1.11.5" }
solana-vote-program = { path = "../programs/vote", version = "=1.11.5" }
spl-token-2022 = { version = "=0.3.0", features = ["no-entrypoint"] }
spl-token-2022 = { version = "=0.4.1", features = ["no-entrypoint"] }
thiserror = "1.0"
tokio = { version = "~1.14.1", features = ["full"] }
tokio-stream = "0.1.9"
Expand Down
Loading

0 comments on commit dbd3b6b

Please sign in to comment.