Commit cd8c1025 authored by hezhengjun's avatar hezhengjun

Merge branch 'withdraw_opt_1217' of github.com:zhengjunhe/plugin into withdraw_opt_1217

parents 3a2f95b6 0dfc5b84
...@@ -210,3 +210,37 @@ func CreateNewBridgeToken(cmd *cobra.Command, _ []string) { ...@@ -210,3 +210,37 @@ func CreateNewBridgeToken(cmd *cobra.Command, _ []string) {
} }
callContractAndSignWrite(cmd, packData, contract, "create_bridge_token") callContractAndSignWrite(cmd, packData, contract, "create_bridge_token")
} }
func SetWithdrawProxyCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "set_withdraw_proxy",
Short: "set withdraw proxy on chain33, and it's should be done by operator",
Run: SetWithdrawProxy,
}
addSetWithdrawProxyFlags(cmd)
return cmd
}
func addSetWithdrawProxyFlags(cmd *cobra.Command) {
cmd.Flags().StringP("address", "a", "", "withdraw address")
_ = cmd.MarkFlagRequired("address")
cmd.Flags().StringP("contract", "c", "", "bridgebank contract address")
_ = cmd.MarkFlagRequired("contract")
cmd.Flags().StringP("key", "k", "", "the deployer private key")
_ = cmd.MarkFlagRequired("key")
cmd.Flags().StringP("note", "n", "", "transaction note info (optional)")
cmd.Flags().Float64P("fee", "f", 0, "contract gas fee (optional)")
}
func SetWithdrawProxy(cmd *cobra.Command, _ []string) {
contract, _ := cmd.Flags().GetString("contract")
withdrawAddr, _ := cmd.Flags().GetString("address")
parameter := fmt.Sprintf("setWithdrawProxy(%s)", withdrawAddr)
_, packData, err := evmAbi.Pack(parameter, generated.BridgeBankABI, false)
if nil != err {
fmt.Println("configOfflineSaveAccount", "Failed to do abi.Pack due to:", err.Error())
return
}
callContractAndSignWrite(cmd, packData, contract, "create_bridge_token")
}
...@@ -35,6 +35,7 @@ func Boss4xOfflineCmd() *cobra.Command { ...@@ -35,6 +35,7 @@ func Boss4xOfflineCmd() *cobra.Command {
ConfigLockedTokenOfflineSaveCmd(), ConfigLockedTokenOfflineSaveCmd(),
CreateMultisignTransferCmd(), CreateMultisignTransferCmd(),
MultisignTransferCmd(), MultisignTransferCmd(),
SetWithdrawProxyCmd(),
) )
return cmd return cmd
} }
......
...@@ -5,6 +5,11 @@ services: ...@@ -5,6 +5,11 @@ services:
entrypoint: ["node", "/app/ganache-core.docker.cli.js", "-a", "20", "-b", "2", "--debug", "-m", "coast bar giraffe art venue decide symbol law visual crater vital fold", "-e", "1000"] entrypoint: ["node", "/app/ganache-core.docker.cli.js", "-a", "20", "-b", "2", "--debug", "-m", "coast bar giraffe art venue decide symbol law visual crater vital fold", "-e", "1000"]
image: trufflesuite/ganache-cli:latest image: trufflesuite/ganache-cli:latest
ebrelayerProxy:
build:
context: .
dockerfile: Dockerfile-cross2eth
ebrelayera: ebrelayera:
build: build:
context: . context: .
......
...@@ -256,69 +256,56 @@ function TestChain33ToEthAssets() { ...@@ -256,69 +256,56 @@ function TestChain33ToEthAssets() {
function TestETH2Chain33Assets() { function TestETH2Chain33Assets() {
echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}" echo -e "${GRE}=========== $FUNCNAME begin ===========${NOC}"
echo -e "${GRE}=========== eth to chain33 在以太坊上锁定 ETH 资产,然后在 chain33 上 burn ===========${NOC}" echo -e "${GRE}=========== eth to chain33 在以太坊上锁定 ETH 资产,然后在 chain33 上 burn ===========${NOC}"
# 查询 ETH 这端 bridgeBank 地址原来是 0
result=$(${CLIA} ethereum balance -o "${ethBridgeBank}") result=$(${CLIA} ethereum balance -o "${ethBridgeBank}")
cli_ret "${result}" "balance" ".balance" "0" cli_ret "${result}" "balance" ".balance" "0"
# ETH 这端 lock 11个 result=$(${CLIA} ethereum lock -m 0.002 -k "${ethTestAddrKey1}" -r "${chain33ReceiverAddr}")
result=$(${CLIA} ethereum lock -m 11 -k "${ethTestAddrKey1}" -r "${chain33ReceiverAddr}")
cli_ret "${result}" "lock" cli_ret "${result}" "lock"
# eth 等待 2 个区块 # eth 等待 2 个区块
sleep 4 sleep 4
# 查询 ETH 这端 bridgeBank 地址 11
result=$(${CLIA} ethereum balance -o "${ethBridgeBank}") result=$(${CLIA} ethereum balance -o "${ethBridgeBank}")
cli_ret "${result}" "balance" ".balance" "11" cli_ret "${result}" "balance" ".balance" "0.002"
sleep ${maturityDegree} sleep ${maturityDegree}
# chain33 chain33EthBridgeTokenAddr(ETH合约中)查询 lock 金额 # chain33 chain33EthBridgeTokenAddr(ETH合约中)查询 lock 金额
result=$(${Chain33Cli} evm query -a "${chain33EthBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${chain33ReceiverAddr})") result=$(${Chain33Cli} evm query -a "${chain33EthBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${chain33ReceiverAddr})")
# 结果是 11 * le8 # is_equal "${result}" "2000000000000000"
is_equal "${result}" "1100000000"
# 原来的数额 # 原来的数额
result=$(${CLIA} ethereum balance -o "${ethTestAddr2}") result=$(${CLIA} ethereum balance -o "${ethTestAddr2}")
cli_ret "${result}" "balance" ".balance" "1000"
echo '#5.burn ETH from Chain33 ETH(Chain33)-----> Ethereum' echo '#5.burn ETH from Chain33 ETH(Chain33)-----> Ethereum'
result=$(${CLIA} chain33 burn -m 5 -k "${chain33ReceiverAddrKey}" -r "${ethTestAddr2}" -t "${chain33EthBridgeTokenAddr}") result=$(${CLIA} chain33 burn -m 0.0003 -k "${chain33ReceiverAddrKey}" -r "${ethTestAddr2}" -t "${chain33EthBridgeTokenAddr}")
cli_ret "${result}" "burn" cli_ret "${result}" "burn"
sleep ${maturityDegree} sleep ${maturityDegree}
echo "check the balance on chain33" echo "check the balance on chain33"
result=$(${Chain33Cli} evm query -a "${chain33EthBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${chain33ReceiverAddr})") result=$(${Chain33Cli} evm query -a "${chain33EthBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${chain33ReceiverAddr})")
# 结果是 11-5 * le8 # is_equal "${result}" "1700000000000000"
is_equal "${result}" "600000000"
# 查询 ETH 这端 bridgeBank 地址 0 # 查询 ETH 这端 bridgeBank 地址 0
result=$(${CLIA} ethereum balance -o "${ethBridgeBank}") result=$(${CLIA} ethereum balance -o "${ethBridgeBank}")
cli_ret "${result}" "balance" ".balance" "6" cli_ret "${result}" "balance" ".balance" "0.0017"
# 比之前多 5
result=$(${CLIA} ethereum balance -o "${ethTestAddr2}")
cli_ret "${result}" "balance" ".balance" "1005"
echo '#5.burn ETH from Chain33 ETH(Chain33)-----> Ethereum 6' echo '#5.burn ETH from Chain33 ETH(Chain33)-----> Ethereum 6'
result=$(${CLIA} chain33 burn -m 6 -k "${chain33ReceiverAddrKey}" -r "${ethTestAddr2}" -t "${chain33EthBridgeTokenAddr}") result=$(${CLIA} chain33 burn -m 0.0017 -k "${chain33ReceiverAddrKey}" -r "${ethTestAddr2}" -t "${chain33EthBridgeTokenAddr}")
cli_ret "${result}" "burn" cli_ret "${result}" "burn"
sleep ${maturityDegree} sleep ${maturityDegree}
echo "check the balance on chain33" echo "check the balance on chain33"
result=$(${Chain33Cli} evm query -a "${chain33EthBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${chain33ReceiverAddr})") result=$(${Chain33Cli} evm query -a "${chain33EthBridgeTokenAddr}" -c "${chain33DeployAddr}" -b "balanceOf(${chain33ReceiverAddr})")
# 结果是 11-5 * le8
is_equal "${result}" "0" is_equal "${result}" "0"
# 查询 ETH 这端 bridgeBank 地址 0 # 查询 ETH 这端 bridgeBank 地址 0
result=$(${CLIA} ethereum balance -o "${ethBridgeBank}") result=$(${CLIA} ethereum balance -o "${ethBridgeBank}")
cli_ret "${result}" "balance" ".balance" "0" cli_ret "${result}" "balance" ".balance" "0"
# 比之前多 5
result=$(${CLIA} ethereum balance -o "${ethTestAddr2}") result=$(${CLIA} ethereum balance -o "${ethTestAddr2}")
cli_ret "${result}" "balance" ".balance" "1011"
echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}" echo -e "${GRE}=========== $FUNCNAME end ===========${NOC}"
} }
......
...@@ -578,14 +578,7 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33 ...@@ -578,14 +578,7 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
return return
} }
var toAddr common.Address
tokenAddr := common.HexToAddress(withdrawFromChain33TokenInfo.Address) tokenAddr := common.HexToAddress(withdrawFromChain33TokenInfo.Address)
if tokenAddr.String() != "" {
toAddr = tokenAddr
} else {
//如果tokenAddr为空,则把toAddr设置为用户指定的地址
toAddr = chain33Msg.EthereumReceiver
}
//从chain33进行withdraw回来的token需要根据精度进行相应的缩放 //从chain33进行withdraw回来的token需要根据精度进行相应的缩放
if 8 != withdrawFromChain33TokenInfo.Decimal { if 8 != withdrawFromChain33TokenInfo.Decimal {
if withdrawFromChain33TokenInfo.Decimal > 8 { if withdrawFromChain33TokenInfo.Decimal > 8 {
...@@ -613,16 +606,38 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33 ...@@ -613,16 +606,38 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
ctx := context.Background() ctx := context.Background()
timeout, cancel := context.WithTimeout(ctx, time.Second*2) timeout, cancel := context.WithTimeout(ctx, time.Second*2)
defer cancel() defer cancel()
var intputdata []byte var intputData []byte // ERC20 or BEP20 token transfer pack data
var err error var err error
if tokenAddr.String() != "" { //判断是否要Pack EVM数据 var toAddr common.Address
intputdata, err = ethRelayer.callEvmData(chain33Msg.EthereumReceiver, chain33Msg.Amount) var balanceOfData []byte // ERC20 or BEP20 token balanceof pack data
relayerLog.Error("handleLogWithdraw", "CallEvmData err", err)
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 return
} }
//param: from,to,evm-packdata,amount //param: from,to,evm-packdata,amount
//交易构造 //交易构造
tx, err := ethRelayer.newTx(ethRelayer.ethSender, toAddr, intputdata, chain33Msg.Amount) tx, err := ethRelayer.newTx(ethRelayer.ethSender, toAddr, intputData, chain33Msg.Amount)
if err != nil { if err != nil {
relayerLog.Error("handleLogWithdraw", "newTx err", err) relayerLog.Error("handleLogWithdraw", "newTx err", err)
return return
...@@ -651,10 +666,45 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33 ...@@ -651,10 +666,45 @@ func (ethRelayer *Relayer4Ethereum) handleLogWithdraw(chain33Msg *events.Chain33
return return
} }
func (ethRelayer *Relayer4Ethereum) checkReceiverPermission(addr common.Address, amount *big.Int, symbol string) (bool, error) { func (ethRelayer *Relayer4Ethereum) checkBalanceEnough(addr common.Address, amount *big.Int, inputdata []byte) (bool, error) {
//TODO 检测提币用户下累计提币额度是否达到上限 //检测地址余额
return true, nil var balance *big.Int
//return errors.New("permission denied") 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) { func (ethRelayer *Relayer4Ethereum) signTx(tx *types.Transaction, key *ecdsa.PrivateKey) (*types.Transaction, error) {
...@@ -671,7 +721,7 @@ func (ethRelayer *Relayer4Ethereum) signTx(tx *types.Transaction, key *ecdsa.Pri ...@@ -671,7 +721,7 @@ func (ethRelayer *Relayer4Ethereum) signTx(tx *types.Transaction, key *ecdsa.Pri
return tx, nil return tx, nil
} }
func (ethRelayer *Relayer4Ethereum) callEvmData(_to common.Address, _value *big.Int) ([]byte, error) { func (ethRelayer *Relayer4Ethereum) packTransferData(_to common.Address, _value *big.Int) ([]byte, error) {
parsed, err := abi.JSON(strings.NewReader(generated.ERC20ABI)) parsed, err := abi.JSON(strings.NewReader(generated.ERC20ABI))
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -682,6 +732,18 @@ func (ethRelayer *Relayer4Ethereum) callEvmData(_to common.Address, _value *big. ...@@ -682,6 +732,18 @@ func (ethRelayer *Relayer4Ethereum) callEvmData(_to common.Address, _value *big.
} }
return abidata, nil 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) { func (ethRelayer *Relayer4Ethereum) newTx(from, to common.Address, input []byte, value *big.Int) (*types.Transaction, error) {
price, err := ethRelayer.clientSpec.SuggestGasPrice(context.Background()) price, err := ethRelayer.clientSpec.SuggestGasPrice(context.Background())
......
...@@ -29,7 +29,7 @@ import ( ...@@ -29,7 +29,7 @@ import (
var ( var (
chain33Addr = "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt" chain33Addr = "14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
//ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f" //ethAddr = "0x92C8b16aFD6d423652559C6E266cBE1c29Bfd84f"
ethTokenAddr = "0x0000000000000000000000000000000000000000" EthNullAddr = "0x0000000000000000000000000000000000000000"
) )
type suiteContracts struct { type suiteContracts struct {
...@@ -81,7 +81,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() { ...@@ -81,7 +81,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
event := &events.LockEvent{ event := &events.LockEvent{
From: c.para.InitValidators[0], From: c.para.InitValidators[0],
To: to, To: to,
Token: common.HexToAddress(ethTokenAddr), Token: common.HexToAddress(EthNullAddr),
Symbol: "eth", Symbol: "eth",
Value: big.NewInt(10000 * 10000 * 10000), Value: big.NewInt(10000 * 10000 * 10000),
Nonce: big.NewInt(1), Nonce: big.NewInt(1),
...@@ -91,7 +91,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() { ...@@ -91,7 +91,7 @@ func (c *suiteContracts) Test_LogLockToEthBridgeClaim() {
assert.NotEmpty(c.T(), witnessClaim) assert.NotEmpty(c.T(), witnessClaim)
assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1)) assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String()) assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr) assert.Equal(c.T(), witnessClaim.TokenAddr, EthNullAddr)
assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol) assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
assert.Equal(c.T(), witnessClaim.EthereumSender, event.From.String()) assert.Equal(c.T(), witnessClaim.EthereumSender, event.From.String())
//assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To)) //assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.To))
...@@ -110,7 +110,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() { ...@@ -110,7 +110,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
event := &events.BurnEvent{ event := &events.BurnEvent{
OwnerFrom: c.para.InitValidators[0], OwnerFrom: c.para.InitValidators[0],
Chain33Receiver: to, Chain33Receiver: to,
Token: common.HexToAddress(ethTokenAddr), Token: common.HexToAddress(EthNullAddr),
Symbol: "bty", Symbol: "bty",
Amount: big.NewInt(100), Amount: big.NewInt(100),
Nonce: big.NewInt(2), Nonce: big.NewInt(2),
...@@ -120,7 +120,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() { ...@@ -120,7 +120,7 @@ func (c *suiteContracts) Test_LogBurnToEthBridgeClaim() {
assert.NotEmpty(c.T(), witnessClaim) assert.NotEmpty(c.T(), witnessClaim)
assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1)) assert.Equal(c.T(), witnessClaim.EthereumChainID, int64(1))
assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String()) assert.Equal(c.T(), witnessClaim.BridgeBrankAddr, c.x2EthDeployInfo.BridgeBank.Address.String())
assert.Equal(c.T(), witnessClaim.TokenAddr, ethTokenAddr) assert.Equal(c.T(), witnessClaim.TokenAddr, EthNullAddr)
assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol) assert.Equal(c.T(), witnessClaim.Symbol, event.Symbol)
assert.Equal(c.T(), witnessClaim.EthereumSender, event.OwnerFrom.String()) assert.Equal(c.T(), witnessClaim.EthereumSender, event.OwnerFrom.String())
//assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver)) //assert.Equal(c.T(), witnessClaim.Chain33Receiver, string(event.Chain33Receiver))
......
...@@ -12,6 +12,7 @@ const ( ...@@ -12,6 +12,7 @@ const (
X2Eth = "x2ethereum" X2Eth = "x2ethereum"
BurnAction = "Chain33ToEthBurn" BurnAction = "Chain33ToEthBurn"
LockAction = "Chain33ToEthLock" LockAction = "Chain33ToEthLock"
EthNullAddr = "0x0000000000000000000000000000000000000000"
) )
// OracleClaim : contains data required to make an OracleClaim // OracleClaim : contains data required to make an OracleClaim
......
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