Commit 5b964942 authored by hezhengjun's avatar hezhengjun

store decimal

parent 7a95daa0
##
##编译solidity,并产生bin文件,abi文件,和相应的go文件
SRC_BEP := bep20
SRC_CONTRACT0 := contracts4chain33
SRC_CONTRACT1 := contracts4eth
SRC_MULTISIGN := gnosis/safe-contracts/contracts
......@@ -9,6 +9,7 @@ SRC_MULTISIGN := gnosis/safe-contracts/contracts
GO_OUT0 := ${SRC_CONTRACT0}/generated
GO_OUT1 := ${SRC_CONTRACT1}/generated
GO_OUT_MULTISIGN := gnosis/generated
GO_OUT_BEP20 := bep20/generated
PACKAGE := generated
proj := "build"
......@@ -21,10 +22,14 @@ build: depends
@abigen --sol $(SRC_CONTRACT0)/BridgeBank/BridgeBank.sol --pkg $(PACKAGE) --out $(GO_OUT0)/BridgeBank.go
@abigen --sol $(SRC_CONTRACT1)/BridgeRegistry.sol --pkg $(PACKAGE) --out $(GO_OUT1)/BridgeRegistry.go
@abigen --sol $(SRC_CONTRACT1)/BridgeBank/BridgeBank.sol --pkg $(PACKAGE) --out $(GO_OUT1)/BridgeBank.go
@abigen --sol $(SRC_BEP)/BEP20.sol --pkg $(PACKAGE) --out $(GO_OUT_BEP20)/bep20.go
multisign:
@abigen --sol $(SRC_MULTISIGN)/GnosisSafe.sol --pkg $(PACKAGE) --out $(GO_OUT_MULTISIGN)/gnosisSafe.go
bep20Bin:
@abigen --sol $(SRC_BEP)/BEP20.sol --pkg $(PACKAGE) --out $(GO_OUT_BEP20)/bep20.go
clean:
@rm -fr $(GO_OUT)/*
......
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -183,6 +183,7 @@ message TokenAddress {
string address = 1;
string symbol = 2;
string chainName = 3;
int32 decimal = 4;
}
message TokenAddressArray {
......
......@@ -71,7 +71,7 @@ type Relayer4Ethereum struct {
chain33MsgChan <-chan *events.Chain33Msg
totalTxRelayFromChain33 int64
symbol2Addr map[string]common.Address
symbol2LockAddr map[string]common.Address
symbol2LockAddr map[string]ebTypes.TokenAddress
mulSignAddr string
}
......@@ -111,7 +111,7 @@ func StartEthereumRelayer(startPara *EthereumStartPara) *Relayer4Ethereum {
chain33MsgChan: startPara.Chain33MsgChan,
totalTxRelayFromChain33: 0,
symbol2Addr: make(map[string]common.Address),
symbol2LockAddr: make(map[string]common.Address),
symbol2LockAddr: make(map[string]ebTypes.TokenAddress),
}
registrAddrInDB, err := ethRelayer.getBridgeRegistryAddr()
......@@ -496,36 +496,15 @@ func (ethRelayer *Relayer4Ethereum) handleChain33Msg(chain33Msg *events.Chain33M
tokenAddr = common.HexToAddress(addr)
}
} else {
tokenAddr, exist = ethRelayer.symbol2LockAddr[prophecyClaim.Symbol]
lockedTokenInfo, exist := ethRelayer.symbol2LockAddr[prophecyClaim.Symbol]
if !exist {
//因为是burn操作,必须从允许lock的token地址中进行查询
addr, err := ethRelayer.ShowLockedTokenAddress(prophecyClaim.Symbol)
if err != nil {
panic(fmt.Sprintf("Pls create lock token in advance for token:%s", prophecyClaim.Symbol))
}
token2set := ebTypes.TokenAddress{
Address: addr,
Symbol: prophecyClaim.Symbol,
ChainName: ebTypes.EthereumBlockChainName,
}
err = ethRelayer.SetLockedTokenAddress(token2set)
if nil != err {
relayerLog.Error("handleChain33Msg", "Failed to SetLockedTokenAddress due to", err.Error())
}
tokenAddr = common.HexToAddress(addr)
}
bridgeToken, _ := generated.NewBridgeToken(tokenAddr, ethRelayer.clientSpec)
opts := &bind.CallOpts{
Pending: true,
Context: context.Background(),
}
decimal, err := bridgeToken.Decimals(opts)
if err != nil {
panic(fmt.Sprintf("Can't fetch decimal from remote for symbol:%s", prophecyClaim.Symbol))
relayerLog.Error("handleChain33Msg", "Failed to fetch locked Token Info for symbol", prophecyClaim.Symbol)
return
}
if decimal == 18 {
tokenAddr = common.HexToAddress(lockedTokenInfo.Address)
if lockedTokenInfo.Decimal == 18 {
prophecyClaim.Amount = prophecyClaim.Amount.Mul(prophecyClaim.Amount, big.NewInt(int64(1e10)))
}
}
......@@ -874,6 +853,21 @@ func (ethRelayer *Relayer4Ethereum) handleLogLockEvent(clientChainID *big.Int, c
}
}
tokenLocked, err := ethRelayer.GetLockedTokenAddress(event.Symbol)
if nil == tokenLocked {
token2set := &ebTypes.TokenAddress{
Address: event.Token.String(),
Symbol: event.Symbol,
ChainName: ebTypes.EthereumBlockChainName,
Decimal: int32(decimal),
}
err = ethRelayer.SetLockedTokenAddress(token2set)
if nil != err {
relayerLog.Error("handleChain33Msg", "Failed to SetLockedTokenAddress due to", err.Error())
return errors.New("Failed ")
}
}
// Parse the LogLock event's payload into a struct
prophecyClaim, err := ethtxs.LogLockToEthBridgeClaim(event, clientChainID.Int64(), ethRelayer.bridgeBankAddr.String(), log.TxHash.String(), int64(decimal))
if err != nil {
......
......@@ -414,7 +414,7 @@ func newEthRelayer(para *ethtxs.DeployPara, sim *ethinterface.SimExtend, x2EthCo
fetchHeightPeriodMs: cfg.EthBlockFetchPeriod,
totalTxRelayFromChain33: 0,
symbol2Addr: make(map[string]common.Address),
symbol2LockAddr: make(map[string]common.Address),
symbol2LockAddr: make(map[string]ebTypes.TokenAddress),
ethBridgeClaimChan: ethBridgeClaimchan,
chain33MsgChan: chain33Msgchan,
......
......@@ -4,6 +4,7 @@ import (
"context"
"errors"
bep20 "github.com/33cn/plugin/plugin/dapp/cross2eth/contracts/bep20/generated"
"github.com/33cn/plugin/plugin/dapp/cross2eth/contracts/contracts4eth/generated"
"github.com/33cn/plugin/plugin/dapp/cross2eth/ebrelayer/relayer/ethereum/ethinterface"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
......@@ -75,7 +76,7 @@ func IsProphecyPending(claimID [32]byte, validator common.Address, chain33Bridge
func GetBalance(client ethinterface.EthClientSpec, tokenAddr, owner string) (string, error) {
//查询ERC20余额
if tokenAddr != "" {
bridgeToken, err := generated.NewBridgeToken(common.HexToAddress(tokenAddr), client)
bep20Token, err := bep20.NewBEP20Token(common.HexToAddress(tokenAddr), client)
if nil != err {
txslog.Error("GetBalance", "generated.NewBridgeToken err:", err.Error(), "tokenAddr", tokenAddr, "owner", owner)
return "", err
......@@ -86,7 +87,7 @@ func GetBalance(client ethinterface.EthClientSpec, tokenAddr, owner string) (str
From: ownerAddr,
Context: context.Background(),
}
balance, err := bridgeToken.BalanceOf(opts, ownerAddr)
balance, err := bep20Token.BalanceOf(opts, ownerAddr)
if nil != err {
txslog.Error("GetBalance", "bridgeToken.BalanceOf err:", err.Error(), "tokenAddr", tokenAddr, "owner", owner)
return "", err
......
......@@ -244,20 +244,32 @@ func (ethRelayer *Relayer4Ethereum) SetTokenAddress(token2set ebTypes.TokenAddre
return ethRelayer.db.Set(ethTokenSymbol2AddrKey(token2set.Symbol), bytes)
}
func (ethRelayer *Relayer4Ethereum) SetLockedTokenAddress(token2set ebTypes.TokenAddress) error {
addr := common.HexToAddress(token2set.Address)
bytes := chain33Types.Encode(&token2set)
func (ethRelayer *Relayer4Ethereum) SetLockedTokenAddress(token2set *ebTypes.TokenAddress) error {
bytes := chain33Types.Encode(token2set)
ethRelayer.rwLock.Lock()
ethRelayer.symbol2LockAddr[token2set.Symbol] = addr
ethRelayer.symbol2LockAddr[token2set.Symbol] = *token2set
ethRelayer.rwLock.Unlock()
return ethRelayer.db.Set(ethTokenSymbol2LockAddrKey(token2set.Symbol), bytes)
}
func (ethRelayer *Relayer4Ethereum) GetLockedTokenAddress(symbol string) (*ebTypes.TokenAddress, error) {
ethRelayer.rwLock.RLock()
data, err := ethRelayer.db.Get(ethTokenSymbol2LockAddrKey(symbol))
ethRelayer.rwLock.RUnlock()
if nil != err {
return nil, err
}
var token2set ebTypes.TokenAddress
if err := chain33Types.Decode(data, &token2set); nil != err {
return nil, err
}
return &token2set, err
}
func (ethRelayer *Relayer4Ethereum) RestoreTokenAddress() error {
ethRelayer.rwLock.Lock()
defer ethRelayer.rwLock.Unlock()
ethRelayer.symbol2LockAddr[ebTypes.SYMBOL_ETH] = common.HexToAddress(ebTypes.EthNilAddr)
helper := dbm.NewListHelper(ethRelayer.db)
datas := helper.List(ethTokenSymbol2AddrPrefix, nil, 100, dbm.ListASC)
......@@ -273,13 +285,13 @@ func (ethRelayer *Relayer4Ethereum) RestoreTokenAddress() error {
datas = helper.List(ethTokenSymbol2LockAddrPrefix, nil, 100, dbm.ListASC)
for _, data := range datas {
var token2set ebTypes.TokenAddress
err := chain33Types.Decode(data, &token2set)
var tokenLocked ebTypes.TokenAddress
err := chain33Types.Decode(data, &tokenLocked)
if nil != err {
return err
}
relayerLog.Info("RestoreTokenAddress", "symbol", token2set.Symbol, "address", token2set.Address)
ethRelayer.symbol2LockAddr[token2set.Symbol] = common.HexToAddress(token2set.Address)
relayerLog.Info("RestoreTokenAddress", "symbol", tokenLocked.Symbol, "address", tokenLocked.Address)
ethRelayer.symbol2LockAddr[tokenLocked.Symbol] = tokenLocked
}
return nil
}
......
......@@ -7,12 +7,11 @@
package types
import (
reflect "reflect"
sync "sync"
proto "github.com/golang/protobuf/proto"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
......
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