From dce5c11a12aa4482f1cd5ab5424c29bc1d2d56e6 Mon Sep 17 00:00:00 2001 From: Hardhat Chad Date: Sun, 25 Aug 2024 14:52:10 +0000 Subject: [PATCH] account discriminator macro --- Cargo.lock | 6 +++--- Cargo.toml | 6 +++--- api/src/state/bus.rs | 12 +++++++----- api/src/state/config.rs | 14 ++++++++------ api/src/state/proof.rs | 13 +++++++------ api/src/state/treasury.rs | 14 ++++++++------ utils/src/macros.rs | 8 +++++++- 7 files changed, 43 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8df0be2..df579e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1286,7 +1286,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "ore-api" -version = "2.1.6" +version = "2.1.7" dependencies = [ "array-const-fn-init", "bytemuck", @@ -1304,7 +1304,7 @@ dependencies = [ [[package]] name = "ore-program" -version = "2.1.6" +version = "2.1.7" dependencies = [ "drillx", "mpl-token-metadata", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "ore-utils" -version = "2.1.6" +version = "2.1.7" dependencies = [ "bytemuck", "solana-program", diff --git a/Cargo.toml b/Cargo.toml index 7b32bee..a47105f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["api", "program", "utils"] [workspace.package] -version = "2.1.6" +version = "2.1.7" edition = "2021" license = "Apache-2.0" homepage = "https://ore.supply" @@ -19,8 +19,8 @@ const-crypto = "0.1.0" drillx = { version = "2.0.0", features = ["solana"] } mpl-token-metadata = "4.1.2" num_enum = "0.7.2" -ore-api = { path = "api", version = "2.1.6" } -ore-utils = { path = "utils", features = ["spl"], version = "2.1.6" } +ore-api = { path = "api", version = "2.1.7" } +ore-utils = { path = "utils", features = ["spl"], version = "2.1.7" } solana-program = "^1.18" spl-token = { version = "^4", features = ["no-entrypoint"] } spl-associated-token-account = { version = "^2.3", features = [ "no-entrypoint" ] } diff --git a/api/src/state/bus.rs b/api/src/state/bus.rs index 359b066..4ff5d8b 100644 --- a/api/src/state/bus.rs +++ b/api/src/state/bus.rs @@ -1,5 +1,8 @@ use bytemuck::{Pod, Zeroable}; use ore_utils::*; +use solana_program::pubkey::Pubkey; + +use crate::consts::BUS; use super::AccountDiscriminator; @@ -22,10 +25,9 @@ pub struct Bus { pub top_balance: u64, } -impl Discriminator for Bus { - fn discriminator() -> u8 { - AccountDiscriminator::Bus.into() - } +/// Fetch the PDA of a bus account. +pub fn bus_pda(id: u64) -> (Pubkey, u8) { + Pubkey::find_program_address(&[BUS, id.to_le_bytes().as_slice()], &crate::id()) } -account!(Bus); +account!(AccountDiscriminator, Bus); diff --git a/api/src/state/config.rs b/api/src/state/config.rs index f31b3c6..5933f36 100644 --- a/api/src/state/config.rs +++ b/api/src/state/config.rs @@ -1,5 +1,8 @@ use bytemuck::{Pod, Zeroable}; -use ore_utils::{account, Discriminator}; +use ore_utils::*; +use solana_program::pubkey::Pubkey; + +use crate::consts::CONFIG; use super::AccountDiscriminator; @@ -20,10 +23,9 @@ pub struct Config { pub top_balance: u64, } -impl Discriminator for Config { - fn discriminator() -> u8 { - AccountDiscriminator::Config.into() - } +/// Derive the PDA of the config account. +pub fn config_pda() -> (Pubkey, u8) { + Pubkey::find_program_address(&[CONFIG], &crate::id()) } -account!(Config); +account!(AccountDiscriminator, Config); diff --git a/api/src/state/proof.rs b/api/src/state/proof.rs index 0364514..03fb9b0 100644 --- a/api/src/state/proof.rs +++ b/api/src/state/proof.rs @@ -1,7 +1,9 @@ use bytemuck::{Pod, Zeroable}; -use ore_utils::{account, Discriminator}; +use ore_utils::*; use solana_program::pubkey::Pubkey; +use crate::consts::PROOF; + use super::AccountDiscriminator; /// Proof accounts track a miner's current hash, claimable rewards, and lifetime stats. @@ -37,10 +39,9 @@ pub struct Proof { pub total_rewards: u64, } -impl Discriminator for Proof { - fn discriminator() -> u8 { - AccountDiscriminator::Proof.into() - } +/// Derive the PDA of a proof account. +pub fn proof_pda(authority: Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[PROOF, authority.as_ref()], &crate::id()) } -account!(Proof); +account!(AccountDiscriminator, Proof); diff --git a/api/src/state/treasury.rs b/api/src/state/treasury.rs index e65e7f6..e2dede5 100644 --- a/api/src/state/treasury.rs +++ b/api/src/state/treasury.rs @@ -1,5 +1,8 @@ use bytemuck::{Pod, Zeroable}; -use ore_utils::{account, Discriminator}; +use ore_utils::*; +use solana_program::pubkey::Pubkey; + +use crate::consts::TREASURY; use super::AccountDiscriminator; @@ -9,10 +12,9 @@ use super::AccountDiscriminator; #[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)] pub struct Treasury {} -impl Discriminator for Treasury { - fn discriminator() -> u8 { - AccountDiscriminator::Treasury.into() - } +/// Derive the PDA of the treasury account. +pub fn treasury_pda() -> (Pubkey, u8) { + Pubkey::find_program_address(&[TREASURY], &crate::id()) } -account!(Treasury); +account!(AccountDiscriminator, Treasury); diff --git a/utils/src/macros.rs b/utils/src/macros.rs index 917260f..23bbc75 100644 --- a/utils/src/macros.rs +++ b/utils/src/macros.rs @@ -54,9 +54,15 @@ macro_rules! impl_instruction_from_bytes { #[macro_export] macro_rules! account { - ($struct_name:ident) => { + ($discriminator_name:ident, $struct_name:ident) => { $crate::impl_to_bytes!($struct_name); $crate::impl_account_from_bytes!($struct_name); + + impl $crate::Discriminator for $struct_name { + fn discriminator() -> u8 { + $discriminator_name::$struct_name.into() + } + } }; }