-
Notifications
You must be signed in to change notification settings - Fork 245
Expand file tree
/
Copy pathHyperPlayWebGLProvider.cs
More file actions
99 lines (84 loc) · 4.03 KB
/
HyperPlayWebGLProvider.cs
File metadata and controls
99 lines (84 loc) · 4.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#if UNITY_WEBGL && !UNITY_EDITOR
using System.Threading.Tasks;
using ChainSafe.Gaming.Evm;
using ChainSafe.Gaming.LocalStorage;
using ChainSafe.Gaming.Unity.EthereumWindow;
using ChainSafe.Gaming.Web3;
using ChainSafe.Gaming.Web3.Core.Operations;
using ChainSafe.Gaming.Web3.Environment;
using UnityEngine;
using Object = UnityEngine.Object;
namespace ChainSafe.Gaming.HyperPlay
{
/// <summary>
/// Concrete implementation of <see cref="HyperPlayProvider"/> for side-loaded browser games on HyperPlay desktop client.
/// </summary>
public class HyperPlayWebGLProvider : HyperPlayProvider
{
private readonly IHyperPlayConfig _config;
private readonly IHyperPlayData _data;
private readonly ILocalStorage _localStorage;
private readonly IChainConfig _chainConfig;
private readonly ChainRegistryProvider _chainRegistryProvider;
private readonly EthereumWindowController _ethereumController;
/// <summary>
/// Initializes a new instance of the <see cref="HyperPlayWebGLProvider"/> class.
/// </summary>
/// <param name="config">Injected <see cref="IHyperPlayConfig"/>.</param>
/// <param name="data">Injected <see cref="IHyperPlayData"/>.</param>
/// <param name="localStorage">Injected <see cref="ILocalStorage"/>.</param>
/// <param name="environment">Injected <see cref="Web3Environment"/>.</param>
/// <param name="chainConfig">ChainConfig to fetch chain data.</param>
/// <param name="chainRegistryProvider">Injected <see cref="ChainRegistryProvider"/>.</param>
/// <param name="tracker">Injected <see cref="IOperationTracker"/>.</param>
public HyperPlayWebGLProvider(IHyperPlayConfig config, IHyperPlayData data, ILocalStorage localStorage, Web3Environment environment, IChainConfig chainConfig, ChainRegistryProvider chainRegistryProvider, IOperationTracker tracker) : base(config, data, localStorage, environment, chainConfig, tracker)
{
_config = config;
_data = data;
_localStorage = localStorage;
_chainConfig = chainConfig;
_chainRegistryProvider = chainRegistryProvider;
// Initialize Unity controller.
_ethereumController = Object.FindObjectOfType<EthereumWindowController>();
if (_ethereumController == null)
{
GameObject controllerObj = new GameObject(nameof(EthereumWindowController), typeof(EthereumWindowController));
_ethereumController = controllerObj.GetComponent<EthereumWindowController>();
}
Object.DontDestroyOnLoad(_ethereumController.gameObject);
}
/// <summary>
/// Connect to wallet from a side-loaded browser game via HyperPlay desktop client and return the account address.
/// </summary>
/// <returns>Signed in account public address.</returns>
public override async Task<string> Connect()
{
string account = await _ethereumController.Connect(_chainConfig, _chainRegistryProvider);
// Saved account exists.
if (_data.RememberSession)
{
return account;
}
if (_config.RememberSession)
{
_data.RememberSession = true;
_data.SavedAccount = account;
await _localStorage.Save(_data);
}
return account;
}
/// <summary>
/// Make RPC request on HyperPlay desktop client.
/// </summary>
/// <param name="method">RPC request method name.</param>
/// <param name="parameters">RPC request parameters.</param>
/// <typeparam name="T">RPC request response type.</typeparam>
/// <returns>RPC request Response.</returns>
public override async Task<T> Request<T>(string method, params object[] parameters)
{
var response = await _ethereumController.Request(method, parameters);
return response.Result.ToObject<T>();
}
}
}
#endif