This MR implements simple interfaces for contracts in JsLIGO.
It's basically front-end additions to JsLIGO.
There's a new interface
keyword for defining interfaces to be used in contracts (as namespaces):
interface ID {
type storage;
type ret = [list<operation>, storage];
@entry const increment : (k: int, s: storage) => ret;
@entry const decrement : (k: int, s: storage) => ret;
@entry const reset : (_u: unit, s: storage) => ret;
};
namespace IncDec implements ID {
type storage = int;
type ret = [list<operation>, storage];
@entry
const increment = (delta : int, store : storage) : ret =>
[list([]), store + delta];
@entry
const decrement = (delta : int, store : storage) : ret =>
[list([]), store - delta];
@entry
const reset = (_ : unit, _ : storage) : ret =>
[list([]), 0];
};
Using implements
, when defining a namespace, we can check that the namespace (contract) implements the interface. Type declarations in interfaces can be left without definition (e.g. storage
above), and the implementation can choose the concrete instance for the type.
dune @fmt
to check).## Changelog
section with #### (if appropriate).