Commit 20d1df95 authored by QM's avatar QM

add WithdrawFromChain33Cmd

parent 199c53a2
...@@ -31,6 +31,7 @@ func Chain33RelayerCmd() *cobra.Command { ...@@ -31,6 +31,7 @@ func Chain33RelayerCmd() *cobra.Command {
TokenAddressCmd(), TokenAddressCmd(),
MultiSignCmd(), MultiSignCmd(),
ResendChain33EventCmd(), ResendChain33EventCmd(),
WithdrawFromChain33Cmd(),
) )
return cmd return cmd
...@@ -415,3 +416,48 @@ func resendChain33Event(cmd *cobra.Command, args []string) { ...@@ -415,3 +416,48 @@ func resendChain33Event(cmd *cobra.Command, args []string) {
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Manager.ResendChain33Event", resendChain33EventReq, &res) ctx := jsonclient.NewRPCCtx(rpcLaddr, "Manager.ResendChain33Event", resendChain33EventReq, &res)
ctx.Run() ctx.Run()
} }
func WithdrawFromChain33Cmd() *cobra.Command {
cmd := &cobra.Command{
Use: "withdraw",
Short: "async withdraw the asset from chain33 to make it unlocked on ethereum",
Run: WithdrawFromChain33,
}
addWithdrawFromChain33Flags(cmd)
return cmd
}
//addWithdrawFromChain33CmdFlags ...
func addWithdrawFromChain33Flags(cmd *cobra.Command) {
cmd.Flags().StringP("key", "k", "", "owner private key for chain33")
_ = cmd.MarkFlagRequired("key")
cmd.Flags().StringP("token", "t", "", "token address")
_ = cmd.MarkFlagRequired("token")
cmd.Flags().StringP("receiver", "r", "", "receiver address on Ethereum")
_ = cmd.MarkFlagRequired("receiver")
cmd.Flags().Float64P("amount", "m", float64(0), "amount")
_ = cmd.MarkFlagRequired("amount")
}
func WithdrawFromChain33(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
key, _ := cmd.Flags().GetString("key")
tokenAddr, _ := cmd.Flags().GetString("token")
amount, _ := cmd.Flags().GetFloat64("amount")
receiver, _ := cmd.Flags().GetString("receiver")
d, err := utils.SimpleGetDecimals(tokenAddr)
if err != nil {
fmt.Println("get decimals err")
return
}
para := ebTypes.WithdrawFromChain33{
OwnerKey: key,
TokenAddr: tokenAddr,
Amount: utils.ToWei(amount, d).String(),
EthereumReceiver: receiver,
}
var res rpctypes.Reply
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Manager.WithdrawFromChain33", para, &res)
ctx.Run()
}
...@@ -255,5 +255,11 @@ message WithdrawSymbol2Fee { ...@@ -255,5 +255,11 @@ message WithdrawSymbol2Fee {
map<string, int64> symbol2Fee = 1; map<string, int64> symbol2Fee = 1;
} }
message WithdrawFromChain33 {
string ownerKey = 1;
string tokenAddr = 2;
string amount = 3;
string ethereumReceiver = 4;
}
...@@ -44,17 +44,17 @@ type Relayer4Chain33 struct { ...@@ -44,17 +44,17 @@ type Relayer4Chain33 struct {
lastHeight4Tx int64 //等待被处理的具有相应的交易回执的高度 lastHeight4Tx int64 //等待被处理的具有相应的交易回执的高度
matDegree int32 //成熟度 heightSync2App matDegress height matDegree int32 //成熟度 heightSync2App matDegress height
privateKey4Chain33 chain33Crypto.PrivKey privateKey4Chain33 chain33Crypto.PrivKey
privateKey4Chain33_ecdsa *ecdsa.PrivateKey privateKey4Chain33_ecdsa *ecdsa.PrivateKey
ctx context.Context ctx context.Context
rwLock sync.RWMutex rwLock sync.RWMutex
unlockChan chan int unlockChan chan int
bridgeBankEventLockSig string bridgeBankEventLockSig string
bridgeBankEventBurnSig string bridgeBankEventBurnSig string
bridgeBankEventWithdrawSig string bridgeBankEventWithdrawSig string
bridgeBankAbi abi.ABI bridgeBankAbi abi.ABI
deployInfo *ebTypes.Deploy deployInfo *ebTypes.Deploy
totalTx4RelayEth2chai33 int64 totalTx4RelayEth2chai33 int64
//新增// //新增//
ethBridgeClaimChan <-chan *ebTypes.EthBridgeClaim ethBridgeClaimChan <-chan *ebTypes.EthBridgeClaim
chain33MsgChan chan<- *events.Chain33Msg chain33MsgChan chan<- *events.Chain33Msg
...@@ -639,3 +639,9 @@ func (chain33Relayer *Relayer4Chain33) SetMultiSignAddr(address string) { ...@@ -639,3 +639,9 @@ func (chain33Relayer *Relayer4Chain33) SetMultiSignAddr(address string) {
chain33Relayer.setMultiSignAddress(address) chain33Relayer.setMultiSignAddress(address)
} }
func (chain33Relayer *Relayer4Chain33) WithdrawFromChain33(ownerPrivateKey, tokenAddr, ethereumReceiver, amount string) (string, error) {
bn := big.NewInt(1)
bn, _ = bn.SetString(utils.TrimZeroAndDot(amount), 10)
return withdrawAsync(ownerPrivateKey, tokenAddr, ethereumReceiver, bn.Int64(), chain33Relayer.bridgeBankAddr, chain33Relayer.chainName, chain33Relayer.rpcLaddr)
}
...@@ -646,3 +646,48 @@ func sendQuery(rpcAddr, funcName string, request types.Message, result proto.Mes ...@@ -646,3 +646,48 @@ func sendQuery(rpcAddr, funcName string, request types.Message, result proto.Mes
} }
return true return true
} }
func withdrawAsync(ownerPrivateKeyStr, tokenAddrstr, ethereumReceiver string, amount int64, bridgeBankAddr string, chainName, rpcURL string) (string, error) {
var driver secp256k1.Driver
privateKeySli, err := chain33Common.FromHex(ownerPrivateKeyStr)
if nil != err {
return "", err
}
ownerPrivateKey, err := driver.PrivKeyFromBytes(privateKeySli)
if nil != err {
return "", err
}
approveTxHash, err := approve(ownerPrivateKey, tokenAddrstr, bridgeBankAddr, chainName, rpcURL, amount)
if err != nil {
chain33txLog.Error("withdrawAsync", "failed to send approve tx due to:", err.Error())
return "", err
}
chain33txLog.Debug("withdrawAsync", "approve with tx hash", approveTxHash)
withdrawTxHash, err := withdrawViaProxy(ownerPrivateKey, bridgeBankAddr, ethereumReceiver, tokenAddrstr, chainName, rpcURL, amount)
if err != nil {
chain33txLog.Error("withdrawAsync", "failed to send withdraw tx due to:", err.Error())
return "", err
}
chain33txLog.Debug("withdrawAsync", "withdraw with tx hash", withdrawTxHash)
return withdrawTxHash, err
}
func withdrawViaProxy(privateKey chain33Crypto.PrivKey, contractAddr, ethereumReceiver, ethereumTokenAddress, chainName, rpcURL string, amount int64) (string, error) {
//function withdrawViaProxy(
// bytes memory _ethereumReceiver,
// address _bridgeTokenAddress,
// uint256 _amount
//)
parameter := fmt.Sprintf("withdrawViaProxy(%s, %s, %d)", ethereumReceiver, ethereumTokenAddress, amount)
note := parameter
_, packData, err := evmAbi.Pack(parameter, generated.BridgeBankABI, false)
if nil != err {
chain33txLog.Info("withdraw", "Failed to do abi.Pack due to:", err.Error())
return "", err
}
return sendEvmTx(privateKey, contractAddr, chainName, rpcURL, note, packData, 0)
}
...@@ -1092,3 +1092,20 @@ func (manager *Manager) CfgWithdraw(cfgWithdrawReq *relayerTypes.CfgWithdrawReq, ...@@ -1092,3 +1092,20 @@ func (manager *Manager) CfgWithdraw(cfgWithdrawReq *relayerTypes.CfgWithdrawReq,
} }
return nil return nil
} }
func (manager *Manager) WithdrawFromChain33(burn relayerTypes.BurnFromChain33, result *interface{}) error {
manager.mtx.Lock()
defer manager.mtx.Unlock()
if err := manager.checkPermission(); nil != err {
return err
}
txhash, err := manager.chain33Relayer.WithdrawFromChain33(burn.OwnerKey, burn.TokenAddr, burn.EthereumReceiver, burn.Amount)
if nil != err {
return err
}
*result = rpctypes.Reply{
IsOk: true,
Msg: txhash,
}
return nil
}
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