anchor.diff:           fp_register_name/1,
   
            % FP resets locked_until timer
  -         fp_settle_too_soon/1
  +         fp_settle_too_soon/1,
  +
  +         % off-chain oracle changes are not allowed
  +         fp_register_oracle/1,
  +         fp_oracle_query/1,
  +         fp_oracle_extend/1,
  +         fp_oracle_respond/1
           ]).
   
   -include_lib("common_test/include/ct.hrl").
  
positive.code:     create_contract_call_payload(solo_payload, ContractId, Fun, Args, Amount).
  
  create_contract_call_payload(Key, ContractId, Fun, Args, Amount) ->
      fun(#{from_pubkey       := From,
            round             := Round,
            state             := State,
            trees             := Trees0} = Props) ->
          Contract = aect_test_utils:get_contract(ContractId, #{trees => Trees0}),
          Code = aect_contracts:code(Contract),
          CallData = aect_sophia:create_call(Code, Fun, Args),
          %% assert calldata is correct:
          true = is_binary(CallData),
          Reserve = maps:get(channel_reserve, Props, 0),
          OnChainTrees = aesc_test_utils:trees(State),
          Env = tx_env(Props),
  
negative.code:             ])
      end.
  
  force_call_contract_first_with_calldata(Forcer, CallData, Round) ->
      fun(Props0) ->
          run(Props0,
             [set_prop(round, Round - 1),
              set_from(Forcer),
              create_fp_trees(),
              create_payload(),
              set_prop(round, Round),
              fun(#{contract_id := ContractId} = Props) ->
                  (create_contract_call_payload_with_calldata(
                     solo_payload,
                     ContractId, CallData, 1))(Props)
              end,
              set_prop(fee, 1),
              positive(fun force_progress_/2)
              ])
      end.
  
  %% build on top of on-chain payload
  force_call_contract(Forcer, Fun, Args) ->
      fun(Props0) ->
  