Tempo

Overview

Tempo is an EVM-compatible blockchain purpose-built for global payments. It features native Account Abstraction (EIP-7702) at the protocol level, enabling advanced transaction capabilities such as batch transactions and custom fee tokens — all natively supported at the protocol layer. Tempo eliminates volatile gas tokens by using USD-denominated TIP-20 stablecoins for all transaction fees, with ultra-low costs under $0.001 per transfer. The network achieves sub-second finality (~1 second) and ~0.4 second block times using Simplex BFT consensus.

Explorer

https://explore.mainnet.tempo.xyz

Wallets Types

BitGo enables holding tempo in the following wallet types:

Multisig ColdMultisig HotMPC ColdMPC Hot
Custody
Self-Custody

Ticker Symbols

MainnetTestnet
TEMPOTTEMPO

Faucet

You can use a faucet to obtain free testnet TIP-20 tokens for development and testing purposes.

Faucet: https://docs.tempo.xyz/quickstart/faucet

Units

Tempo has no native coin. All balances and fees use TIP-20 USD stablecoins, which adhere to 6 decimal places:

  • 1 TIP-20 token = 106 base units (micro-units)
  • 1 base unit = 10-6 TIP-20 token

For that reason, only string balance properties are available, which are balanceString, confirmedBalanceString, and spendableBalanceString.

Fees

Tempo uses a fixed base fee model rather than EIP-1559 dynamic pricing, making transaction costs predictable and ultra-low — basic transfers cost less than $0.001 USD. All fees are paid in USD-denominated TIP-20 stablecoins. If a user's preferred fee token differs from the validator's, an on-chain Fee AMM automatically converts it at settlement. The total fee is calculated as:

fee = ceil(base_fee * gas_used / 10^12)
Transaction TypeGas CostEstimated Fee (USD)
AA Transaction (P256)26,000~$0.001
Batch Transaction (3 calls)~50,000< $0.002

Create Wallet

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>" export COIN="ttempo" export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>" export LABEL="<DESIRED_WALLET_NAME>" export PASSPHRASE="<YOUR_BITGO_LOGIN_PASSPHRASE>" export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>" curl -X POST \ http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/generate \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d '{ "label": "'"$LABEL"'", "passphrase": "'"$PASSPHRASE"'", "enterprise": "'"$ENTERPRISE_ID"'", "walletVersion": 4 }'
1 2 3 4 5 6 7 8 9 10 11 12 13 bitgo .coin('ttempo') .wallets() .generateWallet({ label: 'My Test Wallet', passphrase: 'secretpassphrase1a5df8380e0e30', enterprise: '5612c2beeecf83610b621b90964448cd', walletVersion: 4, }) .then(function (wallet) { // print the new wallet console.dir(wallet); });

Create Address

1 2 3 4 5 6 export WALLET="585c51a5df8380e0e3082e46" export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>" curl -X POST \ -H "Authorization: Bearer $ACCESS_TOKEN" \ https://app.bitgo-test.com/api/v2/ttempo/wallet/$WALLET/address
1 2 3 4 5 6 7 8 9 10 11 bitgo .coin('ttempo') .wallets() .getWallet({ id: '585c51a5df8380e0e3082e46' }) .then(function (wallet) { return wallet.createAddress(); }) .then(function (newAddress) { // print new address details console.dir(newAddress); });

Estimate Fee

1 2 3 4 5 6 7 export COIN="ttempo" export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>" curl -X GET \ https://app.bitgo-test.com/api/v2/$COIN/tx/fee \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $ACCESS_TOKEN"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 const BitGoJS = require('../../../src/index.js'); const bitgo = new BitGoJS.BitGo({ env: 'test' }); const accessToken = '<YOUR_ACCESS_TOKEN>'; const coin = 'ttempo'; async function getFeeEstimate() { try { await bitgo.authenticateWithAccessToken({ accessToken }); const res = await bitgo.coin(coin).feeEstimate({ numBlocks: 2 }); console.dir(res); } catch (err) { console.error('Error fetching fee estimate:', err); } } getFeeEstimate();

Transact

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>" export COIN="ttempo" export WALLET_ID="<YOUR_WALLET_ID>" export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>" export ADDRESS="<DESTINATION_ADDRESS>" export AMOUNT="<AMOUNT_IN_BASE_UNITS>" export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>" curl -X POST \ http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendcoins \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d '{ "address": "'"$ADDRESS"'", "amount": "'"$AMOUNT"'", "walletPassphrase": "'"$WALLET_PASSPHRASE"'" }'
1 2 3 4 5 const tx = await fundedWallet.send({ address: '<DESTINATION_ADDRESS>', amount: '<AMOUNT>', walletPassphrase: process.env.PASSWORD, });

Send to Many

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>" export COIN="ttempo" export WALLET_ID="<YOUR_WALLET_ID>" export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>" export ADDRESS_1="<DESTINATION_ADDRESS_1>" export AMOUNT_1="<AMOUNT_1_IN_BASE_UNITS>" export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>" curl -X POST \ http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendmany \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d '{ "recipients": [ { "address": "'"$ADDRESS_1"'", "amount": "'"$AMOUNT_1"'" } ], "walletPassphrase": "'"$WALLET_PASSPHRASE"'" }'
1 2 3 4 5 6 7 8 9 10 11 12 13 let params = { recipients: [ { amount: "<AMOUNT_1>", address: "<DESTINATION_ADDRESS_1>", } ], walletPassphrase: "<YOUR_WALLET_PASSPHRASE>", }; wallet.sendMany(params).then(function (transaction) { // Print transaction details console.dir(transaction); });

Stake

Tempo staking is out of scope for this integration.

See Also