+ for _, prevout := range tx.MainchainOutputIDs {
+ // don't simply delete(view.Entries, prevout), because we need to delete from db in saveUtxoView()
+ entry, ok := view.Entries[prevout]
+ if ok && (entry.Type != storage.CrosschainUTXOType) {
+ return errors.New("look up mainchainOutputID but find utxo not from mainchain")
+ }
+
+ if ok && !entry.Spent {
+ return errors.New("try to revert an unspent utxo")
+ }
+
+ if !ok {
+ view.Entries[prevout] = storage.NewUtxoEntry(storage.CrosschainUTXOType, 0, false)
+ continue
+ }
+ entry.UnspendOutput()
+ }
+