anchor.diff:              ])
       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) ->
  
positive.code:        % poi tests
  
         fp_insufficent_tokens,
         fp_register_name,
  
         % FP resets locked_until timer
         fp_settle_too_soon
        ]}
      ].
  
  
negative.code:     create_contract_call_payload(solo_payload, ContractId, Fun, Args, Amount).
  
  create_contract_call_payload(Key, ContractId, Fun, Args, Amount) ->
      fun(#{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),
          (create_contract_call_payload_with_calldata(Key, ContractId, CallData,
                                                     Amount))(Props)
      end.
  
  create_contract_call_payload_with_calldata(Key, ContractId, CallData, Amount) ->
      fun(#{from_pubkey       := From,
            round             := Round,
            state             := State,
            trees             := Trees0} = Props) ->
          Reserve = maps:get(channel_reserve, Props, 0),
          OnChainTrees = aesc_test_utils:trees(State),
          Env = tx_env(Props),
  