From f4aa7bd141618ce3203f611db7f0873271bfe9f8 Mon Sep 17 00:00:00 2001 From: perplover <184728147+perplover@users.noreply.github.com> Date: Mon, 13 Jan 2025 23:17:53 -0800 Subject: [PATCH 1/2] Refactor out is_mainnet and add validation --- hyperliquid/exchange.py | 51 +++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/hyperliquid/exchange.py b/hyperliquid/exchange.py index f0c5d475..a1e581f7 100644 --- a/hyperliquid/exchange.py +++ b/hyperliquid/exchange.py @@ -53,6 +53,10 @@ def __init__( self.account_address = account_address self.info = Info(base_url, True, meta, spot_meta) + @property + def is_mainnet(self) -> bool: + return self.base_url == MAINNET_API_URL + def _post_action(self, action, signature, nonce): payload = { "action": action, @@ -121,7 +125,7 @@ def bulk_orders(self, order_requests: List[OrderRequest], builder: Optional[Buil order_action, self.vault_address, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( @@ -175,7 +179,7 @@ def bulk_modify_orders_new(self, modify_requests: List[ModifyRequest]) -> Any: modify_action, self.vault_address, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( @@ -261,7 +265,7 @@ def bulk_cancel(self, cancel_requests: List[CancelRequest]) -> Any: cancel_action, self.vault_address, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( @@ -288,7 +292,7 @@ def bulk_cancel_by_cloid(self, cancel_requests: List[CancelByCloidRequest]) -> A cancel_action, self.vault_address, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( @@ -316,7 +320,7 @@ def schedule_cancel(self, time: Optional[int]) -> Any: schedule_cancel_action, self.vault_address, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( schedule_cancel_action, @@ -337,7 +341,7 @@ def update_leverage(self, leverage: int, name: str, is_cross: bool = True) -> An update_leverage_action, self.vault_address, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( update_leverage_action, @@ -359,7 +363,7 @@ def update_isolated_margin(self, amount: float, name: str) -> Any: update_isolated_margin_action, self.vault_address, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( update_isolated_margin_action, @@ -378,7 +382,7 @@ def set_referrer(self, code: str) -> Any: set_referrer_action, None, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( set_referrer_action, @@ -397,7 +401,7 @@ def create_sub_account(self, name: str) -> Any: create_sub_account_action, None, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( create_sub_account_action, @@ -417,7 +421,7 @@ def usd_class_transfer(self, amount: float, to_perp: bool) -> Any: "toPerp": to_perp, "nonce": timestamp, } - signature = sign_usd_class_transfer_action(self.wallet, action, self.base_url == MAINNET_API_URL) + signature = sign_usd_class_transfer_action(self.wallet, action, self.is_mainnet) return self._post_action( action, signature, @@ -437,7 +441,7 @@ def sub_account_transfer(self, sub_account_user: str, is_deposit: bool, usd: int sub_account_transfer_action, None, timestamp, - self.base_url == MAINNET_API_URL, + self.is_mainnet, ) return self._post_action( sub_account_transfer_action, @@ -453,8 +457,7 @@ def vault_usd_transfer(self, vault_address: str, is_deposit: bool, usd: int) -> "isDeposit": is_deposit, "usd": usd, } - is_mainnet = self.base_url == MAINNET_API_URL - signature = sign_l1_action(self.wallet, vault_transfer_action, None, timestamp, is_mainnet) + signature = sign_l1_action(self.wallet, vault_transfer_action, None, timestamp, self.is_mainnet) return self._post_action( vault_transfer_action, signature, @@ -464,8 +467,7 @@ def vault_usd_transfer(self, vault_address: str, is_deposit: bool, usd: int) -> def usd_transfer(self, amount: float, destination: str) -> Any: timestamp = get_timestamp_ms() action = {"destination": destination, "amount": str(amount), "time": timestamp, "type": "usdSend"} - is_mainnet = self.base_url == MAINNET_API_URL - signature = sign_usd_transfer_action(self.wallet, action, is_mainnet) + signature = sign_usd_transfer_action(self.wallet, action, self.is_mainnet) return self._post_action( action, signature, @@ -481,8 +483,7 @@ def spot_transfer(self, amount: float, destination: str, token: str) -> Any: "time": timestamp, "type": "spotSend", } - is_mainnet = self.base_url == MAINNET_API_URL - signature = sign_spot_transfer_action(self.wallet, action, is_mainnet) + signature = sign_spot_transfer_action(self.wallet, action, self.is_mainnet) return self._post_action( action, signature, @@ -492,8 +493,7 @@ def spot_transfer(self, amount: float, destination: str, token: str) -> Any: def withdraw_from_bridge(self, amount: float, destination: str) -> Any: timestamp = get_timestamp_ms() action = {"destination": destination, "amount": str(amount), "time": timestamp, "type": "withdraw3"} - is_mainnet = self.base_url == MAINNET_API_URL - signature = sign_withdraw_from_bridge_action(self.wallet, action, is_mainnet) + signature = sign_withdraw_from_bridge_action(self.wallet, action, self.is_mainnet) return self._post_action( action, signature, @@ -504,14 +504,13 @@ def approve_agent(self, name: Optional[str] = None) -> Tuple[Any, str]: agent_key = "0x" + secrets.token_hex(32) account = eth_account.Account.from_key(agent_key) timestamp = get_timestamp_ms() - is_mainnet = self.base_url == MAINNET_API_URL action = { "type": "approveAgent", "agentAddress": account.address, "agentName": name or "", "nonce": timestamp, } - signature = sign_agent(self.wallet, action, is_mainnet) + signature = sign_agent(self.wallet, action, self.is_mainnet) if name is None: del action["agentName"] @@ -528,7 +527,7 @@ def approve_builder_fee(self, builder: str, max_fee_rate: str) -> Any: timestamp = get_timestamp_ms() action = {"maxFeeRate": max_fee_rate, "builder": builder, "nonce": timestamp, "type": "approveBuilderFee"} - signature = sign_approve_builder_fee(self.wallet, action, self.base_url == MAINNET_API_URL) + signature = sign_approve_builder_fee(self.wallet, action, self.is_mainnet) return self._post_action(action, signature, timestamp) def convert_to_multi_sig_user(self, authorized_users: List[str], threshold: int) -> Any: @@ -543,7 +542,7 @@ def convert_to_multi_sig_user(self, authorized_users: List[str], threshold: int) "signers": json.dumps(signers), "nonce": timestamp, } - signature = sign_convert_to_multi_sig_user_action(self.wallet, action, self.base_url == MAINNET_API_URL) + signature = sign_convert_to_multi_sig_user_action(self.wallet, action, self.is_mainnet) return self._post_action( action, signature, @@ -551,6 +550,9 @@ def convert_to_multi_sig_user(self, authorized_users: List[str], threshold: int) ) def multi_sig(self, multi_sig_user, inner_action, signatures, nonce, vault_address=None): + # Currently, we only support up to 10 authorized users for multi-sig + assert len(signatures) <= 10, "Only up to 10 authorized users are supported for multi-sig" + multi_sig_user = multi_sig_user.lower() multi_sig_action = { "type": "multiSig", @@ -562,11 +564,10 @@ def multi_sig(self, multi_sig_user, inner_action, signatures, nonce, vault_addre "action": inner_action, }, } - is_mainnet = self.base_url == MAINNET_API_URL signature = sign_multi_sig_action( self.wallet, multi_sig_action, - is_mainnet, + self.is_mainnet, vault_address, nonce, ) From 23b568a6a81df6d5f8af663b4ac63d82d8963601 Mon Sep 17 00:00:00 2001 From: perplover <184728147+perplover@users.noreply.github.com> Date: Tue, 14 Jan 2025 00:22:57 -0800 Subject: [PATCH 2/2] Add instructions for running code locally with poetry --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index da071431..d3a0cfdf 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,12 @@ python examples/basic_order.py make install ``` +4. Run your local code with poetry + +```bash +poetry run python examples/basic_order +``` + ### Makefile usage CLI commands for faster development.