Exemple #1
0
    def test_should_not_create_any_orders_but_not_terminate_if_eth_balance_before_minimum(
            self, deployment: Deployment, tmpdir):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # and
        keeper = OasisMarketMakerKeeper(args=args(
            f"--eth-from {deployment.our_address} "
            f"--tub-address {deployment.tub.address} "
            f"--oasis-address {deployment.otc.address} "
            f"--buy-token-address {deployment.sai.address} "
            f"--sell-token-address {deployment.gem.address} "
            f"--price-feed tub "
            f"--config {config_file} "
            f"--min-eth-balance 100.0"),
                                        web3=deployment.web3)
        keeper.lifecycle = Lifecycle(web3=keeper.web3)

        # and
        self.mint_tokens(deployment)
        self.set_price(deployment, Wad.from_number(100))

        # and
        self.leave_only_some_eth(deployment, Wad.from_number(
            10.0))  # there is a 5.0 ETH block reward even in testrpc,
        # that's why `--min-eth-balance` is higher than 10

        # when
        keeper.approve()
        self.synchronize_orders_twice(keeper)

        # then
        assert len(deployment.otc.get_orders()) == 0
        assert not keeper.lifecycle.terminated_internally
Exemple #2
0
    def test_should_take_over_order_from_adjacent_band_when_price_changes(self, deployment: Deployment, tmpdir):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # and
        keeper = OasisMarketMakerKeeper(args=args(f"--eth-from {deployment.our_address} "
                                                  f"--tub-address {deployment.tub.address} "
                                                  f"--oasis-address {deployment.otc.address} "
                                                  f"--config {config_file}"),
                                        web3=deployment.web3)
        keeper.lifecycle = Web3Lifecycle(web3=keeper.web3)

        # and
        self.mint_tokens(deployment)
        self.set_price(deployment, Wad.from_number(100))

        # when
        keeper.approve()
        self.synchronize_orders_twice(keeper)

        # then
        assert len(deployment.otc.get_orders()) == 2

        # and
        assert self.orders_sorted(deployment.otc.get_orders())[0].maker == deployment.our_address
        assert self.orders_sorted(deployment.otc.get_orders())[0].pay_amount == Wad.from_number(7.5)
        assert self.orders_sorted(deployment.otc.get_orders())[0].pay_token == deployment.gem.address
        assert self.orders_sorted(deployment.otc.get_orders())[0].buy_amount == Wad.from_number(780)
        assert self.orders_sorted(deployment.otc.get_orders())[0].buy_token == deployment.sai.address

        # and
        assert self.orders_sorted(deployment.otc.get_orders())[1].maker == deployment.our_address
        assert self.orders_sorted(deployment.otc.get_orders())[1].pay_amount == Wad.from_number(9.5)
        assert self.orders_sorted(deployment.otc.get_orders())[1].pay_token == deployment.gem.address
        assert self.orders_sorted(deployment.otc.get_orders())[1].buy_amount == Wad.from_number(1026)
        assert self.orders_sorted(deployment.otc.get_orders())[1].buy_token == deployment.sai.address

        # when
        self.set_price(deployment, Wad.from_number(96))
        # and
        self.synchronize_orders_twice(keeper)

        # then
        assert len(deployment.otc.get_orders()) == 2

        # and
        # ...new order in the <0.02,0.06> band gets created
        assert self.orders_sorted(deployment.otc.get_orders())[0].maker == deployment.our_address
        assert self.orders_sorted(deployment.otc.get_orders())[0].pay_amount == Wad.from_number(7.5)
        assert self.orders_sorted(deployment.otc.get_orders())[0].pay_token == deployment.gem.address
        assert self.orders_sorted(deployment.otc.get_orders())[0].buy_amount == Wad.from_number(748.8)
        assert self.orders_sorted(deployment.otc.get_orders())[0].buy_token == deployment.sai.address

        # and
        # ...the order from <0.02,0.06> ends up in the <0.06,0.10> band
        assert self.orders_sorted(deployment.otc.get_orders())[1].maker == deployment.our_address
        assert self.orders_sorted(deployment.otc.get_orders())[1].pay_amount == Wad.from_number(7.5)
        assert self.orders_sorted(deployment.otc.get_orders())[1].pay_token == deployment.gem.address
        assert self.orders_sorted(deployment.otc.get_orders())[1].buy_amount == Wad.from_number(780)
        assert self.orders_sorted(deployment.otc.get_orders())[1].buy_token == deployment.sai.address
    def test_should_not_create_any_orders_but_not_terminate_if_eth_balance_before_minimum(self, deployment: Deployment, tmpdir):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # and
        keeper = OasisMarketMakerKeeper(args=args(f"--eth-from {deployment.our_address} "
                                                  f"--tub-address {deployment.tub.address} "
                                                  f"--oasis-address {deployment.otc.address} "
                                                  f"--buy-token-address {deployment.sai.address} "
                                                  f"--sell-token-address {deployment.gem.address} "
                                                  f"--price-feed tub "
                                                  f"--config {config_file} "
                                                  f"--min-eth-balance 100.0"),
                                        web3=deployment.web3)
        keeper.lifecycle = Lifecycle(web3=keeper.web3)

        # and
        self.mint_tokens(deployment)
        self.set_price(deployment, Wad.from_number(100))

        # and
        self.leave_only_some_eth(deployment, Wad.from_number(10.0))  # there is a 5.0 ETH block reward even in testrpc,
                                                                     # that's why `--min-eth-balance` is higher than 10

        # when
        keeper.approve()
        self.synchronize_orders_twice(keeper)

        # then
        assert len(deployment.otc.get_orders()) == 0
        assert not keeper.lifecycle.terminated_internally
Exemple #4
0
    def test_should_create_orders_in_multiple_bands(self,
                                                    deployment: Deployment,
                                                    tmpdir: py.path.local):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # and
        keeper = EtherDeltaMarketMakerKeeper(args=args(
            f"--eth-from {deployment.our_address} --config {config_file}"
            f" --tub-address {deployment.tub.address}"
            f" --etherdelta-address {deployment.etherdelta.address}"
            f" --etherdelta-socket https://127.0.0.1:99999/"
            f" --order-age 3600 --eth-reserve 10"
            f" --min-eth-deposit 1 --min-sai-deposit 400"),
                                             web3=deployment.web3)
        keeper.lifecycle = Web3Lifecycle(web3=keeper.web3)
        keeper.etherdelta_api.publish_order = MagicMock()

        # and
        self.mint_tokens(deployment)
        self.set_price(deployment, Wad.from_number(100))

        # when
        keeper.approve()
        keeper.synchronize_orders(
        )  # ... first call is so it can made deposits
        keeper.synchronize_orders(
        )  # ... second call is so the actual orders can get placed

        # then
        assert len(self.orders(keeper)) == 2

        # and
        assert self.orders_sorted(
            self.orders(keeper))[0].maker == deployment.our_address
        assert self.orders_sorted(
            self.orders(keeper))[0].pay_amount == Wad.from_number(7.5)
        assert self.orders_sorted(
            self.orders(keeper))[0].pay_token == EtherDelta.ETH_TOKEN
        assert self.orders_sorted(
            self.orders(keeper))[0].buy_amount == Wad.from_number(780)
        assert self.orders_sorted(
            self.orders(keeper))[0].buy_token == deployment.sai.address

        # and
        assert self.orders_sorted(
            self.orders(keeper))[1].maker == deployment.our_address
        assert self.orders_sorted(
            self.orders(keeper))[1].pay_amount == Wad.from_number(9.5)
        assert self.orders_sorted(
            self.orders(keeper))[1].pay_token == EtherDelta.ETH_TOKEN
        assert self.orders_sorted(
            self.orders(keeper))[1].buy_amount == Wad.from_number(1026)
        assert self.orders_sorted(
            self.orders(keeper))[1].buy_token == deployment.sai.address
Exemple #5
0
    def test_should_create_orders_in_multiple_bands(self,
                                                    deployment: Deployment,
                                                    tmpdir):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # and
        keeper = OasisMarketMakerKeeper(args=args(
            f"--eth-from {deployment.our_address} "
            f"--tub-address {deployment.tub.address} "
            f"--oasis-address {deployment.otc.address} "
            f"--buy-token-address {deployment.sai.address} "
            f"--sell-token-address {deployment.gem.address} "
            f"--price-feed tub "
            f"--config {config_file}"),
                                        web3=deployment.web3)
        keeper.lifecycle = Lifecycle(web3=keeper.web3)

        # and
        self.mint_tokens(deployment)
        self.set_price(deployment, Wad.from_number(100))

        # when
        keeper.approve()
        self.synchronize_orders_twice(keeper)

        # then
        assert len(deployment.otc.get_orders()) == 2

        # and
        assert self.orders_sorted(
            deployment.otc.get_orders())[0].maker == deployment.our_address
        assert self.orders_sorted(
            deployment.otc.get_orders())[0].pay_amount == Wad.from_number(7.5)
        assert self.orders_sorted(
            deployment.otc.get_orders())[0].pay_token == deployment.gem.address
        assert self.orders_sorted(
            deployment.otc.get_orders())[0].buy_amount == Wad.from_number(780)
        assert self.orders_sorted(
            deployment.otc.get_orders())[0].buy_token == deployment.sai.address

        # and
        assert self.orders_sorted(
            deployment.otc.get_orders())[1].maker == deployment.our_address
        assert self.orders_sorted(
            deployment.otc.get_orders())[1].pay_amount == Wad.from_number(9.5)
        assert self.orders_sorted(
            deployment.otc.get_orders())[1].pay_token == deployment.gem.address
        assert self.orders_sorted(
            deployment.otc.get_orders())[1].buy_amount == Wad.from_number(1026)
        assert self.orders_sorted(
            deployment.otc.get_orders())[1].buy_token == deployment.sai.address
Exemple #6
0
    def test_should_refuse_to_start_if_eth_reserve_lower_than_min_eth_balance(
            self, deployment: Deployment, tmpdir: py.path.local):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # expect
        with pytest.raises(
                Exception,
                match="--eth-reserve must be higher than --min-eth-balance"):
            EtherDeltaMarketMakerKeeper(args=args(
                f"--eth-from {deployment.our_address} --config {config_file}"
                f" --tub-address {deployment.tub.address}"
                f" --etherdelta-address {deployment.etherdelta.address}"
                f" --etherdelta-socket https://127.0.0.1:99999/"
                f" --order-age 3600 --eth-reserve 99.9"
                f" --min-eth-balance 100.0"
                f" --min-eth-deposit 1 --min-sai-deposit 400"),
                                        web3=deployment.web3)
Exemple #7
0
    def test_should_cancel_all_orders_but_not_terminate_if_eth_balance_before_minimum(
            self, deployment: Deployment, tmpdir: py.path.local):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # and
        keeper = EtherDeltaMarketMakerKeeper(args=args(
            f"--eth-from {deployment.our_address} --config {config_file}"
            f" --tub-address {deployment.tub.address}"
            f" --etherdelta-address {deployment.etherdelta.address}"
            f" --etherdelta-socket https://127.0.0.1:99999/"
            f" --order-age 3600 --eth-reserve 200"
            f" --min-eth-balance 100.0"
            f" --min-eth-deposit 1 --min-sai-deposit 400"),
                                             web3=deployment.web3)
        keeper.lifecycle = Web3Lifecycle(web3=keeper.web3)
        keeper.etherdelta_api.publish_order = MagicMock()

        # and
        self.mint_tokens(deployment)
        self.set_price(deployment, Wad.from_number(100))

        # when
        keeper.approve()
        keeper.synchronize_orders(
        )  # ... first call is so it can made deposits
        keeper.synchronize_orders(
        )  # ... second call is so the actual orders can get placed

        # then
        assert len(self.orders(keeper)) == 2

        # when
        self.leave_only_some_eth(deployment, Wad.from_number(
            10.0))  # there is a 5.0 ETH block reward even in testrpc,
        # that's why `--min-eth-balance` is higher than 10

        # and
        keeper.synchronize_orders()

        # then
        assert len(self.orders(keeper)) == 0
        assert not keeper.lifecycle.terminated_internally
    def test_should_create_orders_in_multiple_bands(self, deployment: Deployment, tmpdir):
        # given
        config_file = BandConfig.two_adjacent_bands_config(tmpdir)

        # and
        keeper = OasisMarketMakerKeeper(args=args(f"--eth-from {deployment.our_address} "
                                                  f"--tub-address {deployment.tub.address} "
                                                  f"--oasis-address {deployment.otc.address} "
                                                  f"--buy-token-address {deployment.sai.address} "
                                                  f"--sell-token-address {deployment.gem.address} "
                                                  f"--price-feed tub "
                                                  f"--config {config_file}"),
                                        web3=deployment.web3)
        keeper.lifecycle = Lifecycle(web3=keeper.web3)

        # and
        self.mint_tokens(deployment)
        self.set_price(deployment, Wad.from_number(100))

        # when
        keeper.approve()
        self.synchronize_orders_twice(keeper)

        # then
        assert len(deployment.otc.get_orders()) == 2

        # and
        assert self.orders_sorted(deployment.otc.get_orders())[0].maker == deployment.our_address
        assert self.orders_sorted(deployment.otc.get_orders())[0].pay_amount == Wad.from_number(7.5)
        assert self.orders_sorted(deployment.otc.get_orders())[0].pay_token == deployment.gem.address
        assert self.orders_sorted(deployment.otc.get_orders())[0].buy_amount == Wad.from_number(780)
        assert self.orders_sorted(deployment.otc.get_orders())[0].buy_token == deployment.sai.address

        # and
        assert self.orders_sorted(deployment.otc.get_orders())[1].maker == deployment.our_address
        assert self.orders_sorted(deployment.otc.get_orders())[1].pay_amount == Wad.from_number(9.5)
        assert self.orders_sorted(deployment.otc.get_orders())[1].pay_token == deployment.gem.address
        assert self.orders_sorted(deployment.otc.get_orders())[1].buy_amount == Wad.from_number(1026)
        assert self.orders_sorted(deployment.otc.get_orders())[1].buy_token == deployment.sai.address