rain_sdk/models/
contracts.rs

1//! Models for contract endpoints
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6/// Token information in a contract
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct ContractToken {
10    pub address: String,
11    pub balance: String,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub exchange_rate: Option<f64>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub advance_rate: Option<f64>,
16}
17
18/// ACH onramp information (AccountDetails in OpenAPI)
19#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct AchOnramp {
22    pub beneficiary_name: String,
23    pub beneficiary_address: String,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub beneficiary_bank_name: Option<String>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub beneficiary_bank_address: Option<String>,
28    pub account_number: String,
29    pub routing_number: String,
30}
31
32/// RTP onramp information (AccountDetails in OpenAPI)
33#[derive(Debug, Clone, Serialize, Deserialize)]
34#[serde(rename_all = "camelCase")]
35pub struct RtpOnramp {
36    pub beneficiary_name: String,
37    pub beneficiary_address: String,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub beneficiary_bank_name: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub beneficiary_bank_address: Option<String>,
42    pub account_number: String,
43    pub routing_number: String,
44}
45
46/// Wire onramp information (AccountDetails in OpenAPI)
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct WireOnramp {
50    pub beneficiary_name: String,
51    pub beneficiary_address: String,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub beneficiary_bank_name: Option<String>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub beneficiary_bank_address: Option<String>,
56    pub account_number: String,
57    pub routing_number: String,
58}
59
60/// Onramp information
61#[derive(Debug, Clone, Serialize, Deserialize)]
62#[serde(rename_all = "camelCase")]
63pub struct Onramp {
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub ach: Option<AchOnramp>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub rtp: Option<RtpOnramp>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub wire: Option<WireOnramp>,
70}
71
72/// Smart contract information
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct Contract {
76    pub id: Uuid,
77    pub chain_id: i64,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub program_address: Option<String>, // nullable, exclusive of Solana
80    pub controller_address: String,
81    pub proxy_address: String,
82    pub deposit_address: String, // required in spec
83    pub tokens: Vec<ContractToken>,
84    pub contract_version: i64,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub onramp: Option<Onramp>,
87}
88
89/// Request to create a contract for a company
90#[derive(Debug, Clone, Serialize, Deserialize)]
91#[serde(rename_all = "camelCase")]
92pub struct CreateCompanyContractRequest {
93    pub chain_id: i64,
94    pub owner_address: String,
95}
96
97/// Request to create a contract for a user
98#[derive(Debug, Clone, Serialize, Deserialize)]
99#[serde(rename_all = "camelCase")]
100pub struct CreateUserContractRequest {
101    pub chain_id: i64,
102}
103
104/// Request to update a contract
105#[derive(Debug, Clone, Serialize, Deserialize)]
106#[serde(rename_all = "camelCase")]
107pub struct UpdateContractRequest {
108    pub onramp: bool,
109}
110
111/// Response for list of contracts (just an array of contracts)
112pub type ListContractsResponse = Vec<Contract>;