@reown/appkit-solana-react-native 2.0.0-alpha.3 → 2.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/adapter.js +3 -3
- package/lib/commonjs/adapter.js.map +1 -1
- package/lib/commonjs/connectors/DeeplinkConnector.js +271 -0
- package/lib/commonjs/connectors/DeeplinkConnector.js.map +1 -0
- package/lib/commonjs/connectors/PhantomConnector.js +15 -230
- package/lib/commonjs/connectors/PhantomConnector.js.map +1 -1
- package/lib/commonjs/connectors/SolflareConnector.js +36 -0
- package/lib/commonjs/connectors/SolflareConnector.js.map +1 -0
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/providers/{PhantomProvider.js → DeeplinkProvider.js} +155 -154
- package/lib/commonjs/providers/DeeplinkProvider.js.map +1 -0
- package/lib/module/adapter.js +3 -3
- package/lib/module/adapter.js.map +1 -1
- package/lib/module/connectors/DeeplinkConnector.js +265 -0
- package/lib/module/connectors/DeeplinkConnector.js.map +1 -0
- package/lib/module/connectors/PhantomConnector.js +16 -230
- package/lib/module/connectors/PhantomConnector.js.map +1 -1
- package/lib/module/connectors/SolflareConnector.js +31 -0
- package/lib/module/connectors/SolflareConnector.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/providers/{PhantomProvider.js → DeeplinkProvider.js} +153 -152
- package/lib/module/providers/DeeplinkProvider.js.map +1 -0
- package/lib/typescript/connectors/DeeplinkConnector.d.ts +30 -0
- package/lib/typescript/connectors/DeeplinkConnector.d.ts.map +1 -0
- package/lib/typescript/connectors/PhantomConnector.d.ts +8 -23
- package/lib/typescript/connectors/PhantomConnector.d.ts.map +1 -1
- package/lib/typescript/connectors/SolflareConnector.d.ts +12 -0
- package/lib/typescript/connectors/SolflareConnector.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/providers/{PhantomProvider.d.ts → DeeplinkProvider.d.ts} +16 -8
- package/lib/typescript/providers/DeeplinkProvider.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +27 -32
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/adapter.ts +3 -3
- package/src/connectors/DeeplinkConnector.ts +353 -0
- package/src/connectors/PhantomConnector.ts +17 -313
- package/src/connectors/SolflareConnector.ts +33 -0
- package/src/index.ts +2 -1
- package/src/providers/{PhantomProvider.ts → DeeplinkProvider.ts} +256 -233
- package/src/types.ts +29 -37
- package/lib/commonjs/providers/PhantomProvider.js.map +0 -1
- package/lib/module/providers/PhantomProvider.js.map +0 -1
- package/lib/typescript/providers/PhantomProvider.d.ts.map +0 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SolflareConnector = void 0;
|
|
7
|
+
var _appkitCommonReactNative = require("@reown/appkit-common-react-native");
|
|
8
|
+
var _DeeplinkConnector = require("./DeeplinkConnector");
|
|
9
|
+
const SOLFLARE_BASE_URL = 'https://solflare.com/ul/v1';
|
|
10
|
+
const SOLFLARE_CONNECTOR_STORAGE_KEY = '@appkit/solflare-connector-data';
|
|
11
|
+
const SOLFLARE_DAPP_KEYPAIR_STORAGE_KEY = '@appkit/solflare-dapp-secret-key';
|
|
12
|
+
class SolflareConnector extends _DeeplinkConnector.DeeplinkConnector {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
super({
|
|
15
|
+
type: 'solflare',
|
|
16
|
+
cluster: config?.cluster
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
getWalletInfo() {
|
|
20
|
+
return _appkitCommonReactNative.ConstantsUtil.SOLFLARE_CUSTOM_WALLET;
|
|
21
|
+
}
|
|
22
|
+
getBaseUrl() {
|
|
23
|
+
return SOLFLARE_BASE_URL;
|
|
24
|
+
}
|
|
25
|
+
getStorageKey() {
|
|
26
|
+
return SOLFLARE_CONNECTOR_STORAGE_KEY;
|
|
27
|
+
}
|
|
28
|
+
getDappKeypairStorageKey() {
|
|
29
|
+
return SOLFLARE_DAPP_KEYPAIR_STORAGE_KEY;
|
|
30
|
+
}
|
|
31
|
+
getEncryptionKeyFieldName() {
|
|
32
|
+
return 'solflare_encryption_public_key';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.SolflareConnector = SolflareConnector;
|
|
36
|
+
//# sourceMappingURL=SolflareConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_appkitCommonReactNative","require","_DeeplinkConnector","SOLFLARE_BASE_URL","SOLFLARE_CONNECTOR_STORAGE_KEY","SOLFLARE_DAPP_KEYPAIR_STORAGE_KEY","SolflareConnector","DeeplinkConnector","constructor","config","type","cluster","getWalletInfo","ConstantsUtil","SOLFLARE_CUSTOM_WALLET","getBaseUrl","getStorageKey","getDappKeypairStorageKey","getEncryptionKeyFieldName","exports"],"sourceRoot":"../../../src","sources":["connectors/SolflareConnector.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAD,OAAA;AAGA,MAAME,iBAAiB,GAAG,4BAA4B;AACtD,MAAMC,8BAA8B,GAAG,iCAAiC;AACxE,MAAMC,iCAAiC,GAAG,kCAAkC;AAErE,MAAMC,iBAAiB,SAASC,oCAAiB,CAAC;EACvDC,WAAWA,CAACC,MAAgC,EAAE;IAC5C,KAAK,CAAC;MAAEC,IAAI,EAAE,UAAU;MAAEC,OAAO,EAAEF,MAAM,EAAEE;IAAQ,CAAC,CAAC;EACvD;EAESC,aAAaA,CAAA,EAAe;IACnC,OAAOC,sCAAa,CAACC,sBAAsB;EAC7C;EAEUC,UAAUA,CAAA,EAAW;IAC7B,OAAOZ,iBAAiB;EAC1B;EAEUa,aAAaA,CAAA,EAAW;IAChC,OAAOZ,8BAA8B;EACvC;EAEUa,wBAAwBA,CAAA,EAAW;IAC3C,OAAOZ,iCAAiC;EAC1C;EAEUa,yBAAyBA,CAAA,EAAW;IAC5C,OAAO,gCAAgC;EACzC;AACF;AAACC,OAAA,CAAAb,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -15,6 +15,13 @@ Object.defineProperty(exports, "SolanaAdapter", {
|
|
|
15
15
|
return _adapter.SolanaAdapter;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
|
+
Object.defineProperty(exports, "SolflareConnector", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _SolflareConnector.SolflareConnector;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
18
24
|
var _adapter = require("./adapter");
|
|
19
25
|
var _PhantomConnector = require("./connectors/PhantomConnector");
|
|
26
|
+
var _SolflareConnector = require("./connectors/SolflareConnector");
|
|
20
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_adapter","require","_PhantomConnector"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_adapter","require","_PhantomConnector","_SolflareConnector"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AAMA,IAAAC,iBAAA,GAAAD,OAAA;AACA,IAAAE,kBAAA,GAAAF,OAAA","ignoreList":[]}
|
|
@@ -3,15 +3,13 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.SOLANA_SIGNING_METHODS = exports.
|
|
6
|
+
exports.SOLANA_SIGNING_METHODS = exports.DeeplinkProvider = void 0;
|
|
7
7
|
var _reactNative = require("react-native");
|
|
8
8
|
var _tweetnacl = _interopRequireDefault(require("tweetnacl"));
|
|
9
9
|
var _bs = _interopRequireDefault(require("bs58"));
|
|
10
10
|
var _buffer = require("buffer");
|
|
11
11
|
var _events = _interopRequireDefault(require("events"));
|
|
12
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
const PHANTOM_BASE_URL = 'https://phantom.app/ul/v1';
|
|
14
|
-
const PHANTOM_PROVIDER_STORAGE_KEY = '@appkit/phantom-provider-session';
|
|
15
13
|
const SOLANA_SIGNING_METHODS = exports.SOLANA_SIGNING_METHODS = {
|
|
16
14
|
SOLANA_SIGN_TRANSACTION: 'solana_signTransaction',
|
|
17
15
|
SOLANA_SIGN_MESSAGE: 'solana_signMessage',
|
|
@@ -21,11 +19,11 @@ const SOLANA_SIGNING_METHODS = exports.SOLANA_SIGNING_METHODS = {
|
|
|
21
19
|
function isValidSolanaSigningMethod(method) {
|
|
22
20
|
return Object.values(SOLANA_SIGNING_METHODS).includes(method);
|
|
23
21
|
}
|
|
24
|
-
class
|
|
25
|
-
|
|
22
|
+
class DeeplinkProvider extends _events.default {
|
|
23
|
+
sharedKey = null;
|
|
26
24
|
sessionToken = null;
|
|
27
25
|
userPublicKey = null;
|
|
28
|
-
|
|
26
|
+
walletEncryptionPublicKeyBs58 = null;
|
|
29
27
|
|
|
30
28
|
// Single subscription management - deep links are sequential by nature
|
|
31
29
|
activeSubscription = null;
|
|
@@ -33,9 +31,13 @@ class PhantomProvider extends _events.default {
|
|
|
33
31
|
constructor(config) {
|
|
34
32
|
super();
|
|
35
33
|
this.config = config;
|
|
34
|
+
this.currentCluster = config.cluster ?? 'mainnet-beta';
|
|
36
35
|
this.dappEncryptionKeyPair = config.dappEncryptionKeyPair;
|
|
37
36
|
this.storage = config.storage;
|
|
38
37
|
}
|
|
38
|
+
getSessionStorageKey() {
|
|
39
|
+
return `@appkit/${this.config.type}-provider-session`;
|
|
40
|
+
}
|
|
39
41
|
|
|
40
42
|
/**
|
|
41
43
|
* Cleanup method to be called when the provider is destroyed
|
|
@@ -73,9 +75,47 @@ class PhantomProvider extends _events.default {
|
|
|
73
75
|
isConnected() {
|
|
74
76
|
return !!this.sessionToken && !!this.userPublicKey && !!this.dappEncryptionKeyPair;
|
|
75
77
|
}
|
|
78
|
+
getCurrentCluster() {
|
|
79
|
+
return this.currentCluster;
|
|
80
|
+
}
|
|
76
81
|
buildUrl(rpcMethod, params) {
|
|
77
82
|
const query = new URLSearchParams(params).toString();
|
|
78
|
-
return `${
|
|
83
|
+
return `${this.config.baseUrl}/${rpcMethod}?${query}`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Open a deeplink URL and wait for a redirect back to the app. Handles subscription
|
|
88
|
+
* lifecycle and common error extraction from `errorCode`/`errorMessage` query params.
|
|
89
|
+
*/
|
|
90
|
+
async openDeeplinkAndWait(deeplinkUrl, processParams, contextLabel) {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const handleDeepLink = async event => {
|
|
93
|
+
try {
|
|
94
|
+
this.cleanupActiveSubscription();
|
|
95
|
+
const fullUrl = event.url;
|
|
96
|
+
if (!fullUrl.startsWith(this.config.appScheme)) {
|
|
97
|
+
return reject(new Error(`${this.config.type} provider: ${contextLabel}: Unexpected redirect URI.`));
|
|
98
|
+
}
|
|
99
|
+
const params = new URLSearchParams(fullUrl.substring(fullUrl.indexOf('?') + 1));
|
|
100
|
+
const errorCode = params.get('errorCode');
|
|
101
|
+
const errorMessage = params.get('errorMessage');
|
|
102
|
+
if (errorCode) {
|
|
103
|
+
return reject(new Error(`${this.config.type} provider: ${contextLabel} Failed: ${errorMessage || 'Unknown error'} (Code: ${errorCode})`));
|
|
104
|
+
}
|
|
105
|
+
const result = await Promise.resolve(processParams(params));
|
|
106
|
+
resolve(result);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
this.cleanupActiveSubscription();
|
|
109
|
+
reject(error);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const subscription = _reactNative.Linking.addEventListener('url', handleDeepLink);
|
|
113
|
+
this.setActiveSubscription(subscription);
|
|
114
|
+
_reactNative.Linking.openURL(deeplinkUrl).catch(err => {
|
|
115
|
+
this.cleanupActiveSubscription();
|
|
116
|
+
reject(new Error(`${this.config.type} provider: Failed to open wallet for ${contextLabel}: ${err.message}.`));
|
|
117
|
+
});
|
|
118
|
+
});
|
|
79
119
|
}
|
|
80
120
|
getRpcMethodName(method) {
|
|
81
121
|
switch (method) {
|
|
@@ -92,73 +132,94 @@ class PhantomProvider extends _events.default {
|
|
|
92
132
|
throw new Error(`Unsupported Solana signing method: ${method}`);
|
|
93
133
|
}
|
|
94
134
|
}
|
|
95
|
-
encryptPayload(payload,
|
|
96
|
-
if (!
|
|
135
|
+
encryptPayload(payload, walletPublicKeyBs58) {
|
|
136
|
+
if (!walletPublicKeyBs58) {
|
|
97
137
|
return null;
|
|
98
138
|
}
|
|
99
139
|
try {
|
|
100
|
-
const phantomPublicKeyBytes = _bs.default.decode(phantomPublicKeyBs58ToEncryptFor);
|
|
101
140
|
const nonce = _tweetnacl.default.randomBytes(_tweetnacl.default.box.nonceLength);
|
|
102
141
|
const payloadBytes = _buffer.Buffer.from(JSON.stringify(payload), 'utf8');
|
|
103
|
-
|
|
142
|
+
let encryptedPayload;
|
|
143
|
+
if (this.sharedKey) {
|
|
144
|
+
encryptedPayload = _tweetnacl.default.box.after(payloadBytes, nonce, this.sharedKey);
|
|
145
|
+
} else {
|
|
146
|
+
const walletPublicKeyBytes = _bs.default.decode(walletPublicKeyBs58);
|
|
147
|
+
encryptedPayload = _tweetnacl.default.box(payloadBytes, nonce, walletPublicKeyBytes, this.dappEncryptionKeyPair.secretKey);
|
|
148
|
+
}
|
|
104
149
|
return {
|
|
105
150
|
nonce: _bs.default.encode(nonce),
|
|
106
151
|
encryptedPayload: _bs.default.encode(encryptedPayload)
|
|
107
152
|
};
|
|
108
153
|
} catch (error) {
|
|
154
|
+
console.warn(`${this.config.type} provider: Failed to encrypt payload.`, error);
|
|
109
155
|
return null;
|
|
110
156
|
}
|
|
111
157
|
}
|
|
112
|
-
decryptPayload(encryptedDataBs58, nonceBs58,
|
|
158
|
+
decryptPayload(encryptedDataBs58, nonceBs58, walletSenderPublicKeyBs58) {
|
|
113
159
|
try {
|
|
114
|
-
const
|
|
160
|
+
const formattedEncryptedDataBs58 = encryptedDataBs58.replace('#', '');
|
|
161
|
+
const encryptedDataBytes = _bs.default.decode(formattedEncryptedDataBs58);
|
|
115
162
|
const nonceBytes = _bs.default.decode(nonceBs58);
|
|
116
|
-
|
|
117
|
-
|
|
163
|
+
let decryptedPayloadBytes;
|
|
164
|
+
if (this.sharedKey) {
|
|
165
|
+
decryptedPayloadBytes = _tweetnacl.default.box.open.after(encryptedDataBytes, nonceBytes, this.sharedKey);
|
|
166
|
+
} else {
|
|
167
|
+
const walletSenderPublicKeyBytes = _bs.default.decode(walletSenderPublicKeyBs58);
|
|
168
|
+
decryptedPayloadBytes = _tweetnacl.default.box.open(encryptedDataBytes, nonceBytes, walletSenderPublicKeyBytes, this.dappEncryptionKeyPair.secretKey);
|
|
169
|
+
}
|
|
118
170
|
if (!decryptedPayloadBytes) {
|
|
119
171
|
return null;
|
|
120
172
|
}
|
|
121
173
|
return JSON.parse(_buffer.Buffer.from(decryptedPayloadBytes).toString('utf8'));
|
|
122
174
|
} catch (error) {
|
|
175
|
+
console.warn(`${this.config.type} provider: Failed to decrypt payload.`, error);
|
|
123
176
|
return null;
|
|
124
177
|
}
|
|
125
178
|
}
|
|
126
179
|
async restoreSession() {
|
|
127
180
|
try {
|
|
128
|
-
const session = await this.storage.getItem(
|
|
181
|
+
const session = await this.storage.getItem(this.getSessionStorageKey());
|
|
129
182
|
if (session) {
|
|
130
183
|
this.setSession(session);
|
|
184
|
+
|
|
185
|
+
// Recompute shared key on session restore
|
|
186
|
+
try {
|
|
187
|
+
const walletPublicKeyBytes = _bs.default.decode(session.walletEncryptionPublicKeyBs58);
|
|
188
|
+
this.sharedKey = _tweetnacl.default.box.before(walletPublicKeyBytes, this.dappEncryptionKeyPair.secretKey);
|
|
189
|
+
} catch (e) {
|
|
190
|
+
this.sharedKey = null;
|
|
191
|
+
}
|
|
131
192
|
return true;
|
|
132
193
|
}
|
|
133
194
|
return false;
|
|
134
195
|
} catch (error) {
|
|
135
|
-
// console.error(
|
|
196
|
+
// console.error(`${this.config.type} provider: Failed to restore session.`, error);
|
|
136
197
|
await this.clearSessionStorage(); // Clear potentially corrupt data
|
|
137
198
|
|
|
138
199
|
return false;
|
|
139
200
|
}
|
|
140
201
|
}
|
|
141
202
|
async saveSession() {
|
|
142
|
-
if (!this.sessionToken || !this.userPublicKey || !this.
|
|
203
|
+
if (!this.sessionToken || !this.userPublicKey || !this.walletEncryptionPublicKeyBs58) {
|
|
143
204
|
return; // Cannot save incomplete session
|
|
144
205
|
}
|
|
145
206
|
const session = {
|
|
146
207
|
sessionToken: this.sessionToken,
|
|
147
208
|
userPublicKey: this.userPublicKey,
|
|
148
|
-
|
|
209
|
+
walletEncryptionPublicKeyBs58: this.walletEncryptionPublicKeyBs58,
|
|
149
210
|
cluster: this.currentCluster
|
|
150
211
|
};
|
|
151
212
|
try {
|
|
152
|
-
await this.storage.setItem(
|
|
213
|
+
await this.storage.setItem(this.getSessionStorageKey(), session);
|
|
153
214
|
} catch (error) {
|
|
154
|
-
// console.error(
|
|
215
|
+
// console.error(`${this.config.type} provider: Failed to save session.`, error);
|
|
155
216
|
}
|
|
156
217
|
}
|
|
157
218
|
async clearSessionStorage() {
|
|
158
219
|
try {
|
|
159
|
-
await this.storage.removeItem(
|
|
220
|
+
await this.storage.removeItem(this.getSessionStorageKey());
|
|
160
221
|
} catch (error) {
|
|
161
|
-
// console.error(
|
|
222
|
+
// console.error(`${this.config.type} provider: Failed to clear session storage.`, error);
|
|
162
223
|
}
|
|
163
224
|
}
|
|
164
225
|
async connect(params) {
|
|
@@ -171,60 +232,43 @@ class PhantomProvider extends _events.default {
|
|
|
171
232
|
cluster
|
|
172
233
|
};
|
|
173
234
|
const url = this.buildUrl('connect', connectDeeplinkParams);
|
|
174
|
-
return
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
};
|
|
191
|
-
if (!responsePayload.phantom_encryption_public_key || !responsePayload.nonce || !responsePayload.data) {
|
|
192
|
-
return reject(new Error('Phantom Connect: Invalid response - missing parameters.'));
|
|
193
|
-
}
|
|
194
|
-
const decryptedData = this.decryptPayload(responsePayload.data, responsePayload.nonce, responsePayload.phantom_encryption_public_key);
|
|
195
|
-
if (!decryptedData || !decryptedData.public_key || !decryptedData.session) {
|
|
196
|
-
return reject(new Error('Phantom Connect: Failed to decrypt or invalid decrypted data.'));
|
|
197
|
-
}
|
|
198
|
-
this.userPublicKey = decryptedData.public_key;
|
|
199
|
-
this.sessionToken = decryptedData.session;
|
|
200
|
-
this.phantomEncryptionPublicKeyBs58 = responsePayload.phantom_encryption_public_key;
|
|
235
|
+
return this.openDeeplinkAndWait(url, responseUrlParams => {
|
|
236
|
+
const responsePayload = {
|
|
237
|
+
wallet_encryption_public_key: responseUrlParams.get(this.config.encryptionKeyFieldName),
|
|
238
|
+
nonce: responseUrlParams.get('nonce'),
|
|
239
|
+
data: responseUrlParams.get('data')
|
|
240
|
+
};
|
|
241
|
+
if (!responsePayload.wallet_encryption_public_key || !responsePayload.nonce || !responsePayload.data) {
|
|
242
|
+
throw new Error(`${this.config.type} provider: Invalid response - missing parameters.`);
|
|
243
|
+
}
|
|
244
|
+
const decryptedData = this.decryptPayload(responsePayload.data, responsePayload.nonce, responsePayload.wallet_encryption_public_key);
|
|
245
|
+
if (!decryptedData || !decryptedData.public_key || !decryptedData.session) {
|
|
246
|
+
throw new Error(`${this.config.type} provider: Failed to decrypt or invalid decrypted data.`);
|
|
247
|
+
}
|
|
248
|
+
this.userPublicKey = decryptedData.public_key;
|
|
249
|
+
this.sessionToken = decryptedData.session;
|
|
250
|
+
this.walletEncryptionPublicKeyBs58 = responsePayload.wallet_encryption_public_key;
|
|
201
251
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
252
|
+
// Precompute shared key for subsequent communications
|
|
253
|
+
try {
|
|
254
|
+
const walletPublicKeyBytes = _bs.default.decode(this.walletEncryptionPublicKeyBs58);
|
|
255
|
+
this.sharedKey = _tweetnacl.default.box.before(walletPublicKeyBytes, this.dappEncryptionKeyPair.secretKey);
|
|
256
|
+
} catch (e) {
|
|
257
|
+
this.sharedKey = null;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Save session on successful connect
|
|
261
|
+
this.saveSession();
|
|
262
|
+
return {
|
|
263
|
+
userPublicKey: this.userPublicKey,
|
|
264
|
+
sessionToken: this.sessionToken,
|
|
265
|
+
walletEncryptionPublicKeyBs58: this.walletEncryptionPublicKeyBs58,
|
|
266
|
+
cluster
|
|
217
267
|
};
|
|
218
|
-
|
|
219
|
-
this.setActiveSubscription(subscription);
|
|
220
|
-
_reactNative.Linking.openURL(url).catch(err => {
|
|
221
|
-
this.cleanupActiveSubscription();
|
|
222
|
-
reject(new Error(`Failed to open Phantom wallet: ${err.message}. Is it installed?`));
|
|
223
|
-
});
|
|
224
|
-
});
|
|
268
|
+
}, 'Connection');
|
|
225
269
|
}
|
|
226
270
|
async disconnect() {
|
|
227
|
-
if (!this.sessionToken || !this.
|
|
271
|
+
if (!this.sessionToken || !this.walletEncryptionPublicKeyBs58) {
|
|
228
272
|
await this.clearSession();
|
|
229
273
|
this.emit('disconnect');
|
|
230
274
|
return Promise.resolve();
|
|
@@ -232,9 +276,9 @@ class PhantomProvider extends _events.default {
|
|
|
232
276
|
const payloadToEncrypt = {
|
|
233
277
|
session: this.sessionToken
|
|
234
278
|
};
|
|
235
|
-
const encryptedDisconnectPayload = this.encryptPayload(payloadToEncrypt, this.
|
|
279
|
+
const encryptedDisconnectPayload = this.encryptPayload(payloadToEncrypt, this.walletEncryptionPublicKeyBs58);
|
|
236
280
|
if (!encryptedDisconnectPayload) {
|
|
237
|
-
// console.warn(
|
|
281
|
+
// console.warn(`${this.config.type} provider: Failed to encrypt disconnect payload. Clearing session locally.`);
|
|
238
282
|
await this.clearSession();
|
|
239
283
|
this.emit('disconnect');
|
|
240
284
|
return Promise.resolve(); // Or reject, depending on desired strictness
|
|
@@ -246,53 +290,35 @@ class PhantomProvider extends _events.default {
|
|
|
246
290
|
nonce: encryptedDisconnectPayload.nonce
|
|
247
291
|
};
|
|
248
292
|
const url = this.buildUrl('disconnect', disconnectDeeplinkParams);
|
|
249
|
-
return
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
this.cleanupActiveSubscription();
|
|
253
|
-
if (event.url.startsWith(this.config.appScheme)) {
|
|
254
|
-
this.clearSession();
|
|
255
|
-
resolve();
|
|
256
|
-
} else {
|
|
257
|
-
this.clearSession();
|
|
258
|
-
reject(new Error('Phantom Disconnect: Unexpected redirect URI.'));
|
|
259
|
-
}
|
|
260
|
-
} catch (error) {
|
|
261
|
-
this.cleanupActiveSubscription();
|
|
262
|
-
this.clearSession();
|
|
263
|
-
reject(error);
|
|
264
|
-
}
|
|
265
|
-
};
|
|
266
|
-
const subscription = _reactNative.Linking.addEventListener('url', handleDeepLink);
|
|
267
|
-
this.setActiveSubscription(subscription);
|
|
268
|
-
_reactNative.Linking.openURL(url).catch(err => {
|
|
269
|
-
this.cleanupActiveSubscription();
|
|
270
|
-
this.clearSession();
|
|
271
|
-
reject(new Error(`Failed to open Phantom for disconnection: ${err.message}.`));
|
|
272
|
-
});
|
|
273
|
-
});
|
|
293
|
+
return this.openDeeplinkAndWait(url, () => {
|
|
294
|
+
this.clearSession();
|
|
295
|
+
}, 'Disconnection');
|
|
274
296
|
}
|
|
275
297
|
async clearSession() {
|
|
276
298
|
this.sessionToken = null;
|
|
277
299
|
this.userPublicKey = null;
|
|
278
|
-
this.
|
|
300
|
+
this.walletEncryptionPublicKeyBs58 = null;
|
|
301
|
+
if (this.sharedKey) {
|
|
302
|
+
this.sharedKey.fill(0);
|
|
303
|
+
}
|
|
304
|
+
this.sharedKey = null;
|
|
279
305
|
this.cleanupActiveSubscription();
|
|
280
306
|
await this.clearSessionStorage();
|
|
281
307
|
}
|
|
282
308
|
setSession(session) {
|
|
283
309
|
this.sessionToken = session.sessionToken;
|
|
284
310
|
this.userPublicKey = session.userPublicKey;
|
|
285
|
-
this.
|
|
311
|
+
this.walletEncryptionPublicKeyBs58 = session.walletEncryptionPublicKeyBs58;
|
|
286
312
|
this.currentCluster = session.cluster;
|
|
287
313
|
}
|
|
288
314
|
async request(args, _chainId) {
|
|
289
315
|
if (!isValidSolanaSigningMethod(args.method)) {
|
|
290
|
-
throw new Error(
|
|
316
|
+
throw new Error(`${this.config.type} provider: Unsupported method: ${args.method}. Only Solana signing methods are supported.`);
|
|
291
317
|
}
|
|
292
318
|
const signingMethod = args.method;
|
|
293
319
|
const requestParams = args.params;
|
|
294
|
-
if (!this.isConnected() || !this.sessionToken || !this.
|
|
295
|
-
throw new Error(
|
|
320
|
+
if (!this.isConnected() || !this.sessionToken || !this.walletEncryptionPublicKeyBs58) {
|
|
321
|
+
throw new Error(`${this.config.type} provider: Not connected or session details missing. Cannot process request.`);
|
|
296
322
|
}
|
|
297
323
|
const rpcMethodName = this.getRpcMethodName(signingMethod);
|
|
298
324
|
let deeplinkUrl = '';
|
|
@@ -308,9 +334,9 @@ class PhantomProvider extends _events.default {
|
|
|
308
334
|
session: this.sessionToken,
|
|
309
335
|
transaction: typedParams.transaction
|
|
310
336
|
};
|
|
311
|
-
const encryptedData = this.encryptPayload(dataToEncrypt, this.
|
|
337
|
+
const encryptedData = this.encryptPayload(dataToEncrypt, this.walletEncryptionPublicKeyBs58);
|
|
312
338
|
if (!encryptedData) {
|
|
313
|
-
throw new Error(
|
|
339
|
+
throw new Error(`${this.config.type} provider: Failed to encrypt payload for ${signingMethod}.`);
|
|
314
340
|
}
|
|
315
341
|
const signTxDeeplinkParams = {
|
|
316
342
|
dapp_encryption_public_key: _bs.default.encode(this.dappEncryptionKeyPair.publicKey),
|
|
@@ -326,7 +352,7 @@ class PhantomProvider extends _events.default {
|
|
|
326
352
|
{
|
|
327
353
|
const typedParams = requestParams;
|
|
328
354
|
if (!typedParams || typeof typedParams.message === 'undefined') {
|
|
329
|
-
throw new Error(
|
|
355
|
+
throw new Error(`${this.config.type} provider: Missing 'message' in params for ${signingMethod}`);
|
|
330
356
|
}
|
|
331
357
|
let messageBs58;
|
|
332
358
|
if (typedParams.message instanceof Uint8Array) {
|
|
@@ -339,16 +365,16 @@ class PhantomProvider extends _events.default {
|
|
|
339
365
|
messageBs58 = _bs.default.encode(_buffer.Buffer.from(typedParams.message));
|
|
340
366
|
}
|
|
341
367
|
} else {
|
|
342
|
-
throw new Error(
|
|
368
|
+
throw new Error(`${this.config.type} provider: Invalid message format for signMessage. Expected Uint8Array or string.`);
|
|
343
369
|
}
|
|
344
370
|
const dataToEncrypt = {
|
|
345
371
|
message: messageBs58,
|
|
346
372
|
session: this.sessionToken,
|
|
347
373
|
display: typedParams.display || 'utf8'
|
|
348
374
|
};
|
|
349
|
-
const encryptedPayloadData = this.encryptPayload(dataToEncrypt, this.
|
|
375
|
+
const encryptedPayloadData = this.encryptPayload(dataToEncrypt, this.walletEncryptionPublicKeyBs58);
|
|
350
376
|
if (!encryptedPayloadData) {
|
|
351
|
-
throw new Error(
|
|
377
|
+
throw new Error(`${this.config.type} provider: Failed to encrypt payload for signMessage.`);
|
|
352
378
|
}
|
|
353
379
|
const signMsgDeeplinkQueryPayload = {
|
|
354
380
|
dapp_encryption_public_key: _bs.default.encode(this.dappEncryptionKeyPair.publicKey),
|
|
@@ -363,15 +389,15 @@ class PhantomProvider extends _events.default {
|
|
|
363
389
|
{
|
|
364
390
|
const typedParams = requestParams;
|
|
365
391
|
if (!typedParams || !Array.isArray(typedParams.transactions) || !typedParams.transactions.every(t => typeof t === 'string')) {
|
|
366
|
-
throw new Error(
|
|
392
|
+
throw new Error(`${this.config.type} provider: Missing or invalid 'transactions' (array of base58 strings) in params for ${signingMethod}`);
|
|
367
393
|
}
|
|
368
394
|
const dataToEncrypt = {
|
|
369
395
|
session: this.sessionToken,
|
|
370
396
|
transactions: typedParams.transactions
|
|
371
397
|
};
|
|
372
|
-
const encryptedData = this.encryptPayload(dataToEncrypt, this.
|
|
398
|
+
const encryptedData = this.encryptPayload(dataToEncrypt, this.walletEncryptionPublicKeyBs58);
|
|
373
399
|
if (!encryptedData) {
|
|
374
|
-
throw new Error(
|
|
400
|
+
throw new Error(`${this.config.type} provider: Failed to encrypt payload for ${signingMethod}.`);
|
|
375
401
|
}
|
|
376
402
|
const signAllTxDeeplinkParams = {
|
|
377
403
|
dapp_encryption_public_key: _bs.default.encode(this.dappEncryptionKeyPair.publicKey),
|
|
@@ -385,47 +411,22 @@ class PhantomProvider extends _events.default {
|
|
|
385
411
|
}
|
|
386
412
|
default:
|
|
387
413
|
{
|
|
388
|
-
throw new Error(
|
|
414
|
+
throw new Error(`${this.config.type} provider: Unhandled signing method: ${signingMethod}`);
|
|
389
415
|
}
|
|
390
416
|
}
|
|
391
|
-
return
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
const responseNonce = responseUrlParams.get('nonce');
|
|
404
|
-
const responseData = responseUrlParams.get('data');
|
|
405
|
-
if (!responseNonce || !responseData) {
|
|
406
|
-
return reject(new Error(`Phantom ${signingMethod}: Invalid response - missing nonce or data.`));
|
|
407
|
-
}
|
|
408
|
-
const decryptedResult = this.decryptPayload(responseData, responseNonce, this.phantomEncryptionPublicKeyBs58);
|
|
409
|
-
if (!decryptedResult) {
|
|
410
|
-
return reject(new Error(`Phantom ${signingMethod}: Failed to decrypt response or invalid decrypted data.`));
|
|
411
|
-
}
|
|
412
|
-
resolve(decryptedResult);
|
|
413
|
-
} else {
|
|
414
|
-
reject(new Error(`Phantom ${signingMethod}: Unexpected redirect URI.`));
|
|
415
|
-
}
|
|
416
|
-
} catch (error) {
|
|
417
|
-
this.cleanupActiveSubscription();
|
|
418
|
-
reject(error);
|
|
419
|
-
}
|
|
420
|
-
};
|
|
421
|
-
const subscription = _reactNative.Linking.addEventListener('url', handleDeepLink);
|
|
422
|
-
this.setActiveSubscription(subscription);
|
|
423
|
-
_reactNative.Linking.openURL(deeplinkUrl).catch(err => {
|
|
424
|
-
this.cleanupActiveSubscription();
|
|
425
|
-
reject(new Error(`Failed to open Phantom for ${signingMethod}: ${err.message}. Is it installed?`));
|
|
426
|
-
});
|
|
427
|
-
});
|
|
417
|
+
return this.openDeeplinkAndWait(deeplinkUrl, responseUrlParams => {
|
|
418
|
+
const responseNonce = responseUrlParams.get('nonce');
|
|
419
|
+
const responseData = responseUrlParams.get('data');
|
|
420
|
+
if (!responseNonce || !responseData) {
|
|
421
|
+
throw new Error(`${this.config.type} provider: ${signingMethod}: Invalid response - missing nonce or data.`);
|
|
422
|
+
}
|
|
423
|
+
const decryptedResult = this.decryptPayload(responseData, responseNonce, this.walletEncryptionPublicKeyBs58);
|
|
424
|
+
if (!decryptedResult) {
|
|
425
|
+
throw new Error(`${this.config.type} provider: ${signingMethod}: Failed to decrypt response or invalid decrypted data.`);
|
|
426
|
+
}
|
|
427
|
+
return decryptedResult;
|
|
428
|
+
}, signingMethod);
|
|
428
429
|
}
|
|
429
430
|
}
|
|
430
|
-
exports.
|
|
431
|
-
//# sourceMappingURL=
|
|
431
|
+
exports.DeeplinkProvider = DeeplinkProvider;
|
|
432
|
+
//# sourceMappingURL=DeeplinkProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_tweetnacl","_interopRequireDefault","_bs","_buffer","_events","e","__esModule","default","SOLANA_SIGNING_METHODS","exports","SOLANA_SIGN_TRANSACTION","SOLANA_SIGN_MESSAGE","SOLANA_SIGN_AND_SEND_TRANSACTION","SOLANA_SIGN_ALL_TRANSACTIONS","isValidSolanaSigningMethod","method","Object","values","includes","DeeplinkProvider","EventEmitter","sharedKey","sessionToken","userPublicKey","walletEncryptionPublicKeyBs58","activeSubscription","isOperationPending","constructor","config","currentCluster","cluster","dappEncryptionKeyPair","storage","getSessionStorageKey","type","destroy","cleanupActiveSubscription","removeAllListeners","remove","setActiveSubscription","subscription","getUserPublicKey","isConnected","getCurrentCluster","buildUrl","rpcMethod","params","query","URLSearchParams","toString","baseUrl","openDeeplinkAndWait","deeplinkUrl","processParams","contextLabel","Promise","resolve","reject","handleDeepLink","event","fullUrl","url","startsWith","appScheme","Error","substring","indexOf","errorCode","get","errorMessage","result","error","Linking","addEventListener","openURL","catch","err","message","getRpcMethodName","encryptPayload","payload","walletPublicKeyBs58","nonce","nacl","randomBytes","box","nonceLength","payloadBytes","Buffer","from","JSON","stringify","encryptedPayload","after","walletPublicKeyBytes","bs58","decode","secretKey","encode","console","warn","decryptPayload","encryptedDataBs58","nonceBs58","walletSenderPublicKeyBs58","formattedEncryptedDataBs58","replace","encryptedDataBytes","nonceBytes","decryptedPayloadBytes","open","walletSenderPublicKeyBytes","parse","restoreSession","session","getItem","setSession","before","clearSessionStorage","saveSession","setItem","removeItem","connect","connectDeeplinkParams","app_url","dappUrl","dapp_encryption_public_key","publicKey","redirect_link","responseUrlParams","responsePayload","wallet_encryption_public_key","encryptionKeyFieldName","data","decryptedData","public_key","disconnect","clearSession","emit","payloadToEncrypt","encryptedDisconnectPayload","disconnectDeeplinkParams","fill","request","args","_chainId","signingMethod","requestParams","rpcMethodName","typedParams","transaction","dataToEncrypt","encryptedData","signTxDeeplinkParams","messageBs58","Uint8Array","display","encryptedPayloadData","signMsgDeeplinkQueryPayload","Array","isArray","transactions","every","t","signAllTxDeeplinkParams","responseNonce","responseData","decryptedResult"],"sourceRoot":"../../../src","sources":["providers/DeeplinkProvider.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/adapter.js
CHANGED
|
@@ -70,7 +70,7 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
70
70
|
if (!network) {
|
|
71
71
|
throw new Error('SolanaAdapter:signTransaction - network is undefined');
|
|
72
72
|
}
|
|
73
|
-
const provider = this.connector.getProvider();
|
|
73
|
+
const provider = this.connector.getProvider('solana');
|
|
74
74
|
if (!provider) {
|
|
75
75
|
throw new Error('SolanaAdapter:signTransaction - provider is undefined');
|
|
76
76
|
}
|
|
@@ -123,7 +123,7 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
123
123
|
if (!this.connector) {
|
|
124
124
|
throw new Error('SolanaAdapter:sendTransaction - no active connector');
|
|
125
125
|
}
|
|
126
|
-
const provider = this.connector.getProvider();
|
|
126
|
+
const provider = this.connector.getProvider('solana');
|
|
127
127
|
if (!provider) {
|
|
128
128
|
throw new Error('SolanaAdapter:sendTransaction - provider is undefined');
|
|
129
129
|
}
|
|
@@ -179,7 +179,7 @@ export class SolanaAdapter extends SolanaBaseAdapter {
|
|
|
179
179
|
}
|
|
180
180
|
async switchNetwork(network) {
|
|
181
181
|
if (!this.connector) throw new Error('No active connector');
|
|
182
|
-
const provider = this.connector.getProvider();
|
|
182
|
+
const provider = this.connector.getProvider('solana');
|
|
183
183
|
if (!provider) throw new Error('No active provider');
|
|
184
184
|
try {
|
|
185
185
|
await this.connector.switchNetwork(network);
|