# Metamask Unity SDK

​ The MetaMask SDK for Unity. ​

# How it works

​ As a developer you can import the MetaMask SDK into your Unity game to enable users to easily connect with their MetaMask Mobile wallet, The supported platforms are macOS, Windows, Linux, IOS, Android & WebGL ​ The SDK renders a QR code in the UI via a dedicated prefab which players can scan with their MetaMask Mobile app, we also support deep-linking on mobile platforms. Now you can use all the ethereum methods available right from your game which you can learn more about in the above link. ​

# Getting started

​ This is a quick video tutorial explaining how to install and use MetaMask Unity SDK

# 1. Install

​ To install the module, you first have to download the package from here: Unity SDK Package (opens new window). ​ Now, you need to import it via the Package Manager. To do that, go to the Window menu > Package Manager. Select "My Assets" then select the "MetaMask Unity SDK" and click "Install", You should see the MetaMask SDK package now listed in the project packages and be able to interface with it and its examples in the scene. ​

# Prerequisites

  • TextMesh Pro(If you do not have TMP installed you will be prompted to install it by the unity editor automatically, N.B* If you choose this path text will not appear until your first repaint) ​

# 2. Initialization

​ The main class you will be interfacing with is called MetaMaskWallet it handles the connection to the users wallet as well as processing the requests to it via a socket.io implementation, in order to use it inside Unity, you must attach the component called MetaMaskUnity to a gameobject within the editor, this component is a singleton and you can use its Instance property to access the Wallet instance, but before doing any of those, you need to initialize it either manually by calling Initialize();: ​

MetaMaskUnity.Instance.Initialize();

​ Or just making sure that Initialize On Start is checked on the component within the editor, and then this will let you to enable you to make calls to the users wallet using ethereum methods available as you would expect in a traditional development environment. ​ This will initialize the Wallet instance and then it becomes accessible from MetaMaskUnity.Instance.Wallet. ​

# 3. Connection

​ Once the wallet is now prepared and initialized, now you need to connect to the MetaMask app, all you need to do is to call the Connect method on the wallet instance like so: ​

var wallet = MetaMaskUnity.Instance.Wallet;
wallet.Connect();

​ Then you can also subscribe to the OnWalletConnected callback on the wallet instance to be notified once the wallet is connected: ​

wallet.WalletConnected += OnWalletConnected;void OnWalletConnected(object sender, EventArgs e) {
    Debug.Log("Wallet is connected");
}

​ You can also use the Connect method from MetaMaskUnity that just delegates the call to the Wallet instance: ​

MetaMaskUnity.Instance.Connect();

​ There are a variety of sample buttons included inside the package that you can use that call this method when clicked, these are provided as a convenience to you to get a kickstart with your project. ​ Once the connection request is made, a QR code will be generated, and based on the transport you're using, which is Unity UI by default, either spawns a new Canvas that contains the QR code or the MetaMaskUnityUIQRImage generates the QR code when the connection is requested, so if you want to use the latter, make sure to add an instance of the MetaMaskUnityUIQRImage component to the scene with its fields provided, the transport field is required too if you want to use it isolated from the canvas that is spawned by the transport, then it'll generate the QR code for you. ​

# 4. Usage

​ Now you can make requests to the wallet once it is authorized, you'll notice that when the buttons become interactable or the WalletAuthorized event is fired: ​

var wallet = MetaMaskUnity.Instance.Wallet;
wallet.WalletAuthorized += OnWalletAuthorized;void OnWalletAuthorized(object sender, EventArgs e) {
    Deebug.Log("Wallet is authorized");
}

​ You can now call any Ethereum request on the wallet by calling wallet.Request(myRequest);, here is a sample transaction request: ​

var wallet = MetaMaskUnity.Instance.Wallet;
var transactionParams = new MetaMaskTranscation
{
    To = "0xd0059fB234f15dFA9371a7B45c09d451a2dd2B5a",
    From = MetaMaskUnity.Instance.Wallet.SelectedAddress,
    Value = "0x0"
};var request = new MetaMaskEthereumRequest
{
    Method = "eth_sendTransaction",
    Parameters = new MetaMaskTranscation[] { transactionParams }
};
await wallet.Request(request);

# 5. Config

​ You can customize the default configuration or creating your own config: ​

# Edit Default Config

​ To edit the default config you can do so by either opening the setup window through the Window > MetaMask > Setup menu item, or by opening the MetaMaskConfig asset in the project window, then you can edit the fields and save the changes. ​

# Create New Config

​ To create a new config, simply right-click on the project window and go to MetaMask > Config menu to create a new config, give it a name and then use it when initializing the MetaMaskUnity instance. ​

# API

​ Here is a quick overview of the APIs from the most important classes. ​

# MetaMaskUnity

​ This is a singleton class that you can use to access the MetaMaskWallet instance which is specific to Unity. ​

# Instance

​ This is the singleton instance of the MetaMaskUnity class that is lazy-loaded when you access it for the first time. ​

# Initialize

​ This method initializes the MetaMaskWallet instance and makes it accessible via the Wallet property. ​ You can also pass extra options and parameters to it to customize the wallet instance: ​

// Initialize using default settings
MetaMaskUnity.Instance.Initialize();// Initialize using custom transport and socket provider
var transport = new MyCustomTransport();
var socketProvider = new MyCustomSocketProvider();
MetaMaskUnity.Instance.Initialize(transport, socketProvider);// Initialize using custom config, transport and socket provider
var config = myMetaMaskConfig;
var transport = new MyCustomTransport();
var socketProvider = new MyCustomSocketProvider();
MetaMaskUnity.Instance.Initialize(config, transport, socketProvider);

# SaveSession

​ This method saves the current session to the persistent storage, this is useful when you want to save the session and restore it later on, this is automatically called when the application quits, but you can manually call it too. ​

# LoadSession

​ This method loads the session from the persistent storage, this is useful when you want to restore the session after the application quits, this is automatically called when the application starts, but you can manually call it too. ​

# MetaMaskWallet

# Connect

​ This method connects to the MetaMask app, it will render a generated QRCode in the UI for your users to scan with the MetaMask Mobile app. After the user scan this QR code, a connect screen will appear in MetaMask Mobile where the user can now approve the connection with your game application. ​

# Disconnect

​ This method disconnects the user that is connected from the MetaMask app session. ​

# Request

​ This method is used to send a request to the MetaMask app, you can use it to call any ethereum method listed on the the Ethereum Provider API. ​

# Package Structure

  • Documentation: contains the documentation and link to online documentation
  • Editor: contains the editor-only code such as Setup GUI windows, data persistence for SDK settings.
  • Plugins: contains the plugins needed by the package. In particular the ECIES Platform runtime libraries as well as the core SDK Codebase.
  • Runtime: contains the main scripts for the SDK that are environment agnostic, so they work fine in .NET, The Runtime folder contains the C# scripts that you need to import or use in your script for your project, they provide the base implementation of the SDK, you can create your own implementation of Unity components on top of these without ever toching the premade Unity component to have total control.
  • Samples: contains a test application scene that can be used as a referral for your project including modal popups and dynamic UI scaling.
  • LICENSE.md: the package license
  • Third Party Notices.md: third party notices ​

# License

​ Check the LICENSE file for more information.