Add more builtin types
We probably should extract these from the standard library instead of cherry picking the ones that are needed by the chain? e.g. Chain.tx still doesn't work.
This commit is contained in:
parent
057861e9cf
commit
2abb15cceb
88
src/hz.erl
88
src/hz.erl
@ -1549,15 +1549,47 @@ builtin_typedefs() ->
|
||||
"hash" => {[], {bytes, [32]}},
|
||||
"option" => {["'T"], {variant, [{"None", []},
|
||||
{"Some", [{var, "'T"}]}]}},
|
||||
"Chain.ttl" => {[], {variant, [{"FixedTTL", [{list, [integer]}]},
|
||||
{"RelativeTTL", [{list, [integer]}]}]}},
|
||||
"AENS.pointee" => {[], {variant, [{"AccountPt", [{list, [address]}]},
|
||||
{"OraclePt", [{list, [address]}]},
|
||||
{"ContractPt", [{list, [address]}]},
|
||||
{"ChannelPt", [{list, [address]}]}]}},
|
||||
"Chain.ttl" => {[], {variant, [{"FixedTTL", [integer]},
|
||||
{"RelativeTTL", [integer]}]}},
|
||||
"AENS.pointee" => {[], {variant, [{"AccountPt", [address]},
|
||||
{"OraclePt", [address]},
|
||||
{"ContractPt", [address]},
|
||||
{"ChannelPt", [address]}]}},
|
||||
"AENS.name" => {[], {variant, [{"Name", [address,
|
||||
"Chain.ttl",
|
||||
{map, [string, "AENS.pointee"]}]}]}}
|
||||
{map, [string, "AENS.pointee"]}]}]}},
|
||||
"AENSv2.pointee" => {[], {variant, [{"AccountPt", [address]},
|
||||
{"OraclePt", [address]},
|
||||
{"ContractPt", [address]},
|
||||
{"ChannelPt", [address]},
|
||||
{"DataPt", [{bytes, [any]}]}]}},
|
||||
"AENSv2.name" => {[], {variant, [{"Name", [address,
|
||||
"Chain.ttl",
|
||||
{map, [string, "AENSv2.pointee"]}]}]}},
|
||||
"Chain.ga_meta_tx" => {[], {variant, [{"GAMetaTx", [address, integer]}]}},
|
||||
"Chain.paying_for_tx" => {[], {variant, [{"PayingForTx", [address, integer]}]}},
|
||||
"Chain.base_tx" => {[], {variant, [{"SpendTx", [address, integer, string]},
|
||||
{"OracleRegisterTx", []},
|
||||
{"OracleQueryTx", []},
|
||||
{"OracleResponseTx", []},
|
||||
{"OracleExtendTx", []},
|
||||
{"NamePreclaimTx", []},
|
||||
{"NameClaimTx", ["hash"]},
|
||||
{"NameUpdateTx", [string]},
|
||||
{"NameRevokeTx", ["hash"]},
|
||||
{"NameTransferTx", [address, string]},
|
||||
{"ChannelCreateTx", [address]},
|
||||
{"ChannelDepositTx", [address, integer]},
|
||||
{"ChannelWithdrawTx", [address, integer]},
|
||||
{"ChannelForceProgressTx", [address]},
|
||||
{"ChannelCloseMutualTx", [address]},
|
||||
{"ChannelCloseSoloTx", [address]},
|
||||
{"ChannelSlashTx", [address]},
|
||||
{"ChannelSettleTx", [address]},
|
||||
{"ChannelSnapshotSoloTx", [address]},
|
||||
{"ContractCreateTx", [integer]},
|
||||
{"ContractCallTx", [address, integer]},
|
||||
{"GAAttachTx", []}]}}
|
||||
}.
|
||||
|
||||
% Type preparation has two goals. First, we need a data structure that can be
|
||||
@ -2693,8 +2725,22 @@ obscure_aaci_test() ->
|
||||
entrypoint unit(): unit = ()
|
||||
|
||||
entrypoint ttl(x): Chain.ttl = FixedTTL(x)
|
||||
entrypoint paying_for(x, y): Chain.paying_for_tx = Chain.PayingForTx(x, y)
|
||||
entrypoint ga_meta_tx(x, y): Chain.ga_meta_tx = Chain.GAMetaTx(x, y)
|
||||
entrypoint base_tx(x, y, z): Chain.base_tx = Chain.SpendTx(x, y, z)
|
||||
entrypoint tx(a, b, c, d, e, f): Chain.tx =
|
||||
{paying_for = a,
|
||||
ga_metas = b,
|
||||
actor = c,
|
||||
fee = d,
|
||||
ttl = e,
|
||||
tx = f}
|
||||
|
||||
entrypoint pointee(x): AENS.pointee = AENS.AccountPt(x)
|
||||
entrypoint name(x, y, z): AENS.name = AENS.Name(x, y, z)
|
||||
entrypoint pointee2(x): AENSv2.pointee = AENSv2.DataPt(x)
|
||||
entrypoint name2(x, y, z): AENSv2.name = AENSv2.Name(x, y, z)
|
||||
|
||||
",
|
||||
{ok, AACI} = aaci_from_string(Contract),
|
||||
|
||||
@ -2708,8 +2754,36 @@ obscure_aaci_test() ->
|
||||
{ok, {[], {"unit", _, {tuple, []}}}} = aaci_lookup_spec(AACI, "unit"),
|
||||
|
||||
{ok, {_, {"Chain.ttl", _, {variant, _}}}} = aaci_lookup_spec(AACI, "ttl"),
|
||||
{ok, {_, {"Chain.paying_for_tx", _, {variant, _}}}} = aaci_lookup_spec(AACI, "paying_for"),
|
||||
{ok, {_, {"Chain.ga_meta_tx", _, {variant, _}}}} = aaci_lookup_spec(AACI, "ga_meta_tx"),
|
||||
{ok, {_, {"Chain.base_tx", _, {variant, _}}}} = aaci_lookup_spec(AACI, "base_tx"),
|
||||
% Why do the other types here get hard coded in the compiler, but this one
|
||||
% doesn't? Should we be getting stdlib types from includes?
|
||||
%{ok, {_, {"Chain.tx", _, {variant, _}}}} = aaci_lookup_spec(AACI, "tx"),
|
||||
|
||||
{ok, {_, {"AENS.pointee", _, {variant, _}}}} = aaci_lookup_spec(AACI, "pointee"),
|
||||
{ok, {_, {"AENS.name", _, {variant, _}}}} = aaci_lookup_spec(AACI, "name"),
|
||||
{ok, {_, {"AENSv2.pointee", _, {variant, _}}}} = aaci_lookup_spec(AACI, "pointee2"),
|
||||
{ok, {_, {"AENSv2.name", _, {variant, _}}}} = aaci_lookup_spec(AACI, "name2"),
|
||||
|
||||
ok.
|
||||
|
||||
name_coerce_test() ->
|
||||
AddrSoph = "ak_2FTnrGfV8qsfHpaSEHpBrziioCpwwzLqSevHqfxQY3PaAAdARx",
|
||||
AddrFate = {address, <<164,136,155,90,124,22,40,206,255,76,213,56,238,123,
|
||||
167,208,53,78,40,235,2,163,132,36,47,183,228,151,9,
|
||||
210,39,214>>},
|
||||
{ok, TTL} = annotate_type("Chain.ttl", builtin_typedefs()),
|
||||
TTLSoph = {"FixedTTL", 0},
|
||||
TTLFate = {variant, [1, 1], 0, {0}},
|
||||
try_coerce(TTL, TTLSoph, TTLFate),
|
||||
{ok, Pointee} = annotate_type("AENS.pointee", builtin_typedefs()),
|
||||
PointeeSoph = {"AccountPt", AddrSoph},
|
||||
PointeeFate = {variant, [1, 1, 1, 1], 0, {AddrFate}},
|
||||
try_coerce(Pointee, PointeeSoph, PointeeFate),
|
||||
{ok, Name} = annotate_type("AENS.name", builtin_typedefs()),
|
||||
NameSoph = {"Name", AddrSoph, TTLSoph, #{"myname" => PointeeSoph}},
|
||||
NameFate = {variant, [3], 0, {AddrFate, TTLFate, #{<<"myname">> => PointeeFate}}},
|
||||
try_coerce(Name, NameSoph, NameFate).
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user