def test_pathPayment_min(self): result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAIAAAAAAAAAAACYloAAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAAAAAAHNPhNjAAAAQFwSz9wwBEWCv9cNnuIq+Jjq36mXBI22f6uj/FZ6LbyLljkckSLkF/AqXcaOoOgY9mZ0NrXsHbA5/chSThtgMgQ=' # TODO assert (result == self.do(op=PathPayment({ 'source': self.source, 'destination': self.dest, 'send_asset': Asset.native(), 'dest_asset': Asset.native(), 'send_max': self.amount, 'dest_amount': self.amount, 'path': [], })))
def test_payment_min(self): op = Payment({ 'source': self.source, 'destination': self.dest, 'asset': Asset.native(), 'amount': self.amount, }) op_x = Operation.from_xdr(op.xdr()) assert op == op_x assert op_x.source == self.source assert op_x.destination == self.dest assert op_x.asset == Asset.native() assert op_x.amount == self.amount
def test_double_payment(self): result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAyAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAAAAAAAvrwgAAAAAAAAAAAQAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAAAAAAAF9eEAAAAAAAAAAABzT4TYwAAAEAhTZr3nE2w9LBziL54UuyuEgUa4MJaXfMnZpHpu9+TYgPaDE3M6DNe6Du8ZSSC89LCGfpS1Fs38JB0U5rikmMP' assert (result == self.make_envelope( Payment({ 'destination': self.accounts[0]['address'], 'asset': Asset.native(), 'amount': self.amount, }), Payment({ 'destination': self.accounts[1]['address'], 'asset': Asset.native(), 'amount': "40", }), ))
def test_double_payment(self): result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAyAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAAAAAAAvrwgAAAAAAAAAAAQAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAAAAAAAF9eEAAAAAAAAAAABzT4TYwAAAEAhTZr3nE2w9LBziL54UuyuEgUa4MJaXfMnZpHpu9+TYgPaDE3M6DNe6Du8ZSSC89LCGfpS1Fs38JB0U5rikmMP' assert (result == self.make_envelope( Payment({ 'destination': self.accounts[0]['address'], 'asset': Asset.native(), 'amount': self.amount * 1, }), Payment({ 'destination': self.accounts[1]['address'], 'asset': Asset.native(), 'amount': self.amount * 2, }), ))
def send_xlm_vault_transaction(user, destination, amount): from stellar_base.transaction import Transaction wallet = VaultWallet.objects.get(username=user, name="xlm") User = Keypair.from_seed(wallet.private) horizon = horizon_testnet() asset = Asset.native() op = Payment({ 'destination': destination, 'asset': asset, 'amount': amount }) msg = TextMemo('From test net !') sequence = horizon.account(User.address().decode('utf-8')).get('sequence') tx = Transaction( source=User.address().decode(), opts={ 'sequence': sequence, 'memo': msg, 'operations': [ op, ], }, ) try: envelope = Te(tx=tx, opts={"network_id": "TESTNET"}) envelope.sign(User) xdr = envelope.xdr() response = horizon.submit(xdr) return response['hash'] except: return {"error": ""}
def test_pathPayment_min(self, setup): if setup.type == 'testnet': result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAIAAAAAAAAAAACYloAAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAAAAAAHNPhNjAAAAQFwSz9wwBEWCv9cNnuIq+Jjq36mXBI22f6uj/FZ6LbyLljkckSLkF/AqXcaOoOgY9mZ0NrXsHbA5/chSThtgMgQ=' # TODO else: result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAIAAAAAAAAAAACYloAAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAAAAAAHNPhNjAAAAQI1tBUmMqDa497gw9JJVgucfaiKr2e8VNWg/Pw9jM1d9qNWHBvEHxTLtBDyFKuJEguV1KVS7vBjFznlVCnKC3AI=' assert (result == self.do( setup.network, op=PathPayment( source=self.source, destination=self.dest, send_asset=Asset.native(), dest_asset=Asset.native(), send_max=self.amount, dest_amount=self.amount, path=[], )))
def test_payment_min(self): result = b"AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAEAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAc0+E2MAAABAzEdbP2ISsB9pDqmIRPt6WEK0GkVOgAEljnelNQjNpDig6A60+jMtveQjdCocL13GwVbO1B8VBXgQdlAobs0fDg==" assert result == self.do( op=Payment( {"source": self.source, "destination": self.dest, "asset": Asset.native(), "amount": self.amount} ) )
def test_mix_1(self): result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAADhAAAAAAAAAACAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAC+vCAAAAAAAAAAABAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAAAAAAAAL68IAAAAAAAAAAAIAAAAAAAAAAAvrwgAAAAAAoEATyhnfBjtgSGL5Fr4oHlw/X4bIYnH44zIpor2MQbUAAAAAAAAAAAvrwgAAAAAAAAAAAAAAAAMAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFiZWVyAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAADuaygAABMsvAAGGoAAAAAAAAAABAAAAAAAAAAQAAAABYmVlcgAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAFiZWVyAAAAAKBAE8oZ3wY7YEhi+Ra+KB5cP1+GyGJx+OMyKaK9jEG1AAAAADuaygAABMsvAAGGoAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+H//////////AAAAAAAAAAcAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAABYmVlcgAAAAEAAAAAAAAACAAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAAAAAABzT4TYwAAAECnD5OPLjCC3vjtrsffS0fekR0rEgJZoDvJrOdp2G4LBKWLPsH4ZKVVGiOxPq2akIowWckiYXwZG45/mSLSbloN' assert (result == self.make_envelope( CreateAccount({ 'destination': self.accounts[0]['address'], 'starting_balance': self.amount, }), Payment({ 'destination': self.accounts[1]['address'], 'asset': Asset.native(), 'amount': self.amount, }), PathPayment({ 'destination': self.accounts[2]['address'], 'send_asset': Asset.native(), 'dest_asset': Asset.native(), 'send_max': self.amount, 'dest_amount': self.amount, 'path': [], }), ManageOffer({ 'selling': Asset('beer', self.accounts[0]['address']), 'buying': Asset('beer', self.accounts[1]['address']), 'amount': 100 * 10 ** 7, 'price': 3.14159, 'offer_id': 1, }), CreatePassiveOffer({ 'selling': Asset('beer', self.accounts[1]['address']), 'buying': Asset('beer', self.accounts[2]['address']), 'amount': 100 * 10 ** 7, 'price': 3.14159, }), SetOptions({ }), ChangeTrust({ 'asset': Asset('beer', self.accounts[0]['address']), }), AllowTrust({ 'trustor': self.accounts[0]['address'], 'asset_code': 'beer', 'authorize': True, }), AccountMerge({ 'destination': self.accounts[0]['address'], }) ))
def test_mix_1(self): result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAADhAAAAAAAAAACAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAC+vCAAAAAAAAAAABAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAAAAAAAAL68IAAAAAAAAAAAIAAAAAAAAAAAvrwgAAAAAAoEATyhnfBjtgSGL5Fr4oHlw/X4bIYnH44zIpor2MQbUAAAAAAAAAAAvrwgAAAAAAAAAAAAAAAAMAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFiZWVyAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAADuaygAABMsvAAGGoAAAAAAAAAABAAAAAAAAAAQAAAABYmVlcgAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAFiZWVyAAAAAKBAE8oZ3wY7YEhi+Ra+KB5cP1+GyGJx+OMyKaK9jEG1AAAAADuaygAABMsvAAGGoAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+H//////////AAAAAAAAAAcAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAABYmVlcgAAAAEAAAAAAAAACAAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAAAAAABzT4TYwAAAECnD5OPLjCC3vjtrsffS0fekR0rEgJZoDvJrOdp2G4LBKWLPsH4ZKVVGiOxPq2akIowWckiYXwZG45/mSLSbloN' assert (result == self.make_envelope( CreateAccount({ 'destination': self.accounts[0]['address'], 'starting_balance': self.amount, }), Payment({ 'destination': self.accounts[1]['address'], 'asset': Asset.native(), 'amount': self.amount, }), PathPayment({ 'destination': self.accounts[2]['address'], 'send_asset': Asset.native(), 'dest_asset': Asset.native(), 'send_max': self.amount, 'dest_amount': self.amount, 'path': [], }), ManageOffer({ 'selling': Asset('beer', self.accounts[0]['address']), 'buying': Asset('beer', self.accounts[1]['address']), 'amount': "100", 'price': 3.14159, 'offer_id': 1, }), CreatePassiveOffer({ 'selling': Asset('beer', self.accounts[1]['address']), 'buying': Asset('beer', self.accounts[2]['address']), 'amount': "100", 'price': 3.14159, }), SetOptions({}), ChangeTrust({ 'asset': Asset('beer', self.accounts[0]['address']), }), AllowTrust({ 'trustor': self.accounts[0]['address'], 'asset_code': 'beer', 'authorize': True, }), AccountMerge({ 'destination': self.accounts[0]['address'], })))
def test_payment_min(self): result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAEAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAc0+E2MAAABAzEdbP2ISsB9pDqmIRPt6WEK0GkVOgAEljnelNQjNpDig6A60+jMtveQjdCocL13GwVbO1B8VBXgQdlAobs0fDg==' assert (result == self.do(op=Payment({ 'source': self.source, 'destination': self.dest, 'asset': Asset.native(), 'amount': self.amount, })))
def test_minimal_defaults(): from stellar_base.asset import Asset result = b"AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAEAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAc0+E2MAAABAzEdbP2ISsB9pDqmIRPt6WEK0GkVOgAEljnelNQjNpDig6A60+jMtveQjdCocL13GwVbO1B8VBXgQdlAobs0fDg==" assert result == do_single_signer( operation_opts={"source": SOURCE, "destination": DESTINATION, "asset": Asset.native(), "amount": AMOUNT}, tx_opts={"seqNum": SEQ_NUM}, )
def test_double_payment(self, setup): if setup.type == 'testnet': result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAyAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAAAAAAAvrwgAAAAAAAAAAAQAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAAAAAAAF9eEAAAAAAAAAAABzT4TYwAAAEAhTZr3nE2w9LBziL54UuyuEgUa4MJaXfMnZpHpu9+TYgPaDE3M6DNe6Du8ZSSC89LCGfpS1Fs38JB0U5rikmMP' else: result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAyAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAAAAAAAvrwgAAAAAAAAAAAQAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAAAAAAAF9eEAAAAAAAAAAABzT4TYwAAAEAC/EENKQWCZFsKcNMEpWi7TVstQF0JbmBj/+QwkQXW8q/isCHX+UikrhxXJpI5NDKdagnH0godVShWxK1PENAC' assert (result == self.make_envelope( setup.network, Payment( destination=self.accounts[0]['address'], asset=Asset.native(), amount=self.amount, ), Payment( destination=self.accounts[1]['address'], asset=Asset.native(), amount="40", ), ))
def test_textMemo_ascii(): from stellar_base.asset import Asset from stellar_base.memo import TextMemo result = b"AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAEAAAAHdGVzdGluZwAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAEAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAc0+E2MAAABApJRB7KqhymuVzBcsit9QUZsFfk2DwSwwp1CSI6qI1scogBoNchw32lJzJqDDXXUmoi3blG8XxNGkzdFk0BDDAA==" assert result == do_single_signer( operation_opts={"source": SOURCE, "destination": DESTINATION, "asset": Asset.native(), "amount": AMOUNT}, tx_opts={"seqNum": SEQ_NUM, "timeBounds": [], "memo": TextMemo("testing"), "fee": FEE}, )
def test_textMemo_unicode(): from stellar_base.asset import Asset from stellar_base.memo import TextMemo result = b"AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAEAAAAMdMSTxaF0xKvFhsSjAAAAAQAAAAEAAAAA01KM3XCt1+LHD7jDTOYpe/HGKSDoQoyL1JbUOc0+E2MAAAABAAAAAK2uFogrxa/78nU4lG0kBdB8JKhKz/MHOgVEGr96kkCOAAAAAAAAAAAAmJaAAAAAAAAAAAHNPhNjAAAAQJkdyCjp7w6UzRxaaHqg9lrIfWJlEyvEga2ZNhbJ7w1NZxwkqiI7AG2oJg0dg91m83W1ZP85VPOf4iDkIAI2YAs=" assert result == do_single_signer( operation_opts={"source": SOURCE, "destination": DESTINATION, "asset": Asset.native(), "amount": AMOUNT}, tx_opts={"seqNum": SEQ_NUM, "timeBounds": [], "memo": TextMemo("tēštīņģ"), "fee": FEE}, )
def test_mix_1(self, setup): if setup.type == 'testnet': result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAADhAAAAAAAAAACAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAC+vCAAAAAAAAAAABAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAAAAAAAAL68IAAAAAAAAAAAIAAAAAAAAAAAvrwgAAAAAAoEATyhnfBjtgSGL5Fr4oHlw/X4bIYnH44zIpor2MQbUAAAAAAAAAAAvrwgAAAAAAAAAAAAAAAAMAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFiZWVyAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAADuaygAABMsvAAGGoAAAAAAAAAABAAAAAAAAAAQAAAABYmVlcgAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAFiZWVyAAAAAKBAE8oZ3wY7YEhi+Ra+KB5cP1+GyGJx+OMyKaK9jEG1AAAAADuaygAABMsvAAGGoAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+H//////////AAAAAAAAAAcAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAABYmVlcgAAAAEAAAAAAAAACAAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAAAAAABzT4TYwAAAECnD5OPLjCC3vjtrsffS0fekR0rEgJZoDvJrOdp2G4LBKWLPsH4ZKVVGiOxPq2akIowWckiYXwZG45/mSLSbloN' else: result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAADhAAAAAAAAAACAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAC+vCAAAAAAAAAAABAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAAAAAAAAL68IAAAAAAAAAAAIAAAAAAAAAAAvrwgAAAAAAoEATyhnfBjtgSGL5Fr4oHlw/X4bIYnH44zIpor2MQbUAAAAAAAAAAAvrwgAAAAAAAAAAAAAAAAMAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFiZWVyAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAADuaygAABMsvAAGGoAAAAAAAAAABAAAAAAAAAAQAAAABYmVlcgAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAFiZWVyAAAAAKBAE8oZ3wY7YEhi+Ra+KB5cP1+GyGJx+OMyKaK9jEG1AAAAADuaygAABMsvAAGGoAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+H//////////AAAAAAAAAAcAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAABYmVlcgAAAAEAAAAAAAAACAAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAAAAAABzT4TYwAAAEAY0YGZzC1qiKatKCWaCttK1fEs3P4DpVWw2AQCdvVBS4dkCyfxu7N7tpQPEZ4WqXzAiR0D7r5L6f848pmNsgIL' assert (result == self.make_envelope( setup.network, CreateAccount( destination=self.accounts[0]['address'], starting_balance=self.amount, ), Payment( destination=self.accounts[1]['address'], asset=Asset.native(), amount=self.amount, ), PathPayment( destination=self.accounts[2]['address'], send_asset=Asset.native(), dest_asset=Asset.native(), send_max=self.amount, dest_amount=self.amount, path=[], ), ManageOffer( selling=Asset('beer', self.accounts[0]['address']), buying=Asset('beer', self.accounts[1]['address']), amount="100", price=3.14159, offer_id=1, ), CreatePassiveOffer( selling=Asset('beer', self.accounts[1]['address']), buying=Asset('beer', self.accounts[2]['address']), amount="100", price=3.14159, ), SetOptions(), ChangeTrust( asset=Asset('beer', self.accounts[0]['address']), ), AllowTrust( trustor=self.accounts[0]['address'], asset_code='beer', authorize=True, ), AccountMerge(destination=self.accounts[0]['address'], )))
def test_pathPayment_min(self): op = PathPayment({ 'source': self.source, 'destination': self.dest, 'send_asset': Asset.native(), 'dest_asset': Asset.native(), 'send_max': self.amount, 'dest_amount': self.amount, 'path': [], }) op_x = Operation.from_xdr(op.xdr()) assert op == op_x assert op_x.source == self.source assert op_x.destination == self.dest assert op_x.send_asset == Asset.native() assert op_x.dest_asset == Asset.native() assert op_x.send_max == self.amount assert op_x.dest_amount == self.amount assert op_x.path == []
def get_address_lumen_balance(self, address): """Get lumen balance of the account identified by the provided address. :param: str address: the address of the account to query. :return: the lumen balance of the account. :rtype: Decimal :raises: ValueError: if the supplied address has a wrong format. """ return self.get_address_asset_balance(address, Asset.native())
def test_payment_min(self, setup): if setup.type == 'testnet': result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAEAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAc0+E2MAAABAzEdbP2ISsB9pDqmIRPt6WEK0GkVOgAEljnelNQjNpDig6A60+jMtveQjdCocL13GwVbO1B8VBXgQdlAobs0fDg==' else: result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAQAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAAAAEAAAAAra4WiCvFr/vydTiUbSQF0HwkqErP8wc6BUQav3qSQI4AAAAAAAAAAACYloAAAAAAAAAAAc0+E2MAAABAlw7SoaRvm53xhs7ztskutJ3MlhBJ0ME2+uSBLiSCNV+wSolCAIIlWlMF376ciT5V9J6iWMcW1hVrZAQSI4cjDw==' assert (result == self.do( setup.network, op=Payment( source=self.source, destination=self.dest, asset=Asset.native(), amount=self.amount, )))
def send_lumens(self, address, amount, memo_text=None): """Send lumens to the account identified by the provided address. :param str address: the account to send lumens to. :param number amount: the number of lumens to send. :param str memo_text: a text to put into transaction memo. :return: transaction hash :rtype: str :raises: :class:`~kin.SdkConfigurationError` if the SDK wallet is not configured. :raises: ValueError: if the provided address has a wrong format. :raises: ValueError: if the amount is not positive. """ return self.send_asset(address, Asset.native(), amount, memo_text)
def transfer_receive(tmp_address, receiver_kp, asset): """ Receive a transfer. This is used by a wallet on behalf of the receiving user to pull the new asset in. When it's done the receiving account has all of the asset from tmp_address, and all of the XLM reserve required to perform the transfer. Args: tmp_address (string): address of temporary account containing the transfer asset receiver_kp (Keypair): Keypair for the (optionally created) receiving account asset (Asset): asset to receive Returns: response: the Horizon response """ account_exists = False receiver_address = receiver_kp.address() receiver_acct = Address(receiver_address) try: receiver_acct.get() account_exists = True except stellar_base.exceptions.HorizonError: pass needs_trustline = True if account_exists: for b in receiver_acct.balances: if balance_to_asset(b) == asset: needs_trustline = False break tmp_acct = Address(tmp_address) tmp_acct.get() # assumes that the temp account cointains the specified asset amount = [ b['balance'] for b in tmp_acct.balances if balance_to_asset(b) == asset ][0] operations = [] if not account_exists: operations.append(CreateAccount(receiver_address, "1")) if needs_trustline: operations.extend([ # enough for trustline and one offer Payment(receiver_address, Asset.native(), "1"), ChangeTrust(asset, source=receiver_kp.address()) ]) else: operations.append( # enough for one offer Payment(receiver_address, Asset.native(), "0.5"), ) operations.extend([ # Send Asset Payment(receiver_address, asset, amount), # Clear signers SetOptions(signer_weight=0, signer_address=receiver_address), # Clear trustlines ChangeTrust(asset, "0"), # Merge Account AccountMerge(receiver_address) ]) txn = Transaction(source=tmp_acct.address, sequence=tmp_acct.sequence, fee=100 * len(operations), operations=operations) txe = Te(tx=txn, network_id="TESTNET") txe.sign(receiver_kp) # Potentially the issuer needs to sign this too with an allow trust -- # depends on the asset in question! response = horizon.submit(txe.xdr()) return response
def balance_to_asset(b): if b['asset_type'] == 'native': return Asset.native() return Asset(b['asset_code'], b['asset_issuer'])
def test_native(self): assert 'XLM' == Asset.native().code assert None == Asset.native().issuer
def _load_operations(): amount = "1" return [("create_account_min", CreateAccount(source=SOURCE, destination=DEST, starting_balance=amount)), ("payment_min", Payment( source=SOURCE, destination=DEST, asset=Asset.native(), amount=amount, )), ("payment_short_asset", Payment( source=SOURCE, destination=DEST, asset=Asset('USD4', SOURCE), amount=amount, )), ("payment_long_asset", Payment( source=SOURCE, destination=DEST, asset=Asset('SNACKS789ABC', SOURCE), amount=amount, )), ("path_payment_min", PathPayment( source=SOURCE, destination=DEST, send_asset=Asset.native(), dest_asset=Asset.native(), send_max=amount, dest_amount=amount, path=[], )), ("allow_trust_short_asset", AllowTrust( source=SOURCE, trustor=DEST, asset_code='beer', authorize=True, )), ("allow_trust_long_asset", AllowTrust( source=SOURCE, trustor=DEST, asset_code='pocketknives', authorize=True, )), ("manage_offer_min", ManageOffer( selling=Asset('beer', SOURCE), buying=Asset('beer', DEST), amount="100", price=3.14159, offer_id=1, )), ("manage_offer_dict_price", ManageOffer( selling=Asset('beer', SOURCE), buying=Asset('beer', DEST), amount="100", price={ 'n': 314159, 'd': 100000 }, offer_id=1, )), ("create_passive_offer_min", CreatePassiveOffer( selling=Asset('beer', SOURCE), buying=Asset('beer', DEST), amount="100", price=3.14159, )), ("set_options_empty", SetOptions()), ("change_trust_min", ChangeTrust(source=SOURCE, asset=Asset('beer', DEST), limit='100')), ("change_trust_default_limit", ChangeTrust(source=SOURCE, asset=Asset('beer', DEST))), ("account_merge_min", AccountMerge( source=SOURCE, destination=DEST, )), ("inflation", Inflation(source=SOURCE)), ("manage_data", ManageData( source=SOURCE, data_name='1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY', data_value=SOURCE, )), ("bump_sequence", BumpSequence(bump_to=23333114514))]
def _load_operations(): amount = "1" return [ ("create_account_min", CreateAccount( source=SOURCE, destination=DEST, starting_balance=amount)), ("payment_min", Payment( source=SOURCE, destination=DEST, asset=Asset.native(), amount=amount, )), ("payment_short_asset", Payment( source=SOURCE, destination=DEST, asset=Asset('USD4', SOURCE), amount=amount, )), ("payment_long_asset", Payment( source=SOURCE, destination=DEST, asset=Asset('SNACKS789ABC', SOURCE), amount=amount, )), ("path_payment_min", PathPayment( source=SOURCE, destination=DEST, send_asset=Asset.native(), dest_asset=Asset.native(), send_max=amount, dest_amount=amount, path=[], )), ("path_payment", PathPayment( destination=DEST, send_asset=Asset.native(), dest_asset=Asset.native(), send_max=amount, dest_amount=amount, path=[Asset('MOE', DEST)], )), ("allow_trust_short_asset", AllowTrust( source=SOURCE, trustor=DEST, asset_code='beer', authorize=True, )), ("allow_trust_long_asset", AllowTrust( source=SOURCE, trustor=DEST, asset_code='pocketknives', authorize=True, )), ("manage_offer_min", ManageOffer( selling=Asset('beer', SOURCE), buying=Asset('beer', DEST), amount="100", price=3.14159, offer_id=1, source=SOURCE )), ("manage_offer_dict_price", ManageOffer( selling=Asset('beer', SOURCE), buying=Asset('beer', DEST), amount="100", price={ 'n': 314159, 'd': 100000 }, offer_id=1, )), ("create_passive_offer_min", CreatePassiveOffer( selling=Asset('beer', SOURCE), buying=Asset('beer', DEST), amount="100", price=3.14159, source=SOURCE )), ("create_passive_dict_offer", CreatePassiveOffer( selling=Asset('beer', SOURCE), buying=Asset('beer', DEST), amount="100", price={ 'n': 314159, 'd': 100000 } )), ("set_options_empty", SetOptions()), ("set_options_ed25519PublicKey", SetOptions(signer_type='ed25519PublicKey', signer_address=DEST, signer_weight=1)), ("set_options_hashX", SetOptions(signer_type='hashX', signer_address=os.urandom(32), signer_weight=2)), ("set_options_preAuthTx", SetOptions(signer_type='preAuthTx', signer_address=os.urandom(32), signer_weight=3)), ("set_options_inflation_dest", SetOptions(inflation_dest=DEST, source=SOURCE)), ("change_trust_min", ChangeTrust(source=SOURCE, asset=Asset('beer', DEST), limit='100')), ("change_trust_default_limit", ChangeTrust(source=SOURCE, asset=Asset('beer', DEST))), ("account_merge_min", AccountMerge( source=SOURCE, destination=DEST, )), ("inflation", Inflation(source=SOURCE)), ("manage_data", ManageData( source=SOURCE, data_name='1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY', data_value=SOURCE, )), ("manage_data_none", ManageData( data_name='1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY', data_value=None, )), ("bump_sequence", BumpSequence( source=SOURCE, bump_to=23333114514 )), ("bump_sequence_no_source", BumpSequence( bump_to=23333114514 )) ]
def pay_for_exchange(amount, coin_name, flow_status_id, exchange_account_seed, sequence, fee, memo_oreder_id): exchange_amount = amount.split("/")[0] get_amount = amount.split("/")[1] exchange_coin_name = coin_name.split("/")[0] get_coin_name = coin_name.split("/")[1] user = Keypair.from_seed(exchange_account_seed) finania_kp = Keypair.from_seed(COIN_SEED) user_keypair = [user, finania_kp] memo = u'{}转账'.format(coin_name) opts = list() if fee != "0": op = Payment({ 'destination': COIN_ISSUER, 'asset': Asset.native() if exchange_coin_name == PAYDEX_CODE else Asset( exchange_coin_name, COINS_ISSUER), 'amount': str(exchange_amount), 'source': user.address() }) op1 = Payment({ 'destination': COIN_ISSUER, 'asset': Asset.native(), 'amount': str(fee), 'source': user.address() }) op2 = Payment({ 'destination': user.address(), 'asset': Asset.native() if get_coin_name == PAYDEX_CODE else Asset( get_coin_name, COINS_ISSUER), 'amount': str(get_amount), 'source': COIN_ISSUER }) opts.append(op) opts.append(op1) opts.append(op2) else: op = Payment({ 'destination': COIN_ISSUER, 'asset': Asset.native() if exchange_coin_name == PAYDEX_CODE else Asset( exchange_coin_name, COINS_ISSUER), 'amount': str(exchange_amount), 'source': user.address() }) op2 = Payment({ 'destination': user.address(), 'asset': Asset.native() if get_coin_name == PAYDEX_CODE else Asset( get_coin_name, COINS_ISSUER), 'amount': str(get_amount), 'source': COIN_ISSUER }) opts.append(op) opts.append(op2) is_success, stellar_hash = create_envelope_submits(user_keypair, sequence, memo, opts) if not is_success: try: exchange = ExchangeDetail() exchange.query.filter_by(orders=flow_status_id).update({ 'pay_status': 2, 'stellar_hash': stellar_hash }) db.session.commit() except Exception as e: logging.error( str(e) + u'user:%s, coin_name:%s, amount:%s转账成功存入数据哭失败' % (user_keypair, coin_name, amount)) return False, u'paydex 修改状态失败转账失败' # 异步 请求恒星底层 # stellar.pay_stellar(memo_oreder_id, amount, coin_name, flow_status_id, exchange_account_seed, # flow_status_id) stellar.pay_stellar.delay(memo_oreder_id, amount, coin_name, flow_status_id, exchange_account_seed, flow_status_id) # 生产随机字符串 rand_string = random_str() if rand_string is None: return False, u'随机字符串生成失败' # 验证签名 sign_name = fun_var_kargs(flow_status_id=flow_status_id, status='2', rand_string=rand_string) url = PHP_URL params = dict(flow_status_id=flow_status_id, status='2', sign=sign_name, rand_string=rand_string) print '111', params response = requests.post(url, data=params).json() print '2222', response if response.get('code') == 200: print "通知PHP成功****************************************" else: return times.time_task.delay(params, stellar_hash, is_success, user, coin_name, amount, response, flow_status_id) else: # 生产随机字符串 rand_string = random_str() if rand_string is None: return False, u'随机字符串生成失败' # 验证签名 sign_name = fun_var_kargs(flow_status_id=flow_status_id, success_no=stellar_hash, status='1', rand_string=rand_string) url = PHP_URL params = dict(flow_status_id=flow_status_id, success_no=stellar_hash, status='1', sign=sign_name, rand_string=rand_string) print '111', params response = requests.post(url, data=params).json() print '2222', response if response.get('code') == 200: print "请求PHP成功******************************************" if is_success: # insert_tasks(stellar_hash, flow_status_id, user, coin_name, amount) insert_tasks.delay(stellar_hash, flow_status_id, user, coin_name, amount) return "插入数据库成功**************************************" if response.get('code') != 200: return times.time_task.delay(params, stellar_hash, is_success, user, coin_name, amount, response, flow_status_id)
def packer(envelope=False): import base64 from stellar_base.stellarxdr import StellarXDR_pack as Xdr x = Xdr.STELLARXDRPacker() x.pack_TransactionEnvelope(envelope.to_xdr_object()) return base64.b64encode(x.get_buffer()) anna = newAccount() bob = newAccount() print('Anna: ', json.dumps(anna, sort_keys=True, indent=4 * ' ')) print('Bob: ', json.dumps(bob, sort_keys=True, indent=4 * ' ')) operation = Payment({ 'source': anna['address'], 'destination': bob['address'], 'asset': Asset.native(), 'amount': '1000', # needs to be a string? }) tx = Transaction( source=anna['address'], opts={ 'sequence': json.loads(requests.get(url+'/accounts/'+anna['address']).text)['sequence'], 'timeBounds': [], 'memo': NoneMemo(), 'fee': 100, 'operations': [ operation, ], }, ) envelope = Te(tx=tx, opts={"network_id": "TESTNET"})
def test_mix_1(self, setup): if setup.type == 'testnet': result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAADhAAAAAAAAAACAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAC+vCAAAAAAAAAAABAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAAAAAAAAL68IAAAAAAAAAAAIAAAAAAAAAAAvrwgAAAAAAoEATyhnfBjtgSGL5Fr4oHlw/X4bIYnH44zIpor2MQbUAAAAAAAAAAAvrwgAAAAAAAAAAAAAAAAMAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFiZWVyAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAADuaygAABMsvAAGGoAAAAAAAAAABAAAAAAAAAAQAAAABYmVlcgAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAFiZWVyAAAAAKBAE8oZ3wY7YEhi+Ra+KB5cP1+GyGJx+OMyKaK9jEG1AAAAADuaygAABMsvAAGGoAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+H//////////AAAAAAAAAAcAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAABYmVlcgAAAAEAAAAAAAAACAAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAAAAAABzT4TYwAAAECnD5OPLjCC3vjtrsffS0fekR0rEgJZoDvJrOdp2G4LBKWLPsH4ZKVVGiOxPq2akIowWckiYXwZG45/mSLSbloN' else: result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAADhAAAAAAAAAACAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAAAC+vCAAAAAAAAAAABAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAAAAAAAAL68IAAAAAAAAAAAIAAAAAAAAAAAvrwgAAAAAAoEATyhnfBjtgSGL5Fr4oHlw/X4bIYnH44zIpor2MQbUAAAAAAAAAAAvrwgAAAAAAAAAAAAAAAAMAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFiZWVyAAAAAE2ps88xwWiGst/YEzhQ+f8IH+3WNWrTH0MERPmSL9doAAAAADuaygAABMsvAAGGoAAAAAAAAAABAAAAAAAAAAQAAAABYmVlcgAAAABNqbPPMcFohrLf2BM4UPn/CB/t1jVq0x9DBET5ki/XaAAAAAFiZWVyAAAAAKBAE8oZ3wY7YEhi+Ra+KB5cP1+GyGJx+OMyKaK9jEG1AAAAADuaygAABMsvAAGGoAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABYmVlcgAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+H//////////AAAAAAAAAAcAAAAAlMoegcSS0iHsTrJ5XNJH1ri4rO05uVmRHX6dbOj22fgAAAABYmVlcgAAAAEAAAAAAAAACAAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAAAAAABzT4TYwAAAEAY0YGZzC1qiKatKCWaCttK1fEs3P4DpVWw2AQCdvVBS4dkCyfxu7N7tpQPEZ4WqXzAiR0D7r5L6f848pmNsgIL' assert (result == self.make_envelope( setup.network, CreateAccount( destination=self.accounts[0]['address'], starting_balance=self.amount, ), Payment( destination=self.accounts[1]['address'], asset=Asset.native(), amount=self.amount, ), PathPayment( destination=self.accounts[2]['address'], send_asset=Asset.native(), dest_asset=Asset.native(), send_max=self.amount, dest_amount=self.amount, path=[], ), ManageOffer( selling=Asset('beer', self.accounts[0]['address']), buying=Asset('beer', self.accounts[1]['address']), amount="100", price=3.14159, offer_id=1, ), CreatePassiveOffer( selling=Asset('beer', self.accounts[1]['address']), buying=Asset('beer', self.accounts[2]['address']), amount="100", price=3.14159, ), SetOptions(), ChangeTrust( asset=Asset('beer', self.accounts[0]['address']), ), AllowTrust( trustor=self.accounts[0]['address'], asset_code='beer', authorize=True, ), AccountMerge(destination=self.accounts[0]['address'], ))) def test_mix_2(self, setup): if setup.type == 'testnet': result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAABkAAAAAAAAAACAAAAAAAAAAAAAAAEAAAAAAAAAAUAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABRVVSAAAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAjhvJvwQAAAAAAAAAAAAcAAAAA01KM3XCt1+LHD7jDTOYpe/HGKSDoQoyL1JbUOc0+E2MAAAABRVVSAAAAAAEAAAAAAAAAAQAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFFVVIAAAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjACOG8m/BAAAAAAAAAAAAAc0+E2MAAABAUDuJuoUdHYxE/AmYKN4x+EvI3NpLtAgs9xYq4AJMFVmC2zDIn1J2+o5uIyqYxQW84SW31laWcrY8YkGWPqkeBA==' else: result = b'AAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjAAABkAAAAAAAAAACAAAAAAAAAAAAAAAEAAAAAAAAAAUAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABRVVSAAAAAADTUozdcK3X4scPuMNM5il78cYpIOhCjIvUltQ5zT4TYwAjhvJvwQAAAAAAAAAAAAcAAAAA01KM3XCt1+LHD7jDTOYpe/HGKSDoQoyL1JbUOc0+E2MAAAABRVVSAAAAAAEAAAAAAAAAAQAAAACUyh6BxJLSIexOsnlc0kfWuLis7Tm5WZEdfp1s6PbZ+AAAAAFFVVIAAAAAANNSjN1wrdfixw+4w0zmKXvxxikg6EKMi9SW1DnNPhNjACOG8m/BAAAAAAAAAAAAAc0+E2MAAABAKHsltQKqjdueu13k7PI7cLg4Tya2aOFH+1Sc9qeK4z0AXxropuRVHhyuriPu/ZXHIRVDvD5xQ0SmMFPVFtU0BA==' assert (result == self.make_envelope( setup.network, SetOptions(set_flags=1), ChangeTrust( asset=Asset('EUR', self.address), limit="1000000000"), AllowTrust( authorize=True, asset_code='EUR', trustor=self.address), Payment( destination=self.accounts[0]['address'], asset=Asset('EUR', self.address), amount="1000000000")))
def test_native(self): assert 'XLM' == Asset.native().code assert Asset.native().issuer is None assert 'native' == Asset.native().type
def pay_have_fee( collect_account_public, amount, coin_name, flow_status_id, pay_account_seed, sequence, memo_oreder_id, merchant_private, fee, ): fee = str(fee) amount = str(amount) opts = list() opt_frist = Payment( dict(destination=collect_account_public, asset=Asset.native(), amount=str(fee))) opt_sceond = Payment( dict(destination=collect_account_public, asset=Asset.native() if coin_name == PAYDEX_CODE else Asset( coin_name, COINS_ISSUER), amount=str(amount))) opts.append(opt_frist) opts.append(opt_sceond) user = Keypair.from_seed(merchant_private) users = user.address() is_success, stellar_hash = create_envelope_submit(user, sequence, memo_oreder_id, opts) if not is_success: try: order = OrderDetail() order.query.filter_by(orders=flow_status_id).update( {'pay_status': 2}) db.session.commit() except Exception as e: logging.error( str(e) + u'user:%s, coin_name:%s, amount:%s转账成功存入数据哭失败' % (users, coin_name, amount)) return False, u'paydex 修改状态失败转账失败' # 异步 请求恒星底层 # stellar.pay_stellar(collect_account_public, amount, coin_name, flow_status_id, pay_account_seed,memo_oreder_id) stellar.pay_stellar.delay(collect_account_public, amount, coin_name, flow_status_id, pay_account_seed, memo_oreder_id) # 生产随机字符串 rand_string = random_str() if rand_string is None: return False, u'随机字符串生成失败' # 验证签名 sign_name = fun_var_kargs(flow_status_id=flow_status_id, status='2', rand_string=rand_string) url = PHP_URL params = dict(flow_status_id=flow_status_id, status='2', sign=sign_name, rand_string=rand_string) print '111', params response = requests.post(url, data=params).json() if response.get('code') == 200: print "通知php成功" if response.get('code') != 200: return times.time_task.delay(params, stellar_hash, users, coin_name, amount, response, flow_status_id) else: # 生产随机字符串 rand_string = random_str() if rand_string is None: return False, u'随机字符串生成失败' # 验证签名 sign_name = fun_var_kargs(flow_status_id=flow_status_id, success_no=stellar_hash, status='1', rand_string=rand_string) url = PHP_URL params = dict(flow_status_id=flow_status_id, success_no=stellar_hash, status='1', sign=sign_name, rand_string=rand_string) print '111', params response = requests.post(url, data=params).json() print '2222', response if response.get('code') == 200: print "通知php成功***************************************************" if is_success: insert_tasks.delay(stellar_hash, flow_status_id, users, coin_name, amount) # insert_tasks(stellar_hash, flow_status_id, users, coin_name, amount) print "转账插入数据库成功!**********************************************" return True if response.get('code') != 200: return times.time_task.delay(params, stellar_hash, users, coin_name, amount, response, flow_status_id)