def _merge_account(self, address): server = self._get_horizon_server() account = server.load_account(address) # Increment the sequence number in case the unlock transaction was not processed before the load_account call # account.increment_sequence_number() balances = self._get_free_balances(address) base_fee = server.fetch_base_fee() transaction_builder = TransactionBuilder( source_account=account, network_passphrase=_NETWORK_PASSPHRASES[str(self.network)], base_fee=base_fee) for balance in balances.balances: if balance.is_native(): continue # Step 1: Transfer custom assets transaction_builder.append_payment_op( destination=self.address, amount=balance.balance, asset_code=balance.asset_code, asset_issuer=balance.asset_issuer, ) # Step 2: Delete trustlines transaction_builder.append_change_trust_op( asset_issuer=balance.asset_issuer, asset_code=balance.asset_code, limit="0") # Step 3: Merge account transaction_builder.append_account_merge_op(self.address) transaction_builder.set_timeout(30) transaction = transaction_builder.build() signer_kp = Keypair.from_secret(self.secret) transaction.sign(signer_kp) server.submit_transaction(transaction)
def add_balance(self, code, amount, accounts, dest, src, issuer): tb = TransactionBuilder( self.account_from_json(accounts[src.public_key]), base_fee=settings.MAX_TRANSACTION_FEE_STROOPS or settings.HORIZON_SERVER.fetch_base_fee(), network_passphrase="Test SDF Network ; September 2015", ) balance = self.get_balance(code, accounts[dest.public_key]) if not balance: print(f"\nCreating {code} trustline for {dest.public_key}") if settings.MAX_TRANSACTION_FEE_STROOPS: # halve the base_fee because there are 2 operations tb.base_fee = tb.base_fee // 2 tb.append_change_trust_op( asset_code=code, asset_issuer=issuer.public_key, source=dest.public_key ) payment_amount = amount elif Decimal(balance) < amount: print(f"\nReplenishing {code} balance to {amount} for {dest.public_key}") payment_amount = amount - Decimal(balance) else: print( "Destination account already has more than the amount " "specified, skipping\n" ) return print(f"Sending {code} payment of {payment_amount} to {dest.public_key}") tb.append_payment_op( destination=dest.public_key, amount=payment_amount, asset_code=code, asset_issuer=issuer.public_key, source=src.public_key, ) envelope = tb.set_timeout(30).build() if len(tb.operations) == 2: # add destination's signature if we're adding a trustline envelope.sign(dest) envelope.sign(src) try: self.server.submit_transaction(envelope) except BaseHorizonError as e: print( f"Failed to send {code} payment to {dest.public_key}. " f"Result codes: {e.extras.get('result_codes')}" ) else: print("Success!")
def add_balance(self, code, amount, accounts, dest, src, issuer): tb = TransactionBuilder( self.account_from_json(accounts[src.public_key]), base_fee=500, network_passphrase="Test SDF Network ; September 2015", ) payment_amount = None balance = self.get_balance(code, accounts[dest.public_key]) if not balance: print(f"\nCreating {code} trustline for {dest.public_key}") limit = amount if src == issuer else None tb.append_change_trust_op(code, issuer.public_key, limit, dest.public_key) payment_amount = amount elif Decimal(balance) < amount: print( f"\nReplenishing {code} balance to {amount} for {dest.public_key}" ) payment_amount = amount - Decimal(balance) else: print("Destination account already has more than the amount " "specified, skipping") return print( f"Sending {code} payment of {payment_amount} to {dest.public_key}") tb.append_payment_op(dest.public_key, payment_amount, code, issuer.public_key, src.public_key) envelope = tb.set_timeout(30).build() envelope.sign(src) if len(tb.operations) == 2: # We only need the destination's signature if we're adding a trustline # to the account envelope.sign(dest) try: self.server.submit_transaction(envelope) except BaseHorizonError as e: print(f"Failed to send {code} payment to {dest.public_key}. " f"Result codes: {e.extras.get('result_codes')}") else: print("Success!")