Skip to content

Commit

Permalink
fixup! feat: add provider interface
Browse files Browse the repository at this point in the history
  • Loading branch information
AngelCastilloB committed Oct 4, 2024
1 parent b55e46c commit edec4d3
Show file tree
Hide file tree
Showing 12 changed files with 536 additions and 88 deletions.
78 changes: 44 additions & 34 deletions examples/provider_example.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,13 @@

#include "providers/provider_factory.h"

#include "utils/console.h"
#include <cardano/cardano.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* CONSTANTS *****************************************************************/

// Preprod addresses.
static const char* address = "addr_test1qqnqfr70emn3kyywffxja44znvdw0y4aeyh0vdc3s3rky48vlp50u6nrq5s7k6h89uqrjnmr538y6e50crvz6jdv3vqqxah5fk";
static const char* stake_address = "stake_test1urk0s687df3s2g0tdtnj7qpefa36gnjdv68upkpdfxkgkqq8kq6ly";

/* DECLARATIONS **************************************************************/

/**
Expand All @@ -44,16 +39,14 @@ static const char* stake_address = "stake_test1urk0s687df3s2g0tdtnj7qpefa36gnjdv
* Bech32 or hexadecimal Cardano address. The function validates the address format and initializes the corresponding
* address object.
*
* \param[in] provider A pointer to a \ref cardano_provider_t, representing the Cardano provider that is used for address-related
* validation and operations. This parameter must not be NULL.
* \param[in] address A pointer to the address string. This parameter must not be NULL.
* \param[in] address_length The length of the address string in bytes.
*
* \return A pointer to the newly created \ref cardano_address_t object if the address is valid. Returns NULL if the
* address creation fails due to an invalid address format or any internal error.
*/
static cardano_address_t*
create_address(const cardano_provider_t* provider, const char* address, size_t address_length);
create_address(const char* address, size_t address_length);

/**
* \brief Creates a Cardano reward address object from a string representation.
Expand All @@ -62,16 +55,14 @@ create_address(const cardano_provider_t* provider, const char* address, size_t a
* a valid Bech32-encoded Cardano reward address. The function validates the address format and initializes the corresponding
* reward address object.
*
* \param[in] provider A pointer to a \ref cardano_provider_t, representing the Cardano provider that is used for address-related
* validation and operations. This parameter must not be NULL.
* \param[in] address_str A pointer to the reward address string. This parameter must not be NULL.
* \param[in] address_str_length The length of the reward address string in bytes.
*
* \return A pointer to the newly created \ref cardano_reward_address_t object if the address is valid. Returns NULL if the
* address creation fails due to an invalid address format or any internal error.
*/
static cardano_reward_address_t*
create_reward_address(const cardano_provider_t* provider, const char* address_str, size_t address_str_length);
create_reward_address(const char* address_str, size_t address_str_length);

/**
* \brief Displays a summary of the total balance, including UTXO and reward balances.
Expand Down Expand Up @@ -99,34 +90,38 @@ display_balance(cardano_utxo_list_t* utxos, uint64_t reward_balance);
* \return Returns `0` on successful execution, or a non-zero value if there is an error.
*/
int
main()
main(void)
{
// Preprod addresses.
static const char* address = "addr_test1qqnqfr70emn3kyywffxja44znvdw0y4aeyh0vdc3s3rky48vlp50u6nrq5s7k6h89uqrjnmr538y6e50crvz6jdv3vqqxah5fk";
static const char* stake_address = "stake_test1urk0s687df3s2g0tdtnj7qpefa36gnjdv68upkpdfxkgkqq8kq6ly";

const char* api_key = getenv("BLOCKFROST_API_KEY");

Check failure on line 99 in examples/provider_example.c

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

examples/provider_example.c#L99

This function's return value should be treated as untrusted input as it could be modified by an attacker.

if (api_key == NULL)
{
printf("BLOCKFROST_API_KEY environment variable is not set.\n");
console_error("BLOCKFROST_API_KEY environment variable is not set.\n");

return EXIT_FAILURE;
}

printf("libcardano-c %s\n", cardano_get_lib_version());

cardano_provider_t* provider = NULL;

cardano_error_t result = create_blockfrost_provider(CARDANO_NETWORK_MAGIC_PREPROD, api_key, strlen(api_key), &provider);

if (result != CARDANO_SUCCESS)
{
console_error("Failed to create blockfrost provider: %s\n", cardano_provider_get_last_error(provider));
cardano_provider_unref(&provider);

printf("Failed to create blockfrost provider: %s\n", cardano_provider_get_last_error(provider));
return EXIT_FAILURE;
}

printf("Provider name: %s\n\n", cardano_provider_get_name(provider));
console_info("Cardano Provider Example");
console_debug("libcardano-c: V-%s", cardano_get_lib_version());
console_debug("Provider name: %s\n", cardano_provider_get_name(provider));

cardano_address_t* payment_address = create_address(provider, address, strlen(address));
cardano_address_t* payment_address = create_address(address, strlen(address));

Check notice on line 124 in examples/provider_example.c

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

examples/provider_example.c#L124

Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126).

if (payment_address == NULL)
{
Expand All @@ -135,7 +130,7 @@ main()
return EXIT_FAILURE;
}

cardano_reward_address_t* reward_address = create_reward_address(provider, stake_address, strlen(stake_address));
cardano_reward_address_t* reward_address = create_reward_address(stake_address, strlen(stake_address));

Check failure on line 133 in examples/provider_example.c

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

examples/provider_example.c#L133

The `strlen` family of functions does not handle strings that are not null terminated.

if (reward_address == NULL)
{
Expand All @@ -150,7 +145,7 @@ main()

if (result != CARDANO_SUCCESS)
{
printf("Failed to get rewards available: %s\n", cardano_provider_get_last_error(provider));
console_error("Failed to get rewards available: %s", cardano_provider_get_last_error(provider));

cardano_provider_unref(&provider);
cardano_address_unref(&payment_address);
Expand All @@ -164,11 +159,12 @@ main()

if (result != CARDANO_SUCCESS)
{
console_error("Failed to get unspent outputs: %s", cardano_provider_get_last_error(provider));

cardano_provider_unref(&provider);
cardano_address_unref(&payment_address);
cardano_reward_address_unref(&reward_address);

printf("Failed to get unspent outputs: %s\n", cardano_provider_get_last_error(provider));
return EXIT_FAILURE;
}

Expand All @@ -181,7 +177,7 @@ main()

if (result != CARDANO_SUCCESS)
{
printf("Failed to display balance: %s\n", cardano_provider_get_last_error(provider));
console_error("Failed to display balance: %s", cardano_provider_get_last_error(provider));
return EXIT_FAILURE;
}

Expand All @@ -191,30 +187,30 @@ main()
/* IMPLEMENTATIONS **********************************************************/

static cardano_address_t*
create_address(const cardano_provider_t* provider, const char* address, const size_t address_length)
create_address(const char* address, const size_t address_length)
{
cardano_address_t* payment_address = NULL;

cardano_error_t result = cardano_address_from_string(address, address_length, &payment_address);

if (result != CARDANO_SUCCESS)
{
printf("Failed to create payment address: %s\n", cardano_provider_get_last_error(provider));
console_error("Failed to create payment address: %s", cardano_error_to_string(result));
return NULL;
}

return payment_address;
}

static cardano_reward_address_t*
create_reward_address(const cardano_provider_t* provider, const char* address_str, const size_t address_str_length)
create_reward_address(const char* address_str, const size_t address_str_length)
{
cardano_reward_address_t* reward_address = NULL;
cardano_error_t result = cardano_reward_address_from_bech32(address_str, address_str_length, &reward_address);

if (result != CARDANO_SUCCESS)
{
printf("Failed to create reward address: %s\n", cardano_provider_get_last_error(provider));
console_error("Failed to create reward address: %s", cardano_error_to_string(result));
return NULL;
}

Expand All @@ -230,7 +226,7 @@ display_balance(cardano_utxo_list_t* utxos, const uint64_t reward_balance)

if (result != CARDANO_SUCCESS)
{
printf("Failed to create value");
console_error("Failed to create value");
return result;
}

Expand All @@ -244,7 +240,7 @@ display_balance(cardano_utxo_list_t* utxos, const uint64_t reward_balance)
{
cardano_value_unref(&total);

printf("Failed to get utxo");
console_error("Failed to get utxo");
return result;
}

Expand All @@ -259,7 +255,7 @@ display_balance(cardano_utxo_list_t* utxos, const uint64_t reward_balance)
cardano_transaction_output_unref(&output);
cardano_value_unref(&total);

printf("Failed to get output value");
console_error("Failed to get output value");

return result;
}
Expand All @@ -275,7 +271,7 @@ display_balance(cardano_utxo_list_t* utxos, const uint64_t reward_balance)
cardano_transaction_output_unref(&output);
cardano_value_unref(&total);

printf("Failed to add value");
console_error("Failed to add value");

return result;
}
Expand All @@ -291,9 +287,23 @@ display_balance(cardano_utxo_list_t* utxos, const uint64_t reward_balance)
uint64_t total_coin = cardano_value_get_coin(total);
uint64_t total_lovelace = total_coin + reward_balance;

printf("Available lovelace: %lu\n", total_coin);
printf("Withdrawable rewards: %lu\n", reward_balance);
printf("Total lovelace: %lu\n", total_lovelace);
console_info("Balance Summary");
console_info("===================================");

console_write("Available lovelace: ");
console_set_foreground_color(CONSOLE_COLOR_GREEN);
console_write("%lu\n", total_coin);
console_reset_color();

console_write("Withdrawable rewards: ");
console_set_foreground_color(CONSOLE_COLOR_GREEN);
console_write("%lu\n", reward_balance);
console_reset_color();

console_write("Total lovelace: ");
console_set_foreground_color(CONSOLE_COLOR_GREEN);
console_write("%lu\n", total_lovelace);
console_reset_color();

cardano_value_unref(&total);

Expand Down
Loading

0 comments on commit edec4d3

Please sign in to comment.