Skip to content

Commit

Permalink
ShareClassMetadata struct for share class metadata (#28)
Browse files Browse the repository at this point in the history
Define a ShareClassMetadata struct and compute its INIT_SIZE that'll be
used later on in program
  • Loading branch information
yurushao authored Apr 1, 2024
1 parent b54a2a3 commit e7f14fd
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 56 deletions.
12 changes: 5 additions & 7 deletions anchor/programs/glam/src/instructions/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@ pub fn initialize_fund_handler<'c: 'info, 'info>(
fund_uri: String,
asset_weights: Vec<u32>,
activate: bool,
share_name: String,
share_symbol: String,
share_uri: String,
share_class_metadata: ShareClassMetadata,
) -> Result<()> {
//
// Validate the input
Expand Down Expand Up @@ -108,7 +106,7 @@ pub fn initialize_fund_handler<'c: 'info, 'info>(
let space =
ExtensionType::try_calculate_account_len::<StateMint>(&[ExtensionType::MetadataPointer])
.unwrap();
let metadata_space = 250; // we may need more space for metadata in the future
let metadata_space = ShareClassMetadata::INIT_SIZE;

let lamports_required = (Rent::get()?).minimum_balance(space + metadata_space);

Expand Down Expand Up @@ -161,9 +159,9 @@ pub fn initialize_fund_handler<'c: 'info, 'info>(
&share_metadata_authority.key(),
&share_mint.key(),
&share_mint_authority.key(),
share_name,
share_symbol,
share_uri,
share_class_metadata.name.clone(),
share_class_metadata.symbol.clone(),
share_class_metadata.uri.clone(),
);
solana_program::program::invoke_signed(
&init_token_metadata_ix,
Expand Down
9 changes: 3 additions & 6 deletions anchor/programs/glam/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ pub mod state;

use anchor_lang::prelude::*;

use crate::state::fund::*;
pub use constants::*;
pub use instructions::*;

Expand All @@ -23,9 +24,7 @@ pub mod glam {
fund_uri: String,
asset_weights: Vec<u32>,
activate: bool,
share_name: String,
share_symbol: String,
share_uri: String,
share_class_metadata: ShareClassMetadata,
) -> Result<()> {
manager::initialize_fund_handler(
ctx,
Expand All @@ -34,9 +33,7 @@ pub mod glam {
fund_uri,
asset_weights,
activate,
share_name,
share_symbol,
share_uri,
share_class_metadata,
)
}
pub fn update<'c: 'info, 'info>(
Expand Down
11 changes: 11 additions & 0 deletions anchor/programs/glam/src/state/fund.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,14 @@ pub struct Treasury {
impl Treasury {
pub const INIT_SIZE: usize = 32 + 32 + 1;
}

#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct ShareClassMetadata {
pub name: String,
pub symbol: String,
pub uri: String,
}
impl ShareClassMetadata {
// use the same max sizes as Fund
pub const INIT_SIZE: usize = MAX_FUND_NAME + MAX_FUND_SYMBOL + MAX_FUND_URI;
}
34 changes: 24 additions & 10 deletions anchor/target/idl/glam.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,10 @@
"type": "bool"
},
{
"name": "shareName",
"type": "string"
},
{
"name": "shareSymbol",
"type": "string"
},
{
"name": "shareUri",
"type": "string"
"name": "shareClassMetadata",
"type": {
"defined": "ShareClassMetadata"
}
}
]
},
Expand Down Expand Up @@ -639,6 +633,26 @@
}
],
"types": [
{
"name": "ShareClassMetadata",
"type": {
"kind": "struct",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "symbol",
"type": "string"
},
{
"name": "uri",
"type": "string"
}
]
}
},
{
"name": "InvestorError",
"type": {
Expand Down
68 changes: 48 additions & 20 deletions anchor/target/types/glam.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,10 @@ export type Glam = {
"type": "bool"
},
{
"name": "shareName",
"type": "string"
},
{
"name": "shareSymbol",
"type": "string"
},
{
"name": "shareUri",
"type": "string"
"name": "shareClassMetadata",
"type": {
"defined": "ShareClassMetadata"
}
}
]
},
Expand Down Expand Up @@ -639,6 +633,26 @@ export type Glam = {
}
],
"types": [
{
"name": "ShareClassMetadata",
"type": {
"kind": "struct",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "symbol",
"type": "string"
},
{
"name": "uri",
"type": "string"
}
]
}
},
{
"name": "InvestorError",
"type": {
Expand Down Expand Up @@ -773,16 +787,10 @@ export const IDL: Glam = {
"type": "bool"
},
{
"name": "shareName",
"type": "string"
},
{
"name": "shareSymbol",
"type": "string"
},
{
"name": "shareUri",
"type": "string"
"name": "shareClassMetadata",
"type": {
"defined": "ShareClassMetadata"
}
}
]
},
Expand Down Expand Up @@ -1340,6 +1348,26 @@ export const IDL: Glam = {
}
],
"types": [
{
"name": "ShareClassMetadata",
"type": {
"kind": "struct",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "symbol",
"type": "string"
},
{
"name": "uri",
"type": "string"
}
]
}
},
{
"name": "InvestorError",
"type": {
Expand Down
10 changes: 7 additions & 3 deletions anchor/tests/glam_crud.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ describe("glam_crud", () => {
program.programId
);

const shareClass = {
name: "Class A share",
symbol: "CLASS-A",
uri: "https://glam.systems/fund/XYZ/share/A"
};
const [sharePDA, shareBump] = PublicKey.findProgramAddressSync(
[anchor.utils.bytes.utf8.encode("share-0"), fundPDA.toBuffer()],
program.programId
Expand All @@ -62,9 +67,7 @@ describe("glam_crud", () => {
fundUri,
[0, 60, 40],
true,
"Class A share",
"CLASS-A",
"https://glam.systems/fund/XYZ/share/A"
shareClass
)
.accounts({
fund: fundPDA,
Expand All @@ -86,6 +89,7 @@ describe("glam_crud", () => {
}

const fund = await program.account.fund.fetch(fundPDA);
console.log(fund);
expect(fund.shareClassesLen).toEqual(1);
expect(fund.assetsLen).toEqual(3);
expect(fund.name).toEqual(fundName);
Expand Down
15 changes: 5 additions & 10 deletions web/src/app/glam/glam-data-access.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,11 @@ export function useGlamProgram() {
mutationKey: ["glam", "initialize", { cluster }],
mutationFn: (keypair: Keypair) =>
program.methods
.initialize(
"fund name",
"fund symbol",
"fund uri",
[0, 60, 40],
true,
"Class A share",
"A",
"https://glam.systems/fund/XYZ/share/A"
)
.initialize("fund name", "fund symbol", "fund uri", [0, 60, 40], true, {
name: "Class A share",
symbol: "A",
uri: "https://glam.systems/fund/XYZ/share/A"
})
.accounts({
// fund: fundPDA,
// treasury: treasuryPDA,
Expand Down

0 comments on commit e7f14fd

Please sign in to comment.