diff --git a/client/db/bolt/db.go b/client/db/bolt/db.go index 4ccf97259d..4076aa17bd 100644 --- a/client/db/bolt/db.go +++ b/client/db/bolt/db.go @@ -704,6 +704,16 @@ func decodeOrderBucket(oid []byte, oBkt *bbolt.Bucket) (*dexdb.MetaOrder, error) var linkedID order.OrderID copy(linkedID[:], oBkt.Get(linkedKey)) + // Old cancel orders may not have a maxFeeRate set since the v2 upgrade + // doesn't set it for cancel orders. + var maxFeeRate uint64 + if maxFeeRateB := oBkt.Get(maxFeeRateKey); len(maxFeeRateB) == 8 { + maxFeeRate = intCoder.Uint64(maxFeeRateB) + } else if ord.Type() != order.CancelOrderType { + // Cancel orders should use zero, but trades need a non-zero value. + maxFeeRate = ^uint64(0) // should not happen for trade orders after v2 upgrade + } + return &dexdb.MetaOrder{ MetaData: &dexdb.OrderMetaData{ Proof: *proof, @@ -712,7 +722,7 @@ func decodeOrderBucket(oid []byte, oBkt *bbolt.Bucket) (*dexdb.MetaOrder, error) ChangeCoin: getCopy(oBkt, changeKey), LinkedOrder: linkedID, SwapFeesPaid: intCoder.Uint64(oBkt.Get(swapFeesKey)), - MaxFeeRate: intCoder.Uint64(oBkt.Get(maxFeeRateKey)), + MaxFeeRate: maxFeeRate, RedemptionFeesPaid: intCoder.Uint64(oBkt.Get(redemptionFeesKey)), }, Order: ord, diff --git a/client/db/bolt/upgrades.go b/client/db/bolt/upgrades.go index 43af01be33..bfe3f9d3f6 100644 --- a/client/db/bolt/upgrades.go +++ b/client/db/bolt/upgrades.go @@ -137,8 +137,8 @@ func v1Upgrade(dbtx *bbolt.Tx) error { } // v2Upgrade adds a MaxFeeRate field to the OrderMetaData. The upgrade sets the -// MaxFeeRate field for all historical orders to the max uint64. This avoids any -// chance of rejecting a pre-existing active match. +// MaxFeeRate field for all historical trade orders to the max uint64. This +// avoids any chance of rejecting a pre-existing active match. func v2Upgrade(dbtx *bbolt.Tx) error { const oldVersion = 1 @@ -164,6 +164,18 @@ func v2Upgrade(dbtx *bbolt.Tx) error { if oBkt == nil { return fmt.Errorf("order %x bucket is not a bucket", oid) } + // Cancel orders should be stored with a zero maxFeeRate, as done in + // (*Core).tryCancelTrade. Besides, the maxFeeRate should not be applied + // to cancel matches, as done in (*dexConnection).parseMatches. + oTypeB := oBkt.Get(typeKey) + if len(oTypeB) != 1 { + return fmt.Errorf("order %x type invalid: %x", oid, oTypeB) + } + if order.OrderType(oTypeB[0]) == order.CancelOrderType { + // Don't bother setting maxFeeRate for cancel orders. + // decodeOrderBucket will default to zero for cancels. + return nil + } return oBkt.Put(maxFeeRateKey, maxFeeB) }) }