<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>
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 |
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 |
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 |
---|---|---|
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==" | ||
} | ||
] | ||
} |
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; }
|
Name | Steps | Expected result |
---|---|---|
mint jetton (when contract was not deployed) | 1. Click âSend jettonâ in DApp |
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 |
Name | Steps | Expected result |
---|---|---|
Wallet uses own bridge | 1. Connect wallet |
HTTP bridge | | PR follows the correct format | 1. Review the correctness of your PR | Correct format of PR
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.
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" }
|