@swype-org/react-sdk 0.2.364 → 0.2.375
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/index.cjs +331 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -1
- package/dist/index.d.ts +43 -1
- package/dist/index.js +330 -100
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -499,6 +499,14 @@ function isVisibleUsdAmountAtTwoDecimals(amount) {
|
|
|
499
499
|
function isSelectableDepositSourceAmountUsd(amount, minTransferAmountUsd = DEFAULT_MIN_SEND_AMOUNT_USD) {
|
|
500
500
|
return Number.isFinite(amount) && amount >= minTransferAmountUsd;
|
|
501
501
|
}
|
|
502
|
+
function buildNativeUnsupportedEntries(options) {
|
|
503
|
+
return options.map((option) => ({
|
|
504
|
+
tokenSymbol: option.tokenSymbol,
|
|
505
|
+
chainName: option.chainName,
|
|
506
|
+
amount: parseRawBalance(option.rawBalance, option.decimals),
|
|
507
|
+
logoURI: option.logoURI ?? null
|
|
508
|
+
})).filter((entry) => entry.amount > 0);
|
|
509
|
+
}
|
|
502
510
|
function buildSelectSourceChoices(options, minTransferAmountUsd = DEFAULT_MIN_SEND_AMOUNT_USD) {
|
|
503
511
|
const chainChoices = [];
|
|
504
512
|
const chainIndexByName = /* @__PURE__ */ new Map();
|
|
@@ -612,6 +620,21 @@ function resolveSelectSourceOption(choices, options, chainName, tokenSymbol, rec
|
|
|
612
620
|
));
|
|
613
621
|
}
|
|
614
622
|
|
|
623
|
+
// src/walletFlow.ts
|
|
624
|
+
var MOBILE_USER_AGENT_PATTERN = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
|
|
625
|
+
function isMobileUserAgent(userAgent) {
|
|
626
|
+
if (!userAgent) {
|
|
627
|
+
return false;
|
|
628
|
+
}
|
|
629
|
+
return MOBILE_USER_AGENT_PATTERN.test(userAgent);
|
|
630
|
+
}
|
|
631
|
+
function shouldUseWalletConnector(options) {
|
|
632
|
+
return options.useWalletConnector ?? !isMobileUserAgent(options.userAgent);
|
|
633
|
+
}
|
|
634
|
+
function resolveCoinbasePreferenceOptions(userAgent) {
|
|
635
|
+
return isMobileUserAgent(userAgent) ? "all" : "eoaOnly";
|
|
636
|
+
}
|
|
637
|
+
|
|
615
638
|
// src/walletBridge/protocol.ts
|
|
616
639
|
var BRIDGE_PROTOCOL_VERSION = 1;
|
|
617
640
|
function parseBridgeMessage(data) {
|
|
@@ -977,23 +1000,29 @@ var BLINK_PRIVY_APP_ID = "cmlil87uv004n0ck0blwumwek";
|
|
|
977
1000
|
var BLINK_WC_PROJECT_ID = "f6c60234412f94ef9108dc8f67f4362c";
|
|
978
1001
|
var BLINK_FINGERPRINT_API_KEY = "nr4FvTsZ6M5z2141FqrM";
|
|
979
1002
|
var BLINK_FINGERPRINT_REGION = "us";
|
|
980
|
-
function FingerprintVisitorPing() {
|
|
981
|
-
useVisitorData({ immediate: true });
|
|
982
|
-
return null;
|
|
983
|
-
}
|
|
984
1003
|
function buildStaticConnectors() {
|
|
1004
|
+
const userAgent = typeof navigator === "undefined" ? null : navigator.userAgent;
|
|
985
1005
|
return [
|
|
986
1006
|
// `unstable_shimAsyncInject` covers wallets whose content scripts wire
|
|
987
1007
|
// up after page load (Phantom, Trust, MetaMask in the iframe).
|
|
988
1008
|
injected({ unstable_shimAsyncInject: 2e3 }),
|
|
989
|
-
//
|
|
990
|
-
//
|
|
991
|
-
//
|
|
992
|
-
//
|
|
993
|
-
//
|
|
994
|
-
//
|
|
995
|
-
//
|
|
996
|
-
|
|
1009
|
+
// Coinbase Wallet SDK connection preference is platform-specific
|
|
1010
|
+
// (see `resolveCoinbasePreferenceOptions`):
|
|
1011
|
+
// • Desktop → `eoaOnly`: in smart-wallet mode the Base extension hands
|
|
1012
|
+
// the dapp a separate, often-empty smart-wallet account instead of the
|
|
1013
|
+
// user's funded EOA → "no assets". `eoaOnly` binds the funded EOA.
|
|
1014
|
+
// • Mobile (Base in-app WebView) → `all`: signing must use the injected
|
|
1015
|
+
// `window.ethereum`; the SDK path reloads the iOS WKWebView after each
|
|
1016
|
+
// signature.
|
|
1017
|
+
//
|
|
1018
|
+
// Exactly ONE Coinbase connector: two `@coinbase/wallet-sdk` instances in
|
|
1019
|
+
// one page collide on shared `window` listeners + the Communicator (Privy
|
|
1020
|
+
// connector-init timeout, listener leaks, duplicated `client-project-name`
|
|
1021
|
+
// that 400s the connect), so we never register a second one.
|
|
1022
|
+
coinbaseWallet({
|
|
1023
|
+
appName: "Blink",
|
|
1024
|
+
preference: { options: resolveCoinbasePreferenceOptions(userAgent) }
|
|
1025
|
+
})
|
|
997
1026
|
];
|
|
998
1027
|
}
|
|
999
1028
|
function buildWagmiConfig(bridgedWallets) {
|
|
@@ -1079,30 +1108,30 @@ function BlinkProvider({
|
|
|
1079
1108
|
);
|
|
1080
1109
|
return (
|
|
1081
1110
|
// Outermost wrapper: loads the Fingerprint browser agent once per
|
|
1082
|
-
// provider mount, independent of wagmi/privy/query state.
|
|
1083
|
-
//
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
intl: {
|
|
1096
|
-
defaultCountry: "US"
|
|
1097
|
-
},
|
|
1098
|
-
embeddedWallets: {
|
|
1099
|
-
showWalletUIs: false
|
|
1100
|
-
}
|
|
1111
|
+
// provider mount, independent of wagmi/privy/query state. The agent loads
|
|
1112
|
+
// here (including during the hidden preload warm-up), but identification is
|
|
1113
|
+
// deferred to explicit flow events fired from `BlinkPayment` — see
|
|
1114
|
+
// `useFingerprintFlowEvents` — so a preload that never opens is never
|
|
1115
|
+
// identified.
|
|
1116
|
+
/* @__PURE__ */ jsx(FingerprintProvider, { apiKey: BLINK_FINGERPRINT_API_KEY, region: BLINK_FINGERPRINT_REGION, children: /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClientRef.current, children: /* @__PURE__ */ jsx(WagmiProvider, { config: wagmiConfig, reconnectOnMount: false, children: /* @__PURE__ */ jsx(
|
|
1117
|
+
PrivyProvider,
|
|
1118
|
+
{
|
|
1119
|
+
appId: privyAppId ?? BLINK_PRIVY_APP_ID,
|
|
1120
|
+
config: {
|
|
1121
|
+
appearance: {
|
|
1122
|
+
theme: getThemeBase(theme),
|
|
1123
|
+
accentColor: getTheme(theme).accent
|
|
1101
1124
|
},
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1125
|
+
intl: {
|
|
1126
|
+
defaultCountry: "US"
|
|
1127
|
+
},
|
|
1128
|
+
embeddedWallets: {
|
|
1129
|
+
showWalletUIs: false
|
|
1130
|
+
}
|
|
1131
|
+
},
|
|
1132
|
+
children: /* @__PURE__ */ jsx(BlinkContext.Provider, { value, children })
|
|
1133
|
+
}
|
|
1134
|
+
) }) }) })
|
|
1106
1135
|
);
|
|
1107
1136
|
}
|
|
1108
1137
|
function useBlinkConfig() {
|
|
@@ -1143,9 +1172,10 @@ function buildTargetMatchers(target) {
|
|
|
1143
1172
|
aliases.add("io.metamask");
|
|
1144
1173
|
}
|
|
1145
1174
|
if (value === "base" || value === "base account" || value === "base app" || value.includes("coinbase")) {
|
|
1146
|
-
aliases.add("base");
|
|
1147
1175
|
aliases.add("coinbase");
|
|
1148
1176
|
aliases.add("coinbasewalletsdk");
|
|
1177
|
+
aliases.add("com.coinbase.wallet");
|
|
1178
|
+
aliases.add("baseaccount");
|
|
1149
1179
|
}
|
|
1150
1180
|
if (value.includes("trust")) {
|
|
1151
1181
|
aliases.add("trust");
|
|
@@ -1219,19 +1249,70 @@ async function withTimeout(promise, ms, label) {
|
|
|
1219
1249
|
if (timer !== void 0) clearTimeout(timer);
|
|
1220
1250
|
}
|
|
1221
1251
|
}
|
|
1222
|
-
function
|
|
1252
|
+
function isCoinbaseSdkConnector(connector) {
|
|
1223
1253
|
if (!connector) return false;
|
|
1224
1254
|
return connectorMatchesWallet(
|
|
1225
1255
|
{ id: connector.id, name: connector.name ?? "" },
|
|
1226
1256
|
{ wagmiConnectorId: "coinbaseWalletSDK" }
|
|
1227
1257
|
);
|
|
1228
1258
|
}
|
|
1259
|
+
var COINBASE_SDK_STORAGE_PREFIXES = ["-CBWSDK", "-walletlink"];
|
|
1260
|
+
var COINBASE_SIGNER_TYPE_STORAGE_KEY = "-CBWSDK:SignerConfigurator:SignerType";
|
|
1261
|
+
function loadCoinbaseSignerType() {
|
|
1262
|
+
if (typeof window === "undefined" || !window.localStorage) return null;
|
|
1263
|
+
try {
|
|
1264
|
+
return window.localStorage.getItem(COINBASE_SIGNER_TYPE_STORAGE_KEY);
|
|
1265
|
+
} catch {
|
|
1266
|
+
return null;
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
function clearCoinbaseWalletSdkSession() {
|
|
1270
|
+
if (typeof window === "undefined" || !window.localStorage) return;
|
|
1271
|
+
try {
|
|
1272
|
+
const store = window.localStorage;
|
|
1273
|
+
const keysToRemove = [];
|
|
1274
|
+
for (let i = 0; i < store.length; i += 1) {
|
|
1275
|
+
const key = store.key(i);
|
|
1276
|
+
if (key && COINBASE_SDK_STORAGE_PREFIXES.some((prefix) => key.startsWith(prefix))) {
|
|
1277
|
+
keysToRemove.push(key);
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
keysToRemove.forEach((key) => store.removeItem(key));
|
|
1281
|
+
console.info("[blink-sdk][disconnect] cleared Coinbase Wallet SDK session", {
|
|
1282
|
+
clearedKeys: keysToRemove.length
|
|
1283
|
+
});
|
|
1284
|
+
} catch (err) {
|
|
1285
|
+
console.info("[blink-sdk][disconnect] failed to clear Coinbase Wallet SDK session", err);
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
function resetWagmiConnectionInMemory(wagmiConfig, connector) {
|
|
1289
|
+
if (!connector) return;
|
|
1290
|
+
try {
|
|
1291
|
+
const target = connector;
|
|
1292
|
+
const connections = [...wagmiConfig.state.connections.values()];
|
|
1293
|
+
const match = connections.find((conn) => {
|
|
1294
|
+
const live2 = conn.connector;
|
|
1295
|
+
if (target.uid && live2.uid) return live2.uid === target.uid;
|
|
1296
|
+
return live2.id === target.id;
|
|
1297
|
+
});
|
|
1298
|
+
const live = match?.connector;
|
|
1299
|
+
if (!live?.emitter) return;
|
|
1300
|
+
live.emitter.emit("disconnect");
|
|
1301
|
+
console.info("[blink-sdk][disconnect] reset wagmi in-memory connection via emitter", {
|
|
1302
|
+
connectorId: live.id
|
|
1303
|
+
});
|
|
1304
|
+
} catch (err) {
|
|
1305
|
+
console.info("[blink-sdk][disconnect] failed to reset wagmi in-memory connection", err);
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1229
1308
|
async function safeDisconnect(wagmiConfig, connector) {
|
|
1230
|
-
if (
|
|
1309
|
+
if (isCoinbaseSdkConnector(connector)) {
|
|
1231
1310
|
console.info(
|
|
1232
|
-
"[blink-sdk][disconnect]
|
|
1311
|
+
"[blink-sdk][disconnect] clearing Coinbase Wallet SDK session instead of wagmi disconnect",
|
|
1233
1312
|
{ connectorId: connector?.id }
|
|
1234
1313
|
);
|
|
1314
|
+
clearCoinbaseWalletSdkSession();
|
|
1315
|
+
resetWagmiConnectionInMemory(wagmiConfig, connector);
|
|
1235
1316
|
return;
|
|
1236
1317
|
}
|
|
1237
1318
|
await disconnect(wagmiConfig, { connector }).catch(() => {
|
|
@@ -3885,6 +3966,23 @@ function isUserRejection(msg) {
|
|
|
3885
3966
|
const lower = msg.toLowerCase();
|
|
3886
3967
|
return lower.includes("rejected") || lower.includes("denied");
|
|
3887
3968
|
}
|
|
3969
|
+
var EmptyConnectionAccountError = class extends Error {
|
|
3970
|
+
constructor(message = "Wallet connected but returned no account address.") {
|
|
3971
|
+
super(message);
|
|
3972
|
+
this.name = "EmptyConnectionAccountError";
|
|
3973
|
+
}
|
|
3974
|
+
};
|
|
3975
|
+
var EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
|
|
3976
|
+
function assertNonEmptyConnectedAddress(address, ctx) {
|
|
3977
|
+
if (typeof address === "string" && EVM_ADDRESS_RE.test(address)) {
|
|
3978
|
+
return;
|
|
3979
|
+
}
|
|
3980
|
+
appendDebug("error", "OPEN_PROVIDER: empty-or-invalid-connected-address", {
|
|
3981
|
+
...ctx,
|
|
3982
|
+
address: address ?? null
|
|
3983
|
+
});
|
|
3984
|
+
throw new EmptyConnectionAccountError();
|
|
3985
|
+
}
|
|
3888
3986
|
function requiresExplicitEvmNonce(account) {
|
|
3889
3987
|
return connectorMatchesWallet(account?.connector, { providerName: "trust" }) || connectorMatchesWallet(account?.connector, { providerName: "phantom" });
|
|
3890
3988
|
}
|
|
@@ -4118,7 +4216,8 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
|
|
|
4118
4216
|
accountConnectorId: account.connector?.id ?? null,
|
|
4119
4217
|
accountConnectorName: account.connector?.name ?? null,
|
|
4120
4218
|
targetId: targetId ?? null,
|
|
4121
|
-
resolvedConnectorId: connector?.id ?? null
|
|
4219
|
+
resolvedConnectorId: connector?.id ?? null,
|
|
4220
|
+
availableConnectorIds: connectors.map((c) => c.id)
|
|
4122
4221
|
};
|
|
4123
4222
|
let disconnectedMismatchedConnector = false;
|
|
4124
4223
|
if (account.isConnected && account.address) {
|
|
@@ -4126,6 +4225,7 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
|
|
|
4126
4225
|
if (connectorMatchesTarget) {
|
|
4127
4226
|
const hexChainId2 = account.chainId ? `0x${account.chainId.toString(16)}` : void 0;
|
|
4128
4227
|
const branch = !targetId ? "early-return-no-target" : "early-return-connector-match";
|
|
4228
|
+
assertNonEmptyConnectedAddress(account.address, { ...logContext, branch });
|
|
4129
4229
|
console.info("[blink-sdk][open-provider] Skipping connectAsync; wagmi already connected.", {
|
|
4130
4230
|
...logContext,
|
|
4131
4231
|
branch
|
|
@@ -4149,6 +4249,20 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
|
|
|
4149
4249
|
disconnectedMismatchedConnector = true;
|
|
4150
4250
|
}
|
|
4151
4251
|
if (!disconnectedMismatchedConnector) {
|
|
4252
|
+
const targetIsCoinbase = connectorMatchesWallet(connector, {
|
|
4253
|
+
wagmiConnectorId: "coinbaseWalletSDK"
|
|
4254
|
+
});
|
|
4255
|
+
const isDesktopUa = !isMobileUserAgent(
|
|
4256
|
+
typeof navigator === "undefined" ? null : navigator.userAgent
|
|
4257
|
+
);
|
|
4258
|
+
if (targetIsCoinbase && isDesktopUa && loadCoinbaseSignerType() === "scw") {
|
|
4259
|
+
console.info(
|
|
4260
|
+
"[blink-sdk][open-provider] Clearing stale Coinbase Smart Wallet (scw) session before reconnect so eoaOnly binds the EOA.",
|
|
4261
|
+
logContext
|
|
4262
|
+
);
|
|
4263
|
+
appendDebug("info", "OPEN_PROVIDER: clearing stale scw session before reconnect", logContext);
|
|
4264
|
+
clearCoinbaseWalletSdkSession();
|
|
4265
|
+
}
|
|
4152
4266
|
console.info("[blink-sdk][open-provider] Attempting silent reconnect.", logContext);
|
|
4153
4267
|
appendDebug("info", "OPEN_PROVIDER: attempting silent reconnect", logContext);
|
|
4154
4268
|
const reconnections = await reconnect(wagmiConfig).catch(() => []);
|
|
@@ -4163,6 +4277,7 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
|
|
|
4163
4277
|
reconnectedConnectorId: reconnectedAccount.connector?.id ?? null,
|
|
4164
4278
|
reconnectionCount: reconnections.length
|
|
4165
4279
|
};
|
|
4280
|
+
assertNonEmptyConnectedAddress(reconnectedAccount.address, reconnectLogContext);
|
|
4166
4281
|
console.info(
|
|
4167
4282
|
"[blink-sdk][open-provider] Silent reconnect succeeded; skipping connectAsync.",
|
|
4168
4283
|
reconnectLogContext
|
|
@@ -4230,6 +4345,10 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
|
|
|
4230
4345
|
});
|
|
4231
4346
|
const result = await connectAsync({ connector });
|
|
4232
4347
|
const hexChainId = `0x${result.chainId.toString(16)}`;
|
|
4348
|
+
assertNonEmptyConnectedAddress(result.accounts[0], {
|
|
4349
|
+
...logContext,
|
|
4350
|
+
branch: "connectAsync-result"
|
|
4351
|
+
});
|
|
4233
4352
|
return actionSuccess(
|
|
4234
4353
|
action,
|
|
4235
4354
|
`Connected to ${connector.name}. Account: ${result.accounts[0]}, Chain: ${hexChainId}`,
|
|
@@ -4237,15 +4356,23 @@ async function executeOpenProvider(action, wagmiConfig, connectors, connectAsync
|
|
|
4237
4356
|
);
|
|
4238
4357
|
} catch (err) {
|
|
4239
4358
|
const msg = err instanceof Error ? err.message : "Failed to connect wallet";
|
|
4240
|
-
|
|
4241
|
-
|
|
4359
|
+
const emptyAccount = err instanceof EmptyConnectionAccountError;
|
|
4360
|
+
if (options?.externalAuthorizationAvailable && (isUserRejection(msg) || emptyAccount) && action.metadata?.chainFamily !== "svm") {
|
|
4361
|
+
appendDebug("info", "OPEN_PROVIDER: soft-halt", {
|
|
4242
4362
|
actionId: action.id,
|
|
4243
|
-
externalAuthorizationAvailable: true
|
|
4363
|
+
externalAuthorizationAvailable: true,
|
|
4364
|
+
reason: emptyAccount ? "empty-account" : "user-rejection"
|
|
4244
4365
|
});
|
|
4245
4366
|
return actionPending(
|
|
4246
4367
|
action,
|
|
4247
4368
|
"awaiting-external-authorization",
|
|
4248
|
-
"Wallet connection prompt dismissed \u2014 awaiting completion via cross-device authorization."
|
|
4369
|
+
emptyAccount ? "Wallet returned no account \u2014 awaiting completion via cross-device authorization." : "Wallet connection prompt dismissed \u2014 awaiting completion via cross-device authorization."
|
|
4370
|
+
);
|
|
4371
|
+
}
|
|
4372
|
+
if (emptyAccount) {
|
|
4373
|
+
return actionError(
|
|
4374
|
+
action,
|
|
4375
|
+
"We couldn't read an address from that wallet. Please reconnect and make sure an account is selected."
|
|
4249
4376
|
);
|
|
4250
4377
|
}
|
|
4251
4378
|
if (action.metadata?.chainFamily === "svm") {
|
|
@@ -6951,18 +7078,6 @@ function updateTrackedSession(sessions, ownerSessionId, reportedSession, actionS
|
|
|
6951
7078
|
}
|
|
6952
7079
|
}
|
|
6953
7080
|
|
|
6954
|
-
// src/walletFlow.ts
|
|
6955
|
-
var MOBILE_USER_AGENT_PATTERN = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
|
|
6956
|
-
function isMobileUserAgent(userAgent) {
|
|
6957
|
-
if (!userAgent) {
|
|
6958
|
-
return false;
|
|
6959
|
-
}
|
|
6960
|
-
return MOBILE_USER_AGENT_PATTERN.test(userAgent);
|
|
6961
|
-
}
|
|
6962
|
-
function shouldUseWalletConnector(options) {
|
|
6963
|
-
return options.useWalletConnector ?? !isMobileUserAgent(options.userAgent);
|
|
6964
|
-
}
|
|
6965
|
-
|
|
6966
7081
|
// src/enterAmountInput.ts
|
|
6967
7082
|
var MAX_FRACTION_DIGITS = 2;
|
|
6968
7083
|
function isDigit(value) {
|
|
@@ -8562,6 +8677,52 @@ var buttonStyle = (color, hovered) => ({
|
|
|
8562
8677
|
flexShrink: 0,
|
|
8563
8678
|
transition: "background 0.15s ease"
|
|
8564
8679
|
});
|
|
8680
|
+
var INTERCOM_HELP_URL = "https://intercom.help/blinkcash/en/";
|
|
8681
|
+
var TERMS_URL = "https://blink.cash/terms";
|
|
8682
|
+
function SupportFooter() {
|
|
8683
|
+
const { tokens } = useBlinkConfig();
|
|
8684
|
+
return /* @__PURE__ */ jsxs("div", { style: containerStyle2(tokens.textMuted), children: [
|
|
8685
|
+
/* @__PURE__ */ jsx(
|
|
8686
|
+
"a",
|
|
8687
|
+
{
|
|
8688
|
+
href: INTERCOM_HELP_URL,
|
|
8689
|
+
target: "_blank",
|
|
8690
|
+
rel: "noopener noreferrer",
|
|
8691
|
+
style: linkStyle(tokens.textMuted),
|
|
8692
|
+
children: "Help"
|
|
8693
|
+
}
|
|
8694
|
+
),
|
|
8695
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: dotStyle(tokens.textTertiary), children: "\u2022" }),
|
|
8696
|
+
/* @__PURE__ */ jsx(
|
|
8697
|
+
"a",
|
|
8698
|
+
{
|
|
8699
|
+
href: TERMS_URL,
|
|
8700
|
+
target: "_blank",
|
|
8701
|
+
rel: "noopener noreferrer",
|
|
8702
|
+
style: linkStyle(tokens.textMuted),
|
|
8703
|
+
children: "Terms"
|
|
8704
|
+
}
|
|
8705
|
+
)
|
|
8706
|
+
] });
|
|
8707
|
+
}
|
|
8708
|
+
var containerStyle2 = (color) => ({
|
|
8709
|
+
display: "flex",
|
|
8710
|
+
alignItems: "center",
|
|
8711
|
+
justifyContent: "center",
|
|
8712
|
+
gap: 10,
|
|
8713
|
+
fontSize: "0.8rem",
|
|
8714
|
+
color,
|
|
8715
|
+
padding: "4px 0"
|
|
8716
|
+
});
|
|
8717
|
+
var linkStyle = (color) => ({
|
|
8718
|
+
color,
|
|
8719
|
+
fontWeight: 500,
|
|
8720
|
+
textDecoration: "none"
|
|
8721
|
+
});
|
|
8722
|
+
var dotStyle = (color) => ({
|
|
8723
|
+
color,
|
|
8724
|
+
fontSize: "0.8rem"
|
|
8725
|
+
});
|
|
8565
8726
|
function SettingsMenu({ onLogout }) {
|
|
8566
8727
|
const { tokens } = useBlinkConfig();
|
|
8567
8728
|
const [open, setOpen] = useState(false);
|
|
@@ -8577,7 +8738,7 @@ function SettingsMenu({ onLogout }) {
|
|
|
8577
8738
|
document.addEventListener("mousedown", handleClickOutside);
|
|
8578
8739
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
8579
8740
|
}, [open]);
|
|
8580
|
-
return /* @__PURE__ */ jsxs("div", { ref: menuRef, style:
|
|
8741
|
+
return /* @__PURE__ */ jsxs("div", { ref: menuRef, style: containerStyle3, children: [
|
|
8581
8742
|
/* @__PURE__ */ jsx(IconButton, { onClick: toggle, "aria-label": "Settings", children: /* @__PURE__ */ jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", children: [
|
|
8582
8743
|
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "5", r: "2", fill: "currentColor" }),
|
|
8583
8744
|
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "2", fill: "currentColor" }),
|
|
@@ -8587,7 +8748,7 @@ function SettingsMenu({ onLogout }) {
|
|
|
8587
8748
|
/* @__PURE__ */ jsxs(
|
|
8588
8749
|
"a",
|
|
8589
8750
|
{
|
|
8590
|
-
href:
|
|
8751
|
+
href: INTERCOM_HELP_URL,
|
|
8591
8752
|
target: "_blank",
|
|
8592
8753
|
rel: "noopener noreferrer",
|
|
8593
8754
|
onClick: () => setOpen(false),
|
|
@@ -8624,7 +8785,7 @@ function SettingsMenu({ onLogout }) {
|
|
|
8624
8785
|
] })
|
|
8625
8786
|
] });
|
|
8626
8787
|
}
|
|
8627
|
-
var
|
|
8788
|
+
var containerStyle3 = {
|
|
8628
8789
|
position: "relative"
|
|
8629
8790
|
};
|
|
8630
8791
|
var dropdownStyle = (tokens) => ({
|
|
@@ -8714,7 +8875,7 @@ var badgeStyle = (color) => ({
|
|
|
8714
8875
|
});
|
|
8715
8876
|
function PoweredByFooter() {
|
|
8716
8877
|
const { tokens } = useBlinkConfig();
|
|
8717
|
-
return /* @__PURE__ */ jsx("div", { style:
|
|
8878
|
+
return /* @__PURE__ */ jsx("div", { style: containerStyle4(tokens.textMuted), children: /* @__PURE__ */ jsxs("div", { style: rowStyle, children: [
|
|
8718
8879
|
/* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx(
|
|
8719
8880
|
"path",
|
|
8720
8881
|
{
|
|
@@ -8725,7 +8886,7 @@ function PoweredByFooter() {
|
|
|
8725
8886
|
/* @__PURE__ */ jsx("span", { children: "Powered by Blink" })
|
|
8726
8887
|
] }) });
|
|
8727
8888
|
}
|
|
8728
|
-
var
|
|
8889
|
+
var containerStyle4 = (color) => ({
|
|
8729
8890
|
display: "flex",
|
|
8730
8891
|
flexDirection: "column",
|
|
8731
8892
|
alignItems: "center",
|
|
@@ -9145,6 +9306,7 @@ var TETHER_LOGO = svgToDataUri(TETHER_SVG);
|
|
|
9145
9306
|
var USDH_LOGO = svgToDataUri(USDH_SVG);
|
|
9146
9307
|
var ETH_LOGO = "https://assets.relay.link/icons/currencies/eth.png";
|
|
9147
9308
|
var SOL_LOGO = "https://assets.relay.link/icons/currencies/sol.png";
|
|
9309
|
+
var MON_LOGO = "https://assets.relay.link/icons/currencies/mon.png";
|
|
9148
9310
|
var KNOWN_LOGOS = {
|
|
9149
9311
|
metamask: METAMASK_LOGO,
|
|
9150
9312
|
base: BASE_LOGO,
|
|
@@ -9162,7 +9324,8 @@ var TOKEN_LOGOS = {
|
|
|
9162
9324
|
USDM: USDM_LOGO,
|
|
9163
9325
|
USDH: USDH_LOGO,
|
|
9164
9326
|
ETH: ETH_LOGO,
|
|
9165
|
-
SOL: SOL_LOGO
|
|
9327
|
+
SOL: SOL_LOGO,
|
|
9328
|
+
MON: MON_LOGO
|
|
9166
9329
|
};
|
|
9167
9330
|
var CHAIN_LOGOS = {
|
|
9168
9331
|
base: BASE_CHAIN_LOGO,
|
|
@@ -9435,12 +9598,12 @@ var defaultIcon = /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBo
|
|
|
9435
9598
|
) });
|
|
9436
9599
|
function InfoBanner({ children, icon }) {
|
|
9437
9600
|
const { tokens } = useBlinkConfig();
|
|
9438
|
-
return /* @__PURE__ */ jsxs("div", { style:
|
|
9601
|
+
return /* @__PURE__ */ jsxs("div", { style: containerStyle5(tokens.accent), children: [
|
|
9439
9602
|
/* @__PURE__ */ jsx("span", { style: iconStyle, children: icon ?? defaultIcon }),
|
|
9440
9603
|
/* @__PURE__ */ jsx("span", { style: textStyle, children })
|
|
9441
9604
|
] });
|
|
9442
9605
|
}
|
|
9443
|
-
var
|
|
9606
|
+
var containerStyle5 = (accent) => ({
|
|
9444
9607
|
display: "flex",
|
|
9445
9608
|
alignItems: "flex-start",
|
|
9446
9609
|
gap: 10,
|
|
@@ -9458,7 +9621,7 @@ var iconStyle = {
|
|
|
9458
9621
|
};
|
|
9459
9622
|
var textStyle = { flex: 1 };
|
|
9460
9623
|
function WarningBanner({ title, children }) {
|
|
9461
|
-
return /* @__PURE__ */ jsxs("div", { style:
|
|
9624
|
+
return /* @__PURE__ */ jsxs("div", { style: containerStyle6, children: [
|
|
9462
9625
|
/* @__PURE__ */ jsxs("div", { style: headerStyle2, children: [
|
|
9463
9626
|
/* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", style: iconStyle2, children: /* @__PURE__ */ jsx("path", { d: "M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z", fill: "#F57C00" }) }),
|
|
9464
9627
|
/* @__PURE__ */ jsx("strong", { children: title })
|
|
@@ -9466,7 +9629,7 @@ function WarningBanner({ title, children }) {
|
|
|
9466
9629
|
/* @__PURE__ */ jsx("div", { style: bodyStyle2, children })
|
|
9467
9630
|
] });
|
|
9468
9631
|
}
|
|
9469
|
-
var
|
|
9632
|
+
var containerStyle6 = {
|
|
9470
9633
|
padding: "14px 16px",
|
|
9471
9634
|
background: "#FFF8E1",
|
|
9472
9635
|
border: "1px solid #FFE082",
|
|
@@ -9516,7 +9679,7 @@ function NotificationBanner({
|
|
|
9516
9679
|
}) {
|
|
9517
9680
|
const { tokens } = useBlinkConfig();
|
|
9518
9681
|
const color = variant === "negative" ? NEGATIVE_FG : tokens.text;
|
|
9519
|
-
return /* @__PURE__ */ jsxs("div", { style:
|
|
9682
|
+
return /* @__PURE__ */ jsxs("div", { style: containerStyle7(tokens.bgRecessed), children: [
|
|
9520
9683
|
/* @__PURE__ */ jsx("span", { style: { ...iconWrapStyle2, color }, children: icon ?? defaultIcon2 }),
|
|
9521
9684
|
/* @__PURE__ */ jsxs("div", { style: { ...textColStyle, color }, children: [
|
|
9522
9685
|
/* @__PURE__ */ jsx("p", { style: titleStyle3, children: title }),
|
|
@@ -9524,7 +9687,7 @@ function NotificationBanner({
|
|
|
9524
9687
|
] })
|
|
9525
9688
|
] });
|
|
9526
9689
|
}
|
|
9527
|
-
var
|
|
9690
|
+
var containerStyle7 = (bg) => ({
|
|
9528
9691
|
display: "flex",
|
|
9529
9692
|
alignItems: "flex-start",
|
|
9530
9693
|
gap: 16,
|
|
@@ -9619,7 +9782,7 @@ function OtpInput({ value, onChange, length = 6, disabled }) {
|
|
|
9619
9782
|
onChange(pasted);
|
|
9620
9783
|
focusInput(Math.min(pasted.length, length - 1));
|
|
9621
9784
|
}, [onChange, length, focusInput]);
|
|
9622
|
-
return /* @__PURE__ */ jsx("div", { style:
|
|
9785
|
+
return /* @__PURE__ */ jsx("div", { style: containerStyle8, children: digits.map((digit, i) => /* @__PURE__ */ jsx(
|
|
9623
9786
|
"input",
|
|
9624
9787
|
{
|
|
9625
9788
|
ref: (el) => {
|
|
@@ -9640,7 +9803,7 @@ function OtpInput({ value, onChange, length = 6, disabled }) {
|
|
|
9640
9803
|
i
|
|
9641
9804
|
)) });
|
|
9642
9805
|
}
|
|
9643
|
-
var
|
|
9806
|
+
var containerStyle8 = {
|
|
9644
9807
|
display: "flex",
|
|
9645
9808
|
gap: 8,
|
|
9646
9809
|
justifyContent: "center",
|
|
@@ -10187,6 +10350,7 @@ function TokenSourceRow({
|
|
|
10187
10350
|
chainName,
|
|
10188
10351
|
tokenLogoUri,
|
|
10189
10352
|
balance,
|
|
10353
|
+
balanceLabel,
|
|
10190
10354
|
selected,
|
|
10191
10355
|
requiresAuth,
|
|
10192
10356
|
notSupported,
|
|
@@ -10195,9 +10359,10 @@ function TokenSourceRow({
|
|
|
10195
10359
|
const { tokens } = useBlinkConfig();
|
|
10196
10360
|
const [hovered, setHovered] = useState(false);
|
|
10197
10361
|
const tokenLogo = tokenLogoUri ?? TOKEN_LOGOS[symbol];
|
|
10362
|
+
const balanceText = balanceLabel ?? (balance != null ? `$${formatUsdTwoDecimals2(balance)}` : null);
|
|
10198
10363
|
const ariaLabel = [
|
|
10199
10364
|
`${symbol} on ${chainName}`,
|
|
10200
|
-
|
|
10365
|
+
balanceText != null ? `${balanceText} balance` : null,
|
|
10201
10366
|
requiresAuth ? "authorisation required" : null,
|
|
10202
10367
|
notSupported ? NOT_SUPPORTED_LABEL.toLowerCase() : null
|
|
10203
10368
|
].filter(Boolean).join(", ");
|
|
@@ -10231,15 +10396,12 @@ function TokenSourceRow({
|
|
|
10231
10396
|
selected && /* @__PURE__ */ jsx(SelectedBadge, { accent: tokens.accent, fill: tokens.textInverse })
|
|
10232
10397
|
] }),
|
|
10233
10398
|
/* @__PURE__ */ jsxs("span", { style: textColStyle2, children: [
|
|
10234
|
-
|
|
10235
|
-
/* @__PURE__ */ jsx("span", { style: symbolStyle(tokens.textMuted), children: symbol }),
|
|
10236
|
-
/* @__PURE__ */ jsx("span", { style: notSupportedTagStyle(tokens.bgInput, tokens.border, tokens.textMuted), children: NOT_SUPPORTED_BADGE_TEXT })
|
|
10237
|
-
] }) : /* @__PURE__ */ jsx("span", { style: symbolStyle(tokens.text), children: symbol }),
|
|
10399
|
+
/* @__PURE__ */ jsx("span", { style: symbolStyle(notSupported ? tokens.textMuted : tokens.text), children: symbol }),
|
|
10238
10400
|
/* @__PURE__ */ jsx("span", { style: chainStyle(tokens.textMuted), children: chainName })
|
|
10239
10401
|
] }),
|
|
10240
|
-
|
|
10241
|
-
"
|
|
10242
|
-
|
|
10402
|
+
(balanceText != null || notSupported) && /* @__PURE__ */ jsxs("span", { style: balanceColStyle, children: [
|
|
10403
|
+
balanceText != null && /* @__PURE__ */ jsx("span", { style: balanceStyle2(tokens.textMuted), children: balanceText }),
|
|
10404
|
+
notSupported && /* @__PURE__ */ jsx("span", { style: notSupportedTagStyle(tokens.bgInput, tokens.border, tokens.textMuted), children: NOT_SUPPORTED_BADGE_TEXT })
|
|
10243
10405
|
] })
|
|
10244
10406
|
]
|
|
10245
10407
|
}
|
|
@@ -10348,11 +10510,12 @@ var balanceStyle2 = (color) => ({
|
|
|
10348
10510
|
whiteSpace: "nowrap",
|
|
10349
10511
|
flexShrink: 0
|
|
10350
10512
|
});
|
|
10351
|
-
var
|
|
10513
|
+
var balanceColStyle = {
|
|
10352
10514
|
display: "flex",
|
|
10353
|
-
|
|
10354
|
-
|
|
10355
|
-
|
|
10515
|
+
flexDirection: "column",
|
|
10516
|
+
alignItems: "flex-end",
|
|
10517
|
+
gap: 4,
|
|
10518
|
+
flexShrink: 0
|
|
10356
10519
|
};
|
|
10357
10520
|
var notSupportedTagStyle = (bg, borderColor, color) => ({
|
|
10358
10521
|
fontSize: 11,
|
|
@@ -11106,7 +11269,8 @@ function LoginScreen({
|
|
|
11106
11269
|
style: secondaryTextStyle(tokens, loading),
|
|
11107
11270
|
children: secondaryLabel
|
|
11108
11271
|
}
|
|
11109
|
-
)
|
|
11272
|
+
),
|
|
11273
|
+
/* @__PURE__ */ jsx(SupportFooter, {})
|
|
11110
11274
|
] }),
|
|
11111
11275
|
children: [
|
|
11112
11276
|
/* @__PURE__ */ jsx(ScreenHeader, { onBack, right: headerRight }),
|
|
@@ -11278,7 +11442,7 @@ function DepositOptionsScreen({
|
|
|
11278
11442
|
const { tokens, promoTagText } = useBlinkConfig();
|
|
11279
11443
|
const [manualHovered, setManualHovered] = useState(false);
|
|
11280
11444
|
const [manualPressed, setManualPressed] = useState(false);
|
|
11281
|
-
return /* @__PURE__ */ jsxs(ScreenLayout, { hideScrollbar: true, children: [
|
|
11445
|
+
return /* @__PURE__ */ jsxs(ScreenLayout, { hideScrollbar: true, footer: /* @__PURE__ */ jsx(SupportFooter, {}), children: [
|
|
11282
11446
|
/* @__PURE__ */ jsx(
|
|
11283
11447
|
ScreenHeader,
|
|
11284
11448
|
{
|
|
@@ -11433,7 +11597,7 @@ function WelcomeBackScreen({
|
|
|
11433
11597
|
const [depositPressed, setDepositPressed] = useState(false);
|
|
11434
11598
|
const [manualHovered, setManualHovered] = useState(false);
|
|
11435
11599
|
const [manualPressed, setManualPressed] = useState(false);
|
|
11436
|
-
return /* @__PURE__ */ jsxs(ScreenLayout, { children: [
|
|
11600
|
+
return /* @__PURE__ */ jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsx(SupportFooter, {}), children: [
|
|
11437
11601
|
/* @__PURE__ */ jsx(
|
|
11438
11602
|
ScreenHeader,
|
|
11439
11603
|
{
|
|
@@ -13193,7 +13357,7 @@ function LinkTokensScreen({
|
|
|
13193
13357
|
}
|
|
13194
13358
|
),
|
|
13195
13359
|
/* @__PURE__ */ jsxs("div", { style: contentStyle10, children: [
|
|
13196
|
-
/* @__PURE__ */ jsx("h2", { style: headingStyle7(t.text), children: "Pick your
|
|
13360
|
+
/* @__PURE__ */ jsx("h2", { style: headingStyle7(t.text), children: "Pick your stablecoin for passkey deposits" }),
|
|
13197
13361
|
/* @__PURE__ */ jsxs("div", { className: "blink-link-tokens-list", style: listCardStyle(t.bgRecessed), children: [
|
|
13198
13362
|
showShimmer ? Array.from({ length: SHIMMER_ROWS }).map((_, i) => /* @__PURE__ */ jsxs(
|
|
13199
13363
|
"div",
|
|
@@ -13216,7 +13380,9 @@ function LinkTokensScreen({
|
|
|
13216
13380
|
{
|
|
13217
13381
|
symbol: entry.tokenSymbol,
|
|
13218
13382
|
chainName: entry.chainName,
|
|
13219
|
-
|
|
13383
|
+
tokenLogoUri: entry.tokenLogoUri,
|
|
13384
|
+
balance: entry.balanceLabel == null ? entry.balanceUsd : void 0,
|
|
13385
|
+
balanceLabel: entry.balanceLabel,
|
|
13220
13386
|
selected: i === selectedIndex,
|
|
13221
13387
|
notSupported: entry.notSupported,
|
|
13222
13388
|
onClick: () => onSelect(i)
|
|
@@ -15146,7 +15312,7 @@ function DepositAddressScreen({
|
|
|
15146
15312
|
const waitingForQr = !!depositAddress && !qrReady;
|
|
15147
15313
|
const awaitingSession = !!selectedOption && !session && !loading;
|
|
15148
15314
|
const showShimmer = loadingSources || showLoading || waitingForQr || awaitingSession;
|
|
15149
|
-
return /* @__PURE__ */ jsxs(ScreenLayout, { children: [
|
|
15315
|
+
return /* @__PURE__ */ jsxs(ScreenLayout, { footer: /* @__PURE__ */ jsx(SupportFooter, {}), children: [
|
|
15150
15316
|
/* @__PURE__ */ jsx(
|
|
15151
15317
|
ScreenHeader,
|
|
15152
15318
|
{
|
|
@@ -16828,6 +16994,14 @@ var genericStackStyle = {
|
|
|
16828
16994
|
gap: 14
|
|
16829
16995
|
};
|
|
16830
16996
|
|
|
16997
|
+
// src/feeFormat.ts
|
|
16998
|
+
function formatNativeAmount(value, maxDecimals = 4) {
|
|
16999
|
+
if (!Number.isFinite(value) || value <= 0) return "0";
|
|
17000
|
+
const rounded = Number(value.toFixed(maxDecimals));
|
|
17001
|
+
if (rounded === 0) return `< ${(10 ** -maxDecimals).toFixed(maxDecimals)}`;
|
|
17002
|
+
return rounded.toLocaleString("en-US", { maximumFractionDigits: maxDecimals }).replace(/,/g, "");
|
|
17003
|
+
}
|
|
17004
|
+
|
|
16831
17005
|
// src/screenViewModels.ts
|
|
16832
17006
|
function findSelectedWallet(selectedAccount, selectedWalletId) {
|
|
16833
17007
|
return selectedAccount?.wallets.find((w) => w.id === selectedWalletId);
|
|
@@ -16994,7 +17168,11 @@ function buildLinkTokensScreenProps({
|
|
|
16994
17168
|
walletId: rawOption?.walletId,
|
|
16995
17169
|
tokenAddress: rawOption?.tokenAddress,
|
|
16996
17170
|
chainId: rawOption?.chainId != null ? Number(rawOption.chainId) : void 0,
|
|
16997
|
-
notSupported: false
|
|
17171
|
+
notSupported: false,
|
|
17172
|
+
// Server-provided token logo (token_addresses.logo_uri). The component
|
|
17173
|
+
// falls back to the bundled TOKEN_LOGOS map by symbol, so tokens without
|
|
17174
|
+
// a bundled asset (e.g. CASH) rely on this DB-driven URI.
|
|
17175
|
+
tokenLogoUri: t.logoURI ?? void 0
|
|
16998
17176
|
};
|
|
16999
17177
|
})
|
|
17000
17178
|
);
|
|
@@ -17004,19 +17182,32 @@ function buildLinkTokensScreenProps({
|
|
|
17004
17182
|
symbol: t.tokenSymbol,
|
|
17005
17183
|
chainName: chain.chainName,
|
|
17006
17184
|
balanceUsd: t.balance ?? 0,
|
|
17007
|
-
|
|
17008
|
-
|
|
17009
|
-
chainId: void 0,
|
|
17010
|
-
notSupported: true
|
|
17185
|
+
notSupported: true,
|
|
17186
|
+
tokenLogoUri: t.logoURI ?? void 0
|
|
17011
17187
|
}))
|
|
17012
17188
|
)
|
|
17013
17189
|
);
|
|
17014
|
-
|
|
17015
|
-
|
|
17016
|
-
|
|
17017
|
-
|
|
17018
|
-
|
|
17019
|
-
|
|
17190
|
+
rowContexts.push(
|
|
17191
|
+
...derived.selectSourceNativeChoices.map((native) => ({
|
|
17192
|
+
symbol: native.tokenSymbol,
|
|
17193
|
+
chainName: native.chainName,
|
|
17194
|
+
balanceUsd: 0,
|
|
17195
|
+
notSupported: true,
|
|
17196
|
+
tokenLogoUri: native.logoURI ?? void 0,
|
|
17197
|
+
balanceLabel: `${formatNativeAmount(native.amount)} ${native.tokenSymbol}`
|
|
17198
|
+
}))
|
|
17199
|
+
);
|
|
17200
|
+
const entries2 = rowContexts.map(
|
|
17201
|
+
({ symbol, chainName, balanceUsd, notSupported, tokenLogoUri, balanceLabel }) => ({
|
|
17202
|
+
tokenSymbol: symbol,
|
|
17203
|
+
chainName,
|
|
17204
|
+
balanceUsd,
|
|
17205
|
+
notSupported,
|
|
17206
|
+
// Only present on native rows — keeps stablecoin / WC entries unchanged.
|
|
17207
|
+
...tokenLogoUri != null ? { tokenLogoUri } : {},
|
|
17208
|
+
...balanceLabel != null ? { balanceLabel } : {}
|
|
17209
|
+
})
|
|
17210
|
+
);
|
|
17020
17211
|
const firstSupportedIndex = rowContexts.findIndex((row) => !row.notSupported);
|
|
17021
17212
|
const selectedTokenSymbol = flow.state.setupDepositToken?.symbol ?? derived.selectSourceRecommended?.tokenSymbol;
|
|
17022
17213
|
const selectedChainName = flow.state.setupDepositToken?.chainName ?? derived.selectSourceRecommended?.chainName;
|
|
@@ -18019,6 +18210,11 @@ function useSourceSelectionHandlers(_dispatch, orchestrator, options) {
|
|
|
18019
18210
|
const unsupportedOptions = pendingSelectSourceAction.metadata?.unsupportedOptions ?? [];
|
|
18020
18211
|
return buildSelectSourceChoices(unsupportedOptions, minTransferAmountUsd);
|
|
18021
18212
|
}, [pendingSelectSourceAction, minTransferAmountUsd]);
|
|
18213
|
+
const selectSourceNativeChoices = useMemo(() => {
|
|
18214
|
+
if (!pendingSelectSourceAction) return [];
|
|
18215
|
+
const nativeOptions = pendingSelectSourceAction.metadata?.nativeUnsupportedOptions ?? [];
|
|
18216
|
+
return buildNativeUnsupportedEntries(nativeOptions);
|
|
18217
|
+
}, [pendingSelectSourceAction]);
|
|
18022
18218
|
const selectSourceRecommended = useMemo(() => {
|
|
18023
18219
|
if (!pendingSelectSourceAction) return null;
|
|
18024
18220
|
return pendingSelectSourceAction.metadata?.recommended ?? null;
|
|
@@ -18070,6 +18266,7 @@ function useSourceSelectionHandlers(_dispatch, orchestrator, options) {
|
|
|
18070
18266
|
setSelectSourceTokenSymbol,
|
|
18071
18267
|
selectSourceChoices,
|
|
18072
18268
|
selectSourceUnsupportedChoices,
|
|
18269
|
+
selectSourceNativeChoices,
|
|
18073
18270
|
selectSourceRecommended,
|
|
18074
18271
|
selectSourceAvailableBalance,
|
|
18075
18272
|
handleSelectSourceChainChange,
|
|
@@ -20601,6 +20798,33 @@ function usePersistAmountToActiveSession({
|
|
|
20601
20798
|
});
|
|
20602
20799
|
}, [apiBaseUrl, sessionId, effectiveDepositAmount]);
|
|
20603
20800
|
}
|
|
20801
|
+
function useFingerprintFlowEvents(deps) {
|
|
20802
|
+
const { ready, authenticated, merchantId } = deps;
|
|
20803
|
+
const { getData } = useVisitorData({ immediate: false });
|
|
20804
|
+
const openedSentRef = useRef(false);
|
|
20805
|
+
const authenticatedSentRef = useRef(false);
|
|
20806
|
+
useEffect(() => {
|
|
20807
|
+
if (openedSentRef.current) return;
|
|
20808
|
+
openedSentRef.current = true;
|
|
20809
|
+
void getData({
|
|
20810
|
+
tag: { event: "blink_opened", ...merchantId ? { merchantId } : {} },
|
|
20811
|
+
...merchantId ? { linkedId: merchantId } : {}
|
|
20812
|
+
}).catch((error) => {
|
|
20813
|
+
console.error("Fingerprint blink_opened event failed", error);
|
|
20814
|
+
});
|
|
20815
|
+
}, [getData, merchantId]);
|
|
20816
|
+
useEffect(() => {
|
|
20817
|
+
if (authenticatedSentRef.current) return;
|
|
20818
|
+
if (!ready || !authenticated) return;
|
|
20819
|
+
authenticatedSentRef.current = true;
|
|
20820
|
+
void getData({
|
|
20821
|
+
tag: { event: "blink_authenticated", ...merchantId ? { merchantId } : {} },
|
|
20822
|
+
...merchantId ? { linkedId: merchantId } : {}
|
|
20823
|
+
}).catch((error) => {
|
|
20824
|
+
console.error("Fingerprint blink_authenticated event failed", error);
|
|
20825
|
+
});
|
|
20826
|
+
}, [getData, ready, authenticated, merchantId]);
|
|
20827
|
+
}
|
|
20604
20828
|
var NoMatchingExtensionError = class extends Error {
|
|
20605
20829
|
constructor() {
|
|
20606
20830
|
super("No installed EIP-6963 extension matches the selected wallet");
|
|
@@ -20639,6 +20863,11 @@ function BlinkPaymentInner({
|
|
|
20639
20863
|
return true;
|
|
20640
20864
|
})();
|
|
20641
20865
|
const effectiveAuthenticated = authenticated || popupAuthValid;
|
|
20866
|
+
useFingerprintFlowEvents({
|
|
20867
|
+
ready,
|
|
20868
|
+
authenticated: effectiveAuthenticated,
|
|
20869
|
+
merchantId: merchantAuthorization?.merchantId
|
|
20870
|
+
});
|
|
20642
20871
|
const effectiveGetAccessToken = useCallback(async () => {
|
|
20643
20872
|
if (popupAuthRef.current) {
|
|
20644
20873
|
if (isPopupAuthExpired(popupAuthRef.current.accessToken)) {
|
|
@@ -21247,6 +21476,7 @@ function BlinkPaymentInner({
|
|
|
21247
21476
|
selectedSource: derived.selectedSource,
|
|
21248
21477
|
selectSourceChoices: sourceSelection.selectSourceChoices,
|
|
21249
21478
|
selectSourceUnsupportedChoices: sourceSelection.selectSourceUnsupportedChoices,
|
|
21479
|
+
selectSourceNativeChoices: sourceSelection.selectSourceNativeChoices,
|
|
21250
21480
|
selectSourceRecommended: sourceSelection.selectSourceRecommended,
|
|
21251
21481
|
selectSourceAvailableBalance: sourceSelection.selectSourceAvailableBalance,
|
|
21252
21482
|
walletConnectChainIdsByAccount
|
|
@@ -21266,6 +21496,6 @@ function BlinkPaymentInner({
|
|
|
21266
21496
|
) });
|
|
21267
21497
|
}
|
|
21268
21498
|
|
|
21269
|
-
export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, ManualTransferPasskeyScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, WelcomeBackScreen, appendDebug, api_exports as blinkApi, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resolvePasskeyRpId, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };
|
|
21499
|
+
export { ACCOUNT_SWITCH_CONFLICT_MESSAGE, AdvancedSourceScreen, ApprovingInWalletScreen, AuthorizationSessionCancelledError, BLINK_ERROR_ILLUSTRATION, BLINK_LOGO, BLINK_MASCOT, BLINK_PASSKEY_ILLUSTRATION, BLINK_SUCCESS_ILLUSTRATION, BlinkDepositButton, BlinkErrorScreen, BlinkInitialLoadingScreen, BlinkLoadingScreen, BlinkPayment, BlinkProvider, ConfirmSignScreen, DepositCompleteScreen, DepositOptionsScreen, DepositScreen, DepositTransferStatusScreen, GuestTokenPickerScreen, IconCircle, InfoBanner, LOGIN_KEY_ILLUSTRATION, LinkTokensScreen, LoginScreen, ManualTransferPasskeyScreen, OpenWalletScreen, OtpVerifyScreen, OutlineButton, PasskeyIframeBlockedError, PasskeyPopupWelcomeScreen, PasskeyScreen, PoweredByFooter, PrimaryButton, ScreenHeader, ScreenLayout, SecondaryButton, SelectDepositSourceScreen, SelectSourceScreen, SettingsMenu, Spinner, StepList, StepRenderer, SuccessScreen, TokenPickerScreen, VerifyPasskeyScreen, WalletPickerScreen, WelcomeBackScreen, appendDebug, api_exports as blinkApi, buildNativeUnsupportedEntries, clearDebugEntries, createInitialState, credentialIdBase64ToBytes, darkTheme, darkThemeNew, darkTransparentTheme, darkTransparentThemeNew, deviceHasPasskey, encodePermit2ApproveCalldata, findDevicePasskey, findDevicePasskeyViaPopup, formatNativeAmount, getAtomicBatchSupportDebugInfo, getDebugEntries, getDeviceBiometricUnlockText, getTheme, getThemeBase, getWalletCapabilities, isAuthorizationSessionCancelled, isExpectedAuthorizationCancellation, isTerminalTransferStatus, isTransferAwaitingCompletion, isTransparentTheme, isUserDismissedAuthorizationError, isVisibleUsdAmountAtTwoDecimals, lightTheme, lightThemeNew, lightTransparentTheme, lightTransparentThemeNew, mapGuestPickerEntries, replaceOpenProviderForAccountSwitch, resolvePasskeyRpId, screenForPhase, subscribeDebug, supportsAtomicBatch, supportsPaymasterService, useAuthorizationExecutor, useAuthorizationOrchestrator, useBlinkConfig, useBlinkDebugLog, useBlinkDepositAmount, useSolanaAccountSwitchEffect, useTransferPolling, useTransferSigning };
|
|
21270
21500
|
//# sourceMappingURL=index.js.map
|
|
21271
21501
|
//# sourceMappingURL=index.js.map
|