[Ceres]: Introduce AENSv2 to add raw data pointers (#426)
Remove unused variable in AENSCompat
This commit is contained in:
parent
88a23621f3
commit
31f8f36eb5
@ -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.
|
- `Int.mulmod` - combined builtin operation for multiplication and modulus.
|
||||||
- `Crypto.poseidon` - a ZK/SNARK-friendly hash function (over the BLS12-381 scalar field).
|
- `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.).
|
- `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
|
### Changed
|
||||||
### Removed
|
### Removed
|
||||||
- `Bitwise.aes` standard library is removed - the builtin operations are superior.
|
- `Bitwise.aes` standard library is removed - the builtin operations are superior.
|
||||||
|
@ -14,6 +14,7 @@ The out-of-the-box namespaces are:
|
|||||||
|
|
||||||
- [Address](#address)
|
- [Address](#address)
|
||||||
- [AENS](#aens)
|
- [AENS](#aens)
|
||||||
|
- [AENSv2](#aensv2)
|
||||||
- [Auth](#auth)
|
- [Auth](#auth)
|
||||||
- [Bits](#bits)
|
- [Bits](#bits)
|
||||||
- [Bytes](#bytes)
|
- [Bytes](#bytes)
|
||||||
@ -31,6 +32,7 @@ The following ones need to be included as regular files with `.aes` suffix, for
|
|||||||
include "List.aes"
|
include "List.aes"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- [AENSCompat](#aenscompat)
|
||||||
- [Bitwise](#bitwise)
|
- [Bitwise](#bitwise)
|
||||||
- [BLS12_381](#bls12_381)
|
- [BLS12_381](#bls12_381)
|
||||||
- [Func](#func)
|
- [Func](#func)
|
||||||
@ -90,13 +92,10 @@ Cast address to contract type C (where `C` is a contract)
|
|||||||
|
|
||||||
### AENS
|
### AENS
|
||||||
|
|
||||||
The following functionality is available for interacting with the æternity
|
The old AENS namespace, kept in the compiler to be able to interact with
|
||||||
naming system (AENS).
|
contracts from before Ceres, compiled using aesophia compiler version 7.x and
|
||||||
If `owner` is equal to `Contract.address` the signature `signature` is
|
earlier. Used in [AENSCompat](#aenscompat) when converting between old and new
|
||||||
ignored, and can be left out since it is a named argument. Otherwise we need
|
pointers.
|
||||||
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
|
#### Types
|
||||||
|
|
||||||
@ -113,12 +112,41 @@ datatype pointee = AccountPt(address) | OraclePt(address)
|
|||||||
| ContractPt(address) | ChannelPt(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
|
#### Functions
|
||||||
|
|
||||||
##### resolve
|
##### 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
|
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
|
##### 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
|
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.
|
`pointees` for the name. Note: the expiry of the name is always a fixed TTL.
|
||||||
For example:
|
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
|
##### preclaim
|
||||||
```
|
```
|
||||||
AENS.preclaim(owner : address, commitment_hash : hash, <signature : signature>) : unit
|
AENSv2.preclaim(owner : address, commitment_hash : hash, <signature : signature>) : unit
|
||||||
```
|
```
|
||||||
|
|
||||||
The [signature](./sophia_features.md#delegation-signature) should be over
|
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
|
##### claim
|
||||||
```
|
```
|
||||||
AENS.claim(owner : address, name : string, salt : int, name_fee : int, <signature : signature>) : unit
|
AENSv2.claim(owner : address, name : string, salt : int, name_fee : int, <signature : signature>) : unit
|
||||||
```
|
```
|
||||||
|
|
||||||
The [signature](./sophia_features.md#delegation-signature) should be over
|
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
|
##### transfer
|
||||||
```
|
```
|
||||||
AENS.transfer(owner : address, new_owner : address, name : string, <signature : signature>) : unit
|
AENSv2.transfer(owner : address, new_owner : address, name : string, <signature : signature>) : unit
|
||||||
```
|
```
|
||||||
|
|
||||||
Transfers name to the new owner.
|
Transfers name to the new owner.
|
||||||
@ -176,7 +205,7 @@ using the private key of the `owner` account for signing.
|
|||||||
|
|
||||||
##### revoke
|
##### revoke
|
||||||
```
|
```
|
||||||
AENS.revoke(owner : address, name : string, <signature : signature>) : unit
|
AENSv2.revoke(owner : address, name : string, <signature : signature>) : unit
|
||||||
```
|
```
|
||||||
|
|
||||||
Revokes the name to extend the ownership time.
|
Revokes the name to extend the ownership time.
|
||||||
@ -189,14 +218,15 @@ using the private key of the `owner` account for signing.
|
|||||||
|
|
||||||
##### update
|
##### update
|
||||||
```
|
```
|
||||||
AENS.update(owner : address, name : string, expiry : option(Chain.ttl), client_ttl : option(int),
|
AENSv2.update(owner : address, name : string, expiry : option(Chain.ttl), client_ttl : option(int),
|
||||||
new_ptrs : option(map(string, AENS.pointee)), <signature : signature>) : unit
|
new_ptrs : option(map(string, AENSv2.pointee)), <signature : signature>) : unit
|
||||||
```
|
```
|
||||||
|
|
||||||
Updates the name. If the optional parameters are set to `None` that parameter
|
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
|
will not be updated, for example if `None` is passed as `expiry` the expiry
|
||||||
block of the name is not changed.
|
block of the name is not changed.
|
||||||
|
|
||||||
|
Note: Changed to consume `AENSv2.pointee` in v8.0 (Ceres protocol upgrade).
|
||||||
|
|
||||||
### Auth
|
### 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)
|
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
|
### BLS12\_381
|
||||||
|
|
||||||
#### Types
|
#### Types
|
||||||
|
17
priv/stdlib/AENSCompat.aes
Normal file
17
priv/stdlib/AENSCompat.aes
Normal file
@ -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
|
@ -593,6 +593,8 @@ global_env() ->
|
|||||||
TTL = {qid, Ann, ["Chain", "ttl"]},
|
TTL = {qid, Ann, ["Chain", "ttl"]},
|
||||||
Pointee = {qid, Ann, ["AENS", "pointee"]},
|
Pointee = {qid, Ann, ["AENS", "pointee"]},
|
||||||
AENSName = {qid, Ann, ["AENS", "name"]},
|
AENSName = {qid, Ann, ["AENS", "name"]},
|
||||||
|
PointeeV2 = {qid, Ann, ["AENSv2", "pointee"]},
|
||||||
|
AENSNameV2 = {qid, Ann, ["AENSv2", "name"]},
|
||||||
Fr = {qid, Ann, ["MCL_BLS12_381", "fr"]},
|
Fr = {qid, Ann, ["MCL_BLS12_381", "fr"]},
|
||||||
Fp = {qid, Ann, ["MCL_BLS12_381", "fp"]},
|
Fp = {qid, Ann, ["MCL_BLS12_381", "fp"]},
|
||||||
Fp2 = {tuple_t, Ann, [Fp, Fp]},
|
Fp2 = {tuple_t, Ann, [Fp, Fp]},
|
||||||
@ -728,14 +730,7 @@ global_env() ->
|
|||||||
|
|
||||||
AENSScope = #scope
|
AENSScope = #scope
|
||||||
{ funs = MkDefs(
|
{ funs = MkDefs(
|
||||||
[{"resolve", Fun([String, String], option_t(Ann, A))},
|
[%% AENS pointee constructors
|
||||||
{"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
|
|
||||||
{"AccountPt", Fun1(Address, Pointee)},
|
{"AccountPt", Fun1(Address, Pointee)},
|
||||||
{"OraclePt", Fun1(Address, Pointee)},
|
{"OraclePt", Fun1(Address, Pointee)},
|
||||||
{"ContractPt", Fun1(Address, Pointee)},
|
{"ContractPt", Fun1(Address, Pointee)},
|
||||||
@ -745,6 +740,26 @@ global_env() ->
|
|||||||
])
|
])
|
||||||
, types = MkDefs([{"pointee", 0}, {"name", 0}]) },
|
, 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
|
MapScope = #scope
|
||||||
{ funs = MkDefs(
|
{ funs = MkDefs(
|
||||||
[{"from_list", Fun1(List(Pair(K, V)), Map(K, V))},
|
[{"from_list", Fun1(List(Pair(K, V)), Map(K, V))},
|
||||||
@ -867,6 +882,7 @@ global_env() ->
|
|||||||
, ["Call"] => CallScope
|
, ["Call"] => CallScope
|
||||||
, ["Oracle"] => OracleScope
|
, ["Oracle"] => OracleScope
|
||||||
, ["AENS"] => AENSScope
|
, ["AENS"] => AENSScope
|
||||||
|
, ["AENSv2"] => AENSv2Scope
|
||||||
, ["Map"] => MapScope
|
, ["Map"] => MapScope
|
||||||
, ["Auth"] => AuthScope
|
, ["Auth"] => AuthScope
|
||||||
, ["Crypto"] => CryptoScope
|
, ["Crypto"] => CryptoScope
|
||||||
@ -2019,7 +2035,7 @@ infer_expr(Env, {app, Ann, Fun, Args0} = App) ->
|
|||||||
unify(Env, FunType, {fun_t, [], NamedArgsVar, ArgTypes, GeneralResultType}, When),
|
unify(Env, FunType, {fun_t, [], NamedArgsVar, ArgTypes, GeneralResultType}, When),
|
||||||
when_warning(warn_negative_spend, fun() -> warn_potential_negative_spend(Ann, NewFun1, NewArgs) end),
|
when_warning(warn_negative_spend, fun() -> warn_potential_negative_spend(Ann, NewFun1, NewArgs) end),
|
||||||
[ add_constraint({aens_resolve_type, GeneralResultType})
|
[ add_constraint({aens_resolve_type, GeneralResultType})
|
||||||
|| element(3, FunName) =:= ["AENS", "resolve"] ],
|
|| element(3, FunName) =:= ["AENSv2", "resolve"] ],
|
||||||
[ add_constraint({oracle_type, Ann, OType})
|
[ add_constraint({oracle_type, Ann, OType})
|
||||||
|| OType <- [get_oracle_type(FunName, ArgTypes, GeneralResultType)],
|
|| OType <- [get_oracle_type(FunName, ArgTypes, GeneralResultType)],
|
||||||
OType =/= false ],
|
OType =/= false ],
|
||||||
@ -3928,7 +3944,7 @@ mk_error({higher_order_entrypoint, Ann, {id, _, Name}, Thing}) ->
|
|||||||
[ThingS, Name, Bad]),
|
[ThingS, Name, Bad]),
|
||||||
mk_t_err(pos(Ann), Msg);
|
mk_t_err(pos(Ann), Msg);
|
||||||
mk_error({invalid_aens_resolve_type, Ann, T}) ->
|
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"
|
"~s`\n"
|
||||||
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)",
|
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)",
|
||||||
[pp_type(" `", T)]),
|
[pp_type(" `", T)]),
|
||||||
|
@ -225,6 +225,12 @@ init_env(Options) ->
|
|||||||
["AENS", "ContractPt"] => #con_tag{ tag = 2, arities = [1, 1, 1, 1] },
|
["AENS", "ContractPt"] => #con_tag{ tag = 2, arities = [1, 1, 1, 1] },
|
||||||
["AENS", "ChannelPt"] => #con_tag{ tag = 3, arities = [1, 1, 1, 1] },
|
["AENS", "ChannelPt"] => #con_tag{ tag = 3, arities = [1, 1, 1, 1] },
|
||||||
["AENS", "Name"] => #con_tag{ tag = 0, arities = [3] },
|
["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", "GAMetaTx"] => #con_tag{ tag = 0, arities = [2] },
|
||||||
["Chain", "PayingForTx"] => #con_tag{ tag = 0, arities = [2] },
|
["Chain", "PayingForTx"] => #con_tag{ tag = 0, arities = [2] },
|
||||||
["Chain", "SpendTx"] => #con_tag{ tag = 0, arities = ChainTxArities },
|
["Chain", "SpendTx"] => #con_tag{ tag = 0, arities = ChainTxArities },
|
||||||
@ -257,8 +263,11 @@ init_env(Options) ->
|
|||||||
|
|
||||||
-spec builtins() -> builtins().
|
-spec builtins() -> builtins().
|
||||||
builtins() ->
|
builtins() ->
|
||||||
MkName = fun(NS, Fun) ->
|
MkName = fun
|
||||||
list_to_atom(string:to_lower(string:join(NS ++ [Fun], "_")))
|
(["AENSv2"], Fun) ->
|
||||||
|
list_to_atom(string:to_lower("AENS_" ++ Fun));
|
||||||
|
(NS, Fun) ->
|
||||||
|
list_to_atom(string:to_lower(string:join(NS ++ [Fun], "_")))
|
||||||
end,
|
end,
|
||||||
Scopes = [{[], [{"abort", 1}, {"require", 2}, {"exit", 1}]},
|
Scopes = [{[], [{"abort", 1}, {"require", 2}, {"exit", 1}]},
|
||||||
{["Chain"], [{"spend", 2}, {"balance", 1}, {"block_hash", 1}, {"coinbase", none},
|
{["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},
|
{["Oracle"], [{"register", 4}, {"expiry", 1}, {"query_fee", 1}, {"query", 5}, {"get_question", 2},
|
||||||
{"respond", 4}, {"extend", 3}, {"get_answer", 2},
|
{"respond", 4}, {"extend", 3}, {"get_answer", 2},
|
||||||
{"check", 1}, {"check_query", 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}]},
|
{"revoke", 3}, {"update", 6}, {"lookup", 1}]},
|
||||||
{["Map"], [{"from_list", 1}, {"to_list", 1}, {"lookup", 2},
|
{["Map"], [{"from_list", 1}, {"to_list", 1}, {"lookup", 2},
|
||||||
{"lookup_default", 3}, {"delete", 2}, {"member", 2}, {"size", 1}]},
|
{"lookup_default", 3}, {"delete", 2}, {"member", 2}, {"size", 1}]},
|
||||||
@ -327,11 +336,13 @@ init_type_env() ->
|
|||||||
["Chain", "ttl"] => ?type({variant, [[integer], [integer]]}),
|
["Chain", "ttl"] => ?type({variant, [[integer], [integer]]}),
|
||||||
["AENS", "pointee"] => ?type({variant, [[address], [address], [address], [address]]}),
|
["AENS", "pointee"] => ?type({variant, [[address], [address], [address], [address]]}),
|
||||||
["AENS", "name"] => ?type({variant, [[address, {variant, [[integer], [integer]]}, {map, string, {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", "ga_meta_tx"] => ?type({variant, [[address, integer]]}),
|
||||||
["Chain", "paying_for_tx"] => ?type({variant, [[address, integer]]}),
|
["Chain", "paying_for_tx"] => ?type({variant, [[address, integer]]}),
|
||||||
["Chain", "base_tx"] => ?type(BaseTx),
|
["Chain", "base_tx"] => ?type(BaseTx),
|
||||||
["MCL_BLS12_381", "fr"] => ?type({bytes, 32}),
|
["MCL_BLS12_381", "fr"] => ?type({bytes, 32}),
|
||||||
["MCL_BLS12_381", "fp"] => ?type({bytes, 48})
|
["MCL_BLS12_381", "fp"] => ?type({bytes, 48})
|
||||||
}.
|
}.
|
||||||
|
|
||||||
-spec is_no_code(env()) -> boolean().
|
-spec is_no_code(env()) -> boolean().
|
||||||
|
@ -88,7 +88,7 @@ from_fate_builtin(QType, Val) ->
|
|||||||
|
|
||||||
{["AENS", "name"], {variant, [3], 0, {Addr, TTL, Ptrs}}} ->
|
{["AENS", "name"], {variant, [3], 0, {Addr, TTL, Ptrs}}} ->
|
||||||
App(["AENS","Name"], [Chk(Adr, Addr), Chk(Qid(["Chain", "ttl"]), TTL),
|
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}}} ->
|
{["AENS", "pointee"], {variant, [1, 1, 1, 1], 0, {Addr}}} ->
|
||||||
App(["AENS","AccountPt"], [Chk(Adr, 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}}} ->
|
{["AENS", "pointee"], {variant, [1, 1, 1, 1], 3, {Addr}}} ->
|
||||||
App(["AENS","ChannelPt"], [Chk(Adr, 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}}} ->
|
{["Chain", "ga_meta_tx"], {variant, [2], 0, {Addr, X}}} ->
|
||||||
App(["Chain","GAMetaTx"], [Chk(Adr, Addr), Chk(Int, X)]);
|
App(["Chain","GAMetaTx"], [Chk(Adr, Addr), Chk(Int, X)]);
|
||||||
|
|
||||||
|
@ -1105,19 +1105,19 @@ failing_contracts() ->
|
|||||||
])
|
])
|
||||||
, ?TYPE_ERROR(polymorphic_aens_resolve,
|
, ?TYPE_ERROR(polymorphic_aens_resolve,
|
||||||
[<<?Pos(4,5)
|
[<<?Pos(4,5)
|
||||||
"Invalid return type of `AENS.resolve`:\n"
|
"Invalid return type of `AENSv2.resolve`:\n"
|
||||||
" `'a`\n"
|
" `'a`\n"
|
||||||
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)">>
|
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)">>
|
||||||
])
|
])
|
||||||
, ?TYPE_ERROR(bad_aens_resolve,
|
, ?TYPE_ERROR(bad_aens_resolve,
|
||||||
[<<?Pos(6,5)
|
[<<?Pos(6,5)
|
||||||
"Invalid return type of `AENS.resolve`:\n"
|
"Invalid return type of `AENSv2.resolve`:\n"
|
||||||
" `list(int)`\n"
|
" `list(int)`\n"
|
||||||
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)">>
|
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)">>
|
||||||
])
|
])
|
||||||
, ?TYPE_ERROR(bad_aens_resolve_using,
|
, ?TYPE_ERROR(bad_aens_resolve_using,
|
||||||
[<<?Pos(7,5)
|
[<<?Pos(7,5)
|
||||||
"Invalid return type of `AENS.resolve`:\n"
|
"Invalid return type of `AENSv2.resolve`:\n"
|
||||||
" `list(int)`\n"
|
" `list(int)`\n"
|
||||||
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)">>
|
"It must be a `string` or a pubkey type (`address`, `oracle`, etc)">>
|
||||||
])
|
])
|
||||||
|
@ -6,77 +6,77 @@ main contract AENSTest =
|
|||||||
// Name resolution
|
// Name resolution
|
||||||
|
|
||||||
stateful entrypoint resolve_word(name : string, key : string) : option(address) =
|
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) =
|
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) =
|
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)) =
|
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)) =
|
stateful entrypoint resolve_oracle_query(name : string, key : string) : option(oracle_query(int, int)) =
|
||||||
AENS.resolve(name, key)
|
AENSv2.resolve(name, key)
|
||||||
|
|
||||||
// Transactions
|
// Transactions
|
||||||
|
|
||||||
stateful entrypoint preclaim(addr : address, // Claim on behalf of this account (can be Contract.address)
|
stateful entrypoint preclaim(addr : address, // Claim on behalf of this account (can be Contract.address)
|
||||||
chash : hash) : unit = // Commitment hash
|
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)
|
stateful entrypoint signedPreclaim(addr : address, // Claim on behalf of this account (can be Contract.address)
|
||||||
chash : hash, // Commitment hash
|
chash : hash, // Commitment hash
|
||||||
sign : signature) : unit = // Signed by addr (if not Contract.address)
|
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,
|
stateful entrypoint claim(addr : address,
|
||||||
name : string,
|
name : string,
|
||||||
salt : int,
|
salt : int,
|
||||||
name_fee : int) : unit =
|
name_fee : int) : unit =
|
||||||
AENS.claim(addr, name, salt, name_fee)
|
AENSv2.claim(addr, name, salt, name_fee)
|
||||||
|
|
||||||
stateful entrypoint signedClaim(addr : address,
|
stateful entrypoint signedClaim(addr : address,
|
||||||
name : string,
|
name : string,
|
||||||
salt : int,
|
salt : int,
|
||||||
name_fee : int,
|
name_fee : int,
|
||||||
sign : signature) : unit =
|
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,
|
stateful entrypoint update(owner : address,
|
||||||
name : string,
|
name : string,
|
||||||
ttl : option(Chain.ttl),
|
ttl : option(Chain.ttl),
|
||||||
client_ttl : option(int),
|
client_ttl : option(int),
|
||||||
pointers : option(map(string, AENS.pointee))) : unit =
|
pointers : option(map(string, AENSv2.pointee))) : unit =
|
||||||
AENS.update(owner, name, ttl, client_ttl, pointers)
|
AENSv2.update(owner, name, ttl, client_ttl, pointers)
|
||||||
|
|
||||||
stateful entrypoint signedUpdate(owner : address,
|
stateful entrypoint signedUpdate(owner : address,
|
||||||
name : string,
|
name : string,
|
||||||
ttl : option(Chain.ttl),
|
ttl : option(Chain.ttl),
|
||||||
client_ttl : option(int),
|
client_ttl : option(int),
|
||||||
pointers : option(map(string, AENS.pointee)),
|
pointers : option(map(string, AENSv2.pointee)),
|
||||||
sign : signature) : unit =
|
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,
|
stateful entrypoint transfer(owner : address,
|
||||||
new_owner : address,
|
new_owner : address,
|
||||||
name : string) : unit =
|
name : string) : unit =
|
||||||
AENS.transfer(owner, new_owner, name)
|
AENSv2.transfer(owner, new_owner, name)
|
||||||
|
|
||||||
stateful entrypoint signedTransfer(owner : address,
|
stateful entrypoint signedTransfer(owner : address,
|
||||||
new_owner : address,
|
new_owner : address,
|
||||||
name : string,
|
name : string,
|
||||||
sign : signature) : unit =
|
sign : signature) : unit =
|
||||||
AENS.transfer(owner, new_owner, name, signature = sign)
|
AENSv2.transfer(owner, new_owner, name, signature = sign)
|
||||||
|
|
||||||
stateful entrypoint revoke(owner : address,
|
stateful entrypoint revoke(owner : address,
|
||||||
name : string) : unit =
|
name : string) : unit =
|
||||||
AENS.revoke(owner, name)
|
AENSv2.revoke(owner, name)
|
||||||
|
|
||||||
stateful entrypoint signedRevoke(owner : address,
|
stateful entrypoint signedRevoke(owner : address,
|
||||||
name : string,
|
name : string,
|
||||||
sign : signature) : unit =
|
sign : signature) : unit =
|
||||||
AENS.revoke(owner, name, signature = sign)
|
AENSv2.revoke(owner, name, signature = sign)
|
||||||
|
@ -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) =
|
stateful entrypoint update_name(owner : address, name : string) =
|
||||||
let p1 : AENS.pointee = AENS.AccountPt(Call.caller)
|
let p1 : AENSv2.pointee = AENSv2.AccountPt(Call.caller)
|
||||||
let p2 : AENS.pointee = AENS.OraclePt(Call.caller)
|
let p2 : AENSv2.pointee = AENSv2.OraclePt(Call.caller)
|
||||||
let p3 : AENS.pointee = AENS.ContractPt(Call.caller)
|
let p3 : AENSv2.pointee = AENSv2.ContractPt(Call.caller)
|
||||||
let p4 : AENS.pointee = AENS.ChannelPt(Call.caller)
|
let p4 : AENSv2.pointee = AENSv2.ChannelPt(Call.caller)
|
||||||
AENS.update(owner, name, None, None,
|
let p5 : AENSv2.pointee = AENSv2.DataPt("any something will do")
|
||||||
Some({ ["account_pubkey"] = p1, ["oracle_pubkey"] = p2,
|
AENSv2.update(owner, name, None, None,
|
||||||
["contract_pubkey"] = p3, ["misc"] = p4 }))
|
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) =
|
entrypoint get_ttl(name : string) =
|
||||||
switch(AENS.lookup(name))
|
switch(AENSv2.lookup(name))
|
||||||
Some(AENS.Name(_, FixedTTL(ttl), _)) => ttl
|
Some(AENSv2.Name(_, FixedTTL(ttl), _)) => ttl
|
||||||
|
|
||||||
entrypoint expiry(o : oracle(int, int)) : int =
|
entrypoint expiry(o : oracle(int, int)) : int =
|
||||||
Oracle.expiry(o)
|
Oracle.expiry(o)
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ contract BadAENSresolve =
|
|||||||
type t('a) = option(list('a))
|
type t('a) = option(list('a))
|
||||||
|
|
||||||
function fail() : t(int) =
|
function fail() : t(int) =
|
||||||
AENS.resolve("foo.aet", "whatever")
|
AENSv2.resolve("foo.aet", "whatever")
|
||||||
|
|
||||||
entrypoint main_fun() = ()
|
entrypoint main_fun() = ()
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
contract BadAENSresolve =
|
contract BadAENSresolve =
|
||||||
using AENS
|
using AENSv2
|
||||||
|
|
||||||
type t('a) = option(list('a))
|
type t('a) = option(list('a))
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
contract PolymorphicAENSresolve =
|
contract PolymorphicAENSresolve =
|
||||||
|
|
||||||
function fail() : option('a) =
|
function fail() : option('a) =
|
||||||
AENS.resolve("foo.aet", "whatever")
|
AENSv2.resolve("foo.aet", "whatever")
|
||||||
|
|
||||||
entrypoint main_fun() = ()
|
entrypoint main_fun() = ()
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
// Named argument builtins are:
|
// Named argument builtins are:
|
||||||
// Oracle.register
|
// Oracle.register
|
||||||
// Oracle.respond
|
// Oracle.respond
|
||||||
// AENS.preclaim
|
// AENSv2.preclaim
|
||||||
// AENS.claim
|
// AENSv2.claim
|
||||||
// AENS.transfer
|
// AENSv2.transfer
|
||||||
// AENS.revoke
|
// AENSv2.revoke
|
||||||
// Oracle.extend
|
// Oracle.extend
|
||||||
include "String.aes"
|
include "String.aes"
|
||||||
contract UnappliedBuiltins =
|
contract UnappliedBuiltins =
|
||||||
@ -28,7 +28,7 @@ contract UnappliedBuiltins =
|
|||||||
function oracle_get_answer() = Oracle.get_answer : (o, _) => _
|
function oracle_get_answer() = Oracle.get_answer : (o, _) => _
|
||||||
function oracle_check() = Oracle.check : o => _
|
function oracle_check() = Oracle.check : o => _
|
||||||
function oracle_check_query() = Oracle.check_query : (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() = Map.lookup : (_, m) => _
|
||||||
function map_lookup_default() = Map.lookup_default : (_, m, _) => _
|
function map_lookup_default() = Map.lookup_default : (_, m, _) => _
|
||||||
function map_member() = Map.member : (_, m) => _
|
function map_member() = Map.member : (_, m) => _
|
||||||
|
Loading…
x
Reference in New Issue
Block a user