Example #1
0
def test_trx_memo():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAACXRlc3QtbWVtbwAAAAAAAAEAAAABAAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAAQAAAADzyO+MbVE1tzxVVBIBqabpnJc5W6/81p0FkfKRfQeTYQAAAAAAAAAAGQixAAAAAAAAAAABk+vOIwAAAEAWa7LRE8NlmG8p90o0ZUFX3aLoNjh2x5lF048/LyzXLqgabtOO4aRYdlMCgjt/gWrQcBTvvXX13/Q+4hB8ITUI'
    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN',
                    memo='test-memo',
                    time_bounds=[0, 0]) as t:
                t.pay(
                    'GDZ4R34MNVITLNZ4KVKBEANJU3UZZFZZLOX7ZVU5AWI7FEL5A6JWDM24',
                    '42')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})

    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADFDsUlMLJEiMWE3Ak0NDxqnWEeEnoVK651cx1FKP1nTIAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAEAAAAA88jvjG1RNbc8VVQSAamm6ZyXOVuv/NadBZHykX0Hk2EAAAAAAAAAABkIsQAAAAAAAAAAAZPrziMAAABA+fR/qdkZjNtIj021Lru4It5dLT3rgRPqOoycbrTEHArfw12UpFAzQ4pNj+b04C0Z2sh4bFfQHOYDKGzsGahsDA=='
    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN',
                    memo=
                ('hash',
                 '143b1494c2c9122316137024d0d0f1aa75847849e854aeb9d5cc7514a3f59d32'
                 ),
                    time_bounds=[0, 0]) as t:
                t.pay(
                    'GDZ4R34MNVITLNZ4KVKBEANJU3UZZFZZLOX7ZVU5AWI7FEL5A6JWDM24',
                    '42')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
Example #2
0
def test_fed_pay():
    trx_env_native = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAEAAAAA88jvjG1RNbc8VVQSAamm6ZyXOVuv/NadBZHykX0Hk2EAAAAAAAAAADuaygAAAAAAAAAAAZPrziMAAABAEyOA0c4Ia9CtyBY7+sjaoR0VUKdZxXRv1p/uRsGx+lR0iXOjYW/qQuUCI7tOdfh8btSRpJ/njwAlzOZ1Jn4DAw=='

    trx_env_non_native = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAEAAAAA88jvjG1RNbc8VVQSAamm6ZyXOVuv/NadBZHykX0Hk2EAAAABQ09EUgAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAAAA7msoAAAAAAAAAAAGT684jAAAAQCiC1F24byWXlgxj4I/uw8faz0IbWe6nVZvk1zIQdliUMSApDi/47tExLIP36K/Kyj4hL+ilRjkAUBttVwkYZAk='

    account = 'GDZ4R34MNVITLNZ4KVKBEANJU3UZZFZZLOX7ZVU5AWI7FEL5A6JWDM24'

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with patch.object(stellar.utils.FED,
                              'resolve_to_account',
                              return_value=account) as fed_mock:
                with stellar.new_transaction(
                        'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
                ) as t:
                    t.pay('hardcodr*stellar.org', '100')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/',
        {'tx': trx_env_native})
    acc_mock.assert_called_once()
    fed_mock.assert_called_once_with('hardcodr*stellar.org')
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock_1:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock_1:
            with patch.object(stellar.utils.FED,
                              'resolve_to_account',
                              return_value=account) as fed_mock_1:
                with stellar.new_transaction(
                        'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
                ) as t:
                    t.pay(
                        'hardcodr*stellar.org',
                        '100',
                        asset=
                        ('CODR',
                         'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                         ))

    get_mock_1.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/',
        {'tx': trx_env_non_native})
    acc_mock_1.assert_called_once()
    fed_mock_1.assert_called_once_with('hardcodr*stellar.org')
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #3
0
def test_path_payment():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAIAAAACU1JDQVNTRVQAAAAAAAAAAOljdFn2Ets58A72NyrVtJp0gs+zqNAQNZs/CKfeaYuCAAAAADuaygAAAAAA88jvjG1RNbc8VVQSAamm6ZyXOVuv/NadBZHykX0Hk2EAAAACREVTVEFTU0VUAAAAAAAAAOljdFn2Ets58A72NyrVtJp0gs+zqNAQNZs/CKfeaYuCAAAAADuaygAAAAABAAAAAklOVEFTU0VUAAAAAAAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAAAAAAAABk+vOIwAAAECSgtpCVj4SqV2J29PLLuMxvUm2icED1fX85P0W5A2mr9K2NYS6iCCjM2xAeCtM44UDEKgriObHu399lPTmt6oK'

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.pathpay(
                    'GDZ4R34MNVITLNZ4KVKBEANJU3UZZFZZLOX7ZVU5AWI7FEL5A6JWDM24',
                    '100',
                    ('DESTASSET',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    '100',
                    ('SRCASSET',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    path=
                    [('INTASSET',
                      'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                      )])

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #4
0
def test_update_offer():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAMAAAABU0VMQQAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAAAFCVVlBAAAAAOljdFn2Ets58A72NyrVtJp0gs+zqNAQNZs/CKfeaYuCAAAAABAX34AAAAABAAAACwAAAAAAADAhAAAAAAAAAAGT684jAAAAQAG4SANUDdBC2PfDDvKVdrjphJN7trYxUobk2JVM3+8IEFBOx5EL5mA4oXlUXyEi4IzjyIJF9YoO50f56Gg6FgY='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.update_offer(
                    12321,
                    '27',
                    ('SELA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    ('BUYA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    price=(1, 11))

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #5
0
def test_add_passive_offer():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAQAAAABU0VMQQAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAAAFCVVlBAAAAAOljdFn2Ets58A72NyrVtJp0gs+zqNAQNZs/CKfeaYuCAAAAABAX34AAAAANAAAAAQAAAAAAAAABk+vOIwAAAEAylp9GTW4OXmYyjEf0ss/kOw6LNTtBE3u/0Gozavb/6m1fvRbK5ZGEzXXazt5jpdMngjpkf1FYkGZM7+9N1U0A'

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.add_passive_offer(
                    '27',
                    ('SELA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    ('BUYA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    price=(13, 1))

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #6
0
def test_add_offer():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAMAAAABU0VMQQAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAAAFCVVlBAAAAAOljdFn2Ets58A72NyrVtJp0gs+zqNAQNZs/CKfeaYuCAAAAABAX34AAAAALAAAAAQAAAAAAAAAAAAAAAAAAAAGT684jAAAAQA/v8HOdZJ1sUxJCChS9ou7OthwuWssY3OaGlGc6QRFqpEy5Wi8JR8gBZaWbQOWISiMJ9FOB0ouOVkyvC+zsYQc='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.add_offer(
                    '27',
                    ('SELA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    ('BUYA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    price=(11, 1))

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #7
0
def sell_asset_against_native(asset, amount, price, offer_id=0):
    r = _get_trusted_asset(asset)
    if not r[0]:
        return False
    trusted_asset = r[1]

    try:
        amount = float(amount)
        price = float(price)
    except:
        print 'Incorrect amount or price. Must be decimal values'
        return False

    res = Fraction(price).limit_denominator()

    print 'Selling %s %s at price (%s XLM/ %s %s)' % (amount, asset, res.numerator, res.denominator, asset)
    user = get_user_secret()

    with stellar.new_transaction(user, memo='Sell %s' % asset) as t:
        if offer_id == 0:
            t.add_offer(sell_amount=str(amount), sell_asset=trusted_asset,\
                    buy_asset='native', price=(res.numerator, res.denominator))
        else:
            t.update_offer(offer_id=int(offer_id), sell_amount=str(amount),\
                    sell_asset=trusted_asset, buy_asset='native',\
                    price=(res.numerator, res.denominator))

    if t.is_success():
        print 'Offer added successfully'
        print t.result()
        return True
    else:
        print t.errors()
        return False
Example #8
0
def remove_trust(asset, asset_issuer):
    print 'Removing trust for asset %s on stellar' % asset
    user = get_user_secret()
    with stellar.new_transaction(user, memo='Remove Trust %s' % asset) as t:
        t.remove_trust(asset=(asset, asset_issuer))

    if t.is_success():
        os.remove('%s/%s.asset' % (BASEPATH, asset))
        print 'Trust successfully removed'
        print t.result()
    else:
        print t.errors()
Example #9
0
def test_trx_seq():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAeAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAEAAAAA88jvjG1RNbc8VVQSAamm6ZyXOVuv/NadBZHykX0Hk2EAAAAAAAAAABkIsQAAAAAAAAAAAZPrziMAAABASJ+nOxOuYE5gva1OsTtT+sTPQ5mWAAnmRn4kcM7DyCZRwsFR+8Guc41Pxq8zkSdqSrsU/ql0YeGrTq7QWdQ+Cg=='
    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN',
                    seq=28515645087809566) as t:
                t.pay(
                    'GDZ4R34MNVITLNZ4KVKBEANJU3UZZFZZLOX7ZVU5AWI7FEL5A6JWDM24',
                    '42')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
Example #10
0
def test_put_or_update_data():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAoAAAAES0VZMQAAAAEAAAAGVkFMVUUxAAAAAAAAAAAAAZPrziMAAABAp3H8706dk0DRoRwWLwEM8B1/kXCB9L8pDnddpFJGdshp62wXU28duUAl0QfikrWd14G56G8RpSWX39wx2E7lAg=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.put_or_update_data('KEY1', 'VALUE1')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #11
0
def test_set_home_domain():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABN3d3cuaG9tZS1kb21haW4uY29tAAAAAAAAAAAAAAAAAZPrziMAAABA1Lyg54Rdb5MY1Ur6v0hDVzScn8mZuBRugJwAV9JhcWbp9gxksEHFf1FeMmfZZCNkNaoWPE0Sct9hGpzy2sV3Aw=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.set_home_domain('www.home-domain.com')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #12
0
def test_remove_data():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAoAAAAES0VZMQAAAAAAAAAAAAAAAZPrziMAAABAnUclm1IWlWWoUkS//5kc3zlaJIkUzybse+rPD/OwSm+PWTXxU0xsP7fRoLE+IgEDeWTvfeP0N8QVHiqT2bLcAQ=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.remove_data('KEY1')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #13
0
def test_set_flags():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAUAAAAAAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGT684jAAAAQDSviVGWheyuIeB7BMRJGONYx3LbAG974rfDIGPnt81uO/gPN3fM/HrE2XtdGQRW1nVWdycyfP03fgj1X3lAfQE='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.set_flags(True, True, True)

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #14
0
def test_run_inflation():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAkAAAAAAAAAAZPrziMAAABAe6CjWatnewWcnYqJoh0gYHI2PDSHL5wJ9YE99+glXLxkkwWO+KRqvRoRQJbKvr0ljwAl49wKuZmyCdyyiL8kBg=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.run_inflation()

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #15
0
def test_clear_flags():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAUAAAAAAAAAAQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGT684jAAAAQIr3NOb3reClqtoQg6ELYnkPXhJaKtqh14jTQFNr1RoL/nT+OWRF0QoHfcF8CRK6LjqqGY3kiGbPuwQ32ZXicQc='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.clear_flags(True, True, True)

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #16
0
def test_set_master_weight():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAUAAAAAAAAAAAAAAAAAAAABAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGT684jAAAAQP0XzKC5xnLUdLWCYs1epUQAsXiCdKDBittXPF7GxeyrKNWy1vMBt3aXY2n7UkFGtmbrYRo30wom0N8mU5MQTAE='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.set_master_weight(42)

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #17
0
def test_set_thresholds():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACkAAAABAAAAKgAAAAEAAAArAAAAAAAAAAAAAAAAAAAAAZPrziMAAABAKTWKJIY4ssAPCg+HrgKnN9t9Qjhkh1qGR7lXkNvKeD5bMNHI3aDhXKE+ue6Q2xZK2AfDH54WyWgTsPBuMZXuDg=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.set_thresholds(43, 42, 41)

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #18
0
def test_set_inflation():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAUAAAABAAAAAOljdFn2Ets58A72NyrVtJp0gs+zqNAQNZs/CKfeaYuCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZPrziMAAABA/1oRN7C7T/B4/d0vsRO3ZbFrNwdbPT5Qfy9hIGcbAgAhKXq/U/wB8cMHBi27rMlGOeTgfBO/IlemOmgnsuskBA=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.set_inflation_destination(
                    'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #19
0
def test_account_merge():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAgAAAAA6WN0WfYS2znwDvY3KtW0mnSCz7Oo0BA1mz8Ip95pi4IAAAAAAAAAAZPrziMAAABAZ7IsT17C1Lm1Jfy3zHAG7Adxw+7IfICtxkMgqybiQhUt19GpkiUy/osFyuK6207U8UsdH1+09tkiUvigLQfKAg=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.merge_this_account_with(
                    'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #20
0
def test_create_account():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAAAAAAA88jvjG1RNbc8VVQSAamm6ZyXOVuv/NadBZHykX0Hk2EAAAAAO5rKAAAAAAAAAAABk+vOIwAAAEAXazw4qM/rzuDpw4+cLbuHrPhM6Ugq5FSEfRVTwHQ20baNlf2PEW+5acvXn2ntI5U2KXbUxgvUgGGs3U5rgpIO'

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.create_account(
                    'GDZ4R34MNVITLNZ4KVKBEANJU3UZZFZZLOX7ZVU5AWI7FEL5A6JWDM24',
                    '100')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #21
0
def test_deauthorize_trust():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAcAAAAA6WN0WfYS2znwDvY3KtW0mnSCz7Oo0BA1mz8Ip95pi4IAAAABQ09EUgAAAAAAAAAAAAAAAZPrziMAAABAY4XKfczup7NrjvhH/sX7IpUVXm+OcXmlRux5gEI8rwTxmLOhjxnHuPQeOvis6bfv3+Qe/lNJlUPYtZffANKxBg=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.deauthorize_trust(
                    'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ',
                    'CODR')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #22
0
def test_authorize_trust():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAcAAAAA6WN0WfYS2znwDvY3KtW0mnSCz7Oo0BA1mz8Ip95pi4IAAAABQ09EUgAAAAEAAAAAAAAAAZPrziMAAABAl4QaeVgE2pVft3A6MAUtTdBTACiz247BSY4wFU8orFURt7X40j8TZIiXN+IH4zFtWceCgze655uE51uHcuGrCQ=='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.authorize_trust(
                    'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ',
                    'CODR')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #23
0
def test_create_or_update_trust():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAYAAAABQ09EUgAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAABeDeRuAAAAAAAAAAAGT684jAAAAQHLVF151ZhD/dA4IDyQOD2IEAhYQXY9CUEPL+aMTxMZoTX71pbesCPnu+5esgPPgvAcaXLXI6AVtc8Q3EX3gdAk='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.create_or_update_trust(
                    ('CODR',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ), '10099')

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #24
0
def test_set_signer():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA6WN0WfYS2znwDvY3KtW0mnSCz7Oo0BA1mz8Ip95pi4IAAAAqAAAAAAAAAAGT684jAAAAQFTxotmdA5jzK21LYDYVJNNtYgZ0croGBknBcEiATCCURwzeFMCZXIWBq6bXG9maWDSSNxxiMjylZZWDvCqveAY='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.set_signer(
                    'ed25519PublicKey',
                    'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ',
                    42)

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #25
0
def test_remove_trust():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAYAAAABQ09EUgAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAAAAAAAAAAAAAAAAAAAGT684jAAAAQCXmuNo3BYyBT++wHlSikoJp5eha6m0vJC7hq2BDOJqGbNk6Y0oxRbbv3b1jvSLwqIIDm7DVvSP/AS8YUoeDBgY='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.remove_trust(
                    ('CODR',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ))

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #26
0
def add_trust(asset, asset_issuer, skipAdd=False):
    is_added = True
    if not skipAdd:
        print 'Adding trust for asset %s on stellar' % asset
        user = get_user_secret()
        with stellar.new_transaction(user, memo='Add Trust %s' % asset) as t:
            t.create_or_update_trust(asset=(asset, asset_issuer), limit=MAX_LIMIT)

        if t.is_success():
            print 'Trust successfully added'
            print t.result()
        else:
            is_added = False
            print t.errors()

    if is_added:
        with open('%s/%s.asset' % (BASEPATH, asset), 'w') as f:
            f.write(asset_issuer)
        return True
    else:
        return False
Example #27
0
def remove_offer(offer_id):
    r = _get_user_id()
    if not r[0]:
        return False
    user = r[1]

    try:
        stellar.account(user).fetch()
    except:
        print 'Account doesn\'t exist'
        return False

    offers = stellar.account(user).offers().fetch()
    offer_to_cancel = None
    for offer in offers.entries():
        if str(offer.offerid) == str(offer_id):
            offer_to_cancel = offer
    
    if not offer_to_cancel:
        print 'Offer %s not found' % offer_id
        return False

    selling = 'native' if offer_to_cancel.selling.asset_code == 'XLM'\
            else (offer_to_cancel.selling.asset_code, offer_to_cancel.selling.asset_issuer)
    buying =  'native' if offer_to_cancel.buying.asset_code == 'XLM'\
            else (offer_to_cancel.buying.asset_code, offer_to_cancel.buying.asset_issuer)

    print 'Removing offer %s for selling %s buying %s' % (offer_id, selling, buying)
    user = get_user_secret()

    with stellar.new_transaction(user, memo='Cancel offer') as t:
        t.remove_offer(offer_id=int(offer_id), sell_asset=selling, buy_asset=buying)

    if t.is_success():
        print 'Offer removed successfully'
        print t.result()
        return True
    else:
        print t.errors()
        return False
Example #28
0
def test_remove_offer():
    trx_env = 'AAAAAGxfNmJ5gxclDy95e+IrnQwRrW6LyjVwpoQ2iKOT684jAAAAZABlTtQAAAAZAAAAAAAAAAAAAAABAAAAAQAAAABsXzZieYMXJQ8veXviK50MEa1ui8o1cKaENoijk+vOIwAAAAMAAAABU0VMQQAAAADpY3RZ9hLbOfAO9jcq1bSadILPs6jQEDWbPwin3mmLggAAAAFCVVlBAAAAAOljdFn2Ets58A72NyrVtJp0gs+zqNAQNZs/CKfeaYuCAAAAAAAAAAAAAAABAAAAAQAAAAAAADAhAAAAAAAAAAGT684jAAAAQIMGTo357twG/BdhJZpUFwtfji6vK+4exwUZOdu+zfS4zZfU/U1DyxwUesAx3A53yY6qbLuQ2j5dhWr7PIZHrgo='

    with patch.object(stellar.utils.HTTP, 'post',
                      return_value=result) as get_mock:
        with patch.object(stellar.utils.HTTP, 'get',
                          return_value=acc) as acc_mock:
            with stellar.new_transaction(
                    'SALCB22A3PL2JFI3GE62BM4S2TE64NJZP4GF2DBGPBC6QIUQ7GI7BRBN'
            ) as t:
                t.remove_offer(
                    12321,
                    ('SELA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ),
                    ('BUYA',
                     'GDUWG5CZ6YJNWOPQB33DOKWVWSNHJAWPWOUNAEBVTM7QRJ66NGFYEFAJ'
                     ))

    get_mock.assert_called_once_with(
        'https://horizon-testnet.stellar.org/transactions/', {'tx': trx_env})
    acc_mock.assert_called_once()
    assert t.is_success()
    assert t.result() == ('cafebabe', '42')
Example #29
0
def execute_trade(trading_config, user_profile, deployment_id, trade_pair,
                  advice, amount, num_cycles):
    asset_pairs = trade_pair.split('_')
    base_asset = get_asset(asset_pairs[0], asset_pairs[1])
    counter_asset = get_asset(asset_pairs[2], asset_pairs[3])

    logging.debug('Executing trade for did=%s for trade_pair=%s' %
                  (deployment_id, trade_pair))

    tcontext = get_trade_context(deployment_id)
    while True:
        if tcontext:
            lock = tcontext['lock']

            lock.acquire()
            try:
                last_advice = tcontext['last_advice']
                first_advice = tcontext['first_advice']
                current_cycles = tcontext['current_cycles']
                buy_amount = tcontext['amount']
                sell_amount = tcontext['sell_amount']

                if current_cycles >= num_cycles:
                    logging.info(
                        'Did = %s is completed the %s cycles. Stopping.' %
                        (deployment_id, num_cycles))
                    return False, ALGO_DONE, None

                if last_advice == advice:
                    logging.info(
                        'Got sequential %s order from did=%s. Ignoring recent advice.'
                        % (advice, deployment_id))
                    return False, ALGO_CONT, None

                if first_advice != advice:
                    current_cycles += 1

                tcontext['last_advice'] = advice
                tcontext['current_cycles'] = current_cycles
            finally:
                lock.release()
            break
        else:
            if advice == TradeAdvice.SELL:
                logging.info(
                    'Sell order without first buy order from did=%s. Ignoring advice.'
                    % advice)
                return False, ALGO_CONT, None

            tcontext = dict()
            tcontext['lock'] = Lock()
            tcontext['first_advice'] = advice
            tcontext['last_advice'] = advice
            tcontext['current_cycles'] = 0
            tcontext['amount'] = buy_amount = amount
            tcontext['sell_amount'] = sell_amount = 0

            last_context = add_trade_context(deployment_id, tcontext)
            if last_context:
                tcontext = last_context
                continue
            else:
                break

    account = user_profile.account
    signer = user_profile.account_secret

    trxid = None
    err = None

    if advice == TradeAdvice.BUY:
        sell_asset, buy_asset = base_asset, counter_asset

        if math.floor(buy_amount) == 0:
            logging.info(
                'Algo %d trying to generate buy order without available asset %s'
                % (deployment_id, sell_asset))
            return False, ALGO_ERROR, ('Ran out of fund for asset = %s' %
                                       format_asset(sell_asset))

        book = stellar.orderbook(selling=base_asset,
                                 buying=counter_asset).fetch()
        if len(book.bids):
            # get current market price of the asset
            market_bid = book.bids[0]
            logging.debug(
                'Executing trade for did=%s amount=%s, at market_price=%s [%s -> %s]'
                % (deployment_id, buy_amount, market_bid[1], sell_asset,
                   buy_asset))
            with stellar.new_transaction(account, signers=[signer]) as t:
                # buy counter asset buy exchanging base asset
                t.add_offer(buy_amount, sell_asset, buy_asset, market_bid[1])

            if t.is_success():
                trxid, _ = t.result()
                logging.debug('Trade executed for did = %s, trxid = %s' %
                              (deployment_id, trxid))
            else:
                err = str(t.errors())
                logging.error('Trade execution failed for did = %s, err = %s' %
                              (deployment_id, err))
    elif advice == TradeAdvice.SELL:
        sell_asset, buy_asset = counter_asset, base_asset

        if math.floor(sell_amount) == 0:
            logging.info(
                'Algo %d trying to generate buy order without available asset %s'
                % (deployment_id, sell_asset))
            return False, ALGO_ERROR, ('Ran out of fund for asset = %s' %
                                       format_asset(sell_asset))

        book = stellar.orderbook(selling=counter_asset,
                                 buying=base_asset).fetch()
        if len(book.bids):
            # get current market price of the asset
            market_bid = book.bids[0]
            logging.debug(
                'Executing trade for did=%s amount=%s, at market_price=%s [%s -> %s]'
                % (deployment_id, sell_amount, market_bid[1], sell_asset,
                   buy_asset))
            with stellar.new_transaction(account, signers=[signer]) as t:
                # sell counter asset buy exchanging base asset
                t.add_offer(sell_amount, sell_asset, buy_asset, market_bid[1])

            if t.is_success():
                trxid, _ = t.result()
                logging.debug('Trade executed for did = %s, trxid = %s' %
                              (deployment_id, trxid))
            else:
                err = str(t.errors())
                logging.error('Trade execution failed for did = %s, err = %s' %
                              (deployment_id, err))
    else:
        logging.error('Incorrect advice %s' % advice)
        return False, ALGO_ERROR, 'Incorrect advice %s' % advice

    # todo log the trade in database recoconciliation

    if not trxid:
        # todo log error
        return False, ALGO_ERROR, err

    try:
        offerid = stellar.transaction(trxid).effects().first().offer_id
        if offerid:
            # remove offer if it still exist
            offers = stellar.account(account).offers().fetch().records
            for offer in offers:
                if offer.offerid == offerid:
                    logging.debug(
                        'Removing residue offer for did = %s, offerid = %s' %
                        (deployment_id, offerid))
                    # ignore the error assuming offer got fulfilled (hence offer-not-found)
                    # we will check the final bought/sold below
                    with stellar.new_transaction(account,
                                                 signers=[signer]) as t:
                        t.remove_offer(offerid, sell_asset, buy_asset)

        total_sold = 0
        total_bought = 0
        effects = stellar.transaction(trxid).effects().fetch().records
        for effect in effects:
            if effect.type == 'trade' and effect.account == account:
                total_sold += float(effect.sold_amount)
                total_bought += float(effect.bought_amount)

        if advice == TradeAdvice.BUY:
            lock = tcontext['lock']
            try:
                lock.acquire()
                tcontext['amount'] = buy_amount - total_sold
                tcontext['sell_amount'] = sell_amount + total_bought
            finally:
                lock.release()
        elif advice == TradeAdvice.SELL:
            lock = tcontext['lock']
            try:
                lock.acquire()
                tcontext['amount'] = buy_amount + total_bought
                tcontext['sell_amount'] = sell_amount - total_sold
            finally:
                lock.release()

        ts = (datetime.datetime.utcnow() - EPOCH).total_seconds()
        with sqlite.connect(get_main_db()) as db:
            db.execute(
                "insert into trades"
                "(ts, deployment_id, advice, sold_asset, sold_amount, bought_asset, bought_amount)"
                " values (?, ?, ?, ?, ?, ?, ?)", [
                    ts, deployment_id, advice,
                    format_asset(sell_asset),
                    float(total_sold),
                    format_asset(buy_asset),
                    float(total_bought)
                ])
            db.commit()
    except Exception as e:
        logging.exception('Exception occurred while processing trade advice')
        return False, ALGO_ERROR, ('Internal error %s' % str(e))

    logging.info(
        'Trade executed for did=%s, sold_asset=%s, sold_amount=%s, bought_asset=%s, bought_amount=%s'
        % (deployment_id, sell_asset, total_sold, buy_asset, total_bought))

    return True, None, None