diff --git a/docs/sophia_stdlib.md b/docs/sophia_stdlib.md index c80dfc8..17b2ea4 100644 --- a/docs/sophia_stdlib.md +++ b/docs/sophia_stdlib.md @@ -142,7 +142,7 @@ datatype name = Name(address, Chain.ttl, map(string, AENSv2.pointee)) ``` datatype pointee = AccountPt(address) | OraclePt(address) - | ContractPt(address) | ChannelPt(address) | DataPt(string) + | ContractPt(address) | ChannelPt(address) | DataPt(bytes()) ``` Note: on-chain there is a maximum length enforced for `DataPt`, it is 1024 bytes. @@ -425,7 +425,7 @@ Bytes.to_fixed_size(a : bytes()) : option(bytes(n)) ``` Converts an arbitrary size byte array to a fix size byte array. If `a` is -`n` bytes, `None` is returned. +not `n` bytes, `None` is returned. #### to\_any\_size ``` diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 7056024..5cbf654 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -756,7 +756,7 @@ global_env() -> {"OraclePt", Fun1(Address, PointeeV2)}, {"ContractPt", Fun1(Address, PointeeV2)}, {"ChannelPt", Fun1(Address, PointeeV2)}, - {"DataPt", Fun1(String, PointeeV2)}, + {"DataPt", Fun1(Bytes(any), PointeeV2)}, %% Name object constructor v2 {"Name", Fun([Address, TTL, Map(String, PointeeV2)], AENSNameV2)} ]) diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 7a5d05e..5ef87f5 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -337,8 +337,8 @@ 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]]}}]]}), + ["AENSv2", "pointee"] => ?type({variant, [[address], [address], [address], [address], [{bytes, any}]]}), + ["AENSv2", "name"] => ?type({variant, [[address, {variant, [[integer], [integer]]}, {map, string, {variant, [[address], [address], [address], [address], [{bytes, any}]]}}]]}), ["Chain", "ga_meta_tx"] => ?type({variant, [[address, integer]]}), ["Chain", "paying_for_tx"] => ?type({variant, [[address, integer]]}), ["Chain", "base_tx"] => ?type(BaseTx), diff --git a/src/aeso_vm_decode.erl b/src/aeso_vm_decode.erl index e1941b8..cbbebd5 100644 --- a/src/aeso_vm_decode.erl +++ b/src/aeso_vm_decode.erl @@ -15,6 +15,7 @@ from_fate({id, _, "address"}, ?FATE_ADDRESS(Bin)) -> {account_pubkey, [], Bin}; from_fate({app_t, _, {id, _, "oracle"}, _}, ?FATE_ORACLE(Bin)) -> {oracle_pubkey, [], Bin}; from_fate({app_t, _, {id, _, "oracle_query"}, _}, ?FATE_ORACLE_Q(Bin)) -> {oracle_query_id, [], Bin}; from_fate({con, _, _Name}, ?FATE_CONTRACT(Bin)) -> {contract_pubkey, [], Bin}; +from_fate({bytes_t, _, any}, ?FATE_BYTES(Bin)) -> {bytes, [], Bin}; from_fate({bytes_t, _, N}, ?FATE_BYTES(Bin)) when byte_size(Bin) == N -> {bytes, [], Bin}; from_fate({id, _, "bits"}, ?FATE_BITS(N)) -> make_bits(N); from_fate({id, _, "int"}, N) when is_integer(N) -> @@ -78,6 +79,7 @@ from_fate_builtin(QType, Val) -> Hsh = {bytes_t, [], 32}, I32 = {bytes_t, [], 32}, I48 = {bytes_t, [], 48}, + Bts = {bytes_t, [], any}, Qid = fun(Name) -> {qid, [], Name} end, Map = fun(KT, VT) -> {app_t, [], {id, [], "map"}, [KT, VT]} end, ChainTxArities = [3, 0, 0, 0, 0, 0, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 0], @@ -103,16 +105,16 @@ from_fate_builtin(QType, Val) -> 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)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 0, {Value}}} -> + App(["AENSv2","AccountPt"], [Chk(Adr, Value)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 1, {Value}}} -> + App(["AENSv2","OraclePt"], [Chk(Adr, Value)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 2, {Value}}} -> + App(["AENSv2","ContractPt"], [Chk(Adr, Value)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 3, {Value}}} -> + App(["AENSv2","ChannelPt"], [Chk(Adr, Value)]); + {["AENSv2", "pointee"], {variant, [1, 1, 1, 1, 1], 4, {Value}}} -> + App(["AENSv2","DataPt"], [Chk(Bts, Value)]); {["Chain", "ga_meta_tx"], {variant, [2], 0, {Addr, X}}} -> App(["Chain","GAMetaTx"], [Chk(Adr, Addr), Chk(Int, X)]); diff --git a/test/contracts/aens_update.aes b/test/contracts/aens_update.aes index 3b8fc7c..9a0804d 100644 --- a/test/contracts/aens_update.aes +++ b/test/contracts/aens_update.aes @@ -1,19 +1,21 @@ include "Option.aes" +include "String.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, b : bytes(2)) = 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") + let p5 : AENSv2.pointee = AENSv2.DataPt(String.to_bytes("any something will do")) + let p6 : AENSv2.pointee = AENSv2.DataPt(Int.to_bytes(1345, 4)) AENSv2.update(owner, name, None, None, Some({ ["account_pubkey"] = p1, ["oracle_pubkey"] = p2, - ["contract_pubkey"] = p3, ["misc"] = p4, ["data"] = p5 })) + ["contract_pubkey"] = p3, ["misc"] = p4, ["data"] = p5, ["data2"] = p6 })) stateful entrypoint old_interaction(c : OldAENSContract, owner : address, name : string) = let p : AENS.pointee = c.lookup(name, "key1")