From bbe9119b4ced5651e1f810da3506c6768dc214ca Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Fri, 25 Sep 2026 13:27:38 +0300 Subject: [PATCH 01/14] fix(mobile): restore Expo test dependency coverage --- frontend/mobile/components/QuickActions.tsx | 2 +- .../__tests__/QuickActions.test.tsx | 4 + frontend/mobile/jest.config.js | 11 +- frontend/mobile/package-lock.json | 232 +++++++----------- frontend/mobile/package.json | 3 +- frontend/mobile/theme/fontFamily.ts | 8 + frontend/mobile/theme/typography.ts | 15 +- 7 files changed, 105 insertions(+), 170 deletions(-) create mode 100644 frontend/mobile/theme/fontFamily.ts diff --git a/frontend/mobile/components/QuickActions.tsx b/frontend/mobile/components/QuickActions.tsx index a0d74ca9..db5b6340 100644 --- a/frontend/mobile/components/QuickActions.tsx +++ b/frontend/mobile/components/QuickActions.tsx @@ -4,7 +4,7 @@ import { useRouter, type Href } from 'expo-router'; import { useTheme } from '../hooks/useTheme'; import type { ThemeColors } from '../lib/theme'; -import { fontFamily } from '../theme/typography'; +import { fontFamily } from '../theme/fontFamily'; import { BuyIcon, ReceiveIcon, SendIcon, SwapIcon, type IconProps } from './icons'; export interface QuickActionItem { diff --git a/frontend/mobile/components/__tests__/QuickActions.test.tsx b/frontend/mobile/components/__tests__/QuickActions.test.tsx index aad089f5..b0aa6cc1 100644 --- a/frontend/mobile/components/__tests__/QuickActions.test.tsx +++ b/frontend/mobile/components/__tests__/QuickActions.test.tsx @@ -1,3 +1,7 @@ +jest.mock('expo-router', () => ({ + useRouter: () => ({ push: jest.fn() }), +})); + import { QUICK_ACTIONS, QuickActionItem } from "../QuickActions"; describe("QuickActions component definitions", () => { diff --git a/frontend/mobile/jest.config.js b/frontend/mobile/jest.config.js index 7c457fd7..c355a98f 100644 --- a/frontend/mobile/jest.config.js +++ b/frontend/mobile/jest.config.js @@ -4,8 +4,8 @@ const expoPreset = require('jest-expo/jest-preset'); * Jest setup for the mobile app. * * `jest-expo` supplies the React Native transform, module mocks, and test - * environment. The only change is the transform allow-list: `@noble/ciphers` and - * `@noble/hashes` ship ESM only, and Jest cannot `require` them untransformed. + * environment. The only change is the transform allow-list: several dependencies + * ship ESM only, and Jest cannot `require` them untransformed. * Metro handles them natively, so this affects tests alone. * * `setupFiles` appends `jest.setup.js` to the preset's own setup files rather @@ -14,8 +14,9 @@ const expoPreset = require('jest-expo/jest-preset'); */ module.exports = { ...expoPreset, + transformIgnorePatterns: [ + '/node_modules/(?!(@exodus/bytes|@noble|uint8array-extras|.pnpm|react-native|@react-native|@react-native-community|expo|@expo|@expo-google-fonts|react-navigation|@react-navigation|@sentry/react-native|native-base))', + '/node_modules/react-native-reanimated/plugin/', + ], setupFiles: [...expoPreset.setupFiles, '/jest.setup.js'], - transformIgnorePatterns: expoPreset.transformIgnorePatterns.map((pattern) => - pattern.startsWith('/node_modules/(?!(') ? pattern.replace('(?!(', '(?!(@noble|') : pattern - ), }; diff --git a/frontend/mobile/package-lock.json b/frontend/mobile/package-lock.json index aca1fcfc..422e08ab 100644 --- a/frontend/mobile/package-lock.json +++ b/frontend/mobile/package-lock.json @@ -19,7 +19,7 @@ "@react-native-async-storage/async-storage": "2.2.0", "@react-native-community/netinfo": "11.4.1", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^14.6.1", + "@stellar/stellar-sdk": "^17.0.1", "@walletconnect/core": "2.17.1", "@walletconnect/react-native-compat": "2.17.1", "@walletconnect/utils": "2.17.1", @@ -28,6 +28,7 @@ "expo": "~54.0.0", "expo-application": "~7.0.8", "expo-background-task": "~1.0.10", + "expo-asset": "~12.0.13", "expo-camera": "~17.0.10", "expo-clipboard": "~8.0.8", "expo-constants": "~18.0.14", @@ -81,12 +82,10 @@ "name": "invisible-wallet-sdk", "version": "0.2.0", "license": "MIT", - "dependencies": { - "@stellar/stellar-sdk": "^15.1.0" - }, "devDependencies": { "@playwright/test": "^1.61.1", "@size-limit/preset-small-lib": "^12.1.0", + "@stellar/stellar-sdk": "^17.0.1", "@storybook/addon-essentials": "^8.6.0", "@storybook/react": "^8.6.0", "@storybook/react-vite": "^8.6.0", @@ -1728,24 +1727,6 @@ "proxy-from-env": "^2.1.0" } }, - "node_modules/@blend-capital/blend-sdk/node_modules/bignumber.js": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", - "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", - "license": "MIT" - }, - "node_modules/@blend-capital/blend-sdk/node_modules/eventsource": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", - "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@egjs/hammerjs": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", @@ -2373,6 +2354,23 @@ "@ethersproject/strings": "^5.8.0" } }, + "node_modules/@exodus/bytes": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@expo-google-fonts/anton": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@expo-google-fonts/anton/-/anton-0.4.2.tgz", @@ -3502,33 +3500,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@noble/ed25519": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-3.1.0.tgz", @@ -4716,50 +4687,39 @@ } }, "node_modules/@stellar/js-xdr": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", - "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==", - "license": "Apache-2.0" - }, - "node_modules/@stellar/stellar-base": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.1.0.tgz", - "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==", - "deprecated": "This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support.", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-5.0.0.tgz", + "integrity": "sha512-HBDNKnxr+ecdaEmbZ0mcKkirOF8tXXEbWSw34P3wT40Tn3g+u+cCH17xAWZymzscq8cojHB8340pR8QNVaD32w==", "license": "Apache-2.0", - "dependencies": { - "@noble/curves": "^1.9.6", - "@stellar/js-xdr": "^3.1.2", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" - }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0", + "pnpm": ">=10.0.0" } }, "node_modules/@stellar/stellar-sdk": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.6.1.tgz", - "integrity": "sha512-A1rQWDLdUasXkMXnYSuhgep+3ZZzyuXJKdt5/KAIc0gkmSp906HTvUpbT4pu+bVr41tu0+J4Ugz9J4BQAGGytg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-17.1.0.tgz", + "integrity": "sha512-vf/d9KR2B7MkrJBKW+cN8GPgBbiLFrRfr2pkR41VmqI6is6EfYvzhyGztbuJ3XPmcotkCRCveweAAzw2cjDn1w==", "license": "Apache-2.0", "dependencies": { - "@stellar/stellar-base": "^14.1.0", - "axios": "^1.13.3", - "bignumber.js": "^9.3.1", - "commander": "^14.0.2", - "eventsource": "^2.0.2", + "@exodus/bytes": "^1.15.1", + "@noble/ed25519": "^3.1.0", + "@noble/hashes": "^2.2.0", + "@stellar/js-xdr": "^5.0.0", + "@types/json-schema": "^7.0.15", + "axios": "1.20.0", + "bignumber.js": "^11.1.4", + "commander": "^14.0.3", + "eventsource": "^4.1.0", "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" + "smol-toml": "^1.6.1", + "uint8array-extras": "^1.5.0" }, "bin": { "stellar-js": "bin/stellar-js" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.12.0" } }, "node_modules/@tootallnate/once": { @@ -4905,7 +4865,6 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -6758,6 +6717,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -6770,9 +6730,9 @@ } }, "node_modules/axios": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", - "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", @@ -7070,13 +7030,10 @@ } }, "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", + "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", + "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.5", @@ -7224,6 +7181,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -7255,6 +7213,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -7966,6 +7925,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -9015,12 +8975,15 @@ } }, "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", + "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/eventsource-parser": { @@ -9155,6 +9118,21 @@ "expo": "*" } }, + "node_modules/expo-asset": { + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.13.tgz", + "integrity": "sha512-x/p7WvQUnkn6K43b9eL6SPeq5Vnf1E8BDe9bDrWrvMqzyUvJnUFvl+ctg3034s/+UHe7Ne2pAmc0+yzbl8CrDQ==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.8", + "expo-constants": "~18.0.13" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-camera": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/expo-camera/-/expo-camera-17.0.10.tgz", @@ -10217,6 +10195,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -10617,6 +10596,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -11151,6 +11131,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11512,6 +11493,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -11585,6 +11567,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -14707,6 +14690,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15125,15 +15109,6 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -16260,6 +16235,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -16325,26 +16301,6 @@ "node": ">=10" } }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -17216,20 +17172,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17251,12 +17193,6 @@ "node": ">=0.6" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "license": "MIT" - }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -17385,6 +17321,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -17714,12 +17651,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "license": "MIT" - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -18124,6 +18055,7 @@ "version": "1.1.22", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", diff --git a/frontend/mobile/package.json b/frontend/mobile/package.json index 075c1b57..62c5506d 100644 --- a/frontend/mobile/package.json +++ b/frontend/mobile/package.json @@ -29,7 +29,7 @@ "@react-native-async-storage/async-storage": "2.2.0", "@react-native-community/netinfo": "11.4.1", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^14.6.1", + "@stellar/stellar-sdk": "^17.0.1", "@walletconnect/core": "2.17.1", "@walletconnect/react-native-compat": "2.17.1", "@walletconnect/utils": "2.17.1", @@ -38,6 +38,7 @@ "expo": "~54.0.0", "expo-application": "~7.0.8", "expo-background-task": "~1.0.10", + "expo-asset": "~12.0.13", "expo-camera": "~17.0.10", "expo-clipboard": "~8.0.8", "expo-constants": "~18.0.14", diff --git a/frontend/mobile/theme/fontFamily.ts b/frontend/mobile/theme/fontFamily.ts new file mode 100644 index 00000000..4f16ef73 --- /dev/null +++ b/frontend/mobile/theme/fontFamily.ts @@ -0,0 +1,8 @@ +export const fontFamily = { + heading: 'Lora_600SemiBold_Italic', + accent: 'Anton_400Regular', + body: 'Inter_400Regular', + bodyMedium: 'Inter_500Medium', + bodySemiBold: 'Inter_600SemiBold', + address: 'Inconsolata_400Regular', +} as const; \ No newline at end of file diff --git a/frontend/mobile/theme/typography.ts b/frontend/mobile/theme/typography.ts index 25ca475a..9daba79d 100644 --- a/frontend/mobile/theme/typography.ts +++ b/frontend/mobile/theme/typography.ts @@ -5,6 +5,8 @@ import { Anton_400Regular } from "@expo-google-fonts/anton"; import { Inter_400Regular, Inter_500Medium, Inter_600SemiBold } from "@expo-google-fonts/inter"; import { Inconsolata_400Regular } from "@expo-google-fonts/inconsolata"; +import { fontFamily } from './fontFamily'; + /** * Brand typefaces, loaded once at startup by `app/_layout.tsx` via `useFonts`. * The keys here are the family names referenced by `fontFamily` below, so the @@ -19,19 +21,6 @@ export const fontAssets = { Inconsolata_400Regular, }; -/** - * Family name per role — mirrors how the Veil web wallet (`frontend/wallet`) - * uses each face, keeping typographic parity across platforms. - */ -export const fontFamily = { - heading: "Lora_600SemiBold_Italic", - accent: "Anton_400Regular", - body: "Inter_400Regular", - bodyMedium: "Inter_500Medium", - bodySemiBold: "Inter_600SemiBold", - address: "Inconsolata_400Regular", -} as const; - /** * Role-based text styles matching the web wallet's usage: * heading → Lora 600 italic (wallet renders h2 as Lora, weight 600, italic) From 55bf0fc98eb6ce66a01949358f71ea0ee35516f6 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Wed, 30 Sep 2026 12:24:55 +0100 Subject: [PATCH 02/14] fix(deps): put every package on @stellar/stellar-sdk 17 (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sdk shipped stellar-sdk as a runtime dependency at ^15.1.0 while the wallet, mobile, agent and the repo root each declared another major, so any app using the sdk installed two copies of the XDR tables. stellar-sdk moves to the sdk's peerDependencies (plus devDependencies so sdk/ builds and tests itself), and all five manifests now declare ^17.0.1 — one 17.2.0 copy per install. @scure/bip39 comes along to 2.x: 1.x reaches for @noble/hashes subpaths that the @noble/hashes 2.x stellar-sdk 17 hoists no longer exports, so the two majors cannot share one install. sdk/package.json's jest transform also learns to babel the ESM-only packages stellar-sdk 17 depends on (@exodus/bytes, @noble/*, uint8array-extras, smol-toml), configured inline so no babel config can leak into the Storybook build. --- frontend/mobile/package-lock.json | 184 +-- frontend/mobile/package.json | 2 +- frontend/wallet/package-lock.json | 279 ++-- frontend/wallet/package.json | 6 +- package-lock.json | 533 +++----- package.json | 2 +- packages/agent/package-lock.json | 152 +-- packages/agent/package.json | 2 +- sdk/package-lock.json | 1995 +++++++++++++++++++++++------ sdk/package.json | 30 +- 10 files changed, 2036 insertions(+), 1149 deletions(-) diff --git a/frontend/mobile/package-lock.json b/frontend/mobile/package-lock.json index f67cd356..cd3bab8a 100644 --- a/frontend/mobile/package-lock.json +++ b/frontend/mobile/package-lock.json @@ -20,7 +20,7 @@ "@react-native-async-storage/async-storage": "2.2.0", "@react-native-community/netinfo": "11.4.1", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^14.6.1", + "@stellar/stellar-sdk": "^17.0.1", "@walletconnect/core": "2.17.1", "@walletconnect/react-native-compat": "2.17.1", "@walletconnect/utils": "2.17.1", @@ -83,14 +83,13 @@ "name": "invisible-wallet-sdk", "version": "0.2.0", "license": "MIT", - "dependencies": { - "@stellar/stellar-sdk": "^15.1.0" - }, "devDependencies": { "@angular/compiler": "^18.0.0", "@angular/core": "^18.0.0", + "@babel/preset-env": "^7.26.0", "@playwright/test": "^1.61.1", "@size-limit/preset-small-lib": "^12.1.0", + "@stellar/stellar-sdk": "^17.0.1", "@storybook/addon-essentials": "^8.6.0", "@storybook/react": "^8.6.0", "@storybook/react-vite": "^8.6.0", @@ -127,6 +126,7 @@ }, "peerDependencies": { "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@stellar/stellar-sdk": "^17.0.1", "@tanstack/react-query": "^5.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", @@ -1738,24 +1738,6 @@ "proxy-from-env": "^2.1.0" } }, - "node_modules/@blend-capital/blend-sdk/node_modules/bignumber.js": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", - "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", - "license": "MIT" - }, - "node_modules/@blend-capital/blend-sdk/node_modules/eventsource": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", - "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@egjs/hammerjs": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", @@ -2383,6 +2365,23 @@ "@ethersproject/strings": "^5.8.0" } }, + "node_modules/@exodus/bytes": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@expo-google-fonts/anton": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@expo-google-fonts/anton/-/anton-0.4.2.tgz", @@ -4726,50 +4725,41 @@ } }, "node_modules/@stellar/js-xdr": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", - "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==", - "license": "Apache-2.0" - }, - "node_modules/@stellar/stellar-base": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.1.0.tgz", - "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==", - "deprecated": "This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support.", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-5.0.0.tgz", + "integrity": "sha512-HBDNKnxr+ecdaEmbZ0mcKkirOF8tXXEbWSw34P3wT40Tn3g+u+cCH17xAWZymzscq8cojHB8340pR8QNVaD32w==", "license": "Apache-2.0", - "dependencies": { - "@noble/curves": "^1.9.6", - "@stellar/js-xdr": "^3.1.2", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" - }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0", + "pnpm": ">=10.0.0" } }, "node_modules/@stellar/stellar-sdk": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.6.1.tgz", - "integrity": "sha512-A1rQWDLdUasXkMXnYSuhgep+3ZZzyuXJKdt5/KAIc0gkmSp906HTvUpbT4pu+bVr41tu0+J4Ugz9J4BQAGGytg==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-17.2.0.tgz", + "integrity": "sha512-hGdbvhnOMFwAe+QOAUVPrtLf8U+arO2XG+0osEeY87Ti5scj1R52YSw8HW828gf6UG4PW/jtAlfnyaGCj8t6UA==", "license": "Apache-2.0", "dependencies": { - "@stellar/stellar-base": "^14.1.0", - "axios": "^1.13.3", - "bignumber.js": "^9.3.1", - "commander": "^14.0.2", - "eventsource": "^2.0.2", + "@exodus/bytes": "^1.15.1", + "@noble/ed25519": "^3.1.0", + "@noble/hashes": "^2.2.0", + "@stellar/js-xdr": "^5.0.0", + "@types/json-schema": "^7.0.15", + "axios": "1.20.0", + "bignumber.js": "^11.1.4", + "commander": "^14.0.3", + "eventsource": "^4.1.0", "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" + "smol-toml": "^1.6.1", + "uint8array-extras": "^1.5.0" }, "bin": { - "stellar-js": "bin/stellar-js" + "stellar-contract-bindings-typescript": "bin/stellar-contract-bindings-typescript", + "stellar-js": "bin/stellar-js", + "stellar-sdk": "bin/stellar-js" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.12.0" } }, "node_modules/@tootallnate/once": { @@ -4915,7 +4905,6 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -6780,9 +6769,9 @@ } }, "node_modules/axios": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", - "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", @@ -7080,13 +7069,10 @@ } }, "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", + "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", + "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.5", @@ -9025,12 +9011,15 @@ } }, "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", + "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/eventsource-parser": { @@ -11595,6 +11584,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -15135,15 +15125,6 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -16335,26 +16316,6 @@ "node": ">=10" } }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -17226,20 +17187,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17261,12 +17208,6 @@ "node": ">=0.6" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "license": "MIT" - }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -17395,6 +17336,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -17724,12 +17666,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "license": "MIT" - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", diff --git a/frontend/mobile/package.json b/frontend/mobile/package.json index 6be45171..f41e16c9 100644 --- a/frontend/mobile/package.json +++ b/frontend/mobile/package.json @@ -30,7 +30,7 @@ "@react-native-async-storage/async-storage": "2.2.0", "@react-native-community/netinfo": "11.4.1", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^14.6.1", + "@stellar/stellar-sdk": "^17.0.1", "@walletconnect/core": "2.17.1", "@walletconnect/react-native-compat": "2.17.1", "@walletconnect/utils": "2.17.1", diff --git a/frontend/wallet/package-lock.json b/frontend/wallet/package-lock.json index f17dcec9..98b7bf58 100644 --- a/frontend/wallet/package-lock.json +++ b/frontend/wallet/package-lock.json @@ -10,10 +10,12 @@ "dependencies": { "@anthropic-ai/sdk": "^0.113.0", "@blend-capital/blend-sdk": "^3.3.0", - "@scure/bip39": "^1.6.0", + "@noble/curves": "^2.4.0", + "@noble/hashes": "^2.4.0", + "@scure/bip39": "^2.4.0", "@sentry/nextjs": "^8.0.0", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^14.6.1", + "@stellar/stellar-sdk": "^17.0.1", "@supabase/supabase-js": "^2.108.2", "@vitest/coverage-v8": "^1.3.0", "@walletconnect/utils": "2.17.1", @@ -52,14 +54,13 @@ "name": "invisible-wallet-sdk", "version": "0.2.0", "license": "MIT", - "dependencies": { - "@stellar/stellar-sdk": "^15.1.0" - }, "devDependencies": { "@angular/compiler": "^18.0.0", "@angular/core": "^18.0.0", + "@babel/preset-env": "^7.26.0", "@playwright/test": "^1.61.1", "@size-limit/preset-small-lib": "^12.1.0", + "@stellar/stellar-sdk": "^17.0.1", "@storybook/addon-essentials": "^8.6.0", "@storybook/react": "^8.6.0", "@storybook/react-vite": "^8.6.0", @@ -96,6 +97,7 @@ }, "peerDependencies": { "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@stellar/stellar-sdk": "^17.0.1", "@tanstack/react-query": "^5.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", @@ -1884,18 +1886,6 @@ "follow-redirects": ">=1.15.6" } }, - "node_modules/@blend-capital/blend-sdk/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@blend-capital/blend-sdk/node_modules/@stellar/js-xdr": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-4.0.0.tgz", @@ -1932,12 +1922,6 @@ "node": ">=22.0.0" } }, - "node_modules/@blend-capital/blend-sdk/node_modules/bignumber.js": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", - "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", - "license": "MIT" - }, "node_modules/@blend-capital/blend-sdk/node_modules/commander": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", @@ -1947,18 +1931,6 @@ "node": ">=20" } }, - "node_modules/@blend-capital/blend-sdk/node_modules/eventsource": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", - "integrity": "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -2817,6 +2789,23 @@ "@ethersproject/strings": "^5.8.0" } }, + "node_modules/@exodus/bytes": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -4100,15 +4089,15 @@ } }, "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.4.0.tgz", + "integrity": "sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" + "@noble/hashes": "2.4.0" }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -4124,12 +4113,12 @@ } }, "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -5372,23 +5361,13 @@ "win32" ] }, - "node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-2.4.0.tgz", + "integrity": "sha512-82dxFbZUYboyOf0AXiydsQrFQ5Q4h9mX+O2UkE91ROYmsc0BKMGZLwDmy96Jpa2+vrtoxomjUhy1RPIgH/r2nA==", "license": "MIT", "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" + "@noble/hashes": "2.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -6190,49 +6169,65 @@ } }, "node_modules/@stellar/js-xdr": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", - "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==", - "license": "Apache-2.0" - }, - "node_modules/@stellar/stellar-base": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.1.0.tgz", - "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-5.0.0.tgz", + "integrity": "sha512-HBDNKnxr+ecdaEmbZ0mcKkirOF8tXXEbWSw34P3wT40Tn3g+u+cCH17xAWZymzscq8cojHB8340pR8QNVaD32w==", "license": "Apache-2.0", - "dependencies": { - "@noble/curves": "^1.9.6", - "@stellar/js-xdr": "^3.1.2", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" - }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0", + "pnpm": ">=10.0.0" } }, "node_modules/@stellar/stellar-sdk": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.6.1.tgz", - "integrity": "sha512-A1rQWDLdUasXkMXnYSuhgep+3ZZzyuXJKdt5/KAIc0gkmSp906HTvUpbT4pu+bVr41tu0+J4Ugz9J4BQAGGytg==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-17.2.0.tgz", + "integrity": "sha512-hGdbvhnOMFwAe+QOAUVPrtLf8U+arO2XG+0osEeY87Ti5scj1R52YSw8HW828gf6UG4PW/jtAlfnyaGCj8t6UA==", "license": "Apache-2.0", "dependencies": { - "@stellar/stellar-base": "^14.1.0", - "axios": "^1.13.3", - "bignumber.js": "^9.3.1", - "commander": "^14.0.2", - "eventsource": "^2.0.2", + "@exodus/bytes": "^1.15.1", + "@noble/ed25519": "^3.1.0", + "@noble/hashes": "^2.2.0", + "@stellar/js-xdr": "^5.0.0", + "@types/json-schema": "^7.0.15", + "axios": "1.20.0", + "bignumber.js": "^11.1.4", + "commander": "^14.0.3", + "eventsource": "^4.1.0", "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" + "smol-toml": "^1.6.1", + "uint8array-extras": "^1.5.0" }, "bin": { - "stellar-js": "bin/stellar-js" + "stellar-contract-bindings-typescript": "bin/stellar-contract-bindings-typescript", + "stellar-js": "bin/stellar-js", + "stellar-sdk": "bin/stellar-js" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.12.0" + } + }, + "node_modules/@stellar/stellar-sdk/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@stellar/stellar-sdk/node_modules/axios": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/@stellar/stellar-sdk/node_modules/commander": { @@ -6244,6 +6239,28 @@ "node": ">=20" } }, + "node_modules/@stellar/stellar-sdk/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@stellar/stellar-sdk/node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/@supabase/auth-js": { "version": "2.108.2", "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.108.2.tgz", @@ -8229,13 +8246,10 @@ } }, "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", + "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", @@ -9633,12 +9647,15 @@ } }, "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", + "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/eventsource-parser": { @@ -9944,16 +9961,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -10411,9 +10428,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -14719,26 +14736,6 @@ "node": ">= 0.4" } }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/sharp": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", @@ -15765,20 +15762,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -15791,12 +15774,6 @@ "node": ">=8.0" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "license": "MIT" - }, "node_modules/tough-cookie": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", @@ -16358,12 +16335,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "license": "MIT" - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/frontend/wallet/package.json b/frontend/wallet/package.json index 87ae6658..5c338101 100644 --- a/frontend/wallet/package.json +++ b/frontend/wallet/package.json @@ -17,10 +17,12 @@ "dependencies": { "@anthropic-ai/sdk": "^0.113.0", "@blend-capital/blend-sdk": "^3.3.0", - "@scure/bip39": "^1.6.0", + "@noble/curves": "^2.4.0", + "@noble/hashes": "^2.4.0", + "@scure/bip39": "^2.4.0", "@sentry/nextjs": "^8.0.0", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^14.6.1", + "@stellar/stellar-sdk": "^17.0.1", "@supabase/supabase-js": "^2.108.2", "@vitest/coverage-v8": "^1.3.0", "@walletconnect/utils": "2.17.1", diff --git a/package-lock.json b/package-lock.json index 04ba8f57..00b6bbc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "veil", "dependencies": { - "@stellar/stellar-sdk": "^14.6.1" + "@stellar/stellar-sdk": "^17.0.1" }, "devDependencies": { "@changesets/cli": "^2.27.9", @@ -305,6 +305,23 @@ "node": ">=12" } }, + "node_modules/@exodus/bytes": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@hutson/parse-repository-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", @@ -434,26 +451,22 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, + "node_modules/@noble/ed25519": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-3.2.0.tgz", + "integrity": "sha512-criDgRlnUA09hchYrTy/JUWPIEap5rZxQe6wDWzRx51oWWpDRcUpuNzlgPxDJaOK6AsW9c0wKcj3rKRv6t+bPQ==", + "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -498,46 +511,41 @@ } }, "node_modules/@stellar/js-xdr": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.2.tgz", - "integrity": "sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==" - }, - "node_modules/@stellar/stellar-base": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.1.0.tgz", - "integrity": "sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==", - "dependencies": { - "@noble/curves": "^1.9.6", - "@stellar/js-xdr": "^3.1.2", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-5.0.0.tgz", + "integrity": "sha512-HBDNKnxr+ecdaEmbZ0mcKkirOF8tXXEbWSw34P3wT40Tn3g+u+cCH17xAWZymzscq8cojHB8340pR8QNVaD32w==", + "license": "Apache-2.0", "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0", + "pnpm": ">=10.0.0" } }, "node_modules/@stellar/stellar-sdk": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-14.6.1.tgz", - "integrity": "sha512-A1rQWDLdUasXkMXnYSuhgep+3ZZzyuXJKdt5/KAIc0gkmSp906HTvUpbT4pu+bVr41tu0+J4Ugz9J4BQAGGytg==", - "dependencies": { - "@stellar/stellar-base": "^14.1.0", - "axios": "^1.13.3", - "bignumber.js": "^9.3.1", - "commander": "^14.0.2", - "eventsource": "^2.0.2", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-17.2.0.tgz", + "integrity": "sha512-hGdbvhnOMFwAe+QOAUVPrtLf8U+arO2XG+0osEeY87Ti5scj1R52YSw8HW828gf6UG4PW/jtAlfnyaGCj8t6UA==", + "license": "Apache-2.0", + "dependencies": { + "@exodus/bytes": "^1.15.1", + "@noble/ed25519": "^3.1.0", + "@noble/hashes": "^2.2.0", + "@stellar/js-xdr": "^5.0.0", + "@types/json-schema": "^7.0.15", + "axios": "1.20.0", + "bignumber.js": "^11.1.4", + "commander": "^14.0.3", + "eventsource": "^4.1.0", "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" + "smol-toml": "^1.6.1", + "uint8array-extras": "^1.5.0" }, "bin": { - "stellar-js": "bin/stellar-js" + "stellar-contract-bindings-typescript": "bin/stellar-contract-bindings-typescript", + "stellar-js": "bin/stellar-js", + "stellar-sdk": "bin/stellar-js" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.12.0" } }, "node_modules/@tsconfig/node10": { @@ -564,6 +572,12 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.41", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", @@ -615,6 +629,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -675,60 +690,21 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, - "node_modules/base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/better-path-resolve": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", @@ -743,12 +719,10 @@ } }, "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "engines": { - "node": "*" - } + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", + "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", + "license": "MIT" }, "node_modules/braces": { "version": "3.0.3", @@ -763,50 +737,11 @@ "node": ">=8" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -815,21 +750,6 @@ "node": ">= 0.4" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/chardet": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", @@ -841,6 +761,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1137,6 +1058,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1149,26 +1071,11 @@ } } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1222,6 +1129,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -1259,6 +1167,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1267,6 +1176,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1275,6 +1185,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -1286,6 +1197,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -1311,11 +1223,24 @@ } }, "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", + "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" } }, "node_modules/extendable-error": { @@ -1397,6 +1322,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1406,30 +1332,17 @@ } } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -1454,6 +1367,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1462,6 +1376,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -1485,6 +1400,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -1568,6 +1484,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1604,21 +1521,11 @@ "uglify-js": "^3.1.4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1630,6 +1537,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -1641,9 +1549,10 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1668,6 +1577,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -1703,25 +1613,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1732,11 +1623,6 @@ "node": ">= 4" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -1744,17 +1630,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1835,20 +1710,6 @@ "node": ">=8" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -1859,11 +1720,6 @@ "node": ">=0.10.0" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2002,6 +1858,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2047,6 +1904,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2055,6 +1913,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -2085,7 +1944,8 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", @@ -2281,14 +2141,6 @@ "node": ">=6" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -2309,6 +2161,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", "engines": { "node": ">=10" } @@ -2351,14 +2204,6 @@ ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/read-pkg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", @@ -2556,25 +2401,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -2595,41 +2421,6 @@ "node": ">=10" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2676,6 +2467,18 @@ "node": ">=8" } }, + "node_modules/smol-toml": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.9.0.tgz", + "integrity": "sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2832,19 +2635,6 @@ "dev": true, "license": "MIT" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2858,11 +2648,6 @@ "node": ">=8.0" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -2919,19 +2704,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -2959,6 +2731,18 @@ "node": ">=0.8.0" } }, + "node_modules/uint8array-extras": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.6.0.tgz", + "integrity": "sha512-8iAasVS4wUx0gPLjH8Xtz2PeDzTSiy8QiLGu2DT3X5GU+egFEQhpnbtkehbAwjvDcxIERmCYcysiODFmE3Ud0Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -2975,11 +2759,6 @@ "node": ">= 4.0.0" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -3013,26 +2792,6 @@ "node": ">= 8" } }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index a9f9734f..eb3d32ff 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "test:scripts": "node --test scripts/tests/*.test.mjs" }, "dependencies": { - "@stellar/stellar-sdk": "^14.6.1" + "@stellar/stellar-sdk": "^17.0.1" }, "devDependencies": { "@changesets/cli": "^2.27.9", diff --git a/packages/agent/package-lock.json b/packages/agent/package-lock.json index f01ee998..48eb2c69 100644 --- a/packages/agent/package-lock.json +++ b/packages/agent/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@anthropic-ai/sdk": "^0.113.0", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^16.1.0", + "@stellar/stellar-sdk": "^17.0.1", "cors": "^2.8.5", "dotenv": "^17.4.2", "express": "^5.2.1", @@ -1031,6 +1031,23 @@ "node": ">=18" } }, + "node_modules/@exodus/bytes": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1577,28 +1594,28 @@ "license": "MIT" }, "node_modules/@stellar/js-xdr": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-4.0.0.tgz", - "integrity": "sha512-+NmNa7Tk5BI5XFdy/6xGTqAN4J9a9KgCrCGhj2uEUTCBhLkch0M+QbKzNH8zEnejWe0p8w+0q5hUVX6L3OzoVA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-5.0.0.tgz", + "integrity": "sha512-HBDNKnxr+ecdaEmbZ0mcKkirOF8tXXEbWSw34P3wT40Tn3g+u+cCH17xAWZymzscq8cojHB8340pR8QNVaD32w==", "license": "Apache-2.0", "engines": { - "node": ">=20.0.0", - "pnpm": ">=9.0.0" + "node": ">=22.0.0", + "pnpm": ">=10.0.0" } }, "node_modules/@stellar/stellar-sdk": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-16.1.0.tgz", - "integrity": "sha512-MOIrUvbzuTnSvUurL+9nrS1UW6Ko+QTW00RggSomm4WaWkE8onKPo2MRJMd89X7qPaGPjYjxNX6B671AEQlzxQ==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-17.2.0.tgz", + "integrity": "sha512-hGdbvhnOMFwAe+QOAUVPrtLf8U+arO2XG+0osEeY87Ti5scj1R52YSw8HW828gf6UG4PW/jtAlfnyaGCj8t6UA==", "license": "Apache-2.0", "dependencies": { + "@exodus/bytes": "^1.15.1", "@noble/ed25519": "^3.1.0", "@noble/hashes": "^2.2.0", - "@stellar/js-xdr": "4.0.0", - "axios": "1.18.0", - "base32.js": "^0.1.0", + "@stellar/js-xdr": "^5.0.0", + "@types/json-schema": "^7.0.15", + "axios": "1.20.0", "bignumber.js": "^11.1.4", - "buffer": "^6.0.3", "commander": "^14.0.3", "eventsource": "^4.1.0", "feaxios": "^0.0.23", @@ -1606,10 +1623,12 @@ "uint8array-extras": "^1.5.0" }, "bin": { - "stellar-js": "bin/stellar-js" + "stellar-contract-bindings-typescript": "bin/stellar-contract-bindings-typescript", + "stellar-js": "bin/stellar-js", + "stellar-sdk": "bin/stellar-js" }, "engines": { - "node": ">=22.0.0" + "node": ">=22.12.0" } }, "node_modules/@tybys/wasm-util": { @@ -1769,6 +1788,12 @@ "pretty-format": "^30.0.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "26.1.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", @@ -2307,13 +2332,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", - "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -2424,35 +2449,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/baseline-browser-mapping": { "version": "2.10.21", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", @@ -2563,30 +2559,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3490,16 +3462,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -3735,9 +3707,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3812,26 +3784,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", diff --git a/packages/agent/package.json b/packages/agent/package.json index e6649ded..4bc9b123 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -34,7 +34,7 @@ "dependencies": { "@anthropic-ai/sdk": "^0.113.0", "@soroswap/sdk": "^0.4.0", - "@stellar/stellar-sdk": "^16.1.0", + "@stellar/stellar-sdk": "^17.0.1", "cors": "^2.8.5", "dotenv": "^17.4.2", "express": "^5.2.1", diff --git a/sdk/package-lock.json b/sdk/package-lock.json index 3343f3d4..fc5a9e68 100644 --- a/sdk/package-lock.json +++ b/sdk/package-lock.json @@ -8,14 +8,13 @@ "name": "invisible-wallet-sdk", "version": "0.2.0", "license": "MIT", - "dependencies": { - "@stellar/stellar-sdk": "^15.1.0" - }, "devDependencies": { "@angular/compiler": "^18.0.0", "@angular/core": "^18.0.0", + "@babel/preset-env": "^7.26.0", "@playwright/test": "^1.61.1", "@size-limit/preset-small-lib": "^12.1.0", + "@stellar/stellar-sdk": "^17.0.1", "@storybook/addon-essentials": "^8.6.0", "@storybook/react": "^8.6.0", "@storybook/react-vite": "^8.6.0", @@ -52,6 +51,7 @@ }, "peerDependencies": { "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@stellar/stellar-sdk": "^17.0.1", "@tanstack/react-query": "^5.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", @@ -174,9 +174,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -215,14 +215,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -245,14 +245,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -283,6 +283,41 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", @@ -362,6 +397,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/helper-replace-supers": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", @@ -415,11 +468,26 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { "node": ">=6.9.0" } @@ -454,6 +522,107 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz", @@ -490,6 +659,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -561,14 +743,30 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -590,23 +788,857 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", + "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { + "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -619,92 +1651,112 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", + "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", + "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -713,14 +1765,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -729,14 +1781,18 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { + "node_modules/@babel/plugin-transform-typescript": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -745,15 +1801,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { + "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", - "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -762,14 +1817,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { + "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", - "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { @@ -779,13 +1834,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { + "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { @@ -795,34 +1851,101 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { + "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-typescript": { + "node_modules/@babel/preset-env": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/plugin-syntax-typescript": "^7.29.7" + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -831,6 +1954,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/preset-typescript": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", @@ -877,18 +2015,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -1473,6 +2611,24 @@ "node": ">=18" } }, + "node_modules/@exodus/bytes": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@inquirer/checkbox": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", @@ -2829,28 +3985,24 @@ "react": ">=16" } }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "node_modules/@noble/ed25519": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-3.2.0.tgz", + "integrity": "sha512-criDgRlnUA09hchYrTy/JUWPIEap5rZxQe6wDWzRx51oWWpDRcUpuNzlgPxDJaOK6AsW9c0wKcj3rKRv6t+bPQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "dev": true, "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3407,53 +4559,43 @@ } }, "node_modules/@stellar/js-xdr": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-4.0.0.tgz", - "integrity": "sha512-+NmNa7Tk5BI5XFdy/6xGTqAN4J9a9KgCrCGhj2uEUTCBhLkch0M+QbKzNH8zEnejWe0p8w+0q5hUVX6L3OzoVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=20.0.0", - "pnpm": ">=9.0.0" - } - }, - "node_modules/@stellar/stellar-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-15.0.0.tgz", - "integrity": "sha512-XQhxUr9BYiEcFcgc4oWcCMR9QJCny/GmmGsuwPKf/ieIcOeb5149KLHYx9mJCA0ea8QbucR2/GzV58QbXOTxQA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-5.0.0.tgz", + "integrity": "sha512-HBDNKnxr+ecdaEmbZ0mcKkirOF8tXXEbWSw34P3wT40Tn3g+u+cCH17xAWZymzscq8cojHB8340pR8QNVaD32w==", + "dev": true, "license": "Apache-2.0", - "dependencies": { - "@noble/curves": "^1.9.7", - "@stellar/js-xdr": "^4.0.0", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" - }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0", + "pnpm": ">=10.0.0" } }, "node_modules/@stellar/stellar-sdk": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-15.1.0.tgz", - "integrity": "sha512-GsJUcWx2yboVzYdhTe/LHS3V1wVLSHkUkglC5bBoYWGJt31vzIhbSGno60NP9CdCTNkLJdnrsLJ63oA58Zvh5A==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-17.2.0.tgz", + "integrity": "sha512-hGdbvhnOMFwAe+QOAUVPrtLf8U+arO2XG+0osEeY87Ti5scj1R52YSw8HW828gf6UG4PW/jtAlfnyaGCj8t6UA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@stellar/stellar-base": "^15.0.0", - "axios": "1.15.0", - "bignumber.js": "^9.3.1", + "@exodus/bytes": "^1.15.1", + "@noble/ed25519": "^3.1.0", + "@noble/hashes": "^2.2.0", + "@stellar/js-xdr": "^5.0.0", + "@types/json-schema": "^7.0.15", + "axios": "1.20.0", + "bignumber.js": "^11.1.4", "commander": "^14.0.3", - "eventsource": "^2.0.2", + "eventsource": "^4.1.0", "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.11" + "smol-toml": "^1.6.1", + "uint8array-extras": "^1.5.0" }, "bin": { - "stellar-js": "bin/stellar-js" + "stellar-contract-bindings-typescript": "bin/stellar-contract-bindings-typescript", + "stellar-js": "bin/stellar-js", + "stellar-sdk": "bin/stellar-js" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.12.0" } }, "node_modules/@storybook/addon-actions": { @@ -5665,12 +6807,14 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -5683,16 +6827,45 @@ } }, "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "dev": true, "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -5703,6 +6876,48 @@ "node": ">= 0.4" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", @@ -5728,48 +6943,19 @@ }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.22", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.22.tgz", - "integrity": "sha512-6qruVrb5rse6WylFkU0FhBKKGuecWseqdpQfhkawn6ztyk2QlfwSRjsDxMCLJrkfmfN21qvhl9ABgaMeRkuwww==", + "version": "2.11.26", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.26.tgz", + "integrity": "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5793,13 +6979,11 @@ } }, "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.5.tgz", + "integrity": "sha512-6WmzCNtUnfKpbozq+hOgWaZMMzORmYBwF1xZScyoIX3QRYWeKTtxxwDOW5tIz7C9BdjkIYHGTcelCLkXg0mndw==", + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.1.1", @@ -5831,9 +7015,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz", + "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==", "dev": true, "funding": [ { @@ -5851,11 +7035,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.26", + "caniuse-lite": "^1.0.30001813", + "electron-to-chromium": "^1.5.439", + "node-releases": "^2.0.57", + "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" @@ -5887,30 +7071,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5942,6 +7102,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -5960,6 +7121,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5973,6 +7135,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -6024,9 +7187,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001791", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", - "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "version": "1.0.30001813", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001813.tgz", + "integrity": "sha512-zfjJo4rM0+fUomGDBW/xcDjhIwz/210DGvip2MAMDZ8KHcRPnOHmEgHPZP0UHlZoxr8fYKVJOqcORhYQcG4FKQ==", "dev": true, "funding": [ { @@ -6252,6 +7415,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -6264,6 +7428,7 @@ "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, "license": "MIT", "engines": { "node": ">=20" @@ -6290,6 +7455,23 @@ "dev": true, "license": "MIT" }, + "node_modules/core-js-compat": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz", + "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.7" + }, + "engines": { + "node": ">=6.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -6480,6 +7662,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -6507,6 +7690,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -6597,6 +7781,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -6615,9 +7800,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "version": "1.5.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.440.tgz", + "integrity": "sha512-SghDzqdJokdz8zP8YNlvS74+CwLRoUPDGvP/gFA+HrKVw+pOshUAgx8pXR37xl/u16zGae746rFNWvZ/22kU2Q==", "dev": true, "license": "ISC" }, @@ -6668,6 +7853,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6677,6 +7863,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6686,6 +7873,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -6698,6 +7886,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6846,12 +8035,26 @@ } }, "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", + "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", + "dev": true, "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" } }, "node_modules/execa": { @@ -7017,6 +8220,7 @@ "version": "0.0.23", "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", "integrity": "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==", + "dev": true, "license": "MIT", "dependencies": { "is-retry-allowed": "^3.0.0" @@ -7082,6 +8286,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, "funding": [ { "type": "individual", @@ -7102,6 +8307,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -7131,16 +8337,17 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -7172,6 +8379,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7221,6 +8429,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -7255,6 +8464,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -7365,6 +8575,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7426,6 +8637,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -7438,6 +8650,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7450,6 +8663,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -7465,6 +8679,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -7577,26 +8792,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -7663,6 +8858,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, "license": "ISC" }, "node_modules/irregular-plurals": { @@ -7703,6 +8899,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7869,6 +9066,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -7894,6 +9092,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -7931,12 +9130,6 @@ "node": ">=8" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9856,6 +11049,13 @@ "node": ">=8" } }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.groupby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", @@ -10022,6 +11222,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -10129,6 +11330,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -10138,6 +11340,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -10346,11 +11549,14 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "version": "2.0.57", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.57.tgz", + "integrity": "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-package-data": { "version": "3.0.3", @@ -10854,6 +12060,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -10989,6 +12196,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -11069,15 +12277,6 @@ "node": ">=8" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "19.2.8", "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", @@ -11294,6 +12493,64 @@ "node": ">=8" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.3.0.tgz", + "integrity": "sha512-9ns8odR8e9q3otKeHj3DE80jZYKg6zVeZKE+zQmRKXFoVUcuiTGeO6iusDhPRoIQQPVPRvH+SfBhrTud4eczuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.5.2.tgz", + "integrity": "sha512-zkmVH92DlzjSFc4xKGZp/2BXIFrDIdBQBC8gUXKCsMgKYb1bkCkxfSuoW1werDjaTEMTbULkHtKFHe1L+Abnaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.3.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz", + "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11466,26 +12723,6 @@ "tslib": "^2.1.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -11568,6 +12805,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -11581,26 +12819,6 @@ "node": ">= 0.4" } }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11765,6 +12983,19 @@ "node": ">=8" } }, + "node_modules/smol-toml": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.9.0.tgz", + "integrity": "sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/solid-js": { "version": "1.9.15", "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.15.tgz", @@ -12304,20 +13535,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12331,12 +13548,6 @@ "node": ">=8.0" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "license": "MIT" - }, "node_modules/tough-cookie": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", @@ -12559,20 +13770,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/typed-inject": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typed-inject/-/typed-inject-4.0.0.tgz", @@ -12635,6 +13832,19 @@ "node": ">=0.8.0" } }, + "node_modules/uint8array-extras": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.6.0.tgz", + "integrity": "sha512-8iAasVS4wUx0gPLjH8Xtz2PeDzTSiy8QiLGu2DT3X5GU+egFEQhpnbtkehbAwjvDcxIERmCYcysiODFmE3Ud0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/underscore": { "version": "1.13.8", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", @@ -12649,6 +13859,50 @@ "dev": true, "license": "MIT" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unicorn-magic": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", @@ -12677,9 +13931,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", "dev": true, "funding": [ { @@ -12707,12 +13961,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "license": "MIT" - }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -13618,6 +14866,7 @@ "version": "1.1.21", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz", "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", diff --git a/sdk/package.json b/sdk/package.json index 3a78dbfc..42b76118 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -69,10 +69,8 @@ ], "author": "", "license": "MIT", - "dependencies": { - "@stellar/stellar-sdk": "^15.1.0" - }, "peerDependencies": { + "@stellar/stellar-sdk": "^17.0.1", "@tanstack/react-query": "^5.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", @@ -107,6 +105,8 @@ } }, "devDependencies": { + "@stellar/stellar-sdk": "^17.0.1", + "@babel/preset-env": "^7.26.0", "@playwright/test": "^1.61.1", "@size-limit/preset-small-lib": "^12.1.0", "@storybook/addon-essentials": "^8.6.0", @@ -160,11 +160,29 @@ "^@stellar/stellar-sdk$": "/node_modules/@stellar/stellar-sdk" }, "transform": { - "^.+\\.[tj]sx?$": "ts-jest", - "^.+\\.mjs$": "/jest/angular-esm-transformer.js" + "^.+\\.tsx?$": "ts-jest", + "^.+\\.mjs$": "/jest/angular-esm-transformer.js", + "^.+\\.jsx?$": [ + "babel-jest", + { + "configFile": false, + "babelrc": false, + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "current" + }, + "modules": "commonjs" + } + ] + ] + } + ] }, "transformIgnorePatterns": [ - "node_modules/(?!@angular/(core|compiler))" + "[\\\\/]node_modules[\\\\/](?!.*(@angular/(core|compiler)|@exodus|@noble|uint8array-extras|smol-toml)[\\\\/])" ], "globals": { "ts-jest": { From 4168d06fd19aee180ab772c3e8d4a733724086af Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Wed, 30 Sep 2026 12:27:38 +0100 Subject: [PATCH 03/14] fix(sdk): make passkey authorisation work on protocol 23 (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Soroban RPC hands back address credentials as the CAP-71 ADDRESS_V2 arm, and that arm signs a different preimage — HashIdPreimageSorobanAuthorizationWithAddress, which binds the authorising contract into the payload. The old code only knew the legacy arm, so every passkey transaction it built carried a signature the wallet contract could not verify. Three more gaps closed on the way to a testnet success: - signatureExpirationLedger now comes from the client. The simulation returns 0, which the host reads as already expired. - The signature vec ends with the contract nonce, which __check_auth requires as its fifth element (it compared the wallet's own counter against a missing one). - Signed entries are re-simulated before submission. The first simulation records in recording mode, so its budget never counts the secp256r1 verification __check_auth runs, and the enforced second pass trapped on instructions. computeWalletAddress stops round-tripping through Buffer, deriveFeePayer falls back to atob, and the jsdom setup installs Node's native TextEncoder (rewrapped on the prototype) because @exodus/bytes probes for [native code] and stellar-sdk 17 checks instanceof Uint8Array across realms. --- sdk/jest.setup.ts | 32 +++++- sdk/src/core.ts | 216 +++++++++++++++++++++++++++----------- sdk/src/deriveFeePayer.ts | 6 +- sdk/src/utils.ts | 20 ++-- sdk/tests/index.html | 2 - 5 files changed, 192 insertions(+), 84 deletions(-) diff --git a/sdk/jest.setup.ts b/sdk/jest.setup.ts index 1292756d..7b359e46 100644 --- a/sdk/jest.setup.ts +++ b/sdk/jest.setup.ts @@ -1,13 +1,35 @@ // jest.setup.ts — polyfills for the jsdom test environment -// TextEncoder / TextDecoder are used by @stellar/stellar-sdk but are not -// provided by older versions of jsdom bundled with jest-environment-jsdom. +// +// jsdom does not ship TextEncoder/TextDecoder. Node's implementations (from +// 'util') must be installed as-is: @exodus/bytes probes `String(TextEncoder)` +// for '[native code]' to select its native code paths and calls +// TextDecoder.decode() with Uint16Array input (UTF-16 code units), so wrapper +// shims silently corrupt base32/strkey output. The one cross-realm hazard — +// Node's encode() returning a Node-realm Uint8Array, which fails +// `instanceof Uint8Array` in the jsdom realm (stellar-sdk 17's BytesValue and +// uint8array-extras depend on it) — is fixed by rewrapping encode()'s result +// on the prototype, keeping the class itself native. import { TextEncoder, TextDecoder } from 'util' -import { webcrypto } from 'crypto' -Object.defineProperty(globalThis, 'TextEncoder', { value: TextEncoder, writable: true }) -Object.defineProperty(globalThis, 'TextDecoder', { value: TextDecoder, writable: true }) +Object.defineProperty(globalThis, 'TextEncoder', { + value: TextEncoder, + writable: true, + configurable: true, +}) +Object.defineProperty(globalThis, 'TextDecoder', { + value: TextDecoder, + writable: true, + configurable: true, +}) + +const nativeEncode = TextEncoder.prototype.encode +TextEncoder.prototype.encode = function (source = '') { + return Uint8Array.from(nativeEncode.call(this, source)) +} // jsdom does not expose crypto.subtle — polyfill with Node's webcrypto implementation. +import { webcrypto } from 'crypto' + if (!globalThis.crypto || !globalThis.crypto.subtle) { Object.defineProperty(globalThis, 'crypto', { value: webcrypto, diff --git a/sdk/src/core.ts b/sdk/src/core.ts index 75bb779b..a644a99d 100644 --- a/sdk/src/core.ts +++ b/sdk/src/core.ts @@ -19,6 +19,7 @@ import { Contract, Keypair, Memo, + Operation, type Transaction, rpc as SorobanRpc, Horizon, @@ -527,6 +528,9 @@ export type WalletStateListener = (state: WalletState) => void; const POLL_INTERVAL_MS = 1_000; const POLL_MAX_ATTEMPTS = 30; +/** How many ledgers a passkey-signed Soroban auth entry stays valid for. */ +const AUTH_VALIDITY_LEDGERS = 100; + /** Storage key holding the roaming (cross-platform) credential as a portable signer. */ const PORTABLE_SIGNER_KEY = 'invisible_wallet_portable_signer'; @@ -986,7 +990,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission(assembled, signerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1160,8 +1165,8 @@ export class InvisibleWalletCore { }; /** - * Sign every address-credential auth entry produced by a simulation with the - * stored passkey, rewriting each entry's signature in place. + * Sign every address-credential auth entry produced by a simulation, writing + * the passkey signature back into the entry the transaction carries. * * Shared by every passkey-gated call (setGuardian, rotateSigner, approve, * sendPayment) so the Soroban authorization payload is derived — and bound @@ -1172,28 +1177,39 @@ export class InvisibleWalletCore { if (!authEntries) return; // stellarHash is a synchronous SHA-256 — avoids crypto.subtle (unavailable on some RN setups) - const networkIdBytes = new Uint8Array( - (stellarHash as (input: Buffer) => Buffer)(Buffer.from(this.config.networkPassphrase)) - ); + const networkIdBytes = stellarHash(new TextEncoder().encode(this.config.networkPassphrase)); + + // The simulation returns entries with signatureExpirationLedger = 0, which + // the host rejects as already expired — the client owns the validity window. + const expiresAtLedger = Number(sim.latestLedger) + AUTH_VALIDITY_LEDGERS; + const contractNonce = await this.readNonce(); for (const parsed of authEntries) { - const cred = parsed.credentials(); - if (cred.switch().value !== xdr.SorobanCredentialsType.sorobanCredentialsAddress().value) { + const cred = parsed.credentials; + + // Protocol 23 (CAP-71) moved address auth to the ADDRESS_V2 arm, which + // binds the authorising address into the signed payload; the legacy + // ADDRESS arm is still produced for pre-CAP-71 networks. + const isV2 = cred.type === 'sorobanCredentialsAddressV2'; + if (!isV2 && cred.type !== 'sorobanCredentialsAddress') { continue; } + const addrCred = isV2 ? cred.addressV2 : cred.address; - const addrCred = cred.address(); - const preimage = xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( - new xdr.HashIdPreimageSorobanAuthorization({ - networkId: Buffer.from(networkIdBytes), - nonce: addrCred.nonce(), - invocation: parsed.rootInvocation(), - signatureExpirationLedger: addrCred.signatureExpirationLedger(), - }) - ); - const payloadHash = new Uint8Array( - (stellarHash as (input: Buffer) => Buffer)(Buffer.from(preimage.toXDR())) - ); + const shared = { + networkId: new xdr.Hash(networkIdBytes), + nonce: addrCred.nonce, + invocation: parsed.rootInvocation, + signatureExpirationLedger: expiresAtLedger, + }; + const preimage = isV2 + ? xdr.HashIdPreimage.envelopeTypeSorobanAuthorizationWithAddress( + new xdr.HashIdPreimageSorobanAuthorizationWithAddress({ ...shared, address: addrCred.address }) + ) + : xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( + new xdr.HashIdPreimageSorobanAuthorization(shared) + ); + const payloadHash = stellarHash(preimage.toXdr()); const webAuthnSig = await this.signAuthEntry(payloadHash); if (!webAuthnSig) throw new Error('WebAuthn signing was cancelled'); @@ -1203,56 +1219,124 @@ export class InvisibleWalletCore { nativeToScVal(webAuthnSig.authData, { type: 'bytes' }), nativeToScVal(webAuthnSig.clientDataJSON, { type: 'bytes' }), nativeToScVal(webAuthnSig.signature, { type: 'bytes' }), + // The wallet contract's __check_auth expects exactly five + // elements, the last being the on-chain nonce it compares + // against its own — a missing or stale one is rejected. + nativeToScVal(contractNonce, { type: 'u64' }), ]); - parsed.credentials( - xdr.SorobanCredentials.sorobanCredentialsAddress( + // stellar-sdk 17 made SorobanAuthorizationEntry fields readonly — + // swap the entry in the simulation result instead of mutating it. + // The assembled operation holds this same array, so the swap reaches + // the transaction that gets submitted. + const credentials = isV2 + ? xdr.SorobanCredentials.sorobanCredentialsAddressV2( new xdr.SorobanAddressCredentials({ - address: addrCred.address(), - nonce: addrCred.nonce(), - signatureExpirationLedger: addrCred.signatureExpirationLedger(), + address: addrCred.address, + nonce: addrCred.nonce, + signatureExpirationLedger: expiresAtLedger, signature: sigVec, }) - ) - ); + ) + : xdr.SorobanCredentials.sorobanCredentialsAddress( + new xdr.SorobanAddressCredentials({ + address: addrCred.address, + nonce: addrCred.nonce, + signatureExpirationLedger: expiresAtLedger, + signature: sigVec, + }) + ); + + authEntries[authEntries.indexOf(parsed)] = new xdr.SorobanAuthorizationEntry({ + credentials, + rootInvocation: parsed.rootInvocation, + }); } } - // ── getNonce ────────────────────────────────────────────────────────────── + /** + * Re-simulate and re-assemble a transaction whose auth entries are now + * signed, and return the transaction to submit. + * + * The first simulation runs in recording auth mode, which never executes + * `__check_auth`, so its resource fee and footprint exclude the secp256r1 + * verification. Submitting on that budget traps with "operation instructions + * exceeds amount specified" the moment the passkey signature is really + * checked. Transactions with no auth entries skip the extra round-trip. + */ + private reprepareWithSignedAuth = async ( + assembled: Transaction, + payerKeypair: Keypair + ): Promise => { + const invokeOp = assembled.operations?.[0] as Operation.InvokeHostFunction | undefined; + const signedAuth = invokeOp?.auth ?? []; + if (signedAuth.length === 0 || !invokeOp) return assembled; - getNonce = async (): Promise => { const { rpcUrl, networkPassphrase } = this.config; + const server = new SorobanRpc.Server(rpcUrl); + const payer = await server.getAccount(payerKeypair.publicKey()); + + const retryTx = new TransactionBuilder(payer, { + fee: BASE_FEE, + networkPassphrase, + }) + // Rebuild the operation so it carries the now-signed entries. + .addOperation(Operation.invokeHostFunction({ + func: invokeOp.func, + auth: signedAuth, + source: invokeOp.source, + })) + .setTimeout(30) + .build(); + + const sim = await server.simulateTransaction(retryTx); + if (SorobanRpc.Api.isSimulationError(sim)) { + throw new Error(`Authorization re-simulation failed: ${sim.error}`); + } - this.setIsPending(true); - this.setError(null); - try { - const address = this.requireAddress(); + return SorobanRpc.assembleTransaction(retryTx, sim).build(); + } - const server = new SorobanRpc.Server(rpcUrl); - const walletContract = new Contract(address); + // ── getNonce ────────────────────────────────────────────────────────────── - const dummyKeypair = Keypair.random(); - const sourceAccount = new Account(dummyKeypair.publicKey(), '0'); + /** + * The wallet contract's current nonce, read through a simulation. Touches no + * state so it can be called from inside another in-flight action. + */ + private readNonce = async (): Promise => { + const { rpcUrl, networkPassphrase } = this.config; + const address = this.requireAddress(); - const tx = new TransactionBuilder(sourceAccount, { - fee: BASE_FEE, - networkPassphrase, - }) - .addOperation(walletContract.call('get_nonce')) - .setTimeout(30) - .build(); + const server = new SorobanRpc.Server(rpcUrl); + const walletContract = new Contract(address); - const sim = await server.simulateTransaction(tx); - if (SorobanRpc.Api.isSimulationError(sim)) { - throw new Error(`Simulation failed: ${sim.error}`); - } + const dummyKeypair = Keypair.random(); + const sourceAccount = new Account(dummyKeypair.publicKey(), '0'); - const result = (sim as SorobanRpc.Api.SimulateTransactionSuccessResponse).result; - if (!result) throw new Error('Simulation returned no result'); + const tx = new TransactionBuilder(sourceAccount, { + fee: BASE_FEE, + networkPassphrase, + }) + .addOperation(walletContract.call('get_nonce')) + .setTimeout(30) + .build(); + + const sim = await server.simulateTransaction(tx); + if (SorobanRpc.Api.isSimulationError(sim)) { + throw new Error(`Simulation failed: ${sim.error}`); + } - const nonce = scValToNative(result.retval) as bigint; - return nonce; + const result = (sim as SorobanRpc.Api.SimulateTransactionSuccessResponse).result; + if (!result) throw new Error('Simulation returned no result'); + return scValToNative(result.retval) as bigint; + }; + + getNonce = async (): Promise => { + this.setIsPending(true); + this.setError(null); + try { + return await this.readNonce(); } catch (err: unknown) { const message = err instanceof Error ? err.message : String(err); this.setError(message); @@ -1301,7 +1385,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission(assembled, signerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1429,7 +1514,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission(assembled, signerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1491,7 +1577,8 @@ export class InvisibleWalletCore { await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission(assembled, signerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1611,7 +1698,8 @@ export class InvisibleWalletCore { // persist the new credential below. await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission(assembled, signerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1698,7 +1786,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission(assembled, guardianKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, guardianKeypair), guardianKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1773,7 +1862,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission(assembled, payerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, payerKeypair), payerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1908,7 +1998,8 @@ export class InvisibleWalletCore { await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission(assembled, payerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, payerKeypair), payerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { throw new Error( @@ -1968,7 +2059,7 @@ export class InvisibleWalletCore { const result = (sim as SorobanRpc.Api.SimulateTransactionSuccessResponse).result; if (!result || !result.retval) throw new Error('Simulation returned no result'); - if (result.retval.switch() === xdr.ScValType.scvVoid()) { + if (result.retval.type === 'scvVoid') { return null; } @@ -2009,7 +2100,7 @@ export class InvisibleWalletCore { let expiryVal: xdr.ScVal; if (expiry !== undefined) { - expiryVal = nativeToScVal([nativeToScVal(BigInt(expiry), { type: 'u64' })], { type: 'Vec' }); + expiryVal = nativeToScVal([nativeToScVal(BigInt(expiry), { type: 'u64' })]); } else { expiryVal = xdr.ScVal.scvVoid(); } @@ -2039,7 +2130,8 @@ export class InvisibleWalletCore { await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission(assembled, signerKeypair, this.config); + const submissionTx = signForSubmission( + await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { diff --git a/sdk/src/deriveFeePayer.ts b/sdk/src/deriveFeePayer.ts index 70c589d8..2c3cfe9c 100644 --- a/sdk/src/deriveFeePayer.ts +++ b/sdk/src/deriveFeePayer.ts @@ -42,7 +42,9 @@ function base64UrlToUint8Array(value: string): Uint8Array { for (let i = 0; i < binary.length; i++) rawId[i] = binary.charCodeAt(i); return rawId; } - return new Uint8Array(Buffer.from(padded, 'base64')); + const nodeBuffer = (globalThis as { Buffer?: { from(data: string, encoding: string): Uint8Array } }).Buffer; + if (nodeBuffer) return new Uint8Array(nodeBuffer.from(padded, 'base64')); + throw new Error('No base64 decoder available: neither atob nor Buffer is present.'); } /** @@ -64,5 +66,5 @@ export async function deriveFeePayerKeypair(credentialIdBase64url: string): Prom 256, // 32 bytes = Ed25519 seed ); - return Keypair.fromRawEd25519Seed(Buffer.from(derived)); + return Keypair.fromRawEd25519Seed(new Uint8Array(derived)); } diff --git a/sdk/src/utils.ts b/sdk/src/utils.ts index 653e3ca7..109d9af3 100644 --- a/sdk/src/utils.ts +++ b/sdk/src/utils.ts @@ -239,39 +239,33 @@ export function computeWalletAddress( // Step 1: Hash the 65-byte public key → 32-byte salt. // The factory contract calls env.crypto().sha256(&public_key_bytes) for the same reason: // Soroban's deployer salt must be exactly 32 bytes (Uint256). - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const salt = (stellarHash as any)(Buffer.from(publicKeyBytes)) as Buffer; + const salt = stellarHash(publicKeyBytes); // Step 2: Hash the network passphrase → 32-byte networkId. // Every Stellar network has a unique passphrase, so contract IDs don't collide // between testnet and mainnet even with identical inputs. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const networkId = (stellarHash as any)(Buffer.from(networkPassphrase)) as Buffer; + const networkId = stellarHash(new TextEncoder().encode(networkPassphrase)); // Step 3: Decode the factory's strkey → raw 32-byte contract hash. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const factoryHash = StrKey.decodeContract(factoryId) as any; + const factoryHash = StrKey.decodeContract(factoryId); // Step 4: Build the XDR preimage that Soroban hashes to derive contract addresses. // This is the canonical HashIdPreimage::ContractId structure from the Stellar XDR spec. // It encodes: "this contract was deployed by with on ". const preimage = xdr.HashIdPreimage.envelopeTypeContractId( new xdr.HashIdPreimageContractId({ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - networkId: networkId as any, + networkId: new xdr.Hash(networkId), contractIdPreimage: xdr.ContractIdPreimage.contractIdPreimageFromAddress( new xdr.ContractIdPreimageFromAddress({ - address: xdr.ScAddress.scAddressTypeContract(factoryHash), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - salt: salt as any, + address: xdr.ScAddress.scAddressTypeContract(new xdr.ContractId(factoryHash)), + salt: new xdr.Uint256Bytes(salt), }) ), }) ); // Step 5: SHA-256 the serialised XDR → 32-byte contract ID. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const contractId = (stellarHash as any)(preimage.toXDR()) as Buffer; + const contractId = stellarHash(preimage.toXdr()); // Step 6: Encode as a Stellar contract strkey ("C..."). return StrKey.encodeContract(contractId); diff --git a/sdk/tests/index.html b/sdk/tests/index.html index 47a5fedb..b1b0b74a 100644 --- a/sdk/tests/index.html +++ b/sdk/tests/index.html @@ -7,8 +7,6 @@

Veil SDK Browser Matrix Test

From 7daafd50d260f02ba76ede47f90447422da25c75 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Wed, 30 Sep 2026 12:28:47 +0100 Subject: [PATCH 04/14] fix(wallet): follow stellar-sdk 17 and let each dependency keep its own copy (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit XDR unions are read as properties instead of switch()/arm() calls, scvMap entries expose .key/.val, a text memo decoded from XDR arrives as bytes, and TransactionBuilder takes a TransactionSource. The signing paths learn the CAP-71 ADDRESS_V2 arm and its WithAddress preimage, matching the sdk. webpack's node_modules prepend is scoped to our own source: it had been applied globally, which forced @blend-capital/blend-sdk onto the wallet's stellar-sdk 17 even though it constructs xdr.UInt128Parts — dropped from protocol 23's XDR, so blend genuinely needs the 16.x copy it pins rather than the shared one. --- frontend/wallet/app/recover/page.tsx | 18 ++++-- frontend/wallet/e2e/_stubs.ts | 11 ++-- frontend/wallet/jest.config.js | 16 +++++ frontend/wallet/jest.setup.ts | 39 ++++++++++++ .../__tests__/sweepContractBalance.test.ts | 43 ++++++------- frontend/wallet/lib/multisig.ts | 2 +- frontend/wallet/lib/recovery.ts | 12 ++-- frontend/wallet/lib/simulate.ts | 28 ++++----- frontend/wallet/lib/sweepContractBalance.ts | 59 +++++++++++------- frontend/wallet/lib/trustlines.ts | 4 +- frontend/wallet/lib/walletConnect.ts | 60 +++++++++++-------- frontend/wallet/next.config.js | 27 ++++++--- frontend/wallet/tests/sep10.test.ts | 14 +++-- 13 files changed, 213 insertions(+), 120 deletions(-) create mode 100644 frontend/wallet/jest.setup.ts diff --git a/frontend/wallet/app/recover/page.tsx b/frontend/wallet/app/recover/page.tsx index ed1ae236..2a450f31 100644 --- a/frontend/wallet/app/recover/page.tsx +++ b/frontend/wallet/app/recover/page.tsx @@ -10,7 +10,7 @@ import { ensureFeePayer, resetFeePayer } from '@/lib/feePayer' import { getNetwork } from '@/lib/network' import { rpc as SorobanRpc, Contract, TransactionBuilder, BASE_FEE, - Account, Keypair, scValToNative, + Account, Keypair, scValToNative, xdr, } from '@stellar/stellar-sdk' import { deriveP256KeyPair } from '@/lib/recovery' import { walletLocal, walletSession } from '@/lib/walletStorage' @@ -65,8 +65,12 @@ export default function RecoverPage() { // get_signers returns Map> → SCV_MAP of (SCV_U32, SCV_BYTES) entries let publicKeys: Uint8Array[] = [] try { - const entries = simResult.retval.map() as Array<{ val: () => { bytes: () => Buffer } }> - publicKeys = entries.map(e => new Uint8Array(e.val().bytes())) + if (simResult.retval.type !== 'scvMap') throw new Error('unexpected return type') + const entries = simResult.retval.map as Array<{ key: xdr.ScVal; val: xdr.ScVal }> + publicKeys = entries.map(e => { + if (e.val.type !== 'scvBytes') throw new Error('unexpected signer value type') + return new Uint8Array(e.val.bytes.toBytes()) + }) } catch { // Fallback: scValToNative handles all possible return shapes const raw = scValToNative(simResult.retval) @@ -207,8 +211,12 @@ export default function RecoverPage() { let publicKeys: Uint8Array[] = [] try { - const entries = simResult.retval.map() as Array<{ val: () => { bytes: () => Buffer } }> - publicKeys = entries.map(e => new Uint8Array(e.val().bytes())) + if (simResult.retval.type !== 'scvMap') throw new Error('unexpected return type') + const entries = simResult.retval.map as Array<{ key: xdr.ScVal; val: xdr.ScVal }> + publicKeys = entries.map(e => { + if (e.val.type !== 'scvBytes') throw new Error('unexpected signer value type') + return new Uint8Array(e.val.bytes.toBytes()) + }) } catch { const raw = scValToNative(simResult.retval) if (Array.isArray(raw)) { diff --git a/frontend/wallet/e2e/_stubs.ts b/frontend/wallet/e2e/_stubs.ts index 9e2b97cc..a5b1721a 100644 --- a/frontend/wallet/e2e/_stubs.ts +++ b/frontend/wallet/e2e/_stubs.ts @@ -34,7 +34,7 @@ const FAKE_TX_HASH = 'a'.repeat(64) /** Minimal-but-valid Soroban footprint, enough for `assembleTransaction`. */ function transactionDataXdr(): string { return new xdr.SorobanTransactionData({ - ext: new xdr.SorobanTransactionDataExt(0), + ext: xdr.SorobanTransactionDataExt.v0(), resources: new xdr.SorobanResources({ footprint: new xdr.LedgerFootprint({ readOnly: [], readWrite: [] }), instructions: 0, @@ -49,20 +49,19 @@ function successResultXdr(): string { return new xdr.TransactionResult({ feeCharged: xdr.Int64.fromString('100'), result: xdr.TransactionResultResult.txSuccess([]), - ext: new xdr.TransactionResultExt(0), + ext: xdr.TransactionResultExt.v0(), }).toXDR('base64') } function successMetaXdr(): string { - return new xdr.TransactionMeta( - 3, + return xdr.TransactionMeta.v3( new xdr.TransactionMetaV3({ - ext: new xdr.ExtensionPoint(0), + ext: xdr.ExtensionPoint.v0(), txChangesBefore: [], operations: [], txChangesAfter: [], sorobanMeta: new xdr.SorobanTransactionMeta({ - ext: new xdr.SorobanTransactionMetaExt(0), + ext: xdr.SorobanTransactionMetaExt.v0(), events: [], returnValue: xdr.ScVal.scvVoid(), diagnosticEvents: [], diff --git a/frontend/wallet/jest.config.js b/frontend/wallet/jest.config.js index 45f23a0b..40cd2f9b 100644 --- a/frontend/wallet/jest.config.js +++ b/frontend/wallet/jest.config.js @@ -13,7 +13,19 @@ const config = { allowSyntheticDefaultImports: true, }, }], + // stellar-sdk 17's runtime deps (@exodus/bytes, @noble/*, uint8array-extras, + // smol-toml) and @scure/bip39 2.x are ESM-only; babel-jest converts them to + // CJS. Config is inline (babelrc/configFile off) so no root babel config can + // leak into the Next build. + '^.+\\.jsx?$': ['babel-jest', { + configFile: false, + babelrc: false, + presets: [['@babel/preset-env', { targets: { node: 'current' }, modules: 'commonjs' }]], + }], }, + transformIgnorePatterns: [ + '[\\\\/]node_modules[\\\\/](?!.*(@exodus|@noble|uint8array-extras|smol-toml|@scure)[\\\\/])', + ], // SDK source (compiled from ../../sdk/src) imports @stellar/stellar-sdk and // friends, but its sibling sdk/node_modules isn't installed in the wallet CI // job. Add the wallet's node_modules to the resolver search path (the jest @@ -34,6 +46,10 @@ const config = { '^@veil/sep7$': '/../../sdk/src/sep7', '^@veil/prf$': '/../../sdk/src/crypto/prf', }, + // jsdom lacks TextEncoder/TextDecoder; the polyfills they need are installed + // before any module loads, because uint8array-extras caches a TextEncoder at + // import time and stellar-sdk 17 tests `instanceof Uint8Array` on its output. + setupFiles: ['/jest.setup.ts'], setupFilesAfterEnv: [], collectCoverageFrom: [ 'lib/**/*.ts', diff --git a/frontend/wallet/jest.setup.ts b/frontend/wallet/jest.setup.ts new file mode 100644 index 00000000..e6edc899 --- /dev/null +++ b/frontend/wallet/jest.setup.ts @@ -0,0 +1,39 @@ +// jest.setup.ts — polyfills for the jsdom test environment +// +// jsdom does not ship TextEncoder/TextDecoder. Node's implementations (from +// 'util') must be installed as-is: @exodus/bytes probes `String(TextEncoder)` +// for '[native code]' to select its native code paths and calls +// TextDecoder.decode() with Uint16Array input (UTF-16 code units), so wrapper +// shims silently corrupt base32/strkey output. The one cross-realm hazard — +// Node's encode() returning a Node-realm Uint8Array, which fails +// `instanceof Uint8Array` in the jsdom realm (stellar-sdk 17's BytesValue and +// uint8array-extras depend on it) — is fixed by rewrapping encode()'s result +// on the prototype, keeping the class itself native. +import { TextEncoder, TextDecoder } from 'util' + +Object.defineProperty(globalThis, 'TextEncoder', { + value: TextEncoder, + writable: true, + configurable: true, +}) +Object.defineProperty(globalThis, 'TextDecoder', { + value: TextDecoder, + writable: true, + configurable: true, +}) + +const nativeEncode = TextEncoder.prototype.encode +TextEncoder.prototype.encode = function (source = '') { + return Uint8Array.from(nativeEncode.call(this, source)) +} + +// jsdom does not expose crypto.subtle — polyfill with Node's webcrypto implementation. +import { webcrypto } from 'crypto' + +if (!globalThis.crypto || !globalThis.crypto.subtle) { + Object.defineProperty(globalThis, 'crypto', { + value: webcrypto, + writable: true, + configurable: true, + }) +} diff --git a/frontend/wallet/lib/__tests__/sweepContractBalance.test.ts b/frontend/wallet/lib/__tests__/sweepContractBalance.test.ts index 5b0436cf..02bb5f03 100644 --- a/frontend/wallet/lib/__tests__/sweepContractBalance.test.ts +++ b/frontend/wallet/lib/__tests__/sweepContractBalance.test.ts @@ -78,7 +78,8 @@ function makeSimError(message = 'contract error') { return { error: message, latestLedger: 100 } } -// Mock auth entry with the structure sweepContractBalance reads +// Mock auth entry with the structure sweepContractBalance reads. v17 exposes +// XDR union arms as readonly properties, not accessor methods. function makeMockAuthEntry() { const contractFn = new sdk.xdr.InvokeContractArgs({ contractAddress: sdk.Address.fromString(CONTRACT_ADDRESS).toScAddress(), @@ -91,24 +92,17 @@ function makeMockAuthEntry() { subInvocations: [], }) - const entry = { - credentials: jest.fn(), - rootInvocation: jest.fn().mockReturnValue(invocation), + return { + credentials: { + type: 'sorobanCredentialsAddress', + address: { + address: sdk.Address.fromString(CONTRACT_ADDRESS).toScAddress(), + nonce: 0n, + signatureExpirationLedger: 0, + }, + }, + rootInvocation: invocation, } - entry.credentials.mockImplementation((newCred?: unknown) => { - if (newCred === undefined) { - return { - switch: () => ({ value: 1 }), // SOROBAN_CREDENTIALS_ADDRESS = 1 - address: () => ({ - address: () => ({}), - nonce: () => 0n, - signatureExpirationLedger: () => 0, - }), - } - } - // setter invocation — intentional no-op - }) - return entry } const mockAssembled = { sign: jest.fn() } @@ -147,13 +141,12 @@ describe('sweepContractBalance', () => { const mockSimulate = jest.fn().mockImplementation(async (tx: any, ...args: any[]) => { let isProbe = false try { - if (tx && tx.operations && tx.operations[0]) { - const op = tx.operations[0] - // Log details of the operation to see its structure - console.log('[mockSimulate] op type:', op.type, 'func:', op.func?.invokeContract?.()?.functionName?.()?.toString()) - const fnName = op.func?.invokeContract?.()?.functionName?.()?.toString() - isProbe = (fnName === 'get_nonce') - } + // v17: the invoke-host-function operation carries a HostFunction union + // whose arm is read as a property, not called as an accessor. + const func = tx?.operations?.[0]?.func + isProbe = + func?.type === 'hostFunctionTypeInvokeContract' && + func.invokeContract.functionName.toString() === 'get_nonce' } catch (err) { console.log('[mockSimulate] error parsing op:', err) } diff --git a/frontend/wallet/lib/multisig.ts b/frontend/wallet/lib/multisig.ts index d36055df..a6f8b279 100644 --- a/frontend/wallet/lib/multisig.ts +++ b/frontend/wallet/lib/multisig.ts @@ -131,7 +131,7 @@ export async function deployAndInitMultisig(params: { const multisigContract = new Contract(contractId); const initAccount = await server.getAccount(feePayer.publicKey()); - const ownersScVal = nativeToScVal(params.owners.map(addr => nativeToScVal(addr, { type: 'address' })), { type: 'vec' }); + const ownersScVal = nativeToScVal(params.owners.map(addr => nativeToScVal(addr, { type: 'address' }))); const initTx = new TransactionBuilder(initAccount, { fee: inclusionFee(), networkPassphrase: NETWORK_PASSPHRASE }) .addOperation(multisigContract.call( diff --git a/frontend/wallet/lib/recovery.ts b/frontend/wallet/lib/recovery.ts index cb4c07e1..934f41d5 100644 --- a/frontend/wallet/lib/recovery.ts +++ b/frontend/wallet/lib/recovery.ts @@ -1,7 +1,7 @@ import * as bip39 from '@scure/bip39'; -import { wordlist } from '@scure/bip39/wordlists/english'; -import { p256 } from '@noble/curves/nist'; -import { sha256 } from '@noble/hashes/sha256'; +import { wordlist } from '@scure/bip39/wordlists/english.js'; +import { p256 } from '@noble/curves/nist.js'; +import { sha256 } from '@noble/hashes/sha2.js'; import { hexToUint8Array } from '@veil/utils'; import { Sep30Client, @@ -25,8 +25,7 @@ export function deriveP256KeyPair(mnemonic: string): { privateKey: Uint8Array; p } export function signWithP256(payload: Uint8Array, privateKey: Uint8Array): Uint8Array { - const sig = p256.sign(payload, privateKey); - return sig.toCompactRawBytes(); + return p256.sign(payload, privateKey); } // Custom base64 helpers for browser compatibility without Buffer @@ -233,8 +232,7 @@ export function generateRecoveryWebAuthnSignature( message.set(clientDataHash, authData.length); const messageHash = sha256(message); - const sig = p256.sign(messageHash, privateKey); - const signature = sig.toCompactRawBytes(); + const signature = p256.sign(messageHash, privateKey); return { publicKey, diff --git a/frontend/wallet/lib/simulate.ts b/frontend/wallet/lib/simulate.ts index 353d1ba6..eb170ca5 100644 --- a/frontend/wallet/lib/simulate.ts +++ b/frontend/wallet/lib/simulate.ts @@ -158,12 +158,12 @@ export function extractInvocation( try { const func = op.func - if (func.switch().name !== 'hostFunctionTypeInvokeContract') return null - const ic = func.invokeContract() + if (func.type !== 'hostFunctionTypeInvokeContract') return null + const ic = func.invokeContract return { - contractId: Address.fromScAddress(ic.contractAddress()).toString(), - functionName: ic.functionName().toString(), - args: ic.args(), + contractId: Address.fromScAddress(ic.contractAddress).toString(), + functionName: ic.functionName.toString(), + args: ic.args, } } catch { return null @@ -175,16 +175,16 @@ export function decodeEvents(events: xdr.DiagnosticEvent[]): DecodedEvent[] { const decoded: DecodedEvent[] = [] for (const diagnostic of events) { try { - const event = diagnostic.event() - const contractIdBuf = event.contractId() - const body = event.body().v0() + const event = diagnostic.event + const contractId = event.contractId + const body = event.body + if (body.type !== 'v0') continue + const v0 = body.v0 decoded.push({ - type: event.type().name, - contractId: contractIdBuf - ? StrKey.encodeContract(contractIdBuf as unknown as Buffer) - : null, - topics: body.topics().map(safeScValToNative), - data: safeScValToNative(body.data()), + type: event.type.name, + contractId: contractId ? StrKey.encodeContract(contractId.toBytes()) : null, + topics: v0.topics.map(safeScValToNative), + data: safeScValToNative(v0.data), }) } catch { // Skip events we cannot decode rather than failing the whole preview. diff --git a/frontend/wallet/lib/sweepContractBalance.ts b/frontend/wallet/lib/sweepContractBalance.ts index 65a989d9..ac08d8db 100644 --- a/frontend/wallet/lib/sweepContractBalance.ts +++ b/frontend/wallet/lib/sweepContractBalance.ts @@ -201,23 +201,33 @@ export async function sweepContractBalance( await crypto.subtle.digest('SHA-256', new TextEncoder().encode(networkPassphrase)) ) - for (const parsed of authEntries) { - const cred = parsed.credentials() - if (cred.switch().value !== xdr.SorobanCredentialsType.sorobanCredentialsAddress().value) { + for (let i = 0; i < authEntries.length; i++) { + const parsed = authEntries[i] + const cred = parsed.credentials + const isV2 = cred.type === 'sorobanCredentialsAddressV2' + if (!isV2 && cred.type !== 'sorobanCredentialsAddress') { continue } - const addrCred = cred.address() - const preimage = xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( - new xdr.HashIdPreimageSorobanAuthorization({ - networkId: Buffer.from(networkIdBytes), - nonce: addrCred.nonce(), - invocation: parsed.rootInvocation(), - signatureExpirationLedger: validUntilLedger, - }) - ) + const addrCred = isV2 ? cred.addressV2 : cred.address + const shared = { + networkId: new xdr.Hash(networkIdBytes), + nonce: addrCred.nonce, + invocation: parsed.rootInvocation, + signatureExpirationLedger: validUntilLedger, + } + // CAP-71 binds the authorising address into the payload, so an ADDRESS_V2 + // entry has to be signed over the WithAddress preimage — signing the legacy + // one produces a signature the host rejects. + const preimage = isV2 + ? xdr.HashIdPreimage.envelopeTypeSorobanAuthorizationWithAddress( + new xdr.HashIdPreimageSorobanAuthorizationWithAddress({ ...shared, address: addrCred.address }) + ) + : xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( + new xdr.HashIdPreimageSorobanAuthorization(shared) + ) const payloadHash = new Uint8Array( - await crypto.subtle.digest('SHA-256', new Uint8Array(preimage.toXDR())) + await crypto.subtle.digest('SHA-256', preimage.toXDR().buffer as ArrayBuffer) ) const webAuthnSig = (await signAuthEntry(payloadHash)) as any @@ -234,16 +244,19 @@ export async function sweepContractBalance( } const sigVec = xdr.ScVal.scvVec(sigElements) - parsed.credentials( - xdr.SorobanCredentials.sorobanCredentialsAddress( - new xdr.SorobanAddressCredentials({ - address: addrCred.address(), - nonce: addrCred.nonce(), - signatureExpirationLedger: validUntilLedger, - signature: sigVec, - }) - ) - ) + const addressCredentials = new xdr.SorobanAddressCredentials({ + address: addrCred.address, + nonce: addrCred.nonce, + signatureExpirationLedger: validUntilLedger, + signature: sigVec, + }) + + authEntries[i] = new xdr.SorobanAuthorizationEntry({ + credentials: isV2 + ? xdr.SorobanCredentials.sorobanCredentialsAddressV2(addressCredentials) + : xdr.SorobanCredentials.sorobanCredentialsAddress(addressCredentials), + rootInvocation: parsed.rootInvocation, + }) } } diff --git a/frontend/wallet/lib/trustlines.ts b/frontend/wallet/lib/trustlines.ts index ad419d53..c196ab3a 100644 --- a/frontend/wallet/lib/trustlines.ts +++ b/frontend/wallet/lib/trustlines.ts @@ -5,8 +5,8 @@ import { Operation, StellarToml, TransactionBuilder, - type Account, type Transaction, + type TransactionSource, } from '@stellar/stellar-sdk' /** @@ -83,7 +83,7 @@ export function canRemoveTrustline(trustline: Trustline): boolean { * `limit`, when provided). The returned transaction still needs to be signed. */ export function buildChangeTrustTx(params: { - account: Account + account: TransactionSource networkPassphrase: string code: string issuer: string diff --git a/frontend/wallet/lib/walletConnect.ts b/frontend/wallet/lib/walletConnect.ts index 2f6de1fa..f8aa2897 100644 --- a/frontend/wallet/lib/walletConnect.ts +++ b/frontend/wallet/lib/walletConnect.ts @@ -255,14 +255,16 @@ async function signXdrPayload( await crypto.subtle.digest('SHA-256', new TextEncoder().encode(network.networkPassphrase)), ) - for (const parsed of authEntries) { - const cred = parsed.credentials() - if (cred.switch().value !== xdr.SorobanCredentialsType.sorobanCredentialsAddress().value) { + for (let i = 0; i < authEntries.length; i++) { + const parsed = authEntries[i] + const cred = parsed.credentials + const isV2 = cred.type === 'sorobanCredentialsAddressV2' + if (!isV2 && cred.type !== 'sorobanCredentialsAddress') { continue } - const addrCred = cred.address() - const contractAddr = Address.fromScAddress(addrCred.address()).toString() + const addrCred = isV2 ? cred.addressV2 : cred.address + const contractAddr = Address.fromScAddress(addrCred.address).toString() // A dApp can only be answered by a contract that exists: `__check_auth` // runs on chain. Wallets are deployed on first use now, so stop here with @@ -276,16 +278,23 @@ async function signXdrPayload( } const currentNonce = await getWalletNonce(rpc, contractAddr, network.networkPassphrase) - const preimage = xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( - new xdr.HashIdPreimageSorobanAuthorization({ - networkId: Buffer.from(networkIdBytes), - nonce: addrCred.nonce(), - invocation: parsed.rootInvocation(), - signatureExpirationLedger: validUntilLedger, - }), - ) + const shared = { + networkId: new xdr.Hash(networkIdBytes), + nonce: addrCred.nonce, + invocation: parsed.rootInvocation, + signatureExpirationLedger: validUntilLedger, + } + // CAP-71 (protocol 23) binds the authorising address into the payload, so + // an ADDRESS_V2 entry must be signed over the WithAddress preimage. + const preimage = isV2 + ? xdr.HashIdPreimage.envelopeTypeSorobanAuthorizationWithAddress( + new xdr.HashIdPreimageSorobanAuthorizationWithAddress({ ...shared, address: addrCred.address }), + ) + : xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( + new xdr.HashIdPreimageSorobanAuthorization(shared), + ) const payloadHash = new Uint8Array( - await crypto.subtle.digest('SHA-256', new Uint8Array(preimage.toXDR())), + await crypto.subtle.digest('SHA-256', preimage.toXDR().buffer as ArrayBuffer), ) const webAuthnSig = await signAuthEntry(payloadHash) @@ -304,16 +313,19 @@ async function signXdrPayload( } const sigVec = xdr.ScVal.scvVec(sigElements) - parsed.credentials( - xdr.SorobanCredentials.sorobanCredentialsAddress( - new xdr.SorobanAddressCredentials({ - address: addrCred.address(), - nonce: addrCred.nonce(), - signatureExpirationLedger: validUntilLedger, - signature: sigVec, - }), - ), - ) + const addressCredentials = new xdr.SorobanAddressCredentials({ + address: addrCred.address, + nonce: addrCred.nonce, + signatureExpirationLedger: validUntilLedger, + signature: sigVec, + }) + + authEntries[i] = new xdr.SorobanAuthorizationEntry({ + credentials: isV2 + ? xdr.SorobanCredentials.sorobanCredentialsAddressV2(addressCredentials) + : xdr.SorobanCredentials.sorobanCredentialsAddress(addressCredentials), + rootInvocation: parsed.rootInvocation, + }) } } diff --git a/frontend/wallet/next.config.js b/frontend/wallet/next.config.js index afa82f9f..d3bcdc65 100644 --- a/frontend/wallet/next.config.js +++ b/frontend/wallet/next.config.js @@ -83,14 +83,25 @@ const nextConfig = { ] }, webpack: (config) => { - // When webpack compiles SDK source files from ../../sdk/src/, it resolves - // node_modules going up from that directory and misses the wallet's - // node_modules. Prepend wallet's node_modules so imports like - // @stellar/stellar-sdk resolve correctly regardless of the importer's path. - config.resolve.modules = [ - path.resolve(__dirname, 'node_modules'), - ...config.resolve.modules, - ] + // When webpack compiles SDK source files from ../../sdk/src/ (or the agent + // source from ../../packages/), it resolves node_modules going up from those + // directories and misses the wallet's node_modules. Prepend it for requests + // issued from our own code so imports like @stellar/stellar-sdk resolve + // regardless of the importer's path. + // + // Dependencies are deliberately excluded: a global prepend would also force + // them onto the wallet's single hoisted copy, and they cannot all share one — + // @blend-capital/blend-sdk is built for stellar-sdk 16 (it constructs + // xdr.UInt128Parts, which protocol 23's XDR dropped) and @scure/bip39 needs + // @noble/hashes 1.x while stellar-sdk 17 needs 2.x. Both install their own + // nested copy, which plain node-style resolution up from their own folder + // finds. + config.module.rules.push({ + issuer: { not: /[\\/]node_modules[\\/]/ }, + resolve: { + modules: [path.resolve(__dirname, 'node_modules'), 'node_modules'], + }, + }) // The agent package (packages/agent) is ESM TypeScript that imports its own // modules as './network.js' — the extension TypeScript emits. When webpack // compiles that source directly, those files only exist as .ts; try .ts first. diff --git a/frontend/wallet/tests/sep10.test.ts b/frontend/wallet/tests/sep10.test.ts index bc5000f2..7d5492d7 100644 --- a/frontend/wallet/tests/sep10.test.ts +++ b/frontend/wallet/tests/sep10.test.ts @@ -56,12 +56,16 @@ function buildChallenge({ // SEP-10 requires sequence 0 and the anchor's key as source. const account = new Account(anchorKeypair.publicKey(), '-1') + const maxTime = nowSec + maxTimeOffsetSec + const builder = new TransactionBuilder(account, { fee: '100', networkPassphrase, + // A negative offset models an expired challenge, and v17's builder rejects + // minTime > maxTime, so the window has to start no later than it ends. timebounds: { - minTime: nowSec, - maxTime: nowSec + maxTimeOffsetSec, + minTime: Math.min(nowSec, maxTime), + maxTime, }, }) @@ -98,7 +102,7 @@ function signersFromXdr(xdr: string, networkPassphrase: string): string[] { return tx.signatures.map(sig => { // Each DecoratedSignature contains a 4-byte hint. We match against all // known keypairs in the fixture set to identify the actual signer. - return Buffer.from(sig.hint()).toString('hex') + return Buffer.from(sig.hint.toBytes()).toString('hex') }) } @@ -150,7 +154,7 @@ describe('signSep10Challenge', () => { // cloneFrom resets signatures on the rebuilt tx, then we add one expect(signed.signatures).toHaveLength(1) // The hint must match the user keypair's public key hint - const hint = Buffer.from(signed.signatures[0].hint()).toString('hex') + const hint = Buffer.from(signed.signatures[0].hint.toBytes()).toString('hex') const expectedHint = Buffer.from(USER_KP.rawPublicKey().slice(28)).toString('hex') expect(hint).toBe(expectedHint) // The original count is informational — we log it to confirm fixture shape @@ -276,7 +280,7 @@ describe('signSep10Challenge', () => { const tx = new Transaction(signedXdr, PASSPHRASE) const expectedHint = Buffer.from(USER_KP.rawPublicKey().slice(28)).toString('hex') - const hints = tx.signatures.map(s => Buffer.from(s.hint()).toString('hex')) + const hints = tx.signatures.map(s => Buffer.from(s.hint.toBytes()).toString('hex')) expect(hints).toContain(expectedHint) }) }) From 19d5c12802ad60f36965abb03c69d5f7899aa925 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Wed, 30 Sep 2026 12:30:22 +0100 Subject: [PATCH 05/14] fix(mobile): read stellar-sdk 17 XDR and byte memos (#660) Transaction-result decoding moves from switch()/arm() calls to the property-style unions, the wallet signer map reads .val.bytes directly, fee-bump envelopes are unwrapped as .v1.tx.operations, and a text memo parsed from XDR is decoded from bytes instead of String()-ed into "7,8,9". The Jest transform allow-list gains the ESM-only packages stellar-sdk 17 requires. --- frontend/mobile/jest.config.js | 9 +-- .../mobile/lib/__tests__/recovery.test.ts | 2 +- .../lib/__tests__/signXdrPayload.test.ts | 66 +++++++++++------ frontend/mobile/lib/agentMessages.ts | 16 ++++- frontend/mobile/lib/networkErrors.ts | 20 +++--- frontend/mobile/lib/recovery.ts | 6 +- frontend/mobile/lib/sorobanTx.ts | 8 ++- frontend/mobile/lib/walletConnect.ts | 71 +++++++++++-------- 8 files changed, 126 insertions(+), 72 deletions(-) diff --git a/frontend/mobile/jest.config.js b/frontend/mobile/jest.config.js index 7c457fd7..badae39b 100644 --- a/frontend/mobile/jest.config.js +++ b/frontend/mobile/jest.config.js @@ -4,9 +4,10 @@ const expoPreset = require('jest-expo/jest-preset'); * Jest setup for the mobile app. * * `jest-expo` supplies the React Native transform, module mocks, and test - * environment. The only change is the transform allow-list: `@noble/ciphers` and - * `@noble/hashes` ship ESM only, and Jest cannot `require` them untransformed. - * Metro handles them natively, so this affects tests alone. + * environment. The only change is the transform allow-list: `@noble/ciphers`, + * `@noble/hashes`, and — since stellar-sdk 17 — `@exodus/bytes`, + * `uint8array-extras`, and `smol-toml` ship ESM only, and Jest cannot `require` + * them untransformed. Metro handles them natively, so this affects tests alone. * * `setupFiles` appends `jest.setup.js` to the preset's own setup files rather * than replacing them, so the React Native and Expo environment stubs still @@ -16,6 +17,6 @@ module.exports = { ...expoPreset, setupFiles: [...expoPreset.setupFiles, '/jest.setup.js'], transformIgnorePatterns: expoPreset.transformIgnorePatterns.map((pattern) => - pattern.startsWith('/node_modules/(?!(') ? pattern.replace('(?!(', '(?!(@noble|') : pattern + pattern.startsWith('/node_modules/(?!(') ? pattern.replace('(?!(', '(?!(@noble|@exodus|uint8array-extras|smol-toml|') : pattern ), }; diff --git a/frontend/mobile/lib/__tests__/recovery.test.ts b/frontend/mobile/lib/__tests__/recovery.test.ts index f9cadbdc..0a09aaf1 100644 --- a/frontend/mobile/lib/__tests__/recovery.test.ts +++ b/frontend/mobile/lib/__tests__/recovery.test.ts @@ -321,7 +321,7 @@ describe('attachRecoverySignatures', () => { const unsigned = tx.toXDR(); tx.sign(keypair); - const signature = tx.signatures[0]!.signature().toString('base64'); + const signature = Buffer.from(tx.signatures[0]!.signature.toBytes()).toString('base64'); return { xdr: unsigned, signerKey: keypair.publicKey(), signature }; } diff --git a/frontend/mobile/lib/__tests__/signXdrPayload.test.ts b/frontend/mobile/lib/__tests__/signXdrPayload.test.ts index 268e6405..ac89f45d 100644 --- a/frontend/mobile/lib/__tests__/signXdrPayload.test.ts +++ b/frontend/mobile/lib/__tests__/signXdrPayload.test.ts @@ -147,7 +147,7 @@ function contractInstanceKey(contractId: string): xdr.LedgerKey { new xdr.LedgerKeyContractData({ contract: Address.fromString(contractId).toScAddress(), key: xdr.ScVal.scvLedgerKeyContractInstance(), - durability: xdr.ContractDataDurability.persistent(), + durability: xdr.ContractDataDurability.persistent, }), ); } @@ -202,13 +202,17 @@ let simulations: { kind: 'recording' | 'nonce' | 'enforce' }[]; function invokedFunctionName(tx: Transaction): string { const op = tx.operations[0] as Operation.InvokeHostFunction; - return op.func.invokeContract().functionName().toString(); + if (op.func.type !== 'hostFunctionTypeInvokeContract') { + throw new Error('unexpected host function'); + } + return op.func.invokeContract.functionName.toString(); } function isSigned(tx: Transaction): boolean { const op = tx.operations[0] as Operation.InvokeHostFunction; return (op.auth ?? []).some( - (entry) => entry.credentials().address().signature().switch().name !== 'scvVoid', + (entry) => entry.credentials.type === 'sorobanCredentialsAddress' + && entry.credentials.address.signature.type !== 'scvVoid', ); } @@ -271,11 +275,22 @@ function hostOp(tx: Transaction): Operation.InvokeHostFunction { function walletCredentials(tx: Transaction): xdr.SorobanAddressCredentials { const auth = hostOp(tx).auth ?? []; expect(auth).toHaveLength(1); - return auth[0].credentials().address(); + const cred = auth[0].credentials; + if (cred.type !== 'sorobanCredentialsAddress') { + throw new Error('expected address credentials'); + } + return cred.address; } function signatureVector(tx: Transaction): xdr.ScVal[] { - return walletCredentials(tx).signature().vec() ?? []; + const sig = walletCredentials(tx).signature; + if (sig.type !== 'scvVec') return []; + return sig.vec ?? []; +} + +function scBytes(v: xdr.ScVal): Uint8Array { + if (v.type !== 'scvBytes') throw new Error(`expected scvBytes, got ${v.type}`); + return v.bytes.toBytes(); } beforeAll(() => { @@ -291,7 +306,11 @@ beforeEach(() => { ); jest .spyOn(SorobanRpc.Server.prototype, 'getLatestLedger') - .mockResolvedValue({ id: 'x', protocolVersion: '22', sequence: LATEST_LEDGER }); + .mockResolvedValue({ + id: 'x', + protocolVersion: '22', + sequence: LATEST_LEDGER, + } as unknown as SorobanRpc.Api.GetLatestLedgerResponse); jest .spyOn(SorobanRpc.Server.prototype, 'getAccount') .mockImplementation(async (id: string) => new Account(id, FEE_PAYER_SEQUENCE)); @@ -321,8 +340,8 @@ describe('requirement 1: the host function', () => { const output = await sign_(); const credentials = walletCredentials(output); - expect(Address.fromScAddress(credentials.address()).toString()).toBe(WALLET); - expect(credentials.signature().switch().name).toBe('scvVec'); + expect(Address.fromScAddress(credentials.address).toString()).toBe(WALLET); + expect(credentials.signature.type).toBe('scvVec'); }); }); @@ -344,9 +363,9 @@ describe('requirement 2: a low-S signature', () => { it('puts a low-S signature in the credential, still valid for the passkey', async () => { const vector = signatureVector(await sign_()); - const authData = Buffer.from(vector[1].bytes()); - const clientDataJSON = Buffer.from(vector[2].bytes()); - const signature = Buffer.from(vector[3].bytes()); + const authData = Buffer.from(scBytes(vector[1])); + const clientDataJSON = Buffer.from(scBytes(vector[2])); + const signature = Buffer.from(scBytes(vector[3])); expect(signature).toHaveLength(64); const s = BigInt(`0x${signature.subarray(32).toString('hex')}`); @@ -370,7 +389,7 @@ describe('requirement 3: an expiration ledger', () => { it('sets a future expiration on the credential', async () => { const credentials = walletCredentials(await sign_()); - expect(credentials.signatureExpirationLedger()).toBe(LATEST_LEDGER + 100); + expect(credentials.signatureExpirationLedger).toBe(LATEST_LEDGER + 100); }); it('signs the same expiration it attaches', async () => { @@ -380,13 +399,13 @@ describe('requirement 3: an expiration ledger', () => { const preimage = xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( new xdr.HashIdPreimageSorobanAuthorization({ networkId: hash(Buffer.from(Networks.TESTNET)), - nonce: credentials.nonce(), - invocation: (hostOp(output).auth ?? [])[0].rootInvocation(), - signatureExpirationLedger: credentials.signatureExpirationLedger(), + nonce: credentials.nonce, + invocation: (hostOp(output).auth ?? [])[0].rootInvocation, + signatureExpirationLedger: credentials.signatureExpirationLedger, }), ); // What the host will compute is what the passkey must have been asked to sign. - const expectedChallenge = hash(preimage.toXDR()).toString('base64url'); + const expectedChallenge = Buffer.from(hash(preimage.toXDR())).toString('base64url'); expect(mockCeremonies[0].challenge).toBe(expectedChallenge); }); @@ -408,11 +427,14 @@ describe('requirement 4: a footprint from re-simulation', () => { it('assembles with the enforce-mode footprint, which includes the wallet', async () => { const output = await sign_(); - const data = output.toEnvelope().v1().tx().ext().sorobanData(); - const readOnly = data.resources().footprint().readOnly().map((key) => key.toXDR('base64')); + const envelope = output.toEnvelope(); + if (envelope.type !== 'envelopeTypeTx') throw new Error('unexpected envelope'); + if (envelope.v1.tx.ext.type !== 'sorobanData') throw new Error('unexpected ext'); + const data = envelope.v1.tx.ext.sorobanData; + const readOnly = data.resources.footprint.readOnly.map((key) => key.toXDR('base64')); expect(readOnly).toContain(contractInstanceKey(WALLET).toXDR('base64')); - expect(data.resourceFee().toString()).toBe('90000'); + expect(data.resourceFee.toString()).toBe('90000'); }); }); @@ -434,7 +456,7 @@ describe('requirement 5: the right sequence', () => { const output = await sign_(); expect(output.signatures).toHaveLength(1); - expect(FEE_PAYER.verify(output.hash(), output.signatures[0].signature())).toBe(true); + expect(FEE_PAYER.verify(output.hash(), output.signatures[0].signature.toBytes())).toBe(true); }); }); @@ -450,8 +472,8 @@ describe('requirement 6: a 5-element signature vector', () => { const vector = signatureVector(await sign_()); expect(vector).toHaveLength(5); - expect(Buffer.from(vector[0].bytes())).toEqual(Buffer.from(mockPasskeyPublicKey)); - expect(vector[4].switch().name).toBe('scvU64'); + expect(Buffer.from(scBytes(vector[0]))).toEqual(Buffer.from(mockPasskeyPublicKey)); + expect(vector[4].type).toBe('scvU64'); expect(scValToNative(vector[4])).toBe(WALLET_NONCE); }); diff --git a/frontend/mobile/lib/agentMessages.ts b/frontend/mobile/lib/agentMessages.ts index 933b5f94..e04b6402 100644 --- a/frontend/mobile/lib/agentMessages.ts +++ b/frontend/mobile/lib/agentMessages.ts @@ -1,4 +1,4 @@ -import { Asset, Operation, TransactionBuilder, type Transaction } from '@stellar/stellar-sdk'; +import { Asset, Operation, TransactionBuilder, type Memo, type OperationRecord, type Transaction } from '@stellar/stellar-sdk'; /** * The agent conversation's data model: what the assistant can say, and what a @@ -114,7 +114,7 @@ function describeAsset(asset: Asset): string { } /** One line per operation, in the terms the user cares about. */ -function describeOperation(operation: Operation): { text: string; known: boolean } { +function describeOperation(operation: OperationRecord): { text: string; known: boolean } { switch (operation.type) { case 'payment': return { @@ -171,12 +171,22 @@ export function reviewProposedTransaction( return { source: tx.source, fee: tx.fee, - memo: tx.memo?.value ? String(tx.memo.value) : null, + memo: memoToString(tx.memo), operations: described.map((operation) => operation.text), hasUnknownOperation: described.some((operation) => !operation.known), }; } +/** + * A text memo parsed out of XDR arrives as raw bytes; one built in this session + * keeps its original string. Both are shown as the text the sender meant. + */ +function memoToString(memo: Memo | undefined): string | null { + const value = memo?.value; + if (value === undefined || value === null) return null; + return typeof value === 'string' ? value : new TextDecoder().decode(value); +} + /** * Whether the transaction is one this device can legitimately sign: the source * account must be the wallet's own fee payer. Anything else is a transaction the diff --git a/frontend/mobile/lib/networkErrors.ts b/frontend/mobile/lib/networkErrors.ts index 169b07de..2583bba9 100644 --- a/frontend/mobile/lib/networkErrors.ts +++ b/frontend/mobile/lib/networkErrors.ts @@ -55,16 +55,16 @@ const HOST_FUNCTION_RESULTS: Record = { export function rejectionFromResult(result: xdr.TransactionResult | undefined | null): string { if (!result) return FALLBACK; try { - const outcome = result.result(); - const code = snake(outcome.switch().name); - - if (code === 'tx_failed') { - for (const op of outcome.results()) { - if (op.switch().name !== 'opInner') continue; - const tr = op.tr(); - const armName = tr.switch().name; // e.g. 'invokeHostFunction', 'payment' - const inner = (tr as unknown as Record { switch(): { name: string } }>)[`${armName}Result`]?.(); - const innerName = inner?.switch().name; + const outcome = result.result; + const code = snake(outcome.type); + + if (outcome.type === 'txFailed') { + for (const op of outcome.results) { + if (op.type !== 'opInner') continue; + const tr = op.tr; + const armName = tr.type; // e.g. 'invokeHostFunction', 'payment' + const inner = (tr as unknown as Record)[`${armName}Result`]; + const innerName = inner?.type; if (!innerName || /Success$/.test(innerName)) continue; if (HOST_FUNCTION_RESULTS[innerName]) return HOST_FUNCTION_RESULTS[innerName]; for (const [pattern, sentence] of OPERATION_SUFFIXES) { diff --git a/frontend/mobile/lib/recovery.ts b/frontend/mobile/lib/recovery.ts index 5fe72e85..ed9aef13 100644 --- a/frontend/mobile/lib/recovery.ts +++ b/frontend/mobile/lib/recovery.ts @@ -449,7 +449,11 @@ export async function fetchWalletSigners( // get_signers returns Map>; read the XDR directly rather than // through scValToNative, whose output shape varies by SDK version. try { - return retval.map()?.map((entry) => new Uint8Array(entry.val().bytes())) ?? []; + if (retval.type !== 'scvMap') throw new Error('no signer map'); + return (retval.map ?? []).map((entry) => { + if (entry.val.type !== 'scvBytes') throw new Error('bad signer entry'); + return new Uint8Array(entry.val.bytes.toBytes()); + }); } catch { throw new Error('That contract does not look like a Veil wallet: it has no signer map.'); } diff --git a/frontend/mobile/lib/sorobanTx.ts b/frontend/mobile/lib/sorobanTx.ts index 3ee6a2f7..3948e63c 100644 --- a/frontend/mobile/lib/sorobanTx.ts +++ b/frontend/mobile/lib/sorobanTx.ts @@ -27,7 +27,9 @@ async function submitClassic( fee: inclusionFee(), networkPassphrase: upstream.networkPassphrase, }); - for (const op of upstream.toEnvelope().v1().tx().operations()) { + const envelope = upstream.toEnvelope(); + if (envelope.type !== 'envelopeTypeTx') throw new Error('Unexpected fee-bump envelope.'); + for (const op of envelope.v1.tx.operations) { builder.addOperation(op); } builder.addMemo(upstream.memo); @@ -95,7 +97,9 @@ export async function signAndSubmitSorobanXdr(params: { }); // Copy the raw XDR operations — this preserves the invocation and its auth // entries (source-account credentials stay valid: same source account). - for (const op of upstream.toEnvelope().v1().tx().operations()) { + const envelope = upstream.toEnvelope(); + if (envelope.type !== 'envelopeTypeTx') throw new Error('Unexpected fee-bump envelope.'); + for (const op of envelope.v1.tx.operations) { builder.addOperation(op); } builder.setTimeout(120); diff --git a/frontend/mobile/lib/walletConnect.ts b/frontend/mobile/lib/walletConnect.ts index 2ab80bd0..ecb975c7 100644 --- a/frontend/mobile/lib/walletConnect.ts +++ b/frontend/mobile/lib/walletConnect.ts @@ -20,7 +20,6 @@ import { import { Core } from '@walletconnect/core'; import { getSdkError } from '@walletconnect/utils'; import { Web3Wallet, type IWeb3Wallet } from '@walletconnect/web3wallet'; -import { Buffer } from 'buffer'; import * as Crypto from 'expo-crypto'; import { getNetwork } from './network'; @@ -181,8 +180,9 @@ function removePendingRequest(id: number, topic: string): void { * Hermes has no `crypto.subtle`, so hashing goes through `expo-crypto`, which * only accepts views backed by a plain `ArrayBuffer`. */ -async function sha256(data: Uint8Array): Promise> { - const digest = await Crypto.digest(Crypto.CryptoDigestAlgorithm.SHA256, data); +async function sha256(data: Uint8Array): Promise> { + const bytes = new Uint8Array(data); // copy into a plain ArrayBuffer-backed view + const digest = await Crypto.digest(Crypto.CryptoDigestAlgorithm.SHA256, bytes); return new Uint8Array(digest); } @@ -309,27 +309,37 @@ export async function signXdrPayload(xdrString: string): Promise { if (authEntries) { const networkIdBytes = await sha256(new TextEncoder().encode(network.networkPassphrase)); - for (const parsed of authEntries) { - const credentials = parsed.credentials(); - if ( - credentials.switch().value !== xdr.SorobanCredentialsType.sorobanCredentialsAddress().value - ) { + for (let i = 0; i < authEntries.length; i++) { + const parsed = authEntries[i]; + const credentials = parsed.credentials; + const isV2 = credentials.type === 'sorobanCredentialsAddressV2'; + if (!isV2 && credentials.type !== 'sorobanCredentialsAddress') { continue; } - const addressCredentials = credentials.address(); - const contractAddress = Address.fromScAddress(addressCredentials.address()).toString(); + const addressCredentials = isV2 ? credentials.addressV2 : credentials.address; + const contractAddress = Address.fromScAddress(addressCredentials.address).toString(); const currentNonce = await getWalletNonce(rpc, contractAddress, network.networkPassphrase, feePayerKeypair.publicKey()); - const preimage = xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( - new xdr.HashIdPreimageSorobanAuthorization({ - networkId: Buffer.from(networkIdBytes), - nonce: addressCredentials.nonce(), - invocation: parsed.rootInvocation(), - signatureExpirationLedger: validUntilLedger, - }) - ); - const payloadHash = await sha256(new Uint8Array(preimage.toXDR())); + const shared = { + networkId: new xdr.Hash(networkIdBytes), + nonce: addressCredentials.nonce, + invocation: parsed.rootInvocation, + signatureExpirationLedger: validUntilLedger, + }; + // CAP-71 (protocol 23) binds the authorising address into the payload, so + // an ADDRESS_V2 entry must be signed over the WithAddress preimage. + const preimage = isV2 + ? xdr.HashIdPreimage.envelopeTypeSorobanAuthorizationWithAddress( + new xdr.HashIdPreimageSorobanAuthorizationWithAddress({ + ...shared, + address: addressCredentials.address, + }) + ) + : xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( + new xdr.HashIdPreimageSorobanAuthorization(shared) + ); + const payloadHash = await sha256(preimage.toXDR()); const webAuthnSig = await signAuthEntry(payloadHash); if (!webAuthnSig) { @@ -346,16 +356,19 @@ export async function signXdrPayload(xdrString: string): Promise { sigElements.push(nativeToScVal(currentNonce, { type: 'u64' })); } - parsed.credentials( - xdr.SorobanCredentials.sorobanCredentialsAddress( - new xdr.SorobanAddressCredentials({ - address: addressCredentials.address(), - nonce: addressCredentials.nonce(), - signatureExpirationLedger: validUntilLedger, - signature: xdr.ScVal.scvVec(sigElements), - }) - ) - ); + const signedCredentials = new xdr.SorobanAddressCredentials({ + address: addressCredentials.address, + nonce: addressCredentials.nonce, + signatureExpirationLedger: validUntilLedger, + signature: xdr.ScVal.scvVec(sigElements), + }); + + authEntries[i] = new xdr.SorobanAuthorizationEntry({ + credentials: isV2 + ? xdr.SorobanCredentials.sorobanCredentialsAddressV2(signedCredentials) + : xdr.SorobanCredentials.sorobanCredentialsAddress(signedCredentials), + rootInvocation: parsed.rootInvocation, + }); } } From bb16ad61d9bdf4a899dd4babfe99530c5f67d313 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Wed, 30 Sep 2026 12:30:56 +0100 Subject: [PATCH 06/14] ci: run the JavaScript jobs on Node 22 (#660) stellar-sdk 17 declares engines >=22.12.0, so its jobs cannot install on 20. The root smoke test also reads the ledger key's durability as a property, which is how 17's XDR exposes it. --- .github/workflows/ci.yml | 16 ++++++++-------- .github/workflows/memory-leak-nightly.yml | 2 +- .github/workflows/mobile-apk.yml | 2 +- .github/workflows/mobile-e2e.yml | 2 +- .github/workflows/mobile.yml | 2 +- .github/workflows/mutation.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/storybook.yml | 2 +- .github/workflows/testnet-smoke.yml | 2 +- .github/workflows/uptime.yml | 2 +- .github/workflows/wallet-e2e.yml | 2 +- scripts/smoke_test.ts | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88e67e00..5f4fded5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: package-lock.json # The repo root is its own small npm project (release tooling + the smoke @@ -47,7 +47,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: package-lock.json - run: npm ci @@ -108,7 +108,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: sdk/package-lock.json # sdk/ is a standalone npm project with its own lockfile — the repo root @@ -141,7 +141,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: sdk/package-lock.json - name: Install dependencies @@ -198,7 +198,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: frontend/wallet/package-lock.json - run: npm ci || { echo "::warning::npm ci failed; falling back to npm install"; npm install; } @@ -223,7 +223,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: packages/agent/package-lock.json - run: npm ci || { echo "::warning::npm ci failed; falling back to npm install"; npm install; } @@ -240,7 +240,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: frontend/mobile/package-lock.json - run: npm ci @@ -264,7 +264,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: frontend/wallet/package-lock.json - run: npm ci || { echo "::warning::npm ci failed; falling back to npm install"; npm install; } diff --git a/.github/workflows/memory-leak-nightly.yml b/.github/workflows/memory-leak-nightly.yml index ba857d17..95bdb8e4 100644 --- a/.github/workflows/memory-leak-nightly.yml +++ b/.github/workflows/memory-leak-nightly.yml @@ -25,7 +25,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: 'npm' cache-dependency-path: frontend/wallet/package-lock.json diff --git a/.github/workflows/mobile-apk.yml b/.github/workflows/mobile-apk.yml index e5fbafe6..81cbd02d 100644 --- a/.github/workflows/mobile-apk.yml +++ b/.github/workflows/mobile-apk.yml @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: frontend/mobile/package-lock.json diff --git a/.github/workflows/mobile-e2e.yml b/.github/workflows/mobile-e2e.yml index ff7a3957..99942d4d 100644 --- a/.github/workflows/mobile-e2e.yml +++ b/.github/workflows/mobile-e2e.yml @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: frontend/mobile/package-lock.json diff --git a/.github/workflows/mobile.yml b/.github/workflows/mobile.yml index 874397ba..f8227d99 100644 --- a/.github/workflows/mobile.yml +++ b/.github/workflows/mobile.yml @@ -34,7 +34,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: frontend/mobile/package-lock.json # frontend/mobile is not a workspace member and keeps its own lockfile, so diff --git a/.github/workflows/mutation.yml b/.github/workflows/mutation.yml index 271a4eb7..9e6185d6 100644 --- a/.github/workflows/mutation.yml +++ b/.github/workflows/mutation.yml @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: sdk/package-lock.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 86052e1a..ee116527 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' registry-url: 'https://registry.npmjs.org' # The repo root is not an npm workspace (#670): it installs only the diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml index 72e5696f..473bf764 100644 --- a/.github/workflows/storybook.yml +++ b/.github/workflows/storybook.yml @@ -33,7 +33,7 @@ jobs: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: npm cache-dependency-path: sdk/package-lock.json - run: npm ci || { echo "::warning::npm ci failed; falling back to npm install"; npm install; } diff --git a/.github/workflows/testnet-smoke.yml b/.github/workflows/testnet-smoke.yml index d3148b9b..b24cf41a 100644 --- a/.github/workflows/testnet-smoke.yml +++ b/.github/workflows/testnet-smoke.yml @@ -26,7 +26,7 @@ jobs: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' # ── Install the Stellar CLI (used for friendbot funding) ─────────────── - name: Install Stellar CLI diff --git a/.github/workflows/uptime.yml b/.github/workflows/uptime.yml index 6e933ab0..b931ac45 100644 --- a/.github/workflows/uptime.yml +++ b/.github/workflows/uptime.yml @@ -48,7 +48,7 @@ jobs: - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' - name: Probe public endpoints id: probe diff --git a/.github/workflows/wallet-e2e.yml b/.github/workflows/wallet-e2e.yml index 355e12b2..7546c830 100644 --- a/.github/workflows/wallet-e2e.yml +++ b/.github/workflows/wallet-e2e.yml @@ -44,7 +44,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '20' + node-version: '22' cache: 'npm' cache-dependency-path: frontend/wallet/package-lock.json diff --git a/scripts/smoke_test.ts b/scripts/smoke_test.ts index 1139f739..f9a67ced 100644 --- a/scripts/smoke_test.ts +++ b/scripts/smoke_test.ts @@ -303,7 +303,7 @@ async function step5_assertContractExists( new xdr.LedgerKeyContractData({ contract: contractScAddress, key: xdr.ScVal.scvLedgerKeyContractInstance(), - durability: xdr.ContractDataDurability.persistent(), + durability: xdr.ContractDataDurability.persistent, }) ); From da399c7dd03fb2f195725e85a15bf84a60ea1419 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Wed, 30 Sep 2026 22:34:33 +0100 Subject: [PATCH 07/14] docs: describe stellar-sdk 17 as the SDK's peer dependency (#660) The READMEs and CONTRIBUTING still narrated the pre-upgrade split, where the SDK bundled its own major and mobile pinned over it. Record the new arrangement instead, note that the Metro singleton pin stays because the SDK still dev-installs a copy, and add the changeset for the release notes. --- .changeset/stellar-sdk-17-peer-dependency.md | 9 +++++++++ CONTRIBUTING.md | 13 +++++++----- README.md | 2 +- frontend/mobile/metro.config.js | 21 ++++++++++---------- frontend/wallet/README.md | 2 +- sdk/README.md | 5 +++++ 6 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 .changeset/stellar-sdk-17-peer-dependency.md diff --git a/.changeset/stellar-sdk-17-peer-dependency.md b/.changeset/stellar-sdk-17-peer-dependency.md new file mode 100644 index 00000000..2f11b337 --- /dev/null +++ b/.changeset/stellar-sdk-17-peer-dependency.md @@ -0,0 +1,9 @@ +--- +"invisible-wallet-sdk": minor +--- + +`@stellar/stellar-sdk` moves from `dependencies` to `peerDependencies` (`^17.0.1`), +so an app using the SDK installs one copy of the XDR tables instead of two. Apps must +now depend on `@stellar/stellar-sdk` 17 themselves — `npm install @stellar/stellar-sdk` +alongside the SDK. The passkey authorisation path was rebuilt for protocol 23's +CAP-71 `ADDRESS_V2` credential arm and verified with a real spend on testnet. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 323f0b80..bb5c0df1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,11 +44,14 @@ You install the one you are working on, in its own directory. There is no top-level install that pulls in everything, and there is no hoisted `node_modules` at the repo root. -That is deliberate. The packages disagree on major versions on purpose (the SDK -builds against `@stellar/stellar-sdk` 15 and TypeScript 6, the root smoke test -against 14 and TypeScript 5), the SDK's Jest config maps modules through -`/node_modules`, and Dependabot and every CI job are wired per package -lockfile. A root `workspaces` field flattened all of that into one tree and +That is deliberate. The packages are not all on the same toolchain: the SDK +builds with TypeScript 6 and declares `@stellar/stellar-sdk` 17 as a peer +dependency so the host app owns the single copy, the root smoke test runs +TypeScript 5, and the `examples/*` apps are still on older +`@stellar/stellar-sdk` majors. On top of that, the SDK's Jest config maps +modules through `/node_modules`, and Dependabot and every CI job are +wired per package lockfile. A root `workspaces` field flattened all of that +into one tree and rewrote the root lockfile from ~950 to ~21,000 lines on every fresh clone ([#670](https://github.com/Miracle656/veil/issues/670)), so it was removed. diff --git a/README.md b/README.md index 8e333049..563a678e 100644 --- a/README.md +++ b/README.md @@ -230,7 +230,7 @@ All transactions built by the agent are returned unsigned to the frontend, where | -------------- | ----------------------------------------------------------------- | | Smart contract | Rust, Soroban SDK, p256 crate (ECDSA), sha2 | | Authentication | WebAuthn / FIDO2 (ES256 / P-256) | -| Client SDK | TypeScript, React hooks, @stellar/stellar-sdk v15, Web Crypto API | +| Client SDK | TypeScript, React hooks, @stellar/stellar-sdk v17, Web Crypto API | | Wallet app | Next.js 14 App Router, next-pwa | | AI Agent | Node.js, Claude claude-sonnet-4-6, Anthropic SDK, WebSocket | | Price oracle | Fastify, Prisma, Postgres (Supabase), x402 micropayments | diff --git a/frontend/mobile/metro.config.js b/frontend/mobile/metro.config.js index 2366c717..49ae8fb6 100644 --- a/frontend/mobile/metro.config.js +++ b/frontend/mobile/metro.config.js @@ -77,20 +77,19 @@ config.resolver.alias = { // `resolveRequest` does, because Metro calls it for every request no matter // which file asked. // -// `@stellar/stellar-sdk` is here for a related but separate reason: the SDK -// declares ^15.1.0 (dependabot #143) while this app declares ^14.6.1, so both -// majors were being bundled — SDK code ran v15, app code ran v14. XDR types are -// classes, so an object built by one major and read by the other is not the -// same type, and `wallet.deploy()` produced an envelope the same bundle could -// not decode: +// `@stellar/stellar-sdk` is here for a related but separate reason, and it +// survives #660 rather than being retired by it. That issue made stellar-sdk a +// peer dependency of the SDK, so app and SDK now agree on one major — but the SDK +// still dev-installs its own copy under `sdk/node_modules` to build and test +// itself, and Metro, following the `file:../../sdk` symlink, resolves a bare +// `@stellar/stellar-sdk` from inside `sdk/` to that copy first. XDR types are +// classes, so an object built by one copy and read by the other is not the same +// type, and `wallet.deploy()` produced an envelope the same bundle could not +// decode: // // Deploy: this device produced a transaction it cannot read back. // -// while every app-side flow, on v14 throughout, worked. Pin both to the app's -// copy so there is one XDR implementation in the bundle. -// -// The real fix is agreeing one version across the repo — PR #676 — after which -// this entry is belt and braces rather than load-bearing. +// Pin both to the app's copy so there is one XDR implementation in the bundle. const SINGLETON_PACKAGES = new Set(['react', 'react-dom', '@stellar/stellar-sdk']); const APP_NODE_MODULES = path.resolve(projectRoot, 'node_modules'); diff --git a/frontend/wallet/README.md b/frontend/wallet/README.md index c5ce6c36..714f7b5c 100644 --- a/frontend/wallet/README.md +++ b/frontend/wallet/README.md @@ -158,7 +158,7 @@ If the browser cache is cleared (wiping `localStorage`): | Framework | Next.js 14 (App Router) | | Language | TypeScript | | Styling | CSS custom properties + utility classes (no Tailwind in production styles) | -| Stellar SDK | `@stellar/stellar-sdk` v14 | +| Stellar SDK | `@stellar/stellar-sdk` v17 | | Wallet SDK | `invisible-wallet-sdk` (local package `../../sdk`) | | PWA | `next-pwa` with offline fallback | | Animations | `framer-motion` | diff --git a/sdk/README.md b/sdk/README.md index bd05a8ba..2ef8850e 100644 --- a/sdk/README.md +++ b/sdk/README.md @@ -10,6 +10,11 @@ TypeScript SDK for Veil / Invisible Wallet (Soroban + WebAuthn passkeys). Suppor npm install invisible-wallet-sdk @stellar/stellar-sdk ``` +`@stellar/stellar-sdk` (`^17.0.1`) is a required peer dependency: the SDK does not +bundle it, so your app's copy is the only one in the process. Two copies means two +sets of XDR classes, and an `Asset` or `Transaction` built by one fails `instanceof` +against the other. + Optional peer dependencies based on your framework: - **React**: `npm install react react-dom @tanstack/react-query` - **Vue 3**: `npm install vue` From 1e32586a4f2de7e04aa5d243a5783f9ac6e90e65 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Wed, 30 Sep 2026 22:38:11 +0100 Subject: [PATCH 08/14] test(sdk): reproduce a passkey spend on testnet as an executable check (#660) Every __check_auth requirement is a runtime contract, so a green typecheck proves nothing about the signing path. This drives deploy() and sendPayment() against the testnet factory with a software P-256 authenticator and prints the resulting hash; it refuses to run on any network other than testnet. --- sdk/scripts/verify-passkey-testnet.mjs | 264 +++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 sdk/scripts/verify-passkey-testnet.mjs diff --git a/sdk/scripts/verify-passkey-testnet.mjs b/sdk/scripts/verify-passkey-testnet.mjs new file mode 100644 index 00000000..9ca8b8ac --- /dev/null +++ b/sdk/scripts/verify-passkey-testnet.mjs @@ -0,0 +1,264 @@ +#!/usr/bin/env node +/** + * verify-passkey-testnet.mjs — spends from a Veil wallet on TESTNET with a + * passkey-authorised Soroban transaction, and prints the transaction hash. + * + * Why this exists + * --------------- + * The passkey path is the part of the SDK that a typecheck cannot prove. Every + * `__check_auth` requirement is a runtime contract: the payload the authenticator + * signs, the five-element signature vector, the ledger-window expiry, the nonce, + * the budget for the host's secp256r1 verify, and which CAP-71 credential arm the + * network hands back. A green build says nothing about any of them. + * + * This script runs the real path — `deploy()`, then `sendPayment()` through the + * wallet's own `authorizeEntries` — against the deployed testnet factory, with a + * software P-256 authenticator standing in for the platform's WebAuthn UI. It is + * the same assertion shape `frontend/mobile/lib/__tests__/signXdrPayload.test.ts` + * builds, driven over a live network instead of a mocked one. + * + * Usage + * ----- + * node scripts/verify-passkey-testnet.mjs + * FACTORY_ADDRESS=C... RPC_URL=... node scripts/verify-passkey-testnet.mjs + * + * Nothing here touches mainnet: the network passphrase is asserted to be testnet + * before any transaction is built. Testnet XLM comes from friendbot, so the only + * cost is the fee payer's own time to fund. + */ +import { createHash, generateKeyPairSync, sign as cryptoSign } from 'node:crypto'; +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); + +// Resolved from sdk/, so this is the same @stellar/stellar-sdk instance the built +// SDK below loads. Two copies in one process means two sets of XDR classes, and an +// Asset or Keypair built by one fails `instanceof` against the other. +const { + Asset, Contract, Keypair, Networks, TransactionBuilder, Horizon, + nativeToScVal, rpc: SorobanRpc, +} = require('@stellar/stellar-sdk'); +const { InvisibleWalletCore } = require('../dist/core.js'); + +const RPC_URL = process.env.RPC_URL || 'https://soroban-testnet.stellar.org'; +const HORIZON_URL = process.env.HORIZON_URL || 'https://horizon-testnet.stellar.org'; +const PASSPHRASE = process.env.NETWORK_PASSPHRASE || Networks.TESTNET; +const FACTORY_ADDRESS = process.env.FACTORY_ADDRESS + || 'CAUK4MWO3TTFM6PLURSH2GPK3AB747SZGABKTCVLKCU7W2MGKHKP35GA'; +const FRIENDBOT_URL = process.env.FRIENDBOT_URL || 'https://friendbot.stellar.org'; + +// The wallet contract binds both into the assertion, so the deploy and the +// signature must agree on them. +const RP_ID = 'localhost'; +const ORIGIN = 'https://localhost'; + +const WALLET_FUND_STROOPS = 100_000_000n; // 10 XLM to cover the reserve +const SPEND_STROOPS = 10_000_000n; // 1 XLM, the payment under test + +if (PASSPHRASE !== Networks.TESTNET) { + console.error(`Refusing to run: NETWORK_PASSPHRASE must be testnet, got ${PASSPHRASE}`); + process.exit(1); +} + +const sha256 = (...parts) => { + const h = createHash('sha256'); + for (const part of parts) h.update(part); + return h.digest(); +}; +const b64url = (bytes) => Buffer.from(bytes).toString('base64url'); + +/** + * A P-256 key that answers `signAuthEntry` the way a platform passkey does, so + * the SDK, the contract and the network are all exercised for real. + */ +function createSoftwarePasskey() { + const { privateKey, publicKey } = generateKeyPairSync('ec', { namedCurve: 'prime256v1' }); + const jwk = publicKey.export({ format: 'jwk' }); + const uncompressed = Buffer.concat([ + Buffer.from([0x04]), + Buffer.from(jwk.x, 'base64url'), + Buffer.from(jwk.y, 'base64url'), + ]); + const rpIdHash = sha256(Buffer.from(RP_ID)); + + // secp256r1 order, for the low-S normalisation the host requires. + const CURVE_N = 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551n; + + return { + publicKeyBytes: new Uint8Array(uncompressed), + /** Matches the SDK's WebAuthnSignature shape. */ + signAuthEntry: async (payload) => { + const clientDataJSON = Buffer.from(JSON.stringify({ + type: 'webauthn.get', + challenge: b64url(payload), + origin: ORIGIN, + crossOrigin: false, + })); + // rpIdHash | flags (UserPresent | UserVerified) | signCount + const authData = Buffer.concat([rpIdHash, Buffer.from([0x05]), Buffer.from([0, 0, 0, 1])]); + + const message = Buffer.concat([authData, sha256(clientDataJSON)]); + let signature = cryptoSign('sha256', message, { key: privateKey, dsaEncoding: 'ieee-p1363' }); + + const r = signature.subarray(0, 32); + let s = BigInt(`0x${signature.subarray(32).toString('hex')}`); + if (s > CURVE_N >> 1n) { + s = CURVE_N - s; + signature = Buffer.concat([r, Buffer.from(s.toString(16).padStart(64, '0'), 'hex')]); + } + + return { + publicKey: new Uint8Array(uncompressed), + authData: new Uint8Array(authData), + clientDataJSON: new Uint8Array(clientDataJSON), + signature: new Uint8Array(signature), + }; + }, + }; +} + +const memoryStorage = () => { + const map = new Map(); + return { + getItem: (k) => map.get(k) ?? null, + setItem: (k, v) => void map.set(k, v), + removeItem: (k) => void map.delete(k), + }; +}; + +async function fund(address) { + const res = await fetch(`${FRIENDBOT_URL}?addr=${address}`); + if (!res.ok) throw new Error(`friendbot failed for ${address}: ${res.status} ${await res.text()}`); +} + +const server = () => new SorobanRpc.Server(RPC_URL); + +async function submit(tx, signerKeypair, label) { + const sim = await server().simulateTransaction(tx); + if (SorobanRpc.Api.isSimulationError(sim)) { + throw new Error(`${label} failed to simulate: ${sim.error}`); + } + const ready = SorobanRpc.assembleTransaction(tx, sim).build(); + ready.sign(signerKeypair); + const sent = await server().sendTransaction(ready); + if (sent.status === 'ERROR') { + throw new Error(`${label} rejected: ${sent.errorResult?.toXDR('base64')}`); + } + const receipt = await waitFor(sent.hash); + console.log(` ${label}: ${sent.hash} (${receipt.status})`); + return { hash: sent.hash, receipt }; +} + +async function waitFor(hash) { + for (let attempt = 0; attempt < 60; attempt++) { + const receipt = await server().getTransaction(hash); + if (receipt.status !== SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) return receipt; + await new Promise((done) => setTimeout(done, 1000)); + } + throw new Error(`Transaction ${hash} never appeared on testnet`); +} + +/** Send testnet XLM from a classic account to the wallet's contract address. */ +async function fundWalletFrom(payerKeypair, walletAddress) { + const native = new Contract(Asset.native().contractId(PASSPHRASE)); + const source = await server().getAccount(payerKeypair.publicKey()); + const tx = new TransactionBuilder(source, { fee: '100', networkPassphrase: PASSPHRASE }) + .addOperation(native.call( + 'transfer', + nativeToScVal(payerKeypair.publicKey(), { type: 'address' }), + nativeToScVal(walletAddress, { type: 'address' }), + nativeToScVal(WALLET_FUND_STROOPS, { type: 'i128' }), + )) + .setTimeout(30) + .build(); + return submit(tx, payerKeypair, 'fund wallet'); +} + +const nativeBalanceOf = async (address) => { + const account = await new Horizon.Server(HORIZON_URL).loadAccount(address); + const native = account.balances.find((b) => b.asset_type === 'native'); + return BigInt(Math.round(Number(native.balance) * 10_000_000)); +}; + +async function main() { + console.log(`Network : ${PASSPHRASE}`); + console.log(`RPC : ${RPC_URL}`); + console.log(`Factory : ${FACTORY_ADDRESS}`); + console.log(`SDK build : ${require('../package.json').version}`); + + console.log('\n1. Fee payer and recipient'); + const payerKeypair = Keypair.random(); + const recipientKeypair = Keypair.random(); + await fund(payerKeypair.publicKey()); + await fund(recipientKeypair.publicKey()); + console.log(` payer ${payerKeypair.publicKey()}`); + console.log(` recipient ${recipientKeypair.publicKey()}`); + + console.log('\n2. Passkey (software P-256) and deploy'); + const passkey = createSoftwarePasskey(); + const wallet = new InvisibleWalletCore({ + factoryAddress: FACTORY_ADDRESS, + rpcUrl: RPC_URL, + networkPassphrase: PASSPHRASE, + rpId: RP_ID, + origin: ORIGIN, + storage: memoryStorage(), + }); + wallet.signAuthEntry = passkey.signAuthEntry; + + // Record which CAP-71 credential arm the network actually returns, since the + // two arms sign different preimages and only one of them verifies. + const credentialArms = []; + const recordArms = wallet.authorizeEntries.bind(wallet); + wallet.authorizeEntries = async (sim) => { + for (const entry of sim.result?.auth ?? []) { + credentialArms.push(entry.credentials?.type ?? 'unknown'); + } + return recordArms(sim); + }; + + const deployed = await wallet.deploy(payerKeypair.secret(), passkey.publicKeyBytes); + if (deployed.alreadyDeployed) throw new Error('a fresh key should not already be deployed'); + const walletAddress = deployed.walletAddress; + console.log(` wallet ${walletAddress}`); + + await fundWalletFrom(payerKeypair, walletAddress); + + const nonceBefore = await wallet.getNonce(); + const recipientBefore = await nativeBalanceOf(recipientKeypair.publicKey()); + + console.log(`\n3. Passkey-authorised spend of ${SPEND_STROOPS} stroops`); + const spend = await wallet.sendPayment( + payerKeypair.secret(), recipientKeypair.publicKey(), SPEND_STROOPS + ); + + const receipt = await server().getTransaction(spend.transactionHash); + const recipientAfter = await nativeBalanceOf(recipientKeypair.publicKey()); + const nonceAfter = await wallet.getNonce(); + + console.log(` credential arms signed : ${credentialArms.join(', ') || 'none'}`); + console.log(` on-chain status : ${receipt.status}`); + console.log(` ledger / closed at : ${receipt.latestLedger} ${receipt.latestLedgerCloseTime}`); + console.log(` recipient balance : ${recipientBefore} -> ${recipientAfter}`); + console.log(` wallet nonce : ${nonceBefore} -> ${nonceAfter}`); + + if (receipt.status !== SorobanRpc.Api.GetTransactionStatus.SUCCESS) { + throw new Error(`expected SUCCESS, got ${receipt.status}`); + } + if (recipientAfter - recipientBefore !== SPEND_STROOPS) { + throw new Error('recipient balance did not move by the spent amount'); + } + if (nonceAfter !== nonceBefore + 1n) { + throw new Error('__check_auth did not advance the nonce'); + } + + console.log('\nPASS — passkey-authorised transaction confirmed on testnet'); + console.log(`transaction hash: ${spend.transactionHash}`); + console.log(`explorer: https://explorer.stellar.org/testnet/transactions/${spend.transactionHash}`); +} + +main().catch((error) => { + console.error(`\nFAIL: ${error && error.message ? error.message : error}`); + if (error?.response?.data) console.error(error.response.data); + process.exit(1); +}); From a9795ace49e71520e01a112ba68bb5f9b223d654 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Thu, 1 Oct 2026 00:16:55 +0100 Subject: [PATCH 09/14] fix(wallet): read Soroban transaction meta the stellar-sdk 17 way (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stellar-sdk 17 dropped the union accessor methods earlier majors had: reading an arm is a discriminated property now. Three files still called meta.switch().name, meta.v3().sorobanMeta() and val.address().contractId(), which throw TypeError on 17 — the vault and multisig deploys died outright and the sweep failure parser silently reported nothing. Hand-written local types that described the 14 shape were why a green typecheck hid it. Verified against the 17.2.0 declarations: TransactionMeta arms are v0..v4, ScAddress exposes contractId directly, and ScError lost its host arm. --- frontend/wallet/lib/multisig.ts | 28 ++++++++------- frontend/wallet/lib/sweepContractBalance.ts | 40 +++++++++------------ frontend/wallet/lib/vault.ts | 39 +++++++++----------- 3 files changed, 49 insertions(+), 58 deletions(-) diff --git a/frontend/wallet/lib/multisig.ts b/frontend/wallet/lib/multisig.ts index a6f8b279..8aa134f9 100644 --- a/frontend/wallet/lib/multisig.ts +++ b/frontend/wallet/lib/multisig.ts @@ -1,5 +1,6 @@ import { inclusionFee } from './fees' import { + Address, Keypair, rpc as SorobanRpc, Contract, @@ -10,7 +11,6 @@ import { nativeToScVal, scValToNative, Networks, - StrKey, Operation } from '@stellar/stellar-sdk'; import { getNetwork } from './network'; @@ -111,18 +111,22 @@ export async function deployAndInitMultisig(params: { throw new Error(`Deploy transaction failed with status: ${txResp.status}`); } - const meta = txResp.resultMetaXdr as any; - let sorobanMeta: any = null; - const sw = meta.switch().name; - if (sw === 'transactionMetaV3') { - sorobanMeta = meta.v3().sorobanMeta(); - } else if (sw === 'transactionMetaV4') { - sorobanMeta = meta.v4().sorobanMeta(); - } else { - sorobanMeta = meta.v3()?.sorobanMeta() || meta.v4()?.sorobanMeta(); + // stellar-sdk 17 reads XDR unions as discriminated properties instead of the + // accessor methods earlier majors had, so the arms are plain fields here. + const meta = txResp.resultMetaXdr; + const sorobanMeta = + meta.type === 'v4' ? meta.v4.sorobanMeta + : meta.type === 'v3' ? meta.v3.sorobanMeta + : undefined; + if (!sorobanMeta) { + throw new Error('Deploy transaction produced no Soroban meta.'); } - const val = sorobanMeta.returnValue(); - const contractId = StrKey.encodeContract(val.address().contractId() as any); + if (sorobanMeta.returnValue?.type !== 'scvAddress') { + throw new Error( + `Deploy returned ${sorobanMeta.returnValue?.type ?? 'no value'}, not a contract address.` + ); + } + const contractId = Address.fromScAddress(sorobanMeta.returnValue.address).toString(); console.log("Deployed Multisig contract:", contractId); diff --git a/frontend/wallet/lib/sweepContractBalance.ts b/frontend/wallet/lib/sweepContractBalance.ts index ac08d8db..9ec5c96d 100644 --- a/frontend/wallet/lib/sweepContractBalance.ts +++ b/frontend/wallet/lib/sweepContractBalance.ts @@ -62,38 +62,30 @@ function describeFailure(result: any): string { if (result.resultMetaXdr?.toXDR) debugInfo.resultMetaXdr = result.resultMetaXdr.toXDR('base64') } catch { /* ignore */ } - // Walk diagnostic events from whichever meta version applies (v3 or v4) + // Walk diagnostic events from whichever meta version applies (v3 or v4). + // stellar-sdk 17 reads XDR unions as discriminated properties, so each arm is + // a field rather than an accessor call. const errs: string[] = [] try { const meta = result.resultMetaXdr - let sorobanMeta: any = null - try { - const sw = meta?.switch?.()?.name - if (sw === 'transactionMetaV3') sorobanMeta = meta.v3?.()?.sorobanMeta?.() - else if (sw === 'transactionMetaV4') sorobanMeta = meta.v4?.()?.sorobanMeta?.() - else { - // try both as a last resort - sorobanMeta = meta?.v3?.()?.sorobanMeta?.() ?? meta?.v4?.()?.sorobanMeta?.() - } - } catch { /* fall through */ } + const sorobanMeta = + meta?.type === 'v4' ? meta.v4.sorobanMeta + : meta?.type === 'v3' ? meta.v3.sorobanMeta + : undefined - const events = sorobanMeta?.diagnosticEvents?.() ?? [] - for (const diag of events) { + for (const diag of sorobanMeta?.diagnosticEvents ?? []) { try { - const body = diag.event().body().v0?.() - if (!body) continue - const topics = body.topics() ?? [] + const body = diag.event?.body + if (body?.type !== 'v0') continue + const topics = body.v0.topics ?? [] if (topics.length === 0) continue const first = topics[0] - if (first.switch().name !== 'scvSymbol' || first.sym().toString() !== 'error') continue + if (first.type !== 'scvSymbol' || first.sym.toString() !== 'error') continue const errVal = topics[1] - if (!errVal || errVal.switch().name !== 'scvError') continue - const scErr = errVal.error() - const t = scErr.switch().name - let code: string | number = '?' - if (t === 'sceContract') code = scErr.contractCode() - else { try { code = scErr.code()?.name ?? '?' } catch { /* */ } } - errs.push(`${t}=${code}`) + if (!errVal || errVal.type !== 'scvError') continue + const scErr = errVal.error + const code = scErr.type === 'sceContract' ? scErr.contractCode : scErr.code?.name ?? '?' + errs.push(`${scErr.type}=${code}`) } catch { /* skip event */ } } } catch { /* ignore */ } diff --git a/frontend/wallet/lib/vault.ts b/frontend/wallet/lib/vault.ts index 3d9bab69..aeccefe5 100644 --- a/frontend/wallet/lib/vault.ts +++ b/frontend/wallet/lib/vault.ts @@ -7,7 +7,6 @@ import { Contract, Keypair, Operation, - StrKey, TransactionBuilder, nativeToScVal, rpc as SorobanRpc, @@ -49,20 +48,6 @@ export interface VaultDetails { withdrawals: VaultWithdrawal[] } -type SorobanMeta = { - returnValue: () => { - address: () => { - contractId: () => Uint8Array - } - } -} - -type TransactionMeta = { - switch: () => { name: string } - v3: () => { sorobanMeta: () => SorobanMeta } - v4: () => { sorobanMeta: () => SorobanMeta } -} - function getVaultWasmHash(): string { const network = getNetwork() const value = network.name === 'mainnet' @@ -234,13 +219,23 @@ function extractContractId( throw new Error('Vault deployment did not succeed.') } - const meta = response.resultMetaXdr as unknown as TransactionMeta - const metaVersion = meta.switch().name - const sorobanMeta = metaVersion === 'transactionMetaV4' - ? meta.v4().sorobanMeta() - : meta.v3().sorobanMeta() - const rawContractId = sorobanMeta.returnValue().address().contractId() - return StrKey.encodeContract(Buffer.from(rawContractId)) + // stellar-sdk 17 reads XDR unions as discriminated properties, so the arms are + // plain fields rather than accessor calls. + const meta = response.resultMetaXdr + const sorobanMeta = + meta.type === 'v4' ? meta.v4.sorobanMeta + : meta.type === 'v3' ? meta.v3.sorobanMeta + : undefined + if (!sorobanMeta) { + throw new Error('Vault deployment produced no Soroban transaction meta.') + } + const returnValue = sorobanMeta.returnValue + if (returnValue?.type !== 'scvAddress') { + throw new Error( + `Vault deployment returned ${returnValue?.type ?? 'no value'}, not a contract address.` + ) + } + return Address.fromScAddress(returnValue.address).toString() } export async function deployAndInitializeVault(params: { From e4edd59557ad1c7071854d8e29cc9e9123b9db07 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Thu, 1 Oct 2026 21:46:17 +0100 Subject: [PATCH 10/14] fix(sdk): keep the protocol-23 re-preparation on main's signer path (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nine submit sites in core.ts still carried both the branch's keypair signing call and main's TransactionSigner call after the merges: `submissionTx` was declared twice at each one, and the branch's lines named signerKeypair, guardianKeypair and payerKeypair — variables main had already replaced with the method's `signer` parameter. The SDK would not build and mobile typecheck reported 45 errors. reprepareWithSignedAuth now takes SignerInput and reads the payer address through resolveSigner, so the second simulation survives the signer refactor rather than being dropped to make the file parse. That round-trip is what stops a passkey spend trapping on "operation instructions exceeds amount specified": the first simulation runs in recording-auth mode, so its budget never accounts for the secp256r1 check. stellar-sdk 17 returns a Uint8Array from hash() and exposes a signature as a value rather than a getter, so signer.ts now compares the two digests with bufferToHex — `!==` between byte arrays only compares references — and the signer tests read `.signature` instead of calling it. --- sdk/src/__tests__/signer.test.ts | 6 ++-- sdk/src/core.ts | 49 +++++++++++++------------------- sdk/src/signer.ts | 6 +++- 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/sdk/src/__tests__/signer.test.ts b/sdk/src/__tests__/signer.test.ts index 3e9ff6be..20746d5a 100644 --- a/sdk/src/__tests__/signer.test.ts +++ b/sdk/src/__tests__/signer.test.ts @@ -56,7 +56,7 @@ describe('TransactionSigner callback path', () => { expect(seen).toEqual([[tx.toXDR(), PASSPHRASE]]); expect(signed.signatures).toHaveLength(1); - expect(kp.verify(signed.hash(), signed.signatures[0].signature())).toBe(true); + expect(kp.verify(signed.hash(), signed.signatures[0].signature)).toBe(true); expect(warn).not.toHaveBeenCalled(); // the callback path is not deprecated warn.mockRestore(); }); @@ -98,7 +98,7 @@ describe('TransactionSigner callback path', () => { ); expect(out.toXDR()).toBeTruthy(); expect((out as any).feeSource).toBe(sponsor.publicKey()); - expect(sponsor.verify(out.hash(), out.signatures[0].signature())).toBe(true); + expect(sponsor.verify(out.hash(), out.signatures[0].signature)).toBe(true); }); }); @@ -115,7 +115,7 @@ describe('deprecated Keypair / secret inputs', () => { const b = (await signForSubmission(buildTx(kp.publicKey()), kp, config())) as Transaction; const c = (await signForSubmission(buildTx(kp.publicKey()), kp.secret(), config())) as Transaction; - expect(kp.verify(a.hash(), a.signatures[0].signature())).toBe(true); + expect(kp.verify(a.hash(), a.signatures[0].signature)).toBe(true); expect(b.signatures).toHaveLength(1); expect(c.signatures).toHaveLength(1); const messages = warn.mock.calls.map((c) => String(c[0])); diff --git a/sdk/src/core.ts b/sdk/src/core.ts index af69ef9d..044a8e20 100644 --- a/sdk/src/core.ts +++ b/sdk/src/core.ts @@ -1004,9 +1004,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1281,7 +1280,7 @@ export class InvisibleWalletCore { */ private reprepareWithSignedAuth = async ( assembled: Transaction, - payerKeypair: Keypair + signer: SignerInput ): Promise => { const invokeOp = assembled.operations?.[0] as Operation.InvokeHostFunction | undefined; const signedAuth = invokeOp?.auth ?? []; @@ -1289,7 +1288,7 @@ export class InvisibleWalletCore { const { rpcUrl, networkPassphrase } = this.config; const server = new SorobanRpc.Server(rpcUrl); - const payer = await server.getAccount(payerKeypair.publicKey()); + const payer = await server.getAccount(resolveSigner(signer).publicKey); const retryTx = new TransactionBuilder(payer, { fee: BASE_FEE, @@ -1400,9 +1399,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1530,9 +1528,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1594,9 +1591,8 @@ export class InvisibleWalletCore { await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1716,9 +1712,8 @@ export class InvisibleWalletCore { // persist the new credential below. await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1805,9 +1800,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, guardianKeypair), guardianKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -1882,9 +1876,8 @@ export class InvisibleWalletCore { } const assembled = SorobanRpc.assembleTransaction(tx, sim).build(); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, payerKeypair), payerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { @@ -2016,9 +2009,8 @@ export class InvisibleWalletCore { await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, payerKeypair), payerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { throw new Error( @@ -2149,9 +2141,8 @@ export class InvisibleWalletCore { await this.authorizeEntries(sim as SorobanRpc.Api.SimulateTransactionSuccessResponse); - const submissionTx = signForSubmission( - await this.reprepareWithSignedAuth(assembled, signerKeypair), signerKeypair, this.config); - const submissionTx = await signForSubmission(assembled, signer, this.config); + const submissionTx = await signForSubmission( + await this.reprepareWithSignedAuth(assembled, signer), signer, this.config); const sendResult = await server.sendTransaction(submissionTx); if (sendResult.status === 'ERROR') { diff --git a/sdk/src/signer.ts b/sdk/src/signer.ts index 9fa07ba1..5f8818a2 100644 --- a/sdk/src/signer.ts +++ b/sdk/src/signer.ts @@ -13,6 +13,8 @@ import { Keypair, TransactionBuilder, type FeeBumpTransaction, type Transaction } from '@stellar/stellar-sdk'; +import { bufferToHex } from './utils'; + /** Context handed to a signer alongside the XDR. */ export type SignTransactionContext = { /** Passphrase of the network the transaction is for. */ @@ -123,7 +125,9 @@ export async function signWith( } catch { throw new Error('The signer returned something that is not a transaction envelope for this network.'); } - if (signed.hash() !== tx.hash()) { + // stellar-sdk 17 hands back a Uint8Array, so the digests must be compared by + // value — `!==` on two byte arrays only ever compares references. + if (bufferToHex(signed.hash()) !== bufferToHex(tx.hash())) { throw new Error('The signer returned a different transaction than the one it was asked to sign.'); } if (signed.signatures.length <= tx.signatures.length) { From 7a63bcdc78d19912d08874659b475a868c8e82c3 Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Sun, 4 Oct 2026 14:57:19 +0100 Subject: [PATCH 11/14] fix(deps): drop the duplicate stellar-sdk key that kept mobile on 14 (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit frontend/mobile/package.json declared @stellar/stellar-sdk twice, ^17.0.1 and then ^14.6.1. npm honours the last key, so mobile still resolved against the 14 line even though its own tree carried 17.2.0 — #660's declared-versus-installed drift, arrived at in a new package. It is not cosmetic: `npm ci` fails there outright ("lock file's @stellar/stellar-sdk@17.2.0 does not satisfy 14.6.1"), so the mobile job and the repo-wide verify-lockfiles job install nothing at all. The same bad merge duplicated @walletconnect/core; 2.25.0 already won, so dropping the stale 2.17.1 line changes no resolution. No re-resolution was needed. The lockfile had recorded both keys too, so this is four deleted lines rather than a regenerated tree. Merging main also brought in sdk/src/sep8.ts, written against the pre-17 XDR API in which unions and structs answer through methods. stellar-sdk 17 regenerates them as discriminated classes, so envelope.switch().name, v1(), tx() and a Transaction's sourceAccount(), memo() and operations() are plain data properties; typecheck was red on eleven of those calls. The fee-bump inner is typed as envelopeTypeTx alone in 17, so the guard that rejected a v0 inner there has no second arm left to take — such an envelope now fails to decode and is refused by the existing catch, which preserves the fail-closed behaviour this security check depends on. toXDR/fromXDR stay as the rest of src/ uses them rather than being renamed here. Verified: sdk `tsc --noEmit` green, all 344 jest tests pass, and a passkey-authorised spend on testnet succeeds against 17.2.0 — hash 30be7fb0a96d1c1ba78c81b6431b6483a88b79bd46b990ad132979765a6205ee, confirmed successful on Horizon testnet at ledger 5019167. The FeeBump arm, which sep8.test.ts never exercises, was probed directly: appended operations still verify, while memo, amount and fee-source changes and dropped operations are all refused. --- frontend/mobile/package-lock.json | 2 -- frontend/mobile/package.json | 2 -- sdk/src/sep8.ts | 20 ++++++++++---------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/frontend/mobile/package-lock.json b/frontend/mobile/package-lock.json index a6edcd52..15904175 100644 --- a/frontend/mobile/package-lock.json +++ b/frontend/mobile/package-lock.json @@ -22,8 +22,6 @@ "@reown/walletkit": "^1.6.0", "@soroswap/sdk": "^0.4.0", "@stellar/stellar-sdk": "^17.0.1", - "@walletconnect/core": "2.17.1", - "@stellar/stellar-sdk": "^14.6.1", "@walletconnect/core": "2.25.0", "@walletconnect/react-native-compat": "2.17.1", "@walletconnect/utils": "2.25.0", diff --git a/frontend/mobile/package.json b/frontend/mobile/package.json index deff3083..7180a317 100644 --- a/frontend/mobile/package.json +++ b/frontend/mobile/package.json @@ -32,8 +32,6 @@ "@reown/walletkit": "^1.6.0", "@soroswap/sdk": "^0.4.0", "@stellar/stellar-sdk": "^17.0.1", - "@walletconnect/core": "2.17.1", - "@stellar/stellar-sdk": "^14.6.1", "@walletconnect/core": "2.25.0", "@walletconnect/react-native-compat": "2.17.1", "@walletconnect/utils": "2.25.0", diff --git a/sdk/src/sep8.ts b/sdk/src/sep8.ts index 54b97154..4acf837b 100644 --- a/sdk/src/sep8.ts +++ b/sdk/src/sep8.ts @@ -299,19 +299,19 @@ export function verifyRevisedTransaction(originalXdr: string, revisedXdr: string // The account on the hook for the whole transaction must not change. if ( - originalTx.sourceAccount().toXDR('base64') !== revisedTx.sourceAccount().toXDR('base64') + originalTx.sourceAccount.toXDR('base64') !== revisedTx.sourceAccount.toXDR('base64') ) { return false; } // A changed memo can redirect a payment at an exchange without altering // any operation, so it is part of the user's intent. - if (originalTx.memo().toXDR('base64') !== revisedTx.memo().toXDR('base64')) { + if (originalTx.memo.toXDR('base64') !== revisedTx.memo.toXDR('base64')) { return false; } - const originalOps = originalTx.operations().map((op) => op.toXDR('base64')); - const revisedOps = revisedTx.operations().map((op) => op.toXDR('base64')); + const originalOps = originalTx.operations.map((op) => op.toXDR('base64')); + const revisedOps = revisedTx.operations.map((op) => op.toXDR('base64')); // A revision that drops operations is not a revision. if (revisedOps.length < originalOps.length) return false; @@ -339,13 +339,13 @@ export function verifyRevisedTransaction(originalXdr: string, revisedXdr: string */ function innerTransaction(envelopeXdr: string): xdr.Transaction | null { const envelope = xdr.TransactionEnvelope.fromXDR(envelopeXdr, 'base64'); - switch (envelope.switch().name) { + switch (envelope.type) { case 'envelopeTypeTx': - return envelope.v1().tx(); - case 'envelopeTypeTxFeeBump': { - const inner = envelope.feeBump().tx().innerTx(); - return inner.switch().name === 'envelopeTypeTx' ? inner.v1().tx() : null; - } + return envelope.v1.tx; + // sdk 17 types the fee-bump inner as envelopeTypeTx alone, so a v0 inner + // fails to decode and is refused by the caller's catch rather than waved through. + case 'envelopeTypeTxFeeBump': + return envelope.feeBump.tx.innerTx.v1.tx; default: return null; } From 4cce82277b76526f242712d4283d615821e579ba Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Sun, 4 Oct 2026 16:20:00 +0100 Subject: [PATCH 12/14] fix(mobile): un-break the merged jest transform allow-list (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit frontend/mobile/jest.config.js did not parse: merging main twice left two replacement bodies stacked inside one arrow function with no operator between them, so `npm test` died on `SyntaxError: missing ) after argument list` before a single suite could load. The same shape of merge damage #660 found in package.json, in a different file. main's version was valid, and the other tracked .js/.cjs/.mjs files all pass `node --check`, so this was the only instance. The two halves were each trying to widen the expo preset's ignore pattern for a different set of ESM-only packages — the stellar-sdk 17 dependencies (@exodus/bytes, uint8array-extras, smol-toml) on one side, @walletconnect on the other — so the union is the intent, keeping the `.map()` form so the preset's own react-native/expo entries are preserved rather than retyped. The duplicated explanatory sentence is collapsed into one paragraph. --- frontend/mobile/jest.config.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/frontend/mobile/jest.config.js b/frontend/mobile/jest.config.js index 1b6b23f7..c0e63a63 100644 --- a/frontend/mobile/jest.config.js +++ b/frontend/mobile/jest.config.js @@ -5,10 +5,8 @@ const expoPreset = require('jest-expo/jest-preset'); * * `jest-expo` supplies the React Native transform, module mocks, and test * environment. The only change is the transform allow-list: `@noble/ciphers`, - * `@noble/hashes`, and — since stellar-sdk 17 — `@exodus/bytes`, - * `uint8array-extras`, and `smol-toml` ship ESM only, and Jest cannot `require` - * them untransformed. Metro handles them natively, so this affects tests alone. - * `@noble/hashes` and the `@walletconnect` packages ship ESM only, and Jest + * `@noble/hashes`, the `@walletconnect` packages, and — since stellar-sdk 17 — + * `@exodus/bytes`, `uint8array-extras`, and `smol-toml` ship ESM only, and Jest * cannot `require` them untransformed. Metro handles them natively, so this * affects tests alone. `@walletconnect` is on the list because `walletStore` * imports the WalletConnect session-key constant from its owner; that already @@ -23,9 +21,8 @@ module.exports = { setupFiles: [...expoPreset.setupFiles, '/jest.setup.js'], modulePaths: ['/node_modules'], transformIgnorePatterns: expoPreset.transformIgnorePatterns.map((pattern) => - pattern.startsWith('/node_modules/(?!(') ? pattern.replace('(?!(', '(?!(@noble|@exodus|uint8array-extras|smol-toml|') : pattern pattern.startsWith('/node_modules/(?!(') - ? pattern.replace('(?!(', '(?!(@noble|@walletconnect|') + ? pattern.replace('(?!(', '(?!(@noble|@exodus|uint8array-extras|smol-toml|@walletconnect|') : pattern ), moduleNameMapper: { From c193335350c232f16dcc47a1d8df59f22ac44a1b Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Sun, 4 Oct 2026 18:26:15 +0100 Subject: [PATCH 13/14] fix(mobile): drop the dead web3wallet import left by the WalletKit migration (#660) `lib/walletConnect.ts` was the last file in the repo still naming `@walletconnect/web3wallet`, and the package is gone from both mobile and wallet lockfiles, so the import resolved to nothing and `tsc` failed with TS2307. Every call site already uses WalletKit (`WalletKit.init`, `IWalletKit`), so this is an unused import, not a missing dependency. Mobile typecheck could not run at all before this: `npm ci` died on the duplicate stellar-sdk key that 7a63bcd removed, which masked this error. --- frontend/mobile/lib/walletConnect.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/mobile/lib/walletConnect.ts b/frontend/mobile/lib/walletConnect.ts index 88b34139..db4b3cb8 100644 --- a/frontend/mobile/lib/walletConnect.ts +++ b/frontend/mobile/lib/walletConnect.ts @@ -19,7 +19,6 @@ import { } from '@stellar/stellar-sdk'; import { Core } from '@walletconnect/core'; import { getSdkError } from '@walletconnect/utils'; -import { Web3Wallet, type IWeb3Wallet } from '@walletconnect/web3wallet'; import { WalletKit, type IWalletKit } from '@reown/walletkit'; import { Buffer } from 'buffer'; import * as Crypto from 'expo-crypto'; From 095dd62f0d0a6c51dc29584c8e6646f518c1a70d Mon Sep 17 00:00:00 2001 From: Kuma Iliya Date: Sun, 4 Oct 2026 18:32:25 +0100 Subject: [PATCH 14/14] fix(deps): put the wallet manifest and lock back in sync on one bip39 (#660) Merging main's WalletKit migration re-added `@scure/bip39: ^1.6.0` next to the `^2.4.0` this branch installs, and JSON keeps the last key, so the wallet effectively asked npm for 1.6.0 against a lockfile resolving 2.4.0. `npm ci` failed with EUSAGE before installing anything. 2.4.0 is the version the tree already holds and the one stellar-sdk 17 needs: stellar-sdk declares `@noble/hashes ^2.2.0`, and bip39 2.4.0 depends on 2.4.0, so both share one copy instead of forcing a second. `ox` (via WalletKit) and `@scure/bip32` still want the 1.x line, so the lock now records those as their own nested copies after `npm install --package-lock-only`. No already-resolved version changed. The only removals are 17 `@ethersproject/*` entries nothing in the graph references any more, orphaned by the same WalletKit migration. --- frontend/wallet/package-lock.json | 447 ++++++------------------------ frontend/wallet/package.json | 1 - 2 files changed, 80 insertions(+), 368 deletions(-) diff --git a/frontend/wallet/package-lock.json b/frontend/wallet/package-lock.json index cea587f7..bdeb16f8 100644 --- a/frontend/wallet/package-lock.json +++ b/frontend/wallet/package-lock.json @@ -12,9 +12,8 @@ "@blend-capital/blend-sdk": "^3.3.0", "@noble/curves": "^2.4.0", "@noble/hashes": "^2.4.0", - "@scure/bip39": "^2.4.0", "@reown/walletkit": "^1.6.0", - "@scure/bip39": "^1.6.0", + "@scure/bip39": "^2.4.0", "@sentry/nextjs": "^8.0.0", "@soroswap/sdk": "^0.4.0", "@stellar/stellar-sdk": "^17.0.1", @@ -2432,371 +2431,6 @@ "node": ">=12" } }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", - "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/networks": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@ethersproject/web": "^5.8.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", - "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", - "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/rlp": "^5.8.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", - "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", - "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", - "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", - "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", - "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/base64": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", - "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", - "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT" - }, - "node_modules/@ethersproject/networks": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", - "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", - "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", - "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "bn.js": "^5.2.1", - "elliptic": "6.6.1", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", - "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", - "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/rlp": "^5.8.0", - "@ethersproject/signing-key": "^5.8.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", - "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/base64": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, "node_modules/@exodus/bytes": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", @@ -5429,6 +5063,33 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@scure/bip39": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-2.4.0.tgz", @@ -7387,6 +7048,33 @@ "uint8arrays": "3.1.1" } }, + "node_modules/@walletconnect/utils/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/utils/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@walletconnect/window-getters": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", @@ -13184,6 +12872,31 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/ox/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", diff --git a/frontend/wallet/package.json b/frontend/wallet/package.json index a87ef059..6dd9d614 100644 --- a/frontend/wallet/package.json +++ b/frontend/wallet/package.json @@ -21,7 +21,6 @@ "@noble/hashes": "^2.4.0", "@scure/bip39": "^2.4.0", "@reown/walletkit": "^1.6.0", - "@scure/bip39": "^1.6.0", "@sentry/nextjs": "^8.0.0", "@soroswap/sdk": "^0.4.0", "@stellar/stellar-sdk": "^17.0.1",