eth-portfolio-temp 0.1.1.dev0__tar.gz → 0.2.14__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/.github/workflows/black.yaml +6 -3
  2. eth_portfolio_temp-0.2.14/.github/workflows/compile.yaml +65 -0
  3. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/.github/workflows/deploy_docs.yaml +7 -7
  4. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/.github/workflows/mypy.yaml +2 -2
  5. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/.github/workflows/release.yaml +54 -38
  6. eth_portfolio_temp-0.2.14/PKG-INFO +26 -0
  7. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/README.md +2 -2
  8. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/exporter.rst +3 -0
  9. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_cache.py +2 -2
  10. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_db/utils.py +6 -8
  11. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_decimal.py +11 -10
  12. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_ledgers/address.py +1 -1
  13. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_loaders/token_transfer.py +1 -1
  14. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_loaders/transaction.py +1 -1
  15. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_loaders/utils.py +1 -1
  16. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_shitcoins.py +52 -0
  17. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_utils.py +12 -10
  18. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_ydb/token_transfers.py +6 -11
  19. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/buckets.py +1 -1
  20. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/portfolio.py +1 -1
  21. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/lending/liquity.py +1 -1
  22. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/lending/maker.py +13 -14
  23. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/structs/structs.py +2 -2
  24. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/typing/__init__.py +4 -4
  25. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/_portfolio.py +51 -38
  26. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/_utils.py +20 -6
  27. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/balances.py +7 -4
  28. eth_portfolio_temp-0.2.14/eth_portfolio_scripts/docker/check.py +67 -0
  29. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/docker/docker-compose.yaml +2 -2
  30. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/docker/docker_compose.py +11 -8
  31. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/main.py +6 -0
  32. eth_portfolio_temp-0.2.14/eth_portfolio_temp.egg-info/PKG-INFO +26 -0
  33. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_temp.egg-info/SOURCES.txt +1 -0
  34. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_temp.egg-info/requires.txt +5 -4
  35. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_temp.egg-info/top_level.txt +1 -1
  36. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/pyproject.toml +4 -3
  37. eth_portfolio_temp-0.2.14/renovate.json +6 -0
  38. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/requirements.txt +5 -4
  39. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/setup.py +2 -1
  40. eth_portfolio_temp-0.1.1.dev0/.github/workflows/compile.yaml +0 -48
  41. eth_portfolio_temp-0.1.1.dev0/PKG-INFO +0 -8
  42. eth_portfolio_temp-0.1.1.dev0/eth_portfolio_scripts/docker/check.py +0 -56
  43. eth_portfolio_temp-0.1.1.dev0/eth_portfolio_temp.egg-info/PKG-INFO +0 -8
  44. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/.env.sample +0 -0
  45. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/.gitignore +0 -0
  46. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/Makefile +0 -0
  47. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/brownie-config.yaml +0 -0
  48. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/Makefile +0 -0
  49. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/alabaster.css +0 -0
  50. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/basic.css +0 -0
  51. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/custom.css +0 -0
  52. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/doctools.js +0 -0
  53. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/documentation_options.js +0 -0
  54. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/file.png +0 -0
  55. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/language_data.js +0 -0
  56. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/minus.png +0 -0
  57. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/plus.png +0 -0
  58. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/pygments.css +0 -0
  59. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/searchtools.js +0 -0
  60. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/_build/html/_static/sphinx_highlight.js +0 -0
  61. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/caching.rst +0 -0
  62. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/conf.py +0 -0
  63. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/index.rst +0 -0
  64. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/make.bat +0 -0
  65. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/docs/new-protocols.rst +0 -0
  66. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/__init__.py +0 -0
  67. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_argspec.py +0 -0
  68. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_config.py +0 -0
  69. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_db/__init__.py +0 -0
  70. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_db/decorators.py +0 -0
  71. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_db/entities.py +0 -0
  72. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_decorators.py +0 -0
  73. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_exceptions.py +0 -0
  74. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_ledgers/__init__.py +0 -0
  75. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_ledgers/portfolio.py +0 -0
  76. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_loaders/__init__.py +0 -0
  77. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_loaders/_nonce.py +0 -0
  78. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_loaders/balances.py +0 -0
  79. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_stableish.py +0 -0
  80. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_submodules.py +0 -0
  81. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/_ydb/__init__.py +0 -0
  82. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/address.py +0 -0
  83. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/constants.py +0 -0
  84. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/__init__.py +0 -0
  85. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/_base.py +0 -0
  86. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/convex.py +0 -0
  87. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/dsr.py +0 -0
  88. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/lending/README.md +0 -0
  89. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/lending/__init__.py +0 -0
  90. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/lending/_base.py +0 -0
  91. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/lending/compound.py +0 -0
  92. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/lending/unit.py +0 -0
  93. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/protocols/liquity.py +0 -0
  94. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/py.typed +0 -0
  95. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/structs/__init__.py +0 -0
  96. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/structs/modified.py +0 -0
  97. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio/typing/balance/single.py +0 -0
  98. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/__init__.py +0 -0
  99. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/_args.py +0 -0
  100. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/_logging.py +0 -0
  101. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/docker/.grafana/dashboards/Portfolio/Balances.json +0 -0
  102. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/docker/.grafana/dashboards/dashboards.yaml +0 -0
  103. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/docker/.grafana/datasources/datasources.yml +0 -0
  104. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/docker/__init__.py +0 -0
  105. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/py.typed +0 -0
  106. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/victoria/__init__.py +0 -0
  107. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_scripts/victoria/types.py +0 -0
  108. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_temp.egg-info/dependency_links.txt +0 -0
  109. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_temp.egg-info/entry_points.txt +0 -0
  110. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/eth_portfolio_temp.egg-info/not-zip-safe +0 -0
  111. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/setup.cfg +0 -0
  112. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/tests/_test_completeness.py +0 -0
  113. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/tests/conftest.py +0 -0
  114. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/tests/fixtures.py +0 -0
  115. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/tests/protocols/test_external.py +0 -0
  116. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/tests/scripts/test_utils.py +0 -0
  117. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/tests/test_portfolio.py +0 -0
  118. {eth_portfolio_temp-0.1.1.dev0 → eth_portfolio_temp-0.2.14}/tests/test_typing.py +0 -0
@@ -4,6 +4,9 @@ on:
4
4
  pull_request:
5
5
  branches:
6
6
  - master
7
+ paths-ignore:
8
+ - '.github/workflows/**'
9
+ - '!.github/workflows/black.yaml'
7
10
 
8
11
  jobs:
9
12
  format:
@@ -11,14 +14,14 @@ jobs:
11
14
 
12
15
  steps:
13
16
  - name: Checkout code
14
- uses: actions/checkout@v3
17
+ uses: actions/checkout@v5
15
18
  with:
16
19
  ref: ${{ github.head_ref }} # Check out the PR branch
17
20
 
18
21
  - name: Set up Python
19
- uses: actions/setup-python@v4
22
+ uses: actions/setup-python@v6
20
23
  with:
21
- python-version: '3.12'
24
+ python-version: '3.13'
22
25
 
23
26
  - name: Install Black
24
27
  run: pip install black
@@ -0,0 +1,65 @@
1
+ name: Compile
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - master
7
+ paths-ignore:
8
+ - '.github/workflows/**'
9
+ - '!.github/workflows/compile.yaml'
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ build-ubuntu:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: Checkout code
20
+ uses: actions/checkout@v5
21
+ with:
22
+ # Check out the PR branch
23
+ ref: ${{ github.head_ref }}
24
+
25
+ - name: Set up Python 3.13
26
+ uses: actions/setup-python@v6
27
+ with:
28
+ python-version: "3.13"
29
+
30
+ - name: Delete existing build files
31
+ run: rm -rf build
32
+
33
+ - name: Install Eth Portfolio
34
+ run: pip install .
35
+
36
+ - name: Normalize C files for diffchecking
37
+ # This makes it much easier to diffcheck changes in the C files
38
+ run: |
39
+ # Insert DIFFCHECK_PLACEHOLDER macro at the top if not present
40
+ for f in build/*.c; do
41
+ if ! grep -q 'DIFFCHECK_PLACEHOLDER' "$f"; then
42
+ sed -i '1i#ifndef DIFFCHECK_PLACEHOLDER\n#define DIFFCHECK_PLACEHOLDER 0\n#endif' "$f"
43
+ fi
44
+ done
45
+ # Replace line number in CPy_AddTraceback with macro
46
+ sed -i 's/\(CPy_AddTraceback([^,]*, *[^,]*, *\)[0-9]\+\(, *[^)]*)\)/\1DIFFCHECK_PLACEHOLDER\2/g' build/*.c
47
+ # Replace index in CPyStatics[...] with macro
48
+ sed -i 's/CPyStatics\[[0-9]\+\]/CPyStatics[DIFFCHECK_PLACEHOLDER]/g' build/*.c
49
+
50
+ - name: Check for changes
51
+ run: |
52
+ if [[ -n $(git status --porcelain) ]]; then
53
+ echo "changes_detected=true" >> $GITHUB_ENV
54
+ else
55
+ echo "changes_detected=false" >> $GITHUB_ENV
56
+ fi
57
+
58
+ - name: Commit changes
59
+ if: env.changes_detected == 'true'
60
+ run: |
61
+ git config --local user.name "github-actions[bot]"
62
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
63
+ git add .
64
+ git commit -m "chore: compile C files for source control"
65
+ git push
@@ -16,12 +16,12 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
18
  - name: Check out code
19
- uses: actions/checkout@v2
19
+ uses: actions/checkout@v5
20
20
 
21
21
  - name: Set up Python
22
- uses: actions/setup-python@v2
22
+ uses: actions/setup-python@v6
23
23
  with:
24
- python-version: '3.10'
24
+ python-version: '3.12'
25
25
 
26
26
  - name: Install dependencies
27
27
  run: |
@@ -44,21 +44,21 @@ jobs:
44
44
  BROWNIE_NETWORK_ID=mainnet ETHERSCAN_TOKEN=${{ secrets.ETHERSCAN_TOKEN }} make html
45
45
 
46
46
  - name: Deploy to GitHub Pages
47
- uses: peaceiris/actions-gh-pages@v3
47
+ uses: peaceiris/actions-gh-pages@v4
48
48
  with:
49
49
  github_token: ${{ secrets.GITHUB_TOKEN }}
50
50
  publish_dir: ./docs/_build/html
51
51
 
52
52
  - name: Checkout
53
- uses: actions/checkout@v4
53
+ uses: actions/checkout@v5
54
54
  with:
55
55
  ref: gh-pages
56
56
 
57
57
  - name: Setup Pages
58
- uses: actions/configure-pages@v4
58
+ uses: actions/configure-pages@v5
59
59
 
60
60
  - name: Upload artifact
61
- uses: actions/upload-pages-artifact@v3
61
+ uses: actions/upload-pages-artifact@v4
62
62
  with:
63
63
  # Upload entire repository
64
64
  path: '.'
@@ -20,13 +20,13 @@ jobs:
20
20
 
21
21
  steps:
22
22
  - name: Checkout
23
- uses: actions/checkout@v4.1.4
23
+ uses: actions/checkout@v5
24
24
  with:
25
25
  fetch-depth: 0
26
26
  persist-credentials: false
27
27
 
28
28
  - name: Setup Python (faster than using Python container)
29
- uses: actions/setup-python@v5
29
+ uses: actions/setup-python@v6
30
30
  with:
31
31
  python-version: ${{ matrix.pyversion }}
32
32
 
@@ -5,6 +5,11 @@ on:
5
5
  branches:
6
6
  - master
7
7
  types: [published]
8
+ workflow_dispatch:
9
+ inputs:
10
+ fake_tag:
11
+ description: 'Fake tag name to use for dry run (e.g. v2.3.4)'
12
+ required: true
8
13
 
9
14
  jobs:
10
15
  build_wheels:
@@ -41,15 +46,6 @@ jobs:
41
46
  cibw_archs_linux: x86_64
42
47
  artifact_name: "wheels-ubuntu-latest-musllinux-x64"
43
48
 
44
- # ----------------------------------------------------
45
- # musllinux 32-bit
46
- # ----------------------------------------------------
47
- - os: ubuntu-latest
48
- build_type: musllinux-x86
49
- cibw_build: "*musllinux*"
50
- cibw_archs_linux: i686
51
- artifact_name: "wheels-ubuntu-latest-musllinux-x86"
52
-
53
49
  # ----------------------------------------------------
54
50
  # macOS (64-bit only)
55
51
  # ----------------------------------------------------
@@ -79,16 +75,27 @@ jobs:
79
75
 
80
76
  steps:
81
77
  - name: Check out code
82
- uses: actions/checkout@v3
78
+ uses: actions/checkout@v5
83
79
  with:
84
80
  fetch-depth: 0
85
- fetch-tags: true
86
- ref: refs/tags/${{ github.event.release.tag_name }}
81
+
82
+ # ----------------------------------------------------
83
+ # Extract version from git tag or use fake tag for dry run (strip leading 'v')
84
+ # ----------------------------------------------------
85
+ - name: Extract version from tag
86
+ id: get_version
87
+ shell: bash
88
+ run: |
89
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
90
+ echo "version=$(echo '${{ github.event.inputs.fake_tag }}' | sed 's/^v//')" >> $GITHUB_OUTPUT
91
+ else
92
+ echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
93
+ fi
87
94
 
88
95
  - name: Set up Python
89
- uses: actions/setup-python@v4
96
+ uses: actions/setup-python@v6
90
97
  with:
91
- python-version: "3.11"
98
+ python-version: "3.13"
92
99
 
93
100
  - name: Install cibuildwheel
94
101
  run: |
@@ -104,13 +111,15 @@ jobs:
104
111
  CIBW_ARCHS_WINDOWS: ${{ matrix.cibw_archs_windows || '' }}
105
112
  # Which wheels to build for Linux (manylinux vs. musllinux)
106
113
  CIBW_BUILD: ${{ matrix.cibw_build || '' }}
107
- # Download wheels for deps, don't build from source
108
- PIP_ONLY_BINARY: ":all:"
114
+ # Use version from git tag (stripped 'v')
115
+ SETUPTOOLS_SCM_PRETEND_VERSION: ${{ steps.get_version.outputs.version }}
116
+ # Pass version into Docker for Linux builds
117
+ CIBW_ENVIRONMENT: "SETUPTOOLS_SCM_PRETEND_VERSION=${{ steps.get_version.outputs.version }}"
109
118
  run: |
110
119
  python -m cibuildwheel --output-dir wheelhouse
111
120
 
112
121
  - name: Upload wheels
113
- uses: actions/upload-artifact@v4
122
+ uses: actions/upload-artifact@v5
114
123
  with:
115
124
  name: ${{ matrix.artifact_name }}
116
125
  path: wheelhouse/*.whl
@@ -121,16 +130,27 @@ jobs:
121
130
  runs-on: ubuntu-latest
122
131
  steps:
123
132
  - name: Check out code
124
- uses: actions/checkout@v3
133
+ uses: actions/checkout@v5
125
134
  with:
126
135
  fetch-depth: 0
127
- fetch-tags: true
128
- ref: refs/tags/${{ github.event.release.tag_name }}
136
+
137
+ # ----------------------------------------------------
138
+ # Extract version from git tag or use fake tag for dry run (strip leading 'v')
139
+ # ----------------------------------------------------
140
+ - name: Extract version from tag
141
+ id: get_version
142
+ shell: bash
143
+ run: |
144
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
145
+ echo "version=$(echo '${{ github.event.inputs.fake_tag }}' | sed 's/^v//')" >> $GITHUB_OUTPUT
146
+ else
147
+ echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
148
+ fi
129
149
 
130
150
  - name: Set up Python
131
- uses: actions/setup-python@v4
151
+ uses: actions/setup-python@v6
132
152
  with:
133
- python-version: "3.11"
153
+ python-version: "3.13"
134
154
 
135
155
  - name: Install dependencies
136
156
  run: |
@@ -138,58 +158,55 @@ jobs:
138
158
  pip install setuptools wheel twine mypy[mypyc] types-aiofiles
139
159
 
140
160
  - name: Build sdist
141
- run: |
142
- python setup.py sdist
161
+ env:
162
+ # Use version from git tag (stripped 'v')
163
+ SETUPTOOLS_SCM_PRETEND_VERSION: ${{ steps.get_version.outputs.version }}
164
+ run: python setup.py sdist
143
165
 
144
166
  # ----------------------------------------------------
145
167
  # Download wheels built on each runner
146
168
  # ----------------------------------------------------
147
169
  - name: Download manylinux 64-bit wheels
148
- uses: actions/download-artifact@v4
170
+ uses: actions/download-artifact@v6
149
171
  with:
150
172
  name: "wheels-ubuntu-latest-manylinux-x64"
151
173
  path: wheelhouse/linux-many-x64
152
174
 
153
175
  - name: Download manylinux 32-bit wheels
154
- uses: actions/download-artifact@v4
176
+ uses: actions/download-artifact@v6
155
177
  with:
156
178
  name: "wheels-ubuntu-latest-manylinux-x86"
157
179
  path: wheelhouse/linux-many-x86
158
180
 
159
181
  - name: Download musllinux 64-bit wheels
160
- uses: actions/download-artifact@v4
182
+ uses: actions/download-artifact@v6
161
183
  with:
162
184
  name: "wheels-ubuntu-latest-musllinux-x64"
163
185
  path: wheelhouse/linux-musl-x64
164
186
 
165
- - name: Download musllinux 32-bit wheels
166
- uses: actions/download-artifact@v4
167
- with:
168
- name: "wheels-ubuntu-latest-musllinux-x86"
169
- path: wheelhouse/linux-musl-x86
170
-
171
187
  - name: Download macOS wheels
172
- uses: actions/download-artifact@v4
188
+ uses: actions/download-artifact@v6
173
189
  with:
174
190
  name: "wheels-macos-latest"
175
191
  path: wheelhouse/macos
176
192
 
177
193
  - name: Download Windows 64-bit wheels
178
- uses: actions/download-artifact@v4
194
+ uses: actions/download-artifact@v6
179
195
  with:
180
196
  name: "wheels-windows-latest-x64"
181
197
  path: wheelhouse/windows-x64
182
198
 
183
199
  - name: Download Windows 32-bit wheels
184
- uses: actions/download-artifact@v4
200
+ uses: actions/download-artifact@v6
185
201
  with:
186
202
  name: "wheels-windows-latest-x86"
187
203
  path: wheelhouse/windows-x86
188
204
 
189
205
  # ----------------------------------------------------
190
- # Publish all built artifacts to PyPI
206
+ # Publish sdist and wheels to PyPI
191
207
  # ----------------------------------------------------
192
208
  - name: Publish sdist and wheels to PyPI
209
+ if: ${{ github.event_name != 'workflow_dispatch' }}
193
210
  env:
194
211
  TWINE_USERNAME: __token__
195
212
  TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
@@ -199,7 +216,6 @@ jobs:
199
216
  wheelhouse/linux-many-x64/*.whl \
200
217
  wheelhouse/linux-many-x86/*.whl \
201
218
  wheelhouse/linux-musl-x64/*.whl \
202
- wheelhouse/linux-musl-x86/*.whl \
203
219
  wheelhouse/macos/*.whl \
204
220
  wheelhouse/windows-x64/*.whl \
205
221
  wheelhouse/windows-x86/*.whl
@@ -0,0 +1,26 @@
1
+ Metadata-Version: 2.4
2
+ Name: eth_portfolio_temp
3
+ Version: 0.2.14
4
+ Summary: eth-portfolio makes it easy to analyze your portfolio.
5
+ Home-page: https://github.com/BobTheBuidler/eth-portfolio
6
+ Author: BobTheBuidler
7
+ Author-email: bobthebuidlerdefi@gmail.com
8
+ Requires-Python: >=3.10,<3.14
9
+ Requires-Dist: checksum_dict>=2.1.7
10
+ Requires-Dist: dank_mids>=4.20.154
11
+ Requires-Dist: eth-brownie<1.23,>=1.22.0.dev0
12
+ Requires-Dist: eth_retry<1,>=0.3.4
13
+ Requires-Dist: evmspec>=0.4.1
14
+ Requires-Dist: ez-a-sync>=0.32.27
15
+ Requires-Dist: faster-async-lru==2.0.5
16
+ Requires-Dist: faster-eth-utils
17
+ Requires-Dist: numpy<3
18
+ Requires-Dist: pandas<3,>=1.4.3
19
+ Requires-Dist: typed-envs>=0.0.9
20
+ Requires-Dist: ypricemagic<5,>=4.10.0
21
+ Dynamic: author
22
+ Dynamic: author-email
23
+ Dynamic: home-page
24
+ Dynamic: requires-dist
25
+ Dynamic: requires-python
26
+ Dynamic: summary
@@ -2,8 +2,8 @@
2
2
  Use `eth-portfolio` to output information about your portfolio in a streamlined, speed-optimized way.
3
3
 
4
4
  ### Requirements
5
- - Python 3.9 or higher.
6
- - At least 16GB of RAM.
5
+ - Python 3.10 or higher.
6
+ - At least 16GB of RAM, 32GB for Base chain.
7
7
 
8
8
  ### Prerequisites
9
9
  - First, you will need to bring your own archive node. This can be one you run yourself, or one from one of the common providers (Tenderly, Alchemy, QuickNode, etc.)
@@ -33,6 +33,9 @@ The Portfolio Exporter supports several command-line options to customize its be
33
33
  - ``--interval <interval>``
34
34
  The time interval between datapoints. default: 6h
35
35
 
36
+ - ``--concurrency <concurrency>``
37
+ The max number of historical blocks to export concurrently. default: 40
38
+
36
39
  - ``--first-tx-block <block>``
37
40
  The block of your portfolio's first transaction, if known. This value, if provided, allows us to speed up processing of your data by limiting the block range we need to query. If not provided, the whole blockchain will be scanned. default: 0
38
41
 
@@ -30,7 +30,7 @@ def cache_to_disk(fn: Callable[P, T]) -> Callable[P, T]:
30
30
  cache_path_for_fn = f"{BASE_PATH}{fn.__module__.replace('.', '/')}/{name}"
31
31
  logger = getLogger(f"eth_portfolio.cache_to_disk.{name}")
32
32
 
33
- def get_cache_file_path(args, kwargs):
33
+ def get_cache_file_path(args: tuple[Any, ...], kwargs: dict[str, Any]) -> str:
34
34
  # Create a unique filename based on the function arguments
35
35
  key = md5(dumps((args, sorted(kwargs.items())))).hexdigest()
36
36
  return join(cache_path_for_fn, f"{key}.json")
@@ -46,7 +46,7 @@ def cache_to_disk(fn: Callable[P, T]) -> Callable[P, T]:
46
46
 
47
47
  queue: PriorityQueue = PriorityQueue()
48
48
 
49
- async def cache_deco_worker_coro(func) -> NoReturn:
49
+ async def cache_deco_worker_coro(func: Callable[..., Any]) -> NoReturn:
50
50
  try:
51
51
  while True:
52
52
  _, fut, cache_path, args, kwargs = await queue.get()
@@ -7,8 +7,7 @@ import evmspec
7
7
  import y._db.common
8
8
  import y._db.config as config
9
9
  from a_sync import PruningThreadPoolExecutor, a_sync
10
- from brownie import chain
11
- from eth_typing import ChecksumAddress
10
+ from eth_typing import ChecksumAddress, HexAddress
12
11
  from evmspec.data import _decode_hook
13
12
  from logging import getLogger
14
13
  from msgspec import ValidationError, json
@@ -32,7 +31,6 @@ from eth_portfolio._db.decorators import break_locks, requery_objs_on_diff_tx_er
32
31
  from eth_portfolio._db.entities import (
33
32
  AddressExtended,
34
33
  BlockExtended,
35
- ContractExtended,
36
34
  TokenExtended,
37
35
  )
38
36
  from eth_portfolio._decimal import Decimal
@@ -42,7 +40,7 @@ from eth_portfolio.typing import _P, _T, Fn
42
40
  logger = getLogger(__name__)
43
41
 
44
42
 
45
- def __bind():
43
+ def __bind() -> None:
46
44
  try:
47
45
  db.bind(**config.connection_settings)
48
46
  except BindingError as e:
@@ -176,7 +174,7 @@ def ensure_block(block: int) -> None:
176
174
  # )
177
175
 
178
176
 
179
- def is_token(address) -> bool:
177
+ def is_token(address: ChecksumAddress) -> bool:
180
178
  if address == EEE_ADDRESS:
181
179
  return False
182
180
  # with suppress(NonStandardERC20):
@@ -188,7 +186,7 @@ def is_token(address) -> bool:
188
186
  return get_event_loop().run_until_complete(_is_token(address))
189
187
 
190
188
 
191
- async def _is_token(address) -> bool:
189
+ async def _is_token(address: HexAddress) -> bool:
192
190
  # just breaking a weird lock, dont mind me
193
191
  if retval := await get_event_loop().run_in_executor(process, __is_token, address): # type: ignore [name-defined]
194
192
  logger.debug("%s is token")
@@ -197,7 +195,7 @@ async def _is_token(address) -> bool:
197
195
  return retval
198
196
 
199
197
 
200
- def __is_token(address) -> bool:
198
+ def __is_token(address: HexAddress) -> bool:
201
199
  with suppress(NonStandardERC20):
202
200
  erc = ERC20(address, asynchronous=True)
203
201
  if all(
@@ -322,7 +320,7 @@ async def get_transaction(sender: ChecksumAddress, nonce: int) -> Optional[Trans
322
320
  _decoded = 0
323
321
 
324
322
 
325
- async def _yield_to_loop():
323
+ async def _yield_to_loop() -> None:
326
324
  """dont let the event loop get congested, let your rpc begin work asap"""
327
325
  global _decoded
328
326
  _decoded += 1
@@ -3,6 +3,7 @@ import logging
3
3
  from typing import Union
4
4
 
5
5
  from evmspec.data import Wei
6
+ from typing_extensions import Self
6
7
 
7
8
 
8
9
  logger = logging.getLogger(__name__)
@@ -69,61 +70,61 @@ class Decimal(decimal.Decimal):
69
70
 
70
71
  return string
71
72
 
72
- def __add__(self, other):
73
+ def __add__(self, other) -> Self:
73
74
  try:
74
75
  return type(self)(super().__add__(other))
75
76
  except TypeError as e:
76
77
  raise TypeError(str(e), other) from e.__cause__
77
78
 
78
- def __radd__(self, other):
79
+ def __radd__(self, other) -> Self:
79
80
  try:
80
81
  return type(self)(super().__radd__(other))
81
82
  except TypeError as e:
82
83
  raise TypeError(str(e), other) from e.__cause__
83
84
 
84
- def __sub__(self, other):
85
+ def __sub__(self, other) -> Self:
85
86
  try:
86
87
  return type(self)(super().__sub__(other))
87
88
  except TypeError as e:
88
89
  raise TypeError(str(e), other) from e.__cause__
89
90
 
90
- def __rsub__(self, other):
91
+ def __rsub__(self, other) -> Self:
91
92
  try:
92
93
  return type(self)(super().__rsub__(other))
93
94
  except TypeError as e:
94
95
  raise TypeError(str(e), other) from e.__cause__
95
96
 
96
- def __mul__(self, other):
97
+ def __mul__(self, other) -> Self:
97
98
  try:
98
99
  return type(self)(super().__mul__(other))
99
100
  except TypeError as e:
100
101
  raise TypeError(str(e), other) from e.__cause__
101
102
 
102
- def __rmul__(self, other):
103
+ def __rmul__(self, other) -> Self:
103
104
  try:
104
105
  return type(self)(super().__rmul__(other))
105
106
  except TypeError as e:
106
107
  raise TypeError(str(e), other) from e.__cause__
107
108
 
108
- def __truediv__(self, other):
109
+ def __truediv__(self, other) -> Self:
109
110
  try:
110
111
  return type(self)(super().__truediv__(other))
111
112
  except TypeError as e:
112
113
  raise TypeError(str(e), other) from e.__cause__
113
114
 
114
- def __rtruediv__(self, other):
115
+ def __rtruediv__(self, other) -> Self:
115
116
  try:
116
117
  return type(self)(super().__rtruediv__(other))
117
118
  except TypeError as e:
118
119
  raise TypeError(str(e), other) from e.__cause__
119
120
 
120
- def __floordiv__(self, other):
121
+ def __floordiv__(self, other) -> Self:
121
122
  try:
122
123
  return type(self)(super().__floordiv__(other))
123
124
  except TypeError as e:
124
125
  raise TypeError(str(e), other) from e.__cause__
125
126
 
126
- def __rfloordiv__(self, other):
127
+ def __rfloordiv__(self, other) -> Self:
127
128
  try:
128
129
  return type(self)(super().__rfloordiv__(other))
129
130
  except TypeError as e:
@@ -37,13 +37,13 @@ import dank_mids
37
37
  import eth_retry
38
38
  from a_sync.asyncio import sleep0 as yield_to_loop
39
39
  from aiohttp import ClientResponseError
40
- from async_lru import alru_cache
41
40
  from brownie import chain
42
41
  from dank_mids.eth import TraceFilterParams
43
42
  from eth_typing import BlockNumber, ChecksumAddress
44
43
  from evmspec import FilterTrace
45
44
  from evmspec.structs.receipt import Status
46
45
  from evmspec.structs.trace import call, reward
46
+ from faster_async_lru import alru_cache
47
47
  from typing_extensions import Unpack
48
48
  from pandas import DataFrame # type: ignore
49
49
  from tqdm import tqdm
@@ -7,10 +7,10 @@ from logging import getLogger
7
7
  from typing import Final, Optional, Set
8
8
 
9
9
  from a_sync import create_task, gather
10
- from async_lru import alru_cache
11
10
  from dank_mids import BlockSemaphore
12
11
  from eth_typing import ChecksumAddress
13
12
  from evmspec.data import TransactionIndex
13
+ from faster_async_lru import alru_cache
14
14
  from msgspec import Struct, ValidationError
15
15
  from msgspec.json import decode
16
16
  from pony.orm import TransactionIntegrityError, UnexpectedError
@@ -15,9 +15,9 @@ import eth_retry
15
15
  import evmspec
16
16
  import msgspec
17
17
  from a_sync import SmartProcessingQueue
18
- from async_lru import alru_cache
19
18
  from eth_typing import ChecksumAddress
20
19
  from evmspec import data
20
+ from faster_async_lru import alru_cache
21
21
  from pony.orm import TransactionIntegrityError
22
22
  from y import get_price
23
23
  from y._decorators import stuck_coro_debugger
@@ -4,8 +4,8 @@ import dank_mids
4
4
  import eth_retry
5
5
  import msgspec
6
6
  from a_sync import SmartProcessingQueue
7
- from async_lru import alru_cache
8
7
  from eth_typing import HexStr
8
+ from faster_async_lru import alru_cache
9
9
  from y._decorators import stuck_coro_debugger
10
10
 
11
11