@0xsequence/provider 0.40.3 → 0.40.4

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.
@@ -3145,6 +3145,257 @@ class BaseInjectedTransport extends eventemitter2.EventEmitter2 {
3145
3145
 
3146
3146
  }
3147
3147
 
3148
+ /**
3149
+ * This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
3150
+ */
3151
+ function overrideLogs(side) {
3152
+ var _window$ue;
3153
+
3154
+ if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport && !window.logsOverriddenForUnreal) {
3155
+ var _window$ue2;
3156
+
3157
+ const t = (_window$ue2 = window.ue) == null ? void 0 : _window$ue2.sequencewallettransport;
3158
+
3159
+ console.log = (...args) => {
3160
+ t.logfromjs(`${side}: ${stringify(args)}`);
3161
+ };
3162
+
3163
+ console.warn = (...args) => {
3164
+ t.warnfromjs(`${side}: ${stringify(args)}`);
3165
+ };
3166
+
3167
+ console.error = (...args) => {
3168
+ t.errorfromjs(`${side}: ${stringify(args)}`);
3169
+ };
3170
+
3171
+ window.logsOverriddenForUnreal = true;
3172
+ }
3173
+ }
3174
+
3175
+ function stringify(things) {
3176
+ return things.map(a => typeof a === 'object' ? a instanceof Error ? a.message : JSON.stringify(a) : String(a)).join(' ');
3177
+ }
3178
+
3179
+ let registeredUnrealMessageProvider; // all lowercase is an annoying limitation of Unreal CEF BindUObject
3180
+
3181
+ /**
3182
+ * Initialized on dApp side
3183
+ */
3184
+ class UnrealMessageProvider extends BaseProviderTransport {
3185
+ constructor(walletAppURL) {
3186
+ super();
3187
+ this.walletURL = void 0;
3188
+
3189
+ this.register = () => {
3190
+ var _window$ue;
3191
+
3192
+ overrideLogs('dapp');
3193
+
3194
+ if (registeredUnrealMessageProvider) {
3195
+ // overriding the registered message provider
3196
+ registeredUnrealMessageProvider.unregister();
3197
+ registeredUnrealMessageProvider = this;
3198
+ } // listen for incoming messages from wallet
3199
+
3200
+
3201
+ if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport) {
3202
+ window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback;
3203
+ }
3204
+
3205
+ registeredUnrealMessageProvider = this;
3206
+ this._registered = true;
3207
+ console.log('registering transport!');
3208
+ };
3209
+
3210
+ this.unregister = () => {
3211
+ var _window$ue2, _window$ue2$sequencew;
3212
+
3213
+ this._registered = false;
3214
+ this.closeWallet(); // disable message listener
3215
+
3216
+ if (registeredUnrealMessageProvider === this) {
3217
+ registeredUnrealMessageProvider = undefined;
3218
+ }
3219
+
3220
+ if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromwallet) === this.onUnrealCallback) {
3221
+ delete window.ue.sequencewallettransport.onmessagefromwallet;
3222
+ } // clear event listeners
3223
+
3224
+
3225
+ this.events.removeAllListeners();
3226
+ };
3227
+
3228
+ this.openWallet = (path, intent, networkId) => {
3229
+ if (this.isOpened()) {
3230
+ // TODO focus wallet
3231
+ console.log('wallet already open!');
3232
+ return;
3233
+ }
3234
+
3235
+ console.log('opening wallet!'); // Instantiate new walletURL for this call
3236
+
3237
+ const walletURL = new URL(this.walletURL.href);
3238
+ const windowSessionParams = new WindowSessionParams();
3239
+
3240
+ if (path) {
3241
+ walletURL.pathname = path.toLowerCase();
3242
+ } // Set session, intent and network id on walletURL
3243
+
3244
+
3245
+ this._init = exports.InitState.NIL;
3246
+ this._sessionId = `${performance.now()}`;
3247
+ windowSessionParams.set('sid', this._sessionId);
3248
+
3249
+ if (intent) {
3250
+ // encode intent as base64 url-encoded param
3251
+ windowSessionParams.set('intent', utils.base64EncodeObject(intent));
3252
+ }
3253
+
3254
+ if (networkId) {
3255
+ windowSessionParams.set('net', `${networkId}`);
3256
+ } // serialize params
3257
+
3258
+
3259
+ walletURL.search = windowSessionParams.toString();
3260
+ console.log('opening wallet to', walletURL.href);
3261
+ window.open(walletURL.href);
3262
+ };
3263
+
3264
+ this.onUnrealCallback = message => {
3265
+ if (!message) {
3266
+ throw new Error('ProviderMessage object is empty');
3267
+ } // handle message with base message provider
3268
+
3269
+
3270
+ this.handleMessage(message);
3271
+ };
3272
+
3273
+ this.walletURL = new URL(walletAppURL);
3274
+ }
3275
+
3276
+ closeWallet() {
3277
+ this.close();
3278
+ } // onmessage, receives ProviderMessageResponse from the wallet unreal transport
3279
+
3280
+
3281
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
3282
+ sendMessage(message) {
3283
+ var _window$ue3, _window$ue3$sequencew;
3284
+
3285
+ const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message;
3286
+ console.log('Sending message to wallet:', postedMessage);
3287
+ (_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetowallet(postedMessage);
3288
+ }
3289
+
3290
+ }
3291
+
3292
+ /**
3293
+ * Initialized on Wallet side
3294
+ */
3295
+ class UnrealMessageHandler extends BaseWalletTransport {
3296
+ constructor(walletRequestHandler) {
3297
+ super(walletRequestHandler);
3298
+
3299
+ this.onMessageFromUnreal = request => {
3300
+ // Wallet always expects json-rpc request messages from a dapp
3301
+ utils.logger.debug('RECEIVED MESSAGE', request); // Handle message via the base transport
3302
+
3303
+ this.handleMessage(request);
3304
+ };
3305
+
3306
+ this.getUnrealTransportSession = windowParams => {
3307
+ const params = new WindowSessionParams(windowParams);
3308
+ return {
3309
+ sessionId: params.get('sid'),
3310
+ networkId: params.get('net'),
3311
+ intent: utils.base64DecodeObject(params.get('intent'))
3312
+ };
3313
+ };
3314
+
3315
+ this._init = exports.InitState.NIL;
3316
+ }
3317
+
3318
+ async register(windowHref) {
3319
+ var _window$ue;
3320
+
3321
+ if (((_window$ue = window.ue) == null ? void 0 : _window$ue.sequencewallettransport) === undefined) {
3322
+ return;
3323
+ }
3324
+
3325
+ overrideLogs('wallet'); // record open details (sessionId + default network) from the window url
3326
+
3327
+ const {
3328
+ search: rawParams
3329
+ } = new URL(windowHref || window.location.href);
3330
+ let session = this.getUnrealTransportSession(rawParams); // provider should always include sid when opening a new window
3331
+
3332
+ const isNewWindowSession = !!session.sessionId; // attempt to restore previous session in the case of a redirect or window reload
3333
+
3334
+ if (!isNewWindowSession) {
3335
+ session = await this.getCachedTransportSession();
3336
+ }
3337
+
3338
+ if (!session) {
3339
+ utils.logger.error('unreal session is undefined');
3340
+ return;
3341
+ } // listen for window-transport requests
3342
+
3343
+
3344
+ window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal;
3345
+ this._registered = true; // send open event to the app which opened us
3346
+
3347
+ this.open(session).then(opened => {
3348
+ if (!opened) {
3349
+ var _session;
3350
+
3351
+ const err = `failed to open to network ${(_session = session) == null ? void 0 : _session.networkId}`;
3352
+ utils.logger.error(err);
3353
+ this.notifyClose({
3354
+ message: err
3355
+ });
3356
+ window.close();
3357
+ }
3358
+ }).catch(e => {
3359
+ var _session2;
3360
+
3361
+ const err = `failed to open to network ${(_session2 = session) == null ? void 0 : _session2.networkId}, due to: ${e}`;
3362
+ utils.logger.error(err);
3363
+ this.notifyClose({
3364
+ message: err
3365
+ });
3366
+ window.close();
3367
+ });
3368
+ }
3369
+
3370
+ unregister() {
3371
+ var _window$ue2, _window$ue2$sequencew;
3372
+
3373
+ if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromsequencejs) === this.onMessageFromUnreal) {
3374
+ delete window.ue.sequencewallettransport.onmessagefromsequencejs;
3375
+ }
3376
+
3377
+ this._registered = false;
3378
+ } // onmessage is called when (the wallet) receives request messages from the dapp
3379
+ // over the unreal json-messaging transport
3380
+
3381
+
3382
+ // sendMessage sends message to the dapp window
3383
+ sendMessage(message) {
3384
+ var _window$ue3, _window$ue3$sequencew;
3385
+
3386
+ if (message.type !== exports.EventType.INIT && this._init !== exports.InitState.OK) {
3387
+ utils.logger.error('impossible state, should not be calling postMessage until inited');
3388
+ return;
3389
+ } // prepare payload
3390
+
3391
+
3392
+ const payload = JSON.stringify(message); // post-message to app.
3393
+
3394
+ (_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetosequencejs(payload);
3395
+ }
3396
+
3397
+ }
3398
+
3148
3399
  class WalletUtils {
3149
3400
  constructor(walletProvider) {
3150
3401
  var _this = this;
@@ -3250,7 +3501,7 @@ class Wallet {
3250
3501
  this.providers = void 0;
3251
3502
 
3252
3503
  this.init = () => {
3253
- var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6;
3504
+ var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6, _this$config$transpor7, _this$config$transpor8;
3254
3505
 
3255
3506
  if (this.transport.provider) {
3256
3507
  // init must have already been called
@@ -3282,6 +3533,11 @@ class Wallet {
3282
3533
  // this.transport.messageProvider.add(this.transport.extensionMessageProvider)
3283
3534
  }
3284
3535
 
3536
+ if ((_this$config$transpor7 = this.config.transports) != null && (_this$config$transpor8 = _this$config$transpor7.unrealTransport) != null && _this$config$transpor8.enabled) {
3537
+ this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL);
3538
+ this.transport.messageProvider.add(this.transport.unrealMessageProvider);
3539
+ }
3540
+
3285
3541
  this.transport.messageProvider.register(); // .....
3286
3542
 
3287
3543
  this.transport.allowProvider = network.allowProviderMiddleware(request => {
@@ -3839,6 +4095,8 @@ exports.ProxyMessageChannel = ProxyMessageChannel;
3839
4095
  exports.ProxyMessageChannelPort = ProxyMessageChannelPort;
3840
4096
  exports.ProxyMessageHandler = ProxyMessageHandler;
3841
4097
  exports.ProxyMessageProvider = ProxyMessageProvider;
4098
+ exports.UnrealMessageHandler = UnrealMessageHandler;
4099
+ exports.UnrealMessageProvider = UnrealMessageProvider;
3842
4100
  exports.Wallet = Wallet;
3843
4101
  exports.WalletRequestHandler = WalletRequestHandler;
3844
4102
  exports.Web3Provider = Web3Provider;
@@ -3145,6 +3145,257 @@ class BaseInjectedTransport extends eventemitter2.EventEmitter2 {
3145
3145
 
3146
3146
  }
3147
3147
 
3148
+ /**
3149
+ * This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
3150
+ */
3151
+ function overrideLogs(side) {
3152
+ var _window$ue;
3153
+
3154
+ if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport && !window.logsOverriddenForUnreal) {
3155
+ var _window$ue2;
3156
+
3157
+ const t = (_window$ue2 = window.ue) == null ? void 0 : _window$ue2.sequencewallettransport;
3158
+
3159
+ console.log = (...args) => {
3160
+ t.logfromjs(`${side}: ${stringify(args)}`);
3161
+ };
3162
+
3163
+ console.warn = (...args) => {
3164
+ t.warnfromjs(`${side}: ${stringify(args)}`);
3165
+ };
3166
+
3167
+ console.error = (...args) => {
3168
+ t.errorfromjs(`${side}: ${stringify(args)}`);
3169
+ };
3170
+
3171
+ window.logsOverriddenForUnreal = true;
3172
+ }
3173
+ }
3174
+
3175
+ function stringify(things) {
3176
+ return things.map(a => typeof a === 'object' ? a instanceof Error ? a.message : JSON.stringify(a) : String(a)).join(' ');
3177
+ }
3178
+
3179
+ let registeredUnrealMessageProvider; // all lowercase is an annoying limitation of Unreal CEF BindUObject
3180
+
3181
+ /**
3182
+ * Initialized on dApp side
3183
+ */
3184
+ class UnrealMessageProvider extends BaseProviderTransport {
3185
+ constructor(walletAppURL) {
3186
+ super();
3187
+ this.walletURL = void 0;
3188
+
3189
+ this.register = () => {
3190
+ var _window$ue;
3191
+
3192
+ overrideLogs('dapp');
3193
+
3194
+ if (registeredUnrealMessageProvider) {
3195
+ // overriding the registered message provider
3196
+ registeredUnrealMessageProvider.unregister();
3197
+ registeredUnrealMessageProvider = this;
3198
+ } // listen for incoming messages from wallet
3199
+
3200
+
3201
+ if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport) {
3202
+ window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback;
3203
+ }
3204
+
3205
+ registeredUnrealMessageProvider = this;
3206
+ this._registered = true;
3207
+ console.log('registering transport!');
3208
+ };
3209
+
3210
+ this.unregister = () => {
3211
+ var _window$ue2, _window$ue2$sequencew;
3212
+
3213
+ this._registered = false;
3214
+ this.closeWallet(); // disable message listener
3215
+
3216
+ if (registeredUnrealMessageProvider === this) {
3217
+ registeredUnrealMessageProvider = undefined;
3218
+ }
3219
+
3220
+ if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromwallet) === this.onUnrealCallback) {
3221
+ delete window.ue.sequencewallettransport.onmessagefromwallet;
3222
+ } // clear event listeners
3223
+
3224
+
3225
+ this.events.removeAllListeners();
3226
+ };
3227
+
3228
+ this.openWallet = (path, intent, networkId) => {
3229
+ if (this.isOpened()) {
3230
+ // TODO focus wallet
3231
+ console.log('wallet already open!');
3232
+ return;
3233
+ }
3234
+
3235
+ console.log('opening wallet!'); // Instantiate new walletURL for this call
3236
+
3237
+ const walletURL = new URL(this.walletURL.href);
3238
+ const windowSessionParams = new WindowSessionParams();
3239
+
3240
+ if (path) {
3241
+ walletURL.pathname = path.toLowerCase();
3242
+ } // Set session, intent and network id on walletURL
3243
+
3244
+
3245
+ this._init = exports.InitState.NIL;
3246
+ this._sessionId = `${performance.now()}`;
3247
+ windowSessionParams.set('sid', this._sessionId);
3248
+
3249
+ if (intent) {
3250
+ // encode intent as base64 url-encoded param
3251
+ windowSessionParams.set('intent', utils.base64EncodeObject(intent));
3252
+ }
3253
+
3254
+ if (networkId) {
3255
+ windowSessionParams.set('net', `${networkId}`);
3256
+ } // serialize params
3257
+
3258
+
3259
+ walletURL.search = windowSessionParams.toString();
3260
+ console.log('opening wallet to', walletURL.href);
3261
+ window.open(walletURL.href);
3262
+ };
3263
+
3264
+ this.onUnrealCallback = message => {
3265
+ if (!message) {
3266
+ throw new Error('ProviderMessage object is empty');
3267
+ } // handle message with base message provider
3268
+
3269
+
3270
+ this.handleMessage(message);
3271
+ };
3272
+
3273
+ this.walletURL = new URL(walletAppURL);
3274
+ }
3275
+
3276
+ closeWallet() {
3277
+ this.close();
3278
+ } // onmessage, receives ProviderMessageResponse from the wallet unreal transport
3279
+
3280
+
3281
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
3282
+ sendMessage(message) {
3283
+ var _window$ue3, _window$ue3$sequencew;
3284
+
3285
+ const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message;
3286
+ console.log('Sending message to wallet:', postedMessage);
3287
+ (_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetowallet(postedMessage);
3288
+ }
3289
+
3290
+ }
3291
+
3292
+ /**
3293
+ * Initialized on Wallet side
3294
+ */
3295
+ class UnrealMessageHandler extends BaseWalletTransport {
3296
+ constructor(walletRequestHandler) {
3297
+ super(walletRequestHandler);
3298
+
3299
+ this.onMessageFromUnreal = request => {
3300
+ // Wallet always expects json-rpc request messages from a dapp
3301
+ utils.logger.debug('RECEIVED MESSAGE', request); // Handle message via the base transport
3302
+
3303
+ this.handleMessage(request);
3304
+ };
3305
+
3306
+ this.getUnrealTransportSession = windowParams => {
3307
+ const params = new WindowSessionParams(windowParams);
3308
+ return {
3309
+ sessionId: params.get('sid'),
3310
+ networkId: params.get('net'),
3311
+ intent: utils.base64DecodeObject(params.get('intent'))
3312
+ };
3313
+ };
3314
+
3315
+ this._init = exports.InitState.NIL;
3316
+ }
3317
+
3318
+ async register(windowHref) {
3319
+ var _window$ue;
3320
+
3321
+ if (((_window$ue = window.ue) == null ? void 0 : _window$ue.sequencewallettransport) === undefined) {
3322
+ return;
3323
+ }
3324
+
3325
+ overrideLogs('wallet'); // record open details (sessionId + default network) from the window url
3326
+
3327
+ const {
3328
+ search: rawParams
3329
+ } = new URL(windowHref || window.location.href);
3330
+ let session = this.getUnrealTransportSession(rawParams); // provider should always include sid when opening a new window
3331
+
3332
+ const isNewWindowSession = !!session.sessionId; // attempt to restore previous session in the case of a redirect or window reload
3333
+
3334
+ if (!isNewWindowSession) {
3335
+ session = await this.getCachedTransportSession();
3336
+ }
3337
+
3338
+ if (!session) {
3339
+ utils.logger.error('unreal session is undefined');
3340
+ return;
3341
+ } // listen for window-transport requests
3342
+
3343
+
3344
+ window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal;
3345
+ this._registered = true; // send open event to the app which opened us
3346
+
3347
+ this.open(session).then(opened => {
3348
+ if (!opened) {
3349
+ var _session;
3350
+
3351
+ const err = `failed to open to network ${(_session = session) == null ? void 0 : _session.networkId}`;
3352
+ utils.logger.error(err);
3353
+ this.notifyClose({
3354
+ message: err
3355
+ });
3356
+ window.close();
3357
+ }
3358
+ }).catch(e => {
3359
+ var _session2;
3360
+
3361
+ const err = `failed to open to network ${(_session2 = session) == null ? void 0 : _session2.networkId}, due to: ${e}`;
3362
+ utils.logger.error(err);
3363
+ this.notifyClose({
3364
+ message: err
3365
+ });
3366
+ window.close();
3367
+ });
3368
+ }
3369
+
3370
+ unregister() {
3371
+ var _window$ue2, _window$ue2$sequencew;
3372
+
3373
+ if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromsequencejs) === this.onMessageFromUnreal) {
3374
+ delete window.ue.sequencewallettransport.onmessagefromsequencejs;
3375
+ }
3376
+
3377
+ this._registered = false;
3378
+ } // onmessage is called when (the wallet) receives request messages from the dapp
3379
+ // over the unreal json-messaging transport
3380
+
3381
+
3382
+ // sendMessage sends message to the dapp window
3383
+ sendMessage(message) {
3384
+ var _window$ue3, _window$ue3$sequencew;
3385
+
3386
+ if (message.type !== exports.EventType.INIT && this._init !== exports.InitState.OK) {
3387
+ utils.logger.error('impossible state, should not be calling postMessage until inited');
3388
+ return;
3389
+ } // prepare payload
3390
+
3391
+
3392
+ const payload = JSON.stringify(message); // post-message to app.
3393
+
3394
+ (_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetosequencejs(payload);
3395
+ }
3396
+
3397
+ }
3398
+
3148
3399
  class WalletUtils {
3149
3400
  constructor(walletProvider) {
3150
3401
  var _this = this;
@@ -3250,7 +3501,7 @@ class Wallet {
3250
3501
  this.providers = void 0;
3251
3502
 
3252
3503
  this.init = () => {
3253
- var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6;
3504
+ var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6, _this$config$transpor7, _this$config$transpor8;
3254
3505
 
3255
3506
  if (this.transport.provider) {
3256
3507
  // init must have already been called
@@ -3282,6 +3533,11 @@ class Wallet {
3282
3533
  // this.transport.messageProvider.add(this.transport.extensionMessageProvider)
3283
3534
  }
3284
3535
 
3536
+ if ((_this$config$transpor7 = this.config.transports) != null && (_this$config$transpor8 = _this$config$transpor7.unrealTransport) != null && _this$config$transpor8.enabled) {
3537
+ this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL);
3538
+ this.transport.messageProvider.add(this.transport.unrealMessageProvider);
3539
+ }
3540
+
3285
3541
  this.transport.messageProvider.register(); // .....
3286
3542
 
3287
3543
  this.transport.allowProvider = network.allowProviderMiddleware(request => {
@@ -3839,6 +4095,8 @@ exports.ProxyMessageChannel = ProxyMessageChannel;
3839
4095
  exports.ProxyMessageChannelPort = ProxyMessageChannelPort;
3840
4096
  exports.ProxyMessageHandler = ProxyMessageHandler;
3841
4097
  exports.ProxyMessageProvider = ProxyMessageProvider;
4098
+ exports.UnrealMessageHandler = UnrealMessageHandler;
4099
+ exports.UnrealMessageProvider = UnrealMessageProvider;
3842
4100
  exports.Wallet = Wallet;
3843
4101
  exports.WalletRequestHandler = WalletRequestHandler;
3844
4102
  exports.Web3Provider = Web3Provider;
@@ -3141,6 +3141,257 @@ class BaseInjectedTransport extends EventEmitter2 {
3141
3141
 
3142
3142
  }
3143
3143
 
3144
+ /**
3145
+ * This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
3146
+ */
3147
+ function overrideLogs(side) {
3148
+ var _window$ue;
3149
+
3150
+ if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport && !window.logsOverriddenForUnreal) {
3151
+ var _window$ue2;
3152
+
3153
+ const t = (_window$ue2 = window.ue) == null ? void 0 : _window$ue2.sequencewallettransport;
3154
+
3155
+ console.log = (...args) => {
3156
+ t.logfromjs(`${side}: ${stringify(args)}`);
3157
+ };
3158
+
3159
+ console.warn = (...args) => {
3160
+ t.warnfromjs(`${side}: ${stringify(args)}`);
3161
+ };
3162
+
3163
+ console.error = (...args) => {
3164
+ t.errorfromjs(`${side}: ${stringify(args)}`);
3165
+ };
3166
+
3167
+ window.logsOverriddenForUnreal = true;
3168
+ }
3169
+ }
3170
+
3171
+ function stringify(things) {
3172
+ return things.map(a => typeof a === 'object' ? a instanceof Error ? a.message : JSON.stringify(a) : String(a)).join(' ');
3173
+ }
3174
+
3175
+ let registeredUnrealMessageProvider; // all lowercase is an annoying limitation of Unreal CEF BindUObject
3176
+
3177
+ /**
3178
+ * Initialized on dApp side
3179
+ */
3180
+ class UnrealMessageProvider extends BaseProviderTransport {
3181
+ constructor(walletAppURL) {
3182
+ super();
3183
+ this.walletURL = void 0;
3184
+
3185
+ this.register = () => {
3186
+ var _window$ue;
3187
+
3188
+ overrideLogs('dapp');
3189
+
3190
+ if (registeredUnrealMessageProvider) {
3191
+ // overriding the registered message provider
3192
+ registeredUnrealMessageProvider.unregister();
3193
+ registeredUnrealMessageProvider = this;
3194
+ } // listen for incoming messages from wallet
3195
+
3196
+
3197
+ if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport) {
3198
+ window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback;
3199
+ }
3200
+
3201
+ registeredUnrealMessageProvider = this;
3202
+ this._registered = true;
3203
+ console.log('registering transport!');
3204
+ };
3205
+
3206
+ this.unregister = () => {
3207
+ var _window$ue2, _window$ue2$sequencew;
3208
+
3209
+ this._registered = false;
3210
+ this.closeWallet(); // disable message listener
3211
+
3212
+ if (registeredUnrealMessageProvider === this) {
3213
+ registeredUnrealMessageProvider = undefined;
3214
+ }
3215
+
3216
+ if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromwallet) === this.onUnrealCallback) {
3217
+ delete window.ue.sequencewallettransport.onmessagefromwallet;
3218
+ } // clear event listeners
3219
+
3220
+
3221
+ this.events.removeAllListeners();
3222
+ };
3223
+
3224
+ this.openWallet = (path, intent, networkId) => {
3225
+ if (this.isOpened()) {
3226
+ // TODO focus wallet
3227
+ console.log('wallet already open!');
3228
+ return;
3229
+ }
3230
+
3231
+ console.log('opening wallet!'); // Instantiate new walletURL for this call
3232
+
3233
+ const walletURL = new URL(this.walletURL.href);
3234
+ const windowSessionParams = new WindowSessionParams();
3235
+
3236
+ if (path) {
3237
+ walletURL.pathname = path.toLowerCase();
3238
+ } // Set session, intent and network id on walletURL
3239
+
3240
+
3241
+ this._init = InitState.NIL;
3242
+ this._sessionId = `${performance.now()}`;
3243
+ windowSessionParams.set('sid', this._sessionId);
3244
+
3245
+ if (intent) {
3246
+ // encode intent as base64 url-encoded param
3247
+ windowSessionParams.set('intent', base64EncodeObject(intent));
3248
+ }
3249
+
3250
+ if (networkId) {
3251
+ windowSessionParams.set('net', `${networkId}`);
3252
+ } // serialize params
3253
+
3254
+
3255
+ walletURL.search = windowSessionParams.toString();
3256
+ console.log('opening wallet to', walletURL.href);
3257
+ window.open(walletURL.href);
3258
+ };
3259
+
3260
+ this.onUnrealCallback = message => {
3261
+ if (!message) {
3262
+ throw new Error('ProviderMessage object is empty');
3263
+ } // handle message with base message provider
3264
+
3265
+
3266
+ this.handleMessage(message);
3267
+ };
3268
+
3269
+ this.walletURL = new URL(walletAppURL);
3270
+ }
3271
+
3272
+ closeWallet() {
3273
+ this.close();
3274
+ } // onmessage, receives ProviderMessageResponse from the wallet unreal transport
3275
+
3276
+
3277
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
3278
+ sendMessage(message) {
3279
+ var _window$ue3, _window$ue3$sequencew;
3280
+
3281
+ const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message;
3282
+ console.log('Sending message to wallet:', postedMessage);
3283
+ (_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetowallet(postedMessage);
3284
+ }
3285
+
3286
+ }
3287
+
3288
+ /**
3289
+ * Initialized on Wallet side
3290
+ */
3291
+ class UnrealMessageHandler extends BaseWalletTransport {
3292
+ constructor(walletRequestHandler) {
3293
+ super(walletRequestHandler);
3294
+
3295
+ this.onMessageFromUnreal = request => {
3296
+ // Wallet always expects json-rpc request messages from a dapp
3297
+ logger.debug('RECEIVED MESSAGE', request); // Handle message via the base transport
3298
+
3299
+ this.handleMessage(request);
3300
+ };
3301
+
3302
+ this.getUnrealTransportSession = windowParams => {
3303
+ const params = new WindowSessionParams(windowParams);
3304
+ return {
3305
+ sessionId: params.get('sid'),
3306
+ networkId: params.get('net'),
3307
+ intent: base64DecodeObject(params.get('intent'))
3308
+ };
3309
+ };
3310
+
3311
+ this._init = InitState.NIL;
3312
+ }
3313
+
3314
+ async register(windowHref) {
3315
+ var _window$ue;
3316
+
3317
+ if (((_window$ue = window.ue) == null ? void 0 : _window$ue.sequencewallettransport) === undefined) {
3318
+ return;
3319
+ }
3320
+
3321
+ overrideLogs('wallet'); // record open details (sessionId + default network) from the window url
3322
+
3323
+ const {
3324
+ search: rawParams
3325
+ } = new URL(windowHref || window.location.href);
3326
+ let session = this.getUnrealTransportSession(rawParams); // provider should always include sid when opening a new window
3327
+
3328
+ const isNewWindowSession = !!session.sessionId; // attempt to restore previous session in the case of a redirect or window reload
3329
+
3330
+ if (!isNewWindowSession) {
3331
+ session = await this.getCachedTransportSession();
3332
+ }
3333
+
3334
+ if (!session) {
3335
+ logger.error('unreal session is undefined');
3336
+ return;
3337
+ } // listen for window-transport requests
3338
+
3339
+
3340
+ window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal;
3341
+ this._registered = true; // send open event to the app which opened us
3342
+
3343
+ this.open(session).then(opened => {
3344
+ if (!opened) {
3345
+ var _session;
3346
+
3347
+ const err = `failed to open to network ${(_session = session) == null ? void 0 : _session.networkId}`;
3348
+ logger.error(err);
3349
+ this.notifyClose({
3350
+ message: err
3351
+ });
3352
+ window.close();
3353
+ }
3354
+ }).catch(e => {
3355
+ var _session2;
3356
+
3357
+ const err = `failed to open to network ${(_session2 = session) == null ? void 0 : _session2.networkId}, due to: ${e}`;
3358
+ logger.error(err);
3359
+ this.notifyClose({
3360
+ message: err
3361
+ });
3362
+ window.close();
3363
+ });
3364
+ }
3365
+
3366
+ unregister() {
3367
+ var _window$ue2, _window$ue2$sequencew;
3368
+
3369
+ if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromsequencejs) === this.onMessageFromUnreal) {
3370
+ delete window.ue.sequencewallettransport.onmessagefromsequencejs;
3371
+ }
3372
+
3373
+ this._registered = false;
3374
+ } // onmessage is called when (the wallet) receives request messages from the dapp
3375
+ // over the unreal json-messaging transport
3376
+
3377
+
3378
+ // sendMessage sends message to the dapp window
3379
+ sendMessage(message) {
3380
+ var _window$ue3, _window$ue3$sequencew;
3381
+
3382
+ if (message.type !== EventType.INIT && this._init !== InitState.OK) {
3383
+ logger.error('impossible state, should not be calling postMessage until inited');
3384
+ return;
3385
+ } // prepare payload
3386
+
3387
+
3388
+ const payload = JSON.stringify(message); // post-message to app.
3389
+
3390
+ (_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetosequencejs(payload);
3391
+ }
3392
+
3393
+ }
3394
+
3144
3395
  class WalletUtils {
3145
3396
  constructor(walletProvider) {
3146
3397
  var _this = this;
@@ -3246,7 +3497,7 @@ class Wallet {
3246
3497
  this.providers = void 0;
3247
3498
 
3248
3499
  this.init = () => {
3249
- var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6;
3500
+ var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6, _this$config$transpor7, _this$config$transpor8;
3250
3501
 
3251
3502
  if (this.transport.provider) {
3252
3503
  // init must have already been called
@@ -3278,6 +3529,11 @@ class Wallet {
3278
3529
  // this.transport.messageProvider.add(this.transport.extensionMessageProvider)
3279
3530
  }
3280
3531
 
3532
+ if ((_this$config$transpor7 = this.config.transports) != null && (_this$config$transpor8 = _this$config$transpor7.unrealTransport) != null && _this$config$transpor8.enabled) {
3533
+ this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL);
3534
+ this.transport.messageProvider.add(this.transport.unrealMessageProvider);
3535
+ }
3536
+
3281
3537
  this.transport.messageProvider.register(); // .....
3282
3538
 
3283
3539
  this.transport.allowProvider = allowProviderMiddleware(request => {
@@ -3817,4 +4073,4 @@ const getWallet = () => {
3817
4073
  return walletInstance;
3818
4074
  };
3819
4075
 
3820
- export { BaseInjectedTransport, BaseProviderTransport, BaseWalletTransport, CHANNEL_ID, DefaultProviderConfig, ErrSignedInRequired, EventType, ExtensionMessageHandler, ExtensionMessageProvider, InitState, LocalStorage, LocalStore, LocalWeb3Provider, MuxMessageProvider, OpenState, PROVIDER_OPEN_TIMEOUT, ProviderError, ProxyMessageChannel, ProxyMessageChannelPort, ProxyMessageHandler, ProxyMessageProvider, Wallet, WalletRequestHandler, Web3Provider, Web3Signer, WindowMessageHandler, WindowMessageProvider, WindowSessionParams, getWallet, initWallet, isBrowserExtension, isSequenceProvider, isValidMessageSignature, isValidSignature, isValidTypedDataSignature, isWalletUpToDate, messageToBytes, nextMessageIdx, prefixEIP191Message, recoverWalletConfig };
4076
+ export { BaseInjectedTransport, BaseProviderTransport, BaseWalletTransport, CHANNEL_ID, DefaultProviderConfig, ErrSignedInRequired, EventType, ExtensionMessageHandler, ExtensionMessageProvider, InitState, LocalStorage, LocalStore, LocalWeb3Provider, MuxMessageProvider, OpenState, PROVIDER_OPEN_TIMEOUT, ProviderError, ProxyMessageChannel, ProxyMessageChannelPort, ProxyMessageHandler, ProxyMessageProvider, UnrealMessageHandler, UnrealMessageProvider, Wallet, WalletRequestHandler, Web3Provider, Web3Signer, WindowMessageHandler, WindowMessageProvider, WindowSessionParams, getWallet, initWallet, isBrowserExtension, isSequenceProvider, isValidMessageSignature, isValidSignature, isValidTypedDataSignature, isWalletUpToDate, messageToBytes, nextMessageIdx, prefixEIP191Message, recoverWalletConfig };
@@ -5,3 +5,4 @@ export * from './mux-transport';
5
5
  export * from './window-transport';
6
6
  export * from './wallet-request-handler';
7
7
  export * from './extension-transport';
8
+ export * from './unreal-transport';
@@ -0,0 +1,2 @@
1
+ export * from './unreal-message-provider';
2
+ export * from './unreal-message-handler';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
3
+ */
4
+ export declare function overrideLogs(side: 'dapp' | 'wallet'): void;
@@ -0,0 +1,14 @@
1
+ import { ProviderMessage } from '../../types';
2
+ import { WalletRequestHandler } from '../wallet-request-handler';
3
+ import { BaseWalletTransport } from '../base-wallet-transport';
4
+ /**
5
+ * Initialized on Wallet side
6
+ */
7
+ export declare class UnrealMessageHandler extends BaseWalletTransport {
8
+ constructor(walletRequestHandler: WalletRequestHandler);
9
+ register(windowHref?: string | URL): Promise<void>;
10
+ unregister(): void;
11
+ private onMessageFromUnreal;
12
+ sendMessage(message: ProviderMessage<any>): void;
13
+ private getUnrealTransportSession;
14
+ }
@@ -0,0 +1,15 @@
1
+ import { OpenWalletIntent, ProviderMessage } from '../../types';
2
+ import { BaseProviderTransport } from '../base-provider-transport';
3
+ /**
4
+ * Initialized on dApp side
5
+ */
6
+ export declare class UnrealMessageProvider extends BaseProviderTransport {
7
+ private walletURL;
8
+ constructor(walletAppURL: string);
9
+ register: () => void;
10
+ unregister: () => void;
11
+ openWallet: (path?: string | undefined, intent?: OpenWalletIntent | undefined, networkId?: string | number | undefined) => void;
12
+ closeWallet(): void;
13
+ private onUnrealCallback;
14
+ sendMessage(message: ProviderMessage<unknown>): void;
15
+ }
@@ -95,6 +95,9 @@ export interface ProviderConfig {
95
95
  enabled: boolean;
96
96
  runtime: Runtime.Static;
97
97
  };
98
+ unrealTransport?: {
99
+ enabled: boolean;
100
+ };
98
101
  };
99
102
  walletContext?: WalletContext;
100
103
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xsequence/provider",
3
- "version": "0.40.3",
3
+ "version": "0.40.4",
4
4
  "description": "provider sub-package for Sequence",
5
5
  "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/provider",
6
6
  "source": "src/index.ts",
@@ -13,13 +13,13 @@
13
13
  "typecheck": "tsc --noEmit"
14
14
  },
15
15
  "dependencies": {
16
- "@0xsequence/abi": "^0.40.3",
17
- "@0xsequence/auth": "^0.40.3",
18
- "@0xsequence/config": "^0.40.3",
19
- "@0xsequence/network": "^0.40.3",
20
- "@0xsequence/transactions": "^0.40.3",
21
- "@0xsequence/utils": "^0.40.3",
22
- "@0xsequence/wallet": "^0.40.3",
16
+ "@0xsequence/abi": "^0.40.4",
17
+ "@0xsequence/auth": "^0.40.4",
18
+ "@0xsequence/config": "^0.40.4",
19
+ "@0xsequence/network": "^0.40.4",
20
+ "@0xsequence/transactions": "^0.40.4",
21
+ "@0xsequence/utils": "^0.40.4",
22
+ "@0xsequence/wallet": "^0.40.4",
23
23
  "@ethersproject/abstract-signer": "^5.5.0",
24
24
  "@ethersproject/hash": "^5.5.0",
25
25
  "@ethersproject/providers": "^5.5.1",
@@ -5,3 +5,4 @@ export * from './mux-transport'
5
5
  export * from './window-transport'
6
6
  export * from './wallet-request-handler'
7
7
  export * from './extension-transport'
8
+ export * from './unreal-transport'
@@ -0,0 +1,2 @@
1
+ export * from './unreal-message-provider'
2
+ export * from './unreal-message-handler'
@@ -0,0 +1,36 @@
1
+ interface UnrealInjectedWindow {
2
+ ue?: {
3
+ sequencewallettransport?: {
4
+ logfromjs: (message: string) => void
5
+ warnfromjs: (message: string) => void
6
+ errorfromjs: (message: string) => void
7
+ }
8
+ }
9
+ logsOverriddenForUnreal?: boolean
10
+ }
11
+ declare const window: Window & typeof globalThis & UnrealInjectedWindow
12
+
13
+ /**
14
+ * This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
15
+ */
16
+ export function overrideLogs(side: 'dapp' | 'wallet') {
17
+ if (window.ue?.sequencewallettransport && !window.logsOverriddenForUnreal) {
18
+ const t = window.ue?.sequencewallettransport
19
+ console.log = (...args: unknown[]) => {
20
+ t.logfromjs(`${side}: ${stringify(args)}`)
21
+ }
22
+ console.warn = (...args: unknown[]) => {
23
+ t.warnfromjs(`${side}: ${stringify(args)}`)
24
+ }
25
+ console.error = (...args: unknown[]) => {
26
+ t.errorfromjs(`${side}: ${stringify(args)}`)
27
+ }
28
+ window.logsOverriddenForUnreal = true
29
+ }
30
+ }
31
+
32
+ function stringify(things: unknown[]): string {
33
+ return things
34
+ .map(a => (typeof a === 'object' ? (a instanceof Error ? a.message : JSON.stringify(a)) : String(a)))
35
+ .join(' ')
36
+ }
@@ -0,0 +1,121 @@
1
+ import {
2
+ ProviderMessageRequest,
3
+ ProviderMessage,
4
+ EventType,
5
+ InitState,
6
+ WindowSessionParams,
7
+ OpenWalletIntent,
8
+ ProviderRpcError,
9
+ TransportSession
10
+ } from '../../types'
11
+ import { WalletRequestHandler } from '../wallet-request-handler'
12
+ import { BaseWalletTransport } from '../base-wallet-transport'
13
+ import { logger, base64DecodeObject } from '@0xsequence/utils'
14
+ import { overrideLogs } from './overridelogs'
15
+
16
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
17
+ interface UnrealInjectedWalletWindow {
18
+ ue?: {
19
+ sequencewallettransport?: {
20
+ onmessagefromsequencejs?: (message: ProviderMessageRequest) => void
21
+ sendmessagetosequencejs: (message: string) => void
22
+ }
23
+ }
24
+ }
25
+ declare const window: Window & typeof globalThis & UnrealInjectedWalletWindow
26
+
27
+ /**
28
+ * Initialized on Wallet side
29
+ */
30
+ export class UnrealMessageHandler extends BaseWalletTransport {
31
+ constructor(walletRequestHandler: WalletRequestHandler) {
32
+ super(walletRequestHandler)
33
+ this._init = InitState.NIL
34
+ }
35
+
36
+ async register(windowHref?: string | URL) {
37
+ if (window.ue?.sequencewallettransport === undefined) {
38
+ return
39
+ }
40
+ overrideLogs('wallet')
41
+
42
+ // record open details (sessionId + default network) from the window url
43
+ const { search: rawParams } = new URL(windowHref || window.location.href)
44
+
45
+ let session: TransportSession | null = this.getUnrealTransportSession(rawParams)
46
+
47
+ // provider should always include sid when opening a new window
48
+ const isNewWindowSession = !!session.sessionId
49
+
50
+ // attempt to restore previous session in the case of a redirect or window reload
51
+ if (!isNewWindowSession) {
52
+ session = await this.getCachedTransportSession()
53
+ }
54
+
55
+ if (!session) {
56
+ logger.error('unreal session is undefined')
57
+ return
58
+ }
59
+
60
+ // listen for window-transport requests
61
+ window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal
62
+ this._registered = true
63
+
64
+ // send open event to the app which opened us
65
+ this.open(session)
66
+ .then(opened => {
67
+ if (!opened) {
68
+ const err = `failed to open to network ${session?.networkId}`
69
+ logger.error(err)
70
+ this.notifyClose({ message: err } as ProviderRpcError)
71
+ window.close()
72
+ }
73
+ })
74
+ .catch(e => {
75
+ const err = `failed to open to network ${session?.networkId}, due to: ${e}`
76
+ logger.error(err)
77
+ this.notifyClose({ message: err } as ProviderRpcError)
78
+ window.close()
79
+ })
80
+ }
81
+
82
+ unregister() {
83
+ if (window.ue?.sequencewallettransport?.onmessagefromsequencejs === this.onMessageFromUnreal) {
84
+ delete window.ue.sequencewallettransport.onmessagefromsequencejs
85
+ }
86
+ this._registered = false
87
+ }
88
+
89
+ // onmessage is called when (the wallet) receives request messages from the dapp
90
+ // over the unreal json-messaging transport
91
+ private onMessageFromUnreal = (request: ProviderMessageRequest) => {
92
+ // Wallet always expects json-rpc request messages from a dapp
93
+
94
+ logger.debug('RECEIVED MESSAGE', request)
95
+
96
+ // Handle message via the base transport
97
+ this.handleMessage(request)
98
+ }
99
+
100
+ // sendMessage sends message to the dapp window
101
+ sendMessage(message: ProviderMessage<any>) {
102
+ if (message.type !== EventType.INIT && this._init !== InitState.OK) {
103
+ logger.error('impossible state, should not be calling postMessage until inited')
104
+ return
105
+ }
106
+ // prepare payload
107
+ const payload = JSON.stringify(message)
108
+
109
+ // post-message to app.
110
+ window.ue?.sequencewallettransport?.sendmessagetosequencejs(payload)
111
+ }
112
+
113
+ private getUnrealTransportSession = (windowParams: string | undefined): TransportSession => {
114
+ const params = new WindowSessionParams(windowParams)
115
+ return {
116
+ sessionId: params.get('sid'),
117
+ networkId: params.get('net'),
118
+ intent: base64DecodeObject<OpenWalletIntent>(params.get('intent'))
119
+ }
120
+ }
121
+ }
@@ -0,0 +1,121 @@
1
+ import { OpenWalletIntent, ProviderMessage, InitState, WindowSessionParams } from '../../types'
2
+ import { BaseProviderTransport } from '../base-provider-transport'
3
+ import { base64EncodeObject } from '@0xsequence/utils'
4
+ import { overrideLogs } from './overridelogs'
5
+
6
+ let registeredUnrealMessageProvider: UnrealMessageProvider | undefined
7
+
8
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
9
+ interface UnrealInjectedSequenceJSWindow {
10
+ ue?: {
11
+ sequencewallettransport?: {
12
+ onmessagefromwallet?: (message: ProviderMessage<any>) => void
13
+ sendmessagetowallet: (message: string) => void
14
+ }
15
+ }
16
+ }
17
+
18
+ declare const window: Window & typeof globalThis & UnrealInjectedSequenceJSWindow
19
+
20
+ /**
21
+ * Initialized on dApp side
22
+ */
23
+ export class UnrealMessageProvider extends BaseProviderTransport {
24
+ private walletURL: URL
25
+
26
+ constructor(walletAppURL: string) {
27
+ super()
28
+ this.walletURL = new URL(walletAppURL)
29
+ }
30
+
31
+ register = () => {
32
+ overrideLogs('dapp')
33
+ if (registeredUnrealMessageProvider) {
34
+ // overriding the registered message provider
35
+ registeredUnrealMessageProvider.unregister()
36
+ registeredUnrealMessageProvider = this
37
+ }
38
+
39
+ // listen for incoming messages from wallet
40
+ if (window.ue?.sequencewallettransport) {
41
+ window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback
42
+ }
43
+ registeredUnrealMessageProvider = this
44
+
45
+ this._registered = true
46
+ console.log('registering transport!')
47
+ }
48
+
49
+ unregister = () => {
50
+ this._registered = false
51
+ this.closeWallet()
52
+
53
+ // disable message listener
54
+ if (registeredUnrealMessageProvider === this) {
55
+ registeredUnrealMessageProvider = undefined
56
+ }
57
+ if (window.ue?.sequencewallettransport?.onmessagefromwallet === this.onUnrealCallback) {
58
+ delete window.ue.sequencewallettransport.onmessagefromwallet
59
+ }
60
+
61
+ // clear event listeners
62
+ this.events.removeAllListeners()
63
+ }
64
+
65
+ openWallet = (path?: string, intent?: OpenWalletIntent, networkId?: string | number): void => {
66
+ if (this.isOpened()) {
67
+ // TODO focus wallet
68
+ console.log('wallet already open!')
69
+ return
70
+ }
71
+
72
+ console.log('opening wallet!')
73
+ // Instantiate new walletURL for this call
74
+ const walletURL = new URL(this.walletURL.href)
75
+ const windowSessionParams = new WindowSessionParams()
76
+
77
+ if (path) {
78
+ walletURL.pathname = path.toLowerCase()
79
+ }
80
+
81
+ // Set session, intent and network id on walletURL
82
+ this._init = InitState.NIL
83
+ this._sessionId = `${performance.now()}`
84
+ windowSessionParams.set('sid', this._sessionId)
85
+
86
+ if (intent) {
87
+ // encode intent as base64 url-encoded param
88
+ windowSessionParams.set('intent', base64EncodeObject(intent))
89
+ }
90
+ if (networkId) {
91
+ windowSessionParams.set('net', `${networkId}`)
92
+ }
93
+ // serialize params
94
+ walletURL.search = windowSessionParams.toString()
95
+
96
+ console.log('opening wallet to', walletURL.href)
97
+
98
+ window.open(walletURL.href)
99
+ }
100
+
101
+ closeWallet() {
102
+ this.close()
103
+ }
104
+
105
+ // onmessage, receives ProviderMessageResponse from the wallet unreal transport
106
+ private onUnrealCallback = (message: ProviderMessage<any>) => {
107
+ if (!message) {
108
+ throw new Error('ProviderMessage object is empty')
109
+ }
110
+
111
+ // handle message with base message provider
112
+ this.handleMessage(message)
113
+ }
114
+
115
+ // all lowercase is an annoying limitation of Unreal CEF BindUObject
116
+ sendMessage(message: ProviderMessage<unknown>) {
117
+ const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message
118
+ console.log('Sending message to wallet:', postedMessage)
119
+ window.ue?.sequencewallettransport?.sendmessagetowallet(postedMessage)
120
+ }
121
+ }
package/src/wallet.ts CHANGED
@@ -19,9 +19,15 @@ import {
19
19
  } from '@0xsequence/network'
20
20
  import { WalletConfig, WalletState } from '@0xsequence/config'
21
21
  import { logger } from '@0xsequence/utils'
22
- import { JsonRpcProvider, JsonRpcSigner, ExternalProvider } from '@ethersproject/providers'
22
+ import { JsonRpcProvider } from '@ethersproject/providers'
23
23
  import { Web3Provider, Web3Signer } from './provider'
24
- import { MuxMessageProvider, WindowMessageProvider, ProxyMessageProvider, ProxyMessageChannelPort } from './transports'
24
+ import {
25
+ MuxMessageProvider,
26
+ WindowMessageProvider,
27
+ ProxyMessageProvider,
28
+ ProxyMessageChannelPort,
29
+ UnrealMessageProvider
30
+ } from './transports'
25
31
  import { WalletSession, ProviderEventTypes, ConnectOptions, OpenWalletIntent, ConnectDetails } from './types'
26
32
  import { ethers } from 'ethers'
27
33
  import { ExtensionMessageProvider } from './transports/extension-transport/extension-message-provider'
@@ -36,12 +42,12 @@ export interface WalletProvider {
36
42
 
37
43
  isConnected(): boolean
38
44
  getSession(): WalletSession | undefined
39
-
45
+
40
46
  getAddress(): Promise<string>
41
47
  getNetworks(chainId?: ChainIdLike): Promise<NetworkConfig[]>
42
48
  getChainId(): Promise<number>
43
49
  getAuthChainId(): Promise<number>
44
-
50
+
45
51
  isOpened(): boolean
46
52
  openWallet(path?: string, intent?: OpenWalletIntent, networkId?: string | number): Promise<boolean>
47
53
  closeWallet(): void
@@ -85,6 +91,7 @@ export class Wallet implements WalletProvider {
85
91
  windowMessageProvider?: WindowMessageProvider
86
92
  proxyMessageProvider?: ProxyMessageProvider
87
93
  extensionMessageProvider?: ExtensionMessageProvider
94
+ unrealMessageProvider?: UnrealMessageProvider
88
95
  }
89
96
 
90
97
  private networks: NetworkConfig[]
@@ -147,6 +154,10 @@ export class Wallet implements WalletProvider {
147
154
  //
148
155
  // this.transport.messageProvider.add(this.transport.extensionMessageProvider)
149
156
  }
157
+ if (this.config.transports?.unrealTransport?.enabled) {
158
+ this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL)
159
+ this.transport.messageProvider.add(this.transport.unrealMessageProvider)
160
+ }
150
161
  this.transport.messageProvider.register()
151
162
 
152
163
  // .....
@@ -692,6 +703,11 @@ export interface ProviderConfig {
692
703
  enabled: boolean
693
704
  runtime: Runtime.Static
694
705
  }
706
+
707
+ // Unreal Engine transport (optional)
708
+ unrealTransport?: {
709
+ enabled: boolean
710
+ }
695
711
  }
696
712
 
697
713
  // Sequence Wallet Modules Context override. By default (and recommended), the