Skip to content

Commit be833c8

Browse files
authored
Merge pull request #4 from WalletConnect/feat/webgl
feat: WebGL
2 parents 618ff15 + cf6ea35 commit be833c8

67 files changed

Lines changed: 2106 additions & 315 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Packages/com.walletconnect.web3modal/Plugins.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
mergeInto(LibraryManager.library, {
2+
// Global variable to store the loaded modules and configuration
3+
_web3ModalConfig: null,
4+
5+
$SerializeJson: function (obj){
6+
let cache = [];
7+
let resultJson = JSON.stringify(obj, (key, value) => {
8+
// Handle circular references
9+
if (typeof value === 'object' && value !== null) {
10+
if (cache.includes(value)) return;
11+
cache.push(value);
12+
}
13+
// Check if the value is a BigInt and convert it to a string
14+
if (typeof value === 'bigint') {
15+
return value.toString();
16+
}
17+
return value;
18+
});
19+
cache = null;
20+
return resultJson;
21+
},
22+
23+
$ExecuteCall__deps: ['$SerializeJson'],
24+
$ExecuteCall: async function (callFn, id, methodNameStrPtr, parameterStrPtr, callbackPtr) {
25+
if (!_web3ModalConfig) {
26+
console.error("Web3Modal is not initialized. Call Initialize first.");
27+
return;
28+
}
29+
30+
// Convert the method name and parameter to JS strings
31+
let methodName = UTF8ToString(methodNameStrPtr);
32+
let parameterStr = UTF8ToString(parameterStrPtr);
33+
34+
let parameterObj = parameterStr === "" ? undefined : JSON.parse(parameterStr);
35+
36+
try {
37+
// Call the method using the provided function
38+
let result = await callFn(_web3ModalConfig, methodName, parameterObj);
39+
40+
if (!result) {
41+
{{{makeDynCall('viii', 'callbackPtr')}}} (id, undefined, undefined);
42+
return;
43+
}
44+
45+
let resultJson = SerializeJson(result);
46+
47+
// Call the callback with the result
48+
let resultStrPtr = stringToNewUTF8(resultJson);
49+
{{{makeDynCall('viii', 'callbackPtr')}}} (id, resultStrPtr, undefined);
50+
_free(resultStrPtr);
51+
} catch (error) {
52+
console.error("[Web3Modal] Error executing call", error);
53+
let errorJson = JSON.stringify(error, ['name', 'message']);
54+
let errorStrPtr = stringToNewUTF8(errorJson);
55+
{{{makeDynCall('viii', 'callbackPtr')}}} (id, undefined, errorStrPtr);
56+
_free(errorStrPtr);
57+
}
58+
},
59+
60+
// Preload the scripts from CDN, initialize the configuration and create the modal
61+
Initialize: function (parametersJsonPtr, callbackPtr) {
62+
const parametersJson = UTF8ToString(parametersJsonPtr);
63+
const parameters = JSON.parse(parametersJson);
64+
65+
const projectId = parameters.projectId;
66+
const metadata = parameters.metadata;
67+
const chains = parameters.chains;
68+
69+
const enableOnramp = parameters.enableOnramp;
70+
71+
// Load the scripts and initialize the configuration
72+
import("https://cdn.jsdelivr.net/npm/@web3modal/cdn@5.0.1/dist/wagmi.js").then(CDNW3M => {
73+
const { WagmiCore, Chains, Web3modal, Connectors } = CDNW3M;
74+
const { createWeb3Modal } = Web3modal;
75+
const { coinbaseWallet, walletConnect, injected } = Connectors;
76+
const { createConfig, http, reconnect } = WagmiCore;
77+
78+
const chainsMap = chains.map(chainName => Chains[chainName]);
79+
80+
const config = createConfig({
81+
chains: chainsMap,
82+
transports: chains.reduce((acc, chainName) => {
83+
acc[Chains[chainName].id] = http();
84+
return acc;
85+
}, {}),
86+
connectors: [
87+
walletConnect({ projectId, metadata, showQrModal: false }),
88+
injected({ shimDisconnect: true }),
89+
coinbaseWallet({
90+
appName: metadata.name,
91+
appLogoUrl: metadata.icons[0]
92+
})
93+
]
94+
});
95+
96+
reconnect(config);
97+
98+
const modal = createWeb3Modal({
99+
wagmiConfig: config,
100+
projectId,
101+
enableOnramp: enableOnramp,
102+
disableAppend: true,
103+
});
104+
105+
// Store the configuration and modal globally
106+
_web3ModalConfig = {
107+
config: config,
108+
modal: modal,
109+
wagmiCore: WagmiCore
110+
};
111+
112+
113+
// Insert the container into the DOM at the canvas's original position
114+
const canvas = document.getElementsByTagName('canvas')[0];
115+
const container = document.createElement('div');
116+
container.id = 'canvas-container';
117+
canvas.parentNode.insertBefore(container, canvas);
118+
container.appendChild(canvas);
119+
120+
const web3modal = document.createElement('w3m-modal')
121+
container.appendChild(web3modal)
122+
123+
124+
// Add styles to enable fullscreen compatibility
125+
const addCanvasActiveStyles = () => {
126+
const styleElement = document.createElement('style');
127+
styleElement.id = 'canvas-active-styles';
128+
styleElement.innerHTML = `
129+
.canvas-active {
130+
position: fixed !important;
131+
top: 0 !important;
132+
right: 0 !important;
133+
bottom: 0 !important;
134+
left: 0 !important;
135+
width: 100% !important;
136+
height: 100% !important;
137+
}
138+
`;
139+
document.head.appendChild(styleElement);
140+
};
141+
142+
const removeCanvasActiveStyles = () => {
143+
const styleElement = document.getElementById('canvas-active-styles');
144+
if (styleElement) {
145+
document.head.removeChild(styleElement);
146+
}
147+
};
148+
149+
// Handle fullscreen changes
150+
container?.addEventListener('fullscreenchange', () => {
151+
const canvas = document.querySelector('canvas');
152+
if (document.fullscreenElement) {
153+
if (!canvas?.classList.contains('canvas-active')) {
154+
addCanvasActiveStyles();
155+
canvas?.classList.add('canvas-active');
156+
}
157+
} else {
158+
if (canvas?.classList.contains('canvas-active')) {
159+
canvas?.classList.remove('canvas-active');
160+
removeCanvasActiveStyles();
161+
}
162+
}
163+
});
164+
165+
{{{makeDynCall('v', 'callbackPtr')}}}();
166+
});
167+
},
168+
169+
ModalCall__deps: ['$ExecuteCall'],
170+
ModalCall: async function (id, methodNameStrPtr, parameterStrPtr, callbackPtr) {
171+
const callFn = async (web3modalConfig, methodName, parameterObj) => {
172+
return await web3modalConfig.modal[methodName](parameterObj);
173+
};
174+
await ExecuteCall(callFn, id, methodNameStrPtr, parameterStrPtr, callbackPtr);
175+
},
176+
177+
WagmiCall__deps: ['$ExecuteCall'],
178+
WagmiCall: async function(id, methodNameStrPtr, parameterStrPtr, callbackPtr) {
179+
const callFn = async (web3modalConfig, methodName, parameterObj) => {
180+
return await web3modalConfig.wagmiCore[methodName](web3modalConfig.config, parameterObj);
181+
};
182+
await ExecuteCall(callFn, id, methodNameStrPtr, parameterStrPtr, callbackPtr);
183+
},
184+
185+
WagmiWatchAccount__deps: ['$SerializeJson'],
186+
WagmiWatchAccount: function(callbackPtr) {
187+
_web3ModalConfig.wagmiCore.watchAccount(_web3ModalConfig.config, {
188+
onChange(data) {
189+
const dataStr = stringToNewUTF8(SerializeJson(data));
190+
{{{makeDynCall('vi', 'callbackPtr')}}}(dataStr);
191+
_free(dataStr);
192+
}
193+
});
194+
},
195+
196+
WagmiWatchChainId__deps: ['$SerializeJson'],
197+
WagmiWatchChainId: function(callbackPtr) {
198+
_web3ModalConfig.wagmiCore.watchChainId(_web3ModalConfig.config, {
199+
onChange(data) {
200+
{{{makeDynCall('vi', 'callbackPtr')}}}(data);
201+
_free(dataStr);
202+
}
203+
});
204+
},
205+
206+
ModalSubscribeState__deps: ['$SerializeJson'],
207+
ModalSubscribeState: function(callbackPtr) {
208+
_web3ModalConfig.modal.subscribeState(newState => {
209+
const newStateStr = stringToNewUTF8(SerializeJson(newState));
210+
{{{makeDynCall('vi', 'callbackPtr')}}}(newStateStr);
211+
_free(newStateStr);
212+
});
213+
},
214+
});

Packages/com.walletconnect.web3modal/Plugins/Web3Modal.jslib.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Packages/com.walletconnect.web3modal/Prefabs/Web3Modal.prefab

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ GameObject:
9494
m_Component:
9595
- component: {fileID: 5548460347198765618}
9696
- component: {fileID: 3737159026218804949}
97-
- component: {fileID: 5736833439907544757}
9897
m_Layer: 0
9998
m_Name: Modal
10099
m_TagString: Untagged
@@ -133,19 +132,6 @@ MonoBehaviour:
133132
m_ParentUI: {fileID: 0}
134133
sourceAsset: {fileID: 9197481963319205126, guid: 320d7a8e8a0f4883b0cd6759a8328cd1, type: 3}
135134
m_SortingOrder: 100
136-
--- !u!114 &5736833439907544757
137-
MonoBehaviour:
138-
m_ObjectHideFlags: 0
139-
m_CorrespondingSourceObject: {fileID: 0}
140-
m_PrefabInstance: {fileID: 0}
141-
m_PrefabAsset: {fileID: 0}
142-
m_GameObject: {fileID: 5904779526130413779}
143-
m_Enabled: 1
144-
m_EditorHideFlags: 0
145-
m_Script: {fileID: 11500000, guid: 03fcc67b7a5c45d4a2029b01d4331b82, type: 3}
146-
m_Name:
147-
m_EditorClassIdentifier:
148-
<UIDocument>k__BackingField: {fileID: 3737159026218804949}
149135
--- !u!1 &6019781919744940759
150136
GameObject:
151137
m_ObjectHideFlags: 0

Packages/com.walletconnect.web3modal/Resources/Fonts & Materials/Inter/Inter-Bold SDF.asset

Lines changed: 31 additions & 4 deletions
Large diffs are not rendered by default.

Packages/com.walletconnect.web3modal/Runtime/Connectors/Connector.cs

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Threading.Tasks;
4+
using UnityEngine;
45
using WalletConnectUnity.Core;
56

67
namespace WalletConnect.Web3Modal
@@ -28,12 +29,12 @@ protected Connector()
2829
{
2930
}
3031

31-
public async Task InitializeAsync(IEnumerable<Chain> supportedChains)
32+
public async Task InitializeAsync(Web3ModalConfig config)
3233
{
3334
if (IsInitialized)
3435
throw new Exception("Already initialized"); // TODO: use custom ex type
3536

36-
await InitializeAsyncCore(supportedChains);
37+
await InitializeAsyncCore(config);
3738
IsInitialized = true;
3839
}
3940

@@ -50,18 +51,21 @@ public async Task<bool> TryResumeSessionAsync()
5051
if (isResumed)
5152
{
5253
IsAccountConnected = true;
53-
OnAccountConnected(new AccountConnectedEventArgs(GetAccount, GetAccounts));
54+
OnAccountConnected(new AccountConnectedEventArgs(GetAccountAsync, GetAccounts));
5455
}
5556

5657
return isResumed;
5758
}
5859

5960
public ConnectionProposal Connect()
6061
{
62+
Debug.Log("Connector.Connect");
6163
if (!IsInitialized)
6264
throw new Exception("Connector not initialized"); // TODO: use custom ex type
6365

6466
var connection = ConnectCore();
67+
68+
Debug.Log("Got connection");
6569
connection.Connected += ConnectionConnectedHandler;
6670

6771
_connectionProposals.Add(connection);
@@ -85,15 +89,15 @@ public async Task ChangeActiveChainAsync(Chain chain)
8589
await ChangeActiveChainAsyncCore(chain);
8690
}
8791

88-
public Account GetAccount()
92+
public Task<Account> GetAccountAsync()
8993
{
9094
if (!IsAccountConnected)
9195
throw new Exception("No account connected"); // TODO: use custom ex type
9296

93-
return GetAccountCore();
97+
return GetAccountAsyncCore();
9498
}
9599

96-
public Account[] GetAccounts()
100+
public Task<Account[]> GetAccounts()
97101
{
98102
if (!IsAccountConnected)
99103
throw new Exception("No account connected"); // TODO: use custom ex type
@@ -103,11 +107,13 @@ public Account[] GetAccounts()
103107

104108
protected virtual void ConnectionConnectedHandler(ConnectionProposal connectionProposal)
105109
{
110+
Debug.Log("Connector. ConnectionConnectedHandler");
106111
foreach (var c in _connectionProposals)
107112
c.Dispose();
108113

109114
_connectionProposals.Clear();
110-
OnAccountConnected(new AccountConnectedEventArgs(GetAccount, GetAccounts));
115+
Debug.Log("Connector calls OnAccountConnected");
116+
OnAccountConnected(new AccountConnectedEventArgs(GetAccountAsync, GetAccounts));
111117
}
112118

113119
protected virtual void OnAccountConnected(AccountConnectedEventArgs e)
@@ -130,26 +136,26 @@ protected virtual void OnChainChanged(ChainChangedEventArgs e)
130136
ChainChanged?.Invoke(this, e);
131137
}
132138

133-
protected abstract ConnectionProposal ConnectCore();
139+
protected abstract Task InitializeAsyncCore( Web3ModalConfig config);
134140

135-
protected abstract Task InitializeAsyncCore(IEnumerable<Chain> supportedChains);
141+
protected abstract ConnectionProposal ConnectCore();
136142

137143
protected abstract Task<bool> TryResumeSessionAsyncCore();
138144

139145
protected abstract Task DisconnectAsyncCore();
140146

141147
protected abstract Task ChangeActiveChainAsyncCore(Chain chain);
142148

143-
protected abstract Account GetAccountCore();
149+
protected abstract Task<Account> GetAccountAsyncCore();
144150

145-
protected abstract Account[] GetAccountsCore();
151+
protected abstract Task<Account[]> GetAccountsCore();
146152

147153
public class AccountConnectedEventArgs : EventArgs
148154
{
149-
public Func<Account> GetAccount { get; }
150-
public Func<Account[]> GetAccounts { get; }
155+
public Func<Task<Account>> GetAccount { get; }
156+
public Func<Task<Account[]>> GetAccounts { get; }
151157

152-
public AccountConnectedEventArgs(Func<Account> getAccount, Func<Account[]> getAccounts)
158+
public AccountConnectedEventArgs(Func<Task<Account>> getAccount, Func<Task<Account[]>> getAccounts)
153159
{
154160
GetAccount = getAccount;
155161
GetAccounts = getAccounts;
@@ -185,6 +191,7 @@ public ChainChangedEventArgs(string chainId)
185191
public enum ConnectorType
186192
{
187193
None,
188-
WalletConnect
194+
WalletConnect,
195+
WebGl
189196
}
190197
}

0 commit comments

Comments
 (0)