From 65c3a71fd6be1d96f2d499931fbde3d6d9f979e6 Mon Sep 17 00:00:00 2001 From: blockiosaurus <90809591+blockiosaurus@users.noreply.github.com> Date: Sun, 8 Sep 2024 07:59:26 -0400 Subject: [PATCH] Adding scaling fees based on native SVM rent (#139) * Adding scaling fees based on native SVM rent. * Fix upload. --- .github/workflows/build-programs.yml | 1 + programs/token-metadata/program/src/state/fee.rs | 11 ++++++++++- programs/token-metadata/program/src/utils/fee.rs | 4 ++-- programs/token-metadata/program/tests/fees.rs | 6 +++--- .../program/tests/utils/digital_asset.rs | 7 ++++--- .../token-metadata/program/tests/utils/metadata.rs | 5 ++--- programs/token-metadata/program/tests/utils/mod.rs | 2 ++ 7 files changed, 24 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-programs.yml b/.github/workflows/build-programs.yml index f84ca8dd..dc82a1c1 100644 --- a/.github/workflows/build-programs.yml +++ b/.github/workflows/build-programs.yml @@ -64,4 +64,5 @@ jobs: name: program-builds # First wildcard ensures exported paths are consistently under the programs folder. path: ./program*/.bin/*.so + include-hidden-files: true if-no-files-found: error diff --git a/programs/token-metadata/program/src/state/fee.rs b/programs/token-metadata/program/src/state/fee.rs index ad9123b3..ea4f911e 100644 --- a/programs/token-metadata/program/src/state/fee.rs +++ b/programs/token-metadata/program/src/state/fee.rs @@ -1,9 +1,18 @@ use super::*; +use solana_program::{rent::Rent, sysvar::Sysvar}; pub(crate) const FEE_AUTHORITY: Pubkey = pubkey!("Levytx9LLPzAtDJJD7q813Zsm8zg9e1pb53mGxTKpD7"); +const CREATE_FEE_SCALAR: usize = 1308; +const CREATE_FEE_OFFSET: u64 = 5440; // create_metadata_accounts_v3, create, print edition commands -pub const CREATE_FEE: u64 = 10_000_000; +pub fn get_create_fee() -> Result { + let rent = Rent::get()?.minimum_balance(CREATE_FEE_SCALAR); + + Ok(rent + .checked_add(CREATE_FEE_OFFSET) + .ok_or(MetadataError::NumericalOverflowError)?) +} pub const FEE_FLAG_SET: u8 = 1; pub const FEE_FLAG_CLEARED: u8 = 0; diff --git a/programs/token-metadata/program/src/utils/fee.rs b/programs/token-metadata/program/src/utils/fee.rs index 2e823dfa..99182353 100644 --- a/programs/token-metadata/program/src/utils/fee.rs +++ b/programs/token-metadata/program/src/utils/fee.rs @@ -3,7 +3,7 @@ use solana_program::{ sysvar::Sysvar, }; -use crate::state::{fee::CREATE_FEE, Metadata, TokenMetadataAccount, METADATA_FEE_FLAG_INDEX}; +use crate::state::{get_create_fee, Metadata, TokenMetadataAccount, METADATA_FEE_FLAG_INDEX}; #[repr(C)] #[derive(Debug, Clone, Copy)] @@ -16,7 +16,7 @@ pub(crate) fn levy(args: LevyArgs) -> ProgramResult { // Fund metadata account with rent + Metaplex fee. let rent = Rent::get()?; - let fee = CREATE_FEE + rent.minimum_balance(Metadata::size()); + let fee = get_create_fee()? + rent.minimum_balance(Metadata::size()); invoke( &solana_program::system_instruction::transfer( diff --git a/programs/token-metadata/program/tests/fees.rs b/programs/token-metadata/program/tests/fees.rs index f0753434..3f1d88c9 100644 --- a/programs/token-metadata/program/tests/fees.rs +++ b/programs/token-metadata/program/tests/fees.rs @@ -13,7 +13,7 @@ mod fees { }; use token_metadata::{ instruction::{collect_fees, BurnArgs, UpdateArgs}, - state::{CREATE_FEE, FEE_FLAG_CLEARED, METADATA_FEE_FLAG_INDEX}, + state::{FEE_FLAG_CLEARED, METADATA_FEE_FLAG_INDEX}, }; use super::*; @@ -132,7 +132,7 @@ mod fees { println!("Transaction size: {:?}", tx.message().serialize().len()); context.banks_client.process_transaction(tx).await.unwrap(); - let expected_balance = num_accounts * CREATE_FEE; + let expected_balance = num_accounts * SOLANA_CREATE_FEE; let recipient_balance = get_account(&mut context, &recipient.pubkey()) .await @@ -205,7 +205,7 @@ mod fees { ); context.banks_client.process_transaction(tx).await.unwrap(); - let expected_balance = CREATE_FEE; + let expected_balance = SOLANA_CREATE_FEE; let recipient_balance = get_account(&mut context, &recipient.pubkey()) .await diff --git a/programs/token-metadata/program/tests/utils/digital_asset.rs b/programs/token-metadata/program/tests/utils/digital_asset.rs index f7a15ee7..50c79115 100644 --- a/programs/token-metadata/program/tests/utils/digital_asset.rs +++ b/programs/token-metadata/program/tests/utils/digital_asset.rs @@ -31,13 +31,14 @@ use token_metadata::{ state::{ AssetData, Collection, CollectionDetails, Creator, MasterEditionV2, Metadata, PrintSupply, ProgrammableConfig, TokenDelegateRole, TokenMetadataAccount, TokenRecord, TokenStandard, - CREATE_FEE, EDITION, EDITION_MARKER_BIT_SIZE, FEE_FLAG_SET, METADATA_FEE_FLAG_INDEX, - PREFIX, + EDITION, EDITION_MARKER_BIT_SIZE, FEE_FLAG_SET, METADATA_FEE_FLAG_INDEX, PREFIX, }, utils::unpack, ID, }; +use crate::SOLANA_CREATE_FEE; + use super::{airdrop, create_mint, create_token_account, get_account, mint_tokens}; pub const DEFAULT_NAME: &str = "Digital Asset"; @@ -1473,7 +1474,7 @@ impl DigitalAsset { let rent = context.banks_client.get_rent().await.unwrap(); let rent_exempt = rent.minimum_balance(account.data.len()); - let expected_lamports = rent_exempt + CREATE_FEE; + let expected_lamports = rent_exempt + SOLANA_CREATE_FEE; assert_eq!(account.lamports, expected_lamports); assert_eq!(account.data[METADATA_FEE_FLAG_INDEX], FEE_FLAG_SET); diff --git a/programs/token-metadata/program/tests/utils/metadata.rs b/programs/token-metadata/program/tests/utils/metadata.rs index fb77e47a..6e1c50fe 100644 --- a/programs/token-metadata/program/tests/utils/metadata.rs +++ b/programs/token-metadata/program/tests/utils/metadata.rs @@ -6,8 +6,7 @@ use token_metadata::{ instruction, state::{ Collection, CollectionDetails, Creator, DataV2, Metadata as TmMetadata, - TokenMetadataAccount, TokenStandard, Uses, CREATE_FEE, FEE_FLAG_SET, - METADATA_FEE_FLAG_INDEX, PREFIX, + TokenMetadataAccount, TokenStandard, Uses, FEE_FLAG_SET, METADATA_FEE_FLAG_INDEX, PREFIX, }, ID, }; @@ -679,7 +678,7 @@ impl Metadata { let rent = context.banks_client.get_rent().await.unwrap(); let rent_exempt = rent.minimum_balance(account.data.len()); - let expected_lamports = rent_exempt + CREATE_FEE; + let expected_lamports = rent_exempt + SOLANA_CREATE_FEE; assert_eq!(account.lamports, expected_lamports); assert_eq!(account.data[METADATA_FEE_FLAG_INDEX], FEE_FLAG_SET); diff --git a/programs/token-metadata/program/tests/utils/mod.rs b/programs/token-metadata/program/tests/utils/mod.rs index f522a618..b915182b 100644 --- a/programs/token-metadata/program/tests/utils/mod.rs +++ b/programs/token-metadata/program/tests/utils/mod.rs @@ -28,6 +28,8 @@ pub const DEFAULT_COLLECTION_DETAILS: Option = { Some(CollectionDetails::V1 { size: 0 }) }; +pub const SOLANA_CREATE_FEE: u64 = 10_000_000; + pub fn program_test() -> ProgramTest { let mut program_test = ProgramTest::new("token_metadata", token_metadata::ID, None); program_test.add_program("spl_token_2022", spl_token_2022::ID, None);