Examples: query, "exact match", wildcard*, wild?ard, wild*rd
Fuzzy search: cake~ (finds cakes, bake)
Term boost: "red velvet"^4, chocolate^2
Field grouping: tags:(+work -"fun-stuff")
Escape special characters +-&|!(){}[]^"~*?:\ - e.g. \+ \* \!
Range search: properties.timestamp:[1587729413488 TO *] (inclusive), properties.title:{A TO Z}(excluding A and Z)
Combinations: chocolate AND vanilla, chocolate OR vanilla, (chocolate OR vanilla) NOT "vanilla pudding"
Field search: properties.title:"The Title" AND text
Back to post

Revisions 2

4 months ago
TON transfer bug when using 32 (DESTROY_ACCOUNT_IF_ZERO) flag?
TON transfer bug when using 32 (DESTROY_ACCOUNT_IF_ZERO) flag?
I've been trying to reuse a wallet deleted by `DESTROY_ACCOUNT_IF_ZERO` (32) flag. The way I do the transfer: Imagine we have 2 wallets: A and B. 1. We transfer `N1` TON from `A` to `B`. E.g. by using a web-based wallet, script, doesn't matter. 2. `B` is uninitialized - it is not on the blockchain yet. With that in mind, we'd like to send all the money from `B` back to `A`. For this we're going to use the attached script. 3. Now we go ahead and transfer `N2` TON from `A` to `B` **again**. Doesn't matter how much. Expected behavior: we get transactions: `A->B (N1)`, `B->A (all)`, `A->B (N2)`; wallet `B` has `N2` TONs in the end. Actual behavior: we get transactions `A->B (N1)`, `B->A (all)`, `A->B (N2)`, **`B->A (all)`; wallet `B` has `0` TONs in the end.** The script for `B->A (all)` transfer, which causes this behavior: ``` import TonWeb from 'tonweb'; import tonwebMnemonic from 'tonweb-mnemonic'; const apiKey = "" || undefined; // WALLET B const mnemonic = "..."; const walletVersion = "v4R2"; // WALLET A const toAddress = "..."; const SendMode = { CARRY_ALL_REMAINING_BALANCE: 128, CARRY_ALL_REMAINING_INCOMING_VALUE: 64, DESTROY_ACCOUNT_IF_ZERO: 32, PAY_GAS_SEPARATELY: 1, IGNORE_ERRORS: 2, NONE: 0 } const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); (async () => { const provider = new TonWeb.HttpProvider('https://toncenter.com/api/v2/jsonRPC', {apiKey}); const WalletClass = TonWeb.Wallets.all[walletVersion]; const mnemonicArray = mnemonic.split(" "); let { publicKey, secretKey } = await tonwebMnemonic.mnemonicToKeyPair(mnemonicArray); publicKey = Buffer.from(publicKey); secretKey = Buffer.from(secretKey); console.log(`PUBLIC KEY: ${publicKey.toString('hex')}`); const wallet = new WalletClass(provider, { publicKey }); const seqno = await wallet.methods.seqno().call() || 0; console.log(`SEQNO: ${seqno}`); await sleep(2000); const transferParams = { secretKey, toAddress, amount: 0, seqno, sendMode: SendMode.CARRY_ALL_REMAINING_BALANCE | SendMode.IGNORE_ERRORS | SendMode.DESTROY_ACCOUNT_IF_ZERO, payload: "test bug" }; console.log(JSON.stringify({...transferParams, secretKey: transferParams.secretKey.toString('hex')}, null, 2)); const response = await wallet.methods.transfer(transferParams).send(); console.log(`transfer sent to blockchain: ${JSON.stringify(response, null, 2)}`); })(); ``` The strange thing is: if you send `A->B (N)` again, it will create a new transfer `B->A (all)` again and again automatically. Sometimes it stops at 2 repeats, sometimes at 4. I use the unbounceable address: `UQAPqRlewultl8xHCKGsrenb4PZaQ0QDfPYoK1fwVUODdZRd`. I also tried sending TON from wallet `C` (`C->B`). And the money DID stay on `B`. BUT once I made a transfer `A->B` again, all the money including the TONs sent from `C` went to `A` automatically! An example of this bug's manifestation (is it a bug??) is here: https://tonviewer.com/EQAySjlsHUY2EEedO5GTenzFvAnR5E-4ptwfeox6OZYnNvGF This is `B` wallet. Only the first message with "test bug" text was sent by the script. The rest of them were sent automatically on any incoming transfer from `A`. In this interaction: - `A` is `UQAPqRlewultl8xHCKGsrenb4PZaQ0QDfPYoK1fwVUODdZRd` - `B` is `EQAySjlsHUY2EEedO5GTenzFvAnR5E-4ptwfeox6OZYnNvGF` - `C` is `UQBwpXsIVrij8UQ2OpPK2EyeVBrlN6mnOkmThb3k6K-UHZyL` I want to understand, why this happens. Is this intended by TON blockchain developers? Is this not a bug? How to go around this and reuse deleted wallets?
I've been trying to reuse a wallet deleted by `DESTROY_ACCOUNT_IF_ZERO` (32) flag. The way I do the transfer: Imagine we have 2 wallets: A and B. 1. We transfer `N1` TON from `A` to `B`. E.g. by using a web-based wallet, script, doesn't matter. 2. `B` is uninitialized - it is not on the blockchain yet. With that in mind, we'd like to send all the money from `B` back to `A`. For this we're going to use the attached script. 3. Now we go ahead and transfer `N2` TON from `A` to `B` **again**. Doesn't matter how much. Expected behavior: we get transactions: `A->B (N1)`, `B->A (all)`, `A->B (N2)`; wallet `B` has `N2` TONs in the end. Actual behavior: we get transactions `A->B (N1)`, `B->A (all)`, `A->B (N2)`, **`B->A (all)`; wallet `B` has `0` TONs in the end.** The script for `B->A (all)` transfer, which causes this behavior: ``` import TonWeb from 'tonweb'; import tonwebMnemonic from 'tonweb-mnemonic'; const apiKey = "" || undefined; // WALLET B const mnemonic = "..."; const walletVersion = "v4R2"; // WALLET A const toAddress = "..."; const SendMode = { CARRY_ALL_REMAINING_BALANCE: 128, CARRY_ALL_REMAINING_INCOMING_VALUE: 64, DESTROY_ACCOUNT_IF_ZERO: 32, PAY_GAS_SEPARATELY: 1, IGNORE_ERRORS: 2, NONE: 0 } const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); (async () => { const provider = new TonWeb.HttpProvider('https://toncenter.com/api/v2/jsonRPC', {apiKey}); const WalletClass = TonWeb.Wallets.all[walletVersion]; const mnemonicArray = mnemonic.split(" "); let { publicKey, secretKey } = await tonwebMnemonic.mnemonicToKeyPair(mnemonicArray); publicKey = Buffer.from(publicKey); secretKey = Buffer.from(secretKey); console.log(`PUBLIC KEY: ${publicKey.toString('hex')}`); const wallet = new WalletClass(provider, { publicKey }); const seqno = await wallet.methods.seqno().call() || 0; console.log(`SEQNO: ${seqno}`); await sleep(2000); const transferParams = { secretKey, toAddress, amount: 0, seqno, sendMode: SendMode.CARRY_ALL_REMAINING_BALANCE | SendMode.IGNORE_ERRORS | SendMode.DESTROY_ACCOUNT_IF_ZERO, payload: "test bug" }; console.log(JSON.stringify({...transferParams, secretKey: transferParams.secretKey.toString('hex')}, null, 2)); const response = await wallet.methods.transfer(transferParams).send(); console.log(`transfer sent to blockchain: ${JSON.stringify(response, null, 2)}`); })(); ``` The strange thing is: if you send `A->B (N)` again, it will create a new transfer `B->A (all)` again and again automatically. Sometimes it stops at 2 repeats, sometimes at 4. I use the unbounceable address: `UQAPqRlewultl8xHCKGsrenb4PZaQ0QDfPYoK1fwVUODdZRd`. I also tried sending TON from wallet `C` (`C->B`). And the money DID stay on `B`. BUT once I made a transfer `A->B` again, all the money including the TONs sent from `C` went to `A` automatically! An example of this bug's manifestation (is it a bug??) is here: https://tonviewer.com/EQAySjlsHUY2EEedO5GTenzFvAnR5E-4ptwfeox6OZYnNvGF This is `B` wallet. Only the first message with "test bug" text was sent by the script. The rest of them were sent automatically on any incoming transfer from `A`. In this interaction: - `A` is `UQAPqRlewultl8xHCKGsrenb4PZaQ0QDfPYoK1fwVUODdZRd` - `B` is `EQAySjlsHUY2EEedO5GTenzFvAnR5E-4ptwfeox6OZYnNvGF` - `C` is `UQBwpXsIVrij8UQ2OpPK2EyeVBrlN6mnOkmThb3k6K-UHZyL` I want to understand, why this happens. Is this intended by TON blockchain developers? Is this not a bug? How to go around this and reuse deleted wallets?
#sendmode #bug #transfer #tonweb #javascript
#tonweb-transfer-sendmode-liteserver
4 months ago
Original
TON transfer bug when using 32 (DESTROY_ACCOUNT_IF_ZERO) flag?

I've been trying to reuse a wallet deleted by `DESTROY_ACCOUNT_IF_ZERO` (32) flag. The way I do the transfer: Imagine we have 2 wallets: A and B. 1. We transfer `N1` TON from `A` to `B`. E.g. by using a web-based wallet, script, doesn't matter. 2. `B` is uninitialized - it is not on the blockchain yet. With that in mind, we'd like to send all the money from `B` back to `A`. For this we're going to use the attached script. 3. Now we go ahead and transfer `N2` TON from `A` to `B` **again**. Doesn't matter how much. Expected behavior: we get transactions: `A->B (N1)`, `B->A (all)`, `A->B (N2)`; wallet `B` has `N2` TONs in the end. Actual behavior: we get transactions `A->B (N1)`, `B->A (all)`, `A->B (N2)`, **`B->A (all)`; wallet `B` has `0` TONs in the end.** The script for `B->A (all)` transfer, which causes this behavior: ``` import TonWeb from 'tonweb'; import tonwebMnemonic from 'tonweb-mnemonic'; const apiKey = "" || undefined; // WALLET B const mnemonic = "..."; const walletVersion = "v4R2"; // WALLET A const toAddress = "..."; const SendMode = { CARRY_ALL_REMAINING_BALANCE: 128, CARRY_ALL_REMAINING_INCOMING_VALUE: 64, DESTROY_ACCOUNT_IF_ZERO: 32, PAY_GAS_SEPARATELY: 1, IGNORE_ERRORS: 2, NONE: 0 } const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); (async () => { const provider = new TonWeb.HttpProvider('https://toncenter.com/api/v2/jsonRPC', {apiKey}); const WalletClass = TonWeb.Wallets.all[walletVersion]; const mnemonicArray = mnemonic.split(" "); let { publicKey, secretKey } = await tonwebMnemonic.mnemonicToKeyPair(mnemonicArray); publicKey = Buffer.from(publicKey); secretKey = Buffer.from(secretKey); console.log(`PUBLIC KEY: ${publicKey.toString('hex')}`); const wallet = new WalletClass(provider, { publicKey }); const seqno = await wallet.methods.seqno().call() || 0; console.log(`SEQNO: ${seqno}`); await sleep(2000); const transferParams = { secretKey, toAddress, amount: 0, seqno, sendMode: SendMode.CARRY_ALL_REMAINING_BALANCE | SendMode.IGNORE_ERRORS | SendMode.DESTROY_ACCOUNT_IF_ZERO, payload: "test bug" }; console.log(JSON.stringify({...transferParams, secretKey: transferParams.secretKey.toString('hex')}, null, 2)); const response = await wallet.methods.transfer(transferParams).send(); console.log(`transfer sent to blockchain: ${JSON.stringify(response, null, 2)}`); })(); ``` The strange thing is: if you send `A->B (N)` again, it will create a new transfer `B->A (all)` again and again automatically. Sometimes it stops at 2 repeats, sometimes at 4. I use the unbounceable address: `UQAPqRlewultl8xHCKGsrenb4PZaQ0QDfPYoK1fwVUODdZRd`. I also tried sending TON from wallet `C` (`C->B`). And the money DID stay on `B`. BUT once I made a transfer `A->B` again, all the money including the TONs sent from `C` went to `A` automatically! An example of this bug's manifestation (is it a bug??) is here: https://tonviewer.com/EQAySjlsHUY2EEedO5GTenzFvAnR5E-4ptwfeox6OZYnNvGF This is `B` wallet. Only the first message with "test bug" text was sent by the script. The rest of them were sent automatically on any incoming transfer from `A`. In this interaction: - `A` is `UQAPqRlewultl8xHCKGsrenb4PZaQ0QDfPYoK1fwVUODdZRd` - `B` is `EQAySjlsHUY2EEedO5GTenzFvAnR5E-4ptwfeox6OZYnNvGF` - `C` is `UQBwpXsIVrij8UQ2OpPK2EyeVBrlN6mnOkmThb3k6K-UHZyL` I want to understand, why this happens. Is this intended by TON blockchain developers? Is this not a bug? How to go around this and reuse deleted wallets?
#tonweb-transfer-sendmode-liteserver