diff --git a/rebar.config b/rebar.config index 7d60a8e..890baf6 100644 --- a/rebar.config +++ b/rebar.config @@ -2,7 +2,7 @@ {erl_opts, [debug_info]}. -{deps, [ {aebytecode, {git, "https://github.com/aeternity/aebytecode.git", {ref,"10cc127"}}} +{deps, [ {aebytecode, {git, "https://github.com/aeternity/aebytecode.git", {ref,"3f85375"}}} , {getopt, "1.0.1"} , {eblake2, "1.0.0"} , {jsx, {git, "https://github.com/talentdeficit/jsx.git", diff --git a/rebar.lock b/rebar.lock index 84f3ab4..b401709 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,7 +1,7 @@ {"1.1.0", [{<<"aebytecode">>, {git,"https://github.com/aeternity/aebytecode.git", - {ref,"10cc1278831ad7e90138533466ceef4bcafd74a9"}}, + {ref,"3f85375cb2288083e442541d5b53f9705f22053a"}}, 0}, {<<"aeserialization">>, {git,"https://github.com/aeternity/aeserialization.git", diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 5a07a9f..eba03d9 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -445,7 +445,8 @@ global_env() -> {"preclaim", SignFun([Address, Hash], Unit)}, {"claim", SignFun([Address, String, Int], Unit)}, {"transfer", SignFun([Address, Address, String], Unit)}, - {"revoke", SignFun([Address, String], Unit)}]) }, + {"revoke", SignFun([Address, String], Unit)}, + {"subname", SignFun([Address, String, Map(Q, Map(K, A))], Unit)}]) }, MapScope = #scope { funs = MkDefs( diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 16fe99e..3c20fa2 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -186,7 +186,7 @@ builtins() -> {"respond", 4}, {"extend", 3}, {"get_answer", 2}, {"check", 1}, {"check_query", 2}]}, {["AENS"], [{"resolve", 2}, {"preclaim", 3}, {"claim", 4}, {"transfer", 4}, - {"revoke", 3}]}, + {"revoke", 3}, {"subname", 3}]}, {["Map"], [{"from_list", 1}, {"to_list", 1}, {"lookup", 2}, {"lookup_default", 3}, {"delete", 2}, {"member", 2}, {"size", 1}]}, {["Crypto"], [{"verify_sig", 3}, {"verify_sig_secp256k1", 3}, @@ -1555,4 +1555,3 @@ pp_pat(Pat) -> pp_fexpr(Pat). is_infix(Op) -> C = hd(atom_to_list(Op)), C < $a orelse C > $z. - diff --git a/src/aeso_ast_to_icode.erl b/src/aeso_ast_to_icode.erl index ca1433a..6d72ad4 100644 --- a/src/aeso_ast_to_icode.erl +++ b/src/aeso_ast_to_icode.erl @@ -285,11 +285,18 @@ ast_body(?qid_app(["AENS", "revoke"], Args, _, _), Icode) -> [ast_body(Addr, Icode), ast_body(Name, Icode), ast_body(Sign, Icode)], [word, word, sign_t()], {tuple, []}); +ast_body(?qid_app(["AENS", "subname"], Args, _, _), Icode) -> + {Sign, [Addr, Name, Subnames]} = get_signature_arg(Args), + prim_call(?PRIM_CALL_AENS_SUBNAME, #integer{value = 0}, + [ast_body(Addr, Icode), ast_body(Name, Icode), ast_body(Subnames, Icode), ast_body(Sign, Icode)], + [word, word, word, sign_t()], {tuple, []}); + ast_body({qid, _, ["AENS", "resolve"]}, _Icode) -> gen_error({underapplied_primitive, 'AENS.resolve'}); ast_body({qid, _, ["AENS", "preclaim"]}, _Icode) -> gen_error({underapplied_primitive, 'AENS.preclaim'}); ast_body({qid, _, ["AENS", "claim"]}, _Icode) -> gen_error({underapplied_primitive, 'AENS.claim'}); ast_body({qid, _, ["AENS", "transfer"]}, _Icode) -> gen_error({underapplied_primitive, 'AENS.transfer'}); ast_body({qid, _, ["AENS", "revoke"]}, _Icode) -> gen_error({underapplied_primitive, 'AENS.revoke'}); +ast_body({qid, _, ["AENS", "subname"]}, _Icode) -> gen_error({underapplied_primitive, 'AENS.subname'}); %% Maps diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index eadd9dd..91118a4 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -566,6 +566,8 @@ builtin_to_scode(Env, aens_transfer, [_Sign, _From, _To, _Name] = Args) -> builtin_to_scode(Env, aens_revoke, [_Sign, _Account, _Name] = Args) -> call_to_scode(Env, [aeb_fate_ops:aens_revoke(?a, ?a, ?a), tuple(0)], Args); +builtin_to_scode(Env, aens_subname, [_Sign, _Account, _Name, _Subnames] = Args) -> + call_to_scode(Env, [aeb_fate_ops:aens_subname(?a, ?a, ?a, ?a), tuple(0)], Args); builtin_to_scode(_Env, auth_tx_hash, []) -> [aeb_fate_ops:auth_tx_hash(?a)]. @@ -887,6 +889,7 @@ attributes(I) -> 'AENS_UPDATE' -> Impure(none, []);%% TODO {'AENS_TRANSFER', A, B, C, D} -> Impure(none, [A, B, C, D]); {'AENS_REVOKE', A, B, C} -> Impure(none, [A, B, C]); + {'AENS_SUBNAME', A, B, C} -> Impure(none, [A, B, C]); {'ABORT', A} -> Impure(pc, A); {'EXIT', A} -> Impure(pc, A); 'NOP' -> Pure(none, []) @@ -1571,4 +1574,3 @@ drop_common_suffix_r([X | Xs], [X | Ys]) -> drop_common_suffix_r(Xs, Ys); drop_common_suffix_r(Xs, Ys) -> {lists:reverse(Xs), lists:reverse(Ys)}. - diff --git a/test/contracts/aens.aes b/test/contracts/aens.aes index 9d5e063..67bffb9 100644 --- a/test/contracts/aens.aes +++ b/test/contracts/aens.aes @@ -1,6 +1,8 @@ // AENS tests contract AENSTest = + type subnames = map(string, map(string, address)) + // Name resolution stateful entrypoint resolve_word(name : string, key : string) : option(address) = @@ -53,3 +55,14 @@ contract AENSTest = sign : signature) : unit = AENS.revoke(owner, name, signature = sign) + + stateful entrypoint subname(owner : address, + name : string, + subnames : subnames) : unit = + AENS.subname(owner, name, subnames) + + stateful entrypoint signedSubname(owner : address, + name : string, + subnames : subnames, + sign : signature) : unit = + AENS.subname(owner, name, subnames, signature = sign)