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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
use chrono::{DateTime, Utc};
use reqwest::Method;
use serde::{Deserialize, Serialize};

use crate::client::{Client, PagedResponse, PaginationOptions, Response};
use crate::errors::Result;

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Transaction {
    /// Resource ID
    pub id: String,
    /// constant `"transaction"`
    pub resource: String,
    pub resource_path: String,
    /// Transaction type
    pub r#type: TransactionType,
    /// Status
    pub status: TransactionStatus,
    /// Amount in bitcoin, bitcoin cash, litecoin or ethereum
    pub amount: Money,
    /// Amount in user’s native currency
    pub native_amount: Money,
    /// User defined description
    pub description: Option<String>,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum TransactionType {
    /// Sent bitcoin/bitcoin cash/litecoin/ethereum to a bitcoin/bitcoin cash/litecoin/ethereum address or email
    Send,
    /// Requested bitcoin/bitcoin cash/litecoin/ethereum from a user or email
    Request,
    /// Transfered funds between two of a user’s accounts
    Transfer,
    /// Bought bitcoin, bitcoin cash, litecoin or ethereum
    Buy,
    /// Sold bitcoin, bitcoin cash, litecoin or ethereum
    Sell,
    /// Deposited funds into a fiat account from a financial institution
    FiatDeposit,
    /// Withdrew funds from a fiat account
    FiatWithdrawal,
    /// Deposited money into Coinbase Pro
    ExchangeDeposit,
    /// Withdrew money from Coinbase Pro
    ExchangeWithdrawal,
    /// Withdrew funds from a vault account
    VaultWithdrawal,
    /// Deposited money into Coinbase Pro
    ProDeposit,
    /// Withdrew money from Coinbase Pro
    ProWithdrawal,
    InflationReward,
}

/// Transactions statuses vary based on the type of the transaction.
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum TransactionStatus {
    /// Pending transactions (e.g. a send or a buy)
    Pending,
    /// Completed transactions (e.g. a send or a buy)
    Completed,
    /// Failed transactions (e.g. failed buy)
    Failed,
    /// Conditional transaction expired due to external factors
    Expired,
    /// Transaction was canceled
    Canceled,
    /// Vault withdrawal is waiting for approval
    WaitingForSignature,
    /// Vault withdrawal is waiting to be cleared
    WaitingForClearing,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Money {
    pub amount: String,
    pub currency: String,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AccountCurrency {
    pub code: String,
    pub name: String,
    pub color: String,
    pub sort_index: i32,
    pub exponent: i32,
    pub r#type: String,
    pub address_regex: String,
    pub asset_id: String,
    pub slug: String,
}

impl Client {
    /// List transactions
    ///
    /// Lists account’s transactions. See transaction resource for more information.
    pub async fn list_transactions(
        &self,
        account_id: &str,
        pagination: &PaginationOptions,
    ) -> Result<PagedResponse<Transaction>> {
        self.send_request(
            Method::GET,
            &format!(
                "accounts/{}/transactions{}",
                account_id,
                pagination.get_query()
            ),
            None::<&()>,
        )
        .await
    }

    /// Show a transaction
    ///
    /// Show an individual transaction for an account. See transaction resource for more information.
    pub async fn get_transaction(
        &self,
        account_id: &str,
        transaction_id: &str,
    ) -> Result<Response<Transaction>> {
        self.send_request(
            Method::GET,
            &format!("accounts/{}/transactions/{}", account_id, transaction_id),
            None::<&()>,
        )
        .await
    }
}