diff --git a/python/thirdweb-ai/src/thirdweb_ai/common/utils.py b/python/thirdweb-ai/src/thirdweb_ai/common/utils.py index be0a1c2..785c72e 100644 --- a/python/thirdweb-ai/src/thirdweb_ai/common/utils.py +++ b/python/thirdweb-ai/src/thirdweb_ai/common/utils.py @@ -6,7 +6,7 @@ def extract_digits(value: int | str) -> int: digit_match = re.search(r"\d+", value_str) if not digit_match: - raise ValueError(f"Chain ID '{value}' does not contain any digits") + raise ValueError(f"Input '{value}' does not contain any digits") extracted_digits = digit_match.group() @@ -18,14 +18,14 @@ def extract_digits(value: int | str) -> int: def normalize_chain_id( - chain_id: int | str | list[int | str] | None, + in_value: int | str | list[int | str] | None, ) -> int | list[int] | None: - """Normalize chain IDs to integers.""" + """Normalize str values integers.""" - if chain_id is None: + if in_value is None: return None - if isinstance(chain_id, list): - return [extract_digits(c) for c in chain_id] + if isinstance(in_value, list): + return [extract_digits(c) for c in in_value] - return extract_digits(chain_id) + return extract_digits(in_value) diff --git a/python/thirdweb-ai/src/thirdweb_ai/services/engine.py b/python/thirdweb-ai/src/thirdweb_ai/services/engine.py index 4659e37..1020a28 100644 --- a/python/thirdweb-ai/src/thirdweb_ai/services/engine.py +++ b/python/thirdweb-ai/src/thirdweb_ai/services/engine.py @@ -1,6 +1,6 @@ from typing import Annotated, Any -from thirdweb_ai.common.utils import normalize_chain_id +from thirdweb_ai.common.utils import extract_digits, normalize_chain_id from thirdweb_ai.services.service import Service from thirdweb_ai.tools.tool import tool @@ -68,7 +68,9 @@ def get_all_backend_wallet( ] = 20, ) -> dict[str, Any]: """Get all backend wallets.""" - return self._get("backend-wallet/get-all", params={"page": page, "limit": limit}) + return self._get( + "backend-wallet/get-all", params={"page": page, "limit": limit} + ) @tool( description="Check the current balance of a backend wallet on a specific blockchain. Returns the balance in wei (smallest unit) for both native currency (ETH, MATIC, etc.) and ERC20 tokens. Essential for verifying if a wallet has sufficient funds before sending transactions." @@ -87,7 +89,9 @@ def get_wallet_balance( """Get wallet balance for native or ERC20 tokens.""" normalized_chain = normalize_chain_id(chain_id) or self.chain_id backend_wallet_address = backend_wallet_address or self.backend_wallet_address - return self._get(f"backend-wallet/{normalized_chain}/{backend_wallet_address}/get-balance") + return self._get( + f"backend-wallet/{normalized_chain}/{backend_wallet_address}/get-balance" + ) @tool( description="Send an on-chain transaction. This powerful function can transfer native currency (ETH, MATIC), ERC20 tokens, or execute any arbitrary contract interaction. The transaction is signed and broadcast to the blockchain automatically." @@ -117,9 +121,12 @@ def send_transaction( ) -> dict[str, Any]: """Send a transaction from a backend wallet.""" + normalized_value = extract_digits(value) + hex_value = hex(normalized_value) + payload = { "toAddress": to_address, - "value": value, + "value": hex_value, "data": data or "0x", } @@ -172,7 +179,9 @@ def read_contract( "args": function_args or [], } normalized_chain = normalize_chain_id(chain_id) or self.chain_id - return self._get(f"contract/{normalized_chain}/{contract_address}/read", payload) + return self._get( + f"contract/{normalized_chain}/{contract_address}/read", payload + ) @tool( description="Execute a state-changing function on a smart contract by sending a transaction. This allows you to modify on-chain data, such as transferring tokens, minting NFTs, or updating contract configuration. The transaction is automatically signed by your backend wallet and submitted to the blockchain."