<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_sender_info( self, sender_txhash, nulldata_vin_outpoint, sender_out_data ):
 """ Record sender information in our block info. @sender_txhash: txid of the sender @nulldata_vin_outpoint: the 'vout' index from the nulldata tx input that this transaction funded """

        assert sender_txhash in self.sender_info.keys(), "Missing sender info for %s" % sender_txhash
        assert nulldata_vin_outpoint in self.sender_info[sender_txhash], "Missing outpoint %s for sender %s" % (nulldata_vin_outpoint, sender_txhash)

        block_hash = self.sender_info[sender_txhash][nulldata_vin_outpoint]['block_hash']
        relindex = self.sender_info[sender_txhash][nulldata_vin_outpoint]['relindex']
        relinput_index = self.sender_info[sender_txhash][nulldata_vin_outpoint]['relinput']

        value_in_satoshis = sender_out_data['value']
        script_pubkey = sender_out_data['script']
        script_info = bits.btc_tx_output_parse_script(script_pubkey)
        script_type = script_info['type']
        addresses = script_info.get('addresses', [])
        
        sender_info = {
            "value": value_in_satoshis,
            "script_pubkey": script_pubkey,
            "script_type": script_type,
            "addresses": addresses,
            "nulldata_vin_outpoint": nulldata_vin_outpoint,
            "txid": sender_txhash,
        }
        
        # debit this tx's total value
        self.block_info[block_hash]['txns'][relindex]['fee'] += value_in_satoshis

        # remember this sender, but put it in the right place.
        # senders[i] must correspond to tx['vin'][i]
        self.block_info[block_hash]['txns'][relindex]['senders'][relinput_index] = sender_info
        self.block_info[block_hash]['num_senders'] += 1

        return True