Пример #1
0
    def test_get_usd_balances_copy_price(
        self,
        timezone_now_mock: MagicMock,
        get_native_coin_usd_price_mock: MagicMock,
        get_token_eth_value_mock: MagicMock,
    ):
        balance_service = self.balance_service
        safe_address = SafeContractFactory().address
        random_address = Account.create().address

        balances = balance_service.get_usd_balances(safe_address)
        self.assertEqual(len(balances), 1)
        self.assertIsNone(balances[0].token_address)
        self.assertEqual(balances[0].balance, 0)

        tokens_value = int(12 * 1e18)
        erc20 = deploy_erc20(self.w3, "Galactic Credit Standard", "GCS",
                             safe_address, tokens_value)
        ERC20TransferFactory(address=erc20.address, to=safe_address)

        def get_token_eth_value(
                self, token_address: ChecksumAddress) -> Optional[float]:
            if token_address == erc20.address:
                return 0.4
            elif token_address == random_address:
                return 0.1

        get_token_eth_value_mock.side_effect = get_token_eth_value
        for expected_token_eth_value in (0.4, 0.1):
            with self.subTest(
                    expected_token_eth_value=expected_token_eth_value):
                balances = balance_service.get_usd_balances(safe_address)
                self.assertEqual(len(balances), 2)
                self.assertCountEqual(
                    balances,
                    [
                        BalanceWithFiat(
                            None,
                            None,
                            0,
                            1.0,
                            timezone_now_mock.return_value,
                            0.0,
                            123.4,
                        ),
                        BalanceWithFiat(
                            erc20.address,
                            balance_service.get_token_info(erc20.address),
                            tokens_value,
                            expected_token_eth_value,
                            timezone_now_mock.return_value,
                            round(
                                123.4 * expected_token_eth_value *
                                (tokens_value / 1e18),
                                4,
                            ),
                            round(123.4 * expected_token_eth_value, 4),
                        ),
                    ],
                )
                token = Token.objects.get(address=erc20.address)
                token.copy_price = random_address
                token.save(update_fields=["copy_price"])
                balance_service.cache_token_info.clear()
Пример #2
0
    def test_get_usd_balances(
        self,
        timezone_now_mock: MagicMock,
        get_native_coin_usd_price_mock: MagicMock,
        get_token_eth_value_mock: MagicMock,
    ):
        balance_service = self.balance_service

        safe_address = Account.create().address
        SafeContractFactory(address=safe_address)
        value = 7
        self.send_ether(safe_address, 7)

        balances = balance_service.get_usd_balances(safe_address)
        self.assertEqual(len(balances), 1)
        self.assertIsNone(balances[0].token_address)
        self.assertEqual(balances[0].balance, value)

        tokens_value = int(12 * 1e18)
        erc20 = deploy_erc20(self.w3, "Eurodollar", "EUD", safe_address,
                             tokens_value)
        balances = balance_service.get_usd_balances(safe_address)
        self.assertEqual(len(balances), 1)

        ERC20TransferFactory(address=erc20.address, to=safe_address)
        balances = balance_service.get_usd_balances(safe_address)
        token_info = balance_service.get_token_info(erc20.address)
        self.assertCountEqual(
            balances,
            [
                BalanceWithFiat(None, None, value, 1.0,
                                timezone_now_mock.return_value, 0.0, 123.4),
                BalanceWithFiat(
                    erc20.address,
                    token_info,
                    tokens_value,
                    0.4,
                    timezone_now_mock.return_value,
                    round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                    round(123.4 * 0.4, 4),
                ),
            ],
        )

        balances = balance_service.get_usd_balances(safe_address,
                                                    only_trusted=True)
        self.assertCountEqual(
            balances,
            [
                BalanceWithFiat(None, None, value, 1.0,
                                timezone_now_mock.return_value, 0.0, 123.4),
            ],
        )

        Token.objects.filter(address=erc20.address).update(trusted=True,
                                                           spam=False)
        balances = balance_service.get_usd_balances(safe_address,
                                                    only_trusted=True)
        self.assertCountEqual(
            balances,
            [
                BalanceWithFiat(None, None, value, 1.0,
                                timezone_now_mock.return_value, 0.0, 123.4),
                BalanceWithFiat(
                    erc20.address,
                    token_info,
                    tokens_value,
                    0.4,
                    timezone_now_mock.return_value,
                    round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                    round(123.4 * 0.4, 4),
                ),
            ],
        )

        # Test sorting
        erc20_2 = deploy_erc20(self.w3, "Peseta", "PTA", safe_address,
                               tokens_value)
        token_info_2 = balance_service.get_token_info(erc20_2.address)
        erc20_3 = deploy_erc20(self.w3, "Double Dollars", "DD", safe_address,
                               tokens_value)
        token_info_3 = balance_service.get_token_info(erc20_3.address)

        ERC20TransferFactory(address=erc20_2.address, to=safe_address)
        ERC20TransferFactory(address=erc20_3.address, to=safe_address)
        balances = balance_service.get_usd_balances(safe_address)
        token_info = balance_service.get_token_info(erc20.address)
        self.assertCountEqual(
            balances,
            [
                BalanceWithFiat(None, None, value, 1.0,
                                timezone_now_mock.return_value, 0.0, 123.4),
                BalanceWithFiat(
                    erc20_3.address,
                    token_info_3,
                    tokens_value,
                    0.4,
                    timezone_now_mock.return_value,
                    round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                    round(123.4 * 0.4, 4),
                ),
                BalanceWithFiat(
                    erc20.address,
                    token_info,
                    tokens_value,
                    0.4,
                    timezone_now_mock.return_value,
                    round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                    round(123.4 * 0.4, 4),
                ),
                BalanceWithFiat(
                    erc20_2.address,
                    token_info_2,
                    tokens_value,
                    0.4,
                    timezone_now_mock.return_value,
                    round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                    round(123.4 * 0.4, 4),
                ),
            ],
        )
    def test_get_usd_balances(self, get_eth_price_mock: MagicMock, get_token_eth_value_mock: MagicMock):
        balance_service = BalanceServiceProvider()

        safe_address = Account.create().address
        SafeContractFactory(address=safe_address)
        value = 7
        self.send_ether(safe_address, 7)

        balances = balance_service.get_usd_balances(safe_address)
        self.assertEqual(len(balances), 1)
        self.assertIsNone(balances[0].token_address)
        self.assertEqual(balances[0].balance, value)

        tokens_value = int(12 * 1e18)
        erc20 = deploy_erc20(self.w3, 'Eurodollar', 'EUD', safe_address, tokens_value)
        balances = balance_service.get_usd_balances(safe_address)
        self.assertEqual(len(balances), 1)

        EthereumEventFactory(address=erc20.address, to=safe_address)
        balances = balance_service.get_usd_balances(safe_address)
        token_info = balance_service.get_token_info(erc20.address)
        self.assertCountEqual(balances, [
            BalanceWithFiat(None, None, value, 0.0, 123.4),
            BalanceWithFiat(
                erc20.address, token_info, tokens_value, round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                round(123.4 * 0.4, 4)
            )
        ])

        balances = balance_service.get_usd_balances(safe_address, only_trusted=True)
        self.assertCountEqual(balances, [
            BalanceWithFiat(None, None, value, 0.0, 123.4),
        ])

        Token.objects.filter(address=erc20.address).update(trusted=True, spam=False)
        balances = balance_service.get_usd_balances(safe_address, only_trusted=True)
        self.assertCountEqual(balances, [
            BalanceWithFiat(None, None, value, 0.0, 123.4),
            BalanceWithFiat(
                erc20.address, token_info, tokens_value, round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                round(123.4 * 0.4, 4)
            )
        ])

        # Test sorting
        erc20_2 = deploy_erc20(self.w3, 'Peseta', 'PTA', safe_address, tokens_value)
        token_info_2 = balance_service.get_token_info(erc20_2.address)
        erc20_3 = deploy_erc20(self.w3, 'Double Dollars', 'DD', safe_address, tokens_value)
        token_info_3 = balance_service.get_token_info(erc20_3.address)

        EthereumEventFactory(address=erc20_2.address, to=safe_address)
        EthereumEventFactory(address=erc20_3.address, to=safe_address)
        balances = balance_service.get_usd_balances(safe_address)
        token_info = balance_service.get_token_info(erc20.address)
        self.assertCountEqual(balances, [
            BalanceWithFiat(None, None, value, 0.0, 123.4),
            BalanceWithFiat(
                erc20_3.address, token_info_3, tokens_value, round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                round(123.4 * 0.4, 4)
            ),
            BalanceWithFiat(
                erc20.address, token_info, tokens_value, round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                round(123.4 * 0.4, 4)
            ),
            BalanceWithFiat(
                erc20_2.address, token_info_2, tokens_value, round(123.4 * 0.4 * (tokens_value / 1e18), 4),
                round(123.4 * 0.4, 4)
            ),
        ])