Skip to content

Commit 3fbdf48

Browse files
authored
Merge pull request #16 from rarimo/fix/residual_balance
changed uint64 to big.Int
2 parents 1656bd5 + cad5213 commit 3fbdf48

File tree

14 files changed

+212
-247
lines changed

14 files changed

+212
-247
lines changed

docs/spec/components/schemas/VotingPredictAttributes.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
type: object
22
x-go-is-request: true
3-
required:
4-
- voting_id
53
properties:
64
amount:
75
type: string
@@ -14,7 +12,7 @@ properties:
1412
example: "10000"
1513
description: The number of transactions that need to be covered
1614
voting_id:
17-
type: string
18-
pattern: "^[0-9]+$"
15+
type: integer
16+
format: int64
1917
example: "12"
2018
description: ID of the voting to which the vote

docs/spec/paths/integrations@proof-verification-relayer@v2@predict.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
post:
22
tags:
33
- Voting Info
4-
summary: Voting Info
4+
summary: Prediction of voting parameters (number of transactions or required amount)
5+
description: "This endpoint allows predicting voting parameters. The user can provide a voting ID and select one of the prediction types: forecasting the required amount for a given number of transactions or estimating the possible number of transactions with a specified amount"
56
operationId: votingPredict
67
requestBody:
78
content:

internal/checker/checker.go

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,13 @@ func (ch *checker) check(ctx context.Context) error {
6565

6666
startBlock, err := ch.getStartBlockNumber()
6767
if err != nil {
68-
ch.log.Errorf("Failed get start block: %v", err)
69-
return err
68+
return errors.Wrap(err, "Failed get start block")
7069
}
7170

7271
ch.readOldEvents(ctx, startBlock)
7372
startBlock, err = ch.getStartBlockNumber()
7473
if err != nil {
75-
ch.log.Errorf("Failed get start block: %v", err)
76-
return err
74+
return errors.Wrap(err, "Failed get start block")
7775
}
7876
go ch.readNewEvents(ctx, ch.VotingV2Config.WithSub)
7977

@@ -138,11 +136,11 @@ func (ch *checker) readNewEventsWithoutSub(ctx context.Context) {
138136
}
139137
}
140138

141-
func (ch *checker) readNewEventsSub(ctx context.Context, eventName string) error {
139+
func (ch *checker) readNewEventsSub(ctx context.Context, eventName string) {
142140
parsedABI, err := abi.JSON(strings.NewReader(contracts.ProposalsStateABI))
143141
if err != nil {
144142
ch.log.Errorf("Failed to parse contract ABI: %v", err)
145-
return err
143+
return
146144
}
147145

148146
query := ethereum.FilterQuery{
@@ -153,14 +151,14 @@ func (ch *checker) readNewEventsSub(ctx context.Context, eventName string) error
153151
sub, err := ch.VotingV2Config.RPC.SubscribeFilterLogs(context.Background(), query, logs)
154152
if err != nil {
155153
ch.log.WithFields(logan.F{"Error": err, "eventName": eventName}).Error("failed subscribe event")
156-
return err
154+
return
157155
}
158156

159157
for {
160158
select {
161159
case <-ctx.Done():
162160
ch.log.Info("unsubscribe from events")
163-
return nil
161+
return
164162
case err := <-sub.Err():
165163
ch.log.WithFields(logan.F{
166164
"Error": err,
@@ -170,7 +168,12 @@ func (ch *checker) readNewEventsSub(ctx context.Context, eventName string) error
170168
case vLog := <-logs:
171169
err := ch.processLog(vLog, eventName)
172170
if err != nil {
173-
ch.log.WithFields(logan.F{"Error": err, "log_index": vLog.Index, "hash_tx": vLog.TxHash.Hex()}).Warn("failed process log")
171+
ch.log.WithFields(logan.F{
172+
"Error": err,
173+
"log_index": vLog.Index,
174+
"hash_tx": vLog.TxHash.Hex(),
175+
"event_name": eventName}).
176+
Warn("failed process log")
174177
}
175178
}
176179
}
@@ -186,12 +189,13 @@ func (ch *checker) checkFilter(block, toBlock uint64, contract *contracts.Propos
186189

187190
filterLogsF, err := contract.FilterProposalFunded(&query, nil)
188191
if err != nil {
189-
ch.log.WithField("Error", err).Info("failed to filter logs")
190-
return errors.Wrap(err, "failed to filter logs", logan.F{"address": contractAddress, "start_block": block})
192+
return errors.Wrap(err, "failed to filter logs", logan.F{
193+
"address": contractAddress,
194+
"start_block": block,
195+
})
191196
}
192197
filterLogs, err := contract.FilterProposalCreated(&query, nil)
193198
if err != nil {
194-
ch.log.WithField("Error", err).Info("failed to filter logs")
195199
return errors.Wrap(err, "failed to filter logs", logan.F{"address": contractAddress, "start_block": block})
196200
}
197201

@@ -210,7 +214,7 @@ func (ch *checker) filterEvets(event contracts.ProposalEvent, block uint64, toBl
210214
"Error": err,
211215
"log_index": event.LogIndex(),
212216
"hash_tx": event.TxHash().Hex(),
213-
"value": event.FundAmountU64(),
217+
"value": event.FundAmount().String(),
214218
"eventName": eventName,
215219
}).
216220
Warn("failed process log")
@@ -227,25 +231,23 @@ func (ch *checker) filterEvets(event contracts.ProposalEvent, block uint64, toBl
227231
}).Debug("found events")
228232
}
229233

230-
func (ch *checker) readOldEvents(ctx context.Context, block uint64) error {
234+
func (ch *checker) readOldEvents(ctx context.Context, block uint64) {
231235
client := ch.VotingV2Config.RPC
232236
contractAddress := ch.VotingV2Config.Address
233237
ch.log.WithField("from", block).Info("start reading old events")
234238

235239
contract, err := contracts.NewProposalsStateFilterer(contractAddress, client)
236240
if err != nil {
237241
ch.log.Errorf("failed cretate proposal state filter: %v", err)
238-
return err
242+
return
239243
}
240244
header, err := client.HeaderByNumber(ctx, nil)
241245
if err != nil {
242246
ch.log.WithField("Error", err).Info("failed to get latest block header")
243-
return errors.Wrap(err, "failed to get latest block header")
247+
return
244248
}
245249
toBlock := ch.readFromToBlock(ctx, block, header.Number.Uint64(), contract)
246250
ch.log.WithField("to", toBlock).Info("finish reading old events")
247-
248-
return nil
249251
}
250252

251253
func (ch *checker) readFromToBlock(ctx context.Context, fromBlock uint64, toBlock uint64, contract *contracts.ProposalsStateFilterer) uint64 {

internal/checker/process_events.go

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package checker
22

33
import (
44
"database/sql"
5+
"math/big"
56
"strings"
67

78
"github.com/ethereum/go-ethereum/accounts/abi"
@@ -18,20 +19,16 @@ func (ch *checker) processEvents(event contracts.ProposalEvent) error {
1819
processedEvent.LogIndex = event.LogIndex()
1920
processedEvent.TransactionHash = event.TxHash().Bytes()
2021
if err := ch.insertProcessedEventLog(processedEvent); err != nil {
21-
ch.log.WithField("Error", err).Debug("failed insert processed event")
22-
return err
22+
return errors.Wrap(err, "failed insert processed event")
2323
}
2424
votingInfo, err := ch.checkVoteAndGetBalance(event.ProposalID())
2525
if err != nil {
26-
ch.log.WithField("Error", err).Errorf("failed insert processed event")
27-
28-
return err
26+
return errors.Wrap(err, "failed get voting info")
2927
}
30-
votingInfo.Balance += event.FundAmountU64()
28+
votingInfo.Balance = new(big.Int).Add(votingInfo.Balance, event.FundAmount())
3129

3230
if err := ch.checkerQ.UpdateVotingInfo(votingInfo); err != nil {
33-
ch.log.Errorf("Failed Update voting balance: %v", err)
34-
return err
31+
return errors.Wrap(err, "failed Update voting balance")
3532
}
3633

3734
return nil
@@ -47,8 +44,7 @@ func (ch *checker) processLog(vLog types.Log, eventName string) error {
4744

4845
err := ch.insertProcessedEventLog(processedEvent)
4946
if err != nil {
50-
ch.log.WithFields(logan.F{"Error": err, "eventName": eventName}).Error("failed insert processed event")
51-
return err
47+
return errors.Wrap(err, "failed insert processed event")
5248
}
5349

5450
votingId, value, err := ch.getTransferEvent(eventName, vLog)
@@ -58,52 +54,48 @@ func (ch *checker) processLog(vLog types.Log, eventName string) error {
5854

5955
votingInfo, err := ch.checkVoteAndGetBalance(votingId)
6056
if err != nil {
61-
ch.log.WithFields(logan.F{"Error": err, "eventName": eventName, "Voting ID": votingId}).Error("failed get voting info")
62-
return err
57+
return errors.Wrap(err, "failed get voting info", logan.F{"Voting ID": votingId})
6358
}
64-
votingInfo.Balance = votingInfo.Balance + value
59+
votingInfo.Balance = new(big.Int).Add(votingInfo.Balance, value)
6560

6661
err = ch.checkerQ.UpdateVotingInfo(votingInfo)
6762
if err != nil {
68-
ch.log.WithFields(logan.F{"Error": err, "eventName": eventName, "Voting ID": votingId}).Error("Failed Update voting balance")
69-
return err
63+
return errors.Wrap(err, "failed update voting balance", logan.F{"Voting ID": votingId})
7064
}
7165
return nil
7266
}
7367

74-
func (ch *checker) getTransferEvent(eventName string, vLog types.Log) (votingId int64, value uint64, err error) {
68+
func (ch *checker) getTransferEvent(eventName string, vLog types.Log) (votingId int64, value *big.Int, err error) {
7569
parsedABI, err := abi.JSON(strings.NewReader(contracts.ProposalsStateABI))
7670
if err != nil {
7771
ch.log.Errorf("Failed to parse contract ABI: %v", err)
78-
return 0, 0, err
72+
return 0, nil, err
7973
}
8074

8175
if eventName == "ProposalCreated" {
8276
var transferEvent contracts.ProposalsStateProposalCreated
8377
err = parsedABI.UnpackIntoInterface(&transferEvent, eventName, vLog.Data)
8478
if err != nil {
8579
ch.log.Errorf("Failed to unpack log data: %v", err)
86-
return 0, 0, err
80+
return 0, nil, err
8781
}
88-
return transferEvent.ProposalId.Int64(), transferEvent.FundAmount.Uint64(), nil
82+
return transferEvent.ProposalId.Int64(), transferEvent.FundAmount, nil
8983
}
9084

9185
var transferEvent contracts.ProposalsStateProposalFunded
9286
err = parsedABI.UnpackIntoInterface(&transferEvent, eventName, vLog.Data)
9387
if err != nil {
94-
ch.log.Errorf("Failed to unpack log data: %v", err)
95-
return 0, 0, err
88+
return 0, nil, errors.Wrap(err, "failed to unpack log data")
9689
}
97-
return transferEvent.ProposalId.Int64(), transferEvent.FundAmount.Uint64(), nil
90+
return transferEvent.ProposalId.Int64(), transferEvent.FundAmount, nil
9891
}
9992

10093
func (ch *checker) insertProcessedEventLog(processedEvent data.ProcessedEvent) error {
10194
isExist, err := ch.checkerQ.CheckProcessedEventExist(processedEvent)
10295
if isExist {
103-
ch.log.WithField("event_index_log", processedEvent.LogIndex).Debug("Duplicate event in db")
10496
return errors.New("Duplicate event in db")
10597
}
106-
if err != nil && err != sql.ErrNoRows {
98+
if err != nil {
10799
return err
108100
}
109101
err = ch.checkerQ.InsertProcessedEvent(processedEvent)
@@ -113,36 +105,36 @@ func (ch *checker) insertProcessedEventLog(processedEvent data.ProcessedEvent) e
113105
return nil
114106
}
115107

116-
func (ch *checker) checkVoteAndGetBalance(votingId int64) (data.VotingInfo, error) {
108+
func (ch *checker) checkVoteAndGetBalance(votingId int64) (*data.VotingInfo, error) {
117109
votingInfo, err := ch.checkerQ.GetVotingInfo(votingId)
118-
if err == sql.ErrNoRows {
119-
newVote := &data.VotingInfo{
120-
VotingId: votingId,
121-
Balance: 0,
122-
GasLimit: ch.VotingV2Config.GasLimit,
123-
}
110+
if err != nil {
111+
return nil, err
112+
}
113+
if votingInfo != nil {
114+
return votingInfo, nil
115+
}
124116

125-
err := ch.checkerQ.InsertVotingInfo(*newVote)
126-
if err != nil {
127-
ch.log.Errorf("Failed insert new voting info: %v", err)
128-
return *newVote, err
129-
}
130-
return *newVote, nil
131-
} else if err != nil {
132-
ch.log.Errorf("Error get voting: %v", err)
133-
return data.VotingInfo{}, err
117+
votingInfo = &data.VotingInfo{
118+
VotingId: votingId,
119+
Balance: big.NewInt(0),
120+
GasLimit: ch.VotingV2Config.GasLimit,
121+
}
122+
123+
err = ch.checkerQ.InsertVotingInfo(votingInfo)
124+
if err != nil {
125+
return votingInfo, errors.Wrap(err, "failed insert new voting info")
134126
}
135-
return votingInfo, err
127+
128+
return votingInfo, nil
136129
}
137130

138131
func (ch *checker) getStartBlockNumber() (uint64, error) {
139132
block, err := ch.checkerQ.GetLastBlock()
140-
if err == sql.ErrNoRows {
133+
if err != nil {
134+
if err != sql.ErrNoRows {
135+
return 0, errors.Wrap(err, "failed get block from db")
136+
}
141137
block = ch.VotingV2Config.Block
142-
} else if err != nil {
143-
ch.log.Errorf("Failed get block from db: %v", err)
144-
return ch.VotingV2Config.Block, err
145138
}
146-
147139
return block, nil
148140
}

0 commit comments

Comments
 (0)