def test_pass_compatible_types(self): """ Request contains values that can be converted to the expected types. """ filter_ = self._filter({ # This can accept any TrytesCompatible values. 'trytes': [ binary_type(self.trytes1), bytearray(self.trytes2), ], # These still have to be ints, however. 'depth': 100, 'minWeightMagnitude': 18, }) self.assertFilterPasses(filter_) self.assertDictEqual( filter_.cleaned_data, { 'depth': 100, 'minWeightMagnitude': 18, 'trytes': [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ], }, )
def test_pass_compatible_types(self): """ The incoming request contains values that can be converted into the expected types. """ filter_ = self._filter({ # Any value that can be converted into an ASCII representation of # a TryteString is allowed here. 'trytes': [ TransactionTrytes(self.trytes1), bytearray(self.trytes2.encode('ascii')), ], }) self.assertFilterPasses(filter_) self.assertDictEqual( filter_.cleaned_data, { # Raw trytes are extracted to match the IRI's JSON protocol. 'trytes': [ text_type(TransactionTrytes(self.trytes1)), text_type(TransactionTrytes(self.trytes2)), ], }, )
async def test_happy_path(self): """ Successful invocation of ``sendTrytes``. """ self.adapter.seed_response( 'getTransactionsToApprove', { 'trunkTransaction': str(self.transaction1, 'ascii'), 'branchTransaction': str(self.transaction2, 'ascii'), }) self.adapter.seed_response('attachToTangle', { 'trytes': [ str(self.trytes1, 'ascii'), str(self.trytes2, 'ascii'), ], }) self.adapter.seed_response('broadcastTransactions', {}) self.adapter.seed_response('storeTransactions', {}) trytes = [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ] response = await self.command( trytes=trytes, depth=100, minWeightMagnitude=18, ) self.assertDictEqual(response, {'trytes': trytes})
def test_pass_happy_path(self): """ The incoming response contains valid values. """ filter_ = self._filter({ # Trytes arrive from the node as strings. 'trytes': [ self.trytes1, self.trytes2, ], 'duration': 42, }) self.assertFilterPasses(filter_) self.assertDictEqual( filter_.cleaned_data, { 'trytes': [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ], 'duration': 42, }, )
def test_happy_path(self): """ Successfully promoting a bundle. """ self.adapter.seed_response('checkConsistency', { 'state': True, }) result_bundle = Bundle.from_tryte_strings([ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ]) mock_send_transfer = mock.Mock(return_value={ 'bundle': result_bundle, }) with mock.patch( 'iota.commands.extended.send_transfer.SendTransferCommand._execute', mock_send_transfer, ): response = self.command( transaction=self.hash1, depth=3, minWeightMagnitude=16, ) self.assertDictEqual(response, { 'bundle': result_bundle, })
def test_pass_compatible_types(self): """ The incoming request contains values that can be converted into the expected types. """ # Any values that can be converted into TryteStrings are accepted. filter_ = self._filter({ 'trytes': [ binary_type(self.trytes1), bytearray(self.trytes2), ], }) self.assertFilterPasses(filter_) self.assertDictEqual( filter_.cleaned_data, # The values are converted into TryteStrings so that they can be # sent to the node. { 'trytes': [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ], }, )
def setUp(self): super(BroadcastTransactionsRequestFilterTestCase, self).setUp() # Define a few valid values that we can reuse across tests. self.trytes1 = TransactionTrytes('RBTC9D9DCDQAEASBYBCCKBFA') self.trytes2 =\ TransactionTrytes( 'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA' )
def setUp(self): super(BroadcastTransactionsRequestFilterTestCase, self).setUp() # Define a few valid values that we can reuse across tests. self.trytes1 = TransactionTrytes('RBTC9D9DCDQAEASBYBCCKBFA') self.trytes2 =\ TransactionTrytes( 'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA' ) print_var_type_n_val(var001=self.trytes2, pointer="#R43EDFdfsSDFDtre") #R43EDFdfsSDFDtre
def test_pass_compatible_types(self): """ Incoming values can be converted into the expected types. """ filter_ = self._filter({ # Any value that can be converted into an ASCII representation of # a TransactionHash is valid here. 'trunkTransaction': TransactionHash(self.txn_id), 'branchTransaction': bytearray(self.txn_id.encode('ascii')), 'trytes': [ # ``trytes`` can contain any value that can be converted into a # TryteString. binary_type(TransactionTrytes(self.trytes1)), # This is probably wrong (s/b :py:class:`TransactionTrytes`), # but technically it's valid. TransactionHash( b'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA', ), ], # This still has to be an int, however. 'minWeightMagnitude': 30, }) print_var_type_n_val(var001 = TransactionTrytes(self.trytes1), pointer = "#WXCVgfds1234iuytrghrdfredfr")#WXCVgfds1234iuytrghrdfredfr # Value: RBTC9D9DCDQAEASBYBCCKBFA999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 # Type: <class 'iota.transaction.types.TransactionTrytes'> self.assertFilterPasses(filter_) self.assertDictEqual( filter_.cleaned_data, # After running through the filter, all of the values have been # converted to the correct types. { 'trunkTransaction': self.txn_id, 'branchTransaction': self.txn_id, 'minWeightMagnitude': 30, 'trytes': [ text_type(TransactionTrytes(self.trytes1)), text_type(TransactionTrytes( b'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHD' b'WCTCEAKDCDFD9DSCSA99999999999999999999999', )), ], } )
def test_pass_compatible_types(self): """ Incoming values can be converted into the expected types. """ filter_ = self._filter({ # Any value that can be converted into an ASCII representation of # a TransactionHash is valid here. 'trunkTransaction': TransactionHash(self.txn_id), 'branchTransaction': bytearray(self.txn_id.encode('ascii')), 'trytes': [ # ``trytes`` can contain any value that can be converted into a # TryteString. bytes(TransactionTrytes(self.trytes1)), # This is probably wrong (s/b :py:class:`TransactionTrytes`), # but technically it's valid. TransactionHash( b'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA', ), ], # This still has to be an int, however. 'minWeightMagnitude': 30, }) self.assertFilterPasses(filter_) self.assertDictEqual( filter_.cleaned_data, # After running through the filter, all of the values have been # converted to the correct types. { 'trunkTransaction': self.txn_id, 'branchTransaction': self.txn_id, 'minWeightMagnitude': 30, 'trytes': [ str(TransactionTrytes(self.trytes1)), str( TransactionTrytes( b'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHD' b'WCTCEAKDCDFD9DSCSA99999999999999999999999', )), ], })
def test_pass_happy_path(self): """ The incoming request is valid. """ request = { 'trytes': [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ], } filter_ = self._filter(request) self.assertFilterPasses(filter_) self.assertDictEqual(filter_.cleaned_data, request)
def test_pass_happy_path(self): """ The incoming request is valid. """ request = { # Raw trytes are extracted to match the IRI's JSON protocol. 'trytes': [ text_type(TransactionTrytes(self.trytes1)), text_type(TransactionTrytes(self.trytes2)), ], } filter_ = self._filter(request) self.assertFilterPasses(filter_) self.assertDictEqual(filter_.cleaned_data, request)
def as_tryte_string(self): msgfrag = self.signature_message_fragment seed = TryteString(str(self.bundle.node.seed)) value = TryteString.from_trits(trits_from_int(self.value, pad=81)) legacytag = self.legacy_tag timestamp = TryteString.from_trits( trits_from_int(self.timestamp, pad=27)) curridx = TryteString.from_trits( trits_from_int(self.current_index, pad=27)) lastidx = TryteString.from_trits( trits_from_int(self.last_index, pad=27)) bundlehash = self.bundle.bundle_hash branchtrxnhash = TryteString(self.trunk_transaction_hash) trunkhash = TryteString(self.branch_transaction_hash) tag = self.tag attachtime = TryteString.from_trits( trits_from_int(self.attachment_timestamp, pad=27)) timelower = TryteString.from_trits( trits_from_int(self.attachment_timestamp_lower_bound, pad=27)) timeupper = TryteString.from_trits( trits_from_int(self.attachment_timestamp_upper_bound, pad=27)) nonce = TryteString.from_trits(trits_from_int(self.nonce, pad=81)) sum = nonce + timeupper + timelower + tag + trunkhash + branchtrxnhash + bundlehash + lastidx + timestamp \ +legacytag + value + seed + msgfrag + curridx + attachtime return TransactionTrytes(sum).__str__()
def test_pass_happy_path(self): """ Request is valid. """ request = { 'depth': 100, 'minWeightMagnitude': 18, 'trytes': [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ], } filter_ = self._filter(request) self.assertFilterPasses(filter_) self.assertDictEqual(filter_.cleaned_data, request)
async def _traverse_bundle( self, txn_hash: TransactionHash, target_bundle_hash: Optional[TransactionHash] ) -> List[Transaction]: """ Recursively traverse the Tangle, collecting transactions until we hit a new bundle. This method is (usually) faster than ``findTransactions``, and it ensures we don't collect transactions from replayed bundles. """ trytes: List[TryteString] = (await GetTrytesCommand(self.adapter) (hashes=[txn_hash]))['trytes'] # If no tx was found by the node for txn_hash, it returns 9s, # so we check here if it returned all 9s trytes. if not trytes or trytes == [TransactionTrytes('')]: raise with_context( exc=BadApiResponse( 'Could not get trytes of bundle transaction from the Tangle. ' 'Bundle transactions not visible.' '(``exc.context`` has more info).', ), context={ 'transaction_hash': txn_hash, 'target_bundle_hash': target_bundle_hash, }, ) transaction = Transaction.from_tryte_string(trytes[0]) if (not target_bundle_hash) and transaction.current_index: raise with_context( exc=BadApiResponse( '``_traverse_bundle`` started with a non-tail transaction ' '(``exc.context`` has more info).', ), context={ 'transaction_object': transaction, 'target_bundle_hash': target_bundle_hash, }, ) if target_bundle_hash: if target_bundle_hash != transaction.bundle_hash: # We've hit a different bundle; we can stop now. return [] else: target_bundle_hash = transaction.bundle_hash if transaction.current_index == transaction.last_index == 0: # Bundle only has one transaction. return [transaction] # Recursively follow the trunk transaction, to fetch the next # transaction in the bundle. return [transaction] + await self._traverse_bundle( transaction.trunk_transaction_hash, target_bundle_hash)
def test_pass_happy_path(self): """ The incoming request is valid. """ request = { 'trunkTransaction': TransactionHash(self.txn_id), 'branchTransaction': TransactionHash(self.txn_id), 'minWeightMagnitude': 20, 'trytes': [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ], } filter_ = self._filter(request) self.assertFilterPasses(filter_) self.assertDictEqual(filter_.cleaned_data, request)
def test_pass_happy_path(self): """ The incoming request is valid. """ request = { 'trunkTransaction': text_type(TransactionHash(self.txn_id)), 'branchTransaction': text_type(TransactionHash(self.txn_id)), 'minWeightMagnitude': 20, 'trytes': [ # Raw trytes are extracted to match the IRI's JSON protocol. text_type(TransactionTrytes(self.trytes1)), text_type(TransactionTrytes(self.trytes2)), ], } filter_ = self._filter(request) self.assertFilterPasses(filter_) self.assertDictEqual(filter_.cleaned_data, request)
def setUp(self): """ These values will be used in the tests. """ # Will be padded to transaction length by TransactionTrytes() self.trytes1 ='CCLDVADBEACCWCTCEAZBCDFCE' # Will be padded to transaction length by TransactionTrytes() self.trytes2 ='CGDEAHDFDPCBDGDPCRCHDXCCDBDEAKDPC' # Will be padded to hash length by TransactionHash() self.trunk ='EWSQPV9AGXUQRYAZIUONVBXFNWRWIGVCFT' self.branch ='W9VELHQPPERYSG9ZLLAHQKDLJQBKYYZOS' self.mwm = 14 # Create real objects so that we pass the filters self.bundle = [TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2)] # ccurl_bundle is only needed to differentiate between response # from mocked pow and MockAdapter in some test cases. self.ccurl_bundle = [TransactionTrytes(self.trytes1)] self.trunk = TransactionHash(self.trunk) self.branch = TransactionHash(self.branch)
def test_happy_path(self): """ Successful invocation of ``broadcastAndStore``. """ self.adapter.seed_response('broadcastTransactions', { 'trytes': [ text_type(self.trytes1, 'ascii'), text_type(self.trytes2, 'ascii'), ], }) self.adapter.seed_response('storeTransactions', {}) trytes = [ TransactionTrytes(self.trytes1), TransactionTrytes(self.trytes2), ] response = self.command(trytes=trytes) self.assertDictEqual(response, {'trytes': trytes})
def test_missing_transaction_zero_trytes(self): """ Unable to find the requested transaction. getTrytes returned only zeros, no tx was found. """ zero_trytes = TransactionTrytes('') self.adapter.seed_response('getTrytes', {'trytes': [zero_trytes]}) with self.assertRaises(BadApiResponse): self.command(transaction=TransactionHash( b'FSEWUNJOEGNUI9QOCRFMYSIFAZLJHKZBPQZZYFG9' b'ORYCRDX9TOMJPFCRB9R9KPUUGFPVOWYXFIWEW9999'), )
def test_pass_happy_path(self): """ The incoming request is valid. """ request = { 'trunkTransaction': text_type(TransactionHash(self.txn_id)), 'branchTransaction': text_type(TransactionHash(self.txn_id)), 'minWeightMagnitude': 20, 'trytes': [ # Raw trytes are extracted to match the IRI's JSON protocol. text_type(TransactionTrytes(self.trytes1)), text_type(TransactionTrytes(self.trytes2)), ], } print_var_type_n_val(var001 = request, pointer = "#345gfdZERTYb")#345gfdZERTYb # Value: # # {'trunkTransaction': 'JVMTDGDPDFYHMZPMWEKKANBQSLSDTIIHAYQUMZOKHXXXGJHJDQPOMDOMNRDKYCZRUFZROZDADTHZC9999', 'branchTransaction': 'JVMTDGDPDFYHMZPMWEKKANBQSLSDTIIHAYQUMZOKHXXXGJHJDQPOMDOMNRDKYCZRUFZROZDADTHZC9999', 'minWeightMagnitude': 20, 'trytes': ['RBTC9D9DCDQAEASBYBCCKBFA999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999', 'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999']} # Type: <class 'dict'> filter_ = self._filter(request) print_var_type_n_val(var001 = filter_, pointer = "#345ytrexXCVBqqsdfg1234")#345ytrexXCVBqqsdfg1234 # Value: # # AttachToTangleRequestFilter(FilterChain(Type(Mapping, allow_subclass=True) | FilterMapper(branchTransaction=FilterChain(Required(allow_none=False) | Trytes()), trunkTransaction=FilterChain(Required(allow_none=False) | Trytes()), trytes=FilterChain(Required(allow_none=False) | Array(Sequence, allow_subclass=True) | FilterRepeater(FilterChain(Required(allow_none=False) | Trytes()))), minWeightMagnitude=FilterChain(Required(allow_none=False) | Type(int, allow_subclass=True) | Min(1, exclusive=False))))) # Type: <class 'filters.handlers.FilterRunner'> print_var_type_n_val(var001 = filter_.cleaned_data, pointer = "#ZETYGFDSDGgh654")#ZETYGFDSDGgh654 # Value: # # {'branchTransaction': TransactionHash(b'JVMTDGDPDFYHMZPMWEKKANBQSLSDTIIHAYQUMZOKHXXXGJHJDQPOMDOMNRDKYCZRUFZROZDADTHZC9999'), 'trunkTransaction': TransactionHash(b'JVMTDGDPDFYHMZPMWEKKANBQSLSDTIIHAYQUMZOKHXXXGJHJDQPOMDOMNRDKYCZRUFZROZDADTHZC9999'), 'trytes': [TransactionTrytes(b'RBTC9D9DCDQAEASBYBCCKBFA999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999'), TransactionTrytes(b'CCPCBDVC9DTCEAKDXC9D9DEARCWCPCBDVCTCEAHDWCTCEAKDCDFD9DSCSA99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999')], 'minWeightMagnitude': 20} # Type: <class 'dict'> self.assertFilterPasses(filter_) self.assertDictEqual(filter_.cleaned_data, request)
async def test_no_transaction_trytes(self): """ Node doesn't have the requested transaction trytes. """ self.adapter.seed_response( 'getTrytes', { 'trytes': [ self.single_bundle.tail_transaction.as_tryte_string(), TransactionTrytes(''), ] }) with self.assertRaises(BadApiResponse): response = await get_bundles_from_transaction_hashes( adapter=self.adapter, transaction_hashes=[ self.single_bundle.tail_transaction.hash, TransactionHash('') ], inclusion_states=False, )
def test_as_tryte_string(self): """ Converting a Transaction into a TryteString. """ transaction = Transaction( hash_ = TransactionHash( b'SYABNCYPLULQQBTDCUWJPVVMYNWHKEHGAZPKRBGE' b'QKEHUIKJCHWGAUKLSYMDOUUBMXPKCPTNFWUFU9JKW' ), signature_message_fragment = Fragment( b'GYPRVHBEZOOFXSHQBLCYW9ICTCISLHDBNMMVYD9JJHQMPQCTIQAQTJNNNJ9IDXLRCC' b'OYOXYPCLR9PBEY9ORZIEPPDNTI9CQWYZUOTAVBXPSBOFEQAPFLWXSWUIUSJMSJIIIZ' b'WIKIRH9GCOEVZFKNXEVCUCIIWZQCQEUVRZOCMEL9AMGXJNMLJCIA9UWGRPPHCEOPTS' b'VPKPPPCMQXYBHMSODTWUOABPKWFFFQJHCBVYXLHEWPD9YUDFTGNCYAKQKVEZYRBQRB' b'XIAUX9SVEDUKGMTWQIYXRGSWYRK9SRONVGTW9YGHSZRIXWGPCCUCDRMAXBPDFVHSRY' b'WHGB9DQSQFQKSNICGPIPTRZINYRXQAFSWSEWIFRMSBMGTNYPRWFSOIIWWT9IDSELM9' b'JUOOWFNCCSHUSMGNROBFJX9JQ9XT9PKEGQYQAWAFPRVRRVQPUQBHLSNTEFCDKBWRCD' b'X9EYOBB9KPMTLNNQLADBDLZPRVBCKVCYQEOLARJYAGTBFR9QLPKZBOYWZQOVKCVYRG' b'YI9ZEFIQRKYXLJBZJDBJDJVQZCGYQMROVHNDBLGNLQODPUXFNTADDVYNZJUVPGB9LV' b'PJIYLAPBOEHPMRWUIAJXVQOEM9ROEYUOTNLXVVQEYRQWDTQGDLEYFIYNDPRAIXOZEB' b'CS9P99AZTQQLKEILEVXMSHBIDHLXKUOMMNFKPYHONKEYDCHMUNTTNRYVMMEYHPGASP' b'ZXASKRUPWQSHDMU9VPS99ZZ9SJJYFUJFFMFORBYDILBXCAVJDPDFHTTTIYOVGLRDYR' b'TKHXJORJVYRPTDH9ZCPZ9ZADXZFRSFPIQKWLBRNTWJHXTOAUOL9FVGTUMMPYGYICJD' b'XMOESEVDJWLMCVTJLPIEKBE9JTHDQWV9MRMEWFLPWGJFLUXI9BXPSVWCMUWLZSEWHB' b'DZKXOLYNOZAPOYLQVZAQMOHGTTQEUAOVKVRRGAHNGPUEKHFVPVCOYSJAWHZU9DRROH' b'BETBAFTATVAUGOEGCAYUXACLSSHHVYDHMDGJP9AUCLWLNTFEVGQGHQXSKEMVOVSKQE' b'EWHWZUDTYOBGCURRZSJZLFVQQAAYQO9TRLFFN9HTDQXBSPPJYXMNGLLBHOMNVXNOWE' b'IDMJVCLLDFHBDONQJCJVLBLCSMDOUQCKKCQJMGTSTHBXPXAMLMSXRIPUBMBAWBFNLH' b'LUJTRJLDERLZFUBUSMF999XNHLEEXEENQJNOFFPNPQ9PQICHSATPLZVMVIWLRTKYPI' b'XNFGYWOJSQDAXGFHKZPFLPXQEHCYEAGTIWIJEZTAVLNUMAFWGGLXMBNUQTOFCNLJTC' b'DMWVVZGVBSEBCPFSM99FLOIDTCLUGPSEDLOKZUAEVBLWNMODGZBWOVQT9DPFOTSKRA' b'BQAVOQ9RXWBMAKFYNDCZOJGTCIDMQSQQSODKDXTPFLNOKSIZEOY9HFUTLQRXQMEPGO' b'XQGLLPNSXAUCYPGZMNWMQWSWCKAQYKXJTWINSGPPZG9HLDLEAWUWEVCTVRCBDFOXKU' b'ROXH9HXXAXVPEJFRSLOGRVGYZASTEBAQNXJJROCYRTDPYFUIQJVDHAKEG9YACV9HCP' b'JUEUKOYFNWDXCCJBIFQKYOXGRDHVTHEQUMHO999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999' ), address = Address( b'99999999999999999999999999999999999999999' b'9999999999999999999999999999999999999999' ), value = 0, timestamp = 1480690413, current_index = 1, last_index = 1, bundle_hash = BundleHash( b'NFDPEEZCWVYLKZGSLCQNOFUSENIXRHWWTZFBXMPS' b'QHEDFWZULBZFEOMNLRNIDQKDNNIELAOXOVMYEI9PG' ), trunk_transaction_hash = TransactionHash( b'TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJN' b'QZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999999' ), branch_transaction_hash = TransactionHash( b'TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJN' b'QZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999999' ), tag = Tag(b'999999999999999999999999999'), attachment_timestamp = 1480690413, attachment_timestamp_lower_bound = 1480690413, attachment_timestamp_upper_bound = 1480690413, nonce = Nonce( b'999999999999999999999999999' ), ) self.assertEqual( transaction.as_tryte_string(), TransactionTrytes( b'GYPRVHBEZOOFXSHQBLCYW9ICTCISLHDBNMMVYD9JJHQMPQCTIQAQTJNNNJ9IDXLRCC' b'OYOXYPCLR9PBEY9ORZIEPPDNTI9CQWYZUOTAVBXPSBOFEQAPFLWXSWUIUSJMSJIIIZ' b'WIKIRH9GCOEVZFKNXEVCUCIIWZQCQEUVRZOCMEL9AMGXJNMLJCIA9UWGRPPHCEOPTS' b'VPKPPPCMQXYBHMSODTWUOABPKWFFFQJHCBVYXLHEWPD9YUDFTGNCYAKQKVEZYRBQRB' b'XIAUX9SVEDUKGMTWQIYXRGSWYRK9SRONVGTW9YGHSZRIXWGPCCUCDRMAXBPDFVHSRY' b'WHGB9DQSQFQKSNICGPIPTRZINYRXQAFSWSEWIFRMSBMGTNYPRWFSOIIWWT9IDSELM9' b'JUOOWFNCCSHUSMGNROBFJX9JQ9XT9PKEGQYQAWAFPRVRRVQPUQBHLSNTEFCDKBWRCD' b'X9EYOBB9KPMTLNNQLADBDLZPRVBCKVCYQEOLARJYAGTBFR9QLPKZBOYWZQOVKCVYRG' b'YI9ZEFIQRKYXLJBZJDBJDJVQZCGYQMROVHNDBLGNLQODPUXFNTADDVYNZJUVPGB9LV' b'PJIYLAPBOEHPMRWUIAJXVQOEM9ROEYUOTNLXVVQEYRQWDTQGDLEYFIYNDPRAIXOZEB' b'CS9P99AZTQQLKEILEVXMSHBIDHLXKUOMMNFKPYHONKEYDCHMUNTTNRYVMMEYHPGASP' b'ZXASKRUPWQSHDMU9VPS99ZZ9SJJYFUJFFMFORBYDILBXCAVJDPDFHTTTIYOVGLRDYR' b'TKHXJORJVYRPTDH9ZCPZ9ZADXZFRSFPIQKWLBRNTWJHXTOAUOL9FVGTUMMPYGYICJD' b'XMOESEVDJWLMCVTJLPIEKBE9JTHDQWV9MRMEWFLPWGJFLUXI9BXPSVWCMUWLZSEWHB' b'DZKXOLYNOZAPOYLQVZAQMOHGTTQEUAOVKVRRGAHNGPUEKHFVPVCOYSJAWHZU9DRROH' b'BETBAFTATVAUGOEGCAYUXACLSSHHVYDHMDGJP9AUCLWLNTFEVGQGHQXSKEMVOVSKQE' b'EWHWZUDTYOBGCURRZSJZLFVQQAAYQO9TRLFFN9HTDQXBSPPJYXMNGLLBHOMNVXNOWE' b'IDMJVCLLDFHBDONQJCJVLBLCSMDOUQCKKCQJMGTSTHBXPXAMLMSXRIPUBMBAWBFNLH' b'LUJTRJLDERLZFUBUSMF999XNHLEEXEENQJNOFFPNPQ9PQICHSATPLZVMVIWLRTKYPI' b'XNFGYWOJSQDAXGFHKZPFLPXQEHCYEAGTIWIJEZTAVLNUMAFWGGLXMBNUQTOFCNLJTC' b'DMWVVZGVBSEBCPFSM99FLOIDTCLUGPSEDLOKZUAEVBLWNMODGZBWOVQT9DPFOTSKRA' b'BQAVOQ9RXWBMAKFYNDCZOJGTCIDMQSQQSODKDXTPFLNOKSIZEOY9HFUTLQRXQMEPGO' b'XQGLLPNSXAUCYPGZMNWMQWSWCKAQYKXJTWINSGPPZG9HLDLEAWUWEVCTVRCBDFOXKU' b'ROXH9HXXAXVPEJFRSLOGRVGYZASTEBAQNXJJROCYRTDPYFUIQJVDHAKEG9YACV9HCP' b'JUEUKOYFNWDXCCJBIFQKYOXGRDHVTHEQUMHO999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999RKWEEVD99A99999999A99999999NFDPEEZCWVYLKZGSLCQNOFUSENI' b'XRHWWTZFBXMPSQHEDFWZULBZFEOMNLRNIDQKDNNIELAOXOVMYEI9PGTKORV9IKTJZQ' b'UBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999' b'999TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSK' b'UCUEMD9M9SQJ999999999999999999999999999999999RKWEEVD99RKWEEVD99RKW' b'EEVD99999999999999999999999999999' ), )
async def get_bundles_from_transaction_hashes( adapter: BaseAdapter, transaction_hashes: Iterable[TransactionHash], inclusion_states: bool, ) -> List[Bundle]: """ Given a set of transaction hashes, returns the corresponding bundles, sorted by tail transaction timestamp. """ transaction_hashes = list(transaction_hashes) if not transaction_hashes: return [] # Sort transactions into tail and non-tail. tail_transaction_hashes = set() non_tail_bundle_hashes = set() gt_response = await GetTrytesCommand(adapter)(hashes=transaction_hashes) for tx_hash, tx_trytes in zip(transaction_hashes, gt_response['trytes']): # If no tx was found by the node for tx_hash, it returns 9s, # so we check here if it returned all 9s trytes. if tx_trytes == TransactionTrytes(''): raise with_context( exc=BadApiResponse( 'Could not get trytes of transaction {hash} from the Tangle. ' '(``exc.context`` has more info).'.format(hash=tx_hash), ), context={ 'transaction_hash': tx_hash, 'returned_transaction_trytes': tx_trytes, }, ) all_transactions: List[Transaction] = list(map( Transaction.from_tryte_string, gt_response['trytes'], )) for txn in all_transactions: if txn.is_tail: tail_transaction_hashes.add(txn.hash) else: # Capture the bundle ID instead of the transaction hash so # that we can query the node to find the tail transaction # for that bundle. non_tail_bundle_hashes.add(txn.bundle_hash) if non_tail_bundle_hashes: for txn in (await FindTransactionObjectsCommand(adapter=adapter)( bundles=list(non_tail_bundle_hashes), ))['transactions']: if txn.is_tail: if txn.hash not in tail_transaction_hashes: all_transactions.append(txn) tail_transaction_hashes.add(txn.hash) # Filter out all non-tail transactions. tail_transactions = [ txn for txn in all_transactions if txn.hash in tail_transaction_hashes ] # Attach inclusion states, if requested. if inclusion_states: gli_response = await GetLatestInclusionCommand(adapter)( hashes=list(tail_transaction_hashes), ) for txn in tail_transactions: txn.is_confirmed = gli_response['states'].get(txn.hash) # Find the bundles for each transaction. txn_bundles: List[Bundle] = (await GetBundlesCommand(adapter)( transactions=[txn.hash for txn in tail_transactions] ))['bundles'] if inclusion_states: for bundle, txn in zip(txn_bundles, tail_transactions): bundle.is_confirmed = txn.is_confirmed return list(sorted( txn_bundles, key=lambda bundle_: bundle_.tail_transaction.timestamp, ))
def test_multiple_transactions(self): """ Getting a bundle that contains multiple transactions. """ bundle = Bundle.from_tryte_strings([ TransactionTrytes( b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999WUQXEGBVIECGIWO9IGSYKWWPYCIVUJJGSJPWGIAFJPYSF9NSQOHWAHS9P' b'9PWQHOBXNNQIF9IRHVQXKPZW999999999999999999999999999XZUIENOTTBKJMDP' b'RXWGQYG9PWGTHNLFMVD99A99999999A99999999PDQWLVVDPUU9VIBODGMRIAZPGQX' b'DOGSEXIHKIBWSLDAWUKZCZMK9Z9YZSPCKBDJSVDPRQLJSTKUMTNVSXBGUEHHGAIWWQ' b'BCJZHZAQOWZMAIDAFUZBVMUVPWQJLUGGQKNKLMGTWXXNZKUCBJLEDAMYVRGABAWBY9' b'999MYIYBTGIOQYYZFJBLIAWMPSZEFFTXUZPCDIXSLLQDQSFYGQSQOGSPKCZNLVSZ9L' b'MCUWVNGEN9EJEW9999XZUIENOTTBKJMDPRXWGQYG9PWGTXUO9AXMP9FLMDRMADLRPW' b'CZCJBROYCDRJMYU9HDYJM9NDBFUPIZVTR'), # Well, it was bound to happen sooner or later... the ASCII # representation of this tryte sequence contains a very naughty # phrase. But I don't feel like doing another POW, so... enjoy. TransactionTrytes( b'NBTCPCFDEACCPCBDVC9DTCQAJ9RBTC9D9DCDQAEAKDCDFD9DSCFAJ9VBCDJDTCQAJ9' b'ZBMDYBCCKB99999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999SYRABNN9JD9PNDL' b'IKUNCECUELTOHNLFMVD99999999999A99999999PDQWLVVDPUU9VIBODGMRIAZPGQX' b'DOGSEXIHKIBWSLDAWUKZCZMK9Z9YZSPCKBDJSVDPRQLJSTKUMTNVSXFSEWUNJOEGNU' b'I9QOCRFMYSIFAZLJHKZBPQZZYFG9ORYCRDX9TOMJPFCRB9R9KPUUGFPVOWYXFIWEW9' b'999BGUEHHGAIWWQBCJZHZAQOWZMAIDAFUZBVMUVPWQJLUGGQKNKLMGTWXXNZKUCBJL' b'EDAMYVRGABAWBY9999SYRABNN9JD9PNDLIKUNCECUELTOQZPSBDILVHJQVCEOICFAD' b'YKZVGMOAXJRQNTCKMHGTAUMPGJJMX9LNF'), ]) for txn in bundle: self.adapter.seed_response('getTrytes', { 'trytes': [txn.as_tryte_string()], }) self.adapter.seed_response( 'getTrytes', { 'trytes': [ 'SPAMSPAMSPAM999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999JECDITWO9999999' '999999999999ONLFMVD99999999999999999999VVCHSQSRVFKSBONDWB9EAQEMQOY' 'YRBIZHTBJLYNAVDHZPUZAZ9LYHXWKBEJ9IPR9FAMFLT9EEOHVYWUPRHHSRCILCLWFD' 'GBYBFFOKMCSAPVD9VGZZRRGBLGMZMXD9RMZQDBLMGN9BATWZGULRBCYQEIKIRBPHC9' '999KTLTRSYOWBD9HVNP9GCUABARNGMYXUZKXWRPGOPETZLKYYC9Z9EYXIWVARUBMBM' 'BPXGORN9WPBLY99999ZRBVQWULRFXDNDYZKRKIXPZQT9JJJH9FZU9PVWZJWLXBPODP' 'EHMKTTAGEPLPHUQCZNLDSHERONOMHJCOI' ], }) response = self.command(transaction=TransactionHash( b'TOYJPHKMLQNDVLDHDILARUJCCIUMQBLUSWPCTIVA' b'DRXICGYDGSVPXFTILFFGAPICYHGGJ9OHXINFX9999'), ) self.maxDiff = None self.assertListEqual( response['bundles'][0].as_json_compatible(), bundle.as_json_compatible(), )
def setUpClass(self): # This is a valid bundle taken from the Tangle self.bundle = Bundle.from_tryte_strings([ TransactionTrytes( '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999GTSOCZLYYATDVK9FYRZXRFEHYUWTSXNALBGHO9T9GHANN' '9YTJIZHOBWZHYSLDRTIVSYRRBUJZFUKWVNJAJSNA99999999999999999999999FBNGLE9BE' 'AT9CYCLUX999999999RFAVOBD99999999999B99999999BGNBAIUZAHWWAIHAWHXIDGYQYKI' 'LEWDCBQXYBNQBFNPOIICLCJKHSX9KLPECYBGWW9CGILRKTVEYTL99AAVSD99RCNCYGIVIRVI' 'TNVOVQNQE9RFJIRAXCEXQEHEXQEKFXSDQVBQGJQWBRTRSAUPMXJLMFKUJKZ9999UIBLZWXJQ' 'DMZCPEQRLSFYJLEPIFTOCY9ODVKIYAMXMKYKHFWKEHNGLVKEYDGR9GOXWWNXLOCQFD999999' 'TANGLE9BEAT9CYCLUX999999999FIAMTJGOF999999999MMMMMMMMMZCJOZALASXIERYTDLY' 'WMZTJF9HQ'), TransactionTrytes( '9PTKKTOZFZBKCJTYHMKZZDRHCOYXHOTDQY9ALYIBNGD9UDPTUKPHJBORIICRNLDTECKLGPOGE' 'VQIVFHIYI9UUYWYEKGRDDGAAXD9EMFSKX9TDWGGPKTIXBCWQKPERPUIRYEEYXYPXGHBSRGQAH' 'ZOIBPERAWSCMIFJZGYAFQ9XBVYDXVJAXXX9XPTXJTSDMJSLNCBACGQ9CHVCYMEKOKSEBRUGTX' 'KMU9HLWRNWOZJGIOIKLPZEHDZKCQXFDMYOA9DRK9CJVRQSWZSDUWDCXWFPZIL9PJDQUQNMMBM' 'STGMOFCXKKCRZKDCRCBYSVDSKXTDKFBYIRVSTIVHGWTBFRGNNAYXZBVNSZDQDQRSJBNMBRZTG' 'VDWYAHHFEMSWF9CLSZPQYKFD9MOIR9CUZCPQAGBZSPSCRHSYVDKX9ZVEQONHOO9EAAHZSTHAW' 'SLSVI9HSOYKIGDWSKXCHHPFXMKCIBEASGQXHEIGOAETCBLHWPUBSLMELCUVARTPHGOG9BEQTM' 'NHA9MJHCRVNKXZTZTMEMSHFKJMWNBXLBLMVJDONO9JDYALFCBQ9GELAXSOEGOLNCPYGSKWRFF' 'IZNUGVHECQKRIZ9NTCPAXEKIAZLTXCBM9PJCOKSFDL99YPEVKOMWEXED9IAAOVPZLLFBZHVAM' 'DXEXCAZBGKWVQCXPFSEUNTPYVSLPEYKCTTGPVBSXQYFVWFUCGYLARMB9HA9PTRXAXKEOQLVXQ' 'TTHYZEXSOLFSEHMVJ9QOLMBGFHPTEQAYDZWSAPADJSSHTBWOZGVSLLPTMOLFZWUQFVKJZQPMZ' 'T9QACMCOEKJVWBOSKQHUTGLHAWMQHPDHCZEDKVUTYVMZCSMR9YPLRJGLUNTRGSEXLNBYJXLAR' 'MWWAWVPLZXYAYACMJCNYWISCHBMQAAMGTCFOZN9OZCITSFGBUJVERM9FRYHJYVKXLBALTHKWM' 'JMECDKGPKNWFWNHXAFQ9UEWBTUJADYFFMD9WAWE9PYEZIHGO9DSRBLLHCKIIVLHRPYR9UIYRN' 'VDYAL9Y9AEPVYOKBEDXJDYYBKEOLOAZCNLSBOULLOHEYAAJBZDNTNKVULUSUAME9LTAIEEUJV' 'QRVFXSDDTNDMNRSLAXKZTRCAGLIDVJJVGEJWSGDIH9HGVHDKLXVEEFTHAMLSUVEDMMVSDRPOI' 'UJTSNZJVMGBCFZYOMUSARYNXTRMFVMZOCZYPTBSOZUXXSYBRKKLZEAQDPNGLYAKAWTSEJKLBK' 'NASQQPZAB9MKOUZN9TO9ZYUVSTAPWGTMGO9ZARUWBVQT9ZLHAYEVJM9FNJCQNSBIRZ9AIXZEX' 'N9QMLPZBHTVNVKRPIXMQIA9OAWQFPNHMXOOPEUJQCKXZQOOYLMMJXXQAIVHRLGDKLGBOSKERQ' 'ZYNQOTVJW9IKMWZSORHMXFNOLSR9SIKBNTOANAZBGPGIPVVIFYWTUMATZAJPMUGYVITWCBBSQ' 'RVAY9MXJCECVTYASSAVUGKKQBDXYVWLTSL9HCAD9NUEWEHQXQUCDJC9WPVAZEDLTGTLZXUUOH' 'WCEUXCDYHATVRSJXJNLWCPEOENOBLXHTDOXSQCIDSEOHZHWBAYJV9ALDOBYMLXKNUQYQTEYAW' 'ZFSWGQOAHFXHZDBNCJDIJXRJDGRIOPCLPGPLG9AVFGQQBWPKNJROPIQDLXHNDGWGZOVBXHRBP' 'JQ9YHIJ9MNJFFLDTVLXJA9EBVPGVIAIHCDDHHTNX9KZARELDIZVQYUQGCPPCRTU9CDUXCVBYZ' 'RAUJDUMGGTKKOFQQTEGXRQKYPQTGHBGRCJ9IENKLNBIZNRSPVQ9VBKQLCG9YPYBEKJEYNAIDJ' 'PHABZJXBWHZLMADR9SDEWICFGRRTVAGZYCMJ9CANUSGIUKKHWUSWBQIBC9TXONXYDURJJWWE9' 'FKPPRWEJVWVJVKFKLMD9HCYASRUYCZPKM9VUCLOUVBYSMWIRFYJMTNOYXNKLNDWZJSRRZKLQL' 'YCODRSAKLMIRSPFYOANY9DUCYZYLEXDTGEJAKUDFWZNEGIBLMXZTW9OKF9SQGNNMHMUWIICFX' 'LFQMSLLSVJIMDEEWGOG9PDAPTZCRAL9TJRFPIOPMSFJOTLPRMEOUWGLTTXODGD9LSDJBTKX9Y' '9JNNIYNERDRQWJGICGHUFJCMGBBUZWLHQJUSUMUXNWRNIVHSFSRGMBMO9VTBGBBFOMHGNZQYI' 'OIIITMJDZLCJGNUWRJPJKOSSKRLUMGDXNRZFUFTZTSKXEZOCHUEWBONL9OBRYNWLPKSGCFE9W' 'TBVEXQHMZ99999999999999999999999999999999999999999999999999RFAVOBD99A9999' '9999B99999999BGNBAIUZAHWWAIHAWHXIDGYQYKILEWDCBQXYBNQBFNPOIICLCJKHSX9KLPEC' 'YBGWW9CGILRKTVEYTL99AYUMYMXIZRU9IIWNDROROZOINKOLXPOFCRZZTXAWDXUKVV9LMEMNG' 'HYZUMAPCESBINZGITBMIOQYX99999UIBLZWXJQDMZCPEQRLSFYJLEPIFTOCY9ODVKIYAMXMKY' 'KHFWKEHNGLVKEYDGR9GOXWWNXLOCQFD999999999999999999999999999999999ZS9MTJGOF' '999999999MMMMMMMMMMJVAHLRNJKJGTOLKSKNZWBTJNQP'), TransactionTrytes( 'M9STFJDJXSROWSPZTZXDYCWQDOQPBPAGATRY9SOXIXJOQL99OMWXPNXKCKJHHRPGWEDBLT9EO' 'IBTFDKZYXFMELEBQABMPIXUKYZKONEQESB9XHXYMQBULQVQLEEPHCZSFSMJKDGKEDRVBKLFKZ' 'JFNKLZWQPMTQGJKWQNAN9NQRKGWHEMIVZNODTNQNPXOTISDNWT9WZKC9DGLYWHUD9EQ9VTZRF' 'YUYU9BDHZULDGNUGUOUUXQTXZJVCBPZWYVTBEWVUJAOCZVNUJNMSMSVN9CPXWDSFCMRSWAMLP' 'AJRAEGSCOPLWYEGWPKKSXYJSBNLGMBLDEQ9NQEM9XDCSYZLUHLLEICKFHBFPIYDNGEZJEJXBE' '9HJGFRMHAHNXIGDDZRPAOTUZPEEUGLZYDEJYIYFCMOUNRLZFBYC9BDPWUVIR9DE9QGBEPVMDL' 'J9HUDJMGVDQNIDQQTCRXLCPNSLZXSUUPNKUCDHKWCMQ9HPVWXSZXKGXCDKX9BXNOFDUYUBBGD' 'DOJEZISFJLFUMKJJHXNBMLUWZWBQ9QDITUUZWHFEXQVAAKBUEXCO9XFBPAD9IKEODAPALAGSG' 'XFDLORKHCXSPINKO9HSJF9BXUIBRXNUX9APPTPIUYXVVWIYXGARPKDYNEGQXPWYCRAPZMZYKW' 'ICPYJWUEBIBPTXNJTBSSQDFKH9ZFQXNNH9MUTVKEYQIYOJTLFJLAQOFZFIVMTHESCNDLGXZXA' 'OWHXPEDVVBFJHIKCNFGPLUZQBYVRRMYCIAJOOJINAHSATUVCLQNMOAERIAJESBZOABTMBMJVQ' 'DVBMLDBBONGRW9QJUAXS9LQWRRKH9PLQUEVUDHWRZFP9FPYSWOQQRINOCHSJYPVKEUQPDOHXQ' 'WZFKOLZFXYQF9WDHKTHBVMACJMNUVYFLDBCCCHKTBJINNBPKVXYTVLVGADMYEYVLYROARFBWE' 'ATEIHEENZVRNOJRJYIMQJRAOFKUWSDKFTNNDTLCFHXQNRFEUFJN9GFFJXWDPKIQUQBXDARMRK' 'LSGUSATHVZMJSXFTWIJPCWNG9UWDGQYUGPMSGJSZBCSUPAKQKIHP9EGIXNRNMDGUVJNVMW9RL' 'TOHXUXI9UZTCRLVMMREWFSRUOBKFVQYH9PUVOWATYNDULLZ9RCBHDUVNJDMOJETQ9H9RKOSQF' 'XEVDVVJNZZSMFMLLQJTYXAALRIHQJWDCZYFZBLODYGYUP9XGPZVILG9WBGOVVYRUTHDGF9TRZ' 'GSFIYHAAAGXJTJKRG9ZYBFDSRQPQAOIJHDENVQAPJMBLOIVUZIGHMVXHBKZOFUJVEWCZJNCTS' 'TDEPQTYCPGGG9ZEDEYTSDBOMLOO9QO9LMJKNRXHLWNJUOLVNGXMLNHXZVKTRJGDD9CERBOTKR' 'EDGEGUQDBFIKPYPOXXF9KLYAX9SDCCDTCFULSOZRYJSORRZUUN9CCNRQKTCDCOGIYHAHWYBUX' 'EYVIJTGXCPGIGBFQWOTJX9APYNDCPQ9FSNXUZF9MDRLZIJSYDGYKBQGWTQLEKZSATDKVWFFMH' 'QNTMNWWJNBKVGI9QDXYYWOFAKI9OZRBOWMZZHLXUJQKIICFTBZAHUTZFIZIAUO9CWSTYMGZPO' 'PBKIO9ZYNSRHXCCIMKD9SPDQNXALFLNTXWVVYDAFHWLD9YSDGGRQJUBWZXQHVULYVDON9WADY' 'XPEVAGKTXIUTDRMLE9TTKD9TSHXFHQSOLHOCQ9SYWJWTOC99GAKHRSREJKHCBLYSHPOEYJNYX' 'IYNSQITTFSMKFL9HRNEKDZSJSYEBJACGTVBRVQGUREAYZEIQQIGWVRWIWSDGBRLAMPKQGZCEO' 'JPHANGFVYRXZJCDO9MGKBPYPQYVHQWDJVSUKA9VGLJELXFJKTNMQYZYGBHNFLGETZ9SWLDRNO' 'OUCAWNFOTBFICNEQJNPAZABLPOR99DPWTZZWLIRA9MFPXXHMJL9QWVJOAPYA9REAHBATJYJYJ' 'DYAGCKFDRSVTXMFFIBDPIBXBINGXTWMM9PSRVAKQEEQGRDJNOHKJDCCFBZZRLIVXPGEZYAV9G' 'CUGCATAQLMSOABNYLSNSTRPOGIRMKCGDDITKO9TEVOWPRGQHJDYWPZTZ9RVLPWGFDZOZICSUZ' 'AUPZJVTXCMUEADAKPZMNOTHLMGDJKTQWJQBK9TIGUTLDWYEPNDLJLDDYHQUWNLLH9MJUFAQYI' 'OIIITMJDZLCJGNUWRJPJKOSSKRLUMGDXNRZFUFTZTSKXEZOCHUEWBONL9OBRYNWLPKSGCFE9W' 'TBVEX999999999999999999999999999999999999999999999999999999RFAVOBD99B9999' '9999B99999999BGNBAIUZAHWWAIHAWHXIDGYQYKILEWDCBQXYBNQBFNPOIICLCJKHSX9KLPEC' 'YBGWW9CGILRKTVEYTL99AUIBLZWXJQDMZCPEQRLSFYJLEPIFTOCY9ODVKIYAMXMKYKHFWKEHN' 'GLVKEYDGR9GOXWWNXLOCQFD999999IFJ9JLPZON9CZJWMKJWPMUWHKOYTUOSBWQYCTCGBXAJG' 'T9KRVDDLBCNXFYKRXDEKJYQMTAMYJXJRA9999999999999999999999999999999BGYMTJGOF' '999999999MMMMMMMMMOGZMHCGFJIGGC9JYILNUCHZSDGV') ]) self.single_tx_bundle = Bundle.from_tryte_strings([ TransactionTrytes( 'VBCDFDTCADEAXCDDGDIDADEASCCD9DCDFDEAGDXCHDEAPCADTCHDQAEARCCDBDGDTCRCHDTCH' 'DIDFDEAPCSCXCDDXCGDRCXCBDVCEATC9DXCHDSAEASBBDEABDCDBDEA9DXCQCTCFDCDEAXCSC' 'EABDXCQCWCEAUCPCRCXC9DXCGDXCGDEAXCADDDTCFDSCXCTCHDEATCIDEAGDTCSCEAGDPCDDX' 'CTCBDSAEABCTCSCEASCXCVCBDXCGDGDXCADEA9DXCVCID9DPCEAXCBDEATCGDHDEAADPC9DTC' 'GDIDPCSCPCEA9DCDQCCDFDHDXCGDSAEAOBHDXCPCADEAJDPCFDXCIDGDEAADCD9DTCGDHDXCT' 'CEABDID9D9DPCEADDFDTCHDXCIDADEAHDXCBDRCXCSCIDBDHDSAEAXBPCADEAJDTCWCXCRCID' '9DPCEA9DPCRCXCBDXCPCEA9DXCQCTCFDCDSAEAMBIDFDPCQCXCHDIDFDEAXCBDEACDFDBDPCF' 'DTCEA9DTCCDSAEAMBFDPCGDEATCIDEASCCD9DCDFDEAEDIDXCGDEAHDCDFDHDCDFDEAXCADDD' 'TCFDSCXCTCHDEAPC9DXCEDIDTCHDSAEANBCDBDTCRCEAPCEAHDTC9D9DIDGDEATCFDPCHDSAE' 'AXBIDBDRCEAXCSCEAXCPCRCID9DXCGDEASCIDXCSA99999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999MZW' 'YYLQNAKEWITJSJZJCPFZWMEYGOVYOKUZYUWMUDLGAAAHTBYNQQNGHLUMSGZNQCJCHOULIZSDC' 'ATEXD999999999999999999999999999VHURLINTERFACE9TEST9TX999999KGVOBD9999999' '9999999999999DLWTLGSTHZKRDSIRWCZ9HCJWNUJBKTWHCBZGRIFTASCTBIBZZNNWFVGHEGJB' 'EWWXKRFOXD9GLTXPFGRBY9999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999CCURLINTERFACE9TEST9TX99999999999999' '999999999999999999999999999999999999999999999') ]) self.trunk = TransactionHash('TRUNKTXHASH9TESTVALUEONLY') self.branch = TransactionHash('BRANCHTXHASH9TESTVALUEONLY') # Result is reused accross tests, no need to calculate it # multiple times. # Mock away current time calculation, timestamps are imaginary from # this point on. self.before = 99 with patch('pow.ccurl_interface.get_current_ms', MagicMock(return_value=100)): self.powed = ccurl_interface.attach_to_tangle( self.bundle.as_tryte_strings(), self.branch, self.trunk, mwm=14) self.after = 101 self.powed_bundle = Bundle.from_tryte_strings(self.powed)
def test_random(self): """ Creating a random TransactionTrytes object. """ random_tx_trytes = TransactionTrytes.random() self.assertEqual(len(random_tx_trytes), TransactionTrytes.LEN)
def setUp(self): super(IsPromotableCommandTestCase, self).setUp() self.adapter = MockAdapter() self.command = IsPromotableCommand(self.adapter) # Define some tryte sequences that we can re-use across tests. self.trytes1 = TransactionTrytes( 'CCGCVADBEACCWCXCGDEAXCGDEAPCEAHDTCGDHDEAHDFDPCBDGDPCRCHDXCCDBDE' 'ACDBD9DMDSA9999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999ETTEXDKDEUALTLRJVX' 'RHCPRJDLGPJCEQBJOMOAGBZWZCWLNUEWHAUSYJMYPEZPYNBTPSPGUIPQ9VOUNQ9' '999999999999999999999999999JVPROMOTABLETEST99999999999USHRPBD99' '999999999999999999XFVLEXEJPTYI9TUA9ULFNHXBGDUCOEPDIBKSZFXEBO9HF' 'EGLENBCOVKHZ99IWZVCVSTUGKTIBEOVFBJPCDYHBDEIIBLHRVQX9KVVRTUIQMOF' 'XUUETRIQCCCLSMVREZSNEXLIZCIUYIYRBJIBOKNJCQAJTAHGNZ9999DYHBDEIIB' 'LHRVQX9KVVRTUIQMOFXUUETRIQCCCLSMVREZSNEXLIZCIUYIYRBJIBOKNJCQAJT' 'AHGNZ9999ISPROMOTABLETEST9999999999999BFQOIOF999999999MMMMMMMMM' 'EL999999999AG99999999999999') self.hash1 = TransactionHash( 'MHNBILKFU9CADOPNWSFYOMILGKJAHEU9GSSOYUEAPBGOOLAIKGBYSACXMFQRJZE' 'PBSHI9SDKMBRK99999') self.trytes2 = TransactionTrytes( 'CCGCVADBEACCWCXCGDEAXCGDEAPCEAHDTCGDHDEAHDFDPCBDGDPCRCHDXCCDBDEA' 'CDBD9DMDSA999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '9999999999999999999999999999999999999999999999999999999999999999' '99999999999ETTEXDKDEUALTLRJVXRHCPRJDLGPJCEQBJOMOAGBZWZCWLNUEWHAU' 'SYJMYPEZPYNBTPSPGUIPQ9VOUNQ9999999999999999999999999999JVPROMOTA' 'BLETEST99999999999USHRPBD99999999999999999999XFVLEXEJPTYI9TUA9UL' 'FNHXBGDUCOEPDIBKSZFXEBO9HFEGLENBCOVKHZ99IWZVCVSTUGKTIBEOVFBJPCDA' 'WCMHRLDQPBBGISNENMIXOGGYSRYXGAFEJC9FOLXLYIQVUHFCMVRPBIEAXDUYYPYN' 'EZPHH9KB9HZ9999DAWCMHRLDQPBBGISNENMIXOGGYSRYXGAFEJC9FOLXLYIQVUHF' 'CMVRPBIEAXDUYYPYNEZPHH9KB9HZ9999ISPROMOTABLETEST99999999999IOCFQ' 'OIOF999999999MMMMMMMMMCAA9999999UYA99999999999999') self.hash2 = TransactionHash( 'FLNPRAOEYMBIXZBBFMQGCEWLRKTZTMWWTVUQRNUNMZR9EMVKETRMWHRMBFWHJHX' 'ZOIMUWZALX9IVZ9999') # Tuesday, October 29, 2019 4:19:43.600 PM GMT+01:00 self.valid_now = 1572362383600 """
def setUp(self) -> None: # Need two valid bundles super().setUp() self.adapter = MockAdapter() self.single_bundle = Bundle.from_tryte_strings([ TransactionTrytes( '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999POALVTTGQHJFGINKJ9' 'EWRJZBQLLWMMNMNRUT9VFWDDMDWHPJMNDOFZXUQUABGCXZRH9OI9NWEUSHVYXDO' '999999999999999999999999999C99999999999999999999999999RIGEHBD99' '999999999999999999RPCKQTYDOV9IYVYYALBTBLHRFCLFMTCC9ZLOKKGENTDFY' 'COKFUITXUIUJLBNWAEKBJKBYDSRLVHSGELCCCZGNHCYEAKJ9OPRZFIBYEEBTRFT' 'QTWJUKRDKNSEESICPJRTDNZQQYNXOFVXI9CPRNBO9APJMEXATA9999CZGNHCYEA' 'KJ9OPRZFIBYEEBTRFTQTWJUKRDKNSEESICPJRTDNZQQYNXOFVXI9CPRNBO9APJM' 'EXATA9999C99999999999999999999999999FQFFNIHPF999999999MMMMMMMMM' 'BCDJOVFVODAQEPAXIWDRFKCTOFI') ]) self.three_tx_bundle = Bundle.from_tryte_strings(([ TransactionTrytes( 'PBXCFDGDHDEAHDFDPCBDGDPCRCHDXCCDBDEAXCBDEAHDWCTCEAQCIDBDSC9DTCS' 'A99999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999M9OVNPOWKUNQYDHFN9' 'YAL9WIQJDVAFKBU9ZPIHSGTZLGFJODRZINZMDALS9ERTNAJ9VTENWYLBSYALQQL' '999999999999999999999999999EYOTA9TESTS9999999999999999BOPIHBD99' '999999999B99999999JWFDGHYGEQIKSPCWEAHHQACOYHQWINSA9GELCEZNQEUHV' 'DH9UAYJVSTIIKW9URTHHIJYGWXGE9AEWISYWZSLPKSJETGKZEQVPISQSNDHIAXQ' 'RZVFJXFOXZAVMRUGALCQRHUEZPDFNLCIKQGWEKDJURLZLMUZVA99999BSJCSWTG' 'RTJSGZPOXRPICUDATCLCVTF9BEDHSZZRLSH9IRMTFRVAMSSHC9TRYZGHPWRDVTX' 'EXWTZ9999PYOTA9TESTS9999999999999999OSZRBMHPF999999999MMMMMMMMM' 'IVL9PTSTAIRGJLGXFQGIWOJHBKF'), TransactionTrytes( 'BCTCRCCDBDSCEAHDFDPCBDGDPCRCHDXCCDBDEAXCBDEAHDWCTCEAQCIDBDSC9DT' 'CSA999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999LSTTHILAJWQEXWVOJQ' 'GRANRLNHQLKYXVQFBYJ9QDFRISQR9WJYMSSZUBOCVLXF9TACHKGQUEGMJPICXVY' '999999999999999999999999999PYOTA9TESTS9999999999999999BOPIHBD99' 'A99999999B99999999JWFDGHYGEQIKSPCWEAHHQACOYHQWINSA9GELCEZNQEUHV' 'DH9UAYJVSTIIKW9URTHHIJYGWXGE9AEWISYWQQAWNWHDSGZWFTKTYSV99PJIFFM' 'OPFWONAOTRBUEDGLORTHNMXM9EZNILYEIWCQIAVMAGDBHYWWOA99999BSJCSWTG' 'RTJSGZPOXRPICUDATCLCVTF9BEDHSZZRLSH9IRMTFRVAMSSHC9TRYZGHPWRDVTX' 'EXWTZ9999PYOTA9TESTS9999999999999999EMSRBMHPF999999999MMMMMMMMM' 'NXTVOIJXAAJUS9SRVJEVDVOSIUE'), TransactionTrytes( 'CCWCXCFDSCEAHDFDPCBDGDPCRCHDXCCDBDEAXCBDEAHDWCTCEAQCIDBDSC9DTCS' 'A99999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999999999999999999999' '999999999999999999999999999999999999999999999FSXLFSGAHTGSFPK9FH' 'HURWZJAWQDQCRIFUHMSZWUTNRAIDNGEHGPHLNJOEAIDGLYQRCYSCYDTBZQFDGQK' '999999999999999999999999999PYOTA9TESTS9999999999999999BOPIHBD99' 'B99999999B99999999JWFDGHYGEQIKSPCWEAHHQACOYHQWINSA9GELCEZNQEUHV' 'DH9UAYJVSTIIKW9URTHHIJYGWXGE9AEWISYW9BSJCSWTGRTJSGZPOXRPICUDATC' 'LCVTF9BEDHSZZRLSH9IRMTFRVAMSSHC9TRYZGHPWRDVTXEXWTZ99999BSJCSWTG' 'RTJSGZPOXRPICUDATCLCVTF9BEDHSZZRLSH9IRMTFRVAMSSHC9TRYZGHPWRDVTX' 'EXWTZ9999PYOTA9TESTS9999999999999999LUSRBMHPF999999999MMMMMMMMM' 'BOCWSYQAKMZXDR9ZPHXTXZORELC'), ]))
async def test_happy_path(self): """ Sending a transfer successfully. """ transaction1 =\ TransactionTrytes( b'GYPRVHBEZOOFXSHQBLCYW9ICTCISLHDBNMMVYD9JJHQMPQCTIQAQTJNNNJ9IDXLRCC' b'OYOXYPCLR9PBEY9ORZIEPPDNTI9CQWYZUOTAVBXPSBOFEQAPFLWXSWUIUSJMSJIIIZ' b'WIKIRH9GCOEVZFKNXEVCUCIIWZQCQEUVRZOCMEL9AMGXJNMLJCIA9UWGRPPHCEOPTS' b'VPKPPPCMQXYBHMSODTWUOABPKWFFFQJHCBVYXLHEWPD9YUDFTGNCYAKQKVEZYRBQRB' b'XIAUX9SVEDUKGMTWQIYXRGSWYRK9SRONVGTW9YGHSZRIXWGPCCUCDRMAXBPDFVHSRY' b'WHGB9DQSQFQKSNICGPIPTRZINYRXQAFSWSEWIFRMSBMGTNYPRWFSOIIWWT9IDSELM9' b'JUOOWFNCCSHUSMGNROBFJX9JQ9XT9PKEGQYQAWAFPRVRRVQPUQBHLSNTEFCDKBWRCD' b'X9EYOBB9KPMTLNNQLADBDLZPRVBCKVCYQEOLARJYAGTBFR9QLPKZBOYWZQOVKCVYRG' b'YI9ZEFIQRKYXLJBZJDBJDJVQZCGYQMROVHNDBLGNLQODPUXFNTADDVYNZJUVPGB9LV' b'PJIYLAPBOEHPMRWUIAJXVQOEM9ROEYUOTNLXVVQEYRQWDTQGDLEYFIYNDPRAIXOZEB' b'CS9P99AZTQQLKEILEVXMSHBIDHLXKUOMMNFKPYHONKEYDCHMUNTTNRYVMMEYHPGASP' b'ZXASKRUPWQSHDMU9VPS99ZZ9SJJYFUJFFMFORBYDILBXCAVJDPDFHTTTIYOVGLRDYR' b'TKHXJORJVYRPTDH9ZCPZ9ZADXZFRSFPIQKWLBRNTWJHXTOAUOL9FVGTUMMPYGYICJD' b'XMOESEVDJWLMCVTJLPIEKBE9JTHDQWV9MRMEWFLPWGJFLUXI9BXPSVWCMUWLZSEWHB' b'DZKXOLYNOZAPOYLQVZAQMOHGTTQEUAOVKVRRGAHNGPUEKHFVPVCOYSJAWHZU9DRROH' b'BETBAFTATVAUGOEGCAYUXACLSSHHVYDHMDGJP9AUCLWLNTFEVGQGHQXSKEMVOVSKQE' b'EWHWZUDTYOBGCURRZSJZLFVQQAAYQO9TRLFFN9HTDQXBSPPJYXMNGLLBHOMNVXNOWE' b'IDMJVCLLDFHBDONQJCJVLBLCSMDOUQCKKCQJMGTSTHBXPXAMLMSXRIPUBMBAWBFNLH' b'LUJTRJLDERLZFUBUSMF999XNHLEEXEENQJNOFFPNPQ9PQICHSATPLZVMVIWLRTKYPI' b'XNFGYWOJSQDAXGFHKZPFLPXQEHCYEAGTIWIJEZTAVLNUMAFWGGLXMBNUQTOFCNLJTC' b'DMWVVZGVBSEBCPFSM99FLOIDTCLUGPSEDLOKZUAEVBLWNMODGZBWOVQT9DPFOTSKRA' b'BQAVOQ9RXWBMAKFYNDCZOJGTCIDMQSQQSODKDXTPFLNOKSIZEOY9HFUTLQRXQMEPGO' b'XQGLLPNSXAUCYPGZMNWMQWSWCKAQYKXJTWINSGPPZG9HLDLEAWUWEVCTVRCBDFOXKU' b'ROXH9HXXAXVPEJFRSLOGRVGYZASTEBAQNXJJROCYRTDPYFUIQJVDHAKEG9YACV9HCP' b'JUEUKOYFNWDXCCJBIFQKYOXGRDHVTHEQUMHO999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999999999999999999999999999999999999' b'999999999999RKWEEVD99A99999999A99999999NFDPEEZCWVYLKZGSLCQNOFUSENI' b'XRHWWTZFBXMPSQHEDFWZULBZFEOMNLRNIDQKDNNIELAOXOVMYEI9PGTKORV9IKTJZQ' b'UBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSKUCUEMD9M9SQJ999' b'999TKORV9IKTJZQUBQAWTKBKZ9NEZHBFIMCLV9TTNJNQZUIJDFPTTCTKBJRHAITVSK' b'UCUEMD9M9SQJ999999999999999999999999999999999999999999999999999999' b'999999999999999999999999999999999' ) mock_prepare_transfer =\ mock.Mock(return_value=async_return({ 'trytes': [transaction1], })) mock_send_trytes =\ mock.Mock(return_value=async_return({ 'trytes': [transaction1], })) with mock.patch( 'iota.commands.extended.prepare_transfer.PrepareTransferCommand._execute', mock_prepare_transfer, ): with mock.patch( 'iota.commands.extended.send_trytes.SendTrytesCommand._execute', mock_send_trytes, ): response = await self.command( depth=100, minWeightMagnitude=18, seed=Seed.random(), transfers=[ ProposedTransaction( address=Address( b'9999999999999999999999999999999999999999' b'99999999999999999999999999999999999999999'), value=0, ), ], ) bundle = response['bundle'] # type: Bundle self.assertEqual(len(bundle), 1) self.assertEqual(bundle[0].as_tryte_string(), transaction1)