Add require builtin
This commit is contained in:
parent
5628cf90b8
commit
17a1fd8095
@ -380,7 +380,8 @@ global_env() ->
|
|||||||
{"RelativeTTL", Fun1(Int, TTL)},
|
{"RelativeTTL", Fun1(Int, TTL)},
|
||||||
{"FixedTTL", Fun1(Int, TTL)},
|
{"FixedTTL", Fun1(Int, TTL)},
|
||||||
%% Abort
|
%% Abort
|
||||||
{"abort", Fun1(String, A)}])
|
{"abort", Fun1(String, A)},
|
||||||
|
{"require", Fun([Bool, String], A)}])
|
||||||
, types = MkDefs(
|
, types = MkDefs(
|
||||||
[{"int", 0}, {"bool", 0}, {"char", 0}, {"string", 0}, {"address", 0},
|
[{"int", 0}, {"bool", 0}, {"char", 0}, {"string", 0}, {"address", 0},
|
||||||
{"hash", {[], {alias_t, Bytes(32)}}},
|
{"hash", {[], {alias_t, Bytes(32)}}},
|
||||||
|
@ -170,7 +170,7 @@ builtins() ->
|
|||||||
MkName = fun(NS, Fun) ->
|
MkName = fun(NS, Fun) ->
|
||||||
list_to_atom(string:to_lower(string:join(NS ++ [Fun], "_")))
|
list_to_atom(string:to_lower(string:join(NS ++ [Fun], "_")))
|
||||||
end,
|
end,
|
||||||
Scopes = [{[], [{"abort", 1}]},
|
Scopes = [{[], [{"abort", 1}, {"require", 2}]},
|
||||||
{["Chain"], [{"spend", 2}, {"balance", 1}, {"block_hash", 1}, {"coinbase", none},
|
{["Chain"], [{"spend", 2}, {"balance", 1}, {"block_hash", 1}, {"coinbase", none},
|
||||||
{"timestamp", none}, {"block_height", none}, {"difficulty", none},
|
{"timestamp", none}, {"block_height", none}, {"difficulty", none},
|
||||||
{"gas_limit", none}]},
|
{"gas_limit", none}]},
|
||||||
@ -765,6 +765,8 @@ op_builtins() ->
|
|||||||
bits_difference, int_to_str, address_to_str, crypto_ecverify,
|
bits_difference, int_to_str, address_to_str, crypto_ecverify,
|
||||||
crypto_ecverify_secp256k1, crypto_sha3, crypto_sha256, crypto_blake2b].
|
crypto_ecverify_secp256k1, crypto_sha3, crypto_sha256, crypto_blake2b].
|
||||||
|
|
||||||
|
builtin_to_fcode(require, [Cond, Msg]) ->
|
||||||
|
make_if(Cond, {tuple, []}, {builtin, abort, [Msg]});
|
||||||
builtin_to_fcode(map_delete, [Key, Map]) ->
|
builtin_to_fcode(map_delete, [Key, Map]) ->
|
||||||
{op, map_delete, [Map, Key]};
|
{op, map_delete, [Map, Key]};
|
||||||
builtin_to_fcode(map_member, [Key, Map]) ->
|
builtin_to_fcode(map_member, [Key, Map]) ->
|
||||||
|
@ -174,6 +174,8 @@ ast_body({qid, _, [Con, "put"]}, #{ contract_name := Con }) ->
|
|||||||
%% Abort
|
%% Abort
|
||||||
ast_body(?id_app("abort", [String], _, _), Icode) ->
|
ast_body(?id_app("abort", [String], _, _), Icode) ->
|
||||||
builtin_call(abort, [ast_body(String, Icode)]);
|
builtin_call(abort, [ast_body(String, Icode)]);
|
||||||
|
ast_body(?id_app("require", [Bool, String], _, _), Icode) ->
|
||||||
|
builtin_call(require, [ast_body(Bool, Icode), ast_body(String, Icode)]);
|
||||||
|
|
||||||
%% Authentication
|
%% Authentication
|
||||||
ast_body({qid, _, ["Auth", "tx_hash"]}, _Icode) ->
|
ast_body({qid, _, ["Auth", "tx_hash"]}, _Icode) ->
|
||||||
|
@ -45,6 +45,7 @@ builtin_deps1({baseX_int, X}) -> [{baseX_int_pad, X}];
|
|||||||
builtin_deps1({baseX_int_pad, X}) -> [{baseX_int_encode, X}];
|
builtin_deps1({baseX_int_pad, X}) -> [{baseX_int_encode, X}];
|
||||||
builtin_deps1({baseX_int_encode, X}) -> [{baseX_int_encode_, X}, {baseX_tab, X}, {baseX_digits, X}];
|
builtin_deps1({baseX_int_encode, X}) -> [{baseX_int_encode_, X}, {baseX_tab, X}, {baseX_digits, X}];
|
||||||
builtin_deps1(string_reverse) -> [string_reverse_];
|
builtin_deps1(string_reverse) -> [string_reverse_];
|
||||||
|
builtin_deps1(require) -> [abort];
|
||||||
builtin_deps1(_) -> [].
|
builtin_deps1(_) -> [].
|
||||||
|
|
||||||
dep_closure(Deps) ->
|
dep_closure(Deps) ->
|
||||||
@ -131,6 +132,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());
|
||||||
|
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());
|
||||||
map_delete -> bfun(BF, builtin_map_delete());
|
map_delete -> bfun(BF, builtin_map_delete());
|
||||||
@ -201,6 +203,11 @@ builtin_abort() ->
|
|||||||
A(?REVERT)]}, %% Stack: 0,Ptr
|
A(?REVERT)]}, %% Stack: 0,Ptr
|
||||||
{tuple,[]}}.
|
{tuple,[]}}.
|
||||||
|
|
||||||
|
builtin_require() ->
|
||||||
|
{[{"c", word}, {"msg", string}],
|
||||||
|
{ifte, ?V(c), {tuple, []}, ?call(abort, [?V(msg)])},
|
||||||
|
{tuple, []}}.
|
||||||
|
|
||||||
%% Map primitives
|
%% Map primitives
|
||||||
builtin_map_lookup(Type) ->
|
builtin_map_lookup(Type) ->
|
||||||
Ret = aeso_icode:option_typerep(Type),
|
Ret = aeso_icode:option_typerep(Type),
|
||||||
|
@ -104,10 +104,10 @@ contract AEProof =
|
|||||||
proofsByOwner : map(address, array(uint)) }
|
proofsByOwner : map(address, array(uint)) }
|
||||||
|
|
||||||
function notarize(document:string, comment:string, ipfsHash:hash) =
|
function notarize(document:string, comment:string, ipfsHash:hash) =
|
||||||
let _ = require(aetoken.balanceOf(caller()) > 0)
|
let _ = require(aetoken.balanceOf(caller()) > 0, "false")
|
||||||
let proofHash: uint = calculateHash(document)
|
let proofHash: uint = calculateHash(document)
|
||||||
let proof : proof = Map.get_(proofHash, state().proofs)
|
let proof : proof = Map.get_(proofHash, state().proofs)
|
||||||
let _ = require(proof.owner == #0)
|
let _ = require(proof.owner == #0, "false")
|
||||||
let proof' : proof = proof { owner = caller()
|
let proof' : proof = proof { owner = caller()
|
||||||
, timestamp = block().timestamp
|
, timestamp = block().timestamp
|
||||||
, proofBlock = block().height
|
, proofBlock = block().height
|
||||||
@ -124,12 +124,12 @@ contract AEProof =
|
|||||||
function getProof(document) : proof =
|
function getProof(document) : proof =
|
||||||
let calcHash = calculateHash(document)
|
let calcHash = calculateHash(document)
|
||||||
let proof = Map.get_(calcHash, state().proofs)
|
let proof = Map.get_(calcHash, state().proofs)
|
||||||
let _ = require(proof.owner != #0)
|
let _ = require(proof.owner != #0, "false")
|
||||||
proof
|
proof
|
||||||
|
|
||||||
function getProofByHash(hash: uint) : proof =
|
function getProofByHash(hash: uint) : proof =
|
||||||
let proof = Map.get_(hash, state().proofs)
|
let proof = Map.get_(hash, state().proofs)
|
||||||
let _ = require(proof.owner != #0)
|
let _ = require(proof.owner != #0, "false")
|
||||||
proof
|
proof
|
||||||
|
|
||||||
|
|
||||||
@ -141,5 +141,3 @@ contract AEProof =
|
|||||||
function getProofsByOwner(owner: address): array(uint) =
|
function getProofsByOwner(owner: address): array(uint) =
|
||||||
Map.get(owner, state())
|
Map.get(owner, state())
|
||||||
|
|
||||||
function require(x : bool) : unit = if(x) () else abort("false")
|
|
||||||
|
|
||||||
|
@ -15,5 +15,3 @@ contract BasicAuth =
|
|||||||
function to_sign(h : hash, n : int) =
|
function to_sign(h : hash, n : int) =
|
||||||
Crypto.blake2b((h, n))
|
Crypto.blake2b((h, n))
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
@ -14,5 +14,3 @@ contract BitcoinAuth =
|
|||||||
function to_sign(h : hash, n : int) : hash =
|
function to_sign(h : hash, n : int) : hash =
|
||||||
Crypto.blake2b((h, n))
|
Crypto.blake2b((h, n))
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
@ -15,9 +15,6 @@ contract DutchAuction =
|
|||||||
Chain.spend(to, amount)
|
Chain.spend(to, amount)
|
||||||
total - amount
|
total - amount
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
|
||||||
// TTL set by user on posting contract, typically (start - end ) div dec
|
// TTL set by user on posting contract, typically (start - end ) div dec
|
||||||
public function init(beneficiary, start, decrease) : state =
|
public function init(beneficiary, start, decrease) : state =
|
||||||
require(start > 0 && decrease > 0, "bad args")
|
require(start > 0 && decrease > 0, "bad args")
|
||||||
|
@ -77,9 +77,6 @@ contract ERC20Token =
|
|||||||
put( state{approval_log = e :: state.approval_log })
|
put( state{approval_log = e :: state.approval_log })
|
||||||
e
|
e
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
|
||||||
private function sub(_a : int, _b : int) : int =
|
private function sub(_a : int, _b : int) : int =
|
||||||
require(_b =< _a, "Error")
|
require(_b =< _a, "Error")
|
||||||
_a - _b
|
_a - _b
|
||||||
|
@ -12,9 +12,6 @@ contract FundMe =
|
|||||||
deadline : int,
|
deadline : int,
|
||||||
goal : int }
|
goal : int }
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
|
||||||
private stateful function spend(args : spend_args) =
|
private stateful function spend(args : spend_args) =
|
||||||
Chain.spend(args.recipient, args.amount)
|
Chain.spend(args.recipient, args.amount)
|
||||||
|
|
||||||
|
@ -108,5 +108,3 @@ contract Oracles =
|
|||||||
Oracle.respond(o, q, Answer(question, "magic", 1337), signature = sig)
|
Oracle.respond(o, q, Answer(question, "magic", 1337), signature = sig)
|
||||||
Oracle.get_answer(o, q)
|
Oracle.get_answer(o, q)
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
@ -20,5 +20,3 @@ contract OraclesGas =
|
|||||||
Oracle.respond(o, q, answer)
|
Oracle.respond(o, q, answer)
|
||||||
()
|
()
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
@ -33,5 +33,3 @@ contract Oracles =
|
|||||||
q : query_id) : option(answer_t) =
|
q : query_id) : option(answer_t) =
|
||||||
Oracle.get_answer(o, q)
|
Oracle.get_answer(o, q)
|
||||||
|
|
||||||
private function require(b : bool, err : string) =
|
|
||||||
if(!b) abort(err)
|
|
||||||
|
@ -9,8 +9,6 @@ contract VariantTypes =
|
|||||||
|
|
||||||
function init() = Stopped
|
function init() = Stopped
|
||||||
|
|
||||||
function require(b) = if(!b) abort("required")
|
|
||||||
|
|
||||||
stateful function start(bal : int) =
|
stateful function start(bal : int) =
|
||||||
switch(state)
|
switch(state)
|
||||||
Stopped => put(Started({owner = Call.caller, balance = bal, color = Grey(0)}))
|
Stopped => put(Started({owner = Call.caller, balance = bal, color = Grey(0)}))
|
||||||
@ -18,7 +16,7 @@ contract VariantTypes =
|
|||||||
stateful function stop() =
|
stateful function stop() =
|
||||||
switch(state)
|
switch(state)
|
||||||
Started(st) =>
|
Started(st) =>
|
||||||
require(Call.caller == st.owner)
|
require(Call.caller == st.owner, "required")
|
||||||
put(Stopped)
|
put(Stopped)
|
||||||
st.balance
|
st.balance
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user