Ethereum Unity3D Boilerplate Questions

In this case, those are read only functions (not transactions), so you will get the value directly. You can use runContractFunction.

1 Like

In which directive/namespace is the RunContractFunction ? Because I canā€™t use it or canā€™t read the method. I am using Web3 Game Kit Package v1.2.7 and Unity 2021.3.5 .

You can see a full example here (Unity tab).

1 Like

Please help.

Hi @dgoodrich & @0xprof,
We are making WebGL game with Moralis and Metamask using Unity. Everything working fine from login to call contract function.

But we want auto-login Metamask(without popup) if the user reopens the tab or refreshes Tab once the user login with Metamask. It is possible with WebGL Moralis 1.2.10?

thanks

Hi guys,
is there a way to authenticate 2 users on one Unity instance ?
I would like to have two qr codes popin on split screenā€¦ is it doable ?
Thanks!

This might be possible if you duplicate all the components, though you may run into issues with socket connections from wallet connect.

I was wondering if anyone knows of a Unity implementation for Unstoppable domains? We have been able to integrate web3auth using their SDK, but Unstoppable doesnā€™t seem to have a Unity SDK.

How do you want to implement Unstoppable Domains?

Initially we would like to have Unstoppable as an authentication method. Currently we use the built-in wallet connect and our own integration with web3auth.

It can maybe done directly if they have an API. Would be best to contact them if they offer a solution.

I am in contact and waiting for response. I thought someone might have already tackled the implementation and have a solution or general steps.

On a side-note if anyone needs guidance on web3auth implementation with Moralis Unity let me know and I can provide assistance :slight_smile:

If you could make a new topic on using the Web3Auth SDK, that would be great. Some other users have asked about that.

Iā€™m having problems with the self hosted parse server. Iā€™ve installed the following onto my server as follows via ssh:

yarn add parse-server --ignore-engines
yarn dev:db-start
yarn start
cd /var/www/html/DnA/parse-server-migration
yarn build
yarn start
yarn dev:db-start
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo systemctl start mongod
yarn add parse-dashboard --ignore-engines
yarn add moralis --ignore-engines

Then When I start this happens:

yarn start -- --appId *********************************** --masterKey ************************************ --serverURL https://127.0.0.1:1337/server

yarn run v1.22.19
warning From Yarn 1.0 onwards, scripts don't require "--" for options to be forwarded. In a future version, any explicit "--" will be forwarded as-is to the scripts.
$ node build/index.js --appId pRLSWTZ8RUMngGVmgWmI8IzaUXFgUsX8Z1wZ6leJ --masterKey iDIgWXWAXK49KOIuKexjmwQzofjYyUeEj33s72K5we7GpNCDeUKNakNfCbgkDEqO --serverURL https://127.0.0.1:1337/server
bigint: Failed to load bindings, pure JS will be used (try npm run rebuild?)
warn: DeprecationWarning: The Parse Server option 'directAccess' default will change to 'true' in a future version. Additionally, the environment variable 'PARSE_SERVER_ENABLE_EXPERIMENTAL_DIRECT_ACCESS' will be deprecated and renamed to 'PARSE_SERVER_DIRECT_ACCESS' in a future version; it is currently possible to use either one.
warn: DeprecationWarning: The Parse Server option 'enforcePrivateUsers' default will change to 'true' in a future version.
warn: DeprecationWarning: The Parse Server option 'allowClientClassCreation' default will change to 'false' in a future version.
info: Parse LiveQuery Server started running
Moralis Server is running on port 1337 and stream webhook url https://d59f-167-71-97-138.ngrok.io/streams-webhook
MongoServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
    at Timeout._onTimeout (/var/www/html/DnA/parse-server-migration/node_modules/mongodb/lib/sdam/topology.js:291:38)
    at listOnTimeout (node:internal/timers:564:17)
    at process.processTimers (node:internal/timers:507:7) {
  reason: TopologyDescription {
    type: 'Unknown',
    servers: Map(1) { 'localhost:27017' => [ServerDescription] },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: null,
    maxElectionId: null,
    maxSetVersion: null,
    commonWireVersion: 0,
    logicalSessionTimeoutMinutes: null
  },
  code: undefined,
  [Symbol(errorLabels)]: Set(0) {}
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

My Unity code that Iā€™m running with MoralisWeb3ApiSdk (the old-school one yes), AppManager.cs contains only the slight changes you guys said to make:

 public async void WalletConnectHandler(WCSessionData data)
    {
        Debug.Log("Wallet connection received");
        // Extract wallet address from the Wallet Connect Session data object.
        address = data.accounts[0].ToLower();
        string appId = MoralisInterface.GetClient().ApplicationId;
        long serverTime = 0;

        // Retrieve server time from Moralis Server for message signature
        Dictionary<string, object> serverTimeResponse = await MoralisInterface.GetClient().Cloud.RunAsync<Dictionary<string, object>>("getServerTime", new Dictionary<string, object>());

        //if (serverTimeResponse == null || !serverTimeResponse.ContainsKey("dateTime") ||
        //    !long.TryParse(serverTimeResponse["dateTime"].ToString(), out serverTime))
        //{
        //    Debug.Log("Failed to retrieve server time from Moralis Server!");
        //}

if (serverTimeResponse != null)
{
    Debug.LogError("Failed to retrieve server time from Moralis Server!");
}



        if (!MoralisInterface.IsLoggedIn())
        {
            Debug.Log($"Sending sign request for {address} ...");


IDictionary<string, object> requestMessageParams = new Dictionary<string, object>();

requestMessageParams.Add("address", address);
requestMessageParams.Add("chain", "Eth");
requestMessageParams.Add("network", "evm");

Dictionary<string, object> authMessage = await MoralisInterface.GetClient().Cloud.RunAsync<Dictionary<string, object>>("requestMessage", requestMessageParams);

string signMessage = authMessage["message"].ToString();


            //string signMessage = $"Moralis Authentication\n\nId: {appId}:{serverTime}";
            string response = await walletConnect.Session.EthPersonalSign(address, signMessage);
        
            Debug.Log(response);

            Debug.Log($"Signature {response} for {address} was returned.");

            // Create moralis auth data from message signing response.
            Dictionary<string, object> authData = new Dictionary<string, object> { { "id", address }, { "signature", response }, { "data", signMessage } }; 

            Debug.Log("Logging in user.");

            // Attempt to login user.
            var user = await MoralisInterface.LogInAsync(authData);

            if (user != null)
            {
                Debug.Log($"{address} logged in successfully. ");
                infoLabel.text = $"{address}\nlogged in successfully!";
            }
            else
            {
                Debug.Log("User login failed.");
                infoLabel.text = "Login failed";
            }
        }

        UserLoggedInHandler();
    }

    public void WalletConnectSessionEstablished(WalletConnectUnitySession session)
    {
        InitializeWeb3();
    }
    
    private void InitializeWeb3()
    {
        MoralisInterface.SetupWeb3();
    }
    
    #endregion

Even with those above changes I donā€™t see how the null value is dealt with but hopefully you can enlighten me.

And Iā€™ll include Screenshots of the WebGL running online, dev build along with errors:


Now, Iā€™m REALLY hoping someone can help me, as Iā€™ve really put A LOT of time into this, and the way the Crypto world is going, Iā€™m about ready to jump out a window (or just drop everything and opt for Facebook/Meta login for everything :frowning: ) But yeah seriously, PLEASE HELP!!!
I am able to scan the QR, my wallet sees and signs it (metamask), the browser recognizes this and says ā€œPlease Signā€¦ā€ so itā€™s NEARLY THERE!!! But then, crash, Cross-Origin blah blah Errorā€¦
Dave Cote

Does your Unity project (with WebGL) work with your self-hosted server locally?

I donā€™t know, my local machine is windows, Iā€™m running it on my server, which is Ubuntu 20.04. It ran fine on moralis server before they retired them. Seeing it run locally on windows wouldnā€™t tell me much would it?

Basically it seems to start the sign in, then when getting a signature returned it complains about Cors Cross-Origin error and Key not found exception. What does that mean? Do I need my moralis key in some files on the server?

Itā€™s to make sure thereā€™s no immediate issues with your code and how you patched it to work with self-hosted servers. Then we can work from there instead of making assumptions.

Okay, but I posted all code, server commands and errors. Does anything stand out?

Could be a configuration issue with your server. You are also getting Mongo errors that donā€™t seem related to the use of Unity.

Please test first with your self-hosted server as normal.