# Transaction format and fee rate

### Fee rate

The current standard fee rate which applies to all transactions submitted to any of the TAAL transaction processing APIs is: 100 sat/kb

The minimum fee for any transaction is 100 sat/kB.

The fee required is rounded depending on size of the transaction. The following list exemplifies the logic:

* Transactions with 1.4999... kb > size > 0.0 kb => min absolute fee required = 1 sat.&#x20;
* Transactions with 2.4999... kb > size > 1.5 kb => min absolute fee required = 2 sat
* Transactions with 3.4999... kb > size > 2.5 kb => min absolute fee required = 3 sat
* ...

### Transaction format

The format of transaction is bound to the standard of BSV transactions as described [here](https://wiki.bitcoinsv.io/index.php/Bitcoin_Transactions).

There is a number of libraries which allow to build BSV transactions. Here is a short list:

* <https://www.npmjs.com/package/bsv>
* <https://github.com/libsv/go-bt>

#### Javascript example using version 1 of bsv.js and request modules

1. Create a new Node.js project:

   ```bash
   mkdir example
   cd example
   npm init -y
   npm install bsv@1
   npm install request
   ```
2. Save the following code to a main.js in your example folder:

   ```javascript
   const fs = require('fs')
   const bsv = require('bsv')

   // Random key produced each time...
   const newKey = bsv.PrivateKey()

   console.log(`Private key:     ${newKey.toString()}`)
   console.log(`Mainnet address: ${newKey.toAddress('mainnet').toString()}`)

   console.log(`
   1. Create a funding transaction by sending 1000 satoshis (0.00001 BSV) to ${newKey.toAddress('mainnet').toString()}.

   2. Add your Taal apiKey, and funding transaction txid and vout to 'generated.js'.

   3. Execute the generated code:

     node generated.js

   `)


   fs.writeFileSync('generated.js', `
   const bsv = require('bsv')
   var request = require('request')

   const privKey = bsv.PrivateKey('${newKey}')

   const apiKey = ""        // Add Taal mainnet API Key
   const fundingTxid = ""   // Add the funding transaction txid
   const fundingVout = -1   // Replace with funding transaction vout
   const returnAddress = "" // The address to return the 1000 satoshis (less fees)

   if (apiKey === "" || fundingTxid === "" || fundingVout === -1 || returnAddress === "") {
     console.log('This generated file needs an apiKey, a fundingTxid, a fundingVout and a returnAddress')
     process.exit(1)
   }

   const utxo1 = {
     txId: fundingTxid,
     outputIndex: fundingVout,
     address: privKey.toAddress('mainnet').toString(),
     script: bsv.Script.buildPublicKeyHashOut(privKey.publicKey).toHex(),
     satoshis: 1000
   }

   const tx1 = bsv.Transaction()
     .from(utxo1)
     .to(privKey.toAddress('mainnet').toString(), 800)
     .change(returnAddress)
     .sign(privKey)

   const utxo2 = {
     txId: tx1.hash,
     outputIndex: 0,
     address: privKey.toAddress('mainnet').toString(),
     script: bsv.Script.buildPublicKeyHashOut(privKey.publicKey).toHex(),
     satoshis: 800
   }

   const tx2 = bsv.Transaction()
     .from(utxo2)
     .change(returnAddress)
     .sign(privKey)
     

   const txBuffer = Buffer.concat([
     tx1.toBuffer(),
     tx2.toBuffer()
   ])

   // Send the transaction to Taal API...
   request.post({
     url: 'https://api.taal.com/api/v1/batchBroadcast',
     headers: {
       'Authorization': apiKey,
       'Content-Type': 'application/octet-stream'
     },
     body: txBuffer
   }, function(error, response, body) {
     console.log(error, response.statusCode, body)
   })
   `)
   ```
3. Execute the code and follow the onscreen instructions:

   ```bash
   node main.js   
   ```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.taal.com/core-products/transaction-processing/transaction-format-and-fee-rate.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
