IMPORTANT, USE OF SPEEDY NODE IS NO LONGER REQUIRED
Unity components and hooks for fast building of web3 games. With this SDK you can build web3 games for mobile, desktop, Xbox, Playstation and other platforms. This boilerplate allows you to authenticate users using crypto wallets on any platform.
This boilerplate is built on moralis-dotnet-sdk and Moralis. Also has its own context provider for quick access to chainId
or ethAddress
There are many components in this boilerplate that do not require an active web3 provider, they use Moralis Web3 API. Moralis supports the most popular blockchains and their test networks. You can find a list of all available networks in Moralis Supported Chains
Please check the official documentation of Moralis for all the functionalities of Moralis.
If this boilerplate helps you build Ethereum dapps faster - please star this project, every star makes us very happy!
If you need help with setting up the boilerplate or have other questions - don't hesitate to write in our community forum and we will check asap. Forum link. The best thing about this boilerplate is the super active community ready to help at any time! We help each other.
πΏ Install all dependencies:
π Download the latest package:
πΏ Create a New Unity Project and Import the Package
-
Open Unity Hub
-
Click on the 'NEW' button and create a new project
-
When the project opens, open Edit->Preferences->External Tools (on MAC this is Unity->Preferences->External Tools) and make sure "Script Editor" is set to your installed Visual Studio instance. IMPORTANT: This step must be done before importing the package.
-
Navigate to the folder you downloaded the package to. Drag and drop the package into the Unity project.
-
If you receive an error regarding Newtonsoft, follow these steps:
-
Open MoralisWeb3ApiSdk->Example and double-click on the DemoScene object.
-
In the "Hierachy" panel under DemoScene select "MoralisSetup".
-
In the "Inspector" section find the sub-section titled "MoralisController".
-
If the "MoralisController" sub-section is not expanded, expand it.
-
Using the information from your Moralis Server, fill in Application Id, and Server URL.
-
FOR WEBGL In Player Settings change the WebGL template to the Moralis WebGL Template
-
NOTE If, after importing but before running the package, you see an error that describes something as "unsafe", it is probably due to a block of code in Nethereum SCrypt.cs. Open Build Settings then Player Settings
- Scroll down. Check the box titled "Allow 'unsafe' code". Rebuild your game.
-
Run the application by clicking the Play icon located at the top, center of the Unity3D IDE.
-
Click on the "Authenticate" button to authenticate to Moralis using your Wallet.
-
To walk around use the mouse for direction, the 'W' key to move forward and the 'S' key to move backwards.
- In desktop and WebGL builds use the 'SHIFT' key with the 'W' and 'S' keys to run.
- Use the space bar to jump
- Use the Left mouse button to swing your sword.
-
Open the chest by bashing it with your sword. Inside is a game object that is also an NFT, you can claim this by clicking on it. Watch your wallet for the transaction request!
-
NOTE Your wallet must be connected to the Polygon Mumbai test network and your account will need some funds. Use the Polygon Faucet to send yourself test funds.
-
NOTE You can claim the NFT only once per address. If you re-run the demo after claiming the NFT, it will not be in the chest. Examine the AwardableController.cs file to see how this is done. You can change the code so that the mug still shows but trying to claim it will only waste gas as the one award per address is also re-enforced at the contract level.
- Yes, you can view your claimed NFT in Opensea.io and other NFT viewers if connected to the Polygon Mumbai network.
- If you examine the Metadata for the NFT you will see that in addition to the noraml PNG there is a URL for an Unity3D Prefab that can be programmatically loaded in Untiy 3D games and a link for a .fbx file that can be loaded in most 3D modeling applications and game engines including Blender.
-
Note the purpose of the demo is to show how to authenticate with and interact with Moralis and Web3 in a Unity3D game. Other than looking around, slaying the orcs, openning the chest and claiming the NFT, there is not a lot to do.
-
IMPORTANT If you want to create WebGL builds or want to run the Demo in WebGL, please read the Web3GL section prior to running the demo in WebGL.
This boilerplate project has been tested with the following Unity3D Releases:
- 2020.2
- 2020.3.31 (latest)
- 2021.2.5
ethereum-unity-boilerplate
- π Quick Start
- π§ Table of contents
- π§° Moralis SDK
- Web3
- WebGL
- π Ethereum Web3Api Methods
- π Solana Api Methods
- Helpful Tools
The.NET Moralis SDK provides easy to use methods that make integrating your application with Moralis a snap. You will find that the.NET SDK works much the same as in JavaScript. For use in Unity3D, we have added additional quick start objects for integrating the Moralis SDK in a Unity3D application. For the examples that follow we provide examples of how to use the Moralis.NET SDK directly and perform the same functionality using the provided Moralis Unity3D quick start tools.
The Moralis SDK Client provides a way to easily interact with Moralis database and the Web3API. In .NET we use the MoralisClient to interact with Moralis. For Unity3D we have provided a singleton wrapper named MoralisInterface that makes it easy to initialize the MoralisClient and then access it from anywhere in your Unity3D application. With either option you can initialize the Moralis Client with a single line of code
Required Using Statements
using Moralis;
using Moralis.Platform;
using Moralis.Web3Api.Client;
Initialize Client
MoralisClient moralis = new MoralisClient(new ServerConnectionData() { ApplicationID = "YOUR_APPLICATION_ID_HERE", ServerURI = "YOUR_SERER_URL_HERE"}, new Web3ApiClient());
note: The new Web3ApiClient() parameter is optional and should be included only when you will be using functionality from the Moralis Web3API REST service.
Initialize Client
MoralisInterface.Initialize(MoralisApplicationId, MoralisServerURI, hostManifestData);
note: For the hostManifestData parameter see HostManifestData
. This is required for Unity3D applications.
note: See User Object
for information about initializing the Moralis Client for a custom User Object.
Authentication is handled in a similar manner in both the SDK and the Unity3d. There is no direct manner to interact securely with a wallet in a .NET application so the Moralis SDK interacts with wallets in a loosely coupled manner. For the Unity3D boilerplate application, and the other examples we provide, we use Wallet Connect to facilitate interaction with wallets.
Here are the statements used to authenticate with Moralis:
MoralisUser user = await moralis.LogInAsync(authenticationData, CancellationToken.None);
MoralisUser user = await MoralisInterface.LogInAsync(authentication-Data);
note: See Authentication Data
for information about the authenticationData parameter.
The Unity3D Boilerplate application provides a detailed example of how to integrate with Wallet Connect and is worth examining in detail. Here are the relevant sections from the Boiler Plate Application:
- Wallet Selecttion This is initiated when the MainMenuScript.Play method is called. This method redirects to either a view with a QR Code or, if built for iOS or Android, a Wallet Select list (generated by Wallet Connect)
- Signature When the connect response from the wallet is received, Wallet Connect fires a WalletConnectEvent. This is handled by the MainMenuScript.WalletConnectHandler method.
// Extract wallet address from the Wallet Connect Session data object.
string address = data.accounts[0].ToLower();
string response = await walletConnect.Session.EthPersonalSign(address, "Moralis Authentication");
// Create moralis auth data from message signing response.
Dictionary<string, object> authData = new Dictionary<string, object> { { "id", address }, { "signature", response }, { "data", "Moralis Authentication" } };
// Attempt to login user.
MoralisUser user = await MoralisInterface.LogInAsync(authData);
Queries provide a way to retrieve information from your Moralis database.
using Moralis;
using Moralis.Platform.Objects;
using Moralis.WebGl;
using Moralis.WebGl.Platform.Objects;
The following example will return all Hero records where 'Level' is equal to 3.
MoralisQuery<Hero> q = MoralisInterface.GetClient().Query<Hero>().WhereEqualTo("Level", 3);
IEnumerable<Hero> result = await q.FindAsync();
MoralisQuery<Hero> q = await MoralisInterface.GetClient().Query<Hero>();
q = q.WhereEqualTo("Level", 3);
IEnumerable<Hero> result = await q.FindAsync();
The Moralis Dot Net SDK supports the same query methods as the JS SDK. For example creating 'OR', 'AND', and 'NOR' queries. For this example we will take a base query and construct an 'OR' query that returns records where Level is greater or equal to '3' OR the hero's name is 'Zuko'. Furthermore we will sort (order) the result set by the hero's strength, descending.
MoralisQuery<Hero> q = MoralisInterface.GetClient().Query<Hero>().WhereEqualTo("Level", 3);
MoralisQuery<PlayerData> q1 = MoralisInterface.GetClient()
.BuildOrQuery<PlayerData>(new MoralisQuery<PlayerData>[] {
q, MoralisInterface.GetClient().Query<PlayerData>().WhereEqualTo("Name", "Zuko")
})
.OrderByDescending("Strength");
IEnumerable<PlayerData> resp = await q1.FindAsync();
MoralisQuery<PlayerData> q = await MoralisInterface.GetClient().Query<PlayerData>();
MoralisQuery<PlayerData> q1 = q.WhereGreaterThanOrEqualTo("Level", 2);
MoralisQuery<PlayerData> q2 = q.WhereEqualTo("Name", "Zuko");
MoralisQuery<PlayerData> q3 = MoralisInterface.GetClient().BuildOrQuery<PlayerData>(new MoralisQuery<PlayerData>[] { q1, q2 }).OrderByDescending("Strength");
IEnumerable<PlayerData> result = await q3.FindAsync();
Live Queries are queries that include a subscription that provide updates whenever the data targeted by the query are updated. A Live Query subscription emits events that indicate the state of the client and changes to the data. For more information please see the docs.
The foloowing examples use the query example from above
MoralisLiveQueryClient<Hero> heroSubscription = moralis.Query<Hero>().Subscribe(callbacks);
_note: the callbacks parameter is optional. Please see Callbacks Explained below.
Since Unity3d is mainly used to create games, Unity3D apps generaly have life cycle events you do not usually need to worray about in a normal program. We have created a special Live Query wrapper object that automatically handles your subscriptions for pause, unpause, close, etc. This example shows how to create your subscription using this wrapper class.
MoralisQuery<Hero> q = MoralisInterface.GetClient().Query<Hero>();
MoralisLiveQueryController.AddSubscription<Hero>("Hero", q, callbacks);
_note: the callbacks parameter is optional. Please see Callbacks Explained bellow.
The MoralisLiveQueryController is a singleton object and so is available anywhere within your application. The first parameter ("Hero" above") is a key that you can use to retrieve a subscription (to check its status for example) or to remove a subscription.
By using the The MoralisLiveQueryController object you do not need to worry about properly closing or disposing of your subscriptions as this wrapper object handles all of that for you.
Callbacks are used to handle the events emitted by a subscription. You can set the callbacks directly against a subscription. However it is usually cleaner to separate these from the main code. To facilitate this we have included the MoralisLiveQueryCallbacks object. This optional object can be passed to the subscription.
MoralisLiveQueryCallbacks<Hero> callbacks = new MoralisLiveQueryCallbacks<Hero>();
callbacks.OnConnectedEvent += (() => { Debug.Log("Connection Established."); });
callbacks.OnSubscribedEvent += ((requestId) => { Debug.Log($"Subscription {requestId} created."); });
callbacks.OnUnsubscribedEvent += ((requestId) => { Debug.Log($"Unsubscribed from {requestId}."); });
callbacks.OnErrorEvent += ((ErrorMessage em) =>
{
Debug.Log($"ERROR: code: {em.code}, msg: {em.error}, requestId: {em.requestId}");
});
callbacks.OnCreateEvent += ((item, requestId) =>
{
Debug.Log($"Created hero: name: {item.Name}, level: {item.Level}, strength: {item.Strength} warcry: {item.Warcry}");
});
callbacks.OnUpdateEvent += ((item, requestId) =>
{
Debug.Log($"Updated hero: name: {item.Name}, level: {item.Level}, strength: {item.Strength} warcry: {item.Warcry}");
});
callbacks.OnDeleteEvent += ((item, requestId) =>
{
Debug.Log($"Hero {item.Name} has been defeated and removed from the roll!");
});
callbacks.OnGeneralMessageEvent += ((text) =>
{
Debug.Log($"Websocket message: {text}");
});
Creating your own objects to support NPCs, characters, and game objects is as simple as creating a Plain Old C# Object (POCO). The only stipulation is that your custom object must be a child of Moralis Object and when you create an instance of the object it should be made via moralis.Create method. This associates some extensions to your object that enable you to perform Moralis functions such as Save directly on the object.
using Moralis;
using Moralis.Platform.Objects;
public class Hero : MoralisObject
{
public int Strength { get; set; }
public int Level { get; set; }
public string Name { get; set; }
public string Warcry { get; set; }
public List<string> Bag { get; set; }
public Hero() : base("Hero")
{
Bag = new List<string>();
}
}
Hero h = moralis.Create<Hero>();
h.Name = "Zuko";
h.Strength = 50;
h.Level = 15;
h.Warcry = "Honor!!!";
h.Bag.Add("Leather Armor");
h.Bag.Add("Crown Prince Hair clip.");
await h.SaveAsync();
Hero h = MoralisInterface.GetClient().Create<Hero>();
h.Name = "Zuko";
h.Strength = 50;
h.Level = 15;
h.Warcry = "Honor!!!";
h.Bag.Add("Leather Armor");
h.Bag.Add("Crown Prince Hair clip.");
await h.SaveAsync();
The user object contains information about the currently logged in user. Upon successful login, the user is stored in local storage until logout. This allows a user to log in once and not login again until their session expires or they logout.
If you create a custom user object it must inherit from MoralisUser.
Since C# is a typed language the compiler must know what types are used at compile time. Due to this, since the MoralisUser is integral to internal functions in the Moralis SDK, when you create a custom User Object you must initialize the Moralis client using your custom User Object. After this step you can use the Moralis Client as usual.
MoralisClient<YourUserObject> moralis = new MoralisClient<YourUserObject>(new ServerConnectionData() { ApplicationID = "YOUR_APPLICATION_ID_HERE", ServerURI = "YOUR_SERER_URL_HERE"}, new Web3ApiClient());
note: for Unity3D you will need to make the above change in the MoralisInterface.Initialize object. You will also need to replace the MoralisUser object elsewhere in the Boilerplate code. WARNING do not make any replacements to any files under the MoralisDtoNet folder
Authentication data is a Dictionary<string, string> object that contains the information required by Moralis to authenticate a user. As a minimum the authentication data dictionary must contain the following entries:
- id The wallet address of the wallet used to sign the message.
- signature The signature data returned by the Sign request sent to the wallet.
- data The message that was sent to the wallet to be signed.
Dictionary<string, object> authData = new Dictionary<string, object> { { "id", "ADDRESS_HERE".ToLower() }, { "signature", "SIGNATURE_DATA_HERE" }, { "data", "MESSAGE_HERE" } };
In Unity3D applications the HostManifestData object is used to pass information to Moralis that is usually autogenerated from Windows system variables. Since Unity3D supports multiple platforms this information is not always available.
Description here
The Web3 object is used for executing Evm RPC calls, meaning transactions directly against the chain. While the Web3Api is more efficient for most Web3 calls, the Web3Api does not support state changes or transactions. The Web3 object does allow state change and transactions against the change.
For Web3 support, an Nethereum Web3 object is exposed in the MoralisInterface. Developers can use the Web3 object directly.
IMPORTANT Before it can be used, the Web3 object must be initialized, unfortunetly this cannot be done until a connection to the wallet is established. For this demo we added the following methods to the MainMenuScript.cs file:
private void InitializeWeb3()
{
MoralisInterface.SetupWeb3();
// Create an entry for the Game Rewards Contract.
MoralisInterface.InsertContractInstance("Rewards", GameAwardContractAbi(), "mumbai", "0x05af21b57d2E378F90106B229E717DC96c7Bb5e2");
}
/// <summary>
/// Must be referenced by the WalletConnect Game object
/// </summary>
/// <param name="session"></param>
public void WalletConnectSessionEstablished(WalletConnectUnitySession session)
{
InitializeWeb3();
}
In the Unity3D IDE under Heirarchy find and select the WalletConnect object
Under the Inspector find the events associated with New Session Connected and Resumed Session Connected
The method above should be referenced by both of these events.
To make Web3 calls easier we have included a few tools.
First, a EvmContractManager object provides an easy way to set up contracts that are reflected across several chains. The Contract andits functions can be easily retrieved from any where in you code via MoralisInterface.
To setup a contract instance use InsertContractInstance:
MoralisInterface.InsertContractInstance("Rewards", GameAwardContractAbi(), "mumbai", "0x05af21b57d2E378F90106B229E717DC96c7Bb5e2");
In this example a contract with key "Rewards" is created using the contract ABI (as json), the main chain the contract is on, and the address of the contract on that chain. For a live example please see the MainMenuScript.cs file.
By calling MoralisInterface.AddContractChainAddress([CONTRACT KEY], [CHAIN ID], [CONTRACT ADDRESS]) you can create multiple chain specific instances of the same contract using the ABI originally added with [CONTRACT KEY].
To retrieve an Nethereum contract instance call:
Contract c = MoralisInterface.EvmContractInstance([CONTRACT KEY], [CHAIN ID]);
Retrieve an Nethereum contract function instance:
Function f = MoralisInterface.EvmContractFunctionInstance([CONTRACT KEY], [CHAIN ID], [FUNCTION NAME]);
Call function with no parameters
// No parameters
object[] pars = new object[0];
string jsonResult = await f.CallAsync(pars);
Call function with parameters
object[] pars = {"My string", 2};
string jsonResult = await f.CallAsync(pars);
Call function with parameters, specify from, gas, and value.
string playerAddress = "0x37bd48252f4dcE15C7147eA82b31978a00750f81";
object[] pars = {"My string", 2};
Nethereum.Hex.HexTypes.HexBigInteger g = new Nethereum.Hex.HexTypes.HexBigInteger(80);
Nethereum.Hex.HexTypes.HexBigInteger wei = new Nethereum.Hex.HexTypes.HexBigInteger(1000);
string jsonResult = await func.CallAsync(playerAddress, new Nethereum.Hex.HexTypes.HexBigInteger(80), new Nethereum.Hex.HexTypes.HexBigInteger(1000), pars);
For other call function varients see the Nethereum documentation.
To execute a transaction you can also call MoralisInstance.SendEvmTransactionAsync or MoralisInterface.SendTransactionAndWaitForReceiptAsync. These functions represent only a couple of the variants available from the Nethereum.Contracts.Function object.
Due to the way WebGL works, for security reasons it does not support outbound calls or multi-threading. The Moralis SDK depends heavily on both. As a solution we created a duplicate of the SDK that specifically geared to be compatible with WebGL.
For most functionality the switch between other build types and WebGL should be seemless, with two exceptions.
Anytime you directly access moralis interfaces, objects, models, etc., use the Moralis.WebGL instead of the Moralis namespace. For example:
using Moralis.Platform.Objects;
using Moralis.Web3Api.Models;
becomes
using Moralis.WebGL.Platform.Objects;
using Moralis.WebGL.Web3Api.Models;
When you have a file that is used for both WebGL and non-WebGL builds use the UNITY_WEBGL pre-processor statement to seperate the code that will be used for each type of build. As example here is part of the using statement from the TokenListController.cs file from the Boilerplate Example:
#if UNITY_WEBGL
using Moralis.WebGL.Platform.Objects;
using Moralis.WebGL.Web3Api.Models;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using Assets.MoralisWeb3ApiSdk.Example.Scripts;
#else
using Moralis.Platform.Objects;
using Moralis.Web3Api.Models;
#endif
Additionally you can define blocks of code to be included or ignored depending on whether the code is build for WebGL or not. For a good example of this please examine the code in the TokenListController.cs file in the Boilerplate Example.
Under the hood, WebGL loads external resources similar to javascript using AJAX. This means that you can run into CORs issues in the client browser when loading external resources. The prescribed method to solve this issue (as settings for CORS are on the server side) is to create a proxy service.
As part of the WebGL solution example, the TokenListController.cs file shows how to use a Moralis Cloud function as a proxy for loading external resources. To successfully display the images of tokens in the wallet example you will need to create the following cloud function in your Moralis server.
- Log into Moralis, select and expand your Server instance.
- Click on the "Cloud Functions" button.
- Copy the following code into your Cloud Functions
Moralis.Cloud.define("loadResource", async (request) => {
const logger = Moralis.Cloud.getLogger();
return await Moralis.Cloud.httpRequest({
url: request.params.url
}).then(function(httpResponse) {
let resp = {status: httpResponse.status, headers: httpResponse.headers, data: JSON.stringify(httpResponse.buffer)};
return resp;
},function(httpResponse) {
// Error occurred
logger.error('Request failed with response code ' + httpResponse.status);
return httpResponse;
});
}, {
fields : ["url"]
});
- Click on the "Save" button.
The complete Moralis Web3API schema including endpoints, operations and models, can be found by logging in to your Moralis Server and selecting Web3 API*
For use with either Moralis SDK or in Unity3d, the following using statements are required:
using System.Collections.Generic;
using Moralis.Web3Api.Models;
Use the code snippet below to retrieve a list of EVM chains supported in the Moralis Web3API. This list can be used for populating dropdown lists etc.
List<ChainEntry> chains = MoralisInterface.SupportedChains;
Code examples demonstrating how to use the Moralis Web3API Account endpoint and operations.
Gets native balance for a specific address
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
- toBlock string OPTIONAL The maximum block number from where to get the logs.
NativeBalance balance = await MoralisInterface.GetClient().Web3Api.Account.GetNativeBalance(address.ToLower(), ChainList.eth);
Debug.Log($"GetNativeBalance Balance: {balance.Balance}");
Gets NFTs owned by the given address
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- format string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL The field(s) to order on and if it should be ordered in ascending or descending order. Specified by: fieldName1.order,fieldName2.order. Example 1: "name", "name.ASC", "name.DESC", Example 2: "Name and Symbol", "name.ASC,symbol.DESC"
NftOwnerCollection nftCollection = await MoralisInterface.GetClient().Web3Api.Account.GetNFTs(userAddress, chainId);
if (nftCollection.Total < 1)
{
Debug.Log($"User {userAddress} does not have any NFTs on chain {chainId.ToString()}");
}
else
{
Debug.Log($"Nfts for User {userAddress}");
foreach (NftOwner nft in nftCollection.Result)
{
Debug.Log($"TokenId: {nft.TokenId}, Name: {nft.Name}, Balance: {nft.Amount}");
}
}
Gets NFTs owned by the given address
- address string REQUIRED Target address
- tokenAddress string REQUIRED Address of the contract
- chain ChainList REQUIRED The chain to query
- format string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL The field(s) to order on and if it should be ordered in ascending or descending order. Specified by: fieldName1.order,fieldName2.order. Example 1: "name", "name.ASC", "name.DESC", Example 2: "Name and Symbol", "name.ASC,symbol.DESC"
NftOwnerCollection resp = await MoralisInterface.GetClient().Web3Api.Account.GetNFTsForContract(address.ToLower(), "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth);
Debug.Log($"GetNFTsForContract Count: {resp.Total}");
Gets the transfers of the tokens matching the given parameters
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- format string OPTIONAL The format of the token id
- direction string OPTIONAL The transfer direction
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL The field(s) to order on and if it should be ordered in ascending or descending order. Specified by: fieldName1.order,fieldName2.order. Example 1: "name", "name.ASC", "name.DESC", Example 2: "Name and Symbol", "name.ASC,symbol.DESC"
NftTransferCollection balance = await MoralisInterface.GetClient().Web3Api.Account.GetNFTTransfers(address.ToLower(), ChainList.eth);
Debug.Log($"GetNFTTransfers Matches: {balance.Total}");
Gets token balances for a specific address
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- toBlock string OPTIONAL The maximum block number from where to get the logs.
List<Erc20TokenBalance> balance = await MoralisInterface.GetClient().Web3Api.Account.GetTokenBalances(address.ToLower(), ChainList.eth);
Debug.Log($"GetTokenBalances Count: {balance.Count}");
Gets ERC20 token transactions in descending order based on block number
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
Erc20TransactionCollection balance = await MoralisInterface.GetClient().Web3Api.Account.GetTokenTransfers(address.ToLower(), ChainList.eth);
Debug.Log($"GetTokenTransfers Count: {balance.Total}");
Gets native transactions in descending order based on block number
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
TransactionCollection balance = await MoralisInterface.GetClient().Web3Api.Account.GetTransactions(address.ToLower(), ChainList.eth);
Debug.Log($"GetTransactions Count: {balance.Total}");
Code examples demonstrating how to use the Moralis Web3API Defi endpoint and operations.
Fetches and returns pair data of the provided token0+token1 combination. The token0 and token1 options are interchangable (ie. there is no different outcome in "token0=WETH and token1=USDT" or "token0=USDT and token1=WETH")
- exchange string REQUIRED The factory name or address of the token exchange
- token0Address string REQUIRED Token0 address
- token1Address string REQUIRED Token1 address
- chain ChainList REQUIRED The chain to query
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
ReservesCollection nftTransers = MoralisInterface.GetClient().Web3Api.Defi.GetPairAddress(exchange, token0Address, token1Address, ChainList.eth);
Get the liquidity reserves for a given pair address
- pairAddress string REQUIRED Liquidity pair address
- chain ChainList REQUIRED The chain to query
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
ReservesCollection nftTransers = MoralisInterface.GetClient().Web3Api.Defi.GetPairReserves(pairAddress, ChainList.eth);
Code examples demonstrating how to use the Moralis Web3API Native endpoint and operations.
Gets the contents of a block by block hash
- blockNumberOrHash string REQUIRED The block hash or block number
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
Block block = MoralisInterface.GetClient().Web3Api.Native.GetBlock(blockNumberOrHash, ChainList.eth);
Gets events in descending order based on block number
- address string REQUIRED Target address
- topic string REQUIRED The topic of the event. This is the hash of the function
- abi object REQUIRED ABI of the event being searched for. See example below for object format.
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
// Event ABI input parameters
object[] inputParams = new object[3];
inputParams[0] = new { indexed = true, internalType = "bytes32", name = "role", type = "bytes32" };
inputParams[1] = new { indexed = true, internalType = "address", name = "account", type = "address" };
inputParams[2] = new { indexed = true, internalType = "address", name = "sender", type = "address" };
// Event ABI
object abi = new { anonymous = false, inputs = inputParams, name = "RoleGranted", type = "event" };
List<LogEvent> logEvents = await MoralisInterface.GetClient().Web3Api.Native.GetContractEvents("0x698d7D745B7F5d8EF4fdB59CeB660050b3599AC3", "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", abi, ChainList.mumbai);
Debug.Log($"Contract Function returned {logEvents.Count} events");
Gets the closest block of the provided date
- data string REQUIRED Unix date in miliseconds or a datestring (any format that is accepted by momentjs)
- chain ChainList REQUIRED The chain to query
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
string blockNumberOrHash = "25509457";
Block block = await MoralisInterface.GetClient().Web3Api.Native.GetBlock(blockNumberOrHash, chainId);
Debug.Log($"GetBlock BlockNumber: {block.Number}, Transaction Count: {block.TransactionCount}");
Gets the logs from an address
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- blockNumber string OPTIONAL The block number.
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- topic0 string OPTIONAL
- topic1 string OPTIONAL
- topic2 string OPTIONAL
- topic3 string OPTIONAL
LogEventByAddress logEvents = await MoralisInterface.GetClient().Web3Api.Native.GetLogsByAddress(userAddress, chainId);
Debug.Log($"GetLogsByAddress BlockNumber: {logEvents.BlockNumber}, Transaction Count: {logEvents.Data}");
Gets NFT transfers by block number or block hash
- blockNumberOrHash string REQUIRED The block hash or block number
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
NftTransferCollection nftTransfers = await MoralisInterface.GetClient().Web3Api.Native.GetNFTTransfersByBlock("500000", chainId);
Debug.Log($"GetNFTTransfersByBlock Nfts returned: {nftTransfers.Result.Count}");
Gets the contents of a block transaction by hash
- transactionHash string REQUIRED The transaction hash
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
string transactionHash = "0xe1ec2dd9964f4dc59b53dce083917abfb5ab5191a37cb1e21566969caa614fcd";
BlockTransaction blockTransaction = await MoralisInterface.GetClient().Web3Api.Native.GetTransaction(transactionHash, ChainList.mumbai);
Debug.Log($"Block transaction BlackNumber: {blockTransaction.BlockNumber}, from Address: {blockTransaction.FromAddress}");
Runs a given function of a contract abi and returns readonly data
- address string REQUIRED Target address
- abi object REQUIRED Abi of the Function being called - see example for format.
- chain ChainList REQUIRED The chain to query
- functionName string REQUIRED Function name of the target function.
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
// Function ABI input parameters
object[] inputParams = new object[1];
inputParams[0] = new { internalType = "uint256", name = "id", type = "uint256" };
// Function ABI Output parameters
object[] outputParams = new object[1];
outputParams[0] = new { internalType = "string", name = "", type = "string" };
// Function ABI
object[] abi = new object[1];
abi[0] = new { inputs = inputParams, name = "uri", outputs = outputParams, stateMutability = "view", type = "function" };
// Define request object
RunContractDto rcd = new RunContractDto()
{
Abi = abi,
Params = new { id = "15310200874782" }
};
string resp = await MoralisInterface.GetClient().Web3Api.Native.RunContractFunction("0x698d7D745B7F5d8EF4fdB59CeB660050b3599AC3", "uri", rcd, ChainList.mumbai);
Debug.Log($"Contract Function returned: {resp}");
Code examples demonstrating how to use the Moralis Web3API Resolve endpoint and operations.
Resolves an Unstoppable domain and returns the address
- domain string REQUIRED Domain to be resolved
- currency string OPTIONAL The currency to query.
Resolve resp = await MoralisInterface.GetClient().Web3Api.Resolve.ResolveDomain("brad.crypto");
Debug.Log($"ResolveDomain Address: {resp.Address}");
Resolves an ETH address and find the ENS name
- address string REQUIRED The wallet address to perform reverse lookup on.
Ens resp = await MoralisInterface.GetClient().Web3Api.Resolve.ResolveAddress("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
Debug.Log($"ResolveAddress Name: {resp.Name}");
Code examples demonstrating how to use the Moralis Web3API Storage endpoint and operations.
Resolves an ETH address and find the ENS name
- request List REQUIRED Upload Data
// Define file information.
IpfsFileRequest req = new IpfsFileRequest()
{
Path = "moralis/logo.jpg",
Content = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3"
};
// Multiple requests can be sent via a List so define the request list.
List<IpfsFileRequest> reqs = new List<IpfsFileRequest>();
// Add requests to request list.
reqs.Add(req);
List<IpfsFile> resp = web3Api.Storage.UploadFolder(reqs);
Code examples demonstrating how to use the Moralis Web3API Token endpoint and operations.
Gets data, including metadata (where available), for all token ids for the given contract address.
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- foramt string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL If the order should be Ascending or Descending based on the blocknumber on which the NFT was minted. Allowed values: "ASC", "DESC"
NftCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetAllTokenIds("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth, null, 0, 10);
Debug.Log($"GetAllTokenIds returned {resp.Total} Nfts");
Gets the transfers of the tokens matching the given parameters
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- foramt string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL If the order should be Ascending or Descending based on the blocknumber on which the NFT was minted. Allowed values: "ASC", "DESC"
NftTransferCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetContractNFTTransfers("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth, null, 0, 10);
Debug.Log($"GetContractNFTTransfers returned {resp.Total} Nft transfer entries");
Get the lowest price found for a nft token contract for the last x days (only trades paid in ETH)
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- days integer OPTIONAL Offset
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
- marketplace string OPTIONAL web3 marketplace from where to get the trades (only opensea is supported at the moment)
Trade resp = await MoralisInterface.GetClient().Web3Api.Token.GetNFTLowestPrice("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth, 2000);
Debug.Log($"GetNFTLowestPrice Price: {resp.Price}");
Gets the contract level metadata (name, symbol, base token uri) for the given contract
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
NftContractMetadata resp = await MoralisInterface.GetClient().Web3Api.Token.GetNFTMetadata("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth);
Debug.Log($"GetNFTMetadata Name: {resp.Name}, TokenAddress: {resp.TokenAddress}");
Gets all owners of NFT items within a given contract collection
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- format string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL If the order should be Ascending or Descending based on the blocknumber on which the NFT was minted. Allowed values: "ASC", "DESC"
NftOwnerCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetNFTOwners("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth, null, 0, 10);
Debug.Log($"GetNFTOwners returned {resp.Total} Nft Owner records");
Get the nft trades for a given contracts and marketplace
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
- marketplace string OPTIONAL web3 marketplace from where to get the trades (only opensea is supported at the moment)
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
TradeCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetNFTTrades("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth, null, null, null, null, null, null, 0, 10);
Debug.Log($"GetNFTTrades returned {resp.Total} Nft trades");
Gets the transfers of the tokens from a block number to a block number
- chain ChainList REQUIRED The chain to query
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- format string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL If the order should be Ascending or Descending based on the blocknumber on which the NFT was minted. Allowed values: "ASC", "DESC"
NftTransferCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetNftTransfersFromToBlock(ChainList.eth, 99999, 25999999, null, null, null, 0, 10);
Debug.Log($"GetNftTransfersFromToBlock returned {resp.Total} Nft Transfers");
Gets ERC20 token contract transactions in descending order based on block number
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
Erc20TransactionCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetTokenAddressTransfers("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", ChainList.eth, null, null, null, null, null, 0, 10);
Debug.Log($"GetTokenAddressTransfers returned {resp.Total} transfer entries");
Gets the amount which the spender is allowed to withdraw from the spender
- address string REQUIRED Target address
- ownerAddress string REQUIRED Target address
- spenderAddress string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
Erc20Allowance allowance = MoralisInterface.GetClient().Web3Api.Token.GetTokenAllowance(address, ownerAddress, spenderAddress, ChainList.eth);
Gets data, including metadata (where available), for the given token id of the given contract address.
- address string REQUIRED Target address
- tokenId string REQUIRED The id of the token
- chain ChainList REQUIRED The chain to query
- foramt string OPTIONAL The format of the token id
Nft resp = await MoralisInterface.GetClient().Web3Api.Token.GetTokenIdMetadata("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", "10", ChainList.eth);
Debug.Log($"GetTokenIdMetadata Name: {resp.Name}, Amount: {resp.Amount}");
Gets all owners of NFT items within a given contract collection
- address string REQUIRED Target address
- tokenId string REQUIRED The id of the token
- chain ChainList REQUIRED The chain to query
- foramt string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL If the order should be Ascending or Descending based on the blocknumber on which the NFT was minted. Allowed values: "ASC", "DESC"
NftOwnerCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetTokenIdOwners("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", "10", ChainList.eth, null, 0, 10);
Debug.Log($"GetTokenIdOwners returned {resp.Total} Nfts");
Returns metadata (name, symbol, decimals, logo) for a given token contract address.
- address List REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
List<string> addresses = new List<string>();
addresses.Add("0x6b175474e89094c44da98b954eedeac495271d0f");
List<Erc20Metadata> resp = await MoralisInterface.GetClient().Web3Api.Token.GetTokenMetadata(addresses, ChainList.eth);
Debug.Log($"GetTokenMetadata returned {resp.Count} entries.");
Returns metadata (name, symbol, decimals, logo) for a given token contract address.
- symbols List REQUIRED Target address
- chain ChainList REQUIRED The symbols to get metadata for
- subdomain string OPTIONAL The subdomain of the moralis server to use (Only use when selecting local devchain as chain)
List<string> symbols = new List<string>();
symbols.Add("DAI");
List<Erc20Metadata> resp = await MoralisInterface.GetClient().Web3Api.Token.GetTokenMetadataBySymbol(symbols, ChainList.eth);
Debug.Log($"GetTokenMetadataBySymbol returned {resp.Count} entries.");
Returns the price nominated in the native token and usd for a given token contract address.
- address string REQUIRED Target address
- chain ChainList REQUIRED The chain to query
- providerUrl string OPTIONAL web3 provider url to user when using local dev chain
- exchange string OPTIONAL The factory name or address of the token exchange
- toBlock string OPTIONAL The maximum block number from where to get the logs.
Erc20Price resp = await MoralisInterface.GetClient().Web3Api.Token.GetTokenPrice("0x6b175474e89094c44da98b954eedeac495271d0f", ChainList.eth);
Debug.Log($"GetTokenPrice Price: {resp.UsdPrice} USD");
Gets the transfers of the tokens matching the given parameters
- address string REQUIRED Target address
- tokenId string REQUIRED The id of the token
- chain ChainList REQUIRED The chain to query
- foramt string OPTIONAL The format of the token id
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
- order string OPTIONAL If the order should be Ascending or Descending based on the blocknumber on which the NFT was minted. Allowed values: "ASC", "DESC"
NftTransferCollection resp = await MoralisInterface.GetClient().Web3Api.Token.GetWalletTokenIdTransfers("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d", "10", ChainList.eth, null, 0, 10);
Debug.Log($"GetWalletTokenIdTransfers returned {resp.Total} Nfts");
Gets NFTs that match a given metadata search.
- q string REQUIRED The search string
- chain ChainList REQUIRED The chain to query
- foramt string OPTIONAL The format of the token id
- filter string OPTIONAL What fields the search should match on. To look into the entire metadata set the value to 'global'. To have a better response time you can look into a specific field like name. Available values : name, description, attributes, global, name,description, name,attributes, description,attributes, name,description,attributes
- fromBlock string OPTIONAL The minimum block number from where to get the logs.
- toBlock string OPTIONAL The maximum block number from where to get the logs.
- fromDate string OPTIONAL The date from where to get the logs (any format that is accepted by momentjs).
- toDate string OPTIONAL Get the logs to this date (any format that is accepted by momentjs)
- offset integer OPTIONAL Offset
- limit integer OPTIONAL Limit
NftMetadataCollection resp = await MoralisInterface.GetClient().Web3Api.Token.SearchNFTs("Apes", ChainList.eth, null, null, null, null, null, null, 0, 10);
Debug.Log($"SearchNFTs returned {resp.Total} Nfts");
NativeBalance bal = await MoralisSolanaClient.SolanaApi.Account.Balance(NetworkTypes.mainnet, "6XU36wCxWobLx5Rtsb58kmgAJKVYmMVqy4SHXxENAyAe");
List<SplNft> bal = await MoralisSolanaClient.SolanaApi.Account.GetNFTs(NetworkTypes.mainnet, "6XU36wCxWobLx5Rtsb58kmgAJKVYmMVqy4SHXxENAyAe");
Portfolio bal = await MoralisSolanaClient.SolanaApi.Account.GetPortfolio(NetworkTypes.mainnet, "6XU36wCxWobLx5Rtsb58kmgAJKVYmMVqy4SHXxENAyAe");
List<SplTokenBalanace> bal = await MoralisSolanaClient.SolanaApi.Account.GetSplTokens(NetworkTypes.mainnet, "6XU36wCxWobLx5Rtsb58kmgAJKVYmMVqy4SHXxENAyAe");
NftMetadata bal = await MoralisSolanaClient.SolanaApi.Nft.GetNFTMetadata(NetworkTypes.mainnet, "6XU36wCxWobLx5Rtsb58kmgAJKVYmMVqy4SHXxENAyAe");
- Unity3d Assets The best place to find Unity3d Assets for a range of budgets.
- The Gimp Open source image editing tool
- Blender Open source tool for creating 3D models, animations, textures, and everything else you need for game characters and objects.
- Maximo Free to use (with registration) Animations for humanoid rigged models.