Beispiel #1
0
    def test_starkware_representation(self):
        withdrawal = SignableWithdrawal(**WITHDRAWAL_PARAMS)
        starkware_withdrawal = withdrawal.to_starkware()
        assert starkware_withdrawal.quantums_amount == 49478023

        # Order expiration should be rounded up and should have a buffer added.
        assert starkware_withdrawal.expiration_epoch_hours == 444533
Beispiel #2
0
    def create_withdrawal(
        self,
        position_id,
        amount,
        asset,
        to_address,
        client_id=None,
        expiration=None,
        expiration_epoch_seconds=None,
        signature=None,
    ):
        '''
        Post a withdrawal

        :param position_id: required
        :type position_id: int or str

        :param amount: required
        :type amount: str

        :param asset: required
        :type asset: str in list [
            "ETH",
            "LINK",
            "BTC",
            "USDC",
            "USDT",
            "USD",
        ]

        :param to_address: required
        :type to_address: str

        :param client_id: optional
        :type client_id: str

        :param expiration: optional
        :type expiration: ISO str

        :param expiration_epoch_seconds: optional
        :type expiration_epoch_seconds: int

        :param signature: optional
        :type signature: str

        :returns: Transfer

        :raises: DydxAPIError
        '''
        client_id = client_id or random_client_id()
        if bool(expiration) == bool(expiration_epoch_seconds):
            raise ValueError(
                'Exactly one of expiration and expiration_epoch_seconds must '
                'be specified', )
        expiration = expiration or epoch_seconds_to_iso(
            expiration_epoch_seconds, )
        expiration_epoch_seconds = (expiration_epoch_seconds
                                    or iso_to_epoch_seconds(expiration))

        if not signature:
            if not self.stark_private_key:
                raise Exception('No signature provided and client was not' +
                                'initialized with stark_private_key')
            withdrawal_to_sign = SignableWithdrawal(
                network_id=self.network_id,
                position_id=position_id,
                client_id=client_id,
                human_amount=amount,
                expiration_epoch_seconds=expiration_epoch_seconds,
            )
            signature = withdrawal_to_sign.sign(self.stark_private_key)

        params = {
            'amount': amount,
            'asset': asset,
            # TODO: Signature verification should work regardless of case.
            'toAddress': to_address.lower(),
            'expiration': expiration,
            'clientId': client_id,
            'signature': signature,
        }
        return self._post('withdrawals', params)
Beispiel #3
0
 def test_sign_withdrawal(self):
     withdrawal = SignableWithdrawal(**WITHDRAWAL_PARAMS)
     signature = withdrawal.sign(MOCK_PRIVATE_KEY)
     assert signature == MOCK_SIGNATURE
Beispiel #4
0
 def test_verify_signature(self):
     withdrawal = SignableWithdrawal(**WITHDRAWAL_PARAMS)
     assert withdrawal.verify_signature(MOCK_SIGNATURE, MOCK_PUBLIC_KEY)
Beispiel #5
0
    def create_withdrawal(
        self,
        position_id,
        amount,
        asset,
        to_address,
        expiration,
        client_id=None,
        signature=None,
    ):
        '''
        Post a withdrawal

        :param position_id: required
        :type position_id: int or str

        :param amount: required
        :type amount: str

        :param asset: required
        :type asset: str in list [
            "ETH",
            "LINK",
            "BTC",
            "USDC",
            "USDT",
            "USD",
        ]

        :param to_address: required
        :type to_address: str

        :param expiration: required
        :type expiration: ISO string

        :param client_id: optional
        :type client_id: str

        :param signature: optional
        :type signature: str

        :returns: Transfer

        :raises: DydxAPIError
        '''
        client_id = client_id or random_client_id()

        withdrawal_signature = signature
        if not withdrawal_signature:
            if not self.stark_private_key:
                raise Exception(
                    'No signature provided and client was not' +
                    'initialized with stark_private_key'
                )
            withdrawal_to_sign = SignableWithdrawal(
                position_id=position_id,
                client_id=client_id,
                human_amount=amount,
                expiration_epoch_seconds=iso_to_epoch_seconds(expiration),
            )
            withdrawal_signature = withdrawal_to_sign.sign(
                self.stark_private_key,
            )
        withdrawal = {
            'amount': amount,
            'asset': asset,
            # TODO: Signature verification should work regardless of case.
            'toAddress': to_address.lower(),
            'clientId': client_id,
            'signature': withdrawal_signature,
            'expiration': expiration,
        }

        return self._post(
            'withdrawals',
            withdrawal,
        )