gabriel / muse public
feat patch task/crud-gap-fill-hub-cli #1 / 1
gabriel · 156 days ago · Apr 15, 2026 · Diff

feat: CRUD gap-fill — hub CLI + secp256k1 eth_keys rewrite

- hub.py: add issue comment list, release CRUD, release asset CRUD, user read/update, topic list/set, fork create/list, webhook delivery list/redeliver, proposal comment create, proposal review submit - secp256k1_sign.py: replace custom EC point math with eth_keys - tests/test_secp256k1_sign.py: 75-test suite across 8 tiers - pyproject.toml: add eth-keys>=0.6.0 dependency - Fix UnboundLocalError: proposal_comment/review parsers now added after proposal_subs is defined; review submit added to proposal_review_subs

sha256:6170a72a0fdaea43544e5d7823e6795272123b967a8bf909d6f633d10dac5544 sha
+142 ~3 symbols
sha256:b70b00a5ad049c53ad4fec06d5cf7cf57fcb59f5cfea4d3329cb74feaefd83b7 snapshot
+142
symbols added
~3
symbols modified
0
dead code introduced
Semantic Changes 145 symbols
~ muse/core/secp256k1_sign.py .py 26 symbols added
+ Bip32Error class class Bip32Error L105–112
+ _BIP32_BITCOIN_SEED variable variable _BIP32_BITCOIN_SEED L88–88
+ _BIP44_PURPOSE variable variable _BIP44_PURPOSE L91–91
+ _Bip32Node class class _Bip32Node L121–130
+ _COIN_TYPE_ETH variable variable _COIN_TYPE_ETH L94–94
+ _HARDENED variable variable _HARDENED L97–97
+ _SECP256K1_N variable variable _SECP256K1_N L85–85
+ _compressed_pubkey function function _compressed_pubkey L133–145
+ _derive_child function function _derive_child L148–179
+ _parse_path function function _parse_path L182–212
+ avax_c_chain_address function function avax_c_chain_address L355–373
+ bip32_derive_path function function bip32_derive_path L248–268
+ bip32_master_key function function bip32_master_key L220–245
+ derive_avax_key function function derive_avax_key L271–302
+ eip191_message function function eip191_message L381–402
+ eip191_sign function function eip191_sign L405–432
+ eip191_verify function function eip191_verify L435–476
+ eip55_checksum function function eip55_checksum L332–352
+ _eth_keys import import _eth_keys L77–77
+ _keccak import import _keccak L76–76
+ annotations import import annotations L69–69
+ dataclass class import dataclass L74–74
+ hashlib import import hashlib L71–71
+ hmac import import hmac L72–72
+ struct import import struct L73–73
+ keccak256 function function keccak256 L310–329
~ tests/test_secp256k1_sign.py .py 97 symbols added
+ TestBip32MasterKey class class TestBip32MasterKey L109–142
+ test_chain_code_is_32_bytes method method test_chain_code_is_32_bytes L122–125
+ test_deterministic method method test_deterministic L127–132
+ test_different_seeds_different_keys method method test_different_seeds_different_keys L134–142
+ test_master_key_returns_node method method test_master_key_returns_node L112–115
+ test_master_private_int_in_range method method test_master_private_int_in_range L117–120
+ TestBip32PathParsing class class TestBip32PathParsing L66–106
+ test_hardened_indices method method test_hardened_indices L83–86
+ test_high_index_values method method test_high_index_values L103–106
+ test_master_only_returns_empty method method test_master_only_returns_empty L74–77
+ test_negative_index_raises method method test_negative_index_raises L98–101
+ test_non_integer_component_raises method method test_non_integer_component_raises L93–96
+ test_path_must_start_with_m method method test_path_must_start_with_m L88–91
+ test_simple_path_parsed method method test_simple_path_parsed L69–72
+ test_unhardened_indices method method test_unhardened_indices L79–81
+ TestDataIntegrity class class TestDataIntegrity L382–446
+ test_account_isolation method method test_account_isolation L399–406
+ test_address_derivation_deterministic method method test_address_derivation_deterministic L393–397
+ test_address_is_42_chars_0x_prefix method method test_address_is_42_chars_0x_prefix L417–419
+ test_address_is_hex method method test_address_is_hex L421–422
+ test_bip32_master_chain_code_is_entropy method method test_bip32_master_chain_code_is_entropy L442–446
+ test_eip191_prefix_cannot_be_raw_tx method method test_eip191_prefix_cannot_be_raw_tx L436–440
+ test_index_isolation method method test_index_isolation L408–415
+ test_signature_r_s_v_encoding method method test_signature_r_s_v_encoding L424–434
+ test_signing_is_deterministic method method test_signing_is_deterministic L385–391
+ TestDocstrings class class TestDocstrings L596–643
+ _public_functions method method _public_functions L599–606
+ test_all_public_functions_have_docstrings method method test_all_public_functions_have_docstrings L612–616
+ test_bip32_error_has_docstring method method test_bip32_error_has_docstring L618–620
+ test_derive_avax_key_documents_path method method test_derive_avax_key_documents_path L630–633
+ test_docstring_mentions_eth_keys method method test_docstring_mentions_eth_keys L622–624
+ test_docstring_mentions_keccak method method test_docstring_mentions_keccak L626–628
+ test_eip191_sign_documents_v_range method method test_eip191_sign_documents_v_range L635–638
+ test_eip191_verify_documents_return_type method method test_eip191_verify_documents_return_type L640–643
+ test_module_docstring method method test_module_docstring L608–610
+ TestEip191Message class class TestEip191Message L187–217
+ test_bytes_input method method test_bytes_input L201–205
+ test_empty_message method method test_empty_message L207–210
+ test_length_in_prefix method method test_length_in_prefix L195–199
+ test_multibyte_utf8_length_is_byte_count method method test_multibyte_utf8_length_is_byte_count L212–217
+ test_prefix_present method method test_prefix_present L190–193
+ TestEip55Checksum class class TestEip55Checksum L167–184
+ test_adds_0x_prefix method method test_adds_0x_prefix L175–178
+ test_idempotent_on_lowercase_bytes method method test_idempotent_on_lowercase_bytes L180–184
+ test_known_vector method method test_known_vector L170–173
+ TestKeccak256 class class TestKeccak256 L145–164
+ test_empty_string_known_vector method method test_empty_string_known_vector L148–152
+ test_is_not_sha3_256 method method test_is_not_sha3_256 L158–164
+ test_returns_32_bytes method method test_returns_32_bytes L154–156
+ TestKnownAnswerVectors class class TestKnownAnswerVectors L273–321
+ test_address_matches_metamask_all_abandon method method test_address_matches_metamask_all_abandon L276–278
+ test_bip44_path_depth_correct method method test_bip44_path_depth_correct L311–321
+ test_eip55_known_vectors method method test_eip55_known_vectors L289–295
+ test_keccak256_known_vectors method method test_keccak256_known_vectors L280–287
+ test_signature_verify_across_accounts method method test_signature_verify_across_accounts L297–309
+ TestPerformance class class TestPerformance L455–501
+ test_10_sign_verify_cycles_under_1s method method test_10_sign_verify_cycles_under_1s L483–491
+ test_keccak256_throughput method method test_keccak256_throughput L493–501
+ test_key_derivation_under_200ms method method test_key_derivation_under_200ms L458–464
+ test_sign_under_100ms method method test_sign_under_100ms L466–472
+ test_verify_under_100ms method method test_verify_under_100ms L474–481
+ TestSecurity class class TestSecurity L509–588
+ test_address_case_insensitive_comparison method method test_address_case_insensitive_comparison L551–556
+ test_different_seeds_produce_different_master_keys method method test_different_seeds_produce_different_master_keys L565–572
+ test_eip191_message_not_raw_private_key method method test_eip191_message_not_raw_private_key L558–563
+ test_malformed_bip32_path_raises method method test_malformed_bip32_path_raises L545–549
+ test_no_custom_ec_math_in_module method method test_no_custom_ec_math_in_module L574–581
+ test_signing_uses_eth_keys_not_custom_ecdsa method method test_signing_uses_eth_keys_not_custom_ecdsa L583–588
+ test_verify_rejects_all_zero_signature method method test_verify_rejects_all_zero_signature L520–522
+ test_verify_rejects_bad_v_byte method method test_verify_rejects_bad_v_byte L524–530
+ test_verify_rejects_bit_flipped_s method method test_verify_rejects_bit_flipped_s L539–543
+ test_verify_rejects_bit_flipped_signature method method test_verify_rejects_bit_flipped_signature L532–537
+ test_verify_rejects_empty_signature method method test_verify_rejects_empty_signature L516–518
+ test_verify_rejects_truncated_signature method method test_verify_rejects_truncated_signature L512–514
+ TestSignVerifyPipeline class class TestSignVerifyPipeline L225–265
+ test_different_keys_different_addresses method method test_different_keys_different_addresses L261–265
+ test_sign_returns_65_bytes method method test_sign_returns_65_bytes L228–231
+ test_v_is_27_or_28 method method test_v_is_27_or_28 L233–236
+ test_verify_bytes_message method method test_verify_bytes_message L244–248
+ test_verify_correct_roundtrip method method test_verify_correct_roundtrip L238–242
+ test_verify_rejects_wrong_address method method test_verify_rejects_wrong_address L255–259
+ test_verify_rejects_wrong_message method method test_verify_rejects_wrong_message L250–253
+ TestStress class class TestStress L330–374
+ test_200_sign_verify_cycles method method test_200_sign_verify_cycles L333–338
+ test_50_accounts_all_unique_addresses method method test_50_accounts_all_unique_addresses L340–346
+ test_50_indices_all_unique_addresses method method test_50_indices_all_unique_addresses L348–354
+ test_high_index_derivation method method test_high_index_derivation L356–361
+ test_many_unique_messages_all_verify method method test_many_unique_messages_all_verify L363–374
+ _KNOWN_ADDRESS_LOWER variable variable _KNOWN_ADDRESS_LOWER L32–32
+ _MNEMONIC variable variable _MNEMONIC L25–28
+ bip39_seed function function bip39_seed L41–44
+ default_address function function default_address L55–58
+ default_key function function default_key L48–51
+ annotations import import annotations L14–14
+ hashlib import import hashlib L16–16
+ pytest import import pytest L19–19
+ time import import time L17–17
~ muse/cli/commands/hub.py .py 19 symbols added, 1 symbol modified
+ _resolve_repo_id_from_owner_repo function function _resolve_repo_id_from_owner_repo L603–629
+ run_fork_create function function run_fork_create L5212–5240
+ run_fork_list function function run_fork_list L5243–5274
+ run_issue_comment_list function function run_issue_comment_list L4100–4158
+ run_proposal_comment_create function function run_proposal_comment_create L5356–5388
+ run_proposal_review_submit function function run_proposal_review_submit L5391–5420
+ run_release_asset_attach function function run_release_asset_attach L4992–5033
+ run_release_asset_delete function function run_release_asset_delete L5036–5064
+ run_release_asset_list function function run_release_asset_list L4953–4989
+ run_release_create function function run_release_create L4853–4892
+ run_release_delete function function run_release_delete L4927–4950
+ run_release_list function function run_release_list L4805–4850
+ run_release_read function function run_release_read L4895–4924
+ run_topic_list function function run_topic_list L5141–5173
+ run_topic_set function function run_topic_set L5176–5206
+ run_user_read function function run_user_read L5070–5097
+ run_user_update function function run_user_update L5100–5135
+ run_webhook_delivery_list function function run_webhook_delivery_list L5280–5321
+ run_webhook_redeliver function function run_webhook_redeliver L5324–5350
~ pyproject.toml .toml 2 symbols modified
← Older Oldest on task/crud-gap-fill-hub-cli
All commits
Newer → Latest on task/crud-gap-fill-hub-cli

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:6170a72a0fdaea43544e5d7823e6795272123b967a8bf909d6f633d10dac5544 --body "your comment"