status-go/services/wallet/bridge/bridge.go

101 lines
3.2 KiB
Go
Raw Normal View History

2022-09-13 07:10:59 +00:00
package bridge
import (
"math/big"
2022-11-22 13:49:29 +00:00
ethTypes "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
2022-09-13 07:10:59 +00:00
"github.com/status-im/status-go/account"
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/services/wallet/token"
"github.com/status-im/status-go/transactions"
)
const IncreaseEstimatedGasFactor = 1.1
2022-11-22 13:49:29 +00:00
func getSigner(chainID uint64, from types.Address, verifiedAccount *account.SelectedExtKey) bind.SignerFn {
return func(addr common.Address, tx *ethTypes.Transaction) (*ethTypes.Transaction, error) {
s := ethTypes.NewLondonSigner(new(big.Int).SetUint64(chainID))
return ethTypes.SignTx(tx, s, verifiedAccount.AccountKey.PrivateKey)
}
}
2022-09-13 07:10:59 +00:00
type TransactionBridge struct {
2023-08-24 08:45:14 +00:00
BridgeName string
ChainID uint64
TransferTx *transactions.SendTxArgs
HopTx *HopTxArgs
CbridgeTx *CBridgeTxArgs
ERC721TransferTx *ERC721TransferTxArgs
2022-09-13 07:10:59 +00:00
}
func (t *TransactionBridge) Value() *big.Int {
2023-08-24 08:45:14 +00:00
if t.TransferTx != nil && t.TransferTx.To != nil {
return t.TransferTx.Value.ToInt()
2022-09-13 07:10:59 +00:00
} else if t.HopTx != nil {
return t.HopTx.Amount.ToInt()
2022-11-22 13:49:29 +00:00
} else if t.CbridgeTx != nil {
return t.CbridgeTx.Amount.ToInt()
2023-08-24 08:45:14 +00:00
} else if t.ERC721TransferTx != nil {
return big.NewInt(1)
2022-09-13 07:10:59 +00:00
}
return big.NewInt(0)
}
func (t *TransactionBridge) From() types.Address {
2023-08-24 08:45:14 +00:00
if t.TransferTx != nil && t.TransferTx.To != nil {
return t.TransferTx.From
2022-09-13 07:10:59 +00:00
} else if t.HopTx != nil {
return t.HopTx.From
2022-11-22 13:49:29 +00:00
} else if t.CbridgeTx != nil {
return t.CbridgeTx.From
2023-08-24 08:45:14 +00:00
} else if t.ERC721TransferTx != nil {
return t.ERC721TransferTx.From
2022-09-13 07:10:59 +00:00
}
return types.HexToAddress("0x0")
}
func (t *TransactionBridge) To() types.Address {
2023-08-24 08:45:14 +00:00
if t.TransferTx != nil && t.TransferTx.To != nil {
return *t.TransferTx.To
2022-09-13 07:10:59 +00:00
} else if t.HopTx != nil {
return types.Address(t.HopTx.Recipient)
2022-11-22 13:49:29 +00:00
} else if t.CbridgeTx != nil {
return types.Address(t.HopTx.Recipient)
2023-08-24 08:45:14 +00:00
} else if t.ERC721TransferTx != nil {
return types.Address(t.ERC721TransferTx.Recipient)
2022-09-13 07:10:59 +00:00
}
return types.HexToAddress("0x0")
}
func (t *TransactionBridge) Data() types.HexBytes {
2023-08-24 08:45:14 +00:00
if t.TransferTx != nil && t.TransferTx.To != nil {
return t.TransferTx.Data
2022-09-13 07:10:59 +00:00
} else if t.HopTx != nil {
return types.HexBytes("")
2022-11-22 13:49:29 +00:00
} else if t.CbridgeTx != nil {
return types.HexBytes("")
2023-08-24 08:45:14 +00:00
} else if t.ERC721TransferTx != nil {
return types.HexBytes("")
2022-09-13 07:10:59 +00:00
}
return types.HexBytes("")
}
type Bridge interface {
Name() string
Can(from *params.Network, to *params.Network, token *token.Token, balance *big.Int) (bool, error)
CalculateFees(from, to *params.Network, token *token.Token, amountIn *big.Int, nativeTokenPrice, tokenPrice float64, gasPrice *big.Float) (*big.Int, *big.Int, error)
EstimateGas(fromNetwork *params.Network, toNetwork *params.Network, from common.Address, to common.Address, token *token.Token, amountIn *big.Int) (uint64, error)
2022-09-13 07:10:59 +00:00
CalculateAmountOut(from, to *params.Network, amountIn *big.Int, symbol string) (*big.Int, error)
Send(sendArgs *TransactionBridge, verifiedAccount *account.SelectedExtKey) (types.Hash, error)
2022-12-19 12:37:37 +00:00
GetContractAddress(network *params.Network, token *token.Token) *common.Address
BuildTransaction(sendArgs *TransactionBridge) (*ethTypes.Transaction, error)
2022-09-13 07:10:59 +00:00
}