This repository has been archived by the owner on Nov 10, 2023. It is now read-only.
/
read.go
151 lines (126 loc) · 5.76 KB
/
read.go
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package sql_db
import (
"context"
"database/sql"
"fmt"
"github.com/CudoVentures/tokenised-infrastructure-rewarder/internal/app/tokenised-infrastructure-rewarder/types"
"github.com/shopspring/decimal"
)
func (sdb *SqlDB) GetPayoutTimesForNFT(ctx context.Context, collectionDenomId string, nftId string) ([]types.NFTStatistics, error) {
var payoutTimes []types.NFTStatisticsRepo
if err := sdb.SelectContext(ctx, &payoutTimes, selectNFTPayoutHistory, collectionDenomId, nftId); err != nil {
return nil, err
}
var payoutTimesParsed []types.NFTStatistics
for _, payoutTimeRepo := range payoutTimes {
var ownerInfos []types.NFTOwnerInformation
for _, ownerInfoRepo := range payoutTimeRepo.NFTOwnersForPeriod {
rewardBtcDecimal, err := decimal.NewFromString(ownerInfoRepo.Reward)
if err != nil {
return nil, err
}
parsedInfo := types.NFTOwnerInformation{
TimeOwnedFrom: ownerInfoRepo.TimeOwnedFrom,
TimeOwnedTo: ownerInfoRepo.TimeOwnedTo,
TotalTimeOwned: ownerInfoRepo.TotalTimeOwned,
PercentOfTimeOwned: ownerInfoRepo.PercentOfTimeOwned,
Owner: ownerInfoRepo.Owner,
PayoutAddress: ownerInfoRepo.PayoutAddress,
Reward: rewardBtcDecimal,
CreatedAt: ownerInfoRepo.CreatedAt,
UpdatedAt: ownerInfoRepo.UpdatedAt,
}
ownerInfos = append(ownerInfos, parsedInfo)
}
rewardBtcDecimal, err := decimal.NewFromString(payoutTimeRepo.Reward)
if err != nil {
return nil, err
}
maintenanceFeeBtcDecimal, err := decimal.NewFromString(payoutTimeRepo.MaintenanceFee)
if err != nil {
return nil, err
}
cudoPartOfFeeBtcDecimal, err := decimal.NewFromString(payoutTimeRepo.CUDOPartOfMaintenanceFee)
if err != nil {
return nil, err
}
payoutTimeParsed := types.NFTStatistics{
Id: payoutTimeRepo.Id,
TokenId: payoutTimeRepo.TokenId,
DenomId: payoutTimeRepo.DenomId,
PayoutPeriodStart: payoutTimeRepo.PayoutPeriodStart,
PayoutPeriodEnd: payoutTimeRepo.PayoutPeriodEnd,
Reward: rewardBtcDecimal,
MaintenanceFee: maintenanceFeeBtcDecimal,
CUDOPartOfMaintenanceFee: cudoPartOfFeeBtcDecimal,
NFTOwnersForPeriod: ownerInfos,
TxHash: payoutTimeRepo.TxHash,
CreatedAt: payoutTimeRepo.CreatedAt,
UpdatedAt: payoutTimeRepo.UpdatedAt,
}
payoutTimesParsed = append(payoutTimesParsed, payoutTimeParsed)
}
return payoutTimesParsed, nil
}
func (sdb *SqlDB) GetApprovedFarms(ctx context.Context) ([]types.Farm, error) {
farms := []types.Farm{}
if err := sdb.SelectContext(ctx, &farms, selectApprovedFarms); err != nil {
return nil, err
}
return farms, nil
}
func (sdb *SqlDB) GetTxHashesByStatus(ctx context.Context, status string) ([]types.TransactionHashWithStatus, error) {
txHashesWithStatus := []types.TransactionHashWithStatus{}
if err := sdb.SelectContext(ctx, &txHashesWithStatus, selectTxHashStatus, status); err != nil {
return nil, err
}
return txHashesWithStatus, nil
}
func (sdb *SqlDB) GetCurrentAcummulatedAmountForAddress(ctx context.Context, address string, farmId int64) (decimal.Decimal, error) {
var result []types.AddressThresholdAmountByFarm
if err := sdb.SelectContext(ctx, &result, selectThresholdByAddress, address, farmId); err != nil {
return decimal.Zero, err
}
if len(result) > 1 {
return decimal.Zero, fmt.Errorf("more then one threshold address for farm! Address: %s, FarmId: %d", address, farmId)
} else if len(result) == 0 {
return decimal.Zero, sql.ErrNoRows
}
return decimal.NewFromString(result[0].AmountBTC)
}
func (sdb *SqlDB) GetUTXOTransaction(ctx context.Context, txHash string) (types.UTXOTransaction, error) {
var result []types.UTXOTransaction
if err := sdb.SelectContext(ctx, &result, selectUTXOById, txHash); err != nil {
return types.UTXOTransaction{}, err
}
if len(result) > 1 {
return types.UTXOTransaction{}, fmt.Errorf("tx_hash with %s is duplicated in table utxo_transactions", txHash)
} else if len(result) == 0 {
return types.UTXOTransaction{}, sql.ErrNoRows
}
return result[0], nil
}
func (sdb *SqlDB) GetLastUTXOTransactionByFarmId(ctx context.Context, farmId int64) (types.UTXOTransaction, error) {
var result []types.UTXOTransaction
if err := sdb.SelectContext(ctx, &result, selectUTXOByFarmId, farmId); err != nil {
return types.UTXOTransaction{}, err
}
if len(result) == 0 {
return types.UTXOTransaction{}, nil
}
return result[0], nil
}
func (sdb *SqlDB) GetFarmAuraPoolCollections(ctx context.Context, farmId int64) ([]types.AuraPoolCollection, error) {
collections := []types.AuraPoolCollection{}
if err := sdb.SelectContext(ctx, &collections, selectFarmCollections, farmId); err != nil {
return nil, err
}
return collections, nil
}
const selectNFTPayoutHistory = `SELECT * FROM statistics_nft_payout_history WHERE denom_id=$1 and token_id=$2 ORDER BY payout_period_end ASC`
const selectTxHashStatus = `SELECT * FROM statistics_tx_hash_status WHERE status=$1 ORDER BY time_sent ASC`
const selectApprovedFarms = `SELECT id, name, description, sub_account_name, rewards_from_pool_btc_wallet_name, total_farm_hashrate, address_for_receiving_rewards_from_pool, leftover_reward_payout_address, maintenance_fee_payout_address, maintenance_fee_in_btc, created_at, farm_start_time FROM farms WHERE status='approved'`
const selectThresholdByAddress = `SELECT * FROM threshold_amounts WHERE btc_address=$1 AND farm_id=$2`
const selectUTXOById = `SELECT * FROM utxo_transactions WHERE tx_hash=$1`
const selectUTXOByFarmId = `SELECT id, farm_id, tx_hash, payment_timestamp, processed FROM utxo_transactions WHERE farm_id=$1 ORDER BY payment_timestamp DESC`
const selectFarmCollections = `SELECT id, denom_id, hashing_power FROM collections WHERE farm_id=$1`