ergo/
token.rs

1//! Token types
2use ergo_lib_c_core::{ergo_box::ConstBoxIdPtr, token::*, Error};
3use paste::paste;
4use std::{
5    ffi::{CStr, CString},
6    os::raw::c_char,
7};
8
9use crate::{delete_ptr, ErrorPtr};
10
11// `TokenId` bindings ------------------------------------------------------------------------------
12
13/// Create token id from ergo box id (32 byte digest)
14#[no_mangle]
15pub unsafe extern "C" fn ergo_lib_token_id_from_box_id(
16    box_id_ptr: ConstBoxIdPtr,
17    token_id_out: *mut TokenIdPtr,
18) {
19    #[allow(clippy::unwrap_used)]
20    token_id_from_box_id(box_id_ptr, token_id_out).unwrap();
21}
22
23/// Parse token id (32 byte digest) from base16-encoded string
24#[no_mangle]
25pub unsafe extern "C" fn ergo_lib_token_id_from_str(
26    bytes_ptr: *const c_char,
27    token_id_out: *mut TokenIdPtr,
28) -> ErrorPtr {
29    let str = CStr::from_ptr(bytes_ptr).to_string_lossy();
30    let res = token_id_from_str(&str, token_id_out);
31    Error::c_api_from(res)
32}
33
34/// Base16 encoded string
35#[no_mangle]
36pub unsafe extern "C" fn ergo_lib_token_id_to_str(
37    token_id_ptr: ConstTokenIdPtr,
38    _str: *mut *const c_char,
39) {
40    #[allow(clippy::unwrap_used)]
41    {
42        let s = token_id_to_str(token_id_ptr).unwrap();
43        *_str = CString::new(s).unwrap().into_raw();
44    }
45}
46
47/// Drop `TokenId`
48#[no_mangle]
49pub unsafe extern "C" fn ergo_lib_token_id_delete(ptr: TokenIdPtr) {
50    delete_ptr(ptr)
51}
52
53make_ffi_eq!(TokenId);
54
55// `TokenAmount` bindings --------------------------------------------------------------------------
56
57/// Create from i64 with bounds check
58#[no_mangle]
59pub unsafe extern "C" fn ergo_lib_token_amount_from_i64(
60    amount: i64,
61    token_amount_out: *mut TokenAmountPtr,
62) -> ErrorPtr {
63    let res = token_amount_from_i64(amount, token_amount_out);
64    Error::c_api_from(res)
65}
66
67/// Get value as signed 64-bit long
68#[no_mangle]
69pub unsafe extern "C" fn ergo_lib_token_amount_as_i64(
70    token_amount_ptr: ConstTokenAmountPtr,
71) -> i64 {
72    #[allow(clippy::unwrap_used)]
73    token_amount_as_i64(token_amount_ptr).unwrap()
74}
75
76/// Drop `TokenAmount`
77#[no_mangle]
78pub unsafe extern "C" fn ergo_lib_token_amount_delete(ptr: TokenAmountPtr) {
79    delete_ptr(ptr)
80}
81
82make_ffi_eq!(TokenAmount);
83
84// `Token` bindings --------------------------------------------------------------------------------
85
86/// Create a token with given token id and amount
87#[no_mangle]
88pub unsafe extern "C" fn ergo_lib_token_new(
89    token_id_ptr: ConstTokenIdPtr,
90    token_amount_ptr: ConstTokenAmountPtr,
91    token_out: *mut TokenPtr,
92) {
93    #[allow(clippy::unwrap_used)]
94    token_new(token_id_ptr, token_amount_ptr, token_out).unwrap();
95}
96
97/// Get token id
98#[no_mangle]
99pub unsafe extern "C" fn ergo_lib_token_get_id(
100    token_ptr: ConstTokenPtr,
101    token_id_out: *mut TokenIdPtr,
102) {
103    #[allow(clippy::unwrap_used)]
104    token_get_id(token_ptr, token_id_out).unwrap();
105}
106
107/// Get token amount
108#[no_mangle]
109pub unsafe extern "C" fn ergo_lib_token_get_amount(
110    token_ptr: ConstTokenPtr,
111    token_amount_out: *mut TokenAmountPtr,
112) {
113    #[allow(clippy::unwrap_used)]
114    token_get_amount(token_ptr, token_amount_out).unwrap();
115}
116
117/// JSON representation according to EIP-12 <https://github.com/ergoplatform/eips/pull/23>
118#[no_mangle]
119pub unsafe extern "C" fn ergo_lib_token_to_json_eip12(
120    token_ptr: ConstTokenPtr,
121    _json_str: *mut *const c_char,
122) -> ErrorPtr {
123    #[allow(clippy::unwrap_used)]
124    let res = match token_to_json_eip12(token_ptr) {
125        Ok(s) => {
126            *_json_str = CString::new(s).unwrap().into_raw();
127            Ok(())
128        }
129        Err(e) => Err(e),
130    };
131    Error::c_api_from(res)
132}
133
134/// Drop `Token`
135#[no_mangle]
136pub unsafe extern "C" fn ergo_lib_token_delete(ptr: TokenPtr) {
137    delete_ptr(ptr)
138}
139
140make_ffi_eq!(Token);
141make_collection!(Tokens, Token);