From 1dc3c60cfcc05fb8f76db711b29653b279d50288 Mon Sep 17 00:00:00 2001 From: raphjaph Date: Mon, 23 Dec 2024 19:59:28 +0100 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit c0a343f2c0b9411aefcd83452a92dec3165303f5 Author: raphjaph Date: Mon Dec 23 19:53:44 2024 +0100 Amend commit 2b918432fd760e13344b6ebffbe22540aed834ea Author: raphjaph Date: Mon Dec 23 19:51:29 2024 +0100 Amend commit 86a3486df44c24b57381642f468230c16fa5c651 Author: raphjaph Date: Mon Dec 23 19:30:51 2024 +0100 Make it /r/utxo/ commit 34eede2d0c17ee8b2ae0782c8cd79bff4cf95a38 Author: raphjaph Date: Mon Dec 23 18:40:05 2024 +0100 Amend commit 72b833b4ccf890836682c7af3f5c4e24492cdd9c Author: raphjaph Date: Mon Dec 23 17:30:20 2024 +0100 Amend commit 7454269418c561ca765215127491234ebef8391d Author: raphjaph Date: Mon Dec 23 14:55:19 2024 +0100 Amend commit dbd9c236dd81fa68904394bbcc7871f6e9f926d7 Author: raphjaph Date: Mon Dec 23 14:47:30 2024 +0100 Add tests commit 74b05005caf7e5918e31fc18188824f372f46b5c Author: raphjaph Date: Fri Dec 20 18:21:42 2024 -0500 Not done yet commit 77f536e86bd733d1c429c1e9638edc888d076d49 Merge: c81655d6 a0da0c12 Author: raphjaph Date: Fri Dec 20 15:03:10 2024 -0500 Merge branch 'master' of github.com:ordinals/ord into output_recursive commit a0da0c122b0d45d631f0adec1de5d4fb09ebaac6 Author: raph Date: Fri Dec 20 20:59:06 2024 +0100 Return `None` for assets when asset index does not exist (#4141) commit c81655d681361059c332d7eee8d126e920a75795 Merge: b2d8b20f d6dc51fc Author: raphjaph Date: Fri Dec 20 14:32:14 2024 -0500 Merge branch 'tweak-outputs-return' into output_recursive commit d6dc51fc6118bbfd9e9e79cd7dfaefc813592559 Author: raphjaph Date: Fri Dec 20 13:52:32 2024 -0500 Amend commit 0e6d04fe38144d2f9cfcd78a2fc2eb23ec768a13 Author: raphjaph Date: Fri Dec 20 13:28:29 2024 -0500 Amend commit 7494843021b84f6f60b45d7d1145764ee545973b Author: raphjaph Date: Fri Dec 20 13:27:30 2024 -0500 Amend commit 249d9089b4d9d13ca768b0f2e0196e0d18f47653 Author: raphjaph Date: Thu Dec 19 20:12:28 2024 -0500 Amend commit 6ce7ba3cd066c2fcafe7e376be567c3251655609 Author: raphjaph Date: Thu Dec 19 20:08:57 2024 -0500 Amend commit 9482ec1e19d71ba806aa79fbb785204aff8ca81a Author: raphjaph Date: Thu Dec 19 20:05:22 2024 -0500 Amend commit 3d8554baec23e0a593835e0889358fa3218a2781 Author: raphjaph Date: Thu Dec 19 19:58:29 2024 -0500 Fix other spots commit eb491b263079a3362dae461bf1902ed95472c5e7 Author: raphjaph Date: Thu Dec 19 19:38:13 2024 -0500 Amend commit e34554064213414d76f2801d9b623802106412d0 Merge: fcdfe42f 83d87d4c Author: raphjaph Date: Thu Dec 19 19:33:59 2024 -0500 Merge branch 'master' of github.com:ordinals/ord into tweak-outputs-return commit 83d87d4c2756f79706532f59f3ff24c72b698e82 Author: gmart7t2 <49558347+gmart7t2@users.noreply.github.com> Date: Thu Dec 19 20:33:11 2024 -0400 Create savepoints more robustly (#2365) commit fcdfe42fbb54e46ccf6aa36272f630acfa14b762 Author: raphjaph Date: Thu Dec 19 19:15:33 2024 -0500 Amend commit 5beb44968959eb4f134ba116769b6a6d1cefc2b4 Author: raphjaph Date: Thu Dec 19 18:59:39 2024 -0500 Amend commit af8a59834432e6330505a1888d3c58eb307b3b49 Author: raphjaph Date: Thu Dec 19 18:48:42 2024 -0500 Return None if index does not have index commit e0e8d40627e476d10b4db4848c7ed117932f6d29 Author: Casey Rodarmor Date: Thu Dec 19 14:49:14 2024 -0800 Show inscription preview video controls on click (#4139) commit b2d8b20f74405109f44749ed00a7ab8a05b64915 Author: raphjaph Date: Thu Dec 19 16:06:42 2024 -0500 Just some notes commit f19b72799fe3f3da6fe9db1319b8ddf9749c1083 Merge: 16d72e5f f3cd6643 Author: raphjaph Date: Thu Dec 19 14:45:33 2024 -0500 Merge branch 'output_recursive' of github.com:1stBitcoinSent/ord into output_recursive commit 16d72e5fdd221eb36f57534a7e3fb312cbf5e678 Merge: fae4e8f8 a0a7a783 Author: raphjaph Date: Thu Dec 19 14:45:27 2024 -0500 Merge branch 'master' of github.com:ordinals/ord into output_recursive commit f3cd6643b68ef070aec63a64deedc5742743b882 Merge: fae4e8f8 a0a7a783 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Fri Dec 20 06:59:30 2024 +1300 Merge branch 'master' into output_recursive commit a0a7a78315474f7f9c0eff4c55de6a9be627fe42 Author: raph Date: Thu Dec 19 18:49:19 2024 +0100 Fix deploy for testnet3 (#4137) commit fae4e8f8176a2a738865844165513bb1a7ac1603 Merge: f8f1ceeb afe27e3a Author: raph Date: Thu Dec 19 16:46:10 2024 +0100 Merge branch 'master' into output_recursive commit afe27e3a71182a9b7596394d07dfb5576a028ed8 Author: raph Date: Thu Dec 19 01:54:14 2024 +0100 Add testnet4 (#4135) commit f8f1ceebe03df05ea718dc27650c6e959c392235 Merge: bb171e7d ee0281b4 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Sat Dec 14 15:27:18 2024 +1300 Merge branch 'ordinals:master' into output_recursive commit bb171e7d96084132bb95d92b947ab1578500c5ac Author: 1stBitcoinSent <1stbitcoinsent@gmail.com> Date: Sat Dec 14 15:22:03 2024 +1300 #[test] output_recursive_endpoint() commit ee0281b4ac14feae9fab1453ec68c1bf9fb90723 Author: raph Date: Fri Dec 13 00:56:56 2024 +0100 Do not update index for info command (#4128) commit 909a4c5ccb5766aea583aa9d8e05a063faf09340 Author: raph Date: Thu Dec 12 22:34:30 2024 +0100 Enable rune burning in wallet (#4117) commit 894c41d5deef5cd5b98fc138c30588876cd2a42f Author: raph Date: Thu Dec 12 01:07:21 2024 +0100 Wait for wallet to load (#4095) commit 080fcefe29673392cfc18bd3603fb4e35e0aea0e Author: raph Date: Thu Dec 12 00:57:23 2024 +0100 Improve wallet sync error messages (#4126) commit fcfc93c18b695cd91795a1f663a16d6ad06058cd Author: raph Date: Thu Dec 12 00:44:45 2024 +0100 Link inscription burning documentation (#4131) commit 439e47097a865b25a528d4201f41a8c97bf6fc1a Author: partialord <178683722+partialord@users.noreply.github.com> Date: Wed Dec 11 12:36:23 2024 -0800 Enable redb quick-repair mode (#4084) commit 4fa2d735d31d60e0b9841d14f1ebd5b9b1947067 Merge: 4e2aaff9 b9a4e065 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Wed Dec 11 18:36:51 2024 +1300 Merge branch 'master' into output_recursive commit b9a4e065403b8d95f3e8c87cdb46d19faf2e6f71 Author: Casey Rodarmor Date: Tue Dec 10 14:21:44 2024 -0800 Bump ordinals crate and index schema versions (#4127) commit 3177f9b82f02f8bf25b3bd741b58e927c2be4c05 Author: Casey Rodarmor Date: Tue Dec 10 13:56:24 2024 -0800 Release 0.22.0 (#4125) - Bump version: 0.21.3 → 0.22.0 - Update changelog - Update changelog contributor credits - Update dependencies commit 4e2aaff991cf29ed5b63f498881646ee280e16b6 Merge: f10b69e5 331501db Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Wed Dec 11 07:20:44 2024 +1300 Merge branch 'master' into output_recursive commit 331501dbed22be708a2fbb6af276f48ba561e82a Author: Casey Rodarmor Date: Tue Dec 3 14:30:08 2024 -0500 Style help text (#4118) commit f10b69e52383e376000dbee19be4626d26c051dc Merge: 36941578 57493632 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Tue Dec 3 19:54:45 2024 +1300 Merge branch 'master' into output_recursive commit 57493632495c2da104340a7ba277b17e9957f646 Author: onchainguy <1436535+onchainguy-btc@users.noreply.github.com> Date: Sat Nov 30 00:26:17 2024 +0100 Only burn one sat (#4063) commit ee2c25b0f7cb01007822996a0fc4bf4e49715441 Author: raph Date: Fri Nov 29 22:39:26 2024 +0100 Placate clippy (#4116) commit 36941578252cdde8a921d230b43a1a2fb1df56aa Merge: 974fced7 f150529e Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Wed Nov 27 19:56:12 2024 +1300 Merge branch 'master' into output_recursive commit f150529e26e78c2beddcd40f39ad2383bc1f3b09 Author: Casey Rodarmor Date: Tue Nov 26 14:31:52 2024 -0800 Set `maxburnamount` when burning and require at least Bitcoin Core 25 (#4106) commit 974fced776b3b4004ee04ea3fba951db46cc08b7 Merge: f5e988e9 a009a4e4 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Wed Nov 27 10:12:00 2024 +1300 Merge branch 'master' into output_recursive commit a009a4e4dff2f6cfbb371b0c96a1ac275f82f60d Author: raph Date: Tue Nov 26 22:09:48 2024 +0100 Sign for inscription and output (#4027) commit 487b8a976c7355da5ddaef27c2204f13e5945d74 Author: Casey Rodarmor Date: Tue Nov 26 12:52:22 2024 -0800 Test `Charm` `FromStr` implementation for exhaustiveness (#4107) commit 482ac97f3ba21a34cbd27c2b3bd864d9e62e680b Author: Mark van den Broek Date: Tue Nov 26 21:27:06 2024 +0100 Add `palindrome` to `Charm::from_str` (#4104) commit 12de46f046743b10d5df40889ce26857f33d8790 Author: Casey Rodarmor Date: Tue Nov 26 12:15:15 2024 -0800 Improve `ord wallet send` help message and rename output `outgoing` to `asset` (#4105) commit f5e988e95f92572a77d0973c5d6b507d1b0ffc17 Merge: 83468a7c 5ac126d0 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Tue Nov 26 20:51:33 2024 +1300 Merge branch 'master' into output_recursive commit 5ac126d02f784063b6cb0284504e23e8ce826d58 Author: raph Date: Tue Nov 26 00:00:05 2024 +0100 Hide teleburn address (#4093) * Do not display teleburn address * Amend * Amend * Amend * Amend commit 83468a7cca08425114bee68f2eab2ba436dd538a Merge: 76d08f0d 446d4852 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Sat Nov 23 14:01:49 2024 +1300 Merge branch 'master' into output_recursive commit 446d48521fdb968dddb3d95f8beb63028015f7b2 Author: Casey Rodarmor Date: Fri Nov 22 15:46:09 2024 -0800 DocumentiInscription URIs (#4098) commit 53753e3413e2ae8a129084e3e31338f763d4baa6 Author: raph Date: Sat Nov 23 00:23:33 2024 +0100 Show rune unlock height (#3580) commit 2115bf26ba60f467b81b563cb8d0b5177fe08e75 Author: Casey Rodarmor Date: Fri Nov 22 14:01:58 2024 -0800 Add function to calculate rune unlock height (#4097) commit 76d08f0db39794bedf77618710a3633545b3a879 Merge: 72e369ef 79f7c8e5 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Fri Nov 22 20:37:33 2024 +1300 Merge branch 'master' into output_recursive commit 79f7c8e50df73a66a7fec9709629d608f3cd25fc Author: Casey Rodarmor Date: Thu Nov 21 11:23:29 2024 -0800 Handle errors when retrieving sat address (#4094) commit 4695b2b05d3982ae3c5a1d4d1d989e784a16530d Author: Kartik, Chen Date: Thu Nov 21 16:51:56 2024 +0800 Add field metaprotocol to api::Inscription (#4047) commit 6a9b3bd2fb718f7365b145f0597c0b1f5281ad13 Author: lifofifo <134870335+lifofifoX@users.noreply.github.com> Date: Thu Nov 21 02:42:20 2024 -0600 Show sat owner address when present (#4016) commit ffe27e251f7bb448950917186f5705f9f0e75f81 Author: Serg Pokrovskyy Date: Thu Nov 21 03:01:31 2024 -0400 Fixed error message when using sat or satpoint with batch inscribe (#4054) commit 40ffa5a32b88c18b1a4555eca399f9fb157ce73f Author: Casey Rodarmor Date: Wed Nov 20 22:53:52 2024 -0800 Add replicate and swap recipes (#4083) commit 8f9c2eeedc0b542aec62b2b50d78d2699665f321 Author: Arron Date: Thu Nov 21 14:42:14 2024 +0800 Make build script public (#4085) commit b0e7b2085dbf7c1d6d7cbe3591d69b3e5497ebd0 Author: raph Date: Wed Nov 20 23:19:00 2024 +0100 Update `index.hbs` (#4090) commit 72e369ef0fb0217fcaa5bdd436487badc5d5e22c Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Tue Nov 19 20:30:12 2024 +1300 Update recursion.md commit 4a59f7dd73667d9cdb68a4bf9aef6e95958566f8 Merge: 91fc582a 5e585085 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Mon Nov 18 05:57:25 2024 +1300 Merge branch 'master' into output_recursive commit 5e58508511f46aa6398459f90cd407c32e689811 Author: Thomas Marchand Date: Fri Nov 15 02:56:53 2024 +0000 Update Rust version in Dockerfile (#4078) commit d44e0ff0917f27263684373e21c062f1bfa3b6e0 Author: raph Date: Fri Nov 15 03:39:44 2024 +0100 Update minimum rust version to 1.79.0 (#4074) commit 20c773c599540dedb5463f2bea58884acac1adb5 Author: Casey Rodarmor Date: Wed Nov 13 17:31:16 2024 -0800 Fix sat off-by-one error in output template (#4075) commit e2b0732cb78b44d9c4edc92f82237ab1affdff04 Author: raph Date: Tue Nov 12 23:34:28 2024 +0100 Update docs Github Action (#4069) commit ab2f72fe13e27f1a1869124acef1f61854734021 Author: Casey Rodarmor Date: Mon Nov 11 20:09:21 2024 -0800 Pin `bitcoin` to 0.32.3 in `ordinals` crate (#4066) commit d0d3bad1fa81d7fe016bf6555bc5c977126d9bfd Author: Casey Rodarmor Date: Mon Nov 11 19:53:31 2024 -0800 Release 0.21.3 (#4059) - Bump version: 0.21.2 → 0.21.3 - Update changelog - Update changelog contributor credits - Update dependencies - Pin `bitcoin` to 0.32.3 - Downgrade `bip322` to 0.0.8 commit a8c94800f9842ca5f9ea05a5c7d6fdc1b2e0bf03 Author: raph Date: Tue Nov 12 04:35:09 2024 +0100 Allow restoring wallet with custom timestamp (#4065) commit 8ab2aa0230b360f8008fccdce971ec70d5cacafc Author: Casey Rodarmor Date: Sun Nov 10 16:17:01 2024 -0800 Add palindrome charm (#4064) commit 9b88cd95a7bf6538553ecf390a0925dba827790b Author: Casey Rodarmor Date: Sun Nov 10 15:54:10 2024 -0800 Document split command (#4062) commit e473e786cc92b0bceeb4d5c22394bafd2b96740c Author: raph Date: Sat Nov 9 05:52:30 2024 +0100 Get output information by address (#4056) commit c01279c654e2813a7ab96190183847dfc60da432 Author: Casey Rodarmor Date: Fri Nov 8 20:38:31 2024 -0800 Allow including metadata when burning inscriptions (#4045) commit 11adf7ba8f255bd978ead64a3c7f3c84b320d8ee Author: Casey Rodarmor Date: Fri Nov 8 16:19:18 2024 -0800 Add assert_html function (#4058) commit 54adcf64cb55a8d883907421bfc54a1750758ca5 Author: Casey Rodarmor Date: Thu Nov 7 16:29:54 2024 -0800 Identify collapsible nodes with class=collapse (#4055) commit c525fcddf50c58abf8a96fccb19ee88022ba29c6 Author: raph Date: Thu Nov 7 04:53:46 2024 +0100 BIP322 sign file (#4026) commit b5c7f88a9be1288112f615df750bbbc0c3dbdb94 Author: Casey Rodarmor Date: Wed Nov 6 19:34:56 2024 -0800 Collapse long strings in HTML (#4053) commit 91fc582aac58f86cdc297c0b0a88e8b6e82bf8cc Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Tue Nov 5 21:04:14 2024 +1300 Update recursion.md with output_recursive commit fd2aa806db3066d24b7967379caafd3b8580b6f4 Author: 1stBitcoinSent <163987294+1stBitcoinSent@users.noreply.github.com> Date: Tue Nov 5 20:16:49 2024 +1300 Update server.rs with output_recursive --- .github/workflows/ci.yaml | 4 +- CHANGELOG.md | 59 + Cargo.lock | 752 +- Cargo.toml | 14 +- Dockerfile | 2 +- README.md | 2 +- bin/replicate | 15 + bin/swap | 25 + crates/mockcore/Cargo.toml | 2 +- crates/mockcore/src/api.rs | 7 +- crates/mockcore/src/lib.rs | 9 +- crates/mockcore/src/server.rs | 31 +- crates/ordinals/Cargo.toml | 6 +- crates/ordinals/src/charm.rs | 16 +- crates/ordinals/src/rune.rs | 246 +- crates/ordinals/src/sat.rs | 30 + crates/ordinals/src/sat_point.rs | 2 +- deploy/setup | 5 + docs/book.toml | 2 +- docs/{language-picker.css => index.css} | 4 + docs/src/SUMMARY.md | 3 + docs/src/guides/api.md | 8755 +++++++++++----------- docs/src/guides/splitting.md | 26 + docs/src/inscriptions/burning.md | 29 + docs/src/inscriptions/examples.md | 68 +- docs/src/inscriptions/recursion.md | 140 +- docs/src/inscriptions/uris.md | 40 + docs/theme/index.hbs | 59 +- justfile | 14 +- src/api.rs | 24 +- src/arguments.rs | 13 +- src/chain.rs | 23 +- src/error.rs | 2 + src/index.rs | 111 +- src/index/reorg.rs | 30 +- src/index/updater.rs | 2 +- src/index/updater/inscription_updater.rs | 2 +- src/index/updater/rune_updater.rs | 2 +- src/index/utxo_entry.rs | 11 +- src/inscriptions/inscription.rs | 9 +- src/lib.rs | 5 +- src/options.rs | 4 +- src/settings.rs | 27 +- src/signer.rs | 36 + src/subcommand.rs | 2 +- src/subcommand/index/info.rs | 4 +- src/subcommand/list.rs | 4 +- src/subcommand/server.rs | 568 +- src/subcommand/server/server_config.rs | 16 +- src/subcommand/verify.rs | 42 +- src/subcommand/wallet.rs | 22 + src/subcommand/wallet/addresses.rs | 21 +- src/subcommand/wallet/balance.rs | 4 +- src/subcommand/wallet/batch_command.rs | 2 +- src/subcommand/wallet/burn.rs | 159 +- src/subcommand/wallet/cardinals.rs | 2 +- src/subcommand/wallet/inscribe.rs | 23 +- src/subcommand/wallet/inscriptions.rs | 1 + src/subcommand/wallet/mint.rs | 7 +- src/subcommand/wallet/outputs.rs | 21 +- src/subcommand/wallet/restore.rs | 35 +- src/subcommand/wallet/runics.rs | 64 +- src/subcommand/wallet/send.rs | 255 +- src/subcommand/wallet/sign.rs | 54 +- src/subcommand/wallet/split.rs | 6 +- src/templates.rs | 15 +- src/templates/address.rs | 14 +- src/templates/block.rs | 8 +- src/templates/blocks.rs | 4 +- src/templates/input.rs | 2 +- src/templates/inscription.rs | 180 +- src/templates/metadata.rs | 2 +- src/templates/output.rs | 72 +- src/templates/rune.rs | 4 +- src/templates/rune_not_found.rs | 54 + src/templates/sat.rs | 25 +- src/templates/transaction.rs | 6 +- src/wallet.rs | 409 +- src/wallet/batch/file.rs | 2 +- src/wallet/batch/plan.rs | 7 +- src/wallet/wallet_constructor.rs | 48 +- static/index.css | 10 +- static/index.js | 93 +- static/preview-video.js | 3 + templates/address.html | 12 +- templates/block.html | 10 +- templates/blocks.html | 2 +- templates/input.html | 2 +- templates/inscription.html | 32 +- templates/output.html | 15 +- templates/page.html | 2 +- templates/preview-video.html | 3 +- templates/rune-balances.html | 6 +- templates/rune-not-found.html | 14 + templates/rune.html | 4 +- templates/sat.html | 5 +- templates/status.html | 2 +- templates/transaction.html | 6 +- tests/command_builder.rs | 6 +- tests/info.rs | 56 +- tests/json_api.rs | 301 +- tests/lib.rs | 11 +- tests/list.rs | 4 +- tests/server.rs | 101 +- tests/test_server.rs | 31 + tests/verify.rs | 8 +- tests/wallet/balance.rs | 2 +- tests/wallet/batch_command.rs | 20 +- tests/wallet/burn.rs | 554 +- tests/wallet/inscribe.rs | 4 +- tests/wallet/restore.rs | 146 + tests/wallet/send.rs | 16 +- tests/wallet/sign.rs | 112 +- 113 files changed, 8742 insertions(+), 5683 deletions(-) create mode 100755 bin/replicate create mode 100755 bin/swap rename docs/{language-picker.css => index.css} (77%) create mode 100644 docs/src/guides/splitting.md create mode 100644 docs/src/inscriptions/burning.md create mode 100644 docs/src/inscriptions/uris.md create mode 100644 src/signer.rs create mode 100644 src/templates/rune_not_found.rs create mode 100644 static/preview-video.js create mode 100644 templates/rune-not-found.html 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 4abe4c9f77..7f91bd5bce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,65 @@ 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 -------------------------------------------------------------------------- diff --git a/Cargo.lock b/Cargo.lock index 0cf483c98e..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.86", + "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", @@ -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.4.0", + "futures-lite 2.5.0", "piper", ] @@ -643,7 +643,7 @@ dependencies = [ "new_mime_guess", "proc-macro2", "quote", - "syn 2.0.86", + "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.86", + "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.86", + "syn 2.0.90", ] [[package]] @@ -1001,7 +1001,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.86", + "syn 2.0.90", ] [[package]] @@ -1052,7 +1052,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.86", + "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.86", + "syn 2.0.90", ] [[package]] @@ -1082,7 +1082,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "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.86", + "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.4.0" +version = "2.5.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "3f1fa2f9765705486b33fd2acf1577f8ec449c2ba1f318ae5447697b7c08d210" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "futures-core", "pin-project-lite", @@ -1372,7 +1372,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "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.16", + "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", @@ -1786,11 +1786,11 @@ 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", @@ -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.86", + "syn 2.0.90", ] [[package]] @@ -2397,7 +2532,7 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ord" -version = "0.21.2" +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.86", + "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.2.0" +version = "2.3.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "84b1de48a7cf7ba193e81e078d17ee2b786236eed1d3f7c60f8a09545efc4925" +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.86", + "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", @@ -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.86", + "syn 2.0.90", "walkdir", ] @@ -3038,15 +3173,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.38" +version = "0.38.42" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" +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.16" +version = "0.23.19" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +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.214" +version = "1.0.215" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -3274,22 +3409,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.215" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "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.86", + "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.86", + "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.86" +version = "2.0.90" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" +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.38", + "rustix 0.38.42", "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.69" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "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 = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "2.0.6" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "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.86", + "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.16", - "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.86", + "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.86", + "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.86", + "syn 2.0.90", ] [[package]] @@ -4188,7 +4391,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "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.86", + "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 a09dad5ac5..e256de9ef0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "ord" description = "◉ Ordinal wallet and block explorer" -version = "0.21.2" +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.2.0" +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 8bb2c43891..56484d5eb4 100644 --- a/crates/mockcore/src/lib.rs +++ b/crates/mockcore/src/lib.rs @@ -74,7 +74,7 @@ pub fn builder() -> Builder { Builder { fail_lock_unspent: false, network: Network::Bitcoin, - version: 240000, + version: 250000, } } @@ -198,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, @@ -346,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 0fe3176b60..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, }; @@ -506,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 { 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/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/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..37ec4da52b 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": [ @@ -3166,6 +3202,7 @@ curl -s -H "Accept: application/json" \ ``` +
GET @@ -3173,6 +3210,7 @@ curl -s -H "Accept: application/json" \ ### Description + JSON string containing the hex-encoded CBOR metadata. ### Example @@ -3180,6 +3218,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 +3231,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 +3259,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 +3285,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 +3316,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 +3354,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" @@ -3317,6 +3371,88 @@ curl -s -H "Accept: application/json" \ ```
+
+ + GET + /r/utxo/<OUTPOINT> + + +### Description + +Information about a UTXO. + +### Examples + +Genesis UTXO with server running only inscriptions index: + +```bash +curl -s -H "Accept: application/json" \ + http://0.0.0.0:80/r/utxo/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0 +``` + +```json +{ + "inscriptions": [], + "runes": null, + "sat_ranges": null, + "value": 5000000000 +} +``` + +Server running with runes, inscriptions and sats index: + +```bash +curl -s -H "Accept: application/json" \ + http://0.0.0.0:80/r/utxo/626860df36c1047194866c6812f04c15ab84f3690e7cc06fd600c841f1943e05:0 +``` + +```json +{ + "inscriptions": [], + "runes": { + "UNCOMMON•GOODS": { + "amount": 6845, + "divisibility": 0, + "symbol": "⧉" + } + }, + "sat_ranges": [ + [ + 1905800627509113, + 1905800627509443 + ] + ], + "value": 330 +} +``` + +Multiple assets in output with server running with runes and inscriptions index +but no sats index. +sats index: + +```bash +curl -s -H "Accept: application/json" \ + http://0.0.0.0:80/r/utxo/626860df36c1047194866c6812f04c15ab84f3690e7cc06fd600c841f1943e05:0 +``` + +```json +{ + "inscriptions": [ + "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0" + ], + "runes": { + "UNCOMMON•GOODS": { + "amount": 6845, + "divisibility": 0, + "symbol": "⧉" + } + }, + "sat_ranges": null, + "value": 330 +} +``` +
+     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/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 e69e8329ee..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() @@ -104,7 +129,7 @@ mod tests {
.*
address
-
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
+
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
value
1
.* @@ -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..23da2b64e9 100644 --- a/src/templates/output.rs +++ b/src/templates/output.rs @@ -3,10 +3,10 @@ use super::*; #[derive(Boilerplate)] pub(crate) struct OutputHtml { pub(crate) chain: Chain, - pub(crate) inscriptions: Vec, + pub(crate) inscriptions: Option>, pub(crate) outpoint: OutPoint, pub(crate) output: TxOut, - pub(crate) runes: BTreeMap, + pub(crate) runes: Option>, pub(crate) sat_ranges: Option>, pub(crate) spent: bool, } @@ -29,10 +29,10 @@ mod tests { assert_regex_match!( OutputHtml { chain: Chain::Mainnet, - inscriptions: Vec::new(), + inscriptions: Some(Vec::new()), outpoint: outpoint(1), output: TxOut { value: Amount::from_sat(3), script_pubkey: ScriptBuf::new_p2pkh(&PubkeyHash::all_zeros()), }, - runes: BTreeMap::new(), + runes: Some(BTreeMap::new()), sat_ranges: Some(vec![(0, 1), (1, 3)]), spent: false, }, @@ -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() @@ -60,13 +60,13 @@ mod tests { assert_regex_match!( OutputHtml { chain: Chain::Mainnet, - inscriptions: Vec::new(), + inscriptions: None, outpoint: outpoint(1), output: TxOut { value: Amount::from_sat(1), script_pubkey: script::Builder::new().push_int(0).into_script(), }, - runes: BTreeMap::new(), + runes: None, sat_ranges: None, spent: true, }, @@ -75,7 +75,7 @@ mod tests {
value
1
script pubkey
OP_0
-
transaction
1{64}
+
transaction
1{64}
spent
true
" @@ -88,10 +88,10 @@ mod tests { assert_regex_match!( OutputHtml { chain: Chain::Mainnet, - inscriptions: Vec::new(), + inscriptions: None, outpoint: outpoint(1), output: TxOut { value: Amount::from_sat(3), script_pubkey: ScriptBuf::new_p2pkh(&PubkeyHash::all_zeros()), }, - runes: BTreeMap::new(), + runes: None, sat_ranges: Some(vec![(0, 1), (1, 3)]), 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() @@ -119,10 +119,10 @@ mod tests { assert_regex_match!( OutputHtml { chain: Chain::Mainnet, - inscriptions: Vec::new(), + inscriptions: None, outpoint: outpoint(1), output: TxOut { value: Amount::from_sat(3), script_pubkey: ScriptBuf::new_p2pkh(&PubkeyHash::all_zeros()), }, - runes: BTreeMap::new(), + runes: None, sat_ranges: None, spent: false, } @@ -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
" @@ -146,13 +146,13 @@ mod tests { assert_regex_match!( OutputHtml { chain: Chain::Mainnet, - inscriptions: vec![inscription_id(1)], + inscriptions: Some(vec![inscription_id(1)]), outpoint: outpoint(1), output: TxOut { value: Amount::from_sat(3), script_pubkey: ScriptBuf::new_p2pkh(&PubkeyHash::all_zeros()), }, - runes: BTreeMap::new(), + runes: None, sat_ranges: None, spent: false, }, @@ -175,25 +175,27 @@ mod tests { assert_regex_match!( OutputHtml { chain: Chain::Mainnet, - inscriptions: Vec::new(), + inscriptions: None, outpoint: outpoint(1), output: TxOut { value: Amount::from_sat(3), script_pubkey: ScriptBuf::new_p2pkh(&PubkeyHash::all_zeros()), }, - runes: vec![( - SpacedRune { - rune: Rune(26), - spacers: 1 - }, - Pile { - amount: 11, - divisibility: 1, - symbol: None, - } - )] - .into_iter() - .collect(), + runes: Some( + vec![( + SpacedRune { + rune: Rune(26), + spacers: 1 + }, + Pile { + amount: 11, + divisibility: 1, + symbol: None, + } + )] + .into_iter() + .collect() + ), sat_ranges: None, 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/wallet.rs b/src/wallet.rs index f02215011d..6dae9a4228 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -2,10 +2,10 @@ 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::json::ImportDescriptors, entry::{EtchingEntry, EtchingEntryValue}, @@ -75,7 +75,6 @@ pub(crate) enum Maturity { pub(crate) struct Wallet { bitcoin_client: Client, database: Database, - has_inscription_index: bool, has_rune_index: bool, has_sat_index: bool, rpc_url: Url, @@ -181,7 +180,7 @@ impl Wallet { .utxos() .keys() .filter(|utxo| inscriptions.contains(utxo)) - .chain(self.get_runic_outputs()?.iter()) + .chain(self.get_runic_outputs()?.unwrap_or_default().iter()) .cloned() .filter(|utxo| !locked.contains(utxo)) .collect::>(); @@ -217,7 +216,7 @@ impl Wallet { ) } - pub(crate) fn get_inscriptions_in_output(&self, output: &OutPoint) -> Vec { + pub(crate) fn get_inscriptions_in_output(&self, output: &OutPoint) -> Option> { self.output_info.get(output).unwrap().inscriptions.clone() } @@ -251,21 +250,25 @@ impl Wallet { Ok(parent_info) } - pub(crate) fn get_runic_outputs(&self) -> Result> { + pub(crate) fn get_runic_outputs(&self) -> Result>> { let mut runic_outputs = BTreeSet::new(); - for (output, info) in self.output_info.iter() { - if !info.runes.is_empty() { + for (output, info) in &self.output_info { + let Some(runes) = &info.runes else { + return Ok(None); + }; + + if !runes.is_empty() { runic_outputs.insert(*output); } } - Ok(runic_outputs) + Ok(Some(runic_outputs)) } pub(crate) fn get_runes_balances_in_output( &self, output: &OutPoint, - ) -> Result> { + ) -> Result>> { Ok( self .output_info @@ -311,10 +314,6 @@ impl Wallet { ) } - pub(crate) fn has_inscription_index(&self) -> bool { - self.has_inscription_index - } - pub(crate) fn has_sat_index(&self) -> bool { self.has_sat_index } @@ -526,49 +525,25 @@ 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, - timestamp, - )?; - } - - Ok(()) - } - - fn derive_and_import_descriptor( - name: String, - settings: &Settings, - secp: &Secp256k1, - origin: (Fingerprint, DerivationPath), - derived_private_key: Xpriv, - change: bool, - timestamp: bitcoincore_rpc::json::Timestamp, - ) -> 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, active: Some(true), @@ -576,13 +551,36 @@ impl Wallet { 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 { @@ -683,7 +681,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)?; @@ -707,7 +706,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, @@ -736,7 +736,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()?; @@ -762,6 +763,7 @@ impl Wallet { &self, unsigned_transaction: Transaction, dry_run: bool, + burn_amount: Option, ) -> Result<(Txid, String, u64)> { let unspent_outputs = self.utxos(); @@ -796,10 +798,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; @@ -816,4 +815,290 @@ 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()?.unwrap_or_default(); + + 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()? + .unwrap_or_default() + .into_iter() + .filter(|output| !inscribed_outputs.contains(output)) + .map(|output| { + self.get_runes_balances_in_output(&output).map(|balance| { + ( + output, + balance + .unwrap_or_default() + .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/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/wallet_constructor.rs b/src/wallet/wallet_constructor.rs index d9d60fce5a..7d6108c565 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)); } @@ -95,7 +118,7 @@ impl WalletConstructor { let inscriptions = output_info .iter() - .flat_map(|(_output, info)| info.inscriptions.clone()) + .flat_map(|(_output, info)| info.inscriptions.clone().unwrap_or_default()) .collect::>(); let (inscriptions, inscription_info) = self.get_inscriptions(&inscriptions)?; @@ -105,7 +128,6 @@ impl WalletConstructor { Ok(Wallet { bitcoin_client, database, - has_inscription_index: status.inscription_index, has_rune_index: status.rune_index, has_sat_index: status.sat_index, inscription_info, 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..677290a0c2 100644 --- a/templates/address.html +++ b/templates/address.html @@ -2,27 +2,29 @@

    Address {{ self.address }}

    sat balance
    {{ self.sat_balance }}
    -%% if !self.inscriptions.is_empty() { +%% if let Some(inscriptions) = self.inscriptions.as_ref().filter(|inscriptions| !inscriptions.is_empty()) {
    inscriptions
    -%% for inscription in &self.inscriptions { +%% for inscription in inscriptions { {{Iframe::thumbnail(*inscription)}} %% }
    %% } -
    runes balances
    -%% for (rune, decimal, symbol) in self.runes_balances.iter() { +%% if let Some(runes_balances) = self.runes_balances.as_ref().filter(|runes_balances| !runes_balances.is_empty()) { +
    rune balances
    +%% for (rune, decimal, symbol) in runes_balances { %% if let Some(symbol) = symbol {
    {{ rune }}: {{ decimal }}{{ symbol }}
    %% } else {
    {{ rune }}: {{ decimal }}¤
    %% } +%% } %% }
    outputs
    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..56a640b312 100644 --- a/templates/output.html +++ b/templates/output.html @@ -1,14 +1,14 @@

      Output {{self.outpoint}}

      -%% if !self.inscriptions.is_empty() { +%% if let Some(inscriptions) = self.inscriptions.as_ref().filter(|inscriptions| !inscriptions.is_empty()) {
      inscriptions
      -%% for inscription in &self.inscriptions { +%% for inscription in inscriptions { {{Iframe::thumbnail(*inscription)}} %% }
      %% } -%% if !self.runes.is_empty() { +%% if let Some(runes) = self.runes.as_ref().filter(|runes| !runes.is_empty()) {
      runes
      @@ -16,7 +16,7 @@

      Output {{self.outpoint}}

      -%% for (rune, balance) in &self.runes { +%% for (rune, balance) in runes { @@ -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-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 @@ + -
      rune balance
      {{ rune }} {{ balance }}
      %% for (outpoint, balance) in balances { - - diff --git a/templates/rune-not-found.html b/templates/rune-not-found.html new file mode 100644 index 0000000000..ede0843104 --- /dev/null +++ b/templates/rune-not-found.html @@ -0,0 +1,14 @@ +

      {{ self.rune }}

      +
      +%% if let Some(unlock_height) = self.unlock_height { +
      unlock height
      +
      {{ unlock_height }}
      +
      reserved
      +
      false
      +%% } else { +
      unlock height
      +
      none
      +
      reserved
      +
      true
      +%% } +
      diff --git a/templates/rune.html b/templates/rune.html index e2b4bb4bba..3da0d745ca 100644 --- a/templates/rune.html +++ b/templates/rune.html @@ -71,9 +71,9 @@

      {{ self.entry.spaced_rune }}

      turbo
      {{ self.entry.turbo }}
      etching
      -
      {{ self.entry.etching }}
      +
      {{ self.entry.etching }}
      %% if let Some(parent) = self.parent {
      parent
      -
      {{ parent }}
      +
      {{ parent }}
      %% } diff --git a/templates/sat.html b/templates/sat.html index 9709d79c5a..eba6a70fac 100644 --- a/templates/sat.html +++ b/templates/sat.html @@ -31,7 +31,10 @@

      Sat {{ self.sat.n() }}

      %% } %% if let Some(satpoint) = self.satpoint { -
      location
      {{ satpoint }}
      +
      location
      {{ satpoint }}
      +%% } +%% if let Some(address) = &self.address { +
      address
      {{ address }}
      %% }
      diff --git a/templates/status.html b/templates/status.html index e403777dc3..e1ad62f0a9 100644 --- a/templates/status.html +++ b/templates/status.html @@ -47,7 +47,7 @@

      Status

      %% if !env!("GIT_COMMIT").is_empty() {
      git commit
      - + {{ env!("GIT_COMMIT") }}
      diff --git a/templates/transaction.html b/templates/transaction.html index d855246fcb..aa183ec59a 100644 --- a/templates/transaction.html +++ b/templates/transaction.html @@ -16,7 +16,7 @@

      Inscription Geneses

      {{"Input".tally(self.transaction.input.len())}}

      {{"Output".tally(self.transaction.output.len())}}

      @@ -24,14 +24,14 @@

      {{"Output".tally(self.transaction.output.len())}}

      %% for (vout, output) in self.transaction.output.iter().enumerate() { %% let outpoint = OutPoint::new(self.txid, vout as u32);
    • - + {{ outpoint }}
      value
      {{ output.value.to_sat() }}
      script pubkey
      {{ output.script_pubkey.to_asm_string() }}
      %% if let Ok(address) = self.chain.address_from_script(&output.script_pubkey) { -
      address
      {{ address }}
      +
      address
      {{ address }}
      %% }
    • diff --git a/tests/command_builder.rs b/tests/command_builder.rs index 574b797476..ba9f57157a 100644 --- a/tests/command_builder.rs +++ b/tests/command_builder.rs @@ -38,7 +38,7 @@ pub(crate) struct Spawn { impl Spawn { #[track_caller] - fn run(self) -> (TempDir, String) { + fn run(self) -> (Arc, String) { let output = self.child.wait_with_output().unwrap(); let stdout = str::from_utf8(&output.stdout).unwrap(); @@ -53,7 +53,7 @@ impl Spawn { self.expected_stderr.assert_match(stderr); self.expected_stdout.assert_match(stdout); - (Arc::try_unwrap(self.tempdir).unwrap(), stdout.into()) + (self.tempdir, stdout.into()) } #[track_caller] @@ -263,7 +263,7 @@ impl CommandBuilder { } #[track_caller] - fn run(self) -> (TempDir, String) { + pub(crate) fn run(self) -> (Arc, String) { self.spawn().run() } diff --git a/tests/info.rs b/tests/info.rs index 7c294f9933..4a6eb910d1 100644 --- a/tests/info.rs +++ b/tests/info.rs @@ -3,7 +3,13 @@ use {super::*, ord::subcommand::index::info::TransactionsOutput}; #[test] fn json_with_satoshi_index() { let core = mockcore::spawn(); + + let (tempdir, _) = CommandBuilder::new("--index-sats index update") + .core(&core) + .run(); + CommandBuilder::new("--index-sats index info") + .temp_dir(tempdir) .core(&core) .stdout_regex( r#"\{ @@ -37,8 +43,12 @@ fn json_with_satoshi_index() { #[test] fn json_without_satoshi_index() { let core = mockcore::spawn(); + + let (tempdir, _) = CommandBuilder::new("index update").core(&core).run(); + CommandBuilder::new("index info") .core(&core) + .temp_dir(tempdir) .stdout_regex( r#"\{ "blocks_indexed": 1, @@ -72,26 +82,27 @@ fn json_without_satoshi_index() { fn transactions() { let core = mockcore::spawn(); - let tempdir = TempDir::new().unwrap(); + let (tempdir, _) = CommandBuilder::new("index update").core(&core).run(); - let index_path = tempdir.path().join("index.redb"); + let output = CommandBuilder::new("index info --transactions") + .temp_dir(tempdir.clone()) + .core(&core) + .run_and_deserialize_output::>(); - assert!(CommandBuilder::new(format!( - "--index {} index info --transactions", - index_path.display() - )) - .core(&core) - .run_and_deserialize_output::>() - .is_empty()); + assert!(output.is_empty()); core.mine_blocks(10); - let output = CommandBuilder::new(format!( - "--index {} index info --transactions", - index_path.display() - )) - .core(&core) - .run_and_deserialize_output::>(); + CommandBuilder::new("index update") + .temp_dir(tempdir.clone()) + .core(&core) + .run(); + + let output = CommandBuilder::new("index info --transactions") + .temp_dir(tempdir.clone()) + .core(&core) + .stdout_regex(".*") + .run_and_deserialize_output::>(); assert_eq!(output[0].start, 0); assert_eq!(output[0].end, 1); @@ -99,12 +110,15 @@ fn transactions() { core.mine_blocks(10); - let output = CommandBuilder::new(format!( - "--index {} index info --transactions", - index_path.display() - )) - .core(&core) - .run_and_deserialize_output::>(); + CommandBuilder::new("index update") + .temp_dir(tempdir.clone()) + .core(&core) + .run(); + + let output = CommandBuilder::new("index info --transactions") + .temp_dir(tempdir.clone()) + .core(&core) + .run_and_deserialize_output::>(); assert_eq!(output[1].start, 1); assert_eq!(output[1].end, 11); diff --git a/tests/json_api.rs b/tests/json_api.rs index 2886291ff5..5606d7929b 100644 --- a/tests/json_api.rs +++ b/tests/json_api.rs @@ -1,6 +1,7 @@ use { super::*, bitcoin::{BlockHash, ScriptBuf}, + ord::subcommand::wallet::send::Output, ord::{Envelope, Inscription}, }; @@ -21,6 +22,7 @@ fn get_sat_without_sat_index() { pretty_assert_eq!( sat_json, api::Sat { + address: None, number: 2099999997689999, decimal: "6929999.0".into(), degree: "5°209999′1007″0‴".into(), @@ -54,11 +56,15 @@ fn get_sat_with_inscription_and_sat_index() { assert_eq!(response.status(), StatusCode::OK); - let sat_json: api::Sat = serde_json::from_str(&response.text().unwrap()).unwrap(); + let mut sat_json: api::Sat = serde_json::from_str(&response.text().unwrap()).unwrap(); + + assert_regex_match!(sat_json.address.unwrap(), r"bc1p.*"); + sat_json.address = None; pretty_assert_eq!( sat_json, api::Sat { + address: None, number: 50 * COIN_VALUE, decimal: "1.0".into(), degree: "0°1′1″0‴".into(), @@ -110,11 +116,15 @@ fn get_sat_with_inscription_on_common_sat_and_more_inscriptions() { assert_eq!(response.status(), StatusCode::OK); - let sat_json: api::Sat = serde_json::from_str(&response.text().unwrap()).unwrap(); + let mut sat_json: api::Sat = serde_json::from_str(&response.text().unwrap()).unwrap(); + + assert_regex_match!(sat_json.address.unwrap(), r"bc1p.*"); + sat_json.address = None; pretty_assert_eq!( sat_json, api::Sat { + address: None, number: 3 * 50 * COIN_VALUE + 1, decimal: "3.1".into(), degree: "0°3′3″1‴".into(), @@ -175,10 +185,67 @@ fn get_inscription() { sat: Some(Sat(50 * COIN_VALUE)), satpoint: SatPoint::from_str(&format!("{}:{}:{}", reveal, 0, 0)).unwrap(), timestamp: 2, + metaprotocol: None } ) } +#[test] +fn get_inscription_with_metaprotocol() { + let core = mockcore::spawn(); + let ord = TestServer::spawn_with_server_args(&core, &["--index-sats"], &[]); + + create_wallet(&core, &ord); + + core.mine_blocks(1); + + let output = CommandBuilder::new(format!( + "--chain {} wallet inscribe --fee-rate 1 --file foo.txt --metaprotocol foo", + core.network() + )) + .write("foo.txt", "FOO") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + let response = ord.json_request(format!("/inscription/{}", output.inscriptions[0].id)); + + assert_eq!(response.status(), StatusCode::OK); + + let mut inscription_json: api::Inscription = + serde_json::from_str(&response.text().unwrap()).unwrap(); + assert_regex_match!(inscription_json.address.unwrap(), r"bc1p.*"); + inscription_json.address = None; + + pretty_assert_eq!( + inscription_json, + api::Inscription { + address: None, + charms: vec![Charm::Coin, Charm::Uncommon], + child_count: 0, + children: Vec::new(), + content_length: Some(3), + content_type: Some("text/plain;charset=utf-8".to_string()), + effective_content_type: Some("text/plain;charset=utf-8".to_string()), + fee: 140, + height: 2, + id: output.inscriptions[0].id, + number: 0, + next: None, + value: Some(10000), + parents: Vec::new(), + previous: None, + rune: None, + sat: Some(Sat(50 * COIN_VALUE)), + satpoint: SatPoint::from_str(&format!("{}:{}:{}", output.reveal, 0, 0)).unwrap(), + timestamp: 2, + metaprotocol: Some("foo".to_string()) + } + ); +} + #[test] fn get_inscriptions() { let core = mockcore::spawn(); @@ -338,13 +405,14 @@ fn get_output() { .parse() .unwrap() ), - inscriptions: vec![ + outpoint: OutPoint { txid, vout: 0 }, + inscriptions: Some(vec![ InscriptionId { txid, index: 0 }, InscriptionId { txid, index: 1 }, InscriptionId { txid, index: 2 }, - ], + ]), indexed: true, - runes: BTreeMap::new(), + runes: None, sat_ranges: Some(vec![ (5000000000, 10000000000,), (10000000000, 15000000000,), @@ -687,3 +755,226 @@ fn get_decode_tx() { } ); } + +#[test] +fn outputs_address() { + let core = mockcore::builder().network(Network::Regtest).build(); + let ord = + TestServer::spawn_with_args(&core, &["--index-runes", "--index-addresses", "--regtest"]); + + create_wallet(&core, &ord); + + let address = "bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw"; + + let (inscription_id, reveal) = inscribe(&core, &ord); + + let inscription_send = CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 1 {address} {inscription_id}", + )) + .core(&core) + .ord(&ord) + .stdout_regex(".*") + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + etch(&core, &ord, Rune(RUNE)); + + let rune_send = CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 1 {address} 1000:{}", + Rune(RUNE) + )) + .core(&core) + .ord(&ord) + .stdout_regex(".*") + .run_and_deserialize_output::(); + + let cardinal_send = CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 13.3 {address} 2btc" + )) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + core.mine_blocks(6); + + let cardinals_response = ord.json_request(format!("/outputs/{}?type=cardinal", address)); + + assert_eq!(cardinals_response.status(), StatusCode::OK); + + let cardinals_json: Vec = + serde_json::from_str(&cardinals_response.text().unwrap()).unwrap(); + + pretty_assert_eq!( + cardinals_json, + vec![api::Output { + address: Some(address.parse().unwrap()), + inscriptions: Some(vec![]), + outpoint: OutPoint { + txid: cardinal_send.txid, + vout: 0 + }, + indexed: true, + runes: Some(BTreeMap::new()), + sat_ranges: None, + script_pubkey: ScriptBuf::from( + address + .parse::>() + .unwrap() + .assume_checked() + ), + spent: false, + transaction: cardinal_send.txid, + value: 2 * COIN_VALUE, + }] + ); + + let runes_response = ord.json_request(format!("/outputs/{}?type=runic", address)); + + assert_eq!(runes_response.status(), StatusCode::OK); + + let runes_json: Vec = serde_json::from_str(&runes_response.text().unwrap()).unwrap(); + + let mut expected_runes = BTreeMap::new(); + + expected_runes.insert( + SpacedRune { + rune: Rune(RUNE), + spacers: 0, + }, + Pile { + amount: 1000, + divisibility: 0, + symbol: Some('¢'), + }, + ); + + pretty_assert_eq!( + runes_json, + vec![api::Output { + address: Some(address.parse().unwrap()), + inscriptions: Some(vec![]), + outpoint: OutPoint { + txid: rune_send.txid, + vout: 0 + }, + indexed: true, + runes: Some(expected_runes), + sat_ranges: None, + script_pubkey: ScriptBuf::from( + address + .parse::>() + .unwrap() + .assume_checked() + ), + spent: false, + transaction: rune_send.txid, + value: 9901, + }] + ); + + let inscriptions_response = ord.json_request(format!("/outputs/{}?type=inscribed", address)); + + assert_eq!(inscriptions_response.status(), StatusCode::OK); + + let inscriptions_json: Vec = + serde_json::from_str(&inscriptions_response.text().unwrap()).unwrap(); + + pretty_assert_eq!( + inscriptions_json, + vec![api::Output { + address: Some(address.parse().unwrap()), + inscriptions: Some(vec![InscriptionId { + txid: reveal, + index: 0 + },]), + outpoint: OutPoint { + txid: inscription_send.txid, + vout: 0 + }, + indexed: true, + runes: Some(BTreeMap::new()), + sat_ranges: None, + script_pubkey: ScriptBuf::from( + address + .parse::>() + .unwrap() + .assume_checked() + ), + spent: false, + transaction: inscription_send.txid, + value: 9901, + }] + ); + + let any: Vec = serde_json::from_str( + &ord + .json_request(format!("/outputs/{}?type=any", address)) + .text() + .unwrap(), + ) + .unwrap(); + + let default: Vec = serde_json::from_str( + &ord + .json_request(format!("/outputs/{}", address)) + .text() + .unwrap(), + ) + .unwrap(); + + assert_eq!(any.len(), 3); + assert!(any + .iter() + .any(|output| output.runes.clone().unwrap_or_default().len() == 1)); + assert!(any + .iter() + .any(|output| output.inscriptions.clone().unwrap_or_default().len() == 1)); + assert!(any.iter().any( + |output| output.inscriptions.clone().unwrap_or_default().is_empty() + && output.runes.clone().unwrap_or_default().is_empty() + )); + assert_eq!(any, default); +} + +#[test] +fn outputs_address_returns_400_for_missing_indices() { + let core = mockcore::builder().network(Network::Regtest).build(); + let ord = TestServer::spawn_with_args( + &core, + &[ + "--no-index-inscriptions", + "--index-runes", + "--index-addresses", + "--regtest", + ], + ); + + let address = "bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw"; + + let inscriptions_response = ord.json_request(format!("/outputs/{}?type=inscribed", address)); + assert_eq!(inscriptions_response.status(), StatusCode::BAD_REQUEST); + + let runes_response = ord.json_request(format!("/outputs/{}?type=runic", address)); + assert_eq!(runes_response.status(), StatusCode::BAD_REQUEST); + + let cardinal_response = ord.json_request(format!("/outputs/{}?type=runic", address)); + assert_eq!(cardinal_response.status(), StatusCode::BAD_REQUEST); +} + +#[test] +fn outputs_address_returns_400_for_missing_rune_index() { + let core = mockcore::builder().network(Network::Regtest).build(); + let ord = TestServer::spawn_with_args(&core, &["--index-addresses", "--regtest"]); + + let address = "bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw"; + + let inscriptions_response = ord.json_request(format!("/outputs/{}?type=inscribed", address)); + assert_eq!(inscriptions_response.status(), StatusCode::BAD_REQUEST); + + let runes_response = ord.json_request(format!("/outputs/{}?type=runic", address)); + assert_eq!(runes_response.status(), StatusCode::BAD_REQUEST); + + let cardinal_response = ord.json_request(format!("/outputs/{}?type=runic", address)); + assert_eq!(cardinal_response.status(), StatusCode::BAD_REQUEST); +} diff --git a/tests/lib.rs b/tests/lib.rs index 76b702c1c7..19a69fcef5 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -4,14 +4,15 @@ use { self::{command_builder::CommandBuilder, expected::Expected, test_server::TestServer}, bitcoin::{ address::{Address, NetworkUnchecked}, - Amount, Network, OutPoint, Sequence, Txid, Witness, + opcodes, script, Amount, Network, OutPoint, Sequence, TxOut, Txid, Witness, }, chrono::{DateTime, Utc}, executable_path::executable_path, mockcore::TransactionTemplate, ord::{ - api, chain::Chain, outgoing::Outgoing, subcommand::runes::RuneInfo, wallet::batch, - wallet::ListDescriptorsResult, InscriptionId, RuneEntry, + api, chain::Chain, decimal::Decimal, outgoing::Outgoing, subcommand::runes::RuneInfo, + templates::InscriptionHtml, wallet::batch, wallet::ListDescriptorsResult, Inscription, + InscriptionId, RuneEntry, }, ordinals::{ Artifact, Charm, Edict, Pile, Rarity, Rune, RuneId, Runestone, Sat, SatPoint, SpacedRune, @@ -368,9 +369,9 @@ fn batch(core: &mockcore::Handle, ord: &TestServer, batchfile: batch::File) -> E
      turbo
      {turbo}
      etching
      -
      {reveal}
      +
      {reveal}
      parent
      -
      {parent}
      +
      {parent}
      .*", mint_definition.join("\\s+"), ), diff --git a/tests/list.rs b/tests/list.rs index 58dde2edee..199c5ceb59 100644 --- a/tests/list.rs +++ b/tests/list.rs @@ -17,8 +17,8 @@ fn output_found() { Output { address: None, indexed: true, - inscriptions: vec![], - runes: BTreeMap::new(), + inscriptions: Some(Vec::new()), + runes: None, sat_ranges: Some(vec![Range { end: 50 * COIN_VALUE, name: "nvtdijuwxlp".into(), diff --git a/tests/server.rs b/tests/server.rs index d92e8104d8..4b170b32f5 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -32,6 +32,7 @@ fn run() { } child.kill().unwrap(); + child.wait().unwrap(); } #[test] @@ -54,7 +55,7 @@ fn address_page_shows_outputs_and_sat_balance() { ord.assert_response_regex( format!("/address/{address}"), format!( - ".*

      Address {address}

      .*
      200000000
      .*Address {address}.*
      200000000
      .*
      () - .ethereum; + let response = ord.json_request(format!( + "/output/{}", + OutPoint { + txid: reveal, + vout: 0 + } + )); - TestServer::spawn_with_args(&core, &[]).assert_response_regex( + assert_eq!(response.status(), StatusCode::OK); + + let output: api::Output = serde_json::from_str(&response.text().unwrap()).unwrap(); + + TestServer::spawn_with_args(&core, &[]).assert_html( format!("/inscription/{inscription}"), - format!( - ".*.* -.*.* -.*.* -

      Inscription 0

      -.*.* -
      -
      id
      -
      {inscription}
      -
      address
      -
      bc1.*
      -
      value
      -
      10000
      -
      preview
      -
      link
      -
      content
      -
      link
      -
      content length
      -
      3 bytes
      -
      content type
      -
      text/plain;charset=utf-8
      -
      timestamp
      -
      -
      height
      -
      2
      -
      fee
      -
      138
      -
      reveal transaction
      -
      {reveal}
      -
      location
      -
      {reveal}:0:0
      -
      output
      -
      {reveal}:0
      -
      offset
      -
      0
      -
      ethereum teleburn address
      -
      {ethereum_teleburn_address}
      -
      .*", - ), + Chain::Mainnet, + InscriptionHtml { + chain: Chain::Mainnet, + charms: 0, + child_count: 0, + children: Vec::new(), + fee: 138, + height: 2, + inscription: Inscription { + content_type: Some("text/plain;charset=utf-8".as_bytes().into()), + body: Some("foo".as_bytes().into()), + ..default() + }, + id: inscription, + number: 0, + next: None, + output: Some(TxOut { + value: Amount::from_sat(10000), + script_pubkey: output.script_pubkey, + }), + parents: Vec::new(), + previous: None, + rune: None, + sat: None, + satpoint: SatPoint { + outpoint: OutPoint { + txid: reveal, + vout: 0, + }, + offset: 0, + }, + timestamp: "1970-01-01 00:00:02+00:00" + .parse::>() + .unwrap(), + }, ); } @@ -362,7 +366,7 @@ fn inscription_page_after_send() { ord.assert_response_regex( format!("/inscription/{inscription}"), format!( - r".*

      Inscription 0

      .*
      location
      \s*
      {reveal}:0:0
      .*", + r".*

      Inscription 0

      .*
      location
      \s*
      {reveal}:0:0
      .*", ), ); @@ -380,7 +384,7 @@ fn inscription_page_after_send() { ord.assert_response_regex( format!("/inscription/{inscription}"), format!( - r".*

      Inscription 0

      .*
      address
      \s*
      bc1qcqgs2pps4u4yedfyl5pysdjjncs8et5utseepv
      .*
      location
      \s*
      {txid}:0:0
      .*", + r".*

      Inscription 0

      .*
      address
      \s*
      bc1qcqgs2pps4u4yedfyl5pysdjjncs8et5utseepv
      .*
      location
      \s*
      {txid}:0:0
      .*", ), ) } @@ -738,6 +742,7 @@ fn run_no_sync() { } child.kill().unwrap(); + child.wait().unwrap(); let builder = CommandBuilder::new(format!( "server --no-sync --address 127.0.0.1 --http-port {port}", @@ -767,6 +772,7 @@ fn run_no_sync() { } child.kill().unwrap(); + child.wait().unwrap(); } #[test] @@ -811,6 +817,7 @@ fn authentication() { assert_eq!(response.status(), 200); child.kill().unwrap(); + child.wait().unwrap(); } #[cfg(unix)] diff --git a/tests/test_server.rs b/tests/test_server.rs index e351418f9c..57bdce2a8b 100644 --- a/tests/test_server.rs +++ b/tests/test_server.rs @@ -4,6 +4,7 @@ use { bitcoincore_rpc::{Auth, Client, RpcApi}, ord::{parse_ord_server_args, Index}, reqwest::blocking::Response, + sysinfo::System, }; pub(crate) struct TestServer { @@ -108,6 +109,36 @@ impl TestServer { pretty_assert_eq!(response.text().unwrap(), expected_response); } + #[track_caller] + pub(crate) fn assert_html( + &self, + path: impl AsRef, + chain: Chain, + content: impl ord::templates::PageContent, + ) { + self.sync_server(); + let response = reqwest::blocking::get(self.url().join(path.as_ref()).unwrap()).unwrap(); + + assert_eq!( + response.status(), + StatusCode::OK, + "{}", + response.text().unwrap() + ); + + let expected_response = ord::templates::PageHtml::new( + content, + Arc::new(ord::subcommand::server::ServerConfig { + chain, + domain: Some(System::host_name().unwrap()), + ..Default::default() + }), + ) + .to_string(); + + pretty_assert_eq!(response.text().unwrap(), expected_response); + } + pub(crate) fn request(&self, path: impl AsRef) -> Response { self.sync_server(); diff --git a/tests/verify.rs b/tests/verify.rs index f33233137f..ac55c9aef3 100644 --- a/tests/verify.rs +++ b/tests/verify.rs @@ -6,7 +6,7 @@ fn verify() { CommandBuilder::new([ "verify", "--address", "bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", - "--message", "Hello World", + "--text", "Hello World", "--witness", "AkcwRAIgZRfIY3p7/DoVTty6YZbWS71bc5Vct9p9Fia83eRmw2QCICK/ENGfwLtptFluMGs2KsqoNSk89pO7F29zJLUx9a/sASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=" ]) .run_and_extract_stdout(), @@ -19,7 +19,7 @@ fn verify_fails() { CommandBuilder::new([ "verify", "--address", "bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", - "--message", "Hello World - this should fail", + "--text", "Hello World - this should fail", "--witness", "AkcwRAIgZRfIY3p7/DoVTty6YZbWS71bc5Vct9p9Fia83eRmw2QCICK/ENGfwLtptFluMGs2KsqoNSk89pO7F29zJLUx9a/sASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=" ]) .expected_exit_code(1) @@ -32,7 +32,7 @@ fn witness_and_transaction_conflict() { CommandBuilder::new([ "verify", "--address", "bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", - "--message", "Hello World", + "--text", "Hello World", "--transaction", "asdf", "--witness", "AkcwRAIgZRfIY3p7/DoVTty6YZbWS71bc5Vct9p9Fia83eRmw2QCICK/ENGfwLtptFluMGs2KsqoNSk89pO7F29zJLUx9a/sASECx/EgAxlkQpQ9hYjgGu6EBCPMVPwVIVJqO4XCsMvViHI=" ]) @@ -55,7 +55,7 @@ fn verify_with_transaction() { "verify", "--address", "bc1q9vza2e8x573nczrlzms0wvx3gsqjx7vavgkx0l", - "--message", + "--text", "Hello World", "--transaction", &tx, diff --git a/tests/wallet/balance.rs b/tests/wallet/balance.rs index c323b24fcd..c97163755d 100644 --- a/tests/wallet/balance.rs +++ b/tests/wallet/balance.rs @@ -174,7 +174,7 @@ fn unsynced_wallet_fails_with_unindexed_output() { .ord(&no_sync_ord) .core(&core) .expected_exit_code(1) - .expected_stderr("error: wallet failed to synchronize with `ord server` after 20 attempts\n") + .expected_stderr("error: `ord server` 4 blocks behind `bitcoind`, consider using `--no-sync` to ignore this error\n") .run_and_extract_stdout(); CommandBuilder::new("wallet --no-sync balance") diff --git a/tests/wallet/batch_command.rs b/tests/wallet/batch_command.rs index 34c9ac0df7..d4fa0e1d76 100644 --- a/tests/wallet/batch_command.rs +++ b/tests/wallet/batch_command.rs @@ -682,7 +682,7 @@ inscriptions: format!("/inscription/{}", output.inscriptions[0].id), ".*
      address
      -
      bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
      .*", +
      bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
      .*", ); ord.assert_response_regex( @@ -690,7 +690,7 @@ inscriptions: format!( ".*
      address
      -
      {0}
      .*", +
      {0}
      .*", core.state().change_addresses[0], ), ); @@ -699,7 +699,7 @@ inscriptions: format!("/inscription/{}", output.inscriptions[2].id), ".*
      address
      -
      bc1pxwww0ct9ue7e8tdnlmug5m2tamfn7q06sahstg39ys4c9f3340qqxrdu9k
      .*", +
      bc1pxwww0ct9ue7e8tdnlmug5m2tamfn7q06sahstg39ys4c9f3340qqxrdu9k
      .*", ); } @@ -983,7 +983,7 @@ fn batch_inscribe_with_sat_arg_fails_if_wrong_mode() { .core(&core) .ord(&ord) .expected_exit_code(1) - .expected_stderr("error: neither `sat` nor `satpoint` can be set in `same-sat` mode\n") + .expected_stderr("error: `sat` or `satpoint` can only be set in `same-sat` mode\n") .run_and_extract_stdout(); } @@ -1529,7 +1529,7 @@ fn batch_can_etch_rune() { ord.assert_response_regex( "/rune/AAAAAAAAAAAAA", format!( - r".*\s*
      turbo
      \s*
      false
      .*
      parent
      \s*
      {parent}
      .*" + r".*\s*
      turbo
      \s*
      false
      .*
      parent
      \s*
      {parent}
      .*" ), ); @@ -1630,7 +1630,7 @@ fn batch_can_etch_turbo_rune() { ord.assert_response_regex( "/rune/AAAAAAAAAAAAA", format!( - r".*\s*
      turbo
      \s*
      true
      .*
      parent
      \s*
      {parent}
      .*" + r".*\s*
      turbo
      \s*
      true
      .*
      parent
      \s*
      {parent}
      .*" ), ); } @@ -1692,7 +1692,7 @@ fn batch_can_etch_rune_without_premine() { ord.assert_response_regex( "/rune/AAAAAAAAAAAAA", format!( - r".*
      parent
      \s*
      {parent}
      .*" + r".*
      parent
      \s*
      {parent}
      .*" ), ); @@ -1778,7 +1778,7 @@ fn batch_inscribe_can_etch_rune_with_offset() { ord.assert_response_regex( "/rune/AAAAAAAAAAAAA", format!( - r".*
      parent
      \s*
      {parent}
      .*" + r".*
      parent
      \s*
      {parent}
      .*" ), ); @@ -1852,7 +1852,7 @@ fn batch_inscribe_can_etch_rune_with_height() { ord.assert_response_regex( "/rune/AAAAAAAAAAAAA", format!( - r".*
      parent
      \s*
      {parent}
      .*" + r".*
      parent
      \s*
      {parent}
      .*" ), ); @@ -2616,7 +2616,7 @@ fn oversize_runestone_error() { ) .core(&core) .ord(&ord) - .expected_stderr("error: runestone greater than maximum OP_RETURN size: 104 > 82\n") + .expected_stderr("error: runestone greater than maximum OP_RETURN size: 104 > 83\n") .expected_exit_code(1) .run_and_extract_stdout(); } diff --git a/tests/wallet/burn.rs b/tests/wallet/burn.rs index 140a27dc21..cd99863152 100644 --- a/tests/wallet/burn.rs +++ b/tests/wallet/burn.rs @@ -32,6 +32,8 @@ fn inscriptions_can_be_burned() {
      🔥
      +
      value
      +
      1
      .*
      content length
      3 bytes
      @@ -114,7 +116,7 @@ fn runic_outputs_are_protected() { } #[test] -fn cannot_burn_inscriptions_on_large_utxos() { +fn burns_only_one_sat() { let core = mockcore::spawn(); let ord = TestServer::spawn_with_server_args(&core, &[], &[]); @@ -123,14 +125,45 @@ fn cannot_burn_inscriptions_on_large_utxos() { core.mine_blocks(1); - let (inscription, _) = inscribe_with_postage(&core, &ord, Some(10_001)); + assert_eq!( + CommandBuilder::new("wallet balance") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(), + Balance { + cardinal: 50 * COIN_VALUE, + ordinal: 0, + runic: None, + runes: None, + total: 50 * COIN_VALUE, + } + ); + + let (inscription, _) = inscribe_with_postage(&core, &ord, Some(100_000)); CommandBuilder::new(format!("wallet burn --fee-rate 1 {inscription}",)) .core(&core) .ord(&ord) - .expected_stderr("error: Cannot burn inscription contained in UTXO exceeding 0.00010000 BTC\n") - .expected_exit_code(1) - .run_and_extract_stdout(); + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + // 4 block rewards - 1 burned sat + let expected_balance = 4 * 50 * COIN_VALUE - 1; + + assert_eq!( + CommandBuilder::new("wallet balance") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(), + Balance { + cardinal: expected_balance, + ordinal: 0, + runic: None, + runes: None, + total: expected_balance, + } + ); } #[test] @@ -190,7 +223,143 @@ fn cannot_burn_inscription_sharing_utxo_with_another_inscription() { } #[test] -fn cannot_burn_with_excess_postage() { +fn json_metadata_can_be_included_when_burning() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &[], &[]); + + create_wallet(&core, &ord); + + core.mine_blocks(1); + + let (inscription, _) = inscribe(&core, &ord); + + core.mine_blocks(1); + + let output = CommandBuilder::new(format!( + "wallet burn --fee-rate 1 {inscription} --json-metadata metadata.json" + )) + .core(&core) + .ord(&ord) + .write("metadata.json", r#"{"foo": "bar", "baz": 1}"#) + .stdout_regex(r".*") + .run_and_deserialize_output::(); + + let txid = core.mempool()[0].compute_txid(); + assert_eq!(txid, output.txid); + + core.mine_blocks(1); + + 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(); + + ord.assert_html( + format!("/inscription/{inscription}"), + Chain::Mainnet, + InscriptionHtml { + charms: Charm::Burned.flag(), + fee: 138, + id: inscription, + output: Some(TxOut { + value: Amount::from_sat(1), + script_pubkey, + }), + height: 3, + inscription: Inscription { + content_type: Some("text/plain;charset=utf-8".as_bytes().into()), + body: Some("foo".as_bytes().into()), + ..default() + }, + satpoint: SatPoint { + outpoint: OutPoint { + txid: output.txid, + vout: 0, + }, + offset: 0, + }, + timestamp: "1970-01-01 00:00:03+00:00" + .parse::>() + .unwrap(), + ..default() + }, + ); +} + +#[test] +fn cbor_metadata_can_be_included_when_burning() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &[], &[]); + + create_wallet(&core, &ord); + + core.mine_blocks(1); + + let (inscription, _) = inscribe(&core, &ord); + + core.mine_blocks(1); + + let metadata = [ + 0xA2, 0x63, b'f', b'o', b'o', 0x63, b'b', b'a', b'r', 0x63, b'b', b'a', b'z', 0x01, + ]; + + let output = CommandBuilder::new(format!( + "wallet burn --fee-rate 1 {inscription} --cbor-metadata metadata.cbor" + )) + .core(&core) + .ord(&ord) + .write("metadata.cbor", metadata) + .stdout_regex(r".*") + .run_and_deserialize_output::(); + + let txid = core.mempool()[0].compute_txid(); + assert_eq!(txid, output.txid); + + core.mine_blocks(1); + + let script_pubkey = script::Builder::new() + .push_opcode(opcodes::all::OP_RETURN) + .push_slice(metadata) + .into_script(); + + ord.assert_html( + format!("/inscription/{inscription}"), + Chain::Mainnet, + InscriptionHtml { + charms: Charm::Burned.flag(), + fee: 138, + id: inscription, + output: Some(TxOut { + value: Amount::from_sat(1), + script_pubkey, + }), + height: 3, + inscription: Inscription { + content_type: Some("text/plain;charset=utf-8".as_bytes().into()), + body: Some("foo".as_bytes().into()), + ..default() + }, + satpoint: SatPoint { + outpoint: OutPoint { + txid: output.txid, + vout: 0, + }, + offset: 0, + }, + timestamp: "1970-01-01 00:00:03+00:00" + .parse::>() + .unwrap(), + ..default() + }, + ); +} + +#[test] +fn cbor_and_json_metadata_flags_conflict() { let core = mockcore::spawn(); let ord = TestServer::spawn_with_server_args(&core, &[], &[]); @@ -204,11 +373,380 @@ fn cannot_burn_with_excess_postage() { core.mine_blocks(1); CommandBuilder::new(format!( - "wallet burn --fee-rate 1 {inscription} --postage 10001sat", + "wallet burn --fee-rate 1 {inscription} --cbor-metadata foo --json-metadata bar" )) .core(&core) .ord(&ord) - .expected_stderr("error: Postage may not exceed 0.00010000 BTC\n") + .stderr_regex( + "error: the argument '--cbor-metadata ' cannot be used with '--json-metadata '.*", + ) + .expected_exit_code(2) + .run_and_extract_stdout(); +} + +#[test] +fn oversize_metadata_requires_no_limit_flag() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &[], &[]); + + create_wallet(&core, &ord); + + core.mine_blocks(1); + + let (inscription, _) = inscribe(&core, &ord); + + core.mine_blocks(1); + + CommandBuilder::new(format!( + "wallet burn --fee-rate 1 {inscription} --json-metadata metadata.json" + )) + .core(&core) + .ord(&ord) + .write("metadata.json", format!("\"{}\"", "0".repeat(79))) + .stderr_regex("error: OP_RETURN with metadata larger than maximum: 84 > 83\n") .expected_exit_code(1) .run_and_extract_stdout(); } + +#[test] +fn burn_rune() { + let core = mockcore::builder().network(Network::Regtest).build(); + + let ord = TestServer::spawn_with_server_args(&core, &["--regtest", "--index-runes"], &[]); + + create_wallet(&core, &ord); + + let rune = Rune(RUNE); + etch(&core, &ord, rune); + + core.mine_blocks(1); + + CommandBuilder::new(format!("--regtest wallet burn --fee-rate 1 500:{rune}",)) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + pretty_assert_eq!( + CommandBuilder::new("--regtest wallet balance") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(), + Balance { + cardinal: 450 * COIN_VALUE - 2 * 10000 + 129, + ordinal: 10000, + runic: Some(9871), + runes: Some( + [( + SpacedRune { rune, spacers: 0 }, + Decimal { + value: 500, + scale: 0 + } + )] + .into_iter() + .collect() + ), + total: 450 * COIN_VALUE, + } + ); + + CommandBuilder::new(format!("--regtest wallet burn --fee-rate 1 500:{rune}",)) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + pretty_assert_eq!( + CommandBuilder::new("--regtest wallet balance") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(), + Balance { + cardinal: 500 * COIN_VALUE - 10000, + ordinal: 10000, + runic: Some(0), + runes: Some(BTreeMap::new()), + total: 500 * COIN_VALUE, + } + ); +} + +#[test] +fn burn_rune_with_many_assets_in_wallet() { + let core = mockcore::builder().network(Network::Regtest).build(); + + let ord = TestServer::spawn_with_server_args(&core, &["--regtest", "--index-runes"], &[]); + + create_wallet(&core, &ord); + + core.mine_blocks(1); + + inscribe(&core, &ord); + + let rune_0 = Rune(RUNE); + etch(&core, &ord, rune_0); + + let rune_1 = Rune(RUNE - 1); + etch(&core, &ord, rune_1); + + let rune_2 = Rune(RUNE - 2); + etch(&core, &ord, rune_2); + + pretty_assert_eq!( + CommandBuilder::new("--regtest wallet balance") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(), + Balance { + cardinal: 119999930000, + ordinal: 40000, + runic: Some(30000), + runes: Some( + [ + ( + SpacedRune { + rune: rune_0, + spacers: 0 + }, + Decimal { + value: 1000, + scale: 0 + } + ), + ( + SpacedRune { + rune: rune_1, + spacers: 0 + }, + Decimal { + value: 1000, + scale: 0 + } + ), + ( + SpacedRune { + rune: rune_2, + spacers: 0 + }, + Decimal { + value: 1000, + scale: 0 + } + ) + ] + .into_iter() + .collect() + ), + total: 24 * 50 * COIN_VALUE, + } + ); + + CommandBuilder::new(format!("--regtest wallet burn --fee-rate 1 1111:{rune_0}",)) + .core(&core) + .ord(&ord) + .expected_exit_code(1) + .stderr_regex("error: insufficient `AAAAAAAAAAAAA` balance.*") + .run_and_extract_stdout(); + + CommandBuilder::new(format!("--regtest wallet burn --fee-rate 1 1000:{rune_2}",)) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + pretty_assert_eq!( + CommandBuilder::new("--regtest wallet balance") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(), + Balance { + cardinal: 124999940000, + ordinal: 40000, + runic: Some(20000), + runes: Some( + [ + ( + SpacedRune { + rune: rune_0, + spacers: 0 + }, + Decimal { + value: 1000, + scale: 0 + } + ), + ( + SpacedRune { + rune: rune_1, + spacers: 0 + }, + Decimal { + value: 1000, + scale: 0 + } + ), + ] + .into_iter() + .collect() + ), + total: 25 * 50 * COIN_VALUE, + } + ); +} + +#[test] +fn burning_rune_creates_change_output_for_non_burnt_runes() { + let core = mockcore::builder().network(Network::Regtest).build(); + + let ord = TestServer::spawn_with_server_args(&core, &["--index-runes", "--regtest"], &[]); + + create_wallet(&core, &ord); + + let a = etch(&core, &ord, Rune(RUNE)); + let b = etch(&core, &ord, Rune(RUNE + 1)); + + let (a_block, a_tx) = core.tx_index(a.output.reveal); + let (b_block, b_tx) = core.tx_index(b.output.reveal); + + core.mine_blocks(1); + + let address = CommandBuilder::new("--regtest wallet receive") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::() + .addresses + .into_iter() + .next() + .unwrap(); + + let merge = core.broadcast_tx(TransactionTemplate { + inputs: &[(a_block, a_tx, 1, default()), (b_block, b_tx, 1, default())], + recipient: Some(address.require_network(Network::Regtest).unwrap()), + ..default() + }); + + core.mine_blocks(1); + + let balances = CommandBuilder::new("--regtest --index-runes balances") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + pretty_assert_eq!( + balances, + ord::subcommand::balances::Output { + runes: [ + ( + SpacedRune::new(Rune(RUNE), 0), + [( + OutPoint { + txid: merge, + vout: 0 + }, + Pile { + amount: 1000, + divisibility: 0, + symbol: Some('¢') + }, + )] + .into() + ), + ( + SpacedRune::new(Rune(RUNE + 1), 0), + [( + OutPoint { + txid: merge, + vout: 0 + }, + Pile { + amount: 1000, + divisibility: 0, + symbol: Some('¢') + }, + )] + .into() + ), + ] + .into() + } + ); + + let output = CommandBuilder::new(format!( + "--chain regtest --index-runes wallet burn --fee-rate 1 500:{}", + Rune(RUNE) + )) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + let balances = CommandBuilder::new("--regtest --index-runes balances") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + pretty_assert_eq!( + balances, + ord::subcommand::balances::Output { + runes: [ + ( + SpacedRune::new(Rune(RUNE), 0), + [( + OutPoint { + txid: output.txid, + vout: 1 + }, + Pile { + amount: 500, + divisibility: 0, + symbol: Some('¢') + }, + )] + .into() + ), + ( + SpacedRune::new(Rune(RUNE + 1), 0), + [( + OutPoint { + txid: output.txid, + vout: 1 + }, + Pile { + amount: 1000, + divisibility: 0, + symbol: Some('¢') + }, + )] + .into() + ) + ] + .into() + } + ); + + pretty_assert_eq!( + CommandBuilder::new("--regtest --index-runes wallet balance") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(), + Balance { + cardinal: 84999970000, + ordinal: 20000, + runes: Some( + [ + (SpacedRune::new(Rune(RUNE), 0), "500".parse().unwrap()), + (SpacedRune::new(Rune(RUNE + 1), 0), "1000".parse().unwrap()) + ] + .into() + ), + runic: Some(10000), + total: 17 * 50 * COIN_VALUE, + } + ); +} diff --git a/tests/wallet/inscribe.rs b/tests/wallet/inscribe.rs index d4adccfddd..0b328f8af7 100644 --- a/tests/wallet/inscribe.rs +++ b/tests/wallet/inscribe.rs @@ -74,13 +74,13 @@ fn metaprotocol_appears_on_inscription_page() { #[test] fn inscribe_fails_if_bitcoin_core_is_too_old() { - let core = mockcore::builder().version(230000).build(); + let core = mockcore::builder().version(240000).build(); let ord = TestServer::spawn(&core); CommandBuilder::new("wallet inscribe --file hello.txt --fee-rate 1") .write("hello.txt", "HELLOWORLD") .expected_exit_code(1) - .expected_stderr("error: Bitcoin Core 24.0.0 or newer required, current version is 23.0.0\n") + .expected_stderr("error: Bitcoin Core 25.0.0 or newer required, current version is 24.0.0\n") .core(&core) .ord(&ord) .run_and_extract_stdout(); diff --git a/tests/wallet/restore.rs b/tests/wallet/restore.rs index ace4eaeaac..abf8c8c968 100644 --- a/tests/wallet/restore.rs +++ b/tests/wallet/restore.rs @@ -222,3 +222,149 @@ fn passphrase_conflicts_with_descriptor() { .expected_stderr("error: descriptor does not take a passphrase\n") .run_and_extract_stdout(); } + +#[test] +fn timestamp_conflicts_with_descriptor() { + let core = mockcore::spawn(); + let ord = TestServer::spawn(&core); + + CommandBuilder::new([ + "wallet", + "restore", + "--from", + "descriptor", + "--timestamp", + "now", + ]) + .stdin("".into()) + .core(&core) + .ord(&ord) + .expected_exit_code(1) + .expected_stderr("error: descriptor does not take a timestamp\n") + .run_and_extract_stdout(); +} + +#[test] +fn restore_with_now_timestamp() { + let mnemonic = { + let core = mockcore::spawn(); + + let create::Output { mnemonic, .. } = CommandBuilder::new(["wallet", "create"]) + .core(&core) + .run_and_deserialize_output(); + + mnemonic + }; + + let core = mockcore::spawn(); + let ord = TestServer::spawn(&core); + + CommandBuilder::new([ + "wallet", + "restore", + "--from", + "mnemonic", + "--timestamp", + "now", + ]) + .stdin(mnemonic.to_string().into()) + .core(&core) + .run_and_extract_stdout(); + + let output = CommandBuilder::new("wallet dump") + .core(&core) + .ord(&ord) + .stderr_regex(".*") + .run_and_deserialize_output::(); + + assert!(output + .descriptors + .iter() + .all(|descriptor| match descriptor.timestamp { + bitcoincore_rpc::json::Timestamp::Now => true, + bitcoincore_rpc::json::Timestamp::Time(time) => + time.abs_diff( + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() + ) <= 5, + })); +} + +#[test] +fn restore_with_no_timestamp_defaults_to_0() { + let mnemonic = { + let core = mockcore::spawn(); + + let create::Output { mnemonic, .. } = CommandBuilder::new(["wallet", "create"]) + .core(&core) + .run_and_deserialize_output(); + + mnemonic + }; + + let core = mockcore::spawn(); + let ord = TestServer::spawn(&core); + + CommandBuilder::new(["wallet", "restore", "--from", "mnemonic"]) + .stdin(mnemonic.to_string().into()) + .core(&core) + .run_and_extract_stdout(); + + let output = CommandBuilder::new("wallet dump") + .core(&core) + .ord(&ord) + .stderr_regex(".*") + .run_and_deserialize_output::(); + + assert!(output + .descriptors + .iter() + .all(|descriptor| match descriptor.timestamp { + bitcoincore_rpc::json::Timestamp::Now => false, + bitcoincore_rpc::json::Timestamp::Time(time) => time == 0, + })); +} + +#[test] +fn restore_with_timestamp() { + let mnemonic = { + let core = mockcore::spawn(); + + let create::Output { mnemonic, .. } = CommandBuilder::new(["wallet", "create"]) + .core(&core) + .run_and_deserialize_output(); + + mnemonic + }; + + let core = mockcore::spawn(); + let ord = TestServer::spawn(&core); + + CommandBuilder::new([ + "wallet", + "restore", + "--from", + "mnemonic", + "--timestamp", + "123456789", + ]) + .stdin(mnemonic.to_string().into()) + .core(&core) + .run_and_extract_stdout(); + + let output = CommandBuilder::new("wallet dump") + .core(&core) + .ord(&ord) + .stderr_regex(".*") + .run_and_deserialize_output::(); + + assert!(output + .descriptors + .iter() + .all(|descriptor| match descriptor.timestamp { + bitcoincore_rpc::json::Timestamp::Now => false, + bitcoincore_rpc::json::Timestamp::Time(time) => time == 123456789, + })); +} diff --git a/tests/wallet/send.rs b/tests/wallet/send.rs index d139c89b5e..11e2fc9602 100644 --- a/tests/wallet/send.rs +++ b/tests/wallet/send.rs @@ -39,7 +39,7 @@ fn inscriptions_can_be_sent() {
      text/plain;charset=utf-8
      .*
      location
      -
      {send_txid}:0:0
      +
      {send_txid}:0:0
      .* .*", @@ -153,7 +153,7 @@ fn send_inscription_by_sat() { ord.assert_response_regex( format!("/inscription/{inscription}"), format!( - ".*

      Inscription 0

      .*
      address
      .*
      {address}
      .*
      location
      .*
      {send_txid}:0:0
      .*", + ".*

      Inscription 0

      .*
      address
      .*
      {address}
      .*
      location
      .*
      {send_txid}:0:0
      .*", ), ); } @@ -345,7 +345,11 @@ inscriptions: output_json, api::Output { address: Some(destination.clone()), - inscriptions: vec![ + outpoint: OutPoint { + txid: reveal_txid, + vout: 0 + }, + inscriptions: Some(vec![ InscriptionId { txid: reveal_txid, index: 0 @@ -358,9 +362,9 @@ inscriptions: txid: reveal_txid, index: 2 }, - ], + ]), indexed: true, - runes: BTreeMap::new(), + runes: None, sat_ranges: Some(vec![(5_000_000_000, 5_000_030_000)]), script_pubkey: destination.assume_checked_ref().script_pubkey(), spent: false, @@ -667,7 +671,7 @@ fn send_dry_run() { .to_sat(), output.fee ); - assert_eq!(output.outgoing, Outgoing::InscriptionId(inscription)); + assert_eq!(output.asset, Outgoing::InscriptionId(inscription)); } #[test] diff --git a/tests/wallet/sign.rs b/tests/wallet/sign.rs index 9b846de23c..01340521df 100644 --- a/tests/wallet/sign.rs +++ b/tests/wallet/sign.rs @@ -20,10 +20,10 @@ fn sign() { let address = addresses.first_key_value().unwrap().0; - let message = "HelloWorld"; + let text = "HelloWorld"; let sign = CommandBuilder::new(format!( - "wallet sign --address {} --message {message}", + "wallet sign --signer {} --text {text}", address.clone().assume_checked(), )) .core(&core) @@ -31,10 +31,9 @@ fn sign() { .run_and_deserialize_output::(); assert_eq!(address, &sign.address); - assert_eq!(message, &sign.message); CommandBuilder::new(format!( - "verify --address {} --message {message} --witness {}", + "verify --address {} --text {text} --witness {}", address.clone().assume_checked(), sign.witness, )) @@ -42,3 +41,108 @@ fn sign() { .ord(&ord) .run_and_extract_stdout(); } + +#[test] +fn sign_file() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &[], &[]); + + create_wallet(&core, &ord); + + core.mine_blocks(1); + + let addresses = CommandBuilder::new("wallet addresses") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::, Vec>>(); + + let address = addresses.first_key_value().unwrap().0; + + let sign = CommandBuilder::new(format!( + "wallet sign --signer {} --file hello.txt", + address.clone().assume_checked(), + )) + .write("hello.txt", "Hello World") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + assert_eq!(address, &sign.address); + + CommandBuilder::new(format!( + "verify --address {} --file hello.txt --witness {}", + address.clone().assume_checked(), + sign.witness, + )) + .write("hello.txt", "Hello World") + .core(&core) + .ord(&ord) + .run_and_extract_stdout(); + + CommandBuilder::new(format!( + "verify --address {} --file hello.txt --witness {}", + address.clone().assume_checked(), + sign.witness, + )) + .write("hello.txt", "FAIL") + .core(&core) + .ord(&ord) + .expected_exit_code(1) + .stderr_regex("error: Invalid signature.*") + .run_and_extract_stdout(); +} + +#[test] +fn sign_for_inscription() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &[], &[]); + + create_wallet(&core, &ord); + + let (inscription, _reveal) = inscribe(&core, &ord); + + core.mine_blocks(1); + + let addresses = CommandBuilder::new("wallet addresses") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::, Vec>>(); + + let text = "HelloWorld"; + + let sign = CommandBuilder::new(format!("wallet sign --signer {inscription} --text {text}",)) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + assert!(addresses.contains_key(&sign.address)); +} + +#[test] +fn sign_for_output() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &[], &[]); + + create_wallet(&core, &ord); + + core.mine_blocks(1); + + let addresses = CommandBuilder::new("wallet addresses") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::, Vec>>(); + + let output = addresses.first_key_value().unwrap().1[0].output; + + let text = "HelloWorld"; + + let sign = CommandBuilder::new(format!("wallet sign --signer {output} --text {text}",)) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + assert!(addresses.contains_key(&sign.address)); +}
      - {{ outpoint }} + + {{ outpoint }} + {{ balance }}