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.xyzWallets Types
BitGo enables holding tempo in the following wallet types:
| Multisig Cold | Multisig Hot | MPC Cold | MPC Hot | |
|---|---|---|---|---|
| Custody | ❌ | ❌ | ✅ | ❌ |
| Self-Custody | ❌ | ❌ | ✅ | ✅ |
Ticker Symbols
| Mainnet | Testnet |
|---|---|
| TEMPO | TTEMPO |
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 =
106base units (micro-units) - 1 base unit =
10-6TIP-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 Type | Gas Cost | Estimated 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 17export 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 13bitgo .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 6export 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 11bitgo .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 7export 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 16const 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 17export 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 5const 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 21export 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 13let 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.