Commit e0bb6f74 authored by vicotor's avatar vicotor

update backend code

parent d451f1a1
......@@ -163,6 +163,8 @@ func (s *Dao) filterTransferIn(chain ChainInterface, txLog types.Log, ctx contex
InTimestamp: int64(blocktime),
ToChain: chain.GetChain().ChainId,
ToChainTxHash: strings.ToLower(txLog.TxHash.String()),
ConfirmedValidators: make([]string, 0),
RejectedValidators: make([]string, 0),
}
if err := s.FillInTransferEventInfo(ctx, dbEvent); err != nil {
......@@ -179,38 +181,91 @@ func (s *Dao) filterTransferIn(chain ChainInterface, txLog types.Log, ctx contex
log.WithField("chain", chain.Name()).WithError(err).Error("parse TransferInExecution log")
return err
}
if err := s.UpdateBridgeResult(ctx, chain.GetChain().ChainId, event.InId.Int64(), TransferChainExecuted, txLog.TxHash); err != nil {
dbevent, err := s.GetBridgeEventByInId(ctx, chain.GetChain().ChainId, event.InId.Int64())
if err != nil {
log.WithField("chain", chain.Name()).WithFields(log.Fields{
"in_id": event.InId.Int64(),
"error": err.Error(),
}).Error("bridge event by in id not found")
return err
}
dbevent.ToChainStatus = int(TransferChainExecuted)
dbevent.ToChainTxHash = strings.ToLower(txLog.TxHash.String())
if err := s.UpdateBridgeEventWithId(ctx, dbevent); err != nil {
log.WithField("chain", chain.Name()).WithFields(log.Fields{
"in_id": event.InId.Int64(),
"error": err.Error(),
}).Error("db update transfer in execution event")
return err
}
//
//if err := s.UpdateBridgeResult(ctx, chain.GetChain().ChainId, event.InId.Int64(), TransferChainExecuted, txLog.TxHash); err != nil {
// log.WithField("chain", chain.Name()).WithFields(log.Fields{
// "error": err.Error(),
// }).Error("db update transfer in execution event")
// return err
//}
case TransferInConfirmationEvent.ID.Hex():
event, err := chain.ParseTransferInConfirmation(txLog)
if err != nil {
log.WithField("chain", chain.Name()).WithError(err).Error("parse TransferInConfirmation log")
return err
}
if err := s.AddValidatorOp(ctx, chain.GetChain().ChainId, event.InId.Int64(), strings.ToLower(event.Validator.String()), true); err != nil {
log.WithField("chain", chain.Name()).WithError(err).Error("add validator op failed")
dbevent, err := s.GetBridgeEventByInId(ctx, chain.GetChain().ChainId, event.InId.Int64())
if err != nil {
log.WithField("chain", chain.Name()).WithFields(log.Fields{
"in_id": event.InId.Int64(),
"error": err.Error(),
}).Error("bridge event by in id not found")
return err
}
dbevent.ConfirmedValidators = append(dbevent.ConfirmedValidators, strings.ToLower(event.Validator.String()))
if err := s.UpdateBridgeEventWithId(ctx, dbevent); err != nil {
log.WithField("chain", chain.Name()).WithFields(log.Fields{
"in_id": event.InId.Int64(),
"error": err.Error(),
}).Error("db update transfer in confirmation event")
return err
}
//if err := s.AddValidatorOp(ctx, chain.GetChain().ChainId, event.InId.Int64(), strings.ToLower(event.Validator.String()), true); err != nil {
// log.WithField("chain", chain.Name()).WithError(err).Error("add validator op failed")
// return err
//}
case TransferInRejectionEvent.ID.Hex():
event, err := chain.ParseTransferInRejection(txLog)
if err != nil {
log.WithField("chain", chain.Name()).WithError(err).Error("parse TransferInExecution log")
return err
}
if err := s.AddValidatorOp(ctx, chain.GetChain().ChainId, event.InId.Int64(), strings.ToLower(event.Validator.String()), false); err != nil {
log.WithField("chain", chain.Name()).WithError(err).Error("add validator op failed")
dbevent, err := s.GetBridgeEventByInId(ctx, chain.GetChain().ChainId, event.InId.Int64())
if err != nil {
log.WithField("chain", chain.Name()).WithFields(log.Fields{
"in_id": event.InId.Int64(),
"error": err.Error(),
}).Error("bridge event by in id not found")
return err
}
if err := s.UpdateBridgeResult(ctx, chain.GetChain().ChainId, event.InId.Int64(), TransferChainRejected, txLog.TxHash); err != nil {
dbevent.ConfirmedValidators = append(dbevent.ConfirmedValidators, strings.ToLower(event.Validator.String()))
dbevent.ToChainStatus = int(TransferChainRejected)
dbevent.ToChainTxHash = strings.ToLower(txLog.TxHash.String())
if err := s.UpdateBridgeEventWithId(ctx, dbevent); err != nil {
log.WithField("chain", chain.Name()).WithFields(log.Fields{
"in_id": event.InId.Int64(),
"error": err.Error(),
}).Error("db update transfer in execution event")
}).Error("db update transfer in rejection event")
return err
}
//if err := s.AddValidatorOp(ctx, chain.GetChain().ChainId, event.InId.Int64(), strings.ToLower(event.Validator.String()), false); err != nil {
// log.WithField("chain", chain.Name()).WithError(err).Error("add validator op failed")
// return err
//}
//if err := s.UpdateBridgeResult(ctx, chain.GetChain().ChainId, event.InId.Int64(), TransferChainRejected, txLog.TxHash); err != nil {
// log.WithField("chain", chain.Name()).WithFields(log.Fields{
// "error": err.Error(),
// }).Error("db update transfer in execution event")
// return err
//}
}
return nil
}
......
......@@ -115,6 +115,40 @@ func (d *Dao) FillOutTransferEventInfo(ctx context.Context, outEvent *dbModel.Br
return err
}
func (s *Dao) GetBridgeEventByOutId(ctx context.Context, fromChainId int64, outId int64) (event *dbModel.BridgeEvent, err error) {
collection := s.db.Collection("bridge_events")
filter := bson.M{"from_chain": fromChainId, "out_id": outId}
err = collection.FindOne(ctx, filter).Decode(&event)
if err == mongo.ErrNoDocuments {
return event, ErrRecordNotFound
}
return event, err
}
func (s *Dao) GetBridgeEventByInId(ctx context.Context, toChainId int64, inId int64) (event *dbModel.BridgeEvent, err error) {
collection := s.db.Collection("bridge_events")
filter := bson.M{"to_chain": toChainId, "in_id": inId}
err = collection.FindOne(ctx, filter).Decode(&event)
if err == mongo.ErrNoDocuments {
return event, ErrRecordNotFound
}
return event, err
}
func (s *Dao) UpdateBridgeEventWithId(ctx context.Context, event *dbModel.BridgeEvent) error {
collection := s.db.Collection("bridge_events")
filter := bson.M{"_id": event.ID}
update := bson.M{
"$set": event,
}
opts := options.Update().SetUpsert(true)
_, err := collection.UpdateOne(ctx, filter, update, opts)
return err
}
func (s *Dao) AddValidatorOp(ctx context.Context, toChainId int64, inId int64, validator string, isConfirmed bool) error {
collection := s.db.Collection("bridge_events")
......
......@@ -11,6 +11,31 @@ import (
"testing"
)
func TestParseEvent(t *testing.T) {
client, err := ethclient.Dial("https://rpc.hole.bitheart.org")
if err != nil {
t.Fatal(err)
}
receipt, err := client.TransactionReceipt(context.Background(), common.HexToHash("0xe697c2f7f8d2e6083c40730ded79a9a561aecb0d15f87781daa600c6ba4bb62a"))
if err != nil {
t.Fatal(err)
}
ct, err := bridge.NewBridgeContract(common.HexToAddress("0xceEC8799139C698De532e363DA7395E25F409775"), client)
if err != nil {
t.Fatal(err)
}
for _, lg := range receipt.Logs {
if lg.Topics[0].Hex() == "0xe420cc80a898ce7e97248ec8a1dc0a25bbcd41c4ba0c64ce325140a2d8915313" {
event, err := ct.ParseTransferInConfirmation(*lg)
if err != nil {
t.Fatal(err)
} else {
fmt.Println(event)
}
}
}
}
func TestGetBlockTime(t *testing.T) {
client, _ := ethclient.Dial("https://bsctest.bitheart.org")
height := big.NewInt(65784850)
......@@ -18,7 +43,7 @@ func TestGetBlockTime(t *testing.T) {
if err != nil {
t.Fatal(err)
}
fmt.Println(block.Time())
fmt.Println(block.Time)
}
func TestGetReceiveToken(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment