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)
Пример #2
0
    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!")
Пример #3
0
    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!")