type MovStore interface {
GetMovDatabaseState() (*common.MovDatabaseState, error)
+ InitDBState(height uint64, hash *bc.Hash) error
ListOrders(orderAfter *common.Order) ([]*common.Order, error)
ListTradePairsWithStart(fromAssetIDAfter, toAssetIDAfter *bc.AssetID) ([]*common.TradePair, error)
ProcessOrders(addOrders []*common.Order, delOrders []*common.Order, blockHeader *types.BlockHeader) error
db dbm.DB
}
-func NewLevelDBMovStore(db dbm.DB, height uint64, hash *bc.Hash) (*LevelDBMovStore, error) {
- if value := db.Get(bestMatchStore); value == nil {
- state := &common.MovDatabaseState{Height: height, Hash: hash}
- value, err := json.Marshal(state)
- if err != nil {
- return nil, err
- }
+func NewLevelDBMovStore(db dbm.DB, ) *LevelDBMovStore {
+ return &LevelDBMovStore{db: db}
+}
- db.Set(bestMatchStore, value)
+func (m *LevelDBMovStore) InitDBState(height uint64, hash *bc.Hash) error {
+ state := &common.MovDatabaseState{Height: height, Hash: hash}
+ value, err := json.Marshal(state)
+ if err != nil {
+ return err
}
- return &LevelDBMovStore{db: db}, nil
+
+ m.db.Set(bestMatchStore, value)
+ return nil
}
func (m *LevelDBMovStore) ListOrders(orderAfter *common.Order) ([]*common.Order, error) {
defer os.RemoveAll("temp")
for i, c := range cases {
testDB := dbm.NewDB("testdb", "leveldb", "temp")
- movStore, err := NewLevelDBMovStore(testDB, height, &hash)
- if err != nil {
- t.Fatalf("case %d: NewMovStore error %v.", i, err)
+ movStore := NewLevelDBMovStore(testDB)
+ if err := movStore.InitDBState(height, &hash); err != nil {
+ t.Fatalf("case %d: InitDBState error %v.", i, err)
}
batch := movStore.db.NewBatch()
defer os.RemoveAll("temp")
for i, c := range cases {
testDB := dbm.NewDB("testdb", "leveldb", "temp")
- movStore, err := NewLevelDBMovStore(testDB, height, &hash)
- if err != nil {
- t.Fatalf("case %d: NewMovStore error %v.", i, err)
+ movStore := NewLevelDBMovStore(testDB)
+ if err := movStore.InitDBState(height, &hash); err != nil {
+ t.Fatalf("case %d: InitDBState error %v.", i, err)
}
batch := movStore.db.NewBatch()
defer os.RemoveAll("temp")
for i, c := range cases {
testDB := dbm.NewDB("testdb", "leveldb", "temp")
- movStore, err := NewLevelDBMovStore(testDB, height, &hash)
- if err != nil {
- t.Fatalf("case %d: NewMovStore error %v.", i, err)
+ movStore := NewLevelDBMovStore(testDB)
+ if err := movStore.InitDBState(height, &hash); err != nil {
+ t.Fatalf("case %d: InitDBState error %v.", i, err)
}
batch := movStore.db.NewBatch()
defer os.RemoveAll("temp")
for i, c := range cases {
testDB := dbm.NewDB("testdb", "leveldb", "temp")
- movStore, err := NewLevelDBMovStore(testDB, height, &hash)
- if err != nil {
- t.Fatalf("case %d: NewMovStore error %v.", i, err)
+ movStore := NewLevelDBMovStore(testDB)
+ if err := movStore.InitDBState(height, &hash); err != nil {
+ t.Fatalf("case %d: InitDBState error %v.", i, err)
}
batch := movStore.db.NewBatch()
defer os.RemoveAll("temp")
for i, c := range cases {
testDB := dbm.NewDB("testdb", "leveldb", "temp")
- movStore, err := NewLevelDBMovStore(testDB, height, &hash)
- if err != nil {
- t.Fatalf("case %d: NewMovStore error %v.", i, err)
+ movStore := NewLevelDBMovStore(testDB)
+ if err := movStore.InitDBState(height, &hash); err != nil {
+ t.Fatalf("case %d: InitDBState error %v.", i, err)
}
batch := movStore.db.NewBatch()
defer os.RemoveAll("temp")
for i, c := range cases {
testDB := dbm.NewDB("testdb", "leveldb", "temp")
- movStore, err := NewLevelDBMovStore(testDB, height, &hash)
- if err != nil {
- t.Fatalf("case %d: NewMovStore error %v.", i, err)
+ movStore := NewLevelDBMovStore(testDB)
+ if err := movStore.InitDBState(height, &hash); err != nil {
+ t.Fatalf("case %d: InitDBState error %v.", i, err)
}
batch := movStore.db.NewBatch()
defer os.RemoveAll("temp")
for i, c := range cases {
testDB := dbm.NewDB("testdb", "leveldb", "temp")
- movStore, err := NewLevelDBMovStore(testDB, height, &hash)
- if err != nil {
- t.Fatalf("case %d: NewMovStore error %v.", i, err)
+ movStore := NewLevelDBMovStore(testDB)
+ if err := movStore.InitDBState(height, &hash); err != nil {
+ t.Fatalf("case %d: InitDBState error %v.", i, err)
}
batch := movStore.db.NewBatch()
requestAmount := calcRequestAmount(order.Utxo.Amount, contractArgs)
receiveAmount := vprMath.MinUint64(requestAmount, oppositeAmount)
shouldPayAmount := CalcShouldPayAmount(receiveAmount, contractArgs)
- isPartialTrade := order.Utxo.Amount > shouldPayAmount
+ isPartialTrade := requestAmount > receiveAmount
setMatchTxArguments(txInput, isPartialTrade, len(txData.Outputs), receiveAmount)
txData.Outputs = append(txData.Outputs, types.NewIntraChainOutput(*order.ToAssetID, receiveAmount, contractArgs.SellerProgram))
// minus the amount of seller's receiving output
if _, ok := sellerProgramMap[hex.EncodeToString(output.ControlProgram())]; ok {
assetID := *output.AssetAmount().AssetId
- assetFeeMap[assetID].FeeAmount -= int64(output.AssetAmount().Amount)
- if assetFeeMap[assetID].FeeAmount == 0 {
+ fee, ok := assetFeeMap[assetID]
+ if !ok {
+ continue
+ }
+ fee.FeeAmount -= int64(output.AssetAmount().Amount)
+ if fee.FeeAmount == 0 {
delete(assetFeeMap, assetID)
}
}
"github.com/vapor/application/mov/database"
"github.com/vapor/application/mov/match"
"github.com/vapor/consensus/segwit"
+ dbm "github.com/vapor/database/leveldb"
"github.com/vapor/errors"
"github.com/vapor/math/checked"
"github.com/vapor/protocol/bc"
movStore database.MovStore
}
-func NewMovCore(store database.MovStore) *MovCore {
- return &MovCore{movStore: store}
+func NewMovCore(dbBackend, dbDir string) *MovCore {
+ movDB := dbm.NewDB("mov", dbBackend, dbDir)
+ return &MovCore{movStore: database.NewLevelDBMovStore(movDB)}
+}
+
+func (m *MovCore) Name() string {
+ return "MOV"
+}
+
+func (m *MovCore) InitChainStatus(blockHeight uint64, blockHash *bc.Hash) error {
+ return m.movStore.InitDBState(blockHeight, blockHash)
}
// ChainStatus return the current block height and block hash in dex core