1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
//! The IC Bitcoin API.
//!
//! Check [Bitcoin integration](https://internetcomputer.org/docs/current/developer-docs/integrations/bitcoin/bitcoin-how-it-works/#api) for more details.
use crate::api::call::{call_with_payment128, CallResult};
use candid::Principal;
mod types;
pub use types::*;
const GET_UTXO_MAINNET: u128 = 10_000_000_000;
const GET_UTXO_TESTNET: u128 = 4_000_000_000;
const GET_CURRENT_FEE_PERCENTILES_MAINNET: u128 = 100_000_000;
const GET_CURRENT_FEE_PERCENTILES_TESTNET: u128 = 40_000_000;
const GET_BALANCE_MAINNET: u128 = 100_000_000;
const GET_BALANCE_TESTNET: u128 = 40_000_000;
const SEND_TRANSACTION_SUBMISSION_MAINNET: u128 = 5_000_000_000;
const SEND_TRANSACTION_SUBMISSION_TESTNET: u128 = 2_000_000_000;
const SEND_TRANSACTION_PAYLOAD_MAINNET: u128 = 20_000_000;
const SEND_TRANSACTION_PAYLOAD_TESTNET: u128 = 8_000_000;
/// See [IC method `bitcoin_get_balance`](https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-bitcoin_get_balance).
///
/// This call requires cycles payment.
/// This method handles the cycles cost under the hood.
/// Check [API fees & Pricing](https://internetcomputer.org/docs/current/developer-docs/integrations/bitcoin/bitcoin-how-it-works/#api-fees--pricing) for more details.
pub async fn bitcoin_get_balance(arg: GetBalanceRequest) -> CallResult<(Satoshi,)> {
let cycles = match arg.network {
BitcoinNetwork::Mainnet => GET_BALANCE_MAINNET,
BitcoinNetwork::Testnet => GET_BALANCE_TESTNET,
BitcoinNetwork::Regtest => 0,
};
call_with_payment128(
Principal::management_canister(),
"bitcoin_get_balance",
(arg,),
cycles,
)
.await
}
/// See [IC method `bitcoin_get_utxos`](https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-bitcoin_get_utxos).
///
/// This call requires cycles payment.
/// This method handles the cycles cost under the hood.
/// Check [API fees & Pricing](https://internetcomputer.org/docs/current/developer-docs/integrations/bitcoin/bitcoin-how-it-works/#api-fees--pricing) for more details.
pub async fn bitcoin_get_utxos(arg: GetUtxosRequest) -> CallResult<(GetUtxosResponse,)> {
let cycles = match arg.network {
BitcoinNetwork::Mainnet => GET_UTXO_MAINNET,
BitcoinNetwork::Testnet => GET_UTXO_TESTNET,
BitcoinNetwork::Regtest => 0,
};
call_with_payment128(
Principal::management_canister(),
"bitcoin_get_utxos",
(arg,),
cycles,
)
.await
}
fn send_transaction_fee(arg: &SendTransactionRequest) -> u128 {
let (submission, payload) = match arg.network {
BitcoinNetwork::Mainnet => (
SEND_TRANSACTION_SUBMISSION_MAINNET,
SEND_TRANSACTION_PAYLOAD_MAINNET,
),
BitcoinNetwork::Testnet => (
SEND_TRANSACTION_SUBMISSION_TESTNET,
SEND_TRANSACTION_PAYLOAD_TESTNET,
),
BitcoinNetwork::Regtest => (0, 0),
};
submission + payload * arg.transaction.len() as u128
}
/// See [IC method `bitcoin_send_transaction`](https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-bitcoin_send_transaction).
///
/// This call requires cycles payment.
/// This method handles the cycles cost under the hood.
/// Check [API fees & Pricing](https://internetcomputer.org/docs/current/developer-docs/integrations/bitcoin/bitcoin-how-it-works/#api-fees--pricing) for more details.
pub async fn bitcoin_send_transaction(arg: SendTransactionRequest) -> CallResult<()> {
let cycles = send_transaction_fee(&arg);
call_with_payment128(
Principal::management_canister(),
"bitcoin_send_transaction",
(arg,),
cycles,
)
.await
}
/// See [IC method `bitcoin_get_current_fee_percentiles`](https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-bitcoin_get_current_fee_percentiles).
///
/// This call requires cycles payment.
/// This method handles the cycles cost under the hood.
/// Check [API fees & Pricing](https://internetcomputer.org/docs/current/developer-docs/integrations/bitcoin/bitcoin-how-it-works/#api-fees--pricing) for more details.
pub async fn bitcoin_get_current_fee_percentiles(
arg: GetCurrentFeePercentilesRequest,
) -> CallResult<(Vec<MillisatoshiPerByte>,)> {
let cycles = match arg.network {
BitcoinNetwork::Mainnet => GET_CURRENT_FEE_PERCENTILES_MAINNET,
BitcoinNetwork::Testnet => GET_CURRENT_FEE_PERCENTILES_TESTNET,
BitcoinNetwork::Regtest => 0,
};
call_with_payment128(
Principal::management_canister(),
"bitcoin_get_current_fee_percentiles",
(arg,),
cycles,
)
.await
}