From c5394c3068ac1f05e4d7321651cf980c340903fb Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Wed, 16 Nov 2022 21:31:44 +0100 Subject: [PATCH] [Ceres]: Introduce AENSv2 to add raw data pointers (#426) Remove unused variable in AENSCompat --- CHANGELOG.md | 8 ++ docs/sophia_stdlib.md | 81 ++++++++++++++++----- priv/stdlib/AENSCompat.aes | 17 +++++ src/aeso_ast_infer_types.erl | 36 ++++++--- src/aeso_ast_to_fcode.erl | 21 ++++-- src/aeso_vm_decode.erl | 17 ++++- test/aeso_compiler_tests.erl | 6 +- test/contracts/aens.aes | 34 ++++----- test/contracts/aens_update.aes | 35 ++++++--- test/contracts/bad_aens_resolve.aes | 2 +- test/contracts/bad_aens_resolve_using.aes | 4 +- test/contracts/polymorphic_aens_resolve.aes | 2 +- test/contracts/unapplied_builtins.aes | 10 +-- 13 files changed, 200 insertions(+), 73 deletions(-) create mode 100644 priv/stdlib/AENSCompat.aes diff --git a/CHANGELOG.md b/CHANGELOG.md index d535f72..7c6d454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Int.mulmod` - combined builtin operation for multiplication and modulus. - `Crypto.poseidon` - a ZK/SNARK-friendly hash function (over the BLS12-381 scalar field). - `Address.to_bytes` - convert an address to its binary representation (for hashing, etc.). +- Raw data pointers added to AENS. In short we have introduced a new namespace + `AENSv2`; they contain types similar to the old `AENS`; `AENS.name` and + `AENS.pointee`, where the latter now has a constructor `DataPt(string)`. All + AENS actions have been moved to `AENSv2`, and `AENSv2.lookup` and + `AENSv2.update` consume and produce the new types. The old `AENS` namespace + only contains the old datatypes, that can be used to interface existing + contracts. Standard library `AENSCompat` is added to convert between old and + new pointers. ### Changed ### Removed - `Bitwise.aes` standard library is removed - the builtin operations are superior. diff --git a/docs/sophia_stdlib.md b/docs/sophia_stdlib.md index 7d5c91d..209c132 100644 --- a/docs/sophia_stdlib.md +++ b/docs/sophia_stdlib.md @@ -14,6 +14,7 @@ The out-of-the-box namespaces are: - [Address](#address) - [AENS](#aens) +- [AENSv2](#aensv2) - [Auth](#auth) - [Bits](#bits) - [Bytes](#bytes) @@ -31,6 +32,7 @@ The following ones need to be included as regular files with `.aes` suffix, for include "List.aes" ``` +- [AENSCompat](#aenscompat) - [Bitwise](#bitwise) - [BLS12_381](#bls12_381) - [Func](#func) @@ -90,13 +92,10 @@ Cast address to contract type C (where `C` is a contract) ### AENS -The following functionality is available for interacting with the æternity -naming system (AENS). -If `owner` is equal to `Contract.address` the signature `signature` is -ignored, and can be left out since it is a named argument. Otherwise we need -a signature to prove that we are allowed to do AENS operations on behalf of -`owner`. The [signature is tied to a network id](https://github.com/aeternity/protocol/blob/iris/consensus/consensus.md#transaction-signature), -i.e. the signature material should be prefixed by the network id. +The old AENS namespace, kept in the compiler to be able to interact with +contracts from before Ceres, compiled using aesophia compiler version 7.x and +earlier. Used in [AENSCompat](#aenscompat) when converting between old and new +pointers. #### Types @@ -113,12 +112,41 @@ datatype pointee = AccountPt(address) | OraclePt(address) | ContractPt(address) | ChannelPt(address) ``` +### AENSv2 + +Note: introduced in v8.0 + +The following functionality is available for interacting with the æternity +naming system (AENS). If `owner` is equal to `Contract.address` the signature +`signature` is ignored, and can be left out since it is a named argument. +Otherwise we need a signature to prove that we are allowed to do AENS +operations on behalf of `owner`. The [signature is tied to a network +id](https://github.com/aeternity/protocol/blob/iris/consensus/consensus.md#transaction-signature), +i.e. the signature material should be prefixed by the network id. + +#### Types + +##### name +``` +datatype name = Name(address, Chain.ttl, map(string, AENSv2.pointee)) +``` + + +##### pointee + +``` +datatype pointee = AccountPt(address) | OraclePt(address) + | ContractPt(address) | ChannelPt(address) | DataPt(string) +``` + +Note: on-chain there is a maximum length enforced for `DataPt`, it is 1024 bytes. +Sophia itself does _not_ enforce this. #### Functions ##### resolve ``` -AENS.resolve(name : string, key : string) : option('a) +AENSv2.resolve(name : string, key : string) : option('a) ``` Name resolution. Here `name` should be a registered name and `key` one of the attributes @@ -129,21 +157,22 @@ type checked against this type at run time. ##### lookup ``` -AENS.lookup(name : string) : option(AENS.name) +AENSv2.lookup(name : string) : option(AENSv2.name) ``` -If `name` is an active name `AENS.lookup` returns a name object. +If `name` is an active name `AENSv2.lookup` returns a name object. The three arguments to `Name` are `owner`, `expiry` and a map of the `pointees` for the name. Note: the expiry of the name is always a fixed TTL. For example: ``` -let Some(Name(owner, FixedTTL(expiry), ptrs)) = AENS.lookup("example.chain") +let Some(AENSv2.Name(owner, FixedTTL(expiry), ptrs)) = AENSv2.lookup("example.chain") ``` +Note: Changed to produce `AENSv2.name` in v8.0 (Ceres protocol upgrade). ##### preclaim ``` -AENS.preclaim(owner : address, commitment_hash : hash, ) : unit +AENSv2.preclaim(owner : address, commitment_hash : hash, ) : unit ``` The [signature](./sophia_features.md#delegation-signature) should be over @@ -152,7 +181,7 @@ The [signature](./sophia_features.md#delegation-signature) should be over ##### claim ``` -AENS.claim(owner : address, name : string, salt : int, name_fee : int, ) : unit +AENSv2.claim(owner : address, name : string, salt : int, name_fee : int, ) : unit ``` The [signature](./sophia_features.md#delegation-signature) should be over @@ -163,7 +192,7 @@ using the private key of the `owner` account for signing. ##### transfer ``` -AENS.transfer(owner : address, new_owner : address, name : string, ) : unit +AENSv2.transfer(owner : address, new_owner : address, name : string, ) : unit ``` Transfers name to the new owner. @@ -176,7 +205,7 @@ using the private key of the `owner` account for signing. ##### revoke ``` -AENS.revoke(owner : address, name : string, ) : unit +AENSv2.revoke(owner : address, name : string, ) : unit ``` Revokes the name to extend the ownership time. @@ -189,14 +218,15 @@ using the private key of the `owner` account for signing. ##### update ``` -AENS.update(owner : address, name : string, expiry : option(Chain.ttl), client_ttl : option(int), - new_ptrs : option(map(string, AENS.pointee)), ) : unit +AENSv2.update(owner : address, name : string, expiry : option(Chain.ttl), client_ttl : option(int), + new_ptrs : option(map(string, AENSv2.pointee)), ) : unit ``` Updates the name. If the optional parameters are set to `None` that parameter will not be updated, for example if `None` is passed as `expiry` the expiry block of the name is not changed. +Note: Changed to consume `AENSv2.pointee` in v8.0 (Ceres protocol upgrade). ### Auth @@ -946,6 +976,23 @@ It returns `true` iff the oracle query exist and has the expected type. These need to be explicitly included (with `.aes` suffix) +### AENSCompat + +#### pointee\_to\_V2 +``` +AENSCompat.pointee_to_V2(p : AENS.pointee) : AENSv2.pointee +``` + +Translate old pointee format to new, this is always possible. + +#### pointee\_from\_V2 +``` +AENSCompat.pointee_from_V2(p2 : AENSv2.pointee) : option(AENS.pointee) +``` + +Translate new pointee format to old, `DataPt` can't be translated, so `None` is returned in this case. + + ### BLS12\_381 #### Types diff --git a/priv/stdlib/AENSCompat.aes b/priv/stdlib/AENSCompat.aes new file mode 100644 index 0000000..baaa05a --- /dev/null +++ b/priv/stdlib/AENSCompat.aes @@ -0,0 +1,17 @@ +namespace AENSCompat = + // Translate old format to new format - always possible + function pointee_to_V2(p : AENS.pointee) : AENSv2.pointee = + switch(p) + AENS.AccountPt(a) => AENSv2.AccountPt(a) + AENS.OraclePt(a) => AENSv2.OraclePt(a) + AENS.ContractPt(a) => AENSv2.ContractPt(a) + AENS.ChannelPt(a) => AENSv2.ChannelPt(a) + + // Translate new format to old format - option type! + function pointee_from_V2(p2 : AENSv2.pointee) : option(AENS.pointee) = + switch(p2) + AENSv2.AccountPt(a) => Some(AENS.AccountPt(a)) + AENSv2.OraclePt(a) => Some(AENS.OraclePt(a)) + AENSv2.ContractPt(a) => Some(AENS.ContractPt(a)) + AENSv2.ChannelPt(a) => Some(AENS.ChannelPt(a)) + AENSv2.DataPt(_) => None diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index e61b959..dd50909 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -594,6 +594,8 @@ global_env() -> TTL = {qid, Ann, ["Chain", "ttl"]}, Pointee = {qid, Ann, ["AENS", "pointee"]}, AENSName = {qid, Ann, ["AENS", "name"]}, + PointeeV2 = {qid, Ann, ["AENSv2", "pointee"]}, + AENSNameV2 = {qid, Ann, ["AENSv2", "name"]}, Fr = {qid, Ann, ["MCL_BLS12_381", "fr"]}, Fp = {qid, Ann, ["MCL_BLS12_381", "fp"]}, Fp2 = {tuple_t, Ann, [Fp, Fp]}, @@ -729,14 +731,7 @@ global_env() -> AENSScope = #scope { funs = MkDefs( - [{"resolve", Fun([String, String], option_t(Ann, A))}, - {"preclaim", SignFun([Address, Hash], Unit)}, - {"claim", SignFun([Address, String, Int, Int], Unit)}, - {"transfer", SignFun([Address, Address, String], Unit)}, - {"revoke", SignFun([Address, String], Unit)}, - {"update", SignFun([Address, String, Option(TTL), Option(Int), Option(Map(String, Pointee))], Unit)}, - {"lookup", Fun([String], option_t(Ann, AENSName))}, - %% AENS pointee constructors + [%% AENS pointee constructors {"AccountPt", Fun1(Address, Pointee)}, {"OraclePt", Fun1(Address, Pointee)}, {"ContractPt", Fun1(Address, Pointee)}, @@ -746,6 +741,26 @@ global_env() -> ]) , types = MkDefs([{"pointee", 0}, {"name", 0}]) }, + AENSv2Scope = #scope + { funs = MkDefs( + [{"resolve", Fun([String, String], option_t(Ann, A))}, + {"preclaim", SignFun([Address, Hash], Unit)}, + {"claim", SignFun([Address, String, Int, Int], Unit)}, + {"transfer", SignFun([Address, Address, String], Unit)}, + {"revoke", SignFun([Address, String], Unit)}, + {"update", SignFun([Address, String, Option(TTL), Option(Int), Option(Map(String, PointeeV2))], Unit)}, + {"lookup", Fun([String], option_t(Ann, AENSNameV2))}, + %% AENS pointee constructors v2 + {"AccountPt", Fun1(Address, PointeeV2)}, + {"OraclePt", Fun1(Address, PointeeV2)}, + {"ContractPt", Fun1(Address, PointeeV2)}, + {"ChannelPt", Fun1(Address, PointeeV2)}, + {"DataPt", Fun1(String, PointeeV2)}, + %% Name object constructor v2 + {"Name", Fun([Address, TTL, Map(String, PointeeV2)], AENSNameV2)} + ]) + , types = MkDefs([{"pointee", 0}, {"name", 0}]) }, + MapScope = #scope { funs = MkDefs( [{"from_list", Fun1(List(Pair(K, V)), Map(K, V))}, @@ -868,6 +883,7 @@ global_env() -> , ["Call"] => CallScope , ["Oracle"] => OracleScope , ["AENS"] => AENSScope + , ["AENSv2"] => AENSv2Scope , ["Map"] => MapScope , ["Auth"] => AuthScope , ["Crypto"] => CryptoScope @@ -2017,7 +2033,7 @@ infer_expr(Env, {app, Ann, Fun, Args0} = App) -> unify(Env, FunType, {fun_t, [], NamedArgsVar, ArgTypes, GeneralResultType}, When), when_warning(warn_negative_spend, fun() -> warn_potential_negative_spend(Ann, NewFun1, NewArgs) end), [ add_constraint({aens_resolve_type, GeneralResultType}) - || element(3, FunName) =:= ["AENS", "resolve"] ], + || element(3, FunName) =:= ["AENSv2", "resolve"] ], [ add_constraint({oracle_type, Ann, OType}) || OType <- [get_oracle_type(FunName, ArgTypes, GeneralResultType)], OType =/= false ], @@ -3951,7 +3967,7 @@ mk_error({higher_order_entrypoint, Ann, {id, _, Name}, Thing}) -> [ThingS, Name, Bad]), mk_t_err(pos(Ann), Msg); mk_error({invalid_aens_resolve_type, Ann, T}) -> - Msg = io_lib:format("Invalid return type of `AENS.resolve`:\n" + Msg = io_lib:format("Invalid return type of `AENSv2.resolve`:\n" "~s`\n" "It must be a `string` or a pubkey type (`address`, `oracle`, etc)", [pp_type(" `", T)]), diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 6a24a5a..a6858c2 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -225,6 +225,12 @@ init_env(Options) -> ["AENS", "ContractPt"] => #con_tag{ tag = 2, arities = [1, 1, 1, 1] }, ["AENS", "ChannelPt"] => #con_tag{ tag = 3, arities = [1, 1, 1, 1] }, ["AENS", "Name"] => #con_tag{ tag = 0, arities = [3] }, + ["AENSv2", "AccountPt"] => #con_tag{ tag = 0, arities = [1, 1, 1, 1, 1] }, + ["AENSv2", "OraclePt"] => #con_tag{ tag = 1, arities = [1, 1, 1, 1, 1] }, + ["AENSv2", "ContractPt"] => #con_tag{ tag = 2, arities = [1, 1, 1, 1, 1] }, + ["AENSv2", "ChannelPt"] => #con_tag{ tag = 3, arities = [1, 1, 1, 1, 1] }, + ["AENSv2", "DataPt"] => #con_tag{ tag = 4, arities = [1, 1, 1, 1, 1] }, + ["AENSv2", "Name"] => #con_tag{ tag = 0, arities = [3] }, ["Chain", "GAMetaTx"] => #con_tag{ tag = 0, arities = [2] }, ["Chain", "PayingForTx"] => #con_tag{ tag = 0, arities = [2] }, ["Chain", "SpendTx"] => #con_tag{ tag = 0, arities = ChainTxArities }, @@ -257,8 +263,11 @@ init_env(Options) -> -spec builtins() -> builtins(). builtins() -> - MkName = fun(NS, Fun) -> - list_to_atom(string:to_lower(string:join(NS ++ [Fun], "_"))) + MkName = fun + (["AENSv2"], Fun) -> + list_to_atom(string:to_lower("AENS_" ++ Fun)); + (NS, Fun) -> + list_to_atom(string:to_lower(string:join(NS ++ [Fun], "_"))) end, Scopes = [{[], [{"abort", 1}, {"require", 2}, {"exit", 1}]}, {["Chain"], [{"spend", 2}, {"balance", 1}, {"block_hash", 1}, {"coinbase", none}, @@ -270,7 +279,7 @@ builtins() -> {["Oracle"], [{"register", 4}, {"expiry", 1}, {"query_fee", 1}, {"query", 5}, {"get_question", 2}, {"respond", 4}, {"extend", 3}, {"get_answer", 2}, {"check", 1}, {"check_query", 2}]}, - {["AENS"], [{"resolve", 2}, {"preclaim", 3}, {"claim", 5}, {"transfer", 4}, + {["AENSv2"], [{"resolve", 2}, {"preclaim", 3}, {"claim", 5}, {"transfer", 4}, {"revoke", 3}, {"update", 6}, {"lookup", 1}]}, {["Map"], [{"from_list", 1}, {"to_list", 1}, {"lookup", 2}, {"lookup_default", 3}, {"delete", 2}, {"member", 2}, {"size", 1}]}, @@ -327,11 +336,13 @@ init_type_env() -> ["Chain", "ttl"] => ?type({variant, [[integer], [integer]]}), ["AENS", "pointee"] => ?type({variant, [[address], [address], [address], [address]]}), ["AENS", "name"] => ?type({variant, [[address, {variant, [[integer], [integer]]}, {map, string, {variant, [[address], [address], [address], [address]]}}]]}), + ["AENSv2", "pointee"] => ?type({variant, [[address], [address], [address], [address], [string]]}), + ["AENSv2", "name"] => ?type({variant, [[address, {variant, [[integer], [integer]]}, {map, string, {variant, [[address], [address], [address], [address], [string]]}}]]}), ["Chain", "ga_meta_tx"] => ?type({variant, [[address, integer]]}), ["Chain", "paying_for_tx"] => ?type({variant, [[address, integer]]}), ["Chain", "base_tx"] => ?type(BaseTx), - ["MCL_BLS12_381", "fr"] => ?type({bytes, 32}), - ["MCL_BLS12_381", "fp"] => ?type({bytes, 48}) + ["MCL_BLS12_381", "fr"] => ?type({bytes, 32}), + ["MCL_BLS12_381", "fp"] => ?type({bytes, 48}) }. -spec is_no_code(env()) -> boolean(). diff --git a/src/aeso_vm_decode.erl b/src/aeso_vm_decode.erl index dc5d18b..e1941b8 100644 --- a/src/aeso_vm_decode.erl +++ b/src/aeso_vm_decode.erl @@ -88,7 +88,7 @@ from_fate_builtin(QType, Val) -> {["AENS", "name"], {variant, [3], 0, {Addr, TTL, Ptrs}}} -> App(["AENS","Name"], [Chk(Adr, Addr), Chk(Qid(["Chain", "ttl"]), TTL), - Chk(Map(Str, Qid(["AENS", "pointee"])), Ptrs)]); + Chk(Map(Str, Qid(["AENS", "pointee"])), Ptrs)]); {["AENS", "pointee"], {variant, [1, 1, 1, 1], 0, {Addr}}} -> App(["AENS","AccountPt"], [Chk(Adr, Addr)]); @@ -99,6 +99,21 @@ from_fate_builtin(QType, Val) -> {["AENS", "pointee"], {variant, [1, 1, 1, 1], 3, {Addr}}} -> App(["AENS","ChannelPt"], [Chk(Adr, Addr)]); + {["AENSv2", "name"], {variant, [3], 0, {Addr, TTL, Ptrs}}} -> + App(["AENSv2","Name"], [Chk(Adr, Addr), Chk(Qid(["Chain", "ttl"]), TTL), + Chk(Map(Str, Qid(["AENSv2", "pointee"])), Ptrs)]); + + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 0, {Val}}} -> + App(["AENSv2","AccountPt"], [Chk(Adr, Val)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 1, {Val}}} -> + App(["AENSv2","OraclePt"], [Chk(Adr, Val)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 2, {Val}}} -> + App(["AENSv2","ContractPt"], [Chk(Adr, Val)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 3, {Val}}} -> + App(["AENSv2","ChannelPt"], [Chk(Adr, Val)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 4, {Val}}} -> + App(["AENSv2","DataPt"], [Chk(Str, Val)]); + {["Chain", "ga_meta_tx"], {variant, [2], 0, {Addr, X}}} -> App(["Chain","GAMetaTx"], [Chk(Adr, Addr), Chk(Int, X)]); diff --git a/test/aeso_compiler_tests.erl b/test/aeso_compiler_tests.erl index 0db1774..5d2c417 100644 --- a/test/aeso_compiler_tests.erl +++ b/test/aeso_compiler_tests.erl @@ -1105,19 +1105,19 @@ failing_contracts() -> ]) , ?TYPE_ERROR(polymorphic_aens_resolve, [<> ]) , ?TYPE_ERROR(bad_aens_resolve, [<> ]) , ?TYPE_ERROR(bad_aens_resolve_using, [<> ]) diff --git a/test/contracts/aens.aes b/test/contracts/aens.aes index 698e4c5..ac59b4d 100644 --- a/test/contracts/aens.aes +++ b/test/contracts/aens.aes @@ -6,77 +6,77 @@ main contract AENSTest = // Name resolution stateful entrypoint resolve_word(name : string, key : string) : option(address) = - AENS.resolve(name, key) + AENSv2.resolve(name, key) stateful entrypoint resolve_string(name : string, key : string) : option(string) = - AENS.resolve(name, key) + AENSv2.resolve(name, key) stateful entrypoint resolve_contract(name : string, key : string) : option(C) = - AENS.resolve(name, key) + AENSv2.resolve(name, key) stateful entrypoint resolve_oracle(name : string, key : string) : option(oracle(int, int)) = - AENS.resolve(name, key) + AENSv2.resolve(name, key) stateful entrypoint resolve_oracle_query(name : string, key : string) : option(oracle_query(int, int)) = - AENS.resolve(name, key) + AENSv2.resolve(name, key) // Transactions stateful entrypoint preclaim(addr : address, // Claim on behalf of this account (can be Contract.address) chash : hash) : unit = // Commitment hash - AENS.preclaim(addr, chash) + AENSv2.preclaim(addr, chash) stateful entrypoint signedPreclaim(addr : address, // Claim on behalf of this account (can be Contract.address) chash : hash, // Commitment hash sign : signature) : unit = // Signed by addr (if not Contract.address) - AENS.preclaim(addr, chash, signature = sign) + AENSv2.preclaim(addr, chash, signature = sign) stateful entrypoint claim(addr : address, name : string, salt : int, name_fee : int) : unit = - AENS.claim(addr, name, salt, name_fee) + AENSv2.claim(addr, name, salt, name_fee) stateful entrypoint signedClaim(addr : address, name : string, salt : int, name_fee : int, sign : signature) : unit = - AENS.claim(addr, name, salt, name_fee, signature = sign) + AENSv2.claim(addr, name, salt, name_fee, signature = sign) stateful entrypoint update(owner : address, name : string, ttl : option(Chain.ttl), client_ttl : option(int), - pointers : option(map(string, AENS.pointee))) : unit = - AENS.update(owner, name, ttl, client_ttl, pointers) + pointers : option(map(string, AENSv2.pointee))) : unit = + AENSv2.update(owner, name, ttl, client_ttl, pointers) stateful entrypoint signedUpdate(owner : address, name : string, ttl : option(Chain.ttl), client_ttl : option(int), - pointers : option(map(string, AENS.pointee)), + pointers : option(map(string, AENSv2.pointee)), sign : signature) : unit = - AENS.update(owner, name, ttl, client_ttl, pointers, signature = sign) + AENSv2.update(owner, name, ttl, client_ttl, pointers, signature = sign) stateful entrypoint transfer(owner : address, new_owner : address, name : string) : unit = - AENS.transfer(owner, new_owner, name) + AENSv2.transfer(owner, new_owner, name) stateful entrypoint signedTransfer(owner : address, new_owner : address, name : string, sign : signature) : unit = - AENS.transfer(owner, new_owner, name, signature = sign) + AENSv2.transfer(owner, new_owner, name, signature = sign) stateful entrypoint revoke(owner : address, name : string) : unit = - AENS.revoke(owner, name) + AENSv2.revoke(owner, name) stateful entrypoint signedRevoke(owner : address, name : string, sign : signature) : unit = - AENS.revoke(owner, name, signature = sign) + AENSv2.revoke(owner, name, signature = sign) diff --git a/test/contracts/aens_update.aes b/test/contracts/aens_update.aes index 5d65229..3b8fc7c 100644 --- a/test/contracts/aens_update.aes +++ b/test/contracts/aens_update.aes @@ -1,17 +1,30 @@ -contract AENSUpdate = +include "Option.aes" +include "AENSCompat.aes" +contract interface OldAENSContract = + entrypoint set : (string, string, AENS.pointee) => unit + entrypoint lookup : (string, string) => AENS.pointee + +main contract AENSUpdate = stateful entrypoint update_name(owner : address, name : string) = - let p1 : AENS.pointee = AENS.AccountPt(Call.caller) - let p2 : AENS.pointee = AENS.OraclePt(Call.caller) - let p3 : AENS.pointee = AENS.ContractPt(Call.caller) - let p4 : AENS.pointee = AENS.ChannelPt(Call.caller) - AENS.update(owner, name, None, None, - Some({ ["account_pubkey"] = p1, ["oracle_pubkey"] = p2, - ["contract_pubkey"] = p3, ["misc"] = p4 })) + let p1 : AENSv2.pointee = AENSv2.AccountPt(Call.caller) + let p2 : AENSv2.pointee = AENSv2.OraclePt(Call.caller) + let p3 : AENSv2.pointee = AENSv2.ContractPt(Call.caller) + let p4 : AENSv2.pointee = AENSv2.ChannelPt(Call.caller) + let p5 : AENSv2.pointee = AENSv2.DataPt("any something will do") + AENSv2.update(owner, name, None, None, + Some({ ["account_pubkey"] = p1, ["oracle_pubkey"] = p2, + ["contract_pubkey"] = p3, ["misc"] = p4, ["data"] = p5 })) + + stateful entrypoint old_interaction(c : OldAENSContract, owner : address, name : string) = + let p : AENS.pointee = c.lookup(name, "key1") + AENSv2.update(owner, name, None, None, Some({ ["key1"] = AENSCompat.pointee_to_V2(p) })) + switch(AENSv2.lookup(name)) + Some(AENSv2.Name(_, _, pt_map)) => + c.set(name, "key2", Option.force(AENSCompat.pointee_from_V2(pt_map["key1"]))) entrypoint get_ttl(name : string) = - switch(AENS.lookup(name)) - Some(AENS.Name(_, FixedTTL(ttl), _)) => ttl + switch(AENSv2.lookup(name)) + Some(AENSv2.Name(_, FixedTTL(ttl), _)) => ttl entrypoint expiry(o : oracle(int, int)) : int = Oracle.expiry(o) - diff --git a/test/contracts/bad_aens_resolve.aes b/test/contracts/bad_aens_resolve.aes index 8700dfb..44f15e5 100644 --- a/test/contracts/bad_aens_resolve.aes +++ b/test/contracts/bad_aens_resolve.aes @@ -3,7 +3,7 @@ contract BadAENSresolve = type t('a) = option(list('a)) function fail() : t(int) = - AENS.resolve("foo.aet", "whatever") + AENSv2.resolve("foo.aet", "whatever") entrypoint main_fun() = () diff --git a/test/contracts/bad_aens_resolve_using.aes b/test/contracts/bad_aens_resolve_using.aes index 8556f46..5b367e7 100644 --- a/test/contracts/bad_aens_resolve_using.aes +++ b/test/contracts/bad_aens_resolve_using.aes @@ -1,9 +1,9 @@ contract BadAENSresolve = - using AENS + using AENSv2 type t('a) = option(list('a)) function fail() : t(int) = resolve("foo.aet", "whatever") - entrypoint main_fun() = () \ No newline at end of file + entrypoint main_fun() = () diff --git a/test/contracts/polymorphic_aens_resolve.aes b/test/contracts/polymorphic_aens_resolve.aes index 0bd9cc8..15517dd 100644 --- a/test/contracts/polymorphic_aens_resolve.aes +++ b/test/contracts/polymorphic_aens_resolve.aes @@ -1,7 +1,7 @@ contract PolymorphicAENSresolve = function fail() : option('a) = - AENS.resolve("foo.aet", "whatever") + AENSv2.resolve("foo.aet", "whatever") entrypoint main_fun() = () diff --git a/test/contracts/unapplied_builtins.aes b/test/contracts/unapplied_builtins.aes index 169a29b..5a8b340 100644 --- a/test/contracts/unapplied_builtins.aes +++ b/test/contracts/unapplied_builtins.aes @@ -2,10 +2,10 @@ // Named argument builtins are: // Oracle.register // Oracle.respond -// AENS.preclaim -// AENS.claim -// AENS.transfer -// AENS.revoke +// AENSv2.preclaim +// AENSv2.claim +// AENSv2.transfer +// AENSv2.revoke // Oracle.extend include "String.aes" contract UnappliedBuiltins = @@ -28,7 +28,7 @@ contract UnappliedBuiltins = function oracle_get_answer() = Oracle.get_answer : (o, _) => _ function oracle_check() = Oracle.check : o => _ function oracle_check_query() = Oracle.check_query : (o, _) => _ - function aens_resolve() = AENS.resolve : (_, _) => option(string) + function aens_resolve() = AENSv2.resolve : (_, _) => option(string) function map_lookup() = Map.lookup : (_, m) => _ function map_lookup_default() = Map.lookup_default : (_, m, _) => _ function map_member() = Map.member : (_, m) => _