From 6ced26d445b3b9689bf9d6fb1803467d66a64bea Mon Sep 17 00:00:00 2001 From: c4605 Date: Tue, 18 Mar 2025 00:18:24 +0100 Subject: [PATCH] docs: add cross-chain swap example --- CHANGELOG.md | 1 + examples/cross-chain-swap/.gitignore | 24 + examples/cross-chain-swap/README.md | 29 + examples/cross-chain-swap/index.html | 13 + examples/cross-chain-swap/package.json | 37 + examples/cross-chain-swap/pnpm-lock.yaml | 2141 +++++++++++++++++ examples/cross-chain-swap/public/.gitkeep | 0 examples/cross-chain-swap/src/App.css | 397 +++ examples/cross-chain-swap/src/App.tsx | 29 + .../src/components/SwapRouteSelector.tsx | 319 +++ .../src/hooks/useDebouncedValue.ts | 16 + examples/cross-chain-swap/src/index.css | 62 + examples/cross-chain-swap/src/main.tsx | 10 + .../src/utils/formatXLinkSDKChainName.tsx | 72 + .../src/utils/getAvailableRoutes.ts | 68 + .../src/utils/getSwapRoutesViaALEX.ts | 107 + .../src/utils/getSwapRoutesViaEVMDEX.ts | 72 + examples/cross-chain-swap/src/vite-env.d.ts | 1 + examples/cross-chain-swap/tsconfig.json | 21 + examples/cross-chain-swap/tsconfig.node.json | 9 + examples/cross-chain-swap/vite.config.ts | 32 + 21 files changed, 3460 insertions(+) create mode 100644 examples/cross-chain-swap/.gitignore create mode 100644 examples/cross-chain-swap/README.md create mode 100644 examples/cross-chain-swap/index.html create mode 100644 examples/cross-chain-swap/package.json create mode 100644 examples/cross-chain-swap/pnpm-lock.yaml create mode 100644 examples/cross-chain-swap/public/.gitkeep create mode 100644 examples/cross-chain-swap/src/App.css create mode 100644 examples/cross-chain-swap/src/App.tsx create mode 100644 examples/cross-chain-swap/src/components/SwapRouteSelector.tsx create mode 100644 examples/cross-chain-swap/src/hooks/useDebouncedValue.ts create mode 100644 examples/cross-chain-swap/src/index.css create mode 100644 examples/cross-chain-swap/src/main.tsx create mode 100644 examples/cross-chain-swap/src/utils/formatXLinkSDKChainName.tsx create mode 100644 examples/cross-chain-swap/src/utils/getAvailableRoutes.ts create mode 100644 examples/cross-chain-swap/src/utils/getSwapRoutesViaALEX.ts create mode 100644 examples/cross-chain-swap/src/utils/getSwapRoutesViaEVMDEX.ts create mode 100644 examples/cross-chain-swap/src/vite-env.d.ts create mode 100644 examples/cross-chain-swap/tsconfig.json create mode 100644 examples/cross-chain-swap/tsconfig.node.json create mode 100644 examples/cross-chain-swap/vite.config.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b3d7cd..72d84f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ ### Other Changes +- Added cross-chain swap example code for developer reference - Multiple Stacks contract upgrades - Support for new fee charge model - Upgraded viem dependency diff --git a/examples/cross-chain-swap/.gitignore b/examples/cross-chain-swap/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/examples/cross-chain-swap/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/cross-chain-swap/README.md b/examples/cross-chain-swap/README.md new file mode 100644 index 0000000..2a6b4d5 --- /dev/null +++ b/examples/cross-chain-swap/README.md @@ -0,0 +1,29 @@ +# XLink SDK Cross-Chain Swap Demo + +This demo project showcases how to implement cross-chain asset exchange functionality using XLink SDK and ALEX SDK. + +## Project Overview + +This demo application demonstrates how to integrate XLink SDK and ALEX SDK to create a complete cross-chain swap experience. Users can seamlessly transfer and exchange digital assets between different blockchains. + +## Usage + +### Prerequisites + +Ensure you have the following tools installed: +- Node.js +- pnpm (recommended) or npm + +### Install Dependencies + +```bash +pnpm install +``` + +### Run Development Server + +```bash +pnpm dev +``` + +The application will run at http://localhost:5173 diff --git a/examples/cross-chain-swap/index.html b/examples/cross-chain-swap/index.html new file mode 100644 index 0000000..ef4d406 --- /dev/null +++ b/examples/cross-chain-swap/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/examples/cross-chain-swap/package.json b/examples/cross-chain-swap/package.json new file mode 100644 index 0000000..b3ea8a9 --- /dev/null +++ b/examples/cross-chain-swap/package.json @@ -0,0 +1,37 @@ +{ + "name": "xlink-sdk-cross-chain-swap-example", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "simulation": "tsx simulation/index.ts" + }, + "dependencies": { + "@stacks/common": "^7.0.2", + "@stacks/connect": "^8.1.7", + "@stacks/network": "^7.0.2", + "@stacks/stacks-blockchain-api-types": "^7.14.1", + "@stacks/transactions": "^7.0.5", + "@xlink-network/xlink-sdk": "file:../..", + "alex-sdk": "github:alexgo-io/alex-sdk#feat/detailed-swap-route-info", + "c32check": "^2.0.0", + "lodash-es": "^4.17.21", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-query": "^3.39.3" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.12", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "prettier": "^3.5.3", + "stxer": "^0.4.1", + "tsx": "^4.19.3", + "typescript": "^5.8.2", + "vite": "^6.2.2" + } +} diff --git a/examples/cross-chain-swap/pnpm-lock.yaml b/examples/cross-chain-swap/pnpm-lock.yaml new file mode 100644 index 0000000..fffaeed --- /dev/null +++ b/examples/cross-chain-swap/pnpm-lock.yaml @@ -0,0 +1,2141 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@stacks/common': + specifier: ^7.0.2 + version: 7.0.2 + '@stacks/connect': + specifier: ^8.1.7 + version: 8.1.7 + '@stacks/network': + specifier: ^7.0.2 + version: 7.0.2 + '@stacks/stacks-blockchain-api-types': + specifier: ^7.14.1 + version: 7.14.1 + '@stacks/transactions': + specifier: ^7.0.5 + version: 7.0.5 + '@xlink-network/xlink-sdk': + specifier: file:../.. + version: file:../..(@stacks/common@7.0.2)(typescript@5.8.2) + alex-sdk: + specifier: github:alexgo-io/alex-sdk#feat/detailed-swap-route-info + version: https://codeload.github.com/alexgo-io/alex-sdk/tar.gz/15171aec2fec824ce3593982ba254748588c1303(@stacks/common@7.0.2)(@stacks/network@7.0.2)(@stacks/transactions@7.0.5) + c32check: + specifier: ^2.0.0 + version: 2.0.0 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-query: + specifier: ^3.39.3 + version: 3.39.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + devDependencies: + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/react': + specifier: ^19.0.10 + version: 19.0.10 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.0.4(@types/react@19.0.10) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3)) + prettier: + specifier: ^3.5.3 + version: 3.5.3 + stxer: + specifier: ^0.4.1 + version: 0.4.1(typescript@5.8.2) + tsx: + specifier: ^4.19.3 + version: 4.19.3 + typescript: + specifier: ^5.8.2 + version: 5.8.2 + vite: + specifier: ^6.2.2 + version: 6.2.2(@types/node@22.13.10)(tsx@4.19.3) + +packages: + + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.10': + resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.10': + resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.10': + resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.10': + resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.10': + resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + engines: {node: '>=6.9.0'} + + '@c4/btc-utils@0.3.1': + resolution: {integrity: sha512-mhJ43BhjJP7KspiWZVNnvCy3VTmN8EksBiV+d49jVPBDwrj8dBGuhbv3aM+AVnIfq4Z0Ds6k6q2wkl/lKeNcOA==} + + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.1.5': + resolution: {integrity: sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==} + + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@rollup/rollup-android-arm-eabi@4.36.0': + resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.36.0': + resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.36.0': + resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.36.0': + resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.36.0': + resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.36.0': + resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.36.0': + resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.36.0': + resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.36.0': + resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.36.0': + resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.36.0': + resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.36.0': + resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.36.0': + resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.36.0': + resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} + cpu: [x64] + os: [win32] + + '@scure/base@1.2.4': + resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} + + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + + '@scure/btc-signer@1.7.0': + resolution: {integrity: sha512-GqwwBp05GLTJQ1Ja6am64GhDSFqKJrFbavMt/UZF4pNn/gXbZUcuWjJA4g7qtOudW1MGRYkIO5JsPWi6JmSoQw==} + + '@stacks/common@6.16.0': + resolution: {integrity: sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg==} + + '@stacks/common@7.0.2': + resolution: {integrity: sha512-+RSecHdkxOtswmE4tDDoZlYEuULpnTQVeDIG5eZ32opK8cFxf4EugAcK9CsIsHx/Se1yTEaQ21WGATmJGK84lQ==} + + '@stacks/connect-ui@8.0.0': + resolution: {integrity: sha512-m8yqg28EWQCATkVxILotzbqvcnk0n+qhyncTTNEYXVe4VnfV0eRXvxX88nbA/fot1k+MuQlMu3WhrBFLHJ/xzA==} + + '@stacks/connect@8.1.7': + resolution: {integrity: sha512-vZ+LZcJP7tLoqR9qqYgsP8oAt7EloIJ/zC/5YJhdqIArYDxfC2brRmBu7y2aacDJ1ZnczLXwKfJcC6iLV2G+lA==} + + '@stacks/network@6.17.0': + resolution: {integrity: sha512-numHbfKjwco/rbkGPOEz8+FcJ2nBnS/tdJ8R422Q70h3SiA9eqk9RjSzB8p4JP8yW1SZvW+eihADHfMpBuZyfw==} + + '@stacks/network@7.0.2': + resolution: {integrity: sha512-XzHnoWqku/jRrTgMXhmh3c+I0O9vDH24KlhzGDZtBu+8CGGyHNPAZzGwvoUShonMXrXjEnfO9IYQwV5aJhfv6g==} + + '@stacks/profile@7.0.5': + resolution: {integrity: sha512-XZfIkq2DkEaCT5mKTFhiQ1WF4CGH6LEnUHz9UPGQdlWRsUR9T3ZhTCuKvLinFoZ049JEXcsaUYLhxAihVcmjlA==} + + '@stacks/stacks-blockchain-api-types@7.14.1': + resolution: {integrity: sha512-65hvhXxC+EUqHJAQsqlBCqXB+zwfxZICSKYJugdg6BCp9I9qniyfz5XyQeC4RMVo0tgEoRdS/b5ZCFo5kLWmxA==} + + '@stacks/transactions@6.17.0': + resolution: {integrity: sha512-FUah2BRgV66ApLcEXGNGhwyFTRXqX5Zco3LpiM3essw8PF0NQlHwwdPgtDko5RfrJl3LhGXXe/30nwsfNnB3+g==} + + '@stacks/transactions@7.0.5': + resolution: {integrity: sha512-mHsv7lUbZ5w4MKJ3NAirtdClIXLNKMqWIqT2rLjbIHzlYBqvZaELJSYD+km6E7Cm9G3yUYszorhruQmSTgilbg==} + + '@stencil/core@2.22.3': + resolution: {integrity: sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==} + engines: {node: '>=12.10.0', npm: '>=6.0.0'} + hasBin: true + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/bn.js@5.1.6': + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + + '@types/node@18.19.80': + resolution: {integrity: sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==} + + '@types/node@22.13.10': + resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + '@xlink-network/xlink-sdk@file:../..': + resolution: {directory: ../.., type: directory} + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + alex-sdk@https://codeload.github.com/alexgo-io/alex-sdk/tar.gz/15171aec2fec824ce3593982ba254748588c1303: + resolution: {tarball: https://codeload.github.com/alexgo-io/alex-sdk/tar.gz/15171aec2fec824ce3593982ba254748588c1303} + version: 3.0.4 + engines: {node: '>=10'} + peerDependencies: + '@stacks/network': ^7.0.2 + '@stacks/transactions': ^7.0.2 + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.8.3: + resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + broadcast-channel@3.7.0: + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + c32check@2.0.0: + resolution: {integrity: sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001705: + resolution: {integrity: sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==} + + clarity-abi@0.1.0: + resolution: {integrity: sha512-+hf+M/MXsZY7DeGsVOXwc6p8Fbq3xNm1Gdp2R3ASdUtXMDmdnAZPEg2RSI5kQu7sFhAkBvgLdpXvsv8E05m29g==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + clarity-codegen@1.0.0-beta.1: + resolution: {integrity: sha512-cEyEpOoR3xnTMmGWxycWFH0+Xgmuyhw3ueydg5TFeap1ZXh4/aoxqYIg7JwALlv09wZv/JXe3H+yodMra31pDQ==} + hasBin: true + peerDependencies: + '@stacks/common': ^7.0.2 + '@stacks/transactions': ^7.0.2 + + clarity-codegen@1.1.3: + resolution: {integrity: sha512-/EXXaq5J8e9ldrQjsNPQwr2QOoIMBvLHFab5nahFwdfG18ZiyXSx9SvxHUbzMHBLUzsvgnlmopAlIj+R+2rwmw==} + hasBin: true + peerDependencies: + '@stacks/common': ^7.0.2 + '@stacks/transactions': ^7.0.2 + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.119: + resolution: {integrity: sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsontokens@4.0.1: + resolution: {integrity: sha512-+MO415LEN6M+3FGsRz4wU20g7N2JA+2j9d9+pGaNJHviG4L8N0qzavGyENw6fJqsq9CcrHOIL6iWX5yeTZ86+Q==} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + match-sorter@6.3.4: + resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + micro-packed@0.7.2: + resolution: {integrity: sha512-HJ/u8+tMzgrJVAl6P/4l8KGjJSA3SCZaRb1m4wpbovNScCSmVOGUYbkkcoPPcknCHWPpRAdjy+yqXqyQWf+k8g==} + + microseconds@0.2.0: + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nano-time@1.0.0: + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} + + nanoid@3.3.10: + resolution: {integrity: sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + oblivious-set@1.0.0: + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-query@3.39.3: + resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.36.0: + resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + schema-inspector@2.1.0: + resolution: {integrity: sha512-3bmQVhbA01/EW8cZin4vIpqlpNU2SIy4BhKCfCgogJ3T/L76dLx3QAE+++4o+dNT33sa+SN9vOJL7iHiHFjiNg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + stxer@0.4.1: + resolution: {integrity: sha512-d0+/CXrQY3mZEo7cr8kpD0svlAR6nHpdKNYrXyyzYqH9nJAH+RrilFWQSndfBMqH4w0PsPTsOIwT3PcaTkKmuw==} + engines: {node: '>=12'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-clarity@0.1.0-pre.2: + resolution: {integrity: sha512-VejdNZm4+8e07BPdCvQShkcRd6TCT6l0OkjTxdv93EqIXUAdDXdm4YcowV0KYSD/U3VqSeJbGAzgnFmO0vEnhQ==} + + tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unload@2.2.0: + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + viem@2.23.11: + resolution: {integrity: sha512-yPkHJt4Vn88kLlrv8mrtVN54PW4vNLWRWDScf8SaHK2f44VlMk5IZbMJw4ycUoW9K9GUvCMrYuUa34MAcwYHIg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite@6.2.2: + resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yqueue@1.0.1: + resolution: {integrity: sha512-DBxJZBRafFLA/tCc5uO8ZTGFr+sQgn1FRJkZ4cVrIQIk6bv2bInraE3mbpLAJw9z93JGrLkqDoyTLrrZaCNq5w==} + + zone-file@2.0.0-beta.3: + resolution: {integrity: sha512-6tE3PSRcpN5lbTTLlkLez40WkNPc9vw/u1J2j6DBiy0jcVX48nCkWrx2EC+bWHqC2SLp069Xw4AdnYn/qp/W5g==} + engines: {node: '>=10'} + +snapshots: + + '@adraffy/ens-normalize@1.11.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.10 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.10': + dependencies: + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.10': + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.10 + + '@babel/parser@7.26.10': + dependencies: + '@babel/types': 7.26.10 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime@7.26.10': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + + '@babel/traverse@7.26.10': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/template': 7.26.9 + '@babel/types': 7.26.10 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.10': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@c4/btc-utils@0.3.1': + optionalDependencies: + '@scure/btc-signer': 1.7.0 + + '@esbuild/aix-ppc64@0.25.1': + optional: true + + '@esbuild/android-arm64@0.25.1': + optional: true + + '@esbuild/android-arm@0.25.1': + optional: true + + '@esbuild/android-x64@0.25.1': + optional: true + + '@esbuild/darwin-arm64@0.25.1': + optional: true + + '@esbuild/darwin-x64@0.25.1': + optional: true + + '@esbuild/freebsd-arm64@0.25.1': + optional: true + + '@esbuild/freebsd-x64@0.25.1': + optional: true + + '@esbuild/linux-arm64@0.25.1': + optional: true + + '@esbuild/linux-arm@0.25.1': + optional: true + + '@esbuild/linux-ia32@0.25.1': + optional: true + + '@esbuild/linux-loong64@0.25.1': + optional: true + + '@esbuild/linux-mips64el@0.25.1': + optional: true + + '@esbuild/linux-ppc64@0.25.1': + optional: true + + '@esbuild/linux-riscv64@0.25.1': + optional: true + + '@esbuild/linux-s390x@0.25.1': + optional: true + + '@esbuild/linux-x64@0.25.1': + optional: true + + '@esbuild/netbsd-arm64@0.25.1': + optional: true + + '@esbuild/netbsd-x64@0.25.1': + optional: true + + '@esbuild/openbsd-arm64@0.25.1': + optional: true + + '@esbuild/openbsd-x64@0.25.1': + optional: true + + '@esbuild/sunos-x64@0.25.1': + optional: true + + '@esbuild/win32-arm64@0.25.1': + optional: true + + '@esbuild/win32-ia32@0.25.1': + optional: true + + '@esbuild/win32-x64@0.25.1': + optional: true + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 + + '@noble/hashes@1.1.5': {} + + '@noble/hashes@1.7.1': {} + + '@noble/secp256k1@1.7.1': {} + + '@rollup/rollup-android-arm-eabi@4.36.0': + optional: true + + '@rollup/rollup-android-arm64@4.36.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.36.0': + optional: true + + '@rollup/rollup-darwin-x64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.36.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.36.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.36.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.36.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.36.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.36.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.36.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.36.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.36.0': + optional: true + + '@scure/base@1.2.4': {} + + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 + + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 + + '@scure/btc-signer@1.7.0': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 + micro-packed: 0.7.2 + + '@stacks/common@6.16.0': + dependencies: + '@types/bn.js': 5.1.6 + '@types/node': 18.19.80 + + '@stacks/common@7.0.2': {} + + '@stacks/connect-ui@8.0.0': + dependencies: + '@stencil/core': 2.22.3 + + '@stacks/connect@8.1.7': + dependencies: + '@scure/base': 1.2.4 + '@stacks/common': 7.0.2 + '@stacks/connect-ui': 8.0.0 + '@stacks/network': 7.0.2 + '@stacks/network-v6': '@stacks/network@6.17.0' + '@stacks/profile': 7.0.5 + '@stacks/transactions': 7.0.5 + '@stacks/transactions-v6': '@stacks/transactions@6.17.0' + transitivePeerDependencies: + - encoding + + '@stacks/network@6.17.0': + dependencies: + '@stacks/common': 6.16.0 + cross-fetch: 3.2.0 + transitivePeerDependencies: + - encoding + + '@stacks/network@7.0.2': + dependencies: + '@stacks/common': 7.0.2 + cross-fetch: 3.2.0 + transitivePeerDependencies: + - encoding + + '@stacks/profile@7.0.5': + dependencies: + '@stacks/common': 7.0.2 + '@stacks/network': 7.0.2 + '@stacks/transactions': 7.0.5 + jsontokens: 4.0.1 + schema-inspector: 2.1.0 + zone-file: 2.0.0-beta.3 + transitivePeerDependencies: + - encoding + + '@stacks/stacks-blockchain-api-types@7.14.1': {} + + '@stacks/transactions@6.17.0': + dependencies: + '@noble/hashes': 1.1.5 + '@noble/secp256k1': 1.7.1 + '@stacks/common': 6.16.0 + '@stacks/network': 6.17.0 + c32check: 2.0.0 + lodash.clonedeep: 4.5.0 + transitivePeerDependencies: + - encoding + + '@stacks/transactions@7.0.5': + dependencies: + '@noble/hashes': 1.1.5 + '@noble/secp256k1': 1.7.1 + '@stacks/common': 7.0.2 + '@stacks/network': 7.0.2 + c32check: 2.0.0 + lodash.clonedeep: 4.5.0 + transitivePeerDependencies: + - encoding + + '@stencil/core@2.22.3': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.10 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.10 + + '@types/bn.js@5.1.6': + dependencies: + '@types/node': 18.19.80 + + '@types/estree@1.0.6': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.16 + + '@types/lodash@4.17.16': {} + + '@types/node@18.19.80': + dependencies: + undici-types: 5.26.5 + + '@types/node@22.13.10': + dependencies: + undici-types: 6.20.0 + optional: true + + '@types/react-dom@19.0.4(@types/react@19.0.10)': + dependencies: + '@types/react': 19.0.10 + + '@types/react@19.0.10': + dependencies: + csstype: 3.1.3 + + '@vitejs/plugin-react@4.3.4(vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.2.2(@types/node@22.13.10)(tsx@4.19.3) + transitivePeerDependencies: + - supports-color + + '@xlink-network/xlink-sdk@file:../..(@stacks/common@7.0.2)(typescript@5.8.2)': + dependencies: + '@c4/btc-utils': 0.3.1 + '@scure/btc-signer': 1.7.0 + '@stacks/network': 7.0.2 + '@stacks/transactions': 7.0.5 + big.js: 6.2.2 + c32check: 2.0.0 + clarity-codegen: 1.1.3(@stacks/common@7.0.2)(@stacks/transactions@7.0.5) + viem: 2.23.11(typescript@5.8.2) + transitivePeerDependencies: + - '@stacks/common' + - bufferutil + - debug + - encoding + - typescript + - utf-8-validate + - zod + + abitype@1.0.8(typescript@5.8.2): + optionalDependencies: + typescript: 5.8.2 + + alex-sdk@https://codeload.github.com/alexgo-io/alex-sdk/tar.gz/15171aec2fec824ce3593982ba254748588c1303(@stacks/common@7.0.2)(@stacks/network@7.0.2)(@stacks/transactions@7.0.5): + dependencies: + '@stacks/network': 7.0.2 + '@stacks/transactions': 7.0.5 + clarity-codegen: 1.0.0-beta.1(@stacks/common@7.0.2)(@stacks/transactions@7.0.5) + transitivePeerDependencies: + - '@stacks/common' + - debug + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + async@2.6.4: + dependencies: + lodash: 4.17.21 + + asynckit@0.4.0: {} + + axios@1.8.3: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base-x@4.0.1: {} + + base64-js@1.5.1: {} + + big-integer@1.6.52: {} + + big.js@6.2.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + broadcast-channel@3.7.0: + dependencies: + '@babel/runtime': 7.26.10 + detect-node: 2.1.0 + js-sha3: 0.8.0 + microseconds: 0.2.0 + nano-time: 1.0.0 + oblivious-set: 1.0.0 + rimraf: 3.0.2 + unload: 2.2.0 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001705 + electron-to-chromium: 1.5.119 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + c32check@2.0.0: + dependencies: + '@noble/hashes': 1.7.1 + base-x: 4.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + caniuse-lite@1.0.30001705: {} + + clarity-abi@0.1.0(typescript@5.8.2): + optionalDependencies: + typescript: 5.8.2 + + clarity-codegen@1.0.0-beta.1(@stacks/common@7.0.2)(@stacks/transactions@7.0.5): + dependencies: + '@stacks/common': 7.0.2 + '@stacks/stacks-blockchain-api-types': 7.14.1 + '@stacks/transactions': 7.0.5 + axios: 1.8.3 + lodash: 4.17.21 + yargs: 17.7.2 + yqueue: 1.0.1 + transitivePeerDependencies: + - debug + + clarity-codegen@1.1.3(@stacks/common@7.0.2)(@stacks/transactions@7.0.5): + dependencies: + '@stacks/common': 7.0.2 + '@stacks/stacks-blockchain-api-types': 7.14.1 + '@stacks/transactions': 7.0.5 + axios: 1.8.3 + lodash: 4.17.21 + yargs: 17.7.2 + yqueue: 1.0.1 + transitivePeerDependencies: + - debug + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + csstype@3.1.3: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + delayed-stream@1.0.0: {} + + detect-node@2.1.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.119: {} + + emoji-regex@8.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 + + escalade@3.2.0: {} + + eventemitter3@5.0.1: {} + + follow-redirects@1.15.9: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-fullwidth-code-point@3.0.0: {} + + isows@1.0.6(ws@8.18.1): + dependencies: + ws: 8.18.1 + + js-sha3@0.8.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + jsontokens@4.0.1: + dependencies: + '@noble/hashes': 1.7.1 + '@noble/secp256k1': 1.7.1 + base64-js: 1.5.1 + + lodash-es@4.17.21: {} + + lodash.clonedeep@4.5.0: {} + + lodash@4.17.21: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + match-sorter@6.3.4: + dependencies: + '@babel/runtime': 7.26.10 + remove-accents: 0.5.0 + + math-intrinsics@1.1.0: {} + + micro-packed@0.7.2: + dependencies: + '@scure/base': 1.2.4 + + microseconds@0.2.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + ms@2.1.3: {} + + nano-time@1.0.0: + dependencies: + big-integer: 1.6.52 + + nanoid@3.3.10: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.19: {} + + oblivious-set@1.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + ox@0.6.9(typescript@5.8.2): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - zod + + path-is-absolute@1.0.1: {} + + picocolors@1.1.1: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.10 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.5.3: {} + + proxy-from-env@1.1.0: {} + + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + + react-query@3.39.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@babel/runtime': 7.26.10 + broadcast-channel: 3.7.0 + match-sorter: 6.3.4 + react: 19.0.0 + optionalDependencies: + react-dom: 19.0.0(react@19.0.0) + + react-refresh@0.14.2: {} + + react@19.0.0: {} + + regenerator-runtime@0.14.1: {} + + remove-accents@0.5.0: {} + + require-directory@2.1.1: {} + + resolve-pkg-maps@1.0.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.36.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.36.0 + '@rollup/rollup-android-arm64': 4.36.0 + '@rollup/rollup-darwin-arm64': 4.36.0 + '@rollup/rollup-darwin-x64': 4.36.0 + '@rollup/rollup-freebsd-arm64': 4.36.0 + '@rollup/rollup-freebsd-x64': 4.36.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 + '@rollup/rollup-linux-arm-musleabihf': 4.36.0 + '@rollup/rollup-linux-arm64-gnu': 4.36.0 + '@rollup/rollup-linux-arm64-musl': 4.36.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 + '@rollup/rollup-linux-riscv64-gnu': 4.36.0 + '@rollup/rollup-linux-s390x-gnu': 4.36.0 + '@rollup/rollup-linux-x64-gnu': 4.36.0 + '@rollup/rollup-linux-x64-musl': 4.36.0 + '@rollup/rollup-win32-arm64-msvc': 4.36.0 + '@rollup/rollup-win32-ia32-msvc': 4.36.0 + '@rollup/rollup-win32-x64-msvc': 4.36.0 + fsevents: 2.3.3 + + scheduler@0.25.0: {} + + schema-inspector@2.1.0: + dependencies: + async: 2.6.4 + + semver@6.3.1: {} + + source-map-js@1.2.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + stxer@0.4.1(typescript@5.8.2): + dependencies: + '@stacks/network': 7.0.2 + '@stacks/stacks-blockchain-api-types': 7.14.1 + '@stacks/transactions': 7.0.5 + c32check: 2.0.0 + clarity-abi: 0.1.0(typescript@5.8.2) + ts-clarity: 0.1.0-pre.2(typescript@5.8.2) + transitivePeerDependencies: + - encoding + - typescript + + tr46@0.0.3: {} + + ts-clarity@0.1.0-pre.2(typescript@5.8.2): + dependencies: + '@stacks/stacks-blockchain-api-types': 7.14.1 + '@stacks/transactions': 7.0.5 + clarity-abi: 0.1.0(typescript@5.8.2) + cross-fetch: 4.1.0 + transitivePeerDependencies: + - encoding + - typescript + + tsx@4.19.3: + dependencies: + esbuild: 0.25.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.8.2: {} + + undici-types@5.26.5: {} + + undici-types@6.20.0: + optional: true + + unload@2.2.0: + dependencies: + '@babel/runtime': 7.26.10 + detect-node: 2.1.0 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + viem@2.23.11(typescript@5.8.2): + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.2) + isows: 1.0.6(ws@8.18.1) + ox: 0.6.9(typescript@5.8.2) + ws: 8.18.1 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite@6.2.2(@types/node@22.13.10)(tsx@4.19.3): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.36.0 + optionalDependencies: + '@types/node': 22.13.10 + fsevents: 2.3.3 + tsx: 4.19.3 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@8.18.1: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yqueue@1.0.1: {} + + zone-file@2.0.0-beta.3: {} diff --git a/examples/cross-chain-swap/public/.gitkeep b/examples/cross-chain-swap/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/examples/cross-chain-swap/src/App.css b/examples/cross-chain-swap/src/App.css new file mode 100644 index 0000000..9ef1138 --- /dev/null +++ b/examples/cross-chain-swap/src/App.css @@ -0,0 +1,397 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; +} + +h1 { + font-size: 1.8rem; + margin-bottom: 2rem; + color: #1a1a1a; +} + +h2 { + font-size: 1.3rem; + margin-top: 1.5rem; + margin-bottom: 1rem; + color: #1a1a1a; +} + +h3 { + font-size: 1.1rem; + margin-top: 1rem; + margin-bottom: 0.8rem; + color: #1a1a1a; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + color: white; + cursor: pointer; + transition: border-color 0.25s; + margin: 0.5rem 0; +} + +button:hover { + border-color: #646cff; +} + +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +button:disabled { + background-color: #666; + cursor: not-allowed; +} + +input, select { + border-radius: 8px; + border: 1px solid #d1d5db; + padding: 0.6em 1.2em; + font-size: 1em; + margin: 0.3rem 0; + background-color: #f3f4f6; + color: #1a1a1a; +} + +.loading { + position: fixed; + top: 0; + left: 0; + right: 0; + background-color: rgba(0, 0, 0, 0.7); + color: white; + padding: 10px; + text-align: center; + z-index: 100; +} + +.routes-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 10px; + margin-bottom: 20px; +} + +.route-item { + border: 1px solid #ccc; + border-radius: 8px; + padding: 10px; + background-color: #f5f5f5; + text-align: left; +} + +.selected-route { + border: 2px solid #646cff; + border-radius: 8px; + padding: 10px; + margin: 10px 0; + background-color: #efefff; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + button { + background-color: #f9f9f9; + color: #213547; + } +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +.section { + margin-bottom: 30px; + padding: 20px; + border-radius: 8px; + background-color: #ffffff; + border: 1px solid #e5e5e5; +} + +.input-group { + display: flex; + flex-direction: column; + gap: 10px; + max-width: 400px; +} + +.routes-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 20px; + margin-top: 20px; +} + +.route-card { + padding: 15px; + border: 1px solid #d1d5db; + border-radius: 8px; + background-color: #f3f4f6; + cursor: pointer; + transition: all 0.2s ease; +} + +.route-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + background-color: #ffffff; +} + +.route-card.selected { + border-color: #646cff; + background-color: #f5f6ff; +} + +.route-card p { + margin: 5px 0; + color: #1a1a1a; +} + +.routes-section { + margin-top: 20px; +} + +.routes-section h3 { + color: #1a1a1a; + margin-bottom: 1rem; +} + +.routes-section p { + color: #6b7280; + margin: 0.5rem 0; +} + +.bridge-info { + background-color: #ffffff; + padding: 15px; + border-radius: 8px; + border: 1px solid #d1d5db; +} + +.bridge-info pre { + margin: 0; + white-space: pre-wrap; + word-wrap: break-word; + color: #1a1a1a; +} + +.loading { + text-align: center; + padding: 20px; + font-size: 18px; + color: #666; +} + +.app-container { + min-height: 100vh; + display: flex; + flex-direction: column; + background-color: #f3f4f6; +} + +.app-header { + background-color: #ffffff; + padding: 1.5rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + border-bottom: 1px solid #e5e5e5; +} + +.app-header h1 { + margin: 0; + color: #1a1a1a; +} + +.app-main { + flex: 1; + padding: 2rem 0; +} + +.content-wrapper { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; +} + +.app-footer { + background-color: #ffffff; + padding: 1.5rem; + text-align: center; + border-top: 1px solid #e5e5e5; +} + +.app-footer p { + margin: 0; + color: #6b7280; + font-size: 0.9rem; +} + +.swap-group { + display: flex; + gap: 1rem; + align-items: flex-start; + max-width: 800px; + margin: 0 auto; +} + +.route-select { + flex: 2; +} + +.amount-input { + flex: 1; +} + +.route-dropdown { + width: 100%; + padding: 0.8rem; + border: 1px solid #d1d5db; + border-radius: 8px; + background-color: #f3f4f6; + font-size: 1rem; + color: #1a1a1a; + cursor: pointer; + transition: all 0.2s ease; +} + +.route-dropdown:hover { + border-color: #646cff; + background-color: #ffffff; +} + +.route-dropdown:focus { + outline: none; + border-color: #646cff; + box-shadow: 0 0 0 2px rgba(100, 108, 255, 0.2); + background-color: #ffffff; +} + +.amount-field { + width: 100%; + padding: 0.8rem; + border: 1px solid #d1d5db; + border-radius: 8px; + background-color: #f3f4f6; + font-size: 1rem; + color: #1a1a1a; + transition: all 0.2s ease; +} + +.amount-field:hover { + border-color: #646cff; + background-color: #ffffff; +} + +.amount-field:focus { + outline: none; + border-color: #646cff; + box-shadow: 0 0 0 2px rgba(100, 108, 255, 0.2); + background-color: #ffffff; +} + +.no-routes { + color: #6b7280; + font-size: 0.9rem; + padding: 1rem; + text-align: center; + background-color: #f3f4f6; + border-radius: 8px; + border: 1px solid #d1d5db; +} + +.loading-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.7); + color: white; + padding: 1rem; + text-align: center; + z-index: 100; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.5rem; +} + +.loading-container { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + padding: 2rem; + background-color: #f3f4f6; + border-radius: 8px; + border: 1px solid #d1d5db; +} + +.loading-container p { + color: #6b7280; + margin: 0; +} + +.loading-spinner { + width: 30px; + height: 30px; + border: 3px solid #f3f4f6; + border-top: 3px solid #646cff; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} diff --git a/examples/cross-chain-swap/src/App.tsx b/examples/cross-chain-swap/src/App.tsx new file mode 100644 index 0000000..4b72d8c --- /dev/null +++ b/examples/cross-chain-swap/src/App.tsx @@ -0,0 +1,29 @@ +import { XLinkSDK } from "@xlink-network/xlink-sdk" +import { AlexSDK } from "alex-sdk" +import { FC } from "react" +import "./App.css" +import { SwapRouteSelector } from "./components/SwapRouteSelector" +import { QueryClient, QueryClientProvider } from "react-query" + +const alex = new AlexSDK() +const xlink = new XLinkSDK() +const queryClient = new QueryClient() + +const App: FC = () => { + return ( + +
+
+

XLink Cross-Chain Swap Demo

+
+
+
+ +
+
+
+
+ ) +} + +export default App diff --git a/examples/cross-chain-swap/src/components/SwapRouteSelector.tsx b/examples/cross-chain-swap/src/components/SwapRouteSelector.tsx new file mode 100644 index 0000000..1077e1d --- /dev/null +++ b/examples/cross-chain-swap/src/components/SwapRouteSelector.tsx @@ -0,0 +1,319 @@ +import { + KnownChainId, + KnownRoute, + StacksContractAddress, + SwapRoute_WithExchangeRate, + toSDKNumberOrUndefined, + XLinkSDK, +} from "@xlink-network/xlink-sdk" +import { AlexSDK } from "alex-sdk" +import { FC, Fragment, useEffect, useState } from "react" +import { useQuery } from "react-query" +import { getAvailableRoutes } from "../utils/getAvailableRoutes" +import { getSwapRoutesViaALEX } from "../utils/getSwapRoutesViaALEX" +import { getSwapRoutesViaEVMDEX } from "../utils/getSwapRoutesViaEVMDEX" +import { formatXLinkSDKChainName } from "../utils/formatXLinkSDKChainName" +import { useDebouncedValue } from "../hooks/useDebouncedValue" + +const STORAGE_KEY = "xlink_matcha_api_key" + +export const SwapRouteSelector: FC<{ + alexSDK: AlexSDK + xlinkSDK: XLinkSDK +}> = ({ alexSDK, xlinkSDK }) => { + const [matchaAPIKey, setMatchaAPIKey] = useState(() => { + return localStorage.getItem(STORAGE_KEY) || "" + }) + const [swapAmount, setSwapAmount] = useState("") + const [selectedRoute, setSelectedRoute] = useState(null) + const [selectedSwapRoute, setSelectedSwapRoute] = + useState(null) + + const debouncedSwapAmount = useDebouncedValue(swapAmount, 500) + const debouncedRoute = useDebouncedValue(selectedRoute, 500) + const debouncedAPIKey = useDebouncedValue(matchaAPIKey, 500) + + useEffect(() => { + localStorage.setItem(STORAGE_KEY, matchaAPIKey) + }, [matchaAPIKey]) + + const availableRoutes = useQuery({ + queryKey: ["availableRoutes"], + queryFn: () => getAvailableRoutes(xlinkSDK), + }) + + const alexRoutes = useQuery({ + enabled: !!debouncedRoute && !!debouncedSwapAmount, + queryKey: [ + "alexRoutes", + JSON.stringify(debouncedRoute), + debouncedSwapAmount, + ], + queryFn: () => { + if (debouncedRoute == null) { + throw new Error("No route selected") + } + if (!isNumber(debouncedSwapAmount)) { + throw new Error("No swap amount") + } + + return getSwapRoutesViaALEX( + { + alexSDK: alexSDK, + xlinkSDK: xlinkSDK, + }, + { + ...debouncedRoute, + amount: toSDKNumberOrUndefined(Number(debouncedSwapAmount)), + slippage: toSDKNumberOrUndefined(0.01), + }, + ) + }, + }) + + const evmDexRoutes = useQuery({ + enabled: !!debouncedRoute && !!debouncedSwapAmount && !!debouncedAPIKey, + queryKey: [ + "evmDexRoutes", + JSON.stringify(debouncedRoute), + debouncedSwapAmount, + ], + queryFn: () => { + if (debouncedRoute == null) { + throw new Error("No route selected") + } + if (!debouncedAPIKey) { + throw new Error("No matcha API key") + } + if (!isNumber(debouncedSwapAmount)) { + throw new Error("No swap amount") + } + + return getSwapRoutesViaEVMDEX( + { + xlinkSDK: xlinkSDK, + matchaAPIKey: debouncedAPIKey, + }, + { + ...debouncedRoute, + amount: toSDKNumberOrUndefined(Number(debouncedSwapAmount)), + slippage: toSDKNumberOrUndefined(0.01), + }, + ) + }, + }) + + const bridgeInfo = useQuery({ + enabled: !!selectedRoute && !!selectedSwapRoute, + queryKey: [ + "bridgeInfo", + JSON.stringify(selectedRoute), + JSON.stringify(selectedSwapRoute), + ], + queryFn: () => { + if (selectedRoute == null) { + throw new Error("No route selected") + } + if (selectedSwapRoute == null) { + throw new Error("No swap route selected") + } + + if (KnownChainId.isBitcoinChain(selectedRoute.fromChain)) { + return xlinkSDK.bridgeInfoFromBitcoin({ + ...selectedRoute, + swapRoute: selectedSwapRoute, + amount: toSDKNumberOrUndefined(Number(swapAmount)), + }) + } + + if (KnownChainId.isBRC20Chain(selectedRoute.fromChain)) { + return xlinkSDK.bridgeInfoFromBRC20({ + ...selectedRoute, + swapRoute: selectedSwapRoute, + amount: toSDKNumberOrUndefined(Number(swapAmount)), + }) + } + + if (KnownChainId.isRunesChain(selectedRoute.fromChain)) { + return xlinkSDK.bridgeInfoFromRunes({ + ...selectedRoute, + swapRoute: selectedSwapRoute, + amount: toSDKNumberOrUndefined(Number(swapAmount)), + }) + } + + if (KnownChainId.isEVMChain(selectedRoute.fromChain)) { + throw new Error("EVM chain not support cross-chain swap yet") + } + + if (KnownChainId.isStacksChain(selectedRoute.fromChain)) { + throw new Error("Stacks chain not support cross-chain swap yet") + } + + throw new Error("Unsupported chain: " + selectedRoute.fromChain) + }, + }) + + return ( +
+ {availableRoutes.isLoading && ( +
+
+

Loading routes...

+
+ )} + +
+

Basic Information

+
+ setMatchaAPIKey(e.target.value)} + /> +
+
+ +
+

Swap Settings

+
+
+ +
+
+ setSwapAmount(e.target.value)} + className="amount-field" + disabled={availableRoutes.isLoading} + /> +
+
+
+ + {selectedRoute && ( +
+

Swap Routes

+ +
+

via ALEX

+ {alexRoutes.isLoading ? ( +
+
+

Loading ALEX routes...

+
+ ) : alexRoutes.data?.type === "success" ? ( +
+ {alexRoutes.data.swapRoutes.map((route, index) => ( +
setSelectedSwapRoute(route)} + > +

+ + {route.swapPools.map((p, index) => ( + +  →  + + + ))} +

+

Exchange Rate: {route.composedExchangeRate}

+

Minimum Receive: {route.minimumAmountsToReceive}

+
+ ))} +
+ ) : ( +

No ALEX routes available

+ )} +
+ +
+

via EVM DEX

+ {evmDexRoutes.isLoading ? ( +
+
+

Loading EVM DEX routes...

+
+ ) : evmDexRoutes.data?.type === "success" ? ( +
+ {evmDexRoutes.data.swapRoutes.map((route, index) => ( +
setSelectedSwapRoute(route)} + > +

Route {index + 1}

+

Chain: {route.evmChain}

+

Exchange Rate: {route.composedExchangeRate}

+

Minimum Receive: {route.minimumAmountsToReceive}

+
+ ))} +
+ ) : ( +

No EVM DEX routes available

+ )} +
+
+ )} + +
+

Bridge Information

+ {selectedSwapRoute && ( + <> + {bridgeInfo.isLoading ? ( +
+
+

Loading bridge information...

+
+ ) : ( + bridgeInfo.data && ( +
+
{JSON.stringify(bridgeInfo.data, null, 2)}
+
+ ) + )} + + )} +
+
+ ) +} + +const StacksTokenName: FC<{ + address: StacksContractAddress +}> = ({ address }) => { + return ( + + {address.contractName} + + ) +} + +const isNumber = (value: string): value is `${number}` => { + if (value === "") return false + const num = Number(value) + return !isNaN(num) && isFinite(num) && num > 0 +} diff --git a/examples/cross-chain-swap/src/hooks/useDebouncedValue.ts b/examples/cross-chain-swap/src/hooks/useDebouncedValue.ts new file mode 100644 index 0000000..34aaaef --- /dev/null +++ b/examples/cross-chain-swap/src/hooks/useDebouncedValue.ts @@ -0,0 +1,16 @@ +import { useEffect, useState } from "react" + +export function useDebouncedValue(value: T, delay: number): T { + const [debouncedValue, setDebouncedValue] = useState(value) + + useEffect(() => { + const timeoutId = setTimeout(() => { + setDebouncedValue(value) + }, delay) + return () => { + clearTimeout(timeoutId) + } + }, [value, delay]) + + return debouncedValue +} diff --git a/examples/cross-chain-swap/src/index.css b/examples/cross-chain-swap/src/index.css new file mode 100644 index 0000000..50e0538 --- /dev/null +++ b/examples/cross-chain-swap/src/index.css @@ -0,0 +1,62 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/cross-chain-swap/src/main.tsx b/examples/cross-chain-swap/src/main.tsx new file mode 100644 index 0000000..a6c0b26 --- /dev/null +++ b/examples/cross-chain-swap/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react" +import ReactDOM from "react-dom/client" +import App from "./App" +import "./index.css" + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + , +) diff --git a/examples/cross-chain-swap/src/utils/formatXLinkSDKChainName.tsx b/examples/cross-chain-swap/src/utils/formatXLinkSDKChainName.tsx new file mode 100644 index 0000000..6ba1139 --- /dev/null +++ b/examples/cross-chain-swap/src/utils/formatXLinkSDKChainName.tsx @@ -0,0 +1,72 @@ +import { KnownChainId } from "../../node_modules/@xlink-network/xlink-sdk/lib/utils/types/knownIds" + +export const formatXLinkSDKChainName = ( + chain: KnownChainId.KnownChain, +): string => { + if (KnownChainId.isBitcoinChain(chain)) { + return "Bitcoin" + } + + if (KnownChainId.isBRC20Chain(chain)) { + return "BRC-20" + } + + if (KnownChainId.isRunesChain(chain)) { + return "Runes" + } + + if (KnownChainId.isStacksChain(chain)) { + return "Stacks" + } + + if (KnownChainId.isEVMChain(chain)) { + switch (chain) { + case KnownChainId.EVM.Ethereum: + return "Ethereum" + case KnownChainId.EVM.Sepolia: + return "Sepolia" + case KnownChainId.EVM.BSC: + return "BSC" + case KnownChainId.EVM.BSCTestnet: + return "BSC Testnet" + case KnownChainId.EVM.CoreDAO: + return "CoreDAO" + case KnownChainId.EVM.CoreDAOTestnet: + return "CoreDAO Testnet" + case KnownChainId.EVM.Bsquared: + return "B²" + case KnownChainId.EVM.BOB: + return "BOB" + case KnownChainId.EVM.Bitlayer: + return "Bitlayer" + case KnownChainId.EVM.Lorenzo: + return "Lorenzo" + case KnownChainId.EVM.Merlin: + return "Merlin" + case KnownChainId.EVM.AILayer: + return "AILayer" + case KnownChainId.EVM.Mode: + return "Mode" + case KnownChainId.EVM.XLayer: + return "XLayer" + case KnownChainId.EVM.Arbitrum: + return "Arbitrum" + case KnownChainId.EVM.Aurora: + return "Aurora" + case KnownChainId.EVM.Manta: + return "Manta" + case KnownChainId.EVM.Linea: + return "Linea" + case KnownChainId.EVM.Base: + return "Base" + case KnownChainId.EVM.BlifeTestnet: + return "Blife Testnet" + case KnownChainId.EVM.BeraTestnet: + return "Bera Testnet" + default: + return "Unknown EVM Chain" + } + } + + return chain +} diff --git a/examples/cross-chain-swap/src/utils/getAvailableRoutes.ts b/examples/cross-chain-swap/src/utils/getAvailableRoutes.ts new file mode 100644 index 0000000..3093f8f --- /dev/null +++ b/examples/cross-chain-swap/src/utils/getAvailableRoutes.ts @@ -0,0 +1,68 @@ +import { + KnownChainId, + KnownRoute, + KnownTokenId, + XLinkSDK, +} from "@xlink-network/xlink-sdk" + +export const getAvailableRoutes = async ( + xlinkSDK: XLinkSDK, +): Promise<(KnownRoute & { fromTokenName: string; toTokenName: string })[]> => { + const routes = await _getAvailableRoutes(xlinkSDK) + return routes.map( + (route): KnownRoute & { fromTokenName: string; toTokenName: string } => + ({ + fromChain: route[0][0], + fromToken: route[0][1], + fromTokenName: route[0][2], + toChain: route[1][0], + toToken: route[1][1], + toTokenName: route[1][2], + }) as any, + ) +} + +type ChainTokenPair = readonly [ + chain: KnownChainId.KnownChain, + token: KnownTokenId.KnownToken, + tokenName: string, +] + +type AvailableRoute = readonly [from: ChainTokenPair, to: ChainTokenPair] + +const _getAvailableRoutes = async ( + xlinkSDK: XLinkSDK, +): Promise => { + const alexBrc20 = await xlinkSDK.brc20TickToBRC20Token( + KnownChainId.BRC20.Mainnet, + "alex$", + ) + + const ausdBrc20 = await xlinkSDK.brc20TickToBRC20Token( + KnownChainId.BRC20.Mainnet, + "ausd$", + ) + + const result: [from: ChainTokenPair, to: ChainTokenPair][] = [] + if (alexBrc20 != null) { + result.push([ + [KnownChainId.Bitcoin.Mainnet, KnownTokenId.Bitcoin.BTC, "BTC"], + [KnownChainId.BRC20.Mainnet, alexBrc20, "alex$"], + ]) + result.push([ + [KnownChainId.BRC20.Mainnet, alexBrc20, "alex$"], + [KnownChainId.Bitcoin.Mainnet, KnownTokenId.Bitcoin.BTC, "BTC"], + ]) + } + if (ausdBrc20 != null) { + result.push([ + [KnownChainId.Bitcoin.Mainnet, KnownTokenId.Bitcoin.BTC, "BTC"], + [KnownChainId.BRC20.Mainnet, ausdBrc20, "ausd$"], + ]) + result.push([ + [KnownChainId.BRC20.Mainnet, ausdBrc20, "ausd$"], + [KnownChainId.Bitcoin.Mainnet, KnownTokenId.Bitcoin.BTC, "BTC"], + ]) + } + return result +} diff --git a/examples/cross-chain-swap/src/utils/getSwapRoutesViaALEX.ts b/examples/cross-chain-swap/src/utils/getSwapRoutesViaALEX.ts new file mode 100644 index 0000000..8be3a03 --- /dev/null +++ b/examples/cross-chain-swap/src/utils/getSwapRoutesViaALEX.ts @@ -0,0 +1,107 @@ +import { + KnownChainId, + KnownRoute, + SDKNumber, + SwapRouteViaALEX_WithExchangeRate, + SwapRouteViaALEX_WithMinimumAmountsOut, + toSDKNumberOrUndefined, + XLinkSDK, +} from "@xlink-network/xlink-sdk" +import { getALEXSwapParameters } from "@xlink-network/xlink-sdk/swapHelpers" +import { AlexSDK } from "alex-sdk" +import { sortBy, uniqBy } from "lodash-es" + +export async function getSwapRoutesViaALEX( + context: { + alexSDK: AlexSDK + xlinkSDK: XLinkSDK + }, + swapRequest: KnownRoute & { + amount: SDKNumber + slippage: SDKNumber + }, +): Promise< + | { type: "failed"; reason: "unsupported-route" } + | { + type: "success" + swapRoutes: (SwapRouteViaALEX_WithExchangeRate & + SwapRouteViaALEX_WithMinimumAmountsOut)[] + } +> { + const { alexSDK, xlinkSDK } = context + + const swapParameters = await getALEXSwapParameters(xlinkSDK, swapRequest) + if (swapParameters == null) { + return { type: "failed", reason: "unsupported-route" } + } + + if ( + // ALEX SDK does not support testnet + swapParameters.stacksChain === KnownChainId.Stacks.Testnet + ) { + return { type: "failed", reason: "unsupported-route" } + } + + const [fromTokenAddress, toTokenAddress] = await Promise.all([ + xlinkSDK.stacksAddressFromStacksToken( + swapParameters.stacksChain, + swapParameters.fromToken, + ), + xlinkSDK.stacksAddressFromStacksToken( + swapParameters.stacksChain, + swapParameters.toToken, + ), + ]) + if (fromTokenAddress == null || toTokenAddress == null) { + return { type: "failed", reason: "unsupported-route" } + } + + const [fromCurrency, toCurrency] = await Promise.all([ + alexSDK.fetchTokenInfo( + `${fromTokenAddress.deployerAddress}.${fromTokenAddress.contractName}`, + ), + alexSDK.fetchTokenInfo( + `${toTokenAddress.deployerAddress}.${toTokenAddress.contractName}`, + ), + ]) + if (fromCurrency == null || toCurrency == null) { + return { type: "failed", reason: "unsupported-route" } + } + + const routes = await alexSDK.getAllPossibleRoutesWithDetails( + fromCurrency.id, + toCurrency.id, + toBigInt(Number(swapRequest.amount), fromCurrency.wrapTokenDecimals), + ) + if (routes.length === 0) { + return { type: "failed", reason: "unsupported-route" } + } + + return { + type: "success", + swapRoutes: uniqBy( + sortBy(routes, r => r.toAmount), + r => r.toAmount, + ) + .slice(0, 5) + .map(r => ({ + ...r, + via: "ALEX", + minimumAmountsToReceive: toSDKNumberOrUndefined( + toNumber(r.toAmount, toCurrency.wrapTokenDecimals) * + (1 - Number(swapRequest.slippage)), + ), + composedExchangeRate: toSDKNumberOrUndefined( + toNumber(r.toAmount, toCurrency.wrapTokenDecimals) / + toNumber(r.fromAmount, fromCurrency.wrapTokenDecimals), + ), + })), + } +} + +function toNumber(value: bigint, moveDecimalPlaces: number): number { + return Number(value) / 10 ** moveDecimalPlaces +} +function toBigInt(value: number, moveDecimalPlaces: number): bigint { + return BigInt(Math.floor(value * 10 ** moveDecimalPlaces)) +} diff --git a/examples/cross-chain-swap/src/utils/getSwapRoutesViaEVMDEX.ts b/examples/cross-chain-swap/src/utils/getSwapRoutesViaEVMDEX.ts new file mode 100644 index 0000000..72ba982 --- /dev/null +++ b/examples/cross-chain-swap/src/utils/getSwapRoutesViaEVMDEX.ts @@ -0,0 +1,72 @@ +import { + KnownRoute, + SDKNumber, + SwapRouteViaEVMDexAggregator_WithExchangeRate, + SwapRouteViaEVMDexAggregator_WithMinimumAmountsOut, + toSDKNumberOrUndefined, + XLinkSDK, +} from "@xlink-network/xlink-sdk" +import { + getDexAggregatorRoutes, + getPossibleEVMDexAggregatorSwapParameters, + fetchMatchaPossibleRoutesFactory, +} from "@xlink-network/xlink-sdk/swapHelpers" + +export async function getSwapRoutesViaEVMDEX( + context: { + xlinkSDK: XLinkSDK + matchaAPIKey: string + }, + swapRequest: KnownRoute & { + amount: SDKNumber + slippage: SDKNumber + }, +): Promise< + | { type: "failed"; reason: "unsupported-route" } + | { + type: "success" + swapRoutes: (SwapRouteViaEVMDexAggregator_WithExchangeRate & + SwapRouteViaEVMDexAggregator_WithMinimumAmountsOut)[] + } +> { + const { xlinkSDK } = context + + const possibleSwapParameters = + await getPossibleEVMDexAggregatorSwapParameters(xlinkSDK, swapRequest) + if (possibleSwapParameters.length === 0) { + return { type: "failed", reason: "unsupported-route" } + } + + const routes = await getDexAggregatorRoutes(xlinkSDK, { + routeFetcher: fetchMatchaPossibleRoutesFactory({ + baseUrl: "/api/matcha", + apiKey: context.matchaAPIKey, + }), + routes: possibleSwapParameters.map(p => ({ + evmChain: p.evmChain, + fromToken: p.fromToken, + toToken: p.toToken, + amount: p.fromAmount, + slippage: swapRequest.slippage, + })), + }) + if (routes == null) { + return { type: "failed", reason: "unsupported-route" } + } + + return { + type: "success", + swapRoutes: routes.map(r => ({ + via: "evmDexAggregator", + evmChain: r.evmChain, + fromEVMToken: r.fromToken, + toEVMToken: r.toToken, + composedExchangeRate: toSDKNumberOrUndefined( + Number(r.toAmount) / Number(r.fromAmount), + ), + minimumAmountsToReceive: toSDKNumberOrUndefined( + Number(r.toAmount) * (1 - Number(swapRequest.slippage)), + ), + })), + } +} diff --git a/examples/cross-chain-swap/src/vite-env.d.ts b/examples/cross-chain-swap/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/examples/cross-chain-swap/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/cross-chain-swap/tsconfig.json b/examples/cross-chain-swap/tsconfig.json new file mode 100644 index 0000000..14652d0 --- /dev/null +++ b/examples/cross-chain-swap/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/cross-chain-swap/tsconfig.node.json b/examples/cross-chain-swap/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/examples/cross-chain-swap/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/cross-chain-swap/vite.config.ts b/examples/cross-chain-swap/vite.config.ts new file mode 100644 index 0000000..fd7d31e --- /dev/null +++ b/examples/cross-chain-swap/vite.config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from "vite" +import react from "@vitejs/plugin-react" + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + base: "/xlink-sdk-example/cross-chain-swap/", + server: { + proxy: { + "/api/matcha": { + target: "https://api.0x.org", + changeOrigin: true, + rewrite: path => path.replace(/^\/api\/matcha/, ""), + configure: (proxy, _options) => { + proxy.on("error", (err, _req, _res) => { + console.log("proxy error", err) + }) + proxy.on("proxyReq", (proxyReq, req, _res) => { + console.log("Sending Request to the Target:", req.method, req.url) + }) + proxy.on("proxyRes", (proxyRes, req, _res) => { + console.log( + "Received Response from the Target:", + proxyRes.statusCode, + req.url, + ) + }) + }, + }, + }, + }, +})