// NewEngine return a new Engine
func NewEngine(orderBook *OrderBook, rewardProgram []byte) *Engine {
- return &Engine{
- orderBook: orderBook,
- feeStrategy: NewDefaultFeeStrategy(),
- rewardProgram: rewardProgram,
- }
+ return &Engine{orderBook: orderBook, feeStrategy: NewDefaultFeeStrategy(), rewardProgram: rewardProgram}
}
// HasMatchedTx check does the input trade pair can generate a match deal
receivedAmounts, priceDiffs := CalcReceivedAmount(orders)
allocatedAssets := e.feeStrategy.Allocate(receivedAmounts, isMakers)
- partialOrders, err := addMatchTxOutput(txData, orders, receivedAmounts, allocatedAssets)
+ partialOrders, err := addMatchTxOutput(txData, orders, receivedAmounts, allocatedAssets, isMakers)
if err != nil {
return nil, nil, err
}
return types.NewTx(*txData), partialOrders, nil
}
-func addMatchTxOutput(txData *types.TxData, orders []*common.Order, receivedAmounts []*bc.AssetAmount, allocatedAssets *AllocatedAssets) ([]*common.Order, error) {
+func addMatchTxOutput(txData *types.TxData, orders []*common.Order, receivedAmounts []*bc.AssetAmount, allocatedAssets *AllocatedAssets, isMakers []bool) ([]*common.Order, error) {
var partialOrders []*common.Order
for i, order := range orders {
contractArgs := order.ContractArgs
exchangeAmount := order.Utxo.Amount - shouldPayAmount
isPartialTrade := requestAmount > receivedAmount && CalcRequestAmount(exchangeAmount, contractArgs.RatioNumerator, contractArgs.RatioDenominator) >= 1
- setMatchTxArguments(txData.Inputs[i], isPartialTrade, len(txData.Outputs), receivedAmount)
+ setMatchTxArguments(txData.Inputs[i], isPartialTrade, len(txData.Outputs), receivedAmount, isMakers[i])
+
txData.Outputs = append(txData.Outputs, types.NewIntraChainOutput(*order.ToAssetID, allocatedAssets.Receives[i].Amount, contractArgs.SellerProgram))
if isPartialTrade {
txData.Outputs = append(txData.Outputs, types.NewIntraChainOutput(*order.FromAssetID, exchangeAmount, order.Utxo.ControlProgram))
return order.BlockHeight < oppositeOrder.BlockHeight
}
-func setMatchTxArguments(txInput *types.TxInput, isPartialTrade bool, position int, receiveAmounts uint64) {
+func setMatchTxArguments(txInput *types.TxInput, isPartialTrade bool, position int, receiveAmounts uint64, isMaker bool) {
+ traderType := contract.Taker
+ if isMaker {
+ traderType = contract.Maker
+ }
+
var arguments [][]byte
if isPartialTrade {
- arguments = [][]byte{vm.Int64Bytes(int64(receiveAmounts)), vm.Int64Bytes(int64(position)), vm.Int64Bytes(contract.PartialTradeClauseSelector)}
+ arguments = [][]byte{vm.Int64Bytes(int64(receiveAmounts)), vm.Int64Bytes(int64(position)), vm.Int64Bytes(contract.PartialTradeClauseSelector), vm.Int64Bytes(traderType)}
} else {
- arguments = [][]byte{vm.Int64Bytes(int64(position)), vm.Int64Bytes(contract.FullTradeClauseSelector)}
+ arguments = [][]byte{vm.Int64Bytes(int64(position)), vm.Int64Bytes(contract.FullTradeClauseSelector), vm.Int64Bytes(traderType)}
}
txInput.SetArguments(arguments)
}