diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c1322ae10f..d900ed4cf5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,7 +30,7 @@ jobs: - uses: Swatinem/rust-cache@v2 - - uses: peaceiris/actions-mdbook@v1 + - uses: peaceiris/actions-mdbook@v2 with: mdbook-version: latest @@ -60,7 +60,7 @@ jobs: done - name: Deploy Pages - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v4 if: github.ref == 'refs/heads/master' with: github_token: ${{secrets.GITHUB_TOKEN}} diff --git a/CHANGELOG.md b/CHANGELOG.md index 32f7cfb5f8..7f91bd5bce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,90 @@ Changelog ========= +[0.22.0](https://github.com/ordinals/ord/releases/tag/0.22.0) - 2024-12-10 +-------------------------------------------------------------------------- + +### Added +- Sign for inscription and output ([#4027](https://github.com/ordinals/ord/pull/4027) by [raphjaph](https://github.com/raphjaph)) +- Document Inscription URIs ([#4098](https://github.com/ordinals/ord/pull/4098) by [casey](https://github.com/casey)) +- Show rune unlock height ([#3580](https://github.com/ordinals/ord/pull/3580) by [raphjaph](https://github.com/raphjaph)) +- Add field metaprotocol to api::Inscription ([#4047](https://github.com/ordinals/ord/pull/4047) by [kbehouse](https://github.com/kbehouse)) +- Show sat owner address when present ([#4016](https://github.com/ordinals/ord/pull/4016) by [lifofifoX](https://github.com/lifofifoX)) + +### Changed +- Only burn one sat ([#4063](https://github.com/ordinals/ord/pull/4063) by [onchainguy-btc](https://github.com/onchainguy-btc)) + +### Fixed +- Set `maxburnamount` when burning and require at least Bitcoin Core 25 ([#4106](https://github.com/ordinals/ord/pull/4106) by [casey](https://github.com/casey)) +- Add `palindrome` to `Charm::from_str` ([#4104](https://github.com/ordinals/ord/pull/4104) by [mvdnbrk](https://github.com/mvdnbrk)) +- Fix sat off-by-one error in output template ([#4075](https://github.com/ordinals/ord/pull/4075) by [casey](https://github.com/casey)) + +### Misc +- Style help text ([#4118](https://github.com/ordinals/ord/pull/4118) by [casey](https://github.com/casey)) +- Placate clippy ([#4116](https://github.com/ordinals/ord/pull/4116) by [raphjaph](https://github.com/raphjaph)) +- Test `Charm` `FromStr` implementation for exhaustiveness ([#4107](https://github.com/ordinals/ord/pull/4107) by [casey](https://github.com/casey)) +- Improve `ord wallet send` help message and rename output `outgoing` to `asset` ([#4105](https://github.com/ordinals/ord/pull/4105) by [casey](https://github.com/casey)) +- Hide teleburn address ([#4093](https://github.com/ordinals/ord/pull/4093) by [raphjaph](https://github.com/raphjaph)) +- Add function to calculate rune unlock height ([#4097](https://github.com/ordinals/ord/pull/4097) by [casey](https://github.com/casey)) +- Handle errors when retrieving sat address ([#4094](https://github.com/ordinals/ord/pull/4094) by [casey](https://github.com/casey)) +- Fixed error message when using sat or satpoint with batch inscribe ([#4054](https://github.com/ordinals/ord/pull/4054) by [pokrovskyy](https://github.com/pokrovskyy)) +- Add replicate and swap recipes ([#4083](https://github.com/ordinals/ord/pull/4083) by [casey](https://github.com/casey)) +- Make build script public ([#4085](https://github.com/ordinals/ord/pull/4085) by [arronzhang](https://github.com/arronzhang)) +- Update `index.hbs` ([#4090](https://github.com/ordinals/ord/pull/4090) by [raphjaph](https://github.com/raphjaph)) +- Update Rust version in Dockerfile ([#4078](https://github.com/ordinals/ord/pull/4078) by [Th0rgal](https://github.com/Th0rgal)) +- Update minimum rust version to 1.79.0 ([#4074](https://github.com/ordinals/ord/pull/4074) by [raphjaph](https://github.com/raphjaph)) +- Update docs Github Action ([#4069](https://github.com/ordinals/ord/pull/4069) by [raphjaph](https://github.com/raphjaph)) +- Pin `bitcoin` to 0.32.3 in `ordinals` crate ([#4066](https://github.com/ordinals/ord/pull/4066) by [casey](https://github.com/casey)) + +[0.21.3](https://github.com/ordinals/ord/releases/tag/0.21.3) - 2024-11-11 +-------------------------------------------------------------------------- + +### Added +- Get output information by address ([#4056](https://github.com/ordinals/ord/pull/4056) by [raphjaph](https://github.com/raphjaph)) +- Allow including metadata when burning inscriptions ([#4045](https://github.com/ordinals/ord/pull/4045) by [casey](https://github.com/casey)) +- BIP322 sign file ([#4026](https://github.com/ordinals/ord/pull/4026) by [raphjaph](https://github.com/raphjaph)) +- Add `ord wallet split` command for splitting utxos ([#4030](https://github.com/ordinals/ord/pull/4030) by [casey](https://github.com/casey)) +- Allow fallback for satpoints and addresses ([#4033](https://github.com/ordinals/ord/pull/4033) by [casey](https://github.com/casey)) +- Add palindrome charm ([#4064](https://github.com/ordinals/ord/pull/4064) by [casey](https://github.com/casey)) +- Allow restoring wallet with custom timestamp ([#4065](https://github.com/ordinals/ord/pull/4065) by [raphjaph](https://github.com/raphjaph)) + +### Changed +- Do not chunk runestone data pushes ([#4036](https://github.com/ordinals/ord/pull/4036) by [casey](https://github.com/casey)) +- Rescan wallet on restore ([#4041](https://github.com/ordinals/ord/pull/4041) by [casey](https://github.com/casey)) + +### Misc +- Add assert_html function ([#4058](https://github.com/ordinals/ord/pull/4058) by [casey](https://github.com/casey)) +- Identify collapsible nodes with class=collapse ([#4055](https://github.com/ordinals/ord/pull/4055) by [casey](https://github.com/casey)) +- Collapse long strings in HTML ([#4053](https://github.com/ordinals/ord/pull/4053) by [casey](https://github.com/casey)) +- Add simple taproot HD wallet to mockcore ([#4038](https://github.com/ordinals/ord/pull/4038) by [raphjaph](https://github.com/raphjaph)) +- Hide image preview and thumbnail scrollbars ([#4042](https://github.com/ordinals/ord/pull/4042) by [casey](https://github.com/casey)) +- Un-pin redb dependency and update to 2.2.0 ([#4032](https://github.com/ordinals/ord/pull/4032) by [casey](https://github.com/casey)) + +[0.21.2](https://github.com/ordinals/ord/releases/tag/0.21.2) - 2024-10-26 +-------------------------------------------------------------------------- + +### Fixed +- Create change output when inputs containing non-outgoing runes are selected ([#4028](https://github.com/ordinals/ord/pull/4028) by [casey](https://github.com/casey)) + +### Added +- Show total child count ([#4009](https://github.com/ordinals/ord/pull/4009) by [arik-so](https://github.com/arik-so)) +- Add `/r/undelegated-content/` ([#3932](https://github.com/ordinals/ord/pull/3932) by [elocremarc](https://github.com/elocremarc)) +- Add BIP322 `wallet sign` ([#3988](https://github.com/ordinals/ord/pull/3988) by [raphjaph](https://github.com/raphjaph)) +- Add `wallet addresses` ([#4005](https://github.com/ordinals/ord/pull/4005) by [raphjaph](https://github.com/raphjaph)) +- Show if JSON API is enabled on /status ([#4014](https://github.com/ordinals/ord/pull/4014) by [casey](https://github.com/casey)) + +### Changed +- Only show rune mint progress during mint ([#4013](https://github.com/ordinals/ord/pull/4013) by [casey](https://github.com/casey)) +- Change mint progress to `mints / terms.cap` ([#4012](https://github.com/ordinals/ord/pull/4012) by [casey](https://github.com/casey)) + +### Misc +- Add more info to `wallet outputs` ([#4019](https://github.com/ordinals/ord/pull/4019) by [raphjaph](https://github.com/raphjaph)) +- Add authors to Handbook ([#4018](https://github.com/ordinals/ord/pull/4018) by [raphjaph](https://github.com/raphjaph)) +- Document POST method for /inscriptions ([#4017](https://github.com/ordinals/ord/pull/4017) by [cryptoni9n](https://github.com/cryptoni9n)) +- Update JSON-API & Recursive documentation ([#3984](https://github.com/ordinals/ord/pull/3984) by [cryptoni9n](https://github.com/cryptoni9n)) +- Remove pre-alpha warning from ord help ([#4011](https://github.com/ordinals/ord/pull/4011) by [cryptoni9n](https://github.com/cryptoni9n)) +- Update Bitcoin Core install script ([#4007](https://github.com/ordinals/ord/pull/4007) by [raphjaph](https://github.com/raphjaph)) + [0.21.1](https://github.com/ordinals/ord/releases/tag/0.21.1) - 2024-10-20 -------------------------------------------------------------------------- diff --git a/Cargo.lock b/Cargo.lock index d8df101e55..dfcce58d07 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -64,9 +64,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -79,9 +79,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" dependencies = [ "backtrace", ] @@ -153,7 +153,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -166,7 +166,7 @@ dependencies = [ "proc-macro2", "quote", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -194,9 +194,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" dependencies = [ "brotli", "flate2", @@ -214,7 +214,7 @@ checksum = "096146020b08dbc4587685b0730a7ba905625af13c65f8028035cdfd69573c91" dependencies = [ "anyhow", "futures", - "http 1.1.0", + "http 1.2.0", "httparse", "log", ] @@ -273,7 +273,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -288,13 +288,13 @@ dependencies = [ "futures", "futures-rustls", "gloo-net", - "http 1.1.0", + "http 1.2.0", "js-sys", "lazy_static", "log", "rustls 0.22.4", "rustls-pki-types", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -312,20 +312,20 @@ dependencies = [ "futures", "futures-lite 1.13.0", "generic_static", - "http 1.1.0", + "http 1.2.0", "log", "rand", "ring 0.16.20", "strum", - "thiserror", + "thiserror 1.0.69", "utf-8", ] [[package]] name = "atom_syndication" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a3a5ed3201df5658d1aa45060c5a57dc9dba8a8ada20d696d67cb0c479ee043" +checksum = "3ee79fb83c725eae67b55218870813d2fc39fd85e4f1583848ef9f4f823cfe7c" dependencies = [ "chrono", "derive_builder", @@ -345,7 +345,7 @@ name = "audit-cache" version = "0.0.0" dependencies = [ "colored", - "reqwest 0.12.8", + "reqwest 0.12.9", ] [[package]] @@ -353,7 +353,7 @@ name = "audit-content-security-policy" version = "0.0.0" dependencies = [ "colored", - "reqwest 0.12.8", + "reqwest 0.12.9", ] [[package]] @@ -506,9 +506,9 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.32.3" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0032b0e8ead7074cda7fc4f034409607e3f03a6f71d66ade8a307f79b4d99e73" +checksum = "ce6bc65742dea50536e35ad42492b234c27904a27f0abdcbce605015cb4ea026" dependencies = [ "base58ck", "bech32", @@ -539,9 +539,9 @@ dependencies = [ [[package]] name = "bitcoin-io" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] name = "bitcoin-units" @@ -628,7 +628,7 @@ dependencies = [ "async-channel", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] @@ -643,7 +643,7 @@ dependencies = [ "new_mime_guess", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -669,9 +669,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", "serde", @@ -691,9 +691,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cast" @@ -703,9 +703,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "shlex", ] @@ -730,9 +730,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -772,9 +772,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -782,9 +782,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -801,14 +801,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" @@ -844,7 +844,7 @@ dependencies = [ "encode_unicode", "lazy_static", "libc", - "unicode-width", + "unicode-width 0.1.14", "windows-sys 0.52.0", ] @@ -866,9 +866,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -990,7 +990,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1001,7 +1001,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1052,7 +1052,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1062,7 +1062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1082,7 +1082,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "unicode-xid", ] @@ -1104,9 +1104,9 @@ dependencies = [ [[package]] name = "diligent-date-parser" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cf7fe294274a222363f84bcb63cdea762979a0443b4cf1f4f8fd17c86b1182" +checksum = "c8ede7d79366f419921e2e2f67889c12125726692a313bffb474bd5f37a581e9" dependencies = [ "chrono", ] @@ -1140,7 +1140,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1195,12 +1195,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1222,9 +1222,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener 5.3.1", "pin-project-lite", @@ -1247,15 +1247,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1356,9 +1356,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "futures-core", "pin-project-lite", @@ -1372,7 +1372,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1473,7 +1473,7 @@ checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10" dependencies = [ "gloo-utils", "js-sys", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1502,29 +1502,29 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tracing", ] [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", + "http 1.2.0", + "indexmap 2.7.0", "slab", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tracing", ] @@ -1546,9 +1546,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -1620,9 +1620,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1647,7 +1647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -1658,7 +1658,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -1704,7 +1704,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -1713,15 +1713,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.7", + "http 1.2.0", "http-body 1.0.1", "httparse", "itoa", @@ -1738,13 +1738,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.5.0", + "http 1.2.0", + "hyper 1.5.1", "hyper-util", - "rustls 0.23.15", + "rustls 0.23.19", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tower-service", ] @@ -1769,7 +1769,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", "native-tls", "tokio", @@ -1779,18 +1779,18 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.0", + "hyper 1.5.1", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -1819,6 +1819,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec 1.13.2", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1827,12 +1945,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec 1.13.2", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1848,26 +1977,26 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] [[package]] name = "indicatif" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" dependencies = [ "console", - "instant", "number_prefix", "portable-atomic", - "unicode-width", + "unicode-width 0.2.0", + "web-time", ] [[package]] @@ -1924,16 +2053,17 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2027,9 +2157,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "libredox" @@ -2053,6 +2183,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -2111,9 +2247,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniscript" -version = "12.2.0" +version = "12.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add2d4aee30e4291ce5cffa3a322e441ff4d4bc57b38c8d9bf0e94faa50ab626" +checksum = "5bd3c9608217b0d6fa9c9c8ddd875b85ab72bd4311cfc8db35e1b5a08fc11f4d" dependencies = [ "bech32", "bitcoin", @@ -2130,9 +2266,9 @@ dependencies = [ [[package]] name = "minreq" -version = "2.12.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763d142cdff44aaadd9268bebddb156ef6c65a0e13486bb81673cf2d8739f9b0" +checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" dependencies = [ "log", "serde", @@ -2141,11 +2277,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -2162,7 +2297,7 @@ dependencies = [ "jsonrpc-derive", "jsonrpc-http-server", "ord-bitcoincore-rpc", - "reqwest 0.12.8", + "reqwest 0.12.9", "serde", "serde_json", "tempfile", @@ -2179,7 +2314,7 @@ dependencies = [ "num-rational", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2368,7 +2503,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -2397,7 +2532,7 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ord" -version = "0.21.1" +version = "0.22.0" dependencies = [ "anyhow", "async-trait", @@ -2455,7 +2590,7 @@ dependencies = [ "tempfile", "tokio", "tokio-stream", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tower-http", "unindent", "urlencoding", @@ -2487,7 +2622,7 @@ dependencies = [ [[package]] name = "ordinals" -version = "0.0.11" +version = "0.0.13" dependencies = [ "bitcoin", "derive_more", @@ -2495,7 +2630,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror", + "thiserror 2.0.6", ] [[package]] @@ -2561,7 +2696,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -2583,7 +2718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.1", + "fastrand 2.3.0", "futures-io", ] @@ -2639,9 +2774,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "powerfmt" @@ -2679,18 +2814,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quick-xml" -version = "0.36.2" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +checksum = "f22f29bdff3987b4d8632ef95fd6424ec7e4e0a57e2f4fc63e489e75357f6a03" dependencies = [ "encoding_rs", "memchr", @@ -2769,9 +2904,9 @@ dependencies = [ [[package]] name = "redb" -version = "2.1.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4760ad04a88ef77075ba86ba9ea79b919e6bab29c1764c5747237cd6eaedcaa" +checksum = "a7c2a94325f9c5826b17c42af11067230f503747f870117a28180e85696e21ba" dependencies = [ "libc", ] @@ -2793,7 +2928,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2813,7 +2948,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -2830,9 +2965,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2878,7 +3013,7 @@ dependencies = [ "system-configuration 0.5.1", "tokio", "tokio-native-tls", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tower-service", "url", "wasm-bindgen", @@ -2889,9 +3024,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -2899,11 +3034,11 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.7", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", @@ -2919,7 +3054,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "system-configuration 0.6.1", "tokio", "tokio-native-tls", @@ -2963,9 +3098,9 @@ dependencies = [ [[package]] name = "rss" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e92048f840d98c6d6dd870af9101610ea9ff413f11f1bcebf4f4c31d96d957" +checksum = "531af70fce504d369cf42ac0a9645f5a62a8ea9265de71cfa25087e9f6080c7c" dependencies = [ "atom_syndication", "derive_builder", @@ -2993,7 +3128,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.85", + "syn 2.0.90", "walkdir", ] @@ -3038,15 +3173,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3077,9 +3212,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "once_cell", "rustls-pki-types", @@ -3103,16 +3238,16 @@ dependencies = [ "chrono", "futures", "futures-rustls", - "http 1.1.0", + "http 1.2.0", "log", "pem", "rcgen", "ring 0.16.20", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "webpki-roots", "x509-parser", ] @@ -3185,9 +3320,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -3244,9 +3379,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -3254,9 +3389,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.213" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -3274,22 +3409,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -3328,7 +3463,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -3345,7 +3480,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3354,7 +3489,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -3430,7 +3565,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3445,9 +3580,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3465,6 +3600,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.11.1" @@ -3512,9 +3653,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -3529,9 +3670,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -3548,11 +3689,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "sysinfo" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ae3f4f7d64646c46c4cae4e3f01d1c5d255c7406fdd7c7f999a94e488791" +checksum = "948512566b1895f93b1592c7574baeb2de842f224f2aab158799ecadb8ebbb46" dependencies = [ "core-foundation-sys", "libc", @@ -3606,42 +3758,62 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if 1.0.0", - "fastrand 2.1.1", + "fastrand 2.3.0", "once_cell", - "rustix 0.38.37", + "rustix 0.38.42", "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +dependencies = [ + "thiserror-impl 2.0.6", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -3660,14 +3832,24 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -3695,16 +3877,16 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", "libc", "mio", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.8", "tokio-macros", "windows-sys 0.52.0", ] @@ -3717,7 +3899,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3742,20 +3924,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.15", - "rustls-pki-types", + "rustls 0.23.19", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -3778,9 +3959,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -3833,7 +4014,7 @@ dependencies = [ "mime", "pin-project-lite", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tower-layer", "tower-service", ] @@ -3852,9 +4033,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -3863,9 +4044,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -3888,17 +4069,11 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -3915,6 +4090,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -3954,9 +4135,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -3975,6 +4156,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -4026,9 +4219,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -4037,36 +4230,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if 1.0.0", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4074,28 +4267,38 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -4177,7 +4380,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4188,7 +4391,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4388,6 +4591,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "x509-parser" version = "0.13.2" @@ -4402,7 +4617,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -4421,6 +4636,30 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure 0.13.1", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -4439,7 +4678,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure 0.13.1", ] [[package]] @@ -4447,3 +4707,25 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] diff --git a/Cargo.toml b/Cargo.toml index 8d9f939b3a..e256de9ef0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "ord" description = "◉ Ordinal wallet and block explorer" -version = "0.21.1" +version = "0.22.0" license = "CC0-1.0" edition = "2021" autotests = false homepage = "https://github.com/ordinals/ord" repository = "https://github.com/ordinals/ord" autobins = false -rust-version = "1.76.0" +rust-version = "1.79.0" [package.metadata.deb] copyright = "The Ord Maintainers" @@ -25,7 +25,7 @@ axum-server = "0.5.0" base64 = "0.22.0" bip322 = "0.0.8" bip39 = "2.0.0" -bitcoin = { version = "0.32.3", features = ["rand"] } +bitcoin = { version = "0.32.5", features = ["rand"] } bitcoincore-rpc = "0.19.0" boilerplate = { version = "1.0.0", features = ["axum"] } brotli = "7.0.0" @@ -49,8 +49,8 @@ mime = "0.3.16" mime_guess = "2.0.4" miniscript = "12.0.0" mp4 = "0.14.0" -ordinals = { version = "0.0.11", path = "crates/ordinals" } -redb = "=2.1.3" +ordinals = { version = "0.0.13", path = "crates/ordinals" } +redb = "2.3.0" ref-cast = "1.0.23" regex = "1.6.0" reqwest = { version = "0.11.27", features = ["blocking", "json"] } @@ -65,7 +65,7 @@ serde_with = "3.7.0" serde_yaml = "0.9.17" sha3 = "0.10.8" snafu = "0.8.3" -sysinfo = "0.32.0" +sysinfo = "0.33.0" tempfile = "3.2.0" tokio = { version = "1.17.0", features = ["rt-multi-thread"] } tokio-stream = "0.1.9" @@ -76,10 +76,10 @@ urlencoding = "2.1.3" [dev-dependencies] criterion = "0.5.1" executable-path = "1.0.0" +mockcore = { path = "crates/mockcore" } nix = { version = "0.29.0", features = ["signal"] } pretty_assertions = "1.2.1" reqwest = { version = "0.11.27", features = ["blocking", "brotli", "json"] } -mockcore = { path = "crates/mockcore" } unindent = "0.2.1" [[bin]] diff --git a/Dockerfile b/Dockerfile index af187a7b87..4d37a5a921 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.76.0-bookworm as builder +FROM rust:1.79.0-bookworm as builder WORKDIR /usr/src/ord diff --git a/README.md b/README.md index 38629b29eb..e03e5b2107 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ cargo build --release Once built, the `ord` binary can be found at `./target/release/ord`. -`ord` requires `rustc` version 1.76.0 or later. Run `rustc --version` to ensure +`ord` requires `rustc` version 1.79.0 or later. Run `rustc --version` to ensure you have this version. Run `rustup update` to get the latest stable release. ### Docker diff --git a/bin/replicate b/bin/replicate new file mode 100755 index 0000000000..44479c7097 --- /dev/null +++ b/bin/replicate @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +systemctl stop ord + +for host in alpha bravo; do + rsync \ + --archive \ + --progress \ + /var/lib/ord/index.redb \ + root@$host.ordinals.net:/var/lib/ord/index.redb.new +done + +systemctl restart ord diff --git a/bin/swap b/bin/swap new file mode 100755 index 0000000000..5293fc8146 --- /dev/null +++ b/bin/swap @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +die() { + echo "$1" + exit 1 +} + +new=/var/lib/ord/index.redb.new +current=/var/lib/ord/index.redb +old=/var/lib/ord/index.redb.old + +[[ -f $new ]] || die "new index missing: $new" +[[ -f $current ]] || die "old index missing: $current" +[[ ! -f $old ]] || die "backup index already exists: $old" + +systemctl stop ord + +chown ord:ord $new + +mv $current $old +mv $new $current + +systemctl restart ord diff --git a/crates/mockcore/Cargo.toml b/crates/mockcore/Cargo.toml index 9ba3495753..07c841dd68 100644 --- a/crates/mockcore/Cargo.toml +++ b/crates/mockcore/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/ordinals/ord" [dependencies] base64 = "0.22.0" -bitcoin = { version = "0.32.3", features = ["serde", "rand"] } +bitcoin = { version = "0.32.5", features = ["serde", "rand"] } hex = "0.4.3" jsonrpc-core = "18.0.0" jsonrpc-derive = "18.0.0" diff --git a/crates/mockcore/src/api.rs b/crates/mockcore/src/api.rs index 8571ec3ea3..be6fcecf2b 100644 --- a/crates/mockcore/src/api.rs +++ b/crates/mockcore/src/api.rs @@ -87,7 +87,12 @@ pub trait Api { ) -> Result; #[rpc(name = "sendrawtransaction")] - fn send_raw_transaction(&self, tx: String) -> Result; + fn send_raw_transaction( + &self, + tx: String, + maxfeerate: Option<()>, + maxburnamount: Option, + ) -> Result; #[rpc(name = "sendtoaddress")] fn send_to_address( diff --git a/crates/mockcore/src/lib.rs b/crates/mockcore/src/lib.rs index 4414513daa..56484d5eb4 100644 --- a/crates/mockcore/src/lib.rs +++ b/crates/mockcore/src/lib.rs @@ -5,15 +5,19 @@ use { bitcoin::{ address::{Address, NetworkUnchecked}, amount::SignedAmount, + bip32::{ChildNumber, DerivationPath, Xpriv}, block::Header, blockdata::{script, transaction::Version}, consensus::encode::{deserialize, serialize}, hash_types::{BlockHash, TxMerkleNode}, hashes::Hash, + key::{Keypair, Secp256k1, TapTweak, XOnlyPublicKey}, locktime::absolute::LockTime, pow::CompactTarget, - Amount, Block, Network, OutPoint, ScriptBuf, Sequence, Transaction, TxIn, TxOut, Txid, Witness, - Wtxid, + secp256k1::{self, rand}, + sighash::{self, SighashCache, TapSighashType}, + Amount, Block, Network, OutPoint, ScriptBuf, Sequence, Transaction, TxIn, TxOut, Txid, + WPubkeyHash, Witness, Wtxid, }, bitcoincore_rpc::json::{ Bip125Replaceable, CreateRawTransactionInput, EstimateMode, FeeRatePercentiles, @@ -40,6 +44,7 @@ use { time::Duration, }, tempfile::TempDir, + wallet::Wallet, }; const COIN_VALUE: u64 = 100_000_000; @@ -47,6 +52,7 @@ const COIN_VALUE: u64 = 100_000_000; mod api; mod server; mod state; +mod wallet; #[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)] pub struct Descriptor { @@ -68,7 +74,7 @@ pub fn builder() -> Builder { Builder { fail_lock_unspent: false, network: Network::Bitcoin, - version: 240000, + version: 250000, } } @@ -192,7 +198,7 @@ pub struct FundRawTransactionResult { pub change_position: i32, } -impl<'a> Default for TransactionTemplate<'a> { +impl Default for TransactionTemplate<'_> { fn default() -> Self { Self { fee: 0, @@ -294,16 +300,43 @@ impl Handle { .clone() } + #[track_caller] + pub fn tx_index(&self, txid: Txid) -> (usize, usize) { + let state = self.state(); + + for (block_hash, block) in &state.blocks { + for (t, tx) in block.txdata.iter().enumerate() { + if tx.compute_txid() == txid { + let b = state + .hashes + .iter() + .enumerate() + .find(|(_b, hash)| *hash == block_hash) + .unwrap() + .0; + return (b, t); + } + } + } + + panic!("unknown transaction"); + } + pub fn mempool(&self) -> Vec { self.state().mempool().to_vec() } pub fn descriptors(&self) -> Vec { - self.state().descriptors.clone() + self + .state() + .descriptors + .iter() + .map(|(descriptor, _timestamp)| descriptor.clone()) + .collect() } pub fn import_descriptor(&self, desc: String) { - self.state().descriptors.push(desc); + self.state().descriptors.push((desc, Timestamp::Now)); } pub fn lock(&self, output: OutPoint) { @@ -313,9 +346,10 @@ impl Handle { pub fn network(&self) -> String { match self.state().network { Network::Bitcoin => "mainnet".to_string(), - Network::Testnet => Network::Testnet.to_string(), - Network::Signet => Network::Signet.to_string(), Network::Regtest => Network::Regtest.to_string(), + Network::Signet => Network::Signet.to_string(), + Network::Testnet4 => Network::Testnet4.to_string(), + Network::Testnet => Network::Testnet.to_string(), _ => panic!(), } } diff --git a/crates/mockcore/src/server.rs b/crates/mockcore/src/server.rs index aa05e64db8..bd8916e783 100644 --- a/crates/mockcore/src/server.rs +++ b/crates/mockcore/src/server.rs @@ -1,7 +1,7 @@ use { super::*, base64::Engine, - bitcoin::{consensus::Decodable, psbt::Psbt, Witness}, + bitcoin::{consensus::Decodable, opcodes, psbt::Psbt, script::Instruction, Witness}, bitcoincore_rpc::json::StringOrStringArray, }; @@ -476,12 +476,20 @@ impl Api for Server { fn sign_raw_transaction_with_wallet( &self, tx: String, - _utxos: Option>, + utxos: Option>, sighash_type: Option<()>, ) -> Result { assert_eq!(sighash_type, None, "sighash_type param not supported"); let mut transaction: Transaction = deserialize(&hex::decode(tx).unwrap()).unwrap(); + + if let Some(utxos) = &utxos { + // sign for zero-value UTXOs produced by `ord wallet sign` + if utxos[0].amount == Some(Amount::ZERO) { + transaction.input[0].witness = self.state().wallet.sign_bip322(&utxos[0], &transaction); + } + } + for input in &mut transaction.input { if input.witness.is_empty() { input.witness = Witness::from_slice(&[&[0; 64]]); @@ -498,9 +506,36 @@ impl Api for Server { ) } - fn send_raw_transaction(&self, tx: String) -> Result { + fn send_raw_transaction( + &self, + tx: String, + maxfeerate: Option<()>, + maxburnamount: Option, + ) -> Result { + assert!( + maxfeerate.is_none(), + "sendrawtransaction: maxfeerate is not supported" + ); + let tx: Transaction = deserialize(&hex::decode(tx).unwrap()).unwrap(); + let burnt = tx + .output + .iter() + .filter(|tx_out| { + tx_out.script_pubkey.instructions().next() + == Some(Ok(Instruction::Op(opcodes::all::OP_RETURN))) + }) + .map(|tx_out| tx_out.value) + .sum::(); + + let maxburnamount = Amount::from_btc(maxburnamount.unwrap_or_default()).unwrap(); + + assert!( + burnt <= maxburnamount, + "burnt amount greater than maxburnamount: {burnt} > {maxburnamount}", + ); + let mut state = self.state.lock().unwrap(); for tx_in in &tx.input { @@ -803,10 +838,11 @@ impl Api for Server { &self, req: Vec, ) -> Result, jsonrpc_core::Error> { - self - .state() - .descriptors - .extend(req.into_iter().map(|params| params.descriptor)); + self.state().descriptors.extend( + req + .into_iter() + .map(|params| (params.descriptor, params.timestamp)), + ); Ok(vec![ImportMultiResult { success: true, @@ -901,9 +937,9 @@ impl Api for Server { .state() .descriptors .iter() - .map(|desc| Descriptor { + .map(|(desc, timestamp)| Descriptor { desc: desc.to_string(), - timestamp: Timestamp::Now, + timestamp: *timestamp, active: true, internal: None, range: None, diff --git a/crates/mockcore/src/state.rs b/crates/mockcore/src/state.rs index 232614b8d8..9105633d50 100644 --- a/crates/mockcore/src/state.rs +++ b/crates/mockcore/src/state.rs @@ -1,16 +1,9 @@ -use { - super::*, - bitcoin::{ - key::{Keypair, Secp256k1, XOnlyPublicKey}, - secp256k1::rand, - WPubkeyHash, - }, -}; +use super::*; #[derive(Debug)] pub struct State { pub blocks: BTreeMap, - pub descriptors: Vec, + pub descriptors: Vec<(String, bitcoincore_rpc::json::Timestamp)>, pub fail_lock_unspent: bool, pub hashes: Vec, pub loaded_wallets: BTreeSet, @@ -25,6 +18,7 @@ pub struct State { pub receive_addresses: Vec
, pub change_addresses: Vec
, pub wallets: BTreeSet, + pub wallet: Wallet, } impl State { @@ -54,20 +48,20 @@ impl State { utxos: BTreeMap::new(), version, wallets: BTreeSet::new(), + wallet: Wallet::new(network), } } pub(crate) fn new_address(&mut self, change: bool) -> Address { - let secp256k1 = Secp256k1::new(); - let keypair = Keypair::new(&secp256k1, &mut rand::thread_rng()); - let (public_key, _parity) = XOnlyPublicKey::from_keypair(&keypair); - let address = Address::p2tr(&secp256k1, public_key, None, self.network); + let address = self.wallet.new_address(); + if change { &mut self.change_addresses } else { &mut self.receive_addresses } .push(address.clone()); + address } @@ -200,8 +194,28 @@ impl State { let mut total_value = 0; let mut input = Vec::new(); for (height, tx, vout, witness) in template.inputs.iter() { - let tx = &self.blocks.get(&self.hashes[*height]).unwrap().txdata[*tx]; - total_value += tx.output[*vout].value.to_sat(); + let block_hash = self + .hashes + .get(*height) + .ok_or_else(|| format!("invalid block height {height}")) + .unwrap(); + + let block = self.blocks.get(block_hash).unwrap(); + + let tx = block + .txdata + .get(*tx) + .ok_or_else(|| format!("invalid transaction index {tx}")) + .unwrap(); + + let tx_out = tx + .output + .get(*vout) + .ok_or_else(|| format!("invalid output index {vout}")) + .unwrap(); + + total_value += tx_out.value.to_sat(); + input.push(TxIn { previous_output: OutPoint::new(tx.compute_txid(), *vout as u32), script_sig: ScriptBuf::new(), diff --git a/crates/mockcore/src/wallet.rs b/crates/mockcore/src/wallet.rs new file mode 100644 index 0000000000..370895e9de --- /dev/null +++ b/crates/mockcore/src/wallet.rs @@ -0,0 +1,111 @@ +use super::*; + +#[derive(Debug)] +pub struct Wallet { + address_indices: HashMap, + master_key: Xpriv, + network: Network, + next_index: u32, + secp: Secp256k1, + derivation_path: DerivationPath, +} + +impl Wallet { + pub fn new(network: Network) -> Self { + let derivation_path = DerivationPath::master() + .child(ChildNumber::Hardened { index: 86 }) + .child(ChildNumber::Hardened { index: 0 }) + .child(ChildNumber::Hardened { index: 0 }) + .child(ChildNumber::Normal { index: 0 }); + + Self { + address_indices: HashMap::new(), + master_key: Xpriv::new_master(network, &[]).unwrap(), + network, + next_index: 0, + secp: Secp256k1::new(), + derivation_path, + } + } + + pub fn new_address(&mut self) -> Address { + let address = { + let derived_key = self + .master_key + .derive_priv( + &self.secp, + &self.derivation_path.child(ChildNumber::Normal { + index: self.next_index, + }), + ) + .unwrap(); + + let keypair = derived_key.to_keypair(&self.secp); + let (internal_key, _parity) = XOnlyPublicKey::from_keypair(&keypair); + + let script = ScriptBuf::new_p2tr(&self.secp, internal_key, None); + + Address::from_script(&script, self.network).unwrap() + }; + + self + .address_indices + .insert(address.clone(), self.next_index); + self.next_index += 1; + + address + } + + pub fn sign_bip322( + &self, + to_spend_input: &SignRawTransactionInput, + to_sign: &Transaction, + ) -> Witness { + let address = Address::from_script(&to_spend_input.script_pub_key, self.network).unwrap(); + let index = self.address_indices[&address]; + let derivation_path = self.derivation_path.child(ChildNumber::Normal { index }); + + let private_key = self + .master_key + .derive_priv(&self.secp, &derivation_path) + .unwrap(); + + let keypair = private_key.to_keypair(&self.secp); + let tweaked_keypair = keypair.tap_tweak(&self.secp, None); + + let sighash_type = TapSighashType::All; + + let mut sighash_cache = SighashCache::new(to_sign.clone()); + + let sighash = sighash_cache + .taproot_key_spend_signature_hash( + 0, + &sighash::Prevouts::All(&[TxOut { + value: Amount::from_sat(0), + script_pubkey: to_spend_input.script_pub_key.clone(), + }]), + sighash_type, + ) + .expect("signature hash should compute"); + + let signature = self.secp.sign_schnorr_no_aux_rand( + &secp256k1::Message::from_digest_slice(sighash.as_ref()) + .expect("should be cryptographically secure hash"), + &tweaked_keypair.to_inner(), + ); + + let witness = sighash_cache + .witness_mut(0) + .expect("getting mutable witness reference should work"); + + witness.push( + bitcoin::taproot::Signature { + signature, + sighash_type, + } + .to_vec(), + ); + + witness.to_owned() + } +} diff --git a/crates/ordinals/Cargo.toml b/crates/ordinals/Cargo.toml index 9e124ceb96..e0cde94f6a 100644 --- a/crates/ordinals/Cargo.toml +++ b/crates/ordinals/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ordinals" -version = "0.0.11" +version = "0.0.13" edition = "2021" description = "Library for interoperating with ordinals and inscriptions" homepage = "https://github.com/ordinals/ord" @@ -9,11 +9,11 @@ license = "CC0-1.0" rust-version = "1.74.0" [dependencies] -bitcoin = { version = "0.32.3", features = ["rand"] } +bitcoin = { version = "0.32.5", features = ["rand"] } derive_more = { version = "1.0.0", features = ["display", "from_str"] } serde = { version = "1.0.137", features = ["derive"] } serde_with = "3.7.0" -thiserror = "1.0.56" +thiserror = "2.0.0" [dev-dependencies] serde_json = { version = "1.0.81", features = ["preserve_order"] } diff --git a/crates/ordinals/src/charm.rs b/crates/ordinals/src/charm.rs index 53e4aae770..8b1dcf433d 100644 --- a/crates/ordinals/src/charm.rs +++ b/crates/ordinals/src/charm.rs @@ -15,10 +15,11 @@ pub enum Charm { Vindicated = 10, Mythic = 11, Burned = 12, + Palindrome = 13, } impl Charm { - pub const ALL: [Self; 13] = [ + pub const ALL: [Self; 14] = [ Self::Coin, Self::Uncommon, Self::Rare, @@ -26,6 +27,7 @@ impl Charm { Self::Legendary, Self::Mythic, Self::Nineball, + Self::Palindrome, Self::Reinscription, Self::Cursed, Self::Unbound, @@ -34,7 +36,7 @@ impl Charm { Self::Burned, ]; - fn flag(self) -> u16 { + pub fn flag(self) -> u16 { 1 << self as u16 } @@ -60,6 +62,7 @@ impl Charm { Self::Lost => "🤔", Self::Mythic => "🎃", Self::Nineball => "\u{39}\u{fe0f}\u{20e3}", + Self::Palindrome => "🦋", Self::Rare => "🧿", Self::Reinscription => "♻️", Self::Unbound => "🔓", @@ -90,6 +93,7 @@ impl Display for Charm { Self::Lost => "lost", Self::Mythic => "mythic", Self::Nineball => "nineball", + Self::Palindrome => "palindrome", Self::Rare => "rare", Self::Reinscription => "reinscription", Self::Unbound => "unbound", @@ -113,6 +117,7 @@ impl FromStr for Charm { "lost" => Self::Lost, "mythic" => Self::Mythic, "nineball" => Self::Nineball, + "palindrome" => Self::Palindrome, "rare" => Self::Rare, "reinscription" => Self::Reinscription, "unbound" => Self::Unbound, @@ -149,4 +154,11 @@ mod tests { let flags = Charm::Coin.unset(flags); assert!(!Charm::Coin.is_set(flags)); } + + #[test] + fn from_str() { + for charm in Charm::ALL { + assert_eq!(charm.to_string().parse::().unwrap(), charm); + } + } } diff --git a/crates/ordinals/src/lib.rs b/crates/ordinals/src/lib.rs index 98b16f0355..1e7c63e19b 100644 --- a/crates/ordinals/src/lib.rs +++ b/crates/ordinals/src/lib.rs @@ -4,7 +4,7 @@ use { bitcoin::{ consensus::{Decodable, Encodable}, - constants::{DIFFCHANGE_INTERVAL, MAX_SCRIPT_ELEMENT_SIZE, SUBSIDY_HALVING_INTERVAL}, + constants::{DIFFCHANGE_INTERVAL, SUBSIDY_HALVING_INTERVAL}, opcodes, script::{self, Instruction}, Network, OutPoint, ScriptBuf, Transaction, diff --git a/crates/ordinals/src/rune.rs b/crates/ordinals/src/rune.rs index 90e26865cf..ab052c045a 100644 --- a/crates/ordinals/src/rune.rs +++ b/crates/ordinals/src/rune.rs @@ -6,7 +6,11 @@ use super::*; pub struct Rune(pub u128); impl Rune { - const RESERVED: u128 = 6402364363415443603228541259936211926; + pub const RESERVED: u128 = 6402364363415443603228541259936211926; + + const UNLOCKED: usize = 12; + + const UNLOCK_INTERVAL: u32 = SUBSIDY_HALVING_INTERVAL / 12; const STEPS: &'static [u128] = &[ 0, @@ -54,17 +58,15 @@ impl Rune { } } - pub fn minimum_at_height(chain: Network, height: Height) -> Self { + pub fn minimum_at_height(network: Network, height: Height) -> Self { let offset = height.0.saturating_add(1); - const INTERVAL: u32 = SUBSIDY_HALVING_INTERVAL / 12; - - let start = Self::first_rune_height(chain); + let start = Self::first_rune_height(network); let end = start + SUBSIDY_HALVING_INTERVAL; if offset < start { - return Rune(Self::STEPS[12]); + return Rune(Self::STEPS[Self::UNLOCKED]); } if offset >= end { @@ -73,15 +75,41 @@ impl Rune { let progress = offset.saturating_sub(start); - let length = 12u32.saturating_sub(progress / INTERVAL); + let length = u32::try_from(Self::UNLOCKED) + .unwrap() + .saturating_sub(progress / Self::UNLOCK_INTERVAL); let end = Self::STEPS[usize::try_from(length - 1).unwrap()]; let start = Self::STEPS[usize::try_from(length).unwrap()]; - let remainder = u128::from(progress % INTERVAL); + let remainder = u128::from(progress % Self::UNLOCK_INTERVAL); + + Rune(start - ((start - end) * remainder / u128::from(Self::UNLOCK_INTERVAL))) + } + + pub fn unlock_height(self, network: Network) -> Option { + if self.is_reserved() { + return None; + } + + if self.0 >= Self::STEPS[Self::UNLOCKED] { + return Some(Height(0)); + } + + let i = Self::STEPS.iter().position(|&step| self.0 < step).unwrap(); + + let start = Self::STEPS[i]; + let end = i.checked_sub(1).map(|i| Self::STEPS[i]).unwrap_or_default(); - Rune(start - ((start - end) * remainder / u128::from(INTERVAL))) + let interval = start - end; + let progress = start - self.0; + + let height = Self::first_rune_height(network) + + u32::try_from(Self::UNLOCKED - i).unwrap() * Self::UNLOCK_INTERVAL + + u32::try_from((progress * u128::from(Self::UNLOCK_INTERVAL) - 1) / interval).unwrap(); + + Some(Height(height)) } pub fn is_reserved(self) -> bool { @@ -240,15 +268,23 @@ mod tests { fn mainnet_minimum_at_height() { #[track_caller] fn case(height: u32, minimum: &str) { + let minimum = minimum.parse::().unwrap(); assert_eq!( - Rune::minimum_at_height(Network::Bitcoin, Height(height)).to_string(), + Rune::minimum_at_height(Network::Bitcoin, Height(height)), minimum, ); + + let unlock_height = minimum.unlock_height(Network::Bitcoin).unwrap().0; + + assert!(unlock_height <= height); + + if unlock_height == 0 { + assert!(height < SUBSIDY_HALVING_INTERVAL * 4); + } } const START: u32 = SUBSIDY_HALVING_INTERVAL * 4; const END: u32 = START + SUBSIDY_HALVING_INTERVAL; - const INTERVAL: u32 = SUBSIDY_HALVING_INTERVAL / 12; case(0, "AAAAAAAAAAAAA"); case(START / 2, "AAAAAAAAAAAAA"); @@ -259,64 +295,70 @@ mod tests { case(END + 1, "A"); case(u32::MAX, "A"); - case(START + INTERVAL * 00 - 1, "AAAAAAAAAAAAA"); - case(START + INTERVAL * 00 + 0, "ZZYZXBRKWXVA"); - case(START + INTERVAL * 00 + 1, "ZZXZUDIVTVQA"); + case(START + Rune::UNLOCK_INTERVAL * 00 - 1, "AAAAAAAAAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 00 + 0, "ZZYZXBRKWXVA"); + case(START + Rune::UNLOCK_INTERVAL * 00 + 1, "ZZXZUDIVTVQA"); - case(START + INTERVAL * 01 - 1, "AAAAAAAAAAAA"); - case(START + INTERVAL * 01 + 0, "ZZYZXBRKWXV"); - case(START + INTERVAL * 01 + 1, "ZZXZUDIVTVQ"); + case(START + Rune::UNLOCK_INTERVAL * 01 - 1, "AAAAAAAAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 01 + 0, "ZZYZXBRKWXV"); + case(START + Rune::UNLOCK_INTERVAL * 01 + 1, "ZZXZUDIVTVQ"); - case(START + INTERVAL * 02 - 1, "AAAAAAAAAAA"); - case(START + INTERVAL * 02 + 0, "ZZYZXBRKWY"); - case(START + INTERVAL * 02 + 1, "ZZXZUDIVTW"); + case(START + Rune::UNLOCK_INTERVAL * 02 - 1, "AAAAAAAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 02 + 0, "ZZYZXBRKWY"); + case(START + Rune::UNLOCK_INTERVAL * 02 + 1, "ZZXZUDIVTW"); - case(START + INTERVAL * 03 - 1, "AAAAAAAAAA"); - case(START + INTERVAL * 03 + 0, "ZZYZXBRKX"); - case(START + INTERVAL * 03 + 1, "ZZXZUDIVU"); + case(START + Rune::UNLOCK_INTERVAL * 03 - 1, "AAAAAAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 03 + 0, "ZZYZXBRKX"); + case(START + Rune::UNLOCK_INTERVAL * 03 + 1, "ZZXZUDIVU"); - case(START + INTERVAL * 04 - 1, "AAAAAAAAA"); - case(START + INTERVAL * 04 + 0, "ZZYZXBRL"); - case(START + INTERVAL * 04 + 1, "ZZXZUDIW"); + case(START + Rune::UNLOCK_INTERVAL * 04 - 1, "AAAAAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 04 + 0, "ZZYZXBRL"); + case(START + Rune::UNLOCK_INTERVAL * 04 + 1, "ZZXZUDIW"); - case(START + INTERVAL * 05 - 1, "AAAAAAAA"); - case(START + INTERVAL * 05 + 0, "ZZYZXBS"); - case(START + INTERVAL * 05 + 1, "ZZXZUDJ"); + case(START + Rune::UNLOCK_INTERVAL * 05 - 1, "AAAAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 05 + 0, "ZZYZXBS"); + case(START + Rune::UNLOCK_INTERVAL * 05 + 1, "ZZXZUDJ"); - case(START + INTERVAL * 06 - 1, "AAAAAAA"); - case(START + INTERVAL * 06 + 0, "ZZYZXC"); - case(START + INTERVAL * 06 + 1, "ZZXZUE"); + case(START + Rune::UNLOCK_INTERVAL * 06 - 1, "AAAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 06 + 0, "ZZYZXC"); + case(START + Rune::UNLOCK_INTERVAL * 06 + 1, "ZZXZUE"); - case(START + INTERVAL * 07 - 1, "AAAAAA"); - case(START + INTERVAL * 07 + 0, "ZZYZY"); - case(START + INTERVAL * 07 + 1, "ZZXZV"); + case(START + Rune::UNLOCK_INTERVAL * 07 - 1, "AAAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 07 + 0, "ZZYZY"); + case(START + Rune::UNLOCK_INTERVAL * 07 + 1, "ZZXZV"); - case(START + INTERVAL * 08 - 1, "AAAAA"); - case(START + INTERVAL * 08 + 0, "ZZZA"); - case(START + INTERVAL * 08 + 1, "ZZYA"); + case(START + Rune::UNLOCK_INTERVAL * 08 - 1, "AAAAA"); + case(START + Rune::UNLOCK_INTERVAL * 08 + 0, "ZZZA"); + case(START + Rune::UNLOCK_INTERVAL * 08 + 1, "ZZYA"); - case(START + INTERVAL * 09 - 1, "AAAA"); - case(START + INTERVAL * 09 + 0, "ZZZ"); - case(START + INTERVAL * 09 + 1, "ZZY"); + case(START + Rune::UNLOCK_INTERVAL * 09 - 1, "AAAA"); + case(START + Rune::UNLOCK_INTERVAL * 09 + 0, "ZZZ"); + case(START + Rune::UNLOCK_INTERVAL * 09 + 1, "ZZY"); - case(START + INTERVAL * 10 - 2, "AAC"); - case(START + INTERVAL * 10 - 1, "AAA"); - case(START + INTERVAL * 10 + 0, "AAA"); - case(START + INTERVAL * 10 + 1, "AAA"); + case(START + Rune::UNLOCK_INTERVAL * 10 - 2, "AAC"); + case(START + Rune::UNLOCK_INTERVAL * 10 - 1, "AAA"); + case(START + Rune::UNLOCK_INTERVAL * 10 + 0, "AAA"); + case(START + Rune::UNLOCK_INTERVAL * 10 + 1, "AAA"); - case(START + INTERVAL * 10 + INTERVAL / 2, "NA"); + case( + START + Rune::UNLOCK_INTERVAL * 10 + Rune::UNLOCK_INTERVAL / 2, + "NA", + ); - case(START + INTERVAL * 11 - 2, "AB"); - case(START + INTERVAL * 11 - 1, "AA"); - case(START + INTERVAL * 11 + 0, "AA"); - case(START + INTERVAL * 11 + 1, "AA"); + case(START + Rune::UNLOCK_INTERVAL * 11 - 2, "AB"); + case(START + Rune::UNLOCK_INTERVAL * 11 - 1, "AA"); + case(START + Rune::UNLOCK_INTERVAL * 11 + 0, "AA"); + case(START + Rune::UNLOCK_INTERVAL * 11 + 1, "AA"); - case(START + INTERVAL * 11 + INTERVAL / 2, "N"); + case( + START + Rune::UNLOCK_INTERVAL * 11 + Rune::UNLOCK_INTERVAL / 2, + "N", + ); - case(START + INTERVAL * 12 - 2, "B"); - case(START + INTERVAL * 12 - 1, "A"); - case(START + INTERVAL * 12 + 0, "A"); - case(START + INTERVAL * 12 + 1, "A"); + case(START + Rune::UNLOCK_INTERVAL * 12 - 2, "B"); + case(START + Rune::UNLOCK_INTERVAL * 12 - 1, "A"); + case(START + Rune::UNLOCK_INTERVAL * 12 + 0, "A"); + case(START + Rune::UNLOCK_INTERVAL * 12 + 1, "A"); } #[test] @@ -382,7 +424,9 @@ mod tests { fn is_reserved() { #[track_caller] fn case(rune: &str, reserved: bool) { - assert_eq!(rune.parse::().unwrap().is_reserved(), reserved); + let rune = rune.parse::().unwrap(); + assert_eq!(rune.is_reserved(), reserved); + assert_eq!(rune.unlock_height(Network::Bitcoin).is_none(), reserved); } case("A", false); @@ -420,4 +464,94 @@ mod tests { case(65536, &[0, 0, 1]); case(u128::MAX, &[255; 16]); } + + #[test] + fn steps_are_sorted_and_unique() { + let mut steps = Rune::STEPS.to_vec(); + steps.sort(); + assert_eq!(steps, Rune::STEPS); + steps.dedup(); + assert_eq!(steps, Rune::STEPS); + } + + #[test] + fn reserved_rune_unlock_height() { + assert_eq!(Rune(Rune::RESERVED).unlock_height(Network::Bitcoin), None); + assert_eq!( + Rune(Rune::RESERVED + 1).unlock_height(Network::Bitcoin), + None + ); + assert_eq!( + Rune(Rune::RESERVED - 1).unlock_height(Network::Bitcoin), + Some(Height(0)) + ); + } + + #[test] + fn unlock_height() { + #[track_caller] + fn case(rune: &str, unlock_height: u32) { + let rune = rune.parse::().unwrap(); + assert_eq!( + rune.unlock_height(Network::Bitcoin), + Some(Height(unlock_height)), + "invalid unlock height for rune `{rune}`", + ); + + if unlock_height > 0 { + assert!(rune >= Rune::minimum_at_height(Network::Bitcoin, Height(unlock_height))); + assert!(rune < Rune::minimum_at_height(Network::Bitcoin, Height(unlock_height - 1))); + } + } + + const START: u32 = SUBSIDY_HALVING_INTERVAL * 4; + + case("AAAAAAAAAAAAB", 0); + + case("AAAAAAAAAAAAA", 0); + + case("ZZZZZZZZZZZZ", START); + + case("ZZZZZZZZZZZ", START + Rune::UNLOCK_INTERVAL); + + case("ZZZZZZZZZZ", START + Rune::UNLOCK_INTERVAL * 2); + + case("ZZZZZZZZZ", START + Rune::UNLOCK_INTERVAL * 3); + + case("ZZYZXBRKWXVA", START); + + case("ZZZ", 997_500); + + case("AAA", 1_014_999); + + case("NNNN", 988_400); + + case("Z", 1_033_173); + case("Y", 1_033_846); + case("P", 1_039_903); + case("O", 1_040_576); + case("N", 1_041_249); + case("M", 1_041_923); + case("L", 1_042_596); + case("K", 1_043_269); + case("J", 1_043_942); + case("I", 1_044_615); + case("H", 1_045_288); + case("G", 1_045_961); + case("F", 1_046_634); + case("E", 1_047_307); + case("D", 1_047_980); + case("C", 1_048_653); + case("B", 1_049_326); + case("A", 1_049_999); + + for i in 0..4 { + for n in Rune::STEPS[i]..Rune::STEPS[i + 1] { + let rune = Rune(n); + let unlock_height = rune.unlock_height(Network::Bitcoin).unwrap(); + assert!(rune >= Rune::minimum_at_height(Network::Bitcoin, unlock_height)); + assert!(rune < Rune::minimum_at_height(Network::Bitcoin, Height(unlock_height.0 - 1))); + } + } + } } diff --git a/crates/ordinals/src/runestone.rs b/crates/ordinals/src/runestone.rs index 82cb43694b..710ae5abd4 100644 --- a/crates/ordinals/src/runestone.rs +++ b/crates/ordinals/src/runestone.rs @@ -186,7 +186,7 @@ impl Runestone { .push_opcode(opcodes::all::OP_RETURN) .push_opcode(Runestone::MAGIC_NUMBER); - for chunk in payload.chunks(MAX_SCRIPT_ELEMENT_SIZE) { + for chunk in payload.chunks(u32::MAX.try_into().unwrap()) { let push: &script::PushBytes = chunk.try_into().unwrap(); builder = builder.push_slice(push); } @@ -1794,7 +1794,7 @@ mod tests { } #[test] - fn runestone_payload_is_chunked() { + fn runestone_payloads_are_not_chunked() { let script = Runestone { edicts: vec![ Edict { @@ -1823,7 +1823,7 @@ mod tests { } .encipher(); - assert_eq!(script.instructions().count(), 4); + assert_eq!(script.instructions().count(), 3); } #[test] diff --git a/crates/ordinals/src/sat.rs b/crates/ordinals/src/sat.rs index cba16e01d8..6a09b5d134 100644 --- a/crates/ordinals/src/sat.rs +++ b/crates/ordinals/src/sat.rs @@ -29,6 +29,18 @@ impl Sat { self.n() >= 50 * COIN_VALUE * 9 && self.n() < 50 * COIN_VALUE * 10 } + pub fn palindrome(self) -> bool { + let mut n = self.0; + let mut reversed = 0; + + while n > 0 { + reversed = reversed * 10 + n % 10; + n /= 10; + } + + self.0 == reversed + } + pub fn percentile(self) -> String { format!("{}%", (self.0 as f64 / Self::LAST.0 as f64) * 100.0) } @@ -97,6 +109,10 @@ impl Sat { Charm::Nineball.set(&mut charms); } + if self.palindrome() { + Charm::Palindrome.set(&mut charms); + } + if self.coin() { Charm::Coin.set(&mut charms); } @@ -803,4 +819,18 @@ mod tests { "failed to parse sat `foo`: invalid percentile", ); } + + #[test] + fn palindrome() { + assert!(Sat(0).palindrome()); + assert!(!Sat(10).palindrome()); + assert!(Sat(11).palindrome()); + } + + #[test] + fn palindrome_charm() { + assert!(Charm::Palindrome.is_set(Sat(0).charms())); + assert!(!Charm::Palindrome.is_set(Sat(10).charms())); + assert!(Charm::Palindrome.is_set(Sat(11).charms())); + } } diff --git a/crates/ordinals/src/sat_point.rs b/crates/ordinals/src/sat_point.rs index 17bf4a2f51..3e10a1b861 100644 --- a/crates/ordinals/src/sat_point.rs +++ b/crates/ordinals/src/sat_point.rs @@ -44,7 +44,7 @@ impl Encodable for SatPoint { } impl Decodable for SatPoint { - fn consensus_decode( + fn consensus_decode( d: &mut D, ) -> Result { Ok(SatPoint { diff --git a/deploy/setup b/deploy/setup index 508e2c7cd5..206c4249ce 100755 --- a/deploy/setup +++ b/deploy/setup @@ -58,6 +58,11 @@ case $CHAIN in CSP_ORIGIN=testnet.ordinals.com ufw allow 18333 ;; + testnet4) + COOKIE_FILE_DIR=/var/lib/bitcoind/testnet4 + CSP_ORIGIN=testnet4.ordinals.com + ufw allow 48333 + ;; *) echo "Unknown chain: $CHAIN" exit 1 diff --git a/docs/book.toml b/docs/book.toml index 5f17ff1f31..77bb124b57 100644 --- a/docs/book.toml +++ b/docs/book.toml @@ -14,7 +14,7 @@ cname = "docs.ordinals.com" default-theme = "coal" git-repository-url = "https://github.com/ordinals/ord" preferred-dark-theme = "coal" -additional-css = ["language-picker.css"] +additional-css = ["index.css"] [output.linkcheck] diff --git a/docs/language-picker.css b/docs/index.css similarity index 77% rename from docs/language-picker.css rename to docs/index.css index 1f7d5377e1..b6a87ef1b9 100644 --- a/docs/language-picker.css +++ b/docs/index.css @@ -1,3 +1,7 @@ +table { + float: left; +} + #language-list { left: auto; right: 10px; diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index d8fbce3cef..86c1b6296b 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -11,6 +11,8 @@ Summary - [Provenance](inscriptions/provenance.md) - [Recursion](inscriptions/recursion.md) - [Rendering](inscriptions/rendering.md) + - [URIs](inscriptions/uris.md) + - [Burning](inscriptions/burning.md) - [Examples](inscriptions/examples.md) - [Runes](runes.md) - [Specification](runes/specification.md) @@ -22,6 +24,7 @@ Summary - [Explorer](guides/explorer.md) - [Wallet](guides/wallet.md) - [Batch Inscribing](guides/batch-inscribing.md) + - [Splitting](guides/splitting.md) - [Collecting](guides/collecting.md) - [Sparrow Wallet](guides/collecting/sparrow-wallet.md) - [Moderation](guides/moderation.md) diff --git a/docs/src/guides/api.md b/docs/src/guides/api.md index 1b3052490c..c368d036e2 100644 --- a/docs/src/guides/api.md +++ b/docs/src/guides/api.md @@ -5,20 +5,22 @@ By default, the `ord server` gives access to endpoints that return JSON instead ## Endpoints
- + GET /address/<ADDRESS> - + ### Description -List all assets of an address. Requires index with `--index-addresses` flag. +List all assets of an address. Requires index with `--index-addresses` flag. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/address/bc1pdrm7tcyk4k6c3cdcjwkp49jmfrwmtvt0dvqyy7y4qp79tgks4lmqdpj6rw ``` + ```json { "outputs": [ @@ -90,13 +92,16 @@ curl -s -H "Accept: application/json" \ ### Description + Returns info about the specified block. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f ``` + ```json { "best_height": 864325, @@ -136,6 +141,7 @@ curl -s -H "Accept: application/json" \ ### Description + Returns info about the specified block. ### Example @@ -144,7 +150,8 @@ Returns info about the specified block. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/block/0 ``` - ```json + +```json { "best_height": 864325, "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", @@ -173,14 +180,14 @@ curl -s -H "Accept: application/json" \ } ] } - ``` -
+``` + -
- - GET - /blockcount - +
+ + GET + /blockcount + ### Description @@ -192,16 +199,17 @@ Returns the height of the latest block. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/blockcount ``` - ```json - 864328 - ``` -
-
- - GET - /blockhash - +```json +864328 +``` +
+ +
+ + GET + /blockhash + ### Description @@ -213,17 +221,18 @@ Returns blockhash for the latest block. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/blockhash ``` - ```text - 00000000000000000000c82c12a925a224605b1bb767f696ae4ff10332dbe9bc - ``` -
- -
- - GET - /blockhash/<BLOCKHEIGHT> -     - + +```text +00000000000000000000c82c12a925a224605b1bb767f696ae4ff10332dbe9bc +``` +
+ +
+ + GET + /blockhash/<BLOCKHEIGHT> +     + ### Description @@ -235,10 +244,11 @@ Returns blockhash of specified block. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/blockhash/840000 ``` + ```text - 0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5 - ``` -
+0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5 +``` +
@@ -256,10 +266,11 @@ Returns the height of the latest block. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/blockheight ``` - ```json - 864330 - ``` -
+ +```json +864330 +``` +
@@ -277,172 +288,173 @@ Returns the height of the latest block, the blockhashes of the last 100 blocks, curl -s -H "Accept: application/json" \ http://0.0.0.0:80/blocks ``` - ```json - { - "last": 864335, - "blocks": [ - "00000000000000000002794398a350a04cc371ee33659296a980214f0f060adc", - "000000000000000000000470180b94350be751ea1ade67c4235c5b9515380b1f", - "000000000000000000016e1769c5aa0f3781dd99ce2d5172a696c546d442e481", - "00000000000000000002043c5ed07ad806a1c7133cf34670333326009d6195a6", - "000000000000000000017cd6200b2711c024094e64797619263d74433c2bc880", - "00000000000000000002dd6a13fffde71c09e67855d03340787e6a9b951c44df", - "00000000000000000000c82c12a925a224605b1bb767f696ae4ff10332dbe9bc", - "000000000000000000024ea66d1cddf1cfd8a3926a8e691844143da1596526db", - "00000000000000000001bd9376dfbd9689239e9c5d11d579d6c8885a0efa199c", - "0000000000000000000081f76cbccc29d92024f07f0e0b7e6b7dd063bed69bcc", - "00000000000000000000e1ca2bab230aeb6cb75b1bb5b766cb55f1a391a7d408", - "00000000000000000001fc567723ff6ccf674981202617384ae2152a711710d3", - "00000000000000000002381ab1fa4661bfecc3429424c415788cef2c62c630bb", - "000000000000000000022a1cacf15fa28d4d3698506c7b76fc62d7e50053be1f", - "000000000000000000023b6d0182255bcc633e27ecdf8a86918830fdfd4f9612", - "00000000000000000001135bd270114428c2c021e6c4161be93ba7ec9dc4e720", - "0000000000000000000269e44d995970caf720ecc272f3554d923b74c57e84ed", - "00000000000000000000e0224234536f4724c144c8da5cbaea486f3b26ef808a", - "0000000000000000000102ae83593c0b5046cc6ec3beadf133e2a9b69fb761da", - "000000000000000000014d52c9b6d9ca1fd2419562d24ff87214fcdf1688b8c4", - "00000000000000000001bc24775ec320b6af4c1210395a4092c29b7af265153c", - "00000000000000000000f4498b608a6a476bed5c4164478f618d19bcc02da3fa", - "0000000000000000000255810324c89ec4ef87a0d028968dc70aed1817bac8e8", - "0000000000000000000213bbddd4cce2831bda4865ae7025074b2a30fb228c7c", - "00000000000000000002b4cf1c7c051fd712df4447ac5e90ecde1d4429a06358", - "000000000000000000006b39a84f7bfc592293bc044c28fb57dfa660d41acc36", - "00000000000000000001cd132f83def8f13b87974eb4d2629b11f52e3016c097", - "00000000000000000001963de3de854dd9da9f384fb2ef753ba94c105cc807c6", - "00000000000000000000fc1b08733842cb0f2d3dae7f56545805b403aa0d3621", - "0000000000000000000049464eaf610aa71edaaf33e465c47981811395c3cdc7", - "0000000000000000000137881c0f7bc6b762daf8370935444fdb13b98ed4572e", - "00000000000000000001e7cc406d66013c17db6e9f8c90b807c93936fa18f192", - "0000000000000000000084d8e77f14bcdc71acedf0ba5be6b70562dcf76e2ba2", - "00000000000000000002e278d6c35e96eebb964694c430527db43301efdf367f", - "00000000000000000002ace24c94d6f927e4cad8d72839508a275d6a2882c408", - "00000000000000000002c165514bb47cef5b8eacedbabce070fc7147f6b8a48e", - "0000000000000000000251f0eabbbf2bb58837cd284a1a44275e76d11b6da62a", - "00000000000000000000650e34e08c4bc732961ce33a2b9051044ed95e95d82f", - "00000000000000000000ecd0dfe9c0a52b2a7bcf48edcdcb2df19b827afcbed2", - "0000000000000000000048131b07192e8f4466e36d025ea773e0dadcf442713f", - "000000000000000000012eb14a615f799bf628e371ee5e7dd0b518d108fc74cd", - "0000000000000000000025d47721b228c712aeb50bfd13768d8925274c1015ef", - "0000000000000000000326c89fe7dfe7737f75368ce78404c1ffb1b08c422641", - "00000000000000000002ff417f03781bbce1a1082cfaff8cf5c066c9a7547a28", - "00000000000000000002bd4acc44f416975f25aa719e07abc2c0dd12761e4d17", - "0000000000000000000188b4408d6131395ef6ca544b35cf37e7575779b15471", - "00000000000000000003253f74e3f5d35aacbef57aee3225c9e071036309aad6", - "0000000000000000000322bfda974265420bb6b604cd577410b9ca5cccbeae17", - "00000000000000000001535fdb2eb0efe673bd505bcec47a9fdedd7b83d22a6c", - "0000000000000000000169fb1a4daaaf4e08d12fcf670a81ed0f7bb4f5328494", - "0000000000000000000315eb8d0ea1cbd251c7ea2404041c352823e29a6f376a", - "000000000000000000021aef6c217e2eae81d1702d1331ab8f91360e55a60c51", - "00000000000000000000ffb1ee2423e399153433e634db68ca4aad8a829b61da", - "00000000000000000000a6e99c9e050d4345606016673d674da4aade02a8ff8a", - "00000000000000000000349de7338756bdb425cc13a3e22e986b4035d00f097b", - "00000000000000000000045218f05f939e0386ddec2460c815e5c671bfd20892", - "000000000000000000007f99d51dd0738c42ce7dc83e59061a2b33f971b6d3ab", - "00000000000000000002fc37d0f7ec804a1063a4ff8613521fcc99f1ab8fe07a", - "00000000000000000002daff4047da69c658a1badb00d14d7d3e709f76b8bf3b", - "00000000000000000001a427c71546cda9a5577d5e38bc95a5d3450df7c1d26f", - "000000000000000000004648af338d38563d26c3a5bef3ca9582ea2ccb72f8ea", - "00000000000000000001428e153a325e9aa859589a80e8b0271d1ba48e8749c7", - "000000000000000000005ea10805f8ab474b9888bdc2c2840cd2e5529bbd0d49", - "00000000000000000002c7b5bcf3372c7441e79bda1310c53f35eb59483b9092", - "00000000000000000001e2486f12c01ca0f76481b40181bf6f8f48802ade8c49", - "000000000000000000024590edc9d2d4878b32a4944dfda1a3929a6e4c9c3592", - "000000000000000000028f255235dca42b10e5da593c2d4eb006cb329a041587", - "000000000000000000006fb8f4a5d906e9c0112d5a97188f392407ab8e95bd81", - "00000000000000000002864156220f1093e76caf233009c1b6be9ee0d810ac29", - "000000000000000000009d28b5b1336abfe552aa8d92e56c1c254a1eee0e0b4b", - "000000000000000000029ad7c816c8a4f79f93e60defbc6aee7cf25e61b46008", - "00000000000000000002af0693f1c73282516b97031b7d956d07756a6f8a13d0", - "00000000000000000001376f75d1785015b1c4717b2612a7c1bc8de69817c768", - "00000000000000000000cd6e3f3ec308a26831d8866ea51beab6b02d3a5d0812", - "00000000000000000002cf32a666fabf1789ffa4fa4215f78b52406b716936d2", - "0000000000000000000310254c2c405a46c9710e52a7a7728bac5079b90e25ba", - "00000000000000000002cb11925574071edd904390823344b7ca616640971081", - "000000000000000000022e5bf2570eaee0532c0edee2a2682d4a74488ca0522f", - "000000000000000000031542e9c2b0dbd43b4e7caa3f24537af0d39bfa3997cf", - "00000000000000000002215bb1138bbc4a7611826b13e532b51d5b4e82eeac3d", - "00000000000000000001c3a1c78d27f0072f27dc1d0060273e0ef03f1bfc0ce9", - "00000000000000000001fe6ba288a1b9a14d15d3e915418cbfb54685595b0cc1", - "0000000000000000000067f8164cd2e75b3ba172cb98cd00f0894faee5c6f763", - "000000000000000000018ef9990389ca9052a0c1c93b65f780d3071346e531f3", - "000000000000000000023e7bee6b1b4647411b0279df23c9ad470d91c1b99081", - "00000000000000000000a085f77681ddf175c74b897758e9f406a17f1a278030", - "000000000000000000001bf9c32af2d6a8a4f3d50c40f927e0867d4ad9481fdd", - "00000000000000000000cde89e34036ece454ca2d07ddd7f71ab46307ca87423", - "00000000000000000001141c91e70decadd60a93f32b70b08a8ec6d74b270b08", - "000000000000000000023562ac878ab6f62329a70a15954bd56e088f3a836426", - "000000000000000000006a4455949ef37cf3c3ee6b4cc2da27137f24445c7058", - "0000000000000000000297397401eee3019168e761464c3716892951a5e33cbc", - "000000000000000000015b68955519ab2925858ebbd02f897ff81cfc4a360dd4", - "000000000000000000018a0932deb92c6bc40d46a34e654f8a2afbd6c745c6a3", - "00000000000000000001996de65cc72f1fdeaebc3141db0a2a2dd269233c8e56", - "00000000000000000000d0434cc36c19d49b9e873661ff171d632543d5c2f454", - "00000000000000000003184a301f7c76332ec629a51bcaab5652f2ba82da55d8", - "00000000000000000001e47fd13c25e24f8933b02a38c3490c0a430c0b71ea9e", - "000000000000000000027fe376111297406696afa48be122d6596b13ac15156a", - "00000000000000000002ab8ba2529a468c0f2781e3afc0f832209c94f95d4f1d" + +```json +{ + "last": 864335, + "blocks": [ + "00000000000000000002794398a350a04cc371ee33659296a980214f0f060adc", + "000000000000000000000470180b94350be751ea1ade67c4235c5b9515380b1f", + "000000000000000000016e1769c5aa0f3781dd99ce2d5172a696c546d442e481", + "00000000000000000002043c5ed07ad806a1c7133cf34670333326009d6195a6", + "000000000000000000017cd6200b2711c024094e64797619263d74433c2bc880", + "00000000000000000002dd6a13fffde71c09e67855d03340787e6a9b951c44df", + "00000000000000000000c82c12a925a224605b1bb767f696ae4ff10332dbe9bc", + "000000000000000000024ea66d1cddf1cfd8a3926a8e691844143da1596526db", + "00000000000000000001bd9376dfbd9689239e9c5d11d579d6c8885a0efa199c", + "0000000000000000000081f76cbccc29d92024f07f0e0b7e6b7dd063bed69bcc", + "00000000000000000000e1ca2bab230aeb6cb75b1bb5b766cb55f1a391a7d408", + "00000000000000000001fc567723ff6ccf674981202617384ae2152a711710d3", + "00000000000000000002381ab1fa4661bfecc3429424c415788cef2c62c630bb", + "000000000000000000022a1cacf15fa28d4d3698506c7b76fc62d7e50053be1f", + "000000000000000000023b6d0182255bcc633e27ecdf8a86918830fdfd4f9612", + "00000000000000000001135bd270114428c2c021e6c4161be93ba7ec9dc4e720", + "0000000000000000000269e44d995970caf720ecc272f3554d923b74c57e84ed", + "00000000000000000000e0224234536f4724c144c8da5cbaea486f3b26ef808a", + "0000000000000000000102ae83593c0b5046cc6ec3beadf133e2a9b69fb761da", + "000000000000000000014d52c9b6d9ca1fd2419562d24ff87214fcdf1688b8c4", + "00000000000000000001bc24775ec320b6af4c1210395a4092c29b7af265153c", + "00000000000000000000f4498b608a6a476bed5c4164478f618d19bcc02da3fa", + "0000000000000000000255810324c89ec4ef87a0d028968dc70aed1817bac8e8", + "0000000000000000000213bbddd4cce2831bda4865ae7025074b2a30fb228c7c", + "00000000000000000002b4cf1c7c051fd712df4447ac5e90ecde1d4429a06358", + "000000000000000000006b39a84f7bfc592293bc044c28fb57dfa660d41acc36", + "00000000000000000001cd132f83def8f13b87974eb4d2629b11f52e3016c097", + "00000000000000000001963de3de854dd9da9f384fb2ef753ba94c105cc807c6", + "00000000000000000000fc1b08733842cb0f2d3dae7f56545805b403aa0d3621", + "0000000000000000000049464eaf610aa71edaaf33e465c47981811395c3cdc7", + "0000000000000000000137881c0f7bc6b762daf8370935444fdb13b98ed4572e", + "00000000000000000001e7cc406d66013c17db6e9f8c90b807c93936fa18f192", + "0000000000000000000084d8e77f14bcdc71acedf0ba5be6b70562dcf76e2ba2", + "00000000000000000002e278d6c35e96eebb964694c430527db43301efdf367f", + "00000000000000000002ace24c94d6f927e4cad8d72839508a275d6a2882c408", + "00000000000000000002c165514bb47cef5b8eacedbabce070fc7147f6b8a48e", + "0000000000000000000251f0eabbbf2bb58837cd284a1a44275e76d11b6da62a", + "00000000000000000000650e34e08c4bc732961ce33a2b9051044ed95e95d82f", + "00000000000000000000ecd0dfe9c0a52b2a7bcf48edcdcb2df19b827afcbed2", + "0000000000000000000048131b07192e8f4466e36d025ea773e0dadcf442713f", + "000000000000000000012eb14a615f799bf628e371ee5e7dd0b518d108fc74cd", + "0000000000000000000025d47721b228c712aeb50bfd13768d8925274c1015ef", + "0000000000000000000326c89fe7dfe7737f75368ce78404c1ffb1b08c422641", + "00000000000000000002ff417f03781bbce1a1082cfaff8cf5c066c9a7547a28", + "00000000000000000002bd4acc44f416975f25aa719e07abc2c0dd12761e4d17", + "0000000000000000000188b4408d6131395ef6ca544b35cf37e7575779b15471", + "00000000000000000003253f74e3f5d35aacbef57aee3225c9e071036309aad6", + "0000000000000000000322bfda974265420bb6b604cd577410b9ca5cccbeae17", + "00000000000000000001535fdb2eb0efe673bd505bcec47a9fdedd7b83d22a6c", + "0000000000000000000169fb1a4daaaf4e08d12fcf670a81ed0f7bb4f5328494", + "0000000000000000000315eb8d0ea1cbd251c7ea2404041c352823e29a6f376a", + "000000000000000000021aef6c217e2eae81d1702d1331ab8f91360e55a60c51", + "00000000000000000000ffb1ee2423e399153433e634db68ca4aad8a829b61da", + "00000000000000000000a6e99c9e050d4345606016673d674da4aade02a8ff8a", + "00000000000000000000349de7338756bdb425cc13a3e22e986b4035d00f097b", + "00000000000000000000045218f05f939e0386ddec2460c815e5c671bfd20892", + "000000000000000000007f99d51dd0738c42ce7dc83e59061a2b33f971b6d3ab", + "00000000000000000002fc37d0f7ec804a1063a4ff8613521fcc99f1ab8fe07a", + "00000000000000000002daff4047da69c658a1badb00d14d7d3e709f76b8bf3b", + "00000000000000000001a427c71546cda9a5577d5e38bc95a5d3450df7c1d26f", + "000000000000000000004648af338d38563d26c3a5bef3ca9582ea2ccb72f8ea", + "00000000000000000001428e153a325e9aa859589a80e8b0271d1ba48e8749c7", + "000000000000000000005ea10805f8ab474b9888bdc2c2840cd2e5529bbd0d49", + "00000000000000000002c7b5bcf3372c7441e79bda1310c53f35eb59483b9092", + "00000000000000000001e2486f12c01ca0f76481b40181bf6f8f48802ade8c49", + "000000000000000000024590edc9d2d4878b32a4944dfda1a3929a6e4c9c3592", + "000000000000000000028f255235dca42b10e5da593c2d4eb006cb329a041587", + "000000000000000000006fb8f4a5d906e9c0112d5a97188f392407ab8e95bd81", + "00000000000000000002864156220f1093e76caf233009c1b6be9ee0d810ac29", + "000000000000000000009d28b5b1336abfe552aa8d92e56c1c254a1eee0e0b4b", + "000000000000000000029ad7c816c8a4f79f93e60defbc6aee7cf25e61b46008", + "00000000000000000002af0693f1c73282516b97031b7d956d07756a6f8a13d0", + "00000000000000000001376f75d1785015b1c4717b2612a7c1bc8de69817c768", + "00000000000000000000cd6e3f3ec308a26831d8866ea51beab6b02d3a5d0812", + "00000000000000000002cf32a666fabf1789ffa4fa4215f78b52406b716936d2", + "0000000000000000000310254c2c405a46c9710e52a7a7728bac5079b90e25ba", + "00000000000000000002cb11925574071edd904390823344b7ca616640971081", + "000000000000000000022e5bf2570eaee0532c0edee2a2682d4a74488ca0522f", + "000000000000000000031542e9c2b0dbd43b4e7caa3f24537af0d39bfa3997cf", + "00000000000000000002215bb1138bbc4a7611826b13e532b51d5b4e82eeac3d", + "00000000000000000001c3a1c78d27f0072f27dc1d0060273e0ef03f1bfc0ce9", + "00000000000000000001fe6ba288a1b9a14d15d3e915418cbfb54685595b0cc1", + "0000000000000000000067f8164cd2e75b3ba172cb98cd00f0894faee5c6f763", + "000000000000000000018ef9990389ca9052a0c1c93b65f780d3071346e531f3", + "000000000000000000023e7bee6b1b4647411b0279df23c9ad470d91c1b99081", + "00000000000000000000a085f77681ddf175c74b897758e9f406a17f1a278030", + "000000000000000000001bf9c32af2d6a8a4f3d50c40f927e0867d4ad9481fdd", + "00000000000000000000cde89e34036ece454ca2d07ddd7f71ab46307ca87423", + "00000000000000000001141c91e70decadd60a93f32b70b08a8ec6d74b270b08", + "000000000000000000023562ac878ab6f62329a70a15954bd56e088f3a836426", + "000000000000000000006a4455949ef37cf3c3ee6b4cc2da27137f24445c7058", + "0000000000000000000297397401eee3019168e761464c3716892951a5e33cbc", + "000000000000000000015b68955519ab2925858ebbd02f897ff81cfc4a360dd4", + "000000000000000000018a0932deb92c6bc40d46a34e654f8a2afbd6c745c6a3", + "00000000000000000001996de65cc72f1fdeaebc3141db0a2a2dd269233c8e56", + "00000000000000000000d0434cc36c19d49b9e873661ff171d632543d5c2f454", + "00000000000000000003184a301f7c76332ec629a51bcaab5652f2ba82da55d8", + "00000000000000000001e47fd13c25e24f8933b02a38c3490c0a430c0b71ea9e", + "000000000000000000027fe376111297406696afa48be122d6596b13ac15156a", + "00000000000000000002ab8ba2529a468c0f2781e3afc0f832209c94f95d4f1d" + ], + "featured_blocks": { + "000000000000000000000470180b94350be751ea1ade67c4235c5b9515380b1f": [ + "0ae94b05b21aa6b7f0620075db618a70124cb422fc5ced577bffbd0d103d4ce7i0", + "65f1922bc83ee43485ed884dbec24c0c1cef6c4f6d999a8ac0c09d7adc8b39dbi0", + "e87c21c7c8ba8b194bd8e389f6cb9ecb2312c076139aff31c629f93df86b98ffi0", + "aeb8d90de7e92efc11ffa6b411e829b6dcb0e00b7fd4f912947065b9084d99bai0", + "6d8f58c7f24e277d614bc6c9bb6648543e47db5431c6c073a6bd5e3be1e47c5ci0", + "770cde7a5c49ae8a4f109bd83fb364ef9b83bc6f72d3654c793f5452d7b30831i0", + "65e51357e67da9dd64a65fff1d9d26153c9969f4acfbab028e74b408559dfc07i0", + "7c63687fabdcd421de925e99b4152b2327328afe51c63903aa4a9cc9fba31872i0" ], - "featured_blocks": { - "000000000000000000000470180b94350be751ea1ade67c4235c5b9515380b1f": [ - "0ae94b05b21aa6b7f0620075db618a70124cb422fc5ced577bffbd0d103d4ce7i0", - "65f1922bc83ee43485ed884dbec24c0c1cef6c4f6d999a8ac0c09d7adc8b39dbi0", - "e87c21c7c8ba8b194bd8e389f6cb9ecb2312c076139aff31c629f93df86b98ffi0", - "aeb8d90de7e92efc11ffa6b411e829b6dcb0e00b7fd4f912947065b9084d99bai0", - "6d8f58c7f24e277d614bc6c9bb6648543e47db5431c6c073a6bd5e3be1e47c5ci0", - "770cde7a5c49ae8a4f109bd83fb364ef9b83bc6f72d3654c793f5452d7b30831i0", - "65e51357e67da9dd64a65fff1d9d26153c9969f4acfbab028e74b408559dfc07i0", - "7c63687fabdcd421de925e99b4152b2327328afe51c63903aa4a9cc9fba31872i0" - ], - "000000000000000000017cd6200b2711c024094e64797619263d74433c2bc880": [ - "c970b695f491a8812b5293da2673f4e6c9ae3d8be07d9da1fbb9c33a45f6fd1fi0", - "d001827b7c48e44399587f12e2fa33b2c0b1eb12c309f1c21729f1e3bc95c5fci0", - "facefc9cd6dec1cc25d7b7321cbbdaed735049a9a3da834a66975d98e23ac4dfi0", - "09353363c2e95891db553f3742a40a74c5dd1b7668669f732d58e52e7c132b92i0", - "48f3f7cbf3061957c06f66c0fe66be9ad4ad73df65b9ded1345e05f904e1e63di0", - "4e65b1d0b36c6727c646d5d6f45f00db35158a49a139282d6544f127734db9adi0", - "b8c744320e735aaaec18fd6b306d6dd678f99461e88dfa25f178627b8480e483i0", - "55d27ab1b4321addc5c34c10ef2ac4957add8b8485f465df7f2883315c9cf5f5i0" - ], - "000000000000000000016e1769c5aa0f3781dd99ce2d5172a696c546d442e481": [ - "cc2415293c275bea4d73ff8f45f68f269686b819de447f50ec6988ac04a62d1bi0", - "c642cd4cc7a075c61d3a32b949217990aa91dfc928f12a2cdba1f2f228c699c7i0", - "5342721d044e9e9999484b988ce9fb71097d9209c77f6549df9e31ec9b344c5bi0", - "a75f792be155a0b53691289433a6413c1efb1aeaf970f752ee70be3c6e755a06i0", - "19c0d770abaaeb5b24e718231684d53b768450cc324c8fee435910de65c459e2i0", - "30eb7c46bf4f5af33e665a119af40dd45d127cb6cdc2596de75e08f094651fa5i0", - "122631e7b8bab4238582229273a9dbe08544d2d97ad0c9a80b5829ae10ac3f27i0", - "41c304db88c60a27f45957442b857c0affefdfdca45bdf72ab4cbf9fce4d97a0i0" - ], - "00000000000000000002043c5ed07ad806a1c7133cf34670333326009d6195a6": [ - "2f62d6ed309f838bab143cf3a53ba758eb940b43c30c32e22d9dbf6fe7882613i0", - "83642352c5b670387874995954f79e270cb78b05a9a88b9d4d65e6f94c6df0a3i0", - "68831e3c8669ad5e8fc3585a9e8a55673123ada4c33a699e98e4d9e0297f1800i0", - "20fa9d317af18cc976a6b77797ceb5884127ac5dd7e3f131565a18dd712311c6i0", - "a286d7f705fd410cdd3f1081c4c22f196bdea4c64cfbd963f45302cdec1fe968i0", - "11eb110f86d880d8dcac852edcca7007904fda34ad031fc01f24a3e6b02ef47ci0", - "9fbec6d72d71169dc041693e740dae7bb7bb195ccd4a7f40c4c12bd4afbf7354i0", - "7c823fe74fa783debea8339fbea44b8395805295652749a651aa2133d9a1832di0" - ], - "00000000000000000002794398a350a04cc371ee33659296a980214f0f060adc": [ - "2596a275dca4b5cc18cd1060ab92d6df3df5507738b8f2b6b7c18c4ff1d1b36ai0", - "93256e5da147f0067d6b11e09d853b838ad1d95cf59664cccbcd52859f9ea1aci0", - "f404b5ebabd4b7fb8b88df52289b983b28f3e36fcbb63e649edea6e7ba62e582i1", - "f404b5ebabd4b7fb8b88df52289b983b28f3e36fcbb63e649edea6e7ba62e582i0", - "1bfbd226fded339cbe197153ab8b6da622c9a20e7d4911013abd385da7e05b89i0", - "af7b8810755bdf7bd62dbb6c5f2639e107a6d9d2c7199ae3650f1e7583d4bd66i0", - "9c594cb991bfecdf9d2116b644262927365f20f03ccdc8a64cbb640c11a58907i0", - "29628c91948bc100185605d11cde0aebda572d73b752bd6ed668bd86e455aa8di0" - ] - } + "000000000000000000017cd6200b2711c024094e64797619263d74433c2bc880": [ + "c970b695f491a8812b5293da2673f4e6c9ae3d8be07d9da1fbb9c33a45f6fd1fi0", + "d001827b7c48e44399587f12e2fa33b2c0b1eb12c309f1c21729f1e3bc95c5fci0", + "facefc9cd6dec1cc25d7b7321cbbdaed735049a9a3da834a66975d98e23ac4dfi0", + "09353363c2e95891db553f3742a40a74c5dd1b7668669f732d58e52e7c132b92i0", + "48f3f7cbf3061957c06f66c0fe66be9ad4ad73df65b9ded1345e05f904e1e63di0", + "4e65b1d0b36c6727c646d5d6f45f00db35158a49a139282d6544f127734db9adi0", + "b8c744320e735aaaec18fd6b306d6dd678f99461e88dfa25f178627b8480e483i0", + "55d27ab1b4321addc5c34c10ef2ac4957add8b8485f465df7f2883315c9cf5f5i0" + ], + "000000000000000000016e1769c5aa0f3781dd99ce2d5172a696c546d442e481": [ + "cc2415293c275bea4d73ff8f45f68f269686b819de447f50ec6988ac04a62d1bi0", + "c642cd4cc7a075c61d3a32b949217990aa91dfc928f12a2cdba1f2f228c699c7i0", + "5342721d044e9e9999484b988ce9fb71097d9209c77f6549df9e31ec9b344c5bi0", + "a75f792be155a0b53691289433a6413c1efb1aeaf970f752ee70be3c6e755a06i0", + "19c0d770abaaeb5b24e718231684d53b768450cc324c8fee435910de65c459e2i0", + "30eb7c46bf4f5af33e665a119af40dd45d127cb6cdc2596de75e08f094651fa5i0", + "122631e7b8bab4238582229273a9dbe08544d2d97ad0c9a80b5829ae10ac3f27i0", + "41c304db88c60a27f45957442b857c0affefdfdca45bdf72ab4cbf9fce4d97a0i0" + ], + "00000000000000000002043c5ed07ad806a1c7133cf34670333326009d6195a6": [ + "2f62d6ed309f838bab143cf3a53ba758eb940b43c30c32e22d9dbf6fe7882613i0", + "83642352c5b670387874995954f79e270cb78b05a9a88b9d4d65e6f94c6df0a3i0", + "68831e3c8669ad5e8fc3585a9e8a55673123ada4c33a699e98e4d9e0297f1800i0", + "20fa9d317af18cc976a6b77797ceb5884127ac5dd7e3f131565a18dd712311c6i0", + "a286d7f705fd410cdd3f1081c4c22f196bdea4c64cfbd963f45302cdec1fe968i0", + "11eb110f86d880d8dcac852edcca7007904fda34ad031fc01f24a3e6b02ef47ci0", + "9fbec6d72d71169dc041693e740dae7bb7bb195ccd4a7f40c4c12bd4afbf7354i0", + "7c823fe74fa783debea8339fbea44b8395805295652749a651aa2133d9a1832di0" + ], + "00000000000000000002794398a350a04cc371ee33659296a980214f0f060adc": [ + "2596a275dca4b5cc18cd1060ab92d6df3df5507738b8f2b6b7c18c4ff1d1b36ai0", + "93256e5da147f0067d6b11e09d853b838ad1d95cf59664cccbcd52859f9ea1aci0", + "f404b5ebabd4b7fb8b88df52289b983b28f3e36fcbb63e649edea6e7ba62e582i1", + "f404b5ebabd4b7fb8b88df52289b983b28f3e36fcbb63e649edea6e7ba62e582i0", + "1bfbd226fded339cbe197153ab8b6da622c9a20e7d4911013abd385da7e05b89i0", + "af7b8810755bdf7bd62dbb6c5f2639e107a6d9d2c7199ae3650f1e7583d4bd66i0", + "9c594cb991bfecdf9d2116b644262927365f20f03ccdc8a64cbb640c11a58907i0", + "29628c91948bc100185605d11cde0aebda572d73b752bd6ed668bd86e455aa8di0" + ] } - ``` +} +```
- -GET -/blocktime - + + GET + /blocktime + ### Description @@ -454,16 +466,17 @@ Returns the UNIX timestamp of when the latest block was mined. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/blocktime ``` + ```json 1728158372 - ``` +```
- -GET -/decode/<TRANSCATION_ID> - + + GET + /decode/<TRANSCATION_ID> + ### Description @@ -475,844 +488,845 @@ Decode a transaction, congruent to the `ord decode` command curl -s -H "Accept: application/json" \ http://0.0.0.0:80/decode/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799 ``` - ```json - { - "inscriptions": [ - { - "input": 0, - "offset": 0, - "payload": { - "body": [ - 137, - 80, - 78, - 71, - 13, - 10, - 26, - 10, - 0, - 0, - 0, - 13, - 73, - 72, - 68, - 82, - 0, - 0, - 0, - 100, - 0, - 0, - 0, - 100, - 1, - 3, - 0, - 0, - 0, - 74, - 44, - 7, - 23, - 0, - 0, - 0, - 6, - 80, - 76, - 84, - 69, - 255, - 255, - 255, - 0, - 0, - 0, - 85, - 194, - 211, - 126, - 0, - 0, - 2, - 206, - 73, - 68, - 65, - 84, - 56, - 203, - 149, - 212, - 75, - 104, - 19, - 65, - 24, - 7, - 240, - 148, - 74, - 19, - 16, - 93, - 20, - 180, - 20, - 105, - 22, - 193, - 179, - 61, - 21, - 11, - 125, - 44, - 228, - 90, - 176, - 39, - 41, - 90, - 75, - 14, - 30, - 74, - 91, - 74, - 43, - 69, - 18, - 250, - 200, - 86, - 60, - 120, - 80, - 154, - 187, - 104, - 5, - 17, - 81, - 170, - 205, - 161, - 96, - 11, - 77, - 178, - 161, - 120, - 145, - 98, - 2, - 30, - 4, - 109, - 147, - 77, - 201, - 33, - 133, - 154, - 221, - 196, - 144, - 108, - 146, - 221, - 157, - 191, - 33, - 51, - 59, - 1, - 193, - 67, - 231, - 246, - 227, - 155, - 239, - 49, - 51, - 236, - 186, - 206, - 184, - 36, - 172, - 181, - 209, - 9, - 212, - 218, - 18, - 178, - 46, - 210, - 214, - 136, - 8, - 161, - 189, - 181, - 14, - 148, - 179, - 60, - 205, - 0, - 108, - 158, - 232, - 214, - 36, - 172, - 91, - 142, - 196, - 180, - 170, - 4, - 100, - 222, - 237, - 80, - 85, - 150, - 101, - 167, - 140, - 172, - 198, - 186, - 21, - 57, - 193, - 4, - 77, - 246, - 39, - 193, - 138, - 118, - 168, - 165, - 198, - 104, - 9, - 11, - 172, - 65, - 24, - 68, - 7, - 25, - 96, - 13, - 194, - 168, - 22, - 64, - 134, - 168, - 4, - 213, - 172, - 84, - 76, - 132, - 152, - 74, - 90, - 161, - 170, - 149, - 8, - 149, - 247, - 38, - 10, - 85, - 104, - 97, - 170, - 222, - 95, - 234, - 92, - 85, - 157, - 13, - 48, - 77, - 162, - 82, - 129, - 49, - 206, - 78, - 167, - 106, - 149, - 138, - 134, - 121, - 58, - 154, - 148, - 55, - 235, - 101, - 211, - 2, - 83, - 29, - 181, - 28, - 202, - 76, - 50, - 113, - 141, - 232, - 107, - 2, - 232, - 216, - 193, - 58, - 146, - 183, - 229, - 114, - 142, - 42, - 16, - 128, - 49, - 9, - 59, - 77, - 53, - 55, - 15, - 243, - 26, - 200, - 15, - 170, - 25, - 213, - 109, - 238, - 89, - 226, - 12, - 139, - 69, - 175, - 219, - 59, - 197, - 167, - 159, - 89, - 222, - 195, - 115, - 171, - 198, - 151, - 75, - 44, - 47, - 152, - 93, - 24, - 54, - 30, - 39, - 88, - 77, - 249, - 32, - 19, - 215, - 35, - 75, - 50, - 213, - 224, - 126, - 195, - 171, - 159, - 63, - 89, - 166, - 179, - 244, - 135, - 177, - 17, - 145, - 72, - 63, - 213, - 224, - 38, - 89, - 215, - 250, - 26, - 123, - 84, - 146, - 128, - 245, - 45, - 137, - 136, - 84, - 189, - 34, - 146, - 154, - 140, - 110, - 246, - 40, - 227, - 24, - 139, - 251, - 109, - 63, - 149, - 32, - 34, - 109, - 200, - 240, - 50, - 9, - 120, - 45, - 74, - 132, - 201, - 189, - 73, - 94, - 25, - 125, - 141, - 40, - 191, - 121, - 69, - 84, - 200, - 16, - 211, - 126, - 67, - 194, - 179, - 147, - 21, - 166, - 131, - 204, - 106, - 119, - 106, - 201, - 81, - 118, - 193, - 54, - 142, - 19, - 22, - 83, - 176, - 211, - 220, - 171, - 117, - 30, - 81, - 117, - 141, - 8, - 166, - 73, - 132, - 231, - 44, - 38, - 195, - 232, - 5, - 142, - 184, - 170, - 23, - 184, - 4, - 25, - 191, - 223, - 1, - 25, - 42, - 17, - 248, - 185, - 45, - 3, - 84, - 18, - 176, - 125, - 87, - 129, - 243, - 42, - 50, - 201, - 223, - 215, - 161, - 210, - 91, - 90, - 133, - 153, - 212, - 150, - 97, - 80, - 25, - 10, - 54, - 116, - 9, - 177, - 108, - 75, - 150, - 10, - 209, - 47, - 98, - 170, - 165, - 142, - 211, - 113, - 226, - 247, - 143, - 217, - 247, - 138, - 45, - 153, - 119, - 106, - 170, - 242, - 160, - 50, - 65, - 101, - 169, - 127, - 82, - 241, - 105, - 76, - 81, - 65, - 169, - 78, - 69, - 191, - 65, - 161, - 58, - 197, - 206, - 98, - 79, - 90, - 105, - 180, - 228, - 170, - 146, - 239, - 75, - 163, - 95, - 231, - 11, - 180, - 67, - 125, - 115, - 160, - 120, - 156, - 123, - 177, - 77, - 21, - 90, - 33, - 110, - 75, - 200, - 167, - 216, - 107, - 62, - 209, - 109, - 131, - 212, - 36, - 42, - 9, - 101, - 211, - 172, - 59, - 103, - 16, - 176, - 146, - 143, - 230, - 85, - 194, - 110, - 130, - 40, - 205, - 57, - 35, - 22, - 85, - 7, - 81, - 136, - 142, - 72, - 209, - 249, - 252, - 82, - 68, - 39, - 139, - 89, - 166, - 91, - 1, - 162, - 219, - 233, - 53, - 166, - 158, - 212, - 225, - 68, - 104, - 145, - 193, - 229, - 141, - 223, - 120, - 27, - 142, - 56, - 186, - 24, - 59, - 52, - 3, - 91, - 142, - 4, - 25, - 64, - 134, - 11, - 0, - 8, - 223, - 169, - 120, - 124, - 34, - 223, - 233, - 14, - 26, - 177, - 220, - 17, - 87, - 224, - 101, - 126, - 184, - 173, - 57, - 143, - 239, - 106, - 91, - 211, - 30, - 223, - 229, - 255, - 197, - 116, - 143, - 207, - 107, - 113, - 205, - 2, - 13, - 30, - 235, - 250, - 208, - 204, - 251, - 200, - 245, - 169, - 153, - 199, - 229, - 126, - 228, - 241, - 93, - 105, - 87, - 49, - 154, - 221, - 121, - 149, - 206, - 221, - 230, - 100, - 187, - 92, - 104, - 78, - 93, - 115, - 212, - 161, - 3, - 164, - 232, - 200, - 101, - 2, - 102, - 150, - 43, - 244, - 230, - 125, - 36, - 193, - 37, - 218, - 227, - 248, - 231, - 63, - 120, - 182, - 245, - 23, - 127, - 181, - 197, - 106, - 45, - 115, - 252, - 75, - 0, - 0, - 0, - 0, - 73, - 69, - 78, - 68, - 174, - 66, - 96, - 130 - ], - "content_encoding": null, - "content_type": [ - 105, - 109, - 97, - 103, - 101, - 47, - 112, - 110, - 103 - ], - "delegate": null, - "duplicate_field": false, - "incomplete_field": false, - "metadata": null, - "metaprotocol": null, - "parents": [], - "pointer": null, - "rune": null, - "unrecognized_even_field": false - }, - "pushnum": false, - "stutter": false - } - ], - "runestone": null - } - ``` + +```json +{ + "inscriptions": [ + { + "input": 0, + "offset": 0, + "payload": { + "body": [ + 137, + 80, + 78, + 71, + 13, + 10, + 26, + 10, + 0, + 0, + 0, + 13, + 73, + 72, + 68, + 82, + 0, + 0, + 0, + 100, + 0, + 0, + 0, + 100, + 1, + 3, + 0, + 0, + 0, + 74, + 44, + 7, + 23, + 0, + 0, + 0, + 6, + 80, + 76, + 84, + 69, + 255, + 255, + 255, + 0, + 0, + 0, + 85, + 194, + 211, + 126, + 0, + 0, + 2, + 206, + 73, + 68, + 65, + 84, + 56, + 203, + 149, + 212, + 75, + 104, + 19, + 65, + 24, + 7, + 240, + 148, + 74, + 19, + 16, + 93, + 20, + 180, + 20, + 105, + 22, + 193, + 179, + 61, + 21, + 11, + 125, + 44, + 228, + 90, + 176, + 39, + 41, + 90, + 75, + 14, + 30, + 74, + 91, + 74, + 43, + 69, + 18, + 250, + 200, + 86, + 60, + 120, + 80, + 154, + 187, + 104, + 5, + 17, + 81, + 170, + 205, + 161, + 96, + 11, + 77, + 178, + 161, + 120, + 145, + 98, + 2, + 30, + 4, + 109, + 147, + 77, + 201, + 33, + 133, + 154, + 221, + 196, + 144, + 108, + 146, + 221, + 157, + 191, + 33, + 51, + 59, + 1, + 193, + 67, + 231, + 246, + 227, + 155, + 239, + 49, + 51, + 236, + 186, + 206, + 184, + 36, + 172, + 181, + 209, + 9, + 212, + 218, + 18, + 178, + 46, + 210, + 214, + 136, + 8, + 161, + 189, + 181, + 14, + 148, + 179, + 60, + 205, + 0, + 108, + 158, + 232, + 214, + 36, + 172, + 91, + 142, + 196, + 180, + 170, + 4, + 100, + 222, + 237, + 80, + 85, + 150, + 101, + 167, + 140, + 172, + 198, + 186, + 21, + 57, + 193, + 4, + 77, + 246, + 39, + 193, + 138, + 118, + 168, + 165, + 198, + 104, + 9, + 11, + 172, + 65, + 24, + 68, + 7, + 25, + 96, + 13, + 194, + 168, + 22, + 64, + 134, + 168, + 4, + 213, + 172, + 84, + 76, + 132, + 152, + 74, + 90, + 161, + 170, + 149, + 8, + 149, + 247, + 38, + 10, + 85, + 104, + 97, + 170, + 222, + 95, + 234, + 92, + 85, + 157, + 13, + 48, + 77, + 162, + 82, + 129, + 49, + 206, + 78, + 167, + 106, + 149, + 138, + 134, + 121, + 58, + 154, + 148, + 55, + 235, + 101, + 211, + 2, + 83, + 29, + 181, + 28, + 202, + 76, + 50, + 113, + 141, + 232, + 107, + 2, + 232, + 216, + 193, + 58, + 146, + 183, + 229, + 114, + 142, + 42, + 16, + 128, + 49, + 9, + 59, + 77, + 53, + 55, + 15, + 243, + 26, + 200, + 15, + 170, + 25, + 213, + 109, + 238, + 89, + 226, + 12, + 139, + 69, + 175, + 219, + 59, + 197, + 167, + 159, + 89, + 222, + 195, + 115, + 171, + 198, + 151, + 75, + 44, + 47, + 152, + 93, + 24, + 54, + 30, + 39, + 88, + 77, + 249, + 32, + 19, + 215, + 35, + 75, + 50, + 213, + 224, + 126, + 195, + 171, + 159, + 63, + 89, + 166, + 179, + 244, + 135, + 177, + 17, + 145, + 72, + 63, + 213, + 224, + 38, + 89, + 215, + 250, + 26, + 123, + 84, + 146, + 128, + 245, + 45, + 137, + 136, + 84, + 189, + 34, + 146, + 154, + 140, + 110, + 246, + 40, + 227, + 24, + 139, + 251, + 109, + 63, + 149, + 32, + 34, + 109, + 200, + 240, + 50, + 9, + 120, + 45, + 74, + 132, + 201, + 189, + 73, + 94, + 25, + 125, + 141, + 40, + 191, + 121, + 69, + 84, + 200, + 16, + 211, + 126, + 67, + 194, + 179, + 147, + 21, + 166, + 131, + 204, + 106, + 119, + 106, + 201, + 81, + 118, + 193, + 54, + 142, + 19, + 22, + 83, + 176, + 211, + 220, + 171, + 117, + 30, + 81, + 117, + 141, + 8, + 166, + 73, + 132, + 231, + 44, + 38, + 195, + 232, + 5, + 142, + 184, + 170, + 23, + 184, + 4, + 25, + 191, + 223, + 1, + 25, + 42, + 17, + 248, + 185, + 45, + 3, + 84, + 18, + 176, + 125, + 87, + 129, + 243, + 42, + 50, + 201, + 223, + 215, + 161, + 210, + 91, + 90, + 133, + 153, + 212, + 150, + 97, + 80, + 25, + 10, + 54, + 116, + 9, + 177, + 108, + 75, + 150, + 10, + 209, + 47, + 98, + 170, + 165, + 142, + 211, + 113, + 226, + 247, + 143, + 217, + 247, + 138, + 45, + 153, + 119, + 106, + 170, + 242, + 160, + 50, + 65, + 101, + 169, + 127, + 82, + 241, + 105, + 76, + 81, + 65, + 169, + 78, + 69, + 191, + 65, + 161, + 58, + 197, + 206, + 98, + 79, + 90, + 105, + 180, + 228, + 170, + 146, + 239, + 75, + 163, + 95, + 231, + 11, + 180, + 67, + 125, + 115, + 160, + 120, + 156, + 123, + 177, + 77, + 21, + 90, + 33, + 110, + 75, + 200, + 167, + 216, + 107, + 62, + 209, + 109, + 131, + 212, + 36, + 42, + 9, + 101, + 211, + 172, + 59, + 103, + 16, + 176, + 146, + 143, + 230, + 85, + 194, + 110, + 130, + 40, + 205, + 57, + 35, + 22, + 85, + 7, + 81, + 136, + 142, + 72, + 209, + 249, + 252, + 82, + 68, + 39, + 139, + 89, + 166, + 91, + 1, + 162, + 219, + 233, + 53, + 166, + 158, + 212, + 225, + 68, + 104, + 145, + 193, + 229, + 141, + 223, + 120, + 27, + 142, + 56, + 186, + 24, + 59, + 52, + 3, + 91, + 142, + 4, + 25, + 64, + 134, + 11, + 0, + 8, + 223, + 169, + 120, + 124, + 34, + 223, + 233, + 14, + 26, + 177, + 220, + 17, + 87, + 224, + 101, + 126, + 184, + 173, + 57, + 143, + 239, + 106, + 91, + 211, + 30, + 223, + 229, + 255, + 197, + 116, + 143, + 207, + 107, + 113, + 205, + 2, + 13, + 30, + 235, + 250, + 208, + 204, + 251, + 200, + 245, + 169, + 153, + 199, + 229, + 126, + 228, + 241, + 93, + 105, + 87, + 49, + 154, + 221, + 121, + 149, + 206, + 221, + 230, + 100, + 187, + 92, + 104, + 78, + 93, + 115, + 212, + 161, + 3, + 164, + 232, + 200, + 101, + 2, + 102, + 150, + 43, + 244, + 230, + 125, + 36, + 193, + 37, + 218, + 227, + 248, + 231, + 63, + 120, + 182, + 245, + 23, + 127, + 181, + 197, + 106, + 45, + 115, + 252, + 75, + 0, + 0, + 0, + 0, + 73, + 69, + 78, + 68, + 174, + 66, + 96, + 130 + ], + "content_encoding": null, + "content_type": [ + 105, + 109, + 97, + 103, + 101, + 47, + 112, + 110, + 103 + ], + "delegate": null, + "duplicate_field": false, + "incomplete_field": false, + "metadata": null, + "metaprotocol": null, + "parents": [], + "pointer": null, + "rune": null, + "unrecognized_even_field": false + }, + "pushnum": false, + "stutter": false + } + ], + "runestone": null +} +```
- -GET -/inscription/<INSCRIPTION_ID> - + + GET + /inscription/<INSCRIPTION_ID> + ### Description @@ -1324,39 +1338,40 @@ Fetch details about a specific inscription by its ID. curl -s -H "Accept: application/json" / http://0.0.0.0:80/inscription/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0 ``` + ```json - { - "address": "bc1ppth27qnr74qhusy9pmcyeaelgvsfky6qzquv9nf56gqmte59vfhqwkqguh", - "charms": [], - "children": [ - "681b5373c03e3f819231afd9227f54101395299c9e58356bda278e2f32bef2cdi0", - "b1ef66c2d1a047cbaa6260b74daac43813924378fe08ef8545da4cb79e8fcf00i0", - "47c7260764af2ee17aa584d9c035f2e5429aefd96b8016cfe0e3f0bcf04869a3i0" - ], - "content_length": 793, - "content_type": "image/png", - "effective_content_type": "image/png", - "fee": 322, - "height": 767430, - "id": "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0", - "next": "26482871f33f1051f450f2da9af275794c0b5f1c61ebf35e4467fb42c2813403i0", - "number": 0, - "parents": [], - "previous": null, - "rune": null, - "sat": null, - "satpoint": "47c7260764af2ee17aa584d9c035f2e5429aefd96b8016cfe0e3f0bcf04869a3:0:0", - "timestamp": 1671049920, - "value": 606 - } - ``` +{ + "address": "bc1ppth27qnr74qhusy9pmcyeaelgvsfky6qzquv9nf56gqmte59vfhqwkqguh", + "charms": [], + "children": [ + "681b5373c03e3f819231afd9227f54101395299c9e58356bda278e2f32bef2cdi0", + "b1ef66c2d1a047cbaa6260b74daac43813924378fe08ef8545da4cb79e8fcf00i0", + "47c7260764af2ee17aa584d9c035f2e5429aefd96b8016cfe0e3f0bcf04869a3i0" + ], + "content_length": 793, + "content_type": "image/png", + "effective_content_type": "image/png", + "fee": 322, + "height": 767430, + "id": "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0", + "next": "26482871f33f1051f450f2da9af275794c0b5f1c61ebf35e4467fb42c2813403i0", + "number": 0, + "parents": [], + "previous": null, + "rune": null, + "sat": null, + "satpoint": "47c7260764af2ee17aa584d9c035f2e5429aefd96b8016cfe0e3f0bcf04869a3:0:0", + "timestamp": 1671049920, + "value": 606 +} +```
- -GET -/inscription/<INSCRIPTION_ID>/<CHILD> - + + GET + /inscription/<INSCRIPTION_ID>/<CHILD> + ### Description @@ -1368,6 +1383,7 @@ Returns the inscription information for the specified child. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/inscription/b1ef66c2d1a047cbaa6260b74daac43813924378fe08ef8545da4cb79e8fcf00i0/0 ``` + ```json { "address": "bc1pnhyyzpetra3zvm376ng8ncnv9phtt45fczpt7sv2eatedtjj9vjqwhj080", @@ -1397,10 +1413,10 @@ curl -s -H "Accept: application/json" \
- -POST -/inscriptions - + + POST + /inscriptions + ### Description @@ -1415,6 +1431,7 @@ curl -s -X POST \ -d '["ab924ff229beca227bf40221faf492a20b5e2ee4f084524c84a5f98b80fe527fi1", "ab924ff229beca227bf40221faf492a20b5e2ee4f084524c84a5f98b80fe527fi0"]' \ http://0.0.0.0:80/inscriptions ``` + ```json [ { @@ -1470,10 +1487,10 @@ curl -s -X POST \
- -GET -/inscriptions - + + GET + /inscriptions + ### Description @@ -1485,6 +1502,7 @@ Get a list of the latest 100 inscriptions. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/inscriptions ``` + ```json { "ids": [ @@ -1596,10 +1614,10 @@ curl -s -H "Accept: application/json" \
- -GET -/inscriptions/<PAGE> - + + GET + /inscriptions/<PAGE> + ### Description @@ -1611,121 +1629,122 @@ Pagination allows you to choose which page of 100 inscriptions to return. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/inscriptions/9 ``` - ```json - { - "ids": [ - "6fa8b4d1840fdd2172b51a40bde3c8b88ff2ca8b668e56fe05edb1d5eec91fc7i0", - "c6f11a3269e7ea108abb9d596c4273067f33f7e951bb4762b915a6c3c3e1ebc6i0", - "24829232f529c1c4d1bfc5c1c1410313c6388c1db14137fdc351f8659eab72c6i0", - "c068402416ec57e773d9d072ad51950b77359eddbf515a775bc6c70bf75869c6i0", - "3ffdf269a5a6a306c6e2e03b73b505a4f2dac3e0708257bca37c12d2ceec3ac6i0", - "f505cc5a01e603bee41e3986c0bfe020cd4054cbdfd0a35b57d89e375ba1e6c5i0", - "3caeb09bc1a6c7e3ac33528f69b9b10755072aac2c7b6b4f58878df45572ccc5i0", - "2233ee78d07be90ae18d12d51cc89734eb691b550b687c1547b0791de668b2c5i0", - "86475391a0e7f13f3b475e3b4aedb8ada36b63bf9bc4f9ac9203fb083a39a2c5i0", - "18fa7b8a0949b57fa4798ccf48e4ba4a16ecb14651edd5a5adc3806eaea0c9c4i0", - "fb6a338c0de40e88e03e7ae5231b036e5f452343db128b849049c2e63d0bc6c4i0", - "374e71e371dfedcfa2f9ac1d6f2d0664effe46ca27907792e396a3176a82a3c4i0", - "bc2b2fef1231c07232cd1333978366255e317e000a04c050262a7d71eaab0cc4i0", - "d627b48539c497f768279669be7690af5af8f302bfb2641989dacce8c4eed8c3i0", - "632cf2db36977e4e091ed50d61185ad78d97e7a6c6ba468b844bfd7ac9b8aec3i0", - "2fc44592a0d8924c8f48c9fcea8b189f9008f2795380446c0d13a9e452f284c3i0", - "2e84632f9f2965d8648a36e2695070e3f9a06fab1fa72176d95652a19d6d3dc3i0", - "c78e74a90bb23e55d23b221d6f184581d75f0e97acd94b6ab9c2536bae79f2c2i0", - "b4eb0dc05c24f48105d80c38c2ced8789c7910960d07db3e7326cbfae5ded9c2i0", - "5f166abe3f70f72479518451f11d67b6217a67e539c08440f844c6f71f2ea1c2i0", - "32c2d37d9bd7f6a019e48bc8bbcd0b07cee07314724f517935b1e0ff490e5cc2i0", - "0876e126bf57724045c799b0f1f6ae206d2bd15c4533212ec243951f03d834c2i0", - "6492faedbf75e28c4637b6a1e518d063c0da130c461bb193bf7215364c7bf5c1i0", - "be6f1f3e8ac1841f05dc0d67b650890dc845fbfd2d3833f48a0adb5016a6a2c1i0", - "1cb2cb5519aea30e3921d59862bb1ca7d2a61430fdf6b64dc2d84a35fcc52dc1i0", - "00d0f2dab82c0f1ba5208cd95cf204505617cdbaab854675875035f584fc0fc1i0", - "4fd6ea5ecc0660d4b238deeeef7c7a238ed324a5343e5a83d0cd34d0cba7f0c0i0", - "cb1d5b0b9c88e1cd2646939e2809119ba857770e0aacfa069ecf992745435bc0i0", - "30394ffad8c25f93083e9044b3faca9fdcce9610af522a3d72c8bf6478e612c0i0", - "2c80a5b7628e1cba9b890d4946d202fa9d534e0d4edb575ca18fc8fede1d05c0i0", - "e3bca997a4494d2c43b441eefda53ec1c63277fb79e93204787d3733bf9f91bfi0", - "7efeed6060c4a0749bd537b36d469fd874e66914b661de992a053e4702d618bfi0", - "39cc481cad92dfbe5a7db974a8f40f0b945ec0a10cf0e525a1e40214ae9b9ebei0", - "776725263fec5b995932dde0c79a511838b2f4da976d767ec357490d8e5142bei0", - "01d5456b25bf80cf0bc661f5fe65167382cb67c324ab88f9a622c0722f3934bei0", - "6cd9d02f08c818eca61fd40362855dce8157af0708460023710b2982053b2fbei0", - "ff4f062a8e1fba6d5089a7517bfadf996a24a79181cfffa479fb5142227c0bbei0", - "da23c5f3ca73c51fecdbfb7a77f028eb269bc438192e08fa7828850f7907b9bdi0", - "804a382fe000066845dd2f53bb33d880dce201b0595da73843f115d85f789dbdi0", - "3a837c80348691f965dbacf9414498c19eea184be8872509830ddc8e555611bdi0", - "d87bdf8547ff587af6ab4e9ba58cfabd81e9dbae29ebee7f91ee4ce504b1e7bci0", - "47f448eab72fa27e3ecd48cd9366f3900e13e3f385081a63027c3252452dcebci0", - "f98248bd62d1893623d07789d2b77c76c726343272fe33cffd0598496792bfbci0", - "9f4f89d78bf18eec65fad5a7e1e4b48023733678df1f831f762713aa28a7adbci0", - "99603a91e9c394b8a08e41292afa612773054a1852ad50b70b926e8ed5ff98bci0", - "ab9a8bc85f80436eb801f0b44525e735949b702b88165f276d9d5370a08792bci0", - "68a66f966af6a8df8a697d026f53ac3d1bbf16fe60e4c00046c38ca42e4c6abci0", - "f85395c84a44416973091c7b5b54093511a4e420d79b8a95f25392f60ee164bci0", - "0d94b03575c0abcd9b50463402c57c05a8fb13fdc4838b3ea38fdb4214a93fbci0", - "9101836abf01e3c2ec3b131bd392063aab15aafc15c83331e33bd5f27bddeabbi0", - "a6b1b98105d3a8b6552e191e0bc300ac432bdba02b87d7e69cca7a5f22e9cebbi0", - "38031a62f117119561f095109367359b1ec5b513cce605e99d3ad4fb3d73ccbbi0", - "518505a149382542af4a249a0ea3e8393eb11baaf1e607bb7fa089ccb0acb7bbi0", - "d6033366e191c597b5d060ccd11213625f7ca276a8dd3649db9463c401d654bbi0", - "23c94df33db29f2068237528c50bccb9af14dabeb1b4c370c1ce2cfaf2bb12bbi0", - "11407eeb6ecd4b5f721d3bdbb24d80c57bf978438466d44a37f4400dcf40dcbai0", - "26fd15fe036f3ff842e060207150594d5327963a5af729d9d7bb37f9b27cc9bai0", - "c85d49988d0a9e63b57a42b0f43b085ac848b4eec3c7567c6ff9835b28b7bfbai0", - "6f9d8c063ebd8777d42609563d5a2753739ba9822afdbd3f30248aa3622c1bbai0", - "59a5c6c8ebf33e8af27c5ca3a1fc34c6ec4a3933024431d74a7107c4cdb518bai0", - "113a792a0665cc766fe1725e94da88af51d637f0b4b2d8bab8acefc60a7fa2b9i0", - "74f75991f2f1f877c01834c8840778a67a66403ec6fe6db4889bd773a0c8f2b8i0", - "1aea70b0b26f38543f5ac323c88287b8b128f275eac1b26e316a86e14bf6c4b8i0", - "fb24445c829b8e9739be2153bf44f8962191c9ef470fa5a0a8cf6014d3939ab8i0", - "4f7bd6fb95500aad569bd9772f49545f997ffed98782938e6d030d1f0ea482b8i0", - "340716bc1585d9b57fc6c21e298caed04c84b27bd45873799b31b63d7fb965b8i0", - "cc515eb5a3125b80a8d7a2ac8e0ba54206185715332ebe6434dfbc86661053b8i0", - "e1ad8b866a5b25b67ccaf2b4e63eddb02b24e2a7abd8c3fd2c5d4ae488f83bb8i0", - "bd723e4bc055e8a43d52e80041664b94dd24a7e1a1c4aa02f39841596a0d76b7i0", - "45efc579e0fbbc539eeaf6fedc30fdd156fca6e32d7d0fff87c568b411a651b7i0", - "6ff468ac685ea84a44977322e23371aee5c6eb75d35207a60dd8b43d32632db7i0", - "9adda4d80df93b592ed215aee39da04fe4a43aec06a97f7228b483a747f4ebb6i0", - "adf97725b496134ebfd0eaaceb63f23d94052a585f557206f33443c2d659e6b6i0", - "41565db258d48adc4e0ff3467534890ee6a12beaed5378847667735affb8e2b6i0", - "fab5be5f8860e29eb394e56bd0a668752c346d1bdda73dc6a2fc2e824a17dbb6i0", - "1307d9531f2759ffcd125bdaf31ed9116c103a991a17d5b43b2e41a7e17460b6i0", - "5494d587b738c901b727c39628d94eb021a836bd78e82b20f6e331ed5c2850b6i0", - "6e98fb69311cf79bd271b13411df9e6b6138705fd08db20fe36a897eb4b513b6i0", - "f6f5d494bd9211ec6b71e9270f4a87237647e7f655ce7c10392fe1c80d8affb5i0", - "7fe37c78b2be6788af0fe810d5b6aedb1bb9c166b70667105e43de13234ee6b5i0", - "8093e0684c094a22b23f328b1dbd50c487c3ab37bc230de456a12b7fde95bcb5i0", - "7511c5ef23ab23f8e009e368b7954c4ed7e67a7a1cd94bae99b7d93a192a90b5i0", - "c98658f7731c9b5342c6a51f0860fec09fbcab9867b986d4704736abf1b0f6b4i0", - "b56001aa7fc59eb40068ea41e0f35a54f4d73c3483cd69ae0c26bb95dfc9e9b4i0", - "4147fbe40586287b1e6144c066731e43959e1aa7d3c7c8ea301ee44fd0b37fb4i0", - "3d43b7b45e4c0e062b21147be0ebdd68f9094f4e9c7b8a686aeb2948b40fbfb3i0", - "6e66c9e03e18250806515a3a60e4a6012f37e87aa1446a679ade384c7e55a3b3i0", - "8215caa5d781be0d5fae9ce7cb1a04efa17f82fb66cb2fa99e4c7bb1a2f479b3i0", - "ce288cac29042474740fa477163767a0fcf74b228e48748630ac7193118429b3i0", - "6d35d614a3574e85d80e27fdc5854a055c484dbf09f155411e279a839aa8ddb2i0", - "906804e50f92a51329b5009d65e5f6e3c32e512279c835c3171ea6765eaca6b2i0", - "70bd0c3531d62ab836187dd956e1e3fb7ef9903124b818a78e5ecd5198f5a3b2i0", - "92c2668efad88467edded7ffc50fb05a063e7b2b555ccc2073f41d599bb037b2i0", - "e97700fc461598ac01bcb2b74cde9ee31e608bfc7f53047e9e494697509f1fb2i0", - "f9d7f767ae23e67ccb9ffd21d9f83ef9a7b6617f5988a08481e1f722de05d1b1i0", - "262f07835303d1e3a8dce57c93488ed1512ad8ed633c9f129c1bc82535c99ab1i0", - "4ea5e8e9cc2c7414d2652c8db87ef556b48e61d60f68cef9c319eb87566e3db1i0", - "acfae264071fa0bb8bd7875e2d607ad48fac549c0817c2dba40858ee95571eb1i0", - "ed150d8980b923b214b8ea115a31933bbebf82666f93c68a1e11ebd3fee3d9b0i0", - "d9ea50a1c374d2feaf87a4ba82967aab419c1ecc4caac3964f69dac7323ca0b0i0" - ], - "more": true, - "page_index": 9 - } - ``` + +```json +{ + "ids": [ + "6fa8b4d1840fdd2172b51a40bde3c8b88ff2ca8b668e56fe05edb1d5eec91fc7i0", + "c6f11a3269e7ea108abb9d596c4273067f33f7e951bb4762b915a6c3c3e1ebc6i0", + "24829232f529c1c4d1bfc5c1c1410313c6388c1db14137fdc351f8659eab72c6i0", + "c068402416ec57e773d9d072ad51950b77359eddbf515a775bc6c70bf75869c6i0", + "3ffdf269a5a6a306c6e2e03b73b505a4f2dac3e0708257bca37c12d2ceec3ac6i0", + "f505cc5a01e603bee41e3986c0bfe020cd4054cbdfd0a35b57d89e375ba1e6c5i0", + "3caeb09bc1a6c7e3ac33528f69b9b10755072aac2c7b6b4f58878df45572ccc5i0", + "2233ee78d07be90ae18d12d51cc89734eb691b550b687c1547b0791de668b2c5i0", + "86475391a0e7f13f3b475e3b4aedb8ada36b63bf9bc4f9ac9203fb083a39a2c5i0", + "18fa7b8a0949b57fa4798ccf48e4ba4a16ecb14651edd5a5adc3806eaea0c9c4i0", + "fb6a338c0de40e88e03e7ae5231b036e5f452343db128b849049c2e63d0bc6c4i0", + "374e71e371dfedcfa2f9ac1d6f2d0664effe46ca27907792e396a3176a82a3c4i0", + "bc2b2fef1231c07232cd1333978366255e317e000a04c050262a7d71eaab0cc4i0", + "d627b48539c497f768279669be7690af5af8f302bfb2641989dacce8c4eed8c3i0", + "632cf2db36977e4e091ed50d61185ad78d97e7a6c6ba468b844bfd7ac9b8aec3i0", + "2fc44592a0d8924c8f48c9fcea8b189f9008f2795380446c0d13a9e452f284c3i0", + "2e84632f9f2965d8648a36e2695070e3f9a06fab1fa72176d95652a19d6d3dc3i0", + "c78e74a90bb23e55d23b221d6f184581d75f0e97acd94b6ab9c2536bae79f2c2i0", + "b4eb0dc05c24f48105d80c38c2ced8789c7910960d07db3e7326cbfae5ded9c2i0", + "5f166abe3f70f72479518451f11d67b6217a67e539c08440f844c6f71f2ea1c2i0", + "32c2d37d9bd7f6a019e48bc8bbcd0b07cee07314724f517935b1e0ff490e5cc2i0", + "0876e126bf57724045c799b0f1f6ae206d2bd15c4533212ec243951f03d834c2i0", + "6492faedbf75e28c4637b6a1e518d063c0da130c461bb193bf7215364c7bf5c1i0", + "be6f1f3e8ac1841f05dc0d67b650890dc845fbfd2d3833f48a0adb5016a6a2c1i0", + "1cb2cb5519aea30e3921d59862bb1ca7d2a61430fdf6b64dc2d84a35fcc52dc1i0", + "00d0f2dab82c0f1ba5208cd95cf204505617cdbaab854675875035f584fc0fc1i0", + "4fd6ea5ecc0660d4b238deeeef7c7a238ed324a5343e5a83d0cd34d0cba7f0c0i0", + "cb1d5b0b9c88e1cd2646939e2809119ba857770e0aacfa069ecf992745435bc0i0", + "30394ffad8c25f93083e9044b3faca9fdcce9610af522a3d72c8bf6478e612c0i0", + "2c80a5b7628e1cba9b890d4946d202fa9d534e0d4edb575ca18fc8fede1d05c0i0", + "e3bca997a4494d2c43b441eefda53ec1c63277fb79e93204787d3733bf9f91bfi0", + "7efeed6060c4a0749bd537b36d469fd874e66914b661de992a053e4702d618bfi0", + "39cc481cad92dfbe5a7db974a8f40f0b945ec0a10cf0e525a1e40214ae9b9ebei0", + "776725263fec5b995932dde0c79a511838b2f4da976d767ec357490d8e5142bei0", + "01d5456b25bf80cf0bc661f5fe65167382cb67c324ab88f9a622c0722f3934bei0", + "6cd9d02f08c818eca61fd40362855dce8157af0708460023710b2982053b2fbei0", + "ff4f062a8e1fba6d5089a7517bfadf996a24a79181cfffa479fb5142227c0bbei0", + "da23c5f3ca73c51fecdbfb7a77f028eb269bc438192e08fa7828850f7907b9bdi0", + "804a382fe000066845dd2f53bb33d880dce201b0595da73843f115d85f789dbdi0", + "3a837c80348691f965dbacf9414498c19eea184be8872509830ddc8e555611bdi0", + "d87bdf8547ff587af6ab4e9ba58cfabd81e9dbae29ebee7f91ee4ce504b1e7bci0", + "47f448eab72fa27e3ecd48cd9366f3900e13e3f385081a63027c3252452dcebci0", + "f98248bd62d1893623d07789d2b77c76c726343272fe33cffd0598496792bfbci0", + "9f4f89d78bf18eec65fad5a7e1e4b48023733678df1f831f762713aa28a7adbci0", + "99603a91e9c394b8a08e41292afa612773054a1852ad50b70b926e8ed5ff98bci0", + "ab9a8bc85f80436eb801f0b44525e735949b702b88165f276d9d5370a08792bci0", + "68a66f966af6a8df8a697d026f53ac3d1bbf16fe60e4c00046c38ca42e4c6abci0", + "f85395c84a44416973091c7b5b54093511a4e420d79b8a95f25392f60ee164bci0", + "0d94b03575c0abcd9b50463402c57c05a8fb13fdc4838b3ea38fdb4214a93fbci0", + "9101836abf01e3c2ec3b131bd392063aab15aafc15c83331e33bd5f27bddeabbi0", + "a6b1b98105d3a8b6552e191e0bc300ac432bdba02b87d7e69cca7a5f22e9cebbi0", + "38031a62f117119561f095109367359b1ec5b513cce605e99d3ad4fb3d73ccbbi0", + "518505a149382542af4a249a0ea3e8393eb11baaf1e607bb7fa089ccb0acb7bbi0", + "d6033366e191c597b5d060ccd11213625f7ca276a8dd3649db9463c401d654bbi0", + "23c94df33db29f2068237528c50bccb9af14dabeb1b4c370c1ce2cfaf2bb12bbi0", + "11407eeb6ecd4b5f721d3bdbb24d80c57bf978438466d44a37f4400dcf40dcbai0", + "26fd15fe036f3ff842e060207150594d5327963a5af729d9d7bb37f9b27cc9bai0", + "c85d49988d0a9e63b57a42b0f43b085ac848b4eec3c7567c6ff9835b28b7bfbai0", + "6f9d8c063ebd8777d42609563d5a2753739ba9822afdbd3f30248aa3622c1bbai0", + "59a5c6c8ebf33e8af27c5ca3a1fc34c6ec4a3933024431d74a7107c4cdb518bai0", + "113a792a0665cc766fe1725e94da88af51d637f0b4b2d8bab8acefc60a7fa2b9i0", + "74f75991f2f1f877c01834c8840778a67a66403ec6fe6db4889bd773a0c8f2b8i0", + "1aea70b0b26f38543f5ac323c88287b8b128f275eac1b26e316a86e14bf6c4b8i0", + "fb24445c829b8e9739be2153bf44f8962191c9ef470fa5a0a8cf6014d3939ab8i0", + "4f7bd6fb95500aad569bd9772f49545f997ffed98782938e6d030d1f0ea482b8i0", + "340716bc1585d9b57fc6c21e298caed04c84b27bd45873799b31b63d7fb965b8i0", + "cc515eb5a3125b80a8d7a2ac8e0ba54206185715332ebe6434dfbc86661053b8i0", + "e1ad8b866a5b25b67ccaf2b4e63eddb02b24e2a7abd8c3fd2c5d4ae488f83bb8i0", + "bd723e4bc055e8a43d52e80041664b94dd24a7e1a1c4aa02f39841596a0d76b7i0", + "45efc579e0fbbc539eeaf6fedc30fdd156fca6e32d7d0fff87c568b411a651b7i0", + "6ff468ac685ea84a44977322e23371aee5c6eb75d35207a60dd8b43d32632db7i0", + "9adda4d80df93b592ed215aee39da04fe4a43aec06a97f7228b483a747f4ebb6i0", + "adf97725b496134ebfd0eaaceb63f23d94052a585f557206f33443c2d659e6b6i0", + "41565db258d48adc4e0ff3467534890ee6a12beaed5378847667735affb8e2b6i0", + "fab5be5f8860e29eb394e56bd0a668752c346d1bdda73dc6a2fc2e824a17dbb6i0", + "1307d9531f2759ffcd125bdaf31ed9116c103a991a17d5b43b2e41a7e17460b6i0", + "5494d587b738c901b727c39628d94eb021a836bd78e82b20f6e331ed5c2850b6i0", + "6e98fb69311cf79bd271b13411df9e6b6138705fd08db20fe36a897eb4b513b6i0", + "f6f5d494bd9211ec6b71e9270f4a87237647e7f655ce7c10392fe1c80d8affb5i0", + "7fe37c78b2be6788af0fe810d5b6aedb1bb9c166b70667105e43de13234ee6b5i0", + "8093e0684c094a22b23f328b1dbd50c487c3ab37bc230de456a12b7fde95bcb5i0", + "7511c5ef23ab23f8e009e368b7954c4ed7e67a7a1cd94bae99b7d93a192a90b5i0", + "c98658f7731c9b5342c6a51f0860fec09fbcab9867b986d4704736abf1b0f6b4i0", + "b56001aa7fc59eb40068ea41e0f35a54f4d73c3483cd69ae0c26bb95dfc9e9b4i0", + "4147fbe40586287b1e6144c066731e43959e1aa7d3c7c8ea301ee44fd0b37fb4i0", + "3d43b7b45e4c0e062b21147be0ebdd68f9094f4e9c7b8a686aeb2948b40fbfb3i0", + "6e66c9e03e18250806515a3a60e4a6012f37e87aa1446a679ade384c7e55a3b3i0", + "8215caa5d781be0d5fae9ce7cb1a04efa17f82fb66cb2fa99e4c7bb1a2f479b3i0", + "ce288cac29042474740fa477163767a0fcf74b228e48748630ac7193118429b3i0", + "6d35d614a3574e85d80e27fdc5854a055c484dbf09f155411e279a839aa8ddb2i0", + "906804e50f92a51329b5009d65e5f6e3c32e512279c835c3171ea6765eaca6b2i0", + "70bd0c3531d62ab836187dd956e1e3fb7ef9903124b818a78e5ecd5198f5a3b2i0", + "92c2668efad88467edded7ffc50fb05a063e7b2b555ccc2073f41d599bb037b2i0", + "e97700fc461598ac01bcb2b74cde9ee31e608bfc7f53047e9e494697509f1fb2i0", + "f9d7f767ae23e67ccb9ffd21d9f83ef9a7b6617f5988a08481e1f722de05d1b1i0", + "262f07835303d1e3a8dce57c93488ed1512ad8ed633c9f129c1bc82535c99ab1i0", + "4ea5e8e9cc2c7414d2652c8db87ef556b48e61d60f68cef9c319eb87566e3db1i0", + "acfae264071fa0bb8bd7875e2d607ad48fac549c0817c2dba40858ee95571eb1i0", + "ed150d8980b923b214b8ea115a31933bbebf82666f93c68a1e11ebd3fee3d9b0i0", + "d9ea50a1c374d2feaf87a4ba82967aab419c1ecc4caac3964f69dac7323ca0b0i0" + ], + "more": true, + "page_index": 9 +} +```
- -GET -/inscriptions/block/<BLOCKHEIGHT> - + + GET + /inscriptions/block/<BLOCKHEIGHT> + ### Description @@ -1737,22 +1756,23 @@ Get inscriptions for a specific block. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/inscriptions/block/767430 ``` - ```json - { - "ids": [ - "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0" - ], - "more": false, - "page_index": 0 - } - ``` + +```json +{ + "ids": [ + "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0" + ], + "more": false, + "page_index": 0 +} +```
- -GET -/install.sh - + + GET + /install.sh + ### Description @@ -1760,7 +1780,7 @@ Installs the latest pre-built binary of `ord` ### Example -see [wallet.md](wallet.md#installing-ord) +See [wallet.md](wallet.md#installing-ord)
@@ -1779,20 +1799,22 @@ Returns information about a UTXO, including inscriptions within it. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/output/bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:0 ``` - ```json - { - "address": "bc1pz4kvfpurqc2hwgrq0nwtfve2lfxvdpfcdpzc6ujchyr3ztj6gd9sfr6ayf", - "indexed": false, - "inscriptions": [], - "runes": {}, - "sat_ranges": null, - "script_pubkey": "OP_PUSHNUM_1 OP_PUSHBYTES_32 156cc4878306157720607cdcb4b32afa4cc6853868458d7258b907112e5a434b", - "spent": true, - "transaction": "bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed", - "value": 10000 - } - ``` -
+ +```json +{ + "address": "bc1pz4kvfpurqc2hwgrq0nwtfve2lfxvdpfcdpzc6ujchyr3ztj6gd9sfr6ayf", + "indexed": false, + "inscriptions": [], + "outpoint": "bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:0", + "runes": {}, + "sat_ranges": null, + "script_pubkey": "OP_PUSHNUM_1 OP_PUSHBYTES_32 156cc4878306157720607cdcb4b32afa4cc6853868458d7258b907112e5a434b", + "spent": true, + "transaction": "bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed", + "value": 10000 +} +``` +
@@ -1802,7 +1824,7 @@ curl -s -H "Accept: application/json" \ ### Description -List information from a list of outputs +List information from a list of outputs. ### Example @@ -1812,13 +1834,15 @@ curl -s -X POST \ -H "Content-Type: application/json" \ -d '["bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:0", "bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:1"]' \ http://0.0.0.0:80/outputs - ``` +``` + ```json [ { "address": "bc1pz4kvfpurqc2hwgrq0nwtfve2lfxvdpfcdpzc6ujchyr3ztj6gd9sfr6ayf", "indexed": false, "inscriptions": [], + "outpoint": "bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:0", "runes": {}, "sat_ranges": null, "script_pubkey": "OP_PUSHNUM_1 OP_PUSHBYTES_32 156cc4878306157720607cdcb4b32afa4cc6853868458d7258b907112e5a434b", @@ -1830,6 +1854,7 @@ curl -s -X POST \ "address": "bc1pkc2cdnm6xermt2vzxg9wwcur5prgpl6pms3xf9ydtyax5pnqsgwqvuu5cq", "indexed": false, "inscriptions": [], + "outpoint": "bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:1", "runes": {}, "sat_ranges": null, "script_pubkey": "5120b61586cf7a3647b5a982320ae76383a04680ff41dc2264948d593a6a0660821c", @@ -1842,10 +1867,94 @@ curl -s -X POST \
- -GET -/rune/<RUNE> - + + GET + /outputs/<ADDRESS> + + +### Description + +Get UTXOs held by `
`. + +### Query Parameters + +#### `type` (optional) + +| Value | Description | +|-------------|-------------| +| `any` | return all UTXOs | +| `cardinal` | return UTXOs not containing inscriptions or runes | +| `inscribed` | return UTXOs containing inscriptions | +| `runic` | return UTXOs containing runes | + +### Example + +```bash +curl -s -H "Accept: application/json" \ + "http://0.0.0.0:80/outputs/358mMRwcxuCSkKheuVWaXHJBGKrXo3f6JW?type=cardinal" +``` + +```json +[ + { + "address": "358mMRwcxuCSkKheuVWaXHJBGKrXo3f6JW", + "indexed": true, + "inscriptions": [], + "outpoint": "6737d77ee9fba5f37e5f4128b03479209030bf44f78ffa3f4e94bf9783691b00:0", + "runes": {}, + "sat_ranges": [ + [ + 567775159437503, + 567775159443555 + ], + [ + 1266853954166100, + 1266853954177531 + ], + [ + 1210436862054339, + 1210436862084993 + ], + [ + 690914221328806, + 690914221362332 + ], + [ + 957021421066680, + 957021421075017 + ] + ], + "script_pubkey": "a91425c70777dfcf84ba7479483e262e1bc7bb0bf4d587", + "spent": false, + "transaction": "6737d77ee9fba5f37e5f4128b03479209030bf44f78ffa3f4e94bf9783691b00", + "value": 90000 + }, + { + "address": "358mMRwcxuCSkKheuVWaXHJBGKrXo3f6JW", + "indexed": true, + "inscriptions": [], + "outpoint": "0cfa3e55f14812c119e47936d95abbb4e04f3094f6d86ac16c6e10018b0b2900:0", + "runes": {}, + "sat_ranges": [ + [ + 1773029001419378, + 1773029001509378 + ] + ], + "script_pubkey": "a91425c70777dfcf84ba7479483e262e1bc7bb0bf4d587", + "spent": false, + "transaction": "0cfa3e55f14812c119e47936d95abbb4e04f3094f6d86ac16c6e10018b0b2900", + "value": 90000 + } +] +``` +
+ +
+ + GET + /rune/<RUNE> + ### Description @@ -1857,45 +1966,46 @@ Returns details about the specified rune. Requires index with `--index-runes` fl curl -s -H "Accept: application/json" \ http://localhost/rune/UNCOMMONGOODS ``` - ```json - { - "entry": { - "block": 1, - "burned": 139, - "divisibility": 0, - "etching": "0000000000000000000000000000000000000000000000000000000000000000", - "mints": 33891693, - "number": 0, - "premine": 0, - "spaced_rune": "UNCOMMON•GOODS", - "symbol": "⧉", - "terms": { - "amount": 1, - "cap": 340282366920938463463374607431768211455, - "height": [ - 840000, - 1050000 - ], - "offset": [ - null, - null - ] - }, - "timestamp": 0, - "turbo": true + +```json +{ + "entry": { + "block": 1, + "burned": 139, + "divisibility": 0, + "etching": "0000000000000000000000000000000000000000000000000000000000000000", + "mints": 33891693, + "number": 0, + "premine": 0, + "spaced_rune": "UNCOMMON•GOODS", + "symbol": "⧉", + "terms": { + "amount": 1, + "cap": 340282366920938463463374607431768211455, + "height": [ + 840000, + 1050000 + ], + "offset": [ + null, + null + ] }, - "id": "1:0", - "mintable": true, - "parent": null - } - ``` + "timestamp": 0, + "turbo": true + }, + "id": "1:0", + "mintable": true, + "parent": null +} +```
- -GET -/runes - + + GET + /runes + ### Description @@ -1905,2991 +2015,2993 @@ Returns details for last 100 inscribed runes. Requires index with `--index-rune ```bash curl -s -H "Accept: application/json" \ - 'http://localhost/runes + http://0.0.0.0:80/runes ``` + ```json - { - "entries": [ - [ - "864348:823", - { - "block": 864348, - "burned": 0, - "divisibility": 0, - "etching": "645431123f5ff8b92d057803f2ba786689fd04f2d968d8fb6a4162b63cabc4fd", - "mints": 0, - "number": 119793, - "premine": 0, - "spaced_rune": "ZKSKOOUGYPXB", - "symbol": null, - "terms": { - "amount": 1, - "cap": 87187755, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728166072, - "turbo": false - } - ], - [ - "864348:822", - { - "block": 864348, - "burned": 0, - "divisibility": 0, - "etching": "9d3a1200adfcb2e0ef07e4975120980befcc265cd85b9f2300bc12d4a1ab1beb", - "mints": 0, - "number": 119792, - "premine": 0, - "spaced_rune": "VEMRWZCGQRLL", - "symbol": null, - "terms": { - "amount": 1, - "cap": 183543298, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728166072, - "turbo": false - } - ], - [ - "864346:427", - { - "block": 864346, - "burned": 0, - "divisibility": 0, - "etching": "2acaba44a6dc31cc5f8a8f4ee3a10eb9ca74e47d62975709cb8e81723d91a20d", - "mints": 0, - "number": 119791, - "premine": 0, - "spaced_rune": "LBQPCHACURXD", - "symbol": null, - "terms": { - "amount": 1, - "cap": 12894945, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728165011, - "turbo": false - } - ], - [ - "864343:2413", - { - "block": 864343, - "burned": 0, - "divisibility": 0, - "etching": "6698cd13f630107ccc4b3058cc09b1718aa435e8f9c4eba6b08eea5d13ee809b", - "mints": 0, - "number": 119790, - "premine": 1000000000, - "spaced_rune": "BABY•LEN•SASSAMAN", - "symbol": "Ⱡ", - "terms": { - "amount": 100000, - "cap": 11000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728162943, - "turbo": false - } - ], - [ - "864342:2591", - { - "block": 864342, - "burned": 0, - "divisibility": 1, - "etching": "095513866c6e7aca84a39f403caac493eaa2f53eda848aaee3e96463571ec6d6", - "mints": 0, - "number": 119789, - "premine": 30000, - "spaced_rune": "COMPLETED•IT•MATE", - "symbol": "⚽", - "terms": { - "amount": 100, - "cap": 299999700, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728162376, - "turbo": true - } - ], - [ - "864338:4768", - { - "block": 864338, - "burned": 0, - "divisibility": 0, - "etching": "0d04505188efc69d4e2cb389607663ff556c062e1e2f8c890bfc598c637700ab", - "mints": 0, - "number": 119788, - "premine": 0, - "spaced_rune": "IJEIKMFKELRFRGRGRGEFREFGR", - "symbol": "d", - "terms": { - "amount": 211, - "cap": 554553, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160156, - "turbo": false - } - ], - [ - "864338:4767", - { - "block": 864338, - "burned": 0, - "divisibility": 0, - "etching": "e0490721505254c83a69ce1411b1659b6ecd0690751cf43ac45240ca7d3ab4fb", - "mints": 0, - "number": 119787, - "premine": 0, - "spaced_rune": "CQHMUFFTWWPF", - "symbol": null, - "terms": { - "amount": 1, - "cap": 14372222, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160156, - "turbo": false - } - ], - [ - "864338:4766", - { - "block": 864338, - "burned": 0, - "divisibility": 0, - "etching": "ada836a0e9c834977161543ba7bace0b552e55f88da0398626b1c49a170502dd", - "mints": 0, - "number": 119786, - "premine": 0, - "spaced_rune": "KJMKPVMKREMVBVBFBVFD", - "symbol": "3", - "terms": { - "amount": 332, - "cap": 211222, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160156, - "turbo": false - } - ], - [ - "864337:4402", - { - "block": 864337, - "burned": 0, - "divisibility": 0, - "etching": "ed45aaf2e9b82d55e35a8d0654d0bb044d1d3e2fdd3eb8787d572854316c53c2", - "mints": 0, - "number": 119785, - "premine": 0, - "spaced_rune": "JNJKMLKMNJCMPMCESCVDSV•DV", - "symbol": "2", - "terms": { - "amount": 3222, - "cap": 1111111, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160097, - "turbo": false - } - ], - [ - "864335:913", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "435cc412c946ced0a5ae5a50ee41d2b541f06f09b6f587619507dfbcc61b8842", - "mints": 0, - "number": 119784, - "premine": 0, - "spaced_rune": "UOBYCVAGPLNO", - "symbol": null, - "terms": { - "amount": 1, - "cap": 194090811, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:912", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "79d77e44d66af6ec82ff7970eb3f15b9537408e3888ed0348a265810e99ddd3a", - "mints": 0, - "number": 119783, - "premine": 0, - "spaced_rune": "YNJMQPGPUGWN", - "symbol": null, - "terms": { - "amount": 1, - "cap": 71782828, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:910", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "b014db8f651ec05a1f261f3569c66973318787ad4c7410d6677fc6fcc45e5cfe", - "mints": 0, - "number": 119782, - "premine": 0, - "spaced_rune": "FDLQGMGRYAMF", - "symbol": null, - "terms": { - "amount": 1, - "cap": 135966360, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:909", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "bd649ba830b262ddcf24b0d6da5091f2dbf1276af26ad0809b65a95c42ddbec2", - "mints": 0, - "number": 119781, - "premine": 0, - "spaced_rune": "LBPOUDNUAIDK", - "symbol": null, - "terms": { - "amount": 1, - "cap": 128338720, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:908", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "4ee02e12ba76c8c85208510e078810efbb3843fdaa1323d4e84f40a753d97380", - "mints": 0, - "number": 119780, - "premine": 0, - "spaced_rune": "RNVHGUYHAUCM", - "symbol": null, - "terms": { - "amount": 1, - "cap": 3346818, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:907", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "c9b47a71a2a552450f6259262fc0c23c45148fccb52ee32cd5bb668a467a9f5d", - "mints": 0, - "number": 119779, - "premine": 0, - "spaced_rune": "RTSQQFKTEEBX", - "symbol": null, - "terms": { - "amount": 1, - "cap": 85692692, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:906", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "df772301fef3107549d200fea54f47e46d6aae197f85e93b0068749640028055", - "mints": 0, - "number": 119778, - "premine": 0, - "spaced_rune": "IWHXSPKPYQOX", - "symbol": null, - "terms": { - "amount": 1, - "cap": 166869547, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:905", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "186049ed6091d0a4d9e1abf6d436a6af7bc7603a33c71031b8bb0ba02f386b3a", - "mints": 0, - "number": 119777, - "premine": 0, - "spaced_rune": "OHDKZWZHYLVL", - "symbol": null, - "terms": { - "amount": 1, - "cap": 189310557, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:904", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "74e72d9c58ce6300807d1ca6343fa95f5fa34f3d7e29fc95a94b553ff4c66b36", - "mints": 0, - "number": 119776, - "premine": 0, - "spaced_rune": "NSZNPZDDFYCT", - "symbol": null, - "terms": { - "amount": 1, - "cap": 72959668, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:386", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "76e81c2a204074d61869f58ce86bf8ecfe66f1213bd444c4f22c6f638a401ef9", - "mints": 0, - "number": 119775, - "premine": 0, - "spaced_rune": "NTOOWMNTOOWMNTOOWM", - "symbol": null, - "terms": { - "amount": 1, - "cap": 1000000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864334:4073", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "6c132c6b69ff19d3dbbd0165bcf2fb5db9bba717824a3ff93e94e976b7da5f9e", - "mints": 0, - "number": 119774, - "premine": 0, - "spaced_rune": "HIDDEN•SELDOM•DISEASE•WISE", - "symbol": null, - "terms": { - "amount": 1, - "cap": 1127, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:4070", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "adcbc4dc91e0b354baacb37be52e187fab2cf619c43f0675b26c5e7d58ad1ded", - "mints": 0, - "number": 119773, - "premine": 0, - "spaced_rune": "TYDSJXISYECCOQYYSS", - "symbol": null, - "terms": { - "amount": 1, - "cap": 2361833545833, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:762", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "259fc5e99770c5d2ed0547571981ad191554282e6ab4b2a6eb4083c392edc1cb", - "mints": 0, - "number": 119772, - "premine": 0, - "spaced_rune": "BEGCOAJVXEHW", - "symbol": null, - "terms": { - "amount": 1, - "cap": 38385326, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:433", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "4d324233f38c0cbf36bf1a76e161cbe0ff9f0efb6ee78d94dffdd5f16ec7e8ba", - "mints": 0, - "number": 119771, - "premine": 0, - "spaced_rune": "BEDIALAMDARBEDIALAMDAR", - "symbol": null, - "terms": { - "amount": 5, - "cap": 100000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:432", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "f7b804462b33fd468ef3b171071094f3498968b0a488d08489e16058d470d809", - "mints": 0, - "number": 119770, - "premine": 0, - "spaced_rune": "RUTHMARTINRUTHMARTIN", - "symbol": null, - "terms": { - "amount": 1, - "cap": 999999, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:431", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "51ce542a9557a4894b0dfd705d13268682aa16c83e5eee9c5b1ba4d67113def8", - "mints": 0, - "number": 119769, - "premine": 0, - "spaced_rune": "ULTIVERSEULTIVERSE", - "symbol": null, - "terms": { - "amount": 1, - "cap": 7777777, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:182", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "195dc952cb7c9e8a5c370fe098b4aa1d8bba8225bb4706ee7243b8e3c43f2b32", - "mints": 0, - "number": 119768, - "premine": 0, - "spaced_rune": "NUQHRKVWSYEA", - "symbol": null, - "terms": { - "amount": 1, - "cap": 3063483, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864333:3461", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "65078629f16f0ce11a91da3de877a0ac5a25b5ed4c68d0ba3f6a8e75eab5f871", - "mints": 0, - "number": 119767, - "premine": 0, - "spaced_rune": "FMTJRFVGNHVZNUCB", - "symbol": null, - "terms": { - "amount": 1, - "cap": 5541274870406, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3458", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "8471194b68cfab89a9d6112caf62f97819172d397e91674ec5413ad8f27b2828", - "mints": 0, - "number": 119766, - "premine": 0, - "spaced_rune": "WEELZZLGHGDRTO", - "symbol": null, - "terms": { - "amount": 1, - "cap": 507317119633, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3440", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "90d530d1daf7f1f6ece388a846fe8173a427f71b7e1c5cfc1c035dcd1fc0b017", - "mints": 0, - "number": 119765, - "premine": 0, - "spaced_rune": "MIIOBBPODENFJ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 503174265447, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3437", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "5c0d2bbf9543cd50293fd6671d94502fa08c8c6d11431e0eee4ac3aedbdbc5bc", - "mints": 0, - "number": 119764, - "premine": 0, - "spaced_rune": "TASTE•RISING•FULL", - "symbol": null, - "terms": { - "amount": 1, - "cap": 4812, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3434", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "1766810d3f53cfce81a4e0620c21e8e4643c7a40936dbafa6e88339c025fb5f6", - "mints": 0, - "number": 119763, - "premine": 0, - "spaced_rune": "REGION•MARK•LOW", - "symbol": null, - "terms": { - "amount": 1, - "cap": 2470, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3433", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "f2a6805462cebffc6eb5855d1205dedf9c7f746a7dfd420c153011bb572f58ba", - "mints": 0, - "number": 119762, - "premine": 0, - "spaced_rune": "QHKKEWPTDMNB", - "symbol": null, - "terms": { - "amount": 1, - "cap": 53660832, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3432", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "5d2127d84533fc9d486eaec1a2b76b2d349fe63a06a9d14847b667d360af6e19", - "mints": 0, - "number": 119761, - "premine": 0, - "spaced_rune": "IWLUKGYIWMBP", - "symbol": null, - "terms": { - "amount": 1, - "cap": 94339731, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3431", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "ac4668d63f66c94515dbc2a74faa9152018758a75432cc085a7e7638a24cbc12", - "mints": 0, - "number": 119760, - "premine": 0, - "spaced_rune": "KWUFVEOJVKGQ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 196312580, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:2714", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "c642cd4cc7a075c61d3a32b949217990aa91dfc928f12a2cdba1f2f228c699c7", - "mints": 26, - "number": 119759, - "premine": 210000, - "spaced_rune": "BOUNCE•THE•BITCOIN•CAT", - "symbol": "🐱", - "terms": { - "amount": 1000, - "cap": 20790, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": true - } - ], - [ - "864333:2482", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "cc2415293c275bea4d73ff8f45f68f269686b819de447f50ec6988ac04a62d1b", - "mints": 0, - "number": 119758, - "premine": 30000000, - "spaced_rune": "BITCAT•IS•IN•CONTROL", - "symbol": "🐈", - "terms": { - "amount": 5000, - "cap": 194000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": true - } - ], - [ - "864333:2462", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "a75f792be155a0b53691289433a6413c1efb1aeaf970f752ee70be3c6e755a06", - "mints": 0, - "number": 119757, - "premine": 0, - "spaced_rune": "FIRST•CAT•EATING•BITCOINER", - "symbol": "🙀", - "terms": { - "amount": 1000, - "cap": 21000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": true - } - ], - [ - "864333:1142", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "7488c2909e2bb5f39fb836ee1e18c23487d078e48e2420cc11776c8d7931fea5", - "mints": 0, - "number": 119756, - "premine": 0, - "spaced_rune": "AI•CRYPTO•AI•CRYPTO", - "symbol": "A", - "terms": { - "amount": 1000, - "cap": 1, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1140", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "a024e2d4c4e15eab941376a954bb9176bc95990ba6b2a6d31e5b7c26cd8d7e7c", - "mints": 0, - "number": 119755, - "premine": 0, - "spaced_rune": "SACMKSOKCMPOKMWCLWMCLWCDWC", - "symbol": "c", - "terms": { - "amount": 221, - "cap": 2111111, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1136", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "d6358e0601130c5ebbdb535aa93bbe2e752fd7fd6eee8601fe5af29e7ff179e1", - "mints": 0, - "number": 119754, - "premine": 0, - "spaced_rune": "XQOFVAHHLCQR", - "symbol": null, - "terms": { - "amount": 1, - "cap": 94964916, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1135", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "62aa2bd48b0eb8a1c3bb090c6129bdc52a2348f3b8e25a2e2eeaa27313e242af", - "mints": 0, - "number": 119753, - "premine": 0, - "spaced_rune": "YEPWCVNODTII", - "symbol": null, - "terms": { - "amount": 1, - "cap": 39185064, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1134", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "e3e6a144d3ac57d35f7f141f79ea818bd26a78bf900c2d0aeaa2a95ce68f8c9e", - "mints": 0, - "number": 119752, - "premine": 0, - "spaced_rune": "SDFGJUJTYHTGRSFAD", - "symbol": null, - "terms": { - "amount": 1, - "cap": 5, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1133", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "97600a89179c0bfd4b7c69bc5f4e9fc2f206124fbc08d4872f18ac6be29a525e", - "mints": 0, - "number": 119751, - "premine": 0, - "spaced_rune": "XQEKAAGEYDXY", - "symbol": null, - "terms": { - "amount": 1, - "cap": 147617461, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1131", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "8ecabca3a2b1518c67c5ee41c93e7874d1117edfd0b36e46ea68eb83e6f9eaad", - "mints": 0, - "number": 119750, - "premine": 0, - "spaced_rune": "XFHSGMZJEUML", - "symbol": null, - "terms": { - "amount": 1, - "cap": 1014672, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1130", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "77b1518d7ad77d89118eeb8eb92c120e1732d2e7ce9d6780cda180f5f4968df6", - "mints": 0, - "number": 119749, - "premine": 0, - "spaced_rune": "DJLNUHRYYTGR", - "symbol": null, - "terms": { - "amount": 1, - "cap": 146717679, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1129", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "4da09c158447950fabd281c7910c6e3f251b9b9a98ab7058e2f4b26304e332ee", - "mints": 0, - "number": 119748, - "premine": 0, - "spaced_rune": "CBAQVALKVMYP", - "symbol": null, - "terms": { - "amount": 1, - "cap": 181932658, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1128", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "b947075130f5a5f93a5cdfa9a216c76b761ff7cd2fb7ca677b3d00a3ca5d53e0", - "mints": 0, - "number": 119747, - "premine": 0, - "spaced_rune": "POJSRGWQBBWQ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 100105873, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1127", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "a356dd06600bb163cb4d68bbe601f83d987c3c2cd456e3784616ab297d1843c0", - "mints": 0, - "number": 119746, - "premine": 0, - "spaced_rune": "FMPQPSLKENKY", - "symbol": null, - "terms": { - "amount": 1, - "cap": 82531312, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1126", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "b6ecdb27bb269949f58ace2ba162726483070e80c140dc60329b5fdbbd3e6395", - "mints": 0, - "number": 119745, - "premine": 0, - "spaced_rune": "GOARBTCEASGJ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 99967467, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1125", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "abf680ed211d18428ddda208f164539fbf662705bd88d4041575c53e655ed794", - "mints": 0, - "number": 119744, - "premine": 0, - "spaced_rune": "MNBIUEEAKPBJ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 168164931, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1124", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "burned": 0, - "divisibility": 0, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "divisibility": 0, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "terms": { - "amount": 1, - "cap": 29807122, - "mints": 0, - "number": 119743, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "terms": { - "amount": 1, - "cap": 29807122, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "terms": { - "amount": 1, - "cap": 29807122, - "height": [ - null, - null - "terms": { - "amount": 1, - "cap": 29807122, - "height": [ - null, - null - "height": [ - null, - null - null - ], - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ] +{ + "entries": [ + [ + "864348:823", + { + "block": 864348, + "burned": 0, + "divisibility": 0, + "etching": "645431123f5ff8b92d057803f2ba786689fd04f2d968d8fb6a4162b63cabc4fd", + "mints": 0, + "number": 119793, + "premine": 0, + "spaced_rune": "ZKSKOOUGYPXB", + "symbol": null, + "terms": { + "amount": 1, + "cap": 87187755, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728166072, + "turbo": false + } + ], + [ + "864348:822", + { + "block": 864348, + "burned": 0, + "divisibility": 0, + "etching": "9d3a1200adfcb2e0ef07e4975120980befcc265cd85b9f2300bc12d4a1ab1beb", + "mints": 0, + "number": 119792, + "premine": 0, + "spaced_rune": "VEMRWZCGQRLL", + "symbol": null, + "terms": { + "amount": 1, + "cap": 183543298, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728166072, + "turbo": false + } + ], + [ + "864346:427", + { + "block": 864346, + "burned": 0, + "divisibility": 0, + "etching": "2acaba44a6dc31cc5f8a8f4ee3a10eb9ca74e47d62975709cb8e81723d91a20d", + "mints": 0, + "number": 119791, + "premine": 0, + "spaced_rune": "LBQPCHACURXD", + "symbol": null, + "terms": { + "amount": 1, + "cap": 12894945, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728165011, + "turbo": false + } + ], + [ + "864343:2413", + { + "block": 864343, + "burned": 0, + "divisibility": 0, + "etching": "6698cd13f630107ccc4b3058cc09b1718aa435e8f9c4eba6b08eea5d13ee809b", + "mints": 0, + "number": 119790, + "premine": 1000000000, + "spaced_rune": "BABY•LEN•SASSAMAN", + "symbol": "Ⱡ", + "terms": { + "amount": 100000, + "cap": 11000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728162943, + "turbo": false + } + ], + [ + "864342:2591", + { + "block": 864342, + "burned": 0, + "divisibility": 1, + "etching": "095513866c6e7aca84a39f403caac493eaa2f53eda848aaee3e96463571ec6d6", + "mints": 0, + "number": 119789, + "premine": 30000, + "spaced_rune": "COMPLETED•IT•MATE", + "symbol": "⚽", + "terms": { + "amount": 100, + "cap": 299999700, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728162376, + "turbo": true + } + ], + [ + "864338:4768", + { + "block": 864338, + "burned": 0, + "divisibility": 0, + "etching": "0d04505188efc69d4e2cb389607663ff556c062e1e2f8c890bfc598c637700ab", + "mints": 0, + "number": 119788, + "premine": 0, + "spaced_rune": "IJEIKMFKELRFRGRGRGEFREFGR", + "symbol": "d", + "terms": { + "amount": 211, + "cap": 554553, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160156, + "turbo": false + } + ], + [ + "864338:4767", + { + "block": 864338, + "burned": 0, + "divisibility": 0, + "etching": "e0490721505254c83a69ce1411b1659b6ecd0690751cf43ac45240ca7d3ab4fb", + "mints": 0, + "number": 119787, + "premine": 0, + "spaced_rune": "CQHMUFFTWWPF", + "symbol": null, + "terms": { + "amount": 1, + "cap": 14372222, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160156, + "turbo": false + } + ], + [ + "864338:4766", + { + "block": 864338, + "burned": 0, + "divisibility": 0, + "etching": "ada836a0e9c834977161543ba7bace0b552e55f88da0398626b1c49a170502dd", + "mints": 0, + "number": 119786, + "premine": 0, + "spaced_rune": "KJMKPVMKREMVBVBFBVFD", + "symbol": "3", + "terms": { + "amount": 332, + "cap": 211222, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160156, + "turbo": false + } + ], + [ + "864337:4402", + { + "block": 864337, + "burned": 0, + "divisibility": 0, + "etching": "ed45aaf2e9b82d55e35a8d0654d0bb044d1d3e2fdd3eb8787d572854316c53c2", + "mints": 0, + "number": 119785, + "premine": 0, + "spaced_rune": "JNJKMLKMNJCMPMCESCVDSV•DV", + "symbol": "2", + "terms": { + "amount": 3222, + "cap": 1111111, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160097, + "turbo": false + } + ], + [ + "864335:913", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "435cc412c946ced0a5ae5a50ee41d2b541f06f09b6f587619507dfbcc61b8842", + "mints": 0, + "number": 119784, + "premine": 0, + "spaced_rune": "UOBYCVAGPLNO", + "symbol": null, + "terms": { + "amount": 1, + "cap": 194090811, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:912", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "79d77e44d66af6ec82ff7970eb3f15b9537408e3888ed0348a265810e99ddd3a", + "mints": 0, + "number": 119783, + "premine": 0, + "spaced_rune": "YNJMQPGPUGWN", + "symbol": null, + "terms": { + "amount": 1, + "cap": 71782828, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:910", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "b014db8f651ec05a1f261f3569c66973318787ad4c7410d6677fc6fcc45e5cfe", + "mints": 0, + "number": 119782, + "premine": 0, + "spaced_rune": "FDLQGMGRYAMF", + "symbol": null, + "terms": { + "amount": 1, + "cap": 135966360, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:909", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "bd649ba830b262ddcf24b0d6da5091f2dbf1276af26ad0809b65a95c42ddbec2", + "mints": 0, + "number": 119781, + "premine": 0, + "spaced_rune": "LBPOUDNUAIDK", + "symbol": null, + "terms": { + "amount": 1, + "cap": 128338720, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:908", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "4ee02e12ba76c8c85208510e078810efbb3843fdaa1323d4e84f40a753d97380", + "mints": 0, + "number": 119780, + "premine": 0, + "spaced_rune": "RNVHGUYHAUCM", + "symbol": null, + "terms": { + "amount": 1, + "cap": 3346818, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:907", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "c9b47a71a2a552450f6259262fc0c23c45148fccb52ee32cd5bb668a467a9f5d", + "mints": 0, + "number": 119779, + "premine": 0, + "spaced_rune": "RTSQQFKTEEBX", + "symbol": null, + "terms": { + "amount": 1, + "cap": 85692692, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:906", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "df772301fef3107549d200fea54f47e46d6aae197f85e93b0068749640028055", + "mints": 0, + "number": 119778, + "premine": 0, + "spaced_rune": "IWHXSPKPYQOX", + "symbol": null, + "terms": { + "amount": 1, + "cap": 166869547, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:905", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "186049ed6091d0a4d9e1abf6d436a6af7bc7603a33c71031b8bb0ba02f386b3a", + "mints": 0, + "number": 119777, + "premine": 0, + "spaced_rune": "OHDKZWZHYLVL", + "symbol": null, + "terms": { + "amount": 1, + "cap": 189310557, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:904", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "74e72d9c58ce6300807d1ca6343fa95f5fa34f3d7e29fc95a94b553ff4c66b36", + "mints": 0, + "number": 119776, + "premine": 0, + "spaced_rune": "NSZNPZDDFYCT", + "symbol": null, + "terms": { + "amount": 1, + "cap": 72959668, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:386", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "76e81c2a204074d61869f58ce86bf8ecfe66f1213bd444c4f22c6f638a401ef9", + "mints": 0, + "number": 119775, + "premine": 0, + "spaced_rune": "NTOOWMNTOOWMNTOOWM", + "symbol": null, + "terms": { + "amount": 1, + "cap": 1000000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864334:4073", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "6c132c6b69ff19d3dbbd0165bcf2fb5db9bba717824a3ff93e94e976b7da5f9e", + "mints": 0, + "number": 119774, + "premine": 0, + "spaced_rune": "HIDDEN•SELDOM•DISEASE•WISE", + "symbol": null, + "terms": { + "amount": 1, + "cap": 1127, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:4070", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "adcbc4dc91e0b354baacb37be52e187fab2cf619c43f0675b26c5e7d58ad1ded", + "mints": 0, + "number": 119773, + "premine": 0, + "spaced_rune": "TYDSJXISYECCOQYYSS", + "symbol": null, + "terms": { + "amount": 1, + "cap": 2361833545833, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:762", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "259fc5e99770c5d2ed0547571981ad191554282e6ab4b2a6eb4083c392edc1cb", + "mints": 0, + "number": 119772, + "premine": 0, + "spaced_rune": "BEGCOAJVXEHW", + "symbol": null, + "terms": { + "amount": 1, + "cap": 38385326, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:433", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "4d324233f38c0cbf36bf1a76e161cbe0ff9f0efb6ee78d94dffdd5f16ec7e8ba", + "mints": 0, + "number": 119771, + "premine": 0, + "spaced_rune": "BEDIALAMDARBEDIALAMDAR", + "symbol": null, + "terms": { + "amount": 5, + "cap": 100000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:432", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "f7b804462b33fd468ef3b171071094f3498968b0a488d08489e16058d470d809", + "mints": 0, + "number": 119770, + "premine": 0, + "spaced_rune": "RUTHMARTINRUTHMARTIN", + "symbol": null, + "terms": { + "amount": 1, + "cap": 999999, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:431", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "51ce542a9557a4894b0dfd705d13268682aa16c83e5eee9c5b1ba4d67113def8", + "mints": 0, + "number": 119769, + "premine": 0, + "spaced_rune": "ULTIVERSEULTIVERSE", + "symbol": null, + "terms": { + "amount": 1, + "cap": 7777777, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:182", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "195dc952cb7c9e8a5c370fe098b4aa1d8bba8225bb4706ee7243b8e3c43f2b32", + "mints": 0, + "number": 119768, + "premine": 0, + "spaced_rune": "NUQHRKVWSYEA", + "symbol": null, + "terms": { + "amount": 1, + "cap": 3063483, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864333:3461", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "65078629f16f0ce11a91da3de877a0ac5a25b5ed4c68d0ba3f6a8e75eab5f871", + "mints": 0, + "number": 119767, + "premine": 0, + "spaced_rune": "FMTJRFVGNHVZNUCB", + "symbol": null, + "terms": { + "amount": 1, + "cap": 5541274870406, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3458", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "8471194b68cfab89a9d6112caf62f97819172d397e91674ec5413ad8f27b2828", + "mints": 0, + "number": 119766, + "premine": 0, + "spaced_rune": "WEELZZLGHGDRTO", + "symbol": null, + "terms": { + "amount": 1, + "cap": 507317119633, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3440", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "90d530d1daf7f1f6ece388a846fe8173a427f71b7e1c5cfc1c035dcd1fc0b017", + "mints": 0, + "number": 119765, + "premine": 0, + "spaced_rune": "MIIOBBPODENFJ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 503174265447, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3437", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "5c0d2bbf9543cd50293fd6671d94502fa08c8c6d11431e0eee4ac3aedbdbc5bc", + "mints": 0, + "number": 119764, + "premine": 0, + "spaced_rune": "TASTE•RISING•FULL", + "symbol": null, + "terms": { + "amount": 1, + "cap": 4812, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3434", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "1766810d3f53cfce81a4e0620c21e8e4643c7a40936dbafa6e88339c025fb5f6", + "mints": 0, + "number": 119763, + "premine": 0, + "spaced_rune": "REGION•MARK•LOW", + "symbol": null, + "terms": { + "amount": 1, + "cap": 2470, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3433", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "f2a6805462cebffc6eb5855d1205dedf9c7f746a7dfd420c153011bb572f58ba", + "mints": 0, + "number": 119762, + "premine": 0, + "spaced_rune": "QHKKEWPTDMNB", + "symbol": null, + "terms": { + "amount": 1, + "cap": 53660832, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3432", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "5d2127d84533fc9d486eaec1a2b76b2d349fe63a06a9d14847b667d360af6e19", + "mints": 0, + "number": 119761, + "premine": 0, + "spaced_rune": "IWLUKGYIWMBP", + "symbol": null, + "terms": { + "amount": 1, + "cap": 94339731, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3431", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "ac4668d63f66c94515dbc2a74faa9152018758a75432cc085a7e7638a24cbc12", + "mints": 0, + "number": 119760, + "premine": 0, + "spaced_rune": "KWUFVEOJVKGQ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 196312580, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:2714", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "c642cd4cc7a075c61d3a32b949217990aa91dfc928f12a2cdba1f2f228c699c7", + "mints": 26, + "number": 119759, + "premine": 210000, + "spaced_rune": "BOUNCE•THE•BITCOIN•CAT", + "symbol": "🐱", + "terms": { + "amount": 1000, + "cap": 20790, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": true + } + ], + [ + "864333:2482", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "cc2415293c275bea4d73ff8f45f68f269686b819de447f50ec6988ac04a62d1b", + "mints": 0, + "number": 119758, + "premine": 30000000, + "spaced_rune": "BITCAT•IS•IN•CONTROL", + "symbol": "🐈", + "terms": { + "amount": 5000, + "cap": 194000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": true + } + ], + [ + "864333:2462", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "a75f792be155a0b53691289433a6413c1efb1aeaf970f752ee70be3c6e755a06", + "mints": 0, + "number": 119757, + "premine": 0, + "spaced_rune": "FIRST•CAT•EATING•BITCOINER", + "symbol": "🙀", + "terms": { + "amount": 1000, + "cap": 21000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": true + } + ], + [ + "864333:1142", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "7488c2909e2bb5f39fb836ee1e18c23487d078e48e2420cc11776c8d7931fea5", + "mints": 0, + "number": 119756, + "premine": 0, + "spaced_rune": "AI•CRYPTO•AI•CRYPTO", + "symbol": "A", + "terms": { + "amount": 1000, + "cap": 1, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1140", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "a024e2d4c4e15eab941376a954bb9176bc95990ba6b2a6d31e5b7c26cd8d7e7c", + "mints": 0, + "number": 119755, + "premine": 0, + "spaced_rune": "SACMKSOKCMPOKMWCLWMCLWCDWC", + "symbol": "c", + "terms": { + "amount": 221, + "cap": 2111111, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1136", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "d6358e0601130c5ebbdb535aa93bbe2e752fd7fd6eee8601fe5af29e7ff179e1", + "mints": 0, + "number": 119754, + "premine": 0, + "spaced_rune": "XQOFVAHHLCQR", + "symbol": null, + "terms": { + "amount": 1, + "cap": 94964916, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1135", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "62aa2bd48b0eb8a1c3bb090c6129bdc52a2348f3b8e25a2e2eeaa27313e242af", + "mints": 0, + "number": 119753, + "premine": 0, + "spaced_rune": "YEPWCVNODTII", + "symbol": null, + "terms": { + "amount": 1, + "cap": 39185064, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1134", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "e3e6a144d3ac57d35f7f141f79ea818bd26a78bf900c2d0aeaa2a95ce68f8c9e", + "mints": 0, + "number": 119752, + "premine": 0, + "spaced_rune": "SDFGJUJTYHTGRSFAD", + "symbol": null, + "terms": { + "amount": 1, + "cap": 5, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1133", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "97600a89179c0bfd4b7c69bc5f4e9fc2f206124fbc08d4872f18ac6be29a525e", + "mints": 0, + "number": 119751, + "premine": 0, + "spaced_rune": "XQEKAAGEYDXY", + "symbol": null, + "terms": { + "amount": 1, + "cap": 147617461, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1131", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "8ecabca3a2b1518c67c5ee41c93e7874d1117edfd0b36e46ea68eb83e6f9eaad", + "mints": 0, + "number": 119750, + "premine": 0, + "spaced_rune": "XFHSGMZJEUML", + "symbol": null, + "terms": { + "amount": 1, + "cap": 1014672, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1130", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "77b1518d7ad77d89118eeb8eb92c120e1732d2e7ce9d6780cda180f5f4968df6", + "mints": 0, + "number": 119749, + "premine": 0, + "spaced_rune": "DJLNUHRYYTGR", + "symbol": null, + "terms": { + "amount": 1, + "cap": 146717679, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1129", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "4da09c158447950fabd281c7910c6e3f251b9b9a98ab7058e2f4b26304e332ee", + "mints": 0, + "number": 119748, + "premine": 0, + "spaced_rune": "CBAQVALKVMYP", + "symbol": null, + "terms": { + "amount": 1, + "cap": 181932658, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1128", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "b947075130f5a5f93a5cdfa9a216c76b761ff7cd2fb7ca677b3d00a3ca5d53e0", + "mints": 0, + "number": 119747, + "premine": 0, + "spaced_rune": "POJSRGWQBBWQ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 100105873, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1127", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "a356dd06600bb163cb4d68bbe601f83d987c3c2cd456e3784616ab297d1843c0", + "mints": 0, + "number": 119746, + "premine": 0, + "spaced_rune": "FMPQPSLKENKY", + "symbol": null, + "terms": { + "amount": 1, + "cap": 82531312, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1126", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "b6ecdb27bb269949f58ace2ba162726483070e80c140dc60329b5fdbbd3e6395", + "mints": 0, + "number": 119745, + "premine": 0, + "spaced_rune": "GOARBTCEASGJ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 99967467, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1125", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "abf680ed211d18428ddda208f164539fbf662705bd88d4041575c53e655ed794", + "mints": 0, + "number": 119744, + "premine": 0, + "spaced_rune": "MNBIUEEAKPBJ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 168164931, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1124", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "burned": 0, + "divisibility": 0, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "divisibility": 0, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "terms": { + "amount": 1, + "cap": 29807122, + "mints": 0, + "number": 119743, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "terms": { + "amount": 1, + "cap": 29807122, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "terms": { + "amount": 1, + "cap": 29807122, + "height": [ + null, + null + "terms": { + "amount": 1, + "cap": 29807122, + "height": [ + null, + null + "height": [ + null, + null + null + ], + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ] + ], + "more": true, + "prev": null, + "next": 1 +} +``` +
+ +
+ + GET + /runes/<PAGE> + + +### Description + +Pagination allows you to specify which page of 100 runes you'd like to return. + +### Example + +```bash +curl -s -H "Accept: application/json" \ + http://0.0.0.0:80/runes/0 +``` + +```json +{ + "entries": [ + [ + "864348:823", + { + "block": 864348, + "burned": 0, + "divisibility": 0, + "etching": "645431123f5ff8b92d057803f2ba786689fd04f2d968d8fb6a4162b63cabc4fd", + "mints": 0, + "number": 119793, + "premine": 0, + "spaced_rune": "ZKSKOOUGYPXB", + "symbol": null, + "terms": { + "amount": 1, + "cap": 87187755, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728166072, + "turbo": false + } + ], + [ + "864348:822", + { + "block": 864348, + "burned": 0, + "divisibility": 0, + "etching": "9d3a1200adfcb2e0ef07e4975120980befcc265cd85b9f2300bc12d4a1ab1beb", + "mints": 0, + "number": 119792, + "premine": 0, + "spaced_rune": "VEMRWZCGQRLL", + "symbol": null, + "terms": { + "amount": 1, + "cap": 183543298, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728166072, + "turbo": false + } + ], + [ + "864346:427", + { + "block": 864346, + "burned": 0, + "divisibility": 0, + "etching": "2acaba44a6dc31cc5f8a8f4ee3a10eb9ca74e47d62975709cb8e81723d91a20d", + "mints": 0, + "number": 119791, + "premine": 0, + "spaced_rune": "LBQPCHACURXD", + "symbol": null, + "terms": { + "amount": 1, + "cap": 12894945, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728165011, + "turbo": false + } + ], + [ + "864343:2413", + { + "block": 864343, + "burned": 0, + "divisibility": 0, + "etching": "6698cd13f630107ccc4b3058cc09b1718aa435e8f9c4eba6b08eea5d13ee809b", + "mints": 0, + "number": 119790, + "premine": 1000000000, + "spaced_rune": "BABY•LEN•SASSAMAN", + "symbol": "Ⱡ", + "terms": { + "amount": 100000, + "cap": 11000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728162943, + "turbo": false + } + ], + [ + "864342:2591", + { + "block": 864342, + "burned": 0, + "divisibility": 1, + "etching": "095513866c6e7aca84a39f403caac493eaa2f53eda848aaee3e96463571ec6d6", + "mints": 0, + "number": 119789, + "premine": 30000, + "spaced_rune": "COMPLETED•IT•MATE", + "symbol": "⚽", + "terms": { + "amount": 100, + "cap": 299999700, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728162376, + "turbo": true + } + ], + [ + "864338:4768", + { + "block": 864338, + "burned": 0, + "divisibility": 0, + "etching": "0d04505188efc69d4e2cb389607663ff556c062e1e2f8c890bfc598c637700ab", + "mints": 0, + "number": 119788, + "premine": 0, + "spaced_rune": "IJEIKMFKELRFRGRGRGEFREFGR", + "symbol": "d", + "terms": { + "amount": 211, + "cap": 554553, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160156, + "turbo": false + } + ], + [ + "864338:4767", + { + "block": 864338, + "burned": 0, + "divisibility": 0, + "etching": "e0490721505254c83a69ce1411b1659b6ecd0690751cf43ac45240ca7d3ab4fb", + "mints": 0, + "number": 119787, + "premine": 0, + "spaced_rune": "CQHMUFFTWWPF", + "symbol": null, + "terms": { + "amount": 1, + "cap": 14372222, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160156, + "turbo": false + } + ], + [ + "864338:4766", + { + "block": 864338, + "burned": 0, + "divisibility": 0, + "etching": "ada836a0e9c834977161543ba7bace0b552e55f88da0398626b1c49a170502dd", + "mints": 0, + "number": 119786, + "premine": 0, + "spaced_rune": "KJMKPVMKREMVBVBFBVFD", + "symbol": "3", + "terms": { + "amount": 332, + "cap": 211222, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160156, + "turbo": false + } + ], + [ + "864337:4402", + { + "block": 864337, + "burned": 0, + "divisibility": 0, + "etching": "ed45aaf2e9b82d55e35a8d0654d0bb044d1d3e2fdd3eb8787d572854316c53c2", + "mints": 0, + "number": 119785, + "premine": 0, + "spaced_rune": "JNJKMLKMNJCMPMCESCVDSV•DV", + "symbol": "2", + "terms": { + "amount": 3222, + "cap": 1111111, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728160097, + "turbo": false + } + ], + [ + "864335:913", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "435cc412c946ced0a5ae5a50ee41d2b541f06f09b6f587619507dfbcc61b8842", + "mints": 0, + "number": 119784, + "premine": 0, + "spaced_rune": "UOBYCVAGPLNO", + "symbol": null, + "terms": { + "amount": 1, + "cap": 194090811, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:912", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "79d77e44d66af6ec82ff7970eb3f15b9537408e3888ed0348a265810e99ddd3a", + "mints": 0, + "number": 119783, + "premine": 0, + "spaced_rune": "YNJMQPGPUGWN", + "symbol": null, + "terms": { + "amount": 1, + "cap": 71782828, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:910", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "b014db8f651ec05a1f261f3569c66973318787ad4c7410d6677fc6fcc45e5cfe", + "mints": 0, + "number": 119782, + "premine": 0, + "spaced_rune": "FDLQGMGRYAMF", + "symbol": null, + "terms": { + "amount": 1, + "cap": 135966360, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:909", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "bd649ba830b262ddcf24b0d6da5091f2dbf1276af26ad0809b65a95c42ddbec2", + "mints": 0, + "number": 119781, + "premine": 0, + "spaced_rune": "LBPOUDNUAIDK", + "symbol": null, + "terms": { + "amount": 1, + "cap": 128338720, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:908", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "4ee02e12ba76c8c85208510e078810efbb3843fdaa1323d4e84f40a753d97380", + "mints": 0, + "number": 119780, + "premine": 0, + "spaced_rune": "RNVHGUYHAUCM", + "symbol": null, + "terms": { + "amount": 1, + "cap": 3346818, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:907", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "c9b47a71a2a552450f6259262fc0c23c45148fccb52ee32cd5bb668a467a9f5d", + "mints": 0, + "number": 119779, + "premine": 0, + "spaced_rune": "RTSQQFKTEEBX", + "symbol": null, + "terms": { + "amount": 1, + "cap": 85692692, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:906", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "df772301fef3107549d200fea54f47e46d6aae197f85e93b0068749640028055", + "mints": 0, + "number": 119778, + "premine": 0, + "spaced_rune": "IWHXSPKPYQOX", + "symbol": null, + "terms": { + "amount": 1, + "cap": 166869547, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:905", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "186049ed6091d0a4d9e1abf6d436a6af7bc7603a33c71031b8bb0ba02f386b3a", + "mints": 0, + "number": 119777, + "premine": 0, + "spaced_rune": "OHDKZWZHYLVL", + "symbol": null, + "terms": { + "amount": 1, + "cap": 189310557, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864335:904", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "74e72d9c58ce6300807d1ca6343fa95f5fa34f3d7e29fc95a94b553ff4c66b36", + "mints": 0, + "number": 119776, + "premine": 0, + "spaced_rune": "NSZNPZDDFYCT", + "symbol": null, + "terms": { + "amount": 1, + "cap": 72959668, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } ], - "more": true, - "prev": null, - "next": 1 - } - ``` -
- -
- -GET -/runes/<PAGE> - - -### Descripion - -Pagination allows you to specify which page of 100 runes you'd like to return. - -### Example - -```bash -curl -s -H "Accept: application/json" \ - http://localhost/runes/0 -``` -```json - { - "entries": [ - [ - "864348:823", - { - "block": 864348, - "burned": 0, - "divisibility": 0, - "etching": "645431123f5ff8b92d057803f2ba786689fd04f2d968d8fb6a4162b63cabc4fd", - "mints": 0, - "number": 119793, - "premine": 0, - "spaced_rune": "ZKSKOOUGYPXB", - "symbol": null, - "terms": { - "amount": 1, - "cap": 87187755, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728166072, - "turbo": false - } - ], - [ - "864348:822", - { - "block": 864348, - "burned": 0, - "divisibility": 0, - "etching": "9d3a1200adfcb2e0ef07e4975120980befcc265cd85b9f2300bc12d4a1ab1beb", - "mints": 0, - "number": 119792, - "premine": 0, - "spaced_rune": "VEMRWZCGQRLL", - "symbol": null, - "terms": { - "amount": 1, - "cap": 183543298, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728166072, - "turbo": false - } - ], - [ - "864346:427", - { - "block": 864346, - "burned": 0, - "divisibility": 0, - "etching": "2acaba44a6dc31cc5f8a8f4ee3a10eb9ca74e47d62975709cb8e81723d91a20d", - "mints": 0, - "number": 119791, - "premine": 0, - "spaced_rune": "LBQPCHACURXD", - "symbol": null, - "terms": { - "amount": 1, - "cap": 12894945, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728165011, - "turbo": false - } - ], - [ - "864343:2413", - { - "block": 864343, - "burned": 0, - "divisibility": 0, - "etching": "6698cd13f630107ccc4b3058cc09b1718aa435e8f9c4eba6b08eea5d13ee809b", - "mints": 0, - "number": 119790, - "premine": 1000000000, - "spaced_rune": "BABY•LEN•SASSAMAN", - "symbol": "Ⱡ", - "terms": { - "amount": 100000, - "cap": 11000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728162943, - "turbo": false - } - ], - [ - "864342:2591", - { - "block": 864342, - "burned": 0, - "divisibility": 1, - "etching": "095513866c6e7aca84a39f403caac493eaa2f53eda848aaee3e96463571ec6d6", - "mints": 0, - "number": 119789, - "premine": 30000, - "spaced_rune": "COMPLETED•IT•MATE", - "symbol": "⚽", - "terms": { - "amount": 100, - "cap": 299999700, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728162376, - "turbo": true - } - ], - [ - "864338:4768", - { - "block": 864338, - "burned": 0, - "divisibility": 0, - "etching": "0d04505188efc69d4e2cb389607663ff556c062e1e2f8c890bfc598c637700ab", - "mints": 0, - "number": 119788, - "premine": 0, - "spaced_rune": "IJEIKMFKELRFRGRGRGEFREFGR", - "symbol": "d", - "terms": { - "amount": 211, - "cap": 554553, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160156, - "turbo": false - } - ], - [ - "864338:4767", - { - "block": 864338, - "burned": 0, - "divisibility": 0, - "etching": "e0490721505254c83a69ce1411b1659b6ecd0690751cf43ac45240ca7d3ab4fb", - "mints": 0, - "number": 119787, - "premine": 0, - "spaced_rune": "CQHMUFFTWWPF", - "symbol": null, - "terms": { - "amount": 1, - "cap": 14372222, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160156, - "turbo": false - } - ], - [ - "864338:4766", - { - "block": 864338, - "burned": 0, - "divisibility": 0, - "etching": "ada836a0e9c834977161543ba7bace0b552e55f88da0398626b1c49a170502dd", - "mints": 0, - "number": 119786, - "premine": 0, - "spaced_rune": "KJMKPVMKREMVBVBFBVFD", - "symbol": "3", - "terms": { - "amount": 332, - "cap": 211222, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160156, - "turbo": false - } - ], - [ - "864337:4402", - { - "block": 864337, - "burned": 0, - "divisibility": 0, - "etching": "ed45aaf2e9b82d55e35a8d0654d0bb044d1d3e2fdd3eb8787d572854316c53c2", - "mints": 0, - "number": 119785, - "premine": 0, - "spaced_rune": "JNJKMLKMNJCMPMCESCVDSV•DV", - "symbol": "2", - "terms": { - "amount": 3222, - "cap": 1111111, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728160097, - "turbo": false - } - ], - [ - "864335:913", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "435cc412c946ced0a5ae5a50ee41d2b541f06f09b6f587619507dfbcc61b8842", - "mints": 0, - "number": 119784, - "premine": 0, - "spaced_rune": "UOBYCVAGPLNO", - "symbol": null, - "terms": { - "amount": 1, - "cap": 194090811, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:912", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "79d77e44d66af6ec82ff7970eb3f15b9537408e3888ed0348a265810e99ddd3a", - "mints": 0, - "number": 119783, - "premine": 0, - "spaced_rune": "YNJMQPGPUGWN", - "symbol": null, - "terms": { - "amount": 1, - "cap": 71782828, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:910", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "b014db8f651ec05a1f261f3569c66973318787ad4c7410d6677fc6fcc45e5cfe", - "mints": 0, - "number": 119782, - "premine": 0, - "spaced_rune": "FDLQGMGRYAMF", - "symbol": null, - "terms": { - "amount": 1, - "cap": 135966360, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:909", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "bd649ba830b262ddcf24b0d6da5091f2dbf1276af26ad0809b65a95c42ddbec2", - "mints": 0, - "number": 119781, - "premine": 0, - "spaced_rune": "LBPOUDNUAIDK", - "symbol": null, - "terms": { - "amount": 1, - "cap": 128338720, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:908", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "4ee02e12ba76c8c85208510e078810efbb3843fdaa1323d4e84f40a753d97380", - "mints": 0, - "number": 119780, - "premine": 0, - "spaced_rune": "RNVHGUYHAUCM", - "symbol": null, - "terms": { - "amount": 1, - "cap": 3346818, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:907", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "c9b47a71a2a552450f6259262fc0c23c45148fccb52ee32cd5bb668a467a9f5d", - "mints": 0, - "number": 119779, - "premine": 0, - "spaced_rune": "RTSQQFKTEEBX", - "symbol": null, - "terms": { - "amount": 1, - "cap": 85692692, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:906", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "df772301fef3107549d200fea54f47e46d6aae197f85e93b0068749640028055", - "mints": 0, - "number": 119778, - "premine": 0, - "spaced_rune": "IWHXSPKPYQOX", - "symbol": null, - "terms": { - "amount": 1, - "cap": 166869547, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:905", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "186049ed6091d0a4d9e1abf6d436a6af7bc7603a33c71031b8bb0ba02f386b3a", - "mints": 0, - "number": 119777, - "premine": 0, - "spaced_rune": "OHDKZWZHYLVL", - "symbol": null, - "terms": { - "amount": 1, - "cap": 189310557, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:904", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "74e72d9c58ce6300807d1ca6343fa95f5fa34f3d7e29fc95a94b553ff4c66b36", - "mints": 0, - "number": 119776, - "premine": 0, - "spaced_rune": "NSZNPZDDFYCT", - "symbol": null, - "terms": { - "amount": 1, - "cap": 72959668, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864335:386", - { - "block": 864335, - "burned": 0, - "divisibility": 0, - "etching": "76e81c2a204074d61869f58ce86bf8ecfe66f1213bd444c4f22c6f638a401ef9", - "mints": 0, - "number": 119775, - "premine": 0, - "spaced_rune": "NTOOWMNTOOWMNTOOWM", - "symbol": null, - "terms": { - "amount": 1, - "cap": 1000000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158372, - "turbo": false - } - ], - [ - "864334:4073", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "6c132c6b69ff19d3dbbd0165bcf2fb5db9bba717824a3ff93e94e976b7da5f9e", - "mints": 0, - "number": 119774, - "premine": 0, - "spaced_rune": "HIDDEN•SELDOM•DISEASE•WISE", - "symbol": null, - "terms": { - "amount": 1, - "cap": 1127, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:4070", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "adcbc4dc91e0b354baacb37be52e187fab2cf619c43f0675b26c5e7d58ad1ded", - "mints": 0, - "number": 119773, - "premine": 0, - "spaced_rune": "TYDSJXISYECCOQYYSS", - "symbol": null, - "terms": { - "amount": 1, - "cap": 2361833545833, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:762", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "259fc5e99770c5d2ed0547571981ad191554282e6ab4b2a6eb4083c392edc1cb", - "mints": 0, - "number": 119772, - "premine": 0, - "spaced_rune": "BEGCOAJVXEHW", - "symbol": null, - "terms": { - "amount": 1, - "cap": 38385326, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:433", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "4d324233f38c0cbf36bf1a76e161cbe0ff9f0efb6ee78d94dffdd5f16ec7e8ba", - "mints": 0, - "number": 119771, - "premine": 0, - "spaced_rune": "BEDIALAMDARBEDIALAMDAR", - "symbol": null, - "terms": { - "amount": 5, - "cap": 100000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:432", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "f7b804462b33fd468ef3b171071094f3498968b0a488d08489e16058d470d809", - "mints": 0, - "number": 119770, - "premine": 0, - "spaced_rune": "RUTHMARTINRUTHMARTIN", - "symbol": null, - "terms": { - "amount": 1, - "cap": 999999, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:431", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "51ce542a9557a4894b0dfd705d13268682aa16c83e5eee9c5b1ba4d67113def8", - "mints": 0, - "number": 119769, - "premine": 0, - "spaced_rune": "ULTIVERSEULTIVERSE", - "symbol": null, - "terms": { - "amount": 1, - "cap": 7777777, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864334:182", - { - "block": 864334, - "burned": 0, - "divisibility": 0, - "etching": "195dc952cb7c9e8a5c370fe098b4aa1d8bba8225bb4706ee7243b8e3c43f2b32", - "mints": 0, - "number": 119768, - "premine": 0, - "spaced_rune": "NUQHRKVWSYEA", - "symbol": null, - "terms": { - "amount": 1, - "cap": 3063483, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728158138, - "turbo": false - } - ], - [ - "864333:3461", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "65078629f16f0ce11a91da3de877a0ac5a25b5ed4c68d0ba3f6a8e75eab5f871", - "mints": 0, - "number": 119767, - "premine": 0, - "spaced_rune": "FMTJRFVGNHVZNUCB", - "symbol": null, - "terms": { - "amount": 1, - "cap": 5541274870406, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3458", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "8471194b68cfab89a9d6112caf62f97819172d397e91674ec5413ad8f27b2828", - "mints": 0, - "number": 119766, - "premine": 0, - "spaced_rune": "WEELZZLGHGDRTO", - "symbol": null, - "terms": { - "amount": 1, - "cap": 507317119633, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3440", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "90d530d1daf7f1f6ece388a846fe8173a427f71b7e1c5cfc1c035dcd1fc0b017", - "mints": 0, - "number": 119765, - "premine": 0, - "spaced_rune": "MIIOBBPODENFJ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 503174265447, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3437", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "5c0d2bbf9543cd50293fd6671d94502fa08c8c6d11431e0eee4ac3aedbdbc5bc", - "mints": 0, - "number": 119764, - "premine": 0, - "spaced_rune": "TASTE•RISING•FULL", - "symbol": null, - "terms": { - "amount": 1, - "cap": 4812, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3434", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "1766810d3f53cfce81a4e0620c21e8e4643c7a40936dbafa6e88339c025fb5f6", - "mints": 0, - "number": 119763, - "premine": 0, - "spaced_rune": "REGION•MARK•LOW", - "symbol": null, - "terms": { - "amount": 1, - "cap": 2470, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3433", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "f2a6805462cebffc6eb5855d1205dedf9c7f746a7dfd420c153011bb572f58ba", - "mints": 0, - "number": 119762, - "premine": 0, - "spaced_rune": "QHKKEWPTDMNB", - "symbol": null, - "terms": { - "amount": 1, - "cap": 53660832, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3432", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "5d2127d84533fc9d486eaec1a2b76b2d349fe63a06a9d14847b667d360af6e19", - "mints": 0, - "number": 119761, - "premine": 0, - "spaced_rune": "IWLUKGYIWMBP", - "symbol": null, - "terms": { - "amount": 1, - "cap": 94339731, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:3431", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "ac4668d63f66c94515dbc2a74faa9152018758a75432cc085a7e7638a24cbc12", - "mints": 0, - "number": 119760, - "premine": 0, - "spaced_rune": "KWUFVEOJVKGQ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 196312580, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:2714", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "c642cd4cc7a075c61d3a32b949217990aa91dfc928f12a2cdba1f2f228c699c7", - "mints": 26, - "number": 119759, - "premine": 210000, - "spaced_rune": "BOUNCE•THE•BITCOIN•CAT", - "symbol": "🐱", - "terms": { - "amount": 1000, - "cap": 20790, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": true - } - ], - [ - "864333:2482", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "cc2415293c275bea4d73ff8f45f68f269686b819de447f50ec6988ac04a62d1b", - "mints": 0, - "number": 119758, - "premine": 30000000, - "spaced_rune": "BITCAT•IS•IN•CONTROL", - "symbol": "🐈", - "terms": { - "amount": 5000, - "cap": 194000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": true - } - ], - [ - "864333:2462", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "a75f792be155a0b53691289433a6413c1efb1aeaf970f752ee70be3c6e755a06", - "mints": 0, - "number": 119757, - "premine": 0, - "spaced_rune": "FIRST•CAT•EATING•BITCOINER", - "symbol": "🙀", - "terms": { - "amount": 1000, - "cap": 21000, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": true - } - ], - [ - "864333:1142", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "7488c2909e2bb5f39fb836ee1e18c23487d078e48e2420cc11776c8d7931fea5", - "mints": 0, - "number": 119756, - "premine": 0, - "spaced_rune": "AI•CRYPTO•AI•CRYPTO", - "symbol": "A", - "terms": { - "amount": 1000, - "cap": 1, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1140", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "a024e2d4c4e15eab941376a954bb9176bc95990ba6b2a6d31e5b7c26cd8d7e7c", - "mints": 0, - "number": 119755, - "premine": 0, - "spaced_rune": "SACMKSOKCMPOKMWCLWMCLWCDWC", - "symbol": "c", - "terms": { - "amount": 221, - "cap": 2111111, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1136", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "d6358e0601130c5ebbdb535aa93bbe2e752fd7fd6eee8601fe5af29e7ff179e1", - "mints": 0, - "number": 119754, - "premine": 0, - "spaced_rune": "XQOFVAHHLCQR", - "symbol": null, - "terms": { - "amount": 1, - "cap": 94964916, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1135", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "62aa2bd48b0eb8a1c3bb090c6129bdc52a2348f3b8e25a2e2eeaa27313e242af", - "mints": 0, - "number": 119753, - "premine": 0, - "spaced_rune": "YEPWCVNODTII", - "symbol": null, - "terms": { - "amount": 1, - "cap": 39185064, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1134", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "e3e6a144d3ac57d35f7f141f79ea818bd26a78bf900c2d0aeaa2a95ce68f8c9e", - "mints": 0, - "number": 119752, - "premine": 0, - "spaced_rune": "SDFGJUJTYHTGRSFAD", - "symbol": null, - "terms": { - "amount": 1, - "cap": 5, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1133", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "97600a89179c0bfd4b7c69bc5f4e9fc2f206124fbc08d4872f18ac6be29a525e", - "mints": 0, - "number": 119751, - "premine": 0, - "spaced_rune": "XQEKAAGEYDXY", - "symbol": null, - "terms": { - "amount": 1, - "cap": 147617461, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1131", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "8ecabca3a2b1518c67c5ee41c93e7874d1117edfd0b36e46ea68eb83e6f9eaad", - "mints": 0, - "number": 119750, - "premine": 0, - "spaced_rune": "XFHSGMZJEUML", - "symbol": null, - "terms": { - "amount": 1, - "cap": 1014672, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1130", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "77b1518d7ad77d89118eeb8eb92c120e1732d2e7ce9d6780cda180f5f4968df6", - "mints": 0, - "number": 119749, - "premine": 0, - "spaced_rune": "DJLNUHRYYTGR", - "symbol": null, - "terms": { - "amount": 1, - "cap": 146717679, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1129", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "4da09c158447950fabd281c7910c6e3f251b9b9a98ab7058e2f4b26304e332ee", - "mints": 0, - "number": 119748, - "premine": 0, - "spaced_rune": "CBAQVALKVMYP", - "symbol": null, - "terms": { - "amount": 1, - "cap": 181932658, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1128", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "b947075130f5a5f93a5cdfa9a216c76b761ff7cd2fb7ca677b3d00a3ca5d53e0", - "mints": 0, - "number": 119747, - "premine": 0, - "spaced_rune": "POJSRGWQBBWQ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 100105873, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1127", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "a356dd06600bb163cb4d68bbe601f83d987c3c2cd456e3784616ab297d1843c0", - "mints": 0, - "number": 119746, - "premine": 0, - "spaced_rune": "FMPQPSLKENKY", - "symbol": null, - "terms": { - "amount": 1, - "cap": 82531312, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1126", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "b6ecdb27bb269949f58ace2ba162726483070e80c140dc60329b5fdbbd3e6395", - "mints": 0, - "number": 119745, - "premine": 0, - "spaced_rune": "GOARBTCEASGJ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 99967467, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1125", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "abf680ed211d18428ddda208f164539fbf662705bd88d4041575c53e655ed794", - "mints": 0, - "number": 119744, - "premine": 0, - "spaced_rune": "MNBIUEEAKPBJ", - "symbol": null, - "terms": { - "amount": 1, - "cap": 168164931, - "height": [ - null, - null - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ], - [ - "864333:1124", - { - "block": 864333, - "burned": 0, - "divisibility": 0, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "burned": 0, - "divisibility": 0, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "divisibility": 0, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", - "mints": 0, - "number": 119743, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "terms": { - "amount": 1, - "cap": 29807122, - "mints": 0, - "number": 119743, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "terms": { - "amount": 1, - "cap": 29807122, - "premine": 0, - "spaced_rune": "CWTYCFSOTBSU", - "symbol": null, - "terms": { - "amount": 1, - "cap": 29807122, - "height": [ - null, - null - "terms": { - "amount": 1, - "cap": 29807122, - "height": [ - null, - null - "height": [ - null, - null - null - ], - ], - "offset": [ - null, - null - ] - }, - "timestamp": 1728157837, - "turbo": false - } - ] + [ + "864335:386", + { + "block": 864335, + "burned": 0, + "divisibility": 0, + "etching": "76e81c2a204074d61869f58ce86bf8ecfe66f1213bd444c4f22c6f638a401ef9", + "mints": 0, + "number": 119775, + "premine": 0, + "spaced_rune": "NTOOWMNTOOWMNTOOWM", + "symbol": null, + "terms": { + "amount": 1, + "cap": 1000000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158372, + "turbo": false + } + ], + [ + "864334:4073", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "6c132c6b69ff19d3dbbd0165bcf2fb5db9bba717824a3ff93e94e976b7da5f9e", + "mints": 0, + "number": 119774, + "premine": 0, + "spaced_rune": "HIDDEN•SELDOM•DISEASE•WISE", + "symbol": null, + "terms": { + "amount": 1, + "cap": 1127, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:4070", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "adcbc4dc91e0b354baacb37be52e187fab2cf619c43f0675b26c5e7d58ad1ded", + "mints": 0, + "number": 119773, + "premine": 0, + "spaced_rune": "TYDSJXISYECCOQYYSS", + "symbol": null, + "terms": { + "amount": 1, + "cap": 2361833545833, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:762", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "259fc5e99770c5d2ed0547571981ad191554282e6ab4b2a6eb4083c392edc1cb", + "mints": 0, + "number": 119772, + "premine": 0, + "spaced_rune": "BEGCOAJVXEHW", + "symbol": null, + "terms": { + "amount": 1, + "cap": 38385326, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:433", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "4d324233f38c0cbf36bf1a76e161cbe0ff9f0efb6ee78d94dffdd5f16ec7e8ba", + "mints": 0, + "number": 119771, + "premine": 0, + "spaced_rune": "BEDIALAMDARBEDIALAMDAR", + "symbol": null, + "terms": { + "amount": 5, + "cap": 100000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:432", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "f7b804462b33fd468ef3b171071094f3498968b0a488d08489e16058d470d809", + "mints": 0, + "number": 119770, + "premine": 0, + "spaced_rune": "RUTHMARTINRUTHMARTIN", + "symbol": null, + "terms": { + "amount": 1, + "cap": 999999, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } ], - "more": true, - "prev": null, - "next": 1 - } - ``` + [ + "864334:431", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "51ce542a9557a4894b0dfd705d13268682aa16c83e5eee9c5b1ba4d67113def8", + "mints": 0, + "number": 119769, + "premine": 0, + "spaced_rune": "ULTIVERSEULTIVERSE", + "symbol": null, + "terms": { + "amount": 1, + "cap": 7777777, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864334:182", + { + "block": 864334, + "burned": 0, + "divisibility": 0, + "etching": "195dc952cb7c9e8a5c370fe098b4aa1d8bba8225bb4706ee7243b8e3c43f2b32", + "mints": 0, + "number": 119768, + "premine": 0, + "spaced_rune": "NUQHRKVWSYEA", + "symbol": null, + "terms": { + "amount": 1, + "cap": 3063483, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728158138, + "turbo": false + } + ], + [ + "864333:3461", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "65078629f16f0ce11a91da3de877a0ac5a25b5ed4c68d0ba3f6a8e75eab5f871", + "mints": 0, + "number": 119767, + "premine": 0, + "spaced_rune": "FMTJRFVGNHVZNUCB", + "symbol": null, + "terms": { + "amount": 1, + "cap": 5541274870406, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3458", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "8471194b68cfab89a9d6112caf62f97819172d397e91674ec5413ad8f27b2828", + "mints": 0, + "number": 119766, + "premine": 0, + "spaced_rune": "WEELZZLGHGDRTO", + "symbol": null, + "terms": { + "amount": 1, + "cap": 507317119633, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3440", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "90d530d1daf7f1f6ece388a846fe8173a427f71b7e1c5cfc1c035dcd1fc0b017", + "mints": 0, + "number": 119765, + "premine": 0, + "spaced_rune": "MIIOBBPODENFJ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 503174265447, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3437", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "5c0d2bbf9543cd50293fd6671d94502fa08c8c6d11431e0eee4ac3aedbdbc5bc", + "mints": 0, + "number": 119764, + "premine": 0, + "spaced_rune": "TASTE•RISING•FULL", + "symbol": null, + "terms": { + "amount": 1, + "cap": 4812, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3434", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "1766810d3f53cfce81a4e0620c21e8e4643c7a40936dbafa6e88339c025fb5f6", + "mints": 0, + "number": 119763, + "premine": 0, + "spaced_rune": "REGION•MARK•LOW", + "symbol": null, + "terms": { + "amount": 1, + "cap": 2470, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3433", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "f2a6805462cebffc6eb5855d1205dedf9c7f746a7dfd420c153011bb572f58ba", + "mints": 0, + "number": 119762, + "premine": 0, + "spaced_rune": "QHKKEWPTDMNB", + "symbol": null, + "terms": { + "amount": 1, + "cap": 53660832, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3432", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "5d2127d84533fc9d486eaec1a2b76b2d349fe63a06a9d14847b667d360af6e19", + "mints": 0, + "number": 119761, + "premine": 0, + "spaced_rune": "IWLUKGYIWMBP", + "symbol": null, + "terms": { + "amount": 1, + "cap": 94339731, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:3431", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "ac4668d63f66c94515dbc2a74faa9152018758a75432cc085a7e7638a24cbc12", + "mints": 0, + "number": 119760, + "premine": 0, + "spaced_rune": "KWUFVEOJVKGQ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 196312580, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:2714", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "c642cd4cc7a075c61d3a32b949217990aa91dfc928f12a2cdba1f2f228c699c7", + "mints": 26, + "number": 119759, + "premine": 210000, + "spaced_rune": "BOUNCE•THE•BITCOIN•CAT", + "symbol": "🐱", + "terms": { + "amount": 1000, + "cap": 20790, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": true + } + ], + [ + "864333:2482", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "cc2415293c275bea4d73ff8f45f68f269686b819de447f50ec6988ac04a62d1b", + "mints": 0, + "number": 119758, + "premine": 30000000, + "spaced_rune": "BITCAT•IS•IN•CONTROL", + "symbol": "🐈", + "terms": { + "amount": 5000, + "cap": 194000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": true + } + ], + [ + "864333:2462", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "a75f792be155a0b53691289433a6413c1efb1aeaf970f752ee70be3c6e755a06", + "mints": 0, + "number": 119757, + "premine": 0, + "spaced_rune": "FIRST•CAT•EATING•BITCOINER", + "symbol": "🙀", + "terms": { + "amount": 1000, + "cap": 21000, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": true + } + ], + [ + "864333:1142", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "7488c2909e2bb5f39fb836ee1e18c23487d078e48e2420cc11776c8d7931fea5", + "mints": 0, + "number": 119756, + "premine": 0, + "spaced_rune": "AI•CRYPTO•AI•CRYPTO", + "symbol": "A", + "terms": { + "amount": 1000, + "cap": 1, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1140", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "a024e2d4c4e15eab941376a954bb9176bc95990ba6b2a6d31e5b7c26cd8d7e7c", + "mints": 0, + "number": 119755, + "premine": 0, + "spaced_rune": "SACMKSOKCMPOKMWCLWMCLWCDWC", + "symbol": "c", + "terms": { + "amount": 221, + "cap": 2111111, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1136", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "d6358e0601130c5ebbdb535aa93bbe2e752fd7fd6eee8601fe5af29e7ff179e1", + "mints": 0, + "number": 119754, + "premine": 0, + "spaced_rune": "XQOFVAHHLCQR", + "symbol": null, + "terms": { + "amount": 1, + "cap": 94964916, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1135", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "62aa2bd48b0eb8a1c3bb090c6129bdc52a2348f3b8e25a2e2eeaa27313e242af", + "mints": 0, + "number": 119753, + "premine": 0, + "spaced_rune": "YEPWCVNODTII", + "symbol": null, + "terms": { + "amount": 1, + "cap": 39185064, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1134", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "e3e6a144d3ac57d35f7f141f79ea818bd26a78bf900c2d0aeaa2a95ce68f8c9e", + "mints": 0, + "number": 119752, + "premine": 0, + "spaced_rune": "SDFGJUJTYHTGRSFAD", + "symbol": null, + "terms": { + "amount": 1, + "cap": 5, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1133", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "97600a89179c0bfd4b7c69bc5f4e9fc2f206124fbc08d4872f18ac6be29a525e", + "mints": 0, + "number": 119751, + "premine": 0, + "spaced_rune": "XQEKAAGEYDXY", + "symbol": null, + "terms": { + "amount": 1, + "cap": 147617461, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1131", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "8ecabca3a2b1518c67c5ee41c93e7874d1117edfd0b36e46ea68eb83e6f9eaad", + "mints": 0, + "number": 119750, + "premine": 0, + "spaced_rune": "XFHSGMZJEUML", + "symbol": null, + "terms": { + "amount": 1, + "cap": 1014672, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1130", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "77b1518d7ad77d89118eeb8eb92c120e1732d2e7ce9d6780cda180f5f4968df6", + "mints": 0, + "number": 119749, + "premine": 0, + "spaced_rune": "DJLNUHRYYTGR", + "symbol": null, + "terms": { + "amount": 1, + "cap": 146717679, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1129", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "4da09c158447950fabd281c7910c6e3f251b9b9a98ab7058e2f4b26304e332ee", + "mints": 0, + "number": 119748, + "premine": 0, + "spaced_rune": "CBAQVALKVMYP", + "symbol": null, + "terms": { + "amount": 1, + "cap": 181932658, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1128", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "b947075130f5a5f93a5cdfa9a216c76b761ff7cd2fb7ca677b3d00a3ca5d53e0", + "mints": 0, + "number": 119747, + "premine": 0, + "spaced_rune": "POJSRGWQBBWQ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 100105873, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1127", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "a356dd06600bb163cb4d68bbe601f83d987c3c2cd456e3784616ab297d1843c0", + "mints": 0, + "number": 119746, + "premine": 0, + "spaced_rune": "FMPQPSLKENKY", + "symbol": null, + "terms": { + "amount": 1, + "cap": 82531312, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1126", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "b6ecdb27bb269949f58ace2ba162726483070e80c140dc60329b5fdbbd3e6395", + "mints": 0, + "number": 119745, + "premine": 0, + "spaced_rune": "GOARBTCEASGJ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 99967467, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1125", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "abf680ed211d18428ddda208f164539fbf662705bd88d4041575c53e655ed794", + "mints": 0, + "number": 119744, + "premine": 0, + "spaced_rune": "MNBIUEEAKPBJ", + "symbol": null, + "terms": { + "amount": 1, + "cap": 168164931, + "height": [ + null, + null + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ], + [ + "864333:1124", + { + "block": 864333, + "burned": 0, + "divisibility": 0, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "burned": 0, + "divisibility": 0, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "divisibility": 0, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "etching": "74e290bc2ed6b39c887ab3b456f86d91edbadb829936c63bb166d42233527491", + "mints": 0, + "number": 119743, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "terms": { + "amount": 1, + "cap": 29807122, + "mints": 0, + "number": 119743, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "terms": { + "amount": 1, + "cap": 29807122, + "premine": 0, + "spaced_rune": "CWTYCFSOTBSU", + "symbol": null, + "terms": { + "amount": 1, + "cap": 29807122, + "height": [ + null, + null + "terms": { + "amount": 1, + "cap": 29807122, + "height": [ + null, + null + "height": [ + null, + null + null + ], + ], + "offset": [ + null, + null + ] + }, + "timestamp": 1728157837, + "turbo": false + } + ] + ], + "more": true, + "prev": null, + "next": 1 +} +```
- -GET -/sat/<SAT> - + + GET + /sat/<SAT> + ### Description -Returns details about a specific satoshi. Requires index with `--index-sats` flag. +Returns details about a specific satoshi. Requires index with `--index-sats` flag. ### Example @@ -4897,32 +5009,33 @@ Returns details about a specific satoshi. Requires index with `--index-sats` fl curl -s -H "Accept: application/json" \ http://0.0.0.0:80/sat/2099994106992659 ``` - ```json - { - "block": 3891094, - "charms": [], - "cycle": 3, - "decimal": "3891094.16797", - "degree": "3°111094′214″16797‴", - "epoch": 18, - "inscriptions": [], - "name": "satoshi", - "number": 2099994106992659, - "offset": 16797, - "percentile": "99.99971949060254%", - "period": 1930, - "rarity": "common", - "satpoint": null, - "timestamp": 3544214021 - } - ``` + +```json +{ + "block": 3891094, + "charms": [], + "cycle": 3, + "decimal": "3891094.16797", + "degree": "3°111094′214″16797‴", + "epoch": 18, + "inscriptions": [], + "name": "satoshi", + "number": 2099994106992659, + "offset": 16797, + "percentile": "99.99971949060254%", + "period": 1930, + "rarity": "common", + "satpoint": null, + "timestamp": 3544214021 +} +```
- -GET -/status - + + GET + /status + ### Description @@ -4934,39 +5047,40 @@ Returns details about the server installation and index. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/status ``` - ```json - { - "address_index": true, - "blessed_inscriptions": 76332641, - "chain": "mainnet", - "cursed_inscriptions": 472043, - "height": 864351, - "initial_sync_time": { - "secs": 59213, - "nanos": 979632000 - }, - "inscriptions": 76804684, - "lost_sats": 0, - "minimum_rune_for_next_block": "PVHGFEDCAZZ", - "rune_index": true, - "runes": 119811, - "sat_index": false, - "started": "2024-09-27T17:43:39.291876400Z", - "transaction_index": false, - "unrecoverably_reorged": false, - "uptime": { - "secs": 709843, - "nanos": 910346200 - } - } - ``` + +```json +{ + "address_index": true, + "blessed_inscriptions": 76332641, + "chain": "mainnet", + "cursed_inscriptions": 472043, + "height": 864351, + "initial_sync_time": { + "secs": 59213, + "nanos": 979632000 + }, + "inscriptions": 76804684, + "lost_sats": 0, + "minimum_rune_for_next_block": "PVHGFEDCAZZ", + "rune_index": true, + "runes": 119811, + "sat_index": false, + "started": "2024-09-27T17:43:39.291876400Z", + "transaction_index": false, + "unrecoverably_reorged": false, + "uptime": { + "secs": 709843, + "nanos": 910346200 + } +} +```
- -GET -/tx/<TRANSACTION_ID> - + + GET + /tx/<TRANSACTION_ID> + ### Description @@ -4978,40 +5092,41 @@ Returns details about the specified transaction. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/tx/99811de396ff10152cdfc9588d9750d0151501f081df2e56071c42dc3532b743 ``` - ```json - { - "chain": "mainnet", - "etching": null, - "inscription_count": 1, - "transaction": { - "version": 2, - "lock_time": 0, - "input": [ - { - "previous_output": "7d154f826f68e86370105641e3b5b1c6afc697613b8dfce48e4e40db01e8317a:1", - "script_sig": "", - "sequence": 4294967295, - "witness": [ - "e68e67c60dfc06f570dfa8fe880cc09f1041a9b10b285743dd72b8f2e672987f7176ced40d46d279385c148a0c39b9914b91d9d503b7388791f6758884f0c2f4", - "200c97fe0e7bb78d8dd7447bc098386c61248e1e9a7dfd263fd828c5373b945735ac0063036f7264010109696d6167652f706e67004d080289504e470d0a1a0a0000000d49484452000000360000003608060000008c456add000000017352474200aece1ce900000306494441546881ed9abf4e1b4110c63f477903a4b4a6a04186c21532a54de1c214a432051406d14471830405a2b25cb8701344e75c43a4d0514041112843a8281c642972111ec0cfb029ec3976d7b7e7fd670cd1fe24747b6b666ebf9bbdd9b9b581402010083c93f1e5a8130d18b5776b73defcdae26500a56a8df1e73fbe7f1d3acf6404ff2f29fe9d0f27c5fcba705cdbdcc1dae60ed8086028aad1aea0d1ae18f96612ba76ef8daea24131bf8edb874b004381fd6e0f8c3136bfb46aec4bb6fbfbfba7b6ad97881d1d6e6446471c1d6e089f2d2c2f627e69d56850c0b82853bc08234ad51a00e0e63c12fa49dcf1fe95961f5ed4d3e31d9e1eef70bc7f35f6cca6e155188f2c0e001aed4aaab84e34609d6820881af51b271b6f998932a32c88a20800fd6e2f6e2709e4138b8b28600ac94397b4ece82a0a98e25424f8082e2c2fc66d1abc0cf59fd64f9cd6ba99450c508bf3c1d423362bbc444c2ea9542465ca69613d879bad0b461506210d5cf09dcd1562f17bdb07906d937cb8240f2b233e42095150facce60a8c4f202a7c88339e8aa56a8d513d68220a1866452a942962fcda46647305e7c462953c14d348ebaede3e5ca68a22b2b9020060b73627bceee862953c6ece23a1a230b505c48a24293a24cc164d44012b610917d57e0664db490bb52dffed3a1684bd3582b0b78695b0848ca5bdced0abfe246692ee6dd730575b138c23d6eff650ccaf27550d13a346b60afb18bea4b2ad15ad8a60be524f98562a9f6c643bd13fefd35698ed3396d9db3e00301ca83458a6f88b074db60adf71db657bc069974ab53325fdcf589fce0be769fd049fbe7c7e5d7b1eb6627ce26b6b20b1df568c6bb4802944eca523a3c25a98bc81f35a0411b60b74da9e8792d3fa8970feebcf3700c0d9f5bdcd3052319ec726a23ad1403857a5eeadf20a0344812e3b5480a1b049a2642180d957b25be515e6539c16cdd6052b556bacd9ba10165efaeaa7130dd8e8cec7fd36d7e17db8f8d17ec66867898e141dfe8ed29472e1ecfa3e2347ce066d611f3fe49fdb29a5ce56790580dbaf02489cad7d20100804026f9d7f6be4942aeb43f7890000000049454e44ae42608268", - "c10c97fe0e7bb78d8dd7447bc098386c61248e1e9a7dfd263fd828c5373b945735" - ] - } - ], - "output": [ - { - "value": 546, - "script_pubkey": "51208a2ade400b30af7cae07e30a9afa8ac49f54fb3ff7d0f42bbf4a66578a34c280" - } - ] - }, - "txid": "99811de396ff10152cdfc9588d9750d0151501f081df2e56071c42dc3532b743" - } - ``` + +```json +{ + "chain": "mainnet", + "etching": null, + "inscription_count": 1, + "transaction": { + "version": 2, + "lock_time": 0, + "input": [ + { + "previous_output": "7d154f826f68e86370105641e3b5b1c6afc697613b8dfce48e4e40db01e8317a:1", + "script_sig": "", + "sequence": 4294967295, + "witness": [ + "e68e67c60dfc06f570dfa8fe880cc09f1041a9b10b285743dd72b8f2e672987f7176ced40d46d279385c148a0c39b9914b91d9d503b7388791f6758884f0c2f4", + "200c97fe0e7bb78d8dd7447bc098386c61248e1e9a7dfd263fd828c5373b945735ac0063036f7264010109696d6167652f706e67004d080289504e470d0a1a0a0000000d49484452000000360000003608060000008c456add000000017352474200aece1ce900000306494441546881ed9abf4e1b4110c63f477903a4b4a6a04186c21532a54de1c214a432051406d14471830405a2b25cb8701344e75c43a4d0514041112843a8281c642972111ec0cfb029ec3976d7b7e7fd670cd1fe24747b6b666ebf9bbdd9b9b581402010083c93f1e5a8130d18b5776b73defcdae26500a56a8df1e73fbe7f1d3acf6404ff2f29fe9d0f27c5fcba705cdbdcc1dae60ed8086028aad1aea0d1ae18f96612ba76ef8daea24131bf8edb874b004381fd6e0f8c3136bfb46aec4bb6fbfbfba7b6ad97881d1d6e6446471c1d6e089f2d2c2f627e69d56850c0b82853bc08234ad51a00e0e63c12fa49dcf1fe95961f5ed4d3e31d9e1eef70bc7f35f6cca6e155188f2c0e001aed4aaab84e34609d6820881af51b271b6f998932a32c88a20800fd6e2f6e2709e4138b8b28600ac94397b4ece82a0a98e25424f8082e2c2fc66d1abc0cf59fd64f9cd6ba99450c508bf3c1d423362bbc444c2ea9542465ca69613d879bad0b461506210d5cf09dcd1562f17bdb07906d937cb8240f2b233e42095150facce60a8c4f202a7c88339e8aa56a8d513d68220a1866452a942962fcda46647305e7c462953c14d348ebaede3e5ca68a22b2b9020060b73627bceee862953c6ece23a1a230b505c48a24293a24cc164d44012b610917d57e0664db490bb52dffed3a1684bd3582b0b78695b0848ca5bdced0abfe246692ee6dd730575b138c23d6eff650ccaf27550d13a346b60afb18bea4b2ad15ad8a60be524f98562a9f6c643bd13fefd35698ed3396d9db3e00301ca83458a6f88b074db60adf71db657bc069974ab53325fdcf589fce0be769fd049fbe7c7e5d7b1eb6627ce26b6b20b1df568c6bb4802944eca523a3c25a98bc81f35a0411b60b74da9e8792d3fa8970feebcf3700c0d9f5bdcd3052319ec726a23ad1403857a5eeadf20a0344812e3b5480a1b049a2642180d957b25be515e6539c16cdd6052b556bacd9ba10165efaeaa7130dd8e8cec7fd36d7e17db8f8d17ec66867898e141dfe8ed29472e1ecfa3e2347ce066d611f3fe49fdb29a5ce56790580dbaf02489cad7d20100804026f9d7f6be4942aeb43f7890000000049454e44ae42608268", + "c10c97fe0e7bb78d8dd7447bc098386c61248e1e9a7dfd263fd828c5373b945735" + ] + } + ], + "output": [ + { + "value": 546, + "script_pubkey": "51208a2ade400b30af7cae07e30a9afa8ac49f54fb3ff7d0f42bbf4a66578a34c280" + } + ] + }, + "txid": "99811de396ff10152cdfc9588d9750d0151501f081df2e56071c42dc3532b743" +} +```
## Recursive Endpoints See [Recursion](../inscriptions/recursion.md) for an explanation of these. -{{#include ../inscriptions/recursion.md:35:3306}} +{{#include ../inscriptions/recursion.md:35:3371}} diff --git a/docs/src/guides/splitting.md b/docs/src/guides/splitting.md new file mode 100644 index 0000000000..c5263d8462 --- /dev/null +++ b/docs/src/guides/splitting.md @@ -0,0 +1,26 @@ +Splitting +========= + +Complex transactions can be created using the `ord wallet split` command. + +The `split` command takes a YAML configuration file, which specifies any number +of outputs to be created, their bitcoin value, and their value of any number of +runes. It does not currently allow assigning inscriptions to outputs. + +The `split` command can be used to split cardinal, bitcoin-only outputs for +transacting, distribute runes to large numbers of recipients in a single +transaction. + +To send a split transaction using the configuration in `splits.yaml`, run the +following command: + +```bash +ord wallet split --fee-rate 21 --splits split.yaml +``` + +Example `splits.yaml` +--------------------` + +```yaml +{{#include ../../../splits.yaml}} +``` diff --git a/docs/src/inscriptions/burning.md b/docs/src/inscriptions/burning.md new file mode 100644 index 0000000000..ecbd0f7e4c --- /dev/null +++ b/docs/src/inscriptions/burning.md @@ -0,0 +1,29 @@ +Burning +======= + +Inscriptions may be burned by constructing a transaction that spends them to a +script pubkey beginning with `OP_RETURN`. + +Sending inscriptions to a so-called "burn address" is not recognized by `ord`. + +Burned inscriptions receive the "burned" charm, recognized with 🔥 on the +inscription's `/inscription` page. + +When burning inscriptions, CBOR metadata may be included in a data push +immediately following the `OP_RETURN`. + +Burn metadata is unstructured, having no meaning to the underlying protocol, +and should be human readable. It is displayed on the burned inscription's +`/inscription` page, in the same manner as inscription metadata, under the +heading "burn metadata". + +Use it, if you feel like it, to commemorate the inscription, celebrate the +closing of a collection, or for whatever other purposes you so desire. + +Data pushes after the first are currently ignored by `ord`. However, they may +be given future meaning by the protocol, and should not be used. + +For example, transaction +[b42f0d8a3277ce6a7e564fec8f5579f76bc19cb24f8eff565ebb81a4c2f94683](https://mempool.space/tx/b42f0d8a3277ce6a7e564fec8f5579f76bc19cb24f8eff565ebb81a4c2f94683) +burned inscription +[681b5373c03e3f819231afd9227f54101395299c9e58356bda278e2f32bef2cdi0](https://ordinals.com/inscription/681b5373c03e3f819231afd9227f54101395299c9e58356bda278e2f32bef2cdi0). diff --git a/docs/src/inscriptions/examples.md b/docs/src/inscriptions/examples.md index 12dc0417e7..05d8555466 100644 --- a/docs/src/inscriptions/examples.md +++ b/docs/src/inscriptions/examples.md @@ -1,32 +1,36 @@ -Inscription Examples -========= - -### Delegate - -* The [first delegate inscription](https://ordinals.com/inscription/626127511953479e1933a448f020c76acd9086efe2f2b3f5e492c0c85d2ce051i0). -* The Oscillations * collection utilizes delegation, provenance, recursion, sat endpoint, and detects the kind of sat that each piece is inscribed on (sattribute-aware). Each piece is a delegate of [this inscription](https://ordinals.com/inscription/52b4ea10c2518c954c73594e403ccfb2d50044f5a3b09a224dfa3bf06dd1d499i0). -* [This inscription](https://ordinals.com/inscription/23a8f17fff4a73e2932dfc76e46d14d4f8975da96f5d5ae9a45898422056071ai0) was inscribed as a delegate of [this inscription](https://ordinals.com/inscription/9ff39db4c51f831225d41efbd29a399f2b16c758970ec4ab95a1a17e8be59088i0) and is also the parent inscription of a rune. - -### Metadata - -* Each [member](https://ordinals.com/inscription/ab924ff229beca227bf40221faf492a20b5e2ee4f084524c84a5f98b80fe527fi1) in the FUN collection has metadata that describes its attributes. -* [This inscription](https://ordinals.com/inscription/454700af2cffd3a872daeb89598a891f5fe9936225838a8c4522f491f246ca0ai0) uses its own metadata to draw the ordinal image. - -### Provenance - -* [Inscription 0](https://ordinals.com/inscription/0) is the parent inscription for Casey's sugar skull collection, a grandparent for the FUN! collection, and the grandparent for [the sleepiest rune](https://ordinals.com/rune/ZZZZZZZZZZZZZZZZZZZZZZZZZZ). -* With the [Rug Me](https://ordinals.com/inscription/f87a6b16a1224b65f9c8ea55e1718585b3075373581689e343860c12a70d15c7i41) collection, owners are able to change the background color by inscribing a child to it. -* This [Bitcoin Magazine Cover](https://ordinals.com/inscription/60902330) renders the children as part of the parent inscription. -* [The yellow_ord_bot](https://ordinals.com/inscription/17541f6adf6eb160d52bc6eb0a3546c7c1d2adfe607b1a3cddc72cc0619526adi0) has many different quotes as cursed children. -* The [Spellbound](https://ordinals.com/children/451accbce30177c23a8cd42ab85131312a449359ada3c054aa147b054136fa3bi0) collection from the Wizard of Ord utilizes recursion, delegation, metadata, provenance, postage, location, compression. - -### Recursion - -* [Inscription 12992](https://ordinals.com/inscription/bf637552f3758e20f733d1f250cbea7cbbb4bbf157a8d4a9c26132950a383415i0) was the first recursive inscription inscribed on mainnet. -* [OnChain Monkey Genesis (BTC)](https://ordinals.com/children/fb162a46943e5d7d31d72ee2c8c850e66c1ca5d0d453068aa63883528285ed21i0) was one of the earliest collections to use recursion to create its PFP art. -* [Blob](https://ordinals.com/inscription/67285791) is a recursive generative collection that seeds its generation with metadata and uses threeJS, React 3 Fiber and other libraries recursively. -* The [GPU Ordinals](https://ordinals.com/inscription/0b62d8790bb428e0278cd8c3dedd540e2495515198002a233a49ba7b21f8b2cei0) collection takes recursive content and transforms it before rendering, creating what is termed as 'super-recursion'. Use Google Chrome and headphones to experience the spatial audio. -* The [Abstractii Genesis](https://ordinals.com/inscription/b2de70a5658d3659b74a9a349e02ed9396318eab844073b6f35e726dea9e103ei0) collection uses the inscriptions ID as a seed to generate its art. -* The [Abstractii Evolved](https://ordinals.com/inscription/c56795a454a30bb6866686770f14d015d53f3cf2ddfa5154e34a7cd1120a51efi0) generative collection uses the recursive blockheight endpoint as a seed to generate its art. -* [This code](http://ordinals.com/content/eafb859825cd843587d39552eb7a52f352e9621cd16b63b8702c1b8ea44faf1ci0) is called recursively in [this inscription](https://ordinals.com/inscription/60445754) to generate music. -* [This code](https://ordinals.com/content/e48af8aebe608656a3739393d1270d88285ab3051fb800743509d82bcf163623i0) is called recursively in [this inscription](https://ordinals.com/inscription/70940369), allowing it to function as a pixel art drawing program. +Inscription Examples +==================== + +Delegate +-------- + +* The [first delegate inscription](https://ordinals.com/inscription/626127511953479e1933a448f020c76acd9086efe2f2b3f5e492c0c85d2ce051i0). +* The Oscillations * collection utilizes delegation, provenance, recursion, sat endpoint, and detects the kind of sat that each piece is inscribed on (sattribute-aware). Each piece is a delegate of [this inscription](https://ordinals.com/inscription/52b4ea10c2518c954c73594e403ccfb2d50044f5a3b09a224dfa3bf06dd1d499i0). +* [This inscription](https://ordinals.com/inscription/23a8f17fff4a73e2932dfc76e46d14d4f8975da96f5d5ae9a45898422056071ai0) was inscribed as a delegate of [this inscription](https://ordinals.com/inscription/9ff39db4c51f831225d41efbd29a399f2b16c758970ec4ab95a1a17e8be59088i0) and is also the parent inscription of a rune. + +Metadata +-------- + +* Each [member](https://ordinals.com/inscription/ab924ff229beca227bf40221faf492a20b5e2ee4f084524c84a5f98b80fe527fi1) in the FUN collection has metadata that describes its attributes. +* [This inscription](https://ordinals.com/inscription/454700af2cffd3a872daeb89598a891f5fe9936225838a8c4522f491f246ca0ai0) uses its own metadata to draw the ordinal image. + +Provenance +---------- + +* [Inscription 0](https://ordinals.com/inscription/0) is the parent inscription for Casey's sugar skull collection, a grandparent for the FUN! collection, and the grandparent for [the sleepiest rune](https://ordinals.com/rune/ZZZZZZZZZZZZZZZZZZZZZZZZZZ). +* With the [Rug Me](https://ordinals.com/inscription/f87a6b16a1224b65f9c8ea55e1718585b3075373581689e343860c12a70d15c7i41) collection, owners are able to change the background color by inscribing a child to it. +* This [Bitcoin Magazine Cover](https://ordinals.com/inscription/60902330) renders the children as part of the parent inscription. +* [The yellow_ord_bot](https://ordinals.com/inscription/17541f6adf6eb160d52bc6eb0a3546c7c1d2adfe607b1a3cddc72cc0619526adi0) has many different quotes as cursed children. +* The [Spellbound](https://ordinals.com/children/451accbce30177c23a8cd42ab85131312a449359ada3c054aa147b054136fa3bi0) collection from the Wizard of Ord utilizes recursion, delegation, metadata, provenance, postage, location, compression. + +Recursion +--------- + +* [Inscription 12992](https://ordinals.com/inscription/bf637552f3758e20f733d1f250cbea7cbbb4bbf157a8d4a9c26132950a383415i0) was the first recursive inscription inscribed on mainnet. +* [OnChain Monkey Genesis (BTC)](https://ordinals.com/children/fb162a46943e5d7d31d72ee2c8c850e66c1ca5d0d453068aa63883528285ed21i0) was one of the earliest collections to use recursion to create its PFP art. +* [Blob](https://ordinals.com/inscription/67285791) is a recursive generative collection that seeds its generation with metadata and uses threeJS, React 3 Fiber and other libraries recursively. +* The [GPU Ordinals](https://ordinals.com/inscription/0b62d8790bb428e0278cd8c3dedd540e2495515198002a233a49ba7b21f8b2cei0) collection takes recursive content and transforms it before rendering, creating what is termed as 'super-recursion'. Use Google Chrome and headphones to experience the spatial audio. +* The [Abstractii Genesis](https://ordinals.com/inscription/b2de70a5658d3659b74a9a349e02ed9396318eab844073b6f35e726dea9e103ei0) collection uses the inscriptions ID as a seed to generate its art. +* The [Abstractii Evolved](https://ordinals.com/inscription/c56795a454a30bb6866686770f14d015d53f3cf2ddfa5154e34a7cd1120a51efi0) generative collection uses the recursive blockheight endpoint as a seed to generate its art. +* [This code](http://ordinals.com/content/eafb859825cd843587d39552eb7a52f352e9621cd16b63b8702c1b8ea44faf1ci0) is called recursively in [this inscription](https://ordinals.com/inscription/60445754) to generate music. +* [This code](https://ordinals.com/content/e48af8aebe608656a3739393d1270d88285ab3051fb800743509d82bcf163623i0) is called recursively in [this inscription](https://ordinals.com/inscription/70940369), allowing it to function as a pixel art drawing program. diff --git a/docs/src/inscriptions/recursion.md b/docs/src/inscriptions/recursion.md index 37f8e80e2e..abb151bc9c 100644 --- a/docs/src/inscriptions/recursion.md +++ b/docs/src/inscriptions/recursion.md @@ -39,13 +39,16 @@ Recursion has a number of interesting use-cases: ### Description -The content of the inscription with `` + +The content of the inscription with ``. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/content/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0 > skull.jpg ``` + no terminal output, just file creation @@ -63,6 +66,7 @@ Latest block hash. curl -s \ http://0.0.0.0:80/r/blockhash ``` + ```json "00000000000000000002891b440944e0ce40b37b6ccaa138c280e9edfc319d5d" ``` @@ -75,13 +79,16 @@ curl -s \ ### Description + Block hash at given block height as JSON string. ### Example + ```bash curl -s \ http://0.0.0.0:80/r/blockhash/840000 ``` + ```json "0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5" ``` @@ -94,13 +101,16 @@ curl -s \ ### Description + Latest block height. ### Example + ```bash curl -s \ http://0.0.0.0:80/r/blockheight ``` + ```json 866393 ``` @@ -113,13 +123,16 @@ curl -s \ ### Description + Block info. `` may be a block height or block hash. ### Example (blockheight) + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/blockinfo/0 ``` + ```json { "average_fee": 0, @@ -158,11 +171,14 @@ curl -s -H "Accept: application/json" \ "version": 1 } ``` + ### Example (blockhash) + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/blockinfo/0000000000000000000320283a032748cef8227873ff4872689bf23f1cda83a5 ``` + ```json { "average_fee": 1234031, @@ -213,13 +229,16 @@ curl -s -H "Accept: application/json" \ ### Description + UNIX time stamp of latest block. ### Example + ```bash curl -s \ http://0.0.0.0:80/r/blocktime ``` + ```json 1729362253 ``` @@ -232,13 +251,16 @@ curl -s \ ### Description + The first 100 child inscription ids. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/children/e317a2a5d68bd1004ae15a06175a319272a10389ff125c98820389edef8b0a94i0 ``` + ```json { "ids": [ @@ -356,13 +378,16 @@ curl -s -H "Accept: application/json" \ ### Description + The set of 100 child inscription ids on ``. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/children/e317a2a5d68bd1004ae15a06175a319272a10389ff125c98820389edef8b0a94i0/9 ``` + ```json { "ids": [ @@ -480,13 +505,16 @@ curl -s -H "Accept: application/json" \ ### Description + Details of the first 100 child inscriptions. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/children/e317a2a5d68bd1004ae15a06175a319272a10389ff125c98820389edef8b0a94i0/inscriptions ``` + ```json { "children": [ @@ -1802,14 +1830,18 @@ curl -s -H "Accept: application/json" \ ### Description + Details of the set of 100 child inscriptions on <PAGE>. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/children/e317a2a5d68bd1004ae15a06175a319272a10389ff125c98820389edef8b0a94i0/inscriptions/9 ``` -```json{ + +```json +{ "children": [ { "charms": [ @@ -3125,6 +3157,7 @@ curl -s -H "Accept: application/json" \ ### Description + Undelegated content of an inscription. @@ -3137,13 +3170,16 @@ Undelegated content of an inscription. ### Description + Information about an inscription. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/inscriptions/13130e4b299ed361f2a734f6433844ef0f0211cd504e0ca8f4d4ab20f51b8127i0 ``` + ```json { "charms": [ @@ -3173,6 +3209,7 @@ curl -s -H "Accept: application/json" \ ### Description + JSON string containing the hex-encoded CBOR metadata. ### Example @@ -3180,6 +3217,7 @@ JSON string containing the hex-encoded CBOR metadata. curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/metadata/b1ef66c2d1a047cbaa6260b74daac43813924378fe08ef8545da4cb79e8fcf00i0 ``` + ```json "ac6c50484f544f475241504845526a5041524b4552204441596643414d4552416c43414e4f4e20454f532d31566446494c4d6f4b4f44414b20454b54415220313030644c454e53781a5a4549535320504c414e415220542a2038354d4d20462f312e346d5348555454455220535045454465312f31323568415045525455524563462f38664d4f44454c5318646650484f544f531903e8684c4f434154494f4e774c4f5320414e47454c45532c2043414c49464f524e49416443524557a36a415353495354414e4345826e41524941532042555244454c4c49684e4153204e495858664d414b45555087754544454e2053594d4f4e45204c415454414e5a494f6a4d494d49204d455945526e53414d414e544841204c455052456f4c4953455454452053414e54414e416e4a45535349434120564552474f4e63504f4e724d415941204e414b415241205352554f4348644841495283694a414b4920494348556c4a4f43454c594e2056454741724a4546464552534f4e2054414e475241444966504154524f4e6e434153455920524f4441524d4f52674c4943454e534563434330" ``` @@ -3192,13 +3230,16 @@ curl -s -H "Accept: application/json" \ ### Description + The first 100 parent inscription ids. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/parents/b1ef66c2d1a047cbaa6260b74daac43813924378fe08ef8545da4cb79e8fcf00i0 ``` + ```json { "ids": [ @@ -3217,13 +3258,16 @@ curl -s -H "Accept: application/json" \ ### Description + The set of 100 parent inscription ids on ``. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/parents/b1ef66c2d1a047cbaa6260b74daac43813924378fe08ef8545da4cb79e8fcf00i0/9 ``` + ```json { "ids": [], @@ -3240,13 +3284,16 @@ curl -s -H "Accept: application/json" \ ### Description + The first 100 inscription ids on a sat. Requires index with `--index-sats` flag. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/sat/153899938226999 ``` + ```json { "ids": [ @@ -3268,13 +3315,16 @@ curl -s -H "Accept: application/json" \ ### Description + The set of 100 inscription ids on ``. Requires index with `--index-sats` flag. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/sat/1499676120331756/1 ``` + ```json { "ids": [ @@ -3303,13 +3353,16 @@ curl -s -H "Accept: application/json" \ ### Description + The inscription id at `` of all inscriptions on a sat. `` may be a negative number to index from the back. `0` being the first and `-1` being the most recent for example. Requires index with `--index-sats` flag. ### Example + ```bash curl -s -H "Accept: application/json" \ http://0.0.0.0:80/r/sat/153899938226999/at/-1 ``` + ```json { "id": "488c32e4dfcdc0fa376c2c2af2d572a12f4d33d3245689d1a9f74167f1e14678i0" diff --git a/docs/src/inscriptions/uris.md b/docs/src/inscriptions/uris.md new file mode 100644 index 0000000000..d5eeb12b83 --- /dev/null +++ b/docs/src/inscriptions/uris.md @@ -0,0 +1,40 @@ +URIs +==== + +*This document is a draft. It should be considered provisional and subject to +change at any time. The `ord:` schema has not been registered with the IANA.* + +Inscriptions content can be addressed with inscription URIs using the `ord:` +schema. + +Inscription URIs consist of `ord:` followed by a target inscription ID. `ord:` +is not followed by `//`, since the schema-specific part of inscription URIs, +namely the target inscription ID, does not contain a hierarchical structure. + +For example, the inscription URI of the genesis inscription is: + +``` +ord:6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0 +``` + +Inscription URIs match the following verbose regular expression: + +``` +(?i) # case-insensitive +ord: # schema +[0-9a-f]{64} # transaction ID +i # separator +(0|[1-9][0-9]*) # inscription index +``` + +Inscription URIs are case-insensitive and can thus use the more compact +alphanumeric mode when encoded as QR codes. Lowercase is, however, the +preferred presentation style. + +The referent of an inscription URI is an HTTP resource with the content, +content type, content encoding, and content length corresponding to the +inscription with the given ID. + +The referent of an inscription URI is always the original content of the target +inscription, and not the content of the delegate, regardless of whether or not +the target inscription has a delegate. diff --git a/docs/theme/index.hbs b/docs/theme/index.hbs index c421b15008..b99fd79df3 100644 --- a/docs/theme/index.hbs +++ b/docs/theme/index.hbs @@ -1,5 +1,5 @@ - + @@ -52,15 +52,17 @@ {{/if}} - - -
+ - + + + + +
- - -
@@ -165,7 +146,6 @@

{{ book_title }}

-
    -
  1. 1{64}
  2. -
  3. 0{64}
  4. +
  5. 1{64}
  6. +
  7. 0{64}
" .unindent(), diff --git a/src/templates/iframe.rs b/src/templates/iframe.rs index 0880a17863..f7d00f5ccf 100644 --- a/src/templates/iframe.rs +++ b/src/templates/iframe.rs @@ -24,20 +24,21 @@ impl Iframe { impl Display for Iframe { fn fmt(&self, f: &mut Formatter) -> fmt::Result { if self.thumbnail { - write!(f, "", self.inscription_id)?; + write!( + f, + "\ + \ + ", + self.inscription_id, self.inscription_id, + ) + } else { + write!( + f, + "", + self.inscription_id, + ) } - - write!( - f, - "", - self.inscription_id - )?; - - if self.thumbnail { - write!(f, "",)? - } - - Ok(()) } } @@ -50,7 +51,7 @@ mod tests { assert_regex_match!( Iframe::thumbnail(inscription_id(1)) .0.to_string(), - "", + "", ); } diff --git a/src/templates/input.rs b/src/templates/input.rs index 763758eac1..7aca6f1a1d 100644 --- a/src/templates/input.rs +++ b/src/templates/input.rs @@ -39,7 +39,7 @@ mod tests { "

Input /1/2/3

-
previous output
0000000000000000000000000000000000000000000000000000000000000000:0
+
previous output
0000000000000000000000000000000000000000000000000000000000000000:0
witness
010101
script sig
OP_PUSHBYTES_3 666f6f
text
\x03foo
diff --git a/src/templates/inscription.rs b/src/templates/inscription.rs index b0d2a00871..d9e5ce2ba0 100644 --- a/src/templates/inscription.rs +++ b/src/templates/inscription.rs @@ -1,24 +1,24 @@ use super::*; #[derive(Boilerplate, Default)] -pub(crate) struct InscriptionHtml { - pub(crate) chain: Chain, - pub(crate) charms: u16, - pub(crate) child_count: u64, - pub(crate) children: Vec, - pub(crate) fee: u64, - pub(crate) height: u32, - pub(crate) inscription: Inscription, - pub(crate) id: InscriptionId, - pub(crate) number: i32, - pub(crate) next: Option, - pub(crate) output: Option, - pub(crate) parents: Vec, - pub(crate) previous: Option, - pub(crate) rune: Option, - pub(crate) sat: Option, - pub(crate) satpoint: SatPoint, - pub(crate) timestamp: DateTime, +pub struct InscriptionHtml { + pub chain: Chain, + pub charms: u16, + pub child_count: u64, + pub children: Vec, + pub fee: u64, + pub height: u32, + pub inscription: Inscription, + pub id: InscriptionId, + pub number: i32, + pub next: Option, + pub output: Option, + pub parents: Vec, + pub previous: Option, + pub rune: Option, + pub sat: Option, + pub satpoint: SatPoint, + pub timestamp: DateTime, } impl PageContent for InscriptionHtml { @@ -27,6 +27,23 @@ impl PageContent for InscriptionHtml { } } +impl InscriptionHtml { + pub fn burn_metadata(&self) -> Option { + let script_pubkey = &self.output.as_ref()?.script_pubkey; + + if !script_pubkey.is_op_return() { + return None; + } + + let script::Instruction::PushBytes(metadata) = script_pubkey.instructions().nth(1)?.ok()? + else { + return None; + }; + + ciborium::from_reader(Cursor::new(metadata)).ok() + } +} + #[cfg(test)] mod tests { use super::*; @@ -51,7 +68,7 @@ mod tests {
id
-
1{64}i1
+
1{64}i1
preview
link
content
@@ -67,15 +84,23 @@ mod tests {
fee
1
reveal transaction
-
1{64}
+
1{64}
location
-
1{64}:1:0
+
1{64}:1:0
output
-
1{64}:1
+
1{64}:1
offset
0
-
ethereum teleburn address
-
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
details
+
+
+ ... +
+
ethereum teleburn address
+
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
+
+
" .unindent() @@ -90,7 +115,7 @@ mod tests { inscription: inscription("text/plain;charset=utf-8", "HELLOWORLD"), id: inscription_id(1), number: 1, - output: Some(tx_out(1, address())), + output: Some(tx_out(1, address(0))), satpoint: satpoint(1, 0), ..default() }, @@ -104,7 +129,7 @@ mod tests {
.*
address
-
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
+
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
value
1
.* @@ -122,7 +147,7 @@ mod tests { inscription: inscription("text/plain;charset=utf-8", "HELLOWORLD"), id: inscription_id(1), number: 1, - output: Some(tx_out(1, address())), + output: Some(tx_out(1, address(0))), sat: Some(Sat(1)), satpoint: satpoint(1, 0), ..default() @@ -154,7 +179,7 @@ mod tests { id: inscription_id(2), next: Some(inscription_id(3)), number: 1, - output: Some(tx_out(1, address())), + output: Some(tx_out(1, address(0))), previous: Some(inscription_id(1)), satpoint: satpoint(1, 0), ..default() @@ -180,7 +205,7 @@ mod tests { inscription: inscription("text/plain;charset=utf-8", "HELLOWORLD"), id: inscription_id(2), number: -1, - output: Some(tx_out(1, address())), + output: Some(tx_out(1, address(0))), satpoint: SatPoint { outpoint: unbound_outpoint(), offset: 0 @@ -194,9 +219,9 @@ mod tests {
.*
location
-
0{64}:0:0
+
0{64}:0:0
output
-
0{64}:0
+
0{64}:0
.*
" @@ -234,7 +259,7 @@ mod tests {
id
-
1{64}i1
+
1{64}i1
preview
link
content
@@ -250,15 +275,23 @@ mod tests {
fee
1
reveal transaction
-
1{64}
+
1{64}
location
-
1{64}:1:0
+
1{64}:1:0
output
-
1{64}:1
+
1{64}:1
offset
0
-
ethereum teleburn address
-
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
details
+
+
+ ... +
+
ethereum teleburn address
+
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
+
+
" .unindent() @@ -297,7 +330,7 @@ mod tests {
id
-
1{64}i1
+
1{64}i1
preview
link
content
@@ -313,15 +346,23 @@ mod tests {
fee
1
reveal transaction
-
1{64}
+
1{64}
location
-
1{64}:1:0
+
1{64}:1:0
output
-
1{64}:1
+
1{64}:1
offset
0
-
ethereum teleburn address
-
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
details
+
+
+ ... +
+
ethereum teleburn address
+
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
+
+
" .unindent() @@ -359,7 +400,7 @@ mod tests {
id
-
1{64}i1
+
1{64}i1
preview
link
content
@@ -375,15 +416,23 @@ mod tests {
fee
1
reveal transaction
-
1{64}
+
1{64}
location
-
1{64}:1:0
+
1{64}:1:0
output
-
1{64}:1
+
1{64}:1
offset
0
-
ethereum teleburn address
-
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
details
+
+
+ ... +
+
ethereum teleburn address
+
0xa1DfBd1C519B9323FD7Fd8e498Ac16c2E502F059
+
+
+
" .unindent() @@ -445,4 +494,45 @@ mod tests { .unindent() ); } + + #[test] + fn with_burn_metadata() { + let script_pubkey = script::Builder::new() + .push_opcode(opcodes::all::OP_RETURN) + .push_slice([ + 0xA2, 0x63, b'f', b'o', b'o', 0x63, b'b', b'a', b'r', 0x63, b'b', b'a', b'z', 0x01, + ]) + .into_script(); + + assert_regex_match!( + InscriptionHtml { + fee: 1, + inscription: Inscription { + content_encoding: Some("br".into()), + ..inscription("text/plain;charset=utf-8", "HELLOWORLD") + }, + id: inscription_id(1), + number: 1, + satpoint: satpoint(1, 0), + output: Some(TxOut { + value: Amount::from_sat(1), + script_pubkey, + }), + ..default() + }, + " +

Inscription 1

+ .* +
+ .* +
burn metadata
+
+
foo
bar
baz
1
+
+ .* +
+ " + .unindent() + ); + } } diff --git a/src/templates/metadata.rs b/src/templates/metadata.rs index 29245ad44a..aafa2f819a 100644 --- a/src/templates/metadata.rs +++ b/src/templates/metadata.rs @@ -2,7 +2,7 @@ use super::*; pub(crate) struct MetadataHtml<'a>(pub &'a Value); -impl<'a> Display for MetadataHtml<'a> { +impl Display for MetadataHtml<'_> { fn fmt(&self, f: &mut Formatter) -> fmt::Result { match self.0 { Value::Array(x) => { diff --git a/src/templates/output.rs b/src/templates/output.rs index 31af3ca034..235403cff8 100644 --- a/src/templates/output.rs +++ b/src/templates/output.rs @@ -41,14 +41,14 @@ mod tests {
value
3
script pubkey
OP_DUP OP_HASH160 OP_PUSHBYTES_20 0{40} OP_EQUALVERIFY OP_CHECKSIG
-
address
1111111111111111111114oLvT2
-
transaction
1{64}
+
address
1111111111111111111114oLvT2
+
transaction
1{64}
spent
false

2 Sat Ranges

  • 0
  • -
  • 1-3 \\(2 sats\\)
  • +
  • 1-2 \\(2 sats\\)
" .unindent() @@ -75,7 +75,7 @@ mod tests {
value
1
script pubkey
OP_0
-
transaction
1{64}
+
transaction
1{64}
spent
true
" @@ -100,14 +100,14 @@ mod tests {
value
3
script pubkey
OP_DUP OP_HASH160 OP_PUSHBYTES_20 0{40} OP_EQUALVERIFY OP_CHECKSIG
-
address
1111111111111111111114oLvT2
-
transaction
1{64}
+
address
1111111111111111111114oLvT2
+
transaction
1{64}
spent
true

2 Sat Ranges

  • 0
  • -
  • 1-3 \\(2 sats\\)
  • +
  • 1-2 \\(2 sats\\)
" .unindent() @@ -132,8 +132,8 @@ mod tests {
value
3
script pubkey
OP_DUP OP_HASH160 OP_PUSHBYTES_20 0{40} OP_EQUALVERIFY OP_CHECKSIG
-
address
1111111111111111111114oLvT2
-
transaction
1{64}
+
address
1111111111111111111114oLvT2
+
transaction
1{64}
spent
false
" diff --git a/src/templates/rune.rs b/src/templates/rune.rs index 3d1671b70d..d7e4515b38 100644 --- a/src/templates/rune.rs +++ b/src/templates/rune.rs @@ -122,9 +122,9 @@ mod tests {
turbo
true
etching
-
0{64}
+
0{64}
parent
-
0{64}i0
+
0{64}i0
" ); diff --git a/src/templates/rune_not_found.rs b/src/templates/rune_not_found.rs new file mode 100644 index 0000000000..e050fa5c80 --- /dev/null +++ b/src/templates/rune_not_found.rs @@ -0,0 +1,54 @@ +use super::*; + +#[derive(Boilerplate, Debug, PartialEq, Serialize)] +pub struct RuneNotFoundHtml { + pub rune: Rune, + pub unlock_height: Option, +} + +impl PageContent for RuneNotFoundHtml { + fn title(&self) -> String { + format!("Rune {}", self.rune) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn display() { + assert_regex_match!( + RuneNotFoundHtml { + rune: Rune(u128::MAX), + unlock_height: Some(Height(111)), + }, + "

BCGDENLQRQWDSLRUGSNLBTMFIJAV

+
+
unlock height
+
111
+
reserved
+
false
+
+" + ); + } + + #[test] + fn display_reserved() { + assert_regex_match!( + RuneNotFoundHtml { + rune: Rune(Rune::RESERVED), + unlock_height: None, + }, + "

AAAAAAAAAAAAAAAAAAAAAAAAAAA

+
+
unlock height
+
none
+
reserved
+
true
+
+" + ); + } +} diff --git a/src/templates/sat.rs b/src/templates/sat.rs index b0428422ec..979c23f53d 100644 --- a/src/templates/sat.rs +++ b/src/templates/sat.rs @@ -2,6 +2,7 @@ use super::*; #[derive(Boilerplate)] pub(crate) struct SatHtml { + pub(crate) address: Option
, pub(crate) blocktime: Blocktime, pub(crate) inscriptions: Vec, pub(crate) sat: Sat, @@ -22,6 +23,7 @@ mod tests { fn first() { assert_regex_match!( SatHtml { + address: None, sat: Sat(0), satpoint: None, blocktime: Blocktime::confirmed(0), @@ -45,6 +47,7 @@ mod tests {
🪙 🎃 + 🦋
.* @@ -60,6 +63,7 @@ mod tests { fn last() { assert_regex_match!( SatHtml { + address: None, sat: Sat(2099999997689999), satpoint: None, blocktime: Blocktime::confirmed(0), @@ -97,6 +101,7 @@ mod tests { fn sat_with_next_and_prev() { assert_regex_match!( SatHtml { + address: None, sat: Sat(1), satpoint: None, blocktime: Blocktime::confirmed(0), @@ -110,6 +115,7 @@ mod tests { fn sat_with_inscription() { assert_regex_match!( SatHtml { + address: None, sat: Sat(0), satpoint: None, blocktime: Blocktime::confirmed(0), @@ -131,6 +137,7 @@ mod tests { fn sat_with_reinscription() { assert_regex_match!( SatHtml { + address: None, sat: Sat(0), satpoint: None, blocktime: Blocktime::confirmed(0), @@ -153,6 +160,7 @@ mod tests { fn last_sat_next_link_is_disabled() { assert_regex_match!( SatHtml { + address: None, sat: Sat::LAST, satpoint: None, blocktime: Blocktime::confirmed(0), @@ -166,12 +174,27 @@ mod tests { fn sat_with_satpoint() { assert_regex_match!( SatHtml { + address: None, sat: Sat(0), satpoint: Some(satpoint(1, 0)), blocktime: Blocktime::confirmed(0), inscriptions: Vec::new(), }, - "

Sat 0

.*
location
1{64}:1:0
.*", + "

Sat 0

.*
location
1{64}:1:0
.*", + ); + } + + #[test] + fn sat_with_address() { + assert_regex_match!( + SatHtml { + address: Some(address(0)), + sat: Sat(0), + satpoint: Some(satpoint(1, 0)), + blocktime: Blocktime::confirmed(0), + inscriptions: Vec::new(), + }, + "

Sat 0

.*
address
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
.*", ); } } diff --git a/src/templates/transaction.rs b/src/templates/transaction.rs index 3cdffce40a..a353e8a7ba 100644 --- a/src/templates/transaction.rs +++ b/src/templates/transaction.rs @@ -59,12 +59,12 @@ mod tests {

1 Input

2 Outputs

  • - + {txid}:0
    @@ -73,7 +73,7 @@ mod tests {
  • - + {txid}:1
    diff --git a/src/test.rs b/src/test.rs index f4aa2c1176..748fec9990 100644 --- a/src/test.rs +++ b/src/test.rs @@ -12,7 +12,11 @@ pub(crate) use { unindent::Unindent, }; -pub(crate) fn txid(n: u64) -> Txid { +pub(crate) fn rune_id(tx: u32) -> RuneId { + RuneId { block: 1, tx } +} + +pub(crate) fn txid(n: u32) -> Txid { let hex = format!("{n:x}"); if hex.is_empty() || hex.len() > 1 { @@ -22,22 +26,37 @@ pub(crate) fn txid(n: u64) -> Txid { hex.repeat(64).parse().unwrap() } -pub(crate) fn outpoint(n: u64) -> OutPoint { - format!("{}:{}", txid(n), n).parse().unwrap() +pub(crate) fn outpoint(n: u32) -> OutPoint { + OutPoint { + txid: txid(n), + vout: n, + } } -pub(crate) fn satpoint(n: u64, offset: u64) -> SatPoint { +pub(crate) fn satpoint(n: u32, offset: u64) -> SatPoint { SatPoint { - outpoint: outpoint(n), offset, + outpoint: outpoint(n), } } -pub(crate) fn address() -> Address { - "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4" - .parse::>() - .unwrap() - .assume_checked() +pub(crate) fn address(n: u32) -> Address { + match n { + 0 => "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", + 1 => "bc1qhl452zcq3ng5kzajzkx9jnzncml9tnsk3w96s6", + 2 => "bc1qqqcjq9jydx79rywltc38g5qfrjq485a8xfmkf7", + 3 => "bc1qcq2uv5nk6hec6kvag3wyevp6574qmsm9scjxc2", + 4 => "bc1qukgekwq8e68ay0mewdrvg0d3cfuc094aj2rvx9", + 5 => "bc1qtdjs8tgkaja5ddxs0j7rn52uqfdtqa53mum8xc", + 6 => "bc1qd3ex6kwlc5ett55hgsnk94y8q2zhdyxyqyujkl", + 7 => "bc1q8dcv8r903evljd87mcg0hq8lphclch7pd776wt", + 8 => "bc1q9j6xvm3td447ygnhfra5tfkpkcupwe9937nhjq", + 9 => "bc1qlyrhjzvxdzmvxe2mnr37p68vkl5fysyhfph8z0", + _ => panic!(), + } + .parse::>() + .unwrap() + .assume_checked() } pub(crate) fn recipient() -> ScriptBuf { diff --git a/src/wallet.rs b/src/wallet.rs index 37abace28e..f45fc9dd6a 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -2,12 +2,12 @@ use { super::*, base64::{self, Engine}, batch::ParentInfo, - bitcoin::secp256k1::{All, Secp256k1}, bitcoin::{ - bip32::{ChildNumber, DerivationPath, Fingerprint, Xpriv}, + bip32::{ChildNumber, DerivationPath, Xpriv}, psbt::Psbt, + secp256k1::Secp256k1, }, - bitcoincore_rpc::bitcoincore_rpc_json::{ImportDescriptors, Timestamp}, + bitcoincore_rpc::json::ImportDescriptors, entry::{EtchingEntry, EtchingEntryValue}, fee_rate::FeeRate, index::entry::Entry, @@ -290,10 +290,12 @@ impl Wallet { ) .send()?; - if !response.status().is_success() { + if response.status() == StatusCode::NOT_FOUND { return Ok(None); } + let response = response.error_for_status()?; + let rune_json: api::Rune = serde_json::from_str(&response.text()?)?; Ok(Some((rune_json.id, rune_json.entry, rune_json.parent))) @@ -493,7 +495,12 @@ impl Wallet { Ok(()) } - pub(crate) fn initialize(name: String, settings: &Settings, seed: [u8; 64]) -> Result { + pub(crate) fn initialize( + name: String, + settings: &Settings, + seed: [u8; 64], + timestamp: bitcoincore_rpc::json::Timestamp, + ) -> Result { Self::check_version(settings.bitcoin_rpc_client(None)?)?.create_wallet( &name, None, @@ -519,61 +526,62 @@ impl Wallet { let derived_private_key = master_private_key.derive_priv(&secp, &derivation_path)?; + let mut descriptors = Vec::new(); for change in [false, true] { - Self::derive_and_import_descriptor( - name.clone(), - settings, - &secp, - (fingerprint, derivation_path.clone()), - derived_private_key, - change, - )?; - } - - Ok(()) - } - - fn derive_and_import_descriptor( - name: String, - settings: &Settings, - secp: &Secp256k1, - origin: (Fingerprint, DerivationPath), - derived_private_key: Xpriv, - change: bool, - ) -> Result { - let secret_key = DescriptorSecretKey::XPrv(DescriptorXKey { - origin: Some(origin), - xkey: derived_private_key, - derivation_path: DerivationPath::master().child(ChildNumber::Normal { - index: change.into(), - }), - wildcard: Wildcard::Unhardened, - }); + let secret_key = DescriptorSecretKey::XPrv(DescriptorXKey { + origin: Some((fingerprint, derivation_path.clone())), + xkey: derived_private_key, + derivation_path: DerivationPath::master().child(ChildNumber::Normal { + index: change.into(), + }), + wildcard: Wildcard::Unhardened, + }); - let public_key = secret_key.to_public(secp)?; + let public_key = secret_key.to_public(&secp)?; - let mut key_map = BTreeMap::new(); - key_map.insert(public_key.clone(), secret_key); + let mut key_map = BTreeMap::new(); + key_map.insert(public_key.clone(), secret_key); - let descriptor = miniscript::descriptor::Descriptor::new_tr(public_key, None)?; + let descriptor = miniscript::descriptor::Descriptor::new_tr(public_key, None)?; - settings - .bitcoin_rpc_client(Some(name.clone()))? - .import_descriptors(ImportDescriptors { + descriptors.push(ImportDescriptors { descriptor: descriptor.to_string_with_secret(&key_map), - timestamp: Timestamp::Now, + timestamp, active: Some(true), range: None, next_index: None, internal: Some(change), label: None, - })?; + }); + } - Ok(()) + match settings + .bitcoin_rpc_client(Some(name.clone()))? + .call::( + "importdescriptors", + &[serde_json::to_value(descriptors.clone())?], + ) { + Ok(_) => Ok(()), + Err(bitcoincore_rpc::Error::JsonRpc(bitcoincore_rpc::jsonrpc::Error::Rpc(err))) + if err.code == -4 && err.message == "Wallet already loading." => + { + // wallet loading + Ok(()) + } + Err(bitcoincore_rpc::Error::JsonRpc(bitcoincore_rpc::jsonrpc::Error::Rpc(err))) + if err.code == -35 => + { + // wallet already loaded + Ok(()) + } + Err(err) => { + bail!("Failed to import descriptors for wallet {}: {err}", name) + } + } } pub(crate) fn check_version(client: Client) -> Result { - const MIN_VERSION: usize = 240000; + const MIN_VERSION: usize = 250000; let bitcoin_version = client.version()?; if bitcoin_version < MIN_VERSION { @@ -674,7 +682,8 @@ impl Wallet { { let database = Database::builder().create(&path)?; - let tx = database.begin_write()?; + let mut tx = database.begin_write()?; + tx.set_quick_repair(true); tx.open_table(RUNE_TO_ETCHING)?; @@ -698,7 +707,8 @@ impl Wallet { reveal: &Transaction, output: batch::Output, ) -> Result { - let wtx = self.database.begin_write()?; + let mut wtx = self.database.begin_write()?; + wtx.set_quick_repair(true); wtx.open_table(RUNE_TO_ETCHING)?.insert( rune.0, @@ -727,7 +737,8 @@ impl Wallet { } pub(crate) fn clear_etching(&self, rune: Rune) -> Result { - let wtx = self.database.begin_write()?; + let mut wtx = self.database.begin_write()?; + wtx.set_quick_repair(true); wtx.open_table(RUNE_TO_ETCHING)?.remove(rune.0)?; wtx.commit()?; @@ -749,10 +760,11 @@ impl Wallet { ) } - pub(super) fn sign_transaction( + pub(super) fn sign_and_broadcast_transaction( &self, unsigned_transaction: Transaction, dry_run: bool, + burn_amount: Option, ) -> Result<(Txid, String, u64)> { let unspent_outputs = self.utxos(); @@ -787,10 +799,7 @@ impl Wallet { .hex .ok_or_else(|| anyhow!("unable to sign transaction"))?; - ( - self.bitcoin_client().send_raw_transaction(&signed_tx)?, - psbt, - ) + (self.send_raw_transaction(&signed_tx, burn_amount)?, psbt) }; let mut fee = 0; @@ -807,4 +816,288 @@ impl Wallet { Ok((txid, psbt, fee)) } + + fn send_raw_transaction( + &self, + tx: R, + burn_amount: Option, + ) -> Result { + let mut arguments = vec![tx.raw_hex().into()]; + + if let Some(burn_amount) = burn_amount { + arguments.push(serde_json::Value::Null); + arguments.push(burn_amount.to_btc().into()); + } + + Ok( + self + .bitcoin_client() + .call("sendrawtransaction", &arguments)?, + ) + } + + pub fn create_unsigned_send_amount_transaction( + &self, + destination: Address, + amount: Amount, + fee_rate: FeeRate, + ) -> Result { + self.lock_non_cardinal_outputs()?; + + let unfunded_transaction = Transaction { + version: Version(2), + lock_time: LockTime::ZERO, + input: Vec::new(), + output: vec![TxOut { + script_pubkey: destination.script_pubkey(), + value: amount, + }], + }; + + let unsigned_transaction = consensus::encode::deserialize(&fund_raw_transaction( + self.bitcoin_client(), + fee_rate, + &unfunded_transaction, + )?)?; + + Ok(unsigned_transaction) + } + + pub fn create_unsigned_send_satpoint_transaction( + &self, + destination: Address, + satpoint: SatPoint, + postage: Option, + fee_rate: FeeRate, + sending_inscription: bool, + ) -> Result { + if !sending_inscription { + for inscription_satpoint in self.inscriptions().keys() { + if satpoint == *inscription_satpoint { + bail!("inscriptions must be sent by inscription ID"); + } + } + } + + let runic_outputs = self.get_runic_outputs()?; + + ensure!( + !runic_outputs.contains(&satpoint.outpoint), + "runic outpoints may not be sent by satpoint" + ); + + let change = [self.get_change_address()?, self.get_change_address()?]; + + let postage = if let Some(postage) = postage { + Target::ExactPostage(postage) + } else { + Target::Postage + }; + + Ok( + TransactionBuilder::new( + satpoint, + self.inscriptions().clone(), + self.utxos().clone(), + self.locked_utxos().clone().into_keys().collect(), + runic_outputs, + destination.script_pubkey(), + change, + fee_rate, + postage, + self.chain().network(), + ) + .build_transaction()?, + ) + } + + pub fn create_unsigned_send_or_burn_runes_transaction( + &self, + destination: Option
    , + spaced_rune: SpacedRune, + decimal: Decimal, + postage: Option, + fee_rate: FeeRate, + ) -> Result { + ensure!( + self.has_rune_index(), + "sending runes with `ord send` requires index created with `--index-runes` flag", + ); + + self.lock_non_cardinal_outputs()?; + + let (id, entry, _parent) = self + .get_rune(spaced_rune.rune)? + .with_context(|| format!("rune `{}` has not been etched", spaced_rune.rune))?; + + let amount = decimal.to_integer(entry.divisibility)?; + + let inscribed_outputs = self + .inscriptions() + .keys() + .map(|satpoint| satpoint.outpoint) + .collect::>(); + + let balances = self + .get_runic_outputs()? + .into_iter() + .filter(|output| !inscribed_outputs.contains(output)) + .map(|output| { + self.get_runes_balances_in_output(&output).map(|balance| { + ( + output, + balance + .into_iter() + .map(|(spaced_rune, pile)| (spaced_rune.rune, pile.amount)) + .collect(), + ) + }) + }) + .collect::>>>()?; + + let mut inputs = Vec::new(); + let mut input_rune_balances: BTreeMap = BTreeMap::new(); + + for (output, runes) in balances { + if let Some(balance) = runes.get(&spaced_rune.rune) { + if *balance > 0 { + for (rune, balance) in runes { + *input_rune_balances.entry(rune).or_default() += balance; + } + + inputs.push(output); + + if input_rune_balances + .get(&spaced_rune.rune) + .cloned() + .unwrap_or_default() + >= amount + { + break; + } + } + } + } + + let input_rune_balance = input_rune_balances + .get(&spaced_rune.rune) + .cloned() + .unwrap_or_default(); + + let needs_runes_change_output = input_rune_balance > amount || input_rune_balances.len() > 1; + + ensure! { + input_rune_balance >= amount, + "insufficient `{}` balance, only {} in wallet", + spaced_rune, + Pile { + amount: input_rune_balance, + divisibility: entry.divisibility, + symbol: entry.symbol + }, + } + + let runestone; + let postage = postage.unwrap_or(TARGET_POSTAGE); + + let unfunded_transaction = if let Some(destination) = destination { + runestone = Runestone { + edicts: vec![Edict { + amount, + id, + output: 2, + }], + ..default() + }; + + Transaction { + version: Version(2), + lock_time: LockTime::ZERO, + input: inputs + .into_iter() + .map(|previous_output| TxIn { + previous_output, + script_sig: ScriptBuf::new(), + sequence: Sequence::MAX, + witness: Witness::new(), + }) + .collect(), + output: if needs_runes_change_output { + vec![ + TxOut { + script_pubkey: runestone.encipher(), + value: Amount::from_sat(0), + }, + TxOut { + script_pubkey: self.get_change_address()?.script_pubkey(), + value: postage, + }, + TxOut { + script_pubkey: destination.script_pubkey(), + value: postage, + }, + ] + } else { + vec![TxOut { + script_pubkey: destination.script_pubkey(), + value: postage, + }] + }, + } + } else { + runestone = Runestone { + edicts: vec![Edict { + amount, + id, + output: 0, + }], + ..default() + }; + + Transaction { + version: Version(2), + lock_time: LockTime::ZERO, + input: inputs + .into_iter() + .map(|previous_output| TxIn { + previous_output, + script_sig: ScriptBuf::new(), + sequence: Sequence::MAX, + witness: Witness::new(), + }) + .collect(), + output: if needs_runes_change_output { + vec![ + TxOut { + script_pubkey: runestone.encipher(), + value: Amount::from_sat(0), + }, + TxOut { + script_pubkey: self.get_change_address()?.script_pubkey(), + value: postage, + }, + ] + } else { + vec![TxOut { + script_pubkey: runestone.encipher(), + value: Amount::from_sat(0), + }] + }, + } + }; + + let unsigned_transaction = + fund_raw_transaction(self.bitcoin_client(), fee_rate, &unfunded_transaction)?; + + let unsigned_transaction = consensus::encode::deserialize(&unsigned_transaction)?; + + if needs_runes_change_output { + assert_eq!( + Runestone::decipher(&unsigned_transaction), + Some(Artifact::Runestone(runestone)), + ); + } + + Ok(unsigned_transaction) + } } diff --git a/src/wallet/batch.rs b/src/wallet/batch.rs index 665dc989ac..1d775cebbe 100644 --- a/src/wallet/batch.rs +++ b/src/wallet/batch.rs @@ -4,7 +4,6 @@ use { blockdata::{opcodes, script}, key::PrivateKey, key::{TapTweak, TweakedKeypair, TweakedPublicKey, UntweakedKeypair}, - policy::MAX_STANDARD_TX_WEIGHT, secp256k1::{self, constants::SCHNORR_SIGNATURE_SIZE, rand, Secp256k1, XOnlyPublicKey}, sighash::{Prevouts, SighashCache, TapSighashType}, taproot::Signature, @@ -74,7 +73,7 @@ mod tests { #[test] fn reveal_transaction_pays_fee() { - let utxos = vec![(outpoint(1), tx_out(20000, address()))]; + let utxos = vec![(outpoint(1), tx_out(20000, address(0)))]; let inscription = inscription("text/plain", "ord"); let commit_address = change(0); let reveal_address = recipient_address(); @@ -120,7 +119,7 @@ mod tests { #[test] fn inscribe_transactions_opt_in_to_rbf() { - let utxos = vec![(outpoint(1), tx_out(20000, address()))]; + let utxos = vec![(outpoint(1), tx_out(20000, address(0)))]; let inscription = inscription("text/plain", "ord"); let commit_address = change(0); let reveal_address = recipient_address(); @@ -160,7 +159,7 @@ mod tests { #[test] fn inscribe_with_no_satpoint_and_no_cardinal_utxos() { - let utxos = vec![(outpoint(1), tx_out(1000, address()))]; + let utxos = vec![(outpoint(1), tx_out(1000, address(0)))]; let mut inscriptions = BTreeMap::new(); inscriptions.insert( SatPoint { @@ -210,8 +209,8 @@ mod tests { #[test] fn inscribe_with_no_satpoint_and_enough_cardinal_utxos() { let utxos = vec![ - (outpoint(1), tx_out(20_000, address())), - (outpoint(2), tx_out(20_000, address())), + (outpoint(1), tx_out(20_000, address(0))), + (outpoint(2), tx_out(20_000, address(0))), ]; let mut inscriptions = BTreeMap::new(); inscriptions.insert( @@ -255,8 +254,8 @@ mod tests { #[test] fn inscribe_with_custom_fee_rate() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(20_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(20_000, address(0))), ]; let mut inscriptions = BTreeMap::new(); inscriptions.insert( @@ -330,8 +329,8 @@ mod tests { #[test] fn inscribe_with_parent() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(20_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(20_000, address(0))), ]; let mut inscriptions = BTreeMap::new(); @@ -428,8 +427,8 @@ mod tests { #[test] fn inscribe_with_commit_fee_rate() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(20_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(20_000, address(0))), ]; let mut inscriptions = BTreeMap::new(); inscriptions.insert( @@ -503,7 +502,7 @@ mod tests { #[test] fn inscribe_over_max_standard_tx_weight() { - let utxos = vec![(outpoint(1), tx_out(50 * COIN_VALUE, address()))]; + let utxos = vec![(outpoint(1), tx_out(50 * COIN_VALUE, address(0)))]; let inscription = inscription("text/plain", [0; MAX_STANDARD_TX_WEIGHT as usize]); let satpoint = None; @@ -544,7 +543,7 @@ mod tests { #[test] fn inscribe_with_no_max_standard_tx_weight() { - let utxos = vec![(outpoint(1), tx_out(50 * COIN_VALUE, address()))]; + let utxos = vec![(outpoint(1), tx_out(50 * COIN_VALUE, address(0)))]; let inscription = inscription("text/plain", [0; MAX_STANDARD_TX_WEIGHT as usize]); let satpoint = None; @@ -581,8 +580,8 @@ mod tests { #[test] fn batch_inscribe_with_parent() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(50_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(50_000, address(0))), ]; let parent = inscription_id(1); @@ -690,12 +689,12 @@ mod tests { #[test] fn batch_inscribe_satpoints_with_parent() { let utxos = vec![ - (outpoint(1), tx_out(1_111, address())), - (outpoint(2), tx_out(2_222, address())), - (outpoint(3), tx_out(3_333, address())), - (outpoint(4), tx_out(10_000, address())), - (outpoint(5), tx_out(50_000, address())), - (outpoint(6), tx_out(60_000, address())), + (outpoint(1), tx_out(1_111, address(0))), + (outpoint(2), tx_out(2_222, address(0))), + (outpoint(3), tx_out(3_333, address(0))), + (outpoint(4), tx_out(10_000, address(0))), + (outpoint(5), tx_out(50_000, address(0))), + (outpoint(6), tx_out(60_000, address(0))), ]; let parent = inscription_id(1); @@ -822,8 +821,8 @@ mod tests { #[test] fn batch_inscribe_with_parent_not_enough_cardinals_utxos_fails() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(20_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(20_000, address(0))), ]; let parent = inscription_id(1); @@ -899,8 +898,8 @@ mod tests { #[should_panic(expected = "invariant: shared-output has only one destination")] fn batch_inscribe_with_inconsistent_reveal_addresses_panics() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(80_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(80_000, address(0))), ]; let parent = inscription_id(1); @@ -968,7 +967,7 @@ mod tests { #[test] fn batch_inscribe_over_max_standard_tx_weight() { - let utxos = vec![(outpoint(1), tx_out(50 * COIN_VALUE, address()))]; + let utxos = vec![(outpoint(1), tx_out(50 * COIN_VALUE, address(0)))]; let wallet_inscriptions = BTreeMap::new(); @@ -1016,8 +1015,8 @@ mod tests { #[test] fn batch_inscribe_into_separate_outputs() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(80_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(80_000, address(0))), ]; let wallet_inscriptions = BTreeMap::new(); @@ -1073,8 +1072,8 @@ mod tests { #[test] fn batch_inscribe_into_separate_outputs_with_parent() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(50_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(50_000, address(0))), ]; let parent = inscription_id(1); diff --git a/src/wallet/batch/file.rs b/src/wallet/batch/file.rs index 1bbfda4e52..8f8056f5f4 100644 --- a/src/wallet/batch/file.rs +++ b/src/wallet/batch/file.rs @@ -37,7 +37,7 @@ impl File { if sat_or_satpoint { ensure!( batchfile.mode == Mode::SameSat, - "neither `sat` nor `satpoint` can be set in `same-sat` mode", + "`sat` or `satpoint` can only be set in `same-sat` mode", ); } diff --git a/src/wallet/batch/plan.rs b/src/wallet/batch/plan.rs index 9f844ca845..7639903fbf 100644 --- a/src/wallet/batch/plan.rs +++ b/src/wallet/batch/plan.rs @@ -483,9 +483,10 @@ impl Plan { runestone = Some(inner); ensure!( - self.no_limit || script_pubkey.len() <= 82, - "runestone greater than maximum OP_RETURN size: {} > 82", - script_pubkey.len() + self.no_limit || script_pubkey.len() <= MAX_STANDARD_OP_RETURN_SIZE, + "runestone greater than maximum OP_RETURN size: {} > {}", + script_pubkey.len(), + MAX_STANDARD_OP_RETURN_SIZE, ); reveal_outputs.push(TxOut { diff --git a/src/wallet/transaction_builder.rs b/src/wallet/transaction_builder.rs index eb411c1df0..4e97eee01b 100644 --- a/src/wallet/transaction_builder.rs +++ b/src/wallet/transaction_builder.rs @@ -727,9 +727,9 @@ mod tests { #[test] fn select_sat() { let mut utxos = vec![ - (outpoint(1), tx_out(5_000, address())), - (outpoint(2), tx_out(49 * COIN_VALUE, address())), - (outpoint(3), tx_out(2_000, address())), + (outpoint(1), tx_out(5_000, address(0))), + (outpoint(2), tx_out(49 * COIN_VALUE, address(0))), + (outpoint(3), tx_out(2_000, address(0))), ]; let tx_builder = TransactionBuilder::new( @@ -765,9 +765,9 @@ mod tests { #[test] fn tx_builder_to_transaction() { let mut amounts = BTreeMap::new(); - amounts.insert(outpoint(1), tx_out(5_000, address())); - amounts.insert(outpoint(2), tx_out(5_000, address())); - amounts.insert(outpoint(3), tx_out(2_000, address())); + amounts.insert(outpoint(1), tx_out(5_000, address(0))); + amounts.insert(outpoint(2), tx_out(5_000, address(0))); + amounts.insert(outpoint(3), tx_out(2_000, address(0))); let tx_builder = TransactionBuilder { amounts, @@ -816,7 +816,7 @@ mod tests { #[test] fn transactions_are_rbf() { - let utxos = vec![(outpoint(1), tx_out(5_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(5_000, address(0)))]; assert!(TransactionBuilder::new( satpoint(1, 0), @@ -837,7 +837,7 @@ mod tests { #[test] fn deduct_fee() { - let utxos = vec![(outpoint(1), tx_out(5_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(5_000, address(0)))]; pretty_assert_eq!( TransactionBuilder::new( @@ -865,7 +865,7 @@ mod tests { #[test] #[should_panic(expected = "invariant: deducting fee does not consume sat")] fn invariant_deduct_fee_does_not_consume_sat() { - let utxos = vec![(outpoint(1), tx_out(5_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(5_000, address(0)))]; TransactionBuilder::new( satpoint(1, 4_950), @@ -889,8 +889,8 @@ mod tests { #[test] fn additional_postage_added_when_required() { let utxos = vec![ - (outpoint(1), tx_out(5_000, address())), - (outpoint(2), tx_out(5_000, address())), + (outpoint(1), tx_out(5_000, address(0))), + (outpoint(2), tx_out(5_000, address(0))), ]; pretty_assert_eq!( @@ -918,7 +918,7 @@ mod tests { #[test] fn insufficient_padding_to_add_postage_no_utxos() { - let utxos = vec![(outpoint(1), tx_out(5_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(5_000, address(0)))]; pretty_assert_eq!( TransactionBuilder::new( @@ -941,8 +941,8 @@ mod tests { #[test] fn insufficient_padding_to_add_postage_small_utxos() { let utxos = vec![ - (outpoint(1), tx_out(5_000, address())), - (outpoint(2), tx_out(1, address())), + (outpoint(1), tx_out(5_000, address(0))), + (outpoint(2), tx_out(1, address(0))), ]; pretty_assert_eq!( @@ -966,8 +966,8 @@ mod tests { #[test] fn excess_additional_postage_is_stripped() { let utxos = vec![ - (outpoint(1), tx_out(5_000, address())), - (outpoint(2), tx_out(25_000, address())), + (outpoint(1), tx_out(5_000, address(0))), + (outpoint(2), tx_out(25_000, address(0))), ]; pretty_assert_eq!( @@ -1003,7 +1003,7 @@ mod tests { TransactionBuilder::new( satpoint(2, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(4, address()))] + vec![(outpoint(1), tx_out(4, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1024,7 +1024,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 4), BTreeMap::new(), - vec![(outpoint(1), tx_out(4, address()))] + vec![(outpoint(1), tx_out(4, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1045,7 +1045,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 2), BTreeMap::new(), - vec![(outpoint(1), tx_out(5, address()))] + vec![(outpoint(1), tx_out(5, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1066,7 +1066,7 @@ mod tests { let mut builder = TransactionBuilder::new( satpoint(1, 2), BTreeMap::new(), - vec![(outpoint(1), tx_out(5, address()))] + vec![(outpoint(1), tx_out(5, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1095,7 +1095,7 @@ mod tests { let mut builder = TransactionBuilder::new( satpoint(1, 2), BTreeMap::new(), - vec![(outpoint(1), tx_out(5, address()))] + vec![(outpoint(1), tx_out(5, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1116,7 +1116,7 @@ mod tests { #[test] fn excess_postage_is_stripped() { - let utxos = vec![(outpoint(1), tx_out(1_000_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(1_000_000, address(0)))]; pretty_assert_eq!( TransactionBuilder::new( @@ -1147,7 +1147,7 @@ mod tests { #[test] #[should_panic(expected = "invariant: excess postage is stripped")] fn invariant_excess_postage_is_stripped() { - let utxos = vec![(outpoint(1), tx_out(1_000_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(1_000_000, address(0)))]; TransactionBuilder::new( satpoint(1, 0), @@ -1169,7 +1169,7 @@ mod tests { #[test] fn sat_is_aligned() { - let utxos = vec![(outpoint(1), tx_out(10_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(10_000, address(0)))]; pretty_assert_eq!( TransactionBuilder::new( @@ -1197,8 +1197,8 @@ mod tests { #[test] fn alignment_output_under_dust_limit_is_padded() { let utxos = vec![ - (outpoint(1), tx_out(10_000, address())), - (outpoint(2), tx_out(10_000, address())), + (outpoint(1), tx_out(10_000, address(0))), + (outpoint(2), tx_out(10_000, address(0))), ]; pretty_assert_eq!( @@ -1230,7 +1230,7 @@ mod tests { #[test] #[should_panic(expected = "invariant: all outputs are either change or recipient")] fn invariant_all_output_are_recognized() { - let utxos = vec![(outpoint(1), tx_out(10_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(10_000, address(0)))]; let mut builder = TransactionBuilder::new( satpoint(1, 3_333), @@ -1260,7 +1260,7 @@ mod tests { #[test] #[should_panic(expected = "invariant: all outputs are above dust limit")] fn invariant_all_output_are_above_dust_limit() { - let utxos = vec![(outpoint(1), tx_out(10_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(10_000, address(0)))]; TransactionBuilder::new( satpoint(1, 1), @@ -1288,7 +1288,7 @@ mod tests { #[test] #[should_panic(expected = "invariant: sat is at first position in recipient output")] fn invariant_sat_is_aligned() { - let utxos = vec![(outpoint(1), tx_out(10_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(10_000, address(0)))]; TransactionBuilder::new( satpoint(1, 3_333), @@ -1313,7 +1313,7 @@ mod tests { #[test] #[should_panic(expected = "invariant: fee estimation is correct")] fn invariant_fee_is_at_least_target_fee_rate() { - let utxos = vec![(outpoint(1), tx_out(10_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(10_000, address(0)))]; TransactionBuilder::new( satpoint(1, 0), @@ -1338,9 +1338,9 @@ mod tests { #[should_panic(expected = "invariant: recipient address appears exactly once in outputs")] fn invariant_recipient_appears_exactly_once() { let mut amounts = BTreeMap::new(); - amounts.insert(outpoint(1), tx_out(5_000, address())); - amounts.insert(outpoint(2), tx_out(5_000, address())); - amounts.insert(outpoint(3), tx_out(2_000, address())); + amounts.insert(outpoint(1), tx_out(5_000, address(0))); + amounts.insert(outpoint(2), tx_out(5_000, address(0))); + amounts.insert(outpoint(3), tx_out(2_000, address(0))); TransactionBuilder { amounts, @@ -1379,9 +1379,9 @@ mod tests { #[should_panic(expected = "invariant: change addresses appear at most once in outputs")] fn invariant_change_appears_at_most_once() { let mut amounts = BTreeMap::new(); - amounts.insert(outpoint(1), tx_out(5_000, address())); - amounts.insert(outpoint(2), tx_out(5_000, address())); - amounts.insert(outpoint(3), tx_out(2_000, address())); + amounts.insert(outpoint(1), tx_out(5_000, address(0))); + amounts.insert(outpoint(2), tx_out(5_000, address(0))); + amounts.insert(outpoint(3), tx_out(2_000, address(0))); TransactionBuilder { amounts, @@ -1419,8 +1419,8 @@ mod tests { #[test] fn do_not_select_already_inscribed_sats_for_cardinal_utxos() { let utxos = vec![ - (outpoint(1), tx_out(100, address())), - (outpoint(2), tx_out(49 * COIN_VALUE, address())), + (outpoint(1), tx_out(100, address(0))), + (outpoint(2), tx_out(49 * COIN_VALUE, address(0))), ]; pretty_assert_eq!( @@ -1444,8 +1444,8 @@ mod tests { #[test] fn do_not_select_runic_utxos_for_cardinal_utxos() { let utxos = vec![ - (outpoint(1), tx_out(100, address())), - (outpoint(2), tx_out(49 * COIN_VALUE, address())), + (outpoint(1), tx_out(100, address(0))), + (outpoint(2), tx_out(49 * COIN_VALUE, address(0))), ]; pretty_assert_eq!( @@ -1468,7 +1468,7 @@ mod tests { #[test] fn do_not_send_two_inscriptions_at_once() { - let utxos = vec![(outpoint(1), tx_out(1_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(1_000, address(0)))]; pretty_assert_eq!( TransactionBuilder::new( @@ -1494,7 +1494,7 @@ mod tests { #[test] fn build_transaction_with_custom_fee_rate() { - let utxos = vec![(outpoint(1), tx_out(10_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(10_000, address(0)))]; let fee_rate = FeeRate::try_from(17.3).unwrap(); @@ -1529,7 +1529,7 @@ mod tests { #[test] fn exact_transaction_has_correct_value() { - let utxos = vec![(outpoint(1), tx_out(5_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(5_000, address(0)))]; pretty_assert_eq!( TransactionBuilder::new( @@ -1557,8 +1557,8 @@ mod tests { #[test] fn exact_transaction_adds_output_to_cover_value() { let utxos = vec![ - (outpoint(1), tx_out(1_000, address())), - (outpoint(2), tx_out(1_000, address())), + (outpoint(1), tx_out(1_000, address(0))), + (outpoint(2), tx_out(1_000, address(0))), ]; pretty_assert_eq!( @@ -1586,7 +1586,7 @@ mod tests { #[test] fn refuse_to_send_dust() { - let utxos = vec![(outpoint(1), tx_out(1_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(1_000, address(0)))]; pretty_assert_eq!( TransactionBuilder::new( @@ -1612,8 +1612,8 @@ mod tests { #[test] fn do_not_select_outputs_which_do_not_pay_for_their_own_fee_at_default_fee_rate() { let utxos = vec![ - (outpoint(1), tx_out(1_000, address())), - (outpoint(2), tx_out(100, address())), + (outpoint(1), tx_out(1_000, address(0))), + (outpoint(2), tx_out(100, address(0))), ]; pretty_assert_eq!( @@ -1637,8 +1637,8 @@ mod tests { #[test] fn do_not_select_outputs_which_do_not_pay_for_their_own_fee_at_higher_fee_rate() { let utxos = vec![ - (outpoint(1), tx_out(1_000, address())), - (outpoint(2), tx_out(500, address())), + (outpoint(1), tx_out(1_000, address(0))), + (outpoint(2), tx_out(500, address(0))), ]; pretty_assert_eq!( @@ -1689,7 +1689,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(1_000, address()))] + vec![(outpoint(1), tx_out(1_000, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1716,7 +1716,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(20_099, address()))] + vec![(outpoint(1), tx_out(20_099, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1743,7 +1743,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(1_500, address()))] + vec![(outpoint(1), tx_out(1_500, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1770,7 +1770,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(1_500, address()))] + vec![(outpoint(1), tx_out(1_500, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1792,7 +1792,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(1000, address()))] + vec![(outpoint(1), tx_out(1000, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1814,7 +1814,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(1000, address()))] + vec![(outpoint(1), tx_out(1000, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1836,7 +1836,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(2000, address()))] + vec![(outpoint(1), tx_out(2000, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1863,7 +1863,7 @@ mod tests { TransactionBuilder::new( satpoint(1, 0), BTreeMap::new(), - vec![(outpoint(1), tx_out(45000, address()))] + vec![(outpoint(1), tx_out(45000, address(0)))] .into_iter() .collect(), BTreeSet::new(), @@ -1887,12 +1887,12 @@ mod tests { #[test] fn select_outgoing_can_select_multiple_utxos() { let mut utxos = vec![ - (outpoint(2), tx_out(3_006, address())), // 2. biggest utxo is selected 2nd leaving us needing 4206 more - (outpoint(1), tx_out(3_003, address())), // 1. satpoint is selected 1st leaving us needing 7154 more - (outpoint(5), tx_out(3_004, address())), - (outpoint(4), tx_out(3_001, address())), // 4. smallest utxo >= 1259 is selected 4th, filling deficit - (outpoint(3), tx_out(3_005, address())), // 3. next biggest utxo is selected 3rd leaving us needing 1259 more - (outpoint(6), tx_out(3_002, address())), + (outpoint(2), tx_out(3_006, address(0))), // 2. biggest utxo is selected 2nd leaving us needing 4206 more + (outpoint(1), tx_out(3_003, address(0))), // 1. satpoint is selected 1st leaving us needing 7154 more + (outpoint(5), tx_out(3_004, address(0))), + (outpoint(4), tx_out(3_001, address(0))), // 4. smallest utxo >= 1259 is selected 4th, filling deficit + (outpoint(3), tx_out(3_005, address(0))), // 3. next biggest utxo is selected 3rd leaving us needing 1259 more + (outpoint(6), tx_out(3_002, address(0))), ]; let tx_builder = TransactionBuilder::new( @@ -1936,13 +1936,13 @@ mod tests { #[test] fn pad_alignment_output_can_select_multiple_utxos() { let mut utxos = vec![ - (outpoint(4), tx_out(101, address())), // 4. smallest utxo >= 84 is selected 4th, filling deficit - (outpoint(1), tx_out(20_000, address())), // 1. satpoint is selected 1st leaving deficit 293 - (outpoint(2), tx_out(105, address())), // 2. biggest utxo <= 293 is selected 2nd leaving deficit 188 - (outpoint(5), tx_out(103, address())), - (outpoint(6), tx_out(10_000, address())), - (outpoint(3), tx_out(104, address())), // 3. biggest utxo <= 188 is selected 3rd leaving deficit 84 - (outpoint(7), tx_out(102, address())), + (outpoint(4), tx_out(101, address(0))), // 4. smallest utxo >= 84 is selected 4th, filling deficit + (outpoint(1), tx_out(20_000, address(0))), // 1. satpoint is selected 1st leaving deficit 293 + (outpoint(2), tx_out(105, address(0))), // 2. biggest utxo <= 293 is selected 2nd leaving deficit 188 + (outpoint(5), tx_out(103, address(0))), + (outpoint(6), tx_out(10_000, address(0))), + (outpoint(3), tx_out(104, address(0))), // 3. biggest utxo <= 188 is selected 3rd leaving deficit 84 + (outpoint(7), tx_out(102, address(0))), ]; let tx_builder = TransactionBuilder::new( @@ -1996,13 +1996,13 @@ mod tests { expected_value: Amount, ) { let utxos = vec![ - (outpoint(4), tx_out(101, address())), - (outpoint(1), tx_out(20_000, address())), - (outpoint(2), tx_out(105, address())), - (outpoint(5), tx_out(103, address())), - (outpoint(6), tx_out(10_000, address())), - (outpoint(3), tx_out(104, address())), - (outpoint(7), tx_out(102, address())), + (outpoint(4), tx_out(101, address(0))), + (outpoint(1), tx_out(20_000, address(0))), + (outpoint(2), tx_out(105, address(0))), + (outpoint(5), tx_out(103, address(0))), + (outpoint(6), tx_out(10_000, address(0))), + (outpoint(3), tx_out(104, address(0))), + (outpoint(7), tx_out(102, address(0))), ]; let mut tx_builder = TransactionBuilder::new( @@ -2058,7 +2058,7 @@ mod tests { #[test] fn build_transaction_with_custom_postage() { - let utxos = vec![(outpoint(1), tx_out(1_000_000, address()))]; + let utxos = vec![(outpoint(1), tx_out(1_000_000, address(0)))]; let fee_rate = FeeRate::try_from(17.3).unwrap(); @@ -2096,7 +2096,7 @@ mod tests { #[test] fn select_cardinal_utxo_ignores_locked_utxos_and_errors_if_none_available() { - let utxos = vec![(outpoint(1), tx_out(500, address()))]; + let utxos = vec![(outpoint(1), tx_out(500, address(0)))]; let locked_utxos = vec![outpoint(1)]; let mut tx_builder = TransactionBuilder::new( @@ -2121,8 +2121,8 @@ mod tests { #[test] fn select_cardinal_utxo_ignores_locked_utxos() { let utxos = vec![ - (outpoint(1), tx_out(500, address())), - (outpoint(2), tx_out(500, address())), + (outpoint(1), tx_out(500, address(0))), + (outpoint(2), tx_out(500, address(0))), ]; let locked_utxos = vec![outpoint(1)]; @@ -2148,8 +2148,8 @@ mod tests { #[test] fn prefer_further_away_utxos_if_they_are_newly_under_target() { let utxos = vec![ - (outpoint(1), tx_out(510, address())), - (outpoint(2), tx_out(400, address())), + (outpoint(1), tx_out(510, address(0))), + (outpoint(2), tx_out(400, address(0))), ]; let mut tx_builder = TransactionBuilder::new( @@ -2174,8 +2174,8 @@ mod tests { #[test] fn prefer_further_away_utxos_if_they_are_newly_over_target() { let utxos = vec![ - (outpoint(1), tx_out(490, address())), - (outpoint(2), tx_out(600, address())), + (outpoint(1), tx_out(490, address(0))), + (outpoint(2), tx_out(600, address(0))), ]; let mut tx_builder = TransactionBuilder::new( diff --git a/src/wallet/wallet_constructor.rs b/src/wallet/wallet_constructor.rs index d9d60fce5a..b5e43c84fe 100644 --- a/src/wallet/wallet_constructor.rs +++ b/src/wallet/wallet_constructor.rs @@ -52,7 +52,30 @@ impl WalletConstructor { Wallet::check_version(self.settings.bitcoin_rpc_client(Some(self.name.clone()))?)?; if !client.list_wallets()?.contains(&self.name) { - client.load_wallet(&self.name)?; + loop { + match client.load_wallet(&self.name) { + Ok(_) => { + break; + } + Err(bitcoincore_rpc::Error::JsonRpc(bitcoincore_rpc::jsonrpc::Error::Rpc(err))) + if err.code == -4 && err.message == "Wallet already loading." => + { + // wallet loading + eprint!("."); + thread::sleep(Duration::from_secs(3)); + continue; + } + Err(bitcoincore_rpc::Error::JsonRpc(bitcoincore_rpc::jsonrpc::Error::Rpc(err))) + if err.code == -35 => + { + // wallet already loaded + break; + } + Err(err) => { + bail!("Failed to load wallet {}: {err}", self.name); + } + } + } } if client.get_wallet_info()?.private_keys_enabled { @@ -67,21 +90,21 @@ impl WalletConstructor { client }; - let chain_block_count = bitcoin_client.get_block_count().unwrap() + 1; + let bitcoin_block_count = bitcoin_client.get_block_count().unwrap() + 1; if !self.no_sync { for i in 0.. { - let response = self.get("/blockcount")?; - - if response - .text()? - .parse::() - .expect("wallet failed to talk to server. Make sure `ord server` is running.") - >= chain_block_count - { + let ord_block_count = self.get("/blockcount")?.text()?.parse::().expect( + "wallet failed to retreive block count from server. Make sure `ord server` is running.", + ); + + if ord_block_count >= bitcoin_block_count { break; } else if i == 20 { - bail!("wallet failed to synchronize with `ord server` after {i} attempts"); + bail!( + "`ord server` {} blocks behind `bitcoind`, consider using `--no-sync` to ignore this error", + bitcoin_block_count - ord_block_count + ); } std::thread::sleep(Duration::from_millis(50)); } diff --git a/static/index.css b/static/index.css index 1631fe3a40..c494de8261 100644 --- a/static/index.css +++ b/static/index.css @@ -115,8 +115,6 @@ ol, ul { } .block-list { - font-family: monospace, monospace; - list-style-position: inside; white-space: nowrap; } @@ -141,6 +139,14 @@ ol, ul { text-align: center; } +.collapse { + font-family: monospace, monospace; +} + +.collapse:not(a) { + user-select: all; +} + .monospace { font-family: monospace, monospace; } diff --git a/static/index.js b/static/index.js index e3153179b7..ee62318344 100644 --- a/static/index.js +++ b/static/index.js @@ -1,34 +1,77 @@ -for (let time of document.body.getElementsByTagName('time')) { - time.setAttribute('title', new Date(time.textContent)); -} +addEventListener("DOMContentLoaded", () => { + for (let time of document.body.getElementsByTagName('time')) { + time.setAttribute('title', new Date(time.textContent)); + } -let next = document.querySelector('a.next'); -let prev = document.querySelector('a.prev'); + let next = document.querySelector('a.next'); + let prev = document.querySelector('a.prev'); -window.addEventListener('keydown', e => { - if (document.activeElement.tagName == 'INPUT') { - return; - } + window.addEventListener('keydown', e => { + if (document.activeElement.tagName == 'INPUT') { + return; + } + + switch (e.key) { + case 'ArrowRight': + if (next) { + window.location = next.href; + } + return; + case 'ArrowLeft': + if (prev) { + window.location = prev.href; + } + return; + } + }); + + const search = document.querySelector('form[action="/search"]'); + const query = search.querySelector('input[name="query"]'); + + search.addEventListener('submit', (e) => { + if (!query.value) { + e.preventDefault(); + } + }); + + let collapse = document.getElementsByClassName('collapse'); + + let context = document.createElement('canvas').getContext('2d'); - switch (e.key) { - case 'ArrowRight': - if (next) { - window.location = next.href; + function resize() { + for (let node of collapse) { + if (!('original' in node.dataset)) { + node.dataset.original = node.textContent.trim(); } - return; - case 'ArrowLeft': - if (prev) { - window.location = prev.href; + let original = node.dataset.original; + let length = original.length; + let width = node.clientWidth; + if (width == 0) { + width = node.parentNode.getBoundingClientRect().width; } - return; + context.font = window.getComputedStyle(node).font; + let capacity = width / (context.measureText(original).width / length); + if (capacity >= length) { + node.textContent = original + } else { + let count = Math.floor((capacity - 1) / 2); + let start = original.substring(0, count); + let end = original.substring(length - count); + node.textContent = `${start}…${end}`; + } + } } -}); -const search = document.querySelector('form[action="/search"]'); -const query = search.querySelector('input[name="query"]'); - -search.addEventListener('submit', (e) => { - if (!query.value) { - e.preventDefault(); + function copy(e) { + if ('original' in e.target.dataset && window.getSelection().toString().includes('…')) { + e.clipboardData.setData('text/plain', e.target.dataset.original); + e.preventDefault(); + } } + + addEventListener('resize', resize); + + addEventListener('copy', copy); + + resize(); }); diff --git a/static/preview-video.js b/static/preview-video.js new file mode 100644 index 0000000000..e4a41bc2bd --- /dev/null +++ b/static/preview-video.js @@ -0,0 +1,3 @@ +document.getElementsByTagName('video')[0].addEventListener('click', (event) => { + event.target.controls = true; +}); diff --git a/templates/address.html b/templates/address.html index a0697f3502..6b7146ae65 100644 --- a/templates/address.html +++ b/templates/address.html @@ -22,7 +22,7 @@

    Address {{ self.address }}

    diff --git a/templates/block.html b/templates/block.html index 763eac103e..1f3cdc6096 100644 --- a/templates/block.html +++ b/templates/block.html @@ -1,12 +1,12 @@

    Block {{ self.height }}

    -
    hash
    {{self.hash}}
    -
    target
    {{self.target}}
    +
    hash
    {{self.hash}}
    +
    target
    {{self.target}}
    timestamp
    size
    {{self.block.total_size()}}
    weight
    {{self.block.weight()}}
    %% if self.height.0 > 0 { -
    previous blockhash
    {{self.block.header.prev_blockhash}}
    +
    previous blockhash
    {{self.block.header.prev_blockhash}}
    %% }
    @@ -41,9 +41,9 @@

    {{"Inscription".tally(self.inscription_count)}}

    %% }

    {{"Transaction".tally(self.block.txdata.len())}}

    -
      +
        %% for tx in &self.block.txdata { %% let txid = tx.txid(); -
      • {{txid}}
      • +
      • {{txid}}
      • %% }
      diff --git a/templates/blocks.html b/templates/blocks.html index b2cd37bb4b..c7c81174db 100644 --- a/templates/blocks.html +++ b/templates/blocks.html @@ -13,7 +13,7 @@

      Block {{ self.last - i as u32 }} %% } -
    • {{ hash }}
    • +
    • {{ hash }}
    • %% } %% } diff --git a/templates/input.html b/templates/input.html index 8575091f16..fb965eaed0 100644 --- a/templates/input.html +++ b/templates/input.html @@ -1,7 +1,7 @@

      Input /{{self.path.0}}/{{self.path.1}}/{{self.path.2}}

      %% if !self.input.previous_output.is_null() { -
      previous output
      {{self.input.previous_output}}
      +
      previous output
      {{self.input.previous_output}}
      %% } %% if self.input.sequence != Sequence::MAX {
      sequence
      {{self.input.sequence}}
      diff --git a/templates/inscription.html b/templates/inscription.html index 183481f996..d201f9aa36 100644 --- a/templates/inscription.html +++ b/templates/inscription.html @@ -44,7 +44,7 @@

      Inscription {{ self.number }}

      {{ rune }}
      %% }
      id
      -
      {{ self.id }}
      +
      {{ self.id }}
      %% if self.charms != 0 {
      charms
      @@ -61,11 +61,17 @@

      Inscription {{ self.number }}

      {{ Trusted(MetadataHtml(&metadata)) }}
      %% } +%% if let Some(burn_metadata) = self.burn_metadata() { +
      burn metadata
      +
      + {{ Trusted(MetadataHtml(&burn_metadata)) }} +
      +%% } %% if let Some(output) = &self.output { -%% if let Ok(address) = self.chain.address_from_script(&output.script_pubkey ) { +%% if let Ok(address) = self.chain.address_from_script(&output.script_pubkey ) {
      address
      -
      {{ address }}
      -%% } +
      {{ address }}
      +%% }
      value
      {{ output.value.to_sat() }}
      %% } @@ -108,13 +114,21 @@

      Inscription {{ self.number }}

      fee
      {{ self.fee }}
      reveal transaction
      -
      {{ self.id.txid }}
      +
      {{ self.id.txid }}
      location
      -
      {{ self.satpoint }}
      +
      {{ self.satpoint }}
      output
      -
      {{ self.satpoint.outpoint }}
      +
      {{ self.satpoint.outpoint }}
      offset
      {{ self.satpoint.offset }}
      -
      ethereum teleburn address
      -
      {{ teleburn::Ethereum::from(self.id) }}
      +
      details
      +
      +
      + ... +
      +
      ethereum teleburn address
      +
      {{ teleburn::Ethereum::from(self.id) }}
      +
      +
      +
      diff --git a/templates/output.html b/templates/output.html index 74ce3f6102..2cd281a162 100644 --- a/templates/output.html +++ b/templates/output.html @@ -28,9 +28,9 @@

      Output {{self.outpoint}}

      value
      {{ self.output.value.to_sat() }}
      script pubkey
      {{ self.output.script_pubkey.to_asm_string() }}
      %% if let Ok(address) = self.chain.address_from_script(&self.output.script_pubkey ) { -
      address
      {{ address }}
      +
      address
      {{ address }}
      %% } -
      transaction
      {{ self.outpoint.txid }}
      +
      transaction
      {{ self.outpoint.txid }}
      spent
      {{ self.spent }}
    %% if let Some(sat_ranges) = &self.sat_ranges { @@ -38,10 +38,11 @@

    {{"Sat Range".tally(sat_ranges.len())}}

      %% for (start, end) in sat_ranges { %% let value = end - start; +%% let last = end - 1; %% if value == 1 {
    • {{start}}
    • %% } else { -
    • {{start}}-{{end}} ({{value}} sats)
    • +
    • {{start}}-{{last}} ({{value}} sats)
    • %% } %% }
    diff --git a/templates/page.html b/templates/page.html index 0456d99498..243a29593a 100644 --- a/templates/page.html +++ b/templates/page.html @@ -13,7 +13,7 @@ - +
    diff --git a/templates/preview-image.html b/templates/preview-image.html index 260af3eeb9..c4fbab41b6 100644 --- a/templates/preview-image.html +++ b/templates/preview-image.html @@ -20,6 +20,7 @@ } img { + float: left; height: 100%; opacity: 0; width: 100%; diff --git a/templates/preview-video.html b/templates/preview-video.html index 3ca99c47b6..820d8409d5 100644 --- a/templates/preview-video.html +++ b/templates/preview-video.html @@ -3,9 +3,10 @@ + -