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

curl -s -X POST -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 -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/ > /dev/null 2>&1

If you save the script on top of the post as /root/ 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
* TA3jUSJRXH8Rs3JDEJD5V6UTnWei6GTK5iLeFZN7wvdv6qNx9EsLN9jihwPDc1EvyHgZwvp7Ut2ptDVzFFDBz2EM1pyCBWKFr
* TA4wVDZ6YX339M5FmuQ4mTGKbkSy9WFe8e2mHiy2VnsoaNE9eWDEVBv5WU6jveNjudJY52EXa3WVVEzN5FDCT1tr227Ldr5Wt
* TA4Qwat2gXHZCQaWbzKpoeaTZDiUB4yYq6WNbfMzvXqu4N1hmWvYHiGSUePDe7oD2LFY9dzhqobvhfikZnzmvmab2GWN8zfEY
* TA4JSnL83zHHuCjWzrt7akUsvfAJmyVvRJsBEFi5ZiEWY59YW9zyaQc45ygFkTMQHZ8trufD4w8RZVo15pQ8htpY1NnUE1bcs
* TA4v7QYDEYtU817QkXR8ukPApMNP9Nu2eYEGPP3ZF1CqR5kTci5P6sH1uHN14CML3TYuaon9tEdeFQaq8EXnnUUB1GaaH8EbV
* TA4FhqhKtP3WVLBU8eKtA39SsBLGTeRW3bpKihnkTas1hL8UVQW4agPcHp5WqmH6YEbPPkb43wxR3QhpFBW9YwUX29vM1XmDv
* TA48TL7ZHKwJQm5m1dsDrmQesWU3jecmzam1Pgf7bNGq4jvRXQrrQRX9dnEP4ALhVNCDKaB3Q9tYrFgmjqMq57HL2oLMCnwt2
* TA4r3AN1TN4Ufn37cVYWDgZ5wZQmtBH1qBcwT6N9ZBX82UbC3SgKBRvXnAFhGvuEec2etQHxdisqU6gHjzDhpHpu1njXg3hCT
* TA34mtF629cP9Gq2HmMSrgRYwsy51U6sGHFQT4CuNNu2d7TN3SdEK5B9dnEP4ALhVNCDKaB3Q9tYrFgmjqMq57HL2oLKVS1j2
* TA3Xci4Vvu5AnCygyVDXXP642am3sFazAEAjcXtDjqqTC7ZdmnUq6vc6ZES2y96yQDAKYLZmDf8V74i72XxbGZCX2H5h9Mona
* TA4GnNUnBMQafiG8XzDg7aMC8CShcyYkHQJs8gymikVjdHVKi5qKFSLR5QdpuHTXGGJd2vZGB2ear8BpfhUV9zMh1mt846eqx
* TA3Uz9BF7GdLWuTnbfSFeE42jT4Dvb64wKL9jL7dZNawWWLBxJEu8K39dnEP4ALhVNCDKaB3Q9tYrFgmjqMq57HL2oLNdoBoE

What if wallet rejects transaction even if there is adequate balance…

There is two main reasons why either SimpleWallet or GUI wallet rejects a transaction even if there is enough unlocked coins in the wallet:

  1. The transaction contains too many inputs
    This can be caused either by too high anonymization level (mixin) or the wallet hasn’t been optimized recently.
    To fix this, first optimize the wallet (either enable wallet optimization in settings of GUI wallet and wait until the optimization status in the settings says the wallet is optimized, or open the wallet in SimpleWallet and run “full_optimize” command).
    If optimization doesn’t remote the error, lower anonymization level until the daemon accepts the transaction. If it still fails at level 0, continue to next step.
  2. The wallet is out of sync
    This can be usually fixed by resetting the wallet and making sure the node daemon can be connected from other nodes. Daemon needs port 33802 open from internet through any firewalls (including NAT) and routers. If you can’t open ports, you need to use remote daemon to synchronize the wallet. IPv4 must be enabled and DHCP must give valid IPv4 address to the machines running node daemon and wallets.

If you have multiple machines in local area network running wallets, use single machine for the node daemon and connect to that instance from all wallets. Both SimpleWallet and GUI wallet allow using remote daemons. Compare the blockchain height displayed by wallet with blockchain height reported by official blockchain explorer. In SimpleWallet, you can see blockchain height with command “bc_height”.