[BIP 174] PSBT version, proprietary, and xpub fields #17034

pull achow101 wants to merge 15 commits into bitcoin:master from achow101:bip174-extensions changing 12 files +469 −101
  1. achow101 commented at 0:16 am on October 3, 2019: member

    Implements the changes to BIP 174 proposed in https://github.com/bitcoin/bips/pull/849 and https://github.com/bitcoin/bips/pull/784

    Implements PSBT_GLOBAL_VERSION, PSBT_GLOBAL_PROPRIETARY, PSBT_IN_PROPRIETARY, PSBT_OUT_PROPRIETARY, and PSBT_GLOBAL_XPUB. The PSBT_GLOBAL_XPUB changes are merged in from #16463.

    Also includes the test vectors added to BIP 174 for these fields.

    A number of additional changes to keypath and xpub serialization are made to support PSBT_GLOBAL_XPUB.

  2. DrahtBot added the label RPC/REST/ZMQ on Oct 3, 2019
  3. DrahtBot added the label Tests on Oct 3, 2019
  4. DrahtBot commented at 8:28 pm on October 3, 2019: member

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #23718 (PSBT: hash preimages fields by darosior)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  5. fanquake requested review from instagibbs on Oct 8, 2019
  6. fanquake requested review from meshcollider on Oct 8, 2019
  7. in src/psbt.h:671 in 6ccda5b023 outdated
    463@@ -462,8 +464,9 @@ struct PartiallySignedTransaction
    464                 break;
    465             }
    466 
    467-            // First byte of key is the type
    468-            unsigned char type = key[0];
    469+            // Type is compact size uint at beginning of key
    470+            VectorReader skey(s.GetType(), s.GetVersion(), key, 0);
    471+            uint64_t type = ReadCompactSize(skey);
    


    instagibbs commented at 3:52 pm on October 8, 2019:
    Manually inspected that all the fields with constant types are now being written with compact size, but I would like to be more systematic somehow in the future.
  8. instagibbs approved
  9. instagibbs commented at 3:59 pm on October 8, 2019: member
    cursory review ACK
  10. DrahtBot added the label Needs rebase on Oct 9, 2019
  11. achow101 force-pushed on Oct 9, 2019
  12. achow101 force-pushed on Oct 9, 2019
  13. DrahtBot removed the label Needs rebase on Oct 9, 2019
  14. in src/psbt.h:580 in 674e6382ab outdated
    571@@ -496,6 +572,35 @@ struct PartiallySignedTransaction
    572                     }
    573                     break;
    574                 }
    575+                case PSBT_GLOBAL_VERSION:
    576+                {
    577+                    if (version) {
    578+                        throw std::ios_base::failure("Duplicate Key, version already provided");
    579+                    } else if (key.size() != 1) {
    580+                        throw std::ios_base::failure("Global verion key is more than one byte type");
    


    luke-jr commented at 2:38 am on January 5, 2020:
    version*

    achow101 commented at 5:06 pm on January 6, 2020:
    Fixed
  15. achow101 force-pushed on Jan 6, 2020
  16. DrahtBot added the label Needs rebase on Feb 17, 2020
  17. achow101 force-pushed on Feb 26, 2020
  18. DrahtBot removed the label Needs rebase on Feb 26, 2020
  19. DrahtBot added the label Needs rebase on Mar 4, 2020
  20. achow101 force-pushed on Mar 8, 2020
  21. DrahtBot removed the label Needs rebase on Mar 8, 2020
  22. DrahtBot added the label Needs rebase on Apr 23, 2020
  23. achow101 force-pushed on Apr 23, 2020
  24. DrahtBot removed the label Needs rebase on Apr 23, 2020
  25. DrahtBot added the label Needs rebase on Jul 2, 2020
  26. achow101 force-pushed on Jul 3, 2020
  27. DrahtBot removed the label Needs rebase on Jul 3, 2020
  28. achow101 force-pushed on Aug 4, 2020
  29. achow101 force-pushed on Aug 4, 2020
  30. achow101 force-pushed on Nov 10, 2020
  31. achow101 force-pushed on Jan 4, 2021
  32. achow101 force-pushed on Jan 25, 2021
  33. achow101 renamed this:
    Bip174 extensions
    [BIP 174] PSBT version, proprietary, and xpub fields
    on Jan 25, 2021
  34. achow101 commented at 10:07 pm on January 25, 2021: member
    I’ve decided to combine this PR with #16463.
  35. luke-jr referenced this in commit 847f46b5a8 on Jan 28, 2021
  36. luke-jr referenced this in commit 6f2eced9c3 on Jan 28, 2021
  37. luke-jr referenced this in commit 82f069b156 on Jan 28, 2021
  38. luke-jr referenced this in commit ad0824420b on Jan 28, 2021
  39. luke-jr referenced this in commit 9af5fb0c23 on Jan 28, 2021
  40. luke-jr referenced this in commit 21dd98deb0 on Jan 28, 2021
  41. luke-jr referenced this in commit ccd3fa4059 on Jan 28, 2021
  42. luke-jr referenced this in commit f44ac83679 on Jan 28, 2021
  43. luke-jr referenced this in commit 6e5778fabb on Jan 28, 2021
  44. luke-jr referenced this in commit c497958101 on Jan 28, 2021
  45. luke-jr referenced this in commit a89cb50ec4 on Jan 28, 2021
  46. luke-jr referenced this in commit b4f843eddf on Jan 28, 2021
  47. luke-jr referenced this in commit dda9b9b65b on Jan 28, 2021
  48. luke-jr referenced this in commit 086926794d on Jan 28, 2021
  49. DrahtBot added the label Needs rebase on Mar 17, 2021
  50. achow101 force-pushed on Mar 17, 2021
  51. achow101 force-pushed on Mar 17, 2021
  52. DrahtBot removed the label Needs rebase on Mar 17, 2021
  53. in src/psbt.h:730 in ec06a2e9ff outdated
    510@@ -500,6 +511,21 @@ struct PartiallySignedTransaction
    511                     }
    512                     break;
    513                 }
    514+                case PSBT_GLOBAL_VERSION:
    515+                {
    516+                    if (m_version) {
    517+                        throw std::ios_base::failure("Duplicate Key, version already provided");
    518+                    } else if (key.size() != 1) {
    519+                        throw std::ios_base::failure("Global version key is more than one byte type");
    


    Sjors commented at 12:32 pm on April 30, 2021:
    ec06a2e9ff3a59a903b301a8b539f467a8d57077: BIP174 defines it as <32-bit uint>. So we should check key.size() > 4? Not that it matters much, since we trip over any version > 0.

    achow101 commented at 8:14 pm on May 11, 2021:
    The version is in the value, not the key.

    Sjors commented at 8:11 am on May 12, 2021:
    Ah yes. A better error message might be: “Global version key may not contain key data” (if you need to touch it)

    achow101 commented at 6:45 pm on May 12, 2021:
    This is the same wording that we use elsewhere for this kind of error, so I’m going to leave it as is.
  54. in src/psbt.h:697 in 23b45a66f3 outdated
    686@@ -668,6 +687,36 @@ struct PartiallySignedTransaction
    687                     }
    688                     break;
    689                 }
    690+                case PSBT_GLOBAL_XPUB:
    691+                {
    692+                    if (key.size() != BIP32_EXTKEY_WITH_VERSION_SIZE + 1) {
    


    Sjors commented at 1:04 pm on April 30, 2021:
    23b45a66f3343fdf5315a8673ed898202fddf182: I assume that + 1 is here because <xpub> is encoded as CompactSize and is always shorter than 253 bytes (i.e. it’s always 78 bytes)? Still it seems cleaner to just deserialise it, rather than adding 1 everywhere.

    achow101 commented at 8:15 pm on May 11, 2021:
    The + 1 is for the type which is always encoded as a single byte.

    Sjors commented at 8:31 am on May 12, 2021:
    I wish <keylen> would have been defined without the key type (i.e. keydatalen), but let’s not overhaul the BIP :-)
  55. Sjors commented at 1:09 pm on April 30, 2021: member

    tACK 052d8c7

    It would be nice to see testing by someone who actually uses the proprietary fields.

    Followup suggestions:

    • populate the global_xpubs field for (a simple subset of) descriptors wallets.
    • run the new test vectors against Bitcoin Core v0.21.0 (shameless plug for #19013)

    Note to other reviewers: the change to CompactSize in f90d63b does not make this standard backward incompatible, because all existing key types are less than 253. The new propreitary types (PSBT_IN_PROPRIETARY, etc) are safely set to 0xFC (252). See also https://github.com/bitcoin/bips/pull/1115

  56. in src/rpc/rawtransaction.cpp:998 in 26b0902ff0 outdated
    994@@ -995,6 +995,13 @@ static RPCHelpMan decodepsbt()
    995                             {RPCResult::Type::ELISION, "", "The layout is the same as the output of decoderawtransaction."},
    996                         }},
    997                         {RPCResult::Type::NUM, "psbt_version", "The PSBT version number. Not to be confused with the unsigned transaction version"},
    998+                        {RPCResult::Type::OBJ, "proprietary", "The global proprietary map",
    


    apoelstra commented at 2:38 pm on May 7, 2021:
    I think this should be inside an RPCResult::Type::ARR?

    achow101 commented at 8:18 pm on May 11, 2021:
    Yes, done.
  57. in src/psbt.h:557 in 23b45a66f3 outdated
    546@@ -546,6 +547,9 @@ struct PSBTOutput
    547 struct PartiallySignedTransaction
    548 {
    549     std::optional<CMutableTransaction> tx;
    550+    // We use a vector of CExtPubKey in the event that there happens to be the same KeyOriginInfos for different CExtPubKeys
    551+    // Note that this map swaps the key and values from the serialization
    552+    std::map<KeyOriginInfo, std::set<CExtPubKey>> m_xpubs;
    


    apoelstra commented at 4:26 pm on May 7, 2021:
    This comment may be out of date? You are using a set-valued map rather than a vector.

    achow101 commented at 8:18 pm on May 11, 2021:
    Fixed.
  58. achow101 force-pushed on May 11, 2021
  59. achow101 force-pushed on May 11, 2021
  60. Sjors commented at 8:24 am on May 12, 2021: member

    re-utACK bf9c50a modulo RPCResult::Type::ARR

    Shouldn’t “The global proprietary map” for inputs and outputs also be an RPCResult::Type::ARR? And maybe label them “The input proprietary map” and “The output proprietary map” respectively.

  61. achow101 commented at 6:45 pm on May 12, 2021: member

    Shouldn’t “The global proprietary map” for inputs and outputs also be an RPCResult::Type::ARR? And maybe label them “The input proprietary map” and “The output proprietary map” respectively.

    Done

  62. achow101 force-pushed on May 12, 2021
  63. achow101 force-pushed on Oct 5, 2021
  64. luke-jr referenced this in commit 20e5fed7b1 on Oct 10, 2021
  65. luke-jr referenced this in commit 9c9ed7697c on Oct 10, 2021
  66. luke-jr referenced this in commit e10d002b89 on Oct 10, 2021
  67. luke-jr referenced this in commit 837ddbbb33 on Oct 10, 2021
  68. luke-jr referenced this in commit 48a7020f24 on Oct 10, 2021
  69. luke-jr referenced this in commit 16d296fd05 on Oct 10, 2021
  70. luke-jr referenced this in commit 38086133f9 on Oct 10, 2021
  71. luke-jr referenced this in commit 2f6c16b88e on Oct 10, 2021
  72. luke-jr referenced this in commit 7ac24f76b0 on Oct 10, 2021
  73. luke-jr referenced this in commit ebb4fdc770 on Oct 10, 2021
  74. luke-jr referenced this in commit a7705687cf on Oct 10, 2021
  75. luke-jr referenced this in commit bd02b59d70 on Oct 10, 2021
  76. luke-jr referenced this in commit dab86d74f7 on Oct 10, 2021
  77. luke-jr referenced this in commit ca14f6034c on Oct 10, 2021
  78. luke-jr referenced this in commit 9e57c0ff2e on Oct 10, 2021
  79. DrahtBot added the label Needs rebase on Dec 3, 2021
  80. darosior approved
  81. darosior commented at 2:31 pm on December 5, 2021: member

    ACK 7f066240654608743eee165149f7036f43791922

    Here is a rebase: https://github.com/darosior/bitcoin/tree/bip174-extensions .

    I also have a branch implementing the various hash preimage input types, since it is needed for Miniscript signing support. Here it is rebased on this one since i figured it might make sense to have other input types implementations in this PR as well.

  82. achow101 force-pushed on Dec 5, 2021
  83. DrahtBot removed the label Needs rebase on Dec 5, 2021
  84. achow101 force-pushed on Dec 5, 2021
  85. achow101 force-pushed on Dec 8, 2021
  86. darosior commented at 9:26 pm on December 8, 2021: member
    re-ACK 198b080f1f5ddc7b698f6f6f3def4511ab2b4b83
  87. in test/functional/data/rpc_psbt.json:41 in 198b080f1f outdated
    34@@ -34,7 +35,12 @@
    35         "cHNidP8BAHUCAAAAASaBcTce3/KF6Tet7qSze3gADAVmy7OtZGQXE8pCFxv2AAAAAAD+////AtPf9QUAAAAAGXapFNDFmQPFusKGh2DpD9UhpGZap2UgiKwA4fUFAAAAABepFDVF5uM7gyxHBQ8k0+65PJwDlIvHh7MuEwAAAQD9pQEBAAAAAAECiaPHHqtNIOA3G7ukzGmPopXJRjr6Ljl/hTPMti+VZ+UBAAAAFxYAFL4Y0VKpsBIDna89p95PUzSe7LmF/////4b4qkOnHf8USIk6UwpyN+9rRgi7st0tAXHmOuxqSJC0AQAAABcWABT+Pp7xp0XpdNkCxDVZQ6vLNL1TU/////8CAMLrCwAAAAAZdqkUhc/xCX/Z4Ai7NK9wnGIZeziXikiIrHL++E4sAAAAF6kUM5cluiHv1irHU6m80GfWx6ajnQWHAkcwRAIgJxK+IuAnDzlPVoMR3HyppolwuAJf3TskAinwf4pfOiQCIAGLONfc0xTnNMkna9b7QPZzMlvEuqFEyADS8vAtsnZcASED0uFWdJQbrUqZY3LLh+GFbTZSYG2YVi/jnF6efkE/IQUCSDBFAiEA0SuFLYXc2WHS9fSrZgZU327tzHlMDDPOXMMJ/7X85Y0CIGczio4OFyXBl/saiK9Z9R5E5CVbIBZ8hoQDHAXR8lkqASECI7cr7vCWXRC+B3jv7NYfysb3mk6haTkzgHNEZPhPKrMAAAAAAQMEAQAAAAAAAA==",
    36         "cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEA3wIAAAABJoFxNx7f8oXpN63upLN7eAAMBWbLs61kZBcTykIXG/YAAAAAakcwRAIgcLIkUSPmv0dNYMW1DAQ9TGkaXSQ18Jo0p2YqncJReQoCIAEynKnazygL3zB0DsA5BCJCLIHLRYOUV663b8Eu3ZWzASECZX0RjTNXuOD0ws1G23s59tnDjZpwq8ubLeXcjb/kzjH+////AtPf9QUAAAAAGXapFNDFmQPFusKGh2DpD9UhpGZap2UgiKwA4fUFAAAAABepFDVF5uM7gyxHBQ8k0+65PJwDlIvHh7MuEwAAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIACICAurVlmh8qAYEPtw94RbN8p1eklfBls0FXPaYyNAr8k6ZELSmumcAAACAAAAAgAIAAIAAIgIDlPYr6d8ZlSxVh3aK63aYBhrSxKJciU9H2MFitNchPQUQtKa6ZwAAAIABAACAAgAAgAA=",
    37         "cHNidP8BAFUCAAAAASeaIyOl37UfxF8iD6WLD8E+HjNCeSqF1+Ns1jM7XLw5AAAAAAD/////AaBa6gsAAAAAGXapFP/pwAYQl8w7Y28ssEYPpPxCfStFiKwAAAAAAAEBIJVe6gsAAAAAF6kUY0UgD2jRieGtwN8cTRbqjxTA2+uHIgIDsTQcy6doO2r08SOM1ul+cWfVafrEfx5I1HVBhENVvUZGMEMCIAQktY7/qqaU4VWepck7v9SokGQiQFXN8HC2dxRpRC0HAh9cjrD+plFtYLisszrWTt5g6Hhb+zqpS5m9+GFR25qaAQEEIgAgdx/RitRZZm3Unz1WTj28QvTIR3TjYK2haBao7UiNVoEBBUdSIQOxNBzLp2g7avTxI4zW6X5xZ9Vp+sR/HkjUdUGEQ1W9RiED3lXR4drIBeP4pYwfv5uUwC89uq/hJ/78pJlfJvggg71SriIGA7E0HMunaDtq9PEjjNbpfnFn1Wn6xH8eSNR1QYRDVb1GELSmumcAAACAAAAAgAQAAIAiBgPeVdHh2sgF4/iljB+/m5TALz26r+En/vykmV8m+CCDvRC0prpnAAAAgAAAAIAFAACAAAA=",
    38-        "cHNidP8BACoCAAAAAAFAQg8AAAAAABepFG6Rty1Vk+fUOR4v9E6R6YXDFkHwhwAAAAAAAA=="
    39+        "cHNidP8BACoCAAAAAAFAQg8AAAAAABepFG6Rty1Vk+fUOR4v9E6R6YXDFkHwhwAAAAAAAA==",
    40+        "cHNidP8B+wQAAAAAAQB1AgAAAAEmgXE3Ht/yhek3re6ks3t4AAwFZsuzrWRkFxPKQhcb9gAAAAAA/v///wLT3/UFAAAAABl2qRTQxZkDxbrChodg6Q/VIaRmWqdlIIisAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4ezLhMAAAEA/aUBAQAAAAABAomjxx6rTSDgNxu7pMxpj6KVyUY6+i45f4UzzLYvlWflAQAAABcWABS+GNFSqbASA52vPafeT1M0nuy5hf////+G+KpDpx3/FEiJOlMKcjfva0YIu7LdLQFx5jrsakiQtAEAAAAXFgAU/j6e8adF6XTZAsQ1WUOryzS9U1P/////AgDC6wsAAAAAGXapFIXP8Ql/2eAIuzSvcJxiGXs4l4pIiKxy/vhOLAAAABepFDOXJboh79Yqx1OpvNBn1semo50FhwJHMEQCICcSviLgJw85T1aDEdx8qaaJcLgCX907JAIp8H+KXzokAiABizjX3NMU5zTJJ2vW+0D2czJbxLqhRMgA0vLwLbJ2XAEhA9LhVnSUG61KmWNyy4fhhW02UmBtmFYv45xenn5BPyEFAkgwRQIhANErhS2F3Nlh0vX0q2YGVN9u7cx5TAwzzlzDCf+1/OWNAiBnM4qODhclwZf7GoivWfUeROQlWyAWfIaEAxwF0fJZKgEhAiO3K+7wll0Qvgd47+zWH8rG95pOoWk5M4BzRGT4TyqzAAAAAAAAAA==",
    41+        "cHNidP8BAHUCAAAAASaBcTce3/KF6Tet7qSze3gADAVmy7OtZGQXE8pCFxv2AAAAAAD+////AtPf9QUAAAAAGXapFNDFmQPFusKGh2DpD9UhpGZap2UgiKwA4fUFAAAAABepFDVF5uM7gyxHBQ8k0+65PJwDlIvHh7MuEwAD/AAAAaoF/AKqqgABqgABAP2lAQEAAAAAAQKJo8ceq00g4Dcbu6TMaY+ilclGOvouOX+FM8y2L5Vn5QEAAAAXFgAUvhjRUqmwEgOdrz2n3k9TNJ7suYX/////hviqQ6cd/xRIiTpTCnI372tGCLuy3S0BceY67GpIkLQBAAAAFxYAFP4+nvGnRel02QLENVlDq8s0vVNT/////wIAwusLAAAAABl2qRSFz/EJf9ngCLs0r3CcYhl7OJeKSIiscv74TiwAAAAXqRQzlyW6Ie/WKsdTqbzQZ9bHpqOdBYcCRzBEAiAnEr4i4CcPOU9WgxHcfKmmiXC4Al/dOyQCKfB/il86JAIgAYs419zTFOc0ySdr1vtA9nMyW8S6oUTIANLy8C2ydlwBIQPS4VZ0lButSpljcsuH4YVtNlJgbZhWL+OcXp5+QT8hBQJIMEUCIQDRK4UthdzZYdL19KtmBlTfbu3MeUwMM85cwwn/tfzljQIgZzOKjg4XJcGX+xqIr1n1HkTkJVsgFnyGhAMcBdHyWSoBIQIjtyvu8JZdEL4HeO/s1h/KxveaTqFpOTOAc0Rk+E8qswAAAAAF/AKqqgEBqwAABfwCqqoCAawA",
    42+        "cHNidP8BACoCAAAAAAFAQg8AAAAAABepFG6Rty1Vk+fUOR4v9E6R6YXDFkHwhwAAAAAAAA==",
    


    darosior commented at 9:44 pm on December 8, 2021:
    Actually, i think there is a duplicate between line 38 and 41 (my bad).

    achow101 commented at 8:26 pm on December 9, 2021:
    Removed the duplicate.
  88. achow101 force-pushed on Dec 9, 2021
  89. Sjors commented at 5:50 am on December 10, 2021: member
    re-utACK e75e52f7a2a82e24b20f59255cf39809342fcf58
  90. darosior commented at 8:26 am on December 10, 2021: member
    re-ACK e75e52f7a2a82e24b20f59255cf39809342fcf58
  91. MarcoFalke removed the label Tests on Dec 10, 2021
  92. DrahtBot added the label Needs rebase on Dec 10, 2021
  93. Types are compact size uints 3235847473
  94. Implement PSBT versions c3eb416b88
  95. Add GetVersion helper to PSBT df84fa99c5
  96. Output psbt version in decodepsbt 10ba0b593d
  97. Implement PSBT proprietary type aebe758e54
  98. Output proprietary type info in decodepsbt a4cf810174
  99. Test for proprietary field 94065cc6c5
  100. moveonly: Move (Un)Serialize(To/From)Vector, (De)SerializeHDKeypaths to psbt module
    SerializeToVector, UnserializeFromVector, DeserializeHDKeypaths, and SerializeHDKeypaths
    were in sign.h where PSBT was originally implemented. Since all of the PSBT serialization
    has moved to its own file, these functions should follow.
    5fdaf6a2ad
  101. Store version bytes and be able to serialize them in CExtPubKey
    CExtPubKey does not store the version bytes for the extended public key.
    We store these so that a CExtPubKey can be serialized and deserialized with
    the same version bytes.
    a69332fd89
  102. Separate individual HD Keypath serialization into separate functions d3dbb16168
  103. Implement operator< for KeyOriginInfo and CExtPubKey c5c63b8e4f
  104. Implement serializations for PSBT_GLOBAL_XPUB 903848562e
  105. Add global_xpubs to decodepsbt 35670df866
  106. Add global xpub test vectors from BIP d8043ddf64
  107. Merge global xpubs in joinpsbts and combinepsbts 81521173ba
  108. achow101 force-pushed on Dec 10, 2021
  109. DrahtBot removed the label Needs rebase on Dec 10, 2021
  110. laanwj commented at 9:45 pm on December 10, 2021: member
    Code review ACK 81521173ba830ca1dea204e83897482f8970e519
  111. laanwj merged this on Dec 10, 2021
  112. laanwj closed this on Dec 10, 2021

  113. sidhujag referenced this in commit 525d6c6f49 on Dec 11, 2021
  114. RandyMcMillan referenced this in commit 7f1a6eeaa8 on Dec 23, 2021
  115. DrahtBot locked this on Dec 11, 2022

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-18 15:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me