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:
Name | Steps | Expected result |
---|---|---|
Correctness of the ‘universal_url’ if wallet is Telegram Mini-App | 1. Go to your commit |
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 |
Name | Steps | Expected result |
---|---|---|
Connect to DApp in mobile browser (Google Chrome) with mobile wallet (iOS, Android) | 1. Click “Connect Wallet” 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 |
Name | Steps | Expected result |
---|---|---|
Disconnect from DApp (if your app using HTTP bridge) | 1. Connect wallet |
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 |
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==" | ||
} | ||
] | ||
} |
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; }
|
Name | Steps | Expected result |
---|---|---|
send jetton (when contract was not deployed) | 1. Click “Send jetton” in DApp |
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 |