code: def send_to_address(self, asset_id, to_addr, value, fee=None, change_addr=None, id=None, endpoint=None):
          
          params = [asset_id, to_addr, value]
          if fee:
              params.append(fee)
          if fee and change_addr:
              params.append(change_addr)
          elif not fee and change_addr:
              params.append(0)
              params.append(change_addr)
          return self._call_endpoint(SEND_TO_ADDRESS, params=params, id=id, endpoint=endpoint)
docs: Args:
              asset_id: (str) asset identifier (for NEO: 'c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b', for GAS: '602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7')
              to_addr: (str) destination address
              value: (int/decimal) transfer amount
              fee: (decimal, optional) Paying the handling fee helps elevate the priority of the network to process the transfer. It defaults to 0, and can be set to a minimum of 0.00000001. The low priority threshold is 0.001.
              change_addr: (str, optional) Change address, default is the first standard address in the wallet.
              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