Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
28100c7
feat(onramp): start with onramp
heyllog Mar 2, 2026
e9aa58b
Merge branch 'main' into feat/TON-240-onramp
heyllog Mar 3, 2026
5d720d6
feat(onramp): add mercuryo
heyllog Mar 4, 2026
8365ce6
feat(onramp): start onramp widget
heyllog Apr 7, 2026
014bcdd
Merge branch 'main' into feat/TON-622-onramp-design
heyllog Apr 7, 2026
e0e4c33
feat(onramp): reword design
heyllog Apr 7, 2026
3e3d288
feat(onramp): add resize for input
heyllog Apr 7, 2026
db174a4
feat(onramp): create centered amount input
heyllog Apr 7, 2026
7ddf526
feat(onramp): cleanup
heyllog Apr 7, 2026
d28b3f7
feat(swap): cleanup
heyllog Apr 7, 2026
f300f59
feat(onramp): i18n
heyllog Apr 8, 2026
3795663
feat(onramp): add sections in list
heyllog Apr 8, 2026
99bf962
feat(onramp): add sections in currencies list
heyllog Apr 8, 2026
765e343
feat(onramp): draft crypto onramp
heyllog Apr 13, 2026
5ed90a3
Merge branch 'feat/TON-376-swap-design' into feat/TON-622-onramp-design
heyllog Apr 17, 2026
bb69304
Merge branch feat/TON-240-onramp into feat/TON-622-onramp-design
heyllog Apr 17, 2026
5719b1d
feat(onramp): draft connect
heyllog Apr 17, 2026
ec41a6d
Merge branch feat/TON-729-staking-ui into feat/TON-622-onramp-design
heyllog Apr 17, 2026
10cdd6e
feat(onramp): draft tonpay
heyllog Apr 17, 2026
475e91a
Merge branch 'feat/TON-729-staking-ui' into feat/TON-622-onramp-design
heyllog Apr 20, 2026
cd3ecb5
feat(onramp): add tonpay widget in appkit-minter
heyllog Apr 20, 2026
d3c5194
Merge branch 'feat/TON-729-staking-ui' into feat/TON-622-onramp-design
heyllog Apr 20, 2026
e9545a9
Merge branch 'feat/TON-729-staking-ui' into feat/TON-622-onramp-design
heyllog Apr 20, 2026
731e4fd
Merge branch feat/TON-622-onramp-design into feat/TON-622-crypto-onra…
heyllog Apr 21, 2026
83f6b38
feat(crypto-onramp): add crypto onramp manager/provider
heyllog Apr 21, 2026
63b3a2b
feat(crypto-onramp): add swaps.xyz
heyllog Apr 21, 2026
1820014
feat(crypto-onramp): add some crypto onramp hooks
heyllog Apr 21, 2026
fcdefe9
feat(crypto-onramp): add swaps.xyz
heyllog Apr 21, 2026
3614105
feat(crypto-onramp): add debounce
heyllog Apr 21, 2026
930b2a4
feat(crypto-onramp): handle errors
heyllog Apr 21, 2026
423976b
feat(crypto-onramp): add info section
heyllog Apr 21, 2026
9be2217
feat(crypto-onramp): ui adjustments
heyllog Apr 21, 2026
6099d23
feat(crypto-onramp): reset quote on modal closing
heyllog Apr 21, 2026
e5e9f4f
feat(crypto-onramp): add status checking
heyllog Apr 21, 2026
0c95bd6
feat(crypto-onramp): add refund address support
heyllog Apr 21, 2026
89dd20a
feat(crypto-onramp): integrate Layerswap provider and enhance balance…
TrueCarry Apr 21, 2026
3ea59a6
feat(crypto-onramp): rework balance row in modal
heyllog Apr 22, 2026
9f0af47
feat(swap): fix fiatSymbol
heyllog Apr 22, 2026
47d7ce1
feat(appkit): replace function with const
heyllog Apr 22, 2026
e0780e6
feat(appkit): add refetch intervals for balances in widgets
heyllog Apr 22, 2026
9faf581
Merge branch feat/TON-729-staking-ui into feat/TON-622-crypto-onramp-…
heyllog May 1, 2026
364bd68
feat(crypto-onramp): polishing
heyllog May 4, 2026
62353f0
feat(crypto-onramp): add crypto onramp actions/hooks to get providers
heyllog May 4, 2026
6a0f0df
feat(crypto-onramp): add factory functions
heyllog May 4, 2026
c489795
feat(crypto-onramp): update docs, rework addresses logic
heyllog May 4, 2026
68ba584
feat(crypto-onramp): add requiresRefundAddress flag
heyllog May 4, 2026
f1ec9bd
feat(crypto-onramp): rework refund address logic
heyllog May 5, 2026
d6badd1
feat(crypto-onramp): add isReversedAmountSupported flag
heyllog May 5, 2026
2003f79
feat(crypto-onramp): small fixes in providers
heyllog May 5, 2026
37f8731
feat(crypto-onramp): rework chains
heyllog May 6, 2026
7eddc59
Merge branch feat/TON-729-staking-ui into feat/TON-622-crypto-onramp-…
heyllog May 7, 2026
b18933f
feat(appkit-react): replace components
heyllog May 7, 2026
cab129c
feat(appkit-react): add missing stories
heyllog May 7, 2026
41b32a2
Merge branch feat/TON-729-staking-ui into feat/TON-622-crypto-onramp-…
heyllog May 14, 2026
7143cf9
Merge branch 'feat/TON-729-staking-ui' into feat/TON-622-crypto-onram…
heyllog May 14, 2026
f9a30e9
Merge branch main into feat/TON-622-crypto-onramp-design
heyllog May 18, 2026
f6da326
feat(crypto-onramp): add settings
heyllog May 18, 2026
62ce4c3
feat(crypto-onramp): rename swaps.xyz to decent
heyllog May 18, 2026
9302138
feat(crypto-onramp): add refund address modes
heyllog May 18, 2026
f66bf43
feat(crypto-onramp): rename settings
heyllog May 18, 2026
1c8ead2
feat(crypto-onramp): add networks parsing
heyllog May 18, 2026
d510b21
feat(crypto-onramp): rework currencies settings
heyllog May 19, 2026
716c467
feat(walletkit): make crypto onramp provider methods async
heyllog May 20, 2026
4dafb49
feat(crypto-onramp): rework default currencies
heyllog May 21, 2026
cb9d3c8
feat(crypto-onramp): add tron to layerswap
heyllog May 21, 2026
2875aa8
feat(crypto-onramp): add network filters
heyllog May 21, 2026
19afae1
feat(crypto-onramp): add empty state
heyllog May 21, 2026
1c38927
feat(crypto-onramp): fix merge conflicts and merge main
heyllog May 21, 2026
eabb1db
feat(crypto-onramp): add default currency for widget in minetr
heyllog May 21, 2026
f208fbc
feat(crypto-onramp): fix old value in reverse amount field
heyllog May 21, 2026
0f750ec
feat(crypto-onramp): unlock input without connected wallet
heyllog May 21, 2026
af87206
feat(crypto-onramp): improve error handling
heyllog May 21, 2026
4c0542e
feat(crypto-onramp): copy amount without ticker
heyllog May 22, 2026
93d0261
feat(crypto-onramp): open connect on input click
heyllog May 22, 2026
ad81e6a
Merge branch main into feat/TON-622-crypto-onramp-design
heyllog May 26, 2026
af27da8
merge main
heyllog Jun 3, 2026
c09744c
feat(onramp): do not export fiat onramp models
heyllog Jun 4, 2026
0d51268
Merge branch 'main' into feat/TON-622-crypto-onramp-design
heyllog Jun 9, 2026
7d7a63e
feat(crypto-onramp): delete fiat onramp for now
heyllog Jun 9, 2026
27fbf60
feat(crypto-onramp): delete fiat onramp for now
heyllog Jun 9, 2026
b343b97
feat(crypto-onramp): add empty state
heyllog Jun 9, 2026
482a14d
merge main
heyllog Jun 10, 2026
f6301d8
feat(crypto-onramp): rework default currencies
heyllog Jun 10, 2026
16c619c
feat(crypto-onramp): i18n network error
heyllog Jun 10, 2026
f49f3ff
feat(crypto-onramp): improve error handling in decent provider
heyllog Jun 10, 2026
e7f9522
feat(crypto-onramp): place warning on top
heyllog Jun 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .changeset/crypto-onramp-async-metadata.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
'@ton/walletkit': major
'@ton/appkit': major
'@ton/appkit-react': major
---

Make crypto-onramp provider `getMetadata()` async.

- `@ton/walletkit`:
- `CryptoOnrampProvider.getMetadata()` and `CryptoOnrampProviderInterface.getMetadata()` now return `Promise<CryptoOnrampProviderMetadata>`. Concrete `DecentCryptoOnrampProvider` and `LayerswapCryptoOnrampProvider` updated.
- `CryptoOnrampManager` gains `getMetadata(providerId?)` proxy with the existing `try/catch + log.debug` pattern.
- `getSupportedNetworks()` left synchronous — the shared `DefiProvider` base method is unchanged in this branch.
- `@ton/appkit`:
- New action `getCryptoOnrampProviderMetadata` and matching TanStack query (`getCryptoOnrampProviderMetadataQueryOptions`).
- `@ton/appkit-react`:
- New hook `useCryptoOnrampProviderMetadata` (wagmi-style `UseQueryResult`).
- `CryptoOnrampContext` exposes `providersMetadata` (`Record<providerId, metadata | undefined>`) and `isProvidersMetadataLoading`. The settings modal renders providers with per-row `providerId` fallback while metadata resolves — one slow/broken provider does not block the others. The selected provider's name shows a skeleton in the info row until its metadata arrives.
- `OptionSwitcher` gains a `loading` prop that replaces the trigger content with a `Skeleton`.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ release-artifacts
*.tgz
apps/appkit-minter/Caddyfile
Caddyfile
.superset
5 changes: 0 additions & 5 deletions .superset/config.json

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { useWatchBalance, useWatchTransactions, useWatchJettons, useBalance } fr
import { middleEllipsis } from '@ton/appkit';
import { toast } from 'sonner';

import { JettonsPage, MinterPage, NftsPage, StakingPage, SwapPage } from '@/pages';
import { CryptoOnrampPage, JettonsPage, MinterPage, NftsPage, StakingPage, SwapPage } from '@/pages';

export const AppRouter: React.FC = () => {
// Set balance refetch interval to 20 seconds
Expand Down Expand Up @@ -58,6 +58,7 @@ export const AppRouter: React.FC = () => {
<Route path="/nfts" element={<NftsPage />} />
<Route path="/swap" element={<SwapPage />} />
<Route path="/staking" element={<StakingPage />} />
<Route path="/crypto-onramp" element={<CryptoOnrampPage />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</BrowserRouter>
Expand Down
13 changes: 12 additions & 1 deletion apps/appkit-minter/src/core/components/layout/layout/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,17 @@
*/

import { TonConnectButton, useAddress } from '@ton/appkit-react';
import { ArrowLeftRight, BookOpen, Coins, ExternalLink, Github, ImageIcon, Sparkles, Wallet } from 'lucide-react';
import {
ArrowLeftRight,
BookOpen,
Coins,
Bitcoin,
ExternalLink,
Github,
ImageIcon,
Sparkles,
Wallet,
} from 'lucide-react';
import { Link, NavLink } from 'react-router-dom';
import type { ComponentType, FC, ReactNode } from 'react';

Expand Down Expand Up @@ -56,6 +66,7 @@ const NAV_GROUPS: readonly { label?: string; links: readonly NavGroupLink[] }[]
links: [
{ to: '/swap', label: 'Swap', icon: ArrowLeftRight },
{ to: '/staking', label: 'Staking', icon: Coins },
{ to: '/crypto-onramp', label: 'Crypto Onramp', icon: Bitcoin },
],
},
];
Expand Down
11 changes: 10 additions & 1 deletion apps/appkit-minter/src/core/configs/app-kit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,16 @@ import {
import { createDeDustProvider } from '@ton/appkit/swap/dedust';
import { createOmnistonProvider } from '@ton/appkit/swap/omniston';
import { createTonstakersProvider } from '@ton/appkit/staking/tonstakers';
import { createLayerswapProvider } from '@ton/appkit/crypto-onramp/layerswap';
import { createDecentProvider } from '@ton/appkit/crypto-onramp/decent';
import { createTonApiGaslessProvider } from '@ton/appkit/gasless/tonapi';

import { ENV_TON_API_KEY_TESTNET, ENV_TON_API_KEY_MAINNET, ENV_TONCONNECT_MANIFEST_URL } from '@/core/configs/env';
import {
ENV_TON_API_KEY_TESTNET,
ENV_TON_API_KEY_MAINNET,
ENV_DECENT_API_KEY,
ENV_TONCONNECT_MANIFEST_URL,
} from '@/core/configs/env';

const mainnetApiClient = new ApiClientToncenter({
network: Network.mainnet(),
Expand Down Expand Up @@ -53,6 +60,8 @@ export const appKit = new AppKit({
createOmnistonProvider(),
createDeDustProvider(),
createTonstakersProvider(),
createLayerswapProvider(),
createDecentProvider({ apiKey: ENV_DECENT_API_KEY }),
createTonCenterStreamingProvider({ network: Network.mainnet(), apiKey: ENV_TON_API_KEY_MAINNET }),
createTonCenterStreamingProvider({ network: Network.testnet(), apiKey: ENV_TON_API_KEY_TESTNET }),
createTonApiGaslessProvider(),
Expand Down
1 change: 1 addition & 0 deletions apps/appkit-minter/src/core/configs/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export const ENV_TON_API_KEY_MAINNET =
import.meta.env.VITE_TON_API_KEY ?? '25a9b2326a34b39a5fa4b264fb78fb4709e1bd576fc5e6b176639f5b71e94b0d';
export const ENV_TON_API_KEY_TESTNET =
import.meta.env.VITE_TON_API_TESTNET_KEY ?? 'd852b54d062f631565761042cccea87fa6337c41eb19b075e6c7fb88898a3992';
export const ENV_DECENT_API_KEY = import.meta.env.VITE_DECENT_API_KEY ?? '1be323b5c83198191ba640f07f8815b0';

const DEV_TONCONNECT_MANIFEST_URL = 'https://tonconnect-sdk-demo-dapp.vercel.app/tonconnect-manifest.json';
const PROD_TONCONNECT_MANIFEST_URL = import.meta.env.VITE_TONCONNECT_MANIFEST_URL ?? DEV_TONCONNECT_MANIFEST_URL;
Expand Down
1 change: 1 addition & 0 deletions apps/appkit-minter/src/pages/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ export { JettonsPage } from './jettons-page';
export { NftsPage } from './nfts-page';
export { SwapPage } from './swap-page';
export { StakingPage } from './staking-page';
export { CryptoOnrampPage } from './onramp-page';
33 changes: 33 additions & 0 deletions apps/appkit-minter/src/pages/onramp-page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* 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 React from 'react';
import { CryptoOnrampWidget } from '@ton/appkit-react';
import type { CryptoOnrampDestinationRef, CryptoOnrampSourceRef } from '@ton/appkit-react';
import { Caip2ByNetwork } from '@ton/appkit-react';

import { Layout } from '@/core/components';

const DEFAULT_DESTINATION: CryptoOnrampDestinationRef = {
address: 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs',
};

const DEFAULT_SOURCE: CryptoOnrampSourceRef = {
chain: Caip2ByNetwork.ArbitrumMainnet,
address: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',
};

export const CryptoOnrampPage: React.FC = () => {
return (
<Layout title="Crypto Onramp">
<div className="w-full max-w-[434px] mx-auto flex justify-center items-center">
<CryptoOnrampWidget defaultDestination={DEFAULT_DESTINATION} defaultSource={DEFAULT_SOURCE} />
</div>
</Layout>
);
};
11 changes: 10 additions & 1 deletion apps/appkit-minter/src/pages/swap-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { USDT_MASTER_MAINNET } from '@/core/constants/tokens';

const TOKENS: AppkitUIToken[] = [
{
id: 'ton',
symbol: 'TON',
name: 'Toncoin',
decimals: 9,
Expand All @@ -24,6 +25,7 @@ const TOKENS: AppkitUIToken[] = [
logo: './tokens/ton.png',
},
{
id: 'usdt',
symbol: 'USD₮',
name: 'Tether USD',
decimals: 6,
Expand All @@ -33,6 +35,7 @@ const TOKENS: AppkitUIToken[] = [
logo: `./tokens/usdt.png`,
},
{
id: 'ston',
symbol: 'STON',
name: 'STON',
decimals: 9,
Expand All @@ -41,6 +44,7 @@ const TOKENS: AppkitUIToken[] = [
logo: './tokens/ston.png',
},
{
id: 'xaut',
symbol: 'XAUt0',
name: 'Tether Gold',
decimals: 6,
Expand All @@ -49,6 +53,7 @@ const TOKENS: AppkitUIToken[] = [
logo: './tokens/xaut0.png',
},
{
id: 'usde',
symbol: 'USDe',
name: 'Ethena USDe',
decimals: 6,
Expand All @@ -58,6 +63,7 @@ const TOKENS: AppkitUIToken[] = [
logo: './tokens/usde.png',
},
{
id: 'tston',
symbol: 'tsTON',
name: 'Tonstakers TON',
decimals: 9,
Expand All @@ -66,6 +72,7 @@ const TOKENS: AppkitUIToken[] = [
logo: './tokens/tston.svg',
},
{
id: 'gemston',
symbol: 'GEMSTON',
name: 'GEMSTON',
decimals: 9,
Expand All @@ -74,6 +81,7 @@ const TOKENS: AppkitUIToken[] = [
logo: './tokens/gemston.png',
},
{
id: 'utya',
symbol: 'UTYA',
name: 'Utya',
decimals: 9,
Expand All @@ -82,6 +90,7 @@ const TOKENS: AppkitUIToken[] = [
logo: './tokens/utya.png',
},
{
id: 'weth',
symbol: 'WETH',
name: 'Wrapped Ether',
decimals: 18,
Expand All @@ -100,7 +109,7 @@ export const SwapPage: React.FC = () => {
network={Network.mainnet()}
fiatSymbol="$"
defaultFromSymbol="TON"
defaultToSymbol="USD₮"
defaultToSymbol="USDT"
/>
</div>
</Layout>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* 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 { AppKit } from '@ton/appkit';
import { getCryptoOnrampProviderMetadata } from '@ton/appkit';

export const getCryptoOnrampProviderMetadataExample = async (appKit: AppKit) => {
// SAMPLE_START: GET_CRYPTO_ONRAMP_PROVIDER_METADATA
const metadata = await getCryptoOnrampProviderMetadata(appKit, { providerId: 'layerswap' });
console.log('Crypto onramp provider metadata:', metadata);
// SAMPLE_END: GET_CRYPTO_ONRAMP_PROVIDER_METADATA
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* 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 { AppKit } from '@ton/appkit';
import { getCryptoOnrampProvider } from '@ton/appkit';

export const getCryptoOnrampProviderExample = (appKit: AppKit) => {
// SAMPLE_START: GET_CRYPTO_ONRAMP_PROVIDER
const provider = getCryptoOnrampProvider(appKit, { id: 'layerswap' });
console.log('Crypto onramp provider:', provider.providerId);
// SAMPLE_END: GET_CRYPTO_ONRAMP_PROVIDER
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* 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 { AppKit } from '@ton/appkit';
import { getCryptoOnrampProviders } from '@ton/appkit';

export const getCryptoOnrampProvidersExample = (appKit: AppKit) => {
// SAMPLE_START: GET_CRYPTO_ONRAMP_PROVIDERS
const providers = getCryptoOnrampProviders(appKit);
console.log(
'Registered crypto onramp providers:',
providers.map((p) => p.providerId),
);
// SAMPLE_END: GET_CRYPTO_ONRAMP_PROVIDERS
};
Loading
Loading