@metamask/smart-accounts-kit 1.0.0 → 1.2.0

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/README.md +34 -2
  3. package/dist/actions/index.cjs +5 -5
  4. package/dist/actions/index.d.cts +2 -2
  5. package/dist/actions/index.d.ts +2 -2
  6. package/dist/actions/index.mjs +4 -4
  7. package/dist/{smartAccountsEnvironment-Czw9KUYZ.d.cts → caveats-CQbtzOKm.d.ts} +9 -2
  8. package/dist/{smartAccountsEnvironment-u1CcFcGE.d.ts → caveats-Cey0wm33.d.cts} +9 -2
  9. package/dist/{chunk-UUOH2WAW.cjs → chunk-3SHZ7PV2.cjs} +12 -12
  10. package/dist/{chunk-UUOH2WAW.cjs.map → chunk-3SHZ7PV2.cjs.map} +1 -1
  11. package/dist/{chunk-TPBFVDVM.mjs → chunk-4QXIOE7F.mjs} +8 -6
  12. package/dist/chunk-4QXIOE7F.mjs.map +1 -0
  13. package/dist/{chunk-NOCLGZGB.mjs → chunk-734MOPHR.mjs} +63 -5
  14. package/dist/chunk-734MOPHR.mjs.map +1 -0
  15. package/dist/{chunk-YDLLC6PP.cjs → chunk-7BEEGBA2.cjs} +519 -16
  16. package/dist/chunk-7BEEGBA2.cjs.map +1 -0
  17. package/dist/{chunk-45GHWVQA.mjs → chunk-G7VZ7E6W.mjs} +4 -4
  18. package/dist/{chunk-XN36L4RX.cjs → chunk-HFRQNSZE.cjs} +106 -107
  19. package/dist/chunk-HFRQNSZE.cjs.map +1 -0
  20. package/dist/{chunk-33AMUJBJ.mjs → chunk-L5DLMBDC.mjs} +5 -6
  21. package/dist/{chunk-VLKX4BR6.cjs → chunk-MOHCTPYQ.cjs} +8 -6
  22. package/dist/chunk-MOHCTPYQ.cjs.map +1 -0
  23. package/dist/{chunk-QMRKCB7T.cjs → chunk-T4IAMAB2.cjs} +102 -44
  24. package/dist/chunk-T4IAMAB2.cjs.map +1 -0
  25. package/dist/{chunk-BYWRJGSK.cjs → chunk-UB2FLPP3.cjs} +16 -16
  26. package/dist/{chunk-BYWRJGSK.cjs.map → chunk-UB2FLPP3.cjs.map} +1 -1
  27. package/dist/{chunk-23YXLKTX.cjs → chunk-UZO5OYCD.cjs} +14 -14
  28. package/dist/{chunk-23YXLKTX.cjs.map → chunk-UZO5OYCD.cjs.map} +1 -1
  29. package/dist/{chunk-YTELOQ4I.mjs → chunk-VJXM3LWA.mjs} +2 -2
  30. package/dist/{chunk-WV2R7BXP.mjs → chunk-YTNCEXUX.mjs} +3 -3
  31. package/dist/{chunk-C5ZEEH2Z.mjs → chunk-ZA2XYCVX.mjs} +517 -14
  32. package/dist/chunk-ZA2XYCVX.mjs.map +1 -0
  33. package/dist/contracts/index.cjs +6 -6
  34. package/dist/contracts/index.d.cts +3 -3
  35. package/dist/contracts/index.d.ts +3 -3
  36. package/dist/contracts/index.mjs +5 -5
  37. package/dist/{delegation-DIriDFkq.d.cts → delegation-Bx4FEAIU.d.ts} +2 -2
  38. package/dist/{delegation-CvVXs0PO.d.ts → delegation-KbWHzRxV.d.cts} +2 -2
  39. package/dist/experimental/index.cjs +36 -4
  40. package/dist/experimental/index.cjs.map +1 -1
  41. package/dist/experimental/index.d.cts +5 -2
  42. package/dist/experimental/index.d.ts +5 -2
  43. package/dist/experimental/index.mjs +35 -3
  44. package/dist/experimental/index.mjs.map +1 -1
  45. package/dist/{index-ChTryO1-.d.ts → index-D2THBlfm.d.ts} +3 -3
  46. package/dist/{index-5EdxVa_d.d.ts → index-D7fBuNV-.d.ts} +3 -3
  47. package/dist/{index-DC9baw8F.d.cts → index-DE87r5KY.d.cts} +3 -3
  48. package/dist/{index-Dvc4ir4O.d.cts → index-Uj_xXVko.d.cts} +3 -3
  49. package/dist/index.cjs +36 -26
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +10 -12
  52. package/dist/index.d.ts +10 -12
  53. package/dist/index.mjs +28 -18
  54. package/dist/index.mjs.map +1 -1
  55. package/dist/{types-qdEHxd5Q.d.ts → types-BWaH4KH1.d.cts} +3 -2
  56. package/dist/{types-qdEHxd5Q.d.cts → types-BWaH4KH1.d.ts} +3 -2
  57. package/dist/utils/index.cjs +7 -5
  58. package/dist/utils/index.cjs.map +1 -1
  59. package/dist/utils/index.d.cts +3 -3
  60. package/dist/utils/index.d.ts +3 -3
  61. package/dist/utils/index.mjs +6 -4
  62. package/package.json +5 -4
  63. package/dist/chunk-C5ZEEH2Z.mjs.map +0 -1
  64. package/dist/chunk-NOCLGZGB.mjs.map +0 -1
  65. package/dist/chunk-QMRKCB7T.cjs.map +0 -1
  66. package/dist/chunk-TPBFVDVM.mjs.map +0 -1
  67. package/dist/chunk-VLKX4BR6.cjs.map +0 -1
  68. package/dist/chunk-XN36L4RX.cjs.map +0 -1
  69. package/dist/chunk-YDLLC6PP.cjs.map +0 -1
  70. /package/dist/{chunk-45GHWVQA.mjs.map → chunk-G7VZ7E6W.mjs.map} +0 -0
  71. /package/dist/{chunk-33AMUJBJ.mjs.map → chunk-L5DLMBDC.mjs.map} +0 -0
  72. /package/dist/{chunk-YTELOQ4I.mjs.map → chunk-VJXM3LWA.mjs.map} +0 -0
  73. /package/dist/{chunk-WV2R7BXP.mjs.map → chunk-YTNCEXUX.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __export
3
- } from "./chunk-C5ZEEH2Z.mjs";
3
+ } from "./chunk-ZA2XYCVX.mjs";
4
4
 
5
5
  // src/DelegationFramework/ERC20PeriodTransferEnforcer/index.ts
6
6
  var ERC20PeriodTransferEnforcer_exports = {};
@@ -296,4 +296,4 @@ export {
296
296
  read_exports5,
297
297
  NativeTokenStreamingEnforcer_exports
298
298
  };
299
- //# sourceMappingURL=chunk-YTELOQ4I.mjs.map
299
+ //# sourceMappingURL=chunk-VJXM3LWA.mjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  encodeExecutionCalldata
3
- } from "./chunk-TPBFVDVM.mjs";
3
+ } from "./chunk-4QXIOE7F.mjs";
4
4
  import {
5
5
  __export,
6
6
  toDelegationStruct
7
- } from "./chunk-C5ZEEH2Z.mjs";
7
+ } from "./chunk-ZA2XYCVX.mjs";
8
8
 
9
9
  // src/DelegationFramework/utils.ts
10
10
  import { ERC1967Proxy } from "@metamask/delegation-abis";
@@ -827,4 +827,4 @@ export {
827
827
  execute6,
828
828
  encode_exports4
829
829
  };
830
- //# sourceMappingURL=chunk-WV2R7BXP.mjs.map
830
+ //# sourceMappingURL=chunk-YTNCEXUX.mjs.map
@@ -999,8 +999,8 @@ var timestamp = "timestamp";
999
999
  var timestampBuilder = (environment, config) => {
1000
1000
  const { afterThreshold, beforeThreshold } = config;
1001
1001
  const terms = createTimestampTerms({
1002
- timestampAfterThreshold: afterThreshold,
1003
- timestampBeforeThreshold: beforeThreshold
1002
+ afterThreshold,
1003
+ beforeThreshold
1004
1004
  });
1005
1005
  const {
1006
1006
  caveatEnforcers: { TimestampEnforcer }
@@ -1354,6 +1354,39 @@ var resolveCaveats = ({
1354
1354
  };
1355
1355
 
1356
1356
  // src/caveats.ts
1357
+ import {
1358
+ decodeAllowedCalldataTerms,
1359
+ decodeERC20StreamingTerms,
1360
+ decodeERC20TransferAmountTerms,
1361
+ decodeERC20BalanceChangeTerms,
1362
+ decodeAllowedMethodsTerms,
1363
+ decodeAllowedTargetsTerms,
1364
+ decodeArgsEqualityCheckTerms,
1365
+ decodeBlockNumberTerms,
1366
+ decodeDeployedTerms,
1367
+ decodeERC721BalanceChangeTerms,
1368
+ decodeERC721TransferTerms,
1369
+ decodeERC1155BalanceChangeTerms,
1370
+ decodeTimestampTerms,
1371
+ decodeNonceTerms,
1372
+ decodeValueLteTerms,
1373
+ decodeLimitedCallsTerms,
1374
+ decodeIdTerms,
1375
+ decodeNativeTokenTransferAmountTerms,
1376
+ decodeNativeBalanceChangeTerms,
1377
+ decodeNativeTokenStreamingTerms,
1378
+ decodeNativeTokenPaymentTerms,
1379
+ decodeRedeemerTerms,
1380
+ decodeSpecificActionERC20TransferBatchTerms,
1381
+ decodeNativeTokenPeriodTransferTerms,
1382
+ decodeERC20TokenPeriodTransferTerms,
1383
+ decodeExactExecutionTerms,
1384
+ decodeExactCalldataTerms,
1385
+ decodeExactCalldataBatchTerms,
1386
+ decodeExactExecutionBatchTerms,
1387
+ decodeMultiTokenPeriodTerms,
1388
+ decodeOwnershipTransferTerms
1389
+ } from "@metamask/delegation-core";
1357
1390
  import {
1358
1391
  encodeAbiParameters,
1359
1392
  parseAbiParameters,
@@ -1368,11 +1401,132 @@ var CAVEAT_ABI_TYPE_COMPONENTS = [
1368
1401
  var CAVEAT_TYPEHASH = keccak256(
1369
1402
  toHex2("Caveat(address enforcer,bytes terms)")
1370
1403
  );
1371
- var createCaveat = (enforcer, terms, args = "0x00") => ({
1372
- enforcer,
1373
- terms,
1374
- args
1375
- });
1404
+ var createCaveat = (enforcer, terms, args = "0x00") => {
1405
+ return {
1406
+ enforcer,
1407
+ terms,
1408
+ args
1409
+ };
1410
+ };
1411
+ var decodeCaveat = ({
1412
+ caveat: { enforcer, terms },
1413
+ environment: { caveatEnforcers }
1414
+ }) => {
1415
+ switch (enforcer.toLowerCase()) {
1416
+ case caveatEnforcers.AllowedCalldataEnforcer?.toLowerCase():
1417
+ return { type: "allowedCalldata", ...decodeAllowedCalldataTerms(terms) };
1418
+ case caveatEnforcers.AllowedMethodsEnforcer?.toLowerCase():
1419
+ return { type: "allowedMethods", ...decodeAllowedMethodsTerms(terms) };
1420
+ case caveatEnforcers.AllowedTargetsEnforcer?.toLowerCase():
1421
+ return { type: "allowedTargets", ...decodeAllowedTargetsTerms(terms) };
1422
+ case caveatEnforcers.ArgsEqualityCheckEnforcer?.toLowerCase():
1423
+ return {
1424
+ type: "argsEqualityCheck",
1425
+ ...decodeArgsEqualityCheckTerms(terms)
1426
+ };
1427
+ case caveatEnforcers.BlockNumberEnforcer?.toLowerCase():
1428
+ return { type: "blockNumber", ...decodeBlockNumberTerms(terms) };
1429
+ case caveatEnforcers.DeployedEnforcer?.toLowerCase():
1430
+ return { type: "deployed", ...decodeDeployedTerms(terms) };
1431
+ case caveatEnforcers.ERC20BalanceChangeEnforcer?.toLowerCase():
1432
+ return {
1433
+ type: "erc20BalanceChange",
1434
+ ...decodeERC20BalanceChangeTerms(terms)
1435
+ };
1436
+ case caveatEnforcers.ERC20TransferAmountEnforcer?.toLowerCase():
1437
+ return {
1438
+ type: "erc20TransferAmount",
1439
+ ...decodeERC20TransferAmountTerms(terms)
1440
+ };
1441
+ case caveatEnforcers.ERC20StreamingEnforcer?.toLowerCase():
1442
+ return { type: "erc20Streaming", ...decodeERC20StreamingTerms(terms) };
1443
+ case caveatEnforcers.ERC721BalanceChangeEnforcer?.toLowerCase():
1444
+ return {
1445
+ type: "erc721BalanceChange",
1446
+ ...decodeERC721BalanceChangeTerms(terms)
1447
+ };
1448
+ case caveatEnforcers.ERC721TransferEnforcer?.toLowerCase():
1449
+ return { type: "erc721Transfer", ...decodeERC721TransferTerms(terms) };
1450
+ case caveatEnforcers.ERC1155BalanceChangeEnforcer?.toLowerCase():
1451
+ return {
1452
+ type: "erc1155BalanceChange",
1453
+ ...decodeERC1155BalanceChangeTerms(terms)
1454
+ };
1455
+ case caveatEnforcers.IdEnforcer?.toLowerCase():
1456
+ return { type: "id", ...decodeIdTerms(terms) };
1457
+ case caveatEnforcers.LimitedCallsEnforcer?.toLowerCase():
1458
+ return { type: "limitedCalls", ...decodeLimitedCallsTerms(terms) };
1459
+ case caveatEnforcers.NonceEnforcer?.toLowerCase():
1460
+ return { type: "nonce", ...decodeNonceTerms(terms) };
1461
+ case caveatEnforcers.TimestampEnforcer?.toLowerCase():
1462
+ return { type: "timestamp", ...decodeTimestampTerms(terms) };
1463
+ case caveatEnforcers.ValueLteEnforcer?.toLowerCase():
1464
+ return { type: "valueLte", ...decodeValueLteTerms(terms) };
1465
+ case caveatEnforcers.NativeTokenTransferAmountEnforcer?.toLowerCase():
1466
+ return {
1467
+ type: "nativeTokenTransferAmount",
1468
+ ...decodeNativeTokenTransferAmountTerms(terms)
1469
+ };
1470
+ case caveatEnforcers.NativeBalanceChangeEnforcer?.toLowerCase():
1471
+ return {
1472
+ type: "nativeBalanceChange",
1473
+ ...decodeNativeBalanceChangeTerms(terms)
1474
+ };
1475
+ case caveatEnforcers.NativeTokenStreamingEnforcer?.toLowerCase():
1476
+ return {
1477
+ type: "nativeTokenStreaming",
1478
+ ...decodeNativeTokenStreamingTerms(terms)
1479
+ };
1480
+ case caveatEnforcers.NativeTokenPaymentEnforcer?.toLowerCase():
1481
+ return {
1482
+ type: "nativeTokenPayment",
1483
+ ...decodeNativeTokenPaymentTerms(terms)
1484
+ };
1485
+ case caveatEnforcers.RedeemerEnforcer?.toLowerCase():
1486
+ return { type: "redeemer", ...decodeRedeemerTerms(terms) };
1487
+ case caveatEnforcers.SpecificActionERC20TransferBatchEnforcer?.toLowerCase():
1488
+ return {
1489
+ type: "specificActionERC20TransferBatch",
1490
+ ...decodeSpecificActionERC20TransferBatchTerms(terms)
1491
+ };
1492
+ case caveatEnforcers.ERC20PeriodTransferEnforcer?.toLowerCase():
1493
+ return {
1494
+ type: "erc20PeriodTransfer",
1495
+ ...decodeERC20TokenPeriodTransferTerms(terms)
1496
+ };
1497
+ case caveatEnforcers.NativeTokenPeriodTransferEnforcer?.toLowerCase():
1498
+ return {
1499
+ type: "nativeTokenPeriodTransfer",
1500
+ ...decodeNativeTokenPeriodTransferTerms(terms)
1501
+ };
1502
+ case caveatEnforcers.ExactCalldataBatchEnforcer?.toLowerCase():
1503
+ return {
1504
+ type: "exactCalldataBatch",
1505
+ ...decodeExactCalldataBatchTerms(terms)
1506
+ };
1507
+ case caveatEnforcers.ExactCalldataEnforcer?.toLowerCase():
1508
+ return { type: "exactCalldata", ...decodeExactCalldataTerms(terms) };
1509
+ case caveatEnforcers.ExactExecutionEnforcer?.toLowerCase():
1510
+ return { type: "exactExecution", ...decodeExactExecutionTerms(terms) };
1511
+ case caveatEnforcers.ExactExecutionBatchEnforcer?.toLowerCase():
1512
+ return {
1513
+ type: "exactExecutionBatch",
1514
+ ...decodeExactExecutionBatchTerms(terms)
1515
+ };
1516
+ case caveatEnforcers.MultiTokenPeriodEnforcer?.toLowerCase():
1517
+ return {
1518
+ type: "multiTokenPeriod",
1519
+ ...decodeMultiTokenPeriodTerms(terms)
1520
+ };
1521
+ case caveatEnforcers.OwnershipTransferEnforcer?.toLowerCase():
1522
+ return {
1523
+ type: "ownershipTransfer",
1524
+ ...decodeOwnershipTransferTerms(terms)
1525
+ };
1526
+ default:
1527
+ throw new Error(`Unknown enforcer address: ${enforcer}`);
1528
+ }
1529
+ };
1376
1530
 
1377
1531
  // src/delegation.ts
1378
1532
  import {
@@ -1388,6 +1542,317 @@ import {
1388
1542
  } from "@metamask/delegation-core";
1389
1543
  import { toHex as toHex3, getAddress, isHex as isHex5 } from "viem";
1390
1544
  import { signTypedData } from "viem/accounts";
1545
+
1546
+ // src/analytics/index.ts
1547
+ import createClient from "openapi-fetch";
1548
+
1549
+ // src/analytics/environment.ts
1550
+ var session;
1551
+ function createAnonId() {
1552
+ if (typeof globalThis.crypto?.randomUUID === "function") {
1553
+ return globalThis.crypto.randomUUID();
1554
+ }
1555
+ return `00000000-0000-4000-8000-${Math.random().toString(16).slice(2, 14).padEnd(12, "0")}`;
1556
+ }
1557
+ function inferPlatform() {
1558
+ if (typeof globalThis === "undefined" || !("window" in globalThis)) {
1559
+ return "nodejs";
1560
+ }
1561
+ const nav = globalThis.navigator;
1562
+ const ua = typeof nav?.userAgent === "string" ? nav.userAgent : "";
1563
+ if (/Mobile|Android|iPhone|iPod|webOS|BlackBerry|IEMobile|Opera Mini/iu.test(ua)) {
1564
+ return "web-mobile";
1565
+ }
1566
+ return "web-desktop";
1567
+ }
1568
+ function inferDomain() {
1569
+ if (typeof globalThis !== "undefined" && "window" in globalThis) {
1570
+ const win = globalThis;
1571
+ const hostname = win.location?.hostname;
1572
+ if (typeof hostname === "string" && hostname.length > 0) {
1573
+ return { domain: hostname };
1574
+ }
1575
+ }
1576
+ return {};
1577
+ }
1578
+ function getInitializationContext(params) {
1579
+ if (!session) {
1580
+ session = {
1581
+ sdk_version: params.sdk_version,
1582
+ anon_id: params.anon_id ?? createAnonId(),
1583
+ platform: inferPlatform(),
1584
+ ...inferDomain()
1585
+ };
1586
+ return { ...session };
1587
+ }
1588
+ session = {
1589
+ ...session,
1590
+ sdk_version: params.sdk_version
1591
+ };
1592
+ return { ...session };
1593
+ }
1594
+ function getSessionBaseProperties() {
1595
+ if (!session) {
1596
+ throw new Error(
1597
+ "Smart Accounts Kit analytics: call getInitializationContext({ sdk_version }) at SDK startup before recording events."
1598
+ );
1599
+ }
1600
+ return { ...session };
1601
+ }
1602
+ function mergeSessionProperties(partial) {
1603
+ if (!session) {
1604
+ throw new Error(
1605
+ "Smart Accounts Kit analytics: call getInitializationContext before mergeSessionProperties."
1606
+ );
1607
+ }
1608
+ session = { ...session, ...partial };
1609
+ }
1610
+
1611
+ // src/analytics/sender.ts
1612
+ var Sender = class {
1613
+ #sendFn;
1614
+ #batchSize;
1615
+ #baseTimeoutMs;
1616
+ #maxFailureCount;
1617
+ #maxTimeoutMs;
1618
+ #isDisabled = false;
1619
+ #batch = [];
1620
+ #failureCount = 0;
1621
+ #timeoutId = null;
1622
+ #isSending = false;
1623
+ constructor(options) {
1624
+ this.#batchSize = options.batchSize;
1625
+ this.#baseTimeoutMs = options.baseTimeoutMs;
1626
+ this.#maxFailureCount = options.maxFailureCount;
1627
+ this.#sendFn = options.sendFn;
1628
+ this.#maxTimeoutMs = options.maxTimeoutMs;
1629
+ }
1630
+ enqueue(item) {
1631
+ if (this.#isDisabled) {
1632
+ return;
1633
+ }
1634
+ this.#batch.push(item);
1635
+ this.#schedule();
1636
+ }
1637
+ #schedule() {
1638
+ if (this.#isDisabled) {
1639
+ return;
1640
+ }
1641
+ if (this.#batch.length > 0 && !this.#timeoutId) {
1642
+ const { isRetry, timeoutMs } = this.#getTimeout();
1643
+ const timeout = setTimeout(() => {
1644
+ this.#timeoutId = null;
1645
+ this.#flush();
1646
+ }, timeoutMs);
1647
+ if (isRetry && timeout.unref) {
1648
+ timeout.unref();
1649
+ }
1650
+ this.#timeoutId = timeout;
1651
+ }
1652
+ }
1653
+ async #flush() {
1654
+ if (this.#isDisabled || this.#isSending || this.#batch.length === 0) {
1655
+ return;
1656
+ }
1657
+ this.#isSending = true;
1658
+ const current = this.#batch.slice(0, this.#batchSize);
1659
+ this.#batch = this.#batch.slice(this.#batchSize);
1660
+ try {
1661
+ await this.#sendFn(current);
1662
+ this.#failureCount = 0;
1663
+ } catch {
1664
+ this.#failureCount += 1;
1665
+ if (this.#failureCount >= this.#maxFailureCount) {
1666
+ this.#isDisabled = true;
1667
+ this.#batch = [];
1668
+ if (this.#timeoutId !== null) {
1669
+ clearTimeout(this.#timeoutId);
1670
+ this.#timeoutId = null;
1671
+ }
1672
+ } else {
1673
+ this.#batch = [...current, ...this.#batch];
1674
+ }
1675
+ } finally {
1676
+ this.#isSending = false;
1677
+ this.#schedule();
1678
+ }
1679
+ }
1680
+ #getTimeout() {
1681
+ const isRetry = this.#failureCount > 0;
1682
+ const timeoutMs = Math.min(
1683
+ this.#baseTimeoutMs * 2 ** this.#failureCount,
1684
+ this.#maxTimeoutMs
1685
+ );
1686
+ return { isRetry, timeoutMs };
1687
+ }
1688
+ };
1689
+
1690
+ // package.json
1691
+ var version = "1.2.0";
1692
+
1693
+ // src/analytics/index.ts
1694
+ function isCompleteBase(value) {
1695
+ return typeof value.sdk_version === "string" && value.sdk_version.length > 0 && typeof value.anon_id === "string" && value.anon_id.length > 0 && typeof value.platform === "string" && value.platform.length > 0;
1696
+ }
1697
+ function normalise(batch) {
1698
+ const walk = (value) => {
1699
+ if (typeof value === "bigint") {
1700
+ return `${value}n`;
1701
+ }
1702
+ if (value === null || typeof value !== "object") {
1703
+ return value;
1704
+ }
1705
+ if (Array.isArray(value)) {
1706
+ return value.map((item) => walk(item));
1707
+ }
1708
+ const result = {};
1709
+ for (const [key, child] of Object.entries(
1710
+ value
1711
+ )) {
1712
+ result[key] = walk(child);
1713
+ }
1714
+ return result;
1715
+ };
1716
+ return walk(batch);
1717
+ }
1718
+ var METAMASK_ANALYTICS_ENDPOINT = "https://mm-sdk-analytics.api.cx.metamask.io/";
1719
+ var Analytics = class {
1720
+ enabled = false;
1721
+ sender;
1722
+ constructor(baseUrl) {
1723
+ const client = createClient({ baseUrl });
1724
+ const sendFn = async (batch) => {
1725
+ const normalisedBatch = normalise(batch);
1726
+ const res = await client.POST("/v2/events", { body: normalisedBatch });
1727
+ if (res.response.status !== 200) {
1728
+ throw new Error(String(res.error));
1729
+ }
1730
+ };
1731
+ this.sender = new Sender({
1732
+ batchSize: 100,
1733
+ baseTimeoutMs: 100,
1734
+ maxFailureCount: 6,
1735
+ maxTimeoutMs: 1e4,
1736
+ sendFn
1737
+ });
1738
+ }
1739
+ enable() {
1740
+ this.enabled = true;
1741
+ }
1742
+ /**
1743
+ * Merges a field into the session base (shared with {@link getSessionBaseProperties}).
1744
+ *
1745
+ * @param key - Base property name.
1746
+ * @param value - Value for that property.
1747
+ */
1748
+ setGlobalProperty(key, value) {
1749
+ mergeSessionProperties({
1750
+ [key]: value
1751
+ });
1752
+ }
1753
+ /**
1754
+ * Sends `smart_accounts_kit_initialized` using the session base from {@link getInitializationContext}
1755
+ * plus optional per-event overrides. Updates the stored session with the merged snapshot.
1756
+ *
1757
+ * @param properties - Optional overrides; omit to use the current session base only.
1758
+ */
1759
+ trackInitialized(properties = {}) {
1760
+ if (!this.enabled) {
1761
+ return;
1762
+ }
1763
+ const merged = {
1764
+ ...getSessionBaseProperties(),
1765
+ ...properties
1766
+ };
1767
+ if (!isCompleteBase(merged)) {
1768
+ throw new Error(
1769
+ "Analytics: trackInitialized produced incomplete base configuration (ensure getInitializationContext ran and sdk_version, anon_id, platform are set)"
1770
+ );
1771
+ }
1772
+ mergeSessionProperties(merged);
1773
+ const event = {
1774
+ namespace: "metamask/smart-accounts-kit",
1775
+ event_name: "smart_accounts_kit_initialized",
1776
+ properties: merged
1777
+ };
1778
+ this.sender.enqueue(event);
1779
+ }
1780
+ /**
1781
+ * Sends `smart_accounts_kit_function_called` with session base plus the function name and optional
1782
+ * non-sensitive parameters. Does not mutate the session store (unlike {@link trackInitialized}).
1783
+ *
1784
+ * @param functionName - Public SDK entry name (use a stable string, e.g. `createDelegation`).
1785
+ * @param parameters - Safe primitives only; omit secrets, keys, and raw addresses if sensitive.
1786
+ * @param baseOverrides - Optional overrides for base fields (same as {@link trackInitialized}).
1787
+ */
1788
+ trackSdkFunctionCall(functionName, parameters, baseOverrides = {}) {
1789
+ if (!this.enabled) {
1790
+ return;
1791
+ }
1792
+ const mergedBase = {
1793
+ ...getSessionBaseProperties(),
1794
+ ...baseOverrides
1795
+ };
1796
+ if (!isCompleteBase(mergedBase)) {
1797
+ throw new Error(
1798
+ "Analytics: trackSdkFunctionCall requires session (call getInitializationContext before tracking)"
1799
+ );
1800
+ }
1801
+ const props = {
1802
+ ...mergedBase,
1803
+ function_name: functionName,
1804
+ ...parameters !== void 0 && Object.keys(parameters).length > 0 ? { parameters } : {}
1805
+ };
1806
+ const event = {
1807
+ namespace: "metamask/smart-accounts-kit",
1808
+ event_name: "smart_accounts_kit_function_called",
1809
+ properties: props
1810
+ };
1811
+ this.sender.enqueue(event);
1812
+ }
1813
+ };
1814
+ var analytics = new Analytics(METAMASK_ANALYTICS_ENDPOINT);
1815
+ function isAnalyticsDisabled() {
1816
+ const dntValues = [];
1817
+ if (typeof process !== "undefined") {
1818
+ dntValues.push(process.env?.CI);
1819
+ dntValues.push(process.env?.DO_NOT_TRACK);
1820
+ }
1821
+ if (typeof navigator !== "undefined") {
1822
+ dntValues.push(navigator.doNotTrack);
1823
+ }
1824
+ if (typeof window !== "undefined") {
1825
+ dntValues.push(window.doNotTrack);
1826
+ }
1827
+ return dntValues.some(
1828
+ (dntValue) => dntValue === "1" || dntValue?.toLowerCase() === "yes" || dntValue?.toLowerCase() === "true"
1829
+ );
1830
+ }
1831
+ var hasBootstrapped = false;
1832
+ function ensureSmartAccountsKitAnalyticsBootstrapped() {
1833
+ if (hasBootstrapped) {
1834
+ return;
1835
+ }
1836
+ hasBootstrapped = true;
1837
+ if (isAnalyticsDisabled()) {
1838
+ return;
1839
+ }
1840
+ try {
1841
+ getInitializationContext({ sdk_version: version });
1842
+ analytics.enable();
1843
+ analytics.trackInitialized();
1844
+ } catch {
1845
+ }
1846
+ }
1847
+ function trackSmartAccountsKitFunctionCall(functionName, parameters) {
1848
+ ensureSmartAccountsKitAnalyticsBootstrapped();
1849
+ try {
1850
+ analytics.trackSdkFunctionCall(functionName, parameters);
1851
+ } catch {
1852
+ }
1853
+ }
1854
+
1855
+ // src/delegation.ts
1391
1856
  var DELEGATION_ABI_TYPE_COMPONENTS = [
1392
1857
  { type: "address", name: "delegate" },
1393
1858
  { type: "address", name: "delegator" },
@@ -1482,22 +1947,58 @@ var resolveAuthority = (parentDelegation) => {
1482
1947
  }
1483
1948
  return hashDelegation(parentDelegation);
1484
1949
  };
1950
+ var getCaveatNames = ({
1951
+ caveats,
1952
+ environment: { caveatEnforcers }
1953
+ }) => {
1954
+ if (Array.isArray(caveats)) {
1955
+ const knownEnforcers = Object.entries(caveatEnforcers).map(
1956
+ ([name, address]) => ({ name, address: address.toLowerCase() })
1957
+ );
1958
+ return caveats.map((caveat) => {
1959
+ const enforcerAddressLowercase = caveat.enforcer?.toLowerCase();
1960
+ const matchingCaveat = knownEnforcers.find(
1961
+ ({ address }) => address === enforcerAddressLowercase
1962
+ );
1963
+ return matchingCaveat?.name ?? "Unknown";
1964
+ });
1965
+ }
1966
+ return [];
1967
+ };
1485
1968
  var createDelegation = (options) => {
1969
+ const caveats = resolveCaveats(options);
1970
+ trackSmartAccountsKitFunctionCall("createDelegation", {
1971
+ hasParentDelegation: options.parentDelegation !== void 0,
1972
+ scope: options.scope.type,
1973
+ caveatNames: getCaveatNames({
1974
+ caveats,
1975
+ environment: options.environment
1976
+ })
1977
+ });
1486
1978
  return {
1487
1979
  delegate: options.to,
1488
1980
  delegator: options.from,
1489
1981
  authority: resolveAuthority(options.parentDelegation),
1490
- caveats: resolveCaveats(options),
1982
+ caveats,
1491
1983
  salt: options.salt ?? "0x00",
1492
1984
  signature: "0x"
1493
1985
  };
1494
1986
  };
1495
1987
  var createOpenDelegation = (options) => {
1988
+ const caveats = resolveCaveats(options);
1989
+ trackSmartAccountsKitFunctionCall("createOpenDelegation", {
1990
+ hasParentDelegation: options.parentDelegation !== void 0,
1991
+ scope: options.scope.type,
1992
+ caveatNames: getCaveatNames({
1993
+ caveats,
1994
+ environment: options.environment
1995
+ })
1996
+ });
1496
1997
  return {
1497
1998
  delegate: ANY_BENEFICIARY,
1498
1999
  delegator: options.from,
1499
2000
  authority: resolveAuthority(options.parentDelegation),
1500
- caveats: resolveCaveats(options),
2001
+ caveats,
1501
2002
  salt: options.salt ?? "0x00",
1502
2003
  signature: "0x"
1503
2004
  };
@@ -1507,7 +2008,7 @@ var prepareSignDelegationTypedData = ({
1507
2008
  delegationManager,
1508
2009
  chainId,
1509
2010
  name = "DelegationManager",
1510
- version = "1",
2011
+ version: version2 = "1",
1511
2012
  allowInsecureUnrestrictedDelegation = false
1512
2013
  }) => {
1513
2014
  const delegationStruct = toDelegationStruct({
@@ -1523,7 +2024,7 @@ var prepareSignDelegationTypedData = ({
1523
2024
  domain: {
1524
2025
  chainId,
1525
2026
  name,
1526
- version,
2027
+ version: version2,
1527
2028
  verifyingContract: delegationManager
1528
2029
  },
1529
2030
  types: SIGNABLE_DELEGATION_TYPED_DATA,
@@ -1537,7 +2038,7 @@ var signDelegation = async ({
1537
2038
  delegationManager,
1538
2039
  chainId,
1539
2040
  name = "DelegationManager",
1540
- version = "1",
2041
+ version: version2 = "1",
1541
2042
  allowInsecureUnrestrictedDelegation = false
1542
2043
  }) => {
1543
2044
  const typedData = prepareSignDelegationTypedData({
@@ -1545,7 +2046,7 @@ var signDelegation = async ({
1545
2046
  delegationManager,
1546
2047
  chainId,
1547
2048
  name,
1548
- version,
2049
+ version: version2,
1549
2050
  allowInsecureUnrestrictedDelegation
1550
2051
  });
1551
2052
  return signTypedData({
@@ -1556,6 +2057,7 @@ var signDelegation = async ({
1556
2057
 
1557
2058
  export {
1558
2059
  __export,
2060
+ trackSmartAccountsKitFunctionCall,
1559
2061
  Implementation,
1560
2062
  TransferWindow,
1561
2063
  ScopeType,
@@ -1566,6 +2068,7 @@ export {
1566
2068
  isDefined,
1567
2069
  toHexOrThrow,
1568
2070
  createCaveat,
2071
+ decodeCaveat,
1569
2072
  ANY_BENEFICIARY,
1570
2073
  DELEGATION_TYPEHASH,
1571
2074
  ROOT_AUTHORITY,
@@ -1585,4 +2088,4 @@ export {
1585
2088
  prepareSignDelegationTypedData,
1586
2089
  signDelegation
1587
2090
  };
1588
- //# sourceMappingURL=chunk-C5ZEEH2Z.mjs.map
2091
+ //# sourceMappingURL=chunk-ZA2XYCVX.mjs.map