diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index c2d1498..5ee5641 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -459,6 +459,7 @@ global_env() -> OracleScope = #scope { funs = MkDefs( [{"register", SignFun([Address, Fee, TTL], Oracle(Q, R))}, + {"expiry", Fun([Oracle(Q, R)], Fee)}, {"query_fee", Fun([Oracle(Q, R)], Fee)}, {"query", StateFun([Oracle(Q, R), Q, Fee, TTL, TTL], Query(Q, R))}, {"get_question", Fun([Oracle(Q, R), Query(Q, R)], Q)}, diff --git a/src/aeso_ast_to_fcode.erl b/src/aeso_ast_to_fcode.erl index 3f360d0..bd4c539 100644 --- a/src/aeso_ast_to_fcode.erl +++ b/src/aeso_ast_to_fcode.erl @@ -204,7 +204,7 @@ builtins() -> {["Contract"], [{"address", none}, {"balance", none}, {"creator", none}]}, {["Call"], [{"origin", none}, {"caller", none}, {"value", none}, {"gas_price", none}, {"gas_left", 0}]}, - {["Oracle"], [{"register", 4}, {"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}, {"check", 1}, {"check_query", 2}]}, {["AENS"], [{"resolve", 2}, {"preclaim", 3}, {"claim", 5}, {"transfer", 4}, diff --git a/src/aeso_fcode_to_fate.erl b/src/aeso_fcode_to_fate.erl index 66c2a1a..181c945 100644 --- a/src/aeso_fcode_to_fate.erl +++ b/src/aeso_fcode_to_fate.erl @@ -498,6 +498,8 @@ builtin_to_scode(_Env, call_gas_left, []) -> [aeb_fate_ops:gas(?a)]; builtin_to_scode(Env, oracle_register, [_Sign,_Account,_QFee,_TTL,_QType,_RType] = Args) -> call_to_scode(Env, aeb_fate_ops:oracle_register(?a, ?a, ?a, ?a, ?a, ?a, ?a), Args); +builtin_to_scode(Env, oracle_expiry, [_Oracle] = Args) -> + call_to_scode(Env, aeb_fate_ops:oracle_expiry(?a, ?a), Args); builtin_to_scode(Env, oracle_query_fee, [_Oracle] = Args) -> call_to_scode(Env, aeb_fate_ops:oracle_query_fee(?a, ?a), Args); builtin_to_scode(Env, oracle_query, [_Oracle, _Question, _QFee, _QTTL, _RTTL, _QType, _RType] = Args) -> @@ -880,6 +882,7 @@ attributes(I) -> {'ORACLE_GET_ANSWER', A, B, C, D, E} -> Pure(A, [B, C, D, E]); {'ORACLE_GET_QUESTION', A, B, C, D, E}-> Pure(A, [B, C, D, E]); {'ORACLE_QUERY_FEE', A, B} -> Pure(A, [B]); + {'ORACLE_EXPIRY', A, B} -> Impure(A, [B]); {'AENS_RESOLVE', A, B, C, D} -> Impure(A, [B, C, D]); {'AENS_PRECLAIM', A, B, C} -> Impure(none, [A, B, C]); {'AENS_CLAIM', A, B, C, D, E} -> Impure(none, [A, B, C, D, E]); diff --git a/test/contracts/channel_on_chain_contract_oracle.aes b/test/contracts/channel_on_chain_contract_oracle.aes index d62ab41..de681aa 100644 --- a/test/contracts/channel_on_chain_contract_oracle.aes +++ b/test/contracts/channel_on_chain_contract_oracle.aes @@ -17,7 +17,7 @@ contract ChannelOnChainContractOracle = bets = {} } - public stateful function place_bet(answer: string) = + public stateful function place_bet(answer: string) = switch(Map.lookup(answer, state.bets)) None => put(state{ bets = state.bets{[answer] = Call.caller}}) @@ -25,6 +25,9 @@ contract ChannelOnChainContractOracle = Some(_value) => "bet_already_taken" + public function expiry() = + Oracle.expiry(state.oracle) + public function query_fee() = Oracle.query_fee(state.oracle) @@ -35,7 +38,7 @@ contract ChannelOnChainContractOracle = switch(Oracle.get_answer(state.oracle, q)) None => "no response" - Some(result) => + Some(result) => if(state.question == Oracle.get_question(state.oracle, q)) switch(Map.lookup(result, state.bets)) None => diff --git a/test/contracts/unapplied_builtins.aes b/test/contracts/unapplied_builtins.aes index 6055a87..3d3bb39 100644 --- a/test/contracts/unapplied_builtins.aes +++ b/test/contracts/unapplied_builtins.aes @@ -21,6 +21,7 @@ contract UnappliedBuiltins = function b_abort() = abort function b_require() = require function oracle_query_fee() = Oracle.query_fee + function oracle_expiry() = Oracle.expiry stateful function oracle_query() = Oracle.query : (o, _, _, _, _) => _ function oracle_get_question() = Oracle.get_question : (o, _) => _ function oracle_get_answer() = Oracle.get_answer : (o, _) => _