import (
"encoding/hex"
"fmt"
+ "math/big"
"github.com/bytom/vapor/consensus/segwit"
"github.com/bytom/vapor/errors"
// Order store all the order information
type Order struct {
- FromAssetID *bc.AssetID
- ToAssetID *bc.AssetID
- Utxo *MovUtxo
- Rate float64
+ FromAssetID *bc.AssetID
+ ToAssetID *bc.AssetID
+ Utxo *MovUtxo
+ RatioNumerator int64
+ RatioDenominator int64
+}
+
+func (o *Order) Rate() float64 {
+ if o.RatioDenominator == 0 {
+ return 0
+ }
+ rate := big.NewFloat(0).SetInt64(o.RatioNumerator)
+ rate.Quo(rate, big.NewFloat(0).SetInt64(o.RatioDenominator))
+ result, _ := rate.Float64()
+ return result
}
// OrderSlice is define for order's sort
func (o OrderSlice) Len() int { return len(o) }
func (o OrderSlice) Swap(i, j int) { o[i], o[j] = o[j], o[i] }
func (o OrderSlice) Less(i, j int) bool {
- if o[i].Rate == o[j].Rate {
+ if o[i].Rate() == o[j].Rate() {
return hex.EncodeToString(o[i].UTXOHash().Bytes()) < hex.EncodeToString(o[j].UTXOHash().Bytes())
}
- return o[i].Rate < o[j].Rate
+ return o[i].Rate() < o[j].Rate()
}
// NewOrderFromOutput convert txinput to order
assetAmount := output.Source.Value
return &Order{
- FromAssetID: assetAmount.AssetId,
- ToAssetID: &contractArgs.RequestedAsset,
- Rate: float64(contractArgs.RatioNumerator) / float64(contractArgs.RatioDenominator),
+ FromAssetID: assetAmount.AssetId,
+ ToAssetID: &contractArgs.RequestedAsset,
+ RatioNumerator: contractArgs.RatioNumerator,
+ RatioDenominator: contractArgs.RatioDenominator,
Utxo: &MovUtxo{
SourceID: output.Source.Ref,
Amount: assetAmount.Amount,
}
return &Order{
- FromAssetID: input.AssetId,
- ToAssetID: &contractArgs.RequestedAsset,
- Rate: float64(contractArgs.RatioNumerator) / float64(contractArgs.RatioDenominator),
+ FromAssetID: input.AssetId,
+ ToAssetID: &contractArgs.RequestedAsset,
+ RatioNumerator: contractArgs.RatioNumerator,
+ RatioDenominator: contractArgs.RatioDenominator,
Utxo: &MovUtxo{
SourceID: &input.SourceID,
Amount: input.Amount,