@swype-org/deposit 0.3.16 → 0.3.19
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/README.md +10 -0
- package/dist/{chunk-WD6DVQHT.js → chunk-VMXCXXVN.js} +202 -23
- package/dist/chunk-VMXCXXVN.js.map +1 -0
- package/dist/index.cjs +200 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +39 -3
- package/dist/index.d.ts +39 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +313 -20
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +34 -3
- package/dist/react.d.ts +34 -3
- package/dist/react.js +119 -4
- package/dist/react.js.map +1 -1
- package/dist/{types-DYsZwNXq.d.cts → types-Ds07N2zN.d.cts} +44 -1
- package/dist/{types-DYsZwNXq.d.ts → types-Ds07N2zN.d.ts} +44 -1
- package/package.json +5 -2
- package/dist/chunk-WD6DVQHT.js.map +0 -1
package/README.md
CHANGED
|
@@ -98,10 +98,20 @@ const deposit = new Deposit({
|
|
|
98
98
|
containerElement: document.getElementById('deposit-root')!,
|
|
99
99
|
signerTimeoutMs: 15_000,
|
|
100
100
|
flowTimeoutMs: 300_000,
|
|
101
|
+
enableFullWidget: true,
|
|
101
102
|
debug: false,
|
|
102
103
|
});
|
|
103
104
|
```
|
|
104
105
|
|
|
106
|
+
### `enableFullWidget`
|
|
107
|
+
|
|
108
|
+
Controls whether the hosted flow may show the full widget (the Deposit Options
|
|
109
|
+
entry screen for unauthenticated users). Defaults to `true`. The full widget
|
|
110
|
+
only appears when this option is enabled **and** the merchant's backend config
|
|
111
|
+
has it enabled — disabling either turns it off. Set it to `false` to force the
|
|
112
|
+
hosted flow straight to the standard deposit flow regardless of merchant
|
|
113
|
+
config.
|
|
114
|
+
|
|
105
115
|
## Error Handling
|
|
106
116
|
|
|
107
117
|
Every error is a `DepositError` with a machine-readable `code`:
|
|
@@ -524,15 +524,19 @@ var STYLES = `
|
|
|
524
524
|
[data-blink-overlay][data-blink-mobile-sheet][data-blink-closing] [data-blink-container]{opacity:1;animation:blink-slide-down-full ${CLOSE_DURATION_MS}ms ease-in forwards}
|
|
525
525
|
@media(max-width:${MOBILE_SHEET_MAX_VIEWPORT_PX}px){[data-blink-overlay]{align-items:flex-end;touch-action:none;overscroll-behavior:contain}[data-blink-container]{width:100%;max-width:100%;height:79vh;border-radius:24px 24px 0 0;box-shadow:0 -8px 40px rgba(0,0,0,.25);animation:blink-slide-up-full .35s cubic-bezier(.32,.72,0,1);padding-bottom:env(safe-area-inset-bottom,0px)}[data-blink-overlay][data-blink-closing] [data-blink-container]{opacity:1;animation:blink-slide-down-full ${CLOSE_DURATION_MS}ms ease-in forwards}}
|
|
526
526
|
`;
|
|
527
|
-
function createIframe(url, containerElement) {
|
|
527
|
+
function createIframe(url, containerElement, options) {
|
|
528
528
|
ensureStyles();
|
|
529
529
|
let closed = false;
|
|
530
|
+
let hidden = options?.hidden === true;
|
|
530
531
|
let closeCallback = null;
|
|
531
532
|
const overlay = document.createElement("div");
|
|
532
533
|
overlay.setAttribute("data-blink-overlay", "");
|
|
533
534
|
if (shouldUseMobileSheetLayout()) {
|
|
534
535
|
overlay.setAttribute("data-blink-mobile-sheet", "");
|
|
535
536
|
}
|
|
537
|
+
if (hidden) {
|
|
538
|
+
overlay.style.display = "none";
|
|
539
|
+
}
|
|
536
540
|
const container = document.createElement("div");
|
|
537
541
|
container.setAttribute("data-blink-container", "");
|
|
538
542
|
const iframe = document.createElement("iframe");
|
|
@@ -558,8 +562,8 @@ function createIframe(url, containerElement) {
|
|
|
558
562
|
};
|
|
559
563
|
attachBridge();
|
|
560
564
|
iframe.addEventListener("load", attachBridge);
|
|
561
|
-
|
|
562
|
-
|
|
565
|
+
let savedOverflow = "";
|
|
566
|
+
let scrollLocked = false;
|
|
563
567
|
const onBackdropClick = (event) => {
|
|
564
568
|
if (event.target === overlay) triggerClose();
|
|
565
569
|
};
|
|
@@ -569,15 +573,29 @@ function createIframe(url, containerElement) {
|
|
|
569
573
|
const onTouchMove = (event) => {
|
|
570
574
|
if (event.target === overlay) event.preventDefault();
|
|
571
575
|
};
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
576
|
+
function lockScroll() {
|
|
577
|
+
if (scrollLocked) return;
|
|
578
|
+
scrollLocked = true;
|
|
579
|
+
savedOverflow = document.body.style.overflow;
|
|
580
|
+
document.body.style.overflow = "hidden";
|
|
581
|
+
}
|
|
582
|
+
function attachDismissalListeners() {
|
|
583
|
+
overlay.addEventListener("click", onBackdropClick);
|
|
584
|
+
overlay.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
585
|
+
document.addEventListener("keydown", onKeyDown);
|
|
586
|
+
}
|
|
587
|
+
if (!hidden) {
|
|
588
|
+
lockScroll();
|
|
589
|
+
attachDismissalListeners();
|
|
590
|
+
}
|
|
575
591
|
function removeListeners() {
|
|
576
592
|
overlay.removeEventListener("click", onBackdropClick);
|
|
577
593
|
overlay.removeEventListener("touchmove", onTouchMove);
|
|
578
594
|
document.removeEventListener("keydown", onKeyDown);
|
|
579
595
|
}
|
|
580
596
|
function unlockScroll() {
|
|
597
|
+
if (!scrollLocked) return;
|
|
598
|
+
scrollLocked = false;
|
|
581
599
|
document.body.style.overflow = savedOverflow;
|
|
582
600
|
}
|
|
583
601
|
function triggerClose() {
|
|
@@ -615,6 +633,21 @@ function createIframe(url, containerElement) {
|
|
|
615
633
|
isClosed() {
|
|
616
634
|
return closed;
|
|
617
635
|
},
|
|
636
|
+
isHidden() {
|
|
637
|
+
return hidden;
|
|
638
|
+
},
|
|
639
|
+
reveal() {
|
|
640
|
+
if (closed || !hidden) return;
|
|
641
|
+
hidden = false;
|
|
642
|
+
if (shouldUseMobileSheetLayout()) {
|
|
643
|
+
overlay.setAttribute("data-blink-mobile-sheet", "");
|
|
644
|
+
} else {
|
|
645
|
+
overlay.removeAttribute("data-blink-mobile-sheet");
|
|
646
|
+
}
|
|
647
|
+
overlay.style.display = "";
|
|
648
|
+
lockScroll();
|
|
649
|
+
attachDismissalListeners();
|
|
650
|
+
},
|
|
618
651
|
onClose(callback) {
|
|
619
652
|
closeCallback = callback;
|
|
620
653
|
},
|
|
@@ -786,6 +819,13 @@ function buildSignerRequest(request, webviewBaseUrl) {
|
|
|
786
819
|
|
|
787
820
|
// src/checkout.ts
|
|
788
821
|
var DEFAULT_WEBVIEW_BASE_URL = "https://pay.blink.cash";
|
|
822
|
+
var SANDBOX_WEBVIEW_BASE_URL = "https://pay-sandbox.blink.cash";
|
|
823
|
+
var IFRAME_READY_TIMEOUT_MS = 2e3;
|
|
824
|
+
var WARM_IFRAME_READY_TIMEOUT_MS = 6e4;
|
|
825
|
+
function resolveWebviewBaseUrl(config) {
|
|
826
|
+
if (config.webviewBaseUrl) return config.webviewBaseUrl;
|
|
827
|
+
return config.environment === "sandbox" ? SANDBOX_WEBVIEW_BASE_URL : DEFAULT_WEBVIEW_BASE_URL;
|
|
828
|
+
}
|
|
789
829
|
var Deposit = class {
|
|
790
830
|
config;
|
|
791
831
|
iframe = null;
|
|
@@ -798,6 +838,9 @@ var Deposit = class {
|
|
|
798
838
|
_error = null;
|
|
799
839
|
flowTimer = null;
|
|
800
840
|
lastSignerResponse = null;
|
|
841
|
+
warmIframe = null;
|
|
842
|
+
warmIframeReady = null;
|
|
843
|
+
warmIframeReadyCancel = null;
|
|
801
844
|
listeners = {
|
|
802
845
|
complete: /* @__PURE__ */ new Set(),
|
|
803
846
|
error: /* @__PURE__ */ new Set(),
|
|
@@ -828,6 +871,93 @@ var Deposit = class {
|
|
|
828
871
|
this.log("Deposit instance created", {
|
|
829
872
|
signer: typeof config.signer === "string" ? config.signer : "<function>"
|
|
830
873
|
});
|
|
874
|
+
if (config.preload !== false) {
|
|
875
|
+
this.schedulePreload();
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
/**
|
|
879
|
+
* Warm up the hosted payment flow in a hidden iframe so `requestDeposit`
|
|
880
|
+
* opens an already-loaded page (JS bundle, auth session restore, and —
|
|
881
|
+
* when {@link DepositConfig.merchantId} is set — merchant config prefetch
|
|
882
|
+
* all happen in the background).
|
|
883
|
+
*
|
|
884
|
+
* Runs automatically after construction unless `preload: false`; call it
|
|
885
|
+
* manually to control the timing (e.g. on deposit-button hover). No-op
|
|
886
|
+
* when a warm iframe already exists or a deposit flow is active.
|
|
887
|
+
*/
|
|
888
|
+
preload() {
|
|
889
|
+
if (this.destroyed || this.isActive) return;
|
|
890
|
+
if (this.warmIframe && !this.warmIframe.isClosed()) return;
|
|
891
|
+
if (typeof document === "undefined" || typeof window === "undefined") return;
|
|
892
|
+
const webviewBaseUrl = resolveWebviewBaseUrl(this.config);
|
|
893
|
+
this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;
|
|
894
|
+
const preloadUrl = this.buildPreloadUrl(webviewBaseUrl);
|
|
895
|
+
const iframe = createIframe(preloadUrl, this.config.containerElement, { hidden: true });
|
|
896
|
+
const ready = this.waitForIframeReady(iframe, WARM_IFRAME_READY_TIMEOUT_MS);
|
|
897
|
+
this.warmIframe = iframe;
|
|
898
|
+
this.warmIframeReady = ready.promise;
|
|
899
|
+
this.warmIframeReadyCancel = ready.cancel;
|
|
900
|
+
this.log("Warm-up iframe created", { url: preloadUrl });
|
|
901
|
+
}
|
|
902
|
+
// Defer the automatic warm-up until the host page has finished its own
|
|
903
|
+
// load and the main thread is idle — constructing a Deposit instance must
|
|
904
|
+
// never slow the merchant page down.
|
|
905
|
+
schedulePreload() {
|
|
906
|
+
if (typeof window === "undefined" || typeof document === "undefined") return;
|
|
907
|
+
const start = () => {
|
|
908
|
+
if (!this.destroyed && !this.isActive) this.preload();
|
|
909
|
+
};
|
|
910
|
+
const whenIdle = () => {
|
|
911
|
+
const w = window;
|
|
912
|
+
if (typeof w.requestIdleCallback === "function") {
|
|
913
|
+
w.requestIdleCallback(start, { timeout: 3e3 });
|
|
914
|
+
} else {
|
|
915
|
+
setTimeout(start, 250);
|
|
916
|
+
}
|
|
917
|
+
};
|
|
918
|
+
if (document.readyState === "complete") {
|
|
919
|
+
whenIdle();
|
|
920
|
+
} else {
|
|
921
|
+
window.addEventListener("load", whenIdle, { once: true });
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
buildPreloadUrl(webviewBaseUrl) {
|
|
925
|
+
const preloadUrl = new URL(webviewBaseUrl);
|
|
926
|
+
preloadUrl.searchParams.set("preload", "true");
|
|
927
|
+
if (this.config.merchantId) {
|
|
928
|
+
preloadUrl.searchParams.set("merchantId", this.config.merchantId);
|
|
929
|
+
}
|
|
930
|
+
this.applyFullWidgetParam(preloadUrl);
|
|
931
|
+
return preloadUrl.toString();
|
|
932
|
+
}
|
|
933
|
+
/**
|
|
934
|
+
* Detach the warm iframe for use by a starting flow. Returns null (and
|
|
935
|
+
* cleans up) when there is none or it was closed in the meantime.
|
|
936
|
+
*/
|
|
937
|
+
takeWarmIframe() {
|
|
938
|
+
const iframe = this.warmIframe;
|
|
939
|
+
const ready = this.warmIframeReady;
|
|
940
|
+
const cancelReady = this.warmIframeReadyCancel ?? (() => {
|
|
941
|
+
});
|
|
942
|
+
this.warmIframe = null;
|
|
943
|
+
this.warmIframeReady = null;
|
|
944
|
+
this.warmIframeReadyCancel = null;
|
|
945
|
+
if (!iframe || !ready) return null;
|
|
946
|
+
if (iframe.isClosed()) {
|
|
947
|
+
cancelReady();
|
|
948
|
+
iframe.destroy();
|
|
949
|
+
return null;
|
|
950
|
+
}
|
|
951
|
+
return { iframe, ready, cancelReady };
|
|
952
|
+
}
|
|
953
|
+
discardWarmIframe() {
|
|
954
|
+
this.warmIframeReadyCancel?.();
|
|
955
|
+
this.warmIframeReadyCancel = null;
|
|
956
|
+
this.warmIframeReady = null;
|
|
957
|
+
if (this.warmIframe) {
|
|
958
|
+
this.warmIframe.destroy();
|
|
959
|
+
this.warmIframe = null;
|
|
960
|
+
}
|
|
831
961
|
}
|
|
832
962
|
/**
|
|
833
963
|
* Open the hosted payment flow for the given deposit.
|
|
@@ -915,9 +1045,10 @@ var Deposit = class {
|
|
|
915
1045
|
/** Tear down the instance and release all resources. */
|
|
916
1046
|
destroy() {
|
|
917
1047
|
this.log("destroy() called");
|
|
1048
|
+
this.destroyed = true;
|
|
918
1049
|
this.cleanup();
|
|
1050
|
+
this.discardWarmIframe();
|
|
919
1051
|
this.setStatus("idle");
|
|
920
|
-
this.destroyed = true;
|
|
921
1052
|
for (const set of Object.values(this.listeners)) {
|
|
922
1053
|
set.clear();
|
|
923
1054
|
}
|
|
@@ -931,6 +1062,17 @@ var Deposit = class {
|
|
|
931
1062
|
console.debug(`[BlinkDeposit] ${message}`);
|
|
932
1063
|
}
|
|
933
1064
|
}
|
|
1065
|
+
/**
|
|
1066
|
+
* Appends `enableFullWidget=false` to the hosted-flow URL when the merchant
|
|
1067
|
+
* integration disables the full widget. Absence of the param means enabled
|
|
1068
|
+
* (the default) — the hosted flow ANDs this with the merchant's backend
|
|
1069
|
+
* config, so the full widget renders only when both allow it.
|
|
1070
|
+
*/
|
|
1071
|
+
applyFullWidgetParam(url) {
|
|
1072
|
+
if (this.config.enableFullWidget === false) {
|
|
1073
|
+
url.searchParams.set("enableFullWidget", "false");
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
934
1076
|
setStatus(status) {
|
|
935
1077
|
if (this._status === status) return;
|
|
936
1078
|
this.log(`Status: ${this._status} \u2192 ${status}`);
|
|
@@ -939,15 +1081,35 @@ var Deposit = class {
|
|
|
939
1081
|
}
|
|
940
1082
|
async runSignerFlow(request, requestId, onComplete, onError) {
|
|
941
1083
|
try {
|
|
942
|
-
const webviewBaseUrl = this.config
|
|
1084
|
+
const webviewBaseUrl = resolveWebviewBaseUrl(this.config);
|
|
943
1085
|
this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;
|
|
944
1086
|
this.log("Calling signer", {
|
|
945
1087
|
signer: typeof this.config.signer === "string" ? this.config.signer : "<function>"
|
|
946
1088
|
});
|
|
947
1089
|
const signerRequest = buildSignerRequest(request, webviewBaseUrl);
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
const
|
|
1090
|
+
let preloadIframe;
|
|
1091
|
+
let iframeReadyPromise;
|
|
1092
|
+
const warm = this.takeWarmIframe();
|
|
1093
|
+
if (warm) {
|
|
1094
|
+
warm.iframe.reveal();
|
|
1095
|
+
preloadIframe = warm.iframe;
|
|
1096
|
+
iframeReadyPromise = Promise.race([
|
|
1097
|
+
warm.ready,
|
|
1098
|
+
new Promise(
|
|
1099
|
+
(resolve) => setTimeout(() => resolve(false), IFRAME_READY_TIMEOUT_MS)
|
|
1100
|
+
)
|
|
1101
|
+
]).then((ready) => {
|
|
1102
|
+
warm.cancelReady();
|
|
1103
|
+
return ready;
|
|
1104
|
+
});
|
|
1105
|
+
this.log("Reusing warm preload iframe");
|
|
1106
|
+
} else {
|
|
1107
|
+
preloadIframe = createIframe(
|
|
1108
|
+
this.buildPreloadUrl(webviewBaseUrl),
|
|
1109
|
+
this.config.containerElement
|
|
1110
|
+
);
|
|
1111
|
+
iframeReadyPromise = this.waitForIframeReady(preloadIframe).promise;
|
|
1112
|
+
}
|
|
951
1113
|
this.iframe = preloadIframe;
|
|
952
1114
|
preloadIframe.onClose(() => {
|
|
953
1115
|
onError(
|
|
@@ -964,7 +1126,6 @@ var Deposit = class {
|
|
|
964
1126
|
signerRequest,
|
|
965
1127
|
this.config.signerTimeoutMs
|
|
966
1128
|
);
|
|
967
|
-
const iframeReadyPromise = this.waitForIframeReady(preloadIframe);
|
|
968
1129
|
const [signerResponse, iframeReady] = await Promise.all([
|
|
969
1130
|
signerPromise,
|
|
970
1131
|
iframeReadyPromise
|
|
@@ -996,6 +1157,7 @@ var Deposit = class {
|
|
|
996
1157
|
hostedUrl.searchParams.set("merchantId", signerResponse.merchantId);
|
|
997
1158
|
hostedUrl.searchParams.set("payload", signerResponse.payload);
|
|
998
1159
|
hostedUrl.searchParams.set("signature", signerResponse.signature);
|
|
1160
|
+
this.applyFullWidgetParam(hostedUrl);
|
|
999
1161
|
const targetUrl = hostedUrl.toString();
|
|
1000
1162
|
const iframeHandle = createIframe(targetUrl, this.config.containerElement);
|
|
1001
1163
|
this.iframe = iframeHandle;
|
|
@@ -1028,24 +1190,38 @@ var Deposit = class {
|
|
|
1028
1190
|
}
|
|
1029
1191
|
}
|
|
1030
1192
|
}
|
|
1031
|
-
|
|
1032
|
-
|
|
1193
|
+
/**
|
|
1194
|
+
* Resolves true when the iframe posts `blink:iframe-ready`, false on
|
|
1195
|
+
* timeout. `cancel()` settles the promise as false immediately and releases
|
|
1196
|
+
* the listener + timer — used to reap the generous warm-up wait once it no
|
|
1197
|
+
* longer matters (warm iframe consumed or discarded).
|
|
1198
|
+
*/
|
|
1199
|
+
waitForIframeReady(iframeHandle, timeoutMs = IFRAME_READY_TIMEOUT_MS) {
|
|
1200
|
+
let finish = () => {
|
|
1201
|
+
};
|
|
1202
|
+
const promise = new Promise((resolve) => {
|
|
1033
1203
|
const handler = (event) => {
|
|
1034
1204
|
if (event.origin !== this.hostedOrigin) return;
|
|
1035
1205
|
if (event.source !== iframeHandle.contentWindow) return;
|
|
1036
1206
|
if (parseIframeReady(event.data)) {
|
|
1037
|
-
|
|
1038
|
-
clearTimeout(timeout);
|
|
1039
|
-
resolve(true);
|
|
1207
|
+
finish(true);
|
|
1040
1208
|
}
|
|
1041
1209
|
};
|
|
1042
1210
|
window.addEventListener("message", handler);
|
|
1043
1211
|
const timeout = setTimeout(() => {
|
|
1044
|
-
window.removeEventListener("message", handler);
|
|
1045
1212
|
this.log("Iframe ready timeout \u2014 falling back to URL params");
|
|
1046
|
-
|
|
1047
|
-
},
|
|
1213
|
+
finish(false);
|
|
1214
|
+
}, timeoutMs);
|
|
1215
|
+
let settled = false;
|
|
1216
|
+
finish = (ready) => {
|
|
1217
|
+
if (settled) return;
|
|
1218
|
+
settled = true;
|
|
1219
|
+
window.removeEventListener("message", handler);
|
|
1220
|
+
clearTimeout(timeout);
|
|
1221
|
+
resolve(ready);
|
|
1222
|
+
};
|
|
1048
1223
|
});
|
|
1224
|
+
return { promise, cancel: () => finish(false) };
|
|
1049
1225
|
}
|
|
1050
1226
|
startMessageListener(iframeHandle, onComplete) {
|
|
1051
1227
|
const handler = (event) => {
|
|
@@ -1105,6 +1281,9 @@ var Deposit = class {
|
|
|
1105
1281
|
}
|
|
1106
1282
|
this.hostedOrigin = null;
|
|
1107
1283
|
this.lastSignerResponse = null;
|
|
1284
|
+
if (!this.destroyed && this.config.preload !== false) {
|
|
1285
|
+
this.schedulePreload();
|
|
1286
|
+
}
|
|
1108
1287
|
}
|
|
1109
1288
|
emit(event, ...args) {
|
|
1110
1289
|
for (const handler of this.listeners[event]) {
|
|
@@ -1117,6 +1296,6 @@ var Deposit = class {
|
|
|
1117
1296
|
};
|
|
1118
1297
|
var Checkout = Deposit;
|
|
1119
1298
|
|
|
1120
|
-
export { ALLOWED_RPC_METHODS, BRIDGE_PROTOCOL_VERSION, Checkout, CheckoutError, DEFAULT_WEBVIEW_BASE_URL, Deposit, DepositError, attachRpcHost, createWalletDiscoverer, getDisplayMessage, parseBridgeMessage };
|
|
1121
|
-
//# sourceMappingURL=chunk-
|
|
1122
|
-
//# sourceMappingURL=chunk-
|
|
1299
|
+
export { ALLOWED_RPC_METHODS, BRIDGE_PROTOCOL_VERSION, Checkout, CheckoutError, DEFAULT_WEBVIEW_BASE_URL, Deposit, DepositError, SANDBOX_WEBVIEW_BASE_URL, attachRpcHost, createWalletDiscoverer, getDisplayMessage, parseBridgeMessage };
|
|
1300
|
+
//# sourceMappingURL=chunk-VMXCXXVN.js.map
|
|
1301
|
+
//# sourceMappingURL=chunk-VMXCXXVN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/walletBridge/discover.ts","../src/walletBridge/protocol.ts","../src/walletBridge/rpcHost.ts","../src/messages.ts","../src/iframe.ts","../src/signer.ts","../src/validation.ts","../src/checkout.ts"],"names":[],"mappings":"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","file":"chunk-VMXCXXVN.js","sourcesContent":["export type DepositErrorCode =\n | 'DEPOSIT_DISMISSED'\n | 'CHECKOUT_DISMISSED'\n | 'SIGNER_REQUEST_FAILED'\n | 'SIGNER_NETWORK_ERROR'\n | 'SIGNER_RESPONSE_INVALID'\n | 'SIGNER_TIMEOUT'\n | 'FLOW_TIMEOUT'\n | 'INVALID_REQUEST';\n\n/** @deprecated Use {@link DepositErrorCode} instead. */\nexport type CheckoutErrorCode = DepositErrorCode;\n\n/**\n * Structured error thrown by the deposit SDK.\n *\n * Every error carries a machine-readable {@link code} so merchants can\n * branch on failure mode without parsing message strings.\n */\nexport class DepositError extends Error {\n readonly code: DepositErrorCode;\n\n constructor(code: DepositErrorCode, message: string) {\n super(message);\n this.name = 'DepositError';\n this.code = code;\n }\n}\n\n/** @deprecated Use {@link DepositError} instead. */\nexport const CheckoutError = DepositError;\n/** @deprecated Use {@link DepositError} instead. */\nexport type CheckoutError = DepositError;\n\nconst DISPLAY_MESSAGES: Record<DepositErrorCode, string> = {\n DEPOSIT_DISMISSED:\n 'The deposit was dismissed before the transfer completed.',\n CHECKOUT_DISMISSED:\n 'The checkout was dismissed before the transfer completed.',\n SIGNER_REQUEST_FAILED:\n 'Unable to start the payment. Please try again.',\n SIGNER_NETWORK_ERROR:\n 'Unable to reach the payment server. Check your connection and try again.',\n SIGNER_RESPONSE_INVALID:\n 'The payment server returned an unexpected response.',\n SIGNER_TIMEOUT:\n 'The payment server took too long to respond. Please try again.',\n FLOW_TIMEOUT:\n 'The payment flow timed out. Please try again.',\n INVALID_REQUEST:\n 'Invalid payment request. Please check your input.',\n};\n\n/**\n * Return a user-friendly display string for a {@link DepositError}.\n *\n * Merchants can show this directly in their UI without maintaining their own\n * copy for each error code.\n */\nexport function getDisplayMessage(error: DepositError): string {\n return DISPLAY_MESSAGES[error.code] ?? error.message;\n}\n","// ── EIP-6963 Wallet Discoverer (parent-frame) ──────────────────────────\n//\n// Some browser-extension wallets (notably Uniswap and Rainbow) inject\n// `window.ethereum` and dispatch EIP-6963 announcements only into the\n// top-level frame. Inside our cross-origin payment iframe, wagmi's MIPD\n// scan never sees them.\n//\n// This module runs in the parent frame (the merchant page that loads\n// `@swype-org/deposit`). It listens for EIP-6963 announcements, builds a\n// registry of installed providers keyed by their EIP-6963 `info.uuid`,\n// and exposes it for the `rpcHost` to advertise into the iframe.\n//\n// Hand-off contract with the iframe lives in `messages.ts` /\n// `walletBridge/protocol.ts`.\n\nimport type {\n EIP1193Provider,\n EIP6963ProviderDetail,\n EIP6963ProviderInfo,\n} from './protocol.ts';\n\nexport interface RegisteredProvider {\n info: EIP6963ProviderInfo;\n provider: EIP1193Provider;\n}\n\nexport interface WalletDiscovererHandle {\n /** Snapshot of currently-registered providers. */\n list(): RegisteredProvider[];\n /** Look up a single provider by EIP-6963 uuid. */\n get(uuid: string): EIP1193Provider | undefined;\n /** Subscribe to registry changes. Returns an unsubscribe callback. */\n subscribe(listener: (snapshot: RegisteredProvider[]) => void): () => void;\n /**\n * Re-dispatch `eip6963:requestProvider`. Wallets that wired up after\n * page load (or after the initial sweep) will re-announce in response.\n */\n requestProviders(): void;\n /** Tear down listeners. After this, `list()` returns `[]`. */\n destroy(): void;\n}\n\ninterface AnnounceEvent extends Event {\n detail?: EIP6963ProviderDetail;\n}\n\n/**\n * Start discovering EIP-6963 providers in the current (top-level) frame.\n *\n * Safe to call multiple times — each handle owns its own listeners and\n * registry; calling `destroy()` releases both. In practice, `createIframe`\n * spins one handle per modal open.\n */\nexport function createWalletDiscoverer(): WalletDiscovererHandle {\n if (typeof window === 'undefined') {\n return makeNoopHandle();\n }\n\n const registry = new Map<string, RegisteredProvider>();\n const listeners = new Set<(snapshot: RegisteredProvider[]) => void>();\n let destroyed = false;\n\n const onAnnounce = (event: Event) => {\n if (destroyed) return;\n const detail = (event as AnnounceEvent).detail;\n if (!isValidProviderDetail(detail)) {\n // eslint-disable-next-line no-console\n console.info('[blink-bridge:parent] dropping malformed EIP-6963 announcement', {\n rawInfo: (event as AnnounceEvent).detail\n && ((event as AnnounceEvent).detail as { info?: unknown }).info,\n });\n return;\n }\n\n const existing = registry.get(detail.info.uuid);\n if (existing && existing.provider === detail.provider) {\n return;\n }\n // eslint-disable-next-line no-console\n console.info('[blink-bridge:parent] EIP-6963 announceProvider', {\n rdns: detail.info.rdns,\n name: detail.info.name,\n uuid: detail.info.uuid,\n });\n registry.set(detail.info.uuid, {\n info: { ...detail.info },\n provider: detail.provider,\n });\n notify();\n };\n\n // EIP-6963 requires the page to listen for announcements *first*, then\n // dispatch the request. Wallets respond synchronously with their\n // provider details. Wallets that load late (slow content scripts) will\n // also auto-announce on their own once they're ready.\n window.addEventListener('eip6963:announceProvider', onAnnounce);\n requestProviders();\n\n // Mirror wagmi's `unstable_shimAsyncInject: 2_000` — a few content\n // scripts (Uniswap is one) finish wiring up after `DOMContentLoaded`,\n // so a single sweep can miss them. Re-request a handful of times in\n // the first few seconds, then stop. Each re-request is cheap (one\n // CustomEvent dispatch).\n const RESWEEP_INTERVALS_MS = [500, 1500, 3000, 6000];\n const reSweepTimers: ReturnType<typeof setTimeout>[] = [];\n for (const ms of RESWEEP_INTERVALS_MS) {\n reSweepTimers.push(\n setTimeout(() => {\n if (!destroyed) requestProviders();\n }, ms),\n );\n }\n\n function requestProviders(): void {\n try {\n window.dispatchEvent(new Event('eip6963:requestProvider'));\n } catch {\n // jsdom older than v22 throws on `new Event()` in some setups —\n // safe to swallow; real browsers always succeed here.\n }\n }\n\n function notify(): void {\n const snapshot = list();\n for (const listener of listeners) {\n try {\n listener(snapshot);\n } catch {\n // Listener errors must not break the discoverer.\n }\n }\n }\n\n function list(): RegisteredProvider[] {\n return [...registry.values()];\n }\n\n return {\n list,\n get(uuid: string): EIP1193Provider | undefined {\n return registry.get(uuid)?.provider;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n requestProviders,\n destroy() {\n if (destroyed) return;\n destroyed = true;\n window.removeEventListener('eip6963:announceProvider', onAnnounce);\n for (const t of reSweepTimers) clearTimeout(t);\n registry.clear();\n listeners.clear();\n },\n };\n}\n\nfunction makeNoopHandle(): WalletDiscovererHandle {\n return {\n list: () => [],\n get: () => undefined,\n subscribe: () => () => {},\n requestProviders: () => {},\n destroy: () => {},\n };\n}\n\nfunction isValidProviderDetail(value: unknown): value is EIP6963ProviderDetail {\n if (!value || typeof value !== 'object') return false;\n const detail = value as Record<string, unknown>;\n const info = detail.info as Record<string, unknown> | undefined;\n const provider = detail.provider as Record<string, unknown> | undefined;\n if (!info || !provider) return false;\n if (typeof info.uuid !== 'string' || info.uuid.length === 0) return false;\n if (typeof info.name !== 'string') return false;\n if (typeof info.rdns !== 'string') return false;\n if (typeof provider.request !== 'function') return false;\n return true;\n}\n","// ── Wallet Bridge Wire Protocol ────────────────────────────────────────\n//\n// Shared between parent (`deposit-sdk`) and iframe (`swype-sdk`). Both\n// sides define the same shapes locally — there is no runtime import\n// across the postMessage boundary, only structural conformance via\n// `protocolVersion: 1`. Bumping the version to 2 is a breaking change\n// receivers must opt into; v1 receivers silently drop v2 messages and\n// fall through to legacy behavior.\n//\n// New `type` values are additive within the same `protocolVersion`: any\n// peer that doesn't recognize them returns `null` from\n// `parseBridgeMessage` and the sender falls through to its own\n// timeout/fallback path. Only bump the version when we change the wire\n// shape of an existing message.\n\n/** Current wire-protocol version. Bump on breaking changes. */\nexport const BRIDGE_PROTOCOL_VERSION = 1;\n\n// ── EIP-6963 / EIP-1193 (subset we touch) ──────────────────────────────\n\nexport interface EIP6963ProviderInfo {\n uuid: string;\n name: string;\n icon: string;\n rdns: string;\n}\n\nexport interface EIP1193RequestArgs {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n}\n\nexport interface EIP1193Provider {\n request(args: EIP1193RequestArgs): Promise<unknown>;\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n removeListener?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n}\n\nexport interface EIP6963ProviderDetail {\n info: EIP6963ProviderInfo;\n provider: EIP1193Provider;\n}\n\n// ── Wire messages (both directions tagged with `type`) ─────────────────\n\n/** Iframe → Parent: handshake, sent once on mount. */\nexport interface BridgeHelloMessage {\n type: 'blink:bridge-hello';\n protocolVersion: number;\n}\n\n/** Parent → Iframe: list of installed wallets the iframe can borrow. */\nexport interface WalletsAdvertisedMessage {\n type: 'blink:wallets-advertised';\n protocolVersion: number;\n wallets: AdvertisedWallet[];\n}\n\nexport interface AdvertisedWallet {\n uuid: string;\n rdns: string;\n name: string;\n icon: string;\n}\n\n/** Iframe → Parent: invoke a JSON-RPC method on a top-frame wallet. */\nexport interface RpcRequestMessage {\n type: 'blink:rpc-request';\n protocolVersion: number;\n uuid: string;\n id: string;\n method: string;\n params?: unknown[] | Record<string, unknown>;\n}\n\n/** Parent → Iframe: result of a previous `RpcRequestMessage`. */\nexport interface RpcResponseMessage {\n type: 'blink:rpc-response';\n protocolVersion: number;\n id: string;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\n/** Parent → Iframe: forwarded EIP-1193 event from a top-frame wallet. */\nexport interface RpcEventMessage {\n type: 'blink:rpc-event';\n protocolVersion: number;\n uuid: string;\n event: string;\n args: unknown[];\n}\n\n/**\n * Iframe → Parent: ask \"which advertised wallet has any of these flags\n * (e.g. `isUniswapWallet`) set as a truthy property on its provider?\".\n * Used to disambiguate Reown registry entries that lack `rdns` (e.g.\n * Uniswap, where Reown only ships `injected[].injectedId:\n * 'isUniswapWallet'`). The parent reads `provider[flag]` defensively\n * for each advertised provider and returns the first hit, or null.\n *\n * The parent answers each request once; the response is matched by\n * `id`. Cost is local property reads on already-discovered providers —\n * no network and no cross-frame I/O beyond the postMessage round-trip.\n */\nexport interface ResolveByFlagRequestMessage {\n type: 'blink:resolve-by-flag';\n protocolVersion: number;\n /** Request id, mirrored on the response so the iframe can route it. */\n id: string;\n /** Flag names to test in order; first truthy property wins. */\n flags: string[];\n}\n\n/** Parent → Iframe: result of a previous `ResolveByFlagRequestMessage`. */\nexport interface ResolveByFlagResponseMessage {\n type: 'blink:resolve-by-flag-response';\n protocolVersion: number;\n id: string;\n /** `null` when no advertised provider had any flag set. */\n match: ResolveByFlagMatch | null;\n}\n\nexport interface ResolveByFlagMatch {\n /** EIP-6963 `rdns` of the matched provider. */\n rdns: string;\n /** EIP-6963 `uuid` of the matched provider. */\n uuid: string;\n /** Which flag matched first (lets the caller log/telemeter). */\n flag: string;\n}\n\nexport type BridgeMessage =\n | BridgeHelloMessage\n | WalletsAdvertisedMessage\n | RpcRequestMessage\n | RpcResponseMessage\n | RpcEventMessage\n | ResolveByFlagRequestMessage\n | ResolveByFlagResponseMessage;\n\n// ── JSON-RPC method allowlist ──────────────────────────────────────────\n//\n// Only methods on this list are forwarded to the top-frame provider.\n// Anything else gets a `-32601 Method not allowed` rejection, mirroring\n// the JSON-RPC 2.0 \"Method not found\" error code.\n\nexport const ALLOWED_RPC_METHODS = new Set<string>([\n // Read\n 'eth_accounts',\n 'eth_blockNumber',\n 'eth_call',\n 'eth_chainId',\n 'eth_estimateGas',\n 'eth_gasPrice',\n 'eth_getBalance',\n 'eth_getCode',\n 'eth_getStorageAt',\n 'eth_getTransactionByHash',\n 'eth_getTransactionCount',\n 'eth_getTransactionReceipt',\n 'net_version',\n 'wallet_getCapabilities',\n 'wallet_getCallsStatus',\n // Write / sign\n 'eth_requestAccounts',\n 'eth_sendTransaction',\n 'eth_sendRawTransaction',\n 'eth_sign',\n 'personal_sign',\n 'eth_signTypedData',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4',\n 'wallet_addEthereumChain',\n 'wallet_switchEthereumChain',\n 'wallet_sendCalls',\n 'wallet_watchAsset',\n // EIP-2255: lets the SDK revoke the dApp's `eth_accounts` grant before\n // re-prompting on \"+ Add wallet\" / back-from-setup, so MetaMask shows the\n // account picker instead of silently reusing the previously-permitted\n // account. Wallets that don't implement it return method-not-supported,\n // which the SDK swallows.\n 'wallet_revokePermissions',\n]);\n\n// ── Forwarded EIP-1193 events ──────────────────────────────────────────\n\nexport const FORWARDED_PROVIDER_EVENTS = [\n 'accountsChanged',\n 'chainChanged',\n 'connect',\n 'disconnect',\n 'message',\n] as const;\n\nexport type ForwardedProviderEvent = (typeof FORWARDED_PROVIDER_EVENTS)[number];\n\n// ── Parsers (used by both sides) ───────────────────────────────────────\n\nexport function parseBridgeMessage(data: unknown): BridgeMessage | null {\n if (!data || typeof data !== 'object') return null;\n const msg = data as Record<string, unknown>;\n if (msg.protocolVersion !== BRIDGE_PROTOCOL_VERSION) return null;\n switch (msg.type) {\n case 'blink:bridge-hello':\n return msg as unknown as BridgeHelloMessage;\n case 'blink:wallets-advertised':\n return Array.isArray(msg.wallets) ? (msg as unknown as WalletsAdvertisedMessage) : null;\n case 'blink:rpc-request':\n if (typeof msg.uuid !== 'string' || typeof msg.id !== 'string' || typeof msg.method !== 'string') {\n return null;\n }\n return msg as unknown as RpcRequestMessage;\n case 'blink:rpc-response':\n if (typeof msg.id !== 'string') return null;\n return msg as unknown as RpcResponseMessage;\n case 'blink:rpc-event':\n if (typeof msg.uuid !== 'string' || typeof msg.event !== 'string' || !Array.isArray(msg.args)) {\n return null;\n }\n return msg as unknown as RpcEventMessage;\n case 'blink:resolve-by-flag':\n if (typeof msg.id !== 'string' || !Array.isArray(msg.flags)) return null;\n // Defensive: every flag must be a non-empty string. Reject the\n // whole message rather than silently filtering to keep the\n // request/response semantics honest.\n if (!msg.flags.every((f) => typeof f === 'string' && f.length > 0)) return null;\n return msg as unknown as ResolveByFlagRequestMessage;\n case 'blink:resolve-by-flag-response':\n if (typeof msg.id !== 'string') return null;\n // `match` may be null or an object with rdns/uuid/flag; the\n // caller validates the inner shape.\n if (msg.match !== null && (typeof msg.match !== 'object' || !msg.match)) return null;\n return msg as unknown as ResolveByFlagResponseMessage;\n default:\n return null;\n }\n}\n","// ── Wallet Bridge RPC Host (parent-frame) ──────────────────────────────\n//\n// Exposes top-frame EIP-1193 providers to the cross-origin iframe over\n// `postMessage`. Built on top of `WalletDiscovererHandle` (the EIP-6963\n// registry) and the wire protocol in `protocol.ts`.\n//\n// Security model:\n// - Origin-pinned: only `event.origin === iframeOrigin` is honored.\n// - Source-pinned: only messages whose `event.source === iframeWindow`\n// are honored (defends against rogue iframes on the same page).\n// - Method allowlist: anything outside `ALLOWED_RPC_METHODS` rejects\n// with JSON-RPC `-32601 Method not allowed`. Defense in depth — the\n// iframe SDK is trusted, but we don't want a future SDK regression\n// to expose, say, `eth_signTransaction` (offline signing) by accident.\n//\n// Backwards-compat: this host responds to `blink:bridge-hello` with the\n// current advertisement. Old iframes never send the hello and never send\n// `blink:rpc-request`, so the host is silent for them.\n\nimport type { WalletDiscovererHandle, RegisteredProvider } from './discover.ts';\nimport {\n ALLOWED_RPC_METHODS,\n BRIDGE_PROTOCOL_VERSION,\n FORWARDED_PROVIDER_EVENTS,\n parseBridgeMessage,\n type AdvertisedWallet,\n type EIP1193Provider,\n type ResolveByFlagMatch,\n type ResolveByFlagResponseMessage,\n type RpcEventMessage,\n type RpcResponseMessage,\n type WalletsAdvertisedMessage,\n type ForwardedProviderEvent,\n} from './protocol.ts';\n\nexport interface RpcHostHandle {\n /** Tear down listeners and unsubscribe from all bridged providers. */\n detach(): void;\n}\n\nexport interface RpcHostOptions {\n /** Cross-origin iframe window we're talking to. */\n iframeWindow: Window;\n /** Origin of the iframe — origin-pin all postMessage send/receive. */\n iframeOrigin: string;\n /** Discoverer providing the EIP-6963 provider registry. */\n discoverer: WalletDiscovererHandle;\n /** Optional debug logger; defaults to a no-op. */\n log?: (message: string, data?: Record<string, unknown>) => void;\n}\n\ninterface SubscriptionRecord {\n provider: EIP1193Provider;\n listeners: Map<ForwardedProviderEvent, (...args: unknown[]) => void>;\n}\n\n/**\n * Attach an RPC host to the given iframe. Listens on `window` for\n * messages from the iframe and routes allowlisted JSON-RPC calls to the\n * matching top-frame EIP-1193 provider.\n */\nexport function attachRpcHost(options: RpcHostOptions): RpcHostHandle {\n const { iframeWindow, iframeOrigin, discoverer } = options;\n const log = options.log ?? noopLog;\n\n if (typeof window === 'undefined') {\n return { detach: () => {} };\n }\n\n let detached = false;\n const subscriptions = new Map<string, SubscriptionRecord>();\n const unsubscribeFromDiscoverer = discoverer.subscribe((snapshot) => {\n if (detached) return;\n advertiseWallets(snapshot);\n });\n\n function postToIframe(message: object): void {\n if (detached) return;\n try {\n iframeWindow.postMessage(message, iframeOrigin);\n } catch (err) {\n log('postMessage to iframe failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n function advertiseWallets(snapshot: RegisteredProvider[]): void {\n const wallets: AdvertisedWallet[] = snapshot.map((entry) => ({\n uuid: entry.info.uuid,\n rdns: entry.info.rdns,\n name: entry.info.name,\n icon: entry.info.icon,\n }));\n // eslint-disable-next-line no-console\n console.info('[blink-bridge:parent] advertising wallets', wallets.map((w) => ({\n rdns: w.rdns,\n name: w.name,\n })));\n const message: WalletsAdvertisedMessage = {\n type: 'blink:wallets-advertised',\n protocolVersion: BRIDGE_PROTOCOL_VERSION,\n wallets,\n };\n postToIframe(message);\n }\n\n function ensureSubscription(uuid: string, provider: EIP1193Provider): void {\n if (subscriptions.has(uuid)) return;\n if (typeof provider.on !== 'function') {\n // No event support — record an empty subscription so we don't keep\n // re-checking on every request.\n subscriptions.set(uuid, { provider, listeners: new Map() });\n return;\n }\n const record: SubscriptionRecord = { provider, listeners: new Map() };\n for (const event of FORWARDED_PROVIDER_EVENTS) {\n const listener = (...args: unknown[]) => {\n const eventMessage: RpcEventMessage = {\n type: 'blink:rpc-event',\n protocolVersion: BRIDGE_PROTOCOL_VERSION,\n uuid,\n event,\n args,\n };\n postToIframe(eventMessage);\n };\n try {\n provider.on(event, listener);\n record.listeners.set(event, listener);\n } catch (err) {\n log(`provider.on('${event}') threw — skipping that event`, {\n uuid,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n subscriptions.set(uuid, record);\n }\n\n function unsubscribeAll(): void {\n for (const [, record] of subscriptions) {\n const provider = record.provider;\n if (typeof provider.removeListener !== 'function') continue;\n for (const [event, listener] of record.listeners) {\n try {\n provider.removeListener(event, listener);\n } catch {\n // Provider close may have already cleaned up — safe to ignore.\n }\n }\n }\n subscriptions.clear();\n }\n\n function sendError(id: string, code: number, message: string, data?: unknown): void {\n const response: RpcResponseMessage = {\n type: 'blink:rpc-response',\n protocolVersion: BRIDGE_PROTOCOL_VERSION,\n id,\n error: data === undefined ? { code, message } : { code, message, data },\n };\n postToIframe(response);\n }\n\n function sendResult(id: string, result: unknown): void {\n const response: RpcResponseMessage = {\n type: 'blink:rpc-response',\n protocolVersion: BRIDGE_PROTOCOL_VERSION,\n id,\n result,\n };\n postToIframe(response);\n }\n\n const onMessage = (event: MessageEvent) => {\n if (detached) return;\n if (event.source !== iframeWindow) return;\n if (event.origin !== iframeOrigin) return;\n const message = parseBridgeMessage(event.data);\n if (!message) return;\n\n switch (message.type) {\n case 'blink:bridge-hello': {\n // New-protocol iframe is asking \"are you there?\" Reply with the\n // current registry, even if empty. The iframe uses this to flip\n // its `bridgeAvailable` flag.\n advertiseWallets(discoverer.list());\n // Some wallets only finish wiring up after page load — re-request\n // EIP-6963 announcements once the iframe is alive too.\n discoverer.requestProviders();\n return;\n }\n case 'blink:rpc-request': {\n const { id, uuid, method, params } = message;\n // eslint-disable-next-line no-console\n console.info('[blink-bridge:parent] rpc-request', { uuid, method });\n if (!ALLOWED_RPC_METHODS.has(method)) {\n log('rejecting non-allowlisted method', { uuid, method });\n sendError(id, -32601, `Method not allowed: ${method}`);\n return;\n }\n const provider = discoverer.get(uuid);\n if (!provider) {\n log('no provider for uuid', { uuid, method });\n sendError(id, -32602, `Unknown wallet: ${uuid}`);\n return;\n }\n ensureSubscription(uuid, provider);\n provider\n .request({ method, params })\n .then((result) => {\n // eslint-disable-next-line no-console\n console.info('[blink-bridge:parent] rpc-result', { uuid, method, ok: true });\n sendResult(id, result);\n })\n .catch((err: unknown) => {\n const { code, message: errMessage, data } = normalizeProviderError(err);\n // eslint-disable-next-line no-console\n console.info('[blink-bridge:parent] rpc-error', { uuid, method, code, message: errMessage });\n sendError(id, code, errMessage, data);\n });\n return;\n }\n case 'blink:resolve-by-flag': {\n const match = resolveByFlag(discoverer.list(), message.flags, log);\n // eslint-disable-next-line no-console\n console.info('[blink-bridge:parent] resolveByFlag', {\n flags: message.flags,\n match: match ? { rdns: match.rdns, flag: match.flag } : null,\n });\n const response: ResolveByFlagResponseMessage = {\n type: 'blink:resolve-by-flag-response',\n protocolVersion: BRIDGE_PROTOCOL_VERSION,\n id: message.id,\n match,\n };\n postToIframe(response);\n return;\n }\n case 'blink:wallets-advertised':\n case 'blink:rpc-response':\n case 'blink:rpc-event':\n case 'blink:resolve-by-flag-response':\n // These are parent → iframe messages. If we receive them, the\n // peer is misconfigured — ignore.\n return;\n }\n };\n\n window.addEventListener('message', onMessage);\n\n return {\n detach() {\n if (detached) return;\n detached = true;\n window.removeEventListener('message', onMessage);\n unsubscribeFromDiscoverer();\n unsubscribeAll();\n },\n };\n}\n\nfunction noopLog(): void {}\n\n/**\n * Walk the registered providers and return the first that has any of\n * the requested flags set as a truthy property (e.g. `isUniswapWallet`,\n * `isRainbow`). Used by the iframe to resolve Reown registry entries\n * that lack `rdns` but ship an `injectedId` flag.\n *\n * Per-provider reads are wrapped in try/catch because some wallets\n * proxy `window.ethereum` and throw on unknown property access.\n */\nfunction resolveByFlag(\n snapshot: RegisteredProvider[],\n flags: string[],\n log: (message: string, data?: Record<string, unknown>) => void,\n): ResolveByFlagMatch | null {\n for (const flag of flags) {\n for (const entry of snapshot) {\n let value: unknown;\n try {\n value = (entry.provider as unknown as Record<string, unknown>)[flag];\n } catch (err) {\n log('provider threw on flag read — skipping', {\n rdns: entry.info.rdns,\n flag,\n error: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n if (value) {\n return { rdns: entry.info.rdns, uuid: entry.info.uuid, flag };\n }\n }\n }\n return null;\n}\n\ninterface NormalizedProviderError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n/**\n * Coerce whatever an EIP-1193 provider threw into a JSON-RPC-shaped\n * error. Most wallets already throw `{ code, message, data? }`; we just\n * shape it. Anything else gets a generic -32603 (internal error).\n */\nfunction normalizeProviderError(err: unknown): NormalizedProviderError {\n if (err && typeof err === 'object') {\n const e = err as Record<string, unknown>;\n const code = typeof e.code === 'number' ? e.code : -32603;\n const message =\n typeof e.message === 'string'\n ? e.message\n : err instanceof Error\n ? err.message\n : 'Provider error';\n const data = 'data' in e ? e.data : undefined;\n return data === undefined ? { code, message } : { code, message, data };\n }\n return { code: -32603, message: typeof err === 'string' ? err : 'Provider error' };\n}\n","import type { TransferSummary } from './types.ts';\n\n// ── Wire message shapes (internal protocol — brand-specific names are OK) ──\n\ninterface TransferCompleteMessage {\n type: 'blink:transfer-complete';\n transfer: TransferSummary;\n}\n\ninterface TransferCompleteAckMessage {\n type: 'blink:transfer-complete-ack';\n transferId: string;\n}\n\n/**\n * Parse an incoming `MessageEvent.data` value into a validated transfer\n * completion message, or return `null` if it does not match.\n */\nexport function parseTransferComplete(data: unknown): TransferCompleteMessage | null {\n if (!data || typeof data !== 'object') {\n return null;\n }\n\n const msg = data as Record<string, unknown>;\n if (msg.type !== 'blink:transfer-complete') {\n return null;\n }\n\n const transfer = msg.transfer;\n if (!transfer || typeof transfer !== 'object') {\n return null;\n }\n\n const t = transfer as Record<string, unknown>;\n if (typeof t.id !== 'string' || typeof t.status !== 'string') {\n return null;\n }\n\n return {\n type: 'blink:transfer-complete',\n transfer: {\n id: t.id,\n status: t.status,\n amount: parseAmount(t.amount),\n destinations: parseDestinations(t.destinations),\n },\n };\n}\n\nfunction parseAmount(value: unknown): TransferSummary['amount'] {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const a = value as Record<string, unknown>;\n return {\n amount: Number(a.amount ?? 0),\n currency: String(a.currency ?? ''),\n };\n}\n\nfunction parseDestinations(value: unknown): TransferSummary['destinations'] {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n return value\n .filter((entry): entry is Record<string, unknown> => !!entry && typeof entry === 'object')\n .map((entry) => ({\n chainId: String(entry.chainId ?? ''),\n address: String(entry.address ?? ''),\n token:\n entry.token && typeof entry.token === 'object'\n ? {\n address: String((entry.token as Record<string, unknown>).address ?? ''),\n symbol: String((entry.token as Record<string, unknown>).symbol ?? ''),\n }\n : undefined,\n }));\n}\n\n/** Build an ACK message to send back to the hosted flow. */\nexport function buildAckMessage(transferId: string): TransferCompleteAckMessage {\n return {\n type: 'blink:transfer-complete-ack',\n transferId,\n };\n}\n\n// ── Close request ─────────────────────────────────────────────────────\n\ninterface CloseRequestMessage {\n type: 'blink:close-request';\n}\n\n/**\n * Parse an incoming `MessageEvent.data` value into a close-request message,\n * or return `null` if it does not match. The hosted flow sends this when\n * the user taps the close / X button inside the iframe.\n */\nexport function parseCloseRequest(data: unknown): CloseRequestMessage | null {\n if (!data || typeof data !== 'object') {\n return null;\n }\n const msg = data as Record<string, unknown>;\n if (msg.type !== 'blink:close-request') {\n return null;\n }\n return { type: 'blink:close-request' };\n}\n\n// ── Preload handshake ─────────────────────────────────────────────────\n\ninterface IframeReadyMessage {\n type: 'blink:iframe-ready';\n}\n\nexport function parseIframeReady(data: unknown): IframeReadyMessage | null {\n if (!data || typeof data !== 'object') {\n return null;\n }\n const msg = data as Record<string, unknown>;\n if (msg.type !== 'blink:iframe-ready') {\n return null;\n }\n return { type: 'blink:iframe-ready' };\n}\n\ninterface SignedPayloadMessage {\n type: 'blink:signed-payload';\n merchantId: string;\n payload: string;\n signature: string;\n}\n\nexport function buildSignedPayloadMessage(\n merchantId: string,\n payload: string,\n signature: string,\n): SignedPayloadMessage {\n return {\n type: 'blink:signed-payload',\n merchantId,\n payload,\n signature,\n };\n}\n","import { createWalletDiscoverer } from './walletBridge/discover.ts';\nimport { attachRpcHost, type RpcHostHandle } from './walletBridge/rpcHost.ts';\n\nconst STYLE_ID = 'blink-deposit-styles';\n\nconst CLOSE_DURATION_MS = 280;\nconst MOBILE_SHEET_MAX_VIEWPORT_PX = 640;\nconst MOBILE_SHEET_MAX_SCREEN_PX = 900;\n\nconst STYLES = `\n@keyframes blink-fade-in{from{opacity:0}to{opacity:1}}\n@keyframes blink-fade-out{from{opacity:1}to{opacity:0}}\n@keyframes blink-slide-up{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n@keyframes blink-slide-up-full{from{transform:translateY(100%)}to{transform:translateY(0)}}\n@keyframes blink-slide-down-full{from{transform:translateY(0)}to{transform:translateY(100%)}}\n[data-blink-overlay]{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:2147483647;animation:blink-fade-in .2s ease-out;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}\n[data-blink-overlay][data-blink-closing]{animation:blink-fade-out ${CLOSE_DURATION_MS}ms ease-in forwards;pointer-events:none}\n[data-blink-overlay][data-blink-mobile-sheet]{align-items:flex-end;touch-action:none;overscroll-behavior:contain}\n[data-blink-container]{width:min(420px,92vw);height:min(600px,85vh);border-radius:24px;overflow:hidden;box-shadow:0 24px 80px rgba(0,0,0,.4);animation:blink-slide-up .25s ease-out;display:flex;flex-direction:column;background:transparent}\n[data-blink-overlay][data-blink-closing] [data-blink-container]{opacity:0;transition:opacity ${CLOSE_DURATION_MS}ms ease-in}\n[data-blink-container] iframe{width:100%;flex:1;border:none;display:block;background:transparent;color-scheme:normal;border-radius:inherit}\n[data-blink-overlay][data-blink-mobile-sheet] [data-blink-container]{width:100%;max-width:100%;height:79vh;border-radius:24px 24px 0 0;box-shadow:0 -8px 40px rgba(0,0,0,.25);animation:blink-slide-up-full .35s cubic-bezier(.32,.72,0,1);padding-bottom:env(safe-area-inset-bottom,0px)}\n[data-blink-overlay][data-blink-mobile-sheet][data-blink-closing] [data-blink-container]{opacity:1;animation:blink-slide-down-full ${CLOSE_DURATION_MS}ms ease-in forwards}\n@media(max-width:${MOBILE_SHEET_MAX_VIEWPORT_PX}px){[data-blink-overlay]{align-items:flex-end;touch-action:none;overscroll-behavior:contain}[data-blink-container]{width:100%;max-width:100%;height:79vh;border-radius:24px 24px 0 0;box-shadow:0 -8px 40px rgba(0,0,0,.25);animation:blink-slide-up-full .35s cubic-bezier(.32,.72,0,1);padding-bottom:env(safe-area-inset-bottom,0px)}[data-blink-overlay][data-blink-closing] [data-blink-container]{opacity:1;animation:blink-slide-down-full ${CLOSE_DURATION_MS}ms ease-in forwards}}\n`;\n\nexport interface IframeHandle {\n readonly contentWindow: Window | null;\n close(): void;\n isClosed(): boolean;\n isHidden(): boolean;\n /**\n * Make a `hidden: true` overlay visible: re-evaluates the mobile-sheet\n * layout for the current viewport, locks body scroll, and attaches the\n * backdrop/Escape dismissal listeners. No-op when already visible or\n * closed. The iframe element is never reparented — moving an iframe in the\n * DOM reloads it, which would throw away the warmed-up document.\n */\n reveal(): void;\n onClose(callback: () => void): void;\n destroy(): void;\n}\n\nexport interface CreateIframeOptions {\n /**\n * Create the overlay invisible (`display: none`) for background warm-up:\n * the iframe document loads normally, but there is no backdrop, no body\n * scroll-lock, and no dismissal listeners until `reveal()` is called.\n */\n hidden?: boolean;\n}\n\n/**\n * Create a modal overlay with a cross-origin iframe pointing to the hosted\n * checkout flow. The iframe has the Permissions-Policy attributes required\n * for WebAuthn passkey ceremonies.\n *\n * The overlay is dismissed when the user clicks the backdrop, presses\n * Escape, or the hosted flow sends a `blink:close-request` postMessage.\n */\nexport function createIframe(\n url: string,\n containerElement?: HTMLElement,\n options?: CreateIframeOptions,\n): IframeHandle {\n ensureStyles();\n\n let closed = false;\n let hidden = options?.hidden === true;\n let closeCallback: (() => void) | null = null;\n\n const overlay = document.createElement('div');\n overlay.setAttribute('data-blink-overlay', '');\n if (shouldUseMobileSheetLayout()) {\n overlay.setAttribute('data-blink-mobile-sheet', '');\n }\n if (hidden) {\n overlay.style.display = 'none';\n }\n\n const container = document.createElement('div');\n container.setAttribute('data-blink-container', '');\n\n const iframe = document.createElement('iframe');\n iframe.src = url;\n\n const iframeOrigin = new URL(url).origin;\n iframe.allow =\n `publickey-credentials-get ${iframeOrigin}; publickey-credentials-create ${iframeOrigin}; clipboard-write ${iframeOrigin}`;\n\n const handle = document.createElement('div');\n\n container.appendChild(handle);\n container.appendChild(iframe);\n overlay.appendChild(container);\n\n const mountTarget = containerElement ?? document.body;\n mountTarget.appendChild(overlay);\n\n // ── Top-frame wallet bridge ────────────────────────────────────────\n // Discover EIP-6963 wallets in the parent frame (Uniswap, Rainbow,\n // and any other extension that doesn't inject into iframes) and\n // expose them to the SDK over postMessage. Old iframes that don't\n // know about the bridge never send a hello; the host stays silent\n // for them — strict additive behavior.\n const discoverer = createWalletDiscoverer();\n let rpcHostHandle: RpcHostHandle | null = null;\n const attachBridge = () => {\n if (rpcHostHandle) return;\n if (!iframe.contentWindow) return;\n rpcHostHandle = attachRpcHost({\n iframeWindow: iframe.contentWindow,\n iframeOrigin,\n discoverer,\n });\n };\n // Try once now (some browsers populate contentWindow eagerly) and\n // again on `load` for the cross-origin case.\n attachBridge();\n iframe.addEventListener('load', attachBridge);\n\n let savedOverflow = '';\n let scrollLocked = false;\n\n const onBackdropClick = (event: MouseEvent) => {\n if (event.target === overlay) triggerClose();\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') triggerClose();\n };\n\n const onTouchMove = (event: TouchEvent) => {\n if (event.target === overlay) event.preventDefault();\n };\n\n function lockScroll(): void {\n if (scrollLocked) return;\n scrollLocked = true;\n savedOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n function attachDismissalListeners(): void {\n overlay.addEventListener('click', onBackdropClick);\n overlay.addEventListener('touchmove', onTouchMove, { passive: false });\n document.addEventListener('keydown', onKeyDown);\n }\n\n // Hidden warm-up overlays must not trap Escape/scroll while invisible —\n // the host page doesn't know they exist yet.\n if (!hidden) {\n lockScroll();\n attachDismissalListeners();\n }\n\n function removeListeners(): void {\n overlay.removeEventListener('click', onBackdropClick);\n overlay.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('keydown', onKeyDown);\n }\n\n function unlockScroll(): void {\n if (!scrollLocked) return;\n scrollLocked = false;\n document.body.style.overflow = savedOverflow;\n }\n\n function triggerClose(): void {\n if (closed) return;\n closed = true;\n removeListeners();\n detachBridge();\n\n overlay.setAttribute('data-blink-closing', '');\n\n let removed = false;\n const removeOverlay = () => {\n if (removed) return;\n removed = true;\n overlay.remove();\n unlockScroll();\n closeCallback?.();\n };\n\n container.addEventListener('animationend', removeOverlay, { once: true });\n setTimeout(removeOverlay, CLOSE_DURATION_MS + 50);\n }\n\n function detachBridge(): void {\n iframe.removeEventListener('load', attachBridge);\n if (rpcHostHandle) {\n rpcHostHandle.detach();\n rpcHostHandle = null;\n }\n discoverer.destroy();\n }\n\n return {\n get contentWindow(): Window | null {\n return iframe.contentWindow;\n },\n\n close(): void {\n triggerClose();\n },\n\n isClosed(): boolean {\n return closed;\n },\n\n isHidden(): boolean {\n return hidden;\n },\n\n reveal(): void {\n if (closed || !hidden) return;\n hidden = false;\n // The viewport may have changed (resize/rotation) since the hidden\n // warm-up overlay was created — re-evaluate the sheet layout now.\n if (shouldUseMobileSheetLayout()) {\n overlay.setAttribute('data-blink-mobile-sheet', '');\n } else {\n overlay.removeAttribute('data-blink-mobile-sheet');\n }\n overlay.style.display = '';\n lockScroll();\n attachDismissalListeners();\n },\n\n onClose(callback: () => void): void {\n closeCallback = callback;\n },\n\n destroy(): void {\n closeCallback = null;\n if (!closed) {\n closed = true;\n removeListeners();\n detachBridge();\n overlay.remove();\n unlockScroll();\n }\n },\n };\n}\n\nfunction ensureStyles(): void {\n const existingStyle = document.getElementById(STYLE_ID);\n if (existingStyle) {\n if (existingStyle.textContent !== STYLES) {\n existingStyle.textContent = STYLES;\n }\n return;\n }\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = STYLES;\n document.head.appendChild(style);\n}\n\nfunction shouldUseMobileSheetLayout(): boolean {\n if (typeof window === 'undefined') return false;\n\n if (window.matchMedia?.(`(max-width: ${MOBILE_SHEET_MAX_VIEWPORT_PX}px)`).matches) {\n return true;\n }\n\n const viewportWidth = window.visualViewport?.width ?? window.innerWidth;\n if (viewportWidth > 0 && viewportWidth <= MOBILE_SHEET_MAX_VIEWPORT_PX) {\n return true;\n }\n\n const hasCoarsePointer = window.matchMedia?.('(pointer: coarse)').matches ?? false;\n if (!hasCoarsePointer) {\n return false;\n }\n\n const shortestScreenSide = Math.min(window.screen.width, window.screen.height);\n return shortestScreenSide > 0 && shortestScreenSide <= MOBILE_SHEET_MAX_SCREEN_PX;\n}\n","import { DepositError } from './errors.ts';\nimport type { SignerFunction, SignerRequest, SignerResponse } from './types.ts';\n\nconst DEFAULT_SIGNER_TIMEOUT_MS = 15_000;\n\n/**\n * Invoke the merchant signer and return the validated response.\n *\n * When `signer` is a URL string the SDK performs a `POST` with a JSON body.\n * When `signer` is a function the SDK delegates entirely to it.\n * In both cases a timeout wrapper is applied via `timeoutMs`.\n */\nexport async function callSigner(\n signer: string | SignerFunction,\n request: SignerRequest,\n timeoutMs?: number,\n): Promise<SignerResponse> {\n const timeout = timeoutMs ?? DEFAULT_SIGNER_TIMEOUT_MS;\n\n const body: SignerResponse =\n typeof signer === 'function'\n ? await invokeSignerFunction(signer, request, timeout)\n : await invokeSignerUrl(signer, request, timeout);\n\n validateSignerResponse(body);\n return body;\n}\n\nasync function invokeSignerUrl(\n signerUrl: string,\n request: SignerRequest,\n timeoutMs: number,\n): Promise<SignerResponse> {\n let response: Response;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n response = await fetch(signerUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n } catch (err) {\n if (controller.signal.aborted) {\n throw new DepositError(\n 'SIGNER_TIMEOUT',\n `Signer did not respond within ${timeoutMs}ms.`,\n );\n }\n throw new DepositError(\n 'SIGNER_NETWORK_ERROR',\n 'Unable to reach the merchant signer. Check the signer URL and network connectivity.',\n );\n } finally {\n clearTimeout(timer);\n }\n\n const body = await response.json().catch(() => null) as\n | (Partial<SignerResponse> & { error?: string })\n | null;\n\n if (!response.ok) {\n const detail = body?.error ?? `Signer returned HTTP ${response.status}.`;\n throw new DepositError('SIGNER_REQUEST_FAILED', detail);\n }\n\n return body as SignerResponse;\n}\n\nasync function invokeSignerFunction(\n signer: SignerFunction,\n request: SignerRequest,\n timeoutMs: number,\n): Promise<SignerResponse> {\n return new Promise<SignerResponse>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new DepositError('SIGNER_TIMEOUT', `Signer did not respond within ${timeoutMs}ms.`)),\n timeoutMs,\n );\n\n signer(request).then(\n (result) => { clearTimeout(timer); resolve(result); },\n (err) => {\n clearTimeout(timer);\n if (err instanceof DepositError) {\n reject(err);\n } else {\n reject(new DepositError(\n 'SIGNER_REQUEST_FAILED',\n err instanceof Error ? err.message : 'Signer function threw an error.',\n ));\n }\n },\n );\n });\n}\n\nfunction validateSignerResponse(body: unknown): asserts body is SignerResponse {\n const obj = body as Partial<SignerResponse> | null | undefined;\n if (\n !obj ||\n typeof obj.merchantId !== 'string' ||\n typeof obj.payload !== 'string' ||\n typeof obj.signature !== 'string' ||\n !obj.preview ||\n typeof obj.preview !== 'object'\n ) {\n throw new DepositError(\n 'SIGNER_RESPONSE_INVALID',\n 'Signer response is missing required fields (merchantId, payload, signature, preview).',\n );\n }\n}\n","import { DepositError } from './errors.ts';\nimport type { DepositRequest, SignerRequest } from './types.ts';\n\nconst EVM_ADDRESS_RE = /^0x[a-fA-F0-9]{40}$/;\nconst TOKEN_ADDRESS_RE = /^0x[a-fA-F0-9]{1,40}$/;\nconst SOLANA_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\nfunction isValidAddress(value: string): boolean {\n return EVM_ADDRESS_RE.test(value) || SOLANA_ADDRESS_RE.test(value);\n}\n\nfunction isValidTokenAddress(value: string): boolean {\n return TOKEN_ADDRESS_RE.test(value) || SOLANA_ADDRESS_RE.test(value);\n}\n\nexport function validateDepositRequest(request: DepositRequest): void {\n if (request.amount !== null) {\n if (typeof request.amount !== 'number' || !Number.isFinite(request.amount) || request.amount <= 0) {\n throw new DepositError('INVALID_REQUEST', 'amount must be a positive number or null.');\n }\n }\n\n if (!Number.isInteger(request.chainId) || request.chainId <= 0) {\n throw new DepositError('INVALID_REQUEST', 'chainId must be a positive integer.');\n }\n\n if (!isValidAddress(request.address)) {\n throw new DepositError(\n 'INVALID_REQUEST',\n 'address must be a valid EVM (0x-prefixed, 40 hex chars) or Solana (Base58, 32-44 chars) address.',\n );\n }\n\n if (typeof request.token !== 'string' || !isValidTokenAddress(request.token)) {\n throw new DepositError(\n 'INVALID_REQUEST',\n 'token must be a valid EVM (0x-prefixed hex) or Solana (Base58) token address.',\n );\n }\n}\n\nexport function buildSignerRequest(request: DepositRequest, webviewBaseUrl: string): SignerRequest {\n const base: SignerRequest = {\n amount: request.amount,\n chainId: request.chainId,\n address: request.address,\n token: request.token,\n callbackScheme: request.callbackScheme ?? null,\n url: webviewBaseUrl,\n version: 'v1',\n };\n\n if (request.reference) base.reference = request.reference;\n if (request.metadata && Object.keys(request.metadata).length > 0) {\n base.metadata = request.metadata;\n }\n\n return base;\n}\n","import { DepositError } from './errors.ts';\nimport {\n parseTransferComplete,\n parseCloseRequest,\n parseIframeReady,\n buildAckMessage,\n buildSignedPayloadMessage,\n} from './messages.ts';\nimport { createIframe, type IframeHandle } from './iframe.ts';\nimport { callSigner } from './signer.ts';\nimport { validateDepositRequest, buildSignerRequest } from './validation.ts';\nimport type { DepositConfig, DepositStatus, DepositRequest, DepositResult, SignerResponse } from './types.ts';\n\nexport const DEFAULT_WEBVIEW_BASE_URL = 'https://pay.blink.cash';\nexport const SANDBOX_WEBVIEW_BASE_URL = 'https://pay-sandbox.blink.cash';\n\n/** How long `requestDeposit` waits for `blink:iframe-ready` before falling back to URL params. */\nconst IFRAME_READY_TIMEOUT_MS = 2_000;\n\n/**\n * How long a background warm-up iframe may take to signal ready. Generous on\n * purpose: the warm-up happens while the user hasn't acted yet, so a slow\n * connection finishing at 10s still produces a fully warmed flow. The strict\n * 2s budget only applies once `requestDeposit` is actually waiting.\n */\nconst WARM_IFRAME_READY_TIMEOUT_MS = 60_000;\n\n/**\n * Resolves the hosted-flow base URL from config.\n *\n * Precedence: explicit `webviewBaseUrl` > `environment: 'sandbox'` > production default.\n */\nexport function resolveWebviewBaseUrl(\n config: Pick<DepositConfig, 'webviewBaseUrl' | 'environment'>,\n): string {\n if (config.webviewBaseUrl) return config.webviewBaseUrl;\n return config.environment === 'sandbox' ? SANDBOX_WEBVIEW_BASE_URL : DEFAULT_WEBVIEW_BASE_URL;\n}\n\ntype EventMap = {\n complete: (result: DepositResult) => void;\n error: (error: DepositError) => void;\n close: () => void;\n 'status-change': (status: DepositStatus) => void;\n};\n\ntype EventName = keyof EventMap;\n\n/**\n * Merchant-facing deposit SDK.\n *\n * Opens a hosted payment flow in a modal iframe, communicates with the\n * merchant's signer backend, and resolves when the user completes payment.\n *\n * The iframe has `publickey-credentials-get` and `publickey-credentials-create`\n * permissions (with explicit origin) so WebAuthn passkey ceremonies work\n * cross-origin, including in Safari.\n *\n * ```ts\n * const deposit = new Deposit({ signer: '/api/sign-payment' });\n * const result = await deposit.requestDeposit({ amount: 50, chainId: 8453, address: '0x...', token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' });\n * ```\n */\nexport class Deposit {\n private readonly config: DepositConfig;\n private iframe: IframeHandle | null = null;\n private hostedOrigin: string | null = null;\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private requestId = 0;\n private destroyed = false;\n private _status: DepositStatus = 'idle';\n private _result: DepositResult | null = null;\n private _error: DepositError | null = null;\n private flowTimer: ReturnType<typeof setTimeout> | null = null;\n private lastSignerResponse: SignerResponse | null = null;\n private warmIframe: IframeHandle | null = null;\n private warmIframeReady: Promise<boolean> | null = null;\n private warmIframeReadyCancel: (() => void) | null = null;\n private listeners: { [K in EventName]: Set<EventMap[K]> } = {\n complete: new Set(),\n error: new Set(),\n close: new Set(),\n 'status-change': new Set(),\n };\n\n /** Current phase of the deposit flow. */\n get status(): DepositStatus {\n return this._status;\n }\n\n /** Last successful {@link DepositResult}, available when `status === 'completed'`. */\n get result(): DepositResult | null {\n return this._result;\n }\n\n /** Last {@link DepositError}, available when `status === 'error'`. */\n get error(): DepositError | null {\n return this._error;\n }\n\n /** Whether a deposit flow is currently in progress (signer loading or iframe open). */\n get isActive(): boolean {\n return this._status === 'signer-loading' || this._status === 'iframe-active';\n }\n\n constructor(config: DepositConfig) {\n if (!config.signer || (typeof config.signer !== 'string' && typeof config.signer !== 'function')) {\n throw new DepositError('INVALID_REQUEST', 'DepositConfig.signer is required (URL string or SignerFunction).');\n }\n this.config = config;\n this.log('Deposit instance created', {\n signer: typeof config.signer === 'string' ? config.signer : '<function>',\n });\n if (config.preload !== false) {\n this.schedulePreload();\n }\n }\n\n /**\n * Warm up the hosted payment flow in a hidden iframe so `requestDeposit`\n * opens an already-loaded page (JS bundle, auth session restore, and —\n * when {@link DepositConfig.merchantId} is set — merchant config prefetch\n * all happen in the background).\n *\n * Runs automatically after construction unless `preload: false`; call it\n * manually to control the timing (e.g. on deposit-button hover). No-op\n * when a warm iframe already exists or a deposit flow is active.\n */\n preload(): void {\n if (this.destroyed || this.isActive) return;\n if (this.warmIframe && !this.warmIframe.isClosed()) return;\n if (typeof document === 'undefined' || typeof window === 'undefined') return;\n\n const webviewBaseUrl = resolveWebviewBaseUrl(this.config);\n this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;\n\n const preloadUrl = this.buildPreloadUrl(webviewBaseUrl);\n const iframe = createIframe(preloadUrl, this.config.containerElement, { hidden: true });\n const ready = this.waitForIframeReady(iframe, WARM_IFRAME_READY_TIMEOUT_MS);\n this.warmIframe = iframe;\n this.warmIframeReady = ready.promise;\n this.warmIframeReadyCancel = ready.cancel;\n this.log('Warm-up iframe created', { url: preloadUrl });\n }\n\n // Defer the automatic warm-up until the host page has finished its own\n // load and the main thread is idle — constructing a Deposit instance must\n // never slow the merchant page down.\n private schedulePreload(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n const start = () => {\n if (!this.destroyed && !this.isActive) this.preload();\n };\n const whenIdle = () => {\n const w = window as Window & {\n requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n };\n if (typeof w.requestIdleCallback === 'function') {\n w.requestIdleCallback(start, { timeout: 3_000 });\n } else {\n setTimeout(start, 250);\n }\n };\n\n if (document.readyState === 'complete') {\n whenIdle();\n } else {\n window.addEventListener('load', whenIdle, { once: true });\n }\n }\n\n private buildPreloadUrl(webviewBaseUrl: string): string {\n const preloadUrl = new URL(webviewBaseUrl);\n preloadUrl.searchParams.set('preload', 'true');\n // Untrusted warm-up hint: lets the hosted flow prefetch the merchant\n // config and signing key before the signed payload exists. Authorization\n // still comes exclusively from the signed payload.\n if (this.config.merchantId) {\n preloadUrl.searchParams.set('merchantId', this.config.merchantId);\n }\n this.applyFullWidgetParam(preloadUrl);\n return preloadUrl.toString();\n }\n\n /**\n * Detach the warm iframe for use by a starting flow. Returns null (and\n * cleans up) when there is none or it was closed in the meantime.\n */\n private takeWarmIframe(): {\n iframe: IframeHandle;\n ready: Promise<boolean>;\n cancelReady: () => void;\n } | null {\n const iframe = this.warmIframe;\n const ready = this.warmIframeReady;\n const cancelReady = this.warmIframeReadyCancel ?? (() => {});\n this.warmIframe = null;\n this.warmIframeReady = null;\n this.warmIframeReadyCancel = null;\n\n if (!iframe || !ready) return null;\n if (iframe.isClosed()) {\n cancelReady();\n iframe.destroy();\n return null;\n }\n return { iframe, ready, cancelReady };\n }\n\n private discardWarmIframe(): void {\n this.warmIframeReadyCancel?.();\n this.warmIframeReadyCancel = null;\n this.warmIframeReady = null;\n if (this.warmIframe) {\n this.warmIframe.destroy();\n this.warmIframe = null;\n }\n }\n\n /**\n * Open the hosted payment flow for the given deposit.\n *\n * The returned Promise resolves when the user completes the payment and\n * rejects with a {@link DepositError} on failure.\n */\n requestDeposit(request: DepositRequest): Promise<DepositResult> {\n if (this.destroyed) {\n return Promise.reject(\n new DepositError('INVALID_REQUEST', 'This Deposit instance has been destroyed.'),\n );\n }\n\n validateDepositRequest(request);\n this.log('requestDeposit called', { amount: request.amount, token: request.token, chainId: request.chainId });\n\n this.requestId += 1;\n const currentRequestId = this.requestId;\n\n this.cleanup();\n\n this._result = null;\n this._error = null;\n this.setStatus('signer-loading');\n\n return new Promise<DepositResult>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void) => {\n if (this.requestId !== currentRequestId || settled) return;\n settled = true;\n fn();\n };\n\n const onComplete = (result: DepositResult) => {\n settle(() => {\n if (this.flowTimer) {\n clearTimeout(this.flowTimer);\n this.flowTimer = null;\n }\n this._result = result;\n this._error = null;\n this.setStatus('completed');\n this.emit('complete', result);\n resolve(result);\n this.cleanup();\n });\n };\n\n const onError = (error: DepositError) => {\n settle(() => {\n this.cleanup();\n this._error = error;\n this.setStatus('error');\n this.emit('error', error);\n reject(error);\n });\n };\n\n if (this.config.flowTimeoutMs != null && this.config.flowTimeoutMs > 0) {\n this.flowTimer = setTimeout(() => {\n onError(\n new DepositError(\n 'FLOW_TIMEOUT',\n `The payment flow did not complete within ${this.config.flowTimeoutMs}ms.`,\n ),\n );\n }, this.config.flowTimeoutMs);\n }\n\n this.runSignerFlow(request, currentRequestId, onComplete, onError);\n });\n }\n\n /** Register an event listener. */\n on<K extends EventName>(event: K, handler: EventMap[K]): this {\n this.listeners[event].add(handler);\n return this;\n }\n\n /** Remove a previously registered event listener. */\n off<K extends EventName>(event: K, handler: EventMap[K]): this {\n this.listeners[event].delete(handler);\n return this;\n }\n\n /** No-op — retained for API compatibility with the popup-based SDK. */\n focus(): void {}\n\n /** Close the deposit iframe without waiting for completion. */\n close(): void {\n this.log('close() called');\n this.cleanup();\n this.setStatus('idle');\n this.emit('close');\n }\n\n /** Tear down the instance and release all resources. */\n destroy(): void {\n this.log('destroy() called');\n // Set before cleanup() so it doesn't schedule a fresh warm-up iframe.\n this.destroyed = true;\n this.cleanup();\n this.discardWarmIframe();\n this.setStatus('idle');\n for (const set of Object.values(this.listeners)) {\n (set as Set<unknown>).clear();\n }\n }\n\n // ── Private ──────────────────────────────────────────────────────────\n\n private log(message: string, data?: Record<string, unknown>): void {\n if (!this.config.debug) return;\n if (data) {\n console.debug(`[BlinkDeposit] ${message}`, data);\n } else {\n console.debug(`[BlinkDeposit] ${message}`);\n }\n }\n\n /**\n * Appends `enableFullWidget=false` to the hosted-flow URL when the merchant\n * integration disables the full widget. Absence of the param means enabled\n * (the default) — the hosted flow ANDs this with the merchant's backend\n * config, so the full widget renders only when both allow it.\n */\n private applyFullWidgetParam(url: URL): void {\n if (this.config.enableFullWidget === false) {\n url.searchParams.set('enableFullWidget', 'false');\n }\n }\n\n private setStatus(status: DepositStatus): void {\n if (this._status === status) return;\n this.log(`Status: ${this._status} → ${status}`);\n this._status = status;\n this.emit('status-change', status);\n }\n\n private async runSignerFlow(\n request: DepositRequest,\n requestId: number,\n onComplete: (result: DepositResult) => void,\n onError: (error: DepositError) => void,\n ): Promise<void> {\n try {\n const webviewBaseUrl = resolveWebviewBaseUrl(this.config);\n this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;\n\n this.log('Calling signer', {\n signer: typeof this.config.signer === 'string' ? this.config.signer : '<function>',\n });\n const signerRequest = buildSignerRequest(request, webviewBaseUrl);\n\n // Reuse the background warm-up iframe when one exists — its document\n // (JS bundle, auth warm-up, merchant prefetches) is already loaded or\n // loading. Otherwise create the preload iframe now so the bundle at\n // least loads in parallel with the signer call.\n let preloadIframe: IframeHandle;\n let iframeReadyPromise: Promise<boolean>;\n\n const warm = this.takeWarmIframe();\n if (warm) {\n warm.iframe.reveal();\n preloadIframe = warm.iframe;\n // The warm-up wait is generous (60s); from the moment the user acts\n // we only give it the regular 2s budget before falling back. Either\n // way, settle the underlying warm-up wait so its timer and message\n // listener are released.\n iframeReadyPromise = Promise.race([\n warm.ready,\n new Promise<boolean>((resolve) =>\n setTimeout(() => resolve(false), IFRAME_READY_TIMEOUT_MS),\n ),\n ]).then((ready) => {\n warm.cancelReady();\n return ready;\n });\n this.log('Reusing warm preload iframe');\n } else {\n preloadIframe = createIframe(\n this.buildPreloadUrl(webviewBaseUrl),\n this.config.containerElement,\n );\n iframeReadyPromise = this.waitForIframeReady(preloadIframe).promise;\n }\n this.iframe = preloadIframe;\n\n preloadIframe.onClose(() => {\n onError(\n new DepositError(\n 'DEPOSIT_DISMISSED',\n 'The deposit was dismissed before the transfer completed.',\n ),\n );\n this.cleanup();\n this.emit('close');\n });\n\n // Race: signer call and iframe ready signal in parallel\n const signerPromise = callSigner(\n this.config.signer,\n signerRequest,\n this.config.signerTimeoutMs,\n );\n\n const [signerResponse, iframeReady] = await Promise.all([\n signerPromise,\n iframeReadyPromise,\n ]);\n\n this.lastSignerResponse = signerResponse;\n this.log('Signer responded', { merchantId: signerResponse.merchantId });\n\n if (this.requestId !== requestId || preloadIframe.isClosed()) {\n this.log('Request superseded or iframe dismissed during signer call');\n return;\n }\n\n if (iframeReady) {\n // New webview supports preloading — deliver payload via postMessage\n const contentWindow = preloadIframe.contentWindow;\n if (contentWindow) {\n contentWindow.postMessage(\n buildSignedPayloadMessage(\n signerResponse.merchantId,\n signerResponse.payload,\n signerResponse.signature,\n ),\n this.hostedOrigin!,\n );\n }\n this.startMessageListener(preloadIframe, onComplete);\n this.setStatus('iframe-active');\n this.log('Payload delivered via postMessage (preload path)');\n } else {\n // Fallback: old webview did not send blink:iframe-ready.\n // Destroy preload iframe and create a new one with full URL params.\n preloadIframe.destroy();\n\n const hostedUrl = new URL(webviewBaseUrl);\n hostedUrl.searchParams.set('merchantId', signerResponse.merchantId);\n hostedUrl.searchParams.set('payload', signerResponse.payload);\n hostedUrl.searchParams.set('signature', signerResponse.signature);\n this.applyFullWidgetParam(hostedUrl);\n const targetUrl = hostedUrl.toString();\n\n const iframeHandle = createIframe(targetUrl, this.config.containerElement);\n this.iframe = iframeHandle;\n\n iframeHandle.onClose(() => {\n onError(\n new DepositError(\n 'DEPOSIT_DISMISSED',\n 'The deposit was dismissed before the transfer completed.',\n ),\n );\n this.cleanup();\n this.emit('close');\n });\n\n this.startMessageListener(iframeHandle, onComplete);\n this.setStatus('iframe-active');\n this.log('Iframe opened with hosted flow (fallback path)', { url: targetUrl });\n }\n } catch (err) {\n if (this.requestId !== requestId) return;\n\n this.log('Signer flow failed', { error: err instanceof Error ? err.message : String(err) });\n\n if (err instanceof DepositError) {\n onError(err);\n } else {\n onError(\n new DepositError(\n 'SIGNER_NETWORK_ERROR',\n err instanceof Error ? err.message : 'Unknown signer error.',\n ),\n );\n }\n }\n }\n\n /**\n * Resolves true when the iframe posts `blink:iframe-ready`, false on\n * timeout. `cancel()` settles the promise as false immediately and releases\n * the listener + timer — used to reap the generous warm-up wait once it no\n * longer matters (warm iframe consumed or discarded).\n */\n private waitForIframeReady(\n iframeHandle: IframeHandle,\n timeoutMs: number = IFRAME_READY_TIMEOUT_MS,\n ): { promise: Promise<boolean>; cancel: () => void } {\n let finish: (ready: boolean) => void = () => {};\n\n const promise = new Promise<boolean>((resolve) => {\n const handler = (event: MessageEvent) => {\n if (event.origin !== this.hostedOrigin) return;\n if (event.source !== iframeHandle.contentWindow) return;\n if (parseIframeReady(event.data)) {\n finish(true);\n }\n };\n window.addEventListener('message', handler);\n\n const timeout = setTimeout(() => {\n this.log('Iframe ready timeout — falling back to URL params');\n finish(false);\n }, timeoutMs);\n\n let settled = false;\n finish = (ready: boolean) => {\n if (settled) return;\n settled = true;\n window.removeEventListener('message', handler);\n clearTimeout(timeout);\n resolve(ready);\n };\n });\n\n return { promise, cancel: () => finish(false) };\n }\n\n private startMessageListener(\n iframeHandle: IframeHandle,\n onComplete: (result: DepositResult) => void,\n ): void {\n const handler = (event: MessageEvent) => {\n if (this.hostedOrigin && event.origin !== this.hostedOrigin) {\n return;\n }\n\n const contentWindow = iframeHandle.contentWindow;\n if (event.source && contentWindow && event.source !== contentWindow) {\n return;\n }\n\n if (parseCloseRequest(event.data)) {\n this.log('Close request received from hosted flow');\n iframeHandle.close();\n return;\n }\n\n const message = parseTransferComplete(event.data);\n if (!message) {\n return;\n }\n\n this.log('Transfer complete received', { transferId: message.transfer.id, status: message.transfer.status });\n\n if (contentWindow) {\n try {\n contentWindow.postMessage(\n buildAckMessage(message.transfer.id),\n this.hostedOrigin ?? '*',\n );\n } catch {\n // Cross-origin postMessage can throw in edge cases — safe to swallow.\n }\n }\n\n const depositResult: DepositResult = { transfer: message.transfer };\n if (this.lastSignerResponse?.preview) {\n depositResult.idempotencyKey = this.lastSignerResponse.preview.idempotencyKey;\n depositResult.preview = {\n amount: this.lastSignerResponse.preview.amount,\n chainId: this.lastSignerResponse.preview.chainId,\n address: this.lastSignerResponse.preview.address,\n token: this.lastSignerResponse.preview.token,\n };\n }\n onComplete(depositResult);\n };\n\n this.messageListener = handler;\n window.addEventListener('message', handler);\n }\n\n private cleanup(): void {\n if (this.flowTimer) {\n clearTimeout(this.flowTimer);\n this.flowTimer = null;\n }\n\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n if (this.iframe) {\n this.iframe.destroy();\n this.iframe = null;\n }\n\n this.hostedOrigin = null;\n this.lastSignerResponse = null;\n\n // The flow that owned the iframe is over — warm a fresh one up for the\n // next deposit. When cleanup() runs at the start of requestDeposit the\n // deferred callback sees an active flow and skips.\n if (!this.destroyed && this.config.preload !== false) {\n this.schedulePreload();\n }\n }\n\n private emit<K extends EventName>(event: K, ...args: Parameters<EventMap[K]>): void {\n for (const handler of this.listeners[event]) {\n try {\n (handler as (...a: unknown[]) => void)(...args);\n } catch {\n // Swallow listener errors to avoid breaking the SDK flow.\n }\n }\n }\n}\n\n/** @deprecated Use {@link Deposit} instead. */\nexport const Checkout = Deposit;\n"]}
|