Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 51 additions & 24 deletions hummingbot/client/config/config_crypt.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import binascii
import json
import os
from abc import ABC, abstractmethod
from os.path import exists

from eth_account import Account
from eth_keyfile.keyfile import (
Expand All @@ -19,10 +21,35 @@
)
from pydantic import SecretStr

from hummingbot import root_path
from hummingbot.client.settings import CONF_DIR_PATH

PASSWORD_VERIFICATION_WORD = "HummingBot"
PASSWORD_VERIFICATION_PATH = CONF_DIR_PATH / ".password_verification"

# Global static values
def load_security_config_values():
config_file_path = str(root_path() / "conf" / "settings_conf_client.yml")
if exists(config_file_path):
with open(config_file_path, "r") as file:
config_data = json.load(file)
else:
config_data = {}

return {
"PASSWORD_VERIFICATION_WORD": config_data.get(
"PASSWORD_VERIFICATION_WORD", os.environ.get("PASSWORD_VERIFICATION_WORD", "HummingBot")
),
"PASSWORD_VERIFICATION_PATH": config_data.get(
"PASSWORD_VERIFICATION_PATH",
os.environ.get("PASSWORD_VERIFICATION_PATH", str(CONF_DIR_PATH / ".password_verification")),
),
}


security_config_values = load_security_config_values()

# Security Configs
PASSWORD_VERIFICATION_WORD = security_config_values["PASSWORD_VERIFICATION_WORD"]
PASSWORD_VERIFICATION_PATH = security_config_values["PASSWORD_VERIFICATION_PATH"]


class BaseSecretsManager(ABC):
Expand Down Expand Up @@ -90,21 +117,21 @@ def _create_v3_keyfile_json(message_to_encrypt, password, kdf="pbkdf2", work_fac
if work_factor is None:
work_factor = get_default_work_factor_for_kdf(kdf)

if kdf == 'pbkdf2':
if kdf == "pbkdf2":
derived_key = _pbkdf2_hash(
password,
hash_name='sha256',
hash_name="sha256",
salt=salt,
iterations=work_factor,
dklen=DKLEN,
)
kdfparams = {
'c': work_factor,
'dklen': DKLEN,
'prf': 'hmac-sha256',
'salt': encode_hex_no_prefix(salt),
"c": work_factor,
"dklen": DKLEN,
"prf": "hmac-sha256",
"salt": encode_hex_no_prefix(salt),
}
elif kdf == 'scrypt':
elif kdf == "scrypt":
derived_key = _scrypt_hash(
password,
salt=salt,
Expand All @@ -114,11 +141,11 @@ def _create_v3_keyfile_json(message_to_encrypt, password, kdf="pbkdf2", work_fac
n=work_factor,
)
kdfparams = {
'dklen': DKLEN,
'n': work_factor,
'r': SCRYPT_R,
'p': SCRYPT_P,
'salt': encode_hex_no_prefix(salt),
"dklen": DKLEN,
"n": work_factor,
"r": SCRYPT_R,
"p": SCRYPT_P,
"salt": encode_hex_no_prefix(salt),
}
else:
raise NotImplementedError("KDF not implemented: {0}".format(kdf))
Expand All @@ -129,16 +156,16 @@ def _create_v3_keyfile_json(message_to_encrypt, password, kdf="pbkdf2", work_fac
mac = keccak(derived_key[16:32] + ciphertext)

return {
'crypto': {
'cipher': 'aes-128-ctr',
'cipherparams': {
'iv': encode_hex_no_prefix(int_to_big_endian(iv)),
"crypto": {
"cipher": "aes-128-ctr",
"cipherparams": {
"iv": encode_hex_no_prefix(int_to_big_endian(iv)),
},
'ciphertext': encode_hex_no_prefix(ciphertext),
'kdf': kdf,
'kdfparams': kdfparams,
'mac': encode_hex_no_prefix(mac),
"ciphertext": encode_hex_no_prefix(ciphertext),
"kdf": kdf,
"kdfparams": kdfparams,
"mac": encode_hex_no_prefix(mac),
},
'version': 3,
'alias': '', # Add this line to include the 'alias' field with an empty string value
"version": 3,
"alias": "", # Add this line to include the 'alias' field with an empty string value
}
143 changes: 114 additions & 29 deletions hummingbot/client/settings.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import importlib
import json
import os
from decimal import Decimal
from enum import Enum
from os import DirEntry, scandir
Expand Down Expand Up @@ -27,36 +28,120 @@
required_rate_oracle: bool = False
rate_oracle_pairs: List[str] = []


# Global static values
KEYFILE_PREFIX = "key_file_"
KEYFILE_POSTFIX = ".yml"
ENCYPTED_CONF_POSTFIX = ".json"
DEFAULT_LOG_FILE_PATH = root_path() / "logs"
DEFAULT_ETHEREUM_RPC_URL = "https://mainnet.coinalpha.com/hummingbot-test-node"
TEMPLATE_PATH = root_path() / "hummingbot" / "templates"
CONF_DIR_PATH = root_path() / "conf"
CLIENT_CONFIG_PATH = CONF_DIR_PATH / "conf_client.yml"
TRADE_FEES_CONFIG_PATH = CONF_DIR_PATH / "conf_fee_overrides.yml"
STRATEGIES_CONF_DIR_PATH = CONF_DIR_PATH / "strategies"
CONNECTORS_CONF_DIR_PATH = CONF_DIR_PATH / "connectors"
SCRIPT_STRATEGY_CONF_DIR_PATH = CONF_DIR_PATH / "scripts"
CONTROLLERS_CONF_DIR_PATH = CONF_DIR_PATH / "controllers"
CONF_PREFIX = "conf_"
CONF_POSTFIX = "_strategy"
SCRIPT_STRATEGIES_MODULE = "scripts"
SCRIPT_STRATEGIES_PATH = root_path() / SCRIPT_STRATEGIES_MODULE
CONTROLLERS_MODULE = "controllers"
CONTROLLERS_PATH = root_path() / CONTROLLERS_MODULE
DEFAULT_GATEWAY_CERTS_PATH = root_path() / "certs"

GATEWAY_SSL_CONF_FILE = root_path() / "gateway" / "conf" / "ssl.yml"

# Certificates for securely communicating with the gateway api
GATEAWAY_CA_CERT_PATH = DEFAULT_GATEWAY_CERTS_PATH / "ca_cert.pem"
GATEAWAY_CLIENT_CERT_PATH = DEFAULT_GATEWAY_CERTS_PATH / "client_cert.pem"
GATEAWAY_CLIENT_KEY_PATH = DEFAULT_GATEWAY_CERTS_PATH / "client_key.pem"

CONNECTOR_SUBMODULES_THAT_ARE_NOT_CEX_TYPES = ["test_support", "utilities", "gateway"]
def load_config_values():
config_file_path = str(root_path() / "conf" / "settings_conf_client.yml")
if exists(config_file_path):
with open(config_file_path, "r") as file:
config_data = json.load(file)
else:
config_data = {}

return {
"KEYFILE_PREFIX": config_data.get("KEYFILE_PREFIX", os.environ.get("KEYFILE_PREFIX", "key_file_")),
"KEYFILE_POSTFIX": config_data.get("KEYFILE_POSTFIX", os.environ.get("KEYFILE_POSTFIX", ".yml")),
"ENCYPTED_CONF_POSTFIX": config_data.get(
"ENCYPTED_CONF_POSTFIX", os.environ.get("ENCYPTED_CONF_POSTFIX", ".json")
),
"DEFAULT_LOG_FILE_PATH": config_data.get(
"DEFAULT_LOG_FILE_PATH", os.environ.get("DEFAULT_LOG_FILE_PATH", str(root_path() / "logs"))
),
"DEFAULT_ETHEREUM_RPC_URL": config_data.get(
"DEFAULT_ETHEREUM_RPC_URL",
os.environ.get("DEFAULT_ETHEREUM_RPC_URL", "https://mainnet.coinalpha.com/hummingbot-test-node"),
),
"TEMPLATE_PATH": config_data.get(
"TEMPLATE_PATH", os.environ.get("TEMPLATE_PATH", str(root_path() / "hummingbot" / "templates"))
),
"CONF_DIR_PATH": config_data.get("CONF_DIR_PATH", os.environ.get("CONF_DIR_PATH", str(root_path() / "conf"))),
"CLIENT_CONFIG_PATH": config_data.get(
"CLIENT_CONFIG_PATH", os.environ.get("CLIENT_CONFIG_PATH", str(root_path() / "conf" / "conf_client.yml"))
),
"TRADE_FEES_CONFIG_PATH": config_data.get(
"TRADE_FEES_CONFIG_PATH",
os.environ.get("TRADE_FEES_CONFIG_PATH", str(root_path() / "conf" / "conf_fee_overrides.yml")),
),
"STRATEGIES_CONF_DIR_PATH": config_data.get(
"STRATEGIES_CONF_DIR_PATH",
os.environ.get("STRATEGIES_CONF_DIR_PATH", str(root_path() / "conf" / "strategies")),
),
"CONNECTORS_CONF_DIR_PATH": config_data.get(
"CONNECTORS_CONF_DIR_PATH",
os.environ.get("CONNECTORS_CONF_DIR_PATH", str(root_path() / "conf" / "connectors")),
),
"SCRIPT_STRATEGY_CONF_DIR_PATH": config_data.get(
"SCRIPT_STRATEGY_CONF_DIR_PATH",
os.environ.get("SCRIPT_STRATEGY_CONF_DIR_PATH", str(root_path() / "conf" / "scripts")),
),
"CONTROLLERS_CONF_DIR_PATH": config_data.get(
"CONTROLLERS_CONF_DIR_PATH",
os.environ.get("CONTROLLERS_CONF_DIR_PATH", str(root_path() / "conf" / "controllers")),
),
"CONF_PREFIX": config_data.get("CONF_PREFIX", os.environ.get("CONF_PREFIX", "conf_")),
"CONF_POSTFIX": config_data.get("CONF_POSTFIX", os.environ.get("CONF_POSTFIX", "_strategy")),
"SCRIPT_STRATEGIES_MODULE": config_data.get(
"SCRIPT_STRATEGIES_MODULE", os.environ.get("SCRIPT_STRATEGIES_MODULE", "scripts")
),
"SCRIPT_STRATEGIES_PATH": config_data.get(
"SCRIPT_STRATEGIES_PATH", os.environ.get("SCRIPT_STRATEGIES_PATH", str(root_path() / "scripts"))
),
"CONTROLLERS_MODULE": config_data.get(
"CONTROLLERS_MODULE", os.environ.get("CONTROLLERS_MODULE", "controllers")
),
"CONTROLLERS_PATH": config_data.get(
"CONTROLLERS_PATH", os.environ.get("CONTROLLERS_PATH", str(root_path() / "controllers"))
),
"DEFAULT_GATEWAY_CERTS_PATH": config_data.get(
"DEFAULT_GATEWAY_CERTS_PATH", os.environ.get("DEFAULT_GATEWAY_CERTS_PATH", str(root_path() / "certs"))
),
"GATEWAY_SSL_CONF_FILE": config_data.get(
"GATEWAY_SSL_CONF_FILE",
os.environ.get("GATEWAY_SSL_CONF_FILE", str(root_path() / "gateway" / "conf" / "ssl.yml")),
),
"GATEAWAY_CA_CERT_PATH": config_data.get(
"GATEAWAY_CA_CERT_PATH", os.environ.get("GATEAWAY_CA_CERT_PATH", str(root_path() / "certs" / "ca_cert.pem"))
),
"GATEAWAY_CLIENT_CERT_PATH": config_data.get(
"GATEAWAY_CLIENT_CERT_PATH",
os.environ.get("GATEAWAY_CLIENT_CERT_PATH", str(root_path() / "certs" / "client_cert.pem")),
),
"GATEAWAY_CLIENT_KEY_PATH": config_data.get(
"GATEAWAY_CLIENT_KEY_PATH",
os.environ.get("GATEAWAY_CLIENT_KEY_PATH", str(root_path() / "certs" / "client_key.pem")),
),
"CONNECTOR_SUBMODULES_THAT_ARE_NOT_CEX_TYPES": config_data.get(
"CONNECTOR_SUBMODULES_THAT_ARE_NOT_CEX_TYPES", ["test_support", "utilities", "gateway"]
),
}


config_values = load_config_values()
KEYFILE_PREFIX = config_values["KEYFILE_PREFIX"]
KEYFILE_POSTFIX = config_values["KEYFILE_POSTFIX"]
ENCYPTED_CONF_POSTFIX = config_values["ENCYPTED_CONF_POSTFIX"]
DEFAULT_LOG_FILE_PATH = config_values["DEFAULT_LOG_FILE_PATH"]
DEFAULT_ETHEREUM_RPC_URL = config_values["DEFAULT_ETHEREUM_RPC_URL"]
TEMPLATE_PATH = config_values["TEMPLATE_PATH"]
CONF_DIR_PATH = config_values["CONF_DIR_PATH"]
CLIENT_CONFIG_PATH = config_values["CLIENT_CONFIG_PATH"]
TRADE_FEES_CONFIG_PATH = config_values["TRADE_FEES_CONFIG_PATH"]
STRATEGIES_CONF_DIR_PATH = config_values["STRATEGIES_CONF_DIR_PATH"]
CONNECTORS_CONF_DIR_PATH = config_values["CONNECTORS_CONF_DIR_PATH"]
SCRIPT_STRATEGY_CONF_DIR_PATH = config_values["SCRIPT_STRATEGY_CONF_DIR_PATH"]
CONTROLLERS_CONF_DIR_PATH = config_values["CONTROLLERS_CONF_DIR_PATH"]
CONF_PREFIX = config_values["CONF_PREFIX"]
CONF_POSTFIX = config_values["CONF_POSTFIX"]
SCRIPT_STRATEGIES_MODULE = config_values["SCRIPT_STRATEGIES_MODULE"]
SCRIPT_STRATEGIES_PATH = config_values["SCRIPT_STRATEGIES_PATH"]
CONTROLLERS_MODULE = config_values["CONTROLLERS_MODULE"]
CONTROLLERS_PATH = config_values["CONTROLLERS_PATH"]
DEFAULT_GATEWAY_CERTS_PATH = config_values["DEFAULT_GATEWAY_CERTS_PATH"]
GATEWAY_SSL_CONF_FILE = config_values["GATEWAY_SSL_CONF_FILE"]
GATEAWAY_CA_CERT_PATH = config_values["GATEAWAY_CA_CERT_PATH"]
GATEAWAY_CLIENT_CERT_PATH = config_values["GATEAWAY_CLIENT_CERT_PATH"]
GATEAWAY_CLIENT_KEY_PATH = config_values["GATEAWAY_CLIENT_KEY_PATH"]
CONNECTOR_SUBMODULES_THAT_ARE_NOT_CEX_TYPES = config_values["CONNECTOR_SUBMODULES_THAT_ARE_NOT_CEX_TYPES"]


class ConnectorType(Enum):
Expand Down
72 changes: 34 additions & 38 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from setuptools.command.build_ext import build_ext
from Cython.Build import cythonize

is_posix = (os.name == "posix")
is_posix = os.name == "posix"

if is_posix:
os_name = subprocess.check_output("uname").decode("utf8")
Expand All @@ -33,19 +33,17 @@ def build_extensions(self):

def main():
cpu_count = os.cpu_count() or 8
version = "20240828"
all_packages = find_packages(include=["hummingbot", "hummingbot.*"], )
version = "20241015"
all_packages = find_packages(
include=["hummingbot", "hummingbot.*"],
)
excluded_paths = [
"hummingbot.connector.gateway.clob_spot.data_sources.injective",
"hummingbot.connector.gateway.clob_perp.data_sources.injective_perpetual"
"hummingbot.connector.gateway.clob_perp.data_sources.injective_perpetual",
]
packages = [pkg for pkg in all_packages if not any(fnmatch.fnmatch(pkg, pattern) for pattern in excluded_paths)]
package_data = {
"hummingbot": [
"core/cpp/*",
"VERSION",
"templates/*TEMPLATE.yml"
],
"hummingbot": ["core/cpp/*", "VERSION", "templates/*TEMPLATE.yml"],
}
install_requires = [
"bidict",
Expand Down Expand Up @@ -125,43 +123,41 @@ def main():
"annotation_typing": False,
}
if os.environ.get("WITHOUT_CYTHON_OPTIMIZATIONS"):
compiler_directives.update({
"optimize.use_switch": False,
"optimize.unpack_method_calls": False,
})
compiler_directives.update(
{
"optimize.use_switch": False,
"optimize.unpack_method_calls": False,
}
)

if is_posix:
cython_kwargs["nthreads"] = cpu_count

if "DEV_MODE" in os.environ:
version += ".dev1"
package_data[""] = [
"*.pxd", "*.pyx", "*.h"
]
package_data["hummingbot"].append("core/cpp/*.cpp")
# if "DEV_MODE" in os.environ:
# version += ".dev1"
package_data[""] = ["*.pxd", "*.pyx", "*.h"]
package_data["hummingbot"].append("core/cpp/*.cpp")
package_data["hummingbot"].append("connector/*.cpp")

if len(sys.argv) > 1 and sys.argv[1] == "build_ext" and is_posix:
sys.argv.append(f"--parallel={cpu_count}")

setup(name="hummingbot",
version=version,
description="Hummingbot",
url="https://github.com/hummingbot/hummingbot",
author="Hummingbot Foundation",
author_email="[email protected]",
license="Apache 2.0",
packages=packages,
package_data=package_data,
install_requires=install_requires,
ext_modules=cythonize(cython_sources, compiler_directives=compiler_directives, **cython_kwargs),
include_dirs=[
np.get_include()
],
scripts=[
"bin/hummingbot_quickstart.py"
],
cmdclass={"build_ext": BuildExt},
)
setup(
name="robotter-hummingbot",
version=version,
description="Hummingbot",
url="https://github.com/robotter-ai/hummingbot",
author="robotter.ai",
author_email="[email protected]",
license="Apache 2.0",
packages=packages,
package_data=package_data,
install_requires=install_requires,
ext_modules=cythonize(cython_sources, compiler_directives=compiler_directives, **cython_kwargs),
include_dirs=[np.get_include()],
scripts=["bin/hummingbot_quickstart.py"],
cmdclass={"build_ext": BuildExt},
)


if __name__ == "__main__":
Expand Down