# Welcome to Ajuna Network

The herein presented content is WIP - Version: 1.11/2022

Hey there, welcome! Happy that you found your way to our wiki. This wiki is Ajuna Networks single source of truth. Whether you're a game developer that wants to learn about our tools and build your game with us or whether you're a community member that wants to know more about us - you're at the right place. <br>

1. If you're new to Ajuna Network, you may find our [general introduction section](/introducing-ajuna-and-bajun/overview) helpful to better understand what we're doing.&#x20;
2. If you want to use our Ajuna.SDK to kick-off your development process, please go to our [Ajuna SDK Toolchain section](/build-with-us/substrate-c-sdk).&#x20;
3. All about our community (incl. official links to our social media channels), ecosystem, and partners can be found [here.](/community-and-ecosystem/official-channels)

We hope you enjoy the read! For feedback, please contact us at <hello@ajuna.io>.&#x20;


# Overview


# Abstract

Ajuna Network is a decentralized gaming platform that delivers real value to gamers, without compromising on gameplay. We make the world’s leading development engines — Unity and Unreal — fully integrated with the world of blockchain-based in-game assets. Now, gamers don’t have to choose between real value and real games. Ajuna gives them both.

Real Value: Gamers can own their in-game virtual assets, and protect and control their functionality through a public and decentralized blockchain. Never again will their hard-earned weapons, clothing and items be rendered worthless by the decisions of game company executives.

Real Games: Ajuna games can be created with industry-leading development platforms, while latency is massively reduced by running game engines in powerful, off-chain trusted execution environments (TEEs) linked to the Polkadot blockchain network.


# Where do we stand as a gaming industry?

What we believe is where we currently stand as a gaming industry.

### 1. Digital Property

Long before social media became part of our lives, gamers were already identified by their nicknames and in-game avatars. Players have been spending their nights and early mornings fighting, competing, and exploring games for treasures and unique gear, and customizing and improving their virtual avatars for glory and fame amongst their friends and teammates. Fast forward to today, and this practice is exploding with the global online microtransaction market expected to grow to $51.09 billion by 2025. But the current market is centralized, owned, and controlled by the publishers. Players are left with a one-sided market interaction: buying. For example, players can spend years to reach special achievements and acquire ingame items but are not able to monetize their assets or their invested time. In addition, the functionality of these assets can be altered by game developers without the consent of players or rendered completely worthless if the underlying game is taken offline.&#x20;

We are about to step into the next era of gaming, where immersive experiences will close the gap between reality and virtual worlds, where online is a persistent state, and digital property becomes part of your real-world wealth.

### 2. Blockchain Gaming’s Limitations

Despite the crucial importance of an active and engaged gaming community, the current games industry fails to value the essential role of gamers in building these communities and co-creating the gaming experience. Blockchain-based games promise an alternative but have failed to gain widespread adoption due to their rudimentary gameplay and slow performance. All the focus is on monetization rather than gameplay, while limitations caused by the speed of smart contracts on decentralized networks result in slow, simplistic, and outdated looking games that are a pale imitation of their rivals. As a result, many of the blockchain games listed on sites like DappRadar can only muster a relatively small number of active players. A good idea badly executed is still a bad experience for gamers.

If games aren’t fun, players won’t play.

### 3. The Gaming Community

Games like Cyberpunk 2077 have made it clear that not involving the community in game development can cause significant reputational damage. A lack of community feedback can often lead to a product that doesn’t match user expectations. Just like a social network without any members, if an online game doesn’t have an active player base, it is worthless. Furthermore, games like Minecraft and Fortnite demonstrate that gamers are no longer merely passive consumers, but co-creators of the gaming experience.

### 4. Developers and Studios: Steep Learning Curve, Poor Performance

Developers seeking to enter the decentralized gaming market are faced with two central challenges. Unity and Unreal, the leading global game engines, are not integrated with blockchain out of the box. As a result, developers seeking to create blockchain games are often faced with a steep learning curve and hundreds of hours of additional development time. The technical limitations of smart contracts on decentralized networks can result in poor performance and significant latency issues.&#x20;

As a result of these factors, many blockchain games are hampered by graphics and gameplay that is slow, unsophisticated, and outdated compared to conventional games.

### To sum it up: the problems we're seeing

To change the status quo, we need the creative minds behind games to embrace, experiment, and ultimately utilize all that blockchain technology can offer. To achieve this, game developers need a simpler way to integrate blockchain-based assets into their games - without needing to learn new languages or change their development tools. The same holds true for the gaming community at large. Gamers can play a new role in both game development and the in game experience. Ajuna was created to understand and solve these problems.

* Technological barriers are still a big issue for game studios entering into the blockchain space. Among others: lack of blockchain competence, the challenge of choosing the right platform, limited access to blockchain developers, smart-contract knowledge. Solidity, Ink, Rust, Consensus, Signing, Hashing, Encrypting... that's a lot to know.
* The global gaming market is still unexplored in terms of real digital property and ownership. While blockchain games address this, current games cannot compete in terms of user experience or competitive game play.
* Community building is becoming increasingly difficult without incentivizing your core audience. Breaking through the noise is both expensive and time-consuming.&#x20;
* Fundraising has always been a big issue for small to mid-sized game studios, which are often dependent on a big publisher that controls their creative output and takes a big share of the revenue.


# Our Solution

Ajuna Network's solution consists of four building blocks.

**CONNECT: We remove barriers**

By seamlessly integrating the world’s leading development engines — Unity and Unreal — with blockchain, we empower game developers to work in their natural environment. This gives them the opportunity to start building in minutes rather than months.

**BUILD: We provide digital property and functionality**

We equip game studios with a universal foundation for developing blockchain games by providing on-chain features in a toolbox manner. This enables developers to build responsive, fully decentralized games with complex logic. Ajuna delivers the benefits of blockchain, without the technical complexity.

**LAUNCH: We involve stakeholders from day one**

We enable game studios to leverage our growing ecosystem for fundraising. In addition, we offer an easy go-to-market strategy (support fundraising strategy, connect with fundraising network, design of token economics, use of Ajuna marketing channels, access to gaming community, etc.) and support the project through its entire life cycle (NFT incentivization, special editions, access to tournaments, community management, etc.), providing everything necessary to launch quickly and efficiently on our ecosystem cycle

**GROW: With underlying future proof technology**

Grow with Substrate's future-proof technology and Polkadot's shared security. Ajuna Network is a fully functional, trusted, and secure blockchain whose sole purpose is to provide essential needs and functionalities for gaming. As the network and ecosystems grow, so will Ajuna's interoperability on multiple levels: within its own ecosystem and all games running on Ajuna and across the Polkadot ecosystem. But also beyond, thanks to the many multichain interoperability initiatives currently underway with other Layer 1 protocols.

<figure><img src="https://1133517092-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTyB1haujdIDTpDTFNfug%2Fuploads%2FGNmBpzg3anPQ2hkL7pS6%2Fimage.png?alt=media&amp;token=db24293b-6fa3-4bab-bc61-2f4982617df4" alt=""><figcaption></figcaption></figure>


# Lightpaper

Ajuna Network Lightpaper [**Version 01/07/22** ](<https://github.com/ajuna-network/techpaper/blob/main/Lightpaper/Ajuna%20Network%20Lightpaper.pdf >)by Team Ajuna. It provides an in-depth overview about our technical approach to build Ajuna Network.


# Roadmap Ajuna & Bajun


# The Ajuna Network

Ajuna Network - our enterprise solution on Polkadot.

The Ajuna Network, which operates on a Polkadot parachain, is the productive enterprise solution. It will be suitable for deploying games for full-scale commercial release and is fueled by the AJUN token.&#x20;

\
Games launching on Ajuna Network have already been successfully tested on Bajun Network and are ready to scale. Depending on the quality and knowledge of the teams behind the project, there may also be fast lanes to Ajuna. The goal for any major game should be to eventually launch on the Ajuna Network - a production environment that is suitable for enterprise use with greater marketing reach and stable scalability.<br>


# AJUN Token

AJUN powers the Ajuna Network on Polkadot. AJUN is a cryptoeconomic primitive and native token that serves 3 key purposes:

1. It is the primary utility token for Ajuna Network.
2. It is used for governance processes on Ajuna Network.
3. It is used for staking and growth locking.<br>


# Tokenomics

### Utility

AJUN serves as a utility token across the all core functions of the Ajuna gaming platform:

* Pay transaction fees generated by smaller games
* Incentivize network nodes to compute game logic that operates across the entire Ajuna ecosystem
* Allow game studios/devs to deploy new games on Ajuna Network by locking a certain amount of AJUN. Later, this will be handled through an auction, comparable to the Polkadot parachain auctions.
* Pay all kinds of services offered on the Ajuna Network, including:
  * Token swaps
  * Fees to participate in tournaments & events
  * Trust Score System
  * In-game auctions
  * Premium & season passes
  * Store (NFTs and other extras

### Governance

AJUN is also used for the governance of the Ajuna network. Holders of the AJUN token are granted voting rights. This allows token holders to vote on proposals regarding AJUN Treasury governance, which can include\*:

* Election of the members of the treasury council
* Upgrades and proposals (on-chain governance)
* Upgrades to the network and new decentralized gaming applications, hence empowering the community to be an active part in the development of the Ajuna Network
* Ajuna feature and upgrade requests and in-house games

*\*Starts once governance module is deployed*<br>

### Staking and Growth Locking

The AJUN token can be used for staking or for the support of new games launching on the Ajuna Network.

* Token holders who stake AJUN are rewarded with AJUN tokens and GAME(s) tokens. These rewards are financed by levying a percentage of the player fees of the AJUN and GAME(s) tokens. In addition, stakers can also be rewarded with NFTs from Ajuna games.
* Token holders can stake AJUN in support of certain gaming projects, thereby supporting their favorite new games to secure a Gaming Chain slot on Ajuna. This mechanism operates in a similar fashion to Polkadot parachain crowdloans.<br>


# Token Distribution

The basics of AJUN's token distribution.

The initial AJUN Token Generation Event (TGE) will be executed by BloGa AG and will create 500 million tokens. The initially available supply of AJUN will be distributed to BloGa AG (holder of the treasury), including: the core team, accelerator, advisors, investors and early contributors.<br>

<figure><img src="https://lh4.googleusercontent.com/-ssx-QVySopsDcozwNulM9yIRBvXs8vIyZ2AT7vvyIWzc8v8DeB63bl9OnHo126Pz1Vqc56EB2EVyNBoVDd3aktHDdyQ-ygxv2Kx3U0uKS6KdwhvNcDedtwpJC0xW-gvLu_almAhydq3a8YpXMHQgt8vOR5FisFVH6oztACHtsUu12RDdFv1_Z4jE9kGGw" alt=""><figcaption><p>AJUN's token distribution (11/2022)</p></figcaption></figure>

For more information, please visit [AJUN's dedicated token page on our website.](<https://ajuna.io/ajun/ >)


# Treasury


# The Bajun Network

Bajun Network - our canary network on Kusama.

The Bajun Network, which operates on a Kusama parachain, is the Sister Network of Ajuna Network and is fueled by the BAJU token.&#x20;

The Bajun Network is a fully functional, independent network that hosts games. Compared to Ajuna, Bajun has an easier slot leasing strategy to support smaller game studios and even independent groups of game developers. Bajun strives to be a creative environment that can be used to pursue new kinds of game concepts and introduce new features and functionalities - all while being on a fully functional network.&#x20;

After successful development and gaining sufficient traction to potentially win a game slot on the Ajuna Network, games can move from Bajun Network to Ajuna Network. Nevertheless, smaller games, which may have less exposure and lower chances to secure a game engine or later a parachain game slot on Ajuna, can also stay on the Bajun Network and profit from the full functionality and services provided there.<br>


# BAJU Token

BAJU is the token powering the leading edge of the Ajuna Network on our Kusama parachain. BAJU is a crypto economic primitive that serves 3 key purposes:&#x20;

1. Utility Token of the Bajun Network
2. Governance of the Bajun Network
3. Staking and Growth Locking


# Tokenomics

### Utility

#### BAJU’s Role for Game Developers and Studios

1. Deploy games on a Game Chain: For Web3 games to achieve widespread adoption, they have to be competitive with traditional games in terms of speed and performance. Bajun provides access to second-layer side chains called Game Chains that massively reduce gameplay latency compared to conventional blockchain titles. Developers who want to deploy a game on a Bajun Game Chain need to stake BAJU to secure a slot.
2. Issue a native token: A Bajun Game Chain slot is also required in order to issue a native game token. Native game tokens are used to access and pay for all Bajun services related to a specific game. They also provide the game with a more distinctive identity and open up a wider array of options to the developer when establishing an in-game economy.
3. Pay network fees: Some smaller indie developers may wish to deploy games on Bajun that are less demanding in terms of speed and processing power. For instance, turn-based strategy games tend to have lower requirements in terms of latency. In these cases, the developer may opt not to use a side chain layer and to pay for Bajun transaction fees directly with BAJU instead.

#### BAJU’s Role for Gamers

1. Access Gaming Services: For gamers, BAJU will open the door to a wide array of gaming services including tournaments, in-game auctions, season passes, and NFTs. In addition, BAJU will be required to access the Trust Score System, which is used to track the trustworthiness of other players when playing online or forming teams.&#x20;
2. Back New Games: In the future, Bajun will establish an auction mechanism for allocating Game Chain slots. New up-and-coming developers will pitch their game concepts and ask the community for support to secure a Game Chain. Gamers will be able to stake BAJU to support their favorite projects and receive rewards from the developers in return, in a similar fashion to Kusama/Polkadot crowdloans.

### Governance

All BAJU holders will be entitled to participate in governance\* processes on the Bajun Network. This includes the right to elect the BAJU Treasury Council, vote on grant proposals, and vote on feature requests and upgrades for first-party games exclusive to the Bajun Network.

*\*Starts once governance module is deployed*

### Staking

All token holders who stake BAJU will be rewarded with more BAJU (only at the beginning, when there are no games running on the platform), game tokens, or NFTs from Bajun’s games. Staking rewards will be financed through a levy on network fees. Initially, these staking rewards will be further subsidized through a token reserve of up to 1% of BAJU tokens.<br>


# Token Distribution

The basics of AJUN's token distribution.

The initial BAJU Token Generation Event (TGE) was executed (on Oct 10th, 2022) by BloGa AG and created 50 million tokens. The initially available supply of BAJU will be distributed to BloGa AG (holder of the treasury), including: the core team, accelerator, advisors, investors and early contributors.

<figure><img src="https://lh4.googleusercontent.com/mXFz_K2eaAPsR4oK_D49KgchlCI4so_1XplUR8lRE_tcCF-g9-XpohNSp9PEk5NyLWproKBG8MYbkWp5-_sLxGGXkbBWstl-hIUe0DFL-Nt6zdhw2HadW1KfXnbeB3k1McmxiEGsyA9Kyd1A5kqU7mQa5nXgOST-_0x0gCf7jW08f-4XavcMVh_yJw4pDA" alt=""><figcaption><p>BAJU's token distribution (11/2022)</p></figcaption></figure>

For more information, please visit [BAJU's dedicated token page on our website](https://ajuna.io/baju/).


# Treasury

To be added.


# Crowdloans


# A brief introduction to Crowdloans

The very basics of parachain auction of the Polkadot ecosystem

As stated on the [Kusama website](https://kusama.network/auctions/), parachains connect to the network \[that is Polkadot or Kusama] by leasing a slot on the Relay Chain via permissionless auctions. Parachain slot auctions follow a modified [candle auction](https://wiki.polkadot.network/docs/en/learn-auction#mechanics-of-a-candle-auction) format, with each auction lasting approximately 1 week. To prevent auction sniping (the strategy of bidding at the last moment) and promote more accurate price discovery, the exact endpoint of a particular auction remains unknown until after the auction’s close.

For additional information, you may take at our ["Beginner’s Guide to Parachain Auctions".](https://medium.com/ajuna-network/a-beginners-guide-to-parachain-auctions-52559baa0b60)


# Bajun's Crowdloan


# Ajuna's Crowdloan


# SAGE - Substrate Asset Game Engine

Want to develop a game using the Substrate framework but you only want to focus on building the actual game? Well the you are in the right place!

### 1. Introduction

Welcome to the SAGE book! Through the different chapters you'll learn about how to use SAGE to make your game a reality!

#### 1.1 Why SAGE?

Game development nowadays is very accessible, you have a great variety of engines and tutorials in which to build your dreams. But although traditional games are very accessible, not the same can be said about Blockchain-based ones. The higher barrier of entry into the ecosystem can make it a bit daunting, especially if your focus is only on gameplay.

In the case of Polkadot, one needs to build a fair bit of code before actually having something they can run on the chain, you also have to think about so many details before even having your game running!

That's where SAGE comes in! SAGE is an extra layer above the Substrate framework that solves most of the common issues when dealing with the blockchain ecosystem so that you can focus on what matters most, game development!

<figure><img src="https://1133517092-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTyB1haujdIDTpDTFNfug%2Fuploads%2FZV2UmZJbGw24MQwfcUzy%2FLayers.svg?alt=media&amp;token=8f565843-56b6-46f2-b03e-d85e942343e0" alt=""><figcaption></figcaption></figure>

Some of the features SAGE has baked in for you to use:

* Transfer of Assets between accounts
* Market where players can sell/buy assets
* Seasonal events for your game
* Tournaments between players
* Conversion of Assets from/to NFTs

Feeling hyped? Then continue onward to see how you can make your dreams a reality!

## 2. Getting Started

If you are familiar with or have already worked with either [Rust](https://www.rust-lang.org/) or the [Polkadot SDK](https://polkadot.com/platform/sdk) then this is going to be very simple!&#x20;

If it's your first time though, don't fret! You don't need to be an expert in either! But some knowledge of Rust development is going to be handy, luckily there's an excellent guide [here](https://doc.rust-lang.org/book/)! If you are strapped for time then chapters **1 to 8** are the most important for you to understand.

### 2.1 Setup and Dependencies

Developing with SAGE has the same prerequisites as the [Polkadot SDK](https://docs.polkadot.com/develop/parachains/install-polkadot-sdk/#before-you-begin-linux). Follow the guide for your operating system and you should have everything you need to start building your first game!

### 2.2 Initial thoughts

Before we begin let's stop for a moment and think. What kind of game do you want to make? Is it fast paced? Maybe it has a lot of items? Do players compete or maybe cooperate?

Although with SAGE game development is simpler than simply coding all scaffolding yourself, blockchains still have some advantages and also disadvantages compared to a more "traditional" game than doesn't rely on them.

One of the main components is **latency**, in blockchains any modification to the state of the game needs to be included into a block and then that block incorporated into the chain. That process can take between **6 and 12 seconds** in the case of [Polkadot](https://wiki.polkadot.network/docs/faq#what-is-the-block-time-of-the-relay-chain), which means basically, that games requiring very low gameplay latency like for example, a racing game, are not well suited for a blockchain runtime.

Another factor is storage, blockchains also cannot abuse space usage since the costs of transactions go up as the storage grows, same with the performance, so games that rely heavily on storage use may also need to compromise on that front.

Not all is bad news thought! You also have some pretty nice advantages with a blockchain runtime!

First and most important is security, the way blocks have their data encoded and stored makes tampering with them pretty much an impossibility, which in turn means that you don't really need to care much about securing your "server" compared to a more "traditional" game.

Another one is monetization, with a blockchain runtime you get both accounting and a liquid token that you can use for pretty much any interaction you may want.

In short, game development in the blockchain is better suited for games that don't require a lot of real-time state keeping but want to benefit from security and ease of monetization. For more advanced uses cases it's also possible to have your game split into non-blockchain and blockchain parts so that you can provide both interactivity and security at the same time!

Now that we've though a bit about the peculiarities for the blockchain, let's begin coding out first game!

#### **2.2.1 Gameplay assets**

So, the first thing we need to do is decide how our assets will look like. That is, the entities the players will use to play the game you build. That could be for example a weapon in a shooter, a car in a racer, or a hero in an RPG game.

Nonetheless, this is the core element of all your game's logic so think carefully while designing it, once the game is up and running, **changing the asset's structure could be very costly**.

First of all let's create a new rust crate in which we'll place our asset and also our assets identifier definitions, assuming you have completed the setup, open up your terminal and type:

```sh
cargo new --lib my_sage_game
```

This will create a directory named `my_sage_game`, in `Rust` we call this a `crate`, inside there will be a `lib.rs` file, open that file with your editor, and add the following lines:

```rust
// lib.rs
pub type MyAssetId = u32;

pub struct MyGameAsset {
    pub level: u32,
    pub exp: u32,
}
```

What we've done is define our asset's identifier as an `u32`, and our asset as a `struct` with two attributes: `level` and `exp` both also `u32` values.

You are probably wondering, what types can I use for my identifier? And for my asset? Well... the exact answer is a bit complex but in short, both the identifier and the asset can be pretty much any "data type" that is:

* [Scalar types](https://doc.rust-lang.org/book/ch03-02-data-types.html#scalar-types): integers and floats, both signed and unsigned, also [Strings](https://doc.rust-lang.org/book/ch08-02-strings.html).
* Any `struct`, `enum` or `union` that implements the [Clone](https://doc.rust-lang.org/std/clone/trait.Clone.html) trait.

In [#id-3.-sage-integration](#id-3.-sage-integration "mention") we'll talk in more detail about the specific restrictions on both types.

#### **2.2.2 Game instances?**

Sometimes when making a game you think first about the gameplay and the add the characters and story to it, sometimes it's the opposite though. With SAGE you can use both approaches while building your games:

You can begin by defining the assets you want to manipulate, like we did in the previous section and have multiple games use them in different ways. This is how we'll do it in this guide.

But, it's also possible to first define the behavior or gameplay logic, and then define different types of assets for it. To do that you'll need a bit more skill with rust and its generics system, see [here](https://doc.rust-lang.org/book/ch10-00-generics.html) for inspiration in how you would define your asset as a generic component that your gameplay can reuse.

We'll discuss more about this in the runtime integration chapter, but for now the only thing you need to know is that both approaches can be used in SAGE, so if your goal is to either use your game assets in many different games, or on the contrary reuse a given logic for different asset types, you can do it!

## 3. SAGE Integration

Integrating a game with SAGE means implementing the necessary logic required for the runtime integration to work, this is where most of the work will be. We'll go step by step using our example crate so that when the time for the runtime integration comes, everything goes smoothly.

First things first, going back to our example crate, we have defined an asset and its identifier. That's all good, but now, how do we integrate that with SAGE? The first thing we need is to add the necessary dependencies. So, we open the file named `Cargo.toml` and we add the following in the section called `dependencies`:

```toml
[dependencies]
ajuna-primitives = { git = "https://github.com/ajuna-network/ajuna-pallets.git", tag = "v0.15.0", default-features = false }
sage-api = { git = "https://github.com/ajuna-network/ajuna-pallets.git", tag = "v0.15.0", default-features = false }
```

With these we can begin the integration!

### 3.1 Adding gameplay

Blockchains are akin to a state machine in terms of interactions. We have a block that holds a given state and we execute transition functions that change that state into the next block. How do you translate that into gameplay? Well, you have your state in the form of the collection of assets held by all players, and each player can at any time call a specific transition function that changes the state of some of his assets, fundamentally all player interaction can be reduced to this simple phrase.

So at this point it may be no surprise that in SAGE, you do exactly that, through the implementation of the trait called `SageGameTransition`. Let's take a look at it:

```rust
pub enum TransitionOutput<AssetId, Asset> {
	Minted(Asset),
	Mutated(AssetId, Asset),
	Consumed(AssetId),
}

pub trait SageGameTransition {
	/// Transition identifier type.
	type TransitionId: Member + Parameter + MaxEncodedLen + TypeInfo;
	/// THe type of the specific configuration options for the transition
	type TransitionConfig: Member + Parameter + MaxEncodedLen + TypeInfo + Default;
	type AccountId: Member + Codec;
	type AssetId: Member + Parameter + MaxEncodedLen + TypeInfo;
	type Asset: Member + Parameter + MaxEncodedLen + TypeInfo + GetId<Self::AssetId>;
	/// An optional extra, which is simply forwarded to the `verify_rule` and `do_transition`
	/// method. If you don't need custom arguments, you can define that type as `()`.
	type Extra: Member + Parameter + MaxEncodedLen + TypeInfo + Default;

	fn do_transition(
		transition_id: &Self::TransitionId,
		account_id: &Self::AccountId,
		assets_ids: &[Self::AssetId],
		extra: &Self::Extra,
	) -> Result<Vec<TransitionOutput<Self::AssetId, Self::Asset>>, crate::TransitionError>;
}
```

That's quite a lot of words! Don't worry, we'll go slowly so that everything becomes familiar! If you cannot wait the code for the trait and its associated types is [here](https://github.com/ajuna-network/ajuna-pallets/blob/develop/sage/api/src/traits.rs#L17).

#### **3.1.1 Identifying state transitions**

The first thing you may notice in the trait is the associated type `TransitionId`, this is the type used to distinguish all your game transitions. And is the type you will use in the client side when requesting the execution of a given transition.

As you can see the type has some type restrictions, but in short, your type can be pretty much anything that we would consider a "primitive" type or a composition of "primitive" types. Since seeing is believing, let's defined the transition identifier for our example crate:

```rust
// lib.rs
use ajuna_primitives::pallet_prelude::{Decode, Encode, MaxEncodedLen, TypeInfo};

#[derive(Debug, Copy, Clone, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)]
#[non_exhaustive]
pub enum ExampleTransitionId {
    AddExperience(u8),
    BattleEnemy {
        enemy_level: u8,
    },
}
```

So here's our `enum` that describes the transitions, notice how we added `#[non_exhaustive]` this is an attribute that tells the compiler that this enum may add more variants in the future, which will force us to handle unknown cases in our logic!

We have two transitions `AddExperience` and `BattleEnemy` both have additional parameters which gives us extra flexibility! Of course it's also possible to have your transition identifier be a simple `u32` if you don't need this much detail.

#### **3.1.2 Implementing a simple transition**

With our identifier defined we can proceed to implement our game transitions, so, let's do it! First though, we need to talk about the rest of the `SageGameTransition` associated types:

* `TransitionConfig`: Use to define custom prams associated to a transition. **NOT IN USE**
* `AccountId`: This is the type used to identify player accounts in the runtime.
* `AssetId`: This is the identifier for the assets, in this example `MyAssetId`
* `Asset`: This is the type of the assets, in this example `MyAsset`
* `Extra`: This can be used to provide an extra state, controlled at the client side to the game transitions. This state is read-only, so any changes made to it, will not go back to the client.

So, for our example we have this:

```rust
// lib.rs
use ajuna_primitives::asset_manager::AssetInspector;
use sage_api::{traits::TransitionOutput, SageGameTransition, TransitionError};

pub struct ExampleGameTransitions<AssetHandler>(PhantomData<AssetHandler>);

impl<AssetHandler> SageGameTransition for ExampleGameTransitions<AssetHandler> 
where
    AssetHandler: AssetInspector<
        AccountId = Self::AccountId,
        AssetId = Self::AssetId,
        Asset = Self::Asset>
{
    type TransitionId = ExampleTransitionId;
    type TransitionConfig = ();
    type AccountId = u64;
    type AssetId = MyAssetId;
    type Asset = MyAsset;
    type Extra = ();

    fn do_transition(
        transition_id: &Self::TransitionId,
        account_id: &Self::AccountId,
        assets_ids: &[Self::AssetId],
        extra: &Self::Extra,
    ) -> Result<Vec<TransitionOutput<Self::AssetId, Self::Asset>>, TransitionError> {
        match transition_id {
            ExampleTransitionId::AddExperience(exp) => {
                let asset_id = asset_ids[0];
                let mut asset = AssetHandler::get_asset(&asset_id);

                asset.exp += exp;

                if asset.exp >= 100 {
                    asset.exp -= 100;
                    asset.level += 1;
                }

                Ok(vec![TransitionOutput::Modified((asset_id.clone(), asset))])
            },
            ExampleTransitionId::BattleEnemy(enemy) => {
                let asset_id = asset_ids[0];
                let mut asset = AssetHandler::get_asset(&asset_id);

                if enemy.enemy_level > (asset.level + 5) {
                    asset.exp = 0;
                    asset.level -= 1;
                } else {
                    asset.exp += (enemy.enemy_level * 2);

                    if asset.exp >= 100 {
                        asset.exp -= 100;
                        asset.level += 1;
                    }
                }

                Ok(vec![TransitionOutput::Modified((asset_id.clone(), asset))])
            },
        }
    }
}
```

So the code itself is pretty straightforward, in the `AddExperience` transition we just increase the `exp` attribute and if we reached `100` or more we level up the asset and reset its `exp`; whereas in the `BattleEnemy` if the `enemy_level` is greater than our `level` plus five, we lose our exp and one level, akin to a **YOU DIED** screen, if your level is in the proper range though, you get exp based on the enemy's level.

Seems unbalanced? It probably is, but the important thing this example aims to highlight is how at no point in the code we had to deal with any blockchain related topic at all! Well... I guess the `AccountId` is somewhat blockchain related... but anyways!

You may have noticed something a bit scary if you are not familiar with rust's generics. What is `PhantomData`? And what about `AssetManager` and `AssetInspector`?

`PhantomData` is a way to work around Rust's ownership rules, a way to trick to compiler into thinking we have ownership of some type we actually don't own, for the full explanation take a look here, but in general you don't need to think much about it.

`AssetManager` is just a generic type that we constrain to one of our utility traits that allow you to unlock the full power of SAGE with minimal knowledge or friction. Let's take a look at some of them:

### **3.2 SAGE utility traits**

There are many traits that SAGE provides to help you enhance your gameplay and interact with the runtime in which it will run. [Here](https://github.com/ajuna-network/ajuna-pallets/tree/develop/primitives/src) you'll find them. Let's highlight a couple:

```rust
pub trait AssetInspector {
    type AccountId: Member + Codec;
    type AssetId: Member + Codec;
    type Asset: Member + Codec;

    fn get_asset(asset_id: &Self::AssetId) -> Result<Self::Asset, DispatchError>;

    fn iter_assets_from(
        account_id: &Self::AccountId,
        ) -> impl Iterator<Item = (Self::AssetId, Self::Asset)>;
}
```

This is the trait you'll probably use the most, it allows you to retrieve a given asset from it's id or to iterate through all assets owned by a given account.

```rust
pub trait AssetManager {
    type AccountId: Member + Codec;
    type AssetId: Member + Codec;
    type Asset: Member + Codec;

    fn ensure_ownership(
        owner: &Self::AccountId,
        asset_id: &Self::AssetId,
        ) -> Result<Self::Asset, DispatchError>;

    // ...
}
```

A player cannot execute a transition using assets that are not owned by them, but your gameplay may actually contain interactions with other player's assets, so if you need to verify that an asset reference belongs to the player you expect, this trait can come in handy.

```rust
pub trait ChainInspector {
	type BlockNumber;

	fn get_current_block_number() -> Self::BlockNumber;
}
```

Some games make use of cooldowns to control player interaction, in a blockchain the concept of time is different than of a traditional game, so instead of for example waiting x amount of seconds you would wait y amount of blocks.

Of course, given that blocks have an average block time (in Polkadot it is 6s at the time of writing this book), you could somewhat make an equivalence between block number and actual real time. But time in a blockchain is discreet compared to the continuum that time represents in the real world.

In short, for games that make use of time in their gameplay logic, this trait is pivotal for that. One could also make use of the `Extra` associated type in the `SageGameTransition` trait for that, but it cannot guarantee the same consistency.

Now, going back to our example game, we already have most of what you would need to actually try running it in a development chain, but there are more features SAGE provides, so let's see how can we integrate them with our example!

### 3.3 Trading and transferring assets

We've talked about one of blockchain's advantages being that they come with a token already included with them, this token is used for many different operations in the Polkadot ecosystem. With SAGE you can leverage them as currency that your players can use in-game.

One of the main ways is by the trad and transfer of assets between them. This adds a very simple but powerful monetization component to any game with very minimal configuration from the developer. To showcase that let's see how we can add both features to our example game.

#### **3.3.1 Asset filters**

The ability to transfer or trade an asset is controlled by the pallet that you use as your runtime core, we'll talk more about that in chapter 5. This guide of course assumes you use the core we provide, which requires you implementing two traits: `TradeManager` and `TransferManager`. Let's take a look at them:

```rust
// ajuna-pallets/primitives/src/trade_manager.rs

pub trait TradeManager {
    type TradeFilter: Member + Parameter + MaxEncodedLen;
    type Asset: Member + Parameter + MaxEncodedLen;

    fn can_be_traded_using(asset: &Self::Asset, filter: &Self::TradeFilter) -> bool;
}

pub trait TransferManager {
    type TransferFilter: Member + Parameter + MaxEncodedLen;
    type Asset: Member + Parameter + MaxEncodedLen;

    fn can_be_transferred_using(asset: &Self::Asset, filter: &Self::TransferFilter) -> bool;
}
```

Pretty straightforward right? Each trait has a single method that evaluates to either `true` or `false`. Let's see how that would look for our example game:

```rust
// lib.rs

#[derive(Debug, Copy, Clone, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)]
pub struct MyAssetFilter {
    pub min_level: u32,
}

pub struct MyAssetFilterManager;

impl TradeManager for MyAssetFilterManager {
    type TradeFilter = MyAssetFilter;
    type Asset = MyAsset;

    fn can_be_traded_using(asset: &Self::Asset, filter: &Self::TradeFilter) -> bool {
        asset.level > filter.min_level
    }
}

impl TransferManager for MyAssetFilterManager {
    type TradeFilter = MyAssetFilter;
    type Asset = MyAsset;

    fn can_be_transferred_using(asset: &Self::Asset, filter: &Self::TradeFilter) -> bool {
        asset.level > filter.min_level
    }
}
```

As you can see, the filters are pretty simple. Only assets with level greater than the value set in the filter can be traded or transferred. Of course it's also possible to have something more complex and even use some or more of the utility traits to expand the capabilities of the filter methods. But I'll leave that to you!

### 3.4 Adding Seasonal Events

The concept of a season does vary between games, some enable or disable maps or modes in each season, while others just use as a way to change the behavior of certain game components like gold dropped by enemies or amount of experience received.

In the SAGE core implementation they are used mainly to control the amount of fees the players have to pay to use different features of the system, like initiating a transition or putting an asset on sale for example.

**NOTE: THE SECTION BELOW DESCRIBES BEHAVIOR THAT IS STILL NOT IMPLEMENT IN SAGE TRANSITION TRAIT NOR PALLET**

But, much like "traditional" games, seasons can also be used to change the behavior of your gameplay logic. To do so take a look at this code which can be found [here](https://github.com/ajuna-network/ajuna-pallets/blob/develop/primitives/src/season_manager.rs#L49):

```rust
// ajuna-pallets/primitives/src/season_manager.rs

// ...

#[derive(Encode, Decode, MaxEncodedLen, TypeInfo, Clone, Debug, Default, PartialEq)]
pub struct SeasonFeeConfig<Balance> {
	pub transfer_asset: Balance,
	pub buy_asset_min: Balance,
	pub buy_percent: u8,
	pub upgrade_asset_inventory: Balance,
	pub unlock_trade_asset: Balance,
	pub unlock_transfer_asset: Balance,
	pub state_transition_base_fee: Balance,
}

pub trait Validate {
	fn validate(&self) -> bool;
}

#[derive(Encode, Decode, MaxEncodedLen, TypeInfo, Clone, Debug, Default, PartialEq)]
pub struct SeasonConfig<Balance, SeasonData> {
	pub fee: SeasonFeeConfig<Balance>,
	pub data: SeasonData,
}

// ...
```

The structure of `SeasonConfig` shows the two components mentioned, `fee` holds all data regarding the costs of actions in SAGE. Whereas `data` holds the specific modifiers that you as a developer can define and will be available at each transition call.

### 3.5 Setting up tournaments between players

Much like seasons, some games allow player to participate in competitions that rank them, in SAGE you also can provide such component, the main difference is that in SAGE players compete not by directly playing against each other, but by comparing their assets in a given way that you can define.

#### **3.5.1 Ranking assets**

So, how do you rank assets? Well, in SAGE it's all done with, once again, a simple trait: `EntityRanker`. Let's take a look:

```rust
// ajuna-pallets/primitives/src/season_manager.rs

// ...

pub trait EntityRanker {
	type EntityId;
	type Entity;

	fn can_rank(&self, entity: (&Self::EntityId, &Self::Entity)) -> bool;

	fn rank_against(
		&self,
		entity: (&Self::EntityId, &Self::Entity),
		other: (&Self::EntityId, &Self::Entity),
	) -> Ordering;
}

// ...
```

The trait gives you two methods `can_rank` so that you can filter assets that may not fulfill the criteria of your tournaments. And `rank_against` which basically compares two assets and return and [Ordering](https://doc.rust-lang.org/std/cmp/enum.Ordering.html) for them.

Let's try with our example game!

```rust
// lib.rs

pub struct MyEntityRanker;

impl EntitryRanker for MyEntityRanker {
    type EntityId = MyAssetId;
    type Entity = MyAsset;

    fn can_rank(&self, entity: (&Self::EntityId, &Self::Entity)) -> bool {
        entity.level > 5
    }

    fn rank_against(
        &self,
        entity: (&Self::EntityId, &Self::Entity),
        other: (&Self::EntityId, &Self::Entity),
    ) -> Ordering {
        entity.1.level.cmp(other.1.level)
    }
}

```

Done! Our ranker will only allow assets with a level higher than 5 to be ranked, and will consider an asset with a level higher than another to be higher up in ranking!

Of course you may wonder, but how can I have multiple ranker types?&#x20;

One approach would to have your ranker be an `enum` so that you can define for each variant a given ranking logic. Alternatively you could instead opt for a parametrized `struct` that increases the flexibility of your logic.

Unfortunately, Rust with its strict type system, doesn't allow more dynamic behavior than that. That's why **if tournaments are going to be a big part of your gameplay**, you should spend some time thinking about the structure of your asset ranker.

### 3.6 Affiliates, how to and why

#### **3.6.1 Unlocking affiliation**

### 3.7 Using assets as NFTs

#### **3.7.1 From asset to NFT and back**

## 4. Runtime Integration

### 4.1 Handling payments

### 4.2 Benchmarks and weights


# Unity SDK for Substrate

Polkadot SDK for Unity

## Polkadot SDK for Unity

Unity Asset Store [LINK](https://assetstore.unity.com/packages/decentralization/infrastructure/polkadot-sdk-for-unity-273535)

![image](https://github.com/PolkadotPlay/Polkadot.Unity.SDK/assets/17710198/b8fc551f-fce6-4cea-a804-c1dbb8c26129)

### About This Project

The Polkadot SDK for Unity initiative, led by Ajuna Network, aims to merge the functionalities of the Substrate ecosystem with Unity game development. In a strategic move to broaden its impact within the gaming community, copyright ownership was shifted to Polkadot Play in 2024.

### Architecture Diagram

![Polkadot NET SDK Architecture](https://github.com/SubstrateGaming/Polkadot.Unity.SDK/assets/17710198/a1000535-e00e-49e4-9f6b-fd18d7f38984)

### Demo Game - Hexalem (1st place @ Polkadot Winter Hackathon 2023)

Hexalem has achieved a remarkable milestone by securing the 1st Prize at the Polkadot Winter Hackathon 2023. This project showcases a fully on-chain multiplayer strategy game, setting a new standard in the realm of blockchain mobile gaming. ![image](https://github.com/SubstrateGaming/Polkadot.Unity.SDK/assets/17710198/bdc8abe9-22ce-4e8f-b862-f32eb4d16aee)

[![HEXALEM@Winter Polkadot Hackathon 2023](https://github.com/SubstrateGaming/Polkadot.Unity.SDK/assets/17710198/292d8d13-0955-48e0-ad4e-4ba8eabbe34d)](https://youtu.be/_6uUkeI99yQ?t=7543) *Video: Präsentation of Hexalem 14.01.2024, Finals of the Polkadot Winter Hackathon 2023*

#### Acknowledgments

We want to thank @rwindegger and @svnscha for their support and assistance with the early development of the Substrate .NET API & Toolchain. Their help was crucial in navigating the challenges we encountered. Additionally, our thanks go to @Rosta and @apoxolit for their contributions to the Unity Demo Hexalem project.


# Substrate C# SDK

The C# Stack for Substrate by Ajuna Network

SUBSTRATE GAMING 👋

<https://github.com/SubstrateGaming/>

That's right! The gaming world is constantly evolving, and blockchain technology has the potential to revolutionize the way we play and experience games. With a gaming SDK for substrate (<https://github.com/paritytech/substrate/>), game developers can easily integrate their games with substrate-based blockchains and take their gaming experience to the next level!

### REPOSITORIES

* [Polkadot SDK for Unity](https://github.com/SubstrateGaming/Polkadot.Unity.SDK/)\
  Official Polkadot SDK for Unity ([Asset Store](https://assetstore.unity.com/packages/decentralization/infrastructure/polkadot-sdk-for-unity-273535)): Elevate your projects with effortless blockchain integration for dynamic gaming and unseen web3 app development! Documentation [WIKI](https://github.com/SubstrateGaming/Polkadot.Unity.SDK/wiki)
* [Substrate .NET API](https://github.com/SubstrateGaming/Substrate.NET.API)\
  Substrate .NET API Core for substrate-based nodes\
  [![Build](https://github.com/SubstrateGaming/Substrate.NET.API/actions/workflows/build.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.NET.API/actions/workflows/build.yml/badge.svg) [![Nuget](https://camo.githubusercontent.com/bc58da2ad3175d4b634c3276169cc949c612181beb7ee28cfcd0c0d698767aa0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4e45542e415049)](https://www.nuget.org/packages/Substrate.NET.API/) [![GitHub issues](https://camo.githubusercontent.com/28700dfe2911c7c043251aedc59e02fafd5836fbb3dc6eea4dc3651216ceba72/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f53756273747261746547616d696e672f5375627374726174652e4e45542e4150492e737667)](https://github.com/SubstrateGaming/Substrate.NET.API/issues) [![license](https://camo.githubusercontent.com/8b4efa8006202dd355440e2013cf082d4c5e8e6caef9e38cee2818c3696f7b09/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f53756273747261746547616d696e672f5375627374726174652e4e45542e415049)](https://github.com/SubstrateGaming/Substrate.NET.API/blob/origin/LICENSE) [![contributors](https://camo.githubusercontent.com/c16ee22b8de252beb9585c9c44e678e9e92baa25bc826b9a8b259bd1a442fe34/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f53756273747261746547616d696e672f5375627374726174652e4e45542e415049)](https://github.com/SubstrateGaming/Substrate.NET.API/graphs/contributors) [![Nuget](https://camo.githubusercontent.com/60efc23df47a5bc0664eb160c97f5ab026d6032f2724abdd6f1d41310a4f7bd7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4e45542e415049)](https://www.nuget.org/packages/Substrate.NET.API/)
* [Substrate .NET Toolchain](https://github.com/SubstrateGaming/Substrate.NET.Toolchain)\
  Substrate .NET Toolchain model-driven SDK generator for substrate-based nodes\
  [![GitHub issues](https://camo.githubusercontent.com/bb230b7968927ef20350e2bd00ab0e541040d91130ca5ccdc8e1429cf9e6ad9d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f53756273747261746547616d696e672f5375627374726174652e4e45542e546f6f6c636861696e2e737667)](https://github.com/SubstrateGaming/Substrate.NET.Toolchain/issues) [![license](https://camo.githubusercontent.com/b480ddaa4a0996e76f87aca1d38d30e8cd4cbe73e3c1f4d6b12fc478b37238df/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f53756273747261746547616d696e672f5375627374726174652e4e45542e546f6f6c636861696e)](https://github.com/SubstrateGaming/.github/blob/main/profile/LICENSE) [![contributors](https://camo.githubusercontent.com/1f3efd891c48b50b98348d8b3ac45c59a5e53e95937d26e92a6b50c0d815191b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f53756273747261746547616d696e672f5375627374726174652e4e45542e546f6f6c636861696e)](https://github.com/SubstrateGaming/Substrate.NET.Toolchain/graphs/contributors)
  * Substrate.ServiceLayer\
    [![Nuget](https://camo.githubusercontent.com/cb5da0ad4fc2550c2a32b0e839dd1d401abf4bdbac2942c2ae1d8b56e7ceb5a0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e536572766963654c61796572)](https://www.nuget.org/packages/Substrate.ServiceLayer/)
  * Substrate.ServiceLayer.Model\
    [![Nuget](https://camo.githubusercontent.com/47ec14949480d292ef8ea075f54d57a789252210a983da40695527f90ea36d06/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e536572766963654c617965722e4d6f64656c)](https://www.nuget.org/packages/Substrate.ServiceLayer.Model/)
  * Substrate.AspNetCore\
    [![Nuget](https://camo.githubusercontent.com/774f33a4ed4b1a772d81263ba43ac67bba5ce6c7b42afbd5be457770abe5103d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4173704e6574436f7265)](https://www.nuget.org/packages/Substrate.AspNetCore/)
  * Substrate.DotNet\
    [![Nuget](https://camo.githubusercontent.com/75635aadb3e1a06a2269af08dc48b54603cba9c92c0cbb8944a67957e2b2bd52/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e446f744e6574)](https://www.nuget.org/packages/Substrate.DotNet/)
  * Substrate.DotNet.Template\
    [![Nuget](https://camo.githubusercontent.com/4584d2a4b8f3a98b7c6adc1ceb9f1ad6ec48101880f9dba7c9ede3001fb1f20c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e446f744e65742e54656d706c617465)](https://www.nuget.org/packages/Substrate.DotNet.Template/)
* [Substrate .NET Wallet](https://github.com/SubstrateGaming/Substrate.NET.Wallet)\
  Substrate .NET Wallet functionalities\
  [![Build](https://github.com/SubstrateGaming/Substrate.NET.Wallet/actions/workflows/build.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.NET.Wallet/actions/workflows/build.yml/badge.svg) [![Nuget](https://camo.githubusercontent.com/e7b73273cbfe2916c8c80a18ee457d5708d4030e325ef60a5066307e849fab63/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4e45542e57616c6c6574)](https://www.nuget.org/packages/Substrate.NET.Wallet/) [![GitHub issues](https://camo.githubusercontent.com/1072b1585aed73579dffa11c8021a04942eb9ce62a2d1e8e588613e7c24c7bac/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f53756273747261746547616d696e672f5375627374726174652e4e45542e57616c6c65742e737667)](https://github.com/SubstrateGaming/Substrate.NET.Wallet/issues) [![license](https://camo.githubusercontent.com/14ada2c25d1ad0f7499e33e74924411e860e3a6cbd97bbdc30dc6e10f4d4dff9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f53756273747261746547616d696e672f5375627374726174652e4e45542e57616c6c6574)](https://github.com/SubstrateGaming/Substrate.NET.Wallet/blob/origin/LICENSE) [![contributors](https://camo.githubusercontent.com/08fc5280ebbbc7dc565de864474e06d0fbc2b177178f40cdf2851c58274a931a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f53756273747261746547616d696e672f5375627374726174652e4e45542e57616c6c6574)](https://github.com/SubstrateGaming/Substrate.NET.Wallet/graphs/contributors)\
  [![Nuget](https://camo.githubusercontent.com/e00916adb0d24da113b040a72e01cd077c1974d172b86b5a072d6ae3ecc6eb2a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4e45542e57616c6c6574)](https://www.nuget.org/packages/Substrate.NET.Wallet/)
* [Substrate Discord Bot](https://github.com/SubstrateGaming/Substrate.DiscordBot)\
  Discord .NET Bot for Substrate Nodes
* [Substrate Chains .NET API Extensions](https://github.com/SubstrateGaming/Substrate.Chains.NET)\
  Substrate Chains .NET API Extensions for Relay-, Para- and Solochains in the Substrate ecosystem\
  [![GitHub issues](https://camo.githubusercontent.com/7e98c9b01e35c5980fde177c9b2537c93e3df2f9a5c98e4cf081e182387d351f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f53756273747261746547616d696e672f5375627374726174652e436861696e732e4e45542e737667)](https://github.com/SubstrateGaming/Substrate.Chains.NET/issues) [![license](https://camo.githubusercontent.com/1a0dda0a31afe39710a063eee1ee17021e8415e2e13767b27b7b7d183cff52de/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f53756273747261746547616d696e672f5375627374726174652e436861696e732e4e4554)](https://github.com/SubstrateGaming/Substrate.Chains.NET/blob/origin/LICENSE) [![contributors](https://camo.githubusercontent.com/0f091f057e11d31fecf344a88aed1f5b3ade1ba70731a1ce8d18471f0b438b1d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f53756273747261746547616d696e672f5375627374726174652e436861696e732e4e4554)](https://github.com/SubstrateGaming/Substrate.Chains.NET/graphs/contributors)

### TOOLCHAIN GENERATED SDK

### Substrate NuGet Packages

[![GitHub issues](https://camo.githubusercontent.com/7e98c9b01e35c5980fde177c9b2537c93e3df2f9a5c98e4cf081e182387d351f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f53756273747261746547616d696e672f5375627374726174652e436861696e732e4e45542e737667)](https://github.com/SubstrateGaming/Substrate.Chains.NET/issues) [![license](https://camo.githubusercontent.com/1a0dda0a31afe39710a063eee1ee17021e8415e2e13767b27b7b7d183cff52de/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f53756273747261746547616d696e672f5375627374726174652e436861696e732e4e4554)](https://github.com/SubstrateGaming/Substrate.Chains.NET/blob/origin/LICENSE) [![contributors](https://camo.githubusercontent.com/0f091f057e11d31fecf344a88aed1f5b3ade1ba70731a1ce8d18471f0b438b1d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f53756273747261746547616d696e672f5375627374726174652e436861696e732e4e4554)](https://github.com/SubstrateGaming/Substrate.Chains.NET/graphs/contributors)

#### Polkadot (Relay Chain)

* Polkadot Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Polkadot.NET))
  * Substrate Polkadot .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/638038dee053f4c959b4ae7a31761966267973ce172ffc08409bb1c2916c08fb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e506f6c6b61646f742e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Polkadot.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/f3e0d402f677bb815ef756146111dbad9f8b0939468f387b457af4d684e62d81/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e506f6c6b61646f742e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/f3e0d402f677bb815ef756146111dbad9f8b0939468f387b457af4d684e62d81/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e506f6c6b61646f742e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_polkadot.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_polkadot.yml/badge.svg)

#### Polkadot (Parachain)

* Polkadot Asset Hub .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.PolkadotAssetHub.NET))
  * Substrate Polkadot AssetHub .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/76b6484001dfbdeba1746deae8a8676e3d118bf4fca255454da69031c4352a31/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e506f6c6b61646f7441737365744875622e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.PolkadotAssetHub.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/299cf1a2e496606a32bc12d66b6168b6384156597830bf0e3daf0ed69cd21f52/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e506f6c6b61646f7441737365744875622e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/299cf1a2e496606a32bc12d66b6168b6384156597830bf0e3daf0ed69cd21f52/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e506f6c6b61646f7441737365744875622e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_polkadotassethub.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_polkadotassethub.yml/badge.svg)
* Polkadot BridgeHub .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.PolkadotBridgeHub.NET))
  * Substrate Polkadot BridgeHub .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/9a660cc927078aa177801732e955c3e9ab530ff85e9b78b3de7d325ac99053cd/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e506f6c6b61646f744272696467654875622e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.PolkadotBridgeHub.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/6ec7437c5687fc50bdd63db228a8d092888de6e505e7d54bc1c1ac3872705135/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e506f6c6b61646f744272696467654875622e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/6ec7437c5687fc50bdd63db228a8d092888de6e505e7d54bc1c1ac3872705135/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e506f6c6b61646f744272696467654875622e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_polkadotbridgehub.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_polkadotbridgehub.yml/badge.svg)
* Collectives .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Collectives.NET))
  * Substrate Collectives .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/4b6c04d8a5246c0abe8ff7bf18688baa3cefea2070975576d194f7c0030feec0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e436f6c6c656374697665732e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Collectives.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/b7309471e17447f7d9d3e2b572574c14ac4ab55a51aa501cb5cd0c1e1b78ed4e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e436f6c6c656374697665732e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/b7309471e17447f7d9d3e2b572574c14ac4ab55a51aa501cb5cd0c1e1b78ed4e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e436f6c6c656374697665732e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_collectives.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_collectives.yml/badge.svg)
* Ajuna Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Ajuna.NET))
  * Substrate Ajuna .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/25466af7eefaa32e4dc4e21028be0a5ad3911ef5c5945238e40a74347f6c60f0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e416a756e612e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Ajuna.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/f2a1d204a88908ecab84c5f43cdac8599cbda6b90143f3d64097fc8fd8a3d185/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e416a756e612e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/f2a1d204a88908ecab84c5f43cdac8599cbda6b90143f3d64097fc8fd8a3d185/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e416a756e612e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_ajuna.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_ajuna.yml/badge.svg)
* Astar Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Astar.NET))
  * Substrate Astar .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/fcbb45655009b7723592a56b7a999db47fa60e9f4fdc036bd0549575680110fc/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e41737461722e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Astar.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/6c3077979ff026709273991d10a2828f77920fd545bd2f57f96e27131eb44373/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e41737461722e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/6c3077979ff026709273991d10a2828f77920fd545bd2f57f96e27131eb44373/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e41737461722e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_astar.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_astar.yml/badge.svg)
* Aventus Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Aventus.NET))
  * Substrate Aventus .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/61bc7e23799dea91d6acae25792353f0324cb787f27cd2429768198b9e119370/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4176656e7475732e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Aventus.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/ed55f36d355721c46df1a818a598219d8ba766e78d0aa8eb55456ffea4d4b570/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4176656e7475732e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/ed55f36d355721c46df1a818a598219d8ba766e78d0aa8eb55456ffea4d4b570/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4176656e7475732e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_aventus.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_aventus.yml/badge.svg)
* KILT Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.KILT.NET))
  * Substrate KILT .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/f3feb8c3915cfdcbb81a117ec964ee44e6b3a4a172eec631f2ca17570d165874/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4b494c542e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.KILT.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/b3943014ac153ea19aebfcf0625f682dce69ebd9b8188235b9d43bfa3354eefb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b494c542e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/b3943014ac153ea19aebfcf0625f682dce69ebd9b8188235b9d43bfa3354eefb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b494c542e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kilt.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kilt.yml/badge.svg)
* Moonbeam Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Moonbeam.NET))
  * Substrate Moonbeam .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/e808eba6ae872219f4cf7ceee1b98f5d8785273214fbdfdc27becc355dc1a240/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4d6f6f6e6265616d2e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Moonbeam.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/336136b6bb9db435c9e8e8f839d69efcc5416b6eb3752095ea28dca22dbebbc6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4d6f6f6e6265616d2e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/336136b6bb9db435c9e8e8f839d69efcc5416b6eb3752095ea28dca22dbebbc6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4d6f6f6e6265616d2e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_moonbeam.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_moonbeam.yml/badge.svg)
* Moonsama Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Moonsama.NET))
  * Substrate Moonsama .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/9b6d7a3546e4612f3bb82f953c3d6472cb9e6b6b0a02b75750e2a1943ee0c0a0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4d6f6f6e73616d612e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Moonsama.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/d93773f68e815440d508fbe9930d442fbd07d4425e3f64aebf3584cee3e7d976/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4d6f6f6e73616d612e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/d93773f68e815440d508fbe9930d442fbd07d4425e3f64aebf3584cee3e7d976/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4d6f6f6e73616d612e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_moonsama.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_moonsama.yml/badge.svg)
* Unique Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Unique.NET))
  * Substrate Unique .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/4041702daac9f45521f02a9a8bbec1070893d6de9708d32f99e3ca0d1cec1d0f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e556e697175652e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Unique.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/b8aba4fea16b485e7a1db56d0d142ec6d510bb0be7cd87174862ac7276141fb5/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e556e697175652e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/b8aba4fea16b485e7a1db56d0d142ec6d510bb0be7cd87174862ac7276141fb5/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e556e697175652e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_unique.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_unique.yml/badge.svg)
* Zeitgeist Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Zeitgeist.NET))
  * Substrate Zeitgeist .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/4ffa323f70e832a5ba6539ac1cdb2212224441dd165d59d63c7dc10cb018c586/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e5a65697467656973742e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Zeitgeist.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/ff8e843ad13c2c584da0695cbf1421edcf6c9cf030668478b3c7a45288a0ffc4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e5a65697467656973742e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/ff8e843ad13c2c584da0695cbf1421edcf6c9cf030668478b3c7a45288a0ffc4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e5a65697467656973742e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_zeitgeist.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_zeitgeist.yml/badge.svg)

#### Kusama (Relay Chain)

* Kusama Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Kusama.NET))
  * Substrate Kusama .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/1bdd484b3f9b631d0800afb1bcf90de472bc37337da5c1a5083c5da7e410d594/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4b7573616d612e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Kusama.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/cd9e5e5fb69a467800ac55310e9eac8d59b478db30a441a2fabdf5d8dcb80235/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b7573616d612e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/cd9e5e5fb69a467800ac55310e9eac8d59b478db30a441a2fabdf5d8dcb80235/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b7573616d612e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kusama.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kusama.yml/badge.svg)

#### Kusama (Parachain)

* Kusama AssetHub .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.KusamaAssetHub.NET))
  * Substrate Kusama AssetHub .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/bcfd31a01c5cc8ca391e8bbe6c66e61eae3a5693b19f1648c2729931d56e671c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4b7573616d6141737365744875622e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.KusamaAssetHub.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/b496712d20928a2853be2ca17be5cd7774b5dcc211e2d4f65da33f1da24ad27a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b7573616d6141737365744875622e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/b496712d20928a2853be2ca17be5cd7774b5dcc211e2d4f65da33f1da24ad27a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b7573616d6141737365744875622e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kusamaassethub.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kusamaassethub.yml/badge.svg)
* Kusama BridgeHub .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.KusamaBridgeHub.NET))
  * Substrate Kusama BridgeHub .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/9aaf8fb0214d87f9cd6384e555589870caab2ea18895c60ea48111bfddb75f4d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e4b7573616d614272696467654875622e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.KusamaBridgeHub.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/1df2222414bc2a5fb5a823c598d01d78a3fcc7a80bf6c83acecf8b9081034941/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b7573616d614272696467654875622e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/1df2222414bc2a5fb5a823c598d01d78a3fcc7a80bf6c83acecf8b9081034941/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e4b7573616d614272696467654875622e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kusamabridgehub.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_kusamabridgehub.yml/badge.svg)
* Bajun Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Bajun.NET))
  * Substrate Bajun .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/7a15f4ccc01ad55b35dc7e27b72e22ac9d475a0f6c00e857db65032d544fca3a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e42616a756e2e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Bajun.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/7186472332b6cbcfdf31b7d17fb8bab88494ac41a9e5003b64dcbe79f6d304fc/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e42616a756e2e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/7186472332b6cbcfdf31b7d17fb8bab88494ac41a9e5003b64dcbe79f6d304fc/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e42616a756e2e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_bajun.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_bajun.yml/badge.svg)

#### Other Ecosystem

* Vara Network .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Vara.NET))
  * Substrate Vara Network .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/9b056d5ad1467d28212e0992bd455cad6bd54a4b298cbd47c1d88efe4523797f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e566172612e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Vara.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/c293d134550bacb1c9d04e471b70387130ae4bab9ec91ee0d1980773f98a44bd/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e566172612e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/c293d134550bacb1c9d04e471b70387130ae4bab9ec91ee0d1980773f98a44bd/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e566172612e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_vara.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_vara.yml/badge.svg)
* Enjin Relaychain .NET SDK ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/tree/main/Substrate.Enjin.NET))
  * Substrate Enjin Relaychain .NET API Extension\
    [![Nuget](https://camo.githubusercontent.com/bfa074b944db4b938e74ab22a416f3c06eac88f13bb40624c150eef9fb6afcbc/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5375627374726174652e456e6a696e2e4e45542e457874656e73696f6e)](https://www.nuget.org/packages/Substrate.Enjin.NET.Extension/) [![Nuget](https://camo.githubusercontent.com/dc83ca94556f24ffac41b245b88d00d33ab1fc7c53df05fea202e1656d4af7db/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e456e6a696e2e4e45542e457874656e73696f6e)](https://camo.githubusercontent.com/dc83ca94556f24ffac41b245b88d00d33ab1fc7c53df05fea202e1656d4af7db/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5375627374726174652e456e6a696e2e4e45542e457874656e73696f6e)\
    [![Build](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_enjin.yml/badge.svg)](https://github.com/SubstrateGaming/Substrate.Chains.NET/actions/workflows/publish_enjin.yml/badge.svg)

**Add** or **update** your chain, by following the step-by-step instructions here. ([Link](https://github.com/SubstrateGaming/Substrate.Chains.NET/blob/main/README.md#add-or-update-package))


# Official Channels

Want to see more about us? Please find our official channels for Ajuna Network and our games below.

#### Website:&#x20;

* [Website Ajuna.io](https://ajuna.io/)

#### Twitter:

* [Twitter Ajuna Network](https://twitter.com/AjunaNetwork)
* [Twitter Battle Mogs](https://twitter.com/BattleMogs)
* [Twitter Español](https://twitter.com/HolaAjuna)

#### Telegram

* [Telegram Announcements](https://t.me/ajunanetwork)
* [Telegram Community](https://t.me/ajunacommunity)
* [Telegram Español](https://t.me/HolaAjunaNetwork)

#### Discord

* [Discord Ajuna ](https://discord.com/invite/xTnpa25gAA)

Other Channels:&#x20;

* [Linkedin](https://www.linkedin.com/company/ajuna-network/mycompany/?viewAsMember=true)
* [Medium](https://medium.ajuna.io/)
* [Youtube](https://www.youtube.com/channel/UCAK7o3xIb0uLrsAZ7bU0R4Q?sub_confirmation=1)
* [Subsocial](https://app.subsocial.network/6363)


# Ajuna's Games


# Event Recordings & Media


# Partners


# Polkadot & Kusama


# Media Kit

Ajuna & Bajun Brand Kits

Ajuna Network logos: <https://github.com/ajuna-network/brand/tree/main/Logos/AJUNA%20Logos>

Bajun Network logos: <https://github.com/ajuna-network/brand/tree/main/Logos/BAJUN%20Logos>


# Glossary


# Contributing


