Tockchain Transaction Types
Join the Tockchain public testnet and gain early access to the infrastructure powering the next generation of stablecoins
0. Overview
Tockchain is a multi-asset blockchain that supports various transaction types including standard transfers, pools, orderbook trading, and cross-chain operations.
This documentation covers the essential transaction types and structures needed to leverage Tockchain transactions.
Tockchain uses a unique transaction identification system called "tockid" instead of traditional transaction hashes. A tockid consists of:
- Unix timestamp (utime)
- Rollup index (rind)
- Transaction index (txind)
This document explains how to create and process various transaction types within Tockchain. Each transaction consists of two main parts:
- Transaction Command: The first part describes the transaction you want to execute. This includes the specific command (e.g., maketx, multisigaddr, etc.) and its associated parameters such as sender, recipient, amount, asset type, and additional data. The command is submitted to the system for processing.
- Transaction Result: After processing the command, the system returns the result of the transaction. This will include details such as the transaction’s status (e.g., "result": "success"), the transaction hash, and other relevant information. This output helps you verify if the transaction was successful and view any additional information, such as timestamps and potential chain lag.
Each section in this documentation follows this format: you will first find the transaction command, followed by the transaction result. This structure is consistent across all transaction types described.
1. Standard Transactions
1.0. Introduction to Standard Transactions
To simplify the process of creating different transaction types, a
maketx JSON command has been implemented for the websockets interface. This command allows you to specify the transaction type and its parameters. It then returns a hash that needs to be signed, along with the rawhex representation of the transaction.The first 64 bytes of the
rawhex will always be set to 0x00. This is where the transaction signature must be placed. When signing the transaction, the address that signs it must match the sender address specified in the transaction parameters.1.1. Send Transaction
Standard Send Transaction - Command (Input)
{ "command": "maketx", "type": "standard", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "dest": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "amount": "1", "utc": 0, "ispkhash": 0, "asset": "QUBIC" } }
Standard Send Transaction - Result (Output)
{ "signthis": "bf3204af041e960edb2b289cafb8134c762762855c85ebacbf0ff48c0aecd810", "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028024568a6786ade996473507072dd26a997b8ee03b522dec2843f2e53d8a3734c4037978d4247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00e1f50500000000", "tx": { "txlen": 144, "type": "standard", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "ispkhash": 0, "dest": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "amount": "1.00000000", "asset": "QUBIC", "utc": 1737119268 }, "utc": 1737119253, "chainlag": 0, "result": "success" }
1.2. Burn Transactions
Burn transactions are used to destroy (or “burn”) a specified amount of an asset, removing it from circulation.
Burn Transaction - Command (Input)
{ "command": "maketx", "type": "burn", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "amount": "1", "utc": 0, "ispkhash": 0, "asset": "QUBIC" } }
Burn Transaction - Result (Output)
{ "signthis": "18c7c1c0b77e506f4986c2a10b96b6070dd8ce48cdf0ba7cc9999f08083191e5", "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028025568a6786ade996473507072dd26a997b8ee03b522dec2843f2e53d8a3734c4037978d4000000000000000000000000000000000000000000000000000000000000000000e1f50500000000", "tx": { "txlen": 144, "type": "burn", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "ispkhash": 0, "dest": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFXIB", "amount": "1.00000000", "asset": "QUBIC", "utc": 1737119269 }, "utc": 1737119254, "chainlag": 0, "result": "success" }
2. Crosschain Transactions
2.1. Crosschain Transaction
Crosschain Transaction - Command (Input)
A crosschain transfer is used to transfer of an asset (QUBIC) from one chain to another (e.g., from the current chain to the “qubic” chain).
{ "command": "maketx", "type": "crosschain", "destchain": "qubic", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "dest": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "amount": "1", "utc": 0, "ispkhash": 0, "asset": "QUBIC" } }
Crosschain Transaction - Result (Output)
A crosschain transfer is used to transfer of an asset (QUBIC) from one chain to another (e.g., from the current chain to the “qubic” chain). This sub-type includes additional details like external symbol (QU) and external issuer.
{ "signthis": "75ab68a22c0fd13f76f81b68848f010e94b0a474b013ceb16424c95a53f31117", "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008202805a568a6786ade996473507072dd26a997b8ee03b522dec2843f2e53d8a3734c4037978d4247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00e1f50500000000", "tx": { "txlen": 144, "type": "crosschain", "chainid": 1, "chainname": "qubic", "extsymbol": "QU", "extissuer": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFXIB", "decimals": 0, "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "dest": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "amount": "1.00000000", "asset": "QUBIC", "utc": 1737119322 }, "utc": 1737119307, "chainlag": 1, "result": "success" }
The return values will parse the
rawhex sent in, allowing the relevant fields to be compared. This method works with most transaction types. However, for multisig transactions, different commands are required to complete the process, which will be described below.3. Order Transactions
3.0. Introduction to Order Transactions
Order Transactions provide a comprehensive orderbook trading solution on Tockchain, specifically for asset trading using a maker/taker system. It leverages hashed addresses to secure orders, incorporates basecoin rewards, and allows for OTC trades. Tracking is simplified with special address tracking for each order type.
Here’s a breakdown of the key features:
- Orderbook Functionality: The orderbook allows for asset trading in a maker/taker system.
- Maker: Places an order to buy or sell an asset at a specific price. The maker creates bids and asks with a minimum value of $100 in VUSD (Tockchain’s stablecoin). This value is denominated in VUSD to 8 digits of precision (0.00000001 VUSD).
- Taker: Accepts an existing order made by the maker.
- Over-the-Counter (OTC) orders: These orders allow the maker to specify a particular taker to fill the order, ensuring that only the specified taker can fulfill the order.
- Liquidity Pool & Arbitrage: The asset’s liquidity pool operates between the high bid and low ask prices on the orderbook. Auto-arbitrage bots will ensure that the orderbook and liquidity pools maintain synchronized pricing.
- Order Address Hashing: Orders are locked and represented by hashed addresses. The specifics of an order (e.g., maker, assets, price, etc.) determine the hash for the order address.
- Basecoin Rewards: Only the maker can claim any basecoin rewards earned by an order address. The maker can also cancel or modify their orders.
- Address History: To simplify orderbook tracking, each asset has special tracking addresses associated with the maker, taker, and OTC orders. This way, users can view all open orders and the status of their trades from the respective addresses.
3.1. Order Address Transaction
Order Address Transaction - Command (Input)
The Order Address transaction creates an order address for a specific orderbook entry.
{ "command": "orderaddr", "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "makerasset": "VUSD", "takerasset": "QUBIC", "VUSDprice": "405" }
Order Address Transaction - Result (Output)
{ "orderaddr": "FEEBRLYNABBPAAQEHAESLDRWULAAYKZKTMRTSQLKFCLQDLDRXHYVEWBDINDN", "makersaddr": "SGHDOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWRVG", "takersaddr": "MBJZLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHMC", "makeraddr": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "OTCaddr": "", "makerasset": "VUSD", "takerasset": "QUBIC", "VUSDprice": "405.00000000", "utc": 1749721969, "chainlag": 1, "result": "success" }
3.2. Maker Order Transaction
Make Order Creation Transaction - Command (Input)
The Make Order transaction creates a maker order.
{ "command": "maketx", "type": "makerorder", "tx": { "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "makerasset": "VUSD", "takerasset": "QUBIC", "VUSDprice": "405", "amount": "100.00000000" } }
Make Order Creation Transaction - Result (Output)
{ "txlen": 220, "signthis": "00aa8a68d230401e5caae1feb869104b85b89815c23378fc2cc6f4f3c62e71a2", "signlen": 156, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050200804f611b6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f3205ad8c55640f01e68d31359cfa9e2f7349ea3c66bb0fe90e24450fa2ef3ccf00e40b540200000011077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f00000000000000000000000000000000000000000000000000000000000000000080138000f5fc6d09000000", "tx": { "txlen": 220, "type": "makerorder", "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "funds": "KOLAPIPGLDVUAAOMMEZOEASTXYJBDCZRRWPNIIOZTGEVWYVKMJCZOMAGHYBB", "tracker": "JHHDOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJEG", "amount": "100.00000000", "makerasset": "VUSD", "utime": 1746624847, "takerasset": "QUBIC", "price": "405.00000000", "cancel": 0, "claimcoinbase": 0 }, "utc": 1746624824, "chainlag": 0, "result": "success" }
3.3. Maker Order Cancellation Transaction
Make Order Cancellation Transaction - Command (Input)
The Make Order transaction cancels a maker order.
{ "command": "maketx", "type": "makerorder", "tx": { "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "makerasset": "VUSD", "takerasset": "QUBIC", "VUSDprice": "405", "cancel": 1, "amount": "10.00000000" } }
Make Order Cancellation Transaction - Result (Output)
{ "txlen": 220, "signthis": "baf417ad8d57032f935af8a3dc451489e1995ed67c074effce7e95800bfe4773", "signlen": 156, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a00806e871b68d02198cdac7899a79a39744b7acc8a06807eece9ae86523305c797479cba83f511077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f00e40b540200000011077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f0000000000000000000000000000000000000000000000000000000000000000008013800078a69820000000", "tx": { "txlen": 220, "type": "makerorder", "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "funds": "YEOBJRWQTUJOWECCJAYBIZMKLYEAGLHQQTSCFCPTMBBGWANKRKRXAKDHTDRL", "tracker": "JHHDOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJEG", "amount": "10.00000000", "makerasset": "VUSD", "utime": 1746634606, "takerasset": "QUBIC", "VUSDprice": "405.00000000", "cancel": 1, "claimcoinbase": 0 }, "utc": 1746634518, "chainlag": 1, "result": "success" }
The Make Order transaction cancels a maker order.
3.4. Maker Order Claim Reward Transaction
Maker Order Asset Recovery Transaction - Command (Input)
The Make Order Claim Reward transaction claims basecoin rewards for a maker order.
{ "command": "maketx", "type": "makerorder", "tx": { "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "makerasset": "VUSD", "takerasset": "QUBIC", "VUSDprice": "405", "claimcoinbase": 1, "claimasset": "VNET" } }
Maker Order Asset Recovery Transaction - Result (Output)
{ "txlen": 220, "signthis": "98f12a7632924de7627b5aeddb09fca3d30e8914515082bd568bc58ec0c494e1", "signlen": 156, "rawhex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005220180098a1b687b4744020944f0230b7bad5ec98eded88785091060fc4d0766287066e0730b8711077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f00e876481700000011077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f000000000000000000000000000000000000000000000000000000000000000000801380000e218f28000000", "tx": { "txlen": 220, "type": "makerorder", "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "funds": "BBGDDLGAXNODBBJHRZGFUDGFRTHGPQOONFVVIPKNFACSIUDJULQMGZXDZENM", "tracker": "JHHDOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJEG", "amount": "1000.00000000", "asset": "VNET", "utime": 1746635273, "takerasset": "QUBIC", "VUSDprice": "405.00000000", "cancel": 0, "claimcoinbase": 1, "claimasset": "VNET" }, "utc": 1746635205, "chainlag": 0, "result": "success" }
3.5. Maker Order Asset Recovery Transaction
Maker Order Asset Recovery Transaction - Command (Input)
The Make Order Claim Reward transaction claims basecoin rewards for a maker order.
{ "command": "maketx", "type": "makerorder", "tx": { "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "makerasset": "VUSD", "takerasset": "QUBIC", "VUSDprice": "405", "claimcoinbase": 1, "claimasset": "ETH" } }
Maker Order Asset Recovery Transaction - Result (Output)
{ "txlen": 220, "signthis": "98f12a7632924de7627b5aeddb09fca3d30e8914515082bd568bc58ec0c494e1", "signlen": 156, "rawhex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005220180098a1b687b4744020944f0230b7bad5ec98eded88785091060fc4d0766287066e0730b8711077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f00e876481700000011077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f000000000000000000000000000000000000000000000000000000000000000000801380000e218f28000000", "tx": { "txlen": 220, "type": "makerorder", "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "funds": "BBGDDLGAXNODBBJHRZGFUDGFRTHGPQOONFVVIPKNFACSIUDJULQMGZXDZENM", "tracker": "JHHDOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJEG", "amount": "1000.00000000", "asset": "VNET", "utime": 1746635273, "takerasset": "QUBIC", "VUSDprice": "405.00000000", "cancel": 0, "claimcoinbase": 1, "claimasset": "ETH" }, "utc": 1746635205, "chainlag": 0, "result": "success" }
3.6. Taker Order Transaction
Taker Order Transaction - Command (Input)
{ "command": "maketx", "type": "takerorder", "tx": { "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "makerasset": "VUSD", "takerasset": "QUBIC", "VUSDprice": "405", "taker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "amount": "0.00001" } }
Taker Order Transaction - Result (Output)
{ "txlen": 220, "signthis": "9bc1179ef4637e3b3b8fcbb1da42b227f6e044c56c73dcc051f83841a800a5de", "signlen": 156, "rawhex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005046580c1b64a682bf0c8ec844bc7e819a6501e346ee483b603f2132f4591b60bc526751c0c2862262288a7306f027df983afe11280205daab2cc40921dcb129b4ec3eb752401c160e47801000000009d864c4f1191fd05532de4dc7c0623744638c14aa054e7aa002d87823934946800000000000000000000000000000000000000000000000000000000000000000080658000f5fc6d09000000", "tx": { "txlen": 220, "type": "takerorder", "funds": "FPGDBIDSBXZTTGDFNGFUEZEJJPVDARNDTAGWXBGWHFBRWTSBODZDBDWCWFRK", "taker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "tracker": "HFJZLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPMC", "amount": "0.00001", "takerasset": "QUBIC", "utime": 1749726913, "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "makerasset": "VUSD", "VUSDprice": "405.00000000", "OTCaddr": "" }, "utc": 1749726887, "chainlag": 0, "result": "success" }
3.7. Open Orders Transaction
Open Orders Transaction - Command (Input)
The openorders command gives users visibility into the orders they have placed, making it easier to track assets within the system.
{ "command": "openorders", "maker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "asset": "QUBIC" }
Open Orders Transaction - Result (Output)
{ "openorders": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "asset": "QUBIC", "bids": [ [ "405.00000000", "100.00000000", "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "KOLAPIPGLDVUAAOMMEZOEASTXYJBDCZRRWPNIIOZTGEVWYVKMJCZOMAGHYBB" ] ], "asks": [], "utc": 1746635629, "chainlag": 0, "result": "success" }
4. Pool Transactions
4.0. Introduction to Pool Transactions
To create a new asset, a minimum deposit of 1000 VUSD is required. Additionally, before a pool can be used, the asset itself must be deposited into the pool’s address. This deposit can be made by anyone but is typically expected to be done by the asset’s creator. If the asset creator does not fund the other half of the pool, the pool will remain non-functional.
There are three primary pool functions: swap, deposit, and withdraw. Each of these functions has specific inputs and workflows, detailed below with examples.
4.1. Poolswap Transaction
Poolswap Transaction - Command (Input)
The “poolswap” transaction type allows you to exchange one asset for another. Specify the following:
- Source asset (
srcasset). - Destination asset (
destasset). - Amount you wish to swap (
amount).
You can optionally use the
mindestamount field to ensure you receive at least the minimum expected amount of the destination asset.{ "command": "maketx", "type": "poolswap", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "srcasset": "QUBIC", "destasset": "VUSD", "amount": "0.00000001", "utc": 0, "ispkhash": 0, "mindestamount": "0.00000003" } }
Poolswap Transaction - Result (Output)
{ "txlen": 122, "signthis": "f641afaed1136832438d1a35cbb27fed5fd2c89abbc31a698f7ef429524427e2", "signlen": 58, "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400028013ba4a6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f010000000000000003000000000000000080", "tx": { "txlen": 122, "type": "poolswap", "srcasset": "QUBIC", "destasset": "VUSD", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "amount": "0.00000001", "mindestamount": "0.00000003", "ispkhash": 0, "utime": 1749727763 }, "utc": 1749726637, "chainlag": 0, "result": "success" }
4.2. Pooldeposit Transaction
Pooldeposit Transaction - Command (Input)
The “pooldeposit” function lets you add tokens to the pool.
You can deposit either one asset or a combination of both assets. When depositing both assets, include the
amount2 field to specify the quantity of the second asset.To check the current pool price, query the asset name. The query will return all relevant pool details. Prices can then be calculated based on the relative holdings of each asset in the pool.
Single-asset deposit:
{ "command": "maketx", "type": "pooldeposit", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "srcasset": "VUSD", "destpool": "QUBIC", "amount": "0.00000001", "utc": 0, "ispkhash": 0 } }
Dual-asset deposit: Dual-asset deposit with both assets being provided in specified amounts.
{ "command": "maketx", "type": "pooldeposit2", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "srcasset": "VUSD", "destpool": "QUBIC", "amount": "0.01", "utc": 0, "ispkhash": 0, "amount2": "0.00000001" } }
Pooldeposit Transaction - Result (Output)
Single-asset deposit:
{ "txlen": 122, "signthis": "694b3563cea4c7f1007ff2d112fd7b0004c8330366248cb63f256c42ada89593", "signlen": 58, "rawhex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040080bbbf4a6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f010000000000000000000000000000000200", "tx": { "txlen": 122, "type": "pooldeposit", "srcasset": "VUSD", "destpool": "QUBIC.pool", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "amount": "0.00000001", "ispkhash": 0, "utime": 1749729211 }, "utc": 1749729194, "chainlag": 0, "result": "success" }
Dual-asset deposit: Dual-asset deposit with both assets being provided in specified amounts.
{ "txlen": 122, "signthis": "4ea5bad014c6e2d784aa8db8be2c7cd801ae0818d849dc1eaec8f1220481e63e", "signlen": 58, "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406008060c14a6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f40420f000000000001000000000000000200", "tx": { "txlen": 122, "type": "pooldeposit2", "srcasset": "VUSD", "destpool": "QUBIC.pool", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "amount": "0.01000000", "amount2": "0.00000001", "ispkhash": 0, "utime": 1749729632 }, "utc": 1749729560, "chainlag": 0, "result": "success" }
4.3. Poolwithdraw Transaction
Poolwithdraw Transaction - Command (Input)
The poolwithdraw function allows you to withdraw tokens from the pool in various ways:
- Specify the pool and the asset you want to withdraw.
- To withdraw a balanced value of both assets in the pool, use $both$ as the withdraw string. This will withdraw an equal proportion of both assets.
Additionally, larger pools earning basecoin rewards will distribute TOCK coins as part of the withdrawal process.
Withdraw a single asset (QUBIC):
{ "command": "maketx", "type": "poolwithdraw", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "srcpool": "QUBIC", "withdraw": "QUBIC", "poolshares": "0.00000001", "utc": 0, "ispkhash": 0 } }
Withdraw a single asset (VUSD):
{ "command": "maketx", "type": "poolwithdraw", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "srcpool": "QUBIC", "withdraw": "VUSD", "poolshares": "0.00000001", "utc": 0, "ispkhash": 0 } }
Withdraw both assets equally (VUSD & QUBIC):
{ "command": "maketx", "type": "poolwithdraw", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "srcpool": "QUBIC", "withdraw": "$both$", "poolshares": "0.00000001", "utc": 0, "ispkhash": 0 } }
Poolwithdraw Transaction - Result (Output)
Withdraw a single asset (QUBIC):
{ "txlen": 122, "signthis": "d0b14847ba3c481145bffcabda31316201f2f22393e45c068e938f9d81427566", "signlen": 58, "rawhex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004020200ffc34a6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f010000000000000000000000000000000280", "tx": { "txlen": 122, "type": "poolwithdraw", "srcpool": "QUBIC.pool", "withdraw": "QUBIC", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "poolshares": "0.00000001", "ispkhash": 0, "utime": 1749730303 }, "utc": 1749730271, "chainlag": 0, "result": "success" }
Withdraw a single asset (VUSD):
{ "txlen": 122, "signthis": "09f9794cf57b30c3750dbae4ce8fdc95d511913c7b540312a3554547116d1964", "signlen": 58, "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000402020034c44a6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f010000000000000000000000000000000080", "tx": { "txlen": 122, "type": "poolwithdraw", "srcpool": "QUBIC.pool", "withdraw": "VUSD", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "poolshares": "0.00000001", "ispkhash": 0, "utime": 1749730356 }, "utc": 1749730288, "chainlag": 0, "result": "success" }
Withdraw both assets equally (VUSD & QUBIC):
{ "txlen": 122, "signthis": "cff22344fb7aefb57482d074ecf9e7a7fcbb2dc3aeaf15566d59e16eded66632", "signlen": 58, "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000402020058c44a6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f010000000000000000000000000000000000", "tx": { "txlen": 122, "type": "poolwithdraw", "srcpool": "QUBIC.pool", "withdraw": "$both$", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "poolshares": "0.00000001", "ispkhash": 0, "utime": 1749730392 }, "utc": 1749730371, "chainlag": 0, "result": "success" }
5. Multi-Signature Transactions
5.0. Introduction to Multi-Signature Transactions
For multisig transactions, you need to create a multisig address using the
multisigaddr command. Similar to Bitcoin, you specify the number of signers, the minimum signatures required, and all the pubkeys. There is also an optional locktime, which prevents the funds from being spent until that locktime (if nonzero).Unlike Bitcoin's multisig, the position of the pubkeys matters, as the signatures will be prefixed with the pubkey index, starting from 0.
Regarding size limits, there is approximately 2 KB of space available for both pubkeys and signatures, and any combination that fits within that space is acceptable. The
multisigaddr command will return an error if the numsigners and minsigs values exceed the available space.To estimate if a specific combination will fit, add the number of signers to twice the number of minimum signatures. If the total is less than 64, it will fit—actually, a few more could be squeezed in. For example, a 16 of 32 multisig setup would be close to the size limit, as would a 1 of 64 setup.
5.1. Multi-Signature Address Creation Transaction
Multi-Signature Address Creation Transaction - Command (Input)
This command creates a multisig address with 2 signers and 2 required signatures, along with an optional locktime parameter. This is used to specify the signers and their required signatures for a multisig transaction.
{ "command": "multisigaddr", "numsigners": 2, "minsigs": 2, "locktime": 0, "pubkeys": [ "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA" ] }
Multi-Signature Address Creation Transaction - Result (Output)
{ "multisigaddr": "OWUROZQGEJOMCFTPENXIHROTOKQEPBIGETDZPWPAZGRGNIGIWVLRXBOEQSID", "minsigs": 2, "numsigners": 2, "pubkeys": [ "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA" ], "utc": 1737125037, "chainlag": 0, "result": "success" }
5.2. Multi-Signature Spend Transaction
Multi-Signature Spend Transaction - Command (Input)
To initiate a multisig spend transaction, follow these steps:
- Define the Multisig Address: Start by specifying the multisig address and the details of the transaction, including the number of signers required, as explained in the “Multi-Signature Address Creation Transaction - Command (Input)” section above.
- Set the UTC Field: When specifying the transaction time, be sure to add sufficient time in the UTC field. The default UTC of 0 would typically default to the current time, but for multisig transactions, this may not allow enough time to gather the necessary signatures. Increase the time accordingly to accommodate the signing process.
- The
commandis “maketx", creating a multisig transaction. - The
numsignersandminsigsare set to 2, meaning that two signers are required to sign the transaction. locktimeis 0 (not specifying a lock).- The
pubkeysare the public keys of the two signers. - The transaction (
tx) specifies the sender, the recipient (dest), the amount, and the asset (VUSD). Theutcvalue of 0 will default to the current time, but you should adjust this to provide enough time for all signatures to be gathered. - Sign the Transaction: Once the transaction is defined, the multisig transaction hash must be signed by the designated number of signers. Unlike other transaction types, signatures for multisig transactions are appended at the end. The signing process is initiated with the
signthishash. - The
signthisis a hash value of the transaction to be signed. rawhexrepresents the transaction in raw hexadecimal format.- The
txfield includes transaction details like the transaction length, type (multisig), the multisig address, destination, amount, asset, and the required number of signers (2). It also includes theutcfield set to the actual time. - Once this is signed, the
resultis marked as “success.” - Add Signatures: After obtaining the first signature, use the “addsig”
commandto add it to the transaction. Each subsequent signature is added in the same way. This ensures that the transaction is accumulated with the required number of signatures until theminsigsthreshold is met. The transaction will be ready for broadcasting once all necessary signatures are gathered.
In the following code example:
{ "command": "maketx", "type": "multisig", "numsigners": 2, "minsigs": 2, "locktime": 0, "pubkeys": [ "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA" ], "tx": { "sender": "OWUROZQGEJOMCFTPENXIHROTOKQEPBIGETDZPWPAZGRGNIGIWVLRXBOEQSID", "dest": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "amount": "1", "asset": "VUSD", "utc": 0 } }
In the following code example:
{ "signthis": "5e206dce8570373638cac7a2cd6c8d7e18f428306391cea5e4e6777b3d01a676", "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000802bbb8a67c2a086e0d9dd73af61681e58539b759f99c21c0826b5bcefa1c24221bda85e9c247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00e1f5050000000000000000020286ade996473507072dd26a997b8ee03b522dec2843f2e53d8a3734c4037978d4247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "tx": { "txlen": 344, "type": "multisig", "multisigaddr": "OWUROZQGEJOMCFTPENXIHROTOKQEPBIGETDZPWPAZGRGNIGIWVLRXBOEQSID", "dest": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "amount": "1.00000000", "asset": "VUSD", "utc": 1737145131, "locktime": 0, "minsigs": 2, "numsigners": 2, "signers": [ "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA" ] }, "utc": 1737145116, "chainlag": 0, "result": "success" }
Example (first signature added): In this step, one of the signers (COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI) adds their signature to the transaction. The signature is appended using the “addsig”
command. The rawhex field remains the same as before, but with the signature added to it.{ "command": "addsig", "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000802bbb8a67c2a086e0d9dd73af61681e58539b759f99c21c0826b5bcefa1c24221bda85e9c247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00e1f5050000000000000000020286ade996473507072dd26a997b8ee03b522dec2843f2e53d8a3734c4037978d4247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "signer": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "sig": "75ab68a22c0fd13f76f81b68848f010e94b0a474b013ceb16424c95a53f3111775ab68a22c0fd13f76f81b68848f010e94b0a474b013ceb16424c95a53f31117" }
Example (second signature added):
{ "command": "addsig", "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000802bbb8a67c2a086e0d9dd73af61681e58539b759f99c21c0826b5bcefa1c24221bda85e9c247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00e1f5050000000000000000020286ade996473507072dd26a997b8ee03b522dec2843f2e53d8a3734c4037978d4247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e0075ab68a22c0fd13f76f81b68848f010e94b0a474b013ceb16424c95a53f3111775ab68a22c0fd13f76f81b68848f010e94b0a474b013ceb16424c95a53f31117000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "signer": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "sig": "5e206dce8570373638cac7a2cd6c8d7e18f428306391cea5e4e6777b3d01a676" }
Multi-Signature Spend Transaction - Result (Output)
After all signatures are accumulated, the transaction is fully signed and broadcastable to the network. The rawhex contains all the necessary signatures and transaction data.
{ "numsigs": 2, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000802bbb8a67c2a086e0d9dd73af61681e58539b759f99c21c0826b5bcefa1c24221bda85e9c247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e00e1f5050000000000000000020286ade996473507072dd26a997b8ee03b522dec2843f2e53d8a3734c4037978d4247a7649a4ef97baf4d0af9753403b76abcd9a0540a707c9f8d4cf7f58eddc7e0075ab68a22c0fd13f76f81b68848f010e94b0a474b013ceb16424c95a53f3111775ab68a22c0fd13f76f81b68848f010e94b0a474b013ceb16424c95a53f31117015e206dce8570373638cac7a2cd6c8d7e18f428306391cea5e4e6777b3d01a6765e206dce8570373638cac7a2cd6c8d7e18f428306391cea5e4e6777b3d01a676", "utc": 1737182607, "chainlag": 0, "result": "success" }
6. Coldspend Transactions
6.1. Coldspend Transaction
Coldspend Transaction - Command (Input)
A coldspend transaction is similar to a standard send transaction, but it requires an additional parameter: the change address (
newcoldaddr). This address will receive all the leftover tokens from the transaction. The process works by transferring tokens from the hot address to the destination address and sweeping all remaining funds to the cold address.In addition to the token being sent, all other tokens in the hot address are also transferred. This means up to 32 different transfers can be triggered by a single coldspend transaction. The “maketx”
command asks for both the hashed address and the hot address. The hot address will execute the spend, and it’s up to the calling program to ensure that cold addresses are properly managed.In the following code example:
hotaddr: The actual address (derived directly from the seed) that can sign and spend the funds.sender: The hashed address corresponding to thehotaddrwhere funds are stored.dest: The recipient address where the specified amount of the asset will be sent.amount: The amount of the specified asset to send.utc: A timestamp field for transaction validity.newcoldaddr: A new hashed address where all remaining funds (including other tokens) from the sender address will be transferred.asset: The token being sent in this transaction. For example, QUBIC.
{ "command": "maketx", "type": "coldspend", "tx": { "hotaddr": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "sender": "EQTWROQYMZRWOGHOSFIKGVBKICYAEHGDLVKNPRGGOCBKTPJAQJCUSWYAEZCG", "dest": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "amount": "0.000001", "utc": 0, "newcoldaddr": "GOGEPOUWQIBOKBXQMNDJUCMEXBQCCMEXJVUTZXUQYBBBNHRMQXHYDANAEYPK", "asset": "QUBIC" } }
Workflow for Wallet Implementation
- Hashed Address Usage: The wallet should prompt the user to use the hashed address (
sender) to obscure thehotaddr. This ensures that the actualhotaddrremains private until it is used for a transaction. - Cold Address Funds Management: When the coldspend is executed, the remaining funds (both the specified
assetand any others in thesenderaddress) are transferred to thenewcoldaddr. - First and Only Spend Visibility: The
hotaddris revealed during the first coldspend transaction. After that, thenewcoldaddrserves as the new hashed address for the user’s next cold storage.
In essence, the coldspend process ensures the wallet allows the user to interact with the hashed address (
sender) while keeping the hotaddr private until the first transaction is made. After that, all remaining funds are sent to the new cold address, which should be treated as a hashed address for a future hot address.Coldspend Transaction - Result (Output)
To-do: Include examples of the expected outputs for each pool transaction type.
7. Hashlock Transactions
7.0. Introduction to Hashlock Transactions
The hashlock transaction combines locking funds to an address until a specific time (locktime) with a hash of a secret. Currently, the supported hashing algorithms are K12 and SHA256, and more hashing types can be added if needed. This mechanism is useful for implementing features like atomic swaps.
For a detailed explanation of atomic swaps, refer to Chainlink’s guide on Atomic Swaps.
The first step in creating a hashlock transaction is to define the locking parameters using the “hashlockaddr” command. This calculates the address where funds will be locked based on the specified parameters. After generating the address, funds can be sent to it and will remain locked until the conditions are met.
7.1. Hashlock Address Transaction
Hashlock Address Transaction - Command (Input)
The following example demonstrate how to configure and execute a hashlock Address Transaction on Tockchain.
Example 1: Hashlock Address Transaction without locktime
{ "command": "hashlockaddr", "locktime": 0, "lockedasset": "QUBIC", "hashalgo": 1, "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "ac618b56e058f928d0c0f5657af041be90b42da3b137dc2ea62e7f8f257036dd" }
Example 2: Hashlock address with locktime
{ "command": "hashlockaddr", "locktime": 1749732685, "lockedasset": "QUBIC", "hashalgo": 1, "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "ac618b56e058f928d0c0f5657af041be90b42da3b137dc2ea62e7f8f257036dd", "utc": 1749732515 }
Hashlock Address Transaction - Result (Output)
Hashlock Address Result:
{ "hashlockaddr": "ZSBKMILLLHTOLGVUKCMOXHNNJIZFMSWHLQXWTSNBBBGJCUNNKEILUZGGYLQF", "lockparams": { "locktime": 0, "lockedasset": "QUBIC", "hashalgo": "K12", "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "ac618b56e058f928d0c0f5657af041be90b42da3b137dc2ea62e7f8f257036dd" }, "utc": 1749732146, "chainlag": 0, "result": "success" }
Hashlock Address Result with locktime:
{ "hashlockaddr": "QSOVGORKDHUEHHJWYASEOWHUSTKANTKPXLPDPFANHHYWAMHJFZDCVTIEJDLE", "lockparams": { "locktime": 1749732685, "lockedasset": "QUBIC", "hashalgo": "K12", "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "ac618b56e058f928d0c0f5657af041be90b42da3b137dc2ea62e7f8f257036dd" }, "utc": 1749732424, "chainlag": 1, "result": "success" }
Note that any asset can be locked (
lockedasset).Setting the
The
locktime to 0 disables time-lock functionality and does not support atomic swap protocols. Ensure the lock parameters are configured correctly for your use case.The
unlocker field can be left blank to allow anyone to claim the funds if they know the secret. However, this allows the locker (who knows the secret) to reclaim the funds at any time, limiting its use to specific cases like contests or challenges.Once funds are locked, they can only be unlocked and spent by someone who knows the secret that hashes to the specified
lockhash. If locktime is set, the locker cannot reclaim funds until after the locktime. If the secret is known, the funds can be unlocked at any time before or after the locktime.7.2. Hashlock Transactions
Hashlock Transaction - Command (Input)
The following example demonstrate how to configure and execute a hashlock transaction on Tockchain.
Hashlock unlock:
{ "command": "maketx", "type": "hashlock", "tx": { "locktime": 0, "lockedasset": "QUBIC", "hashalgo": 1, "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "lockhash": "ac618b56e058f928d0c0f5657af041be90b42da3b137dc2ea62e7f8f257036dd", "secret": "3dd1c399aeceef53880d1e0ba80fdf28dd3ee0784612f4895c7b9a93319bb371", "dest": "GOGEPOUWQIBOKBXQMNDJUCMEXBQCCMEXJVUTZXUQYBBBNHRMQXHYDANAEYPK", "refund": 0, "utc": 1749735677 } }
Hashlock Transaction - Result (Output)
Hashlock Unlock - Result:
{ "txlen": 280, "signthis": "b21ee90fa1f8d5284a7016b9d5140b07477f9c6b7d11bd0e8cc3f6b0a900f6dc", "signlen": 80, "rawhex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000080fdd84a68573425906bc7c7b8621c5be5dd50ed45ba8f242e015ed3ebeb71eeb738384cb1262288a7306f027df983afe11280205daab2cc40921dcb129b4ec3eb752401c10000000000000000000000000080010011077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9fd34f6ec04e09f721cd1b63114217fabd9cb832dc35fe53ada8ac4aadd25aad28262288a7306f027df983afe11280205daab2cc40921dcb129b4ec3eb752401c1ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "tx": { "txlen": 280, "type": "hashlock", "hashlockaddr": "ZSBKMILLLHTOLGVUKCMOXHNNJIZFMSWHLQXWTSNBBBGJCUNNKEILUZGGYLQF", "dest": "GOGEPOUWQIBOKBXQMNDJUCMEXBQCCMEXJVUTZXUQYBBBNHRMQXHYDANAEYPK", "utime": 1749735677, "lockparams": { "locktime": 0, "lockedasset": "VUSD", "hashalgo": "K12", "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "d34f6ec04e09f721cd1b63114217fabd9cb832dc35fe53ada8ac4aadd25aad28" }, "secret": "ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "refund": 0 }, "utc": 1749735659, "chainlag": 1, "result": "success" }
7.3. Hashlock Refund Transactions
Hashlock Refund Transaction - Command (Input)
The following example demonstrate how to configure and execute a hashlock refund transaction on Tockchain.
Hashlock Refund:
{ "command": "maketx", "type": "hashlock", "tx": { "locktime": 0, "lockedasset": "QUBIC", "hashalgo": 1, "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "ac618b56e058f928d0c0f5657af041be90b42da3b137dc2ea62e7f8f257036dd", "secret": "ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "dest": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "refund": 1, "utc": 1749733691 } }
Hashlock Refund Transaction - Result (Output)
Hashlock refund - Result:
{ "txlen": 280, "signthis": "ee1d1172b5106153e2f64ff7f173d879477f08d8729c6e1b3b38b5bca58f641b", "signlen": 80, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030200803bd14a68573425906bc7c7b8621c5be5dd50ed45ba8f242e015ed3ebeb71eeb738384cb111077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f0000000000000000000000000080010011077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9fd34f6ec04e09f721cd1b63114217fabd9cb832dc35fe53ada8ac4aadd25aad28262288a7306f027df983afe11280205daab2cc40921dcb129b4ec3eb752401c1ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "tx": { "txlen": 280, "type": "hashlock", "hashlockaddr": "ZSBKMILLLHTOLGVUKCMOXHNNJIZFMSWHLQXWTSNBBBGJCUNNKEILUZGGYLQF", "dest": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "utime": 1749733691, "lockparams": { "locktime": 0, "lockedasset": "QUBIC", "hashalgo": "K12", "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "d34f6ec04e09f721cd1b63114217fabd9cb832dc35fe53ada8ac4aadd25aad28" }, "secret": "ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "refund": 1 }, "utc": 1749733562, "chainlag": 0, "result": "success" }
7.4. Hashlock Refund Asset Recovery Transactions
Hashlock Refund Asset Recovery Transaction - Command (Input)
The following example demonstrate how to configure and execute a hashlock refund asset recovery transaction on Tockchain.
Hashlock Refund:
{ "command": "maketx", "type": "hashlock", "tx": { "locktime": 0, "lockedasset": "QUBIC", "hashalgo": 1, "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "ac618b56e058f928d0c0f5657af041be90b42da3b137dc2ea62e7f8f257036dd", "secret": "ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "dest": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "refund": 1, "claimasset": "ETH", "utc": 1749733691 } }
Hashlock Refund Asset Recovery Transaction - Result (Output)
Hashlock refund - Result:
{ "txlen": 280, "signthis": "ee1d1172b5106153e2f64ff7f173d879477f08d8729c6e1b3b38b5bca58f641b", "signlen": 80, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030200803bd14a68573425906bc7c7b8621c5be5dd50ed45ba8f242e015ed3ebeb71eeb738384cb111077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f0000000000000000000000000080010011077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9fd34f6ec04e09f721cd1b63114217fabd9cb832dc35fe53ada8ac4aadd25aad28262288a7306f027df983afe11280205daab2cc40921dcb129b4ec3eb752401c1ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "tx": { "txlen": 280, "type": "hashlock", "hashlockaddr": "ZSBKMILLLHTOLGVUKCMOXHNNJIZFMSWHLQXWTSNBBBGJCUNNKEILUZGGYLQF", "dest": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "utime": 1749733691, "lockparams": { "locktime": 0, "lockedasset": "QUBIC", "hashalgo": "K12", "locker": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "unlocker": "TESTINKCOUDNIHYZBBOGWJSCHFPCZIUDAHQIXYARXEXFYSBYEXHVSALAFNBN", "lockhash": "d34f6ec04e09f721cd1b63114217fabd9cb832dc35fe53ada8ac4aadd25aad28" }, "secret": "ac9c13e70209c19e6b6bafe1f4208637424e098fd7fedc21632d39488ffb90dd", "refund": 1, "claimasset": "ETH", }, "utc": 1749733562, "chainlag": 0, "result": "success" }
8. Assets Transactions
8.0. Introduction to Assets Transactions
Assets are a fundamental part of Tockchain. While up to 32,000 assets can exist, there needs to be a mechanism for their creation. Creating an asset requires 1,000 VUSD, and some initial amount of the created asset must be allocated for the liquidity pool. The 1,000 VUSD is added to the liquidity pool and serves a vital role in connecting all tokens through feeless VUSD pools. This design allows users to swap between assets (e.g., from A to B and back to A) with a minimal loss of approximately 0.0001%.
Tockchain supports mintable and non-mintable assets:
- Mintable Assets:
- Can be minted in the future by the creator’s address.
- Alternatively, minting can be controlled via multisig, requiring a specified number of signatures (up to 26 out of 52).
- Signers are defined during asset creation, providing significant flexibility in configuring multisig assets.
- To mint additional tokens: First, create the mint transaction and then use the “addsig” command to add signatures until the required number is reached to broadcast successfully.
- Non-Mintable Assets:
- Have a fixed supply that is generated upon creation.
- No additional tokens can be created once the asset is initialized.
After an asset is created and the liquidity pool is funded, the initial price of the asset is determined by the reserves in the pool. It is highly recommended that asset creators set an initial price close to the current market value. If there is no pre-existing market, the initial balance provided becomes the starting market price. All Tockchain assets use 8 decimal precision (e.g., 1,000 VUSD = 1,000 × 10⁸ satoshis).
8.1. Assets Creation Transactions
Assets Creation Transaction - Command (Input)
Create Asset (Non-Mintable)
{ "command": "maketx", "type": "createasset", "tx": { "utc": 0, "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "name": "FIXEDSUPPLY", "amount": "100000", "initialpool": "1000.00", "mintable": 0 } }
Create Asset (Mintable, Single Signer)
{ "command": "maketx", "type": "createasset", "tx": { "utc": 0, "creator": "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA", "name": "MINTABLE_SINGLESIGNER", "amount": "100000", "initialpool": "1000", "mintable": 1, "numsigs": 1 } }
Create Asset (Mintable, Multisig)
{ "command": "maketx", "type": "createasset", "tx": { "utc": 0, "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "name": "MINTABLE_MULTISIG", "amount": "100000", "initialpool": "1000", "mintable": 1, "numsigs": 2, "minsigs": 1, "pubkeys": [ "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA" ] } }
Assets Creation Transaction - Result (Output)
Create Asset (Non-Mintable) - Result:
{ "txlen": 2304, "signthis": "4afa0124e2ac3be42c4651aa2818591d36c6e0cdb7af18a14617fac098c7f1f1", "signlen": 2240, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000001fde4a68c478b4799e2cc38c64dfa36414b13907efbbedcd45f51dbbd4790844b44703ee000000000000000000000000000000000000000000000000000000000000000000008a5d784563014649584544535550504c5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407a10f35a00000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "tx": { "txlen": 2304, "type": "createasset", "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "utime": 1749736991, "amount": "100000.00000000", "initialpool": "1000.00000000", "asset": "FIXEDSUPPLY", "extissuer": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "mintable": 0, "minsigs": 1, "numsigs": 1, "pubkeys": [] }, "utc": 1749732482, "chainlag": 0, "result": "success" }
Create Asset (Mintable, Single Signer) - Result:
{ "txlen": 2304, "signthis": "691b89b94a1d94394b7fdbfdebd7209e986463955e70fb28e4fb40e1bada067e", "signlen": 2240, "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610000059e14a68c478b4799e2cc38c64dfa36414b13907efbbedcd45f51dbbd4790844b44703ee000000000000000000000000000000000000000000000000000000000000000000008a5d784563014d494e5441424c455f53494e474c455349474e4552000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407a10f35a00000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "tx": { "txlen": 2304, "type": "createasset", "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "utime": 1749737817, "amount": "100000.00000000", "initialpool": "1000.00000000", "asset": "MINTABLE_SINGLESIGNER", "extissuer": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "mintable": 1, "minsigs": 1, "numsigs": 1, "pubkeys": [] }, "utc": 1749736981, "chainlag": 0, "result": "success" }
Create Asset (Mintable, Multisig) - Result:
{ "txlen": 2304, "signthis": "4629a79da684aab126e5117ec2a95153132d565ac7a9a09306cb1ac6d9cb900b", "signlen": 2240, "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000630000027e24a68c478b4799e2cc38c64dfa36414b13907efbbedcd45f51dbbd4790844b44703ee000000000000000000000000000000000000000000000000000000000000000000008a5d784563014d554c54495349474e455200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407a10f35a000001020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c478b4799e2cc38c64dfa36414b13907efbbedcd45f51dbbd4790844b44703ee262288a7306f027df983afe11280205daab2cc40921dcb129b4ec3eb752401c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "tx": { "txlen": 2304, "type": "createasset", "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "utime": 1749738023, "amount": "100000.00000000", "initialpool": "1000.00000000", "asset": "MINTABLE_MULTISIG", "extissuer": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "mintable": 1, "minsigs": 1, "numsigs": 2, "pubkeys": [ "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "CTJGYIGLLDHXKFQUTGOVNTHHEHLDHCWDIZFEXBSUVFCJPOAGYVTEQURDZLQA" ] }, "utc": 1749737807, "chainlag": 0, "result": "success" }
8.2. Asset Minting Transactions
Assets Minting Transaction - Command (Input)
Mint Asset (Single Signer)
{ "command": "maketx", "type": "mintasset", "tx": { "utc": 0, "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "name": "MINTABLE_SINGLESIGNER", "assetid": 6, "amount": "100000.1234" } }
Mint Asset (Multisig)
{ "command": "maketx", "type": "mintasset", "tx": { "utc": 0, "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "name": "MINTABLE_MULTISIG", "assetid": 7, "amount": "100000.123456", "multisig": 1 } }
Add Signature
{ "command": "addsig", "rawhex": "000000000000000000000000000000000000000000000000000000000000000000012f4f180900004d494e5441424c455f4d554c544953494700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }
Assets Minting Transaction - Result (Output)
Mint Asset (Single Signer) - Result:
{ "txlen": 2304, "signthis": "b0dd31660cb55d1c2ed04b2e3ca1b056611d05d33528fa67d521630859b36a7e", "signlen": 2240, "rawhex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000602608040f54a68262288a7306f027df983afe11280205daab2cc40921dcb129b4ec3eb752401c1000000000000000000000000000000000000000000000000000000000000000000407a10f35a00004d494c4c5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "tx": { "txlen": 2304, "type": "mintasset", "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "amount": "1000000.00000000", "asset": "MINTABLE_SINGLESIGNER", "utime": 1749742912, "multisig": 0 }, "utc": 1749742880, "chainlag": 0, "result": "success" }
Mint Asset (Multisig) - Result:
{ "txlen": 2304, "signthis": "6b9eb8db40bc5f5166d8b419d41007e221c29b73ae95b8ced527683c6aafa703", "signlen": 550, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062267804af34a68c478b4799e2cc38c64dfa36414b13907efbbedcd45f51dbbd4790844b44703ee000000000000000000000000000000000000000000000000000000000000000000008d49fd1a07004d554c54495349474e455200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "tx": { "txlen": 2304, "type": "mintasset", "creator": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "amount": "20000000.00000000", "asset": "MINTABLE_MULTISIG", "utime": 1749742410, "multisig": 1 }, "utc": 1749738781, "chainlag": 0, "result": "success" }
Add Signature - Result:
{ "numsigs": 1, "minsigs": 1, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062267804af34a68c478b4799e2cc38c64dfa36414b13907efbbedcd45f51dbbd4790844b44703ee000000000000000000000000000000000000000000000000000000000000000000008d49fd1a07004d554c54495349474e455200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe5481ef4b406a74a8506320ac1de00f685b32bb2fbb01a1fc513825208a7141ab2ed87777fd2529c61d9e848e7fb8e1ec65b5bee921edbfd82dad76a09110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "utc": 1749742380, "chainlag": 0, "result": "success" }
9. Airdrop Transactions
9.0. Introduction to Airdrop Transactions
The airdrop transaction type distributes assets to multiple recipients based on specific criteria, such as holding a particular asset or owning pool shares.
Tockchain’s airdrop transaction supports three modes, each tailored to different distribution strategies:
- Standard Airdrop:
- Distributes an equal amount of the asset to multiple recipients holding a particular asset.
- Ideal for promotional campaigns or community rewards where every eligible holder receives the same amount, regardless of their destasset holdings.
- Dividend Airdrop:
- Distributes assets to multiple recipients based on specific criteria, such as amount of holding a particular asset.
- Pool Airdrop:
- Distributes assets to multiple recipients holding a particular pool share.
- This mode functions similarly to the dividend airdrop but is restricted to addresses holding pool share tokens, which represent participation in a liquidity pool.
9.1. Standard Airdrop Transactions
Standard Airdrop Transaction - Command (Input)
{ "command": "maketx", "type": "airdrop", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "destasset": "QUBIC", "perdestaddr": "1", //perdestaddr for standard airdrop "maxamount": "2000000", "samesize": 1, "utc": 1752018223, "asset": "VUSD" } }
Standard Airdrop Transaction - Result (Output)
{ "txlen": 144, "signthis": "7ecc07f789f12397b575376e8012d243ebf6495ac73ba8c79e5ca23bf38eaaad", "signlen": 80, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080200802fad6d6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f028000e1f50500000000000000000000000000000000000000000000000000000080f420e6b50000", "tx": { "txlen": 144, "type": "airdrop", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "ispkhash": 0, "maxamount": "2000000.00000000", "asset": "VUSD", "destasset": "QUBIC", "perdestaddr": "1.00000000", "samesize": 1, "utime": 1752018223 }, "utc": 1752018210, "chainlag": 0, "result": "success" }
9.2. Dividend Airdrop Transactions
Dividend Airdrop Transaction - Command (Input)
{ "command": "maketx", "type": "airdrop", "tx": { "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "destasset": "QUBIC", "perdestasset": "0.001", //perdestasset for dividend "maxamount": "2000000", "samesize": 0, "utc": 1752018223, "asset": "VUSD" } }
Dividend Airdrop Transaction - Result (Output)
{ "txlen": 144, "signthis": "7ecc07f789f12397b575376e8012d243ebf6495ac73ba8c79e5ca23bf38eaaad", "signlen": 80, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080200802fad6d6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f028000e1f50500000000000000000000000000000000000000000000000000000080f420e6b50000", "tx": { "txlen": 144, "type": "airdrop", "sender": "COINLIBPCMZHFABKWAFYZLFVNFTBOIVGRSLQPLFTUBKIEMSDVKAXHLEGIMEI", "ispkhash": 0, "maxamount": "2000000.00000000", "asset": "VUSD", "destasset": "QUBIC", "perdestaddr": "0.00100000", "samesize": 0, "utime": 1752018223 }, "utc": 1752018210, "chainlag": 0, "result": "success" }
9.3. Pool Airdrop Transactions
Pool Airdrop Transaction - Command (Input)
{ "command": "maketx", "type": "airdrop", "tx": { "sender": "HTHMLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNVN", //pool address "destasset": "VNET.pool", //pool share owners "perdestasset": "0.001", "maxamount": "2000000", "samesize": 0, "utc": 1752018223, "asset": "VUSD" } }
Pool Airdrop Transaction - Result (Output)
{ "txlen": 144, "signthis": "7ecc07f789f12397b575376e8012d243ebf6495ac73ba8c79e5ca23bf38eaaad", "signlen": 80, "rawhex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080200802fad6d6811077cb4db0c78700d77bc173e4f3c143a130f81c6780afd7cafb1651d206b9f028000e1f50500000000000000000000000000000000000000000000000000000080f420e6b50000", "tx": { "txlen": 144, "type": "airdrop", "sender": "HTHMLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNVN", "ispkhash": 0, "maxamount": "2000000.00000000", "asset": "VUSD", "destasset": "VNET.pool", "perdestasset": "0.00100000", "samesize": 0, "utime": 1752018223 }, "utc": 1752018210, "chainlag": 0, "result": "success" }
10. Network Transactions
10.0. Introduction to System Transactions
These are special commands reserved for critical network-level operations such as adding, removing, or replacing nodes. The primary purpose is to maintain synchronization and avoid confusion among validators about network changes.
Process to Change Network Configuration:
- Issue a systemtx Command: Use the appropriate system transaction to add, remove, or replace a node.
- Start the New Generator Node (if applicable): If a node is added or replaced, initialize the new generator node.
- Update Existing Generator Nodes: One by one, update the other generator nodes to recognize the new configuration. This effectively hardforks the new node list into the network. Without this step, validators could mistake the new node as an imposter.
- Sync the New Validator Node After the Change: Once the next hour begins, start the validator node. Use -fast sync mode to download the previous hour’s STATE files (an external mechanism must be implemented to support large STATE file transfers).
Special Considerations:
- Multiple of 3 Nodes: If the network has exactly a multiple of 3 nodes, removing a node is disallowed due to quorum requirements.
- Erroneous Systemtx: If a systemtx command is issued by mistake, it can be canceled using the clearupdate command.
- Caution Required: Network topology changes must be carefully planned to avoid disruptions.
10.1. Node Addition Transactions
Node Addition Transaction - Command (Input)
{ "command": "maketx", "type": "system", "tx": { "action": "addnode", "utc": 1, "newgenipaddr": "89.38.98.214", "newgen": "NODEBBFMOJHXGGEDFBAHZAPGBECCGQSBFARQMVRZSBNMYGIGGLROVYWADDUB" } }
Node Addition Transaction - Result (Output)
To-do: Include examples of the expected outputs for each pool transaction type.
10.2. Node Removal Transactions
Node Removal Transaction - Command (Input)
{ "command": "maketx", "type": "system", "tx": { "action": "removenode", "utc": 1, "removegen": "NODECGZORFXFWGFOHACFFAWSRWMCSBJXZRIBYNAUUDTVMVOAXEHDKWNBRJPA" } }
Node Removal Transaction - Result (Output)
To-do: Include examples of the expected outputs for each pool transaction type.
10.3. Node Replacement Transactions
Node Replacement Transaction - Command (Input)
{ "command": "maketx", "type": "system", "tx": { "utc": 1, "action": "replacenode", "newgenipaddr": "89.38.98.214", "newgen": "NODEBBFMOJHXGGEDFBAHZAPGBECCGQSBFARQMVRZSBNMYGIGGLROVYWADDUB", "removegen": "NODECGZORFXFWGFOHACFFAWSRWMCSBJXZRIBYNAUUDTVMVOAXEHDKWNBRJPA" } }
Node Replacement Transaction - Result (Output)
To-do: Include examples of the expected outputs for each pool transaction type.
10.4. Update Cancellation Transactions
Update Cancellation Transaction - Command (Input)
{ "command": "maketx", "type": "system", "tx": { "utc": 1, "action": "clearupdate" } }
Update Cancellation Transaction - Result (Output)
To-do: Include examples of the expected outputs for each pool transaction type.
11. Bridge Transactions
11.0. Introduction to Bridge Transactions
These operations are automated and do not require custom transactions.
The creation of external assets and tokens is restricted to the basecoin address, ensuring centralized control over asset issuance.
11.1. External Chain Creation Transactions
External Chain Creation Transaction - Command (Input)
{ "command": "maketx", "type": "externalchain", "tx": { "utc": 0, "chainid": 1, "name": "QUBIC", "extsymbol": "QU", "chainname": "qubic", "decimals": 0 } }
External Chain Creation Transaction - Result (Output)
To-do: Include examples of the expected outputs for each pool transaction type.
11.2. External Asset Creation Transactions
External Asset Creation Transaction - Command (Input)
{ "command": "maketx", "type": "externalasset", "tx": { "utc": 0, "chainid": 1, "name": "QWALLET", "extsymbol": "QWALLET", "issuer": "QWALLETSGQVAGBHUCVVXWZXMBKQBPQQSHRYKZGEJWFVNUFCEDDPRMKTAUVHA", "chainname": "qubic", "decimals": 0 } }
External Asset Creation Transaction - Result (Output)
To-do: Include examples of the expected outputs for each pool transaction type.
Support
For troubleshooting and support, please reach out to Qsilver in the #op-tx-testing on the Valis Discord.
Thank you for contributing to Tockchain’s success!
← Previous
Next →
On this Page