Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
ab56268
feat(appkit): start input component
heyllog Mar 25, 2026
9c9baa1
feat(appkit): add fonts from figma
heyllog Mar 25, 2026
709e920
feat(appkit): add colors from figma
heyllog Mar 25, 2026
506e0a4
feat(appkit): add new button styles
heyllog Mar 25, 2026
74cca54
feat(swap): add initial swap UI
heyllog Mar 26, 2026
2335641
feat(appkit): start modal component
heyllog Mar 26, 2026
13ce447
feat(appkit): start reworking storybook
heyllog Mar 26, 2026
451f127
feat(storybook): rework storybook theme
heyllog Mar 26, 2026
19b2764
feat(swap): update storybook
heyllog Mar 29, 2026
c7e688f
feat(swap): add swap provider
heyllog Mar 30, 2026
05af4aa
feat(swap): add debounce
heyllog Mar 30, 2026
f8791b1
feat(swap): enable send button
heyllog Mar 30, 2026
e606f6c
feat(swap): start select currency modal
heyllog Mar 30, 2026
397c9f5
feat(swap): add more currencies
heyllog Mar 30, 2026
312d0cd
feat(swap): map addresses and show balances
heyllog Mar 31, 2026
2e5e664
Merge branch 'main' into feat/TON-376-swap-design
heyllog Mar 31, 2026
8397efe
feat(swap): add amount validation
heyllog Mar 31, 2026
4900885
feat(swap): add skeletons
heyllog Mar 31, 2026
f607161
feat(swap): add providers metadata
heyllog Mar 31, 2026
ad708ea
feat(swap): fix TON token
heyllog Mar 31, 2026
111b737
feat(swap): slippage
heyllog Mar 31, 2026
50964c7
feat(swap): add autoscale input and rework amount formats
heyllog Apr 1, 2026
6b0d14a
feat(swap): rework autoscale
heyllog Apr 1, 2026
07cfede
feat(swap): create InfoBlock component and rework SwapInfo
heyllog Apr 1, 2026
0e31658
feat(swap): create separate TokenSelectModal
heyllog Apr 1, 2026
55da0d8
feat(swap): delete radix-ui
heyllog Apr 1, 2026
51133ab
feat(swap): get radix-ui back
heyllog Apr 1, 2026
ef580fe
Merge branch main into feature/TON-376-swap-design
heyllog Apr 3, 2026
9b91a21
feat(swap): start updating appkit-minter design
heyllog Apr 3, 2026
68e86e6
feat(swap): rework balances
heyllog Apr 3, 2026
e82e2af
feat(swap): fix storybook
heyllog Apr 3, 2026
1be3691
feat(swap): delete links from header
heyllog Apr 3, 2026
8b0be12
feat(swap): delete fake rates
heyllog Apr 3, 2026
62382a3
Merge branch 'main' into feat/TON-376-swap-design
heyllog Apr 6, 2026
5b75f27
feat(swap): add changeset
heyllog Apr 6, 2026
23cc4bf
Merge branch 'main' into feat/TON-376-swap-design
heyllog Apr 14, 2026
adac739
feat(staking): start staking UI
heyllog Apr 14, 2026
c881754
feat(staking): add more fields in provider info
heyllog Apr 14, 2026
aa01185
feat(staking): start unstaking UI
heyllog Apr 14, 2026
ae1ed33
feat(swap): delete inline styles and replace button
heyllog Apr 14, 2026
e5ae53a
feat(staking): add unstake mode selector
heyllog Apr 15, 2026
013913b
feat(staking): rework unstake number
heyllog Apr 15, 2026
a959cb0
feat(staking): add watchers and rework quotes
heyllog Apr 16, 2026
f1348d0
feat(staking): add addresses in metadata
heyllog Apr 16, 2026
2646151
feat(staking): receive token is optional
heyllog Apr 16, 2026
82b1667
feat(staking): rework reverse
heyllog Apr 16, 2026
c81248c
feat(staking): cleanup
heyllog Apr 16, 2026
117009a
feat(staking): add whenAvailable unstake mode and filters
heyllog Apr 16, 2026
0bcfe62
feat(staking): hide mode selector if 1 mode
heyllog Apr 16, 2026
ad32c16
feat(staking): cleanup
heyllog Apr 16, 2026
dd7985a
feat(staking): change colors
heyllog Apr 16, 2026
88f9d6c
Merge branch main into feature/TON-376-swap-design
heyllog Apr 16, 2026
8597a05
Merge branch 'feat/TON-376-swap-design' into feat/TON-729-staking-ui
heyllog Apr 16, 2026
50c5bf3
feat(staking): add changeset
heyllog Apr 16, 2026
c59b80b
feat(staking/swap): add stories and exports for internal components
heyllog Apr 17, 2026
65b4ebc
feat(staking): fix network selection
heyllog Apr 17, 2026
b9ffe7e
feat(swap): add network to hooks
heyllog Apr 17, 2026
47fc488
feat(swap): fix swap-field
heyllog Apr 17, 2026
f1a069a
feat(staking): add docs
heyllog Apr 17, 2026
2681eaa
feat(swaps): add docs
heyllog Apr 17, 2026
d37063e
docs: refine staking and swap documentation and remove provider hooks
heyllog Apr 17, 2026
6b09dc9
feat(staking): rework appkit-minter design
heyllog Apr 19, 2026
41b1097
Merge branch 'main' into feat/TON-376-swap-design
heyllog Apr 20, 2026
aff927f
Merge branch 'feat/TON-376-swap-design' into feat/TON-729-staking-ui
heyllog Apr 20, 2026
79fe1b3
feat(swaps): create SwapProviderMetadataOverride
heyllog Apr 20, 2026
bc58ca0
Merge branch 'feat/TON-376-swap-design' into feat/TON-729-staking-ui
heyllog Apr 20, 2026
3f405b3
feat(staking): create StakingProviderMetadataOverride
heyllog Apr 20, 2026
156cef2
feat(swap): improve MAX logic and rework info
heyllog Apr 22, 2026
75f41de
feat(swap): add topup flow
heyllog Apr 22, 2026
ee068f7
feat(swap): polish
heyllog Apr 22, 2026
22041f4
feat(swap): rework settings, add action/hooks to choose provider
heyllog Apr 22, 2026
985666b
feat(swap): add docs
heyllog Apr 22, 2026
573aae0
feat(staking): add docs
heyllog Apr 23, 2026
2739953
feat(swap): add factories to create providers
heyllog Apr 23, 2026
3501098
feat(swap): rework analyzeBalanceShortfall
heyllog Apr 23, 2026
e3b6834
feat(swap): make LowBalanceModal generic
heyllog Apr 23, 2026
f28bdf1
feat(swap): move analyze-balance-shortfall to appkit
heyllog Apr 23, 2026
91eddbe
feat(staking): improve MAX logic
heyllog Apr 23, 2026
f921dcb
feat(staking): improve quote ui
heyllog Apr 23, 2026
e393766
feat(staking): fix reversed amount
heyllog Apr 23, 2026
b73726d
feat(staking): add provider in info block
heyllog Apr 23, 2026
b968a4e
feat(staking): unified api for swap/staking widgets
heyllog Apr 23, 2026
a1d300d
feat(staking): fix wrong balance in non-mainnet widget
heyllog Apr 23, 2026
ee749cb
feat(defi): add getSupportedNetworks to defi providers
heyllog Apr 23, 2026
f8425ad
feat(defi): show unsupported network error
heyllog Apr 23, 2026
12917c8
feat(swap): improve network support
heyllog Apr 23, 2026
90fb1a8
feat(defi): improve error handling
heyllog Apr 23, 2026
fead9d4
feat(swap): add error message
heyllog Apr 23, 2026
a5af535
feat(staking): move BaseProvider to models from interfaces
heyllog Apr 23, 2026
b3be746
feat(staking): remove internal api exports
heyllog Apr 23, 2026
c1f5243
feat(docs): add changesets
heyllog Apr 24, 2026
0e53020
feat(swap): add settings button
heyllog May 6, 2026
556cf47
feat(swap): delete background in swap field
heyllog May 6, 2026
22e7899
feat(staking): add settings button
heyllog May 7, 2026
4258bca
feat(appkit-react): cleanup components
heyllog May 7, 2026
bec75f3
feat(appkit-react): add OptionSwitcher component
heyllog May 7, 2026
3556ed0
feat(staking): add select and rework OptionSwitcher
heyllog May 7, 2026
b0aa3c8
fix(appkit): Add normalize function for address in getJettonBalanceBy…
TrueCarry May 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
21 changes: 21 additions & 0 deletions .changeset/smooth-bushes-wear.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
'@ton/appkit-react': patch
'@ton/walletkit': patch
'@ton/appkit': patch
---

- `@ton/appkit`:
- added `getSwapProvider` and `watchSwapProviders` actions
- added swap-related events and types to `AppKit` core
- added `calcFiatValue` and `formatLargeValue` amount utilities
- added `debounce` utility function
- `@ton/walletkit`:
- added `SwapProviderMetadata` interface
- added `getMetadata()` method to `SwapProvider`
- added metadata support to `DeDustSwapProvider` and `OmnistonSwapProvider`
- `@ton/appkit-react`:
- added `SwapWidget` and related UI components (`SwapField`, `SwapSettings`, `TokenSelector`, etc.)
- added `SwapWidgetProvider` for swap state management
- added hooks for swap: `useSwapProvider`, `useSwapQuote`, `useBuildSwapTransaction`
- added `useDebounceCallback`, `useDebounceValue`, and `useUnmount` utility hooks
- added English localizations for swap features
22 changes: 22 additions & 0 deletions .changeset/staking-ui-and-metadata-refactor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
'@ton/appkit-react': patch
'@ton/walletkit': patch
'@ton/appkit': patch
---

- `@ton/walletkit`:
- refactored `StakingProviderMetadata`: flat token fields replaced with `stakeToken: StakingTokenInfo` object and optional `receiveToken?: StakingTokenInfo` group to support both liquid and custodial staking providers
- made `contractAddress` optional in `StakingProviderMetadata` for custodial providers without on-chain contracts
- renamed `lstExchangeRate` to `exchangeRate` in `StakingProviderInfo`
- added `StakingTokenInfo` type export
- added `isReversed` parameter to `StakingQuoteParams` for reversed unstake quotes
- added deep-merge support for metadata overrides in `TonStakersStakingProvider` constructor
- added `getStakingProvider` and `watchStakingProviders` to `DefiManager`
- `@ton/appkit`:
- added `getStakingProviderMetadata`, `getStakingProvider`, and `watchStakingProviders` actions
- added `truncateDecimals` and `formatLargeValue` amount utilities
- exported `StakingTokenInfo` type
- `@ton/appkit-react`:
- added `StakingWidget` with full stake/unstake UI, balance display, reversed quotes, and unstake mode selector
- updated base design tokens to TonConnect colors
- added staking hooks and i18n translations
39 changes: 39 additions & 0 deletions .changeset/staking-widget.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
'@ton/walletkit': major
'@ton/appkit': minor
'@ton/appkit-react': minor
---

**Staking widget and provider API**

Breaking changes in `@ton/walletkit`:
- `getSupportedUnstakeModes()` removed from `StakingProviderInterface` and `StakingProvider`; replaced by `getStakingProviderMetadata(network?)` which returns full static metadata (including unstake modes)
- `getSupportedNetworks()` added as abstract method to `StakingProvider` — existing custom subclasses must implement it
- `DefiManagerError` renamed to `DefiError`
- `lstExchangeRate` renamed to `exchangeRate` in `StakingProviderInfo`
- `StakingProviderMetadata` shape changed: flat token fields replaced with `stakeToken: StakingTokenInfo` and optional `receiveToken?: StakingTokenInfo`

Breaking changes in `@ton/appkit`:
- `getStakingProviders()` return type changed from `string[]` to `StakingProviderInterface[]`

New in `@ton/walletkit`:
- Added `StakingTokenInfo` type (exported)
- `contractAddress` is now optional in `StakingProviderMetadata` (for custodial providers)
- Added `isReversed` to `StakingQuoteParams` for reversed unstake quotes
- `TonStakersStakingProvider` accepts `metadataOverride` in config; constructor deep-merges overrides with defaults
- `BaseProvider` moved from `interfaces` to `models/core` and re-exported
- Added `TokenAddress` type (`'ton' | UserFriendlyAddress`)
- `StakingErrorCode` now exported
- `DefiError.UNSUPPORTED_NETWORK` error code added
- `StakingManager`, `StakingProvider`, `StakingError` are now value exports (not only type exports)

New in `@ton/appkit`:
- Added actions: `getStakingProvider`, `getStakingProviderMetadata`, `watchStakingProviders`
- Added utilities: `truncateDecimals`, `calcMaxSpendable`
- `StakingProviderMetadata` and `StakingTokenInfo` now exported from `@ton/appkit`

New in `@ton/appkit-react`:
- Added `StakingWidget` — full stake/unstake UI with reversed quotes, balance display, and unstake mode selector
- New components: `StakingWidgetProvider`, `StakingWidgetUi`, `StakingInfo`, `StakingBalanceBlock`, `SelectUnstakeMode`
- New hooks: `useStakingProvider`, `useStakingProviders`, `useStakingProviderInfo`, `useStakingProviderMetadata`, `useStakingQuote`, `useBuildStakeTransaction`, `useStakedBalance`
- Added English localizations for all staking UI strings
41 changes: 41 additions & 0 deletions .changeset/swap-widget.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
'@ton/walletkit': major
'@ton/appkit': minor
'@ton/appkit-react': minor
---

**Swap widget and provider API**

Breaking changes in `@ton/walletkit`:
- `DefiManagerError` renamed to `DefiError`; update any `catch (e instanceof DefiManagerError)` or direct import
- `SwapFee` type removed; `fee` field removed from `SwapQuote`
- `getSupportedNetworks()` and `getMetadata()` added as abstract methods to `SwapProvider` — existing custom provider subclasses must implement them

New in `@ton/walletkit`:
- Added `SwapProviderMetadata` and `SwapProviderMetadataOverride` types
- `getMetadata()` on `SwapProviderInterface` returns static display info (name, logo, URL)
- `getSupportedNetworks()` on `SwapProviderInterface` returns supported networks
- `DeDustSwapProvider` and `OmnistonSwapProvider` expose metadata; both accept `metadataOverride` in config
- `getProviders()` replaces `getRegisteredProviders()` — returns `SwapProviderInterface[]` instead of `string[]`
- `removeProvider()` added to `DefiManagerAPI`
- Re-registering a provider with an existing id now replaces it instead of throwing
- `DefiError.UNSUPPORTED_NETWORK` error code added
- `SwapError`, `SwapManager`, `SwapProvider` are now value exports (not only type exports)
- Providers emit `provider:registered` and `provider:default-changed` events on `AppKit`'s event emitter

New in `@ton/appkit`:
- Added actions: `getSwapProvider`, `getSwapProviders`, `watchSwapProviders`, `setDefaultSwapProvider`
- `getSwapQuote` now resolves the active network automatically when `network` is omitted
- Added utilities: `calcFiatValue`, `formatLargeValue`, `debounce`, `calcMaxSpendable`, `getTonShortfall`

New in `@ton/appkit-react`:
- Added `SwapWidget` — full-featured swap UI with token selection, amount input, slippage settings, provider picker, and top-up flow
- New components: `SwapField`, `SwapFlipButton`, `SwapInfo`, `SwapSettingsButton`, `SwapSettingsModal`, `SwapTokenSelectModal`, `SwapWidgetProvider`, `SwapWidgetUi`
- New hooks: `useSwapProvider`, `useSwapProviders`, `useSwapQuote`, `useBuildSwapTransaction`
- Added generic `LowBalanceModal` component (shared with staking widget)
- New utility hooks: `useDebounceCallback`, `useDebounceValue`, `useUnmount`
- New shared components: `Input`, `Modal`, `Dialog`, `Skeleton`, `Tabs`, `InfoBlock`, `Collapsible`, `CenteredAmountInput`, `AmountPresets`, `TokenSelectModal`, `Logo`, `AmountReversed`
- Added `AppKitUIToken` type for CSS custom property tokens
- `useAppKit`, `useAppKitTheme`, `useI18n` moved to `features/settings` (still re-exported from the package root — no import path change needed)
- `CircleIcon` renamed to `Logo` with an extended API; replace `<CircleIcon src=... />` with `<Logo src=... />`
- Added English localizations for all swap UI strings
5 changes: 5 additions & 0 deletions .superset/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"setup": [],
"teardown": [],
"run": []
}
4 changes: 4 additions & 0 deletions apps/appkit-minter/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
"@ton/crypto": "catalog:",
"@tonconnect/sdk": "catalog:",
"@tonconnect/ui-react": "catalog:",
"@radix-ui/react-dialog": "1.1.15",
"@radix-ui/react-separator": "1.1.8",
"@radix-ui/react-slot": "1.2.4",
"@radix-ui/react-tooltip": "1.2.8",
"buffer": "^6.0.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
Expand Down
3 changes: 1 addition & 2 deletions apps/appkit-minter/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import { AppKitProvider } from '@ton/appkit-react';
import { appKit } from '@/core/configs/app-kit';
import { AppRouter, ThemeProvider, ToasterProvider } from '@/core/components';

import './core/styles/app.css';
import '@ton/appkit-react/styles.css';
import './core/styles/index.css';

const queryClient = new QueryClient();

Expand Down
62 changes: 62 additions & 0 deletions apps/appkit-minter/src/core/components/app-logo/app-logo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/**
* Copyright (c) TonTech.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/

import type { ComponentProps, FC } from 'react';

import { cn } from '@/core/lib/utils';

export const AppLogo: FC<ComponentProps<'div'>> = ({ className, ...props }) => {
return (
<div
className={cn(
'flex size-10 items-center justify-center rounded-lg bg-gradient-to-br from-primary to-primary/60 p-1',
className,
)}
{...props}
>
<svg
viewBox="-33 0 255 255"
xmlns="http://www.w3.org/2000/svg"
preserveAspectRatio="xMidYMid"
className="h-full w-full"
aria-hidden="true"
>
<defs>
<linearGradient
id="app-logo-fire"
gradientUnits="userSpaceOnUse"
x1="94.141"
y1="255"
x2="94.141"
y2="0.188"
>
<stop offset="0" stopColor="#ff4c0d" />
<stop offset="1" stopColor="#fc9502" />
</linearGradient>
</defs>
<g>
<path
fill="url(#app-logo-fire)"
fillRule="evenodd"
d="M187.899,164.809 C185.803,214.868 144.574,254.812 94.000,254.812 C42.085,254.812 -0.000,211.312 -0.000,160.812 C-0.000,154.062 -0.121,140.572 10.000,117.812 C16.057,104.191 19.856,95.634 22.000,87.812 C23.178,83.513 25.469,76.683 32.000,87.812 C35.851,94.374 36.000,103.812 36.000,103.812 C36.000,103.812 50.328,92.817 60.000,71.812 C74.179,41.019 62.866,22.612 59.000,9.812 C57.662,5.384 56.822,-2.574 66.000,0.812 C75.352,4.263 100.076,21.570 113.000,39.812 C131.445,65.847 138.000,90.812 138.000,90.812 C138.000,90.812 143.906,83.482 146.000,75.812 C148.365,67.151 148.400,58.573 155.999,67.813 C163.226,76.600 173.959,93.113 180.000,108.812 C190.969,137.321 187.899,164.809 187.899,164.809 Z"
/>
<path
fill="#fc9502"
fillRule="evenodd"
d="M94.000,254.812 C58.101,254.812 29.000,225.711 29.000,189.812 C29.000,168.151 37.729,155.000 55.896,137.166 C67.528,125.747 78.415,111.722 83.042,102.172 C83.953,100.292 86.026,90.495 94.019,101.966 C98.212,107.982 104.785,118.681 109.000,127.812 C116.266,143.555 118.000,158.812 118.000,158.812 C118.000,158.812 125.121,154.616 130.000,143.812 C131.573,140.330 134.753,127.148 143.643,140.328 C150.166,150.000 159.127,167.390 159.000,189.812 C159.000,225.711 129.898,254.812 94.000,254.812 Z"
/>
<path
fill="#fce202"
fillRule="evenodd"
d="M95.000,183.812 C104.250,183.812 104.250,200.941 116.000,223.812 C123.824,239.041 112.121,254.812 95.000,254.812 C77.879,254.812 69.000,240.933 69.000,223.812 C69.000,206.692 85.750,183.812 95.000,183.812 Z"
/>
</g>
</svg>
</div>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
*
*/

export * from './components/swap-button';
export { AppLogo } from './app-logo';
62 changes: 0 additions & 62 deletions apps/appkit-minter/src/core/components/common/button.tsx

This file was deleted.

1 change: 0 additions & 1 deletion apps/appkit-minter/src/core/components/common/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,4 @@
*
*/

export { Button } from './button';
export { Card } from './card';
8 changes: 7 additions & 1 deletion apps/appkit-minter/src/core/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,14 @@
*/

// Common components
export { Button, Card } from './common';
export { Card } from './common';
export { ToasterProvider } from './common/toaster-provider';

// Layout components
export { Layout, AppRouter, ThemeProvider } from './layout';

// UI components
export { Sidebar } from './sidebar';
export { Sheet } from './sheet';
export { Separator } from './separator';
export { Tooltip } from './tooltip';
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { useWatchBalance, useWatchTransactions, useWatchJettons } from '@ton/appkit-react';
import { toast } from 'sonner';

import { MinterPage } from '@/pages';
import { MinterPage, StakingPage, SwapPage, SignMessagePage } from '@/pages';

export const AppRouter: React.FC = () => {
// Enable global real-time balance updates
Expand Down Expand Up @@ -50,6 +50,9 @@ export const AppRouter: React.FC = () => {
<BrowserRouter>
<Routes>
<Route path="/" element={<MinterPage />} />
<Route path="/swap" element={<SwapPage />} />
<Route path="/staking" element={<StakingPage />} />
<Route path="/sign" element={<SignMessagePage />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</BrowserRouter>
Expand Down
Loading
Loading