Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
6 changes: 3 additions & 3 deletions .github/workflows/build-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ jobs:
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-icu-75.1-2-any.pkg.tar.zst
pacman -U --noconfirm mingw-w64-x86_64-icu-75.1-2-any.pkg.tar.zst

- name: Install boost v1.85.0
- name: Install boost v1.87.0
shell: msys2 {0}
run: |
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-boost-1.85.0-4-any.pkg.tar.zst
pacman -U --noconfirm mingw-w64-x86_64-boost-1.85.0-4-any.pkg.tar.zst
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-boost-1.87.0-3-any.pkg.tar.zst
pacman -U --noconfirm mingw-w64-x86_64-boost-1.87.0-3-any.pkg.tar.zst

- name: Install pybind11 v2.13.1
shell: msys2 {0}
Expand Down
21 changes: 18 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,21 @@ jobs:
run: |
pytest --cov=tests --cov-report=xml

- name: Dump container logs
if: always()
run: |
mkdir -p container-logs
for svc in node_1 node_2 xmr_wallet_1 xmr_wallet_2 xmr_wallet_3; do
docker compose -f tests/docker-compose.yml logs --no-color --timestamps "$svc" > "container-logs/$svc.log" 2>&1 || true
done

- name: Upload container logs
if: always()
uses: actions/upload-artifact@v4
with:
name: container-logs-linux
path: container-logs/

- name: Cleanup test environment
if: always()
run: docker compose -f tests/docker-compose.yml down -v
Expand Down Expand Up @@ -165,11 +180,11 @@ jobs:
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-icu-75.1-2-any.pkg.tar.zst
pacman -U --noconfirm mingw-w64-x86_64-icu-75.1-2-any.pkg.tar.zst

- name: Install boost v1.85.0
- name: Install boost v1.87.0
shell: msys2 {0}
run: |
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-boost-1.85.0-4-any.pkg.tar.zst
pacman -U --noconfirm mingw-w64-x86_64-boost-1.85.0-4-any.pkg.tar.zst
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-boost-1.87.0-3-any.pkg.tar.zst
pacman -U --noconfirm mingw-w64-x86_64-boost-1.87.0-3-any.pkg.tar.zst

- name: Install pybind11 v2.13.1
shell: msys2 {0}
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ test_wallets
.codacy
coverage*
.coverage
.cache
.cache
monero.log
144 changes: 92 additions & 52 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,88 +1,128 @@
cmake_minimum_required(VERSION 3.14)
cmake_minimum_required(VERSION 3.15)

project(monero VERSION 0.0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

if (WIN32)
add_definitions( "-D_GLIBCXX_USE_NANOSLEEP=1" ) # "'sleep_for' is not a member of 'std::this_thread'" in gcc 4.7/4.8
add_definitions( "-DWIN32_LEAN_AND_MEAN" )
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj -O2 -fPIC -F/Library/Frameworks -pthread -lcrypto -lcrypt32 -lbcrypt")
else()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -F/Library/Frameworks -pthread")
endif()

project(monero LANGUAGES CXX)

option(ENABLE_COVERAGE "Enable coverage" OFF)

if(ENABLE_COVERAGE)
message(STATUS "Coverage enabled")
add_compile_options(--coverage -O0 -g -fprofile-update=atomic)
add_link_options(--coverage)
message(STATUS "Coverage enabled")
add_compile_options(--coverage -O0 -g -fprofile-update=atomic)
add_link_options(--coverage)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
###################
# monero-cpp
###################

set(MONERO_CPP "${CMAKE_SOURCE_DIR}/external/monero-cpp" CACHE STRING "Monero c++ source directory")
set(MONERO_CPP_SRC "${MONERO_CPP}/src")

###################
# monero-project
###################

set(MONERO_PROJECT "${MONERO_CPP}/external/monero-project" CACHE STRING "Monero project source directory")
set(MONERO_PROJECT_SRC "${MONERO_PROJECT}/src")

############
# Threads
############

find_package(Threads REQUIRED)

############
# Python3
############

find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module)

############
# Pybind11
############

set(PYBIND11_FINDPYTHON ON)
find_package(pybind11 REQUIRED)

############
# Boost
############

set(Boost_NO_BOOST_CMAKE 1)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED COMPONENTS system thread serialization filesystem)
set(BOOST_COMPONENTS thread serialization filesystem)

# Find Boost headers
set(BOOST_MIN_VER 1.62)
find_package(Boost ${BOOST_MIN_VER} QUIET REQUIRED)

# Boost System is header-only since 1.69
if (Boost_VERSION_STRING VERSION_LESS 1.69.0)
list(APPEND BOOST_COMPONENTS system)
endif()

find_package(Boost ${BOOST_MIN_VER} QUIET REQUIRED COMPONENTS ${BOOST_COMPONENTS})
message(STATUS "Boost components: ${BOOST_COMPONENTS}")
message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIR}")

############
# OpenSSL
############

find_package(OpenSSL REQUIRED)
message(STATUS "Using OpenSSL include dir at ${OPENSSL_INCLUDE_DIR}")

if (WIN32)
list(APPEND OPENSSL_LIBRARIES ws2_32 crypt32 bcrypt)
endif()

set(SOURCES
########################
# Build python library
########################

set(LIBRARY_SRC_FILES
src/cpp/common/py_monero_common.cpp
src/cpp/daemon/py_monero_daemon_model.cpp
src/cpp/daemon/py_monero_daemon_rpc_model.cpp
src/cpp/daemon/py_monero_daemon_rpc.cpp
src/cpp/wallet/py_monero_wallet_model.cpp
src/cpp/wallet/py_monero_wallet.cpp
src/cpp/wallet/py_monero_wallet_rpc_model.cpp
src/cpp/wallet/py_monero_wallet_rpc.cpp
src/cpp/utils/py_monero_utils.cpp
src/cpp/py_monero.cpp
)

include_directories(
${pybind11_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/external/monero-cpp/src
${CMAKE_CURRENT_SOURCE_DIR}/external/monero-cpp/external/monero-project/src
${CMAKE_CURRENT_SOURCE_DIR}/external/monero-cpp/external/monero-project/contrib/epee/include
${CMAKE_CURRENT_SOURCE_DIR}/external/monero-cpp/external/monero-project/external
${CMAKE_CURRENT_SOURCE_DIR}/external/monero-cpp/external/monero-project/external/easylogging++
${CMAKE_CURRENT_SOURCE_DIR}/external/monero-cpp/external/monero-project/external/rapidjson/include
${CMAKE_CURRENT_SOURCE_DIR}/src/cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/common
${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/daemon
${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/wallet
${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/utils
)

link_directories(
${CMAKE_CURRENT_SOURCE_DIR}/external/monero-cpp/build
${MONERO_CPP}/build
)

pybind11_add_module(monero ${SOURCES})
pybind11_add_module(monero ${LIBRARY_SRC_FILES})

if (WIN32)
target_compile_options(monero PRIVATE -Wa,-mbig-obj)
endif()

target_include_directories(monero PRIVATE
src/cpp
"${MONERO_CPP_SRC}/"
"${MONERO_PROJECT_SRC}/"
"${MONERO_PROJECT}/contrib/epee/include"
"${MONERO_PROJECT}/external"
"${MONERO_PROJECT}/external/easylogging++"
"${MONERO_PROJECT}/external/rapidjson/include"
${pybind11_INCLUDE_DIR}
${Boost_INCLUDE_DIR}
${OPENSSL_INCLUDE_DIR}
)

target_link_libraries(monero PRIVATE
monero-cpp

Boost::system
Boost::thread
Boost::serialization
Boost::filesystem

OpenSSL::SSL
OpenSSL::Crypto
Threads::Threads
${Boost_LIBRARIES}
${OPENSSL_LIBRARIES}
)

if (WIN32)
target_link_libraries(monero PRIVATE
ws2_32
crypt32
bcrypt
)
endif()

install(TARGETS monero DESTINATION .)
26 changes: 10 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
> monero-python is currently under maintenance, expect bugs and breaking changes.
> The maintenance of this project has been generously funded by the [Monero CCS](https://ccs.getmonero.org/proposals/everoddandeven-monero-python-maintenance.html).

A Python library for creating Monero applications using RPC and Python bindings to [monero v0.18.4.4 'Fluorine Fermi'](https://github.com/monero-project/monero/tree/v0.18.4.4).
A Python library for creating Monero applications using RPC and Python bindings to [monero v0.18.5.0 'Fluorine Fermi'](https://github.com/monero-project/monero/tree/v0.18.5.0).

* Supports wallet and daemon RPC clients.
* Supports client-side wallets using Python bindings.
Expand Down Expand Up @@ -102,11 +102,6 @@ wallet_full.close(True)

sudo apt install -y python3-all python3-pip python3-pybind11
```
```bash
# Fedora/RedHat

sudo dnf install -y python3-all python3-pip python3-pybind11
```

2. Clone the project repository:
```bash
Expand All @@ -125,7 +120,11 @@ wallet_full.close(True)
cmake ..
make
```
6. Or build and install monero-python with pip: `pip3 install . --break-system-packages`
6. Or build and install monero-python with pip:
```bash
pip3 install . --break-system-packages
```
7. Or run build script: `./bin/build_libmonero_python.sh`

### Linux Docker Build

Expand Down Expand Up @@ -165,8 +164,8 @@ wallet_full.close(True)
pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-unbound mingw-w64-x86_64-protobuf git mingw-w64-x86_64-libusb gettext base-devel
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-icu-75.1-2-any.pkg.tar.zst
pacman -U mingw-w64-x86_64-icu-75.1-2-any.pkg.tar.zst
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-boost-1.85.0-4-any.pkg.tar.zst
pacman -U mingw-w64-x86_64-boost-1.85.0-4-any.pkg.tar.zst
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-boost-1.87.0-3-any.pkg.tar.zst
pacman -U mingw-w64-x86_64-boost-1.87.0-3-any.pkg.tar.zst
wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-pybind11-2.13.6-2-any.pkg.tar.zst
pacman -U mingw-w64-x86_64-pybind11-2.13.6-2-any.pkg.tar.zst
```
Expand Down Expand Up @@ -196,7 +195,7 @@ wallet_full.close(True)
3. Start monero-wallet-rpc, e.g.: `./monero-wallet-rpc --daemon-address http://localhost:38081 --stagenet --rpc-bind-port 38083 --rpc-login rpc_user:abc123 --wallet-dir ./`

> [!NOTE]
> On Windows, if you want to use native wallets instead of monero-wallet-rpc, or if you want to process binary data, first install MSYS2:
> On Windows, first install MSYS2:
> 1. Install [MSYS2](https://www.msys2.org/).
> 2. Environment variables > System variables > Path > Edit > New > C:\msys64\mingw64\bin

Expand All @@ -220,11 +219,6 @@ For example: `export LD_PRELOAD=/path/to/libjemalloc.a` then run your app.

sudo apt install -y python3-pytest python3-pytest-rerunfailures
```
```bash
# System-wide installation Fedora/RedHat

sudo dnf install -y python3-pytest python3-pytest-rerunfailures
```
2. Clone the project repository:
```bash
git clone --recurse-submodules https://github.com/everoddandeven/monero-python.git
Expand All @@ -233,7 +227,7 @@ For example: `export LD_PRELOAD=/path/to/libjemalloc.a` then run your app.
```
3. Setup docker test environment
```bash
docker compose -f tests/docker-compose.yml up -d node_1 node_2 xmr_wallet_1 xmr_wallet_2
docker compose -f tests/docker-compose.yml up -d node_1 node_2 xmr_wallet_1 xmr_wallet_2 xmr_wallet_3
```
4. Or start RPC servers locally:
1. Download and install [Monero CLI](https://web.getmonero.org/downloads/).
Expand Down
2 changes: 1 addition & 1 deletion external/monero-cpp
Submodule monero-cpp updated 92 files
+203 −0 .github/workflows/build.yml
+27 −1 CMakeLists.txt
+17 −14 README.md
+31 −3 bin/build_libmonero_cpp.sh
+50 −49 docs/doxygen/classmonero_1_1monero__wallet-members.html
+42 −7 docs/doxygen/classmonero_1_1monero__wallet.html
+56 −55 docs/doxygen/classmonero_1_1monero__wallet__full-members.html
+64 −17 docs/doxygen/classmonero_1_1monero__wallet__full.html
+51 −50 docs/doxygen/classmonero_1_1monero__wallet__keys-members.html
+4 −2 docs/doxygen/classmonero_1_1monero__wallet__keys.html
+7 −4 docs/doxygen/doxygen_crawl.html
+2 −1 docs/doxygen/functions_func_i.html
+2 −2 docs/doxygen/functions_func_o.html
+1 −1 docs/doxygen/functions_func_t.html
+2 −1 docs/doxygen/functions_i.html
+2 −2 docs/doxygen/functions_o.html
+1 −1 docs/doxygen/functions_t.html
+37 −37 docs/doxygen/hierarchy.html
+161 −159 docs/doxygen/monero__daemon__model_8h_source.html
+2 −2 docs/doxygen/monero__utils_8h_source.html
+31 −24 docs/doxygen/monero__wallet_8h_source.html
+293 −288 docs/doxygen/monero__wallet__full_8h_source.html
+6 −6 docs/doxygen/monero__wallet__keys_8h_source.html
+434 −432 docs/doxygen/monero__wallet__model_8h_source.html
+11 −10 docs/doxygen/search/all_6.js
+2 −2 docs/doxygen/search/all_9.js
+1 −1 docs/doxygen/search/all_d.js
+11 −10 docs/doxygen/search/functions_6.js
+2 −2 docs/doxygen/search/functions_8.js
+1 −1 docs/doxygen/search/functions_c.js
+1 −0 docs/doxygen/structmonero_1_1monero__account-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__address__book__entry-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__block-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__block__header-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__check-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__check__reserve-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__check__tx-members.html
+3 −1 docs/doxygen/structmonero_1_1monero__destination-members.html
+50 −3 docs/doxygen/structmonero_1_1monero__destination.html
+ docs/doxygen/structmonero_1_1monero__destination.png
+1 −0 docs/doxygen/structmonero_1_1monero__incoming__transfer-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__integrated__address-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__key__image-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__key__image__import__result-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__message__signature__result-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__multisig__info-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__multisig__init__result-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__multisig__sign__result-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__outgoing__transfer-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__output-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__output__query-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__output__wallet-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__rpc__connection-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__subaddress-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__sync__result-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__transfer-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__transfer__query-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__tx-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__tx__config-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__tx__query-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__tx__set-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__tx__wallet-members.html
+1 −0 docs/doxygen/structmonero_1_1monero__version-members.html
+12 −10 docs/doxygen/structmonero_1_1monero__wallet__config-members.html
+3 −0 docs/doxygen/structmonero_1_1monero__wallet__config.html
+1 −0 docs/doxygen/structmonero_1_1serializable__struct-members.html
+19 −18 docs/doxygen/structmonero_1_1serializable__struct.html
+ docs/doxygen/structmonero_1_1serializable__struct.png
+1 −1 external/monero-project
+437 −0 src/common/monero_rpc_connection.cpp
+339 −0 src/common/monero_rpc_connection.h
+730 −0 src/daemon/monero_daemon.h
+797 −23 src/daemon/monero_daemon_model.cpp
+384 −15 src/daemon/monero_daemon_model.h
+806 −0 src/daemon/monero_daemon_rpc.cpp
+176 −0 src/daemon/monero_daemon_rpc.h
+1,252 −0 src/daemon/monero_daemon_rpc_model.cpp
+276 −0 src/daemon/monero_daemon_rpc_model.h
+74 −0 src/utils/gen_utils.cpp
+51 −10 src/utils/gen_utils.h
+257 −18 src/utils/monero_utils.cpp
+42 −8 src/utils/monero_utils.h
+51 −6 src/wallet/monero_wallet.h
+179 −169 src/wallet/monero_wallet_full.cpp
+11 −9 src/wallet/monero_wallet_full.h
+7 −7 src/wallet/monero_wallet_keys.cpp
+307 −1 src/wallet/monero_wallet_model.cpp
+93 −2 src/wallet/monero_wallet_model.h
+2,083 −0 src/wallet/monero_wallet_rpc.cpp
+276 −0 src/wallet/monero_wallet_rpc.h
+1,863 −0 src/wallet/monero_wallet_rpc_model.cpp
+495 −0 src/wallet/monero_wallet_rpc_model.h
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ dependencies = [

[build-system]
requires = [
"scikit-build-core>=0.5",
"scikit-build-core>=0.10",
"pybind11>=2.12",
"cmake>=3.20",
"ninja"
]
build-backend = "scikit_build_core.build"

[tool.scikit-build]
cmake.verbose = true
build.verbose = true
cmake.build-type = "Release"
Loading
Loading