tokens

package
v0.2.16 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2020 License: GPL-3.0 Imports: 6 Imported by: 5

README

How to add bridge support of new blockchain

1. create a new directory for each block chain

for example, btc, eth, fsn etc.

2. implement methods in CrossChainBridge interface

IsSrcEndpoint() bool

IsSrcEndpoint returns true if this bridge is on the source block chain, otherwise returns false.


GetTokenAndGateway() (*TokenConfig, *GatewayConfig)

GetTokenAndGateway get token and gateway config.


SetTokenAndGateway(tokenCfg *TokenConfig, gatewayCfg *GatewayConfig, check bool)

SetTokenAndGateway set token and gateway config and check it if required.


VerifyConfig()

VerifyConfig verify token config.


IsValidAddress(address string) bool

IsValidAddress check if given address is valid.


GetTransaction(txHash string) (interface{}, error)

GetTransaction get transaction by hash.


GetTransactionStatus(txHash string) *TxStatus

GetTransactionStatus get transaction status by hash.


VerifyTransaction(txHash string, allowUnstable bool) (*TxSwapInfo, error)

VerifyTransaction verify transaction by hash and according to allowUnstable flag.


VerifyMsgHash(rawTx interface{}, msgHash []string, extra interface{}) error

VerifyMsgHash verify message hash of rawtx in DCRM signing.


BuildRawTransaction(args *BuildTxArgs) (rawTx interface{}, err error)

BuildRawTransaction build raw transaction for swapin/swapout.


DcrmSignTransaction(rawTx interface{}, args *BuildTxArgs) (signedTx interface{}, txHash string, err error)

DcrmSignTransaction sign transaction in DCRM way.


SendTransaction(signedTx interface{}) (txHash string, err error)

SendTransaction send/broadcast signed transaction.


GetLatestBlockNumber() (uint64, error)

GetLatestBlockNumber get the latest block number.


GetLatestBlockNumberOf(apiAddress string) (uint64, error)

GetLatestBlockNumberOf get the latest block number by connecting to specified full node RPC address.


StartPoolTransactionScanJob()

StartPoolTransactionScanJob start scan pool transaction and auto register found swapin or swapout of this bridge.


StartChainTransactionScanJob()

StartChainTransactionScanJob start scan chain transaction and auto register found swapin or swapout of this bridge.


StartSwapHistoryScanJob()

StartSwapHistoryScanJob start scan transaction history of given contract address and auto register found swapin or swapout of this bridge.


GetBalance(accountAddress string) (*big.Int, error)

GetBalance get coin balance of given account address.


GetTokenBalance(tokenType, tokenAddress, accountAddress string) (*big.Int, error)

GetTokenBalance get token balance of given token and account.


GetTokenSupply(tokenType, tokenAddress string) (*big.Int, error)

GetTokenSupply get token total supply of give token.


3. other possible way

Because some chain are forked from already implemented blockchain, we can derive from this implemented bridge and update some interface implement.

For example, fsn is forked from eth. So we derive fsn bridge from eth bridge and update some chain verify, and then fsn is also supported now as it has implememted all the required methods in CrossChainBridge interface.

Documentation

Index

Constants

View Source
const (
	LockMemoPrefix   = "SWAPTO:"
	UnlockMemoPrefix = "SWAPTX:"
)

transaction memo prefix

Variables

View Source
var (
	SrcBridge CrossChainBridge
	DstBridge CrossChainBridge

	SrcLatestBlockHeight uint64
	DstLatestBlockHeight uint64
)

common variables

View Source
var (
	ErrSwapTypeNotSupported          = errors.New("swap type not supported in this endpoint")
	ErrBridgeSourceNotSupported      = errors.New("bridge source not supported")
	ErrBridgeDestinationNotSupported = errors.New("bridge destination not supported")
	ErrUnknownSwapType               = errors.New("unknown swap type")
	ErrMsgHashMismatch               = errors.New("message hash mismatch")
	ErrWrongCountOfMsgHashes         = errors.New("wrong count of msg hashed")
	ErrWrongRawTx                    = errors.New("wrong raw tx")
	ErrWrongExtraArgs                = errors.New("wrong extra args")
	ErrNoBtcBridge                   = errors.New("no btc bridge exist")
	ErrWrongSwapinTxType             = errors.New("wrong swapin tx type")
	ErrBuildSwapTxInWrongEndpoint    = errors.New("build swap in/out tx in wrong endpoint")
	ErrTxBeforeInitialHeight         = errors.New("transaction before initial block height")
	ErrAddressIsInBlacklist          = errors.New("address is in black list")

	ErrTodo = errors.New("developing: TODO")

	ErrTxNotFound           = errors.New("tx not found")
	ErrTxNotStable          = errors.New("tx not stable")
	ErrTxWithWrongReceiver  = errors.New("tx with wrong receiver")
	ErrTxWithWrongContract  = errors.New("tx with wrong contract")
	ErrTxWithWrongInput     = errors.New("tx with wrong input data")
	ErrTxWithWrongLogData   = errors.New("tx with wrong log data")
	ErrTxIsAggregateTx      = errors.New("tx is aggregate tx")
	ErrWrongP2shBindAddress = errors.New("wrong p2sh bind address")
	ErrTxFuncHashMismatch   = errors.New("tx func hash mismatch")
	ErrDepositLogNotFound   = errors.New("deposit log not found or removed")
	ErrSwapoutLogNotFound   = errors.New("swapout log not found or removed")

	// errors should register
	ErrTxWithWrongMemo       = errors.New("tx with wrong memo")
	ErrTxWithWrongValue      = errors.New("tx with wrong value")
	ErrTxWithWrongReceipt    = errors.New("tx with wrong receipt")
	ErrTxWithWrongSender     = errors.New("tx with wrong sender")
	ErrTxSenderNotRegistered = errors.New("tx sender not registered")
	ErrTxIncompatible        = errors.New("tx incompatible")
	ErrBindAddrIsContract    = errors.New("bind address is contract")
	ErrRPCQueryError         = errors.New("rpc query error")
)

common errors

View Source
var (
	BtcMinRelayFee   int64 = 400
	BtcRelayFeePerKb int64 = 2000
	BtcFromPublicKey string

	BtcUtxoAggregateMinCount  = 20
	BtcUtxoAggregateMinValue  = uint64(1000000)
	BtcUtxoAggregateToAddress = ""
)

btc extra default values

Functions

func CalcSwappedValue

func CalcSwappedValue(value *big.Int, isSrc bool) *big.Int

CalcSwappedValue calc swapped value (get rid of fee)

func CheckSwapValue

func CheckSwapValue(value *big.Int, isSrc bool) bool

CheckSwapValue check swap value is in right range

func FromBits

func FromBits(value *big.Int, decimals uint8) float64

FromBits convert from bits

func GetBigValueThreshold

func GetBigValueThreshold(isSrc bool) *big.Int

GetBigValueThreshold get big value threshold

func SetLatestBlockHeight

func SetLatestBlockHeight(latest uint64, isSrc bool)

SetLatestBlockHeight set latest block height

func ShouldRegisterSwapForError

func ShouldRegisterSwapForError(err error) bool

ShouldRegisterSwapForError return true if this error should record in database

func ToBits

func ToBits(value float64, decimals uint8) *big.Int

ToBits convert to bits

Types

type AllExtras

type AllExtras struct {
	BtcExtra *BtcExtraArgs `json:"btcExtra,omitempty"`
	EthExtra *EthExtraArgs `json:"ethExtra,omitempty"`
}

AllExtras struct

type BtcExtraArgs

type BtcExtraArgs struct {
	RelayFeePerKb *int64  `json:"relayFeePerKb,omitempty"`
	ChangeAddress *string `json:"changeAddress,omitempty"`
	FromPublicKey *string `json:"fromPublickey,omitempty"`

	PreviousOutPoints []*BtcOutPoint `json:"previousOutPoints,omitempty"`
}

BtcExtraArgs struct

type BtcExtraConfig

type BtcExtraConfig struct {
	MinRelayFee            int64
	RelayFeePerKb          int64
	FromPublicKey          string
	UtxoAggregateMinCount  int
	UtxoAggregateMinValue  uint64
	UtxoAggregateToAddress string
}

BtcExtraConfig used to build swpout to btc tx

type BtcOutPoint

type BtcOutPoint struct {
	Hash  string `json:"hash"`
	Index uint32 `json:"index"`
}

BtcOutPoint struct

type BuildTxArgs

type BuildTxArgs struct {
	SwapInfo `json:"swapInfo,omitempty"`
	From     string     `json:"from,omitempty"`
	To       string     `json:"to,omitempty"`
	Value    *big.Int   `json:"value,omitempty"`
	Memo     string     `json:"memo,omitempty"`
	Input    *[]byte    `json:"input,omitempty"`
	Extra    *AllExtras `json:"extra,omitempty"`
}

BuildTxArgs struct

func (*BuildTxArgs) GetExtraArgs

func (args *BuildTxArgs) GetExtraArgs() *BuildTxArgs

GetExtraArgs get extra args

func (*BuildTxArgs) GetTxNonce

func (args *BuildTxArgs) GetTxNonce() uint64

GetTxNonce get tx nonce

type CrossChainBridge

type CrossChainBridge interface {
	IsSrcEndpoint() bool
	GetTokenAndGateway() (*TokenConfig, *GatewayConfig)
	SetTokenAndGateway(tokenCfg *TokenConfig, gatewayCfg *GatewayConfig, check bool)

	VerifyConfig()
	IsValidAddress(address string) bool

	GetTransaction(txHash string) (interface{}, error)
	GetTransactionStatus(txHash string) *TxStatus
	VerifyTransaction(txHash string, allowUnstable bool) (*TxSwapInfo, error)
	VerifyMsgHash(rawTx interface{}, msgHash []string, extra interface{}) error

	BuildRawTransaction(args *BuildTxArgs) (rawTx interface{}, err error)
	DcrmSignTransaction(rawTx interface{}, args *BuildTxArgs) (signedTx interface{}, txHash string, err error)
	SendTransaction(signedTx interface{}) (txHash string, err error)

	GetLatestBlockNumber() (uint64, error)
	GetLatestBlockNumberOf(apiAddress string) (uint64, error)

	StartPoolTransactionScanJob()
	StartChainTransactionScanJob()
	StartSwapHistoryScanJob()

	GetBalance(accountAddress string) (*big.Int, error)
	GetTokenBalance(tokenType, tokenAddress, accountAddress string) (*big.Int, error)
	GetTokenSupply(tokenType, tokenAddress string) (*big.Int, error)
}

CrossChainBridge interface (common interface)

func GetCrossChainBridge

func GetCrossChainBridge(isSrc bool) CrossChainBridge

GetCrossChainBridge get bridge of specified endpoint

type CrossChainBridgeBase

type CrossChainBridgeBase struct {
	TokenConfig   *TokenConfig
	GatewayConfig *GatewayConfig
	IsSrc         bool
}

CrossChainBridgeBase base bridge

func NewCrossChainBridgeBase

func NewCrossChainBridgeBase(isSrc bool) *CrossChainBridgeBase

NewCrossChainBridgeBase new base bridge

func (*CrossChainBridgeBase) GetTokenAndGateway

func (b *CrossChainBridgeBase) GetTokenAndGateway() (*TokenConfig, *GatewayConfig)

GetTokenAndGateway get token and gateway config

func (*CrossChainBridgeBase) IsSrcEndpoint

func (b *CrossChainBridgeBase) IsSrcEndpoint() bool

IsSrcEndpoint returns if bridge is at the source endpoint

func (*CrossChainBridgeBase) SetTokenAndGateway

func (b *CrossChainBridgeBase) SetTokenAndGateway(tokenCfg *TokenConfig, gatewayCfg *GatewayConfig, check bool)

SetTokenAndGateway set token and gateway config

type EthExtraArgs

type EthExtraArgs struct {
	Gas      *uint64  `json:"gas,omitempty"`
	GasPrice *big.Int `json:"gasPrice,omitempty"`
	Nonce    *uint64  `json:"nonce,omitempty"`
}

EthExtraArgs struct

type GatewayConfig

type GatewayConfig struct {
	APIAddress []string
}

GatewayConfig struct

type NonceSetter

type NonceSetter interface {
	GetPoolNonce(address, height string) (uint64, error)
	SetNonce(value uint64)
	AdjustNonce(value uint64) (nonce uint64)
	IncreaseNonce(value uint64)
}

NonceSetter interface (for eth-like)

type P2shAddressInfo

type P2shAddressInfo struct {
	BindAddress        string
	P2shAddress        string
	RedeemScript       string
	RedeemScriptDisasm string
}

P2shAddressInfo struct

type SwapInfo

type SwapInfo struct {
	SwapID     string     `json:"swapid,omitempty"`
	SwapType   SwapType   `json:"swaptype,omitempty"`
	TxType     SwapTxType `json:"txtype,omitempty"`
	Bind       string     `json:"bind,omitempty"`
	Identifier string     `json:"identifier,omitempty"`
}

SwapInfo struct

type SwapTxType

type SwapTxType uint32

SwapTxType type

const (
	SwapinTx     SwapTxType = iota // 0
	SwapoutTx                      // 1
	P2shSwapinTx                   // 2
)

SwapTxType constants

func (SwapTxType) String

func (s SwapTxType) String() string

type SwapType

type SwapType uint32

SwapType type

const (
	NoSwapType SwapType = iota
	SwapinType
	SwapoutType
)

SwapType constants

func (SwapType) String

func (s SwapType) String() string

type TokenConfig

type TokenConfig struct {
	BlockChain             string
	NetID                  string
	ID                     string `json:",omitempty"`
	Name                   string
	Symbol                 string
	Decimals               *uint8
	Description            string `json:",omitempty"`
	DepositAddress         string `json:",omitempty"`
	DcrmAddress            string
	ContractAddress        string `json:",omitempty"`
	Confirmations          *uint64
	MaximumSwap            *float64 // whole unit (eg. BTC, ETH, FSN), not Satoshi
	MinimumSwap            *float64 // whole unit
	BigValueThreshold      *float64
	SwapFeeRate            *float64
	MaximumSwapFee         *float64
	MinimumSwapFee         *float64
	InitialHeight          uint64
	PlusGasPricePercentage uint64 `json:",omitempty"`
	DisableSwap            bool
	// contains filtered or unexported fields
}

TokenConfig struct

func GetTokenConfig

func GetTokenConfig(isSrc bool) *TokenConfig

GetTokenConfig get token config of specified endpoint

func (*TokenConfig) CalcAndStoreValue

func (c *TokenConfig) CalcAndStoreValue()

CalcAndStoreValue calc and store value (minus duplicate calculation)

func (*TokenConfig) CheckConfig

func (c *TokenConfig) CheckConfig(isSrc bool) error

CheckConfig check config

func (*TokenConfig) IsErc20

func (c *TokenConfig) IsErc20() bool

IsErc20 return is token is erc20

type TxStatus

type TxStatus struct {
	Receipt       interface{} `json:"receipt,omitempty"`
	Confirmations uint64      `json:"confirmations"`
	BlockHeight   uint64      `json:"block_height"`
	BlockHash     string      `json:"block_hash"`
	BlockTime     uint64      `json:"block_time"`
}

TxStatus struct

type TxSwapInfo

type TxSwapInfo struct {
	Hash      string   `json:"hash"`
	Height    uint64   `json:"height"`
	Timestamp uint64   `json:"timestamp"`
	From      string   `json:"from"`
	To        string   `json:"to"`
	Bind      string   `json:"bind"`
	Value     *big.Int `json:"value"`
}

TxSwapInfo struct

Directories

Path Synopsis
btc

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL