Commit 031f7acd authored by vicotor's avatar vicotor

update code

parent 58633e2e
......@@ -17,6 +17,27 @@ import (
"time"
)
var (
EVENT_TRANSFER_OUT = "TransferOut"
EVENT_TRANSFER_IN = "TransferIn"
EVENT_TRANSFER_IN_CONFIRMATION = "TransferInConfirmation"
EVENT_TRANSFER_IN_REJECTION = "TransferInRejection"
EVENT_TRANSFER_IN_EXECUTION = "TransferInExecution"
)
type ValidatorOp int
func (op ValidatorOp) String() string {
switch op {
case constant.ValidatorStatusConfirmation:
return "TransferInConfirmation"
case constant.ValidatorStatusRejection:
return "TransferInRejection"
default:
return "Unknown"
}
}
type ChainSync struct {
chain *config.ChainConfig
d *dao.Dao
......@@ -259,6 +280,10 @@ func (s *ChainSync) FilterTransferIn(txLog types.Log, tx *dao.Transaction) error
dbEvent.InId = event.InId.Int64()
dbEvent.ToChainTxHash = strings.ToLower(txLog.TxHash.String())
dbEvent.ToChainStatus = constant.TransferChainWaitConfirm
log.WithFields(log.Fields{
"chain": s.name,
"inTimestamp": txLog.BlockTimestamp,
}).Debug("got transfer in event")
if err := s.d.UpdateBridgeWithTransferInTx(tx, dbEvent); err != nil {
log.WithField("chain", s.name).WithFields(log.Fields{
"error": err.Error(),
......@@ -315,34 +340,32 @@ func (s *ChainSync) FilterValidatorEvents(txLog types.Log, tx *dao.Transaction)
return nil
}
var (
chainId = s.chain.ChainId
validator = ""
eventType = ""
inId = int64(0)
eventHash = ""
txHash = txLog.TxHash.Hex()
valOp = constant.TransferChainNoProcess
chainId = s.chain.ChainId
validator = ""
inId = int64(0)
eventHash = ""
txHash = txLog.TxHash.Hex()
valOp ValidatorOp = constant.TransferChainNoProcess
)
isMyselfOp := false
valAddr := strings.ToLower(s.d.GetChainValidatorAddr(s.chain).Hex())
abi, _ := bridge.BridgeContractMetaData.GetAbi()
switch txLog.Topics[0].Hex() {
case abi.Events["TransferInConfirmation"].ID.Hex():
case abi.Events[EVENT_TRANSFER_IN_CONFIRMATION].ID.Hex():
event, err := s.bridgeCa.ParseTransferInConfirmation(txLog)
if err != nil {
log.WithField("chain", s.name).WithError(err).Error("parse TransferInConfirmation log")
return err
}
valOp = constant.ValidatorStatusConfirmation
eventHash = validatorEventHash(s.chain.ChainId, event.Validator.String(), txLog.TxHash.Hex(), event.InId.Int64(), "TransferInConfirmation")
validator = strings.ToLower(event.Validator.String())
inId = event.InId.Int64()
eventType = "TransferInConfirmation"
valOp = constant.ValidatorStatusConfirmation
if validator == valAddr {
isMyselfOp = true
}
case abi.Events["TransferInRejection"].ID.Hex():
case abi.Events[EVENT_TRANSFER_IN_REJECTION].ID.Hex():
event, err := s.bridgeCa.ParseTransferInRejection(txLog)
if err != nil {
log.WithField("chain", s.name).WithError(err).Error("parse TransferInRejection log")
......@@ -351,7 +374,6 @@ func (s *ChainSync) FilterValidatorEvents(txLog types.Log, tx *dao.Transaction)
eventHash = validatorEventHash(s.chain.ChainId, event.Validator.String(), txLog.TxHash.Hex(), event.InId.Int64(), "TransferInRejection")
validator = strings.ToLower(event.Validator.String())
inId = event.InId.Int64()
eventType = "TransferInRejection"
valOp = constant.ValidatorStatusRejection
if validator == valAddr {
isMyselfOp = true
......@@ -360,7 +382,7 @@ func (s *ChainSync) FilterValidatorEvents(txLog types.Log, tx *dao.Transaction)
log.WithField("chain", s.name).Error("unknown event")
return nil
}
err := s.d.CreateValidatorEventTx(tx, eventHash, chainId, validator, txHash, eventType, inId)
err := s.d.CreateValidatorEventTx(tx, eventHash, chainId, validator, txHash, valOp.String(), inId)
if err != nil {
log.WithField("chain", s.name).WithFields(log.Fields{
"error": err.Error(),
......@@ -368,11 +390,13 @@ func (s *ChainSync) FilterValidatorEvents(txLog types.Log, tx *dao.Transaction)
return err
}
if isMyselfOp {
event, _ := s.d.GetBridgeEventWithInInfoTx(tx, chainId, inId)
event, err := s.d.GetBridgeEventWithInInfoTx(tx, chainId, inId)
if event != nil {
if err = s.d.UpdateBridgeValidatorOperationTx(tx, event, valOp); err != nil {
if err = s.d.UpdateBridgeValidatorOperationTx(tx, event, int(valOp)); err != nil {
log.WithError(err).Error("db update validator operation event")
}
} else {
log.WithField("event", txLog.Topics[0].Hex()).WithError(err).Error("not found event for validator event")
}
}
return nil
......
......@@ -170,6 +170,11 @@ func (d *Dao) SubmitInTransfer(event *dbModel.BridgeEvent) error {
return err
}
k := chain.ValidatorPrivateKey
if k == "" {
log.WithField("chain", chain.Name).Warn("validator private key is empty, skip submit in transfer")
return nil
}
signPrivateKey, err := crypto.HexToECDSA(common.Bytes2Hex(common.FromHex(k)))
if err != nil {
log.WithField("chainId", chain.ChainId).WithError(err).Error("failed to parse private key")
......@@ -225,12 +230,12 @@ func (d *Dao) HandleTasks() {
log.Info("no unprocessed bridge events found")
continue
}
log.Infof("found %d unprocessed bridge events", len(events))
log.Debugf("found %d unprocessed bridge events", len(events))
for _, event := range events {
log.WithFields(log.Fields{
"fromChain": event.FromChain,
"txhash": event.FromChainTxHash,
}).Info("processing bridge event")
//log.WithFields(log.Fields{
// "fromChain": event.FromChain,
// "txhash": event.FromChainTxHash,
//}).Info("processing bridge event")
if err := d.SubmitInTransfer(event); err != nil {
log.WithError(err).WithFields(log.Fields{
......
......@@ -6,7 +6,10 @@ import (
"encoding/hex"
"fmt"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethclient"
"golang.org/x/crypto/sha3"
"math/big"
"testing"
......@@ -50,3 +53,39 @@ func TestDao_AbiEncode(t *testing.T) {
t.Errorf("expect hash: %x, got: %x", expectHash, signature)
}
}
func TestDao_SubmitInTransfer(t *testing.T) {
// msg="build param" param="{269 0x3Ef35d7Db5F2d6A2fe7d16D4C8d4A20e9aD64A6A 0xF5c10392D841d55C41EBf696A4E437b2DC91f5D3 99950000000000000000 1 10323 0xfeed6dB33622Fb526a89c84A0861C29f483f1d0E 0xF5c10392D841d55C41EBf696A4E437b2DC91f5D3 100000000000000000000}" sign=26b9fea993b2e9f363fb90fdfb9ecd6a90c056abcb83af4b19239383ca1b8468
amount, _ := new(big.Int).SetString("99950000000000000000", 10)
samount, _ := new(big.Int).SetString("100000000000000000000", 10)
param := bridge.BridgesubmitParams{
ToChainID: big.NewInt(269),
Receiver: common.HexToAddress("0x3Ef35d7Db5F2d6A2fe7d16D4C8d4A20e9aD64A6A"),
Token: common.HexToAddress("0xF5c10392D841d55C41EBf696A4E437b2DC91f5D3"),
Amount: amount,
OutId: big.NewInt(1),
FromChainID: big.NewInt(10323),
Sender: common.HexToAddress("0xfeed6dB33622Fb526a89c84A0861C29f483f1d0E"),
SendToken: common.HexToAddress("0xF5c10392D841d55C41EBf696A4E437b2DC91f5D3"),
SendAmount: samount,
Signature: common.HexToHash("0x26b9fea993b2e9f363fb90fdfb9ecd6a90c056abcb83af4b19239383ca1b8468"),
}
k := "fc35cdedfab10b7218ae68b45146736bc66513452000f1fa411ff7a9c1f33439"
//client, _ := ethclient.Dial("https://rpc.mova.bitheart.org")
client, _ := ethclient.Dial("https://hpbnode.com")
contract, _ := bridge.NewBridgeContract(common.HexToAddress("0x9a06d0CfAFc19a4bfe0ecd5f8bC20A26a88fA227"), client)
signPrivateKey, err := crypto.HexToECDSA(common.Bytes2Hex(common.FromHex(k)))
if err != nil {
t.Fatalf("failed to convert hex to ECDSA: %v", err)
}
opts, err := bind.NewKeyedTransactorWithChainID(signPrivateKey, param.ToChainID)
if err != nil {
t.Fatalf("failed get opts: %v", err)
}
opts.GasLimit = 100000
tx, err := contract.SubmitInTransfer(opts, param)
if err != nil {
t.Fatalf("failed to submit in transfer: %v", err)
}
t.Log("tx=", tx.Hash().Hex())
}
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