Skip to content

Commit cb4a0aa

Browse files
authored
Set rpc cluster name as global window variable for walletAdapterLib (#202)
* Set rpc cluster name as global window variable for walletAdapterLib * refreshWalletAdapters fixes cluster changes for SolanaMobileWallet adapter
1 parent 47f0c58 commit cb4a0aa

File tree

2 files changed

+169
-131
lines changed

2 files changed

+169
-131
lines changed
Lines changed: 162 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,130 +1,164 @@
11
mergeInto(LibraryManager.library, {
2-
InitWalletAdapter: async function (callback) {
3-
const isXnft = Boolean("xnft" in window && window.xnft != undefined && window.xnft.solana != undefined && window.xnft.solana.publicKey != undefined);
4-
// Add UnityWalletAdapter from CDN
5-
if(window.walletAdapterLib == undefined){
6-
console.log("Adding WalletAdapterLib")
7-
var script = document.createElement("script");
8-
script.src = "https://cdn.jsdelivr.net/gh/magicblock-labs/unity-js-wallet-adapter@main/dist/wallet-adapter-lib.js";
9-
document.head.appendChild(script);
10-
script.onload = function() {
11-
console.log("WalletAdapterLib loaded");
12-
Module.dynCall_vi(callback, isXnft);
13-
};
14-
}else{
15-
Module.dynCall_vi(callback, isXnft);
2+
InitWalletAdapter: async function (callback, rpcClusterPtr) {
3+
const isXnft = Boolean(
4+
"xnft" in window &&
5+
window.xnft != undefined &&
6+
window.xnft.solana != undefined &&
7+
window.xnft.solana.publicKey != undefined
8+
);
9+
window.rpcCluster = UTF8ToString(rpcClusterPtr);
10+
// Add UnityWalletAdapter from CDN
11+
if (window.walletAdapterLib == undefined) {
12+
var script = document.createElement("script");
13+
script.src =
14+
"https://cdn.jsdelivr.net/gh/magicblock-labs/[email protected]/dist/wallet-adapter-lib.js";
15+
document.head.appendChild(script);
16+
script.onload = function () {
17+
Module.dynCall_vi(callback, isXnft);
18+
};
19+
} else {
20+
window.walletAdapterLib.refreshWalletAdapters();
21+
Module.dynCall_vi(callback, isXnft);
22+
}
23+
},
24+
ExternGetWallets: async function (callback) {
25+
try {
26+
const wallets = await window.walletAdapterLib.getWallets();
27+
var bufferSize = lengthBytesUTF8(wallets) + 1;
28+
var walletsPtr = _malloc(bufferSize);
29+
stringToUTF8(wallets, walletsPtr, bufferSize);
30+
Module.dynCall_vi(callback, walletsPtr);
31+
} catch (err) {
32+
console.error(err.message);
33+
Module.dynCall_vi(callback, null);
34+
}
35+
},
36+
ExternConnectWallet: async function (walletNamePtr, callback) {
37+
try {
38+
const walletName = UTF8ToString(walletNamePtr);
39+
var pubKey;
40+
if (walletName === "XNFT") {
41+
pubKey = window.xnft.solana.publicKey.toString();
42+
} else {
43+
pubKey = await window.walletAdapterLib.connectWallet(walletName);
44+
}
45+
if (pubKey == undefined) {
46+
throw new Error("Unable to connect to: " + walletName);
47+
}
48+
var bufferSize = lengthBytesUTF8(pubKey) + 1;
49+
var pubKeyPtr = _malloc(bufferSize);
50+
stringToUTF8(pubKey, pubKeyPtr, bufferSize);
51+
Module.dynCall_vi(callback, pubKeyPtr);
52+
} catch (err) {
53+
console.error(err.message);
54+
Module.dynCall_vi(callback, null);
55+
}
56+
},
57+
ExternSignTransactionWallet: async function (
58+
walletNamePtr,
59+
transactionPtr,
60+
callback
61+
) {
62+
try {
63+
const walletName = UTF8ToString(walletNamePtr);
64+
var base64transaction = UTF8ToString(transactionPtr);
65+
let signedTransaction;
66+
if (walletName === "XNFT") {
67+
const transaction =
68+
window.walletAdapterLib.getTransactionFromStr(base64transaction);
69+
signedTransaction = await window.xnft.solana.signTransaction(
70+
transaction
71+
);
72+
} else {
73+
signedTransaction = await window.walletAdapterLib.signTransaction(
74+
walletName,
75+
base64transaction
76+
);
77+
}
78+
let txStr = Buffer.from(signedTransaction.serialize()).toString("base64");
79+
var bufferSize = lengthBytesUTF8(txStr) + 1;
80+
var txPtr = _malloc(bufferSize);
81+
stringToUTF8(txStr, txPtr, bufferSize);
82+
Module.dynCall_vi(callback, txPtr);
83+
} catch (err) {
84+
console.error(err.message);
85+
Module.dynCall_vi(callback, null);
86+
}
87+
},
88+
ExternSignMessageWallet: async function (
89+
walletNamePtr,
90+
messagePtr,
91+
callback
92+
) {
93+
try {
94+
const walletName = UTF8ToString(walletNamePtr);
95+
var base64Message = UTF8ToString(messagePtr);
96+
let signatureStr;
97+
if (walletName === "XNFT") {
98+
const messageBytes = Uint8Array.from(atob(base64Message), (c) =>
99+
c.charCodeAt(0)
100+
);
101+
const signedMessage = await window.xnft.solana.signMessage(
102+
messageBytes
103+
);
104+
signatureStr = btoa(String.fromCharCode(...signedMessage));
105+
} else {
106+
var signature = await window.walletAdapterLib.signMessage(
107+
walletName,
108+
atob(base64Message)
109+
);
110+
signatureStr = signature.toString("base64");
111+
}
112+
var bufferSize = lengthBytesUTF8(signatureStr) + 1;
113+
var signaturePtr = _malloc(bufferSize);
114+
stringToUTF8(signatureStr, signaturePtr, bufferSize);
115+
Module.dynCall_vi(callback, signaturePtr);
116+
} catch (err) {
117+
console.error(err.message);
118+
Module.dynCall_vi(callback, null);
119+
}
120+
},
121+
ExternSignAllTransactionsWallet: async function (
122+
walletNamePtr,
123+
transactionsPtr,
124+
callback
125+
) {
126+
try {
127+
const walletName = UTF8ToString(walletNamePtr);
128+
var base64transactionsStr = UTF8ToString(transactionsPtr);
129+
var base64transactions = base64transactionsStr.split(",");
130+
let signedTransactions;
131+
if (walletName === "XNFT") {
132+
let transactions = [];
133+
for (var i = 0; i < base64transactions.length; i++) {
134+
const transaction = window.walletAdapterLib.getTransactionFromStr(
135+
base64transactions[i]
136+
);
137+
transactions.push(transaction);
16138
}
17-
},
18-
ExternGetWallets: async function(callback) {
19-
try {
20-
const wallets = await window.walletAdapterLib.getWallets();
21-
var bufferSize = lengthBytesUTF8(wallets) + 1;
22-
var walletsPtr = _malloc(bufferSize);
23-
stringToUTF8(wallets, walletsPtr, bufferSize);
24-
Module.dynCall_vi(callback, walletsPtr);
25-
} catch (err) {
26-
console.error(err.message);
27-
Module.dynCall_vi(callback, null);
28-
}
29-
},
30-
ExternConnectWallet: async function (walletNamePtr, callback) {
31-
try {
32-
const walletName = UTF8ToString(walletNamePtr)
33-
var pubKey;
34-
if(walletName === 'XNFT'){
35-
pubKey = window.xnft.solana.publicKey.toString();
36-
} else {
37-
pubKey = await window.walletAdapterLib.connectWallet(walletName);
38-
}
39-
if(pubKey == undefined){
40-
throw new Error('Unable to connect to: ' + walletName);
41-
}
42-
var bufferSize = lengthBytesUTF8(pubKey) + 1;
43-
var pubKeyPtr = _malloc(bufferSize);
44-
stringToUTF8(pubKey, pubKeyPtr, bufferSize);
45-
Module.dynCall_vi(callback, pubKeyPtr);
46-
} catch (err) {
47-
console.error(err.message);
48-
Module.dynCall_vi(callback, null);
49-
}
50-
},
51-
ExternSignTransactionWallet: async function (walletNamePtr, transactionPtr, callback) {
52-
try {
53-
const walletName = UTF8ToString(walletNamePtr)
54-
var base64transaction = UTF8ToString(transactionPtr)
55-
let signedTransaction;
56-
if(walletName === 'XNFT'){
57-
const transaction = window.walletAdapterLib.getTransactionFromStr(base64transaction);
58-
signedTransaction = await window.xnft.solana.signTransaction(transaction);
59-
} else {
60-
signedTransaction = await window.walletAdapterLib.signTransaction(walletName, base64transaction);
61-
}
62-
let txStr = Buffer.from(signedTransaction.serialize()).toString('base64');
63-
var bufferSize = lengthBytesUTF8(txStr) + 1;
64-
var txPtr = _malloc(bufferSize);
65-
stringToUTF8(txStr, txPtr, bufferSize);
66-
Module.dynCall_vi(callback, txPtr);
67-
} catch (err) {
68-
console.error(err.message);
69-
Module.dynCall_vi(callback, null);
70-
}
71-
},
72-
ExternSignMessageWallet: async function (walletNamePtr, messagePtr, callback) {
73-
try {
74-
const walletName = UTF8ToString(walletNamePtr)
75-
var base64Message = UTF8ToString(messagePtr)
76-
let signatureStr;
77-
if(walletName === 'XNFT'){
78-
const messageBytes = Uint8Array.from(atob(base64Message), (c) => c.charCodeAt(0));
79-
const signedMessage = await window.xnft.solana.signMessage(messageBytes);
80-
signatureStr = btoa(String.fromCharCode(...signedMessage));
81-
} else {
82-
var signature = await window.walletAdapterLib.signMessage(walletName, atob(base64Message));
83-
signatureStr = signature.toString('base64');
84-
}
85-
var bufferSize = lengthBytesUTF8(signatureStr) + 1;
86-
var signaturePtr = _malloc(bufferSize);
87-
stringToUTF8(signatureStr, signaturePtr, bufferSize);
88-
Module.dynCall_vi(callback, signaturePtr);
89-
} catch (err) {
90-
console.error(err.message);
91-
Module.dynCall_vi(callback, null);
92-
}
93-
},
94-
ExternSignAllTransactionsWallet: async function (walletNamePtr, transactionsPtr, callback) {
95-
try {
96-
const walletName = UTF8ToString(walletNamePtr)
97-
var base64transactionsStr = UTF8ToString(transactionsPtr)
98-
var base64transactions = base64transactionsStr.split(',');
99-
let signedTransactions;
100-
if(walletName === 'XNFT'){
101-
let transactions = [];
102-
for(var i = 0; i < base64transactions.length; i++){
103-
const transaction = window.walletAdapterLib.getTransactionFromStr(base64transactions[i]);
104-
transactions.push(transaction);
105-
}
106-
signedTransactions = await window.xnft.solana.signAllTransactions(transactions);
107-
} else {
108-
signedTransactions = await window.walletAdapterLib.signAllTransactions(walletName, base64transactions);
109-
}
110-
var serializedSignedTransactions = [];
111-
for (var i = 0; i < signedTransactions.length; i++) {
112-
var signedTransaction = signedTransactions[i];
113-
var txStr = signedTransaction.serialize().toString('base64');
114-
serializedSignedTransactions.push(txStr);
115-
}
116-
var txsStr = serializedSignedTransactions.join(',');
117-
var bufferSize = lengthBytesUTF8(txsStr) + 1;
118-
var txsPtr = _malloc(bufferSize);
119-
stringToUTF8(txsStr, txsPtr, bufferSize);
120-
Module.dynCall_vi(callback, txsPtr);
121-
} catch (err) {
122-
console.error(err.message);
123-
Module.dynCall_vi(callback, null);
124-
}
125-
},
126-
} );
127-
128-
129-
130-
139+
signedTransactions = await window.xnft.solana.signAllTransactions(
140+
transactions
141+
);
142+
} else {
143+
signedTransactions = await window.walletAdapterLib.signAllTransactions(
144+
walletName,
145+
base64transactions
146+
);
147+
}
148+
var serializedSignedTransactions = [];
149+
for (var i = 0; i < signedTransactions.length; i++) {
150+
var signedTransaction = signedTransactions[i];
151+
var txStr = signedTransaction.serialize().toString("base64");
152+
serializedSignedTransactions.push(txStr);
153+
}
154+
var txsStr = serializedSignedTransactions.join(",");
155+
var bufferSize = lengthBytesUTF8(txsStr) + 1;
156+
var txsPtr = _malloc(bufferSize);
157+
stringToUTF8(txsStr, txsPtr, bufferSize);
158+
Module.dynCall_vi(callback, txsPtr);
159+
} catch (err) {
160+
console.error(err.message);
161+
Module.dynCall_vi(callback, null);
162+
}
163+
},
164+
});

Runtime/codebase/SolanaWalletAdapterWebGL/SolanaWalletAdapterWebGL.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public class WalletSpecsObject
5252
public static WalletSpecs[] Wallets { get; private set; }
5353

5454
private static WalletSpecs _currentWallet;
55+
56+
private static string _clusterName;
5557

5658

5759
[Obsolete("Use SolanaWalletAdapter class instead, which is the cross platform wrapper.")]
@@ -68,12 +70,14 @@ public SolanaWalletAdapterWebGL(
6870
{
6971
throw new Exception("SolanaWalletAdapterWebGL can only be used on WebGL");
7072
}
73+
_clusterName = RPCNameMap[(int)RpcCluster];
7174
}
7275

7376
private static async Task InitWallets() {
7477
_currentWallet = null;
7578
_walletsInitializedTaskCompletionSource = new TaskCompletionSource<bool>();
76-
InitWalletAdapter(OnWalletsInitialized);
79+
80+
InitWalletAdapter(OnWalletsInitialized, _clusterName);
7781
bool isXnft = await _walletsInitializedTaskCompletionSource.Task;
7882
if (isXnft){
7983
_currentWallet = new WalletSpecs()
@@ -300,7 +304,7 @@ private static void OnWalletsLoaded(string walletsData)
300304
private static extern string ExternGetWallets(Action<string> callback);
301305

302306
[DllImport("__Internal")]
303-
private static extern void InitWalletAdapter(Action<bool> callback);
307+
private static extern void InitWalletAdapter(Action<bool> callback, string clusterName);
304308

305309

306310
#else
@@ -309,7 +313,7 @@ private static void ExternSignTransactionWallet(string walletName, string transa
309313
private static void ExternSignAllTransactionsWallet(string walletName, string transactions, Action<string> callback){}
310314
private static void ExternSignMessageWallet(string walletName, string messageBase64, Action<string> callback){}
311315
private static string ExternGetWallets(Action<string> callback){return null;}
312-
private static void InitWalletAdapter(Action<bool> callback){}
316+
private static void InitWalletAdapter(Action<bool> callback, string clusterName){}
313317

314318
#endif
315319
}

0 commit comments

Comments
 (0)