From 595f2f0173a0ee503671bccbe7071feb61872274 Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Wed, 3 May 2023 19:01:32 +0700
Subject: [PATCH] [*] Backported their wizard functionality to get total
 signature count, wild signature count, and all public key hashes for a token
 from a ledger.

---
 modules/chain/dap_chain_ledger.c         | 66 ++++++++++++++++++++++++
 modules/chain/include/dap_chain_ledger.h |  5 ++
 2 files changed, 71 insertions(+)

diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 29b2df85cb..ca769f4f7b 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -1623,6 +1623,72 @@ dap_string_t *dap_chain_ledger_balance_info(dap_ledger_t *a_ledger)
     return l_str_ret;
 }
 
+/**
+ * @breif dap_chain_ledger_token_auth_signs_valid
+ * @param a_ledger
+ * @param a_token_ticker
+ * @return 0 if no ticker found
+ */
+size_t dap_chain_ledger_token_auth_signs_valid(dap_ledger_t *a_ledger, const char * a_token_ticker)
+{
+    dap_chain_ledger_token_item_t *l_token_item, *l_tmp_item;
+    pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
+    size_t l_res = 0;
+    HASH_ITER(hh, PVT(a_ledger)->tokens, l_token_item, l_tmp_item) {
+        if (!dap_strcmp(l_token_item->ticker, a_token_ticker)) {
+            l_res = l_token_item->auth_signs_valid;
+            break;
+        }
+    }
+    pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
+    return l_res;
+}
+
+/**
+ * @breif dap_chain_ledger_token_auth_signs_total
+ * @param a_ledger
+ * @param a_token_ticker
+ * @return
+ */
+size_t dap_chain_ledger_token_auth_signs_total(dap_ledger_t *a_ledger, const char * a_token_ticker)
+{
+    dap_chain_ledger_token_item_t *l_token_item, *l_tmp_item;
+    pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
+    size_t l_res = 0;
+    HASH_ITER(hh, PVT(a_ledger)->tokens, l_token_item, l_tmp_item) {
+        if (!dap_strcmp(l_token_item->ticker, a_token_ticker)) {
+            l_res = l_token_item->auth_signs_total;
+            break;
+        }
+    }
+    pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
+    return l_res;
+}
+
+/**
+ * @breif dap_chain_ledger_token_auth_signs_hashes
+ * @param a_ledger
+ * @param a_token_ticker
+ * @return
+ */
+dap_list_t * dap_chain_ledger_token_auth_signs_hashes(dap_ledger_t *a_ledger, const char * a_token_ticker)
+{
+    dap_list_t * l_ret = NULL;
+    dap_chain_ledger_token_item_t *l_token_item, *l_tmp_item;
+    pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
+    HASH_ITER(hh, PVT(a_ledger)->tokens, l_token_item, l_tmp_item) {
+        if (!dap_strcmp(l_token_item->ticker, a_token_ticker)) {
+            debug_if(s_debug_more, L_INFO, " ! Token %s : total %lu auth signs", a_token_ticker, l_token_item->auth_signs_total);
+            for (size_t i = 0; i < l_token_item->auth_signs_total; i++) {
+                l_ret = dap_list_append(l_ret, (dap_chain_hash_fast_t*)(&l_token_item->auth_signs_pkey_hash[i]));
+            }
+            break;
+        }
+    }
+    pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
+    return l_ret;
+}
+
 /**
  * @brief Compose string list of all tokens with information
  * @param a_ledger
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index 8c7514dc6c..c76a9d1127 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -145,6 +145,11 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger);
 dap_string_t *dap_chain_ledger_threshold_info(dap_ledger_t *a_ledger);
 dap_string_t *dap_chain_ledger_threshold_hash_info(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *l_tx_treshold_hash);
 dap_string_t *dap_chain_ledger_balance_info(dap_ledger_t *a_ledger);
+
+size_t dap_chain_ledger_token_auth_signs_valid(dap_ledger_t *a_ledger, const char * a_token_ticker);
+size_t dap_chain_ledger_token_auth_signs_total(dap_ledger_t *a_ledger, const char * a_token_ticker);
+dap_list_t * dap_chain_ledger_token_auth_signs_hashes(dap_ledger_t *a_ledger, const char * a_token_ticker);
+
 /**
  * Add token emission datum
  */
-- 
GitLab