Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
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
link33
plugin
Commits
132f4c9a
Commit
132f4c9a
authored
Dec 21, 2021
by
libangzhu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加余额校验检查
parent
ef410b6b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
85 additions
and
22 deletions
+85
-22
ethereum.go
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethereum.go
+79
-17
contracts_test.go
...s2eth/ebrelayer/relayer/ethereum/ethtxs/contracts_test.go
+5
-5
types.go
...dapp/cross2eth/ebrelayer/relayer/ethereum/ethtxs/types.go
+1
-0
No files found.
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethereum.go
View file @
132f4c9a
...
...
@@ -591,14 +591,7 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
return
}
var
toAddr
common
.
Address
tokenAddr
:=
common
.
HexToAddress
(
withdrawFromChain33TokenInfo
.
Address
)
if
tokenAddr
.
String
()
!=
""
{
toAddr
=
tokenAddr
}
else
{
//如果tokenAddr为空,则把toAddr设置为用户指定的地址
toAddr
=
chain33Msg
.
EthereumReceiver
}
//从chain33进行withdraw回来的token需要根据精度进行相应的缩放
if
8
!=
withdrawFromChain33TokenInfo
.
Decimal
{
if
withdrawFromChain33TokenInfo
.
Decimal
>
8
{
...
...
@@ -626,16 +619,38 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
ctx
:=
context
.
Background
()
timeout
,
cancel
:=
context
.
WithTimeout
(
ctx
,
time
.
Second
*
2
)
defer
cancel
()
var
intput
data
[]
byte
var
intput
Data
[]
byte
// ERC20 or BEP20 token transfer pack data
var
err
error
if
tokenAddr
.
String
()
!=
""
{
//判断是否要Pack EVM数据
intputdata
,
err
=
ethRelayer
.
callEvmData
(
chain33Msg
.
EthereumReceiver
,
chain33Msg
.
Amount
)
relayerLog
.
Error
(
"handleLogWithdraw"
,
"CallEvmData err"
,
err
)
var
toAddr
common
.
Address
var
balanceOfData
[]
byte
// ERC20 or BEP20 token balanceof pack data
if
tokenAddr
.
String
()
!=
ethtxs
.
EthNullAddr
{
//判断是否要Pack EVM数据
toAddr
=
tokenAddr
intputData
,
err
=
ethRelayer
.
packTransferData
(
chain33Msg
.
EthereumReceiver
,
chain33Msg
.
Amount
)
if
err
!=
nil
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"CallEvmData err"
,
err
)
return
}
//用签名的账户地址作为pack参数,toAddr作为合约地址
balanceOfData
,
err
=
ethRelayer
.
packBalanceOfData
(
chain33Msg
.
EthereumReceiver
)
if
err
!=
nil
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"callEvmBalanceData err"
,
err
)
return
}
}
else
{
//如果tokenAddr为空,则把toAddr设置为用户指定的地址
toAddr
=
chain33Msg
.
EthereumReceiver
}
//校验余额是否充足
if
ok
,
err
:=
ethRelayer
.
checkBalanceEnough
(
toAddr
,
chain33Msg
.
Amount
,
balanceOfData
);
!
ok
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"Failed to checkBalanceEnough:"
,
err
.
Error
())
return
}
//param: from,to,evm-packdata,amount
//交易构造
tx
,
err
:=
ethRelayer
.
newTx
(
ethRelayer
.
ethSender
,
toAddr
,
intput
d
ata
,
chain33Msg
.
Amount
)
tx
,
err
:=
ethRelayer
.
newTx
(
ethRelayer
.
ethSender
,
toAddr
,
intput
D
ata
,
chain33Msg
.
Amount
)
if
err
!=
nil
{
relayerLog
.
Error
(
"handleLogWithdraw"
,
"newTx err"
,
err
)
return
...
...
@@ -664,10 +679,45 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
return
}
func
(
ethRelayer
*
Relayer4Ethereum
)
checkReceiverPermission
(
addr
common
.
Address
,
amount
*
big
.
Int
,
symbol
string
)
(
bool
,
error
)
{
//TODO 检测提币用户下累计提币额度是否达到上限
return
true
,
nil
//return errors.New("permission denied")
func
(
ethRelayer
*
Relayer4Ethereum
)
checkBalanceEnough
(
addr
common
.
Address
,
amount
*
big
.
Int
,
inputdata
[]
byte
)
(
bool
,
error
)
{
//检测地址余额
var
balance
*
big
.
Int
var
err
error
if
inputdata
==
nil
{
balance
,
err
=
ethRelayer
.
clientSpec
.
BalanceAt
(
context
.
Background
(),
addr
,
nil
)
if
err
!=
nil
{
//retry
balance
,
err
=
ethRelayer
.
clientSpec
.
BalanceAt
(
context
.
Background
(),
addr
,
nil
)
if
err
!=
nil
{
return
false
,
err
}
}
}
else
{
var
msg
ethereum
.
CallMsg
msg
.
To
=
&
addr
//合约地址
msg
.
Data
=
inputdata
result
,
err
:=
ethRelayer
.
clientSpec
.
CallContract
(
context
.
Background
(),
msg
,
nil
)
if
err
!=
nil
{
//retry
result
,
err
=
ethRelayer
.
clientSpec
.
CallContract
(
context
.
Background
(),
msg
,
nil
)
if
err
!=
nil
{
return
false
,
err
}
}
var
ok
bool
balance
,
ok
=
big
.
NewInt
(
1
)
.
SetString
(
common
.
Bytes2Hex
(
result
),
16
)
if
!
ok
{
return
false
,
errors
.
New
(
fmt
.
Sprintf
(
"token balance err:%v"
,
common
.
Bytes2Hex
(
result
)))
}
}
//与要发动的金额大小进行比较
if
balance
.
Cmp
(
amount
)
>
0
{
return
true
,
nil
}
return
false
,
errors
.
New
(
"Insufficient balance"
)
}
func
(
ethRelayer
*
Relayer4Ethereum
)
signTx
(
tx
*
types
.
Transaction
,
key
*
ecdsa
.
PrivateKey
)
(
*
types
.
Transaction
,
error
)
{
...
...
@@ -684,7 +734,7 @@ func (ethRelayer *Relayer4Ethereum) signTx(tx *types.Transaction, key *ecdsa.Pri
return
tx
,
nil
}
func
(
ethRelayer
*
Relayer4Ethereum
)
callEvm
Data
(
_to
common
.
Address
,
_value
*
big
.
Int
)
([]
byte
,
error
)
{
func
(
ethRelayer
*
Relayer4Ethereum
)
packTransfer
Data
(
_to
common
.
Address
,
_value
*
big
.
Int
)
([]
byte
,
error
)
{
parsed
,
err
:=
abi
.
JSON
(
strings
.
NewReader
(
generated
.
ERC20ABI
))
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -695,6 +745,18 @@ func (ethRelayer *Relayer4Ethereum) callEvmData(_to common.Address, _value *big.
}
return
abidata
,
nil
}
func
(
ethRelayer
*
Relayer4Ethereum
)
packBalanceOfData
(
_to
common
.
Address
)
([]
byte
,
error
)
{
parsed
,
err
:=
abi
.
JSON
(
strings
.
NewReader
(
generated
.
ERC20ABI
))
if
err
!=
nil
{
return
nil
,
err
}
abidata
,
err
:=
parsed
.
Pack
(
"balanceOf"
,
_to
)
if
err
!=
nil
{
return
nil
,
err
}
return
abidata
,
nil
}
func
(
ethRelayer
*
Relayer4Ethereum
)
newTx
(
from
,
to
common
.
Address
,
input
[]
byte
,
value
*
big
.
Int
)
(
*
types
.
Transaction
,
error
)
{
price
,
err
:=
ethRelayer
.
clientSpec
.
SuggestGasPrice
(
context
.
Background
())
...
...
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethtxs/contracts_test.go
View file @
132f4c9a
...
...
@@ -29,7 +29,7 @@ import (
var
(
chain33Addr
=
"14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
//ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f"
ethToken
Addr
=
"0x0000000000000000000000000000000000000000"
EthNull
Addr
=
"0x0000000000000000000000000000000000000000"
)
type
suiteContracts
struct
{
...
...
@@ -81,7 +81,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
event
:=
&
events
.
LockEvent
{
From
:
c
.
para
.
InitValidators
[
0
],
To
:
to
,
Token
:
common
.
HexToAddress
(
ethToken
Addr
),
Token
:
common
.
HexToAddress
(
EthNull
Addr
),
Symbol
:
"eth"
,
Value
:
big
.
NewInt
(
10000
*
10000
*
10000
),
Nonce
:
big
.
NewInt
(
1
),
...
...
@@ -91,7 +91,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
assert
.
NotEmpty
(
c
.
T
(),
witnessClaim
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumChainID
,
int64
(
1
))
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
BridgeBrankAddr
,
c
.
x2EthDeployInfo
.
BridgeBank
.
Address
.
String
())
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
ethToken
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
EthNull
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
Symbol
,
event
.
Symbol
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumSender
,
event
.
From
.
String
())
//assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To))
...
...
@@ -110,7 +110,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
event
:=
&
events
.
BurnEvent
{
OwnerFrom
:
c
.
para
.
InitValidators
[
0
],
Chain33Receiver
:
to
,
Token
:
common
.
HexToAddress
(
ethToken
Addr
),
Token
:
common
.
HexToAddress
(
EthNull
Addr
),
Symbol
:
"bty"
,
Amount
:
big
.
NewInt
(
100
),
Nonce
:
big
.
NewInt
(
2
),
...
...
@@ -120,7 +120,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
assert
.
NotEmpty
(
c
.
T
(),
witnessClaim
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumChainID
,
int64
(
1
))
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
BridgeBrankAddr
,
c
.
x2EthDeployInfo
.
BridgeBank
.
Address
.
String
())
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
ethToken
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
TokenAddr
,
EthNull
Addr
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
Symbol
,
event
.
Symbol
)
assert
.
Equal
(
c
.
T
(),
witnessClaim
.
EthereumSender
,
event
.
OwnerFrom
.
String
())
//assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver))
...
...
plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethtxs/types.go
View file @
132f4c9a
...
...
@@ -12,6 +12,7 @@ const (
X2Eth
=
"x2ethereum"
BurnAction
=
"Chain33ToEthBurn"
LockAction
=
"Chain33ToEthLock"
EthNullAddr
=
"0x0000000000000000000000000000000000000000"
)
// OracleClaim : contains data required to make an OracleClaim
...
...
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