code: def invoke_contract_fn(self, contract_hash, operation, params=None, id=None, endpoint=None):
          
          return self._call_endpoint(INVOKE_FUNCTION, params=[contract_hash, operation, params if params else []], id=id, endpoint=endpoint)
docs: Invokes a contract
          Args:
              contract_hash: (str) hash of the contract, for example 'd7678dd97c000be3f33e9362e673101bac4ca654'
              operation: (str) the operation to call on the contract
              params: (list) a list of json ContractParameters to pass along with the invocation, example [{'type':7,'value':'symbol'},{'type':16, 'value':[]}]
              id: (int, optional) id to use for response tracking
              endpoint: (RPCEndpoint, optional) endpoint to specify to use
          Returns:
              json object of the result or the error encountered in the RPC call