def create_holding(txn_key, batch_key, identifier, label, description, asset, quantity): """Create a CreateHolding txn and wrap it in a batch and list. Args: txn_key (sawtooth_signing.Signer): The txn signer key pair. batch_key (sawtooth_signing.Signer): The batch signer key pair. identifier (str): The identifier of the Holding. label (str): The label of the Holding. description (str): The description of the Holding. quantity (int): The amount of the Asset. Returns: tuple: List of Batch, signature tuple """ inputs = [ addresser.make_account_address( account_id=txn_key.get_public_key().as_hex()), addresser.make_asset_address(asset_id=asset), addresser.make_holding_address(holding_id=identifier) ] outputs = [addresser.make_holding_address(holding_id=identifier), addresser.make_account_address( account_id=txn_key.get_public_key().as_hex())] holding_txn = payload_pb2.CreateHolding( id=identifier, label=label, description=description, asset=asset, quantity=quantity) payload = payload_pb2.TransactionPayload( payload_type=payload_pb2.TransactionPayload.CREATE_HOLDING, create_holding=holding_txn) return make_header_and_batch( payload=payload, inputs=inputs, outputs=outputs, txn_key=txn_key, batch_key=batch_key)
def set_holding(self, identifier, label, description, account, asset, quantity): address = addresser.make_holding_address(holding_id=identifier) container = _get_holding_container(self._state_entries, address) try: holding = _get_holding_from_container(container, identifier) except KeyError: holding = container.entries.add() holding.id = identifier holding.label = label holding.description = description holding.account = account holding.asset = asset holding.quantity = quantity state_entries_send = {} state_entries_send[address] = container.SerializeToString() return self._context.set_state( state_entries_send, self._timeout)
def test_holding_address(self): holding_address = addresser.make_holding_address(uuid4().hex) self.assertEqual(len(holding_address), 70, "The address is valid.") self.assertEqual(addresser.address_is(holding_address), addresser.AddressSpace.HOLDING, "The address is correctly identified as an Holding.")
def _return_offer_rules( self, holding_id, ): holding_addr = addresser.make_holding_address(holding_id) holding = self._get_holding(holding_addr, holding_id) asset = self.get_asset(holding.asset) return [r for r in asset.rules if r.type in OFFER_RULES]
def get_holding(self, identifier): address = addresser.make_holding_address(holding_id=identifier) self._state_entries.extend(self._context.get_state( addresses=[address], timeout=self._timeout)) return self._get_holding(address=address, identifier=identifier)
def get_holding(self, identifier): address = addresser.make_holding_address(holding_id=identifier) self._state_entries.extend( self._context.get_state(addresses=[address], timeout=self._timeout)) return self._get_holding(address=address, identifier=identifier)
def change_holding_quantity(self, identifier, new_quantity): address = addresser.make_holding_address(holding_id=identifier) container = _get_holding_container(self._state_entries, address) try: holding = _get_holding_from_container(container, identifier) except KeyError: holding = container.entries.add() holding.quantity = new_quantity state_entries_send = {} state_entries_send[address] = container.SerializeToString() return self._context.set_state(state_entries_send, self._timeout)
def get_holding(self, identifier): address = addresser.make_holding_address(holding_id=identifier) self._state_entries.extend( self._context.get_state(addresses=[address], timeout=self._timeout)) container = _get_holding_container(self._state_entries, address) holding = None try: holding = _get_holding_from_container(container, identifier) except KeyError: # Fine with returning None pass return holding
def change_holding_quantity(self, identifier, new_quantity): address = addresser.make_holding_address(holding_id=identifier) container = _get_holding_container(self._state_entries, address) try: holding = _get_holding_from_container(container, identifier) except KeyError: holding = container.entries.add() holding.quantity = new_quantity state_entries_send = {} state_entries_send[address] = container.SerializeToString() return self._context.set_state( state_entries_send, self._timeout)
def set_holding(self, identifier, label, description, account, asset, quantity): address = addresser.make_holding_address(holding_id=identifier) container = _get_holding_container(self._state_entries, address) try: holding = _get_holding_from_container(container, identifier) except KeyError: holding = container.entries.add() holding.id = identifier holding.label = label holding.description = description holding.account = account holding.asset = asset holding.quantity = quantity state_entries_send = {} state_entries_send[address] = container.SerializeToString() return self._context.set_state(state_entries_send, self._timeout)
def accept_offer(txn_key, batch_key, identifier, offerer, receiver, count): """Create an AcceptOffer txn and wrap it in a Batch and list. Args: txn_key (sawtooth_signing.Signer): The Txn signer key pair. batch_key (sawtooth_signing.Signer): The Batch signer key pair. identifier (str): The identifier of the Offer. offerer (OfferParticipant): The participant who made the offer. receiver (OfferParticipant): The participant who is accepting the offer. count (int): The number of units of exchange. Returns: tuple: List of Batch, signature tuple """ inputs = [addresser.make_holding_address(receiver.target), addresser.make_holding_address(offerer.source), addresser.make_asset_address(receiver.target_asset), addresser.make_asset_address(offerer.source_asset), addresser.make_offer_history_address(offer_id=identifier), addresser.make_offer_account_address( offer_id=identifier, account=txn_key.get_public_key().as_hex()), addresser.make_offer_address(identifier)] outputs = [addresser.make_holding_address(receiver.target), addresser.make_holding_address(offerer.source), addresser.make_offer_history_address(offer_id=identifier), addresser.make_offer_account_address( offer_id=identifier, account=txn_key.get_public_key().as_hex())] if receiver.source is not None: inputs.append(addresser.make_holding_address(receiver.source)) inputs.append(addresser.make_asset_address(receiver.source_asset)) outputs.append(addresser.make_holding_address(receiver.source)) if offerer.target is not None: inputs.append(addresser.make_holding_address(offerer.target)) inputs.append(addresser.make_asset_address(offerer.target_asset)) outputs.append(addresser.make_holding_address(offerer.target)) accept_txn = payload_pb2.AcceptOffer( id=identifier, source=receiver.source, target=receiver.target, count=count) payload = payload_pb2.TransactionPayload( payload_type=payload_pb2.TransactionPayload.ACCEPT_OFFER, accept_offer=accept_txn) return make_header_and_batch( payload=payload, inputs=inputs, outputs=outputs, txn_key=txn_key, batch_key=batch_key)
def create_offer(txn_key, batch_key, identifier, label, description, source, target, rules): """Create a CreateOffer txn and wrap it in a batch and list. Args: txn_key (sawtooth_signing.Signer): The Txn signer key pair. batch_key (sawtooth_signing.Signer): The Batch signer key pair. identifier (str): The identifier of the Offer. label (str): The offer's label. description (str): The description of the offer. source (MarketplaceHolding): The holding id, quantity, asset to be drawn from. target (MarketplaceHolding): The holding id, quantity, asset to be paid into. rules (list): List of protobuf.rule_pb2.Rule Returns: tuple: List of Batch, signature tuple """ inputs = [ addresser.make_account_address( account_id=txn_key.get_public_key().as_hex()), addresser.make_holding_address( holding_id=source.holding_id), addresser.make_offer_address(offer_id=identifier), addresser.make_asset_address(asset_id=source.asset) ] if target.holding_id: inputs.append(addresser.make_holding_address( holding_id=target.holding_id)) inputs.append(addresser.make_asset_address(target.asset)) outputs = [addresser.make_offer_address(offer_id=identifier)] offer_txn = payload_pb2.CreateOffer( id=identifier, label=label, description=description, source=source.holding_id, source_quantity=source.quantity, target=target.holding_id, target_quantity=target.quantity, rules=rules) payload = payload_pb2.TransactionPayload( payload_type=payload_pb2.TransactionPayload.CREATE_OFFER, create_offer=offer_txn) return make_header_and_batch( payload=payload, inputs=inputs, outputs=outputs, txn_key=txn_key, batch_key=batch_key)
def _return_offer_rules(self, holding_id,): holding_addr = addresser.make_holding_address(holding_id) holding = self._get_holding(holding_addr, holding_id) asset = self.get_asset(holding.asset) return [r for r in asset.rules if r.type in OFFER_RULES]