Guides
Stacks
Stacks
Stacks can be accessed with the following coin types:
| Environment | Coin Type | Faucet |
|---|---|---|
| STX Production | stx | |
| STX Testnet | tstx | https://docs.stacks.co/learn/network-fundamentals/mainnet-and-testnets#faucets |
Explorer
Generating wallets
bitgo
.coin('tstx')
.wallets()
.generateWallet({
label: 'My Test Wallet',
passphrase: 'secretpassphrase1a5df8380e0e30',
})
.then(function (wallet) {
// print the new wallet
console.dir(wallet);
});
LABEL="My Test Wallet"
PASSPHRASE="secretpassphrase1a5df8380e0e30"
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d "{ \"label\": \"$LABEL\", \"passphrase\": \"$PASSPHRASE\" }" \
http://$BITGO_EXPRESS_HOST/api/v2/tbtc4/wallet/generate
Creating addresses
bitgo
.coin('tstx')
.wallets()
.getWallet({ id: '585c51a5df8380e0e3082e46' })
.then(function (wallet) {
return wallet.createAddress();
})
.then(function (newAddress) {
// print new address details
console.dir(newAddress);
});
WALLET=585c51a5df8380e0e3082e46
curl -X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
https://app.bitgo-test.com/api/v2/tstx/wallet/$WALLET/address
Balances
Stacks (STX) is the native asset of the Stacks blockchain. It is called a "token," but as a layer-1 asset BitGo treats it as a coin. The base unit of STX is a micro-STX:
- 1 micro-STX is (
10-6) or 0.000001 STX. - 1 STX is (
106) or 1000000 micro-STX (1 million).
BitGo supports balances in string format: balanceString, confirmedBalanceString, and spendableBalanceString.
Tokens
The Stacks blockchain natively support tokens. To view all BitGo supported tokens on the Stacks blockchain, see Stacks - SIP10 Tokens
Fee rate
Fees calculate based on the estimated fee rate and the size of the raw transaction in bytes. The market determines the fee rate. For the testnet, it is set to 1 micro-STX.
Set the fee manually
To set the fee manually, add feeRate param to the body of the request.
Example for single recipient transfer:
{
recipients: [{
amount: amount, //string - amount in micro-stx
address: receiverAddress, //string
}],
feeRate: 500000 // amount in micro-stx as number or string, equal to 0.5 STX
}
Send-Many: send to multiple recipients
Stacks doesn't provide a native capability to send to many recipients in the same transaction but there is smart contract that allows doing it. It also supports for memos on each receiver. To use it, the recipients params in the body of a transfer transaction should have more than 1 recipient object.
{
recipients: [{
amount: "amount1", //string - amount in micro-stx
address: "receiverAddress1", //string
memo: "memo1", //string - optional
},{
amount: "amount2", //string - amount in micro-stx
address: "receiverAddress2", //string
memo: "memo2", //string - optional
},{
amount: "amount3", //string - amount in micro-stx
address: "receiverAddress3", //string
memo: "memo3", //string - optional
},{
amount: "amount4", //string - amount in micro-stx
address: "receiverAddress4", //string
memo: "memo4", //string - optional
}],
}
Staking
Stacks refers to staking as stacking. Stacks is a proof of stake protocol where users can delegate part of their assets to a validator (or "stacker") to stake and get rewards for participating in securing the network. Stacks has a unique staking mechanism where users delegate STX but earn BTC as reward. When users delegate, assets remain locked in the wallet. Users must undelegate to “unlock” the assets to be withdrawn or sent out.
Currently, BitGo allows users to act as delegators which means that from their wallets they can:
- Delegate (or stake) STX
- Undelegate (or unstake) STX
- Receive rewards for delegating STX.
Delegating
Staking cycles run in sequence. Users must delegate their assets before the cycle ends to generate rewards from a stacker (validator).
Note: BitGo recommends that users use a specific BTC address solely for generating rewards.
Stacks staking examples
These examples are for wallet endpoints like:
https://app.bitgo.com/api/v2/stx/wallet/walletId/tx/build
https://app.bitgo.com/api/v2/stx/wallet/walletId/tx/initiate
Delegate
To get the BTC Address hash and version BitGo recommends that you use a script like this:
Note: Addresses must be in legacy format (and start with a 1 or a 3). Native SegWit addresses (that start with
bc1) are not supported.
const bitcoinjs = require('bitcoinjs-lib');
const btcAddress = '1QF7K4izEcgDxu9yRBLpFe6viFihiL1w5j';
const parsedAddress = bitcoinjs.address.fromBase58Check(btcAddress);
const btcAddressVersionToHashMode = (version) => {
switch (version) {
case '0': // BTC version for mainnet P2PKH
case '111': // BTC version for testnet P2PKH
return { data: [0], type: 'Buffer' };
case '5': // BTC version for mainnet P2SH
case '196': // BTC version for testnet P2SH
return { data: [1], type: 'Buffer' };
default:
break;
}
};
const AddressHash = bas58.hash.toJSON();
const AddressVersion = btcAddressVersionToHashMode(parsedAddress.version.toString());
console.log(AddressHash); //{type: 'Buffer',data: [ 254, 245, 252, 42, 179, 220, 238, 122, 241, 132, 202, 47, 217, 13, 20, 38, 151, 116, 250, 128]}
console.log(AddressVersion); //{ data: [ 0 ], type: 'Buffer' }
The body of the request transaction should look like this:
{
type: "stakingLock",
recipients: [{
amount: amount, //string - amount in micro-stx
address: validatorAddress, //string
}],
stakingOptions: {
contractName: 'pox',
functionName: 'delegate-stx',
functionArgs: [
// First param is the amount in micro-stx do delegate
{
type: 'uint128',
val: amount //string - amount in micro-stx
},
// Second param is validator address
{
type: 'principal',
val: validatorAddress //string
},
// Third param is the delegation cycles that delegate permisions will last.
// Is a required parameter and must be a 1 or higher.
{
type: 'optional',
val: numberOfCycles //string
},
// Fourth param is the BTC address in which you will receive the rewards.
// Is required.
{
type: 'optional',
val: {
type: 'tuple',
val: [{
key: 'hashbytes',
type: 'buffer',
val: AddressHash
},
{
key: 'version',
type: 'buffer',
val: AddressVersion
},
],
},
},
],
};
}
Revoke delegate
The body of the request transaction should look like this:
{
type: "stakingUnlock",
recipients: [{
amount: '0', // string
address: '', // empty string
}],
stakingOptions: {
contractName: 'pox',
functionName: 'revoke-delegate-stx',
functionArgs: [] // empty array
},
}