Change Chain.block_hash to return option(hash)

This commit is contained in:
Hans Svensson 2019-06-27 14:19:39 +02:00
parent 502a4e6464
commit a617a6469d
5 changed files with 12 additions and 5 deletions

View File

@ -11,7 +11,7 @@
{git,"https://github.com/aeternity/erl-base58.git", {git,"https://github.com/aeternity/erl-base58.git",
{ref,"60a335668a60328a29f9731b67c4a0e9e3d50ab6"}}, {ref,"60a335668a60328a29f9731b67c4a0e9e3d50ab6"}},
2}, 2},
{<<"eblake2">>,{pkg,<<"eblake2">>,<<"1.0.0">>},1}, {<<"eblake2">>,{pkg,<<"eblake2">>,<<"1.0.0">>},0},
{<<"getopt">>,{pkg,<<"getopt">>,<<"1.0.1">>},0}, {<<"getopt">>,{pkg,<<"getopt">>,<<"1.0.1">>},0},
{<<"jsx">>, {<<"jsx">>,
{git,"https://github.com/talentdeficit/jsx.git", {git,"https://github.com/talentdeficit/jsx.git",

View File

@ -136,7 +136,7 @@ on_current_scope(Env = #env{ namespace = NS, scopes = Scopes }, Fun) ->
Env#env{ scopes = Scopes#{ NS => Fun(Scope) } }. Env#env{ scopes = Scopes#{ NS => Fun(Scope) } }.
-spec on_scopes(env(), fun((scope()) -> scope())) -> env(). -spec on_scopes(env(), fun((scope()) -> scope())) -> env().
on_scopes(Env = #env{ namespace = NS, scopes = Scopes }, Fun) -> on_scopes(Env = #env{ scopes = Scopes }, Fun) ->
Env#env{ scopes = maps:map(fun(_, Scope) -> Fun(Scope) end, Scopes) }. Env#env{ scopes = maps:map(fun(_, Scope) -> Fun(Scope) end, Scopes) }.
-spec bind_var(aeso_syntax:id(), type(), env()) -> env(). -spec bind_var(aeso_syntax:id(), type(), env()) -> env().
@ -401,7 +401,7 @@ global_env() ->
[{"spend", StateFun([Address, Int], Unit)}, [{"spend", StateFun([Address, Int], Unit)},
%% Chain environment %% Chain environment
{"balance", Fun1(Address, Int)}, {"balance", Fun1(Address, Int)},
{"block_hash", Fun1(Int, Int)}, {"block_hash", Fun1(Int, Option(Hash))},
{"coinbase", Address}, {"coinbase", Address},
{"timestamp", Int}, {"timestamp", Int},
{"block_height", Int}, {"block_height", Int},

View File

@ -141,7 +141,7 @@ ast_body(?qid_app([Con, "Chain", "event"], [Event], _, _), Icode = #{ contract_n
ast_body(?qid_app(["Chain", "balance"], [Address], _, _), Icode) -> ast_body(?qid_app(["Chain", "balance"], [Address], _, _), Icode) ->
#prim_balance{ address = ast_body(Address, Icode) }; #prim_balance{ address = ast_body(Address, Icode) };
ast_body(?qid_app(["Chain", "block_hash"], [Height], _, _), Icode) -> ast_body(?qid_app(["Chain", "block_hash"], [Height], _, _), Icode) ->
#prim_block_hash{ height = ast_body(Height, Icode) }; builtin_call(block_hash, [ast_body(Height, Icode)]);
ast_body(?qid_app(["Call", "gas_left"], [], _, _), _Icode) -> ast_body(?qid_app(["Call", "gas_left"], [], _, _), _Icode) ->
prim_gas_left; prim_gas_left;
ast_body({qid, _, ["Contract", "address"]}, _Icode) -> prim_contract_address; ast_body({qid, _, ["Contract", "address"]}, _Icode) -> prim_contract_address;

View File

@ -130,6 +130,7 @@ builtin_function(BF) ->
case BF of case BF of
{event, EventT} -> bfun(BF, builtin_event(EventT)); {event, EventT} -> bfun(BF, builtin_event(EventT));
abort -> bfun(BF, builtin_abort()); abort -> bfun(BF, builtin_abort());
block_hash -> bfun(BF, builtin_block_hash());
require -> bfun(BF, builtin_require()); require -> bfun(BF, builtin_require());
{map_lookup, Type} -> bfun(BF, builtin_map_lookup(Type)); {map_lookup, Type} -> bfun(BF, builtin_map_lookup(Type));
map_put -> bfun(BF, builtin_map_put()); map_put -> bfun(BF, builtin_map_put());
@ -211,6 +212,12 @@ builtin_abort() ->
A(?REVERT)]}, %% Stack: 0,Ptr A(?REVERT)]}, %% Stack: 0,Ptr
{tuple,[]}}. {tuple,[]}}.
builtin_block_hash() ->
{[{"height", word}],
?LET(hash, #prim_block_hash{ height = ?V(height)},
{ifte, ?EQ(hash, 0), option_none(), option_some(?V(hash))}),
aeso_icode:option_typerep(word)}.
builtin_require() -> builtin_require() ->
{[{"c", word}, {"msg", string}], {[{"c", word}, {"msg", string}],
{ifte, ?V(c), {tuple, []}, ?call(abort, [?V(msg)])}, {ifte, ?V(c), {tuple, []}, ?call(abort, [?V(msg)])},

View File

@ -50,7 +50,7 @@ contract Environment =
function get_balance(acct : address) : int = Chain.balance(acct) function get_balance(acct : address) : int = Chain.balance(acct)
// Block hash // Block hash
function block_hash(height : int) : int = Chain.block_hash(height) function block_hash(height : int) : option(hash) = Chain.block_hash(height)
// Coinbase // Coinbase
function coinbase() : address = Chain.coinbase function coinbase() : address = Chain.coinbase