@rhinestone/deposit-modal 0.3.0-alpha.2 → 0.3.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1227,8 +1227,38 @@ function PoweredBy() {
1227
1227
  }
1228
1228
  PoweredBy.displayName = "PoweredBy";
1229
1229
 
1230
- // src/components/ui/ListRow.tsx
1230
+ // src/components/ui/Spinner.tsx
1231
1231
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1232
+ function Spinner({ className }) {
1233
+ return /* @__PURE__ */ jsxs3(
1234
+ "svg",
1235
+ {
1236
+ className: `rs-spinner ${className || ""}`,
1237
+ fill: "none",
1238
+ viewBox: "0 0 20 21",
1239
+ children: [
1240
+ /* @__PURE__ */ jsx4(
1241
+ "path",
1242
+ {
1243
+ d: "M10 0.5C8.02219 0.5 6.08879 1.08649 4.4443 2.1853C2.79981 3.28412 1.51809 4.8459 0.761209 6.67316C0.00433288 8.50043 -0.1937 10.5111 0.192152 12.4509C0.578004 14.3907 1.53041 16.1725 2.92894 17.5711C4.32746 18.9696 6.10929 19.922 8.0491 20.3078C9.98891 20.6937 11.9996 20.4957 13.8268 19.7388C15.6541 18.9819 17.2159 17.7002 18.3147 16.0557C19.4135 14.4112 20 12.4778 20 10.5C20 7.84783 18.9464 5.3043 17.0711 3.42893C15.1957 1.55357 12.6522 0.5 10 0.5ZM10 17.7727C8.56159 17.7727 7.15549 17.3462 5.95949 16.547C4.7635 15.7479 3.83134 14.6121 3.28088 13.2831C2.73042 11.9542 2.5864 10.4919 2.86702 9.08116C3.14764 7.67039 3.8403 6.37451 4.85741 5.3574C5.87452 4.3403 7.17039 3.64764 8.58116 3.36702C9.99193 3.0864 11.4542 3.23042 12.7832 3.78088C14.1121 4.33133 15.2479 5.26349 16.0471 6.45949C16.8462 7.65548 17.2727 9.06159 17.2727 10.5C17.2727 12.4288 16.5065 14.2787 15.1426 15.6426C13.7787 17.0065 11.9288 17.7727 10 17.7727Z",
1244
+ fill: "currentColor",
1245
+ opacity: 0.3
1246
+ }
1247
+ ),
1248
+ /* @__PURE__ */ jsx4(
1249
+ "path",
1250
+ {
1251
+ d: "M10 3.22767C11.7423 3.22846 13.4276 3.8412 14.7556 4.95667C16.0837 6.07214 16.9681 7.61784 17.2512 9.31825C17.3012 9.64364 17.4662 9.94096 17.7169 10.1573C17.9677 10.3737 18.2878 10.4951 18.6205 10.5C18.8211 10.5001 19.0193 10.457 19.2012 10.3735C19.3832 10.2901 19.5445 10.1684 19.674 10.017C19.8036 9.86549 19.8981 9.68789 19.9511 9.49656C20.004 9.30523 20.0141 9.10478 19.9807 8.90918C19.5986 6.56305 18.3843 4.42821 16.5554 2.88726C14.7265 1.34631 12.4025 0.5 10 0.5C7.59751 0.5 5.27354 1.34631 3.44461 2.88726C1.61569 4.42821 0.401366 6.56305 0.0192815 8.90918C-0.0141442 9.10478 -0.00402016 9.30523 0.0489472 9.49656C0.101914 9.68789 0.196449 9.86549 0.325956 10.017C0.455463 10.1684 0.616823 10.2901 0.798778 10.3735C0.980732 10.457 1.1789 10.5001 1.37945 10.5C1.71216 10.4951 2.03235 10.3737 2.28307 10.1573C2.5338 9.94096 2.69883 9.64364 2.74882 9.31825C3.03193 7.61784 3.91633 6.07214 5.24436 4.95667C6.57239 3.8412 8.25775 3.22846 10 3.22767Z",
1252
+ fill: "currentColor"
1253
+ }
1254
+ )
1255
+ ]
1256
+ }
1257
+ );
1258
+ }
1259
+
1260
+ // src/components/ui/ListRow.tsx
1261
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1232
1262
  function ListRow({
1233
1263
  leading,
1234
1264
  leadingMedia,
@@ -1239,22 +1269,22 @@ function ListRow({
1239
1269
  className = "",
1240
1270
  ...props
1241
1271
  }) {
1242
- return /* @__PURE__ */ jsxs3(
1272
+ return /* @__PURE__ */ jsxs4(
1243
1273
  "button",
1244
1274
  {
1245
1275
  type: "button",
1246
1276
  className: `rs-list-row ${className}`.trim(),
1247
1277
  ...props,
1248
1278
  children: [
1249
- leadingMedia ? /* @__PURE__ */ jsx4("span", { className: "rs-list-row-leading rs-list-row-leading--media", children: /* @__PURE__ */ jsx4("img", { src: leadingMedia, alt: "" }) }) : leading ? /* @__PURE__ */ jsx4("span", { className: "rs-list-row-leading", children: leading }) : null,
1250
- /* @__PURE__ */ jsxs3("div", { className: "rs-list-row-body", children: [
1251
- /* @__PURE__ */ jsxs3("div", { className: "rs-list-row-text", children: [
1252
- /* @__PURE__ */ jsx4("span", { className: "rs-list-row-title", children: title }),
1253
- subtitle && /* @__PURE__ */ jsx4("span", { className: "rs-list-row-subtitle", children: subtitle })
1279
+ leadingMedia ? /* @__PURE__ */ jsx5("span", { className: "rs-list-row-leading rs-list-row-leading--media", children: /* @__PURE__ */ jsx5("img", { src: leadingMedia, alt: "" }) }) : leading ? /* @__PURE__ */ jsx5("span", { className: "rs-list-row-leading", children: leading }) : null,
1280
+ /* @__PURE__ */ jsxs4("div", { className: "rs-list-row-body", children: [
1281
+ /* @__PURE__ */ jsxs4("div", { className: "rs-list-row-text", children: [
1282
+ /* @__PURE__ */ jsx5("span", { className: "rs-list-row-title", children: title }),
1283
+ subtitle && /* @__PURE__ */ jsx5("span", { className: "rs-list-row-subtitle", children: subtitle })
1254
1284
  ] }),
1255
- meta && /* @__PURE__ */ jsx4("div", { className: "rs-list-row-meta", children: meta })
1285
+ meta && /* @__PURE__ */ jsx5("div", { className: "rs-list-row-meta", children: meta })
1256
1286
  ] }),
1257
- /* @__PURE__ */ jsx4("span", { className: "rs-list-row-chevron", children: trailing ?? /* @__PURE__ */ jsx4(ChevronRightIcon, {}) })
1287
+ /* @__PURE__ */ jsx5("span", { className: "rs-list-row-chevron", children: trailing ?? /* @__PURE__ */ jsx5(ChevronRightIcon, {}) })
1258
1288
  ]
1259
1289
  }
1260
1290
  );
@@ -1262,10 +1292,10 @@ function ListRow({
1262
1292
  ListRow.displayName = "ListRow";
1263
1293
 
1264
1294
  // src/components/ui/WalletBadgeIcons.tsx
1265
- import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1266
- var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1267
- /* @__PURE__ */ jsxs4("g", { clipPath: "url(#rs-rabby-clip)", children: [
1268
- /* @__PURE__ */ jsx5(
1295
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1296
+ var RabbyIcon = () => /* @__PURE__ */ jsxs5("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1297
+ /* @__PURE__ */ jsxs5("g", { clipPath: "url(#rs-rabby-clip)", children: [
1298
+ /* @__PURE__ */ jsx6(
1269
1299
  "mask",
1270
1300
  {
1271
1301
  id: "rs-rabby-mask",
@@ -1275,7 +1305,7 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1275
1305
  y: "0",
1276
1306
  width: "20",
1277
1307
  height: "20",
1278
- children: /* @__PURE__ */ jsx5(
1308
+ children: /* @__PURE__ */ jsx6(
1279
1309
  "path",
1280
1310
  {
1281
1311
  d: "M20 10C20 4.47688 15.5231 0 10 0C4.47688 0 0 4.47688 0 10C0 15.5231 4.47688 20 10 20C15.5231 20 20 15.5231 20 10Z",
@@ -1284,22 +1314,22 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1284
1314
  )
1285
1315
  }
1286
1316
  ),
1287
- /* @__PURE__ */ jsxs4("g", { mask: "url(#rs-rabby-mask)", children: [
1288
- /* @__PURE__ */ jsx5(
1317
+ /* @__PURE__ */ jsxs5("g", { mask: "url(#rs-rabby-mask)", children: [
1318
+ /* @__PURE__ */ jsx6(
1289
1319
  "path",
1290
1320
  {
1291
1321
  d: "M20 10C20 4.47688 15.5231 0 10 0C4.47688 0 0 4.47688 0 10C0 15.5231 4.47688 20 10 20C15.5231 20 20 15.5231 20 10Z",
1292
1322
  fill: "#7084FF"
1293
1323
  }
1294
1324
  ),
1295
- /* @__PURE__ */ jsx5(
1325
+ /* @__PURE__ */ jsx6(
1296
1326
  "path",
1297
1327
  {
1298
1328
  d: "M17.2515 10.8675C17.8265 9.57871 14.9847 5.97871 12.2697 4.47934C10.5584 3.31684 8.77529 3.47684 8.41404 3.98684C7.62154 5.10684 11.039 6.05559 13.3234 7.16184C12.8322 7.37621 12.3697 7.76059 12.0972 8.25184C11.2453 7.31871 9.37529 6.51434 7.18154 7.16246C5.70279 7.59871 4.47404 8.62684 3.99904 10.18C3.85708 10.1175 3.70178 10.0914 3.5472 10.1041C3.39262 10.1168 3.24365 10.1678 3.11376 10.2526C2.98388 10.3373 2.87719 10.4532 2.80336 10.5896C2.72952 10.726 2.69088 10.8786 2.69092 11.0337C2.69092 11.55 3.10717 11.9681 3.62154 11.9681C3.71654 11.9681 4.01467 11.9037 4.01467 11.9037L8.77529 11.9387C6.87154 14.9687 5.36654 15.4118 5.36654 15.9368C5.36654 16.4618 6.80654 16.32 7.34717 16.1243C9.93467 15.1868 12.714 12.2675 13.1909 11.4268C15.1934 11.6775 16.8765 11.7075 17.2515 10.8675Z",
1299
1329
  fill: "url(#rs-rabby-grad0)"
1300
1330
  }
1301
1331
  ),
1302
- /* @__PURE__ */ jsx5(
1332
+ /* @__PURE__ */ jsx6(
1303
1333
  "path",
1304
1334
  {
1305
1335
  fillRule: "evenodd",
@@ -1308,7 +1338,7 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1308
1338
  fill: "url(#rs-rabby-grad1)"
1309
1339
  }
1310
1340
  ),
1311
- /* @__PURE__ */ jsx5(
1341
+ /* @__PURE__ */ jsx6(
1312
1342
  "path",
1313
1343
  {
1314
1344
  fillRule: "evenodd",
@@ -1317,7 +1347,7 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1317
1347
  fill: "url(#rs-rabby-grad2)"
1318
1348
  }
1319
1349
  ),
1320
- /* @__PURE__ */ jsx5(
1350
+ /* @__PURE__ */ jsx6(
1321
1351
  "path",
1322
1352
  {
1323
1353
  d: "M3.94351 11.7048C4.11789 13.1936 4.96101 13.7773 6.68476 13.9498C8.40851 14.1223 9.39664 14.0067 10.7123 14.1273C11.8116 14.2273 12.7929 14.7898 13.1573 14.5954C13.4848 14.4204 13.301 13.7892 12.8629 13.3836C12.2941 12.8586 11.5079 12.4936 10.1241 12.3642C10.3998 11.6061 10.3223 10.5436 9.89414 9.96543C9.27476 9.1298 8.13164 8.7523 6.68476 8.9173C5.17226 9.0898 3.72414 9.83605 3.94351 11.7048Z",
@@ -1326,8 +1356,8 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1326
1356
  )
1327
1357
  ] })
1328
1358
  ] }),
1329
- /* @__PURE__ */ jsxs4("defs", { children: [
1330
- /* @__PURE__ */ jsxs4(
1359
+ /* @__PURE__ */ jsxs5("defs", { children: [
1360
+ /* @__PURE__ */ jsxs5(
1331
1361
  "linearGradient",
1332
1362
  {
1333
1363
  id: "rs-rabby-grad0",
@@ -1337,12 +1367,12 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1337
1367
  y2: "12.5875",
1338
1368
  gradientUnits: "userSpaceOnUse",
1339
1369
  children: [
1340
- /* @__PURE__ */ jsx5("stop", { stopColor: "white" }),
1341
- /* @__PURE__ */ jsx5("stop", { offset: "1", stopColor: "white" })
1370
+ /* @__PURE__ */ jsx6("stop", { stopColor: "white" }),
1371
+ /* @__PURE__ */ jsx6("stop", { offset: "1", stopColor: "white" })
1342
1372
  ]
1343
1373
  }
1344
1374
  ),
1345
- /* @__PURE__ */ jsxs4(
1375
+ /* @__PURE__ */ jsxs5(
1346
1376
  "linearGradient",
1347
1377
  {
1348
1378
  id: "rs-rabby-grad1",
@@ -1352,12 +1382,12 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1352
1382
  y2: "2.21365",
1353
1383
  gradientUnits: "userSpaceOnUse",
1354
1384
  children: [
1355
- /* @__PURE__ */ jsx5("stop", { stopColor: "#8697FF" }),
1356
- /* @__PURE__ */ jsx5("stop", { offset: "1", stopColor: "#8697FF", stopOpacity: "0" })
1385
+ /* @__PURE__ */ jsx6("stop", { stopColor: "#8697FF" }),
1386
+ /* @__PURE__ */ jsx6("stop", { offset: "1", stopColor: "#8697FF", stopOpacity: "0" })
1357
1387
  ]
1358
1388
  }
1359
1389
  ),
1360
- /* @__PURE__ */ jsxs4(
1390
+ /* @__PURE__ */ jsxs5(
1361
1391
  "linearGradient",
1362
1392
  {
1363
1393
  id: "rs-rabby-grad2",
@@ -1367,12 +1397,12 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1367
1397
  y2: "9.61626",
1368
1398
  gradientUnits: "userSpaceOnUse",
1369
1399
  children: [
1370
- /* @__PURE__ */ jsx5("stop", { stopColor: "#8697FF" }),
1371
- /* @__PURE__ */ jsx5("stop", { offset: "1", stopColor: "#8697FF", stopOpacity: "0" })
1400
+ /* @__PURE__ */ jsx6("stop", { stopColor: "#8697FF" }),
1401
+ /* @__PURE__ */ jsx6("stop", { offset: "1", stopColor: "#8697FF", stopOpacity: "0" })
1372
1402
  ]
1373
1403
  }
1374
1404
  ),
1375
- /* @__PURE__ */ jsxs4(
1405
+ /* @__PURE__ */ jsxs5(
1376
1406
  "linearGradient",
1377
1407
  {
1378
1408
  id: "rs-rabby-grad3",
@@ -1382,23 +1412,23 @@ var RabbyIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20",
1382
1412
  y2: "15.6773",
1383
1413
  gradientUnits: "userSpaceOnUse",
1384
1414
  children: [
1385
- /* @__PURE__ */ jsx5("stop", { stopColor: "white" }),
1386
- /* @__PURE__ */ jsx5("stop", { offset: "0.984", stopColor: "#D1D8FF" })
1415
+ /* @__PURE__ */ jsx6("stop", { stopColor: "white" }),
1416
+ /* @__PURE__ */ jsx6("stop", { offset: "0.984", stopColor: "#D1D8FF" })
1387
1417
  ]
1388
1418
  }
1389
1419
  ),
1390
- /* @__PURE__ */ jsx5("clipPath", { id: "rs-rabby-clip", children: /* @__PURE__ */ jsx5("rect", { width: "20", height: "20", fill: "white" }) })
1420
+ /* @__PURE__ */ jsx6("clipPath", { id: "rs-rabby-clip", children: /* @__PURE__ */ jsx6("rect", { width: "20", height: "20", fill: "white" }) })
1391
1421
  ] })
1392
1422
  ] });
1393
- var PhantomIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1394
- /* @__PURE__ */ jsx5(
1423
+ var PhantomIcon = () => /* @__PURE__ */ jsxs5("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1424
+ /* @__PURE__ */ jsx6(
1395
1425
  "path",
1396
1426
  {
1397
1427
  d: "M15.1852 0H4.81481C2.15567 0 0 2.15567 0 4.81481V15.1852C0 17.8443 2.15567 20 4.81481 20H15.1852C17.8443 20 20 17.8443 20 15.1852V4.81481C20 2.15567 17.8443 0 15.1852 0Z",
1398
1428
  fill: "#AB9FF2"
1399
1429
  }
1400
1430
  ),
1401
- /* @__PURE__ */ jsx5(
1431
+ /* @__PURE__ */ jsx6(
1402
1432
  "path",
1403
1433
  {
1404
1434
  fillRule: "evenodd",
@@ -1408,9 +1438,9 @@ var PhantomIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20"
1408
1438
  }
1409
1439
  )
1410
1440
  ] });
1411
- var WalletConnectIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1412
- /* @__PURE__ */ jsx5("rect", { width: "20", height: "20", rx: "2.5", fill: "#3B99FC" }),
1413
- /* @__PURE__ */ jsx5(
1441
+ var WalletConnectIcon = () => /* @__PURE__ */ jsxs5("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1442
+ /* @__PURE__ */ jsx6("rect", { width: "20", height: "20", rx: "2.5", fill: "#3B99FC" }),
1443
+ /* @__PURE__ */ jsx6(
1414
1444
  "path",
1415
1445
  {
1416
1446
  d: "M6.18 7.96a5.36 5.36 0 0 1 7.64 0l.25.26a.26.26 0 0 1 0 .37l-.87.87a.13.13 0 0 1-.19 0l-.35-.35a3.74 3.74 0 0 0-5.32 0l-.38.37a.13.13 0 0 1-.19 0l-.86-.86a.26.26 0 0 1 0-.37l.27-.29Zm9.43 1.79.78.78a.26.26 0 0 1 0 .37l-3.54 3.54a.26.26 0 0 1-.37 0l-2.51-2.5a.07.07 0 0 0-.09 0l-2.51 2.5a.26.26 0 0 1-.37 0L3.46 10.9a.26.26 0 0 1 0-.37l.78-.78a.26.26 0 0 1 .37 0l2.5 2.5a.07.07 0 0 0 .1 0L9.72 9.75a.26.26 0 0 1 .37 0l2.5 2.5a.07.07 0 0 0 .1 0l2.5-2.5a.26.26 0 0 1 .37 0Z",
@@ -1418,24 +1448,24 @@ var WalletConnectIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height
1418
1448
  }
1419
1449
  )
1420
1450
  ] });
1421
- var EthBadgeIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1422
- /* @__PURE__ */ jsx5(
1451
+ var EthBadgeIcon = () => /* @__PURE__ */ jsxs5("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1452
+ /* @__PURE__ */ jsx6(
1423
1453
  "path",
1424
1454
  {
1425
1455
  d: "M9.99987 19.9319C15.4852 19.9319 19.9319 15.4852 19.9319 9.9999C19.9319 4.51461 15.4852 0.0679016 9.99987 0.0679016C4.51458 0.0679016 0.0678711 4.51461 0.0678711 9.9999C0.0678711 15.4852 4.51458 19.9319 9.99987 19.9319Z",
1426
1456
  fill: "#E3E3E3"
1427
1457
  }
1428
1458
  ),
1429
- /* @__PURE__ */ jsx5("path", { d: "M10.0073 2.18121L14.6948 9.99371L10.0247 7.98052L10.0073 2.18121Z", fill: "#2F3030" }),
1430
- /* @__PURE__ */ jsx5("path", { d: "M5.31982 9.99371L9.98998 2.18121L10.0073 7.98052L5.31982 9.99371Z", fill: "#828384" }),
1431
- /* @__PURE__ */ jsx5("path", { d: "M9.98998 12.8062L5.31982 10.047L10.0073 8.11871L9.98998 12.8062Z", fill: "#343535" }),
1432
- /* @__PURE__ */ jsx5("path", { d: "M14.6948 10.047L10.0247 8.11871L10.0073 12.8062L14.6948 10.047Z", fill: "#131313" }),
1433
- /* @__PURE__ */ jsx5("path", { d: "M10.0073 14.0046L14.6948 11.2437L10.0073 17.8062V14.0046Z", fill: "#2F3030" }),
1434
- /* @__PURE__ */ jsx5("path", { d: "M10.0073 14.0046L5.31982 11.2437L10.0073 17.8062V14.0046Z", fill: "#828384" })
1459
+ /* @__PURE__ */ jsx6("path", { d: "M10.0073 2.18121L14.6948 9.99371L10.0247 7.98052L10.0073 2.18121Z", fill: "#2F3030" }),
1460
+ /* @__PURE__ */ jsx6("path", { d: "M5.31982 9.99371L9.98998 2.18121L10.0073 7.98052L5.31982 9.99371Z", fill: "#828384" }),
1461
+ /* @__PURE__ */ jsx6("path", { d: "M9.98998 12.8062L5.31982 10.047L10.0073 8.11871L9.98998 12.8062Z", fill: "#343535" }),
1462
+ /* @__PURE__ */ jsx6("path", { d: "M14.6948 10.047L10.0247 8.11871L10.0073 12.8062L14.6948 10.047Z", fill: "#131313" }),
1463
+ /* @__PURE__ */ jsx6("path", { d: "M10.0073 14.0046L14.6948 11.2437L10.0073 17.8062V14.0046Z", fill: "#2F3030" }),
1464
+ /* @__PURE__ */ jsx6("path", { d: "M10.0073 14.0046L5.31982 11.2437L10.0073 17.8062V14.0046Z", fill: "#828384" })
1435
1465
  ] });
1436
- var SolBadgeIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1437
- /* @__PURE__ */ jsx5("rect", { width: "20", height: "20", rx: "10", fill: "#0C0C0C" }),
1438
- /* @__PURE__ */ jsx5(
1466
+ var SolBadgeIcon = () => /* @__PURE__ */ jsxs5("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1467
+ /* @__PURE__ */ jsx6("rect", { width: "20", height: "20", rx: "10", fill: "#0C0C0C" }),
1468
+ /* @__PURE__ */ jsx6(
1439
1469
  "path",
1440
1470
  {
1441
1471
  fillRule: "evenodd",
@@ -1444,7 +1474,7 @@ var SolBadgeIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20
1444
1474
  fill: "url(#rs-sol-badge-grad)"
1445
1475
  }
1446
1476
  ),
1447
- /* @__PURE__ */ jsx5("defs", { children: /* @__PURE__ */ jsxs4(
1477
+ /* @__PURE__ */ jsx6("defs", { children: /* @__PURE__ */ jsxs5(
1448
1478
  "linearGradient",
1449
1479
  {
1450
1480
  id: "rs-sol-badge-grad",
@@ -1454,15 +1484,15 @@ var SolBadgeIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20
1454
1484
  y2: "5.08343",
1455
1485
  gradientUnits: "userSpaceOnUse",
1456
1486
  children: [
1457
- /* @__PURE__ */ jsx5("stop", { stopColor: "#CB4EE8" }),
1458
- /* @__PURE__ */ jsx5("stop", { offset: "1", stopColor: "#10F4B1" })
1487
+ /* @__PURE__ */ jsx6("stop", { stopColor: "#CB4EE8" }),
1488
+ /* @__PURE__ */ jsx6("stop", { offset: "1", stopColor: "#10F4B1" })
1459
1489
  ]
1460
1490
  }
1461
1491
  ) })
1462
1492
  ] });
1463
- var BaseBadgeIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 111 111", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1464
- /* @__PURE__ */ jsx5("circle", { cx: "55.5", cy: "55.5", r: "55.5", fill: "#0052FF" }),
1465
- /* @__PURE__ */ jsx5(
1493
+ var BaseBadgeIcon = () => /* @__PURE__ */ jsxs5("svg", { width: "20", height: "20", viewBox: "0 0 111 111", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
1494
+ /* @__PURE__ */ jsx6("circle", { cx: "55.5", cy: "55.5", r: "55.5", fill: "#0052FF" }),
1495
+ /* @__PURE__ */ jsx6(
1466
1496
  "path",
1467
1497
  {
1468
1498
  d: "M54.921 93.4c20.942 0 37.92-16.978 37.92-37.921S75.863 17.558 54.92 17.558c-19.498 0-35.57 14.725-37.655 33.647h49.82v5.548h-49.82C19.351 75.675 35.423 93.4 54.921 93.4z",
@@ -1470,15 +1500,15 @@ var BaseBadgeIcon = () => /* @__PURE__ */ jsxs4("svg", { width: "20", height: "2
1470
1500
  }
1471
1501
  )
1472
1502
  ] });
1473
- var walletBadge = /* @__PURE__ */ jsxs4("span", { className: "rs-list-row-meta-icons", children: [
1474
- /* @__PURE__ */ jsx5("span", { children: /* @__PURE__ */ jsx5(RabbyIcon, {}) }),
1475
- /* @__PURE__ */ jsx5("span", { children: /* @__PURE__ */ jsx5(PhantomIcon, {}) }),
1476
- /* @__PURE__ */ jsx5("span", { children: /* @__PURE__ */ jsx5(WalletConnectIcon, {}) })
1503
+ var walletBadge = /* @__PURE__ */ jsxs5("span", { className: "rs-list-row-meta-icons", children: [
1504
+ /* @__PURE__ */ jsx6("span", { children: /* @__PURE__ */ jsx6(RabbyIcon, {}) }),
1505
+ /* @__PURE__ */ jsx6("span", { children: /* @__PURE__ */ jsx6(PhantomIcon, {}) }),
1506
+ /* @__PURE__ */ jsx6("span", { children: /* @__PURE__ */ jsx6(WalletConnectIcon, {}) })
1477
1507
  ] });
1478
- var chainBadge = /* @__PURE__ */ jsxs4("span", { className: "rs-list-row-meta-icons", children: [
1479
- /* @__PURE__ */ jsx5("span", { children: /* @__PURE__ */ jsx5(EthBadgeIcon, {}) }),
1480
- /* @__PURE__ */ jsx5("span", { children: /* @__PURE__ */ jsx5(SolBadgeIcon, {}) }),
1481
- /* @__PURE__ */ jsx5("span", { children: /* @__PURE__ */ jsx5(BaseBadgeIcon, {}) })
1508
+ var chainBadge = /* @__PURE__ */ jsxs5("span", { className: "rs-list-row-meta-icons", children: [
1509
+ /* @__PURE__ */ jsx6("span", { children: /* @__PURE__ */ jsx6(EthBadgeIcon, {}) }),
1510
+ /* @__PURE__ */ jsx6("span", { children: /* @__PURE__ */ jsx6(SolBadgeIcon, {}) }),
1511
+ /* @__PURE__ */ jsx6("span", { children: /* @__PURE__ */ jsx6(BaseBadgeIcon, {}) })
1482
1512
  ] });
1483
1513
  function WalletBadgeIcons() {
1484
1514
  return walletBadge;
@@ -1490,94 +1520,163 @@ function ChainBadgeIcons() {
1490
1520
  ChainBadgeIcons.displayName = "ChainBadgeIcons";
1491
1521
 
1492
1522
  // src/components/steps/ConnectStep.tsx
1493
- import { Fragment, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1523
+ import { Fragment, jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1524
+ function formatBalanceUsd(value) {
1525
+ if (!Number.isFinite(value) || value <= 0) return "$0.00";
1526
+ return `$${value.toFixed(2)}`;
1527
+ }
1494
1528
  function shorten(addr) {
1495
1529
  return addr.length > 12 ? `${addr.slice(0, 6)}...${addr.slice(-4)}` : addr;
1496
1530
  }
1497
- function renderWalletLeading(option) {
1498
- if (option.icon) {
1499
- return /* @__PURE__ */ jsx6(
1531
+ function renderWalletLeading(row) {
1532
+ if (row.icon) {
1533
+ return /* @__PURE__ */ jsx7(
1500
1534
  "img",
1501
1535
  {
1502
- src: option.icon,
1536
+ src: row.icon,
1503
1537
  alt: "",
1504
1538
  style: { width: 24, height: 24, borderRadius: 6 }
1505
1539
  }
1506
1540
  );
1507
1541
  }
1508
- return /* @__PURE__ */ jsx6(WalletIcon, {});
1542
+ return /* @__PURE__ */ jsx7(WalletIcon, {});
1543
+ }
1544
+ function renderRowTrailing(state) {
1545
+ if (state === "loading") {
1546
+ return /* @__PURE__ */ jsx7(Spinner, { className: "rs-spinner--sm" });
1547
+ }
1548
+ return void 0;
1509
1549
  }
1510
1550
  function ConnectStep({
1511
- walletOptions,
1551
+ walletRows,
1512
1552
  onConfirmWallet,
1513
1553
  onSelectTransferCrypto,
1554
+ transferCryptoState,
1555
+ transferCryptoErrorReason,
1514
1556
  onRequestConnect,
1515
1557
  onConnect,
1516
1558
  onDisconnect,
1559
+ dappImports,
1560
+ onSelectDappImport,
1517
1561
  title = "Deposit",
1518
1562
  subtitle
1519
1563
  }) {
1520
- const options = walletOptions ?? [];
1564
+ const rows = walletRows ?? [];
1521
1565
  const handleConnect = onConnect ?? onRequestConnect;
1522
- const hasReownWallet = options.some(
1523
- (option) => option.kind === "external" || option.kind === "solana"
1566
+ const hasReownWallet = rows.some(
1567
+ (row) => row.kind === "external" || row.kind === "solana"
1524
1568
  );
1569
+ const showDappImports = hasReownWallet && (dappImports?.length ?? 0) > 0;
1525
1570
  const extraChainCount = Math.max(0, getSupportedChainIds().length - 3);
1526
- const chainBadge2 = /* @__PURE__ */ jsxs5(Fragment, { children: [
1527
- /* @__PURE__ */ jsx6(ChainBadgeIcons, {}),
1571
+ const chainBadge2 = /* @__PURE__ */ jsxs6(Fragment, { children: [
1572
+ /* @__PURE__ */ jsx7(ChainBadgeIcons, {}),
1528
1573
  extraChainCount > 0 ? `+${extraChainCount} chains` : "All chains"
1529
1574
  ] });
1530
1575
  const defaultSubtitle = onSelectTransferCrypto ? "Add money to your balance" : "Choose a wallet to continue";
1531
- return /* @__PURE__ */ jsxs5("div", { className: "rs-screen", children: [
1532
- /* @__PURE__ */ jsxs5("div", { className: "rs-screen-body rs-screen-body--gap-32", children: [
1533
- /* @__PURE__ */ jsx6(
1576
+ return /* @__PURE__ */ jsxs6("div", { className: "rs-screen", children: [
1577
+ /* @__PURE__ */ jsxs6("div", { className: "rs-screen-body rs-screen-body--gap-32", children: [
1578
+ /* @__PURE__ */ jsx7(
1534
1579
  BodyHeader,
1535
1580
  {
1536
- icon: /* @__PURE__ */ jsx6(HandCoinsIcon, {}),
1581
+ icon: /* @__PURE__ */ jsx7(HandCoinsIcon, {}),
1537
1582
  title,
1538
1583
  subtitle: subtitle ?? defaultSubtitle
1539
1584
  }
1540
1585
  ),
1541
- /* @__PURE__ */ jsxs5("div", { className: "rs-list", children: [
1542
- onSelectTransferCrypto && /* @__PURE__ */ jsx6(
1586
+ /* @__PURE__ */ jsxs6("div", { className: "rs-list", children: [
1587
+ onSelectTransferCrypto && /* @__PURE__ */ jsx7(
1543
1588
  ListRow,
1544
1589
  {
1545
- leading: /* @__PURE__ */ jsx6(CoinsIcon, {}),
1590
+ leading: /* @__PURE__ */ jsx7(CoinsIcon, {}),
1546
1591
  title: "Transfer crypto",
1547
- subtitle: "Instant - No limit",
1592
+ subtitle: transferCryptoState === "loading" ? "Preparing\u2026" : transferCryptoState === "error" ? transferCryptoErrorReason ?? "Couldn't prepare account \u2014 tap to retry" : "Instant - No limit",
1548
1593
  meta: chainBadge2,
1549
- onClick: onSelectTransferCrypto
1594
+ onClick: onSelectTransferCrypto,
1595
+ disabled: transferCryptoState === "loading",
1596
+ trailing: transferCryptoState === "loading" ? /* @__PURE__ */ jsx7(Spinner, { className: "rs-spinner--sm" }) : void 0
1550
1597
  }
1551
1598
  ),
1552
- options.map((option) => {
1553
- const rawAddress = option.address ?? option.solanaAddress ?? option.id;
1554
- return /* @__PURE__ */ jsx6(
1599
+ rows.map((row) => {
1600
+ const collapseToExternal = Boolean(onSelectTransferCrypto) && row.kind !== "solana";
1601
+ const subtitleText = row.state === "loading" ? "Preparing\u2026" : row.state === "error" ? row.errorReason ?? "Couldn't prepare wallet \u2014 tap to retry" : shorten(row.address);
1602
+ return /* @__PURE__ */ jsx7(
1555
1603
  ListRow,
1556
1604
  {
1557
- leading: renderWalletLeading(option),
1558
- title: onSelectTransferCrypto ? "External wallet" : option.label,
1559
- subtitle: shorten(rawAddress),
1560
- onClick: () => onConfirmWallet?.(option.id)
1605
+ leading: renderWalletLeading(row),
1606
+ title: collapseToExternal ? "External wallet" : row.label,
1607
+ subtitle: subtitleText,
1608
+ onClick: () => onConfirmWallet?.(row.id),
1609
+ disabled: row.state === "loading",
1610
+ trailing: renderRowTrailing(row.state)
1561
1611
  },
1562
- option.id
1612
+ row.id
1563
1613
  );
1564
1614
  }),
1565
- !hasReownWallet && handleConnect && /* @__PURE__ */ jsx6(
1615
+ !hasReownWallet && handleConnect && /* @__PURE__ */ jsx7(
1566
1616
  ListRow,
1567
1617
  {
1568
- leading: /* @__PURE__ */ jsx6(WalletIcon, {}),
1618
+ leading: /* @__PURE__ */ jsx7(WalletIcon, {}),
1569
1619
  title: "Connect wallet",
1570
1620
  subtitle: "Instant - No limit",
1571
- meta: /* @__PURE__ */ jsxs5(Fragment, { children: [
1572
- /* @__PURE__ */ jsx6(WalletBadgeIcons, {}),
1621
+ meta: /* @__PURE__ */ jsxs6(Fragment, { children: [
1622
+ /* @__PURE__ */ jsx7(WalletBadgeIcons, {}),
1573
1623
  "+100 wallets"
1574
1624
  ] }),
1575
1625
  onClick: handleConnect
1576
1626
  }
1577
- )
1627
+ ),
1628
+ showDappImports && dappImports?.map((row) => {
1629
+ if (row.status === "loading") {
1630
+ return /* @__PURE__ */ jsx7(
1631
+ ListRow,
1632
+ {
1633
+ leading: row.icon,
1634
+ title: row.label,
1635
+ subtitle: "Checking balance\u2026",
1636
+ disabled: true,
1637
+ trailing: /* @__PURE__ */ jsx7(Spinner, { className: "rs-spinner--sm" })
1638
+ },
1639
+ row.id
1640
+ );
1641
+ }
1642
+ if (row.status.enabled) {
1643
+ return /* @__PURE__ */ jsx7(
1644
+ ListRow,
1645
+ {
1646
+ leading: row.icon,
1647
+ title: row.label,
1648
+ subtitle: formatBalanceUsd(row.status.balanceUsd),
1649
+ onClick: () => onSelectDappImport?.(row.id)
1650
+ },
1651
+ row.id
1652
+ );
1653
+ }
1654
+ if (row.status.retryable) {
1655
+ return /* @__PURE__ */ jsx7(
1656
+ ListRow,
1657
+ {
1658
+ leading: row.icon,
1659
+ title: row.label,
1660
+ subtitle: row.status.reason,
1661
+ onClick: () => onSelectDappImport?.(row.id)
1662
+ },
1663
+ row.id
1664
+ );
1665
+ }
1666
+ return /* @__PURE__ */ jsx7(
1667
+ ListRow,
1668
+ {
1669
+ leading: row.icon,
1670
+ title: row.label,
1671
+ subtitle: row.status.reason,
1672
+ disabled: true
1673
+ },
1674
+ row.id
1675
+ );
1676
+ })
1578
1677
  ] })
1579
1678
  ] }),
1580
- onDisconnect && hasReownWallet && /* @__PURE__ */ jsx6("div", { className: "rs-screen-tight-row", children: /* @__PURE__ */ jsx6(
1679
+ onDisconnect && hasReownWallet && /* @__PURE__ */ jsx7("div", { className: "rs-screen-tight-row", children: /* @__PURE__ */ jsx7(
1581
1680
  "button",
1582
1681
  {
1583
1682
  type: "button",
@@ -1586,90 +1685,11 @@ function ConnectStep({
1586
1685
  children: "Disconnect wallet"
1587
1686
  }
1588
1687
  ) }),
1589
- /* @__PURE__ */ jsx6(PoweredBy, {})
1688
+ /* @__PURE__ */ jsx7(PoweredBy, {})
1590
1689
  ] });
1591
1690
  }
1592
1691
  ConnectStep.displayName = "ConnectStep";
1593
1692
 
1594
- // src/components/ui/Spinner.tsx
1595
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1596
- function Spinner({ className }) {
1597
- return /* @__PURE__ */ jsxs6(
1598
- "svg",
1599
- {
1600
- className: `rs-spinner ${className || ""}`,
1601
- fill: "none",
1602
- viewBox: "0 0 20 21",
1603
- children: [
1604
- /* @__PURE__ */ jsx7(
1605
- "path",
1606
- {
1607
- d: "M10 0.5C8.02219 0.5 6.08879 1.08649 4.4443 2.1853C2.79981 3.28412 1.51809 4.8459 0.761209 6.67316C0.00433288 8.50043 -0.1937 10.5111 0.192152 12.4509C0.578004 14.3907 1.53041 16.1725 2.92894 17.5711C4.32746 18.9696 6.10929 19.922 8.0491 20.3078C9.98891 20.6937 11.9996 20.4957 13.8268 19.7388C15.6541 18.9819 17.2159 17.7002 18.3147 16.0557C19.4135 14.4112 20 12.4778 20 10.5C20 7.84783 18.9464 5.3043 17.0711 3.42893C15.1957 1.55357 12.6522 0.5 10 0.5ZM10 17.7727C8.56159 17.7727 7.15549 17.3462 5.95949 16.547C4.7635 15.7479 3.83134 14.6121 3.28088 13.2831C2.73042 11.9542 2.5864 10.4919 2.86702 9.08116C3.14764 7.67039 3.8403 6.37451 4.85741 5.3574C5.87452 4.3403 7.17039 3.64764 8.58116 3.36702C9.99193 3.0864 11.4542 3.23042 12.7832 3.78088C14.1121 4.33133 15.2479 5.26349 16.0471 6.45949C16.8462 7.65548 17.2727 9.06159 17.2727 10.5C17.2727 12.4288 16.5065 14.2787 15.1426 15.6426C13.7787 17.0065 11.9288 17.7727 10 17.7727Z",
1608
- fill: "currentColor",
1609
- opacity: 0.3
1610
- }
1611
- ),
1612
- /* @__PURE__ */ jsx7(
1613
- "path",
1614
- {
1615
- d: "M10 3.22767C11.7423 3.22846 13.4276 3.8412 14.7556 4.95667C16.0837 6.07214 16.9681 7.61784 17.2512 9.31825C17.3012 9.64364 17.4662 9.94096 17.7169 10.1573C17.9677 10.3737 18.2878 10.4951 18.6205 10.5C18.8211 10.5001 19.0193 10.457 19.2012 10.3735C19.3832 10.2901 19.5445 10.1684 19.674 10.017C19.8036 9.86549 19.8981 9.68789 19.9511 9.49656C20.004 9.30523 20.0141 9.10478 19.9807 8.90918C19.5986 6.56305 18.3843 4.42821 16.5554 2.88726C14.7265 1.34631 12.4025 0.5 10 0.5C7.59751 0.5 5.27354 1.34631 3.44461 2.88726C1.61569 4.42821 0.401366 6.56305 0.0192815 8.90918C-0.0141442 9.10478 -0.00402016 9.30523 0.0489472 9.49656C0.101914 9.68789 0.196449 9.86549 0.325956 10.017C0.455463 10.1684 0.616823 10.2901 0.798778 10.3735C0.980732 10.457 1.1789 10.5001 1.37945 10.5C1.71216 10.4951 2.03235 10.3737 2.28307 10.1573C2.5338 9.94096 2.69883 9.64364 2.74882 9.31825C3.03193 7.61784 3.91633 6.07214 5.24436 4.95667C6.57239 3.8412 8.25775 3.22846 10 3.22767Z",
1616
- fill: "currentColor"
1617
- }
1618
- )
1619
- ]
1620
- }
1621
- );
1622
- }
1623
-
1624
- // src/core/session-owner.ts
1625
- import { isAddress } from "viem";
1626
- import {
1627
- generatePrivateKey,
1628
- privateKeyToAccount
1629
- } from "viem/accounts";
1630
- var STORAGE_PREFIX = "rhinestone:session-owner";
1631
- function storageKey(eoaAddress) {
1632
- return `${STORAGE_PREFIX}:${eoaAddress.toLowerCase()}`;
1633
- }
1634
- function loadSessionOwnerFromStorage(eoaAddress) {
1635
- if (typeof window === "undefined") return null;
1636
- const raw = window.localStorage.getItem(storageKey(eoaAddress));
1637
- if (!raw) return null;
1638
- try {
1639
- const parsed = JSON.parse(raw);
1640
- if (!parsed.privateKey) return null;
1641
- const account = privateKeyToAccount(parsed.privateKey);
1642
- return {
1643
- privateKey: parsed.privateKey,
1644
- address: account.address
1645
- };
1646
- } catch {
1647
- return null;
1648
- }
1649
- }
1650
- function saveSessionOwnerToStorage(eoaAddress, privateKey, address) {
1651
- if (typeof window === "undefined") return;
1652
- if (!isAddress(address)) return;
1653
- const payload = {
1654
- privateKey,
1655
- address,
1656
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
1657
- };
1658
- window.localStorage.setItem(storageKey(eoaAddress), JSON.stringify(payload));
1659
- }
1660
- function createSessionOwnerKey() {
1661
- const privateKey = generatePrivateKey();
1662
- const account = privateKeyToAccount(privateKey);
1663
- return {
1664
- privateKey,
1665
- account,
1666
- address: account.address
1667
- };
1668
- }
1669
- function accountFromPrivateKey(privateKey) {
1670
- return privateKeyToAccount(privateKey);
1671
- }
1672
-
1673
1693
  // src/core/formatters.ts
1674
1694
  var currencyFormatter = new Intl.NumberFormat("en-US", {
1675
1695
  style: "currency",
@@ -2437,7 +2457,6 @@ function ProcessingStep({
2437
2457
  const sourceChainName = getChainName(displaySourceChain);
2438
2458
  const targetChainName = getChainName(targetChain);
2439
2459
  const totalTimeText = formatElapsedTime(elapsedSeconds);
2440
- const feeSymbol = quotedFeeSymbol ?? sourceSymbol;
2441
2460
  const feeSponsored = uiConfig?.feeSponsored ?? false;
2442
2461
  const feeTooltip = uiConfig?.feeTooltip ?? (feeSponsored ? "Network fees are sponsored for this deposit." : "Network fees apply.");
2443
2462
  const stateTitle = isComplete ? `${flowCapitalized} successful` : isFailed ? `${flowCapitalized} failed` : "Processing...";
@@ -2528,15 +2547,11 @@ function ProcessingStep({
2528
2547
  /* @__PURE__ */ jsxs9("div", { className: "rs-amount-detail-row", children: [
2529
2548
  /* @__PURE__ */ jsx10("span", { children: "Fees" }),
2530
2549
  /* @__PURE__ */ jsxs9("span", { className: "rs-amount-detail-value", children: [
2531
- /* @__PURE__ */ jsxs9(
2550
+ /* @__PURE__ */ jsx10(
2532
2551
  "span",
2533
2552
  {
2534
2553
  style: feeSponsored ? { textDecoration: "line-through" } : void 0,
2535
- children: [
2536
- quotedFeeAmount,
2537
- " ",
2538
- feeSymbol
2539
- ]
2554
+ children: "$0.05"
2540
2555
  }
2541
2556
  ),
2542
2557
  /* @__PURE__ */ jsx10(Tooltip, { content: feeTooltip, children: /* @__PURE__ */ jsx10("span", { className: "rs-amount-detail-info", "aria-label": "Fee info", children: /* @__PURE__ */ jsx10(InfoIcon, {}) }) })
@@ -2564,6 +2579,291 @@ function ProcessingStep({
2564
2579
  ] });
2565
2580
  }
2566
2581
 
2582
+ // src/core/safe.ts
2583
+ import {
2584
+ concat,
2585
+ encodeFunctionData,
2586
+ erc20Abi,
2587
+ hashTypedData,
2588
+ pad,
2589
+ parseEventLogs,
2590
+ toHex,
2591
+ zeroAddress
2592
+ } from "viem";
2593
+ var SAFE_ABI = [
2594
+ {
2595
+ type: "function",
2596
+ name: "isOwner",
2597
+ stateMutability: "view",
2598
+ inputs: [{ name: "owner", type: "address" }],
2599
+ outputs: [{ name: "", type: "bool" }]
2600
+ },
2601
+ {
2602
+ type: "function",
2603
+ name: "nonce",
2604
+ stateMutability: "view",
2605
+ inputs: [],
2606
+ outputs: [{ type: "uint256" }]
2607
+ },
2608
+ {
2609
+ type: "function",
2610
+ name: "execTransaction",
2611
+ stateMutability: "payable",
2612
+ inputs: [
2613
+ { name: "to", type: "address" },
2614
+ { name: "value", type: "uint256" },
2615
+ { name: "data", type: "bytes" },
2616
+ { name: "operation", type: "uint8" },
2617
+ { name: "safeTxGas", type: "uint256" },
2618
+ { name: "baseGas", type: "uint256" },
2619
+ { name: "gasPrice", type: "uint256" },
2620
+ { name: "gasToken", type: "address" },
2621
+ { name: "refundReceiver", type: "address" },
2622
+ { name: "signatures", type: "bytes" }
2623
+ ],
2624
+ outputs: [{ name: "success", type: "bool" }]
2625
+ },
2626
+ {
2627
+ type: "event",
2628
+ name: "ExecutionSuccess",
2629
+ inputs: [
2630
+ { name: "txHash", type: "bytes32", indexed: true },
2631
+ { name: "payment", type: "uint256", indexed: false }
2632
+ ],
2633
+ anonymous: false
2634
+ },
2635
+ {
2636
+ type: "event",
2637
+ name: "ExecutionFailure",
2638
+ inputs: [
2639
+ { name: "txHash", type: "bytes32", indexed: true },
2640
+ { name: "payment", type: "uint256", indexed: false }
2641
+ ],
2642
+ anonymous: false
2643
+ }
2644
+ ];
2645
+ async function executeSafeEthTransfer(params) {
2646
+ const {
2647
+ walletClient,
2648
+ publicClient,
2649
+ safeAddress,
2650
+ recipient,
2651
+ amount,
2652
+ chainId
2653
+ } = params;
2654
+ const account = walletClient.account;
2655
+ const chain = walletClient.chain;
2656
+ if (!account || !chain) {
2657
+ throw new Error("Wallet not connected");
2658
+ }
2659
+ if (chain.id !== chainId) {
2660
+ throw new Error(`Switch to ${getChainName(chainId)} to sign`);
2661
+ }
2662
+ const isOwner = await publicClient.readContract({
2663
+ address: safeAddress,
2664
+ abi: SAFE_ABI,
2665
+ functionName: "isOwner",
2666
+ args: [account.address]
2667
+ });
2668
+ if (!isOwner) {
2669
+ throw new Error("Connected wallet is not a Safe owner");
2670
+ }
2671
+ const safeTx = {
2672
+ to: recipient,
2673
+ value: amount,
2674
+ data: "0x",
2675
+ operation: 0,
2676
+ safeTxGas: 0n,
2677
+ baseGas: 0n,
2678
+ gasPrice: 0n,
2679
+ gasToken: zeroAddress,
2680
+ refundReceiver: zeroAddress
2681
+ };
2682
+ const signature = concat([
2683
+ pad(account.address, { size: 32 }),
2684
+ pad(toHex(0), { size: 32 }),
2685
+ toHex(1, { size: 1 })
2686
+ ]);
2687
+ const txHash = await walletClient.writeContract({
2688
+ account,
2689
+ chain,
2690
+ address: safeAddress,
2691
+ abi: SAFE_ABI,
2692
+ functionName: "execTransaction",
2693
+ args: [
2694
+ safeTx.to,
2695
+ safeTx.value,
2696
+ safeTx.data,
2697
+ safeTx.operation,
2698
+ safeTx.safeTxGas,
2699
+ safeTx.baseGas,
2700
+ safeTx.gasPrice,
2701
+ safeTx.gasToken,
2702
+ safeTx.refundReceiver,
2703
+ signature
2704
+ ]
2705
+ });
2706
+ const receipt = await publicClient.waitForTransactionReceipt({
2707
+ hash: txHash
2708
+ });
2709
+ const safeLogs = receipt.logs.filter(
2710
+ (log) => log.address.toLowerCase() === safeAddress.toLowerCase()
2711
+ );
2712
+ const parsed = parseEventLogs({
2713
+ abi: SAFE_ABI,
2714
+ logs: safeLogs,
2715
+ strict: false
2716
+ });
2717
+ const failed = parsed.find((log) => log.eventName === "ExecutionFailure");
2718
+ if (failed) {
2719
+ throw new Error("Safe transaction failed");
2720
+ }
2721
+ const succeeded = parsed.find((log) => log.eventName === "ExecutionSuccess");
2722
+ if (!succeeded) {
2723
+ throw new Error("Safe transaction status unavailable");
2724
+ }
2725
+ return { txHash };
2726
+ }
2727
+ async function executeSafeErc20Transfer(params) {
2728
+ const {
2729
+ walletClient,
2730
+ publicClient,
2731
+ safeAddress,
2732
+ tokenAddress,
2733
+ recipient,
2734
+ amount,
2735
+ chainId
2736
+ } = params;
2737
+ const account = walletClient.account;
2738
+ const chain = walletClient.chain;
2739
+ if (!account || !chain) {
2740
+ throw new Error("Wallet not connected");
2741
+ }
2742
+ if (chain.id !== chainId) {
2743
+ throw new Error(`Switch to ${getChainName(chainId)} to sign`);
2744
+ }
2745
+ const isOwner = await publicClient.readContract({
2746
+ address: safeAddress,
2747
+ abi: SAFE_ABI,
2748
+ functionName: "isOwner",
2749
+ args: [account.address]
2750
+ });
2751
+ if (!isOwner) {
2752
+ throw new Error("Connected wallet is not a Safe owner");
2753
+ }
2754
+ const data = encodeFunctionData({
2755
+ abi: erc20Abi,
2756
+ functionName: "transfer",
2757
+ args: [recipient, amount]
2758
+ });
2759
+ const safeTx = {
2760
+ to: tokenAddress,
2761
+ value: 0n,
2762
+ data,
2763
+ operation: 0,
2764
+ safeTxGas: 0n,
2765
+ baseGas: 0n,
2766
+ gasPrice: 0n,
2767
+ gasToken: zeroAddress,
2768
+ refundReceiver: zeroAddress
2769
+ };
2770
+ const signature = concat([
2771
+ pad(account.address, { size: 32 }),
2772
+ pad(toHex(0), { size: 32 }),
2773
+ toHex(1, { size: 1 })
2774
+ ]);
2775
+ const txHash = await walletClient.writeContract({
2776
+ account,
2777
+ chain,
2778
+ address: safeAddress,
2779
+ abi: SAFE_ABI,
2780
+ functionName: "execTransaction",
2781
+ args: [
2782
+ safeTx.to,
2783
+ safeTx.value,
2784
+ safeTx.data,
2785
+ safeTx.operation,
2786
+ safeTx.safeTxGas,
2787
+ safeTx.baseGas,
2788
+ safeTx.gasPrice,
2789
+ safeTx.gasToken,
2790
+ safeTx.refundReceiver,
2791
+ signature
2792
+ ]
2793
+ });
2794
+ const receipt = await publicClient.waitForTransactionReceipt({
2795
+ hash: txHash
2796
+ });
2797
+ const safeLogs = receipt.logs.filter(
2798
+ (log) => log.address.toLowerCase() === safeAddress.toLowerCase()
2799
+ );
2800
+ const parsed = parseEventLogs({
2801
+ abi: SAFE_ABI,
2802
+ logs: safeLogs,
2803
+ strict: false
2804
+ });
2805
+ const failed = parsed.find((log) => log.eventName === "ExecutionFailure");
2806
+ if (failed) {
2807
+ throw new Error("Safe transaction failed");
2808
+ }
2809
+ const succeeded = parsed.find((log) => log.eventName === "ExecutionSuccess");
2810
+ if (!succeeded) {
2811
+ throw new Error("Safe transaction status unavailable");
2812
+ }
2813
+ return { txHash };
2814
+ }
2815
+ var SAFE_TX_TYPES = {
2816
+ SafeTx: [
2817
+ { name: "to", type: "address" },
2818
+ { name: "value", type: "uint256" },
2819
+ { name: "data", type: "bytes" },
2820
+ { name: "operation", type: "uint8" },
2821
+ { name: "safeTxGas", type: "uint256" },
2822
+ { name: "baseGas", type: "uint256" },
2823
+ { name: "gasPrice", type: "uint256" },
2824
+ { name: "gasToken", type: "address" },
2825
+ { name: "refundReceiver", type: "address" },
2826
+ { name: "nonce", type: "uint256" }
2827
+ ]
2828
+ };
2829
+ async function buildSafeTransaction(params) {
2830
+ const { publicClient, safeAddress, to, value, data, chainId } = params;
2831
+ const nonce = await publicClient.readContract({
2832
+ address: safeAddress,
2833
+ abi: SAFE_ABI,
2834
+ functionName: "nonce"
2835
+ });
2836
+ const message = {
2837
+ to,
2838
+ value,
2839
+ data,
2840
+ operation: 0,
2841
+ safeTxGas: 0n,
2842
+ baseGas: 0n,
2843
+ gasPrice: 0n,
2844
+ gasToken: zeroAddress,
2845
+ refundReceiver: zeroAddress,
2846
+ nonce
2847
+ };
2848
+ const safeTxHash = hashTypedData({
2849
+ domain: { chainId, verifyingContract: safeAddress },
2850
+ types: SAFE_TX_TYPES,
2851
+ primaryType: "SafeTx",
2852
+ message
2853
+ });
2854
+ return {
2855
+ chainId,
2856
+ safeAddress,
2857
+ safeTxHash,
2858
+ typedData: {
2859
+ domain: { chainId, verifyingContract: safeAddress },
2860
+ types: SAFE_TX_TYPES,
2861
+ primaryType: "SafeTx",
2862
+ message
2863
+ }
2864
+ };
2865
+ }
2866
+
2567
2867
  // src/core/public-client.ts
2568
2868
  import { createPublicClient, http } from "viem";
2569
2869
  var clientCache = /* @__PURE__ */ new Map();
@@ -2580,6 +2880,55 @@ function getPublicClient(chainId) {
2580
2880
  return client;
2581
2881
  }
2582
2882
 
2883
+ // src/core/session-owner.ts
2884
+ import { isAddress } from "viem";
2885
+ import {
2886
+ generatePrivateKey,
2887
+ privateKeyToAccount
2888
+ } from "viem/accounts";
2889
+ var STORAGE_PREFIX = "rhinestone:session-owner";
2890
+ function storageKey(eoaAddress) {
2891
+ return `${STORAGE_PREFIX}:${eoaAddress.toLowerCase()}`;
2892
+ }
2893
+ function loadSessionOwnerFromStorage(eoaAddress) {
2894
+ if (typeof window === "undefined") return null;
2895
+ const raw = window.localStorage.getItem(storageKey(eoaAddress));
2896
+ if (!raw) return null;
2897
+ try {
2898
+ const parsed = JSON.parse(raw);
2899
+ if (!parsed.privateKey) return null;
2900
+ const account = privateKeyToAccount(parsed.privateKey);
2901
+ return {
2902
+ privateKey: parsed.privateKey,
2903
+ address: account.address
2904
+ };
2905
+ } catch {
2906
+ return null;
2907
+ }
2908
+ }
2909
+ function saveSessionOwnerToStorage(eoaAddress, privateKey, address) {
2910
+ if (typeof window === "undefined") return;
2911
+ if (!isAddress(address)) return;
2912
+ const payload = {
2913
+ privateKey,
2914
+ address,
2915
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
2916
+ };
2917
+ window.localStorage.setItem(storageKey(eoaAddress), JSON.stringify(payload));
2918
+ }
2919
+ function createSessionOwnerKey() {
2920
+ const privateKey = generatePrivateKey();
2921
+ const account = privateKeyToAccount(privateKey);
2922
+ return {
2923
+ privateKey,
2924
+ account,
2925
+ address: account.address
2926
+ };
2927
+ }
2928
+ function accountFromPrivateKey(privateKey) {
2929
+ return privateKeyToAccount(privateKey);
2930
+ }
2931
+
2583
2932
  export {
2584
2933
  Modal,
2585
2934
  WalletIcon,
@@ -2588,6 +2937,7 @@ export {
2588
2937
  ChevronLeftIcon,
2589
2938
  ChevronDownIcon,
2590
2939
  CloseIcon,
2940
+ HandCoinsIcon,
2591
2941
  CoinsIcon,
2592
2942
  HistoryIcon,
2593
2943
  InfoIcon,
@@ -2599,9 +2949,10 @@ export {
2599
2949
  PlusCircleIcon,
2600
2950
  CircleArrowOutUpLeftIcon,
2601
2951
  BodyHeader,
2952
+ ListRow,
2602
2953
  PoweredBy,
2603
- ConnectStep,
2604
2954
  Spinner,
2955
+ ConnectStep,
2605
2956
  Button,
2606
2957
  debugLog,
2607
2958
  debugError,
@@ -2613,10 +2964,6 @@ export {
2613
2964
  isNativeAsset,
2614
2965
  buildSessionDetails,
2615
2966
  createDepositService,
2616
- loadSessionOwnerFromStorage,
2617
- saveSessionOwnerToStorage,
2618
- createSessionOwnerKey,
2619
- accountFromPrivateKey,
2620
2967
  currencyFormatter,
2621
2968
  tokenFormatter,
2622
2969
  formatUserError,
@@ -2626,6 +2973,14 @@ export {
2626
2973
  txRefsMatch,
2627
2974
  useLatestRef,
2628
2975
  ProcessingStep,
2976
+ SAFE_ABI,
2977
+ executeSafeEthTransfer,
2978
+ executeSafeErc20Transfer,
2979
+ buildSafeTransaction,
2629
2980
  getPublicClient,
2981
+ loadSessionOwnerFromStorage,
2982
+ saveSessionOwnerToStorage,
2983
+ createSessionOwnerKey,
2984
+ accountFromPrivateKey,
2630
2985
  applyTheme
2631
2986
  };