Retirement of Binance Smart Chain bridge

We have decided to shutdown the Binance Smart Chain bridge due to recently found vulnerability in Binance Smart Chain nodes. We can no longer guarantee safety of the bridge or the funds sent to the bridge’s Binance Smart Chain wallet.

Due to constant battle with hackers and malicious people abusing vulnerabilities in EVM wallets and RPC interfaces of nodes, we are have decided to discontinue development of all wrapped tokens and will not deploy new EVM bridges for TLO…

wTLO deposits and withdrawals have been disabled on CryptoRadar Exchange. We have triggered emergency self-destruct on the token contract, so no transfers are possible anymore.

Converting TLO to wTLO (Binance Smart Chain)

Preparation

Before sending coins to the bridge, the wallet must be optimized. Easiest way to optimize local wallet file is to open it in SimpleWallet and use “full_optimize” command.

If using GUI wallet, it must have been running long enough to optimize all received coins. This can be verified by going to Settings → Preferences menu and selecting the “Wallet optimization” tab. It should say “Wallet is currently optimized for this target”. The optimization target must be set to at least 10% (1/10th) of the amount being sent.

After that, a payment ID needs to be generated using the form on top of bridge page at https://bsc-bridge.talleo.org/mainnet/ … You need to specify the Binance Smart Chain Address where you want the tokens to be sent.

Conversion

To convert the coins (TLO) to tokens (wTLO), you need to send the coins to the bridge address, TA42vGkab2VRMmDp9AuvozZMLcNuGFgHG8cfWAwYdCv7JvQmHuEJ1L7M1gfCAZZM71Sp7vQiMoAQ92XmnCm3QtVK1xAS1wN7U, using the payment ID from the preparation step.

You can use either SimpleWallet, GUI wallet or the web wallet, as all three support specifying payment ID when sending TLO.

When using SimpleWallet, it is easiest to use the interactive version of “transfer” command, as it will ask for both the destination address and the payment ID.

When using GUI wallet, the payment ID field is located at the bottom of the “Send Talleo” tab.


When using web wallet, the bridge address is entered to “Recipient address” field, the amount to convert is entered to “Amount” field and payment ID is entered to the last field in the “Send TLO” page. 

FreeBSD support for command-line binaries

During this week, we have merged in patches to allow building command-line binaries under FreeBSD.

For building you need to install git, cmake, Boost, MiniUPnPc and OpenSSL. The bundled MiniUPnPc library does not support FreeBSD yet. Currently only “develop” branch supports building under FreeBSD. We are planning to support other BSD variants, but it will take some time to merge and test patches to build system and sources.

Disabling webwallet accounts

To limit the total size of wallet holding webwallet accounts, we need to periodically remove addresses that contain large number of transactions. Too many transactions will cause the wallet daemon or webwallet script to run out of memory. Symptoms might include failing transactions, missing balance information or missing transactions in the webwallet frontend.

Anyone whose webwallet account gets disabled is encouraged to import the wallet address to either command-line wallet (SimpleWallet) or the official GUI wallet (TalleoWallet). After that, all funds should be transferred to freshly created new wallet to make sure the coins don’t get locked if the wallet grows too big even for command-line or GUI wallet. If the wallet gets locked, resetting the wallet will temporarily unlock the funds.

Login key can be used directly as private spend key when importing the wallet address. For private view key, you should enter c0a7c2a842ad0d5b69fd7a26dfcd87b7674647c3a5accd9d8629ccd8848bd202.

For people who want to mine without installing local blockchain, you should use official paper wallet generator to create a new address and then when you need to transfer funds, import the wallet using remote node. Instructions to open wallet using remote node in SimpleWallet or GUI wallet are in separate post in Documentation section.

Basic operation of Binance bridges for TLO

There is two bridges for Binance, first one bridges Talleo’s own chain with Binance Smart Chain and the another bridge connects wrapped Talleo tokens on Binance Smart Chain (BSC) and Binance Chain (BBC).

Talleo ↔ Binance Smart Chain

TLO-BSC bridge works on same principle as TLO-ETH bridge, it embeds BSC address in payment ID field of Talleo transaction. When converting back, Talleo address is Base-58 decoded in contract call parameters.

Binance Smart Chain ↔ Binance Chain

BSC-BBC bridge uses TokenHub system contract, which allows using bridge website for conversion from Binance Smart Chain (BSC) to Binance Chain (BBC), and Binance Chain wallet extension for conversion back from BBC to BSC. BBC address is decoded in contract call patameters using Bech32 which is also used by Bitcoin segwit addresses.

Binance Chain ↔ Binance DEX

Binance Chain can be used for trading tokens on Binance DEX. The listing fee is 1000 BNB on both mainnet and testnet. Listing request is either approved or rejected by community members after the listing request is published.

Optimizing all subwallets using cron script

!/bin/sh
curl -s -X POST http://127.0.0.1:33777/json_rpc -H 'Content-Type: application/json-rpc' -d '{"jsonrpc": "2.0", "method": "getAddresses", "password": "password", "params": {}, "id": "1"}' | jq '.result.addresses | .[]' | xargs -I ADDR curl -s -X POST http://127.0.0.1:33777/json_rpc -H 'Content-Type: application/json-rpc' -d '{"jsonrpc": "2.0", "method": "sendFusionTransaction", "password": "password", "params": {"addresses": ["ADDR"], "destinationAddress": "ADDR", "threshold" : 100000000, "anonymity": 0}, "id": "1"}'

This shell script gets list of subwallet addresses from wallet daemon and runs wallet optimization once for every subwallet. In two places the second "password" after : must be replaced with the real password, for example "password": "my_secret_password". If using custom port, replace 33777 with correct port in both places.

*/5 * * * * /root/optimize.sh > /dev/null 2>&1

If you save the script on top of the post as /root/optimize.sh and add above line in /root/crontab, and run crontab /root/crontab the script will be run every 5 minutes. All output from script will be discarded. 5 minute interval should be enough to optimize all the subwallets even if they are used for mining.

Blockchain loading issues on GUI wallet

Latest GUI wallet release (version 2.0.8 build 8) introduces change that will replace UTF-8 with legacy character set when converting between file paths used by CryptoNote core and GUI wallet. This should fix issues when file paths contain characters that can’t be represented by first 127 characters of ASCII character set. Used legacy character set depends on Linux locale or Windows settings for legacy applications.

Talleo version of CryptoNote core already added support earlier for Unicode API when reading environment variables containing application data directory (“AppData” under user profile directory). Due to using legacy character set, file path can only contain characters that can be represented by single character set.

The change to legacy character set was required as older Windows builds don’t use UTF-8 in legacy file I/O API. Newer Windows 10 builds have optional support for using UTF-8 for file I/O in legacy applications.

New server for seed node and official pool

During scheduled monthly maintenance, we decided it’s better to retire old server for official mining pool and one of the seed nodes. We replaced it with 4 core VPS hosted by Hetzner on their Falkenstein data center in Germany. Due to change of data center and hosting provider, the IP address of the seed node changed. This means seed node list embedded in Talleod and GUI wallet needs to be updated and new binaries released.

We will release new binaries before April 1st, 2021 and push the updated sources to GitHub.

Basic operation of TLO-ETH bridge

The core logic of the bridge is coded in convertFrom() and convertTo() functions of the contract.

convertFrom() is called from the bridge when it receives transaction to the TLO wallet with payment ID. Payment ID is decoded and used as destination ETH address. The decoding uses simple 6-bit table mapping 0-9, a-f and A-F, so checksum of the ETH address is preserved. The bridge will use owner address to pay the gas for the transaction.

convertTo() can be called from any ETH address with wTLO balance to convert back to TLO, it will require base58 decoded version of the TLO address as all contract function parameters are encoded in hexadecimal. Currently minimum convertible amount is 1.00 TLO and the token amount is subtracted by TLO network fee.

If other coins want to use the same contract, they must replace convertFrom() function with transfer() function using dedicated ETH address as substitute for the owner address of the contract. There is no 1-to-1 alternative for convertTo() function as it would require new contract method and event for each third-party coin. Because normal token transfer can’t specify metadata, the only viable solution is using decentralized exchange to swap wTLO to own wrapped token and then using function from that contract to convert back to own coin, or using dedicated swap contract holding balances in both tokens as intermediate.

Anniversary giveaway winners

First prize 1000000.00 TLO went to wallet address:

* TA4e1PZfTZf7zHj3RECUTM2dRR7vTD3u2dnSeok9ZXNBcVQgfbbBXL3jgaxNyRHuRNNiStmvJMfAd7ssvJSdr61p1eUP6BSm4

Following addresses got 10000.00 TLO each:

* TA4tUqsd2zH6XygyuaM141PLXU2quLjuTPMqYpHTDciXfxWTFyjLj8v7jM1ce3aJrWLMAj2FK8kYxTyDoDF9oKpA2CEUWFmPV
* TA4Nx9C7wdM9Rd6d4rtfndA96paCVNHAiQSkRMYtMZoyH1FBJP9ECTSj3EC9kXMrSp7CNSPNyBufiFiVNRCXqPKv21JULUMS5
* TA3jUSJRXH8Rs3JDEJD5V6UTnWei6GTK5iLeFZN7wvdv6qNx9EsLN9jihwPDc1EvyHgZwvp7Ut2ptDVzFFDBz2EM1pyCBWKFr
* TA4wVDZ6YX339M5FmuQ4mTGKbkSy9WFe8e2mHiy2VnsoaNE9eWDEVBv5WU6jveNjudJY52EXa3WVVEzN5FDCT1tr227Ldr5Wt
* TA4Qwat2gXHZCQaWbzKpoeaTZDiUB4yYq6WNbfMzvXqu4N1hmWvYHiGSUePDe7oD2LFY9dzhqobvhfikZnzmvmab2GWN8zfEY
* TA4JSnL83zHHuCjWzrt7akUsvfAJmyVvRJsBEFi5ZiEWY59YW9zyaQc45ygFkTMQHZ8trufD4w8RZVo15pQ8htpY1NnUE1bcs
* TA4v7QYDEYtU817QkXR8ukPApMNP9Nu2eYEGPP3ZF1CqR5kTci5P6sH1uHN14CML3TYuaon9tEdeFQaq8EXnnUUB1GaaH8EbV
* TA4FhqhKtP3WVLBU8eKtA39SsBLGTeRW3bpKihnkTas1hL8UVQW4agPcHp5WqmH6YEbPPkb43wxR3QhpFBW9YwUX29vM1XmDv
* TA48TL7ZHKwJQm5m1dsDrmQesWU3jecmzam1Pgf7bNGq4jvRXQrrQRX9dnEP4ALhVNCDKaB3Q9tYrFgmjqMq57HL2oLMCnwt2
* TA4r3AN1TN4Ufn37cVYWDgZ5wZQmtBH1qBcwT6N9ZBX82UbC3SgKBRvXnAFhGvuEec2etQHxdisqU6gHjzDhpHpu1njXg3hCT
* TA34mtF629cP9Gq2HmMSrgRYwsy51U6sGHFQT4CuNNu2d7TN3SdEK5B9dnEP4ALhVNCDKaB3Q9tYrFgmjqMq57HL2oLKVS1j2
* TA3Xci4Vvu5AnCygyVDXXP642am3sFazAEAjcXtDjqqTC7ZdmnUq6vc6ZES2y96yQDAKYLZmDf8V74i72XxbGZCX2H5h9Mona
* TA4GnNUnBMQafiG8XzDg7aMC8CShcyYkHQJs8gymikVjdHVKi5qKFSLR5QdpuHTXGGJd2vZGB2ear8BpfhUV9zMh1mt846eqx
* TA3Uz9BF7GdLWuTnbfSFeE42jT4Dvb64wKL9jL7dZNawWWLBxJEu8K39dnEP4ALhVNCDKaB3Q9tYrFgmjqMq57HL2oLNdoBoE