6 "github.com/vapor/consensus/segwit"
7 "github.com/vapor/errors"
8 "github.com/vapor/protocol/bc"
9 "github.com/vapor/protocol/bc/types"
20 FromAssetID *bc.AssetID
26 type OrderSlice []*Order
28 func (o OrderSlice) Len() int {
31 func (o OrderSlice) Swap(i, j int) {
32 o[i], o[j] = o[j], o[i]
34 func (o OrderSlice) Less(i, j int) bool {
35 return o[i].Rate < o[j].Rate
38 func NewOrderFromOutput(tx *types.Tx, outputIndex int) (*Order, error) {
39 outputID := tx.OutputID(outputIndex)
40 output, err := tx.IntraChainOutput(*outputID)
45 contractArgs, err := segwit.DecodeP2WMCProgram(output.ControlProgram.Code)
50 assetAmount := output.Source.Value
52 FromAssetID: assetAmount.AssetId,
53 ToAssetID: &contractArgs.RequestedAsset,
54 Rate: float64(contractArgs.RatioNumerator) / float64(contractArgs.RatioDenominator),
56 SourceID: output.Source.Ref,
57 Amount: assetAmount.Amount,
58 SourcePos: uint64(outputIndex),
59 ControlProgram: output.ControlProgram.Code,
64 func NewOrderFromInput(tx *types.Tx, inputIndex int) (*Order, error) {
65 input, ok := tx.Inputs[inputIndex].TypedInput.(*types.SpendInput)
67 return nil, errors.New("input is not type of spend input")
70 contractArgs, err := segwit.DecodeP2WMCProgram(input.ControlProgram)
76 FromAssetID: input.AssetId,
77 ToAssetID: &contractArgs.RequestedAsset,
78 Rate: float64(contractArgs.RatioNumerator) / float64(contractArgs.RatioDenominator),
80 SourceID: &input.SourceID,
82 SourcePos: input.SourcePosition,
83 ControlProgram: input.ControlProgram,
88 func (o *Order) GetTradePair() *TradePair {
89 return &TradePair{FromAssetID: o.FromAssetID, ToAssetID: o.ToAssetID}
92 func (o *Order) Key() string {
93 return fmt.Sprintf("%s:%d", o.Utxo.SourceID, o.Utxo.SourcePos)
96 type TradePair struct {
97 FromAssetID *bc.AssetID
102 func (t *TradePair) Reverse() *TradePair {
104 FromAssetID: t.ToAssetID,
105 ToAssetID: t.FromAssetID,
109 func (t *TradePair) Key() string {
110 return fmt.Sprintf("%s:%s", t.FromAssetID, t.ToAssetID)
113 type MovDatabaseState struct {