@swype-org/deposit 0.3.13 → 0.3.15

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/dist/react.cjs CHANGED
@@ -93,6 +93,414 @@ function parseCloseRequest(data) {
93
93
  }
94
94
  return { type: "blink:close-request" };
95
95
  }
96
+ function parseIframeReady(data) {
97
+ if (!data || typeof data !== "object") {
98
+ return null;
99
+ }
100
+ const msg = data;
101
+ if (msg.type !== "blink:iframe-ready") {
102
+ return null;
103
+ }
104
+ return { type: "blink:iframe-ready" };
105
+ }
106
+ function buildSignedPayloadMessage(merchantId, payload, signature) {
107
+ return {
108
+ type: "blink:signed-payload",
109
+ merchantId,
110
+ payload,
111
+ signature
112
+ };
113
+ }
114
+
115
+ // src/walletBridge/discover.ts
116
+ function createWalletDiscoverer() {
117
+ if (typeof window === "undefined") {
118
+ return makeNoopHandle();
119
+ }
120
+ const registry = /* @__PURE__ */ new Map();
121
+ const listeners = /* @__PURE__ */ new Set();
122
+ let destroyed = false;
123
+ const onAnnounce = (event) => {
124
+ if (destroyed) return;
125
+ const detail = event.detail;
126
+ if (!isValidProviderDetail(detail)) {
127
+ console.info("[blink-bridge:parent] dropping malformed EIP-6963 announcement", {
128
+ rawInfo: event.detail && event.detail.info
129
+ });
130
+ return;
131
+ }
132
+ const existing = registry.get(detail.info.uuid);
133
+ if (existing && existing.provider === detail.provider) {
134
+ return;
135
+ }
136
+ console.info("[blink-bridge:parent] EIP-6963 announceProvider", {
137
+ rdns: detail.info.rdns,
138
+ name: detail.info.name,
139
+ uuid: detail.info.uuid
140
+ });
141
+ registry.set(detail.info.uuid, {
142
+ info: { ...detail.info },
143
+ provider: detail.provider
144
+ });
145
+ notify();
146
+ };
147
+ window.addEventListener("eip6963:announceProvider", onAnnounce);
148
+ requestProviders();
149
+ const RESWEEP_INTERVALS_MS = [500, 1500, 3e3, 6e3];
150
+ const reSweepTimers = [];
151
+ for (const ms of RESWEEP_INTERVALS_MS) {
152
+ reSweepTimers.push(
153
+ setTimeout(() => {
154
+ if (!destroyed) requestProviders();
155
+ }, ms)
156
+ );
157
+ }
158
+ function requestProviders() {
159
+ try {
160
+ window.dispatchEvent(new Event("eip6963:requestProvider"));
161
+ } catch {
162
+ }
163
+ }
164
+ function notify() {
165
+ const snapshot = list();
166
+ for (const listener of listeners) {
167
+ try {
168
+ listener(snapshot);
169
+ } catch {
170
+ }
171
+ }
172
+ }
173
+ function list() {
174
+ return [...registry.values()];
175
+ }
176
+ return {
177
+ list,
178
+ get(uuid) {
179
+ return registry.get(uuid)?.provider;
180
+ },
181
+ subscribe(listener) {
182
+ listeners.add(listener);
183
+ return () => {
184
+ listeners.delete(listener);
185
+ };
186
+ },
187
+ requestProviders,
188
+ destroy() {
189
+ if (destroyed) return;
190
+ destroyed = true;
191
+ window.removeEventListener("eip6963:announceProvider", onAnnounce);
192
+ for (const t of reSweepTimers) clearTimeout(t);
193
+ registry.clear();
194
+ listeners.clear();
195
+ }
196
+ };
197
+ }
198
+ function makeNoopHandle() {
199
+ return {
200
+ list: () => [],
201
+ get: () => void 0,
202
+ subscribe: () => () => {
203
+ },
204
+ requestProviders: () => {
205
+ },
206
+ destroy: () => {
207
+ }
208
+ };
209
+ }
210
+ function isValidProviderDetail(value) {
211
+ if (!value || typeof value !== "object") return false;
212
+ const detail = value;
213
+ const info = detail.info;
214
+ const provider = detail.provider;
215
+ if (!info || !provider) return false;
216
+ if (typeof info.uuid !== "string" || info.uuid.length === 0) return false;
217
+ if (typeof info.name !== "string") return false;
218
+ if (typeof info.rdns !== "string") return false;
219
+ if (typeof provider.request !== "function") return false;
220
+ return true;
221
+ }
222
+
223
+ // src/walletBridge/protocol.ts
224
+ var BRIDGE_PROTOCOL_VERSION = 1;
225
+ var ALLOWED_RPC_METHODS = /* @__PURE__ */ new Set([
226
+ // Read
227
+ "eth_accounts",
228
+ "eth_blockNumber",
229
+ "eth_call",
230
+ "eth_chainId",
231
+ "eth_estimateGas",
232
+ "eth_gasPrice",
233
+ "eth_getBalance",
234
+ "eth_getCode",
235
+ "eth_getStorageAt",
236
+ "eth_getTransactionByHash",
237
+ "eth_getTransactionCount",
238
+ "eth_getTransactionReceipt",
239
+ "net_version",
240
+ "wallet_getCapabilities",
241
+ "wallet_getCallsStatus",
242
+ // Write / sign
243
+ "eth_requestAccounts",
244
+ "eth_sendTransaction",
245
+ "eth_sendRawTransaction",
246
+ "eth_sign",
247
+ "personal_sign",
248
+ "eth_signTypedData",
249
+ "eth_signTypedData_v3",
250
+ "eth_signTypedData_v4",
251
+ "wallet_addEthereumChain",
252
+ "wallet_switchEthereumChain",
253
+ "wallet_sendCalls",
254
+ "wallet_watchAsset"
255
+ ]);
256
+ var FORWARDED_PROVIDER_EVENTS = [
257
+ "accountsChanged",
258
+ "chainChanged",
259
+ "connect",
260
+ "disconnect",
261
+ "message"
262
+ ];
263
+ function parseBridgeMessage(data) {
264
+ if (!data || typeof data !== "object") return null;
265
+ const msg = data;
266
+ if (msg.protocolVersion !== BRIDGE_PROTOCOL_VERSION) return null;
267
+ switch (msg.type) {
268
+ case "blink:bridge-hello":
269
+ return msg;
270
+ case "blink:wallets-advertised":
271
+ return Array.isArray(msg.wallets) ? msg : null;
272
+ case "blink:rpc-request":
273
+ if (typeof msg.uuid !== "string" || typeof msg.id !== "string" || typeof msg.method !== "string") {
274
+ return null;
275
+ }
276
+ return msg;
277
+ case "blink:rpc-response":
278
+ if (typeof msg.id !== "string") return null;
279
+ return msg;
280
+ case "blink:rpc-event":
281
+ if (typeof msg.uuid !== "string" || typeof msg.event !== "string" || !Array.isArray(msg.args)) {
282
+ return null;
283
+ }
284
+ return msg;
285
+ case "blink:resolve-by-flag":
286
+ if (typeof msg.id !== "string" || !Array.isArray(msg.flags)) return null;
287
+ if (!msg.flags.every((f) => typeof f === "string" && f.length > 0)) return null;
288
+ return msg;
289
+ case "blink:resolve-by-flag-response":
290
+ if (typeof msg.id !== "string") return null;
291
+ if (msg.match !== null && (typeof msg.match !== "object" || !msg.match)) return null;
292
+ return msg;
293
+ default:
294
+ return null;
295
+ }
296
+ }
297
+
298
+ // src/walletBridge/rpcHost.ts
299
+ function attachRpcHost(options) {
300
+ const { iframeWindow, iframeOrigin, discoverer } = options;
301
+ const log = options.log ?? noopLog;
302
+ if (typeof window === "undefined") {
303
+ return { detach: () => {
304
+ } };
305
+ }
306
+ let detached = false;
307
+ const subscriptions = /* @__PURE__ */ new Map();
308
+ const unsubscribeFromDiscoverer = discoverer.subscribe((snapshot) => {
309
+ if (detached) return;
310
+ advertiseWallets(snapshot);
311
+ });
312
+ function postToIframe(message) {
313
+ if (detached) return;
314
+ try {
315
+ iframeWindow.postMessage(message, iframeOrigin);
316
+ } catch (err) {
317
+ log("postMessage to iframe failed", {
318
+ error: err instanceof Error ? err.message : String(err)
319
+ });
320
+ }
321
+ }
322
+ function advertiseWallets(snapshot) {
323
+ const wallets = snapshot.map((entry) => ({
324
+ uuid: entry.info.uuid,
325
+ rdns: entry.info.rdns,
326
+ name: entry.info.name,
327
+ icon: entry.info.icon
328
+ }));
329
+ console.info("[blink-bridge:parent] advertising wallets", wallets.map((w) => ({
330
+ rdns: w.rdns,
331
+ name: w.name
332
+ })));
333
+ const message = {
334
+ type: "blink:wallets-advertised",
335
+ protocolVersion: BRIDGE_PROTOCOL_VERSION,
336
+ wallets
337
+ };
338
+ postToIframe(message);
339
+ }
340
+ function ensureSubscription(uuid, provider) {
341
+ if (subscriptions.has(uuid)) return;
342
+ if (typeof provider.on !== "function") {
343
+ subscriptions.set(uuid, { provider, listeners: /* @__PURE__ */ new Map() });
344
+ return;
345
+ }
346
+ const record = { provider, listeners: /* @__PURE__ */ new Map() };
347
+ for (const event of FORWARDED_PROVIDER_EVENTS) {
348
+ const listener = (...args) => {
349
+ const eventMessage = {
350
+ type: "blink:rpc-event",
351
+ protocolVersion: BRIDGE_PROTOCOL_VERSION,
352
+ uuid,
353
+ event,
354
+ args
355
+ };
356
+ postToIframe(eventMessage);
357
+ };
358
+ try {
359
+ provider.on(event, listener);
360
+ record.listeners.set(event, listener);
361
+ } catch (err) {
362
+ log(`provider.on('${event}') threw \u2014 skipping that event`, {
363
+ uuid,
364
+ error: err instanceof Error ? err.message : String(err)
365
+ });
366
+ }
367
+ }
368
+ subscriptions.set(uuid, record);
369
+ }
370
+ function unsubscribeAll() {
371
+ for (const [, record] of subscriptions) {
372
+ const provider = record.provider;
373
+ if (typeof provider.removeListener !== "function") continue;
374
+ for (const [event, listener] of record.listeners) {
375
+ try {
376
+ provider.removeListener(event, listener);
377
+ } catch {
378
+ }
379
+ }
380
+ }
381
+ subscriptions.clear();
382
+ }
383
+ function sendError(id, code, message, data) {
384
+ const response = {
385
+ type: "blink:rpc-response",
386
+ protocolVersion: BRIDGE_PROTOCOL_VERSION,
387
+ id,
388
+ error: data === void 0 ? { code, message } : { code, message, data }
389
+ };
390
+ postToIframe(response);
391
+ }
392
+ function sendResult(id, result) {
393
+ const response = {
394
+ type: "blink:rpc-response",
395
+ protocolVersion: BRIDGE_PROTOCOL_VERSION,
396
+ id,
397
+ result
398
+ };
399
+ postToIframe(response);
400
+ }
401
+ const onMessage = (event) => {
402
+ if (detached) return;
403
+ if (event.source !== iframeWindow) return;
404
+ if (event.origin !== iframeOrigin) return;
405
+ const message = parseBridgeMessage(event.data);
406
+ if (!message) return;
407
+ switch (message.type) {
408
+ case "blink:bridge-hello": {
409
+ advertiseWallets(discoverer.list());
410
+ discoverer.requestProviders();
411
+ return;
412
+ }
413
+ case "blink:rpc-request": {
414
+ const { id, uuid, method, params } = message;
415
+ console.info("[blink-bridge:parent] rpc-request", { uuid, method });
416
+ if (!ALLOWED_RPC_METHODS.has(method)) {
417
+ log("rejecting non-allowlisted method", { uuid, method });
418
+ sendError(id, -32601, `Method not allowed: ${method}`);
419
+ return;
420
+ }
421
+ const provider = discoverer.get(uuid);
422
+ if (!provider) {
423
+ log("no provider for uuid", { uuid, method });
424
+ sendError(id, -32602, `Unknown wallet: ${uuid}`);
425
+ return;
426
+ }
427
+ ensureSubscription(uuid, provider);
428
+ provider.request({ method, params }).then((result) => {
429
+ console.info("[blink-bridge:parent] rpc-result", { uuid, method, ok: true });
430
+ sendResult(id, result);
431
+ }).catch((err) => {
432
+ const { code, message: errMessage, data } = normalizeProviderError(err);
433
+ console.info("[blink-bridge:parent] rpc-error", { uuid, method, code, message: errMessage });
434
+ sendError(id, code, errMessage, data);
435
+ });
436
+ return;
437
+ }
438
+ case "blink:resolve-by-flag": {
439
+ const match = resolveByFlag(discoverer.list(), message.flags, log);
440
+ console.info("[blink-bridge:parent] resolveByFlag", {
441
+ flags: message.flags,
442
+ match: match ? { rdns: match.rdns, flag: match.flag } : null
443
+ });
444
+ const response = {
445
+ type: "blink:resolve-by-flag-response",
446
+ protocolVersion: BRIDGE_PROTOCOL_VERSION,
447
+ id: message.id,
448
+ match
449
+ };
450
+ postToIframe(response);
451
+ return;
452
+ }
453
+ case "blink:wallets-advertised":
454
+ case "blink:rpc-response":
455
+ case "blink:rpc-event":
456
+ case "blink:resolve-by-flag-response":
457
+ return;
458
+ }
459
+ };
460
+ window.addEventListener("message", onMessage);
461
+ return {
462
+ detach() {
463
+ if (detached) return;
464
+ detached = true;
465
+ window.removeEventListener("message", onMessage);
466
+ unsubscribeFromDiscoverer();
467
+ unsubscribeAll();
468
+ }
469
+ };
470
+ }
471
+ function noopLog() {
472
+ }
473
+ function resolveByFlag(snapshot, flags, log) {
474
+ for (const flag of flags) {
475
+ for (const entry of snapshot) {
476
+ let value;
477
+ try {
478
+ value = entry.provider[flag];
479
+ } catch (err) {
480
+ log("provider threw on flag read \u2014 skipping", {
481
+ rdns: entry.info.rdns,
482
+ flag,
483
+ error: err instanceof Error ? err.message : String(err)
484
+ });
485
+ continue;
486
+ }
487
+ if (value) {
488
+ return { rdns: entry.info.rdns, uuid: entry.info.uuid, flag };
489
+ }
490
+ }
491
+ }
492
+ return null;
493
+ }
494
+ function normalizeProviderError(err) {
495
+ if (err && typeof err === "object") {
496
+ const e = err;
497
+ const code = typeof e.code === "number" ? e.code : -32603;
498
+ const message = typeof e.message === "string" ? e.message : err instanceof Error ? err.message : "Provider error";
499
+ const data = "data" in e ? e.data : void 0;
500
+ return data === void 0 ? { code, message } : { code, message, data };
501
+ }
502
+ return { code: -32603, message: typeof err === "string" ? err : "Provider error" };
503
+ }
96
504
 
97
505
  // src/iframe.ts
98
506
  var STYLE_ID = "blink-deposit-styles";
@@ -129,13 +537,26 @@ function createIframe(url, containerElement) {
129
537
  const iframe = document.createElement("iframe");
130
538
  iframe.src = url;
131
539
  const iframeOrigin = new URL(url).origin;
132
- iframe.allow = `publickey-credentials-get ${iframeOrigin}; publickey-credentials-create ${iframeOrigin}`;
540
+ iframe.allow = `publickey-credentials-get ${iframeOrigin}; publickey-credentials-create ${iframeOrigin}; clipboard-write ${iframeOrigin}`;
133
541
  const handle = document.createElement("div");
134
542
  container.appendChild(handle);
135
543
  container.appendChild(iframe);
136
544
  overlay.appendChild(container);
137
545
  const mountTarget = containerElement ?? document.body;
138
546
  mountTarget.appendChild(overlay);
547
+ const discoverer = createWalletDiscoverer();
548
+ let rpcHostHandle = null;
549
+ const attachBridge = () => {
550
+ if (rpcHostHandle) return;
551
+ if (!iframe.contentWindow) return;
552
+ rpcHostHandle = attachRpcHost({
553
+ iframeWindow: iframe.contentWindow,
554
+ iframeOrigin,
555
+ discoverer
556
+ });
557
+ };
558
+ attachBridge();
559
+ iframe.addEventListener("load", attachBridge);
139
560
  const savedOverflow = document.body.style.overflow;
140
561
  document.body.style.overflow = "hidden";
141
562
  const onBackdropClick = (event) => {
@@ -162,6 +583,7 @@ function createIframe(url, containerElement) {
162
583
  if (closed) return;
163
584
  closed = true;
164
585
  removeListeners();
586
+ detachBridge();
165
587
  overlay.setAttribute("data-blink-closing", "");
166
588
  let removed = false;
167
589
  const removeOverlay = () => {
@@ -174,6 +596,14 @@ function createIframe(url, containerElement) {
174
596
  container.addEventListener("animationend", removeOverlay, { once: true });
175
597
  setTimeout(removeOverlay, CLOSE_DURATION_MS + 50);
176
598
  }
599
+ function detachBridge() {
600
+ iframe.removeEventListener("load", attachBridge);
601
+ if (rpcHostHandle) {
602
+ rpcHostHandle.detach();
603
+ rpcHostHandle = null;
604
+ }
605
+ discoverer.destroy();
606
+ }
177
607
  return {
178
608
  get contentWindow() {
179
609
  return iframe.contentWindow;
@@ -192,6 +622,7 @@ function createIframe(url, containerElement) {
192
622
  if (!closed) {
193
623
  closed = true;
194
624
  removeListeners();
625
+ detachBridge();
195
626
  overlay.remove();
196
627
  unlockScroll();
197
628
  }
@@ -314,8 +745,10 @@ function isValidTokenAddress(value) {
314
745
  return TOKEN_ADDRESS_RE.test(value) || SOLANA_ADDRESS_RE.test(value);
315
746
  }
316
747
  function validateDepositRequest(request) {
317
- if (!Number.isFinite(request.amount) || request.amount <= 0) {
318
- throw new DepositError("INVALID_REQUEST", "amount must be a positive number.");
748
+ if (request.amount !== null) {
749
+ if (typeof request.amount !== "number" || !Number.isFinite(request.amount) || request.amount <= 0) {
750
+ throw new DepositError("INVALID_REQUEST", "amount must be a positive number or null.");
751
+ }
319
752
  }
320
753
  if (!Number.isInteger(request.chainId) || request.chainId <= 0) {
321
754
  throw new DepositError("INVALID_REQUEST", "chainId must be a positive integer.");
@@ -506,30 +939,16 @@ var Deposit = class {
506
939
  async runSignerFlow(request, requestId, onComplete, onError) {
507
940
  try {
508
941
  const webviewBaseUrl = this.config.webviewBaseUrl ?? DEFAULT_WEBVIEW_BASE_URL;
942
+ this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;
509
943
  this.log("Calling signer", {
510
944
  signer: typeof this.config.signer === "string" ? this.config.signer : "<function>"
511
945
  });
512
946
  const signerRequest = buildSignerRequest(request, webviewBaseUrl);
513
- const signerResponse = await callSigner(
514
- this.config.signer,
515
- signerRequest,
516
- this.config.signerTimeoutMs
517
- );
518
- this.lastSignerResponse = signerResponse;
519
- this.log("Signer responded", { merchantId: signerResponse.merchantId });
520
- if (this.requestId !== requestId) {
521
- this.log("Request superseded after signer response");
522
- return;
523
- }
524
- const hostedUrl = new URL(webviewBaseUrl);
525
- hostedUrl.searchParams.set("merchantId", signerResponse.merchantId);
526
- hostedUrl.searchParams.set("payload", signerResponse.payload);
527
- hostedUrl.searchParams.set("signature", signerResponse.signature);
528
- const targetUrl = hostedUrl.toString();
529
- this.hostedOrigin = this.config.hostedFlowOrigin ?? hostedUrl.origin;
530
- const iframeHandle = createIframe(targetUrl, this.config.containerElement);
531
- this.iframe = iframeHandle;
532
- iframeHandle.onClose(() => {
947
+ const preloadUrl = new URL(webviewBaseUrl);
948
+ preloadUrl.searchParams.set("preload", "true");
949
+ const preloadIframe = createIframe(preloadUrl.toString(), this.config.containerElement);
950
+ this.iframe = preloadIframe;
951
+ preloadIframe.onClose(() => {
533
952
  onError(
534
953
  new DepositError(
535
954
  "DEPOSIT_DISMISSED",
@@ -539,9 +958,60 @@ var Deposit = class {
539
958
  this.cleanup();
540
959
  this.emit("close");
541
960
  });
542
- this.startMessageListener(iframeHandle, onComplete);
543
- this.setStatus("iframe-active");
544
- this.log("Iframe opened with hosted flow", { url: targetUrl });
961
+ const signerPromise = callSigner(
962
+ this.config.signer,
963
+ signerRequest,
964
+ this.config.signerTimeoutMs
965
+ );
966
+ const iframeReadyPromise = this.waitForIframeReady(preloadIframe);
967
+ const [signerResponse, iframeReady] = await Promise.all([
968
+ signerPromise,
969
+ iframeReadyPromise
970
+ ]);
971
+ this.lastSignerResponse = signerResponse;
972
+ this.log("Signer responded", { merchantId: signerResponse.merchantId });
973
+ if (this.requestId !== requestId || preloadIframe.isClosed()) {
974
+ this.log("Request superseded or iframe dismissed during signer call");
975
+ return;
976
+ }
977
+ if (iframeReady) {
978
+ const contentWindow = preloadIframe.contentWindow;
979
+ if (contentWindow) {
980
+ contentWindow.postMessage(
981
+ buildSignedPayloadMessage(
982
+ signerResponse.merchantId,
983
+ signerResponse.payload,
984
+ signerResponse.signature
985
+ ),
986
+ this.hostedOrigin
987
+ );
988
+ }
989
+ this.startMessageListener(preloadIframe, onComplete);
990
+ this.setStatus("iframe-active");
991
+ this.log("Payload delivered via postMessage (preload path)");
992
+ } else {
993
+ preloadIframe.destroy();
994
+ const hostedUrl = new URL(webviewBaseUrl);
995
+ hostedUrl.searchParams.set("merchantId", signerResponse.merchantId);
996
+ hostedUrl.searchParams.set("payload", signerResponse.payload);
997
+ hostedUrl.searchParams.set("signature", signerResponse.signature);
998
+ const targetUrl = hostedUrl.toString();
999
+ const iframeHandle = createIframe(targetUrl, this.config.containerElement);
1000
+ this.iframe = iframeHandle;
1001
+ iframeHandle.onClose(() => {
1002
+ onError(
1003
+ new DepositError(
1004
+ "DEPOSIT_DISMISSED",
1005
+ "The deposit was dismissed before the transfer completed."
1006
+ )
1007
+ );
1008
+ this.cleanup();
1009
+ this.emit("close");
1010
+ });
1011
+ this.startMessageListener(iframeHandle, onComplete);
1012
+ this.setStatus("iframe-active");
1013
+ this.log("Iframe opened with hosted flow (fallback path)", { url: targetUrl });
1014
+ }
545
1015
  } catch (err) {
546
1016
  if (this.requestId !== requestId) return;
547
1017
  this.log("Signer flow failed", { error: err instanceof Error ? err.message : String(err) });
@@ -557,6 +1027,25 @@ var Deposit = class {
557
1027
  }
558
1028
  }
559
1029
  }
1030
+ waitForIframeReady(iframeHandle) {
1031
+ return new Promise((resolve) => {
1032
+ const handler = (event) => {
1033
+ if (event.origin !== this.hostedOrigin) return;
1034
+ if (event.source !== iframeHandle.contentWindow) return;
1035
+ if (parseIframeReady(event.data)) {
1036
+ window.removeEventListener("message", handler);
1037
+ clearTimeout(timeout);
1038
+ resolve(true);
1039
+ }
1040
+ };
1041
+ window.addEventListener("message", handler);
1042
+ const timeout = setTimeout(() => {
1043
+ window.removeEventListener("message", handler);
1044
+ this.log("Iframe ready timeout \u2014 falling back to URL params");
1045
+ resolve(false);
1046
+ }, 2e3);
1047
+ });
1048
+ }
560
1049
  startMessageListener(iframeHandle, onComplete) {
561
1050
  const handler = (event) => {
562
1051
  if (this.hostedOrigin && event.origin !== this.hostedOrigin) {