<aside> 💡

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

</aside>

Checking connection and transaction sending from different devices:

Name Steps Expected result
Connect to a DApp in a mobile browser (Google Chrome) using a mobile wallet (iOS or Android) 1. Click “Connect Wallet” in DApp
  1. Choose wallet
  2. Approve connection in the wallet
  3. Sign the connection (via Touch ID 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 a DApp in a mobile browser (Safari) using a mobile wallet (iOS) | 1. Click “Connect Wallet” in DApp 2. Choose wallet 3. Approve connection in the wallet 4. Sign the connection (via Touch ID 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 a DApp in desktop browser (Google Chrome) using a desktop wallet | 1. Click “Connect Wallet” in DApp 2. Choose wallet 3. Approve connection in the wallet 4. Sign the connection (via Touch ID 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 a DApp as Telegram Mini-App (@tc_twa_demo_bot) via QR code using a 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 Touch ID or PIN code) | Opens a window with URL and ‘No’ and ‘Yes’ buttons

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

Connect event | | Connect to a DApp as Telegram Mini-App (@tc_twa_demo_bot) via QR code using a wallet as telegram mini-app | 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 Touch ID 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 | | Connect to a DApp as Telegram Mini-App (@tc_twa_demo_bot) on desktop telegram using a telegram mini-app 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 Touch ID 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 closes the window. User is authorized in the DApp through the wallet

Connect event but without ‘ton_proof’ in item[] | | Connect to a DApp in desktop browser (Google Chrome) via QR code using a mobile wallet (iOS, Android) or a wallet as telegram mini-app | 1. Click “Connect Wallet” 2. Choose wallet 3. Scan QR code 4. Approve connection in the wallet 5. Sign the connection (via Touch ID 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 a DApp via Telegram QR-Code (which is opened by default) using a mobile wallet (iOS, Android) or a wallet as telegram mini-app | 1. Click “Connect Wallet” 2. Scan QR code 3. Approve connection in the wallet 4. Sign the connection (via Touch ID 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 a DApp in desktop browser (Google Chrome) using a wallet extension | 1. Click “Connect Wallet” in DApp 2. Approve connection in the wallet 3. Sign the connection (via Touch ID 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 a DApp using the wallet browser within a mobile wallet (iOS or Android) | 1. Click “Connect Wallet” in DApp 2. Approve connection in the wallet 3. Sign the connection (via Touch ID 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 a DApp on mobile browser (Safari) using mobile wallet (iOS) | 1. Click “Send transaction” in DApp 2. Click “Open wallet” 3. Approve transaction in the wallet 4. Sign the transaction (via Touch ID 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 a DApp on mobile browser (Google Chrome) using mobile wallet (iOS, Android) | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via Touch ID or PIN code) | Redirect to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet | | Sending a transaction in a Telegram Mini-App DApp using the Telegram Wallet on desktop | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via Touch ID or PIN code) | Wallet closes the window and redirects to wallet when clicking ‘Send Transaction’ in DApp

Return to DApp after approving transaction in wallet | | Sending a transaction in a Telegram Mini-App DApp using the Telegram Wallet on mobile | 1. Click “Send transaction” in DApp 2. Click “Open wallet” 3. Approve transaction in the wallet 4. Sign the transaction (via Touch ID or PIN code) | Wallet closes the window and redirects to wallet when clicking ‘Send Transaction’ and ‘Open wallet’ in DApp

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

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

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

Return to DApp after approving transaction in wallet | | Sending transaction in a wallet browser within a mobile wallet (iOS, Android) | 1. Click “Send transaction” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via Touch ID 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
unix timestamp ‘validUntil’ < 5 minutes from the current time 1. Send transaction in the DApp:
{
"validUntil": 1737382666 (unix timestamp in ‘validUntil’ is less than 5 minutes from now),
"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 Touch ID 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 Touch ID 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; } | | unix timestamp ‘validUntil’ > 5 minutes from the current time | 1. Send transaction in the DApp: { "validUntil": 1737382666 (unix timestamp in ‘validUntil’ is more than 5 minutes from now), "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 Touch ID 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 Touch ID 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 Touch ID 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 Touch ID 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 Touch ID 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 Touch ID 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 Touch ID 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 Touch ID 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 Touch ID 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 Touch ID 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==" } ] } | For iOS / Android wallet apps:

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; }

For wallet apps as telegram mini-apps:

Wallet displays an error when the transaction approval window opens and prompts the user to top up the balance for the transaction | | 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 when 3rd symbol is wrong | 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 when 3rd symbol is wrong | 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 Touch ID or PIN code) | Wallet displays a message confirming the transaction has been sent. Wallet prompts to sign the transaction (via Touch ID 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 with 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
mint jetton (when contract was not deployed) 1. Click “Send jetton” in DApp
  1. Approve transaction in the wallet
  2. Sign the transaction (via Touch ID 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 | | mint jetton (when contract was deployed) | 1. Click “Send jetton” in DApp 2. Approve transaction in the wallet 3. Sign the transaction (via Touch ID 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 |

Problems that may be encountered:

Name Steps Expected result
Wallet uses own bridge 1. Connect wallet
  1. 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 your PR | Correct format of PR

  1. If wallet is Telegram Mini-App: **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.

  1. If QR code is not functional (redirects to a different URL and fails to work entirely) check Universal link | | Wallet disconnects after connection (ton_proof is absent in the connect event) | 1. Connect your wallet to the DApp
  1. Verify if the wallet disconnects instantly after connection to DApp
  2. 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 | | Console does not show one request and response with the correct structure or duplicated messages | 1. Log in to testing DApp 2. Send transaction 3. Check console for the last request and response | Console shows one request and response without any duplicated messages 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" } |

Connect event

Acceptable form of PR