Assets

Some owning references are to things that should not be accidentally lost. To prevent accidental loss, we can declare contracts with the keyword asset. Let’s do this for Money:

asset contract Money {
}

Now, if we accidentally lose track of an owning reference to a Money object (by letting it go out of scope without transferring ownership to somewhere else, such as a field), the compiler will give an error:

transaction test() {
   Money m = ...; [m@Owned]; // OK, m is Owned here
   // ERROR: cannot drop reference to owned asset m
}

We can fix this by (for example) returning m, assigning it to an owning field, or passing it as an argument to an appropriate transaction. For example:

transaction test() returns Money@Owned {
   Money m = ...; [m@Owned]; // OK, m is Owned here
   return m; // gives ownership of m to the caller of test()
}

NOTE: non-owning references to Money are not restricted; the compiler gives no errors when they go out of scope.