[{"data":1,"prerenderedAt":1667},["ShallowReactive",2],{"blog/articles/metaplex-under-the-hood-how-plugins-enable-lightweight-granular-state-management":3,"blog-article-related":942},{"name":4,"created_at":5,"published_at":6,"updated_at":7,"id":8,"uuid":9,"content":10,"slug":933,"full_slug":934,"sort_by_date":16,"position":935,"tag_list":936,"is_startpage":886,"parent_id":938,"meta_data":16,"group_id":939,"first_published_at":940,"release_id":16,"lang":930,"path":16,"alternates":941,"default_full_slug":16,"translated_slugs":16},"Metaplex under the hood: How Plugins Enable Lightweight, Granular State Management","2024-12-12T01:13:41.342Z","2025-01-27T19:53:56.752Z","2025-01-27T19:53:56.935Z",18302236,"e52dbf4e-fca2-47e0-895c-050296e524cc",{"seo":11,"_uid":22,"body":23,"date":877,"title":4,"component":878,"hero_media":879,"intro_text":890,"preview_media":891,"related_articles":900,"newsletter_signup":901,"preview_description":17},[12],{"_uid":13,"title":14,"og_image":15,"component":20,"description":21},"a50a87cc-80dc-4add-a650-953a37e04955","Metaplex under the hood: How Plugins Enable Lightweight, Granular State Management | Metaplex",{"id":16,"alt":16,"name":17,"focus":16,"title":16,"source":16,"filename":17,"copyright":16,"fieldtype":18,"meta_data":19},null,"","asset",{},"seo","Today, we’re diving deep to explore how Metaplex Core Assets manage to offer fully granular permissions and endless customization options — all while staying remarkably lightweight.","8fcb7782-04a5-4b8f-97ec-5d28eabca533",[24],{"_uid":25,"body":26,"component":876},"4d9173c4-406e-40e7-8aef-9af6a0139e10",{"type":27,"content":28},"doc",[29,34,42,49,85,94,111,115,119,126,133,137,145,149,156,173,195,202,208,229,236,246,249,269,274,283,284,291,307,312,321,323,338,343,352,360,367,371,375,379,383,390,400,408,415,419,423,437,442,454,459,480,485,492,498,503,511,513,520,524,543,548,563,568,577,582,589,594,599,607,609,628,635,639,648,653,667,672,682,687,697,702,709,714,719,727,729,736,740,766,771,780,785,794,799,809,814,824,829,836,841,846,854,856,864],{"type":30,"content":31},"paragraph",[32],{"text":21,"type":33},"text",{"type":30,"content":35},[36],{"type":37,"attrs":38},"image",{"id":39,"alt":17,"src":40,"title":17,"source":17,"copyright":17,"meta_data":41},1018444,"https://a-us.storyblok.com/f/1022298/640x193/e64a7e8ff9/0_rxsskp6aylypaec5.webp",{},{"type":30,"content":43},[44],{"text":45,"type":33,"marks":46},"We’re going to look at:",[47],{"type":48},"bold",{"type":50,"content":51},"bullet_list",[52,61,69,77],{"type":53,"content":54},"list_item",[55],{"type":30,"content":56},[57],{"text":58,"type":33,"marks":59},"State Blobs and Single Account Struct",[60],{"type":48},{"type":53,"content":62},[63],{"type":30,"content":64},[65],{"text":66,"type":33,"marks":67},"Anatomy of a Core Asset",[68],{"type":48},{"type":53,"content":70},[71],{"type":30,"content":72},[73],{"text":74,"type":33,"marks":75},"Granular State Managment and Permissions",[76],{"type":48},{"type":53,"content":78},[79],{"type":30,"content":80},[81],{"text":82,"type":33,"marks":83},"Plugins 101",[84],{"type":48},{"type":86,"attrs":87,"content":89},"heading",{"level":88},4,[90],{"text":91,"type":33,"marks":92},"Everything is a State Blobs",[93],{"type":48},{"type":30,"content":95},[96,98,109],{"text":97,"type":33},"In a recent conversation with Keith (aka ",{"text":99,"type":33,"marks":100},"Blockiosaurus",[101,107],{"type":102,"attrs":103},"link",{"href":104,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://x.com/blockiosaurus","_blank","url",{"type":108},"underline",{"text":110,"type":33},"), a cool insight behind how Core was built came up: “Fundamentally, onchain data is just a “blob” — a collection of unstructured bytes that we typically assign a specific meaning or structure to.”",{"type":30,"content":112},[113],{"text":114,"type":33},"Traditionally, protocols take these blobs and lock them into fixed structures to make them easier to work with. But when you’re crafting a standard that can truly evolve with the future of digital assets, you can’t just play by the old rules — you have to challenge the status quo.",{"type":30,"content":116},[117],{"text":118,"type":33},"Hearing this bit of lore got me curious. I wanted to dive deeper into the design choices behind Core and understand how this concept of treating on-chain data as fluid “blobs” was leveraged to build a flexible, plugin-based system to serve a wide range of use cases.",{"type":30,"content":120},[121],{"type":37,"attrs":122},{"id":123,"alt":17,"src":124,"title":17,"source":17,"copyright":17,"meta_data":125},1018449,"https://a-us.storyblok.com/f/1022298/640x362/c150d380cd/1_e2ub9k1tuzxrlvbew7nhuq.webp",{},{"type":86,"attrs":127,"content":128},{"level":88},[129],{"text":130,"type":33,"marks":131},"Resolving Account is a Pain",[132],{"type":48},{"type":30,"content":134},[135],{"text":136,"type":33},"The experience of building token metadata for NFTs on top of the SPL Token Program exposed a big limitation: trying to add custom behaviors by creating new accounts makes the standard bulky, complex, and hard to use. Every additional account becomes an obstacle, slowing down innovation and making the whole system less flexible.",{"type":30,"content":138},[139,143],{"text":140,"type":33,"marks":141},"Lesson learned:",[142],{"type":48},{"text":144,"type":33}," the new standard needed to be a single account — one that could hold both the data and any custom behaviours associated with the asset.",{"type":30,"content":146},[147],{"text":148,"type":33},"But how do you build a standard that takes the “crazy idea” of treating every piece of on-chain data as a fluid blob, and use that to create a single-account solution that handles thousands of different customizations and use cases?",{"type":86,"attrs":150,"content":151},{"level":88},[152],{"text":153,"type":33,"marks":154},"Anatomy of a Core Account",[155],{"type":48},{"type":30,"content":157},[158,160,165,167,171],{"text":159,"type":33},"Each Core State Accounts, like ",{"text":161,"type":33,"marks":162},"AssetV1",[163],{"type":164},"code",{"text":166,"type":33}," and ",{"text":168,"type":33,"marks":169},"CollectionV1",[170],{"type":164},{"text":172,"type":33},", are composed of two main parts:",{"type":50,"content":174},[175,185],{"type":53,"content":176},[177],{"type":30,"content":178},[179,183],{"text":180,"type":33,"marks":181},"The Data",[182],{"type":48},{"text":184,"type":33},": This is where all the essential asset information lives. This part is always there and it has a “fixed” length (except for those flexible fields like name and URI).",{"type":53,"content":186},[187],{"type":30,"content":188},[189,193],{"text":190,"type":33,"marks":191},"The Plugin Metadata",[192],{"type":48},{"text":194,"type":33},": This is the optional part of the account where all the additional functionalities and custom behaviours are defined.",{"type":30,"content":196},[197],{"type":37,"attrs":198},{"id":199,"alt":17,"src":200,"title":17,"source":17,"copyright":17,"meta_data":201},1018450,"https://a-us.storyblok.com/f/1022298/640x360/bad30bd1b9/1_mwuo0okqyv5rwtx2mxss9g.webp",{},{"type":86,"attrs":203,"content":204},{"level":88},[205],{"text":190,"type":33,"marks":206},[207],{"type":48},{"type":30,"content":209},[210,212,216,218,222,224,227],{"text":211,"type":33},"The Plugin Metadata is where the real magic happens. To help us understand where this metadata begins, there’s a handy helper function within the ",{"text":213,"type":33,"marks":214},"DataBlob",[215],{"type":164},{"text":217,"type":33}," trait, called ",{"text":219,"type":33,"marks":220},"get_size",[221],{"type":164},{"text":223,"type":33},". This function calculates the size of the asset by adding the base length of the ",{"text":161,"type":33,"marks":225},[226],{"type":164},{"text":228,"type":33}," struct with the lengths of the asset's name and URI, plus any optional sequences.",{"type":230,"attrs":231,"content":233},"code_block",{"class":232},"yd ye yf yg yh abk abj abl si abm eh ek",[234],{"text":235,"type":33},"\n// mpl-core/src/state/asset.rs\n\nimpl DataBlob for AssetV1 {\n    fn get_size(&self) -> usize {\n        let mut size = AssetV1::BASE_LENGTH + self.name.len() + self.uri.len();\n        if self.seq.is_some() {\n            size += size_of::\u003Cu64>();\n        }\n        size\n    }\n}",{"type":86,"attrs":237,"content":239},{"level":238},2,[240],{"text":241,"type":33,"marks":242},"mpl-core/programs/mpl-core/src/state/asset.rs at main · metaplex-foundation/mpl-core",[243],{"type":102,"attrs":244},{"href":245,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/state/asset.rs?source=post_page-----f3a2d5e869dd--------------------------------#L360",{"type":86,"attrs":247},{"level":248},3,{"type":30,"content":250},[251,253,256,258,262,264,267],{"text":252,"type":33},"This ",{"text":219,"type":33,"marks":254},[255],{"type":164},{"text":257,"type":33}," function is then used inside the ",{"text":259,"type":33,"marks":260},"create_meta_idempotent",[261],{"type":164},{"text":263,"type":33}," function to check if the Plugin Metadata has already been created by comparing the size of the asset with the size of the ",{"text":213,"type":33,"marks":265},[266],{"type":164},{"text":268,"type":33},".",{"type":230,"attrs":270,"content":271},{"class":232},[272],{"text":273,"type":33},"// mpl-core/src/plugins/utils.rs\n\npub fn create_meta_idempotent\u003C'a, T: SolanaAccount + DataBlob>(\n    account: &AccountInfo\u003C'a>,\n    payer: &AccountInfo\u003C'a>,\n    system_program: &AccountInfo\u003C'a>,\n) -> Result\u003C(T, PluginHeaderV1, PluginRegistryV1), ProgramError> {\n    let core = T::load(account, 0)?;\n    let header_offset = core.get_size();\n\n    // Check if the plugin header and registry exist.\n    if header_offset == account.data_len() {\n        // They don't exist, so create them.\n        /* .. */\n    } else {\n        // They exist, so load them.\n        /* .. */\n    }\n}",{"type":86,"attrs":275,"content":276},{"level":238},[277],{"text":278,"type":33,"marks":279},"mpl-core/programs/mpl-core/src/plugins/utils.rs at main · metaplex-foundation/mpl-core",[280],{"type":102,"attrs":281},{"href":282,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/plugins/utils.rs?source=post_page-----f3a2d5e869dd--------------------------------#L26",{"type":30},{"type":86,"attrs":285,"content":286},{"level":88},[287],{"text":288,"type":33,"marks":289},"The Plugin Header and Registry",[290],{"type":48},{"type":30,"content":292},[293,295,299,301,305],{"text":294,"type":33},"At the start of the Plugin Metadata, there is the",{"text":296,"type":33,"marks":297},"PluginHeader",[298],{"type":164},{"text":300,"type":33},". This header contains the ",{"text":302,"type":33,"marks":303},"plugin_registry_offset",[304],{"type":164},{"text":306,"type":33},"—a pointer that indicates where in the account the Plugin Registry is located.",{"type":230,"attrs":308,"content":309},{"class":232},[310],{"text":311,"type":33},"// programs/mpl-core/src/plugins/plugin_header.rs\n\npub struct PluginHeaderV1 {\n    /// The Discriminator of the header which doubles as a Plugin metadata version.\n    pub key: Key, // 1\n    /// The offset to the plugin registry stored at the end of the account.\n    pub plugin_registry_offset: usize, // 8\n}",{"type":86,"attrs":313,"content":314},{"level":238},[315],{"text":316,"type":33,"marks":317},"mpl-core/programs/mpl-core/src/plugins/plugin_header.rs at main · metaplex-foundation/mpl-core",[318],{"type":102,"attrs":319},{"href":320,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/plugins/plugin_header.rs?source=post_page-----f3a2d5e869dd--------------------------------#L10",{"type":86,"attrs":322},{"level":248},{"type":30,"content":324},[325,327,331,332,336],{"text":326,"type":33},"The Plugin Registry is where all the important action takes place. It holds a vector of both ",{"text":328,"type":33,"marks":329},"RegistryRecord",[330],{"type":164},{"text":166,"type":33},{"text":333,"type":33,"marks":334},"ExternalRegistryRecord",[335],{"type":164},{"text":337,"type":33},", which store details about available plugins and their essential information.",{"type":230,"attrs":339,"content":340},{"class":232},[341],{"text":342,"type":33},"// programs/mpl-core/src/plugins/plugin_registry.rs\n\npub struct PluginRegistryV1 {\n    /// The Discriminator of the header which doubles as a plugin metadata version.\n    pub key: Key, // 1\n    /// The registry of all plugins.\n    pub registry: Vec\u003CRegistryRecord>, // 4\n    /// The registry of all adapter, third party, plugins.\n    pub external_registry: Vec\u003CExternalRegistryRecord>, // 4\n}\n\n/* .. */\n\npub struct RegistryRecord {\n    /// The type of plugin.\n    pub plugin_type: PluginType, // 2\n    /// The authority who has permission to utilize a plugin.\n    pub authority: Authority, // Variable\n    /// The offset to the plugin in the account.\n    pub offset: usize, // 8\n}\n\n/* .. */\n\npub struct ExternalRegistryRecord {\n    /// The adapter, third party plugin type.\n    pub plugin_type: ExternalPluginAdapterType,\n    /// The authority of the external plugin adapter.\n    pub authority: Authority,\n    /// The lifecyle events for which the the external plugin adapter is active.\n    pub lifecycle_checks: Option\u003CVec\u003C(HookableLifecycleEvent, ExternalCheckResult)>>,\n    /// The offset to the plugin in the account.\n    pub offset: usize, // 8\n    /// For plugins with data, the offset to the data in the account.\n    pub data_offset: Option\u003Cusize>,\n    /// For plugins with data, the length of the data in the account.\n    pub data_len: Option\u003Cusize>,\n}",{"type":86,"attrs":344,"content":345},{"level":238},[346],{"text":347,"type":33,"marks":348},"mpl-core/programs/mpl-core/src/plugins/plugin_registry.rs at main · metaplex-foundation/mpl-core",[349],{"type":102,"attrs":350},{"href":351,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/plugins/plugin_registry.rs?source=post_page-----f3a2d5e869dd--------------------------------#L20",{"type":86,"attrs":353,"content":354},{"level":248},[355],{"type":37,"attrs":356},{"id":357,"alt":17,"src":358,"title":17,"source":17,"copyright":17,"meta_data":359},1018451,"https://a-us.storyblok.com/f/1022298/1100x619/653032e964/1_dqd-e3umybqz2_cqgoojvq.webp",{},{"type":86,"attrs":361,"content":362},{"level":88},[363],{"text":364,"type":33,"marks":365},"Granular Permissions Enabled by State Blobs",[366],{"type":48},{"type":30,"content":368},[369],{"text":370,"type":33},"Earlier in this article, we touched on the concept of State Blobs — treating on-chain data as unstructured “blobs” that can be defined dynamically. But we haven’t yet talked about how this is leveraged beyond just setting up the registry.",{"type":30,"content":372},[373],{"text":374,"type":33},"The flexibility to support customizable structures rather than forcing behaviors into rigid formats is what enables granular permissions and state managment for Core!",{"type":30,"content":376},[377],{"text":378,"type":33},"Each plugin defines its own “cookie policy” for permissions, specifying who can perform certain actions. While the authority is always present in the registry, everything else can be adjusted as needed.",{"type":30,"content":380},[381],{"text":382,"type":33},"The main challenge lies in ensuring these different authorities and permissions don’t conflict. Managing this complexity is part of Core’s validation system — a topic detailed enough to warrant its own discussion later.",{"type":86,"attrs":384,"content":385},{"level":88},[386],{"text":387,"type":33,"marks":388},"Plugins101",[389],{"type":48},{"type":30,"content":391},[392,394,398],{"text":393,"type":33},"Now that you have a clearer understanding of how plugins operates, you might be wondering how all this magic happens within the ",{"text":395,"type":33,"marks":396},"mpl-core",[397],{"type":164},{"text":399,"type":33}," program. Let's take a closer look, step-by-step, at the specific instructions for managing plugins within this system.",{"type":30,"content":401},[402,406],{"text":403,"type":33,"marks":404},"Note",[405],{"type":48},{"text":407,"type":33},": you’re about to dive into a more technical landscape. But don’t worry! I’ll break down each step and the underlying logic to simplify the complexity as much as possible and some visual aids!",{"type":86,"attrs":409,"content":410},{"level":88},[411],{"text":412,"type":33,"marks":413},"List all plugins in an account",[414],{"type":48},{"type":30,"content":416},[417],{"text":418,"type":33},"Based on the previous discussion about the Plugin Registry, it shouldn’t come as a surprise the way the retrieval of the list of all the plugins associated with an asset works.",{"type":30,"content":420},[421],{"text":422,"type":33},"This process follows a “basic” sequence of events that we use whenever we’re dealing with plugin actions:",{"type":30,"content":424},[425,429,431,435],{"text":426,"type":33,"marks":427},"1. Get & Load the Plugin Header",[428],{"type":48},{"text":430,"type":33},": Use the ",{"text":432,"type":33,"marks":433},"get_size()",[434],{"type":164},{"text":436,"type":33}," function we covered earlier to determine where the Plugin Header starts.",{"type":230,"attrs":438,"content":439},{"class":232},[440],{"text":441,"type":33},"let header = PluginHeaderV1::load(account, asset.get_size())?;",{"type":30,"content":443},[444,448,449,452],{"text":445,"type":33,"marks":446},"2. Get & Load the Plugin Registry",[447],{"type":48},{"text":430,"type":33},{"text":302,"type":33,"marks":450},[451],{"type":164},{"text":453,"type":33}," field from the Plugin Header to locate the Plugin Registry.",{"type":230,"attrs":455,"content":456},{"class":232},[457],{"text":458,"type":33},"let PluginRegistryV1 { registry, .. } =\n  PluginRegistryV1::load(account, header.plugin_registry_offset)?;",{"type":30,"content":460},[461,463,467,469,472,474,478],{"text":462,"type":33},"3. ",{"text":464,"type":33,"marks":465},"Iterate through the Plugin Registry",[466],{"type":48},{"text":468,"type":33},": Loop through the ",{"text":328,"type":33,"marks":470},[471],{"type":164},{"text":473,"type":33}," vector, collect each plugin present in the ",{"text":475,"type":33,"marks":476},"plugin_type",[477],{"type":164},{"text":479,"type":33},", and return that as the response.",{"type":230,"attrs":481,"content":482},{"class":232},[483],{"text":484,"type":33},"Ok(registry\n  .iter()\n  .map(|registry_record| registry_record.plugin_type)\n  .collect()\n)",{"type":30,"content":486},[487],{"type":37,"attrs":488},{"id":489,"alt":17,"src":490,"title":17,"source":17,"copyright":17,"meta_data":491},1018453,"https://a-us.storyblok.com/f/1022298/1100x622/88989d6b8f/1_3jzyguiys7eysoujyjlf-a.webp",{},{"type":30,"content":493},[494],{"text":495,"type":33,"marks":496},"Full Instruction",[497],{"type":48},{"type":230,"attrs":499,"content":500},{"class":232},[501],{"text":502,"type":33},"// mpl-core/src/plugins/utils.rs\n\npub fn list_plugins(account: &AccountInfo) -> Result\u003CVec\u003CPluginType>, ProgramError> {\n    let asset = AssetV1::load(account, 0)?;\n\n    if asset.get_size() == account.data_len() {\n        return Err(MplCoreError::PluginNotFound.into());\n    }\n\n    let header = PluginHeaderV1::load(account, asset.get_size())?;\n    let PluginRegistryV1 { registry, .. } =\n        PluginRegistryV1::load(account, header.plugin_registry_offset)?;\n\n    Ok(registry\n        .iter()\n        .map(|registry_record| registry_record.plugin_type)\n        .collect())\n}\n",{"type":86,"attrs":504,"content":505},{"level":238},[506],{"text":278,"type":33,"marks":507},[508],{"type":102,"attrs":509},{"href":510,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/plugins/utils.rs?source=post_page-----f3a2d5e869dd--------------------------------#L240",{"type":86,"attrs":512},{"level":248},{"type":86,"attrs":514,"content":515},{"level":88},[516],{"text":517,"type":33,"marks":518},"Fetch the plugin data from the registry",[519],{"type":48},{"type":30,"content":521},[522],{"text":523,"type":33},"To fetch specific plugin data from the registry, we start from the point where we load the Plugin Registry:",{"type":30,"content":525},[526,528,532,534,537,539,542],{"text":527,"type":33},"1. ",{"text":529,"type":33,"marks":530},"Locate the Plugin in the Registry",[531],{"type":48},{"text":533,"type":33},": Iterate through the Plugin Registry and find the plugin you’re looking for by matching the ",{"text":475,"type":33,"marks":535},[536],{"type":164},{"text":538,"type":33},". Retrieve the ",{"text":328,"type":33,"marks":540},[541],{"type":164},{"text":268,"type":33},{"type":230,"attrs":544,"content":545},{"class":232},[546],{"text":547,"type":33},"let registry_record = registry\n    .iter()\n    .find(|record| record.plugin_type == plugin_type)\n    .ok_or(MplCoreError::PluginNotFound)?;",{"type":30,"content":549},[550,552,556,558,561],{"text":551,"type":33},"2. ",{"text":553,"type":33,"marks":554},"Deserialize the Plugin Data",[555],{"type":48},{"text":557,"type":33},": Verify that the plugin at the offset saved in the ",{"text":328,"type":33,"marks":559},[560],{"type":164},{"text":562,"type":33}," is the correct one and deserialize the plugin data by getting all the data from the flag onwards.",{"type":230,"attrs":564,"content":565},{"class":232},[566],{"text":567,"type":33},"let plugin = Plugin::deserialize(&mut &(*account.data).borrow()[registry_record.offset..])?;\n\nif PluginType::from(&plugin) != plugin_type {\n    return Err(MplCoreError::PluginNotFound.into());\n}\n\nlet inner = U::deserialize(\n    &mut &(*account.data).borrow()[registry_record\n        .offset\n        .checked_add(1)\n        .ok_or(MplCoreError::NumericalOverflow)?..],\n)?;",{"type":30,"content":569},[570,571,575],{"text":462,"type":33},{"text":572,"type":33,"marks":573},"Return the Plugin Details",[574],{"type":48},{"text":576,"type":33},": Return the authority, data, and offset from the deserialized slices.",{"type":230,"attrs":578,"content":579},{"class":232},[580],{"text":581,"type":33},"Ok((registry_record.authority, inner, registry_record.offset))",{"type":30,"content":583},[584],{"type":37,"attrs":585},{"id":586,"alt":17,"src":587,"title":17,"source":17,"copyright":17,"meta_data":588},1018454,"https://a-us.storyblok.com/f/1022298/1100x622/71773b6eb3/1_rrdlzw2_qdmgignl0n2xia.webp",{},{"type":30,"content":590},[591],{"text":495,"type":33,"marks":592},[593],{"type":48},{"type":230,"attrs":595,"content":596},{"class":232},[597],{"text":598,"type":33},"// mpl-core/src/plugins/utils.rs\n\npub fn fetch_plugin\u003CT: DataBlob + SolanaAccount, U: BorshDeserialize>(\n    account: &AccountInfo,\n    plugin_type: PluginType,\n) -> Result\u003C(Authority, U, usize), ProgramError> {\n    let asset = T::load(account, 0)?;\n\n    if asset.get_size() == account.data_len() {\n        return Err(MplCoreError::PluginNotFound.into());\n    }\n\n    let header = PluginHeaderV1::load(account, asset.get_size())?;\n    let PluginRegistryV1 { registry, .. } =\n        PluginRegistryV1::load(account, header.plugin_registry_offset)?;\n\n    \n    // Deserialize the plugin.\n    let plugin = Plugin::deserialize(&mut &(*account.data).borrow()[registry_record.offset..])?;\n\n    if PluginType::from(&plugin) != plugin_type {\n        return Err(MplCoreError::PluginNotFound.into());\n    }\n\n    let inner = U::deserialize(\n        &mut &(*account.data).borrow()[registry_record\n            .offset\n            .checked_add(1)\n            .ok_or(MplCoreError::NumericalOverflow)?..],\n    )?;\n\n    // Return the plugin and its authority.\n    Ok((registry_record.authority, inner, registry_record.offset))\n}",{"type":86,"attrs":600,"content":601},{"level":238},[602],{"text":278,"type":33,"marks":603},[604],{"type":102,"attrs":605},{"href":606,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/plugins/utils.rs?source=post_page-----f3a2d5e869dd--------------------------------#L113",{"type":86,"attrs":608},{"level":248},{"type":30,"content":610},[611,614,616,620,622,626],{"text":403,"type":33,"marks":612},[613],{"type":48},{"text":615,"type":33},": you might have seen that the ",{"text":617,"type":33,"marks":618},"fetch_plugin",[619],{"type":164},{"text":621,"type":33}," function uses a generic type ",{"text":623,"type":33,"marks":624},"U",[625],{"type":164},{"text":627,"type":33}," to handle the deserialization of the inner data of a plugin. This is because the inner data structure of plugins can vary widely in both type and size so this flexibility is crucial for handling varying internal representations.",{"type":86,"attrs":629,"content":630},{"level":88},[631],{"text":632,"type":33,"marks":633},"Add Plugin",[634],{"type":48},{"type":30,"content":636},[637],{"text":638,"type":33},"To add a specific plugin data from the registry, we start from the point where we load the Plugin Registry:",{"type":30,"content":640},[641,642,646],{"text":527,"type":33},{"text":643,"type":33,"marks":644},"Check for Duplicate Plugins:",[645],{"type":48},{"text":647,"type":33}," Before adding the plugin, ensure that a plugin of the same type doesn’t already exist in the registry. If a duplicate is found, the function returns an error to avoid conflicting entries or overwrites.",{"type":230,"attrs":649,"content":650},{"class":232},[651],{"text":652,"type":33},"if plugin_registry\n    .registry\n    .iter()\n    .any(|record| record.plugin_type == plugin_type)\n{\n    return Err(MplCoreError::PluginAlreadyExists.into());\n}",{"type":30,"content":654},[655,656,660,662,665],{"text":551,"type":33},{"text":657,"type":33,"marks":658},"Calculate New Offsets and Size Adjustments:",[659],{"type":48},{"text":661,"type":33}," Determine where the new plugin data will be stored by calculating the new offset for the plugin registry. Also, compute the total size increase required for the account to accommodate the new plugin data. After that update the ",{"text":302,"type":33,"marks":663},[664],{"type":164},{"text":666,"type":33}," in the header to reflect the new location for the registry.",{"type":230,"attrs":668,"content":669},{"class":232},[670],{"text":671,"type":33},"let old_registry_offset = plugin_header.plugin_registry_offset;\n\nlet new_registry_record = RegistryRecord {\n    plugin_type,\n    offset: old_registry_offset,\n    authority: *authority,\n};\n\nlet size_increase = plugin_size\n    .checked_add(new_registry_record.try_to_vec()?.len())\n    .ok_or(MplCoreError::NumericalOverflow)?;\n\nlet new_registry_offset = plugin_header\n    .plugin_registry_offset\n    .checked_add(plugin_size)\n    .ok_or(MplCoreError::NumericalOverflow)?;\n\nplugin_header.plugin_registry_offset = new_registry_offset;\nplugin_registry.registry.push(new_registry_record);",{"type":30,"content":673},[674,676,680],{"text":675,"type":33},"3.",{"text":677,"type":33,"marks":678}," Resize or Reallocate Account Data:",[679],{"type":48},{"text":681,"type":33}," If needed, resize or reallocate the account to accommodate the new plugin data. This ensures there’s enough space for the updated data without causing overflow errors.",{"type":230,"attrs":683,"content":684},{"class":232},[685],{"text":686,"type":33},"let new_size = account\n   .data_len()\n   .checked_add(size_increase)\n   .ok_or(MplCoreError::NumericalOverflow)?;\n\nresize_or_reallocate_account(account, payer, system_program, new_size)?;",{"type":30,"content":688},[689,691,695],{"text":690,"type":33},"4.",{"text":692,"type":33,"marks":693}," Save the Updated State:",[694],{"type":48},{"text":696,"type":33}," Save the updated plugin header, the serialized plugin data, and the updated plugin registry back to the account to finalize the changes.",{"type":230,"attrs":698,"content":699},{"class":232},[700],{"text":701,"type":33},"plugin_header.save(account, header_offset)?;\nplugin.save(account, old_registry_offset)?;\nplugin_registry.save(account, new_registry_offset)?;",{"type":30,"content":703},[704],{"type":37,"attrs":705},{"id":706,"alt":17,"src":707,"title":17,"source":17,"copyright":17,"meta_data":708},1018455,"https://a-us.storyblok.com/f/1022298/1100x622/7c2af5d074/1_pzmwf4ywqmecfo_uwg4oka.webp",{},{"type":30,"content":710},[711],{"text":495,"type":33,"marks":712},[713],{"type":48},{"type":230,"attrs":715,"content":716},{"class":232},[717],{"text":718,"type":33},"// mpl-core/src/plugins/utils.rs\n\npub fn initialize_plugin\u003C'a, T: DataBlob + SolanaAccount>(\n    plugin: &Plugin,\n    authority: &Authority,\n    plugin_header: &mut PluginHeaderV1,\n    plugin_registry: &mut PluginRegistryV1,\n    account: &AccountInfo\u003C'a>,\n    payer: &AccountInfo\u003C'a>,\n    system_program: &AccountInfo\u003C'a>,\n) -> ProgramResult {\n    let core = T::load(account, 0)?;\n    let header_offset = core.get_size();\n    let plugin_type = plugin.into();\n    let plugin_data = plugin.try_to_vec()?;\n    let plugin_size = plugin_data.len();\n\n    // You cannot add a duplicate plugin.\n    if plugin_registry\n        .registry\n        .iter()\n        .any(|record| record.plugin_type == plugin_type)\n    {\n        return Err(MplCoreError::PluginAlreadyExists.into());\n    }\n\n    let old_registry_offset = plugin_header.plugin_registry_offset;\n\n    let new_registry_record = RegistryRecord {\n        plugin_type,\n        offset: old_registry_offset,\n        authority: *authority,\n    };\n\n    let size_increase = plugin_size\n        .checked_add(new_registry_record.try_to_vec()?.len())\n        .ok_or(MplCoreError::NumericalOverflow)?;\n\n    let new_registry_offset = plugin_header\n        .plugin_registry_offset\n        .checked_add(plugin_size)\n        .ok_or(MplCoreError::NumericalOverflow)?;\n\n    plugin_header.plugin_registry_offset = new_registry_offset;\n\n    plugin_registry.registry.push(new_registry_record);\n\n    let new_size = account\n        .data_len()\n        .checked_add(size_increase)\n        .ok_or(MplCoreError::NumericalOverflow)?;\n\n    resize_or_reallocate_account(account, payer, system_program, new_size)?;\n    plugin_header.save(account, header_offset)?;\n    plugin.save(account, old_registry_offset)?;\n    plugin_registry.save(account, new_registry_offset)?;\n\n    Ok(())\n}",{"type":86,"attrs":720,"content":721},{"level":238},[722],{"text":278,"type":33,"marks":723},[724],{"type":102,"attrs":725},{"href":726,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/plugins/utils.rs?source=post_page-----f3a2d5e869dd--------------------------------#L258",{"type":86,"attrs":728},{"level":248},{"type":86,"attrs":730,"content":731},{"level":88},[732],{"text":733,"type":33,"marks":734},"Remove Plugin",[735],{"type":48},{"type":30,"content":737},[738],{"text":739,"type":33},"To remove a specific plugin data from the registry, we start from the point where we load the Plugin Registry:",{"type":30,"content":741},[742,744,748,750,754,756,759,761,764],{"text":743,"type":33},"1.",{"text":745,"type":33,"marks":746}," Locate the Plugin to Remove:",[747],{"type":48},{"text":749,"type":33}," Iterate through the ",{"text":751,"type":33,"marks":752},"plugin_registry",[753],{"type":164},{"text":755,"type":33}," to find the ",{"text":328,"type":33,"marks":757},[758],{"type":164},{"text":760,"type":33}," corresponding to the ",{"text":475,"type":33,"marks":762},[763],{"type":164},{"text":765,"type":33}," you want to delete. If the plugin is not found, return an error.",{"type":230,"attrs":767,"content":768},{"class":232},[769],{"text":770,"type":33},"if let Some(index) = plugin_registry\n    .registry\n    .iter_mut()\n    .position(|record| record.plugin_type == *plugin_type)\n{\n    let registry_record = plugin_registry.registry.remove(index);\n    let serialized_registry_record = registry_record.try_to_vec()?;",{"type":30,"content":772},[773,774,778],{"text":551,"type":33},{"text":775,"type":33,"marks":776},"Retrieve and Remove the Plugin Data:",[777],{"type":48},{"text":779,"type":33}," Fetch the offset of the plugin to be removed and load the plugin data. Calculate the offsets and sizes to determine how much space will be freed up.",{"type":230,"attrs":781,"content":782},{"class":232},[783],{"text":784,"type":33},"let plugin_offset = registry_record.offset;\nlet plugin = Plugin::load(account, plugin_offset)?;\nlet serialized_plugin = plugin.try_to_vec()?;\n\nlet next_plugin_offset = plugin_offset\n    .checked_add(serialized_plugin.len())\n    .ok_or(MplCoreError::NumericalOverflow)?;",{"type":30,"content":786},[787,788,792],{"text":462,"type":33},{"text":789,"type":33,"marks":790},"Calculate the New Size of the Account: ",[791],{"type":48},{"text":793,"type":33},"Calculate the new size of the account after removing the plugin data and the associated registry record.",{"type":230,"attrs":795,"content":796},{"class":232},[797],{"text":798,"type":33},"let new_size = account\n   .data_len()\n   .checked_sub(serialized_registry_record.len())\n   .ok_or(MplCoreError::NumericalOverflow)?\n   .checked_sub(serialized_plugin.len())\n   .ok_or(MplCoreError::NumericalOverflow)?;\n\nlet new_registry_offset = header\n   .plugin_registry_offset\n   .checked_sub(serialized_plugin.len())\n   .ok_or(MplCoreError::NumericalOverflow)?;",{"type":30,"content":800},[801,803,807],{"text":802,"type":33},"4. ",{"text":804,"type":33,"marks":805},"Shift Remaining Data to Fill the Gap",[806],{"type":48},{"text":808,"type":33},": Shift the remaining data in the account to fill the gap left by the removed plugin. This step prevents any unused or wasted space.",{"type":230,"attrs":810,"content":811},{"class":232},[812],{"text":813,"type":33},"let data_to_move = header\n   .plugin_registry_offset\n   .checked_sub(next_plugin_offset)\n   .ok_or(MplCoreError::NumericalOverflow)?;\n\nlet src = account.data.borrow()[next_plugin_offset..].to_vec();\n\nsol_memcpy(\n   &mut account.data.borrow_mut()[plugin_offset..],\n   &src,\n   data_to_move,\n);",{"type":30,"content":815},[816,818,822],{"text":817,"type":33},"5. ",{"text":819,"type":33,"marks":820},"Update Offsets for Remaining Records and Resize Account:",[821],{"type":48},{"text":823,"type":33}," Adjust the offsets for the remaining plugins in both the internal and external registries to account for the removed data, and resize the account to reflect the freed-up space.",{"type":230,"attrs":825,"content":826},{"class":232},[827],{"text":828,"type":33},"header.plugin_registry_offset = new_registry_offset;\nheader.save(account, asset.get_size())?;\n\n// Move offsets for existing registry records.\nplugin_registry.bump_offsets(plugin_offset, -(serialized_plugin.len() as isize))?;\n\nplugin_registry.save(account, new_registry_offset)?;\n\nresize_or_reallocate_account(account, payer, system_program, new_size)?;",{"type":30,"content":830},[831],{"type":37,"attrs":832},{"id":833,"alt":17,"src":834,"title":17,"source":17,"copyright":17,"meta_data":835},1018457,"https://a-us.storyblok.com/f/1022298/1100x622/bde6a9e004/1_d6nkzj0qgyv_uxy1kcz5vq.webp",{},{"type":30,"content":837},[838],{"text":495,"type":33,"marks":839},[840],{"type":48},{"type":230,"attrs":842,"content":843},{"class":232},[844],{"text":845,"type":33},"pub fn delete_plugin\u003C'a, T: DataBlob>(\n    plugin_type: &PluginType,\n    asset: &T,\n    account: &AccountInfo\u003C'a>,\n    payer: &AccountInfo\u003C'a>,\n    system_program: &AccountInfo\u003C'a>,\n) -> ProgramResult {\n    if asset.get_size() == account.data_len() {\n        return Err(MplCoreError::PluginNotFound.into());\n    }\n\n    let mut header = PluginHeaderV1::load(account, asset.get_size())?;\n    let mut plugin_registry = PluginRegistryV1::load(account, header.plugin_registry_offset)?;\n\n    if let Some(index) = plugin_registry\n        .registry\n        .iter_mut()\n        .position(|record| record.plugin_type == *plugin_type)\n    {\n        let registry_record = plugin_registry.registry.remove(index);\n        let serialized_registry_record = registry_record.try_to_vec()?;\n\n        // Fetch the offset of the plugin to be removed.\n        let plugin_offset = registry_record.offset;\n        let plugin = Plugin::load(account, plugin_offset)?;\n        let serialized_plugin = plugin.try_to_vec()?;\n\n        // Get the offset of the plugin after the one being removed.\n        let next_plugin_offset = plugin_offset\n            .checked_add(serialized_plugin.len())\n            .ok_or(MplCoreError::NumericalOverflow)?;\n\n        // Calculate the new size of the account.\n        let new_size = account\n            .data_len()\n            .checked_sub(serialized_registry_record.len())\n            .ok_or(MplCoreError::NumericalOverflow)?\n            .checked_sub(serialized_plugin.len())\n            .ok_or(MplCoreError::NumericalOverflow)?;\n\n        let new_registry_offset = header\n            .plugin_registry_offset\n            .checked_sub(serialized_plugin.len())\n            .ok_or(MplCoreError::NumericalOverflow)?;\n\n        let data_to_move = header\n            .plugin_registry_offset\n            .checked_sub(next_plugin_offset)\n            .ok_or(MplCoreError::NumericalOverflow)?;\n\n        let src = account.data.borrow()[next_plugin_offset..].to_vec();\n        sol_memcpy(\n            &mut account.data.borrow_mut()[plugin_offset..],\n            &src,\n            data_to_move,\n        );\n\n        header.plugin_registry_offset = new_registry_offset;\n        header.save(account, asset.get_size())?;\n\n        // Move offsets for existing registry records.\n        plugin_registry.bump_offsets(plugin_offset, -(serialized_plugin.len() as isize))?;\n\n        plugin_registry.save(account, new_registry_offset)?;\n\n        resize_or_reallocate_account(account, payer, system_program, new_size)?;\n    } else {\n        return Err(MplCoreError::PluginNotFound.into());\n    }\n\n    Ok(())\n}",{"type":86,"attrs":847,"content":848},{"level":238},[849],{"text":278,"type":33,"marks":850},[851],{"type":102,"attrs":852},{"href":853,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://github.com/metaplex-foundation/mpl-core/blob/main/programs/mpl-core/src/plugins/utils.rs?source=post_page-----f3a2d5e869dd--------------------------------#L573",{"type":86,"attrs":855},{"level":248},{"type":30,"content":857},[858,862],{"text":859,"type":33,"marks":860},"Congratulation",[861],{"type":48},{"text":863,"type":33},"! You now know everything about what makes Core Plugins so special. This is just a part of the technology that power Core, the new Metaplex Standard that aims to revolutionize how we think about digital assets.",{"type":30,"content":865},[866,868,875],{"text":867,"type":33},"If want to learn more about Core, and Metaplex in general, check out the developer portal: ",{"text":869,"type":33,"marks":870},"here",[871,874],{"type":102,"attrs":872},{"href":873,"uuid":16,"anchor":16,"target":105,"linktype":106},"https://developers.metaplex.com/",{"type":108},{"text":268,"type":33},"blog-article-content","2024-10-01 00:00","blog-article",[880],{"_uid":881,"image":882,"video":887,"component":889},"62e30917-aa6f-40c3-89f2-dbad112c5010",{"id":883,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":884,"copyright":17,"fieldtype":18,"meta_data":885,"is_external_url":886},1028327,"https://a-us.storyblok.com/f/1022298/568x566/8b573ba6c8/core-in-color.png",{},false,{"id":16,"alt":16,"name":17,"focus":16,"title":16,"source":16,"filename":17,"copyright":16,"fieldtype":18,"meta_data":888},{},"media","A diving deep to explore how Metaplex Core Assets manage to offer fully granular permissions and endless customization options — all while staying remarkably lightweight.",[892],{"_uid":893,"image":894,"video":898,"component":889},"e0e14dc2-7633-4ab2-b22e-8f2282e832fc",{"id":895,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":896,"copyright":17,"fieldtype":18,"meta_data":897,"is_external_url":886},1028315,"https://a-us.storyblok.com/f/1022298/735x506/196b8c56a0/plugin-image.png",{},{"id":16,"alt":16,"name":17,"focus":16,"title":16,"source":16,"filename":17,"copyright":16,"fieldtype":18,"meta_data":899},{},[],[902],{"name":903,"created_at":904,"published_at":905,"updated_at":906,"id":907,"uuid":908,"content":909,"slug":924,"full_slug":925,"sort_by_date":16,"position":926,"tag_list":927,"is_startpage":886,"parent_id":928,"meta_data":16,"group_id":929,"first_published_at":905,"release_id":16,"lang":930,"path":16,"alternates":931,"default_full_slug":16,"translated_slugs":16,"_stopResolving":932},"Blog Newsletter","2025-01-27T16:35:48.990Z","2025-01-27T16:37:47.202Z","2025-01-27T16:37:47.226Z",20877510,"93dbf1b7-11e4-4e78-bbd8-01d316b0d3f1",{"_uid":910,"headline":911,"component":923},"34dba7c8-f481-447e-a1f3-21a7f44ecb41",{"type":27,"content":912},[913],{"type":30,"content":914},[915,917,921],{"text":916,"type":33},"Stay up-to-date with the latest ",{"text":918,"type":33,"marks":919},"Metaplex",[920],{"type":48},{"text":922,"type":33}," insights","newsletter-signup","blog-newsletter","blog/blog-newsletter",0,[],15686866,"00505eb7-2e37-4538-bb81-612807f79964","default",[],true,"metaplex-under-the-hood-how-plugins-enable-lightweight-granular-state-management","blog/articles/metaplex-under-the-hood-how-plugins-enable-lightweight-granular-state-management",-370,[937],"Guide",15686870,"06531cd6-9fbd-4379-8633-ab3d8d10671d","2024-12-12T01:22:48.010Z",[],[943,978,1006,1036,1065,1093,1121,1150,1178,1206,1235,1263,1291,1319,1348,1376,1404,1433,1461,1491,1522,1550,1579,1609,1638],{"name":944,"created_at":945,"published_at":946,"updated_at":947,"id":948,"uuid":949,"content":950,"slug":969,"full_slug":970,"sort_by_date":16,"position":971,"tag_list":972,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":975,"first_published_at":976,"release_id":16,"lang":930,"path":16,"alternates":977,"default_full_slug":16,"translated_slugs":16},"Virtuals Protocol","2025-02-17T10:12:18.808Z","2025-02-17T10:19:17.229Z","2025-02-17T10:19:17.246Z",22493721,"d160452c-f1cb-4b45-834c-2d82832635f5",{"cta":951,"_uid":958,"logo":959,"name":944,"component":967,"description":968},[952],{"url":953,"_uid":956,"text":957,"component":102},{"id":17,"url":954,"target":105,"linktype":106,"fieldtype":955,"cached_url":954},"https://x.com/virtuals_io","multilink","f84a5972-6e39-424a-91b8-f50383b7cf6d","Visit Site","f0675f0f-0ab3-413d-943a-43d9a8d88c59",[960],{"svg":961,"_uid":965,"component":966},{"id":962,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":963,"copyright":17,"fieldtype":18,"meta_data":964,"is_external_url":886},1094522,"https://a-us.storyblok.com/f/1022298/121x56/a2cdd9df8a/virtuals-protocol.svg",{},"f621cfd5-9db9-4ee9-9909-ecb0a3dcf961","vector-graphic","ecosystem-entry","Virtuals is a protocol that enables buying, selling and creating of AI agents on Solana and Base.","virtuals-protocol","ecosystem/entries/virtuals-protocol",-1450,[973],"AI",15256385,"600f4a34-be6c-4edf-9e61-f33fd8ecb56c","2025-02-17T10:17:10.494Z",[],{"name":979,"created_at":980,"published_at":981,"updated_at":982,"id":983,"uuid":984,"content":985,"slug":1000,"full_slug":1001,"sort_by_date":16,"position":1002,"tag_list":1003,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1004,"first_published_at":981,"release_id":16,"lang":930,"path":16,"alternates":1005,"default_full_slug":16,"translated_slugs":16},"AIPool","2025-02-11T20:00:12.505Z","2025-02-11T20:03:32.804Z","2025-02-11T20:03:32.821Z",22070718,"6338889f-1b68-47ee-ad88-09e852ac1ba7",{"cta":986,"_uid":991,"logo":992,"name":979,"component":967,"description":999},[987],{"url":988,"_uid":990,"text":957,"component":102},{"id":17,"url":989,"target":105,"linktype":106,"fieldtype":955,"cached_url":989},"https://x.com/aipool_tee","9c100fb2-68de-4e9b-9444-46b48f8a9e22","5529c479-a022-4e40-be46-c04bc4054688",[993],{"svg":994,"_uid":998,"component":966},{"id":995,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":996,"copyright":17,"fieldtype":18,"meta_data":997,"is_external_url":886},1082647,"https://a-us.storyblok.com/f/1022298/121x56/2b31b1cff7/aipool-tee.svg",{},"14885ac1-7f47-4766-9dba-b29887ca4240","AI-Pool is a trustless, AI-driven pre-sale and liquidity launch system using a secure TEE wallet to ensure fair, transparent, and bot-resistant token launches.","aipool","ecosystem/entries/aipool",-1440,[973],"75e86564-e696-4ac8-9d47-58958bee1f20",[],{"name":1007,"created_at":1008,"published_at":1009,"updated_at":1010,"id":1011,"uuid":1012,"content":1013,"slug":1028,"full_slug":1029,"sort_by_date":16,"position":1030,"tag_list":1031,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1033,"first_published_at":1034,"release_id":16,"lang":930,"path":16,"alternates":1035,"default_full_slug":16,"translated_slugs":16},"Lilypad","2025-01-29T17:57:39.864Z","2025-02-03T16:18:24.407Z","2025-02-03T16:18:24.423Z",21147099,"06fe11fd-1120-4490-ae0e-792f864a8c89",{"cta":1014,"_uid":1019,"logo":1020,"name":1007,"component":967,"description":1027},[1015],{"url":1016,"_uid":1018,"text":957,"component":102},{"id":17,"url":1017,"target":105,"linktype":106,"fieldtype":955,"cached_url":1017},"https://x.com/LilypadLaunch","cf821ce2-ca8d-4a25-891e-87f320284155","5db05679-9372-497d-874e-60a194feeeaf",[1021],{"svg":1022,"_uid":1026,"component":966},{"id":1023,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1024,"copyright":17,"fieldtype":18,"meta_data":1025,"is_external_url":886},1069610,"https://a-us.storyblok.com/f/1022298/121x56/6de8e8e4e4/lilypad.svg",{},"5745ca48-af08-4276-b246-7bccd50a3e38","Lilypad is a launchpad for LST-NFTs bringing NFT collections minted and backed by Liquid Staking Tokens (LSTs), with a mint price that can be redeemed at any time.","lilypad","ecosystem/entries/lilypad",-1430,[1032],"Consumer","bf68b141-003f-4565-a8aa-49c3655c66dc","2025-01-29T18:00:59.379Z",[],{"name":1037,"created_at":1038,"published_at":1039,"updated_at":1040,"id":1041,"uuid":1042,"content":1043,"slug":1058,"full_slug":1059,"sort_by_date":16,"position":1060,"tag_list":1061,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1063,"first_published_at":1039,"release_id":16,"lang":930,"path":16,"alternates":1064,"default_full_slug":16,"translated_slugs":16},"Eternal AI","2025-01-07T09:39:25.194Z","2025-01-07T09:43:36.023Z","2025-01-07T09:43:36.041Z",19673258,"561e5d3a-35cf-405f-82ff-1b0a7dc7fb23",{"cta":1044,"_uid":1049,"logo":1050,"name":1037,"component":967,"description":1057},[1045],{"url":1046,"_uid":1048,"text":957,"component":102},{"id":17,"url":1047,"target":105,"linktype":106,"fieldtype":955,"cached_url":1047},"https://x.com/CryptoEternalAI","e2c21e06-5a1c-4228-af3f-8f792977f379","7043e261-25ab-47bc-bf96-a923e2343a52",[1051],{"svg":1052,"_uid":1056,"component":966},{"id":1053,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1054,"copyright":17,"fieldtype":18,"meta_data":1055,"is_external_url":886},1037413,"https://a-us.storyblok.com/f/1022298/121x56/5d2ba2adc2/eternal-ai.svg",{},"ebec4bf2-62b9-4acc-a455-ddc071690bda","Eternal AI is a decentralized inference layer that operates across multiple blockchain networks deploying AI models, like Llama 3.1 405B and FLUX, as programmable smart contracts on different networks","eternal-ai","ecosystem/entries/eternal-ai",-1420,[973,1062],"Infrastructure","2d6dd423-55d3-4dcb-b6c9-5c5ea64ef15f",[],{"name":1066,"created_at":1067,"published_at":1068,"updated_at":1069,"id":1070,"uuid":1071,"content":1072,"slug":1087,"full_slug":1088,"sort_by_date":16,"position":1089,"tag_list":1090,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1091,"first_published_at":1068,"release_id":16,"lang":930,"path":16,"alternates":1092,"default_full_slug":16,"translated_slugs":16},"Neur","2025-01-07T09:12:17.478Z","2025-01-07T09:15:35.488Z","2025-01-07T09:15:35.503Z",19673250,"c71a1e92-7388-469e-8d4b-1015b48b004c",{"cta":1073,"_uid":1078,"logo":1079,"name":1066,"component":967,"description":1086},[1074],{"url":1075,"_uid":1077,"text":957,"component":102},{"id":17,"url":1076,"target":105,"linktype":106,"fieldtype":955,"cached_url":1076},"https://x.com/neur_sh","b6f21b99-c69f-4363-8123-41a66e460496","40512819-e4a1-4778-8def-0c93261cbe16",[1080],{"svg":1081,"_uid":1085,"component":966},{"id":1082,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1083,"copyright":17,"fieldtype":18,"meta_data":1084,"is_external_url":886},1037404,"https://a-us.storyblok.com/f/1022298/121x56/8128d0c97d/neur.svg",{},"41fd2fa4-e653-4e3d-bf9e-5164074cb4bf","Neur is a tailored Solana AI agent kit combining LLM-powered natural language understanding with blockchain integration for DeFi, NFTs, and more.","neur","ecosystem/entries/neur",-1410,[973,1032],"4e0a3b0b-19ba-4d60-8c83-29d32b90a75b",[],{"name":1094,"created_at":1095,"published_at":1096,"updated_at":1097,"id":1098,"uuid":1099,"content":1100,"slug":1115,"full_slug":1116,"sort_by_date":16,"position":1117,"tag_list":1118,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1119,"first_published_at":1096,"release_id":16,"lang":930,"path":16,"alternates":1120,"default_full_slug":16,"translated_slugs":16},"Eliza","2025-01-07T09:03:57.186Z","2025-01-07T09:06:12.948Z","2025-01-07T09:06:12.966Z",19673249,"55d5ea8f-6d14-471f-8017-7a0f96a121c5",{"cta":1101,"_uid":1106,"logo":1107,"name":1094,"component":967,"description":1114},[1102],{"url":1103,"_uid":1105,"text":957,"component":102},{"id":17,"url":1104,"target":105,"linktype":106,"fieldtype":955,"cached_url":1104},"https://x.com/ai16zeliza","05447e69-88f7-4486-ba63-dee2e5df104e","da2bc430-b7b0-4501-8ebb-e53880fe00c4",[1108],{"svg":1109,"_uid":1113,"component":966},{"id":1110,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1111,"copyright":17,"fieldtype":18,"meta_data":1112,"is_external_url":886},1037403,"https://a-us.storyblok.com/f/1022298/121x56/45a67c61a1/eliza.svg",{},"8e985846-6dc6-4d51-9927-94e3e1923357","The Eliza Framework is the technological backbone of AI16z.","eliza","ecosystem/entries/eliza",-1400,[973,1062],"2440a31c-4b7a-4c8c-85f3-e3ae1b88b725",[],{"name":1122,"created_at":1123,"published_at":1124,"updated_at":1125,"id":1126,"uuid":1127,"content":1128,"slug":1143,"full_slug":1144,"sort_by_date":16,"position":1145,"tag_list":1146,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1147,"first_published_at":1148,"release_id":16,"lang":930,"path":16,"alternates":1149,"default_full_slug":16,"translated_slugs":16},"Zerebro","2025-01-06T19:09:52.022Z","2025-01-06T19:18:42.888Z","2025-01-06T19:18:42.904Z",19635007,"6dc7a3b5-1bd3-4050-8153-664756252a65",{"cta":1129,"_uid":1134,"logo":1135,"name":1122,"component":967,"description":1142},[1130],{"url":1131,"_uid":1133,"text":957,"component":102},{"id":17,"url":1132,"target":105,"linktype":106,"fieldtype":955,"cached_url":1132},"https://x.com/0xzerebro","86f68225-2402-4622-a020-476da67604ff","1487ff66-1641-4b02-bb04-dd07ae789a54",[1136],{"svg":1137,"_uid":1141,"component":966},{"id":1138,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1139,"copyright":17,"fieldtype":18,"meta_data":1140,"is_external_url":886},1033651,"https://a-us.storyblok.com/f/1022298/121x56/e4652c1695/zerebro.svg",{},"56f50bd4-5ae7-47ef-b1ab-453a3afcc1ef","Zerebro is an autonomous AI that generates memetic content, creates digital art and NFTs, and influences financial markets through hyperstition-driven narratives.","zerebro","ecosystem/entries/zerebro",-1390,[973,1032],"f6c7bd42-4d5a-4afb-a218-d64b9c5e1737","2025-01-06T19:14:37.629Z",[],{"name":1151,"created_at":1152,"published_at":1153,"updated_at":1154,"id":1155,"uuid":1156,"content":1157,"slug":1172,"full_slug":1173,"sort_by_date":16,"position":1174,"tag_list":1175,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1176,"first_published_at":1153,"release_id":16,"lang":930,"path":16,"alternates":1177,"default_full_slug":16,"translated_slugs":16},"Arc","2025-01-06T18:59:40.967Z","2025-01-06T19:00:42.398Z","2025-01-06T19:00:42.416Z",19633376,"9defb606-1b49-48a5-a034-22083238d564",{"cta":1158,"_uid":1163,"logo":1164,"name":1151,"component":967,"description":1171},[1159],{"url":1160,"_uid":1162,"text":957,"component":102},{"id":17,"url":1161,"target":105,"linktype":106,"fieldtype":955,"cached_url":1161},"https://x.com/arcdotfun","fe849d84-f8ca-4fe4-b55e-0f39a96af6c8","b099f97b-278b-4a97-9513-af0f5201cf14",[1165],{"svg":1166,"_uid":1170,"component":966},{"id":1167,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1168,"copyright":17,"fieldtype":18,"meta_data":1169,"is_external_url":886},1033598,"https://a-us.storyblok.com/f/1022298/121x56/d98eadc564/arc.svg",{},"c1d2dc4c-9637-4b43-883d-c54393194cf9","Arc is building an open source framework for building portable, modular, lightweight AI agents in rust","arc","ecosystem/entries/arc",-1380,[973,1062],"206535f3-f726-4006-8363-f6bbf7a24116",[],{"name":1179,"created_at":1180,"published_at":1181,"updated_at":1182,"id":1183,"uuid":1184,"content":1185,"slug":1200,"full_slug":1201,"sort_by_date":16,"position":1202,"tag_list":1203,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1204,"first_published_at":1181,"release_id":16,"lang":930,"path":16,"alternates":1205,"default_full_slug":16,"translated_slugs":16},"CharacterX","2025-01-06T18:54:04.104Z","2025-01-06T18:54:57.779Z","2025-01-06T18:54:57.796Z",19633315,"ba318d49-2c39-4241-b8fc-02d28d5da29e",{"cta":1186,"_uid":1191,"logo":1192,"name":1179,"component":967,"description":1199},[1187],{"url":1188,"_uid":1190,"text":957,"component":102},{"id":17,"url":1189,"target":105,"linktype":106,"fieldtype":955,"cached_url":1189},"https://x.com/CharacterXAI","1cd5f60d-cfa6-4e07-a83a-e24f6cc1f5c3","31ae6e88-30d1-4669-ad5c-ee8cf33aa247",[1193],{"svg":1194,"_uid":1198,"component":966},{"id":1195,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1196,"copyright":17,"fieldtype":18,"meta_data":1197,"is_external_url":886},1033601,"https://a-us.storyblok.com/f/1022298/121x56/907fd2e1e6/character-x.svg",{},"b289a175-d552-4aa5-94e8-67424a80500e","CharacterX is a synthetic social network for humans and AI on Solana","characterx","ecosystem/entries/characterx",-1370,[973,1032],"f9c63e7b-864b-4e30-bee4-571c8815710d",[],{"name":1207,"created_at":1208,"published_at":1209,"updated_at":1210,"id":1211,"uuid":1212,"content":1213,"slug":1228,"full_slug":1229,"sort_by_date":16,"position":1230,"tag_list":1231,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1232,"first_published_at":1233,"release_id":16,"lang":930,"path":16,"alternates":1234,"default_full_slug":16,"translated_slugs":16},"Ventory.fun","2025-01-06T18:52:29.192Z","2025-01-07T09:07:45.508Z","2025-01-07T09:07:45.529Z",19633314,"2d2f0398-0e88-4d0b-b967-c4d6ad484c90",{"cta":1214,"_uid":1219,"logo":1220,"name":1207,"component":967,"description":1227},[1215],{"url":1216,"_uid":1218,"text":957,"component":102},{"id":17,"url":1217,"target":105,"linktype":106,"fieldtype":955,"cached_url":1217},"https://x.com/Ventory_gg","3311c35d-07b4-470c-bb5d-b73a04c1b67e","ae06ffd2-d292-4536-991d-b0bf30c475e9",[1221],{"svg":1222,"_uid":1226,"component":966},{"id":1223,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1224,"copyright":17,"fieldtype":18,"meta_data":1225,"is_external_url":886},1033600,"https://a-us.storyblok.com/f/1022298/121x56/001f00ac49/ventory.svg",{},"798ebb7c-1e3f-446b-b777-d27ee11a2c8d","Ventory.fun is an AI powered memecoin / NFT launchpad","ventory-fun","ecosystem/entries/ventory-fun",-1360,[973,1032],"f4b78d9f-49a2-4ef4-a107-ca4a8229aa18","2025-01-06T18:53:44.783Z",[],{"name":1236,"created_at":1237,"published_at":1238,"updated_at":1239,"id":1240,"uuid":1241,"content":1242,"slug":1257,"full_slug":1258,"sort_by_date":16,"position":1259,"tag_list":1260,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1261,"first_published_at":1238,"release_id":16,"lang":930,"path":16,"alternates":1262,"default_full_slug":16,"translated_slugs":16},"OctonetAI","2025-01-06T18:50:52.834Z","2025-01-06T18:52:16.935Z","2025-01-06T18:52:16.951Z",19633312,"714dfe93-016d-44bd-bbe9-9f1d656b4125",{"cta":1243,"_uid":1248,"logo":1249,"name":1236,"component":967,"description":1256},[1244],{"url":1245,"_uid":1247,"text":957,"component":102},{"id":17,"url":1246,"target":105,"linktype":106,"fieldtype":955,"cached_url":1246},"https://x.com/OctonetAI","caaa34d0-19c5-4557-bd44-b5c180819a71","b418fcbb-be90-4092-a751-bdd0faad9f91",[1250],{"svg":1251,"_uid":1255,"component":966},{"id":1252,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1253,"copyright":17,"fieldtype":18,"meta_data":1254,"is_external_url":886},1033599,"https://a-us.storyblok.com/f/1022298/121x56/a104dca29d/octonetai.svg",{},"3621f8a7-7d30-4387-9a8e-2fecb3b498d6","OctonetAI is an Ai dev shop building infrastructure for the Solana ecosystem","octonetai","ecosystem/entries/octonetai",-1350,[973,1062],"4c95490e-47a4-4eec-9fed-2135adba2f86",[],{"name":1264,"created_at":1265,"published_at":1266,"updated_at":1267,"id":1268,"uuid":1269,"content":1270,"slug":1285,"full_slug":1286,"sort_by_date":16,"position":1287,"tag_list":1288,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1289,"first_published_at":1266,"release_id":16,"lang":930,"path":16,"alternates":1290,"default_full_slug":16,"translated_slugs":16},"AI Dogs","2025-01-06T18:42:19.573Z","2025-01-06T18:46:48.714Z","2025-01-06T18:46:48.728Z",19633304,"428d78b2-37ac-44d4-9edf-24f1ac0a1c8e",{"cta":1271,"_uid":1276,"logo":1277,"name":1264,"component":967,"description":1284},[1272],{"url":1273,"_uid":1275,"text":957,"component":102},{"id":17,"url":1274,"target":105,"linktype":106,"fieldtype":955,"cached_url":1274},"https://x.com/aidogscomm","ea7974ee-3fd6-4f80-ae45-bca20f24e52e","a953562f-094f-4650-995d-8aaae7f6be05",[1278],{"svg":1279,"_uid":1283,"component":966},{"id":1280,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1281,"copyright":17,"fieldtype":18,"meta_data":1282,"is_external_url":886},1033602,"https://a-us.storyblok.com/f/1022298/121x56/fc44bc2127/ai-doggs.svg",{},"be565c89-ae1d-41e5-bb71-32983eec871b","AI Dogs are AI / Meme inspired dog companions which will feature gamification, breeding, and personality development powered by NFTs and a traits marketplace","ai-dogs","ecosystem/entries/ai-dogs",-1340,[973,1032],"71e7bfac-5769-4b4e-b8c7-1619e0bb671f",[],{"name":1292,"created_at":1293,"published_at":1294,"updated_at":1295,"id":1296,"uuid":1297,"content":1298,"slug":1313,"full_slug":1314,"sort_by_date":16,"position":1315,"tag_list":1316,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1317,"first_published_at":1294,"release_id":16,"lang":930,"path":16,"alternates":1318,"default_full_slug":16,"translated_slugs":16},"Griffain","2024-12-19T00:28:38.105Z","2024-12-19T00:29:27.745Z","2024-12-19T00:29:27.760Z",19035896,"8a931799-89d6-489e-8b3a-b48e0b9667d3",{"cta":1299,"_uid":1304,"logo":1305,"name":1292,"component":967,"description":1312},[1300],{"url":1301,"_uid":1303,"text":957,"component":102},{"id":17,"url":1302,"target":105,"linktype":106,"fieldtype":955,"cached_url":1302},"https://x.com/griffaindotcom","b4e5a202-be0d-483a-8f94-8acf06efb84d","30f1fdde-7901-4399-b652-a9167ab01591",[1306],{"svg":1307,"_uid":1311,"component":966},{"id":1308,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1309,"copyright":17,"fieldtype":18,"meta_data":1310,"is_external_url":886},1023629,"https://a-us.storyblok.com/f/1022298/121x56/a52afd51cf/griffain.svg",{},"c51aec35-b730-4a18-a463-742a33619156","Griffain coordinates a network of AI agents that help you take action on-chain","griffain","ecosystem/entries/griffain",-1330,[973],"5156e306-2ba1-4dd1-a1c5-d3521c24bc0d",[],{"name":1320,"created_at":1321,"published_at":1322,"updated_at":1323,"id":1324,"uuid":1325,"content":1326,"slug":1342,"full_slug":1343,"sort_by_date":16,"position":1344,"tag_list":1345,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1346,"first_published_at":1322,"release_id":16,"lang":930,"path":16,"alternates":1347,"default_full_slug":16,"translated_slugs":16},"SendAI","2024-12-19T00:27:11.429Z","2024-12-19T00:28:22.683Z","2024-12-19T00:28:22.702Z",19035895,"c1efdb36-f2a7-4a10-96de-a16275a245fa",{"cta":1327,"_uid":1332,"logo":1333,"name":1340,"component":967,"description":1341},[1328],{"url":1329,"_uid":1331,"text":957,"component":102},{"id":17,"url":1330,"target":105,"linktype":106,"fieldtype":955,"cached_url":1330},"https://x.com/sendaifun","21242db3-fda0-4e89-b509-3dbc13617809","29d1532c-19df-403f-a50e-738e2832210c",[1334],{"svg":1335,"_uid":1339,"component":966},{"id":1336,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1337,"copyright":17,"fieldtype":18,"meta_data":1338,"is_external_url":886},1023628,"https://a-us.storyblok.com/f/1022298/121x56/abed178a37/sendai.svg",{},"30027542-63e2-4c6b-a8be-43f755b38a7f","SENDAI","SendAI is a curator of solana ai hackathon","sendai","ecosystem/entries/sendai",-1320,[973],"163b4d58-b728-44a7-8c5d-feebae984ccd",[],{"name":1349,"created_at":1350,"published_at":1351,"updated_at":1352,"id":1353,"uuid":1354,"content":1355,"slug":1349,"full_slug":1370,"sort_by_date":16,"position":1371,"tag_list":1372,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1373,"first_published_at":1374,"release_id":16,"lang":930,"path":16,"alternates":1375,"default_full_slug":16,"translated_slugs":16},"ai16z","2024-12-19T00:23:31.780Z","2025-01-07T09:00:57.578Z","2025-01-07T09:00:57.595Z",19035894,"997b2975-b64f-43bd-a919-685d8711ad72",{"cta":1356,"_uid":1361,"logo":1362,"name":1349,"component":967,"description":1369},[1357],{"url":1358,"_uid":1360,"text":957,"component":102},{"id":17,"url":1359,"target":105,"linktype":106,"fieldtype":955,"cached_url":1359},"https://x.com/ai16zdao","63f01bec-0e3a-4ed0-931c-e5f7711e0282","367ab58f-ce93-4521-94de-ab355f974335",[1363],{"svg":1364,"_uid":1368,"component":966},{"id":1365,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1366,"copyright":17,"fieldtype":18,"meta_data":1367,"is_external_url":886},1023625,"https://a-us.storyblok.com/f/1022298/121x56/8103a3e09f/ai16z.svg",{},"a7b78fc3-251d-4cf4-9993-055ff4c1b244","AI16z is an open-source initiative that merges artificial intelligence (AI) and blockchain technology, specifically within the realm of decentralized autonomous organizations (DAOs). The Eliza Framework is the technological backbone of AI16z.","ecosystem/entries/ai16z",-1310,[973],"1b8cebb3-c9f4-4561-84f8-c8fa61e95019","2024-12-19T00:24:49.743Z",[],{"name":1377,"created_at":1378,"published_at":1379,"updated_at":1380,"id":1381,"uuid":1382,"content":1383,"slug":1398,"full_slug":1399,"sort_by_date":16,"position":1400,"tag_list":1401,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1402,"first_published_at":1379,"release_id":16,"lang":930,"path":16,"alternates":1403,"default_full_slug":16,"translated_slugs":16},"Publique","2024-12-18T22:39:43.032Z","2024-12-18T22:45:38.158Z","2024-12-18T22:45:38.174Z",19034107,"8716267a-29c1-43b1-b1ad-1f6ade702ef5",{"cta":1384,"_uid":1389,"logo":1390,"name":1377,"component":967,"description":1397},[1385],{"url":1386,"_uid":1388,"text":957,"component":102},{"id":17,"url":1387,"target":105,"linktype":106,"fieldtype":955,"cached_url":1387},"https://x.com/publique_world","7b71045d-7439-4ac9-b0af-207f62595f2b","aba674a7-8417-44ad-a25c-5a129b29a58c",[1391],{"svg":1392,"_uid":1396,"component":966},{"id":1393,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1394,"copyright":17,"fieldtype":18,"meta_data":1395,"is_external_url":886},1023494,"https://a-us.storyblok.com/f/1022298/121x56/a08d6bc99d/publique.svg",{},"1613761d-2d99-45cf-bb38-6be9b637a488","Publique is a web3 animated universe where every character is the protagonist of their own story. Meet characters, watch films, discover music and tell your story.","publique","ecosystem/entries/publique",-1300,[],"4add7c20-9bc9-4b87-9105-44ddb252e59d",[],{"name":1405,"created_at":1406,"published_at":1407,"updated_at":1408,"id":1409,"uuid":1410,"content":1411,"slug":1426,"full_slug":1427,"sort_by_date":16,"position":1428,"tag_list":1429,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1430,"first_published_at":1431,"release_id":16,"lang":930,"path":16,"alternates":1432,"default_full_slug":16,"translated_slugs":16},"Wide Worlds","2024-12-18T22:38:50.086Z","2024-12-19T00:25:15.165Z","2024-12-19T00:25:15.196Z",19034106,"49d10039-dc9d-4fd4-9a63-74d74af97694",{"cta":1412,"_uid":1417,"logo":1418,"name":1405,"component":967,"description":1425},[1413],{"url":1414,"_uid":1416,"text":957,"component":102},{"id":17,"url":1415,"target":105,"linktype":106,"fieldtype":955,"cached_url":1415},"https://x.com/wideworlds_ai","560c8bcb-4edf-4782-ad20-363f1a9ba094","1dc1fb84-9c38-4e5b-8f24-9772efdd4735",[1419],{"svg":1420,"_uid":1424,"component":966},{"id":1421,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1422,"copyright":17,"fieldtype":18,"meta_data":1423,"is_external_url":886},1023492,"https://a-us.storyblok.com/f/1022298/121x56/5e472cbacf/wide-worlds.svg",{},"0bb85cd5-6ef3-4ba1-a452-3981ac577465","Wide Worlds is an web3 AI driven marketing tool aiming to make marketing fun by empowering communities to make branded memes, media, lore, and more.","wide-worlds","ecosystem/entries/wide-worlds",-1290,[973],"52ab01bb-0ecd-4c20-87b7-b8afeba3ba95","2024-12-18T22:39:31.599Z",[],{"name":1434,"created_at":1435,"published_at":1436,"updated_at":1437,"id":1438,"uuid":1439,"content":1440,"slug":1455,"full_slug":1456,"sort_by_date":16,"position":1457,"tag_list":1458,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1459,"first_published_at":1436,"release_id":16,"lang":930,"path":16,"alternates":1460,"default_full_slug":16,"translated_slugs":16},"LightDAS","2024-12-18T22:33:00.180Z","2024-12-18T22:36:09.837Z","2024-12-18T22:36:09.858Z",19034098,"f584a17a-61df-4c1c-9c1b-b795a51ac961",{"cta":1441,"_uid":1446,"logo":1447,"name":1434,"component":967,"description":1454},[1442],{"url":1443,"_uid":1445,"text":957,"component":102},{"id":17,"url":1444,"target":105,"linktype":106,"fieldtype":955,"cached_url":1444},"https://x.com/lightdas_","048c88f6-e479-4597-85c4-2647c317e601","70861b63-f1e9-4a0c-9226-ea1288c3b0ac",[1448],{"svg":1449,"_uid":1453,"component":966},{"id":1450,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1451,"copyright":17,"fieldtype":18,"meta_data":1452,"is_external_url":886},1023546,"https://a-us.storyblok.com/f/1022298/121x56/a047247aaf/lightdas.svg",{},"eadaaa69-8587-4fd0-bb36-5cebe6515a3c","LightDAS is a lighter Metaplex API allowing developers to index specific Merkle Trees.","lightdas","ecosystem/entries/lightdas",-1280,[1062],"d5cd45b7-883d-4f41-9597-b1e059c97f8a",[],{"name":1462,"created_at":1463,"published_at":1464,"updated_at":1465,"id":1466,"uuid":1467,"content":1468,"slug":1484,"full_slug":1485,"sort_by_date":16,"position":1486,"tag_list":1487,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1488,"first_published_at":1489,"release_id":16,"lang":930,"path":16,"alternates":1490,"default_full_slug":16,"translated_slugs":16},"The Arena ","2024-12-09T18:46:06.579Z","2024-12-18T14:44:32.726Z","2024-12-18T14:44:32.756Z",18021431,"ef09b96a-9069-4534-b8b8-1092473bc919",{"cta":1469,"_uid":1474,"logo":1475,"name":1482,"component":967,"description":1483},[1470],{"url":1471,"_uid":1473,"text":957,"component":102},{"id":17,"url":1472,"target":105,"linktype":106,"fieldtype":955,"cached_url":1472},"https://x.com/TheArenaDotFun","752a2fcc-7763-4d17-921e-c285f64e92ed","1dbda008-3987-4946-a955-2fbe52c8821a",[1476],{"svg":1477,"_uid":1481,"component":966},{"id":1478,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1479,"copyright":17,"fieldtype":18,"meta_data":1480,"is_external_url":886},1022422,"https://a-us.storyblok.com/f/1022298/121x56/6f8ab7e242/white-svg-thearena.svg",{},"3e78c25d-87fb-4145-9d43-2e3aee7d037c","The Arena","The Arena is a social trading game that allows traders to compete against each other.","the-arena","ecosystem/entries/the-arena",-1270,[1032],"03914bf1-f5eb-4c68-a941-f0c54c3263ca","2024-12-09T19:59:55.492Z",[],{"name":1492,"created_at":1493,"published_at":1494,"updated_at":1495,"id":1496,"uuid":1497,"content":1498,"slug":1514,"full_slug":1515,"sort_by_date":16,"position":1516,"tag_list":1517,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1519,"first_published_at":1520,"release_id":16,"lang":930,"path":16,"alternates":1521,"default_full_slug":16,"translated_slugs":16},"dVIN Labs","2024-12-09T18:45:10.143Z","2024-12-18T14:44:33.057Z","2024-12-18T14:44:33.076Z",18021430,"747f0505-6ec3-44e8-8d74-a8b9537f8862",{"cta":1499,"_uid":1504,"logo":1505,"name":1512,"component":967,"description":1513},[1500],{"url":1501,"_uid":1503,"text":957,"component":102},{"id":17,"url":1502,"target":105,"linktype":106,"fieldtype":955,"cached_url":1502},"https://x.com/dVINLabs","b4c2e85b-fe41-424e-8d67-4d7d000fa43b","31fbd33a-7fe9-4eb9-87ad-6caa290477ff",[1506],{"svg":1507,"_uid":1511,"component":966},{"id":1508,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1509,"copyright":17,"fieldtype":18,"meta_data":1510,"is_external_url":886},1022340,"https://a-us.storyblok.com/f/1022298/121x56/e91bc59bb4/white-svg-dvin.svg",{},"471004d6-c098-4c21-afbb-5e8caa9cb692","dVIN","Club dVIN is the world’s first decentralized wine club, a community that not only shares information, knowledge, wine, and experiences with wine makers and wine lovers around the world.","dvin-labs","ecosystem/entries/dvin-labs",-1260,[1518],"RWA","ef310081-8de5-4d28-a361-fc5e26eaf48c","2024-12-09T19:59:55.831Z",[],{"name":1523,"created_at":1524,"published_at":1525,"updated_at":1526,"id":1527,"uuid":1528,"content":1529,"slug":164,"full_slug":1544,"sort_by_date":16,"position":1545,"tag_list":1546,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1547,"first_published_at":1548,"release_id":16,"lang":930,"path":16,"alternates":1549,"default_full_slug":16,"translated_slugs":16},"Code","2024-12-09T18:43:25.669Z","2024-12-18T14:44:33.390Z","2024-12-18T14:44:33.408Z",18021428,"fbdee950-9147-4dc1-9a0c-2d7ea514fed5",{"cta":1530,"_uid":1535,"logo":1536,"name":1523,"component":967,"description":1543},[1531],{"url":1532,"_uid":1534,"text":957,"component":102},{"id":17,"url":1533,"target":105,"linktype":106,"fieldtype":955,"cached_url":1533},"https://x.com/getcode","3d6ac6f3-0978-4f2c-8bf8-34ea919ab8af","c753d562-45ff-43e2-8370-486186ed0313",[1537],{"svg":1538,"_uid":1542,"component":966},{"id":1539,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1540,"copyright":17,"fieldtype":18,"meta_data":1541,"is_external_url":886},1022321,"https://a-us.storyblok.com/f/1022298/121x56/d61d91ae84/white-svg-code.svg",{},"ce7cab44-82e1-4f87-98c6-484a9e1d268b","Code is a simple and elegant mobile wallet app on the Solana blockchain that enables instant, global, and private payments without the complexity of self-custodial crypto.","ecosystem/entries/code",-1250,[1062],"a842196d-466d-4251-99de-0afbb97aa67f","2024-12-09T19:59:56.170Z",[],{"name":1551,"created_at":1552,"published_at":1553,"updated_at":1554,"id":1555,"uuid":1556,"content":1557,"slug":1572,"full_slug":1573,"sort_by_date":16,"position":1574,"tag_list":1575,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1576,"first_published_at":1577,"release_id":16,"lang":930,"path":16,"alternates":1578,"default_full_slug":16,"translated_slugs":16},"Popset","2024-12-09T18:42:37.404Z","2024-12-18T14:44:33.721Z","2024-12-18T14:44:33.743Z",18021426,"2809655b-e444-4e00-87ad-45271b86db87",{"cta":1558,"_uid":1563,"logo":1564,"name":1551,"component":967,"description":1571},[1559],{"url":1560,"_uid":1562,"text":957,"component":102},{"id":17,"url":1561,"target":105,"linktype":106,"fieldtype":955,"cached_url":1561},"https://x.com/popsetxyz","8420693e-6c44-495b-8fa8-61b6a95d5713","f194ef0d-07cf-48a8-b056-5b48a7b1fc13",[1565],{"svg":1566,"_uid":1570,"component":966},{"id":1567,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1568,"copyright":17,"fieldtype":18,"meta_data":1569,"is_external_url":886},1022398,"https://a-us.storyblok.com/f/1022298/121x56/4db0c5b0ef/white-svg-popset.svg",{},"d7d3e922-4150-4349-a27c-85fcf60553bf","Popset is a mobile content-sharing platform on the Solana blockchain that allows users to mint and control their posts as NFTs with customizable editions and collection windows.","popset","ecosystem/entries/popset",-1240,[1032],"ed0a952d-8665-4fcf-99cc-33e41ca96449","2024-12-09T19:59:56.502Z",[],{"name":1580,"created_at":1581,"published_at":1582,"updated_at":1583,"id":1584,"uuid":1585,"content":1586,"slug":1602,"full_slug":1603,"sort_by_date":16,"position":1604,"tag_list":1605,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1606,"first_published_at":1607,"release_id":16,"lang":930,"path":16,"alternates":1608,"default_full_slug":16,"translated_slugs":16},"time.fun","2024-12-09T18:37:58.165Z","2024-12-18T14:44:34.066Z","2024-12-18T14:44:34.085Z",18021424,"845e00c9-51aa-4227-b6cb-8877addafaa9",{"cta":1587,"_uid":1592,"logo":1593,"name":1600,"component":967,"description":1601},[1588],{"url":1589,"_uid":1591,"text":957,"component":102},{"id":17,"url":1590,"target":105,"linktype":106,"fieldtype":955,"cached_url":1590},"https://x.com/timedotfun","d21f53f7-5b19-41da-b48f-201d9dea7d06","ad5b3192-eab4-4646-97f3-82ca058e1b55",[1594],{"svg":1595,"_uid":1599,"component":966},{"id":1596,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1597,"copyright":17,"fieldtype":18,"meta_data":1598,"is_external_url":886},1022425,"https://a-us.storyblok.com/f/1022298/121x56/e4c932c10c/white-svg-time-fun.svg",{},"eff76745-ec40-498a-8c3e-f3459ca2c965","Time.fun","Time fun is a pioneering platform that allows creators-individuals who offer their time and expertise-to tokenize their time into tradable units. These tokens represent minutes of the creator's time, which can be bought, sold, and redeemed by fans and interested parties.","time-fun","ecosystem/entries/time-fun",-1230,[1032],"077f457b-fe08-4a3d-8eeb-9f8c905497b4","2024-12-09T19:59:56.837Z",[],{"name":1610,"created_at":1611,"published_at":1612,"updated_at":1613,"id":1614,"uuid":1615,"content":1616,"slug":1631,"full_slug":1632,"sort_by_date":16,"position":1633,"tag_list":1634,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1635,"first_published_at":1636,"release_id":16,"lang":930,"path":16,"alternates":1637,"default_full_slug":16,"translated_slugs":16},"Moonwalk","2024-12-09T18:33:34.863Z","2024-12-18T14:44:34.395Z","2024-12-18T14:44:34.414Z",18021391,"2aa60395-187d-42f2-9b6b-e0eed1a626b8",{"cta":1617,"_uid":1622,"logo":1623,"name":1610,"component":967,"description":1630},[1618],{"url":1619,"_uid":1621,"text":957,"component":102},{"id":17,"url":1620,"target":105,"linktype":106,"fieldtype":955,"cached_url":1620},"https://x.com/moonwalkfitness","9f3e6360-3eff-4472-afc1-f23b68c897ea","3c80252f-badd-4447-81f4-3fe1f072fcf5",[1624],{"svg":1625,"_uid":1629,"component":966},{"id":1626,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1627,"copyright":17,"fieldtype":18,"meta_data":1628,"is_external_url":886},1022386,"https://a-us.storyblok.com/f/1022298/121x56/6ad2cbc5d1/white-svg-moonwalk.svg",{},"943201e0-e1e0-4a78-8d7a-7b5d7f37073a","Moonwalk is a fitness accountability app that uses financial incentives to motivate users to meet daily step goals by staking cryptocurrency, rewarding success, and redistributing forfeited stakes to winners.","moonwalk","ecosystem/entries/moonwalk",-1220,[1032],"410ba90f-2be9-4dd7-be06-1a33b27937b5","2024-12-09T19:59:57.157Z",[],{"name":1639,"created_at":1640,"published_at":1641,"updated_at":1642,"id":1643,"uuid":1644,"content":1645,"slug":1660,"full_slug":1661,"sort_by_date":16,"position":1662,"tag_list":1663,"is_startpage":886,"parent_id":974,"meta_data":16,"group_id":1664,"first_published_at":1665,"release_id":16,"lang":930,"path":16,"alternates":1666,"default_full_slug":16,"translated_slugs":16},"Bags app","2024-12-09T18:32:42.500Z","2024-12-18T14:44:34.731Z","2024-12-18T14:44:34.749Z",18021389,"928dfd12-a1d0-4c29-86b7-8df5219a0d55",{"cta":1646,"_uid":1651,"logo":1652,"name":1639,"component":967,"description":1659},[1647],{"url":1648,"_uid":1650,"text":957,"component":102},{"id":17,"url":1649,"target":105,"linktype":106,"fieldtype":955,"cached_url":1649},"https://x.com/BagsApp","8ec7a4af-f07c-4f3d-aa25-5931c327cad2","6e5125d2-ed6c-44d5-8368-1605d7ccd610",[1653],{"svg":1654,"_uid":1658,"component":966},{"id":1655,"alt":17,"name":17,"focus":17,"title":17,"source":17,"filename":1656,"copyright":17,"fieldtype":18,"meta_data":1657,"is_external_url":886},1022319,"https://a-us.storyblok.com/f/1022298/121x56/c0d843e87e/white-svg-bagsapp.svg",{},"8bfbe5d2-4ade-485d-8a04-8432c76a3540","Bags is a financial messenger app where you can chat and trade with friends.","bags-app","ecosystem/entries/bags-app",-1210,[1032],"38a2b8cf-7371-4823-84cc-4b8ac271fa1a","2024-12-09T19:59:57.501Z",[],1781801186639]