/** * Rubicon contract * * Author: Peter Harpending * Date: 2026-08-12 */ contract Rubicon = // this could/should be a record, but records aren't really // portable across contracts/languages/APIs // // I think records are returned to caller as a FATE tuple with // fields in this order. I don't really know though and that's // kind of a hack and not something that we should build around i // feel like // // record rbx = // {ip : string, // port : int, // protocol : string, // "tcp", "udp", "sctp", etc // noise : string, // Noise_Foo_Bar_Baz_Quux // pubkey : bytes, // service's pubkey // salt : bytes} // ??? // (ip, port, protocol, noise, pubkey) type rbx_tuple = string * int * string * string * bytes type state = list(rbx_tuple) entrypoint init : list(rbx_tuple) => state init(services) = services stateful entrypoint set_services : list(rbx_tuple) => () set_services(_) | Call.caller != Contract.creator = abort("Not allowed") set_services(svs) = put(svs) entrypoint get_services : () => list(rbx_tuple) get_services() = state