For a better example, check how MyTonWallet works.

Web app for testing: https://ton-connect.github.io/demo-dapp-with-react-ui/

Telegram Mini-App for testing: https://t.me/tc_twa_demo_bot

Below is the list of checks with results audited wallet should have:

Problems that may be encountered:

Name Steps Expected result
Correctness of the ‘universal_url’ if wallet is Telegram Mini-App 1. Go to your commit
  1. Check ‘universal_url’ field for correctness | You should use URL: the universal_url link should be specified as https://t.me/[your wallet_username in telegram]?attach=wallet, TON Connect will automatically upgrade the link to https://t.me/[your wallet_username in telegram]/start

This is necessary because we can't yet move to the new universal link format, as not all applications have updated to the latest version of TON Connect. | | Correctness of the ‘universal_url’ and ‘deepLink’ if wallet is Mobile app | 1. Go to your commit 2. Check ‘universal_url’ and ‘deepLink’ fields for correctness | You can see how it should look at the link:

Universal link | | QR code is functional: no redirects to a different URL and doesn't fail to work entirely | 1. Try to connect via QR-code in DApp | QR code is functional: no redirects to a different URL and doesn't fail to work entirely | | Using own wallet’s bridge | 1. Connect wallet 2. Check bridge URL in the ‘Network’ tab of DevTools | Own wallet’s bridge is used

HTTP bridge | | PR follows the correct format | 1. Review the correctness of points in your PR | You can see how it should look at the link:

Correct format of PR | | Wallet does not disconnect after connection (ton_proof’ is not absent in the connect event) | 1. Connect your wallet to the DApp 2. Verify if the wallet disconnects instantly after connection to DApp 3. Check for ton_proof in items[] in the connect event | Wallet does not disconnect after connection to DApp

ton_proof is present in items[] in the connect event | | For wallets like Telegram mini-apps: when the user confirms the transaction (or connection), the wallet should close the window | 1. User clicks to send a transaction in the dApp (or initiates a connection) 2. Wallet opens 3. User confirms the transaction (or confirms the connection) 4. Wallet closing the window | This influences the UX — we expect that the user will be able to smoothly return to the dApp, so the wallet should close. The wallet should only close if the user came from the dApp.

Note that if the user opened the wallet manually, it shouldn’t close after confirming the transaction | | Console shows one request and response with the correct structure | 1. Log in to testing DApp 2. Send transaction 3. Check console for request and response | Console shows one request and response with the following structure:

Request: { "method": "sendTransaction", "params": [ "{\\"from\\":\\"EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M\\",\\"network\\":\\"-239\\",\\"valid_until\\":1741970083,\\"messages\\":[{\\"address\\":\\"EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M\\",\\"amount\\":\\"5000000\\",\\"stateInit\\":\\"te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==\\",\\"payload\\":\\"te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==\\"}]}" ], "id": "1" }

Response: { "result": "te6cckEBBgEA9gAB5YgAJVmpo1IlFk7C481hS07SQNL5aj80oafGfZeJdZSsoKADm0s7c///+Is+oyhQAAAAveC1NQo/tPQD+RXVZBzrs+L1ortZchVqHHapbzoU/SnARcqtFxONOgfYy4XTUK3nkXucI2lpRXvL2e7oeSx75gcBAgoOw8htAwUCAntiAEUtTj24aZTfM4byc2ZzKWoyOyiKVUwBxjNh7GdXlozYGmJaAAAAAAAAAAAAAAAAAAIwAAAAASGVsbG8hgMFART/APSkE/S88sgLBABI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAAADOExfw" (external-in message in the format of BoC base64), "id": "0" }

No duplicate messages are shown |

Checking connection and transaction sending from different devices:

Name Steps Expected result
Connect to DApp in mobile browser (Google Chrome) with mobile wallet (iOS, Android) 1. Click “Connect Wallet” in DApp
  1. Choose wallet
  2. Approve connection in the wallet
  3. Sign the connection (via QR code or PIN code) | Redirect to wallet when clicking on wallet icon in DApp

User is authorized through the wallet in DApp in mobile browser

After approval, the wallet redirects the user to DApp and the user is authorized in the DApp through the wallet

Connect event | | Connect to DApp in mobile browser (Safari) with mobile wallet (iOS) | 1. Click “Connect Wallet” in DApp 2. Choose wallet 3. Approve connection in the wallet 4. Sign the connection (via QR code or PIN code) | Redirect to wallet when clicking on wallet icon in DApp

User is authorized through the wallet in DApp in mobile browser

No return to DApp after approving transaction in wallet | | Connect to DApp in desktop browser (Google Chrome) with desktop wallet | 1. Click “Connect Wallet” in DApp 2. Choose wallet 3. Approve connection in the wallet 4. Sign the connection (via QR code or PIN code) | Redirect to wallet when clicking on wallet icon in DApp

User is authorized through the wallet in DApp in desktop browser and no return to DApp after approving transaction in wallet

Connect event | | Connect to DApp as Telegram Mini-App (@tc_twa_demo_bot) via QR code with mobile wallet (iOS, Android) | 1. Click “Connect Wallet” in Telegram Mini-App 2. Choose wallet 3. Click “Yes” 4. Approve connection in the wallet 5. Sign the connection (via QR code or PIN code) | Opens a window with URL and ‘No’ and ‘Yes’ buttons

After approval, the wallet redirects the user to DApp (only in mobile apps, not in telegram mini-apps) and the user is authorized in the DApp through the wallet

Connect event but without ‘ton_proof’ in item[] | | Connect to DApp as Telegram Mini-App (@tc_twa_demo_bot) on desktop telegram with desktop wallet | 1. Click “Connect Wallet” in Telegram Mini-App 2. Choose wallet 3. Click “Yes” 4. Approve connection in the wallet 5. Sign the connection (via QR code or PIN code) | Opens a window with URL and ‘No’ and ‘Yes’ buttons

After approval, the wallet does not redirect the user to DApp and the user is authorized in the DApp through the wallet

Connect event but without ‘ton_proof’ in item[] | | Connect to DApp in desktop browser (Google Chrome) via QR code with mobile wallet (iOS, Android) | 1. Click “Connect Wallet” 2. Choose wallet 3. Scan QR code 4. Approve connection in the wallet 5. Sign the connection (via QR code or PIN code) | After approval in the wallet, DApp closes the QR code window and user is authorized in the DApp through the wallet

Connect event | | Connect to DApp via Telegram QR-Code (which is opened by default) | 1. Click “Connect Wallet” 2. Scan QR code 3. Approve connection in the wallet 4. Sign the connection (via QR code or PIN code) | After approval in the wallet, DApp closes the QR code window and user is authorized in the DApp through the wallet

Connect event | | Connect to DApp in desktop browser (Google Chrome) with wallet extension | 1. Click “Connect Wallet” in DApp 2. Approve connection in the wallet 3. Sign the connection (via QR code or PIN code) | Wallet should open the confirmation window immediately, wallet should not prompt to select any other wallets

After approval, the wallet redirects the user to the DApp and closes the extension window

Connect event | | Connect to DApp in wallet browser inside mobile wallet (iOS, Android) | 1. Click “Connect Wallet” in DApp 2. Approve connection in the wallet 3. Sign the connection (via QR code or PIN code) | Wallet should open the confirmation window immediately, wallet should not prompt to select any other wallets

After approval, the wallet redirects the user to the DApp and does not close the wallet browser window

Connect event | | Declining the connection | 1. Click “Connect Wallet” in DApp 2. Decline connection in the wallet | Wallet should decline the connection

Console shows the following event error: type ConnectEventError = { event: "connect_error", id: number; // increasing event counter payload: { code: 300; message: “User declined the connection”; } } | | Sending transaction in DApp on mobile browser (Safari) | 1. Click “Send transaction” in DApp 2. Click “Open wallet” 3. Approve transaction in the wallet 4. Sign the transaction (via QR code or PIN code) 5. Redirect back to the DApp | No redirect to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet | | Sending transaction in DApp on mobile browser (Google Chrome) | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet | | Sending transaction in Telegram Mini-App DApp (@tc_twa_demo_bot) on desktop telegram | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet | | Sending transaction in Telegram Mini-App DApp (@tc_twa_demo_bot) on mobile telegram | 1. Click “Send transaction” in DApp 2. Click “Open wallet” 3. Approve transaction in the wallet 4. Sign the transaction (via QR code or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ and ‘Open wallet’ in DApp

No return to DApp after approving transaction in wallet | | Sending transaction in DApp on desktop browser when authorized via QR code | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet | | Sending transaction in DApp on desktop browser when authorized via desktop wallet | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ in DApp

No return to DApp after approving transaction in wallet | | Sending transaction on desktop browser when wallet is extension | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet | | Sending transaction in DApp on wallet browser | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet |

Checking disconnection:

Name Steps Expected result
Disconnect from DApp (if your app using HTTP bridge) 1. Connect wallet
  1. Click “Disconnect” in DApp | Wallet disconnects from DApp

Console shows the following request: { "method": "disconnect", "params": [], "id": number } | | Disconnect from DApp (for JS bridge apps like extension & wallet browser) | 1. Connect wallet 2. Click “Disconnect” in DApp | Wallet disconnects from DApp

Console shows no response | | Disconnect DApp from wallet | 1. Connect wallet to DApp 2. Disconnect DApp from wallet | Wallet is not connected to DApp

Console shows the following event: interface DisconnectEvent { type: "disconnect", id: number; // increasing event counter payload: { } }

DApp connection disappears from wallet’s connection list |

Transaction data validation checks:

Name Steps Expected result
‘validUntil’ < 5 minutes from the current time
(unix timestamp in ’validUntil’ is less than 5 minutes, but not 0) 1. Send transaction in the DApp:
{
"validUntil": 1737382666 (’validUntil’ is less then now() + 5 minutes),
"messages": [
{
"address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M",
"amount": "5000000",
"stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==",
"payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g=="
}
]
}
  1. Approve transaction in the wallet
  2. Sign the transaction (via QR code or PIN code)
  3. Check ‘valid_until’ value of transaction in the TonViewer | unix timestamp is set the same in TonViewer as in the transaction’s ‘validUntil’

Wallet displays a message confirming the transaction has been sent.

Wallet prompts to sign the transaction (via QR code or PIN code)

Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘validUntil’ > 5 minutes from the current time (unix timestamp in ‘validUntil’ is more than 5 minutes, etc., from now) | 1. Send transaction in the DApp: { "validUntil": 1737382666 (’validUntil’ is more then now() + 5 minutes), "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) 4. Check ‘valid_until’ value of transaction in the TonViewer | unix timestamp now() + 5 minutes is set in TonViewer after the moment the transaction is approved by clicking ‘Confirm’ in the wallet

Wallet displays a message confirming the transaction has been sent.

Wallet prompts to sign the transaction (via QR code or PIN code)

Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | without ’validUntil’ field | 1. Send transaction in the DApp without ’validUntil’ field: { "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) 4. Check ‘valid_until’ value of transaction in the TonViewer | unix timestamp now() + 5 minutes is set in ‘valid_until’ in TonViewer after the moment the transaction is approved by clicking ‘Confirm’ in the wallet

Wallet displays a message confirming the transaction has been sent.

Wallet prompts to sign the transaction (via QR code or PIN code)

Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | outdated ‘validUntil’ | 1. Send transaction in the DApp with outdated ‘validUntil’: { "validUntil": 1737382666 (outdated ‘validUntil’), "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | ’validUntil’ as string | 1. Send transaction in the DApp with ’validUntil’ as NaN: { "validUntil": string, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | ’validUntil’ as NaN | 1. Send transaction in the DApp with ’validUntil’ as NaN: { "validUntil": NaN, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | ’validUntil’ as null | 1. Send transaction in the DApp with ’validUntil’ as null: { "validUntil": null, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | empty ‘messages’ array | 1. Send transaction in the DApp with empty messages array: { "validUntil": 1737382950, "messages": [] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | 4 messages | 1. Send transaction in the DApp with 4 messages: { "validUntil": 1737382971, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" }, { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" }, { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" }, { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) 4. Check transaction in the TonViewer | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer with 4 messages. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | 1 message is valid and 1 is invalid | 1. Send transaction in the DApp with 1 message is valid and 1 is invalid: { "validUntil": 1737382971, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" }, { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "50000000000000000000" (invalid value in message), "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | without ‘address’ field | 1. Send transaction in the DApp: { "validUntil": 1737383398, "messages": [ { "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | bounceable address type

https://ton.org/address/ | 1. Send transaction in the DApp: { "validUntil": 1737383466, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) 4. Check bounce, bounced fields in the TonViewer | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer with values: bounce: true, bounced: false Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | non-bounceable address type

https://ton.org/address/ | 1. Send transaction in the DApp: { "validUntil": 1737383466, "messages": [ { "address": "UQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsAKJ", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) 4. Check bounce, bounced fields in the TonViewer | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer with values: bounce: false, bounced: false Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | raw address type

https://ton.org/address/ | 1. Send transaction in the DApp: { "validUntil": 1737383466, "messages": [ { "address": "0:8a5a9c7b70d329be670de4e6cce652d464765114aa98038c66c3d8ceaf2d19b0", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | invalid address (2nd letter omitted) | 1. Send transaction in the DApp: { "validUntil": 1737383466, "messages": [ { "address": "ECKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | amount exceeding the wallet account’s balance | 1. Send transaction in the DApp: { "validUntil": 1737383551, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "500000000000000" (amount exceeding the wallet account’s balance), "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | without ‘amount’ field | 1. Send transaction in the DApp: { "validUntil": 1737383551, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | ‘amount’ as a string | 1. Send transaction in the DApp: { "validUntil": 1737383623, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": “5000000”, "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘amount’ as a number | 1. Send transaction in the DApp: { "validUntil": 1737383623, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": 5000000, "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | with ‘stateInit’ field | 1. Send transaction in the DApp: { "validUntil": 1737383670, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | without ‘stateInit’ | 1. Send transaction in the DApp: { "validUntil": 1737383670, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘stateInit’ with changed boc prefix (3rd symbol is ‘7’) | 1. Send transaction in the DApp: { "validUntil": 1737383670, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te7cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | with ‘payload’ field | 1. Send transaction in the DApp: { "validUntil": 1737383670, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | without ‘payload’ | 1. Send transaction in the DApp: { "validUntil": 1737383670, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==" } ] } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘payload’ with changed boc prefix (3rd symbol is ‘7’) | 1. Send transaction in the DApp: { "validUntil": 1737383670, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te7ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ] } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | “network”: “-3” | 1. Send transaction in the DApp: { "validUntil": 1737383781, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "network": "-3" } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | “network” as a number | 1. Send transaction in the DApp: { "validUntil": 1737383781, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "network": -239 } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | “network”: “-239” | 1. Send transaction in the DApp: { "validUntil": 1737383781, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "network": “-239” } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘from’ with bounceable address type

https://ton.org/address/ | 1. Send transaction in the DApp: { "validUntil": 1737383832, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "from": “EQAbLqOSDjYR_KcvIbnvJPl4BplXNfEmQ7DG0y0upoNqbc5T” ****(bounceable address type) } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘from’ with non-bounceable address type

https://ton.org/address/ | 1. Send transaction in the DApp: { "validUntil": 1737383832, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "from": “UQAbLqOSDjYR_KcvIbnvJPl4BplXNfEmQ7DG0y0upoNqaTFM”(non-bounceable address type) } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘from’ with raw address type

https://ton.org/address/ | 1. Send transaction in the DApp: { "validUntil": 1737383832, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "from": “0:1b2ea3920e3611fca72f21b9ef24f97806995735f12643b0c6d32d2ea6836b32”(raw address type) } 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via QR code or PIN code) Transaction is processed and appears in Tonviewer. Wallet balance decreases accordingly.

Console shows the following response: interface WalletResponseSuccess { result: string; id: number; } | | ‘from’ with invalid address (2nd letter is omitted) | 1. Send transaction in the DApp: { "validUntil": 1737383832, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "from": “EAbLqOSDjYR_KcvIbnvJPl4BplXNfEmQ7DG0y0upoNqad6J” ****(bounceable address type) } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | ‘from’ contains an address that does not match the user’s wallet account address | 1. Send transaction in the DApp: { "validUntil": 1737383832, "messages": [ { "address": "EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M", "amount": "5000000", "stateInit": "te6cckEBBAEAOgACATQCAQAAART/APSkE/S88sgLAwBI0wHQ0wMBcbCRW+D6QDBwgBDIywVYzxYh+gLLagHPFsmAQPsAlxCarA==", "payload": "te6ccsEBAQEADAAMABQAAAAASGVsbG8hCaTc/g==" } ], "from": “EQCKWpx7cNMpvmcN5ObM5lLUZHZRFKqYA4xmw9jOry0ZsF9M” ****(‘from’ contains an address that does not match the user’s wallet account address) } | Wallet displays an error when the transaction approval window opens

Console shows the following response error: interface WalletResponseError { error: { code: 1; message: “Bad request”}; id: number; } | | user declined the transaction | 1. Click “Send transaction” in the DApp 2. Decline transaction in the wallet | Wallet should decline the transaction

Console shows the following response error: interface WalletResponseError { error: { code: 300; message: “User declined the transaction”}; id: number; } |

Checking jetton transactions:

Name Steps Expected result
send jetton (when contract was not deployed) 1. Click “Send jetton” in DApp
  1. Approve transaction in the wallet
  2. Sign the transaction (via QR code or PIN code)
  3. Check transaction in the TonViewer | Transaction is processed and appears in Tonviewer with ‘Contract deployment’ and ‘Mint token’ statuses, and bounce: true, bounced: false values

Wallet’s balance increases by 1,000,000 JPEG | | send jetton (when contract was deployed) | 1. Click “Send jetton” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via QR code or PIN code) 4. Check transaction in the TonViewer | Transaction is processed and appears in Tonviewer with ‘Mint token’ status, and bounce: true, bounced: false values

Wallet’s balance increases by 1,000,000 JPEG |

Connect event

Acceptable form of PR