Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
token-bridge
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
movabridge
token-bridge
Commits
031f7acd
Commit
031f7acd
authored
Aug 21, 2025
by
vicotor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update code
parent
58633e2e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
88 additions
and
20 deletions
+88
-20
sync.go
chain/sync.go
+39
-15
eth.go
dao/eth.go
+10
-5
eth_test.go
dao/eth_test.go
+39
-0
No files found.
chain/sync.go
View file @
031f7acd
...
...
@@ -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
...
...
dao/eth.go
View file @
031f7acd
...
...
@@ -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
.
Info
f
(
"found %d unprocessed bridge events"
,
len
(
events
))
log
.
Debug
f
(
"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
{
...
...
dao/eth_test.go
View file @
031f7acd
...
...
@@ -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
())
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment