
contract interface Remote1 =
  entrypoint main_fun : (int) => int

contract interface Remote2 =
  entrypoint call : (Remote1, int) => int

contract interface Remote3 =
  entrypoint get : () => int
  entrypoint tick : () => unit

contract RemoteCall =

    stateful entrypoint call(r : Remote1, x : int) : int =
        r.main_fun(gas = 10000, value = 10, x)

    entrypoint staged_call(r1 : Remote1, r2 : Remote2, x : int) =
        r2.call(r1, x)

    entrypoint increment(r3 : Remote3) =
        r3.tick()

    entrypoint get(r3 : Remote3) =
        r3.get()

    entrypoint plus(x, y) = x + y

