def submit_transaction( transaction: Transaction, client: Client, ) -> Response: """ Submits a transaction to the ledger. Args: transaction: the Transaction to be submitted. client: the network client with which to submit the transaction. Returns: The response from the ledger. Raises: XRPLRequestFailureException: if the rippled API call fails. """ transaction_json = transaction_json_to_binary_codec_form( transaction.to_dict()) transaction_blob = encode(transaction_json) response = client.request(SubmitOnly(tx_blob=transaction_blob)) if response.is_successful(): return response result = cast(Dict[str, Any], response.result) raise XRPLRequestFailureException(result)
def test_to_dict_includes_type_as_string(self): tx = Transaction( account=_ACCOUNT, fee=_FEE, sequence=_SEQUENCE, transaction_type=TransactionType.ACCOUNT_DELETE, ) value = tx.to_dict()["transaction_type"] self.assertEqual(type(value), str)
def test_to_dict_flag_list(self): tx = Transaction( account=_ACCOUNT, fee=_FEE, sequence=_SEQUENCE, transaction_type=TransactionType.ACCOUNT_DELETE, flags=[0b1, 0b10, 0b100], ) expected_flags = 0b111 value = tx.to_dict()["flags"] self.assertEqual(value, expected_flags)
def _autofill_transaction(transaction: Transaction, client: Client) -> Transaction: transaction_json = transaction.to_dict() if "sequence" not in transaction_json: sequence = get_next_valid_seq_number(transaction_json["account"], client) transaction_json["sequence"] = sequence if "fee" not in transaction_json: transaction_json["fee"] = _calculate_fee_per_transaction_type( transaction, client ) if "last_ledger_sequence" not in transaction_json: ledger_sequence = get_latest_validated_ledger_sequence(client) transaction_json["last_ledger_sequence"] = ledger_sequence + _LEDGER_OFFSET return Transaction.from_dict(transaction_json)
def safe_sign_transaction(transaction: Transaction, wallet: Wallet) -> str: """ Signs a transaction locally, without trusting external rippled nodes. Args: transaction: the transaction to be signed. wallet: the wallet with which to sign the transaction. Returns: The signed transaction blob. """ # Increment the wallet sequence number, since we're about to use one. wallet.next_sequence_num += 1 transaction_json = transaction_json_to_binary_codec_form( transaction.to_dict()) transaction_json["SigningPubKey"] = wallet.pub_key serialized_for_signing = encode_for_signing(transaction_json) serialized_bytes = bytes.fromhex(serialized_for_signing) signature = sign(serialized_bytes, wallet.priv_key) transaction_json["TxnSignature"] = signature return encode(transaction_json)
def _prepare_transaction( transaction: Transaction, wallet: Wallet, ) -> Dict[str, Any]: """ Prepares a Transaction by converting it to a JSON-like dictionary, converting the field names to CamelCase. If a Client is provided, then it also autofills any relevant fields. Args: transaction: the Transaction to be prepared. wallet: the wallet that will be used for signing. Returns: A JSON-like dictionary that is ready to be signed. Raises: XRPLException: if both LastLedgerSequence and `ledger_offset` are provided, or if an address tag is provided that does not match the X-Address tag. """ transaction_json = transaction_json_to_binary_codec_form( transaction.to_dict()) transaction_json["SigningPubKey"] = wallet.public_key _validate_account_xaddress(transaction_json, "Account", "SourceTag") if "Destination" in transaction_json: _validate_account_xaddress(transaction_json, "Destination", "DestinationTag") # DepositPreauth _convert_to_classic_address(transaction_json, "Authorize") _convert_to_classic_address(transaction_json, "Unauthorize") # EscrowCancel, EscrowFinish _convert_to_classic_address(transaction_json, "Owner") # SetRegularKey _convert_to_classic_address(transaction_json, "RegularKey") return transaction_json