Create and return a tx with the specified fee. If fee is 0, use fee_rate, where the resulting fee may be exact or at most one satoshi higher than needed.
(
self,
*,
fee_rate=Decimal("0.003"),
fee=Decimal("0"),
utxo_to_spend=None,
target_vsize=0,
confirmed_only=False,
**kwargs,
)
| 352 | } |
| 353 | |
| 354 | def create_self_transfer( |
| 355 | self, |
| 356 | *, |
| 357 | fee_rate=Decimal("0.003"), |
| 358 | fee=Decimal("0"), |
| 359 | utxo_to_spend=None, |
| 360 | target_vsize=0, |
| 361 | confirmed_only=False, |
| 362 | **kwargs, |
| 363 | ): |
| 364 | """Create and return a tx with the specified fee. If fee is 0, use fee_rate, where the resulting fee may be exact or at most one satoshi higher than needed.""" |
| 365 | utxo_to_spend = utxo_to_spend or self.get_utxo(confirmed_only=confirmed_only) |
| 366 | assert fee_rate >= 0 |
| 367 | assert fee >= 0 |
| 368 | # calculate fee |
| 369 | if self._mode in (MiniWalletMode.RAW_OP_TRUE, MiniWalletMode.ADDRESS_OP_TRUE): |
| 370 | vsize = Decimal(104) # anyone-can-spend |
| 371 | elif self._mode == MiniWalletMode.RAW_P2PK: |
| 372 | vsize = Decimal(168) # P2PK (73 bytes scriptSig + 35 bytes scriptPubKey + 60 bytes other) |
| 373 | else: |
| 374 | assert False |
| 375 | if target_vsize and not fee: # respect fee_rate if target vsize is passed |
| 376 | fee = get_fee(target_vsize, fee_rate) |
| 377 | send_value = utxo_to_spend["value"] - (fee or (fee_rate * vsize / 1000)) |
| 378 | if send_value <= 0: |
| 379 | raise RuntimeError(f"UTXO value {utxo_to_spend['value']} is too small to cover fees {(fee or (fee_rate * vsize / 1000))}") |
| 380 | # create tx |
| 381 | tx = self.create_self_transfer_multi( |
| 382 | utxos_to_spend=[utxo_to_spend], |
| 383 | amount_per_output=int(COIN * send_value), |
| 384 | target_vsize=target_vsize, |
| 385 | **kwargs, |
| 386 | ) |
| 387 | if not target_vsize: |
| 388 | assert_equal(tx["tx"].get_vsize(), vsize) |
| 389 | tx["new_utxo"] = tx.pop("new_utxos")[0] |
| 390 | |
| 391 | return tx |
| 392 | |
| 393 | def sendrawtransaction(self, *, from_node, tx_hex, maxfeerate=0, **kwargs): |
| 394 | txid = from_node.sendrawtransaction(hexstring=tx_hex, maxfeerate=maxfeerate, **kwargs) |