diff --git a/CHANGELOG.md b/CHANGELOG.md index 117b8d755c..fbfb76b64e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,58 @@ Changelog ========= -[0.18.5](https://github.com/ordinals/ord/releases/tag/0.18.5) - 2023-05-09 +[0.19.0](https://github.com/ordinals/ord/releases/tag/0.19.0) - 2024-07-09 +-------------------------------------------------------------------------- + +### Added +- Add inscriptions to address page ([#3843](https://github.com/ordinals/ord/pull/3843) by [raphjaph](https://github.com/raphjaph)) +- Add ability to cancel shutdown ([#3820](https://github.com/ordinals/ord/pull/3820) by [felipelincoln](https://github.com/felipelincoln)) +- Add charm to burned inscriptions ([#3836](https://github.com/ordinals/ord/pull/3836) by [onchainguy-btc](https://github.com/onchainguy-btc)) +- Display aggregated rune balances in address page ([#3831](https://github.com/ordinals/ord/pull/3831) by [yoitsyoung](https://github.com/yoitsyoung)) +- Add --all flag on `ord wallet sats` ([#3824](https://github.com/ordinals/ord/pull/3824) by [cryptoni9n](https://github.com/cryptoni9n)) +- Add sat ranges to output ([#3817](https://github.com/ordinals/ord/pull/3817) by [cryptoni9n](https://github.com/cryptoni9n)) +- Add sat name to inscription page ([#3826](https://github.com/ordinals/ord/pull/3826) by [cryptoni9n](https://github.com/cryptoni9n)) +- Add public `shut_down()` function ([#3811](https://github.com/ordinals/ord/pull/3811) by [felipelincoln](https://github.com/felipelincoln)) +- Add all transaction hex to block json response ([#3805](https://github.com/ordinals/ord/pull/3805) by [thewrlck](https://github.com/thewrlck)) +- Make Index public ([#3807](https://github.com/ordinals/ord/pull/3807) by [felipelincoln](https://github.com/felipelincoln)) +- Add sat balance to address page ([#3810](https://github.com/ordinals/ord/pull/3810) by [raphjaph](https://github.com/raphjaph)) +- Add --http-port to settings yaml ([#3796](https://github.com/ordinals/ord/pull/3796) by [raphjaph](https://github.com/raphjaph)) +- Make settings public ([#3800](https://github.com/ordinals/ord/pull/3800) by [felipelincoln](https://github.com/felipelincoln)) +- Make recursive endpoints proxiable ([#3797](https://github.com/ordinals/ord/pull/3797) by [raphjaph](https://github.com/raphjaph)) +- Add recursive endpoint with more details about children ([#3771](https://github.com/ordinals/ord/pull/3771) by [gmart7t2](https://github.com/gmart7t2)) +- Add delegate value to recursive inscription endpoint ([#3751](https://github.com/ordinals/ord/pull/3751) by [phorkish](https://github.com/phorkish)) +- Update `ord list` to include inscriptions and runes information ([#3766](https://github.com/ordinals/ord/pull/3766) by [cryptoni9n](https://github.com/cryptoni9n)) +- Add feerate percentiles to blockinfo endpoint ([#3753](https://github.com/ordinals/ord/pull/3753) by [benbuschmann](https://github.com/benbuschmann)) +- Add mint progress field to rune.html ([#3748](https://github.com/ordinals/ord/pull/3748) by [cryptoni9n](https://github.com/cryptoni9n)) +- Add /inscription/:query/:child_number route ([#3777](https://github.com/ordinals/ord/pull/3777) by [casey](https://github.com/casey)) +- Add parents recursive endpoint ([#3749](https://github.com/ordinals/ord/pull/3749) by [phorkish](https://github.com/phorkish)) +- Index addresses ([#3757](https://github.com/ordinals/ord/pull/3757) by [raphjaph](https://github.com/raphjaph)) +- Make settings public ([#3768](https://github.com/ordinals/ord/pull/3768) by [raphjaph](https://github.com/raphjaph)) +- Add decode api ([#3733](https://github.com/ordinals/ord/pull/3733) by [shadowv0vshadow](https://github.com/shadowv0vshadow)) +- Add command to list pending etchings ([#3732](https://github.com/ordinals/ord/pull/3732) by [ldiego08](https://github.com/ldiego08)) +- Add `ord wallet runics` command ([#3734](https://github.com/ordinals/ord/pull/3734) by [ldiego08](https://github.com/ldiego08)) + +### Changed +- Enable resuming a specific rune etching ([#3679](https://github.com/ordinals/ord/pull/3679) by [ldiego08](https://github.com/ldiego08)) + +### Fixed +- Fix panic in ord env shutdown ([#3787](https://github.com/ordinals/ord/pull/3787) by [cryptoni9n](https://github.com/cryptoni9n)) +- Allow postage equal to dust limit in mint.rs ([#3756](https://github.com/ordinals/ord/pull/3756) by [gmart7t2](https://github.com/gmart7t2)) +- Update index.rs to fix ord list command ([#3762](https://github.com/ordinals/ord/pull/3762) by [cryptoni9n](https://github.com/cryptoni9n)) + +### Misc +- Update Spanish Translation ([#3835](https://github.com/ordinals/ord/pull/3835) by [Zerone495](https://github.com/Zerone495)) +- Add debugging tips README ([#3823](https://github.com/ordinals/ord/pull/3823) by [nick07002](https://github.com/nick07002)) +- Add typed errors with `snafu` ([#3832](https://github.com/ordinals/ord/pull/3832) by [casey](https://github.com/casey)) +- Add -dev suffix to version ([#3812](https://github.com/ordinals/ord/pull/3812) by [casey](https://github.com/casey)) +- Link address on output & tx ([#3799](https://github.com/ordinals/ord/pull/3799) by [cryptoni9n](https://github.com/cryptoni9n)) +- Link address on inscription.html ([#3801](https://github.com/ordinals/ord/pull/3801) by [cryptoni9n](https://github.com/cryptoni9n)) +- Fix fuzz testers ([#3740](https://github.com/ordinals/ord/pull/3740) by [jeasonstudio](https://github.com/jeasonstudio)) +- Remove duplicate example ([#3776](https://github.com/ordinals/ord/pull/3776) by [gmart7t2](https://github.com/gmart7t2)) +- Update runes spec ([#3745](https://github.com/ordinals/ord/pull/3745) by [gmart7t2](https://github.com/gmart7t2)) +- Clarify teleburning.md ([#3744](https://github.com/ordinals/ord/pull/3744) by [gmart7t2](https://github.com/gmart7t2)) + +[0.18.5](https://github.com/ordinals/ord/releases/tag/0.18.5) - 2024-05-09 -------------------------------------------------------------------------- ### Added @@ -15,7 +66,7 @@ Changelog - Patch some omissions in the Chinese translation ([#3694](https://github.com/ordinals/ord/pull/3694) by [shadowv0vshadow](https://github.com/shadowv0vshadow)) - Bump rustfmt version 2018 to 2021 ([#3721](https://github.com/ordinals/ord/pull/3721) by [bingryan](https://github.com/bingryan)) -[0.18.4](https://github.com/ordinals/ord/releases/tag/0.18.4) - 2023-05-02 +[0.18.4](https://github.com/ordinals/ord/releases/tag/0.18.4) - 2024-05-02 -------------------------------------------------------------------------- ### Added @@ -41,7 +92,7 @@ Changelog - Fix zh.po translations ([#3588](https://github.com/ordinals/ord/pull/3588) by [losingle](https://github.com/losingle)) - Update sparrow-wallet.md --name flag update ([#3635](https://github.com/ordinals/ord/pull/3635) by [taha-abbasi](https://github.com/taha-abbasi)) -[0.18.3](https://github.com/ordinals/ord/releases/tag/0.18.3) - 2023-04-19 +[0.18.3](https://github.com/ordinals/ord/releases/tag/0.18.3) - 2024-04-19 -------------------------------------------------------------------------- ### Added @@ -63,7 +114,7 @@ Changelog - Address runes review comments ([#3605](https://github.com/ordinals/ord/pull/3605) by [casey](https://github.com/casey)) - Generate sample batch.yaml in env command ([#3530](https://github.com/ordinals/ord/pull/3530) by [twosatsmaxi](https://github.com/twosatsmaxi)) -[0.18.2](https://github.com/ordinals/ord/releases/tag/0.18.2) - 2023-04-17 +[0.18.2](https://github.com/ordinals/ord/releases/tag/0.18.2) - 2024-04-17 -------------------------------------------------------------------------- ### Migration @@ -95,13 +146,13 @@ Changelog - Fix typo in recursion docs ([#3529](https://github.com/ordinals/ord/pull/3529) by [nix-eth](https://github.com/nix-eth)) - Put rune higher on /inscription ([#3363](https://github.com/ordinals/ord/pull/3363) by [lugondev](https://github.com/lugondev)) -[0.18.1](https://github.com/ordinals/ord/releases/tag/0.18.1) - 2023-04-11 +[0.18.1](https://github.com/ordinals/ord/releases/tag/0.18.1) - 2024-04-11 -------------------------------------------------------------------------- ### Fixed - Fix off-by-one in wallet when waiting for etching commitment to mature ([#3515](https://github.com/ordinals/ord/pull/3515) by [casey](https://github.com/casey)) -[0.18.0](https://github.com/ordinals/ord/releases/tag/0.18.0) - 2023-04-10 +[0.18.0](https://github.com/ordinals/ord/releases/tag/0.18.0) - 2024-04-10 -------------------------------------------------------------------------- ### Fixed @@ -136,17 +187,18 @@ Changelog - Fix deploy bitcoin.conf typo ([#3443](https://github.com/ordinals/ord/pull/3443) by [bitspill](https://github.com/bitspill)) - Fix type in runes docs ([#3447](https://github.com/ordinals/ord/pull/3447) by [twosatsmaxi](https://github.com/twosatsmaxi)) -[0.17.1](https://github.com/ordinals/ord/releases/tag/0.17.1) - 2023-04-01 +[0.17.1](https://github.com/ordinals/ord/releases/tag/0.17.1) - 2024-04-01 -------------------------------------------------------------------------- ### Fixed - Ignore invalid script pubkeys ([#3432](https://github.com/ordinals/ord/pull/3432) by [casey](https://github.com/casey)) + ### Misc - Fix typo ([#3429](https://github.com/ordinals/ord/pull/3429) by [lugondev](https://github.com/lugondev)) - Relax deployed Bitcoin Core relay rules ([#3431](https://github.com/ordinals/ord/pull/3431) by [casey](https://github.com/casey)) -[0.17.0](https://github.com/ordinals/ord/releases/tag/0.17.0) - 2023-03-31 +[0.17.0](https://github.com/ordinals/ord/releases/tag/0.17.0) - 2024-03-31 -------------------------------------------------------------------------- ### Added @@ -238,7 +290,7 @@ Changelog - Add recipe to delete indices ([#3266](https://github.com/ordinals/ord/pull/3266) by [casey](https://github.com/casey)) - Bump ordinals version: 0.0.3 → 0.0.4 ([#3267](https://github.com/ordinals/ord/pull/3267) by [casey](https://github.com/casey)) -[0.16.0](https://github.com/ordinals/ord/releases/tag/0.16.0) - 2023-03-11 +[0.16.0](https://github.com/ordinals/ord/releases/tag/0.16.0) - 2024-03-11 -------------------------------------------------------------------------- ### Added @@ -341,7 +393,7 @@ Changelog - Optimize get_inscription_ids_by_sat_paginated ([#2996](https://github.com/ordinals/ord/pull/2996) by [casey](https://github.com/casey)) - Add recipe to deploy to all servers in fleet ([#2992](https://github.com/ordinals/ord/pull/2992) by [casey](https://github.com/casey)) -[0.15.0](https://github.com/ordinals/ord/releases/tag/0.15.0) - 2023-01-08 +[0.15.0](https://github.com/ordinals/ord/releases/tag/0.15.0) - 2024-01-08 -------------------------------------------------------------------------- ### Added @@ -369,7 +421,7 @@ Changelog - Remove quotes around key to allow shell expansion ([#2951](https://github.com/ordinals/ord/pull/2951) by [casey](https://github.com/casey)) - Restart sshd in deploy script ([#2952](https://github.com/ordinals/ord/pull/2952) by [raphjaph](https://github.com/raphjaph)) -[0.14.1](https://github.com/ordinals/ord/releases/tag/0.14.1) - 2023-01-03 +[0.14.1](https://github.com/ordinals/ord/releases/tag/0.14.1) - 2024-01-03 -------------------------------------------------------------------------- ### Fixed @@ -378,7 +430,7 @@ Changelog ## Misc - Clean up justfile ([#2939](https://github.com/ordinals/ord/pull/2939) by [casey](https://github.com/casey)) -[0.14.0](https://github.com/ordinals/ord/releases/tag/0.14.0) - 2023-01-02 +[0.14.0](https://github.com/ordinals/ord/releases/tag/0.14.0) - 2024-01-02 -------------------------------------------------------------------------- ### Fixed diff --git a/Cargo.lock b/Cargo.lock index 29813d15bb..e52b5b0281 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -94,9 +94,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" dependencies = [ "backtrace", ] @@ -176,22 +176,21 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.3.0", - "event-listener-strategy 0.5.2", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-compression" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9eabd7a98fe442131a17c316bd9349c43695e49e730c3c8e12cfb5f4da2693" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" dependencies = [ "brotli", "flate2", @@ -220,7 +219,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock 2.8.0", + "async-lock", "autocfg", "cfg-if 1.0.0", "concurrent-queue", @@ -243,17 +242,6 @@ dependencies = [ "event-listener 2.5.3", ] -[[package]] -name = "async-lock" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" -dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", - "pin-project-lite", -] - [[package]] name = "async-net" version = "1.8.0" @@ -273,13 +261,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -329,9 +317,9 @@ dependencies = [ [[package]] name = "atom_syndication" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571832dcff775e26562e8e6930cd483de5587301d40d3a3b85d532b6383e15a7" +checksum = "f2f34613907f31c9dbef0240156db3c9263f34842b6e1a8999d2304ea62c8a30" dependencies = [ "chrono", "derive_builder", @@ -439,9 +427,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -476,12 +464,6 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" -[[package]] -name = "bech32" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" - [[package]] name = "bip39" version = "2.0.0" @@ -499,7 +481,7 @@ version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" dependencies = [ - "bech32 0.9.1", + "bech32", "bitcoin-private", "bitcoin_hashes 0.12.0", "hex_lit", @@ -537,9 +519,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" @@ -552,12 +534,11 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock 3.3.0", "async-task", "futures-io", "futures-lite 2.3.0", @@ -570,19 +551,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1906889b1f805a715eac02b2dea416e25c5cfa00f099530fa9d137a3cff93113" dependencies = [ - "darling 0.20.8", + "darling", "mime", "new_mime_guess", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] name = "brotli" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19483b140a7ac7174d34b5a581b406c64f84da5409d3e09cf4fff604f9270e67" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -591,9 +572,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6221fe77a248b9117d431ad93761222e1cf8ff282d9d1d5d9f53d6299a1cf76" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -635,9 +616,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.97" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" +checksum = "eaff6f8ce506b9773fa786672d63fc7a191ffea1be33f72bbd4aeacefca9ffc8" [[package]] name = "cfg-if" @@ -657,6 +638,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.38" @@ -669,7 +656,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -701,9 +688,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" dependencies = [ "clap_builder", "clap_derive", @@ -711,33 +698,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "colorchoice" @@ -810,9 +797,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if 1.0.0", ] @@ -874,9 +861,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -900,78 +887,43 @@ version = "3.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "672465ae37dc1bc6380a6547a8883d5dd397b0f1faaad4f265726cc7042a5345" dependencies = [ - "nix", + "nix 0.28.0", "windows-sys 0.52.0", ] [[package]] name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", -] - -[[package]] -name = "darling_core" -version = "0.14.4" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.61", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", + "strsim", + "syn 2.0.70", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.8", + "darling_core", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -1006,46 +958,46 @@ dependencies = [ [[package]] name = "derive_builder" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" +checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" +checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" dependencies = [ - "darling 0.14.4", + "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.70", ] [[package]] name = "derive_builder_macro" -version = "0.12.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" +checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 1.0.109", + "syn 2.0.70", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.70", ] [[package]] @@ -1096,20 +1048,20 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -1173,43 +1125,22 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "4.0.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", "pin-project-lite", ] -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - [[package]] name = "event-listener-strategy" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.3.0", + "event-listener 5.3.1", "pin-project-lite", ] @@ -1355,7 +1286,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -1418,15 +1349,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "getopts" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -dependencies = [ - "unicode-width", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -1440,9 +1362,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "globset" @@ -1600,9 +1522,9 @@ checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1618,9 +1540,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -1729,9 +1651,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if 1.0.0", ] @@ -1877,15 +1799,15 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libredox" @@ -1893,7 +1815,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -1905,9 +1827,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -1921,9 +1843,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchit" @@ -1939,9 +1861,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1951,9 +1873,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -1977,9 +1899,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -1999,7 +1921,7 @@ dependencies = [ name = "mockcore" version = "0.0.1" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bitcoin", "hex", "jsonrpc-core", @@ -2028,11 +1950,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2077,9 +1998,21 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if 1.0.0", - "cfg_aliases", + "cfg_aliases 0.1.1", + "libc", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.6.0", + "cfg-if 1.0.0", + "cfg_aliases 0.2.1", "libc", ] @@ -2110,9 +2043,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", @@ -2172,9 +2105,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] @@ -2196,9 +2129,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "openssl" @@ -2206,7 +2139,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if 1.0.0", "foreign-types", "libc", @@ -2223,7 +2156,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -2252,14 +2185,13 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ord" -version = "0.18.5" +version = "0.19.0" dependencies = [ "anyhow", "async-trait", "axum", "axum-server", "base64 0.22.1", - "bech32 0.11.0", "bip39", "bitcoin", "boilerplate", @@ -2287,11 +2219,10 @@ dependencies = [ "miniscript", "mockcore", "mp4", - "nix", + "nix 0.29.0", "ord-bitcoincore-rpc", "ordinals", "pretty_assertions", - "pulldown-cmark", "redb", "regex", "reqwest", @@ -2305,6 +2236,7 @@ dependencies = [ "serde_with", "serde_yaml", "sha3", + "snafu", "sysinfo", "tempfile", "tokio", @@ -2343,7 +2275,7 @@ dependencies = [ [[package]] name = "ordinals" -version = "0.0.8" +version = "0.0.9" dependencies = [ "bitcoin", "derive_more", @@ -2417,7 +2349,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -2434,9 +2366,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", "fastrand 2.1.0", @@ -2451,9 +2383,9 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plotters" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" dependencies = [ "num-traits", "plotters-backend", @@ -2464,15 +2396,15 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" [[package]] name = "plotters-svg" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" dependencies = [ "plotters-backend", ] @@ -2532,37 +2464,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] -[[package]] -name = "pulldown-cmark" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76979bea66e7875e7509c4ec5300112b316af87fa7a252ca91c448b32dfe3993" -dependencies = [ - "bitflags 2.5.0", - "getopts", - "memchr", - "pulldown-cmark-escape", - "unicase", -] - -[[package]] -name = "pulldown-cmark-escape" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348ff538bc9caeda7ee8cad2d1d48236a1f443c1fa3913c6a02fe0043b1dd3" - [[package]] name = "quick-xml" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" dependencies = [ "encoding_rs", "memchr", @@ -2641,9 +2554,9 @@ dependencies = [ [[package]] name = "redb" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7508e692a49b6b2290b56540384ccae9b1fb4d77065640b165835b56ffe3bb" +checksum = "a6dd20d3cdeb9c7d2366a0b16b93b35b75aec15309fbeb7ce477138c9f68c8c0" dependencies = [ "libc", ] @@ -2670,9 +2583,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -2682,9 +2595,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -2693,9 +2606,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -2771,9 +2684,9 @@ dependencies = [ [[package]] name = "rss" -version = "2.0.7" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b2c77eb4450d7d5f98df52c381cd6c4e19b75dad9209a9530b85a44510219a" +checksum = "2f374fd66bb795938b78c021db1662d43a8ffbc42ec1ac25429fc4833b732751" dependencies = [ "atom_syndication", "derive_builder", @@ -2783,9 +2696,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.3.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" +checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -2794,22 +2707,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.3.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" +checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.61", + "syn 2.0.70", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.3.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" +checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" dependencies = [ "sha2", "walkdir", @@ -2859,10 +2772,10 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] @@ -2887,7 +2800,7 @@ dependencies = [ "log", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.3", + "rustls-webpki 0.102.5", "subtle", "zeroize", ] @@ -2948,9 +2861,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -2959,9 +2872,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" @@ -3030,7 +2943,7 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3055,9 +2968,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.201" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] @@ -3075,20 +2988,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.201" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "indexmap 2.2.6", "itoa", @@ -3120,9 +3033,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.1" +version = "3.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377" dependencies = [ "base64 0.22.1", "chrono", @@ -3138,14 +3051,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.1" +version = "3.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +checksum = "b80d3d6b56b64335c0180e5ffde23b3c5e08c14c585b51a15bd0e95393f46703" dependencies = [ - "darling 0.20.8", + "darling", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -3206,6 +3119,27 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "snafu" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b835cb902660db3415a672d862905e791e54d306c6e8189168c7f3d9ae1c79d" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d1e02fca405f6280643174a50c942219f0bbf4dbf7d480f1dd864d6f211ae5" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.70", +] + [[package]] name = "socket2" version = "0.4.10" @@ -3238,12 +3172,6 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -3274,9 +3202,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3291,9 +3219,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.61" +version = "2.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" +checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" dependencies = [ "proc-macro2", "quote", @@ -3320,9 +3248,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.12" +version = "0.30.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "732ffa00f53e6b2af46208fba5718d9662a421049204e156328b66791ffa15ae" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" dependencies = [ "cfg-if 1.0.0", "core-foundation-sys", @@ -3368,22 +3296,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -3429,9 +3357,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -3444,9 +3372,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -3461,13 +3389,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", ] [[package]] @@ -3562,7 +3490,7 @@ checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" dependencies = [ "async-compression", "base64 0.21.7", - "bitflags 2.5.0", + "bitflags 2.6.0", "bytes", "futures-core", "futures-util", @@ -3653,9 +3581,9 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -3696,9 +3624,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -3719,9 +3647,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "vcpkg" @@ -3737,9 +3665,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" @@ -3787,7 +3715,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", "wasm-bindgen-shared", ] @@ -3821,7 +3749,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.61", + "syn 2.0.70", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3886,7 +3814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3895,7 +3823,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3913,7 +3841,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3933,18 +3861,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -3955,9 +3883,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -3967,9 +3895,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -3979,15 +3907,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -3997,9 +3925,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4009,9 +3937,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4021,9 +3949,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4033,9 +3961,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" @@ -4082,6 +4010,6 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index 4a9c092334..396d1af61d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ord" description = "◉ Ordinal wallet and block explorer" -version = "0.18.5" +version = "0.19.0" license = "CC0-1.0" edition = "2021" autotests = false @@ -23,11 +23,10 @@ async-trait = "0.1.72" axum = { version = "0.6.1", features = ["http2"] } axum-server = "0.5.0" base64 = "0.22.0" -bech32 = "0.11.0" bip39 = "2.0.0" bitcoin = { version = "0.30.1", features = ["rand"] } boilerplate = { version = "1.0.0", features = ["axum"] } -brotli = "5.0.0" +brotli = "6.0.0" chrono = { version = "0.4.19", features = ["serde"] } ciborium = "0.2.1" clap = { version = "4.4.2", features = ["derive"] } @@ -49,7 +48,7 @@ mime_guess = "2.0.4" miniscript = "10.0.0" mp4 = "0.14.0" ord-bitcoincore-rpc = "0.17.2" -ordinals = { version = "0.0.8", path = "crates/ordinals" } +ordinals = { version = "0.0.9", path = "crates/ordinals" } redb = "2.0.0" regex = "1.6.0" reqwest = { version = "0.11.23", features = ["blocking", "json"] } @@ -63,6 +62,7 @@ serde_json = { version = "1.0.81", features = ["preserve_order"] } serde_with = "3.7.0" serde_yaml = "0.9.17" sha3 = "0.10.8" +snafu = "0.8.3" sysinfo = "0.30.3" tempfile = "3.2.0" tokio = { version = "1.17.0", features = ["rt-multi-thread"] } @@ -74,7 +74,7 @@ urlencoding = "2.1.3" [dev-dependencies] criterion = "0.5.1" executable-path = "1.0.0" -nix = { version = "0.28.0", features = ["signal"] } +nix = { version = "0.29.0", features = ["signal"] } pretty_assertions = "1.2.1" reqwest = { version = "0.11.10", features = ["blocking", "brotli", "json"] } mockcore = { path = "crates/mockcore" } @@ -91,6 +91,3 @@ path = "src/lib.rs" [[test]] name = "integration" path = "tests/lib.rs" - -[build-dependencies] -pulldown-cmark = "0.10.0" diff --git a/README.md b/README.md index 3f4465ef7a..52e0c17b6e 100644 --- a/README.md +++ b/README.md @@ -266,6 +266,13 @@ the server and show `info`-level log messages and above: $ RUST_LOG=info cargo run server ``` +Set the `RUST_BACKTRACE` environment variable in order to turn on full rust +backtrace. For example, run the server and turn on debugging and full backtrace: + +``` +$ RUST_BACKTRACE=1 RUST_LOG=debug ord server +``` + New Releases ------------ diff --git a/crates/mockcore/Cargo.toml b/crates/mockcore/Cargo.toml index 9f76e6ee19..98d9c2475e 100644 --- a/crates/mockcore/Cargo.toml +++ b/crates/mockcore/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/ordinals/ord" [dependencies] bitcoin = { version = "0.30.0", features = ["serde", "rand"] } -base64 = "0.21.0" +base64 = "0.22.0" hex = "0.4.3" jsonrpc-core = "18.0.0" jsonrpc-derive = "18.0.0" diff --git a/crates/mockcore/src/lib.rs b/crates/mockcore/src/lib.rs index d9b76f0489..be20d32dcc 100644 --- a/crates/mockcore/src/lib.rs +++ b/crates/mockcore/src/lib.rs @@ -133,6 +133,7 @@ pub struct TransactionTemplate<'a> { pub inputs: &'a [(usize, usize, usize, Witness)], pub op_return: Option, pub op_return_index: Option, + pub op_return_value: Option, pub output_values: &'a [u64], pub outputs: usize, pub p2tr: bool, @@ -179,6 +180,7 @@ impl<'a> Default for TransactionTemplate<'a> { inputs: &[], op_return: None, op_return_index: None, + op_return_value: None, output_values: &[], outputs: 1, p2tr: false, diff --git a/crates/mockcore/src/state.rs b/crates/mockcore/src/state.rs index ff58957074..be3a9dce5e 100644 --- a/crates/mockcore/src/state.rs +++ b/crates/mockcore/src/state.rs @@ -248,7 +248,7 @@ impl State { tx.output.insert( template.op_return_index.unwrap_or(tx.output.len()), TxOut { - value: 0, + value: template.op_return_value.unwrap_or_default(), script_pubkey, }, ); diff --git a/crates/ordinals/Cargo.toml b/crates/ordinals/Cargo.toml index fae0b8ccae..7215329e4f 100644 --- a/crates/ordinals/Cargo.toml +++ b/crates/ordinals/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ordinals" -version = "0.0.8" +version = "0.0.9" edition = "2021" description = "Library for interoperating with ordinals and inscriptions" homepage = "https://github.com/ordinals/ord" diff --git a/crates/ordinals/src/charm.rs b/crates/ordinals/src/charm.rs index 0331be9306..53e4aae770 100644 --- a/crates/ordinals/src/charm.rs +++ b/crates/ordinals/src/charm.rs @@ -14,10 +14,11 @@ pub enum Charm { Uncommon = 9, Vindicated = 10, Mythic = 11, + Burned = 12, } impl Charm { - pub const ALL: [Self; 12] = [ + pub const ALL: [Self; 13] = [ Self::Coin, Self::Uncommon, Self::Rare, @@ -30,6 +31,7 @@ impl Charm { Self::Unbound, Self::Lost, Self::Vindicated, + Self::Burned, ]; fn flag(self) -> u16 { @@ -50,18 +52,19 @@ impl Charm { pub fn icon(self) -> &'static str { match self { + Self::Burned => "🔥", Self::Coin => "🪙", Self::Cursed => "👹", Self::Epic => "🪻", Self::Legendary => "🌝", Self::Lost => "🤔", Self::Mythic => "🎃", - Self::Nineball => "9️⃣", + Self::Nineball => "\u{39}\u{fe0f}\u{20e3}", Self::Rare => "🧿", Self::Reinscription => "♻️", Self::Unbound => "🔓", Self::Uncommon => "🌱", - Self::Vindicated => "❤️‍🔥", + Self::Vindicated => "\u{2764}\u{fe0f}\u{200d}\u{1f525}", } } @@ -79,6 +82,7 @@ impl Display for Charm { f, "{}", match self { + Self::Burned => "burned", Self::Coin => "coin", Self::Cursed => "cursed", Self::Epic => "epic", @@ -101,6 +105,7 @@ impl FromStr for Charm { fn from_str(s: &str) -> Result { Ok(match s { + "burned" => Self::Burned, "coin" => Self::Coin, "cursed" => Self::Cursed, "epic" => Self::Epic, diff --git a/deploy/ord.service b/deploy/ord.service index 883b54db59..a9812d34f9 100644 --- a/deploy/ord.service +++ b/deploy/ord.service @@ -13,6 +13,7 @@ ExecStart=/usr/local/bin/ord \ --chain ${CHAIN} \ --config-dir /var/lib/ord \ --datadir /var/lib/ord \ + --index-addresses \ --index-runes \ --index-sats \ server \ diff --git a/docs/po/es.po b/docs/po/es.po index 79b2199fc1..763722ec8b 100644 --- a/docs/po/es.po +++ b/docs/po/es.po @@ -1,179 +1,185 @@ msgid "" msgstr "" "Project-Id-Version: Manual de la Teoria Ordinal\n" -"POT-Creation-Date: \n" -"PO-Revision-Date: 2023-09-12 08:03-0600\n" +"POT-Creation-Date: 2024-06-29T00:05:48-05:00\n" +"PO-Revision-Date: 2024-06-29 17:59-0500\n" "Last-Translator: Zerone @0xZerone \n" "Language-Team: Spanish\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: es\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.4\n" -#: src/SUMMARY.md:2 -#: src/introduction.md:1 +#: src/SUMMARY.md:1 +msgid "Summary" +msgstr "Resumen" + +#: src/SUMMARY.md:4 src/introduction.md:1 msgid "Introduction" msgstr "Introducción" -#: src/SUMMARY.md:3 +#: src/SUMMARY.md:5 msgid "Overview" msgstr "Descripción General" -#: src/SUMMARY.md:4 -#: src/digital-artifacts.md:1 +#: src/SUMMARY.md:6 src/digital-artifacts.md:1 msgid "Digital Artifacts" msgstr "Artefactos Digitales" -#: src/SUMMARY.md:5 -#: src/SUMMARY.md:13 -#: src/overview.md:221 -#: src/inscriptions.md:1 +#: src/SUMMARY.md:7 src/overview.md:221 src/inscriptions.md:1 msgid "Inscriptions" msgstr "Inscripciones" -#: src/SUMMARY.md:6 -#: src/inscriptions/provenance.md:1 +#: src/SUMMARY.md:8 src/inscriptions/delegate.md:1 +msgid "Delegate" +msgstr "Delegado" + +#: src/SUMMARY.md:9 src/inscriptions/metadata.md:1 +msgid "Metadata" +msgstr "Metadatos" + +#: src/SUMMARY.md:10 src/inscriptions/pointer.md:1 src/runes.md:135 src/runes/specification.md:320 +msgid "Pointer" +msgstr "Puntero" + +#: src/SUMMARY.md:11 src/inscriptions/provenance.md:1 msgid "Provenance" -msgstr "Procedencia" +msgstr "Proveniencia" -#: src/SUMMARY.md:7 -#: src/inscriptions/recursion.md:1 +#: src/SUMMARY.md:12 src/inscriptions/recursion.md:1 msgid "Recursion" msgstr "Recursión" -#: src/SUMMARY.md:8 +#: src/SUMMARY.md:13 src/inscriptions/rendering.md:1 +msgid "Rendering" +msgstr "Renderizado" + +#: src/SUMMARY.md:14 src/runes.md:1 +msgid "Runes" +msgstr "Runas" + +#: src/SUMMARY.md:15 src/inscriptions/delegate.md:9 src/inscriptions/provenance.md:14 +msgid "Specification" +msgstr "Especificación" + +#: src/SUMMARY.md:16 msgid "FAQ" msgstr "Preguntas Frecuentes" -#: src/SUMMARY.md:9 +#: src/SUMMARY.md:17 msgid "Contributing" msgstr "Contribuir" -#: src/SUMMARY.md:10 -#: src/donate.md:1 +#: src/SUMMARY.md:18 src/donate.md:1 msgid "Donate" msgstr "Donaciones" -#: src/SUMMARY.md:11 +#: src/SUMMARY.md:19 msgid "Guides" msgstr "Guías" -#: src/SUMMARY.md:12 +#: src/SUMMARY.md:20 msgid "Explorer" msgstr "Explorador" -#: src/SUMMARY.md:14 -#: src/guides/sat-hunting.md:1 -msgid "Sat Hunting" -msgstr "Caza de Sats" +#: src/SUMMARY.md:21 src/guides/wallet.md:1 +msgid "Wallet" +msgstr "Monedero" -#: src/SUMMARY.md:15 -#: src/guides/collecting.md:1 +#: src/SUMMARY.md:22 src/guides/batch-inscribing.md:1 +msgid "Batch Inscribing" +msgstr "Inscribiendo por Lotes" + +#: src/SUMMARY.md:23 src/guides/collecting.md:1 msgid "Collecting" msgstr "Coleccionar" -#: src/SUMMARY.md:16 -#: src/guides/sat-hunting.md:239 +#: src/SUMMARY.md:24 src/guides/sat-hunting.md:233 msgid "Sparrow Wallet" msgstr "Monedero Sparrow" -#: src/SUMMARY.md:17 -#: src/guides/testing.md:1 -msgid "Testing" -msgstr "Pruebas" - -#: src/SUMMARY.md:18 -#: src/guides/moderation.md:1 +#: src/SUMMARY.md:25 src/guides/moderation.md:1 msgid "Moderation" msgstr "Moderación" -#: src/SUMMARY.md:19 -#: src/guides/reindexing.md:1 +#: src/SUMMARY.md:26 src/guides/reindexing.md:1 msgid "Reindexing" msgstr "Reindexación" -#: src/SUMMARY.md:20 +#: src/SUMMARY.md:27 src/guides/sat-hunting.md:1 +msgid "Sat Hunting" +msgstr "Caza de Sats" + +#: src/SUMMARY.md:28 src/guides/settings.md:1 +msgid "Settings" +msgstr "Configuración" + +#: src/SUMMARY.md:29 src/guides/teleburning.md:1 +msgid "Teleburning" +msgstr "Telequemado" + +#: src/SUMMARY.md:30 src/guides/testing.md:1 +msgid "Testing" +msgstr "Pruebas" + +#: src/SUMMARY.md:31 msgid "Bounties" msgstr "Recompensas" -#: src/SUMMARY.md:21 +#: src/SUMMARY.md:32 msgid "Bounty 0: 100,000 sats Claimed!" -msgstr "Recompensa Ordinal 0: 100,000 sats reclamados" +msgstr "Recompensa Ordinal 0: 100,000 sats reclamados!" -#: src/SUMMARY.md:22 +#: src/SUMMARY.md:33 msgid "Bounty 1: 200,000 sats Claimed!" -msgstr "Recompensa Ordinal 1: 200,000 sats reclamados" +msgstr "Recompensa Ordinal 1: 200,000 sats reclamados!" -#: src/SUMMARY.md:23 +#: src/SUMMARY.md:34 msgid "Bounty 2: 300,000 sats Claimed!" -msgstr "Recompensa Ordinal 2: 300,000 sats reclamados" +msgstr "Recompensa Ordinal 2: 300,000 sats reclamados!" -#: src/SUMMARY.md:24 +#: src/SUMMARY.md:35 msgid "Bounty 3: 400,000 sats" msgstr "Recompensa Ordinal 3: 400,000 sats" #: src/introduction.md:4 msgid "" -"This handbook is a guide to ordinal theory. Ordinal theory concerns itself " -"with satoshis, giving them individual identities and allowing them to be " -"tracked, transferred, and imbued with meaning." +"This handbook is a guide to ordinal theory. Ordinal theory concerns itself with satoshis, giving them individual identities and allowing them to be tracked, transferred, and " +"imbued with meaning." msgstr "" -"Este manual sirve como una guía sobre la teoría ordinal. La teoría Ordinal " -"se encarga de proporcionar a cada Satoshi un identificador único, posibilitando " -"que cada uno pueda ser rastreado, transferido, e imbuido de significado. " +"Este manual es una guía de la teoría ordinal. La teoría Ordinal se encarga de proporcionar a cada Satoshi un identificador único, posibilitando que cada uno pueda ser rastreado, " +"transferido, e imbuido de significado." #: src/introduction.md:8 -msgid "" -"Satoshis, not bitcoin, are the atomic, native currency of the Bitcoin " -"network. One bitcoin can be sub-divided into 100,000,000 satoshis, but no " -"further." -msgstr "" -"Los Satoshis y no el Bitcoin, son la divisa atómica y nativa de " -"la red de Bitcoin. Un Bitcoin se subdivide en exactamente 100,000,000 Satoshis, " -"ni más ni menos." +msgid "Satoshis, not bitcoin, are the atomic, native currency of the Bitcoin network. One bitcoin can be sub-divided into 100,000,000 satoshis, but no further." +msgstr "Los Satoshis y no el Bitcoin, son la divisa atómica y nativa de la red de Bitcoin. Un Bitcoin puede subdividirse en exactamente 100,000,000 Satoshis, ni más ni menos." #: src/introduction.md:11 -msgid "" -"Ordinal theory does not require a sidechain or token aside from Bitcoin, and " -"can be used without any changes to the Bitcoin network. It works right now." -msgstr "" -"La teoría Ordinal opera sin la necesidad de una cadena lateral o token " -"distinto a Bitcoin, y puede utilizarse sin ningún cambio en la red Bitcoin. " -"Funciona ahora mismo." +msgid "Ordinal theory does not require a sidechain or token aside from Bitcoin, and can be used without any changes to the Bitcoin network. It works right now." +msgstr "La teoría Ordinal opera sin la necesidad de una cadena lateral o token distinto a Bitcoin, y puede utilizarse sin ningún cambio en la red Bitcoin. Funciona ahora mismo." #: src/introduction.md:14 -msgid "" -"Ordinal theory imbues satoshis with numismatic value, allowing them to be " -"collected and traded as curios." -msgstr "" -"La teoría Ordinal otorga a los Satoshis un valor numismático, permitiendo " -"que sean coleccionados e intercambiados como coleccionables." +msgid "Ordinal theory imbues satoshis with numismatic value, allowing them to be collected and traded as curios." +msgstr "La teoría Ordinal otorga a los Satoshis un valor numismático, permitiendo que sean coleccionados e intercambiados como coleccionables." #: src/introduction.md:17 msgid "" -"Individual satoshis can be inscribed with arbitrary content, creating unique " -"Bitcoin-native digital artifacts that can be held in Bitcoin wallets and " -"transferred using Bitcoin transactions. Inscriptions are as durable, " -"immutable, secure, and decentralized as Bitcoin itself." +"Individual satoshis can be inscribed with arbitrary content, creating unique Bitcoin-native digital artifacts that can be held in Bitcoin wallets and transferred using Bitcoin " +"transactions. Inscriptions are as durable, immutable, secure, and decentralized as Bitcoin itself." msgstr "" -"En cada Satoshi se puede inscribir diferentes tipos de contenido, permitiendo " -"la creación de artefactos digitales únicos nativos en Bitcoin. Estos artefactos " -"digitales pueden almacenarse en monederos de Bitcoin y transferirse mediante " -"transacciones de Bitcoin. Las inscripciones son tan duraderas, inmutables, seguras " -"y descentralizadas como el propio Bitcoin." +"En cada Satoshi se puede inscribir diferentes tipos de contenido, permitiendo la creación de artefactos digitales únicos nativos en Bitcoin. Estos artefactos digitales pueden " +"almacenarse en monederos de Bitcoin y transferirse mediante transacciones de Bitcoin. Las inscripciones son tan duraderas, inmutables, seguras y descentralizadas como el propio " +"Bitcoin." #: src/introduction.md:22 msgid "" -"Other, more unusual use-cases are possible: off-chain colored-coins, public " -"key infrastructure with key rotation, a decentralized replacement for the " -"DNS. For now though, such use-cases are speculative, and exist only in the " -"minds of fringe ordinal theorists." +"Other, more unusual use-cases are possible: off-chain colored-coins, public key infrastructure with key rotation, a decentralized replacement for the DNS. For now though, such " +"use-cases are speculative, and exist only in the minds of fringe ordinal theorists." msgstr "" -"Otros casos de uso más inusuales son posibles: monedas por fuera de la cadena " -"y coloreadas (colored-coins), infraestructura de clave pública con rotación de clave, " -"un reemplazo descentralizado para el DNS. No obstante, en la actualidad, tales casos de uso " -"son especulativos y existen solo en las mentes de los teóricos de ordinals." +"Otros casos de uso más inusuales son posibles: monedas por fuera de la cadena y coloreadas (colored-coins), infraestructura de clave pública con rotación de clave, un reemplazo " +"descentralizado para el DNS. No obstante, en la actualidad, tales casos de uso son especulativos y existen solo en las mentes de los teóricos de ordinals." #: src/introduction.md:27 msgid "For more details on ordinal theory, see the [overview](overview.md)." @@ -184,14 +190,10 @@ msgid "For more details on inscriptions, see [inscriptions](inscriptions.md)." msgstr "Para obtener más detalles sobre las inscripciones, ver [inscripciones](inscriptions.md)." #: src/introduction.md:31 -msgid "" -"When you're ready to get your hands dirty, a good place to start is with " -"[inscriptions](guides/inscriptions.md), a curious species of digital " -"artifact enabled by ordinal theory." +msgid "When you're ready to get your hands dirty, a good place to start is with [inscriptions](guides/wallet.md), a curious species of digital artifact enabled by ordinal theory." msgstr "" -"Cuando estés listo para ponerte manos a la obra, un buen lugar para " -"comenzar es en la página de [inscripciones](guides/inscriptions.md), un tipo de " -"artefacto digital posibilitado por la teoría ordinal." +"Cuando estés listo para ponerte manos a la obra, un buen lugar para comenzar es en la página de [inscripciones](guides/wallet.md), un tipo de artefacto digital posibilitado por " +"la teoría ordinal." #: src/introduction.md:35 msgid "Links" @@ -230,27 +232,12 @@ msgid "Videos" msgstr "Videos" #: src/introduction.md:49 -msgid "" -"[Ordinal Theory Explained: Satoshi Serial Numbers and NFTs on " -"Bitcoin](https://www.youtube.com/watch?v=rSS0O2KQpsI)" -msgstr "" -"[Explicación de la teoría Ordinal: Números de serie de Satoshis " -"y NFTs en Bitcoin](https://www.youtube.com/watch?v=rSS0O2KQpsI)" +msgid "[Ordinal Theory Explained: Satoshi Serial Numbers and NFTs on Bitcoin](https://www.youtube.com/watch?v=rSS0O2KQpsI)" +msgstr "[Explicación de la teoría Ordinal: Números de serie de Satoshis y NFTs en Bitcoin](https://www.youtube.com/watch?v=rSS0O2KQpsI)" #: src/introduction.md:50 -msgid "" -"[Ordinals Workshop with " -"Rodarmor](https://www.youtube.com/watch?v=MC_haVa6N3I)" -msgstr "[Taller de Ordinals con " -"Rodarmor](https://www.youtube.com/watch?v=MC_haVa6N3I&ab_channel=PlebLab)" - -#: src/introduction.md:51 -msgid "" -"[Ordinal Art: Mint Your own NFTs on Bitcoin w/ " -"@rodarmor](https://www.youtube.com/watch?v=j5V33kV3iqo)" -msgstr "" -"[Arte Ordinal: Crea tus propios NFTs en Bitcoin con " -"@rodarmor](https://www.youtube.com/watch?v=j5V33kV3iqo)" +msgid "[Ordinals Workshop with Rodarmor](https://www.youtube.com/watch?v=MC_haVa6N3I)" +msgstr "[Taller de Ordinals con Rodarmor](https://www.youtube.com/watch?v=MC_haVa6N3I&ab_channel=PlebLab)" #: src/overview.md:1 msgid "Ordinal Theory Overview" @@ -258,121 +245,67 @@ msgstr "Descripción General de la Teoría Ordinal" #: src/overview.md:4 msgid "" -"Ordinals are a numbering scheme for satoshis that allows tracking and " -"transferring individual sats. These numbers are called [ordinal " -"numbers](https://ordinals.com). Satoshis are numbered in the order in which " -"they're mined, and transferred from transaction inputs to transaction " -"outputs first-in-first-out. Both the numbering scheme and the transfer " -"scheme rely on _order_, the numbering scheme on the _order_ in which " -"satoshis are mined, and the transfer scheme on the _order_ of transaction " -"inputs and outputs. Thus the name, _ordinals_." -msgstr "" -"Los Ordinals son un sistema de numeración para los satoshis con el " -"cual podemos hacerles seguimiento y transferirlos de manera individual. " -"Dichos números se denominan [números ordinales](https://ordinals.com/). " -"A cada Satoshi se le otorga un número de serie que se establece según el orden " -"en el que fueron minados y se transfieren basándose en la secuencia de las " -"transacciones entrantes y salientes, siguiendo el proceso " -"FIFO (First In, First Out). Tanto el esquema de numeración como el de transferencia " -"se basan en el _orden secuencial_; el esquema de numeración en el _orden_ en que se minan " -"los satoshis, mientras que el esquema de transferencia se basa en el _orden_ " -"de las entradas y salidas de las transacciones. De allí se deriva el nombre, _ordinals_." +"Ordinals are a numbering scheme for satoshis that allows tracking and transferring individual sats. These numbers are called [ordinal numbers](https://ordinals.com). Satoshis are " +"numbered in the order in which they're mined, and transferred from transaction inputs to transaction outputs first-in-first-out. Both the numbering scheme and the transfer scheme " +"rely on _order_, the numbering scheme on the _order_ in which satoshis are mined, and the transfer scheme on the _order_ of transaction inputs and outputs. Thus the name, " +"_ordinals_." +msgstr "" +"Los Ordinals son un sistema de numeración para los satoshis con el cual podemos hacerles seguimiento y transferirlos de manera individual. Dichos números se denominan [números " +"ordinales](https://ordinals.com/). A cada Satoshi se le otorga un número de serie que se establece según el orden en el que fueron minados y se transfieren basándose en la " +"secuencia de las transacciones entrantes y salientes, siguiendo el proceso FIFO (First In, First Out). Tanto el esquema de numeración como el de transferencia se basan en el " +"_orden secuencial_; el esquema de numeración en el _orden_ en que se minan los satoshis, mientras que el esquema de transferencia se basa en el _orden_ de las entradas y salidas " +"de las transacciones. De allí se deriva el nombre, _ordinals_." #: src/overview.md:13 -msgid "" -"Technical details are available in [the " -"BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki)." -msgstr "" -"Los detalles técnicos están disponibles " -"en [el BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki)." +msgid "Technical details are available in [the BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki)." +msgstr "Los detalles técnicos están disponibles en [el BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki)." #: src/overview.md:16 -msgid "" -"Ordinal theory does not require a separate token, another blockchain, or any " -"changes to Bitcoin. It works right now." -msgstr "La teoría Ordinal funciona en este momento sin hacer cambios a Bitcoin " -"y no requiere de un token aparte u otra blockchain." +msgid "Ordinal theory does not require a separate token, another blockchain, or any changes to Bitcoin. It works right now." +msgstr "La teoría Ordinal funciona en este momento sin hacer cambios a Bitcoin y no requiere de un token aparte u otra blockchain." #: src/overview.md:19 msgid "Ordinal numbers have a few different representations:" msgstr "Los números Ordinales tienen varias representaciones:" #: src/overview.md:21 -msgid "" -"_Integer notation_: " -"[`2099994106992659`](https://ordinals.com/sat/2099994106992659) The ordinal " -"number, assigned according to the order in which the satoshi was mined." -msgstr "_Notación entera_: " -"[`2099994106992659`](https://ordinals.com/sat/2099994106992659). El número" -"ordinal, asignado según el orden en que se minó el Satoshi" +msgid "_Integer notation_: [`2099994106992659`](https://ordinals.com/sat/2099994106992659) The ordinal number, assigned according to the order in which the satoshi was mined." +msgstr "_Notación entera_: [`2099994106992659`](https://ordinals.com/sat/2099994106992659). El número ordinal, asignado según el orden en que se minó el Satoshi." #: src/overview.md:26 msgid "" -"_Decimal notation_: " -"[`3891094.16797`](https://ordinals.com/sat/3891094.16797) The first number " -"is the block height in which the satoshi was mined, the second the offset of " -"the satoshi within the block." +"_Decimal notation_: [`3891094.16797`](https://ordinals.com/sat/3891094.16797) The first number is the block height in which the satoshi was mined, the second the offset of the " +"satoshi within the block." msgstr "" -"_Notación decimal_: " -"[` 3891094.16797`](https://ordinals.com/sat/3891094.16797) El primer número " -"es la altura del bloque en el cual se minó el Satoshi, el segundo es el desplazamiento " -"del Satoshi dentro del bloque." +"_Notación decimal_: [` 3891094.16797`](https://ordinals.com/sat/3891094.16797) El primer número es la altura del bloque en el cual se minó el Satoshi, el segundo es el " +"desplazamiento del Satoshi dentro del bloque." #: src/overview.md:31 -msgid "" -"_Degree notation_: " -"[`3°111094′214″16797‴`](https://ordinals.com/sat/3%C2%B0111094%E2%80%B2214%E2%80%B316797%E2%80%B4). " -"We'll get to that in a moment." -msgstr "" -"_Notación sexagesimal_: " -"[`3°111094′214″16797‴`](https://ordinals.com/sat/3%C2%B0111094%E2%80%B2214%E2%80%B316797%E2%80%B4). " -"Hablaremos de eso más adelante." - +msgid "_Degree notation_: [`3°111094′214″16797‴`](https://ordinals.com/sat/3%C2%B0111094%E2%80%B2214%E2%80%B316797%E2%80%B4). We'll get to that in a moment." +msgstr "_Notación sexagesimal_: [`3°111094′214″16797‴`](https://ordinals.com/sat/3%C2%B0111094%E2%80%B2214%E2%80%B316797%E2%80%B4). Hablaremos de eso más adelante." #: src/overview.md:35 -msgid "" -"_Percentile notation_: " -"[`99.99971949060254%`](https://ordinals.com/sat/99.99971949060254%25) . The " -"satoshi's position in Bitcoin's supply, expressed as a percentage." +msgid "_Percentile notation_: [`99.99971949060254%`](https://ordinals.com/sat/99.99971949060254%25) . The satoshi's position in Bitcoin's supply, expressed as a percentage." msgstr "" -"_Notación porcentual_: " -"[`99.99971949060254%`](https://ordinals.com/sat/99.99971949060254%25) . La " -"posición del Satoshi en el suministro de Bitcoin, expresado como un porcentaje." +"_Notación porcentual_: [`99.99971949060254%`](https://ordinals.com/sat/99.99971949060254%25) . La posición del Satoshi en el suministro de Bitcoin, expresado como un porcentaje." #: src/overview.md:39 -msgid "" -"_Name_: [`satoshi`](https://ordinals.com/sat/satoshi). An encoding of the " -"ordinal number using the characters `a` through `z`." -msgstr "" -"_Nombre_: " -"[`Satoshi`](https://ordinals.com/sat/satoshi). Una codificación del " -"número ordinal utilizando los caracteres de la `a` a la `z`." +msgid "_Name_: [`satoshi`](https://ordinals.com/sat/satoshi). An encoding of the ordinal number using the characters `a` through `z`." +msgstr "_Nombre_: [`Satoshi`](https://ordinals.com/sat/satoshi). Una codificación del número ordinal utilizando los caracteres de la `a` a la `z`." #: src/overview.md:42 -msgid "" -"Arbitrary assets, such as NFTs, security tokens, accounts, or stablecoins " -"can be attached to satoshis using ordinal numbers as stable identifiers." -msgstr "" -"Activos arbitrarios como los NFTs, tokens de seguridad, cuentas o stablecoins " -"se pude adjuntar a los satoshis usando números ordinales como identificadores." +msgid "Arbitrary assets, such as NFTs, security tokens, accounts, or stablecoins can be attached to satoshis using ordinal numbers as stable identifiers." +msgstr "Activos arbitrarios como los NFTs, tokens de seguridad, cuentas o stablecoins se pude adjuntar a los satoshis usando números ordinales como identificadores." #: src/overview.md:45 msgid "" -"Ordinals is an open-source project, developed [on " -"GitHub](https://github.com/ordinals/ord). The project consists of a BIP " -"describing the ordinal scheme, an index that communicates with a Bitcoin " -"Core node to track the location of all satoshis, a wallet that allows making " -"ordinal-aware transactions, a block explorer for interactive exploration of " -"the blockchain, functionality for inscribing satoshis with digital " -"artifacts, and this manual." -msgstr "" -"Ordinals es un proyecto de código abierto, desarrollado " -"[en GitHub](https://github.com/ordinals/ord). El proyecto consta de un BIP " -"que describe el esquema de Ordinals, un índice que se comunica con un nodo de Bitcoin " -"Core para rastrear la ubicación de todos los satoshis, un monedero que permite " -"realizar transacciones de Ordinals, un explorador de bloques para la exploración interactiva " -"de la blockchain, funcionalidad para inscribir artefactos digitales " -"en los satoshis y este manual." +"Ordinals is an open-source project, developed [on GitHub](https://github.com/ordinals/ord). The project consists of a BIP describing the ordinal scheme, an index that " +"communicates with a Bitcoin Core node to track the location of all satoshis, a wallet that allows making ordinal-aware transactions, a block explorer for interactive exploration " +"of the blockchain, functionality for inscribing satoshis with digital artifacts, and this manual." +msgstr "" +"Ordinals es un proyecto de código abierto, desarrollado [en GitHub](https://github.com/ordinals/ord). El proyecto consta de un BIP que describe el esquema de Ordinals, un índice " +"que se comunica con un nodo de Bitcoin Core para rastrear la ubicación de todos los satoshis, un monedero que permite realizar transacciones de Ordinals, un explorador de bloques " +"para la exploración interactiva de la blockchain, funcionalidad para inscribir artefactos digitales en los satoshis y este manual." #: src/overview.md:52 msgid "Rarity" @@ -380,61 +313,39 @@ msgstr "Rareza" #: src/overview.md:55 msgid "" -"Humans are collectors, and since satoshis can now be tracked and " -"transferred, people will naturally want to collect them. Ordinal theorists " -"can decide for themselves which sats are rare and desirable, but there are " -"some hints…" +"Humans are collectors, and since satoshis can now be tracked and transferred, people will naturally want to collect them. Ordinal theorists can decide for themselves which sats " +"are rare and desirable, but there are some hints…" msgstr "" -"Los humanos son coleccionistas, y ahora que los satoshis se pueden " -"rastrear y transferir, las personas querrán coleccionarlos. Los teóricos de " -"Ordinals pueden decidir por sí mismos cuáles sats son raros y deseables, pero " -"aquí hay algunas pistas..." +"Los humanos son coleccionistas, y ahora que los satoshis se pueden rastrear y transferir, las personas querrán coleccionarlos. Los teóricos de Ordinals pueden decidir por sí " +"mismos cuáles sats son raros y deseables, pero aquí hay algunas pistas…" #: src/overview.md:59 -msgid "" -"Bitcoin has periodic events, some frequent, some more uncommon, and these " -"naturally lend themselves to a system of rarity. These periodic events are:" -msgstr "" -"Bitcoin tiene eventos periódicos, algunos frecuentes y algunos menos comunes, y " -"estos se prestan para obtener un sistema de rareza. Estos eventos periódicos son:" +msgid "Bitcoin has periodic events, some frequent, some more uncommon, and these naturally lend themselves to a system of rarity. These periodic events are:" +msgstr "Bitcoin tiene eventos periódicos, algunos frecuentes y algunos menos comunes, y estos se prestan para obtener un sistema de rareza. Estos eventos periódicos son:" #: src/overview.md:62 -msgid "" -"_Blocks_: A new block is mined approximately every 10 minutes, from now " -"until the end of time." -msgstr "" -"_Bloques_: Se mina un bloque nuevo aproximadamente cada 10 minutos, desde " -"ahora hasta el fin de los tiempos." +msgid "_Blocks_: A new block is mined approximately every 10 minutes, from now until the end of time." +msgstr "_Bloques_: Se mina un bloque nuevo aproximadamente cada 10 minutos, desde ahora hasta el fin de los tiempos." #: src/overview.md:65 msgid "" -"_Difficulty adjustments_: Every 2016 blocks, or approximately every two " -"weeks, the Bitcoin network responds to changes in hashrate by adjusting the " -"difficulty target which blocks must meet in order to be accepted." +"_Difficulty adjustments_: Every 2016 blocks, or approximately every two weeks, the Bitcoin network responds to changes in hashrate by adjusting the difficulty target which blocks " +"must meet in order to be accepted." msgstr "" -"_Ajustes de dificultad_: Cada 2016 bloques, o aproximadamente cada dos " -"semanas, la red de Bitcoin responde a cambios en la tasa de hash ajustando " -"la dificultad que los bloques deben cumplir para ser aceptados." +"_Ajustes de dificultad_: Cada 2016 bloques, o aproximadamente cada dos semanas, la red de Bitcoin responde a cambios en la tasa de hash ajustando la dificultad que los bloques " +"deben cumplir para ser aceptados." #: src/overview.md:69 -msgid "" -"_Halvings_: Every 210,000 blocks, or roughly every four years, the amount of " -"new sats created in every block is cut in half." -msgstr "" -"_Halvings_: Cada 210,000 bloques, o aproximadamente cada cuatro años, la cantidad " -"de nuevos Satoshis creados en cada bloque se reduce a la mitad." +msgid "_Halvings_: Every 210,000 blocks, or roughly every four years, the amount of new sats created in every block is cut in half." +msgstr "_Halvings_: Cada 210,000 bloques, o aproximadamente cada cuatro años, la cantidad de nuevos Satoshis creados en cada bloque se reduce a la mitad." #: src/overview.md:72 msgid "" -"_Cycles_: Every six halvings, something magical happens: the halving and the " -"difficulty adjustment coincide. This is called a conjunction, and the time " -"period between conjunctions a cycle. A conjunction occurs roughly every 24 " -"years. The first conjunction should happen sometime in 2032." +"_Cycles_: Every six halvings, something magical happens: the halving and the difficulty adjustment coincide. This is called a conjunction, and the time period between " +"conjunctions a cycle. A conjunction occurs roughly every 24 years. The first conjunction should happen sometime in 2032." msgstr "" -"_Ciclos_: Cada seis halvings, sucede algo mágico: el halving y el ajuste de " -"dificultad suceden al mismo tiempo. Esto se llama conjunción, y el período " -"de tiempo entre conjunciones es un ciclo. Una conjunción ocurre aproximadamente " -"cada 24 años. La primera conjunción debería ocurrir en el 2032." +"_Ciclos_: Cada seis halvings, sucede algo mágico: el halving y el ajuste de dificultad suceden al mismo tiempo. Esto se llama conjunción, y el período de tiempo entre " +"conjunciones es un ciclo. Una conjunción ocurre aproximadamente cada 24 años. La primera conjunción debería ocurrir en el 2032." #: src/overview.md:77 msgid "This gives us the following rarity levels:" @@ -462,199 +373,43 @@ msgstr "`legendario`: El primer Satoshi de cada ciclo" #: src/overview.md:84 msgid "`mythic`: The first sat of the genesis block" -msgstr "`mítico`: El primer Sat del bloque génesis " +msgstr "`mítico`: El primer Sat del bloque génesis" #: src/overview.md:86 -msgid "" -"Which brings us to degree notation, which unambiguously represents an " -"ordinal number in a way that makes the rarity of a satoshi easy to see at a " -"glance:" -msgstr "" -"Lo cual nos trae a la notación sexagesimal esta representa un numero ordinal " -"de tal manera que nos facilita ver la rareza de un satoshi. " - -#: src/overview.md:89 -msgid "" -"```\n" -"A°B′C″D‴\n" -"│ │ │ ╰─ Index of sat in the block\n" -"│ │ ╰─── Index of block in difficulty adjustment period\n" -"│ ╰───── Index of block in halving epoch\n" -"╰─────── Cycle, numbered starting from 0\n" -"```" -msgstr "" -"```\n" -"A°B′C″D‴\n" -"│ │ │ ╰─ Índice del Satoshi dentro del bloque\n" -"│ │ ╰─── Índice del bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── Índice del bloque en la época de halving\n" -"╰─────── Ciclo, numerados comenzando desde 0\n" -"```" +msgid "Which brings us to degree notation, which unambiguously represents an ordinal number in a way that makes the rarity of a satoshi easy to see at a glance:" +msgstr "Esto nos lleva a la notación sexagesimal, la cual representa un numero ordinal de tal manera que nos facilita ver la rareza de un satoshis:" #: src/overview.md:97 -msgid "" -"Ordinal theorists often use the terms \"hour\", \"minute\", \"second\", and " -"\"third\" for _A_, _B_, _C_, and _D_, respectively." -msgstr "" -"Los teóricos de Ordinals suelen usar los términos \"hora\", \"minuto\", \"segundo\" y " -"\"tercero\" en referencia a _A_, _B_, _C_, y _D_." +msgid "Ordinal theorists often use the terms \"hour\", \"minute\", \"second\", and \"third\" for _A_, _B_, _C_, and _D_, respectively." +msgstr "Los teóricos de Ordinals suelen usar los términos \"hora\", \"minuto\", \"segundo\" y \"tercero\" en referencia a _A_, _B_, _C_, y _D_." #: src/overview.md:100 msgid "Now for some examples. This satoshi is common:" msgstr "Por ejemplo, este Satoshi es común:" -#: src/overview.md:102 -msgid "" -"```\n" -"1°1′1″1‴\n" -"│ │ │ ╰─ Not first sat in block\n" -"│ │ ╰─── Not first block in difficulty adjustment period\n" -"│ ╰───── Not first block in halving epoch\n" -"╰─────── Second cycle\n" -"```" -msgstr "" -"```\n" -"1°1′1″1‴\n" -"│ │ │ ╰─ No es el primer sat del bloque\n" -"│ │ ╰─── No es el primer bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── No es el primer bloque en la época de halving\n" -"╰─────── Segundo ciclo\n" -"```" - #: src/overview.md:111 msgid "This satoshi is uncommon:" msgstr "Este Satoshi es poco común:" -#: src/overview.md:113 -msgid "" -"```\n" -"1°1′1″0‴\n" -"│ │ │ ╰─ First sat in block\n" -"│ │ ╰─── Not first block in difficulty adjustment period\n" -"│ ╰───── Not first block in halving epoch\n" -"╰─────── Second cycle\n" -"```" -msgstr "" -"```\n" -"1°1′1″0‴\n" -"│ │ │ ╰─ Primer sat del bloque\n" -"│ │ ╰─── No es el primer bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── No es el primer bloque en un periodo de halving\n" -"╰─────── Segundo ciclo\n" -"```" - #: src/overview.md:121 msgid "This satoshi is rare:" msgstr "Este Satoshi es raro:" -#: src/overview.md:123 -msgid "" -"```\n" -"1°1′0″0‴\n" -"│ │ │ ╰─ First sat in block\n" -"│ │ ╰─── First block in difficulty adjustment period\n" -"│ ╰───── Not the first block in halving epoch\n" -"╰─────── Second cycle\n" -"```" -msgstr "" -"```\n" -"1°1′0″0‴\n" -"│ │ │ ╰─ Primer sat del bloque\n" -"│ │ ╰─── Primer bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── No es el primer bloque en un periodo de halving\n" -"╰───────Segundo ciclo\n" -"```" - #: src/overview.md:131 msgid "This satoshi is epic:" msgstr "Este Satoshi es épico:" -#: src/overview.md:133 -msgid "" -"```\n" -"1°0′1″0‴\n" -"│ │ │ ╰─ First sat in block\n" -"│ │ ╰─── Not first block in difficulty adjustment period\n" -"│ ╰───── First block in halving epoch\n" -"╰─────── Second cycle\n" -"```" -msgstr "" -"```\n" -"1°0′1″0‴\n" -"│ │ │ ╰─ Primer sat del bloque\n" -"│ │ ╰─── No es el primer bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── Primer bloque en la época de halving\n" -"╰─────── Segundo ciclo\n" -"```" - #: src/overview.md:141 msgid "This satoshi is legendary:" msgstr "Este Satoshi es legendario:" -#: src/overview.md:143 -msgid "" -"```\n" -"1°0′0″0‴\n" -"│ │ │ ╰─ First sat in block\n" -"│ │ ╰─── First block in difficulty adjustment period\n" -"│ ╰───── First block in halving epoch\n" -"╰─────── Second cycle\n" -"```" -msgstr "" -"```\n" -"1°0′0″0‴\n" -"│ │ │ ╰─ Primer sat del bloque\n" -"│ │ ╰─── Primer bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── Primer bloque en la época de halving\n" -"╰─────── Segundo ciclo\n" -"```" - #: src/overview.md:151 msgid "And this satoshi is mythic:" msgstr "Este Satoshi es mítico:" -#: src/overview.md:153 -msgid "" -"```\n" -"0°0′0″0‴\n" -"│ │ │ ╰─ First sat in block\n" -"│ │ ╰─── First block in difficulty adjustment period\n" -"│ ╰───── First block in halving epoch\n" -"╰─────── First cycle\n" -"```" -msgstr "" -"```\n" -"0°0′0″0‴\n" -"│ │ │ ╰─ Primer sat del bloque\n" -"│ │ ╰─── Primer bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── Primer bloque en la época de halving\n" -"╰─────── Primer ciclo\n" -"```" - - #: src/overview.md:161 -msgid "" -"If the block offset is zero, it may be omitted. This is the uncommon satoshi " -"from above:" -msgstr "" -"Si el Satoshi es el primero en el bloque, el cero puede ser omitido. " -"Este es el ejemplo del Satoshi poco común que explicamos previamente:" - -#: src/overview.md:164 -msgid "" -"```\n" -"1°1′1″\n" -"│ │ ╰─ Not first block in difficulty adjustment period\n" -"│ ╰─── Not first block in halving epoch\n" -"╰───── Second cycle\n" -"```" -msgstr "" -"```\n" -"1°1′1″\n" -"│ │ ╰─── No es el primer bloque en el periodo de ajuste de dificultad\n" -"│ ╰───── No es el primer bloque en un periodo de halving\n" -"╰─────── Segundo ciclo\n" -"```" +msgid "If the block offset is zero, it may be omitted. This is the uncommon satoshi from above:" +msgstr "Si el Satoshi es el primero en el bloque, el cero puede ser omitido. Este es el ejemplo del Satoshi poco común que explicamos previamente:" #: src/overview.md:171 msgid "Rare Satoshi Supply" @@ -684,22 +439,21 @@ msgstr "`épico`: 32" msgid "`legendary`: 5" msgstr "`legendario`: 5" -#: src/overview.md:181 -#: src/overview.md:190 +#: src/overview.md:181 src/overview.md:190 msgid "`mythic`: 1" msgstr "`mítico`: 1" #: src/overview.md:183 msgid "Current Supply" -msgstr "Suministro actual:" +msgstr "Suministro actual" #: src/overview.md:185 msgid "`common`: 1.9 quadrillion" msgstr "`común`: 1.9 mil billones" #: src/overview.md:186 -msgid "`uncommon`: 745,855" -msgstr "`poco común`: 745,855" +msgid "`uncommon`: 808,262" +msgstr "`poco común`: 808,262" #: src/overview.md:187 msgid "`rare`: 369" @@ -714,41 +468,30 @@ msgid "`legendary`: 0" msgstr "`legendario`: 0" #: src/overview.md:192 -msgid "" -"At the moment, even uncommon satoshis are quite rare. As of this writing, " -"745,855 uncommon satoshis have been mined - one per 25.6 bitcoin in " -"circulation." +msgid "At the moment, even uncommon satoshis are quite rare. As of this writing, 745,855 uncommon satoshis have been mined - one per 25.6 bitcoin in circulation." msgstr "" -"Por el momento, incluso los Satoshis poco comunes son bastante escasos. " -"Hasta la fecha de este escrito, se han minado 745,855 Satoshis poco comunes - " -"uno por cada 25.6 bitcoin en circulación." +"Por el momento, incluso los Satoshis poco comunes son bastante escasos. Hasta la fecha de este escrito, se han minado 745,855 Satoshis poco comunes - uno por cada 25.6 bitcoin en " +"circulación." #: src/overview.md:196 msgid "Names" -msgstr "Nombres " +msgstr "Nombres" #: src/overview.md:199 msgid "" -"Each satoshi has a name, consisting of the letters _A_ through _Z_, that get " -"shorter the further into the future the satoshi was mined. They could start " -"short and get longer, but then all the good, short names would be trapped in " -"the unspendable genesis block." +"Each satoshi has a name, consisting of the letters _A_ through _Z_, that get shorter the further into the future the satoshi was mined. They could start short and get longer, but " +"then all the good, short names would be trapped in the unspendable genesis block." msgstr "" -"Cada Satoshi tiene un nombre compuesto por las letras _A_ hasta la _Z_. " -"Este nombre se va haciendo más corto cuanto más lejos en el futuro se mine el " -"Satoshi. Podrían comenzar con nombres cortos e irse alargando, pero esto causaría " -"que todos los nombres cortos quedaran atrapados en el bloque génesis el cual " -"no se puede gastar." +"Cada Satoshi tiene un nombre compuesto por las letras _A_ hasta la _Z_. Este nombre se va haciendo más corto cuanto más lejos en el futuro se mine el Satoshi. Podrían comenzar " +"con nombres cortos e irse alargando, pero esto causaría que todos los nombres cortos quedaran atrapados en el bloque génesis el cual no se puede gastar." #: src/overview.md:204 msgid "" -"As an example, 1905530482684727°'s name is \"iaiufjszmoba\". The name of the " -"last satoshi to be mined is \"a\". Every combination of 10 characters or " -"less is out there, or will be out there, someday." +"As an example, 1905530482684727°'s name is \"iaiufjszmoba\". The name of the last satoshi to be mined is \"a\". Every combination of 10 characters or less is out there, or will " +"be out there, someday." msgstr "" -"Por ejemplo, el nombre de 1905530482684727°' es \"iaiufjszmoba\". El nombre " -"del último satoshi que será minado es \"a\". Cada combinación de 10 caracteres " -"o menos ya existe, o existirá, algún día." +"Por ejemplo, el nombre de 1905530482684727°' es \"iaiufjszmoba\". El nombre del último satoshi que será minado es \"a\". Cada combinación de 10 caracteres o menos ya existe, o " +"existirá, algún día." #: src/overview.md:208 msgid "Exotics" @@ -756,44 +499,31 @@ msgstr "Exóticos" #: src/overview.md:211 msgid "" -"Satoshis may be prized for reasons other than their name or rarity. This " -"might be due to a quality of the number itself, like having an integer " -"square or cube root. Or it might be due to a connection to a historical " -"event, such as satoshis from block 477,120, the block in which SegWit " -"activated, or 2099999997689999°, the last satoshi that will ever be mined." +"Satoshis may be prized for reasons other than their name or rarity. This might be due to a quality of the number itself, like having an integer square or cube root. Or it might " +"be due to a connection to a historical event, such as satoshis from block 477,120, the block in which SegWit activated, or 2099999997689999°, the last satoshi that will ever be " +"mined." msgstr "" -"Los satoshis pueden ser valorados por otras características distintas a su " -"nombre o rareza. Esto podría ser alguna cualidad intrínseca con el número, como " -"tener una raíz cuadrada o cúbica. También podría ser debido a una conexión con " -"un evento histórico, tales como los Satoshis del bloque 477,120, el bloque " -"en el que se activó SegWit, o 2099999997689999°, el último satoshi que será minado." +"Los satoshis pueden ser valorados por otras características distintas a su nombre o rareza. Esto podría ser alguna cualidad intrínseca con el número, como tener una raíz cuadrada " +"o cúbica. También podría ser debido a una conexión con un evento histórico, tales como los Satoshis del bloque 477,120, el bloque en el que se activó SegWit, o 2099999997689999°, " +"el último satoshi que será minado." #: src/overview.md:217 msgid "" -"Such satoshis are termed \"exotic\". Which satoshis are exotic and what " -"makes them so is subjective. Ordinal theorists are encouraged to seek out " -"exotics based on criteria of their own devising." -msgstr "A estos satoshis se les denomina \"exóticos\". Cuales Satoshis son " -"exóticos y lo que los convierte en ello es subjetivo. A los teóricos de " -"Ordinals se les incentiva a buscar sats exóticos basados en sus propios " -"criterios." +"Such satoshis are termed \"exotic\". Which satoshis are exotic and what makes them so is subjective. Ordinal theorists are encouraged to seek out exotics based on criteria of " +"their own devising." +msgstr "" +"A estos satoshis se les denomina \"exóticos\". Cuales Satoshis son exóticos y lo que los convierte en ello es subjetivo. A los teóricos de Ordinals se les incentiva a buscar sats " +"exóticos basados en sus propios criterios." #: src/overview.md:224 msgid "" -"Satoshis can be inscribed with arbitrary content, creating Bitcoin-native " -"digital artifacts. Inscribing is done by sending the satoshi to be inscribed " -"in a transaction that reveals the inscription content on-chain. This content " -"is then inextricably linked to that satoshi, turning it into an immutable " -"digital artifact that can be tracked, transferred, hoarded, bought, sold, " -"lost, and rediscovered." -msgstr "" -"Los satoshis pueden ser inscritos con contenido arbitrario, de este modo " -"creando artefactos digitales nativos en Bitcoin. La inscripción se realiza " -"enviando el satoshi que se desea inscribir en una transacción que revela " -"el contenido adjuntado a la inscripción en la cadena. Este contenido queda " -"inextricablemente vinculado a ese satoshi, convirtiéndolo en un artefacto " -"digital inmutable que puede ser rastreado, transferido, guardado, comprado, " -"vendido, perdido y redescubierto." +"Satoshis can be inscribed with arbitrary content, creating Bitcoin-native digital artifacts. Inscribing is done by sending the satoshi to be inscribed in a transaction that " +"reveals the inscription content on-chain. This content is then inextricably linked to that satoshi, turning it into an immutable digital artifact that can be tracked, " +"transferred, hoarded, bought, sold, lost, and rediscovered." +msgstr "" +"Los satoshis pueden ser inscritos con contenido arbitrario, de este modo creando artefactos digitales nativos en Bitcoin. La inscripción se realiza enviando el satoshi que se " +"desea inscribir en una transacción que revela el contenido adjuntado a la inscripción en la cadena. Este contenido queda inextricablemente vinculado a ese satoshi, convirtiéndolo " +"en un artefacto digital inmutable que puede ser rastreado, transferido, guardado, comprado, vendido, perdido y redescubierto." #: src/overview.md:231 msgid "Archaeology" @@ -801,297 +531,183 @@ msgstr "Arqueología" #: src/overview.md:234 msgid "" -"A lively community of archaeologists devoted to cataloging and collecting " -"early NFTs has sprung up. [Here's a great summary of historical NFTs by " -"Chainleft.](https://mirror.xyz/chainleft.eth/MzPWRsesC9mQflxlLo-N29oF4iwCgX3lacrvaG9Kjko)" +"A lively community of archaeologists devoted to cataloging and collecting early NFTs has sprung up. [Here's a great summary of historical NFTs by Chainleft.](https://mirror.xyz/" +"chainleft.eth/MzPWRsesC9mQflxlLo-N29oF4iwCgX3lacrvaG9Kjko)" msgstr "" -"Ha surgido una gran comunidad de arqueólogos que se dedican a catalogar y " -"coleccionar los primeros NFTs. [Aquí hay un gran resumen de los NFTs históricos " -"por Chainleft](https://mirror.xyz/chainleft.eth/MzPWRsesC9mQflxlLo-N29oF4iwCgX3lacrvaG9Kjko)." +"Ha surgido una gran comunidad de arqueólogos que se dedican a catalogar y coleccionar los primeros NFTs. [Aquí hay un gran resumen de los NFTs históricos por Chainleft](https://" +"mirror.xyz/chainleft.eth/MzPWRsesC9mQflxlLo-N29oF4iwCgX3lacrvaG9Kjko)." #: src/overview.md:238 -msgid "" -"A commonly accepted cut-off for early NFTs is March 19th, 2018, the date the " -"first ERC-721 contract, [SU SQUARES](https://tenthousandsu.com/), was " -"deployed on Ethereum." +msgid "A commonly accepted cut-off for early NFTs is March 19th, 2018, the date the first ERC-721 contract, [SU SQUARES](https://tenthousandsu.com/), was deployed on Ethereum." msgstr "" -"El 19 de marzo del 2018, por lo general es la fecha límite para referirnos a " -"los primeros NFT debido a que este día se implementó en Ethereum el primer " -"contrato ERC-721, [SU SQUARES](https://tenthousandsu.com/)." +"El 19 de marzo del 2018, por lo general es la fecha límite para referirnos a los primeros NFT debido a que este día se implementó en Ethereum el primer contrato ERC-721, [SU " +"SQUARES](https://tenthousandsu.com/)." #: src/overview.md:242 msgid "" -"Whether or not ordinals are of interest to NFT archaeologists is an open " -"question! In one sense, ordinals were created in early 2022, when the " -"Ordinals specification was finalized. In this sense, they are not of " -"historical interest." +"Whether or not ordinals are of interest to NFT archaeologists is an open question! In one sense, ordinals were created in early 2022, when the Ordinals specification was " +"finalized. In this sense, they are not of historical interest." msgstr "" -"¡Si los Ordinals son de interés o no para los arqueólogos de NFT siempre " -"será una pregunta abierta! Los ordinals fueron creados a principios del " -"2022, cuando se finalizaron las especificaciones de Ordinals. En este sentido, " -"no son de interés histórico." +"¡Si los Ordinals son de interés o no para los arqueólogos de NFT siempre será una pregunta abierta! Los ordinals fueron creados a principios del 2022, cuando se finalizaron las " +"especificaciones de Ordinals. En este sentido, no son de interés histórico." #: src/overview.md:247 msgid "" -"In another sense though, ordinals were in fact created by Satoshi Nakamoto " -"in 2009 when he mined the Bitcoin genesis block. In this sense, ordinals, " -"and especially early ordinals, are certainly of historical interest." +"In another sense though, ordinals were in fact created by Satoshi Nakamoto in 2009 when he mined the Bitcoin genesis block. In this sense, ordinals, and especially early " +"ordinals, are certainly of historical interest." msgstr "" -"Pero si miramos desde otra perspectiva, los ordinals fueron creados por " -"Satoshi Nakamoto en el 2009 cuando minó el bloque génesis de Bitcoin. " -"Desde este punto de vista, los ordinals, y especialmente los primeros ordinals, " -"ciertamente son de interés histórico." +"Pero si miramos desde otra perspectiva, los ordinals fueron creados por Satoshi Nakamoto en el 2009 cuando minó el bloque génesis de Bitcoin. Desde este punto de vista, los " +"ordinals, y especialmente los primeros ordinals, ciertamente son de interés histórico." #: src/overview.md:251 msgid "" -"Many ordinal theorists favor the latter view. This is not least because the " -"ordinals were independently discovered on at least two separate occasions, " -"long before the era of modern NFTs began." +"Many ordinal theorists favor the latter view. This is not least because the ordinals were independently discovered on at least two separate occasions, long before the era of " +"modern NFTs began." msgstr "" -"Muchos teóricos de ordinals favorecen este concepto. Esto se debe en parte " -"a que los ordinals fueron descubiertos en otras dos ocasiones, mucho antes " -"de que comenzara la era de los NFTs modernos." +"Muchos teóricos de ordinals favorecen este concepto. Esto se debe en parte a que los ordinals fueron descubiertos en otras dos ocasiones, mucho antes de que comenzara la era de " +"los NFTs modernos." #: src/overview.md:255 msgid "" -"On August 21st, 2012, Charlie Lee [posted a proposal to add proof-of-stake " -"to Bitcoin to the Bitcoin Talk " -"forum](https://bitcointalk.org/index.php?topic=102355.0). This wasn't an " -"asset scheme, but did use the ordinal algorithm, and was implemented but " -"never deployed." +"On August 21st, 2012, Charlie Lee [posted a proposal to add proof-of-stake to Bitcoin to the Bitcoin Talk forum](https://bitcointalk.org/index.php?topic=102355.0). This wasn't an " +"asset scheme, but did use the ordinal algorithm, and was implemented but never deployed." msgstr "" -"El 21 de agosto de 2012, Charlie Lee [publicó una propuesta en el foro de " -"Bitcoin Talk para añadir el Proof of Stake (PoS) o prueba de participación " -"a Bitcoin](https://bitcointalk.org/index.php?topic=102355.0). Esto no era " -"un esquema de activos, pero sí utilizaba el algoritmo de ordinals, y fue " -"implementado, pero nunca se utilizó." +"El 21 de agosto de 2012, Charlie Lee [publicó una propuesta en el foro de Bitcoin Talk para añadir el Proof of Stake (PoS) o prueba de participación a Bitcoin](https://" +"bitcointalk.org/index.php?topic=102355.0). Esto no era un esquema de activos, pero sí utilizaba el algoritmo de ordinals, y fue implementado, pero nunca se utilizó." #: src/overview.md:261 msgid "" -"On October 8th, 2012, jl2012 [posted a scheme to the same " -"forum](https://bitcointalk.org/index.php?topic=117224.0) which uses decimal " -"notation and has all the important properties of ordinals. The scheme was " -"discussed but never implemented." +"On October 8th, 2012, jl2012 [posted a scheme to the same forum](https://bitcointalk.org/index.php?topic=117224.0) which uses decimal notation and has all the important " +"properties of ordinals. The scheme was discussed but never implemented." msgstr "" -"El 8 de octubre de 2012, jl2012 [publicó una propuesta en el mismo " -"foro](https://bitcointalk.org/index.php?topic=117224.0) que utiliza notación " -"decimal y tiene todas las propiedades importantes de los ordinals. " -"Se discutió el esquema, pero nunca fue utilizado." +"El 8 de octubre de 2012, jl2012 [publicó una propuesta en el mismo foro](https://bitcointalk.org/index.php?topic=117224.0) que utiliza notación decimal y tiene todas las " +"propiedades importantes de los ordinals. Se discutió el esquema, pero nunca fue utilizado." #: src/overview.md:266 msgid "" -"These independent inventions of ordinals indicate in some way that ordinals " -"were discovered, or rediscovered, and not invented. The ordinals are an " -"inevitability of the mathematics of Bitcoin, stemming not from their modern " -"documentation, but from their ancient genesis. They are the culmination of a " -"sequence of events set in motion with the mining of the first block, so many " -"years ago." +"These independent inventions of ordinals indicate in some way that ordinals were discovered, or rediscovered, and not invented. The ordinals are an inevitability of the " +"mathematics of Bitcoin, stemming not from their modern documentation, but from their ancient genesis. They are the culmination of a sequence of events set in motion with the " +"mining of the first block, so many years ago." msgstr "" -"Estos inventos que son independientes a los ordinals indican de alguna manera " -"que los ordinals fueron descubiertos, o redescubiertos, y no inventados. Los " -"ordinals son algo inevitable que nace debido a la logística matemática de " -"Bitcoin, sus raíces no provienen de su documentación moderna, sino de su " -"génesis. Son la culminación de una secuencia de eventos que se han ido " -"desarrollando a través de los años y comenzó cuando se minó el primer bloque." +"Estos inventos que son independientes a los ordinals indican de alguna manera que los ordinals fueron descubiertos, o redescubiertos, y no inventados. Los ordinals son algo " +"inevitable que nace debido a la logística matemática de Bitcoin, sus raíces no provienen de su documentación moderna, sino de su génesis. Son la culminación de una secuencia de " +"eventos que se han ido desarrollando a través de los años y comenzó cuando se minó el primer bloque." #: src/digital-artifacts.md:4 -msgid "" -"Imagine a physical artifact. A rare coin, say, held safe for untold years in " -"the dark, secret clutch of a Viking hoard, now dug from the earth by your " -"grasping hands. It…" +msgid "Imagine a physical artifact. A rare coin, say, held safe for untold years in the dark, secret clutch of a Viking hoard, now dug from the earth by your grasping hands. It…" msgstr "" -"Imagina un artefacto físico. Digamos una moneda rara, guardada de forma segura " -"durante muchísimos años en el oscuro y secreto escondite de un tesoro vikingo, " -"ahora desenterrado por tus propias manos. Esta moneda..." +"Imagina un artefacto físico. Digamos una moneda rara, guardada de forma segura durante muchísimos años en el oscuro y secreto escondite de un tesoro vikingo, ahora desenterrado " +"por tus propias manos. Esta moneda…" #: src/digital-artifacts.md:8 -msgid "" -"…has an owner. You. As long as you keep it safe, nobody can take it from you." -msgstr "" -"...tiene un dueño. Tú. Mientras la mantengas a salvo, nadie puede quitártela." +msgid "…has an owner. You. As long as you keep it safe, nobody can take it from you." +msgstr "...tiene un dueño. Tú. Mientras la mantengas a salvo, nadie puede quitártela." #: src/digital-artifacts.md:10 msgid "…is complete. It has no missing parts." msgstr "...está completa. No le falta ninguna pieza." #: src/digital-artifacts.md:12 -msgid "" -"…can only be changed by you. If you were a trader, and you made your way to " -"18th century China, none but you could stamp it with your chop-mark." -msgstr "" -"...solo puede ser modificada por ti. Si fueras comerciante y llegaras a la " -"China del siglo XVIII, solo tu podrías marcarla con tu sello personal." +msgid "…can only be changed by you. If you were a trader, and you made your way to 18th century China, none but you could stamp it with your chop-mark." +msgstr "...solo puede ser modificada por ti. Si fueras comerciante y llegaras a la China del siglo XVIII, solo tu podrías marcarla con tu sello personal." #: src/digital-artifacts.md:15 -msgid "" -"…can only be disposed of by you. The sale, trade, or gift is yours to make, " -"to whomever you wish." -msgstr "" -"...solo puede ser desechada por ti. La decisión de vender, intercambiar o " -"regalarla es tuya, y a quien tú desees." +msgid "…can only be disposed of by you. The sale, trade, or gift is yours to make, to whomever you wish." +msgstr "...solo tú puedes deshacerte de ella. La elección de venderla, intercambiarla o regalarla es tuya y de la persona que elijas." #: src/digital-artifacts.md:18 -msgid "" -"What are digital artifacts? Simply put, they are the digital equivalent of " -"physical artifacts." -msgstr "" -"¿Qué son los artefactos digitales? Pues simplemente, son el equivalente digital " -"de los artefactos físicos." +msgid "What are digital artifacts? Simply put, they are the digital equivalent of physical artifacts." +msgstr "¿Qué son los artefactos digitales? Pues simplemente, son el equivalente digital de los artefactos físicos." #: src/digital-artifacts.md:21 -msgid "" -"For a digital thing to be a digital artifact, it must be like that coin of " -"yours:" -msgstr "" -"Para que algo digital sea un artefacto digital, debe ser como esa moneda tuya:" +msgid "For a digital thing to be a digital artifact, it must be like that coin of yours:" +msgstr "Para que algo digital sea un artefacto digital, debe ser como esa moneda tuya:" #: src/digital-artifacts.md:24 -msgid "" -"Digital artifacts can have owners. A number is not a digital artifact, " -"because nobody can own it." -msgstr "" -"Los artefactos digitales pueden tener dueño. Un número no es un artefacto " -"digital, porque nadie puede ser dueño de él." +msgid "Digital artifacts can have owners. A number is not a digital artifact, because nobody can own it." +msgstr "Los artefactos digitales pueden tener dueño. Un número no es un artefacto digital, porque nadie puede ser dueño de él." #: src/digital-artifacts.md:27 -msgid "" -"Digital artifacts are complete. An NFT that points to off-chain content on " -"IPFS or Arweave is incomplete, and thus not a digital artifact." +msgid "Digital artifacts are complete. An NFT that points to off-chain content on IPFS or Arweave is incomplete, and thus not a digital artifact." msgstr "" -"Los artefactos digitales están completos. Un NFT que apunta a contenido fuera " -"de cadena alojado en IPFS o Arweave está incompleto, y por lo tanto no es un " -"artefacto digital." +"Los artefactos digitales están completos. Un NFT que apunta a contenido fuera de cadena alojado en IPFS o Arweave está incompleto, y por lo tanto no es un artefacto digital." #: src/digital-artifacts.md:30 -msgid "" -"Digital artifacts are permissionless. An NFT which cannot be sold without " -"paying a royalty is not permissionless, and thus not a digital artifact." -msgstr "" -"Los artefactos digitales son sin permiso. Un NFT que no pueda ser vendido " -"sin tener que pagar regalías no es sin permisos, y por lo tanto no es un " -"artefacto digital." +msgid "Digital artifacts are permissionless. An NFT which cannot be sold without paying a royalty is not permissionless, and thus not a digital artifact." +msgstr "Los artefactos digitales son sin permiso. Un NFT que no pueda ser vendido sin tener que pagar regalías no es sin permisos, y por lo tanto no es un artefacto digital." #: src/digital-artifacts.md:33 -msgid "" -"Digital artifacts are uncensorable. Perhaps you can change a database entry " -"on a centralized ledger today, but maybe not tomorrow, and thus one cannot " -"be a digital artifact." +msgid "Digital artifacts are uncensorable. Perhaps you can change a database entry on a centralized ledger today, but maybe not tomorrow, and thus one cannot be a digital artifact." msgstr "" -"Los artefactos digitales no pueden ser censurados. Puede que hoy en día se " -"permita cambiar la información en una base de datos centralizada, pero tal " -"vez mañana no sea posible, por lo tanto, no puede ser un artefacto digital." +"Los artefactos digitales no pueden ser censurados. Puede que hoy en día se permita cambiar la información en una base de datos centralizada, pero tal vez mañana no sea posible, " +"por lo tanto, no puede ser un artefacto digital." #: src/digital-artifacts.md:37 -msgid "" -"Digital artifacts are immutable. An NFT with an upgrade key is not a digital " -"artifact." -msgstr "" -"Los artefactos digitales son inmutables. Un NFT con una llave de actualización " -"o dinámico no es un artefacto digital." +msgid "Digital artifacts are immutable. An NFT with an upgrade key is not a digital artifact." +msgstr "Los artefactos digitales son inmutables. Un NFT con una llave de actualización o dinámico no es un artefacto digital." #: src/digital-artifacts.md:40 -msgid "" -"The definition of a digital artifact is intended to reflect what NFTs " -"_should_ be, sometimes are, and what inscriptions _always_ are, by their " -"very nature." -msgstr "" -"La definición de un artefacto digital tiene la intención de reflejar lo " -"que deberían ser los NFTs, y lo que _siempre_ serán las inscripciones debido " -"a su naturaleza." +msgid "The definition of a digital artifact is intended to reflect what NFTs _should_ be, sometimes are, and what inscriptions _always_ are, by their very nature." +msgstr "La definición de un artefacto digital tiene la intención de reflejar lo que deberían ser los NFTs, y lo que _siempre_ serán las inscripciones debido a su naturaleza." #: src/inscriptions.md:4 msgid "" -"Inscriptions inscribe sats with arbitrary content, creating bitcoin-native " -"digital artifacts, more commonly known as NFTs. Inscriptions do not require " -"a sidechain or separate token." +"Inscriptions inscribe sats with arbitrary content, creating bitcoin-native digital artifacts, more commonly known as NFTs. Inscriptions do not require a sidechain or separate " +"token." msgstr "" -"En una inscripción inscribimos contenido arbitrario en un sat, con este proceso " -"creamos artefactos digitales nativos de Bitcoin, comúnmente conocidos como NFTs. " -"Las inscripciones no requieren una cadena lateral ni un token aparte." +"En una inscripción inscribimos contenido arbitrario en un sat, con este proceso creamos artefactos digitales nativos de Bitcoin, comúnmente conocidos como NFTs. Las inscripciones " +"no requieren una cadena lateral ni un token aparte." #: src/inscriptions.md:8 msgid "" -"These inscribed sats can then be transferred using bitcoin transactions, " -"sent to bitcoin addresses, and held in bitcoin UTXOs. These transactions, " -"addresses, and UTXOs are normal bitcoin transactions, addresses, and UTXOS " -"in all respects, with the exception that in order to send individual sats, " -"transactions must control the order and value of inputs and outputs " -"according to ordinal theory." +"These inscribed sats can then be transferred using bitcoin transactions, sent to bitcoin addresses, and held in bitcoin UTXOs. These transactions, addresses, and UTXOs are normal " +"bitcoin transactions, addresses, and UTXOS in all respects, with the exception that in order to send individual sats, transactions must control the order and value of inputs and " +"outputs according to ordinal theory." msgstr "" -"Los sats que se han inscrito pueden ser transferidos en una transacción " -"de bitcoin, ser enviados a direcciones Bitcoin y ser contenidos en " -"UTXOs (transacción de salida no gastada) de Bitcoin. Todos estos procesos se " -"llevan a cabo como se han hecho normalmente en Bitcoin, con la excepción de " -"que, para enviar cada sat, las transacciones deben controlar el orden y el valor " -"de las entradas y salidas según la teoría Ordinal." +"Los sats que se han inscrito pueden ser transferidos en una transacción de bitcoin, ser enviados a direcciones Bitcoin y ser contenidos en UTXOs (transacción de salida no " +"gastada) de Bitcoin. Todos estos procesos se llevan a cabo como se han hecho normalmente en Bitcoin, con la excepción de que, para enviar cada sat, las transacciones deben " +"controlar el orden y el valor de las entradas y salidas según la teoría Ordinal." #: src/inscriptions.md:15 msgid "" -"The inscription content model is that of the web. An inscription consists of " -"a content type, also known as a MIME type, and the content itself, which is " -"a byte string. This allows inscription content to be returned from a web " -"server, and for creating HTML inscriptions that use and remix the content of " -"other inscriptions." +"The inscription content model is that of the web. An inscription consists of a content type, also known as a MIME type, and the content itself, which is a byte string. This " +"allows inscription content to be returned from a web server, and for creating HTML inscriptions that use and remix the content of other inscriptions." msgstr "" -"El modelo de contenido de las inscripciones funciona similar al de la web." -"Una inscripción está conformada por el tipo de contenido, conocido como el " -"tipo MIME, y el contenido que es una cadena de bytes. Esto permite que el " -"contenido de la inscripción se pueda obtener de un servidor web y tener la " -"posibilidad de crear inscripciones HTML que usen el contenido de otras " -"inscripciones." +"El modelo de contenido de las inscripciones funciona similar al de la web.Una inscripción está conformada por el tipo de contenido, conocido como el tipo MIME, y el contenido que " +"es una cadena de bytes. Esto permite que el contenido de la inscripción se pueda obtener de un servidor web y tener la posibilidad de crear inscripciones HTML que usen el " +"contenido de otras inscripciones." #: src/inscriptions.md:21 msgid "" -"Inscription content is entirely on-chain, stored in taproot script-path " -"spend scripts. Taproot scripts have very few restrictions on their content, " -"and additionally receive the witness discount, making inscription content " -"storage relatively economical." +"Inscription content is entirely on-chain, stored in taproot script-path spend scripts. Taproot scripts have very few restrictions on their content, and additionally receive the " +"witness discount, making inscription content storage relatively economical." msgstr "" -"El contenido de la inscripción está completamente en la cadena de bloques " -"o blockchain, almacenado en scripts de taproot. Los scripts de taproot tienen " -"muy pocas restricciones en cuanto a lo que pueden contener, y además reciben " -"el descuento de testigo, lo que hace que el almacenamiento de contenido de las " -"inscripciones sea relativamente económico." +"El contenido de la inscripción está completamente en la cadena de bloques o blockchain, almacenado en scripts de taproot. Los scripts de taproot tienen muy pocas restricciones en " +"cuanto a lo que pueden contener, y además reciben el descuento de testigo, lo que hace que el almacenamiento de contenido de las inscripciones sea relativamente económico." #: src/inscriptions.md:26 msgid "" -"Since taproot script spends can only be made from existing taproot outputs, " -"inscriptions are made using a two-phase commit/reveal procedure. First, in " -"the commit transaction, a taproot output committing to a script containing " -"the inscription content is created. Second, in the reveal transaction, the " -"output created by the commit transaction is spent, revealing the inscription " -"content on-chain." -msgstr "" -"Dado que los gastos de script de taproot (taproot script spends) sólo pueden " -"hacerse desde salidas de taproot existentes, las inscripciones se hacen en dos " -"fases de compromiso/revelación. Primero, en la transacción de compromiso, se " -"crea una salida de taproot que se compromete a un script que contiene el " -"contenido de inscripción. Segundo, en la transacción de revelación, la salida " -"creada por la transacción de compromiso se gasta, revelando el contenido de la " -"inscripción en la cadena." +"Since taproot script spends can only be made from existing taproot outputs, inscriptions are made using a two-phase commit/reveal procedure. First, in the commit transaction, a " +"taproot output committing to a script containing the inscription content is created. Second, in the reveal transaction, the output created by the commit transaction is spent, " +"revealing the inscription content on-chain." +msgstr "" +"Dado que los gastos de script de taproot (taproot script spends) sólo pueden hacerse desde salidas de taproot existentes, las inscripciones se hacen en dos fases de compromiso/" +"revelación. Primero, en la transacción de compromiso, se crea una salida de taproot que se compromete a un script que contiene el contenido de inscripción. Segundo, en la " +"transacción de revelación, la salida creada por la transacción de compromiso se gasta, revelando el contenido de la inscripción en la cadena." #: src/inscriptions.md:33 msgid "" -"Inscription content is serialized using data pushes within unexecuted " -"conditionals, called \"envelopes\". Envelopes consist of an `OP_FALSE OP_IF " -"… OP_ENDIF` wrapping any number of data pushes. Because envelopes are " -"effectively no-ops, they do not change the semantics of the script in which " -"they are included, and can be combined with any other locking script." +"Inscription content is serialized using data pushes within unexecuted conditionals, called \"envelopes\". Envelopes consist of an `OP_FALSE OP_IF … OP_ENDIF` wrapping any number " +"of data pushes. Because envelopes are effectively no-ops, they do not change the semantics of the script in which they are included, and can be combined with any other locking " +"script." msgstr "" -"El contenido de la inscripción se serializa utilizando push de datos " -"dentro de condicionales que no han sido ejecutados, a estos se les llama \"sobres\". " -"Los sobres consisten en un `OP_FALSE OP_IF ... OP_ENDIF` envolviendo los push de datos. " -"Dado que los sobres son operaciones nulas, no cambian la semántica del script " -"en el que están incluidos y pueden combinarse con cualquier otro script de " -"bloqueo." +"El contenido de la inscripción se serializa utilizando push de datos dentro de condicionales que no han sido ejecutados, a estos se les llama \"sobres\". Los sobres consisten en " +"un `OP_FALSE OP_IF ... OP_ENDIF` envolviendo los push de datos. Dado que los sobres son operaciones nulas, no cambian la semántica del script en el que están incluidos y pueden " +"combinarse con cualquier otro script de bloqueo." #: src/inscriptions.md:39 -msgid "" -"A text inscription containing the string \"Hello, world!\" is serialized as " -"follows:" -msgstr "" -"Una inscripción de texto que contiene la cadena \"¡Hola, Mundo!\" se serializa " -"de la siguiente manera:" +msgid "A text inscription containing the string \"Hello, world!\" is serialized as follows:" +msgstr "Una inscripción de texto que contiene la cadena \"¡Hola, Mundo!\" se serializa de la siguiente manera:" #: src/inscriptions.md:42 msgid "" @@ -1118,314 +734,318 @@ msgstr "" "```" #: src/inscriptions.md:53 -msgid "" -"First the string `ord` is pushed, to disambiguate inscriptions from other " -"uses of envelopes." -msgstr "" -"Primero, se hace un push con el string `ord` para diferenciar que sobre va " -"a utilizar la inscripción." +msgid "First the string `ord` is pushed, to disambiguate inscriptions from other uses of envelopes." +msgstr "Primero, se hace un push con el string `ord` para diferenciar que sobre va a utilizar la inscripción." #: src/inscriptions.md:56 msgid "" -"`OP_PUSH 1` indicates that the next push contains the content type, and " -"`OP_PUSH 0`indicates that subsequent data pushes contain the content itself. " -"Multiple data pushes must be used for large inscriptions, as one of " -"taproot's few restrictions is that individual data pushes may not be larger " -"than 520 bytes." +"`OP_PUSH 1` indicates that the next push contains the content type, and `OP_PUSH 0`indicates that subsequent data pushes contain the content itself. Multiple data pushes must be " +"used for large inscriptions, as one of taproot's few restrictions is that individual data pushes may not be larger than 520 bytes." msgstr "" -"`OP_PUSH 1` indica que el próximo push es el tipo de contenido y `OP_PUSH 0` " -"indica que los siguientes datos en el push contienen el contenido que se va a " -"anexar. Múltiples push de datos deben ser utilizados para inscripciones de gran " -"tamaño ya que una de las pocas restricciones de Taproot es que un push de datos " -"no puede ser mayor a 520 bytes." +"`OP_PUSH 1` indica que el próximo push es el tipo de contenido y `OP_PUSH 0` indica que los siguientes datos en el push contienen el contenido que se va a anexar. Múltiples push " +"de datos deben ser utilizados para inscripciones de gran tamaño ya que una de las pocas restricciones de Taproot es que un push de datos no puede ser mayor a 520 bytes." #: src/inscriptions.md:62 msgid "" -"The inscription content is contained within the input of a reveal " -"transaction, and the inscription is made on the first sat of its input. This " -"sat can then be tracked using the familiar rules of ordinal theory, allowing " -"it to be transferred, bought, sold, lost to fees, and recovered." +"The inscription content is contained within the input of a reveal transaction, and the inscription is made on the first sat of its input if it has no pointer field. This sat can " +"then be tracked using the familiar rules of ordinal theory, allowing it to be transferred, bought, sold, lost to fees, and recovered." msgstr "" -"El modelo de datos de las inscripciones es el de una respuesta HTTP, " -"permitiendo que el contenido de la inscripción sea obtenido a través de un " -"servidor web y visualizado en un navegador web." +"El contenido de la inscripción se encuentra dentro de la entrada de una transacción de revelación, y la inscripción se crea en el primer satoshi de su entrada si este no tiene un " +"campo de puntero. Este satoshi puede ser rastreado utilizando las reglas de la teoría ordinal, lo que permite que sea transferido, comprado, vendido, perdido en las tarifas y " +"recuperado." #: src/inscriptions.md:67 msgid "Content" msgstr "Contenido" #: src/inscriptions.md:70 -msgid "" -"The data model of inscriptions is that of a HTTP response, allowing " -"inscription content to be served by a web server and viewed in a web browser." +msgid "The data model of inscriptions is that of a HTTP response, allowing inscription content to be served by a web server and viewed in a web browser." msgstr "" -"El modelo de datos de las inscripciones es el de una respuesta HTTP, " -"permitiendo que el contenido de la inscripción sea obtenido a través de un servidor " -"web y visualizado en un navegador web." +"El modelo de datos de las inscripciones es el de una respuesta HTTP, permitiendo que el contenido de la inscripción sea obtenido a través de un servidor web y visualizado en un " +"navegador web." #: src/inscriptions.md:73 msgid "Fields" msgstr "Campos" #: src/inscriptions.md:76 -msgid "" -"Inscriptions may include fields before an optional body. Each field consists " -"of two data pushes, a tag and a value." -msgstr "" -"Las inscripciones pueden incluir campos antes de un cuerpo opcional. " -"Cada campo consta de dos push de datos, una etiqueta y un valor." +msgid "Inscriptions may include fields before an optional body. Each field consists of two data pushes, a tag and a value." +msgstr "Las inscripciones pueden incluir campos antes de un cuerpo opcional. Cada campo consta de dos push de datos, una etiqueta y un valor." #: src/inscriptions.md:79 -msgid "" -"Currently, the only defined field is `content-type`, with a tag of `1`, " -"whose value is the MIME type of the body." -msgstr "" -"Actualmente, el único campo definido es `content-type`, con una " -"etiqueta de `1`, cuyo valor es el tipo MIME del cuerpo." +msgid "Currently, there are six defined fields:" +msgstr "Actualmente, hay seis campos definidos:" + +#: src/inscriptions.md:81 +msgid "`content_type`, with a tag of `1`, whose value is the MIME type of the body." +msgstr "`content_type`, con una etiqueta de `1`, cuyo valor es el tipo MIME del cuerpo." #: src/inscriptions.md:82 -msgid "" -"The beginning of the body and end of fields is indicated with an empty data " -"push." -msgstr "" -"Para indicar el principio del cuerpo y el final de los campos se hace " -"un push de datos vacío." +msgid "`pointer`, with a tag of `2`, see [pointer docs](inscriptions/pointer.md)." +msgstr "`pointer`, con una etiqueta de `2`, ver [documentación de punteros](inscriptions/pointer.md)." + +#: src/inscriptions.md:83 +msgid "`parent`, with a tag of `3`, see [provenance](inscriptions/provenance.md)." +msgstr "`parent`, con una etiqueta de 3, ver [proveniencia](inscriptions/provenance.md)." + +#: src/inscriptions.md:84 +msgid "`metadata`, with a tag of `5`, see [metadata](inscriptions/metadata.md)." +msgstr "`metadata`, con una etiqueta de `5`, ver [metadatos](inscriptions/metadata.md)." #: src/inscriptions.md:85 -msgid "" -"Unrecognized tags are interpreted differently depending on whether they are " -"even or odd, following the \"it's okay to be odd\" rule used by the " -"Lightning Network." -msgstr "" -"Las etiquetas no reconocidas se interpretan de forma diferente según sean pares " -"o impares, siguiendo la regla \"está bien que sean impares\" utilizada por la " -"Lightning Network." +msgid "`metaprotocol`, with a tag of `7`, whose value is the metaprotocol identifier." +msgstr "`metaprotocol`, con una etiqueta de `7`, cuyo valor es el identificador del metaprotocolo." + +#: src/inscriptions.md:86 +msgid "`content_encoding`, with a tag of `9`, whose value is the encoding of the body." +msgstr "`content_encoding`, con una etiqueta de `9`, cuyo valor es la codificación del cuerpo." + +#: src/inscriptions.md:87 +msgid "`delegate`, with a tag of `11`, see [delegate](inscriptions/delegate.md)." +msgstr "`delegate`, con una etiqueta de 11, ver [delegado](inscriptions/delegate.md)." #: src/inscriptions.md:89 -msgid "" -"Even tags are used for fields which may affect creation, initial assignment, " -"or transfer of an inscription. Thus, inscriptions with unrecognized even " -"fields must be displayed as \"unbound\", that is, without a location." +msgid "The beginning of the body and end of fields is indicated with an empty data push." +msgstr "Para indicar el principio del cuerpo y el final de los campos se hace un push de datos vacío." + +#: src/inscriptions.md:92 +msgid "Unrecognized tags are interpreted differently depending on whether they are even or odd, following the \"it's okay to be odd\" rule used by the Lightning Network." msgstr "" -"Las etiquetas pares se utilizan para campos que pueden afectar a la creación, " -"asignación inicial o transferencia de una inscripción. Por esto, las inscripciones " -"con campos pares no reconocidos deben mostrarse como \"no vinculadas\", es decir, " -"sin ubicación." +"Las etiquetas no reconocidas se interpretan de forma diferente según sean pares o impares, siguiendo la regla \"está bien que sean impares\" utilizada por la Lightning Network." -#: src/inscriptions.md:93 +#: src/inscriptions.md:96 msgid "" -"Odd tags are used for fields which do not affect creation, initial " -"assignment, or transfer, such as additional metadata, and thus are safe to " -"ignore." +"Even tags are used for fields which may affect creation, initial assignment, or transfer of an inscription. Thus, inscriptions with unrecognized even fields must be displayed as " +"\"unbound\", that is, without a location." msgstr "" -"Las etiquetas impares se utilizan para campos que no afectan a la creación," -"asignación inicial o transferencia, tales como los metadatos adicionales, y " -"por lo tanto se pueden ignorar." +"Las etiquetas pares se utilizan para campos que pueden afectar a la creación, asignación inicial o transferencia de una inscripción. Por esto, las inscripciones con campos pares " +"no reconocidos deben mostrarse como \"no vinculadas\", es decir, sin ubicación." -#: src/inscriptions.md:96 +#: src/inscriptions.md:100 +msgid "Odd tags are used for fields which do not affect creation, initial assignment, or transfer, such as additional metadata, and thus are safe to ignore." +msgstr "" +"Las etiquetas impares se utilizan para campos que no afectan a la creación,asignación inicial o transferencia, tales como los metadatos adicionales, y por lo tanto se pueden " +"ignorar." + +#: src/inscriptions.md:103 msgid "Inscription IDs" -msgstr "IDs de las Inscripciones" +msgstr "ID de las Inscripciones" -#: src/inscriptions.md:99 -msgid "" -"The inscriptions are contained within the inputs of a reveal transaction. In " -"order to uniquely identify them they are assigned an ID of the form:" -msgstr "" -"Las inscripciones están alojadas en las entradas de una transacción de " -"revelación. Para identificarlas se les asigna un ID como este:" +#: src/inscriptions.md:106 +msgid "The inscriptions are contained within the inputs of a reveal transaction. In order to uniquely identify them they are assigned an ID of the form:" +msgstr "Las inscripciones están alojadas en las entradas de una transacción de revelación. Para identificarlas se les asigna un ID como este:" -#: src/inscriptions.md:102 +#: src/inscriptions.md:109 msgid "`521f8eccffa4c41a3a7728dd012ea5a4a02feed81f41159231251ecf1e5c79dai0`" msgstr "`521f8eccffa4c41a3a7728dd012ea5a4a02feed81f41159231251ecf1e5c79dai0`" -#: src/inscriptions.md:104 +#: src/inscriptions.md:111 msgid "" -"The part in front of the `i` is the transaction ID (`txid`) of the reveal " -"transaction. The number after the `i` defines the index (starting at 0) of " -"new inscriptions being inscribed in the reveal transaction." +"The part in front of the `i` is the transaction ID (`txid`) of the reveal transaction. The number after the `i` defines the index (starting at 0) of new inscriptions being " +"inscribed in the reveal transaction." msgstr "" -"La parte delante de la `i` es el ID de transacción (`txid`) de la " -"transacción de revelación. El número después la `i` es el índice (comenzando por 0) " -"de las nuevas inscripciones que se están inscribiendo en la transacción " -"de revelación." +"La parte delante de la `i` es el ID de transacción (`txid`) de la transacción de revelación. El número después la `i` es el índice (comenzando por 0) de las nuevas inscripciones " +"que se están inscribiendo en la transacción de revelación." -#: src/inscriptions.md:108 +#: src/inscriptions.md:115 msgid "" -"Inscriptions can either be located in different inputs, within the same " -"input or a combination of both. In any case the ordering is clear, since a " -"parser would go through the inputs consecutively and look for all " -"inscription `envelopes`." +"Inscriptions can either be located in different inputs, within the same input or a combination of both. In any case the ordering is clear, since a parser would go through the " +"inputs consecutively and look for all inscription `envelopes`." msgstr "" -"Las inscripciones pueden estar en diferentes entradas, dentro de la misma " -"entrada o en una combinación de ambas. En ambos de estos casos, el orden es " -"claro, ya que un analizador sintáctico (parser) recorrería las entradas " -"consecutivamente buscando los `sobres` de las inscripciones." +"Las inscripciones pueden estar en diferentes entradas, dentro de la misma entrada o en una combinación de ambas. En ambos de estos casos, el orden es claro, ya que un analizador " +"sintáctico (parser) recorrería las entradas consecutivamente buscando los `sobres` de las inscripciones." -#: src/inscriptions.md:112 +#: src/inscriptions.md:119 msgid "Input" msgstr "Entrada" -#: src/inscriptions.md:112 +#: src/inscriptions.md:119 msgid "Inscription Count" msgstr "Conteo de Inscripciones" -#: src/inscriptions.md:112 +#: src/inscriptions.md:119 msgid "Indices" msgstr "Índice" -#: src/inscriptions.md:114 -#: src/inscriptions.md:117 +#: src/inscriptions.md:121 src/inscriptions.md:124 src/runes/specification.md:196 src/runes/specification.md:197 src/runes/specification.md:340 src/runes/specification.md:422 msgid "0" msgstr "0" -#: src/inscriptions.md:114 -#: src/inscriptions.md:116 +#: src/inscriptions.md:121 src/inscriptions.md:123 src/runes/specification.md:197 src/runes/specification.md:342 msgid "2" msgstr "2" -#: src/inscriptions.md:114 +#: src/inscriptions.md:121 msgid "i0, i1" msgstr "i0, il" -#: src/inscriptions.md:115 -#: src/inscriptions.md:115 -#: src/inscriptions.md:118 +#: src/inscriptions.md:122 src/inscriptions.md:125 src/runes/specification.md:177 src/runes/specification.md:178 src/runes/specification.md:179 src/runes/specification.md:186 +#: src/runes/specification.md:188 src/runes/specification.md:189 src/runes/specification.md:195 src/runes/specification.md:197 src/runes/specification.md:198 +#: src/runes/specification.md:341 src/runes/specification.md:423 msgid "1" msgstr "1" -#: src/inscriptions.md:115 +#: src/inscriptions.md:122 msgid "i2" msgstr "i2" -#: src/inscriptions.md:116 -#: src/inscriptions.md:117 +#: src/inscriptions.md:123 src/inscriptions.md:124 src/runes/specification.md:180 src/runes/specification.md:187 src/runes/specification.md:196 src/runes/specification.md:343 msgid "3" msgstr "3" -#: src/inscriptions.md:116 +#: src/inscriptions.md:123 msgid "i3, i4, i5" -msgstr "i3. i4, i5" +msgstr "i3, i4, i5" -#: src/inscriptions.md:118 +#: src/inscriptions.md:125 src/runes/specification.md:178 src/runes/specification.md:189 src/runes/specification.md:198 msgid "4" msgstr "4" -#: src/inscriptions.md:118 +#: src/inscriptions.md:125 msgid "i6" msgstr "i6" -#: src/inscriptions.md:120 -msgid "Sandboxing" -msgstr "Sandboxing o Aislamiento" +#: src/inscriptions.md:127 +msgid "Inscription Numbers" +msgstr "Números de Inscripción" -#: src/inscriptions.md:123 +#: src/inscriptions.md:130 msgid "" -"HTML and SVG inscriptions are sandboxed in order to prevent references to " -"off-chain content, thus keeping inscriptions immutable and self-contained." +"Inscriptions are assigned inscription numbers starting at zero, first by the order reveal transactions appear in blocks, and the order that reveal envelopes appear in those " +"transactions." msgstr "" -"Las inscripciones en HTML y SVG están restringidas en un entorno aislado " -"llamado sandboxing para evitar referencias a contenido fuera de la cadena, " -"manteniendo así las inscripciones inmutables y contenidas dentro del entorno." +"Las inscripciones se les asignan números de inscripción comenzando desde cero, basados en el orden en que aparecen las transacciones de revelación dentro de los bloques y el " +"orden de los sobres de revelación dentro de esas transacciones." -#: src/inscriptions.md:126 +#: src/inscriptions.md:134 msgid "" -"This is accomplished by loading HTML and SVG inscriptions inside `iframes` " -"with the `sandbox` attribute, as well as serving inscription content with " -"`Content-Security-Policy` headers." +"Due to a historical bug in `ord` which cannot be fixed without changing a great many inscription numbers, inscriptions which are revealed and then immediately spent to fees are " +"numbered as if they appear last in the block in which they are revealed." msgstr "" -"Esto se logra cargando las inscripciones en HTML y SVG dentro de `iframes` " -"con el atributo `sandbox` y agregando `Content-Security-Policy` a los encabezados." +"Debido a un error histórico en ord que no se puede corregir sin cambiar una gran cantidad de números de inscripción, las inscripciones que se revelan y luego se gastan " +"inmediatamente en tarifas se numeran como si aparecieran al final en el bloque en el que se revelan." -#: src/inscriptions/provenance.md:4 +#: src/inscriptions.md:139 msgid "" -"The owner of an inscription can create child inscriptions, trustlessly " -"establishing the provenance of those children on-chain as having been " -"created by the owner of the parent inscription. This can be used for " -"collections, with the children of a parent inscription being members of the " -"same collection." +"Inscriptions which are cursed are numbered starting at negative one, counting down. Cursed inscriptions on and after the jubilee at block 824544 are vindicated, and are assigned " +"positive inscription numbers." msgstr "" -"El propietario de una inscripción puede crear inscripciones hijas, esto " -"establece una procedencia sin permiso de que esos hijos en la cadena fueron " -"creados por el dueño de la inscripción padre. Esto puede utilizarse para " -"colecciones, en las que los hijos de una inscripción son miembros de la " -"misma colección." +"Las inscripciones que están marcadas como embrujdas reciben números de inscripción comenzando desde menos uno y contando hacia abajo. Aquellas inscripciones marcadas como " +"embrujadas desde el jubileo en el bloque 824544 son redimidas y se les asignan números de inscripción positivos." -#: src/inscriptions/provenance.md:9 +#: src/inscriptions.md:143 +msgid "Sandboxing" +msgstr "Sandboxing o Aislamiento" + +#: src/inscriptions.md:146 +msgid "HTML and SVG inscriptions are sandboxed in order to prevent references to off-chain content, thus keeping inscriptions immutable and self-contained." +msgstr "" +"Las inscripciones en HTML y SVG están restringidas en un entorno aislado llamado sandboxing para evitar referencias a contenido fuera de la cadena, manteniendo así las " +"inscripciones inmutables y contenidas dentro del entorno." + +#: src/inscriptions.md:149 +msgid "" +"This is accomplished by loading HTML and SVG inscriptions inside `iframes` with the `sandbox` attribute, as well as serving inscription content with `Content-Security-Policy` " +"headers." +msgstr "Esto se logra cargando las inscripciones en HTML y SVG dentro de `iframes` con el atributo `sandbox` y agregando `Content-Security-Policy` a los encabezados." + +#: src/inscriptions.md:153 +msgid "Self-Reference" +msgstr "Autorreferencia" + +#: src/inscriptions.md:156 +msgid "The content of the inscription with ID `INSCRIPTION_ID` must served from the URL path `/content/`." +msgstr "El contenido asociado a la inscripción identificada por el ID `INSCRIPTION_ID` debe estar disponible desde la ruta URL /content/." + +#: src/inscriptions.md:159 +msgid "This allows inscriptions to retrieve their own inscription ID with:" +msgstr "Esto permite que las inscripciones obtengan su propio ID de inscripción usando:" + +#: src/inscriptions.md:162 +msgid "\"/\"" +msgstr "\"/\"" + +#: src/inscriptions.md:165 msgid "" -"Children can themselves have children, allowing for complex hierarchies. For " -"example, an artist might create an inscription representing themselves, with " -"sub inscriptions representing collections that they create, with the " -"children of those sub inscriptions being items in those collections." +"If an inscription with ID X delegates to an inscription with ID Y, that is to say, if inscription X contains a delegate field with value Y, the content of inscription X must be " +"served from the URL path `/content/X`, _not_ `/content/Y`." msgstr "" -"Los hijos pueden tener a su vez hijos, lo que permite crear jerarquías " -"complejas. Por ejemplo, un artista puede crear una inscripción que lo represente " -"a él mismo, con sub-inscripciones que representen colecciones creadas por él, " -"siendo los hijos de esas sub-inscripciones elementos de esas colecciones." +"Si una inscripción con ID X delega a una inscripción con ID Y, es decir, si la inscripción X contiene un campo de delegado con el valor Y, entonces el contenido de la inscripción " +"X debe estar disponible desde la ruta URL `/content/X`, no desde `/content/Y`." -#: src/inscriptions/provenance.md:14 -msgid "Specification" -msgstr "Especificaciónes" +#: src/inscriptions.md:170 +msgid "This allows delegating inscriptions to use their own inscription ID as a seed for generative delegate content." +msgstr "Esto permite que las inscripciones delegadas utilicen su propio ID de inscripción como semilla para generar contenido delegado." -#: src/inscriptions/provenance.md:16 -msgid "To create a child inscription C with parent inscription P:" -msgstr "Para crear el hijo de una inscripción C con una inscripción padre P:" +#: src/inscriptions.md:173 +msgid "Reinscriptions" +msgstr "Reinscripciones" -#: src/inscriptions/provenance.md:18 -msgid "Create an inscribe transaction T as usual for C." -msgstr "Crear una transacción de inscripción T como de costumbre para C." +#: src/inscriptions.md:176 +msgid "" +"Previously inscribed sats can be reinscribed with the `--reinscribe` command if the inscription is present in the wallet. This will only append an inscription to a sat, not " +"change the initial inscription." +msgstr "" +"Los satoshis previamente inscritos pueden reinscribirse con el comando `--reinscribe` si la inscripción está presente en el monedero. Esto solo añadirá una inscripción adicional " +"a un satoshi, sin modificar la inscripción inicial." -#: src/inscriptions/provenance.md:19 -msgid "Spend the parent P in one of the inputs of T." -msgstr "Gasta el padre P en una de las entradas de T." +#: src/inscriptions.md:180 +msgid "Reinscribe with satpoint: `ord wallet inscribe --fee-rate --reinscribe --file --satpoint `" +msgstr "Reinscribe con el satpoint: `ord wallet inscribe --fee-rate --reinscribe --file --satpoint " -#: src/inscriptions/provenance.md:20 +#: src/inscriptions.md:183 +msgid "Reinscribe on a sat (requires sat index): `ord --index-sats wallet inscribe --fee-rate --reinscribe --file --sat `" +msgstr "Reinscribir en un sat (requiere el índice de sats): `ord --index-sats wallet inscribe --fee-rate --reinscribe --file --sat `" + +#: src/inscriptions/delegate.md:4 msgid "" -"Include tag `3`, i.e. `OP_PUSH 3`, in C, with the value of the serialized " -"binary inscription ID of P, serialized as the 32-byte `TXID`, followed by " -"the four-byte little-endian `INDEX`, with trailing zeroes omitted." +"Inscriptions may nominate a delegate inscription. Requests for the content of an inscription with a delegate will instead return the content, content type and content encoding of " +"the delegate. This can be used to cheaply create copies of an inscription." msgstr "" -"Incluye la etiqueta `3`, es decir, `OP_PUSH 3`, en C, con el valor del " -"ID binario serializado de la inscripción P, serializado con el `TXID` de " -"32 bytes, seguido por el `INDEX` en formato little-endian de cuatro bytes, " -"omitiendo los ceros al final." +"Las inscripciones pueden nominar una inscripción delegada. Si se peticiona el contenido de una inscripción que tenga un delegado esta retornará el contenido, tipo de contenido y " +"la codificación del contenido del delegado. Esto puede utilizarse para crear copias de una inscripción de manera económica." -#: src/inscriptions/provenance.md:24 +#: src/inscriptions/delegate.md:11 +msgid "To create an inscription I with delegate inscription D:" +msgstr "Para crear una inscripción I con una inscripción delegada D:" + +#: src/inscriptions/delegate.md:13 msgid "" -"_NB_ The bytes of a bitcoin transaction ID are reversed in their text " -"representation, so the serialized transaction ID will be in the opposite " -"order." +"Create an inscription D. Note that inscription D does not have to exist when making inscription I. It may be inscribed later. Before inscription D is inscribed, requests for the " +"content of inscription I will return a 404." msgstr "" -"_NB_ Los bytes del ID de una transacción de bitcoin se invierten en su " -"representación textual, por lo que el ID de transacción serializado será " -"en el orden inverso." +"Crear una inscripción D. Tenga en cuenta que la inscripción D no tiene que existir al momento de crear la inscripción I. Puede ser inscrita después. Antes de que la inscripción D " +"sea inscrita, las solicitudes para el contenido de la inscripción I devolverán un error 404." -#: src/inscriptions/provenance.md:27 -#: src/guides/testing.md:18 -#: src/guides/reindexing.md:15 +#: src/inscriptions/delegate.md:16 +msgid "" +"Include tag `11`, i.e. `OP_PUSH 11`, in I, with the value of the serialized binary inscription ID of D, serialized as the 32-byte `TXID`, followed by the four-byte little-endian " +"`INDEX`, with trailing zeroes omitted." +msgstr "" +"Agregar a I la etiqueta `11`, es decir, `OP_PUSH 11`, con el valor del ID de la inscripción binaria serializada de D, serializado con un TXID de 32 bytes, seguido por el `INDEX` " +"de cuatro bytes en formato little-endian, omitiendo los ceros del final." + +#: src/inscriptions/delegate.md:20 src/inscriptions/provenance.md:24 +msgid "_NB_ The bytes of a bitcoin transaction ID are reversed in their text representation, so the serialized transaction ID will be in the opposite order." +msgstr "_NB_ Los bytes del ID de una transacción de Bitcoin están invertidos en su representación textual, por lo que el ID de transacción serializada estará en el orden opuesto." + +#: src/inscriptions/delegate.md:23 src/inscriptions/metadata.md:30 src/inscriptions/provenance.md:27 src/guides/reindexing.md:15 src/guides/teleburning.md:23 +#: src/guides/testing.md:63 msgid "Example" msgstr "Ejemplo" -#: src/inscriptions/provenance.md:29 -msgid "" -"An example of a child inscription of " -"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0`:" -msgstr "" -"Ejemplo de una inscripción hija de " -"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0`:" +#: src/inscriptions/delegate.md:25 +msgid "An example of an inscription which delegates to `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0`:" +msgstr "Un ejemplo de una inscripción que delega a `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0`:" -#: src/inscriptions/provenance.md:32 +#: src/inscriptions/delegate.md:28 msgid "" "```\n" "OP_FALSE\n" "OP_IF\n" " OP_PUSH \"ord\"\n" -" OP_PUSH 1\n" -" OP_PUSH \"text/plain;charset=utf-8\"\n" -" OP_PUSH 3\n" -" OP_PUSH " -"0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100\n" -" OP_PUSH 0\n" -" OP_PUSH \"Hello, world!\"\n" +" OP_PUSH 11\n" +" OP_PUSH 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100\n" "OP_ENDIF\n" "```" msgstr "" @@ -1433,3685 +1053,5220 @@ msgstr "" "OP_FALSE\n" "OP_IF\n" " OP_PUSH \"ord\"\n" -" OP_PUSH 1\n" -" OP_PUSH \"text/plain;charset=utf-8\"\n" -" OP_PUSH 3\n" +" OP_PUSH 11\n" " OP_PUSH 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100\n" -" OP_PUSH 0\n" -" OP_PUSH \"¡Hola, mundo!\"\n" "OP_ENDIF\n" "```" -#: src/inscriptions/provenance.md:45 +#: src/inscriptions/delegate.md:37 +msgid "Note that the value of tag `11` is decimal, not hex." +msgstr "Observamos que el valor de la etiqueta `11` está en valor decimal y no en hexadecimal." + +#: src/inscriptions/delegate.md:39 +msgid "The delegate field value uses the same encoding as the parent field. See [provenance](provenance.md) for more examples of inscription ID encodings;" +msgstr "" +"El valor del campo delegado utiliza la misma codificación que el campo padre. Consulte [proveniencia](provenance.md) para obtener más ejemplos de codificaciones de los ID de " +"inscripción;" + +#: src/inscriptions/metadata.md:4 msgid "" -"Note that the value of tag `3` is binary, not hex, and that for the child " -"inscription to be recognized as a child, " -"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0` must be " -"spent as one of the inputs of the inscribe transaction." +"Inscriptions may include [CBOR](https://cbor.io/) metadata, stored as data pushes in fields with tag `5`. Since data pushes are limited to 520 bytes, metadata longer than 520 " +"bytes must be split into multiple tag `5` fields, which will then be concatenated before decoding." msgstr "" -"Ten en cuenta que el valor de la etiqueta `3` es en binario, no hexadecimal," -"y para que la inscripción hija sea reconocida como tal, " -"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0` debe " -"gastarse como una de las entradas de la transacción de inscripción." +"Las inscripciones pueden incluir metadatos de tipo [CBOR](https://cbor.io/), almacenados como envío de datos en campos con la etiqueta 5. Dado que los envíos de datos están " +"limitados a 520 bytes, los metadatos que excedan los 520 bytes deben dividirse en varios campos que contengan la etiqueta `5`, los cuales se concatenarán antes de la " +"decodificación." -#: src/inscriptions/provenance.md:50 +#: src/inscriptions/metadata.md:9 +msgid "" +"Metadata is human readable, and all metadata will be displayed to the user with its inscription. Inscribers are encouraged to consider how metadata will be displayed, and make " +"metadata concise and attractive." +msgstr "" +"Los metadatos son legibles por humanos, y todos los metadatos se mostrarán al usuario junto con su inscripción. Se incentiva a los inscriptores que consideren cómo se verán los " +"metadatos y a crear metadatos sean concisos y atractivos." + +#: src/inscriptions/metadata.md:13 +msgid "Metadata is rendered to HTML for display as follows:" +msgstr "Los metadatos se renderizan en HTML para su visualización de la siguiente manera:" + +#: src/inscriptions/metadata.md:15 +msgid "`null`, `true`, `false`, numbers, floats, and strings are rendered as plain text." +msgstr "`null`, `true`, `false`, números, floats y strings se renderizan como texto sin formato." + +#: src/inscriptions/metadata.md:17 +msgid "Byte strings are rendered as uppercase hexadecimal." +msgstr "Los strings de bytes se renderizan como hexadecimal en mayúsculas." + +#: src/inscriptions/metadata.md:18 +msgid "Arrays are rendered as `
    ` tags, with every element wrapped in `
  • ` tags." +msgstr "Las matrices se renderizan como etiquetas `
      `, con cada elemento envuelto en etiquetas `
    • `." + +#: src/inscriptions/metadata.md:20 +msgid "Maps are rendered as `
      ` tags, with every key wrapped in `
      ` tags, and every value wrapped in `
      ` tags." +msgstr "Los mapas se renderizan como etiquetas `
      `, con cada llave envuelta en etiquetas `
      ` y cada valor envuelto en etiquetas `
      `." + +#: src/inscriptions/metadata.md:22 +msgid "Tags are rendered as the tag , enclosed in a `` tag, followed by the value." +msgstr "Las etiquetas se renderizan como la etiqueta, dentro de una etiqueta ``, seguida del valor." + +#: src/inscriptions/metadata.md:25 +msgid "" +"CBOR is a complex spec with many different data types, and multiple ways of representing the same data. Exotic data types, such as tags, floats, and bignums, and encoding such as " +"indefinite values, may fail to display correctly or at all. Contributions to `ord` to remedy this are welcome." +msgstr "" +"CBOR es una especificación compleja con muchos tipos de datos y múltiples formas de representar los mismos datos. Puede que los tipos de datos exóticos, tales como etiquetas, " +"floats y bignums, y codificaciones como valores indefinidos, no se muestren correctamente o tal vez ni aparezcan. Las contribuciones a `ord` para remediar esto son bienvenidas." + +#: src/inscriptions/metadata.md:33 msgid "" -"Example encoding of inscription ID " -"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi255`:" -msgstr "Ejemplo de codificación de la inscripción que contiene el ID " -"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi255`:" +"Since CBOR is not human readable, in these examples it is represented as JSON. Keep in mind that this is _only_ for these examples, and JSON metadata will _not_ be displayed " +"correctly." +msgstr "" +"Dado que CBOR no es legible por humanos, en estos ejemplos se representa como JSON. Tenga en cuenta que esto es *solo* para estos ejemplos, y los metadatos JSON *no* se mostrarán " +"correctamente." + +#: src/inscriptions/metadata.md:37 +msgid "The metadata `{\"foo\":\"bar\",\"baz\":[null,true,false,0]}` would be included in an inscription as:" +msgstr "Los metadatos `{\"foo\":\"bar\",\"baz\":[null,true,false,0]}` se incluirían en una inscripción de esta manera:" -#: src/inscriptions/provenance.md:53 +#: src/inscriptions/metadata.md:39 msgid "" "```\n" "OP_FALSE\n" "OP_IF\n" -" …\n" -" OP_PUSH 3\n" -" OP_PUSH " -"0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100ff\n" -" …\n" +" ...\n" +" OP_PUSH 0x05 OP_PUSH '{\"foo\":\"bar\",\"baz\":[null,true,false,0]}'\n" +" ...\n" "OP_ENDIF\n" "```" msgstr "" "```\n" "OP_FALSE\n" "OP_IF\n" -" …\n" -" OP_PUSH 3\n" -" OP_PUSH " -"0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100ff\n" -" …\n" +" ...\n" +" OP_PUSH 0x05 OP_PUSH '{\"foo\":\"bar\",\"baz\":[null,true,false,0]}'\n" +" ...\n" "OP_ENDIF\n" "```" -#: src/inscriptions/provenance.md:63 -msgid "" -"And of inscription ID " -"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi256`:" -msgstr "" -"Y del ID de inscripción `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi256`:" +#: src/inscriptions/metadata.md:48 +msgid "And rendered as:" +msgstr "Y renderizados de esta forma:" + +#: src/inscriptions/metadata.md:73 +msgid "Metadata longer than 520 bytes must be split into multiple fields:" +msgstr "Metadatos mayores a 520 bytes deben dividirse en varios campos:" -#: src/inscriptions/provenance.md:65 +#: src/inscriptions/metadata.md:75 msgid "" "```\n" "OP_FALSE\n" "OP_IF\n" -" …\n" -" OP_PUSH 3\n" -" OP_PUSH " -"0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201000001\n" -" …\n" +" ...\n" +" OP_PUSH 0x05 OP_PUSH '{\"very\":\"long\",\"metadata\":'\n" +" OP_PUSH 0x05 OP_PUSH '\"is\",\"finally\":\"done\"}'\n" +" ...\n" "OP_ENDIF\n" "```" msgstr "" "```\n" "OP_FALSE\n" "OP_IF\n" -" …\n" -" OP_PUSH 3\n" -" OP_PUSH " -"0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201000001\n" -" …\n" +" ...\n" +" OP_PUSH 0x05 OP_PUSH '{\"metadatos\":\"muy\",\"largos\":'\n" +" OP_PUSH 0x05 OP_PUSH '\"porfin\",\"se\":\"terminan\"}'\n" +" ...\n" "OP_ENDIF\n" "```" -#: src/inscriptions/provenance.md:75 -msgid "Notes" -msgstr "Notas" - -#: src/inscriptions/provenance.md:77 -msgid "" -"The tag `3` is used because it is the first available odd tag. Unrecognized " -"odd tags do not make an inscription unbound, so child inscriptions would be " -"recognized and tracked by old versions of `ord`." -msgstr "" -"La etiqueta `3` se utiliza porque es la primera etiqueta impar disponible. " -"Las etiquetas impares desconocidas no desvinculan las inscripciones, por lo " -"que las inscripciones hijas serían reconocidas y rastreadas por las versiones " -"anteriores de ord." +#: src/inscriptions/metadata.md:85 +msgid "Which would then be concatenated into `{\"very\":\"long\",\"metadata\":\"is\",\"finally\":\"done\"}`." +msgstr "Que luego se concatenaría en `{\"metadatos\":\"muy\",\"largos\":\"porfin\",\"se\":\"terminan\"}`." -#: src/inscriptions/provenance.md:81 +#: src/inscriptions/pointer.md:4 msgid "" -"A collection can be closed by burning the collection's parent inscription, " -"which guarantees that no more items in the collection can be issued." +"In order to make an inscription on a sat other than the first of its input, a zero-based integer, called the \"pointer\", can be provided with tag `2`, causing the inscription to " +"be made on the sat at the given position in the outputs. If the pointer is equal to or greater than the number of total sats in the outputs of the inscribe transaction, it is " +"ignored, and the inscription is made as usual. The value of the pointer field is a little endian integer, with trailing zeroes ignored." msgstr "" -"Se puede cerrar una colección quemando la inscripción principal de la " -"colección, lo que garantiza que no se pueden emitir más ítems en la colección." +"Para crear una inscripción en un sat distinto al primero de su entrada, se puede proporcionar un entero que comienza en cero, llamado \"puntero\", con la etiqueta `2`. Esto hace " +"que la inscripción se cree en el sat localizado en la posición especificada en las salidas. Si el puntero es igual o mayor que el número total de sats en las salidas de la " +"transacción de inscripción, este se ignora y la inscripción se realiza como de costumbre. El valor del campo de puntero es un entero en formato little endian, ignorando los ceros " +"finales." -#: src/inscriptions/recursion.md:4 -msgid "" -"An important exception to [sandboxing](../inscriptions.md#sandboxing) is " -"recursion: access to `ord`'s `/content` endpoint is permitted, allowing " -"inscriptions to access the content of other inscriptions by requesting " -"`/content/`." +#: src/inscriptions/pointer.md:12 +msgid "An even tag is used, so that old versions of `ord` consider the inscription to be unbound, instead of assigning it, incorrectly, to the first sat." msgstr "" -"Una excepción importante a las restricciones del [sandboxing]" -"(../inscriptions.md#sandboxing-o-aislamiento) es la recursión. Se permite " -"el acceso al punto final o endpoint `/content` de `ord`, esto permite que " -"las inscripciones accedan al contenido de otras inscripciones solicitando " -"`/content/`." +"Se utiliza una etiqueta con un numero par, de modo que las versiones antiguas de `ord` consideren que la inscripción no está vinculada, en lugar de asignarla incorrectamente al " +"primer sat." -#: src/inscriptions/recursion.md:9 -msgid "This has a number of interesting use-cases:" -msgstr "Esto tiene varios casos de uso interesantes:" - -#: src/inscriptions/recursion.md:11 -msgid "Remixing the content of existing inscriptions." -msgstr "Combinar el contenido de inscripciones existentes." +#: src/inscriptions/pointer.md:15 +msgid "This can be used to create multiple inscriptions in a single transaction on different sats, when otherwise they would be made on the same sat." +msgstr "Esto se puede usar para crear múltiples inscripciones en una sola transacción en diferentes sats, de otro modo se harían en el mismo sat." -#: src/inscriptions/recursion.md:13 -msgid "" -"Publishing snippets of code, images, audio, or stylesheets as shared public " -"resources." -msgstr "" -"Publicar fragmentos de código, imágenes, audio y hojas de cálculo como " -"recursos públicos." +#: src/inscriptions/pointer.md:18 src/inscriptions/recursion.md:66 +msgid "Examples" +msgstr "Ejemplos" -#: src/inscriptions/recursion.md:16 -msgid "" -"Generative art collections where an algorithm is inscribed as JavaScript, " -"and instantiated from multiple inscriptions with unique seeds." -msgstr "" -"Colecciones de arte generativo en donde un algoritmo está inscrito en " -"JavaScript, y se instancia desde múltiples inscripciones con semillas únicas." +#: src/inscriptions/pointer.md:21 +msgid "An inscription with pointer 255:" +msgstr "Una inscripción con puntero 255:" -#: src/inscriptions/recursion.md:19 +#: src/inscriptions/pointer.md:23 msgid "" -"Generative profile picture collections where accessories and attributes are " -"inscribed as individual images, or in a shared texture atlas, and then " -"combined, collage-style, in unique combinations in multiple inscriptions." +"```\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 2\n" +" OP_PUSH 0xff\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hello, world!\"\n" +"OP_ENDIF\n" +"```" msgstr "" -"Colecciones generativas de imágenes de perfil donde los accesorios y atributos " -"están inscritos como imágenes individuales, o en un atlas de texturas, y luego se " -"combinan, al estilo collage, en combinaciones únicas en múltiples inscripciones." - -#: src/inscriptions/recursion.md:23 -msgid "A few other endpoints that inscriptions may access are the following:" -msgstr "Algunos otros puntos finales a los que pueden acceder las inscripciones son los siguientes:" - -#: src/inscriptions/recursion.md:25 -msgid "`/blockheight`: latest block height." -msgstr "`/blockheight`: altura del bloque más reciente." - -#: src/inscriptions/recursion.md:26 -msgid "`/blockhash`: latest block hash." -msgstr "`/blockhash`: hash del bloque más reciente." - -#: src/inscriptions/recursion.md:27 -msgid "`/blockhash/`: block hash at given block height." -msgstr "`/blockhash/`: hash del bloque a la altura de bloque dada." - -#: src/inscriptions/recursion.md:28 -msgid "`/blocktime`: UNIX time stamp of latest block." -msgstr "`/blocktime`: marca de tiempo UNIX del bloque más reciente." - -#: src/faq.md:1 -msgid "Ordinal Theory FAQ" -msgstr "Preguntas frecuentes sobre la teoría Ordinal" - -#: src/faq.md:4 -msgid "What is ordinal theory?" -msgstr "¿Qué es la teoría ordinal?" +"```\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 2\n" +" OP_PUSH 0xff\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hello, world!\"\n" +"OP_ENDIF\n" +"```" -#: src/faq.md:7 -msgid "" -"Ordinal theory is a protocol for assigning serial numbers to satoshis, the " -"smallest subdivision of a bitcoin, and tracking those satoshis as they are " -"spent by transactions." -msgstr "" -"La teoría ordinal es un protocolo para asignar números de serie a los " -"satoshis, la denominación más pequeña de un bitcoin, y rastrear esos satoshis " -"a medida que son gastados en transacciones." +#: src/inscriptions/pointer.md:36 +msgid "An inscription with pointer 256:" +msgstr "Una inscripción con puntero 256:" -#: src/faq.md:11 +#: src/inscriptions/pointer.md:38 msgid "" -"These serial numbers are large numbers, like this 804766073970493. Every " -"satoshi, which is ¹⁄₁₀₀₀₀₀₀₀₀ of a bitcoin, has an ordinal number." +"```\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 2\n" +" OP_PUSH 0x0001\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hello, world!\"\n" +"OP_ENDIF\n" +"```" msgstr "" -"Estos números de serie son números grandes, un ejemplo es el número " -"804766073970493. Cada satoshi, el cual es ¹⁄₁₀₀₀₀₀₀₀₀ de un bitcoin, tiene " -"un número ordinal." +"```\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 2\n" +" OP_PUSH 0x0001\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hello, world!\"\n" +"OP_ENDIF\n" +"```" -#: src/faq.md:14 -msgid "" -"Does ordinal theory require a side chain, a separate token, or changes to " -"Bitcoin?" -msgstr "¿La teoría ordinal requiere una cadena lateral, un token separado o " -"cambios en Bitcoin?" +#: src/inscriptions/pointer.md:51 +msgid "An inscription with pointer 256, with trailing zeroes, which are ignored:" +msgstr "Una inscripción con puntero 256, ignorando los ceros del final:" -#: src/faq.md:17 +#: src/inscriptions/pointer.md:53 msgid "" -"Nope! Ordinal theory works right now, without a side chain, and the only " -"token needed is bitcoin itself." +"```\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 2\n" +" OP_PUSH 0x000100\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hello, world!\"\n" +"OP_ENDIF\n" +"```" msgstr "" -"¡No! La teoría ordinal funciona en este momento, sin una cadena lateral, " -"y el único token necesario es simplemente bitcoin." - -#: src/faq.md:20 -msgid "What is ordinal theory good for?" -msgstr "¿Para qué sirve la teoría Ordinals?" +"```\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 2\n" +" OP_PUSH 0x000100\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hello, world!\"\n" +"OP_ENDIF\n" +"```" -#: src/faq.md:23 +#: src/inscriptions/provenance.md:4 msgid "" -"Collecting, trading, and scheming. Ordinal theory assigns identities to " -"individual satoshis, allowing them to be individually tracked and traded, as " -"curios and for numismatic value." +"The owner of an inscription can create child inscriptions, trustlessly establishing the provenance of those children on-chain as having been created by the owner of the parent " +"inscription. This can be used for collections, with the children of a parent inscription being members of the same collection." msgstr "" -"Para coleccionar, comerciar e innovar. La teoría ordinal asigna una identidad " -"a los satoshis, permitiendo que se rastreen e intercambien, como curiosidades " -"y por su valor numismático." +"El propietario de una inscripción puede crear inscripciones hijos (secundarias), estableciendo proveniencia en cadena que indica que esta fue creada por el propietario de la " +"inscripción padre. Esto se puede utilizar para colecciones, donde las inscripciones hijos de una inscripción padre son miembros de la misma colección." -#: src/faq.md:27 +#: src/inscriptions/provenance.md:9 msgid "" -"Ordinal theory also enables inscriptions, a protocol for attaching arbitrary " -"content to individual satoshis, turning them into bitcoin-native digital " -"artifacts." +"Children can themselves have children, allowing for complex hierarchies. For example, an artist might create an inscription representing themselves, with sub inscriptions " +"representing collections that they create, with the children of those sub inscriptions being items in those collections." msgstr "" -"La teoría ordinal también habilita las inscripciones, un protocolo para adjuntar " -"contenido arbitrario a los satoshis, convirtiéndolos en artefactos digitales nativos " -"en bitcoin." - -#: src/faq.md:31 -msgid "How does ordinal theory work?" -msgstr "¿Cómo funciona la teoría ordinal?" +"Las inscripciones hijos pueden tener a su vez sus propias inscripciones hijos, lo que permite jerarquías complejas. Por ejemplo, un artista podría crear una inscripción " +"representándose a sí mismo, con subinscripciones que representan las colecciones que vaya a crear, y que las inscripciones hijos de esas subinscripciones sean elementos de esas " +"colecciones." -#: src/faq.md:34 -msgid "" -"Ordinal numbers are assigned to satoshis in the order in which they are " -"mined. The first satoshi in the first block has ordinal number 0, the second " -"has ordinal number 1, and the last satoshi of the first block has ordinal " -"number 4,999,999,999." -msgstr "" -"Los números ordinales se asignan a los satoshis en el orden en que se minan. " -"El primer satoshi en el primer bloque tiene el número ordinal 0, el segundo tiene el " -"número ordinal 1 y el último satoshi del primer bloque tiene el número ordinal 4,999,999,999." +#: src/inscriptions/provenance.md:16 +msgid "To create a child inscription C with parent inscription P:" +msgstr "Para crear una inscripción hijo H con una inscripción padre P:" -#: src/faq.md:39 -msgid "" -"Satoshis live in outputs, but transactions destroy outputs and create new " -"ones, so ordinal theory uses an algorithm to determine how satoshis hop from " -"the inputs of a transaction to its outputs." -msgstr "" -"Los satoshis se hallan en las transacciones salientes, pero las transacciones " -"se destruyen cuando son emitidas y se crean nuevas transacciones, lo que la teoría de " -"Ordinals hace es utilizar un algoritmo para determinar cómo los satoshis se mueven entre " -"las transacciones que salen y entran." +#: src/inscriptions/provenance.md:18 +msgid "Create an inscribe transaction T as usual for C." +msgstr "Crear una transacción de inscripción T para crear H." -#: src/faq.md:43 -msgid "Fortunately, that algorithm is very simple." -msgstr "Afortunadamente, ese algoritmo es bastante sencillo." +#: src/inscriptions/provenance.md:19 +msgid "Spend the parent P in one of the inputs of T." +msgstr "Gastar la inscripción principal P en una de las entradas de T." -#: src/faq.md:45 +#: src/inscriptions/provenance.md:20 msgid "" -"Satoshis transfer in first-in-first-out order. Think of the inputs to a " -"transaction as being a list of satoshis, and the outputs as a list of slots, " -"waiting to receive a satoshi. To assign input satoshis to slots, go through " -"each satoshi in the inputs in order, and assign each to the first available " -"slot in the outputs." +"Include tag `3`, i.e. `OP_PUSH 3`, in C, with the value of the serialized binary inscription ID of P, serialized as the 32-byte `TXID`, followed by the four-byte little-endian " +"`INDEX`, with trailing zeroes omitted." msgstr "" -"Los satoshis se transfieren en orden, el primero que entra, es el primero " -"en salir. Simplemente hay que pensar en las entradas a una transacción como una " -"lista de satoshis, y las salidas como una lista con espacios libres, esperando para " -"recibir un satoshi. Para asignar satoshis a un espacio libre, se asigna uno por uno " -"al próximo espacio que esté disponible. " +"Agregar a H etiqueta `3`, es decir, OP_PUSH 3, con el valor del ID de la inscripción binaria serializada de P, serializado con un TXID de 32 bytes, seguido por el `INDEX` de " +"cuatro bytes en formato little-endian, omitiendo los ceros del final." -#: src/faq.md:51 -msgid "" -"Let's imagine a transaction with three inputs and two outputs. The inputs " -"are on the left of the arrow and the outputs are on the right, all labeled " -"with their values:" +#: src/inscriptions/provenance.md:29 +msgid "An example of a child inscription of `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0`:" msgstr "" -"Imaginemos una transacción con tres entradas y dos salidas. Las entradas " -"están a la izquierda de la flecha y las salidas a la derecha, todas con sus " -"respectivos valores:" +"Ejemplo de una inscripción hijo de\n" +"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0`:" -#: src/faq.md:55 +#: src/inscriptions/provenance.md:32 msgid "" "```\n" -"[2] [1] [3] → [4] [2]\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 3\n" +" OP_PUSH 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hello, world!\"\n" +"OP_ENDIF\n" "```" msgstr "" "```\n" -"[2] [1] [3] → [4] [2]\n" +"OP_FALSE\n" +"OP_IF\n" +" OP_PUSH \"ord\"\n" +" OP_PUSH 1\n" +" OP_PUSH \"text/plain;charset=utf-8\"\n" +" OP_PUSH 3\n" +" OP_PUSH 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100\n" +" OP_PUSH 0\n" +" OP_PUSH \"Hola, mundo!\"\n" +"OP_ENDIF\n" "```" -#: src/faq.md:57 +#: src/inscriptions/provenance.md:45 msgid "" -"Now let's label the same transaction with the ordinal numbers of the " -"satoshis that each input contains, and question marks for each output slot. " -"Ordinal numbers are large, so let's use letters to represent them:" +"Note that the value of tag `3` is binary, not hex, and that for the child inscription to be recognized as a child, " +"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0` must be spent as one of the inputs of the inscribe transaction." msgstr "" -"Ahora miremos la misma transacción con los números ordinales de los satoshis " -"que contiene cada entrada. Pondremos signos de interrogantes para cada espacio " -"de salida que está libre. Ya que los números ordinales son grandes utilizaremos " -"letras para representarlos:" +"Ten en cuenta que el valor de la etiqueta 3 es en formato binario, y no hexadecimal, y \n" +"`000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi0` debe ser utilizado como una de las entradas de la transacción de inscripción para que la inscripción sea " +"reconocida como una inscripción hijo." -#: src/faq.md:61 -msgid "" -"```\n" -"[a b] [c] [d e f] → [? ? ? ?] [? ?]\n" -"```" -msgstr "" -"```\n" -"[a b] [c] [d e f] → [? ? ? ?] [? ?]\n" -"```" +#: src/inscriptions/provenance.md:50 +msgid "Example encoding of inscription ID `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi255`:" +msgstr "Ejemplo de codificación del ID de inscripción `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi255`:" + +#: src/inscriptions/provenance.md:63 +msgid "And of inscription ID `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi256`:" +msgstr "Y de este ID de inscripción `000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fi256`:" + +#: src/inscriptions/provenance.md:75 +msgid "Notes" +msgstr "Notas" -#: src/faq.md:63 +#: src/inscriptions/provenance.md:77 msgid "" -"To figure out which satoshi goes to which output, go through the input " -"satoshis in order and assign each to a question mark:" +"The tag `3` is used because it is the first available odd tag. Unrecognized odd tags do not make an inscription unbound, so child inscriptions would be recognized and tracked by " +"old versions of `ord`." msgstr "" -"Para saber dónde el satoshi quedara ubicado en la transacción de salida, " -"revisa los satoshis en la transacción de entrada y asigna cada uno a un " -"signo de interrogación:" +"La etiqueta `3` es utilizada ya que es la primera etiqueta impar disponible. Etiquetas impares que no son reconocidas no causaran que una inscripción se desvincule, por lo que " +"las inscripciones segundarias serían reconocidas y rastreadas por las versiones antiguas de `ord`." + +#: src/inscriptions/provenance.md:81 +msgid "A collection can be closed by burning the collection's parent inscription, which guarantees that no more items in the collection can be issued." +msgstr "Una colección puede cerrarse quemando la inscripción principal de la colección, lo que garantiza que no se puedan emitir más elementos en la colección." -#: src/faq.md:66 +#: src/inscriptions/recursion.md:4 msgid "" -"```\n" -"[a b] [c] [d e f] → [a b c d] [e f]\n" -"```" +"An important exception to [sandboxing](../inscriptions.md#sandboxing) is recursion. Recursive endpoints are whitelisted endpoints that allow access to on-chain data, including " +"the content of other inscriptions." msgstr "" -"```\n" -"[a b] [c] [d e f] → [a b c d] [e f]\n" -"```" +"Una excepción importante al [sandboxing](../inscripciones.md#sandboxing o aislamiento) es la recursión. Los endpoints recursivos son endpoints que permiten el acceso a los datos " +"que hay en cadena, incluyendo el contenido de otras inscripciones." -#: src/faq.md:68 +#: src/inscriptions/recursion.md:8 msgid "" -"What about fees, you might ask? Good question! Let's imagine the same " -"transaction, this time with a two satoshi fee. Transactions with fees send " -"more satoshis in the inputs than are received by the outputs, so to make our " -"transaction into one that pays fees, we'll remove the second output:" +"Since changes to recursive endpoints might break inscriptions that rely on them, recursive endpoints have backwards-compatibility guarantees not shared by `ord server`'s other " +"endpoints. In particular:" msgstr "" -"¿En este momento te estarás preguntando qué pasara con las comisiones? " -"¡Buena pregunta! Imaginemos la misma transacción, esta vez con una comisión " -"de dos satoshis. Las transacciones con comisiones contienen más satoshis en " -"las transacciones de entrada que las que reciben las transacciones de salida, " -"por lo que para convertir nuestra transacción en una que pague comisiones, " -"eliminaremos la segunda salida:" +"Dado que los cambios en los endpoints recursivos podrían romper inscripciones que dependen de ellos, los endpoints recursivos tienen compatibilidad retroactiva que no comparten " +"los otros endpoints en el `server de ord`. En particular:" + +#: src/inscriptions/recursion.md:12 +msgid "Recursive endpoints will not be removed" +msgstr "Los endpoints recursivos no serán eliminados" + +#: src/inscriptions/recursion.md:13 +msgid "Object fields returned by recursive endpoints will not be renamed or change types" +msgstr "Los campos de objeto que devuelven los endpoints recursivos no serán renombrados ni cambiarán de tipo" -#: src/faq.md:73 +#: src/inscriptions/recursion.md:15 msgid "" -"```\n" -"[2] [1] [3] → [4]\n" -"```" +"However, additional object fields may be added or reordered, so inscriptions must handle additional, unexpected fields, and must not expect fields to be returned in a specific " +"order." msgstr "" -"```\n" -"[2] [1] [3] → [4]\n" -"```" - -#: src/faq.md:75 -msgid "The satoshis " -msgstr "Los satoshis" +"Sin embargo, se pueden añadir o reordenar campos de objeto adicionales, por lo que las inscripciones deben manejar campos adicionales e inesperados, y no deben esperar que los " +"campos estén en un orden específico." -#: src/faq.md:75 -msgid "e" -msgstr "e" +#: src/inscriptions/recursion.md:19 +msgid "Recursion has a number of interesting use-cases:" +msgstr "La recursión tiene varios casos de uso interesantes:" -#: src/faq.md:75 -msgid " and " -msgstr "y" +#: src/inscriptions/recursion.md:21 +msgid "Remixing the content of existing inscriptions." +msgstr "Reutilización del contenido de inscripciones existentes." -#: src/faq.md:75 -msgid "f" -msgstr "f" +#: src/inscriptions/recursion.md:23 +msgid "Publishing snippets of code, images, audio, or stylesheets as shared public resources." +msgstr "Publicar fragmentos de código, imágenes, audio y hojas de cálculo como recursos públicos." -#: src/faq.md:75 -msgid " now have nowhere to go in the outputs:" -msgstr "ahora no tienen donde ir en las salidas" +#: src/inscriptions/recursion.md:26 +msgid "Generative art collections where an algorithm is inscribed as JavaScript, and instantiated from multiple inscriptions with unique seeds." +msgstr "Colecciones de arte generativo en donde un algoritmo está inscrito en JavaScript, y se instancia desde múltiples inscripciones con semillas únicas." -#: src/faq.md:78 +#: src/inscriptions/recursion.md:29 msgid "" -"```\n" -"[a b] [c] [d e f] → [a b c d]\n" -"```" +"Generative profile picture collections where accessories and attributes are inscribed as individual images, or in a shared texture atlas, and then combined, collage-style, in " +"unique combinations in multiple inscriptions." msgstr "" -"```\n" -"[a b] [c] [d e f] → [a b c d]\n" -"```" +"Colecciones generativas de imágenes de perfil donde los accesorios y atributos se inscriben como imágenes individuales, o en un atlas de texturas compartido, y luego se combinan, " +"estilo collage, en combinaciones únicas creando múltiples inscripciones." -#: src/faq.md:80 -msgid "" -"So they go to the miner who mined the block as fees. [The " -"BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki) has the " -"details, but in short, fees paid by transactions are treated as extra inputs " -"to the coinbase transaction, and are ordered how their corresponding " -"transactions are ordered in the block. The coinbase transaction of the block " -"might look like this:" -msgstr "" -"Así que van al minero que minó el bloque como comisión. [El BIP]" -"(https://github.com/ordinals/ord/blob/master/bip.mediawiki) tiene los " -"detalles, pero, en resumen, las comisiones pagadas por las transacciones " -"se tratan como entradas adicionales a la transacción coinbase y se ordenan " -"según el orden en el que están en el bloque. La transacción coinbase del " -"bloque podría verse así:" +#: src/inscriptions/recursion.md:33 +msgid "The recursive endpoints are:" +msgstr "Los endpoints recursivos son:" -#: src/faq.md:87 -msgid "" -"```\n" -"[SUBSIDY] [e f] → [SUBSIDY e f]\n" -"```" -msgstr "" -"```\n" -"[SUBSIDIO] [e f] → [SUBSIDIO e f]" -"```" +#: src/inscriptions/recursion.md:35 +msgid "`/content/`: the content of the inscription with ``" +msgstr "`/content/`: el contenido de la inscripción con ``" -#: src/faq.md:89 -msgid "Where can I find the nitty-gritty details?" -msgstr "¿Dónde puedo encontrar los detalles técnicos?" +#: src/inscriptions/recursion.md:36 +msgid "`/r/blockhash/`: block hash at given block height." +msgstr "`/r/blockhash/`: hash del bloque a la altura del bloque." -#: src/faq.md:92 -msgid "[The BIP!](https://github.com/ordinals/ord/blob/master/bip.mediawiki)" -msgstr "[¡En el BIP!](https://github.com/ordinals/ord/blob/master/bip.mediawiki)" +#: src/inscriptions/recursion.md:37 +msgid "`/r/blockhash`: latest block hash." +msgstr "`/r/blockhash`: hash del bloque mas reciente." -#: src/faq.md:94 -msgid "" -"Why are sat inscriptions called \"digital artifacts\" instead of \"NFTs\"?" -msgstr "¿Por qué a las inscripciones de Satoshis se les llama \"artefactos digitales\" en lugar de \"NFT\"?" +#: src/inscriptions/recursion.md:38 +msgid "`/r/blockheight`: latest block height." +msgstr "`/r/blockheight`: altura de bloque más reciente." -#: src/faq.md:97 -msgid "" -"An inscription is an NFT, but the term \"digital artifact\" is used instead, " -"because it's simple, suggestive, and familiar." -msgstr "Una inscripción es un NFT, pero se utiliza el término \"artefacto digital\", " -"porque es fácil, sugerente y familiar." +#: src/inscriptions/recursion.md:39 +msgid "`/r/blockinfo/`: block info. `` may be a block height or block hash." +msgstr "`/r/blockinfo/`: información del bloque. `` puede ser altura de bloque o hash de un bloque." -#: src/faq.md:100 -msgid "" -"The phrase \"digital artifact\" is highly suggestive, even to someone who " -"has never heard the term before. In comparison, NFT is an acronym, and " -"doesn't provide any indication of what it means if you haven't heard the " -"term before." -msgstr "" -"La frase \"artefacto digital\" es muy sugerente, incluso para alguien " -"que nunca ha oído el término. En comparación, NFT es un acrónimo y no proporciona " -"ninguna indicación de lo que significa si no has escuchado el término." +#: src/inscriptions/recursion.md:40 +msgid "`/r/blocktime`: UNIX time stamp of latest block." +msgstr "`/r/blocktime`: marca de tiempo UNIX del bloque más reciente." -#: src/faq.md:104 -msgid "" -"Additionally, \"NFT\" feels like financial terminology, and the both word " -"\"fungible\" and sense of the word \"token\" as used in \"NFT\" is uncommon " -"outside of financial contexts." -msgstr "" -"Además, la palabra, \"NFT\" suena como terminología financiera, y tanto " -"la palabra \"fungible\" como el sentido de la palabra \"token\" como se usa en los " -"\"NFT\" no son comunes fuera de los contextos financieros." +#: src/inscriptions/recursion.md:41 +msgid "`/r/children/`: the first 100 child inscription ids." +msgstr "`/r/children/`: los primeros 100 ids de inscripciones hijos." -#: src/faq.md:108 -msgid "How do sat inscriptions compare to…" -msgstr "¿Cómo se comparan las inscripciones con..." +#: src/inscriptions/recursion.md:42 +msgid "`/r/children//`: the set of 100 child inscription ids on ``." +msgstr "`/r/children//`: el conjunto de 100 ids de inscripciones hijos en ``." -#: src/faq.md:111 -msgid "Ethereum NFTs?" -msgstr "¿Los NFT de Ethereum?" +#: src/inscriptions/recursion.md:43 +msgid "`/r/children//inscriptions`: details of the first 100 child inscriptions." +msgstr "`/r/children//inscriptions`: detalles de las primeras 100 inscripciones hijos." -#: src/faq.md:113 -msgid "_Inscriptions are always immutable._" -msgstr "_Las inscripciones siempre son inmutables._" +#: src/inscriptions/recursion.md:44 +msgid "`/r/children//inscriptions/`: details of the set of 100 child inscriptions on ``." +msgstr "`/r/children//inscriptions/`: detalles del conjunto de 100 inscripciones hijas en ``." -#: src/faq.md:115 -msgid "" -"There is simply no way to for the creator of an inscription, or the owner of " -"an inscription, to modify it after it has been created." -msgstr "" -"No hay forma de que el creador de una inscripción, o el propietario de " -"una inscripción, la modifique después de haber sido creada." +#: src/inscriptions/recursion.md:45 +msgid "`/r/inscription/`: information about an inscription" +msgstr "`/r/inscription/`: información de una inscripción" -#: src/faq.md:118 -msgid "" -"Ethereum NFTs _can_ be immutable, but many are not, and can be changed or " -"deleted by the NFT contract owner." -msgstr "" -"Los NFTs en Ethereum _pueden_ ser inmutables, pero muchos no lo son y pueden " -"ser cambiados o eliminados por el propietario del contrato del NFT." +#: src/inscriptions/recursion.md:46 +msgid "`/r/metadata/`: JSON string containing the hex-encoded CBOR metadata." +msgstr "`/r/metadata/`: string JSON conteniendo los metadatos CBOR codificados en hexadecimal." -#: src/faq.md:121 -msgid "" -"In order to make sure that a particular Ethereum NFT is immutable, the " -"contract code must be audited, which requires detailed knowledge of the EVM " -"and Solidity semantics." -msgstr "" -"Para asegurarse de que un NFT de Ethereum sea inmutable, se debe " -"analizar el código del contrato, lo cual requiere un conocimiento a profundidad " -"de la EVM y la semántica de Solidity." +#: src/inscriptions/recursion.md:47 +msgid "`/r/parents/`: the first 100 parent inscription ids." +msgstr "`/r/parents/`: los primeros 100 ids de inscripciones padres." -#: src/faq.md:125 -msgid "" -"It is very hard for a non-technical user to determine whether or not a given " -"Ethereum NFT is mutable or immutable, and Ethereum NFT platforms make no " -"effort to distinguish whether an NFT is mutable or immutable, and whether " -"the contract source code is available and has been audited." -msgstr "" -"Para un usuario que no tiene habilidades técnicas es bastante difícil " -"determinar si un NFT de Ethereum es mutable o inmutable, y las plataformas " -"Ethereum NFT no se esfuerzan para ayudar a distinguir si un NFT es mutable o " -"inmutable y si el código fuente del contrato está disponible y ha sido auditado." +#: src/inscriptions/recursion.md:48 +msgid "`/r/parents//`: the set of 100 parent inscription ids on ``." +msgstr "`/r/parents//`: conjunto de 100 ids de inscripciones padres en ``." -#: src/faq.md:130 -msgid "_Inscription content is always on-chain._" -msgstr "_El contenido de la inscripción siempre está en la cadena de Bitcoin._" +#: src/inscriptions/recursion.md:49 +msgid "`/r/sat/`: the first 100 inscription ids on a sat." +msgstr "`/r/sat/`: las primeras 100 ids de inscripciones en un sat." -#: src/faq.md:132 -msgid "" -"There is no way for an inscription to refer to off-chain content. This makes " -"inscriptions more durable, because content cannot be lost, and scarcer, " -"because inscription creators must pay fees proportional to the size of the " -"content." -msgstr "" -"No hay forma de que una inscripción haga referencia a contenido que esta " -"por fuera de la cadena de Bitcoin. Debido a esto las inscripciones son más " -"duraderas porque el contenido no puede perderse y también las hace más " -"escasas porque los creadores de inscripciones deben pagar comisiones " -"proporcionales al tamaño del contenido." - -#: src/faq.md:136 -msgid "" -"Some Ethereum NFT content is on-chain, but much is off-chain, and is stored " -"on platforms like IPFS or Arweave, or on traditional, fully centralized web " -"servers. Content on IPFS is not guaranteed to continue to be available, and " -"some NFT content stored on IPFS has already been lost. Platforms like " -"Arweave rely on weak economic assumptions, and will likely fail " -"catastrophically when these economic assumptions are no longer met. " -"Centralized web servers may disappear at any time." -msgstr "" -"Hay algunos NFTs en Ethereum que están en la cadena, pero muchos no lo " -"están y se almacenan en plataformas como IPFS o Arweave, o en servidores web " -"centralizados. No se garantiza que el contenido que esta almacenado en IPFS " -"continue estando disponible, de hecho, ya se ha perdido contenido de NFTs que " -"fueron almacenado en IPFS. Plataformas como Arweave dependen de suposiciones " -"económicas y probablemente fallarán catastróficamente cuando estas suposiciones " -"ya no se cumplan. Los servidores web centralizados pueden desaparecer en " -"cualquier momento." +#: src/inscriptions/recursion.md:50 +msgid "`/r/sat//`: the set of 100 inscription ids on ``." +msgstr "`/r/sat//`: el conjunto de 100 ids de inscripciones en ``." -#: src/faq.md:144 +#: src/inscriptions/recursion.md:51 msgid "" -"It is very hard for a non-technical user to determine where the content of a " -"given Ethereum NFT is stored." +"`/r/sat//at/`: 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." msgstr "" -"Es difícil para un usuario que no tienes habilidades técnicas determinar " -"donde el contenido de un NFT de Ethereum esta alojado " - -#: src/faq.md:147 -msgid "_Inscriptions are much simpler._" -msgstr "_Las inscripciones son mucho más sencillas._" +"`/r/sat//at/`: el id de inscripcion en `` de todas las inscripciones en un sat. `` puede ser un número negativo para indexar desde el final. `0` " +"siendo el primero y `-1` siendo el más reciente." -#: src/faq.md:149 -msgid "" -"Ethereum NFTs depend on the Ethereum network and virtual machine, which are " -"highly complex, constantly changing, and which introduce changes via " -"backwards-incompatible hard forks." +#: src/inscriptions/recursion.md:53 +msgid "Note: `` only allows the actual number of a sat no other sat notations like degree, percentile or decimal. We may expand to allow those in the future." msgstr "" -"Los NFT de Ethereum dependen de la red y la máquina virtual de Ethereum, " -"las cuales son altamente complejas, cambian constantemente e introducen cambios " -"mediante bifurcaciones incompatibles con versiones anteriores." +"Nota: `` solo permite el número real de un sat, no otras notaciones de sat como sexagesimal, porcentual o decimal. En el futuro, podemos expandir para permitir esas " +"notaciones." -#: src/faq.md:153 -msgid "" -"Inscriptions, on the other hand, depend on the Bitcoin blockchain, which is " -"relatively simple and conservative, and which introduces changes via " -"backwards-compatible soft forks." +#: src/inscriptions/recursion.md:57 +msgid "Responses from the above recursive endpoints are JSON. For backwards compatibility additional endpoints are supported, some of which return plain-text responses." msgstr "" -"Por otro lado, las inscripciones dependen de la blockchain de Bitcoin que es " -"relativamente simple y conservadora, e introduce cambios mediante bifurcaciones " -"suaves compatibles con versiones anteriores." +"Las respuestas de los endpoints recursivos anteriores son en JSON. Para compatibilidad retroactiva, se admiten endpoints adicionales, algunos de los cuales devuelven respuestas " +"en texto plano." -#: src/faq.md:157 -msgid "_Inscriptions are more secure._" -msgstr "_Las inscripciones son más seguras._" +#: src/inscriptions/recursion.md:61 +msgid "`/blockheight`: latest block height." +msgstr "`/blockheight`: altura del bloque más reciente." -#: src/faq.md:159 -msgid "" -"Inscriptions inherit Bitcoin's transaction model, which allow a user to see " -"exactly which inscriptions are being transferred by a transaction before " -"they sign it. Inscriptions can be offered for sale using partially signed " -"transactions, which don't require allowing a third party, such as an " -"exchange or marketplace, to transfer them on the user's behalf." -msgstr "" -"Las inscripciones heredan el modelo de transacción de Bitcoin, lo " -"que permite al usuario ver exactamente qué inscripciones se están transfiriendo " -"en una transacción antes de firmarla. Las inscripciones pueden ofrecerse a la " -"venta mediante transacciones parcialmente firmadas, lo que no requiere el permiso " -"un tercero, como un mercado o plataforma para la transferencia." +#: src/inscriptions/recursion.md:62 +msgid "`/blockhash`: latest block hash." +msgstr "`/blockhash`: hash del bloque más reciente." -#: src/faq.md:165 -msgid "" -"By comparison, Ethereum NFTs are plagued with end-user security " -"vulnerabilities. It is commonplace to blind-sign transactions, grant " -"third-party apps unlimited permissions over a user's NFTs, and interact with " -"complex and unpredictable smart contracts. This creates a minefield of " -"hazards for Ethereum NFT users which are simply not a concern for ordinal " -"theorists." -msgstr "" -"En comparación, los NFT de Ethereum están plagados de vulnerabilidades de " -"seguridad para el usuario final. Es común firmar transacciones a ciegas, " -"otorgar permisos ilimitados a aplicaciones de terceros sobre los NFTs e " -"interactuar con contratos inteligentes complejos e impredecibles. Estos " -"problemas que tienen los NFTs de Ethereum simplemente no son una preocupación " -"para los teóricos de Ordinals." +#: src/inscriptions/recursion.md:63 +msgid "`/blockhash/`: block hash at given block height." +msgstr "`/blockhash/`: hash del bloque en la altura de bloque dada." -#: src/faq.md:171 -msgid "_Inscriptions are scarcer._" -msgstr "_Las inscripciones son más escasas._" +#: src/inscriptions/recursion.md:64 +msgid "`/blocktime`: UNIX time stamp of latest block." +msgstr "`/blocktime`: marca de tiempo UNIX del bloque más reciente." -#: src/faq.md:173 -msgid "" -"Inscriptions require bitcoin to mint, transfer, and store. This seems like a " -"downside on the surface, but the raison d'etre of digital artifacts is to be " -"scarce and thus valuable." -msgstr "" -"Para mintear, transferir y almacenar inscripciones, se requiere bitcoin. " -"Superficialmente esto parece un inconveniente, pero la razón de ser de los " -"artefactos digitales es ser escasos y, por lo tanto, valiosos." +#: src/inscriptions/recursion.md:69 +msgid "`/r/blockhash/0`:" +msgstr "`/r/blockhash/0`:" -#: src/faq.md:177 -msgid "" -"Ethereum NFTs, on the other hand, can be minted in virtually unlimited " -"qualities with a single transaction, making them inherently less scarce, and " -"thus, potentially less valuable." -msgstr "" -"Los NFT de Ethereum, por otro lado, pueden ser minteados en cantidades " -"prácticamente ilimitadas con una sola transacción, lo que los hace intrínsecamente " -"menos escasos y, por lo tanto, potencialmente menos valiosos." +#: src/inscriptions/recursion.md:72 src/inscriptions/recursion.md:94 +msgid "\"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\"" +msgstr "\"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f\"" -#: src/faq.md:181 -msgid "_Inscriptions do not pretend to support on-chain royalties._" -msgstr "_Las inscripciones no pretenden respaldar regalías en la cadena._" +#: src/inscriptions/recursion.md:75 +msgid "`/r/blockheight`:" +msgstr "`/r/blockheight`:" -#: src/faq.md:183 -msgid "" -"On-chain royalties are a good idea in theory but not in practice. Royalty " -"payment cannot be enforced on-chain without complex and invasive " -"restrictions. The Ethereum NFT ecosystem is currently grappling with " -"confusion around royalties, and is collectively coming to grips with the " -"reality that on-chain royalties, which were messaged to artists as an " -"advantage of NFTs, are not possible, while platforms race to the bottom and " -"remove royalty support." -msgstr "" -"En teoría, la implementación de regalías dentro de la blockchain suena bien, " -"pero su puesta en práctica presenta problemas significativos. El pago de regalías " -"no puede ser aplicado en la cadena sin restricciones complejas e invasivas. " -"En este momento, el ecosistema de NFT en Ethereum está enfrentando problemas " -"debido a la confusión generada por las regalías, y colectivamente se está " -"llegando a la conclusión de que las regalías en la cadena las cuales fueron " -"una ventaja que se planteó a favor de los NFTs para los artistas, no son " -"posibles. Algunas plataformas ya están eliminando el soporte de regalías." - -#: src/faq.md:190 -msgid "" -"Inscriptions avoid this situation entirely by making no false promises of " -"supporting royalties on-chain, thus avoiding the confusion, chaos, and " -"negativity of the Ethereum NFT situation." -msgstr "" -"Las inscripciones evitan completamente esta situación al no hacer falsas " -"promesas de respaldar regalías en la cadena, evitando así la confusión, " -"el caos y la negatividad de la situación que ocurre con los NFT en Ethereum." - -#: src/faq.md:194 -msgid "_Inscriptions unlock new markets._" -msgstr "_Las inscripciones abren las puertas a nuevos mercados._" +#: src/inscriptions/recursion.md:81 +msgid "`/r/blockinfo/0`:" +msgstr "`/r/blockinfo/0`:" -#: src/faq.md:196 -msgid "" -"Bitcoin's market capitalization and liquidity are greater than Ethereum's by " -"a large margin. Much of this liquidity is not available to Ethereum NFTs, " -"since many Bitcoiners prefer not to interact with the Ethereum ecosystem due " -"to concerns related to simplicity, security, and decentralization." -msgstr "" -"La valoración de mercado y el flujo de capital en Bitcoin exceden " -"considerablemente a los de Ethereum. Gran parte de esta liquidez no está " -"disponible para los NFT en Ethereum, ya que muchos bitcoiners prefieren no " -"interactuar con el ecosistema de Ethereum debido a las preocupaciones " -"relacionadas con la simplicidad, seguridad y descentralización." +#: src/inscriptions/recursion.md:83 +msgid "Note: `feerate_percentiles` are feerates at the 10th, 25th, 50th, 75th, and 90th percentile in sats/vB." +msgstr "Nota: `feerate_percentiles` son las tarifas en los percentiles 10, 25, 50, 75, y 90." -#: src/faq.md:201 -msgid "" -"Such Bitcoiners may be more interested in inscriptions than Ethereum NFTs, " -"unlocking new classes of collector." -msgstr "" -"Estos bitcoiners podrían estar más interesados en las inscripciones " -"que en los NFT de Ethereum, abriendo la puerta a otros tipos de coleccionistas." +#: src/inscriptions/recursion.md:88 +msgid "\"average_fee\"" +msgstr "\"average_fee\"" -#: src/faq.md:204 -msgid "_Inscriptions have a richer data model._" -msgstr "_Las inscripciones tienen un modelo de datos más robusto._" +#: src/inscriptions/recursion.md:89 +msgid "\"average_fee_rate\"" +msgstr "\"average_fee_rate\"" -#: src/faq.md:206 -msgid "" -"Inscriptions consist of a content type, also known as a MIME type, and " -"content, which is an arbitrary byte string. This is the same data model used " -"by the web, and allows inscription content to evolve with the web, and come " -"to support any kind of content supported by web browsers, without requiring " -"changes to the underlying protocol." -msgstr "" -"Una inscripción está conformada por el tipo de contenido, conocido como el " -"tipo MIME, y una cadena (string) de bytes que sería el contenido. Este es " -"el mismo modelo de datos utilizado por la web, este permite que el contenido " -"de la inscripción evolucione con la web, y llegue a admitir cualquier tipo de " -"contenido soportado por los navegadores web, sin requerir cambios en el protocolo " -"subyacente." +#: src/inscriptions/recursion.md:90 +msgid "\"bits\"" +msgstr "\"bits\"" -#: src/faq.md:212 -msgid "RGB and Taro assets?" -msgstr "¿Activos de RGB y Taro?" +#: src/inscriptions/recursion.md:91 +msgid "\"chainwork\"" +msgstr "\"chainwork\"" -#: src/faq.md:214 -msgid "" -"RGB and Taro are both second-layer asset protocols built on Bitcoin. " -"Compared to inscriptions, they are much more complicated, but much more " -"featureful." -msgstr "" -"RGB y Taro son protocolos de activos construidos en una capa segundaria " -"sobre Bitcoin. En comparación con las inscripciones, son mucho más complicados, " -"pero con muchas más funcionalidades." +#: src/inscriptions/recursion.md:91 +msgid "\"0000000000000000000000000000000000000000000000000000000100010001\"" +msgstr "\"0000000000000000000000000000000000000000000000000000000100010001\"" -#: src/faq.md:217 -msgid "" -"Ordinal theory has been designed from the ground up for digital artifacts, " -"whereas the primary use-case of RGB and Taro are fungible tokens, so the " -"user experience for inscriptions is likely to be simpler and more polished " -"than the user experience for RGB and Taro NFTs." -msgstr "" -"La teoría ordinal ha sido diseñada desde cero para los artefactos " -"digitales, mientras que el enfoque de RGB y Taro son los tokens fungibles, " -"por lo que la experiencia de un usuario con las inscripciones probablemente " -"sea más sencilla y refinada que la experiencia de alguien utilizando NFTs de " -"RGB y Taro." +#: src/inscriptions/recursion.md:92 +msgid "\"confirmations\"" +msgstr "\"confirmations\"" -#: src/faq.md:222 -msgid "" -"RGB and Taro both store content off-chain, which requires additional " -"infrastructure, and which may be lost. By contrast, inscription content is " -"stored on-chain, and cannot be lost." -msgstr "" -"RGB y Taro almacenan contenido fuera de la cadena, lo que requiere una " -"infraestructura adicional que podría perderse. En cambio, el contenido de las " -"inscripciones se almacena en la cadena y no puede perderse." +#: src/inscriptions/recursion.md:93 +msgid "\"difficulty\"" +msgstr "\"difficulty\"" -#: src/faq.md:226 -msgid "" -"Ordinal theory, RGB, and Taro are all very early, so this is speculation, " -"but ordinal theory's focus may give it the edge in terms of features for " -"digital artifacts, including a better content model, and features like " -"globally unique symbols." -msgstr "" -"La teoría ordinal, RGB y Taro están en sus primeras etapas, por lo que " -"todo esto es especulativo, pero el enfoque de la teoría ordinal podría " -"darle la ventaja en términos de funcionalidad para artefactos digitales, " -"incluyendo un mejor modelo de contenido y características como símbolos " -"globalmente únicos." +#: src/inscriptions/recursion.md:94 +msgid "\"hash\"" +msgstr "\"hash\"" -#: src/faq.md:231 -msgid "Counterparty assets?" -msgstr "¿Activos de Counterparty?" +#: src/inscriptions/recursion.md:95 +msgid "\"feerate_percentiles\"" +msgstr "\"feerate_percentiles\"" -#: src/faq.md:233 -msgid "" -"Counterparty has its own token, XCP, which is required for some " -"functionality, which makes most bitcoiners regard it as an altcoin, and not " -"an extension or second layer for bitcoin." -msgstr "" -"Counterparty tiene su propio token, XCP, que es necesario para algunas " -"funcionalidades, lo que hace que la mayoría de los bitcoiners lo consideren " -"como una altcoin, y no como una extensión o segunda capa de bitcoin." +#: src/inscriptions/recursion.md:96 src/inscriptions/recursion.md:151 src/inscriptions/recursion.md:165 src/inscriptions/recursion.md:188 +msgid "\"height\"" +msgstr "\"height\"" -#: src/faq.md:237 -msgid "" -"Ordinal theory has been designed from the ground up for digital artifacts, " -"whereas Counterparty was primarily designed for financial token issuance." -msgstr "" -"La teoría ordinal fue diseñada específicamente para tratar con " -"artefactos digitales, a diferencia de Counterparty, que se diseñó principalmente " -"enfocado en la emisión de tokens financieros." +#: src/inscriptions/recursion.md:97 +msgid "\"max_fee\"" +msgstr "\"max_fee\"" -#: src/faq.md:240 -msgid "Inscriptions for…" -msgstr "Inscripciones para..." +#: src/inscriptions/recursion.md:98 +msgid "\"max_fee_rate\"" +msgstr "\"max_fee_rate\"" -#: src/faq.md:243 -msgid "Artists" -msgstr "Artistas" +#: src/inscriptions/recursion.md:99 +msgid "\"max_tx_size\"" +msgstr "\"max_tx_size\"" -#: src/faq.md:245 -msgid "" -"_Inscriptions are on Bitcoin._ Bitcoin is the digital currency with the " -"highest status and greatest chance of long-term survival. If you want to " -"guarantee that your art survives into the future, there is no better way to " -"publish it than as inscriptions." -msgstr "" -"_Las inscripciones están en Bitcoin_. Bitcoin es la moneda digital con el mayor " -"prestigio y la mayor probabilidad de supervivencia a largo plazo. Si deseas garantizar " -"que tu arte perdure en el futuro, no hay mejor forma de publicarlo que mediante " -"inscripciones." +#: src/inscriptions/recursion.md:100 +msgid "\"median_fee\"" +msgstr "\"median_fee\"" -#: src/faq.md:250 -msgid "" -"_Cheaper on-chain storage._ At $20,000 per BTC and the minimum relay fee of " -"1 satoshi per vbyte, publishing inscription content costs $50 per 1 million " -"bytes." -msgstr "" -"_Almacenamiento en cadena es menos costoso_. " -"A $20,000 por BTC y una comisión mínima de 1 satoshi por vbyte, el costo de " -"publicar contenido en una inscripción es de $50 por 1 millón de bytes." +#: src/inscriptions/recursion.md:101 +msgid "\"median_time\"" +msgstr "\"median_time\"" -#: src/faq.md:254 -msgid "" -"_Inscriptions are early!_ Inscriptions are still in development, and have " -"not yet launched on mainnet. This gives you an opportunity to be an early " -"adopter, and explore the medium as it evolves." -msgstr "" -"_¡Las inscripciones están en sus inicios!_ Las inscripciones todavía " -"están en desarrollo y aún no se han lanzado en la red principal. Esto te brinda " -"la oportunidad de ser un pionero y explorar el medio a medida que evoluciona." +#: src/inscriptions/recursion.md:102 +msgid "\"merkle_root\"" +msgstr "\"merkle_root\"" -#: src/faq.md:258 -msgid "" -"_Inscriptions are simple._ Inscriptions do not require writing or " -"understanding smart contracts." -msgstr "" -"_Las inscripciones son simples_. No es necesario escribir ni " -"comprender contratos inteligentes." +#: src/inscriptions/recursion.md:102 +msgid "\"0000000000000000000000000000000000000000000000000000000000000000\"" +msgstr "\"0000000000000000000000000000000000000000000000000000000000000000\"" -#: src/faq.md:261 -msgid "" -"_Inscriptions unlock new liquidity._ Inscriptions are more accessible and " -"appealing to bitcoin holders, unlocking an entirely new class of collector." -msgstr "" -"_Las inscripciones abren las puertas a nuevas fuentes de liquidez_. " -"Las inscripciones resultan más accesibles y atractivas para los poseedores " -"de bitcoin, dando paso a una clase completamente nueva de coleccionistas." +#: src/inscriptions/recursion.md:103 +msgid "\"min_fee\"" +msgstr "\"min_fee\"" -#: src/faq.md:264 -msgid "" -"_Inscriptions are designed for digital artifacts._ Inscriptions are designed " -"from the ground up to support NFTs, and feature a better data model, and " -"features like globally unique symbols and enhanced provenance." -msgstr "" -"_Las inscripciones están diseñadas para los artefactos digitales_. " -"Se diseñan desde cero enfocándose en los NFTs y ofrecen un modelo de datos " -"superior, con características como símbolos globalmente únicos y una procedencia " -"mejorada." +#: src/inscriptions/recursion.md:104 +msgid "\"min_fee_rate\"" +msgstr "\"min_fee_rate\"" -#: src/faq.md:268 -msgid "" -"_Inscriptions do not support on-chain royalties._ This is negative, but only " -"depending on how you look at it. On-chain royalties have been a boon for " -"creators, but have also created a huge amount of confusion in the Ethereum " -"NFT ecosystem. The ecosystem now grapples with this issue, and is engaged in " -"a race to the bottom, towards a royalties-optional future. Inscriptions have " -"no support for on-chain royalties, because they are technically infeasible. " -"If you choose to create inscriptions, there are many ways you can work " -"around this limitation: withhold a portion of your inscriptions for future " -"sale, to benefit from future appreciation, or perhaps offer perks for users " -"who respect optional royalties." -msgstr "" -"_Las inscripciones no admiten regalías en cadena_. Esto puede verse como " -"algo negativo, pero realmente depende de la perspectiva de cada uno. Si bien " -"las regalías en cadena han beneficiado enormemente a los creadores, también han " -"generado una gran cantidad de confusión en el ecosistema NFT de Ethereum. En este" -" momento, el ecosistema está lidiando con este problema, encaminándose hacia un " -"futuro donde las regalías serán opcionales. Las inscripciones no admiten regalías " -"en cadena debido a que técnica y prácticamente no son viables. Sin embargo, si " -"decides crear inscripciones, existen varias estrategias para superar esta restricción: " -"puedes retener una porción de tus inscripciones para futuras ventas, aprovechando " -"así la valorización que puedan tener con el tiempo; o incluso ofrecer incentivos " -"a los usuarios que opten por respetar las regalías opcionales." +#: src/inscriptions/recursion.md:105 +msgid "\"next_block\"" +msgstr "\"next_block\"" -#: src/faq.md:279 -msgid "Collectors" -msgstr "Coleccionistas " +#: src/inscriptions/recursion.md:106 +msgid "\"nonce\"" +msgstr "\"nonce\"" -#: src/faq.md:281 -msgid "" -"_Inscriptions are simple, clear, and have no surprises._ They are always " -"immutable and on-chain, with no special due diligence required." -msgstr "" -"_Las inscripciones son sencillas, claras y sin sorpresas inesperadas_. " -"Son siempre inmutables y residen en la cadena de Bitcoin, lo que elimina la necesidad de gestiones adicionales." +#: src/inscriptions/recursion.md:107 +msgid "\"previous_block\"" +msgstr "\"previous_block\"" -#: src/faq.md:284 -msgid "" -"_Inscriptions are on Bitcoin._ You can verify the location and properties of " -"inscriptions easily with Bitcoin full node that you control." -msgstr "" -"_Las inscripciones están en Bitcoin_. Puedes verificar fácilmente la " -"ubicación y propiedades de las inscripciones con un nodo de Bitcoin que tu controlas." +#: src/inscriptions/recursion.md:108 +msgid "\"subsidy\"" +msgstr "\"subsidy\"" -#: src/faq.md:287 -msgid "Bitcoiners" -msgstr "Bitcoiners" +#: src/inscriptions/recursion.md:109 +msgid "\"target\"" +msgstr "\"target\"" -#: src/faq.md:289 -msgid "" -"Let me begin this section by saying: the most important thing that the " -"Bitcoin network does is decentralize money. All other use-cases are " -"secondary, including ordinal theory. The developers of ordinal theory " -"understand and acknowledge this, and believe that ordinal theory helps, at " -"least in a small way, Bitcoin's primary mission." -msgstr "" -"Permíteme iniciar esta sección señalando que: la principal función de la " -"red de Bitcoin es la descentralización del dinero. Todos los otros usos " -"que se le pueden dar son secundarios, y eso incluye a la teoría ordinal. " -"Los desarrolladores detrás de esta teoría comprenden muy bien este aspecto " -"y consideran que su trabajo contribuye, aunque sea mínimamente, a la misión principal de Bitcoin." +#: src/inscriptions/recursion.md:109 +msgid "\"00000000ffff0000000000000000000000000000000000000000000000000000\"" +msgstr "\"00000000ffff0000000000000000000000000000000000000000000000000000\"" -#: src/faq.md:295 -msgid "" -"Unlike many other things in the altcoin space, digital artifacts have merit. " -"There are, of course, a great deal of NFTs that are ugly, stupid, and " -"fraudulent. However, there are many that are fantastically creative, and " -"creating and collecting art has been a part of the human story since its " -"inception, and predates even trade and money, which are also ancient " -"technologies." -msgstr "A diferencia de muchas otras cosas en el espacio altcoin, los artefactos digitales tienen mérito. Es cierto que existen una gran cantidad de NFTs que son feos, estúpidos y fraudulentos. No obstante, también hay muchos que destacan por su increíble creatividad. La creación y colección de arte ha sido parte de la historia humana desde sus inicios, precediendo incluso al comercio y al dinero, que también son tecnologías ancestrales." +#: src/inscriptions/recursion.md:110 src/inscriptions/recursion.md:157 src/inscriptions/recursion.md:171 src/inscriptions/recursion.md:194 +msgid "\"timestamp\"" +msgstr "\"timestamp\"" + +#: src/inscriptions/recursion.md:111 +msgid "\"total_fee\"" +msgstr "\"total_fee\"" + +#: src/inscriptions/recursion.md:112 +msgid "\"total_size\"" +msgstr "\"total_size\"" + +#: src/inscriptions/recursion.md:113 +msgid "\"total_weight\"" +msgstr "\"total_weight\"" + +#: src/inscriptions/recursion.md:114 +msgid "\"transaction_count\"" +msgstr "\"transaction_count\"" + +#: src/inscriptions/recursion.md:115 +msgid "\"version\"" +msgstr "\"versión\"" + +#: src/inscriptions/recursion.md:119 +msgid "`/r/blocktime`:" +msgstr "`/r/blocktime`:" + +#: src/inscriptions/recursion.md:125 +msgid "`/r/children/60bcf821240064a9c55225c4f01711b0ebbcab39aa3fafeefe4299ab158536fai0/49`:" +msgstr "`/r/children/60bcf821240064a9c55225c4f01711b0ebbcab39aa3fafeefe4299ab158536fai0/49`:" + +#: src/inscriptions/recursion.md:129 src/inscriptions/recursion.md:209 +msgid "\"ids\"" +msgstr "\"ids\"" + +#: src/inscriptions/recursion.md:130 src/inscriptions/recursion.md:152 +msgid "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4900\"" +msgstr "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4900\"" + +#: src/inscriptions/recursion.md:131 +msgid "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4901\"" +msgstr "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4901\"" + +#: src/inscriptions/recursion.md:133 +msgid "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4935\"" +msgstr "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4935\"" + +#: src/inscriptions/recursion.md:134 src/inscriptions/recursion.md:166 +msgid "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4936\"" +msgstr "\"7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4936\"" + +#: src/inscriptions/recursion.md:136 src/inscriptions/recursion.md:174 src/inscriptions/recursion.md:212 +msgid "\"more\"" +msgstr "\"more\"" + +#: src/inscriptions/recursion.md:137 src/inscriptions/recursion.md:175 src/inscriptions/recursion.md:213 +msgid "\"page\"" +msgstr "\"page\"" + +#: src/inscriptions/recursion.md:141 +msgid "`/r/children/60bcf821240064a9c55225c4f01711b0ebbcab39aa3fafeefe4299ab158536fai0/inscriptions/49`:" +msgstr "`/r/children/60bcf821240064a9c55225c4f01711b0ebbcab39aa3fafeefe4299ab158536fai0/inscriptions/49`:" -#: src/faq.md:302 +#: src/inscriptions/recursion.md:145 +msgid "\"children\"" +msgstr "\"children\"" + +#: src/inscriptions/recursion.md:147 src/inscriptions/recursion.md:161 src/inscriptions/recursion.md:183 +msgid "\"charms\"" +msgstr "\"charms\"" + +#: src/inscriptions/recursion.md:148 src/inscriptions/recursion.md:162 +msgid "\"cursed\"" +msgstr "\"cursed\"" + +#: src/inscriptions/recursion.md:150 src/inscriptions/recursion.md:164 src/inscriptions/recursion.md:187 +msgid "\"fee\"" +msgstr "\"fee\"" + +#: src/inscriptions/recursion.md:152 src/inscriptions/recursion.md:166 src/inscriptions/recursion.md:189 src/inscriptions/recursion.md:221 +msgid "\"id\"" +msgstr "\"id\"" + +#: src/inscriptions/recursion.md:153 src/inscriptions/recursion.md:167 src/inscriptions/recursion.md:190 +msgid "\"number\"" +msgstr "\"number\"" + +#: src/inscriptions/recursion.md:154 src/inscriptions/recursion.md:168 src/inscriptions/recursion.md:191 +msgid "\"output\"" +msgstr "\"output\"" + +#: src/inscriptions/recursion.md:154 src/inscriptions/recursion.md:168 +msgid "\"dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0\"" +msgstr "\"dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0\"" + +#: src/inscriptions/recursion.md:155 src/inscriptions/recursion.md:169 src/inscriptions/recursion.md:192 +msgid "\"sat\"" +msgstr "\"sat\"" + +#: src/inscriptions/recursion.md:156 src/inscriptions/recursion.md:170 src/inscriptions/recursion.md:193 +msgid "\"satpoint\"" +msgstr "\"satpoint\"" + +#: src/inscriptions/recursion.md:156 +msgid "\"dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0:74188588\"" +msgstr "\"dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0:74188588\"" + +#: src/inscriptions/recursion.md:170 +msgid "\"dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0:74188624\"" +msgstr "\"dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0:74188624\"" + +#: src/inscriptions/recursion.md:179 +msgid "`/r/inscription/3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36i0`" +msgstr "`/r/inscription/3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36i0`" + +#: src/inscriptions/recursion.md:184 +msgid "\"content_type\"" +msgstr "\"content_type\"" + +#: src/inscriptions/recursion.md:184 +msgid "\"image/png\"" +msgstr "\"image/png\"" + +#: src/inscriptions/recursion.md:185 +msgid "\"content_length\"" +msgstr "\"content_length\"" + +#: src/inscriptions/recursion.md:186 +msgid "\"delegate\"" +msgstr "\"delegate\"" + +#: src/inscriptions/recursion.md:189 +msgid "\"3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36i0\"" +msgstr "\"3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36i0\"" + +#: src/inscriptions/recursion.md:191 +msgid "\"3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36:0\"" +msgstr "\"3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36:0\"" + +#: src/inscriptions/recursion.md:193 +msgid "\"3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36:0:0\"" +msgstr "\"3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36:0:0\"" + +#: src/inscriptions/recursion.md:195 +msgid "\"value\"" +msgstr "\"value\"" + +#: src/inscriptions/recursion.md:199 +msgid "`/r/metadata/35b66389b44535861c44b2b18ed602997ee11db9a30d384ae89630c9fc6f011fi3`:" +msgstr "`/r/metadata/35b66389b44535861c44b2b18ed602997ee11db9a30d384ae89630c9fc6f011fi3`:" + +#: src/inscriptions/recursion.md:202 +msgid "\"a2657469746c65664d656d6f727966617574686f726e79656c6c6f775f6f72645f626f74\"" +msgstr "\"a2657469746c65664d656d6f727966617574686f726e79656c6c6f775f6f72645f626f74\"" + +#: src/inscriptions/recursion.md:205 +msgid "`/r/sat/1023795949035695`:" +msgstr "`/r/sat/1023795949035695`:" + +#: src/inscriptions/recursion.md:210 src/inscriptions/recursion.md:221 +msgid "\"17541f6adf6eb160d52bc6eb0a3546c7c1d2adfe607b1a3cddc72cc0619526adi0\"" +msgstr "\"17541f6adf6eb160d52bc6eb0a3546c7c1d2adfe607b1a3cddc72cc0619526adi0\"" + +#: src/inscriptions/recursion.md:217 +msgid "`/r/sat/1023795949035695/at/-1`:" +msgstr "`/r/sat/1023795949035695/at/-1`:" + +#: src/inscriptions/rendering.md:4 +msgid "Aspect Ratio" +msgstr "Proporción de Aspecto" + +#: src/inscriptions/rendering.md:7 msgid "" -"Bitcoin provides an amazing platform for creating and collecting digital " -"artifacts in a secure, decentralized way, that protects users and artists in " -"the same way that it provides an amazing platform for sending and receiving " -"value, and for all the same reasons." +"Inscriptions should be rendered with a square aspect ratio. Non-square aspect ratio inscriptions should not be cropped, and should instead be centered and resized to fit within " +"their container." msgstr "" -"Bitcoin ofrece una plataforma increíble para la creación y colección de artefactos " -"digitales de manera segura y descentralizada, protegiendo tanto a usuarios como a artistas, al igual que facilita una plataforma confiable para transmitir y recibir valor." +"Las inscripciones deben renderizarse con una proporción de aspecto cuadrado. No se deben recortar las inscripciones que no sean cuadradas; en vez, deben centrarse y " +"redimensionarse para ajustarse a su contenedor." -#: src/faq.md:307 +#: src/inscriptions/rendering.md:11 +msgid "Maximum Size" +msgstr "Tamaño Máximo" + +#: src/inscriptions/rendering.md:14 msgid "" -"Ordinals and inscriptions increase demand for Bitcoin block space, which " -"increase Bitcoin's security budget, which is vital for safeguarding " -"Bitcoin's transition to a fee-dependent security model, as the block subsidy " -"is halved into insignificance." +"The `ord` explorer, used by [ordinals.com](https://ordinals.com/), displays inscription previews with a maximum size of 576 by 576 pixels, making it a reasonable choice when " +"choosing a maximum display size." msgstr "" -"Los Ordinals y las inscripciones aumentan la demanda de espacio en los bloques " -"de Bitcoin, lo que aumenta el presupuesto de seguridad de Bitcoin esto es vital " -"para salvaguardar la transición de Bitcoin a un modelo de seguridad dependiente de comisiones, a medida que el subsidio de bloque se reduce a una cantidad insignificante." +"El explorador `ord`, utilizado por [ordinals.com](https://ordinals.com/), muestra vistas previas de inscripciones con un tamaño máximo de 576 por 576 píxeles, siendo una buena " +"elección a la hora de elegir un tamaño máximo de visualización." + +#: src/inscriptions/rendering.md:18 +msgid "Image Rendering" +msgstr "Renderizado de Imágenes" + +#: src/inscriptions/rendering.md:21 +msgid "The CSS `image-rendering` property controls how images are resampled when upscaled and downscaled." +msgstr "La propiedad CSS `image-rendering` controla cómo se redimensionan las imágenes cuando se amplían y reducen." + +#: src/inscriptions/rendering.md:24 +msgid "When downscaling image inscriptions, `image-rendering: auto`, should be used. This is desirable even when downscaling pixel art." +msgstr "Al reducir el tamaño de las inscripciones de imágenes, se debe usar `image-rendering: auto`. Esto es deseable incluso al reducir el tamaño de arte en píxeles." -#: src/faq.md:312 +#: src/inscriptions/rendering.md:27 msgid "" -"Inscription content is stored on-chain, and thus the demand for block space " -"for use in inscriptions is unlimited. This creates a buyer of last resort " -"for _all_ Bitcoin block space. This will help support a robust fee market, " -"which ensures that Bitcoin remains secure." +"When upscaling image inscriptions other than AVIF, `image-rendering: pixelated` should be used. This is desirable when upscaling pixel art, since it preserves the sharp edges of " +"pixels. It is undesirable when upscaling non-pixel art, but should still be used for visual compatibility with the `ord` explorer." msgstr "" -"El contenido de la inscripción se guarda en la cadena de bloques de Bitcoin " -"y, debido a esto, la necesidad de espacio en los bloques para alojar inscripciones " -"es ilimitada. Esta dinámica establece una demanda constante por el espacio disponible " -"en los bloques de Bitcoin, favoreciendo la sustentación de un mercado de comisiones saludable, lo que a su vez contribuye a preservar la seguridad de Bitcoin." +"Al incrementar el tamaño de las inscripciones que contienen imágenes, excepto de tipo AVIF, se debe utilizar `image-rendering: pixelated`. Esto es deseable al incrementar el " +"tamaño de arte de píxeles, ya que preserva los bordes afilados de los píxeles. No es deseable al aumentar imágenes que no sean arte de píxeles, pero aun así debe usarse para " +"mantener la compatibilidad visual con el explorador `ord`." -#: src/faq.md:317 +#: src/inscriptions/rendering.md:32 msgid "" -"Inscriptions also counter the narrative that Bitcoin cannot be extended or " -"used for new use-cases. If you follow projects like DLCs, Fedimint, " -"Lightning, Taro, and RGB, you know that this narrative is false, but " -"inscriptions provide a counter argument which is easy to understand, and " -"which targets a popular and proven use case, NFTs, which makes it highly " -"legible." +"When upscaling AVIF and JPEG XL inscriptions, `image-rendering: auto` should be used. This allows inscribers to opt-in to non-pixelated upscaling for non-pixel art inscriptions. " +"Until such time as JPEG XL is widely supported by browsers, it is not a recommended image format." msgstr "" -"Las inscripciones también contrarrestan la narrativa de que no se puede ampliar o usar " -"Bitcoin para nuevos casos de uso. Si sigues proyectos como DLCs, Fedimint, " -"Lightning, Taro y RGB, sabes que esta narrativa es falsa, pero las " -"inscripciones proporcionan un contraargumento que es fácil de entender y que apunta a un caso de uso popular y que ha sido utilizado, NFTs, lo que lo hace muy atractivo." +"Al ampliar inscripciones en formatos AVIF y JPEG XL, se debe usar `image-rendering: auto`. Esto permite que los inscriptores opten por una ampliación no pixelada para " +"inscripciones que no sean arte de píxeles. Hasta que JPEG XL sea ampliamente compatible con los navegadores, no se recomienda utilizarlos como formato de imagen." -#: src/faq.md:323 +#: src/runes.md:4 +msgid "Runes allow Bitcoin transactions to etch, mint, and transfer Bitcoin-native digital commodities." +msgstr "Las runas permiten que las transacciones de Bitcoin graben, minteen y transfieran productos digitales nativos de Bitcoin." + +#: src/runes.md:7 +msgid "Whereas every inscription is unique, every unit of a rune is the same. They are interchangeable tokens, fit for a variety of purposes." +msgstr "Mientras que cada inscripción es única y diferente, una unidad de runa es idéntica. Son tokens intercambiables, hechos para servir una variedad de propósitos." + +#: src/runes.md:10 src/runes/specification.md:20 +msgid "Runestones" +msgstr "Piedras Rúnicas (Runestones)" + +#: src/runes.md:13 +msgid "Rune protocol messages, called runestones, are stored in Bitcoin transaction outputs." +msgstr "Los mensajes del protocolo de runas, llamados piedras rúnicas, se almacenan en las salidas de las transacciones de Bitcoin." + +#: src/runes.md:16 msgid "" -"If inscriptions prove, as the authors hope, to be highly sought after " -"digital artifacts with a rich history, they will serve as a powerful hook " -"for Bitcoin adoption: come for the fun, rich art, stay for the decentralized " -"digital money." +"A runestone output's script pubkey begins with an `OP_RETURN`, followed by `OP_13`, followed by zero or more data pushes. These data pushes are concatenated and decoded into a " +"sequence of 128-bit integers, and finally parsed into a runestone." msgstr "" -"Si las inscripciones se demuestran, como esperan los autores, ser artefactos " -"digitales muy buscados con una historia rica, servirán como un poderoso gancho para la adopción de Bitcoin: ven por el arte divertido, quédate por el dinero digital descentralizado." +"El pubkey del script de salida de una piedra rúnica comienza con un `OP_RETURN`, seguido por `OP_13`, seguido por cero o más pushes de datos. Estos push de datos se concatenan y " +"decodifican en una secuencia de enteros de 128 bits, finalmente estos se analizan y se convierten en una piedra rúnica." -#: src/faq.md:327 +#: src/runes.md:21 +msgid "A transaction may have at most one runestone." +msgstr "Una transacción puede tener como máximo una piedra rúnica." + +#: src/runes.md:23 +msgid "A runestone may etch a new rune, mint an existing rune, and transfer runes from a transaction's inputs to its outputs." +msgstr "Una piedra rúnica puede grabar una runa nueva, mintear una runa existente y transferir runas de las entradas de una transacción a sus salidas." + +#: src/runes.md:26 +msgid "A transaction output may hold balances of any number of runes." +msgstr "La salida de una transacción puede contener saldos de cualquier cantidad de runas." + +#: src/runes.md:28 msgid "" -"Inscriptions are an extremely benign source of demand for block space. " -"Unlike, for example, stablecoins, which potentially give large stablecoin " -"issuers influence over the future of Bitcoin development, or DeFi, which " -"might centralize mining by introducing opportunities for MEV, digital art " -"and collectables on Bitcoin, are unlikely to produce individual entities " -"with enough power to corrupt Bitcoin. Art is decentralized." +"Runes are identified by IDs, which consist of the block in which a rune was etched and the index of the etching transaction within that block, represented in text as `BLOCK:TX`. " +"For example, the ID of the rune etched in the 20th transaction of the 500th block is `500:20`." msgstr "" -"Las inscripciones son una fuente extremadamente benigna de demanda de espacio" -"en el bloque. A diferencia de, por ejemplo, las stablecoins, que potencialmente " -"dan a los emisores de stablecoins grandes influencia sobre el futuro desarrollo " -"de Bitcoin, o DeFi, que podría centralizar la minería introduciendo oportunidades " -"para MEV, el arte digital y coleccionables en Bitcoin, es poco probable " -"que produzcan entidades individuales con suficiente poder para corromper " -"Bitcoin. El arte es descentralizado." +"Las runas se identifican por ID, las cuales consisten en el bloque en el que se grabó una runa y el índice de la transacción de grabado dentro de ese bloque, su representación " +"textual sería `BLOQUE:TX`. Por ejemplo, el ID de la runa grabada en la transacción 20 del bloque 500 es `500:20`." -#: src/faq.md:334 -msgid "" -"Inscription users and service providers are incentivized to run Bitcoin full " -"nodes, to publish and track inscriptions, and thus throw their economic " -"weight behind the honest chain." +#: src/runes.md:33 +msgid "Etching" +msgstr "Grabado" + +#: src/runes.md:36 +msgid "Runes come into existence by being etched. Etching creates a rune and sets its properties. Once set, these properties are immutable, even to its etcher." msgstr "" -"Se les incentiva a los usuarios de inscripciones y a los proveedores de servicios ejecutar nodos de Bitcoin, para publicar y rastrear inscripciones, y así apoyar respaldar la cadena." +"Las runas cobran vida al ser grabadas. El grabado crea una runa y establece sus propiedades. Una vez establecidas, estas propiedades son inmutables, incluso para quien las grabó." -#: src/faq.md:338 -msgid "" -"Ordinal theory and inscriptions do not meaningfully affect Bitcoin's " -"fungibility. Bitcoin users can ignore both and be unaffected." +#: src/runes.md:39 src/runes/specification.md:420 +msgid "Name" +msgstr "Nombre" + +#: src/runes.md:41 +msgid "Names consist of the letters A through Z and are between one and twenty-six letters long. For example `UNCOMMONGOODS` is a rune name." +msgstr "Los nombres consisten en letras de la A a la Z y tienen entre una y veintiséis letras. Por ejemplo, `UNCOMMONGOODS` es un nombre de runa." + +#: src/runes.md:44 +msgid "Names may contain spacers, represented as bullets, to aid readability. `UNCOMMONGOODS` might be etched as `UNCOMMON•GOODS`." +msgstr "Los nombres pueden tener separadores, representados como un punto en medio, para facilitar su lectura. `UNCOMMONGOODS` podría ser grabado como `UNCOMMON•GOODS`." + +#: src/runes.md:47 +msgid "The uniqueness of a name does not depend on spacers. Thus, a rune may not be etched with the same sequence of letters as an existing rune, even if it has different spacers." msgstr "" -"La teoría ordinal y las inscripciones no afectan en alguna escala significante la fungibilidad de Bitcoin. Los usuarios de Bitcoin pueden ignorar ambos y no verse afectados." +"La exclusividad de un nombre no depende de los separadores. Por lo tanto, una runa no puede ser grabada con la misma secuencia de letras a la de una runa existente, incluso si " +"tiene diferentes separadores." + +#: src/runes.md:51 +msgid "Spacers can only be placed between two letters. Finally, spacers do not count towards the letter count." +msgstr "Los separadores solo pueden colocarse entre dos letras. Finalmente, los separadores no cuentan como letras." + +#: src/runes.md:54 src/runes/specification.md:330 src/runes/specification.md:338 +msgid "Divisibility" +msgstr "Divisibilidad" -#: src/faq.md:341 +#: src/runes.md:56 msgid "" -"We hope that ordinal theory strengthens and enriches bitcoin, and gives it " -"another dimension of appeal and functionality, enabling it more effectively " -"serve its primary use case as humanity's decentralized store of value." +"A rune's divisibility is how finely it may be divided into its atomic units. Divisibility is expressed as the number of digits permissible after the decimal point in an amount of " +"runes. A rune with divisibility 0 may not be divided. A unit of a rune with divisibility 1 may be divided into ten sub-units, a rune with divisibility 2 may be divided into a " +"hundred, and so on." msgstr "" -"Esperamos que la teoría ordinal fortalezca y enriquezca a bitcoin, y le dé " -"otra dimensión de atractividad y funcionalidad, permitiéndole servir de manera más efectiva a su caso de uso principal como el almacenamiento descentralizado de valor de para la humanidad." +"La divisibilidad de una runa es la capacidad de dividirse en unidades. La divisibilidad se expresa como el número de dígitos permitidos después del punto decimal en una cantidad " +"de runas. Una runa con divisibilidad 0 no puede dividirse. Una unidad de una runa con divisibilidad 1 puede dividirse en diez subunidades, una runa con divisibilidad 2 puede " +"dividirse en cien, y así sucesivamente." -#: src/contributing.md:1 -msgid "Contributing to `ord`" -msgstr "Contribuir a `ord`" +#: src/runes.md:62 src/runes/specification.md:365 +msgid "Symbol" +msgstr "Símbolo" -#: src/contributing.md:4 -msgid "Suggested Steps" -msgstr "Pasos Sugeridos" +#: src/runes.md:64 +msgid "A rune's currency symbol is a single Unicode code point, for example `$`, `⧉`, or `🧿`, displayed after quantities of that rune." +msgstr "El símbolo de una runa es un punto de código Unicode, por ejemplo, `$`, `⧉`o `🧿`, que se muestra después de las cantidades de esa runa." -#: src/contributing.md:7 -msgid "Find an issue you want to work on." -msgstr "Encuentra un problema en el que quieras trabajar." +#: src/runes.md:67 +msgid "101 atomic units of a rune with divisibility 2 and symbol `🧿` would be rendered as `1.01 🧿`." +msgstr "101 unidades de una runa con divisibilidad 2 y el símbolo `🧿` se representarían como `1.01 🧿`." -#: src/contributing.md:8 -msgid "" -"Figure out what would be a good first step towards resolving the issue. This " -"could be in the form of code, research, a proposal, or suggesting that it be " -"closed, if it's out of date or not a good idea in the first place." -msgstr "" -"Determina cuál debería ser el primer paso para abordar el problema. " -"Esto podría involucrar código, investigación, la elaboración de una propuesta o incluso sugerir su cierre si está desactualizado o evaluar si es una buena idea desde un inicio." +#: src/runes.md:70 +msgid "If a rune does not have a symbol, the generic currency sign `¤`, also called a scarab, should be used." +msgstr "Si una runa no tiene símbolo, se debe usar el signo de moneda genérico `¤`, también llamado escarabajo." -#: src/contributing.md:11 -msgid "" -"Comment on the issue with an outline of your suggested first step, and " -"asking for feedback. Of course, you can dive in and start writing code or " -"tests immediately, but this avoids potentially wasted effort, if the issue " -"is out of date, not clearly specified, blocked on something else, or " -"otherwise not ready to implement." +#: src/runes.md:73 src/runes/specification.md:290 +msgid "Premine" +msgstr "Premina" + +#: src/runes.md:75 +msgid "The etcher of a rune may optionally allocate to themselves units of the rune being etched. This allocation is called a premine." +msgstr "El grabador de una runa puede asignarse a sí mismo unidades de la runa que está grabando. Esta asignación se llama premina." + +#: src/runes.md:78 +msgid "Terms" +msgstr "Términos" + +#: src/runes.md:80 +msgid "A rune may have an open mint, allowing anyone to create and allocate units of that rune for themselves. An open mint is subject to terms, which are set upon etching." msgstr "" -"Comenta sobre el problema con un esquema de tu primer paso sugerido y pide opiniones. Podrías comenzar a escribir código o hacer pruebas de inmediato, pero esto evita que se haga un esfuerzo potencialmente desperdiciado." +"Una runa puede tener un minteo abierto, permitiendo que cualquiera cree y asigne unidades de esa runa para sí mismo. Un minteo abierto está sujeto a términos, los cuales se " +"establecen al grabar." -#: src/contributing.md:16 +#: src/runes.md:84 msgid "" -"If the issue requires a code change or bugfix, open a draft PR with tests, " -"and ask for feedback. This makes sure that everyone is on the same page " -"about what needs to be done, or what the first step in solving the issue " -"should be. Also, since tests are required, writing the tests first makes it " -"easy to confirm that the change can be tested easily." +"A mint is open while all terms of the mint are satisfied, and closed when any of them are not. For example, a mint may be limited to a starting height, an ending height, and a " +"cap, and will be open between the starting height and ending height, or until the cap is reached, whichever comes first." msgstr "" -"Si el problema requiere un cambio de código o corrección de bugs, " -"abre un PR preliminar con pruebas y pide sugerencias. Esto asegura que todos esten" -"de acuerdo acerca de lo que se debe de hacer, o el primer paso en solucionar el" -"problema. Como se requieren pruebas escribirlas y probarlas confirma que se pueden " -"llevar a cabo fácilmente" +"Un minteo está abierto mientras se cumplan todos los términos, y se cierra cuando alguno de ellos no se cumple. Por ejemplo, un minteo puede estar limitado a una altura inicial, " +"una altura final y un límite, y estará abierto entre la altura inicial y la altura final, o hasta que se alcance el límite, cual sea que ocurra primero." -#: src/contributing.md:21 -msgid "" -"Mash the keyboard randomly until the tests pass, and refactor until the code " -"is ready to submit." -msgstr "Escribe código hasta que las pruebas pasen y refactorizar hasta que el código esté listo para enviar." +#: src/runes.md:89 src/runes/specification.md:294 +msgid "Cap" +msgstr "Tope" -#: src/contributing.md:23 -msgid "Mark the PR as ready to review." -msgstr "Marca el PR como listo para revisar." +#: src/runes.md:91 +msgid "The number of times a rune may be minted is its cap. A mint is closed once the cap is reached." +msgstr "El tope es la cantidad de veces que se puede mintear una runa. El minteo termina una vez que se alcance el tope." -#: src/contributing.md:24 -msgid "Revise the PR as needed." -msgstr "Revisa el PR según sea necesario." +#: src/runes.md:94 src/runes/specification.md:298 +msgid "Amount" +msgstr "Cantidad" -#: src/contributing.md:25 -msgid "And finally, mergies!" -msgstr "¡Por último, fusiónalo!" +#: src/runes.md:96 +msgid "Each mint transaction creates a fixed amount of new units of a rune." +msgstr "Cada vez que se realiza una transacción de minteo, se produce una cantidad fija de nuevas unidades de una runa." -#: src/contributing.md:27 -msgid "Start small" -msgstr "Comienza por las cosas pequeñas " +#: src/runes.md:98 +msgid "Start Height" +msgstr "Altura Inicial" -#: src/contributing.md:30 -msgid "" -"Small changes will allow you to make an impact quickly, and if you take the " -"wrong tack, you won't have wasted much time." -msgstr "Los cambios pequeños te permitirán tener un impacto rápidamente, y si eliges el enfoque equivocado, no habrás perdido mucho tiempo." +#: src/runes.md:100 +msgid "A mint is open starting in the block with the given start height." +msgstr "Un minteo comienza en el bloque de la altura inicial dada." -#: src/contributing.md:33 -msgid "Ideas for small issues:" -msgstr "Ideas para problemas pequeños:" +#: src/runes.md:102 +msgid "End Height" +msgstr "Altura Final" -#: src/contributing.md:34 -msgid "Add a new test or test case that increases test coverage" -msgstr "Añadir una prueba nueva o un caso de prueba que amplíe la cobertura de las pruebas." +#: src/runes.md:104 +msgid "A rune may not be minted in or after the block with the given end height." +msgstr "Una runa no puede ser minteada en o después del bloque de la altura final especificada." -#: src/contributing.md:35 -msgid "Add or improve documentation" -msgstr "Mejorar o añadir a la documentación existente." +#: src/runes.md:106 +msgid "Start Offset" +msgstr "Desplazamiento Inicial" -#: src/contributing.md:36 -msgid "" -"Find an issue that needs more research, and do that research and summarize " -"it in a comment" -msgstr "" -"Identificar un problema que requiera más investigación, realizarla y resumir los hallazgos en un comentario." +#: src/runes.md:108 +msgid "A mint is open starting in the block whose height is equal to the start offset plus the height of the block in which the rune was etched." +msgstr "Un minteo se abre comenzando en el bloque cuya altura es igual al desplazamiento inicial más la altura del bloque en el que se grabó la runa." -#: src/contributing.md:38 -msgid "Find an out-of-date issue and comment that it can be closed" -msgstr "Encontrar un problema que ha quedado desactualizado y sugerir su cierre a través de un comentario." +#: src/runes.md:111 +msgid "End Offset" +msgstr "Desplazamiento Final" -#: src/contributing.md:39 -msgid "" -"Find an issue that shouldn't be done, and provide constructive feedback " -"detailing why you think that is the case" +#: src/runes.md:113 +msgid "A rune may not be minted in or after the block whose height is equal to the end offset plus the height of the block in which the rune was etched." +msgstr "Una runa no puede ser minteada en o después del bloque cuya altura es igual al desplazamiento final más la altura del bloque en el que se grabó la runa." + +#: src/runes.md:116 src/runes/specification.md:478 +msgid "Minting" +msgstr "Minteo" + +#: src/runes.md:119 +msgid "While a rune's mint is open, anyone may create a mint transaction that creates a fixed amount of new units of that rune, subject to the terms of the mint." msgstr "" -"Encuentra un caso que no consideras un problema y proporciona tu opinión explicando por qué crees que ese el caso." +"Mientras que el minteo de una runa esté abierto, cualquiera puede crear una transacción de minteo que genere una cantidad fija de nuevas unidades de esa runa, sujeta a los " +"términos del minteo." -#: src/contributing.md:42 -msgid "Merge early and often" -msgstr "Fusiona pronto y a menudo" +#: src/runes.md:122 src/runes/specification.md:490 +msgid "Transferring" +msgstr "Transferencia" -#: src/contributing.md:45 +#: src/runes.md:125 msgid "" -"Break up large tasks into multiple smaller steps that individually make " -"progress. If there's a bug, you can open a PR that adds a failing ignored " -"test. This can be merged, and the next step can be to fix the bug and " -"unignore the test. Do research or testing, and report on your results. Break " -"a feature into small sub-features, and implement them one at a time." +"When transaction inputs contain runes, or new runes are created by a premine or mint, those runes are transferred to that transaction's outputs. A transaction's runestone may " +"change how input runes transfer to outputs." msgstr "" -"Divide las tareas grandes en partes con las cuales se puede progresar por separado. " -"Si hay un error, puedes abrir un PR que agregue una prueba fallida ignorada. Esto se " -"puede fusionar, y el siguiente paso puede ser corregir el error y desactivar la prueba. " -"Realiza investigaciones o pruebas y reporta tus resultados. Divide una característica en subcategorías pequeñas e impleméntalas una a la vez." +"Cuando las entradas de una transacción contienen runas, o se crean nuevas runas mediante una premina o minteo, esas runas se transfieren a las salidas de esa transacción. La runa " +"de una transacción puede modificar cómo las runas de entrada se transfieren a las salidas." -#: src/contributing.md:51 +#: src/runes.md:129 +msgid "Edicts" +msgstr "Edictos (Edicts)" + +#: src/runes.md:131 msgid "" -"Figuring out how to break down a larger PR into smaller PRs where each can " -"be merged is an art form well-worth practicing. The hard part is that each " -"PR must itself be an improvement." +"A runestone may contain any number of edicts. Edicts consist of a rune ID, an amount, and an output number. Edicts are processed in order, allocating unallocated runes to outputs." msgstr "" -"Descomponer un PR grande en PRs más pequeños que puedan fusionarse individualmente es un arte que vale la pena practicar. El desafío radica en asegurar que cada PR represente una mejora por sí mismo." +"Una runa puede contener cualquier cantidad de edictos. Los edictos consisten en un ID de runa, una cantidad y un número de salida. Los edictos se procesan en orden, asignando " +"runas que no han sido asignadas a las salidas." -#: src/contributing.md:55 +#: src/runes.md:137 msgid "" -"I strive to follow this advice myself, and am always better off when I do." +"After all edicts are processed, remaining unallocated runes are transferred to the transaction's first non-`OP_RETURN` output. A runestone may optionally contain a pointer that " +"specifies an alternative default output." msgstr "" -"Me esfuerzo por aplicar este consejo yo mismo, y siempre obtengo beneficios cuando lo hago." +"Una vez procesados todos los edictos, las runas no asignadas se transfieren a la primera salida de la transacción que no sea `OP_RETURN`. De manera opcional, una runa puede " +"incluir un puntero que indique una salida predeterminada diferente." -#: src/contributing.md:57 -msgid "" -"Small changes are fast to write, review, and merge, which is much more fun " -"than laboring over a single giant PR that takes forever to write, review, " -"and merge. Small changes don't take much time, so if you need to stop " -"working on a small change, you won't have wasted much time as compared to a " -"larger change that represents many hours of work. Getting a PR in quickly " -"improves the project a little bit immediately, instead of having to wait a " -"long time for larger improvement. Small changes are less likely to " -"accumulate merge conflict. As the Athenians said: _The fast commit what they " -"will, the slow merge what they must._" -msgstr "" -"Los cambios pequeños son rápidos de escribir, revisar y fusionar, lo que es mucho " -"más divertido que trabajar en un solo PR gigante que tarda una eternidad en escribirse, " -"revisarse y fusionarse. Los cambios pequeños no toman mucho tiempo, así que, si necesitas " -"dejar de trabajar en un cambio pequeño, no habrás perdido mucho tiempo a comparación " -"de un cambio más grande en las que se invirtieron muchas horas de trabajo. Conseguir " -"que un PR se fusione rápidamente mejora el proyecto de inmediato, en lugar de tener " -"que esperar mucho tiempo para una mejora más grande. Los cambios pequeños tienen " -"menos probabilidades de acumular conflictos de fusión. _Como decían los atenienses: " -"_Los rápidos hacen lo que quieren, los lentos hacen lo que deben._" +#: src/runes.md:141 +msgid "Burning" +msgstr "Quemar" -#: src/contributing.md:67 -msgid "Get help" -msgstr "Busca ayuda" +#: src/runes.md:143 +msgid "Runes may be burned by transferring them to an `OP_RETURN` output with an edict or pointer." +msgstr "Las runas pueden ser quemadas transfiriéndolas a una salida `OP_RETURN` que tenga un edicto o puntero." -#: src/contributing.md:70 +#: src/runes.md:146 src/runes/specification.md:378 +msgid "Cenotaphs" +msgstr "Cenotafios" + +#: src/runes.md:149 +msgid "Runestones may be malformed for a number of reasons, including non-pushdata opcodes in the runestone `OP_RETURN`, invalid varints, or unrecognized runestone fields." +msgstr "Las runas pueden estar mal formadas por varias razones, incluyendo opcodes no pushdata en el `OP_RETURN` de la runa, varints inválidos o campos de runas no reconocidos." + +#: src/runes.md:153 +msgid "Malformed runestones are termed [cenotaphs](https://en.wikipedia.org/wiki/Cenotaph)." +msgstr "Las runas mal formadas se denominan [cenotafios](https://es.wikipedia.org/wiki/Cenotafio)." + +#: src/runes.md:156 msgid "" -"If you're stuck for more than 15 minutes, ask for help, like a Rust Discord, " -"Stack Exchange, or in a project issue or discussion." +"Runes input to a transaction with a cenotaph are burned. Runes etched in a transaction with a cenotaph are set as unmintable. Mints in a transaction with a cenotaph count towards " +"the mint cap, but the minted runes are burned." msgstr "" -"Si te ves atascado por más de 15 minutos, busca ayuda en espacios como el " -"Discord de Rust, en Stack Exchange, o en una discusión sobre el problema dentro del proyecto." - -#: src/contributing.md:73 -msgid "Practice hypothesis-driven debugging" -msgstr "Practica la depuración basada en hipótesis" +"Las runas ingresadas a una transacción con un cenotafio se queman. Las runas grabadas en una transacción con un cenotafio se consideran no minteables. Los minteos en una " +"transacción con un cenotafio cuentan para el tope del minteo, pero las runas creadas se queman." -#: src/contributing.md:76 +#: src/runes.md:160 msgid "" -"Formulate a hypothesis as to what is causing the problem. Figure out how to " -"test that hypothesis. Perform that tests. If it works, great, you fixed the " -"issue or now you know how to fix the issue. If not, repeat with a new " -"hypothesis." +"Cenotaphs are an upgrade mechanism, allowing runestones to be given new semantics that change how runes are created and transferred, while not misleading unupgraded clients as to " +"the location of those runes, as unupgraded clients will see those runes as having been burned." msgstr "" -"Formula una hipótesis sobre la causa del problema. Define cómo podrías verificar " -"esa hipótesis. Ejecuta las pruebas correspondientes. Si funciona, genial, has " -"solucionado el problema o, al menos, ahora sabes cómo hacerlo. Si no, vuelve a " -"empezar con una nueva hipótesis." +"Los cenotafios actúan como un mecanismo de actualización, permitiendo que las runas adopten nuevas semánticas que modifiquen cómo se crean y transfieren. Esto se logra sin " +"confundir a los clientes desactualizados acerca de la ubicación de las runas, ya que dichos clientes las percibirán como si hubieran sido quemadas." -#: src/contributing.md:81 -msgid "Pay attention to error messages" -msgstr "Presta atención a los mensajes de error" +#: src/runes/specification.md:1 +msgid "Runes Does Not Have a Specification" +msgstr "Las Runas No Tienen una Especificación Formal" -#: src/contributing.md:84 -msgid "Read all error messages and don't tolerate warnings." -msgstr "Lee todos los mensajes de error y no toleres las advertencias." +#: src/runes/specification.md:4 +msgid "The Runes reference implementation, `ord`, is the normative specification of the Runes protocol." +msgstr "`ord` es la implementación de referencia de las Runas y constituye la especificación normativa del protocolo de Runas." -#: src/donate.md:4 +#: src/runes/specification.md:7 msgid "" -"Ordinals is open-source and community funded. The current lead maintainer of " -"`ord` is [raphjaph](https://github.com/raphjaph/). Raph's work on `ord` is " -"entirely funded by donations. If you can, please consider donating!" +"Nothing you read here or elsewhere, aside from the code of `ord`, is a specification. This prose description of the runes protocol is provided as a guide to the behavior of " +"`ord`, and the code of `ord` itself should always be consulted to confirm the correctness of any prose description." msgstr "" -"Ordinals es de código abierto y financiado por la comunidad. El encargado " -"principal de `ord` actualmente es [raphjaph](https://github.com/raphjaph/). " -"El trabajo de Raph en `ord` está financiado íntegramente por donaciones. " -"¡Si puedes, considera hacer una donación!" +"Nada de lo que leas aquí o en cualquier otro lugar, aparte del código de `ord`, constituye una especificación oficial. Esta descripción en prosa del protocolo de Runas se " +"proporciona como una guía sobre el comportamiento de `ord`, y siempre se debe consultar el código de `ord` para confirmar la exactitud de cualquier descripción en prosa." -#: src/donate.md:8 +#: src/runes/specification.md:12 msgid "" -"The donation address for Bitcoin is " -"[bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt](https://mempool.space/address/bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt). " -"The donation address for inscriptions is " -"[bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0](https://mempool.space/address/bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0)." +"If, due to a bug in `ord`, this document diverges from the actual behavior of `ord` and it is impractically disruptive to change `ord`'s behavior, this document will be amended " +"to agree with `ord`'s actual behavior." msgstr "" -"La dirección de donaciones en Bitcoin es " -"[bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt](https://mempool.space/address/bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt). " -"La dirección de donaciones de inscripciones es " -"[bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0](https://mempool.space/address/bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0)." +"Si, debido a un error o bug en `ord`, este documento se desvía del comportamiento real de `ord` y resulta poco práctico modificar el comportamiento de `ord`, este documento se " +"actualizará para reflejar el comportamiento real de `ord`." -#: src/donate.md:11 +#: src/runes/specification.md:16 msgid "" -"Both addresses are in a 2 of 4 multisig wallet with keys held by " -"[raphjaph](https://twitter.com/raphjaph), " -"[erin](https://twitter.com/realizingerin), " -"[rodarmor](https://twitter.com/rodarmor), and " -"[ordinally](https://twitter.com/veryordinally)." +"Users of alternative implementations do so at their own risk, and services wishing to integrate Runes are strongly encouraged to use `ord` itself to make Runes transactions, and " +"to determine the state of runes, mints, and balances." msgstr "" -"Ambas direcciones están en un monedero multisig 2 de 4 con las llaves en manos de " -"[raphjaph](https://twitter.com/raphjaph), " -"[erin](https://twitter.com/realizingerin), " -"[rodarmor](https://twitter.com/rodarmor) y " -"[ordinally](https://twitter.com/veryordinally)." +"Los usuarios que vayan a utilizar implementaciones alternativas lo hacen bajo su propio riesgo. Se recomienda encarecidamente a los servicios que deseen integrar Runas que " +"utilicen `ord` para realizar transacciones de Runas y para determinar el estado de las runas, los minteos y los saldos." -#: src/donate.md:17 -msgid "" -"Donations received will go towards funding maintenance and development of " -"`ord`, as well as hosting costs for [ordinals.com](https://ordinals.com)." -msgstr "" -"Las donaciones recibidas se utilizarán para financiar el mantenimiento y " -"desarrollo de `ord`, así como para cubrir los costos asociados con el alojamiento de [ordinals.com]( https://ordinals.com/)." +#: src/runes/specification.md:23 +msgid "Rune protocol messages are termed \"runestones\"." +msgstr "Los mensajes del protocolo de Runas se denominan \"runestones\"." -#: src/donate.md:20 -msgid "Thank you for donating!" -msgstr "¡Gracias por donar!" +#: src/runes/specification.md:25 +msgid "The Runes protocol activates on block 840,000. Runestones in earlier blocks are ignored." +msgstr "El protocolo de Runas se activa en el bloque 840,000, y las runestones en bloques anteriores se ignoran." -#: src/guides.md:1 -msgid "Ordinal Theory Guides" -msgstr "Guías de la Teoría Ordinal" +#: src/runes/specification.md:28 +msgid "Abstractly, runestones contain the following fields:" +msgstr "En términos abstractos, los runestones contienen los siguientes campos:" -#: src/guides.md:4 -msgid "" -"See the table of contents for a list of guides, including a guide to the " -"explorer, a guide for sat hunters, and a guide to inscriptions." -msgstr "" -"Consulta la tabla de contenido para ver una lista de guías, incluyendo " -"una guía para el explorador, una guía para cazadores de sats y una guía de las inscripciones." +#: src/runes/specification.md:39 +msgid "Runes are created by etchings:" +msgstr "Las Runas se crean mediante grabados (etchings):" -#: src/guides/explorer.md:1 -msgid "Ordinal Explorer" -msgstr "Explorador Ordinal" +#: src/runes/specification.md:52 +msgid "Which may contain mint terms:" +msgstr "Los cuales pueden tener estos términos de minteo:" -#: src/guides/explorer.md:4 -msgid "" -"The `ord` binary includes a block explorer. We host a instance of the block " -"explorer on mainnet at [ordinals.com](https://ordinals.com), and on signet " -"at [signet.ordinals.com](https://signet.ordinals.com)." -msgstr "" -"El binario `ord` incluye un explorador de bloques. Alojamos una instancia " -"del explorador de bloques en la mainnet en [ordinals.com](https://ordinals.com/) " -"y en signet en [signet.ordinals.com](https://signet.ordinals.com/)." +#: src/runes/specification.md:63 src/runes/specification.md:492 +msgid "Runes are transferred by edict:" +msgstr "Las runas se transfieren por medio de edictos (edict):" -#: src/guides/explorer.md:8 -msgid "Running The Explorer" -msgstr "Ejecutando El Explorador" +#: src/runes/specification.md:73 +msgid "Rune IDs are encoded as the block height and transaction index of the transaction in which the rune was etched:" +msgstr "Los IDs de las runas están codificados con la altura del bloque y el índice de transacción de la transacción en la cual la runa fue grabada:" -#: src/guides/explorer.md:9 -msgid "The server can be run locally with:" -msgstr "El servidor puede ser ejecutado localmente utilizando:" +#: src/runes/specification.md:83 +msgid "Rune IDs are represented in text as `BLOCK:TX`." +msgstr "Los ID de las Runas son representados textualmente como `BLOCK:TX`." -#: src/guides/explorer.md:11 -msgid "`ord server`" -msgstr "`ord server`" +#: src/runes/specification.md:85 +msgid "Rune names are encoded as modified base-26 integers:" +msgstr "Los nombres de las runas se codifican como enteros modificados en base 26:" -#: src/guides/explorer.md:13 -msgid "To specify a port add the `--http-port` flag:" -msgstr "Para especificar un puerto agrega la bandera (flag) `--http-port`:" +#: src/runes/specification.md:91 +msgid "Deciphering" +msgstr "Descifrado" -#: src/guides/explorer.md:15 -msgid "`ord server --http-port 8080`" -msgstr "` ord server --http-port 8080`" +#: src/runes/specification.md:93 +msgid "Runestones are deciphered from transactions with the following steps:" +msgstr "Las piedras rúnicas se descifran basándose en las las transacciones con los siguientes pasos:" -#: src/guides/explorer.md:17 -msgid "To test how your inscriptions will look you can run:" -msgstr "Para ver como se verían tus inscripciones puedes ejecutar esto:" +#: src/runes/specification.md:95 +msgid "Find the first transaction output whose script pubkey begins with `OP_RETURN OP_13`." +msgstr "Encuentra la primera salida de transacción cuyo script pubkey comience con `OP_RETURN OP_13`." -#: src/guides/explorer.md:19 -msgid "`ord preview ...`" -msgstr "`ord preview ...`" +#: src/runes/specification.md:98 +msgid "Concatenate all following data pushes into a payload buffer." +msgstr "Concatenar todos los siguientes pushes de datos en un búfer." -#: src/guides/explorer.md:21 -msgid "Search" -msgstr "Búsqueda" +#: src/runes/specification.md:100 +msgid "Decode a sequence 128-bit [LEB128](https://en.wikipedia.org/wiki/LEB128) integers from the payload buffer." +msgstr "Decodificar del búfer la secuencia de enteros de 128 bits [LEB128](https://en.wikipedia.org/wiki/LEB128)." -#: src/guides/explorer.md:24 -msgid "The search box accepts a variety of object representations." -msgstr "El cuadro de búsqueda acepta una variedad de representaciones de objetos." +#: src/runes/specification.md:103 +msgid "Parse the sequence of integers into an untyped message." +msgstr "Analizar y convertir la secuencia de enteros en un mensaje sin tipo (untyped)." -#: src/guides/explorer.md:26 -msgid "Blocks" -msgstr "Bloques" +#: src/runes/specification.md:105 +msgid "Parse the untyped message into a runestone." +msgstr "Analizar y convertir el mensaje sin tipo (untyped) en una piedra rúnica." -#: src/guides/explorer.md:28 -msgid "Blocks can be searched by hash, for example, the genesis block:" -msgstr "Los bloques pueden buscarse por hash, por ejemplo, este es el bloque génesis:" +#: src/runes/specification.md:107 +msgid "Deciphering may produce a malformed runestone, termed a [cenotaph](https://en.wikipedia.org/wiki/Cenotaph)." +msgstr "El descifrado puede producir una piedra rúnica mal formada, denominada [cenotafio](https://es.wikipedia.org/wiki/Cenotafio)." -#: src/guides/explorer.md:30 -msgid "" -"[000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f](https://ordinals.com/search/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f)" +#: src/runes/specification.md:110 +msgid "Locating the Runestone Output" +msgstr "Localizando la Salida de la Piedra Rúnica" + +#: src/runes/specification.md:112 +msgid "Outputs are searched for the first script pubkey that beings with `OP_RETURN OP_13`. If deciphering fails, later matching outputs are not considered." msgstr "" -"[000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f](https://ordinals.com/search/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f)" +"Se examinan las salidas para identificar el primer script pubkey que comienza con `OP_RETURN OP_13`. Si el descifrado no tiene éxito, no se tomarán en cuenta las salidas " +"coincidentes siguientes." -#: src/guides/explorer.md:32 -msgid "Transactions" -msgstr "Transacciones" +#: src/runes/specification.md:115 +msgid "Assembling the Payload Buffer" +msgstr "Creación del Búfer" -#: src/guides/explorer.md:34 -msgid "" -"Transactions can be searched by hash, for example, the genesis block " -"coinbase transaction:" -msgstr "" -"Las transacciones pueden buscarse por su hash, por ejemplo, esta es la " -"transacción coinbase del bloque génesis:" +#: src/runes/specification.md:117 +msgid "The payload buffer is assembled by concatenating data pushes, after `OP_13`, in the matching script pubkey." +msgstr "El búfer se ensambla concatenando los pushes de datos que vienen después de `OP_13`, en el script pubkey correspondiente." -#: src/guides/explorer.md:37 +#: src/runes/specification.md:120 msgid "" -"[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b)" +"Data pushes are opcodes 0 through 78 inclusive. If a non-data push opcode is encountered, i.e., any opcode equal to or greater than opcode 79, the deciphered runestone is a " +"cenotaph with no etching, mint, or edicts." msgstr "" -"[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b)" +"Los pushes de datos abarcan los opcodes del 0 al 78, el 78 incluido. Si se encuentra un opcode distinto, es decir, cualquier opcode igual o superior al 79, la piedra rúnica " +"descifrada resultará ser un cenotafio sin grabado, minteo ni edictos." -#: src/guides/explorer.md:39 -msgid "Outputs" -msgstr "Salidas" +#: src/runes/specification.md:124 +msgid "Decoding the Integer Sequence" +msgstr "Decodificación la Secuencia de Enteros" -#: src/guides/explorer.md:41 +#: src/runes/specification.md:126 +msgid "A sequence of 128-bit integers are decoded from the payload as LEB128 varints." +msgstr "Del búfer se extrae y decodifica una secuencia de enteros de 128 bits como varints LEB128." + +#: src/runes/specification.md:128 +msgid "LEB128 varints are encoded as sequence of bytes, each of which has the most-significant bit set, except for the last." +msgstr "Los varints LEB128 se codifican como una serie de bytes, cada uno con el bit más significativo establecido, excepto el último." + +#: src/runes/specification.md:131 msgid "" -"Transaction outputs can searched by outpoint, for example, the only output " -"of the genesis block coinbase transaction:" +"If a LEB128 varint contains more than 18 bytes, would overflow a u128, or is truncated, meaning that the end of the payload buffer is reached before encountering a byte with the " +"continuation bit not set, the decoded runestone is a cenotaph with no etching, mint, or edicts." msgstr "" -"Las salidas de las transacciones se pueden buscar por outpoint, por ejemplo, " -"esta la única salida de la transacción coinbase del bloque génesis:" +"La piedra rúnica decodificada será un cenotafio sin grabado, minteo ni edictos si un varint LEB128 contiene más de 18 bytes, desborda (overflow) un u128, o está truncado. Esto " +"significaría que se alcanza el final del búfer de carga útil antes de encontrar un byte con el bit de continuación que no se ha establecido." + +#: src/runes/specification.md:136 +msgid "Parsing the Message" +msgstr "Análisis y Conversión del Mensaje" + +#: src/runes/specification.md:138 +msgid "The integer sequence is parsed into an untyped message:" +msgstr "La secuencia de enteros se analiza y se convierte en un mensaje sin tipo (untyped):" + +#: src/runes/specification.md:147 +msgid "The integers are interpreted as a sequence of tag/value pairs, with duplicate tags appending their value to the field value." +msgstr "Los enteros se interpretan como una secuencia de pares de etiqueta/valor (tag/value), en donde las etiquetas duplicadas añaden su valor al valor del campo." -#: src/guides/explorer.md:44 +#: src/runes/specification.md:150 msgid "" -"[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0)" -msgstr "[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0)" +"If a tag with value zero is encountered, all following integers are interpreted as a series of four-integer edicts, each consisting of a rune ID block height, rune ID transaction " +"index, amount, and output." +msgstr "" +"Si se encuentra una etiqueta con valor cero, todos los enteros siguientes se interpretan como una serie de edictos de cuatro enteros, cada uno compuesto por la altura de bloque " +"de ID de la runa, un índice de transacción de ID de la runa, la cantidad y salida." -#: src/guides/explorer.md:46 -msgid "Sats" -msgstr "Sats" +#: src/runes/specification.md:162 +msgid "Rune ID block heights and transaction indices in edicts are delta encoded." +msgstr "Las alturas de bloque de ID de runa y los índices de transacción en los edictos son en codificación delta." -#: src/guides/explorer.md:48 +#: src/runes/specification.md:164 msgid "" -"Sats can be searched by integer, their position within the entire bitcoin " -"supply:" +"Edict rune ID decoding starts with a base block height and transaction index of zero. When decoding each rune ID, first the encoded block height delta is added to the base block " +"height. If the block height delta is zero, the next integer is a transaction index delta. If the block height delta is greater than zero, the next integer is instead an absolute " +"transaction index." msgstr "" -"Los sats se pueden buscar por número entero (integer), que representa su posición dentro del suministro total de bitcoin:" +"La decodificación del edicto de ID de runa comienza con una altura de bloque base y un índice de transacción inicial de cero. Al decodificar cada ID de runa, se añade primero el " +"delta de la altura del bloque codificado a la altura del bloque base. Si el delta de la altura del bloque es cero, el siguiente entero es un delta del índice de transacción. Si " +"el delta de la altura del bloque es mayor a cero, el siguiente entero es un índice de transacción absoluto." -#: src/guides/explorer.md:51 -msgid "[2099994106992659](https://ordinals.com/search/2099994106992659)" -msgstr "[2099994106992659](https://ordinals.com/search/2099994106992659)" +#: src/runes/specification.md:170 +msgid "This implies that edicts must first be sorted by rune ID before being encoded in a runestone." +msgstr "Esto significa que los edictos deben ordenarse primero por ID de runa antes de ser codificados en una piedra rúnica." -#: src/guides/explorer.md:53 -msgid "By decimal, their block and offset within that block:" -msgstr "Por decimal, su bloque y desplazamiento dentro de ese bloque:" +#: src/runes/specification.md:173 +msgid "For example, to encode the following edicts:" +msgstr "Por ejemplo, para codificar los siguientes edictos:" -#: src/guides/explorer.md:55 -msgid "[481824.0](https://ordinals.com/search/481824.0)" -msgstr "[481824.0](https://ordinals.com/search/481824.0)" +#: src/runes/specification.md:175 src/runes/specification.md:184 +msgid "block" +msgstr "bloque" -#: src/guides/explorer.md:57 -msgid "" -"By degree, their cycle, blocks since the last halving, blocks since the last " -"difficulty adjustment, and offset within their block:" -msgstr "Por grado sexagesimal, su ciclo, bloques desde el ultimo halving, bloques desde el último ajuste de dificultad y desplazamiento dentro de su bloque:" +#: src/runes/specification.md:175 src/runes/specification.md:184 +msgid "TX" +msgstr "TX" -#: src/guides/explorer.md:60 -msgid "[1°0′0″0‴](https://ordinals.com/search/1°0′0″0‴)" -msgstr "[1°0′0″0‴](https://ordinals.com/search/1%C2%B00%E2%80%B20%E2%80%B30%E2%80%B4)" +#: src/runes/specification.md:175 src/runes/specification.md:184 src/runes/specification.md:193 +msgid "amount" +msgstr "cantidad" -#: src/guides/explorer.md:62 -msgid "" -"By name, their base 26 representation using the letters \"a\" through \"z\":" -msgstr "" -"Por nombre, utilizando su representación en base 26 con letras de la \"a\" hasta la \"z\":" +#: src/runes/specification.md:175 src/runes/specification.md:184 src/runes/specification.md:193 +msgid "output" +msgstr "salida" -#: src/guides/explorer.md:64 -msgid "[ahistorical](https://ordinals.com/search/ahistorical)" -msgstr "[ahistorical](https://ordinals.com/search/ahistorical)" +#: src/runes/specification.md:177 src/runes/specification.md:179 src/runes/specification.md:180 src/runes/specification.md:186 src/runes/specification.md:187 +#: src/runes/specification.md:188 src/runes/specification.md:195 src/runes/specification.md:196 +msgid "10" +msgstr "10" -#: src/guides/explorer.md:66 -msgid "" -"Or by percentile, the percentage of bitcoin's supply that has been or will " -"have been issued when they are mined:" -msgstr "" -"O por percentil, el cual representa el porcentaje del suministro total de bitcoin que ha sido o será emitido una vez sean minados:" +#: src/runes/specification.md:177 src/runes/specification.md:180 src/runes/specification.md:186 src/runes/specification.md:187 src/runes/specification.md:195 +msgid "5" +msgstr "5" -#: src/guides/explorer.md:69 -msgid "[100%](https://ordinals.com/search/100%)" -msgstr "[100%](https://ordinals.com/search/100%)" +#: src/runes/specification.md:178 src/runes/specification.md:189 src/runes/specification.md:430 +msgid "50" +msgstr "50" -#: src/guides/inscriptions.md:1 -msgid "Ordinal Inscription Guide" -msgstr "Guía de inscripciones Ordinal" +#: src/runes/specification.md:178 src/runes/specification.md:189 src/runes/specification.md:198 src/runes/specification.md:426 +msgid "25" +msgstr "25" -#: src/guides/inscriptions.md:4 -msgid "" -"Individual sats can be inscribed with arbitrary content, creating " -"Bitcoin-native digital artifacts that can be held in a Bitcoin wallet and " -"transferred using Bitcoin transactions. Inscriptions are as durable, " -"immutable, secure, and decentralized as Bitcoin itself." -msgstr "" -"Cada sat puede ser inscrito con contenido arbitrario, permitiendo la creación " -"de artefactos digitales únicos nativos en Bitcoin. Estos artefactos digitales " -"pueden almacenarse en monederos de Bitcoin y transferirse mediante transacciones " -"de Bitcoin. Las inscripciones son tan duraderas, inmutables, seguras y " -"descentralizadas como el propio Bitcoin." +#: src/runes/specification.md:179 src/runes/specification.md:188 +msgid "7" +msgstr "7" -#: src/guides/inscriptions.md:9 -msgid "" -"Working with inscriptions requires a Bitcoin full node, to give you a view " -"of the current state of the Bitcoin blockchain, and a wallet that can create " -"inscriptions and perform sat control when constructing transactions to send " -"inscriptions to another wallet." -msgstr "" -"Trabajar con inscripciones requiere de un nodo de Bitcoin para darte una visión " -"del estado actual de la blockchain de Bitcoin, además de un monedero capaz de " -"crear inscripciones y realizar control de sats a la hora de construir transacciones " -"para enviar inscripciones a otro monedero." +#: src/runes/specification.md:179 src/runes/specification.md:188 src/runes/specification.md:197 +msgid "8" +msgstr "8" + +#: src/runes/specification.md:182 +msgid "They are first sorted by block height and transaction index:" +msgstr "Primero se ordenan por altura de bloque e índice de transacción:" + +#: src/runes/specification.md:191 +msgid "And then delta encoded as:" +msgstr "Y luego el delta codificado como:" + +#: src/runes/specification.md:193 +msgid "block delta" +msgstr "delta del bloque" + +#: src/runes/specification.md:193 +msgid "TX delta" +msgstr "delta de TX" -#: src/guides/inscriptions.md:14 +#: src/runes/specification.md:198 +msgid "40" +msgstr "40" + +#: src/runes/specification.md:200 msgid "" -"Bitcoin Core provides both a Bitcoin full node and wallet. However, the " -"Bitcoin Core wallet cannot create inscriptions and does not perform sat " -"control." +"If an edict output is greater than the number of outputs of the transaction, an edict rune ID is encountered with block zero and nonzero transaction index, or a field is " +"truncated, meaning a tag is encountered without a value, the decoded runestone is a cenotaph." msgstr "" -"Bitcoin Core proporciona un nodo completo de Bitcoin y un monedero. " -"Sin embargo, el monedero de Bitcoin Core no puede crear inscripciones y no realiza control de sats." +"La piedra rúnica decodificada es un cenotafio si la salida de un edicto supera el número de salidas de la transacción, si se encuentra un ID de runa de edicto con bloque cero y " +"un índice de transacción distinto de cero, o si un campo está truncado lo cual significa que una etiqueta se encuentra sin valor." -#: src/guides/inscriptions.md:17 -msgid "" -"This requires [`ord`](https://github.com/ordinals/ord), the ordinal utility. " -"`ord` doesn't implement its own wallet, so `ord wallet` subcommands interact " -"with Bitcoin Core wallets." +#: src/runes/specification.md:205 +msgid "Note that if a cenotaph is produced here, the cenotaph is not empty, meaning that it contains the fields and edicts, which may include an etching and mint." msgstr "" -"Para esto se requiere [`ord`](https://github.com/ordinals/ord), " -"la utilidad de ordinals. `ord` no implementa su propio monedero, por lo " -"que los subcomandos del `monedero ord` interactúan con los monederos de Bitcoin Core." +"Cabe señalar que si se produce un cenotafio en este caso, el cenotafio no estará vacío, lo que significa que tiene los campos y edictos, que pueden incluir un grabado y un minteo." -#: src/guides/inscriptions.md:21 -msgid "This guide covers:" -msgstr "Esta guía cubre:" +#: src/runes/specification.md:208 +msgid "Parsing the Runestone" +msgstr "Análisis y Conversión de la Piedra Rúnica (Runestone)" -#: src/guides/inscriptions.md:23 -#: src/guides/inscriptions.md:39 -msgid "Installing Bitcoin Core" -msgstr "La instalación de Bitcoin Core" +#: src/runes/specification.md:210 +msgid "The runestone:" +msgstr "La piedra rúnica:" -#: src/guides/inscriptions.md:24 -msgid "Syncing the Bitcoin blockchain" -msgstr "Sincronización de la blockchain de Bitcoin" +#: src/runes/specification.md:221 +msgid "Is parsed from the unsigned message using the following tags:" +msgstr "Se analiza a partir del mensaje sin firmar utilizando las siguientes etiquetas:" -#: src/guides/inscriptions.md:25 -msgid "Creating a Bitcoin Core wallet" -msgstr "Creación de un monedero de Bitcoin Core" +#: src/runes/specification.md:246 +msgid "Note that tags are grouped by parity, i.e., whether they are even or odd. Unrecognized odd tags are ignored. Unrecognized even tags produce a cenotaph." +msgstr "" +"Ten en cuenta que las etiquetas se agrupan por paridad, es decir, si son pares o impares.\n" +"Las etiquetas impares que no son reconocidas se ignoran. Las etiquetas pares que no son reconocidas producen un cenotafio." -#: src/guides/inscriptions.md:26 -msgid "Using `ord wallet receive` to receive sats" -msgstr "Utilizando `ord wallet receive` para recibir sats" +#: src/runes/specification.md:249 +msgid "All unused tags are reserved for use by the protocol, may be assigned at any time, and must not be used." +msgstr "Todas las etiquetas que no han sido utilizadas están reservadas para uso del protocolo, pueden asignarse en cualquier momento y no deben ser usadas." -#: src/guides/inscriptions.md:27 -msgid "Creating inscriptions with `ord wallet inscribe`" -msgstr "Creación de inscripciones usando `ord wallet inscribe`" +#: src/runes/specification.md:252 +msgid "Body" +msgstr "Cuerpo (Body)" -#: src/guides/inscriptions.md:28 -msgid "Sending inscriptions with `ord wallet send`" -msgstr "Enviar inscripciones usando `ord wallet send`" +#: src/runes/specification.md:254 +msgid "The `Body` tag marks the end of the runestone's fields, causing all following integers to be interpreted as edicts." +msgstr "La etiqueta `Body` indica el final de los campos de la piedra rúnica, causando que todos los enteros posteriores se interpreten como edictos." -#: src/guides/inscriptions.md:29 -msgid "Receiving inscriptions with `ord wallet receive`" -msgstr "Recibir inscripciones con `ord wallet receive`" +#: src/runes/specification.md:257 +msgid "Flags" +msgstr "Banderas (Flag)" -#: src/guides/inscriptions.md:31 -msgid "Getting Help" -msgstr "Obtener Ayuda" +#: src/runes/specification.md:259 +msgid "The `Flag` field contains a bitmap of flags, whose position is `1 << FLAG_VALUE`:" +msgstr "El campo `Flag` contiene un mapa de bits de banderas, cuya posición es `1 << FLAG_VALUE`:" -#: src/guides/inscriptions.md:34 +#: src/runes/specification.md:271 +msgid "The `Etching` flag marks this transaction as containing an etching." +msgstr "La bandera `Etching` indica que esta transacción contiene un grabado." + +#: src/runes/specification.md:273 +msgid "The `Terms` flag marks this transaction's etching as having open mint terms." +msgstr "La bandera `Terms` indica que el grabado de esta transacción tiene términos de minteo abiertos." + +#: src/runes/specification.md:275 msgid "" -"If you get stuck, try asking for help on the [Ordinals Discord " -"Server](https://discord.com/invite/87cjuz4FYg), or checking GitHub for " -"relevant [issues](https://github.com/ordinals/ord/issues) and " -"[discussions](https://github.com/ordinals/ord/discussions)." +"The `Turbo` flag marks this transaction's etching as opting into future protocol changes. These protocol changes may increase light client validation costs, or just be highly " +"degenerate." msgstr "" -"Si te atascas, intenta pedir ayuda en el " -"[Servidor de Discord de Ordinals](https://discord.com/invite/87cjuz4FYg), " -"o consulta el GitHub por [problemas](https://github.com/ordinals/ord/issues) " -"y [discusiones](https://github.com/ordinals/ord/discussions) relevantes." +"La bandera `Turbo` indica que el grabado de esta transacción opta por futuros cambios en el protocolo. Estos cambios pueden aumentar los costos de validación para clientes " +"ligeros o ser altamente degenerados." -#: src/guides/inscriptions.md:42 -msgid "" -"Bitcoin Core is available from [bitcoincore.org](https://bitcoincore.org/) " -"on the [download page](https://bitcoincore.org/en/download/)." -msgstr "Bitcoin Core está disponible en la " -"[página de descargas](https://bitcoincore.org/en/download/) de " -"[bitcoincore.org](https://bitcoincore.org/)." +#: src/runes/specification.md:279 +msgid "The `Cenotaph` flag is unrecognized." +msgstr "La bandera `Cenotaph` no es reconocida." -#: src/guides/inscriptions.md:45 -msgid "Making inscriptions requires Bitcoin Core 24 or newer." -msgstr "Para crear inscripciones es necesario tener la versión 24 de Bitcoin Core o una más reciente." +#: src/runes/specification.md:281 +msgid "If the value of the flags field after removing recognized flags is nonzero, the runestone is a cenotaph." +msgstr "Si después de eliminar las banderas reconocidas, el valor del campo de banderas es distinto de cero, la piedra rúnica se considera un cenotafio." -#: src/guides/inscriptions.md:47 -msgid "" -"This guide does not cover installing Bitcoin Core in detail. Once Bitcoin " -"Core is installed, you should be able to run `bitcoind -version` " -"successfully from the command line." +#: src/runes/specification.md:284 +msgid "Rune" +msgstr "Runa" + +#: src/runes/specification.md:286 +msgid "The `Rune` field contains the name of the rune being etched. If the `Etching` flag is set but the `Rune` field is omitted, a reserved rune name is allocated." msgstr "" -"Esta guía no cubre los detalles de la instalación de Bitcoin Core. " -"Una vez que se ha instalado Bitcoin Core, deberías ser capaz de " -"ejecutar el comando `bitcoind -version` con éxito desde la línea de comandos." +"El campo `Rune` especifica el nombre de la runa que se está grabando. Si la bandera `Etching` está activa pero el campo `Rune` se omite, se asigna un nombre de runa reservado." -#: src/guides/inscriptions.md:51 -msgid "Configuring Bitcoin Core" -msgstr "Configuración de Bitcoin Core" +#: src/runes/specification.md:292 +msgid "The `Premine` field contains the amount of premined runes." +msgstr "El campo `Premine` especifica la cantidad de runas preminadas." + +#: src/runes/specification.md:296 +msgid "The `Cap` field contains the allowed number of mints." +msgstr "El campo `Cap` especifica el número de minteos permitidos." -#: src/guides/inscriptions.md:54 -msgid "`ord` requires Bitcoin Core's transaction index." -msgstr "`ord` requiere el índice de transacciones de Bitcoin Core." +#: src/runes/specification.md:300 +msgid "The `Amount` field contains the amount of runes each mint transaction receives." +msgstr "El campo `Amount` especifica la cantidad de runas que recibe cada transacción de minteo." -#: src/guides/inscriptions.md:56 +#: src/runes/specification.md:302 +msgid "HeightStart and HeightEnd" +msgstr "HeightStart y HeightEnd" + +#: src/runes/specification.md:304 msgid "" -"To configure your Bitcoin Core node to maintain a transaction index, add the " -"following to your `bitcoin.conf`:" +"The `HeightStart` and `HeightEnd` fields contain the mint's starting and ending absolute block heights, respectively. The mint is open starting in the block with height " +"`HeightStart`, and closes in the block with height `HeightEnd`." msgstr "" -"Debes configurar tu nodo de Bitcoin Core para que mantenga un índice de transacciones. Agrega lo siguiente a tu `bitcoin.conf`:" +"Los campos `HeightStart` y `HeightEnd` especifican las alturas de bloque absolutas de inicio y fin del minteo. El minteo comienza en el bloque con altura `HeightStart` y finaliza " +"en el bloque con altura `HeightEnd`." + +#: src/runes/specification.md:308 +msgid "OffsetStart and OffsetEnd" +msgstr "OffsetStart y OffsetEnd" -#: src/guides/inscriptions.md:59 -#: src/guides/sat-hunting.md:30 +#: src/runes/specification.md:310 msgid "" -"```\n" -"txindex=1\n" -"```" +"The `OffsetStart` and `OffsetEnd` fields contain the mint's starting and ending block heights, relative to the block in which the etching is mined. The mint is open starting in " +"the block with height `OffsetStart` + `ETCHING_HEIGHT`, and closes in the block with height `OffsetEnd` + `ETCHING_HEIGHT`." msgstr "" -"```\n" -"txindex=1\n" -"```" +"Los campos `OffsetStart` y `OffsetEnd` especifican las alturas de bloque de inicio y fin del minteo, relativas al bloque en el que se extrae el grabado. El minteo comienza en el " +"bloque con altura `OffsetStart + ETCHING_HEIGHT` y termina en el bloque con altura `OffsetEnd` + `ETCHING_HEIGHT`." -#: src/guides/inscriptions.md:63 -msgid "Or, run `bitcoind` with `-txindex`:" -msgstr "O, ejecuta `bitcoind` con `-txindex`:" +#: src/runes/specification.md:315 +msgid "Mint" +msgstr "Minteo" + +#: src/runes/specification.md:317 +msgid "The `Mint` field contains the Rune ID of the rune to be minted in this transaction." +msgstr "El campo `Mint` especifica el ID de la runa que se minteara en dicha transacción." -#: src/guides/inscriptions.md:65 -#: src/guides/inscriptions.md:74 +#: src/runes/specification.md:322 msgid "" -"```\n" -"bitcoind -txindex\n" -"```" +"The `Pointer` field contains the index of the output to which runes unallocated by edicts should be transferred. If the `Pointer` field is absent, unallocated runes are " +"transferred to the first non-`OP_RETURN` output." msgstr "" -"```\n" -"bitcoind -txindex\n" -"```" +"El campo `Pointer` indica el índice de la salida a la que deben transferirse las runas no asignadas por los edictos. Si el campo `Pointer` no está presente, las runas no " +"asignadas se transfieren a la primera salida que no sea `OP_RETURN`." -#: src/guides/inscriptions.md:69 -msgid "Syncing the Bitcoin Blockchain" -msgstr "Sincronizando la Blockchain de Bitcoin" +#: src/runes/specification.md:326 +msgid "Cenotaph" +msgstr "Cenotafio" -#: src/guides/inscriptions.md:72 -msgid "To sync the chain, run:" -msgstr "Para sincronizar la blockchain o cadena de bloques de bitcoin, ejecuta:" +#: src/runes/specification.md:328 +msgid "The `Cenotaph` field is unrecognized." +msgstr "El campo `Cenotaph` no es reconocido." -#: src/guides/inscriptions.md:78 -msgid "…and leave it running until `getblockcount`:" -msgstr "…y déjalo ejecutar hasta que `getblockcount`:" +#: src/runes/specification.md:332 +msgid "The `Divisibility` field, raised to the power of ten, is the number of subunits in a super unit of runes." +msgstr "El campo `Divisibility`, elevado a la potencia de diez, determina el número de subunidades en una unidad de runas." -#: src/guides/inscriptions.md:80 -msgid "" -"```\n" -"bitcoin-cli getblockcount\n" -"```" -msgstr "" -"```\n" -"bitcoin-cli getblockcount\n" -"```" +#: src/runes/specification.md:335 +msgid "For example, the amount `1234` of different runes with divisibility 0 through 3 is displayed as follows:" +msgstr "Por ejemplo, aca se observa la cantidad `1234` de diferentes runas con divisibilidad de 0 a 3:" -#: src/guides/inscriptions.md:84 -msgid "" -"agrees with the block count on a block explorer like [the mempool.space " -"block explorer](https://mempool.space/). `ord` interacts with `bitcoind`, so " -"you should leave `bitcoind` running in the background when you're using " -"`ord`." -msgstr "" -"coincida con el recuento de bloques en un explorador de bloques como " -"[el explorador de bloques mempool.space](https://mempool.space/). `ord` " -"interactúa con `bitcoind`, así que debes dejar `bitcoind` ejecutándose en " -"segundo plano mientras estés usando `ord`." +#: src/runes/specification.md:338 src/runes/specification.md:356 +msgid "Display" +msgstr "Aparece" -#: src/guides/inscriptions.md:88 -msgid "Installing `ord`" -msgstr "Instalación de ord" +#: src/runes/specification.md:340 +msgid "1234" +msgstr "1234" -#: src/guides/inscriptions.md:91 -msgid "" -"The `ord` utility is written in Rust and can be built from " -"[source](https://github.com/ordinals/ord). Pre-built binaries are available " -"on the [releases page](https://github.com/ordinals/ord/releases)." -msgstr "" -"La utilidad `ord` está escrita en Rust y puede ser construida desde el " -"[código fuente](https://github.com/ordinals/ord). Los binarios preconstruidos están disponibles en la página de [lanzamientos](https://github.com/ordinals/ord/releases)." +#: src/runes/specification.md:341 +msgid "123.4" +msgstr "123.4" -#: src/guides/inscriptions.md:95 -msgid "You can install the latest pre-built binary from the command line with:" -msgstr "Puedes instalar el último binario preconstruido desde la línea de comandos usando:" +#: src/runes/specification.md:342 +msgid "12.34" +msgstr "12.34" -#: src/guides/inscriptions.md:97 -msgid "" -"```sh\n" -"curl --proto '=https' --tlsv1.2 -fsLS https://ordinals.com/install.sh | bash " -"-s\n" -"```" -msgstr "" -"```sh\n" -"curl --proto '=https' --tlsv1.2 -fsLS https://ordinals.com/install.sh | bash " -"-s\n" -"```" +#: src/runes/specification.md:343 +msgid "1.234" +msgstr "1.234" -#: src/guides/inscriptions.md:101 -msgid "Once `ord` is installed, you should be able to run:" -msgstr "Una vez que ord esté instalado, deberías poder de ejecutar:" +#: src/runes/specification.md:345 src/runes/specification.md:356 +msgid "Spacers" +msgstr "Separadores" + +#: src/runes/specification.md:347 +msgid "The `Spacers` field is a bitfield of `•` spacers that should be displayed between the letters of the rune's name." +msgstr "El campo `Spacers` es un mapa de bits de separadores `•` que deben mostrarse entre las letras del nombre de una runa." -#: src/guides/inscriptions.md:103 +#: src/runes/specification.md:350 msgid "" -"```\n" -"ord --version\n" -"```" +"The Nth field of the bitfield, starting from the least significant, determines whether or not a spacer should be displayed between the Nth and N+1th character, starting from the " +"left of the rune's name." msgstr "" -"```\n" -"ord --version\n" -"```" +"El campo N del mapa de bits, comenzando desde el menos significativo, determina si debe mostrarse un separador entre los caracteres N y N+1, comenzando desde la izquierda del " +"nombre de la runa." -#: src/guides/inscriptions.md:107 -msgid "Which prints out `ord`'s version number." -msgstr "El cual muestra el número de versión de `ord`." +#: src/runes/specification.md:354 +msgid "For example, the rune name `AAAA` rendered with different spacers:" +msgstr "Por ejemplo, el nombre de la runa `AAAA` representado con diferentes separadores:" -#: src/guides/inscriptions.md:109 -msgid "Creating a Bitcoin Core Wallet" -msgstr "Creación de un monedero de Bitcoin Core" +#: src/runes/specification.md:358 +msgid "0b1" +msgstr "0b1" -#: src/guides/inscriptions.md:112 -msgid "" -"`ord` uses Bitcoin Core to manage private keys, sign transactions, and " -"broadcast transactions to the Bitcoin network." -msgstr "" -"`ord` utiliza Bitcoin Core para gestionar claves privadas, firmar transacciones y transmitir transacciones a la red Bitcoin." +#: src/runes/specification.md:358 +msgid "A•AAA" +msgstr "A•AAA" -#: src/guides/inscriptions.md:115 -msgid "To create a Bitcoin Core wallet named `ord` for use with `ord`, run:" -msgstr "Para crear un monedero de Bitcoin Core llamado `ord` que se utilizara con `ord`, ejecuta:" +#: src/runes/specification.md:359 +msgid "0b11" +msgstr "0b11" -#: src/guides/inscriptions.md:117 -msgid "" -"```\n" -"ord wallet create\n" -"```" -msgstr "" -"```\n" -"ord wallet create\n" -"```" +#: src/runes/specification.md:359 +msgid "A•A•AA" +msgstr "A•A•AA" -#: src/guides/inscriptions.md:121 -msgid "Receiving Sats" -msgstr "Recibir Sats" +#: src/runes/specification.md:360 +msgid "0b10" +msgstr "0b10" -#: src/guides/inscriptions.md:124 -msgid "" -"Inscriptions are made on individual sats, using normal Bitcoin transactions " -"that pay fees in sats, so your wallet will need some sats." -msgstr "Las inscripciones se crean en sats individuales, a través del uso de transacciones estándar de Bitcoin que pagan comisiones en sats, razón por lo cual tu monedero necesitará tener algunos sats." +#: src/runes/specification.md:360 +msgid "AA•AA" +msgstr "AA•AA" -#: src/guides/inscriptions.md:127 -msgid "Get a new address from your `ord` wallet by running:" -msgstr "Obtén una nueva dirección de tu monedero ord ejecutando:" +#: src/runes/specification.md:361 +msgid "0b111" +msgstr "0b111" + +#: src/runes/specification.md:361 +msgid "A•A•A•A" +msgstr "A•A•A•A" + +#: src/runes/specification.md:363 +msgid "Trailing spacers are ignored." +msgstr "Los separadores al final del nombre son ignorados." -#: src/guides/inscriptions.md:129 -#: src/guides/inscriptions.md:201 -#: src/guides/inscriptions.md:229 +#: src/runes/specification.md:367 msgid "" -"```\n" -"ord wallet receive\n" -"```" +"The `Symbol` field is the Unicode codepoint of the Rune's currency symbol, which should be displayed after amounts of that rune. If a rune does not have a currency symbol, the " +"generic currency character `¤` should be used." msgstr "" -"```\n" -"ord wallet receive\n" -"```" +"El campo `Symbol` representa el punto de código Unicode del símbolo de la runa, el cual debe aparecer después de las cantidades de esa runa. Si una runa no tiene un símbolo " +"específico, se debe utilizar el carácter de moneda genérico `¤`." -#: src/guides/inscriptions.md:133 -msgid "And send it some funds." -msgstr "Y envíale algunos fondos." +#: src/runes/specification.md:371 +msgid "For example, if the `Symbol` is `#` and the divisibility is 2, the amount of `1234` units should be displayed as `12.34 #`." +msgstr "Por ejemplo, si el `Symbol` es `#` y la divisibilidad es 2, la cantidad de `1234` unidades debe aparecer como `12.34 #`." -#: src/guides/inscriptions.md:135 -msgid "You can see pending transactions with:" -msgstr "Puedes ver las transacciones pendientes con:" +#: src/runes/specification.md:374 +msgid "Nop" +msgstr "Nop" -#: src/guides/inscriptions.md:137 -#: src/guides/inscriptions.md:213 -#: src/guides/inscriptions.md:240 -msgid "" -"```\n" -"ord wallet transactions\n" -"```" -msgstr "" -"```\n" -"ord wallet transactions\n" -"```" +#: src/runes/specification.md:376 +msgid "The `Nop` field is unrecognized." +msgstr "El campo `Nop` no es reconocido." -#: src/guides/inscriptions.md:141 -msgid "" -"Once the transaction confirms, you should be able to see the transactions " -"outputs with `ord wallet outputs`." -msgstr "" -"Una vez que la transacción se confirme, deberías poder ver las salidas de la transacción con `ord wallet outputs`." +#: src/runes/specification.md:380 +msgid "Cenotaphs have the following effects:" +msgstr "Los cenotafios tienen los siguientes efectos:" -#: src/guides/inscriptions.md:144 -msgid "Creating Inscription Content" -msgstr "Creación de Contenido para las Inscripciones" +#: src/runes/specification.md:382 +msgid "All runes input to a transaction containing a cenotaph are burned." +msgstr "Todas las runas ingresadas a una transacción que contiene un cenotafio se queman." -#: src/guides/inscriptions.md:147 -msgid "" -"Sats can be inscribed with any kind of content, but the `ord` wallet only " -"supports content types that can be displayed by the `ord` block explorer." -msgstr "" -"Los sats pueden ser inscritos con cualquier tipo de contenido, pero el monedero `ord` solo admite tipos de contenido que pueden ser mostrados por el explorador de bloques de `ord`." +#: src/runes/specification.md:384 +msgid "If the runestone that produced the cenotaph contained an etching, the etched rune has supply zero and is unmintable." +msgstr "Si la piedra rúnica que produjo el cenotafio contenía un grabado, la runa grabada tiene un suministro de cero y no se puede mintear." -#: src/guides/inscriptions.md:150 -msgid "" -"Additionally, inscriptions are included in transactions, so the larger the " -"content, the higher the fee that the inscription transaction must pay." -msgstr "" -"Además, las inscripciones se incluyen en las transacciones, debido a esto, en cuanto más grande sea el contenido, mayor será la comisión que debe pagar por la transacción de la inscripción." +#: src/runes/specification.md:387 +msgid "If the runestone that produced the cenotaph is a mint, the mint counts against the mint cap and the minted runes are burned." +msgstr "Si la piedra rúnica que produjo el cenotafio es un minteo, esta se contabiliza contra el límite de minteos y las runas minteadas se queman." -#: src/guides/inscriptions.md:153 +#: src/runes/specification.md:390 msgid "" -"Inscription content is included in transaction witnesses, which receive the " -"witness discount. To calculate the approximate fee that an inscribe " -"transaction will pay, divide the content size by four and multiply by the " -"fee rate." +"Cenotaphs may be created if a runestone contains an unrecognized even tag, an unrecognized flag, an edict with an output number greater than the number of inputs, a rune ID with " +"block zero and nonzero transaction index, a malformed varint, a non-datapush instruction in the runestone output script pubkey, a tag without a following value, or trailing " +"integers not part of an edict." msgstr "" -"El contenido de inscripción se incluye en el testigo de la transacción, los " -"cuales reciben el descuento de testigo. Para calcular un aproximado de la comisión " -"que pagará la transacción de una inscripción, divide el tamaño del contenido por " -"cuatro y multiplica por la tasa de comisión." +"Los cenotafios pueden generarse si una piedra rúnica contiene una etiqueta par no reconocida, una bandera no reconocida, un edicto con un número de salida mayor al número de " +"entradas, un ID de runa con bloque cero y un índice de transacción distinto a cero, un varint malformado, una instrucción que no es push de datos en el script pubkey de la salida " +"de la piedra rúnica, una etiqueta sin valor posterior o enteros al final que no formen parte de un edicto." -#: src/guides/inscriptions.md:157 -msgid "" -"Inscription transactions must be less than 400,000 weight units, or they " -"will not be relayed by Bitcoin Core. One byte of inscription content costs " -"one weight unit. Since an inscription transaction includes not just the " -"inscription content, limit inscription content to less than 400,000 weight " -"units. 390,000 weight units should be safe." -msgstr "" -"Las transacciones de inscripción deben tener un peso inferior a 400,000 unidades," -"de lo contrario, no serán retransmitidas por Bitcoin Core. Un byte del contenido " -"de inscripción equivale a una unidad de peso. Considerando que una transacción de " -"inscripción abarca más que solo el contenido de la inscripción se debe restringir el " -"contenido de cada inscripción a menos de 400,000 unidades de peso. Para mantener un " -"margen de seguridad, se recomienda no exceder las 390,000 unidades de peso." +#: src/runes/specification.md:396 +msgid "Executing the Runestone" +msgstr "Ejecución de la Piedra Rúnica" -#: src/guides/inscriptions.md:163 -msgid "Creating Inscriptions" -msgstr "Creación de Inscripciones" +#: src/runes/specification.md:398 +msgid "Runestones are executed in the order their transactions are included in blocks." +msgstr "Las piedras rúnicas se ejecutan en el orden en que sus transacciones se incluyan en los bloques." -#: src/guides/inscriptions.md:166 -msgid "To create an inscription with the contents of `FILE`, run:" -msgstr "Para crear una inscripción con el contenido de `ARCHIVO`, ejecuta:" +#: src/runes/specification.md:400 +msgid "Etchings" +msgstr "Grabados" -#: src/guides/inscriptions.md:168 -msgid "" -"```\n" -"ord wallet inscribe --fee-rate FEE_RATE --file FILE\n" -"```" -msgstr "" -"```\n" -"ord wallet inscribe --fee-rate TARIFA_DE_COMISION ARCHIVO\n" -"```" +#: src/runes/specification.md:402 +msgid "A runestone may contain an etching:" +msgstr "Una piedra rúnica puede contener este grabado:" -#: src/guides/inscriptions.md:172 -msgid "" -"Ord will output two transactions IDs, one for the commit transaction, and " -"one for the reveal transaction, and the inscription ID. Inscription IDs are " -"of the form `TXIDiN`, where `TXID` is the transaction ID of the reveal " -"transaction, and `N` is the index of the inscription in the reveal " -"transaction." -msgstr "" -"Ord mostrará dos IDs de transacciones, uno para la transacción de compromiso, " -"uno para la transacción de revelación, y el ID de inscripción. Los IDs de inscripción " -"tienen el formato `TXIDiN`, donde `TXID` es el ID de la transacción de revelación, y `N` " -"es el índice de la inscripción en la transacción de revelación." +#: src/runes/specification.md:415 +msgid "`rune` is the name of the rune to be etched, encoded as modified base-26 integer." +msgstr "`rune` es el nombre de la runa que sera grabada, codificada como un entero modificado de base-26." -#: src/guides/inscriptions.md:177 -msgid "" -"The commit transaction commits to a tapscript containing the content of the " -"inscription, and the reveal transaction spends from that tapscript, " -"revealing the content on chain and inscribing it on the first sat of the " -"input that contains the corresponding tapscript." -msgstr "" -"La transacción de compromiso se compromete a un tapscript que aloja el contenido " -"de la inscripción, mientras que la transacción de revelación consume ese tapscript, " -"revelando el contenido en la cadena e inscribiéndolo en el primer sat del input que contiene el tapscript correspondiente." +#: src/runes/specification.md:418 +msgid "Rune names consist of the letters A through Z, with the following encoding:" +msgstr "Los nombres de runas consisten en las letras de la A a la Z, con la siguiente codificación:" -#: src/guides/inscriptions.md:182 -msgid "" -"Wait for the reveal transaction to be mined. You can check the status of the " -"commit and reveal transactions using [the mempool.space block " -"explorer](https://mempool.space/)." -msgstr "" -"Espera a que la transacción de revelación sea minada. Puedes verificar el estado de las transacciones de compromiso y revelación usando [el explorador de bloques mempool.space]( https://mempool.space/)." +#: src/runes/specification.md:420 +msgid "Encoding" +msgstr "Codificación" -#: src/guides/inscriptions.md:186 -msgid "" -"Once the reveal transaction has been mined, the inscription ID should be " -"printed when you run:" -msgstr "" -"Una vez que la transacción de revelación haya sido minada, el ID de inscripción debería aparecer cuando ejecutes:" +#: src/runes/specification.md:422 +msgid "A" +msgstr "A" -#: src/guides/inscriptions.md:189 -#: src/guides/inscriptions.md:220 -#: src/guides/inscriptions.md:246 -msgid "" -"```\n" -"ord wallet inscriptions\n" -"```" -msgstr "" -"```\n" -"ord wallet inscriptions\n" -"```" +#: src/runes/specification.md:423 +msgid "B" +msgstr "B" -#: src/guides/inscriptions.md:193 -msgid "" -"And when you visit [the ordinals explorer](https://ordinals.com/) at " -"`ordinals.com/inscription/INSCRIPTION_ID`." -msgstr "" -"Y cuando visites [el explorador ordinals](https://ordinals.com/) en " -"`ordinals.com/inscription/INSCRIPTION_ID`." +#: src/runes/specification.md:424 src/runes/specification.md:429 +msgid "…" +msgstr "…" -#: src/guides/inscriptions.md:196 -msgid "Sending Inscriptions" -msgstr "Enviar Inscripciones" +#: src/runes/specification.md:425 +msgid "Y" +msgstr "Y" -#: src/guides/inscriptions.md:199 -msgid "Ask the recipient to generate a new address by running:" -msgstr "Pide al destinatario que genere una nueva dirección ejecutando:" +#: src/runes/specification.md:425 +msgid "24" +msgstr "24" -#: src/guides/inscriptions.md:205 -msgid "Send the inscription by running:" -msgstr "Envía la inscripción ejecutando:" +#: src/runes/specification.md:426 +msgid "Z" +msgstr "Z" -#: src/guides/inscriptions.md:207 -msgid "" -"```\n" -"ord wallet send --fee-rate
      \n" -"```" -msgstr "" -"```\n" -"ord wallet send --fee-rate \n" -"```" +#: src/runes/specification.md:427 +msgid "AA" +msgstr "AA" +#: src/runes/specification.md:427 +msgid "26" +msgstr "26" -#: src/guides/inscriptions.md:211 -#: src/guides/inscriptions.md:239 -msgid "See the pending transaction with:" -msgstr "Consulta la transacción con:" +#: src/runes/specification.md:428 +msgid "AB" +msgstr "AB" -#: src/guides/inscriptions.md:217 -msgid "" -"Once the send transaction confirms, the recipient can confirm receipt by " -"running:" -msgstr "" -"Una vez que la transacción de envío haya sido confirmada, el destinatario podrá verificarlo ejecutando:" +#: src/runes/specification.md:428 +msgid "27" +msgstr "27" -#: src/guides/inscriptions.md:224 -msgid "Receiving Inscriptions" -msgstr "Recibir Inscripciones" +#: src/runes/specification.md:430 +msgid "AY" +msgstr "AY" -#: src/guides/inscriptions.md:227 -msgid "Generate a new receive address using:" -msgstr "Genera una nueva dirección de recepción usando:" +#: src/runes/specification.md:431 +msgid "AZ" +msgstr "AZ" -#: src/guides/inscriptions.md:233 -msgid "The sender can transfer the inscription to your address using:" -msgstr "El remitente puede transferir la inscripción a tu dirección usando:" +#: src/runes/specification.md:431 +msgid "51" +msgstr "51" -#: src/guides/inscriptions.md:235 -msgid "" -"```\n" -"ord wallet send ADDRESS INSCRIPTION_ID\n" -"```" -msgstr "" -"```\n" -"ord wallet send DIRECCIÓN ID_INSCRIPCIÓN\n" -"```" +#: src/runes/specification.md:432 +msgid "BA" +msgstr "BA" + +#: src/runes/specification.md:432 +msgid "52" +msgstr "52" + +#: src/runes/specification.md:434 +msgid "And so on and so on." +msgstr "Y así sucesivamente." + +#: src/runes/specification.md:436 +msgid "Rune names `AAAAAAAAAAAAAAAAAAAAAAAAAAA` and above are reserved." +msgstr "Los nombres de runas `AAAAAAAAAAAAAAAAAAAAAAAAAAA` y superiores están reservados." + +#: src/runes/specification.md:438 +msgid "If `rune` is omitted a reserved rune name is allocated as follows:" +msgstr "Si `rune` se omite, se asigna un nombre de runa reservado de la siguiente manera:" + +#: src/runes/specification.md:449 +msgid "`6402364363415443603228541259936211926` corresponds to the rune name `AAAAAAAAAAAAAAAAAAAAAAAAAAA`." +msgstr "`6402364363415443603228541259936211926` corresponde al nombre de runa `AAAAAAAAAAAAAAAAAAAAAAAAAAA`." -#: src/guides/inscriptions.md:244 +#: src/runes/specification.md:452 +msgid "If `rune` is present, it must be unlocked as of the block in which the etching appears." +msgstr "Si `rune` está presente, debe desbloquearse a partir del bloque en el que aparece el grabado." + +#: src/runes/specification.md:455 +msgid "Initially, all rune names of length thirteen and longer, up until the first reserved rune name, are unlocked." +msgstr "Inicialmente, todos los nombres de runas de trece caracteres o más, hasta el primer nombre de runa reservado, están desbloqueados." + +#: src/runes/specification.md:458 +msgid "Runes begin unlocking in block 840,000, the block in which the runes protocol activates." +msgstr "Las runas comienzan a desbloquearse en el bloque 840,000, el bloque en el que se activa el protocolo de runas." + +#: src/runes/specification.md:461 msgid "" -"Once the send transaction confirms, you can can confirm receipt by running:" +"Thereafter, every 17,500 block period, the next shortest length of rune names is continuously unlocked. So, between block 840,000 and block 857,500, the twelve-character rune " +"names are unlocked, between block 857,500 and block 875,000 the eleven character rune names are unlocked, and so on and so on, until the one-character rune names are unlocked " +"between block 1,032,500 and block 1,050,000. See the `ord` codebase for the precise unlocking schedule." msgstr "" -"Una vez que la transacción de envío haya sido confirmada, puedes confirmar ejecutando:" +"A partir de entonces, cada período de 17,500 bloques, se desbloquea continuamente la siguiente longitud más corta de nombres de runas. Entre el bloque 840,000 y el 857,500, se " +"desbloquean los nombres de runas de doce caracteres, entre el bloque 857,500 y el 875,000 se desbloquean los nombres de runas de once caracteres, y así sucesivamente, hasta que " +"los nombres de runas de un solo carácter se desbloqueen entre el bloque 1,032,500 y el bloque 1,050,000. Consulte la base de código `ord` para el calendario preciso de desbloqueo." -#: src/guides/sat-hunting.md:4 +#: src/runes/specification.md:468 msgid "" -"_This guide is out of date. Since it was written, the `ord` binary was " -"changed to only build the full satoshi index when the `--index-sats` flag is " -"supplied. Additionally, `ord` now has a built-in wallet that wraps a Bitcoin " -"Core wallet. See `ord wallet --help`._" -msgstr "_Esta guía está desactualizada. Desde que se escribió, el binario `ord` " -"ord fue modificado para construir el índice completo de satoshis únicamente cuando " -"se utiliza la bandera `--index-sats`. Además, `ord` ahora tiene un monedero integrado que envuelve un monedero de Bitcoin Core. Ver `ord wallet –help`._" +"To prevent front running an etching that has been broadcast but not mined, if a non-reserved rune name is being etched, the etching transaction must contain a valid commitment to " +"the name being etched." +msgstr "" +"Para evitar el front running de un grabado que ha sido transmitido pero no minado, si se está grabando un nombre de runa no reservado, la transacción de grabado debe contener un " +"compromiso válido con el nombre que se está grabando." -#: src/guides/sat-hunting.md:9 +#: src/runes/specification.md:472 msgid "" -"Ordinal hunting is difficult but rewarding. The feeling of owning a wallet " -"full of UTXOs, redolent with the scent of rare and exotic sats, is beyond " -"compare." +"A commitment consists of a data push of the rune name, encoded as a little-endian integer with trailing zero bytes elided, present in an input witness tapscript where the output " +"being spent has at least six confirmations." msgstr "" -"La caza de Ordinals es difícil pero gratificante. La sensación de poseer un monedero lleno de UTXOs, impregnado con el aroma de sats raros y exóticos, es incomparable." +"Un compromiso consiste en un push de datos del nombre de la runa, codificado como un entero little-endian con los bytes de cero al final eliminados, presente en el testigo de " +"entrada tapscript donde la salida que se gasta tiene al menos seis confirmaciones." + +#: src/runes/specification.md:476 +msgid "If a valid commitment is not present, the etching is ignored." +msgstr "Si no hay un compromiso válido, se ignora el grabado." -#: src/guides/sat-hunting.md:12 +#: src/runes/specification.md:480 +msgid "A runestone may mint a rune by including the rune's ID in the `Mint` field." +msgstr "Una piedra rúnica puede mintear una runa incluyendo el ID de la runa en el campo `Mint`." + +#: src/runes/specification.md:482 msgid "" -"Ordinals are numbers for satoshis. Every satoshi has an ordinal number and " -"every ordinal number has a satoshi." +"If the mint is open, the mint amount is added to the unallocated runes in the transaction's inputs. These runes may be transferred using edicts, and will otherwise be transferred " +"to the first non-`OP_RETURN` output, or the output designated by the `Pointer` field." msgstr "" -"Los Ordinales son números para los satoshis. Cada satoshi tiene un número ordinal y cada número ordinal tiene un satoshi." +"Si el minteo está abierto, la cantidad minteada se añade a las runas no asignadas en las entradas de la transacción. Estas runas pueden ser transferidas usando edictos, y de lo " +"contrario, se transferirán a la primera salida que no sea `OP_RETURN`, o a la salida designada por el campo `Pointer`." -#: src/guides/sat-hunting.md:15 -msgid "Preparation" -msgstr "Preparación" +#: src/runes/specification.md:487 +msgid "Mints may be made in any transaction after an etching, including in the same block." +msgstr "Los minteos pueden realizarse en cualquier transacción despues del grabado, incluso en el mismo bloque." -#: src/guides/sat-hunting.md:18 -msgid "There are a few things you'll need before you start." -msgstr "Antes de empezar, necesitarás algunas cosas." +#: src/runes/specification.md:502 +msgid "A runestone may contain any number of edicts, which are processed in sequence." +msgstr "Una piedra rúnica puede contener cualquier número de edictos, los cuales se procesan en secuencia." -#: src/guides/sat-hunting.md:20 +#: src/runes/specification.md:504 +msgid "Before edicts are processed, input runes, as well as minted or premined runes, if any, are unallocated." +msgstr "Antes de procesar los edictos, las runas de entrada, así como las runas minteadas o preminadas, si las hay, no están asignadas." + +#: src/runes/specification.md:507 +msgid "Each edict decrements the unallocated balance of rune `id` and increments the balance allocated to transaction outputs of rune `id`." +msgstr "Cada edicto reduce el saldo que no ha sido asignado de la runa `id` e incrementa el saldo asignado a las salidas de transacción de la runa `id`." + +#: src/runes/specification.md:510 msgid "" -"First, you'll need a synced Bitcoin Core node with a transaction index. To " -"turn on transaction indexing, pass `-txindex` on the command-line:" +"If an edict would allocate more runes than are currently unallocated, the `amount` is reduced to the number of currently unallocated runes. In other words, the edict allocates " +"all remaining unallocated units of rune `id`." msgstr "" -"Primero, necesitarás un nodo de Bitcoin Core sincronizado con un índice de transacciones. Para activar la indexación de transacciones, ejecuta `-txindex` en la línea de comandos:" +"Si un edicto asignara más runas de las que no están asignadas, `amount` se reduce al número de runas que no estan asignadas. En otras palabras, el edicto asigna todas las " +"unidades restantes que no han sido asignadas de la runa `id`." -#: src/guides/sat-hunting.md:23 -msgid "" -"```sh\n" -"bitcoind -txindex\n" -"```" +#: src/runes/specification.md:514 +msgid "Because the ID of an etched rune is not known before it is included in a block, ID `0:0` is used to mean the rune being etched in this transaction, if any." msgstr "" -"```sh\n" -"bitcoind -txindex\n" -"```" +"Dado que el ID de una runa grabada no se conoce antes de que se incluya en un bloque, se usa el `ID 0:0` para referirse a la runa que se está grabando en esta transacción, si la " +"hay." + +#: src/runes/specification.md:517 +msgid "An edict with `amount` zero allocates all remaining units of rune `id`." +msgstr "Un edicto con con el valor `amount` igual a cero asigna todas las unidades restantes de la runa `id`." + +#: src/runes/specification.md:519 +msgid "An edict with `output` equal to the number of transaction outputs allocates `amount` runes to each non-`OP_RETURN` output in order." +msgstr "Un edicto con `output` igual al número de salidas de la transacción asigna `amount` de runas a cada salida que no sea OP_RETURN en orden." -#: src/guides/sat-hunting.md:27 +#: src/runes/specification.md:522 msgid "" -"Or put the following in your [Bitcoin configuration " -"file](https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md#configuration-file-path):" +"An edict with `amount` zero and `output` equal to the number of transaction outputs divides all unallocated units of rune `id` between each non-`OP_RETURN` output. If the number " +"of unallocated runes is not divisible by the number of non-`OP_RETURN` outputs, 1 additional rune is assigned to the first `R` non-`OP_RETURN` outputs, where `R` is the remainder " +"after dividing the balance of unallocated units of rune `id` by the number of non-`OP_RETURN` outputs." msgstr "" -"O escribe lo siguiente en tu archivo [de configuración de Bitcoin]" -"(https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md#configuration-file-path):" +"Un edicto con el valor de `amount` igual a cero y `output` igual al número de salidas de la transacción distribuye todas las unidades no asignadas de la runa `id` entre cada " +"salida que no sea `OP_RETURN`. Si la cantidad de runas no asignadas no se puede dividir equitativamente entre las salidas que no son `OP_RETURN`, se asigna una runa adicional a " +"las primeras `R` salidas que no son `OP_RETURN`, donde `R` es el residuo que queda después de dividir el balance de unidades no asignadas de la runa `id` por el número de salidas " +"que no son `OP_RETURN`." -#: src/guides/sat-hunting.md:34 +#: src/runes/specification.md:529 msgid "" -"Launch it and wait for it to catch up to the chain tip, at which point the " -"following command should print out the current block height:" +"If any edict in a runestone has a rune ID with `block` zero and `tx` greater than zero, or `output` greater than the number of transaction outputs, the runestone is a cenotaph." msgstr "" -"Ejecutalo y espera hasta que llegue al final de la cadena; una vez hecho esto, el siguiente comando debería imprimir la altura del bloque actual:" +"La piedra rúnica se convierte en un cenotafio si algún edicto en una piedra rúnica tiene un ID de runa con `block` igual a cero y `tx` mayor que cero, o `output` mayor que el " +"número de salidas de la transacción." -#: src/guides/sat-hunting.md:37 -msgid "" -"```sh\n" -"bitcoin-cli getblockcount\n" -"```" -msgstr "" -"```sh\n" -"bitcoin-cli getblockcount\n" -"```" +#: src/runes/specification.md:533 +msgid "Note that edicts in cenotaphs are not processed, and all input runes are burned." +msgstr "Se debe tener en cuenta que los edictos en los cenotafios no se procesan, y todas las runas de entrada se queman." -#: src/guides/sat-hunting.md:41 -msgid "Second, you'll need a synced `ord` index." -msgstr "En segundo lugar, vas a necesitar un índice de `ord` sincronizado." +#: src/faq.md:1 +msgid "Ordinal Theory FAQ" +msgstr "Preguntas frecuentes sobre la teoría Ordinal" -#: src/guides/sat-hunting.md:43 -msgid "Get a copy of `ord` from [the repo](https://github.com/ordinals/ord/)." -msgstr "Obtén una copia de ord desde [el repositorio](https://github.com/ordinals/ord/)." +#: src/faq.md:4 +msgid "What is ordinal theory?" +msgstr "¿Qué es la teoría ordinal?" -#: src/guides/sat-hunting.md:45 -msgid "" -"Run `RUST_LOG=info ord index`. It should connect to your bitcoin core node " -"and start indexing." +#: src/faq.md:7 +msgid "Ordinal theory is a protocol for assigning serial numbers to satoshis, the smallest subdivision of a bitcoin, and tracking those satoshis as they are spent by transactions." msgstr "" -"Ejecuta `RUST_LOG=info ord index`. Debería conectarse a tu nodo bitcoin core e iniciar el proceso de indexación." - -#: src/guides/sat-hunting.md:48 -msgid "Wait for it to finish indexing." -msgstr "Espera hasta que termine de indexar." - -#: src/guides/sat-hunting.md:50 -msgid "Third, you'll need a wallet with UTXOs that you want to search." -msgstr "En tercer lugar, necesitarás un monedero con los UTXOs que quieras analizar." +"La teoría ordinal es un protocolo para asignar números de serie a los satoshis, la denominación más pequeña de un bitcoin, y rastrear esos satoshis a medida que son gastados en " +"transacciones." -#: src/guides/sat-hunting.md:52 -msgid "Searching for Rare Ordinals" -msgstr "Buscando Ordinals Raros" +#: src/faq.md:11 +msgid "These serial numbers are large numbers, like this 804766073970493. Every satoshi, which is ¹⁄₁₀₀₀₀₀₀₀₀ of a bitcoin, has an ordinal number." +msgstr "Estos números de serie son números grandes, un ejemplo es el número 804766073970493. Cada satoshi, el cual es ¹⁄₁₀₀₀₀₀₀₀₀ de un bitcoin, tiene un número ordinal." -#: src/guides/sat-hunting.md:55 -msgid "Searching for Rare Ordinals in a Bitcoin Core Wallet" -msgstr "Buscando Ordinals Raros en un Monedero de Bitcoin Core" +#: src/faq.md:14 +msgid "Does ordinal theory require a side chain, a separate token, or changes to Bitcoin?" +msgstr "¿La teoría ordinal requiere una cadena lateral, un token separado o cambios en Bitcoin?" -#: src/guides/sat-hunting.md:57 -msgid "" -"The `ord wallet` command is just a wrapper around Bitcoin Core's RPC API, so " -"searching for rare ordinals in a Bitcoin Core wallet is Easy. Assuming your " -"wallet is named `foo`:" -msgstr "" -"El comando `ord wallet` es solo un envoltorio alrededor de la API RPC de Bitcoin Core, así que buscar ordinals raros en un monedero de Bitcoin Core es fácil. Digamos que tu monedero se llama `foo`:" +#: src/faq.md:17 +msgid "Nope! Ordinal theory works right now, without a side chain, and the only token needed is bitcoin itself." +msgstr "¡No! La teoría ordinal funciona en este momento, sin una cadena lateral, y el único token necesario es simplemente bitcoin." -#: src/guides/sat-hunting.md:61 -msgid "Load your wallet:" -msgstr "Carga tu monedero:" +#: src/faq.md:20 +msgid "What is ordinal theory good for?" +msgstr "¿Para qué sirve la teoría Ordinals?" -#: src/guides/sat-hunting.md:63 +#: src/faq.md:23 msgid "" -"```sh\n" -"bitcoin-cli loadwallet foo\n" -"```" +"Collecting, trading, and scheming. Ordinal theory assigns identities to individual satoshis, allowing them to be individually tracked and traded, as curios and for numismatic " +"value." msgstr "" -"```sh\n" -"bitcoin-cli loadwallet foo\n" -"```" +"Para coleccionar, comerciar e innovar. La teoría ordinal asigna una identidad a los satoshis, permitiendo que se rastreen e intercambien, como curiosidades y por su valor " +"numismático." -#: src/guides/sat-hunting.md:67 -msgid "Display any rare ordinals wallet `foo`'s UTXOs:" -msgstr "2. Visualiza los UTXOs raros del monedero de ordinales `foo`:" - -#: src/guides/sat-hunting.md:69 -#: src/guides/sat-hunting.md:132 -#: src/guides/sat-hunting.md:233 -msgid "" -"```sh\n" -"ord wallet sats\n" -"```" +#: src/faq.md:27 +msgid "Ordinal theory also enables inscriptions, a protocol for attaching arbitrary content to individual satoshis, turning them into bitcoin-native digital artifacts." msgstr "" -"```sh\n" -"ord wallet sats\n" -"```" +"La teoría ordinal también habilita las inscripciones, un protocolo para adjuntar contenido arbitrario a los satoshis, convirtiéndolos en artefactos digitales nativos en bitcoin." -#: src/guides/sat-hunting.md:73 -msgid "Searching for Rare Ordinals in a Non-Bitcoin Core Wallet" -msgstr "Buscando Ordinals Raros en un Monedero que no es de Bitcoin Core" +#: src/faq.md:31 +msgid "How does ordinal theory work?" +msgstr "¿Cómo funciona la teoría ordinal?" -#: src/guides/sat-hunting.md:75 +#: src/faq.md:34 msgid "" -"The `ord wallet` command is just a wrapper around Bitcoin Core's RPC API, so " -"to search for rare ordinals in a non-Bitcoin Core wallet, you'll need to " -"import your wallet's descriptors into Bitcoin Core." +"Ordinal numbers are assigned to satoshis in the order in which they are mined. The first satoshi in the first block has ordinal number 0, the second has ordinal number 1, and the " +"last satoshi of the first block has ordinal number 4,999,999,999." msgstr "" -"El comando `ord wallet` es solo un envoltorio alrededor de la API RPC de Bitcoin Core, " -"así que para buscar ordinales raros en un monedero que no es de Bitcoin Core, necesitarás importar los descriptores de tu monedero a Bitcoin Core." +"Los números ordinales se asignan a los satoshis en el orden en que se minan. El primer satoshi en el primer bloque tiene el número ordinal 0, el segundo tiene el número ordinal 1 " +"y el último satoshi del primer bloque tiene el número ordinal 4,999,999,999." -#: src/guides/sat-hunting.md:79 +#: src/faq.md:39 msgid "" -"[Descriptors](https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md) " -"describe the ways that wallets generate private keys and public keys." +"Satoshis live in outputs, but transactions destroy outputs and create new ones, so ordinal theory uses an algorithm to determine how satoshis hop from the inputs of a transaction " +"to its outputs." msgstr "" -"Los [descriptores](https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md) describen la manera en que los monederos generan llaves privadas y públicas." +"Los satoshis se hallan en las transacciones salientes, pero las transacciones se destruyen cuando son emitidas y se crean nuevas transacciones, lo que la teoría de Ordinals hace " +"es utilizar un algoritmo para determinar cómo los satoshis se mueven entre las transacciones que salen y entran." -#: src/guides/sat-hunting.md:82 -msgid "" -"You should only import descriptors into Bitcoin Core for your wallet's " -"public keys, not its private keys." -msgstr "Solo deberías importar los descriptores en Bitcoin Core para las claves públicas de tu monedero, no para las claves privadas." +#: src/faq.md:43 +msgid "Fortunately, that algorithm is very simple." +msgstr "Afortunadamente, ese algoritmo es bastante sencillo." -#: src/guides/sat-hunting.md:85 +#: src/faq.md:45 msgid "" -"If your wallet's public key descriptor is compromised, an attacker will be " -"able to see your wallet's addresses, but your funds will be safe." +"Satoshis transfer in first-in-first-out order. Think of the inputs to a transaction as being a list of satoshis, and the outputs as a list of slots, waiting to receive a satoshi. " +"To assign input satoshis to slots, go through each satoshi in the inputs in order, and assign each to the first available slot in the outputs." msgstr "" -"Si el descriptor de llave pública de tu monedero está comprometido, un atacante podrá ver las direcciones de tu monedero, pero tus fondos estarán seguros." +"Los satoshis se transfieren en orden, el primero que entra, es el primero en salir. Simplemente hay que pensar en las entradas a una transacción como una lista de satoshis, y las " +"salidas como una lista con espacios libres, esperando para recibir un satoshi. Para asignar satoshis a un espacio libre, se asigna uno por uno al próximo espacio que esté " +"disponible." -#: src/guides/sat-hunting.md:88 -msgid "" -"If your wallet's private key descriptor is compromised, an attacker can " -"drain your wallet of funds." -msgstr "" -"Si el descriptor de llave privada de tu monedero está comprometido, un " -"atacante podrá vaciar los fondos de tu monedero." +#: src/faq.md:51 +msgid "Let's imagine a transaction with three inputs and two outputs. The inputs are on the left of the arrow and the outputs are on the right, all labeled with their values:" +msgstr "Imaginemos una transacción con tres entradas y dos salidas. Las entradas están a la izquierda de la flecha y las salidas a la derecha, todas con sus respectivos valores:" -#: src/guides/sat-hunting.md:91 +#: src/faq.md:59 msgid "" -"Get the wallet descriptor from the wallet whose UTXOs you want to search for " -"rare ordinals. It will look something like this:" +"Now let's label the same transaction with the ordinal numbers of the satoshis that each input contains, and question marks for each output slot. Ordinal numbers are large, so " +"let's use letters to represent them:" msgstr "" -"Obtén el descriptor del monedero cuyos UTXOs quieres analizar para identificar si contiene ordinals raros. Se verá algo así:" +"Ahora miremos la misma transacción con los números ordinales de los satoshis que contiene cada entrada. Pondremos signos de interrogantes para cada espacio de salida que está " +"libre. Ya que los números ordinales son grandes utilizaremos letras para representarlos:" + +#: src/faq.md:67 +msgid "To figure out which satoshi goes to which output, go through the input satoshis in order and assign each to a question mark:" +msgstr "Para saber dónde el satoshi quedara ubicado en la transacción de salida, revisa los satoshis en la transacción de entrada y asigna cada uno a un signo de interrogación:" -#: src/guides/sat-hunting.md:94 +#: src/faq.md:74 msgid "" -"```\n" -"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\n" -"```" +"What about fees, you might ask? Good question! Let's imagine the same transaction, this time with a two satoshi fee. Transactions with fees send more satoshis in the inputs than " +"are received by the outputs, so to make our transaction into one that pays fees, we'll remove the second output:" msgstr "" -"```\n" -"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\n" -"```" +"¿En este momento te estarás preguntando qué pasara con las comisiones? ¡Buena pregunta! Imaginemos la misma transacción, esta vez con una comisión de dos satoshis. Las " +"transacciones con comisiones contienen más satoshis en las transacciones de entrada que las que reciben las transacciones de salida, por lo que para convertir nuestra transacción " +"en una que pague comisiones, eliminaremos la segunda salida:" -#: src/guides/sat-hunting.md:98 -msgid "Create a watch-only wallet named `foo-watch-only`:" -msgstr "Crea un monedero de solo lectura llamada `foo-solo-lectura`:" +#: src/faq.md:83 +msgid "The satoshis e and f now have nowhere to go in the outputs:" +msgstr "Los satoshis e y f ahora no tienen ningún lugar a donde ir en las salidas:" -#: src/guides/sat-hunting.md:100 +#: src/faq.md:90 msgid "" -"```sh\n" -"bitcoin-cli createwallet foo-watch-only true true\n" -"```" +"So they go to the miner who mined the block as fees. [The BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki) has the details, but in short, fees paid by transactions " +"are treated as extra inputs to the coinbase transaction, and are ordered how their corresponding transactions are ordered in the block. The coinbase transaction of the block " +"might look like this:" msgstr "" -"```sh\n" -"bitcoin-cli createwallet foo-solo-lectura true true\n" -"```" +"Así que van al minero que minó el bloque como comisión. [El BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki) tiene los detalles, pero, en resumen, las comisiones " +"pagadas por las transacciones se tratan como entradas adicionales a la transacción coinbase y se ordenan según el orden en el que están en el bloque. La transacción coinbase del " +"bloque podría verse así:" -#: src/guides/sat-hunting.md:104 -msgid "Feel free to give it a better name than `foo-watch-only`!" -msgstr "¡Siéntete libre de asignarle un mejor nombre que `foo-solo-lectura`!" +#: src/faq.md:101 +msgid "Where can I find the nitty-gritty details?" +msgstr "¿Dónde puedo encontrar los detalles técnicos?" -#: src/guides/sat-hunting.md:106 -msgid "Load the `foo-watch-only` wallet:" -msgstr "Carga el monedero `foo-solo-lectura`:" +#: src/faq.md:104 +msgid "[The BIP!](https://github.com/ordinals/ord/blob/master/bip.mediawiki)" +msgstr "[¡En el BIP!](https://github.com/ordinals/ord/blob/master/bip.mediawiki)" -#: src/guides/sat-hunting.md:108 -#: src/guides/sat-hunting.md:199 -msgid "" -"```sh\n" -"bitcoin-cli loadwallet foo-watch-only\n" -"```" -msgstr "" -"```sh\n" -"bitcoin-cli loadwallet foo-solo-lectura\n" -"```" +#: src/faq.md:106 +msgid "Why are sat inscriptions called \"digital artifacts\" instead of \"NFTs\"?" +msgstr "¿Por qué a las inscripciones de Satoshis se les llama \"artefactos digitales\" en lugar de \"NFT\"?" -#: src/guides/sat-hunting.md:112 -msgid "Import your wallet descriptors into `foo-watch-only`:" -msgstr "Importa los descriptores de tu monedero a `foo-solo-lectura`:" +#: src/faq.md:109 +msgid "An inscription is an NFT, but the term \"digital artifact\" is used instead, because it's simple, suggestive, and familiar." +msgstr "Una inscripción es un NFT, pero se utiliza el término \"artefacto digital\", porque es fácil, sugerente y familiar." -#: src/guides/sat-hunting.md:114 +#: src/faq.md:112 msgid "" -"```sh\n" -"bitcoin-cli importdescriptors \\\n" -" '[{ \"desc\": " -"\"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\", " -"\"timestamp\":0 }]'\n" -"```" +"The phrase \"digital artifact\" is highly suggestive, even to someone who has never heard the term before. In comparison, NFT is an acronym, and doesn't provide any indication of " +"what it means if you haven't heard the term before." msgstr "" -"```sh\n" -"bitcoin-cli importdescriptors \\\n" -" '[{ \"desc\": " -"\"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\", " -"\"timestamp\":0 }]'\n" -"```" +"La frase \"artefacto digital\" es muy sugerente, incluso para alguien que nunca ha oído el término. En comparación, NFT es un acrónimo y no proporciona ninguna indicación de lo " +"que significa si no has escuchado el término." -#: src/guides/sat-hunting.md:119 +#: src/faq.md:116 msgid "" -"If you know the Unix timestamp when your wallet first started receive " -"transactions, you may use it for the value of `\"timestamp\"` instead of " -"`0`. This will reduce the time it takes for Bitcoin Core to search for your " -"wallet's UTXOs." +"Additionally, \"NFT\" feels like financial terminology, and the both word \"fungible\" and sense of the word \"token\" as used in \"NFT\" is uncommon outside of financial " +"contexts." msgstr "" -"Si conoces la marca de tiempo Unix cuando tu monedero comenzó a recibir " -"transacciones, puedes usarla para el valor de `\"timestamp\"` en lugar de 0. " -"Esto reducirá el tiempo que Bitcoin Core tardará en buscar los UTXO en tu " -"monedero." +"Además, la palabra, \"NFT\" suena como terminología financiera, y tanto la palabra \"fungible\" como el sentido de la palabra \"token\" como se usa en los \"NFT\" no son comunes " +"fuera de los contextos financieros." -#: src/guides/sat-hunting.md:124 -#: src/guides/sat-hunting.md:225 -msgid "Check that everything worked:" -msgstr "Comprueba que todo haya funcionado correctamente:" +#: src/faq.md:120 +msgid "How do sat inscriptions compare to…" +msgstr "¿Cómo se comparan las inscripciones con…" -#: src/guides/sat-hunting.md:126 -#: src/guides/sat-hunting.md:227 -msgid "" -"```sh\n" -"bitcoin-cli getwalletinfo\n" -"```" -msgstr "" -"```sh\n" -"bitcoin-cli getwalletinfo\n" -"```" +#: src/faq.md:123 +msgid "Ethereum NFTs?" +msgstr "¿Los NFT de Ethereum?" -#: src/guides/sat-hunting.md:130 -#: src/guides/sat-hunting.md:231 -msgid "Display your wallet's rare ordinals:" -msgstr "Visualiza los ordinals raros de tu monedero:" +#: src/faq.md:125 +msgid "_Inscriptions are always immutable._" +msgstr "_Las inscripciones siempre son inmutables._" -#: src/guides/sat-hunting.md:136 -msgid "" -"Searching for Rare Ordinals in a Wallet that Exports Multi-path Descriptors" -msgstr "" -"Buscando Ordinals Raros en un Monedero que Exporta Descriptores de Múltiples Rutas (multi-path)" +#: src/faq.md:127 +msgid "There is simply no way to for the creator of an inscription, or the owner of an inscription, to modify it after it has been created." +msgstr "No hay forma de que el creador de una inscripción, o el propietario de una inscripción, la modifique después de haber sido creada." -#: src/guides/sat-hunting.md:138 -msgid "" -"Some descriptors describe multiple paths in one descriptor using angle " -"brackets, e.g., `<0;1>`. Multi-path descriptors are not yet supported by " -"Bitcoin Core, so you'll first need to convert them into multiple " -"descriptors, and then import those multiple descriptors into Bitcoin Core." +#: src/faq.md:130 +msgid "Ethereum NFTs _can_ be immutable, but many are not, and can be changed or deleted by the NFT contract owner." +msgstr "Los NFTs en Ethereum _pueden_ ser inmutables, pero muchos no lo son y pueden ser cambiados o eliminados por el propietario del contrato del NFT." + +#: src/faq.md:133 +msgid "In order to make sure that a particular Ethereum NFT is immutable, the contract code must be audited, which requires detailed knowledge of the EVM and Solidity semantics." msgstr "" -"Algunos descriptores describen múltiples rutas en un descriptor utilizando paréntesis angular, " -"por ejemplo, <0;1>. Los descriptores de múltiples rutas aún no son compatibles con Bitcoin Core, " -"así que primero deberás convertirlos en múltiples descriptores y luego importarlos a Bitcoin Core." +"Para asegurarse de que un NFT de Ethereum sea inmutable, se debe analizar el código del contrato, lo cual requiere un conocimiento a profundidad de la EVM y la semántica de " +"Solidity." -#: src/guides/sat-hunting.md:143 +#: src/faq.md:137 msgid "" -"First get the multi-path descriptor from your wallet. It will look something " -"like this:" +"It is very hard for a non-technical user to determine whether or not a given Ethereum NFT is mutable or immutable, and Ethereum NFT platforms make no effort to distinguish " +"whether an NFT is mutable or immutable, and whether the contract source code is available and has been audited." msgstr "" -"En primer lugar, obtén el descriptor de múltiples rutas de tu monedero. " -"Se verá algo así:" +"Para un usuario que no tiene habilidades técnicas es bastante difícil determinar si un NFT de Ethereum es mutable o inmutable, y las plataformas Ethereum NFT no se esfuerzan para " +"ayudar a distinguir si un NFT es mutable o inmutable y si el código fuente del contrato está disponible y ha sido auditado." -#: src/guides/sat-hunting.md:146 +#: src/faq.md:142 +msgid "_Inscription content is always on-chain._" +msgstr "_El contenido de la inscripción siempre está en la cadena de Bitcoin._" + +#: src/faq.md:144 msgid "" -"```\n" -"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/<0;1>/*)#fw76ulgt\n" -"```" +"There is no way for an inscription to refer to off-chain content. This makes inscriptions more durable, because content cannot be lost, and scarcer, because inscription creators " +"must pay fees proportional to the size of the content." msgstr "" -"```\n" -"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/<0;1>/*)#fw76ulgt\n" -"```" +"No hay forma de que una inscripción haga referencia a contenido que esta por fuera de la cadena de Bitcoin. Debido a esto las inscripciones son más duraderas porque el contenido " +"no puede perderse y también las hace más escasas porque los creadores de inscripciones deben pagar comisiones proporcionales al tamaño del contenido." -#: src/guides/sat-hunting.md:150 -msgid "Create a descriptor for the receive address path:" -msgstr "Crea un descriptor para la ruta de dirección que lo recibirá:" - -#: src/guides/sat-hunting.md:152 +#: src/faq.md:148 msgid "" -"```\n" -"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)\n" -"```" +"Some Ethereum NFT content is on-chain, but much is off-chain, and is stored on platforms like IPFS or Arweave, or on traditional, fully centralized web servers. Content on IPFS " +"is not guaranteed to continue to be available, and some NFT content stored on IPFS has already been lost. Platforms like Arweave rely on weak economic assumptions, and will " +"likely fail catastrophically when these economic assumptions are no longer met. Centralized web servers may disappear at any time." msgstr "" -"```\n" -"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)\n" -"```" +"Hay algunos NFTs en Ethereum que están en la cadena, pero muchos no lo están y se almacenan en plataformas como IPFS o Arweave, o en servidores web centralizados. No se garantiza " +"que el contenido que esta almacenado en IPFS continue estando disponible, de hecho, ya se ha perdido contenido de NFTs que fueron almacenado en IPFS. Plataformas como Arweave " +"dependen de suposiciones económicas y probablemente fallarán catastróficamente cuando estas suposiciones ya no se cumplan. Los servidores web centralizados pueden desaparecer en " +"cualquier momento." -#: src/guides/sat-hunting.md:156 -msgid "And the change address path:" -msgstr "Y la dirección que recibirá lo que sobra de bitcoin o el cambio:" +#: src/faq.md:156 +msgid "It is very hard for a non-technical user to determine where the content of a given Ethereum NFT is stored." +msgstr "Es difícil para un usuario que no tienes habilidades técnicas determinar donde el contenido de un NFT de Ethereum esta alojado." + +#: src/faq.md:159 +msgid "_Inscriptions are much simpler._" +msgstr "_Las inscripciones son mucho más sencillas._" -#: src/guides/sat-hunting.md:158 +#: src/faq.md:161 msgid "" -"```\n" -"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)\n" -"```" +"Ethereum NFTs depend on the Ethereum network and virtual machine, which are highly complex, constantly changing, and which introduce changes via backwards-incompatible hard forks." msgstr "" -"```\n" -"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)\n" -"```" +"Los NFT de Ethereum dependen de la red y la máquina virtual de Ethereum, las cuales son altamente complejas, cambian constantemente e introducen cambios mediante bifurcaciones " +"incompatibles con versiones anteriores." -#: src/guides/sat-hunting.md:162 +#: src/faq.md:165 msgid "" -"Get and note the checksum for the receive address descriptor, in this case " -"`tpnxnxax`:" +"Inscriptions, on the other hand, depend on the Bitcoin blockchain, which is relatively simple and conservative, and which introduces changes via backwards-compatible soft forks." msgstr "" -"Obtén y anota el checksum del descriptor de la dirección de recepción, en este " -"caso es `tpnxnxax`:" +"Por otro lado, las inscripciones dependen de la blockchain de Bitcoin que es relativamente simple y conservadora, e introduce cambios mediante bifurcaciones suaves (soft fork) " +"compatibles con versiones anteriores." + +#: src/faq.md:169 +msgid "_Inscriptions are more secure._" +msgstr "_Las inscripciones son más seguras._" -#: src/guides/sat-hunting.md:165 +#: src/faq.md:171 msgid "" -"```sh\n" -"bitcoin-cli getdescriptorinfo \\\n" -" " -"'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)'\n" -"```" +"Inscriptions inherit Bitcoin's transaction model, which allow a user to see exactly which inscriptions are being transferred by a transaction before they sign it. Inscriptions " +"can be offered for sale using partially signed transactions, which don't require allowing a third party, such as an exchange or marketplace, to transfer them on the user's behalf." msgstr "" -"```sh\n" -"bitcoin-cli getdescriptorinfo \\\n" -" " -"'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)'\n" -"```" +"Las inscripciones heredan el modelo de transacción de Bitcoin, lo que permite al usuario ver exactamente qué inscripciones se están transfiriendo en una transacción antes de " +"firmarla. Las inscripciones pueden ofrecerse a la venta mediante transacciones parcialmente firmadas, lo que no requiere el permiso un tercero, como un mercado o plataforma para " +"la transferencia." -#: src/guides/sat-hunting.md:170 +#: src/faq.md:177 msgid "" -"```json\n" -"{\n" -" \"descriptor\": " -"\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\",\n" -" \"checksum\": \"tpnxnxax\",\n" -" \"isrange\": true,\n" -" \"issolvable\": true,\n" -" \"hasprivatekeys\": false\n" -"}\n" -"```" +"By comparison, Ethereum NFTs are plagued with end-user security vulnerabilities. It is commonplace to blind-sign transactions, grant third-party apps unlimited permissions over a " +"user's NFTs, and interact with complex and unpredictable smart contracts. This creates a minefield of hazards for Ethereum NFT users which are simply not a concern for ordinal " +"theorists." msgstr "" -"```json\n" -"{\n" -" \"descriptor\": " -"\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\",\n" -" \"checksum\": \"tpnxnxax\",\n" -" \"isrange\": true,\n" -" \"issolvable\": true,\n" -" \"hasprivatekeys\": false\n" -"}\n" -"```" +"En comparación, los NFT de Ethereum están plagados de vulnerabilidades de seguridad para el usuario final. Es común firmar transacciones a ciegas, otorgar permisos ilimitados a " +"aplicaciones de terceros sobre los NFTs e interactuar con contratos inteligentes complejos e impredecibles. Estos problemas que tienen los NFTs de Ethereum simplemente no son una " +"preocupación para los teóricos de Ordinals." -#: src/guides/sat-hunting.md:180 -msgid "And for the change address descriptor, in this case `64k8wnd7`:" -msgstr "Y para el descriptor de la dirección de cambio, en este caso `64k8wnd7`:" +#: src/faq.md:183 +msgid "_Inscriptions are scarcer._" +msgstr "_Las inscripciones son más escasas._" -#: src/guides/sat-hunting.md:182 +#: src/faq.md:185 msgid "" -"```sh\n" -"bitcoin-cli getdescriptorinfo \\\n" -" " -"'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)'\n" -"```" +"Inscriptions require bitcoin to mint, transfer, and store. This seems like a downside on the surface, but the raison d'etre of digital artifacts is to be scarce and thus valuable." msgstr "" -"```sh\n" -"bitcoin-cli getdescriptorinfo \\\n" -" " -"'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)'\n" -"```" +"Para mintear, transferir y almacenar inscripciones, se requiere bitcoin. Superficialmente esto parece un inconveniente, pero la razón de ser de los artefactos digitales es ser " +"escasos y, por lo tanto, valiosos." -#: src/guides/sat-hunting.md:187 +#: src/faq.md:189 msgid "" -"```json\n" -"{\n" -" \"descriptor\": " -"\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#fyfc5f6a\",\n" -" \"checksum\": \"64k8wnd7\",\n" -" \"isrange\": true,\n" -" \"issolvable\": true,\n" -" \"hasprivatekeys\": false\n" -"}\n" -"```" +"Ethereum NFTs, on the other hand, can be minted in virtually unlimited qualities with a single transaction, making them inherently less scarce, and thus, potentially less " +"valuable." msgstr "" -"```json\n" -"{\n" -" \"descriptor\": " -"\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#fyfc5f6a\",\n" -" \"checksum\": \"64k8wnd7\",\n" -" \"isrange\": true,\n" -" \"issolvable\": true,\n" -" \"hasprivatekeys\": false\n" -"}\n" -"```" - -#: src/guides/sat-hunting.md:197 -msgid "Load the wallet you want to import the descriptors into:" -msgstr "Carga el monedero al cual deseas importar los descriptores:" +"Los NFT de Ethereum, por otro lado, pueden ser minteados en cantidades prácticamente ilimitadas con una sola transacción, lo que los hace intrínsecamente menos escasos y, por lo " +"tanto, potencialmente menos valiosos." -#: src/guides/sat-hunting.md:203 -msgid "" -"Now import the descriptors, with the correct checksums, into Bitcoin Core." -msgstr "Ahora importa los descriptores, con los checksums correctos, a Bitcoin Core." +#: src/faq.md:193 +msgid "_Inscriptions do not pretend to support on-chain royalties._" +msgstr "_Las inscripciones no pretenden respaldar regalías en la cadena._" -#: src/guides/sat-hunting.md:205 +#: src/faq.md:195 msgid "" -"```sh\n" -"bitcoin-cli \\\n" -" importdescriptors \\\n" -" '[\n" -" {\n" -" \"desc\": " -"\"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\"\n" -" \"timestamp\":0\n" -" },\n" -" {\n" -" \"desc\": " -"\"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#64k8wnd7\",\n" -" \"timestamp\":0\n" -" }\n" -" ]'\n" -"```" +"On-chain royalties are a good idea in theory but not in practice. Royalty payment cannot be enforced on-chain without complex and invasive restrictions. The Ethereum NFT " +"ecosystem is currently grappling with confusion around royalties, and is collectively coming to grips with the reality that on-chain royalties, which were messaged to artists as " +"an advantage of NFTs, are not possible, while platforms race to the bottom and remove royalty support." msgstr "" -"```sh\n" -"bitcoin-cli \\\n" -" importdescriptors \\\n" -" '[\n" -" {\n" -" \"desc\": " -"\"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\"\n" -" \"timestamp\":0\n" -" },\n" -" {\n" -" \"desc\": " -"\"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#64k8wnd7\",\n" -" \"timestamp\":0\n" -" }\n" -" ]'\n" -"```" +"En teoría, la idea de implementar regalías en blockchain suena prometedora, pero en la práctica surgen problemas significativos. La aplicación de regalías enfrenta restricciones " +"complejas e invasivas en la cadena. Actualmente, el ecosistema de NFT en Ethereum está lidiando con problemas debido a la confusión en torno a las regalías. Colectivamente, se " +"está llegando a la conclusión de que las regalías en cadena, originalmente vistas como una ventaja para los artistas en los NFT, no son factibles. Algunas plataformas ya están " +"eliminando el soporte para regalías." -#: src/guides/sat-hunting.md:220 +#: src/faq.md:202 msgid "" -"If you know the Unix timestamp when your wallet first started receive " -"transactions, you may use it for the value of the `\"timestamp\"` fields " -"instead of `0`. This will reduce the time it takes for Bitcoin Core to " -"search for your wallet's UTXOs." +"Inscriptions avoid this situation entirely by making no false promises of supporting royalties on-chain, thus avoiding the confusion, chaos, and negativity of the Ethereum NFT " +"situation." msgstr "" -"Si conoces la marca de tiempo de Unix cuando tu monedero comenzó a recibir " -"transacciones por primera vez, puedes utilizarlo como el valor del campo `\"timestamp\"` en lugar de `0`. Esto reducirá el tiempo que tarda Bitcoin Core en buscar los UTXOs de tu monedero." +"Las inscripciones evitan esta situación por completo al no hacer falsas promesas de respaldar regalías en la cadena, evitando así la confusión, el caos y la negatividad de la " +"situación que ocurre con los NFT en Ethereum." -#: src/guides/sat-hunting.md:237 -msgid "Exporting Descriptors" -msgstr "Exportar Descriptores" +#: src/faq.md:206 +msgid "_Inscriptions unlock new markets._" +msgstr "_Las inscripciones abren las puertas a nuevos mercados._" -#: src/guides/sat-hunting.md:241 +#: src/faq.md:208 msgid "" -"Navigate to the `Settings` tab, then to `Script Policy`, and press the edit " -"button to display the descriptor." +"Bitcoin's market capitalization and liquidity are greater than Ethereum's by a large margin. Much of this liquidity is not available to Ethereum NFTs, since many Bitcoiners " +"prefer not to interact with the Ethereum ecosystem due to concerns related to simplicity, security, and decentralization." msgstr "" -"Haz clic en la pestaña `Settings`, luego en `Script Policy`, y presiona el botón de editar " -"para mostrar el descriptor." +"La valoración de mercado y el flujo de capital en Bitcoin exceden considerablemente a los de Ethereum. Gran parte de esta liquidez no está disponible para los NFT en Ethereum, ya " +"que muchos bitcoiners prefieren no interactuar con el ecosistema de Ethereum debido a las preocupaciones relacionadas con la simplicidad, seguridad y descentralización." -#: src/guides/sat-hunting.md:244 -msgid "Transferring Ordinals" -msgstr "Transferir Ordinals" +#: src/faq.md:213 +msgid "Such Bitcoiners may be more interested in inscriptions than Ethereum NFTs, unlocking new classes of collector." +msgstr "Estos bitcoiners podrían estar más interesados en las inscripciones que en los NFT de Ethereum, abriendo la puerta a otros tipos de coleccionistas." -#: src/guides/sat-hunting.md:246 -msgid "" -"The `ord` wallet supports transferring specific satoshis. You can also use " -"`bitcoin-cli` commands `createrawtransaction`, " -"`signrawtransactionwithwallet`, and `sendrawtransaction`, how to do so is " -"complex and outside the scope of this guide." -msgstr "" -"El monedero `ord` permite la transferencia de satoshis específicos. También " -"puedes usar los comandos `bitcoin-cli` tales como `createrawtransaction`, `signrawtransactionwithwallet` y `sendrawtransaction`, pero hacerlo es complejo y está fuera del alcance de esta guía." +#: src/faq.md:216 +msgid "_Inscriptions have a richer data model._" +msgstr "_Las inscripciones tienen un modelo de datos más robusto._" -#: src/guides/collecting.md:4 +#: src/faq.md:218 msgid "" -"Currently, [ord](https://github.com/ordinals/ord/) is the only wallet " -"supporting sat-control and sat-selection, which are required to safely store " -"and send rare sats and inscriptions, hereafter ordinals." +"Inscriptions consist of a content type, also known as a MIME type, and content, which is an arbitrary byte string. This is the same data model used by the web, and allows " +"inscription content to evolve with the web, and come to support any kind of content supported by web browsers, without requiring changes to the underlying protocol." msgstr "" -"Actualmente, [ord](https://github.com/ordinals/ord/) es el único monedero que " -"tiene la funcionalidad de control de sat (sat-control) y selección de sat (sat-selection), funciones indispensables para almacenar y enviar de forma segura sats raros e inscripciones, ahora conocidos como ordinals." +"Una inscripción consiste en un tipo de contenido, conocido como tipo MIME, acompañado por una cadena (string) de bytes que representa su contenido. Este modelo de datos es el " +"mismo utilizado en la web, lo que permite que el contenido de la inscripción evolucione junto con la web y pueda admitir cualquier tipo de contenido compatible con los " +"navegadores web, sin necesidad de modificar el protocolo subyacente." -#: src/guides/collecting.md:8 -msgid "" -"The recommended way to send, receive, and store ordinals is with `ord`, but " -"if you are careful, it is possible to safely store, and in some cases send, " -"ordinals with other wallets." +#: src/faq.md:224 +msgid "RGB and Taro assets?" +msgstr "¿Activos de RGB y Taro?" + +#: src/faq.md:226 +msgid "RGB and Taro are both second-layer asset protocols built on Bitcoin. Compared to inscriptions, they are much more complicated, but much more featureful." msgstr "" -"La manera sugerida de enviar, recibir y guardar ordinals es utilizando `ord`, pero si se tiene cuidado, es posible almacenar de forma segura, y en ciertas circunstancias enviar, ordinals utilizando otros monederos." +"RGB y Taro son protocolos de activos construidos en una capa segundaria sobre Bitcoin. En comparación con las inscripciones, son mucho más complicados, pero con muchas más " +"funcionalidades." -#: src/guides/collecting.md:12 +#: src/faq.md:229 msgid "" -"As a general note, receiving ordinals in an unsupported wallet is not " -"dangerous. Ordinals can be sent to any bitcoin address, and are safe as long " -"as the UTXO that contains them is not spent. However, if that wallet is then " -"used to send bitcoin, it may select the UTXO containing the ordinal as an " -"input, and send the inscription or spend it to fees." +"Ordinal theory has been designed from the ground up for digital artifacts, whereas the primary use-case of RGB and Taro are fungible tokens, so the user experience for " +"inscriptions is likely to be simpler and more polished than the user experience for RGB and Taro NFTs." msgstr "" -"En términos generales, recibir ordinals en un monedero no compatible no es peligroso. " -"Los ordinals se pueden enviar a cualquier dirección de bitcoin, y son seguros siempre y " -"cuando el UTXO que los contiene no se gaste. Sin embargo, si luego se utiliza ese monedero " -"para enviar bitcoin, puede seleccionar el UTXO que contiene el ordinal como una entrada y por error enviar la inscripción o gastarlo en comisiones." +"La teoría ordinal ha sido desarrollada específicamente para artefactos digitales desde cero, mientras que RGB y Taro se enfocan en tokens fungibles. Por lo tanto, la experiencia " +"del usuario con las inscripciones probablemente sea más simple y refinada en comparación con el uso de NFTs de RGB y Taro." -#: src/guides/collecting.md:18 +#: src/faq.md:234 msgid "" -"A [guide](./collecting/sparrow-wallet.md) to creating an `ord`\\-compatible " -"wallet with [Sparrow Wallet](https://sparrowwallet.com/), is available in " -"this handbook." +"RGB and Taro both store content off-chain, which requires additional infrastructure, and which may be lost. By contrast, inscription content is stored on-chain, and cannot be " +"lost." msgstr "" -"Hay una [guía](https://docs.ordinals.com/guides/collecting/sparrow-wallet.html) " -"disponible en este manual para crear un monedero compatible con `ord` usando el [Monedero Sparrow](https://sparrowwallet.com/)" +"RGB y Taro almacenan contenido fuera de la cadena, lo que implica depender de una infraestructura adicional que podría perderse. Por el contrario, el contenido de las " +"inscripciones se guarda en la cadena y no corre el riesgo de perderse." -#: src/guides/collecting.md:21 +#: src/faq.md:238 msgid "" -"Please note that if you follow this guide, you should not use the wallet you " -"create to send BTC, unless you perform manual coin-selection to avoid " -"sending ordinals." +"Ordinal theory, RGB, and Taro are all very early, so this is speculation, but ordinal theory's focus may give it the edge in terms of features for digital artifacts, including a " +"better content model, and features like globally unique symbols." msgstr "" -"Ten presente que, si decides seguir esta guía, no deberías utilizar el monedero que creaste para enviar BTC, a menos que realices una selección manual de monedas para evitar enviar ordinals por error." +"La teoría ordinal, RGB y Taro están en sus primeras etapas, por lo que todo esto es especulativo, pero el enfoque de la teoría ordinal podría darle la ventaja en términos de " +"funcionalidad para artefactos digitales, incluyendo un mejor modelo de contenido y características como símbolos globalmente únicos." -#: src/guides/collecting/sparrow-wallet.md:1 -msgid "Collecting Inscriptions and Ordinals with Sparrow Wallet" -msgstr "Coleccionando Inscripciones y Ordinals con Sparrow" +#: src/faq.md:243 +msgid "Counterparty assets?" +msgstr "¿Activos de Counterparty?" -#: src/guides/collecting/sparrow-wallet.md:4 +#: src/faq.md:245 msgid "" -"Users who cannot or have not yet set up the " -"[ord](https://github.com/ordinals/ord) wallet can receive inscriptions and " -"ordinals with alternative bitcoin wallets, as long as they are _very_ " -"careful about how they spend from that wallet." +"Counterparty has its own token, XCP, which is required for some functionality, which makes most bitcoiners regard it as an altcoin, and not an extension or second layer for " +"bitcoin." msgstr "" -"Los usuarios que no pueden o no han configurado aún el monedero [ord](https://github.com/ordinals/ord) pueden " -"recibir inscripciones y ordinals usando monederos alternativos de bitcoin, siempre y cuando sean _muy_ cautelosos a la hora de realizar gastos desde ese monedero." +"Counterparty tiene su propio token, XCP, que es necesario para algunas funcionalidades, lo que hace que la mayoría de los bitcoiners lo consideren como una altcoin, y no como una " +"extensión o segunda capa de bitcoin." -#: src/guides/collecting/sparrow-wallet.md:6 -msgid "" -"This guide gives some basic steps on how to create a wallet with [Sparrow " -"Wallet](https://sparrowwallet.com/) which is compatible with `ord` and can " -"be later imported into `ord`" +#: src/faq.md:249 +msgid "Ordinal theory has been designed from the ground up for digital artifacts, whereas Counterparty was primarily designed for financial token issuance." msgstr "" -"Esta guía ofrece instrucciones básicas para crear un monedero con [Sparrow Wallet](https://sparrowwallet.com/) el cual es compatible con `ord` y podrá ser importado a `ord` en un futuro." +"La teoría ordinal fue diseñada específicamente para tratar con artefactos digitales, a diferencia de Counterparty, que se diseñó principalmente enfocado en la emisión de tokens " +"financieros." -#: src/guides/collecting/sparrow-wallet.md:8 -msgid "⚠️⚠️ Warning!! ⚠️⚠️" -msgstr "⚠️⚠️ ¡¡Advertencia!! ⚠️⚠️" +#: src/faq.md:252 +msgid "Inscriptions for…" +msgstr "Inscripciones para…" -#: src/guides/collecting/sparrow-wallet.md:9 -msgid "" -"As a general rule if you take this approach, you should use this wallet with " -"the Sparrow software as a receive-only wallet." -msgstr "" -"Como regla general, si tomas este enfoque, debes usar este monedero con el " -"software Sparrow solo como un monedero para recibir." +#: src/faq.md:255 +msgid "Artists" +msgstr "Artistas" -#: src/guides/collecting/sparrow-wallet.md:11 +#: src/faq.md:257 msgid "" -"Do not spend any satoshis from this wallet unless you are sure you know what " -"you are doing. You could very easily inadvertently lose access to your " -"ordinals and inscriptions if you don't heed this warning." +"_Inscriptions are on Bitcoin._ Bitcoin is the digital currency with the highest status and greatest chance of long-term survival. If you want to guarantee that your art survives " +"into the future, there is no better way to publish it than as inscriptions." msgstr "" -"No gastes ningún satoshi de este monedero a menos que estés seguro de lo " -"que estás haciendo. Podrías perder fácilmente el acceso a tus ordinals e inscripciones si no haces caso a esta advertencia." +"_Las inscripciones están en Bitcoin_. Bitcoin es la moneda digital con el mayor prestigio y la mayor probabilidad de supervivencia a largo plazo. Si deseas garantizar que tu arte " +"perdure en el futuro, no hay mejor forma de publicarlo que mediante inscripciones." -#: src/guides/collecting/sparrow-wallet.md:13 -msgid "Wallet Setup & Receiving" -msgstr "Configuración del Monedero y Recibir" +#: src/faq.md:262 +msgid "_Cheaper on-chain storage._ At $20,000 per BTC and the minimum relay fee of 1 satoshi per vbyte, publishing inscription content costs $50 per 1 million bytes." +msgstr "" +"_Almacenamiento en cadena es menos costoso_. A $20,000 por BTC y una comisión mínima de 1 satoshi por vbyte, el costo de publicar contenido en una inscripción es de $50 por 1 " +"millón de bytes." -#: src/guides/collecting/sparrow-wallet.md:15 +#: src/faq.md:266 msgid "" -"Download the Sparrow Wallet from the [releases " -"page](https://sparrowwallet.com/download/) for your particular operating " -"system." -msgstr "Descarga Sparrow Wallet [desde la página de descargas](https://sparrowwallet.com/download/) para tu sistema operativo específico." +"_Inscriptions are early!_ Inscriptions are still in development, and have not yet launched on mainnet. This gives you an opportunity to be an early adopter, and explore the " +"medium as it evolves." +msgstr "" +"_¡Las inscripciones están en sus inicios!_ Las inscripciones todavía están en desarrollo y aún no se han lanzado en la red principal. Esto te brinda la oportunidad de ser un " +"pionero y explorar el medio a medida que evoluciona." -#: src/guides/collecting/sparrow-wallet.md:17 -msgid "Select `File -> New Wallet` and create a new wallet called `ord`." -msgstr "Selecciona `File -> New Wallet` y crea un nuevo monedero llamada `ord`." +#: src/faq.md:270 +msgid "_Inscriptions are simple._ Inscriptions do not require writing or understanding smart contracts." +msgstr "_Las inscripciones son simples_. No es necesario escribir ni comprender contratos inteligentes." -#: src/guides/collecting/sparrow-wallet.md:19 -msgid "![](images/wallet_setup_01.png)" -msgstr "![](images/wallet_setup_01.png)" +#: src/faq.md:273 +msgid "_Inscriptions unlock new liquidity._ Inscriptions are more accessible and appealing to bitcoin holders, unlocking an entirely new class of collector." +msgstr "" +"_Las inscripciones abren las puertas a nuevas fuentes de liquidez_. Las inscripciones resultan más accesibles y atractivas para los poseedores de bitcoin, dando paso a una clase " +"completamente nueva de coleccionistas." -#: src/guides/collecting/sparrow-wallet.md:21 +#: src/faq.md:276 msgid "" -"Change the `Script Type` to `Taproot (P2TR)` and select the `New or Imported " -"Software Wallet` option." -msgstr "Cambia el `Script Type` (Tipo de script) a `Taproot (P2TR)` y selecciona la opción `New or Imported Software Wallet`." - -#: src/guides/collecting/sparrow-wallet.md:23 -msgid "![](images/wallet_setup_02.png)" -msgstr "![](images/wallet_setup_02.png)" +"_Inscriptions are designed for digital artifacts._ Inscriptions are designed from the ground up to support NFTs, and feature a better data model, and features like globally " +"unique symbols and enhanced provenance." +msgstr "" +"_Las inscripciones están diseñadas para los artefactos digitales_. Se diseñan desde cero enfocándose en los NFTs y ofrecen un modelo de datos superior, con características como " +"símbolos globalmente únicos y una procedencia mejorada." -#: src/guides/collecting/sparrow-wallet.md:25 +#: src/faq.md:280 msgid "" -"Select `Use 12 Words` and then click `Generate New`. Leave the passphrase " -"blank." -msgstr "Selecciona `Use 12 Words` (Utilizar 12 palabras) y luego haz clic en `Generate New` (Generar nueva). Deja passphrase (Frase de contraseña) en blanco." +"_Inscriptions do not support on-chain royalties._ This is negative, but only depending on how you look at it. On-chain royalties have been a boon for creators, but have also " +"created a huge amount of confusion in the Ethereum NFT ecosystem. The ecosystem now grapples with this issue, and is engaged in a race to the bottom, towards a royalties-optional " +"future. Inscriptions have no support for on-chain royalties, because they are technically infeasible. If you choose to create inscriptions, there are many ways you can work " +"around this limitation: withhold a portion of your inscriptions for future sale, to benefit from future appreciation, or perhaps offer perks for users who respect optional " +"royalties." +msgstr "" +"_Las inscripciones no admiten regalías en cadena_. Esto puede verse como algo negativo, pero realmente depende de la perspectiva de cada uno. Si bien las regalías en cadena han " +"beneficiado enormemente a los creadores, también han generado una gran cantidad de confusión en el ecosistema NFT de Ethereum. En este momento, el ecosistema está lidiando con " +"este problema, encaminándose hacia un futuro donde las regalías serán opcionales. Las inscripciones no admiten regalías en cadena debido a que técnica y prácticamente no son " +"viables. Sin embargo, si decides crear inscripciones, existen varias estrategias para superar esta restricción: puedes retener una porción de tus inscripciones para futuras " +"ventas, aprovechando así la valorización que puedan tener con el tiempo; o incluso ofrecer incentivos a los usuarios que opten por respetar las regalías opcionales." -#: src/guides/collecting/sparrow-wallet.md:27 -msgid "![](images/wallet_setup_03.png)" -msgstr "![](images/wallet_setup_03.png)" +#: src/faq.md:291 +msgid "Collectors" +msgstr "Coleccionistas" -#: src/guides/collecting/sparrow-wallet.md:29 -msgid "" -"A new 12 word BIP39 seed phrase will be generated for you. Write this down " -"somewhere safe as this is your backup to get access to your wallet. NEVER " -"share or show this seed phrase to anyone else." +#: src/faq.md:293 +msgid "_Inscriptions are simple, clear, and have no surprises._ They are always immutable and on-chain, with no special due diligence required." msgstr "" -"Se generará tu nueva frase semilla BIP39 de 12 palabras. Anota esto en un lugar seguro, ya que será tu respaldo para acceder a tu monedero. NUNCA compartas ni muestres esta frase semilla a nadie." +"_Las inscripciones son sencillas, claras y sin sorpresas inesperadas_. Son siempre inmutables y residen en la cadena de Bitcoin, lo que elimina la necesidad de gestiones " +"adicionales." -#: src/guides/collecting/sparrow-wallet.md:31 -msgid "Once you have written down the seed phrase click `Confirm Backup`." -msgstr "Una vez que hayas anotado la frase semilla, haz clic en `Confirm Backup` (Confirmar copia de seguridad)." +#: src/faq.md:296 +msgid "_Inscriptions are on Bitcoin._ You can verify the location and properties of inscriptions easily with Bitcoin full node that you control." +msgstr "_Las inscripciones están en Bitcoin_. Puedes verificar fácilmente la ubicación y propiedades de las inscripciones con un nodo de Bitcoin que tu controlas." -#: src/guides/collecting/sparrow-wallet.md:33 -msgid "![](images/wallet_setup_04.png)" -msgstr "![](images/wallet_setup_04.png)" +#: src/faq.md:299 +msgid "Bitcoiners" +msgstr "Bitcoiners" -#: src/guides/collecting/sparrow-wallet.md:35 +#: src/faq.md:301 msgid "" -"Re-enter the seed phrase which you wrote down, and then click `Create " -"Keystore`." -msgstr "Ingresa la frase que anotaste y luego haz clic en` Create Keystore`." - -#: src/guides/collecting/sparrow-wallet.md:37 -msgid "![](images/wallet_setup_05.png)" -msgstr "![](images/wallet_setup_05.png)" - -#: src/guides/collecting/sparrow-wallet.md:39 -msgid "Click `Import Keystore`." -msgstr "Haz clic en `Import Keystore` (almacenamiento de llaves)." - -#: src/guides/collecting/sparrow-wallet.md:41 -msgid "![](images/wallet_setup_06.png)" -msgstr "![](images/wallet_setup_06.png)" - -#: src/guides/collecting/sparrow-wallet.md:43 -msgid "Click `Apply`. Add a password for the wallet if you want to." -msgstr "Haz clic en `Apply` (aplicar). Luego, agrega una contraseña al monedero si deseas" - -#: src/guides/collecting/sparrow-wallet.md:45 -msgid "![](images/wallet_setup_07.png)" -msgstr "![](images/wallet_setup_07.png)" +"Let me begin this section by saying: the most important thing that the Bitcoin network does is decentralize money. All other use-cases are secondary, including ordinal theory. " +"The developers of ordinal theory understand and acknowledge this, and believe that ordinal theory helps, at least in a small way, Bitcoin's primary mission." +msgstr "" +"Permíteme iniciar esta sección señalando que: la principal función de la red de Bitcoin es la descentralización del dinero. Todos los otros usos que se le pueden dar son " +"secundarios, y eso incluye a la teoría ordinal. Los desarrolladores detrás de esta teoría comprenden muy bien este aspecto y consideran que su trabajo contribuye, aunque sea " +"mínimamente, a la misión principal de Bitcoin." -#: src/guides/collecting/sparrow-wallet.md:47 +#: src/faq.md:307 msgid "" -"You now have a wallet which is compatible with `ord`, and can be imported " -"into `ord` using the BIP39 Seed Phrase. To receive ordinals or inscriptions, " -"click on the `Receive` tab and copy a new address." +"Unlike many other things in the altcoin space, digital artifacts have merit. There are, of course, a great deal of NFTs that are ugly, stupid, and fraudulent. However, there are " +"many that are fantastically creative, and creating and collecting art has been a part of the human story since its inception, and predates even trade and money, which are also " +"ancient technologies." msgstr "" -"Ahora tienes un monedero que es compatible con `ord` y que puede ser importado " -"a `ord` utilizando la frase semilla BIP39. Para recibir ordinals o inscripciones, dirígete a la pestaña `Receive` (Recibir) y copia una nueva dirección." +"A diferencia de muchas otras cosas en el espacio altcoin, los artefactos digitales tienen mérito propio. Es verdad que hay una gran cantidad de NFTs que son feos, estúpidos o " +"fraudulentos. Sin embargo, también hay muchos que sobresalen por su increíble creatividad. La creación y colección de arte ha sido parte fundamental de la historia humana desde " +"tiempos antiguos, incluso antes del surgimiento del comercio y el dinero, que son tecnologías ancestrales también." -#: src/guides/collecting/sparrow-wallet.md:49 +#: src/faq.md:314 msgid "" -"Each time you want to receive you should use a brand-new address, and not " -"re-use existing addresses." +"Bitcoin provides an amazing platform for creating and collecting digital artifacts in a secure, decentralized way, that protects users and artists in the same way that it " +"provides an amazing platform for sending and receiving value, and for all the same reasons." msgstr "" -"Cada vez que quieras recibir, deberías usar una dirección completamente nueva y no reutilizar direcciones existentes." +"Bitcoin ofrece una plataforma increíble para la creación y colección de artefactos digitales de manera segura y descentralizada, protegiendo tanto a usuarios como a artistas, al " +"igual que facilita una plataforma confiable para transmitir y recibir valor." -#: src/guides/collecting/sparrow-wallet.md:51 +#: src/faq.md:319 msgid "" -"Note that bitcoin is different to some other blockchain wallets, in that " -"this wallet can generate an unlimited number of new addresses. You can " -"generate a new address by clicking on the `Get Next Address` button. You can " -"see all of your addresses in the `Addresses` tab of the app." +"Ordinals and inscriptions increase demand for Bitcoin block space, which increase Bitcoin's security budget, which is vital for safeguarding Bitcoin's transition to a fee-" +"dependent security model, as the block subsidy is halved into insignificance." msgstr "" -"Ten en cuenta que bitcoin es diferente a algunos otros monederos de blockchain, " -"en el sentido de que el monedero de bitcoin puede generar un número ilimitado de " -"direcciones nuevas. Puedes generar una dirección nueva haciendo clic en el botón `Get Next Address` (Obtener la próxima dirección). Puedes ver todas tus direcciones en la pestaña `Addresses` (Direcciones)." +"Los Ordinals y las inscripciones aumentan la demanda de espacio en los bloques de Bitcoin, lo que aumenta el presupuesto de seguridad de Bitcoin esto es vital para salvaguardar " +"la transición de Bitcoin a un modelo de seguridad dependiente de comisiones, a medida que el subsidio de bloque se reduce a una cantidad insignificante." -#: src/guides/collecting/sparrow-wallet.md:53 +#: src/faq.md:324 msgid "" -"You can add a label to each address, so you can keep track of what it was " -"used for." +"Inscription content is stored on-chain, and thus the demand for block space for use in inscriptions is unlimited. This creates a buyer of last resort for _all_ Bitcoin block " +"space. This will help support a robust fee market, which ensures that Bitcoin remains secure." msgstr "" -"Puedes asignar una etiqueta a cada dirección, permitiéndote llevar un seguimiento de su propósito o uso." +"El contenido de la inscripción se guarda en la cadena de bloques de Bitcoin y, debido a esto, la necesidad de espacio en los bloques para alojar inscripciones es ilimitada. Esta " +"dinámica establece una demanda constante por el espacio disponible en los bloques de Bitcoin, favoreciendo la sustentación de un mercado de comisiones saludable, lo que a su vez " +"contribuye a preservar la seguridad de Bitcoin." -#: src/guides/collecting/sparrow-wallet.md:55 -msgid "![](images/wallet_setup_08.png)" -msgstr "![](images/wallet_setup_08.png)" +#: src/faq.md:329 +msgid "" +"Inscriptions also counter the narrative that Bitcoin cannot be extended or used for new use-cases. If you follow projects like DLCs, Fedimint, Lightning, Taro, and RGB, you know " +"that this narrative is false, but inscriptions provide a counter argument which is easy to understand, and which targets a popular and proven use case, NFTs, which makes it " +"highly legible." +msgstr "" +"Las inscripciones también desafían la narrativa de que Bitcoin no puede expandirse o ser utilizado para nuevos casos de uso. Si estás al tanto de proyectos como DLCs, Fedimint, " +"Lightning, Taro y RGB, sabrás que esta narrativa es incorrecta. Las inscripciones ofrecen un contraargumento claro y fácil de entender, apuntando a un caso de uso popular y " +"probado como son los NFTs, lo cual las hace muy atractivas." -#: src/guides/collecting/sparrow-wallet.md:57 -msgid "Validating / Viewing Received Inscriptions" -msgstr "Validando / Viendo Inscripciones Recibidas" +#: src/faq.md:335 +msgid "" +"If inscriptions prove, as the authors hope, to be highly sought after digital artifacts with a rich history, they will serve as a powerful hook for Bitcoin adoption: come for the " +"fun, rich art, stay for the decentralized digital money." +msgstr "" +"Si las inscripciones demuestran ser artefactos digitales muy buscados, como esperan sus creadores, podrían convertirse en un poderoso gancho para la adopción de Bitcoin: las " +"personas podrían ser atraídas inicialmente por el arte divertido, pero se quedarían por el potencial del dinero digital descentralizado." -#: src/guides/collecting/sparrow-wallet.md:59 +#: src/faq.md:339 msgid "" -"Once you have received an inscription you will see a new transaction in the " -"`Transactions` tab of Sparrow, as well as a new UTXO in the `UTXOs` tab." +"Inscriptions are an extremely benign source of demand for block space. Unlike, for example, stablecoins, which potentially give large stablecoin issuers influence over the future " +"of Bitcoin development, or DeFi, which might centralize mining by introducing opportunities for MEV, digital art and collectables on Bitcoin, are unlikely to produce individual " +"entities with enough power to corrupt Bitcoin. Art is decentralized." msgstr "" -"Una vez que hayas recibido una inscripción, podrás observar una nueva transacción en la pestaña `Transactions` (transacciones) de Sparrow, así como un nuevo UTXO en la pestaña `UTXOs`." +"Las inscripciones representan una forma extremadamente benigna de demanda de espacio en el bloque. A diferencia de las stablecoins, por ejemplo, que pueden otorgar a los emisores " +"un gran poder de influencia sobre el desarrollo futuro de Bitcoin, o DeFi, que podría centralizar la minería al introducir oportunidades para el MEV, el arte digital y los " +"coleccionables en Bitcoin, es poco probable que produzcan entidades individuales con suficiente poder para corromper Bitcoin. El arte es descentralizado." -#: src/guides/collecting/sparrow-wallet.md:61 +#: src/faq.md:346 msgid "" -"Initially this transaction may have an \"Unconfirmed\" status, and you will " -"need to wait for it to be mined into a bitcoin block before it is fully " -"received." +"Inscription users and service providers are incentivized to run Bitcoin full nodes, to publish and track inscriptions, and thus throw their economic weight behind the honest " +"chain." msgstr "" -"Inicialmente, esta transacción puede tener un estado \"Unconfirmed o No confirmado\", y tendrás que esperar a que sea minada en un bloque de bitcoin antes de que la recibas por completo." +"Se les incentiva a los usuarios de inscripciones y a los proveedores de servicios ejecutar nodos de Bitcoin, para publicar y rastrear inscripciones, y así apoyar respaldar la " +"cadena." -#: src/guides/collecting/sparrow-wallet.md:63 -msgid "![](images/validating_viewing_01.png)" -msgstr "![](images/validating_viewing_01.png)" +#: src/faq.md:350 +msgid "Ordinal theory and inscriptions do not meaningfully affect Bitcoin's fungibility. Bitcoin users can ignore both and be unaffected." +msgstr "" +"La teoría ordinal y las inscripciones no afectan en alguna escala significante la fungibilidad de Bitcoin. Los usuarios de Bitcoin pueden ignorar ambos y no verse afectados." -#: src/guides/collecting/sparrow-wallet.md:65 +#: src/faq.md:353 msgid "" -"To track the status of your transaction you can right-click on it, select " -"`Copy Transaction ID` and then paste that transaction id into " -"[mempool.space](https://mempool.space)." +"We hope that ordinal theory strengthens and enriches bitcoin, and gives it another dimension of appeal and functionality, enabling it more effectively serve its primary use case " +"as humanity's decentralized store of value." msgstr "" -"Para rastrear el estado de tu transacción, puedes hacer clic derecho sobre ella, seleccionar `Copy Transaction ID` (Copiar ID de Transacción) y luego pegar ese ID en el buscador de [mempool.space](https://mempool.space/)." +"Esperamos que la teoría ordinal fortalezca y enriquezca a bitcoin, y le dé otra dimensión de atractividad y funcionalidad, permitiéndole servir de manera más efectiva a su caso " +"de uso principal como el almacenamiento descentralizado de valor de para la humanidad." -#: src/guides/collecting/sparrow-wallet.md:67 -msgid "![](images/validating_viewing_02.png)" -msgstr "![](images/validating_viewing_02.png)" +#: src/contributing.md:1 +msgid "Contributing to `ord`" +msgstr "Contribuir a `ord`" -#: src/guides/collecting/sparrow-wallet.md:69 +#: src/contributing.md:4 +msgid "Suggested Steps" +msgstr "Pasos Sugeridos" + +#: src/contributing.md:7 +msgid "Find an issue you want to work on." +msgstr "Encuentra un problema en el que quieras trabajar." + +#: src/contributing.md:8 msgid "" -"Once the transaction has confirmed, you can validate and view your " -"inscription by heading over to the `UTXOs` tab, finding the UTXO you want to " -"check, right-clicking on the `Output` and selecting `Copy Transaction " -"Output`. This transaction output id can then be pasted into the " -"[ordinals.com](https://ordinals.com) search." +"Figure out what would be a good first step towards resolving the issue. This could be in the form of code, research, a proposal, or suggesting that it be closed, if it's out of " +"date or not a good idea in the first place." msgstr "" -"Una vez que la transacción se confirme, puedes validar y visualizar tu inscripción dirigiéndote a la pestaña de " -"`UTXOs`, encuentra el UTXO que deseas verificar, y haz clic derecho sobre `Output` (Salida) y selecciona " -"`Copy Transaction Output` (Copiar Salida de Transacción). Puedes pegar este ID de salida de transacción en el buscador de [ordinals.com](https://ordinals.com/) para proceder con la verificación." +"Determina cuál debería ser el primer paso para abordar el problema. Esto podría involucrar código, investigación, la elaboración de una propuesta o incluso sugerir su cierre si " +"está desactualizado o evaluar si es una buena idea desde un inicio." -#: src/guides/collecting/sparrow-wallet.md:72 -msgid "Freezing UTXO's" -msgstr "Congelar UTXO's" +#: src/contributing.md:11 +msgid "" +"Comment on the issue with an outline of your suggested first step, and asking for feedback. Of course, you can dive in and start writing code or tests immediately, but this " +"avoids potentially wasted effort, if the issue is out of date, not clearly specified, blocked on something else, or otherwise not ready to implement." +msgstr "" +"Comenta sobre el problema con un esquema de tu primer paso sugerido y pide opiniones. Podrías comenzar a escribir código o hacer pruebas de inmediato, pero esto evita que se haga " +"un esfuerzo potencialmente desperdiciado." -#: src/guides/collecting/sparrow-wallet.md:73 +#: src/contributing.md:16 msgid "" -"As explained above, each of your inscriptions is stored in an Unspent " -"Transaction Output (UTXO). You want to be very careful not to accidentally " -"spend your inscriptions, and one way to make it harder for this to happen is " -"to freeze the UTXO." +"If the issue requires a code change or bugfix, open a draft PR with tests, and ask for feedback. This makes sure that everyone is on the same page about what needs to be done, or " +"what the first step in solving the issue should be. Also, since tests are required, writing the tests first makes it easy to confirm that the change can be tested easily." msgstr "" -"Como se explicó anteriormente, cada una de tus inscripciones está almacenada en " -"una Salida de Transacción No Gastado (UTXO). Debes tener mucho cuidado de no gastar accidentalmente tus inscripciones. Una manera de prevenir esto es congelar el UTXO correspondiente." +"Si el problema requiere un cambio de código o corrección de bugs, abre un PR preliminar con pruebas y pide sugerencias. Esto asegura que todos estende acuerdo acerca de lo que se " +"debe de hacer, o el primer paso en solucionar elproblema. Como se requieren pruebas escribirlas y probarlas confirma que se pueden llevar a cabo fácilmente." -#: src/guides/collecting/sparrow-wallet.md:75 +#: src/contributing.md:21 +msgid "Mash the keyboard randomly until the tests pass, and refactor until the code is ready to submit." +msgstr "Escribe código hasta que las pruebas pasen y refactorizar hasta que el código esté listo para enviar." + +#: src/contributing.md:23 +msgid "Mark the PR as ready to review." +msgstr "Marca el PR como listo para revisar." + +#: src/contributing.md:24 +msgid "Revise the PR as needed." +msgstr "Revisa el PR según sea necesario." + +#: src/contributing.md:25 +msgid "And finally, mergies!" +msgstr "¡Por último, fusiónalo!" + +#: src/contributing.md:27 +msgid "Start small" +msgstr "Comienza por las cosas pequeñas" + +#: src/contributing.md:30 +msgid "Small changes will allow you to make an impact quickly, and if you take the wrong tack, you won't have wasted much time." +msgstr "Los cambios pequeños te permitirán tener un impacto rápidamente, y si eliges el enfoque equivocado, no habrás perdido mucho tiempo." + +#: src/contributing.md:33 +msgid "Ideas for small issues:" +msgstr "Ideas para problemas pequeños:" + +#: src/contributing.md:34 +msgid "Add a new test or test case that increases test coverage" +msgstr "Añadir una prueba nueva o un caso de prueba que amplíe la cobertura de las pruebas" + +#: src/contributing.md:35 +msgid "Add or improve documentation" +msgstr "Mejorar o añadir a la documentación existente" + +#: src/contributing.md:36 +msgid "Find an issue that needs more research, and do that research and summarize it in a comment" +msgstr "Identificar un problema que requiera más investigación, realizarla y resumir los hallazgos en un comentario" + +#: src/contributing.md:38 +msgid "Find an out-of-date issue and comment that it can be closed" +msgstr "Encontrar un problema que ha quedado desactualizado y sugerir su cierre a través de un comentario" + +#: src/contributing.md:39 +msgid "Find an issue that shouldn't be done, and provide constructive feedback detailing why you think that is the case" +msgstr "Encuentra un caso que no consideras un problema y proporciona tu opinión explicando por qué crees que ese el caso" + +#: src/contributing.md:42 +msgid "Merge early and often" +msgstr "Fusiona pronto y a menudo" + +#: src/contributing.md:45 msgid "" -"To do this, go to the `UTXOs` tab, find the UTXO you want to freeze, " -"right-click on the `Output` and select `Freeze UTXO`." +"Break up large tasks into multiple smaller steps that individually make progress. If there's a bug, you can open a PR that adds a failing ignored test. This can be merged, and " +"the next step can be to fix the bug and unignore the test. Do research or testing, and report on your results. Break a feature into small sub-features, and implement them one at " +"a time." msgstr "" -"Para hacerlo, ve a la pestaña `UTXOs`, encuentra el UTXO que deseas congelar, haz clic derecho en `Output` y selecciona `Frreeze UTXO` (Congelar UTXO)." +"Divide las tareas grandes en partes con las cuales se puede progresar por separado. Si hay un error, puedes abrir un PR que agregue una prueba fallida ignorada. Esto se puede " +"fusionar, y el siguiente paso puede ser corregir el error y desactivar la prueba. Realiza investigaciones o pruebas y reporta tus resultados. Divide una característica en " +"subcategorías pequeñas e impleméntalas una a la vez." -#: src/guides/collecting/sparrow-wallet.md:77 +#: src/contributing.md:51 msgid "" -"This UTXO (Inscription) is now un-spendable within the Sparrow Wallet until " -"you unfreeze it." +"Figuring out how to break down a larger PR into smaller PRs where each can be merged is an art form well-worth practicing. The hard part is that each PR must itself be an " +"improvement." msgstr "" -"Este UTXO (Inscripción) no se podrá gastar dentro del Monedero Sparrow hasta que lo descongeles." +"Descomponer un PR grande en PRs más pequeños que puedan fusionarse individualmente es un arte que vale la pena practicar. El desafío radica en asegurar que cada PR represente una " +"mejora por sí mismo." -#: src/guides/collecting/sparrow-wallet.md:79 -msgid "Importing into `ord` wallet" -msgstr "Importando al monedero `ord`" +#: src/contributing.md:55 +msgid "I strive to follow this advice myself, and am always better off when I do." +msgstr "Me esfuerzo por aplicar este consejo yo mismo, y siempre obtengo beneficios cuando lo hago." -#: src/guides/collecting/sparrow-wallet.md:81 +#: src/contributing.md:57 msgid "" -"For details on setting up Bitcoin Core and the `ord` wallet check out the " -"[Inscriptions Guide](../inscriptions.md)" +"Small changes are fast to write, review, and merge, which is much more fun than laboring over a single giant PR that takes forever to write, review, and merge. Small changes " +"don't take much time, so if you need to stop working on a small change, you won't have wasted much time as compared to a larger change that represents many hours of work. Getting " +"a PR in quickly improves the project a little bit immediately, instead of having to wait a long time for larger improvement. Small changes are less likely to accumulate merge " +"conflict. As the Athenians said: _The fast commit what they will, the slow merge what they must._" msgstr "" -"Para detalles sobre configurar Bitcoin Core y el monedero ord, revisa la " -"[Guía de Inscripciones Ordinal](../inscriptions.md)." +"Los cambios pequeños son rápidos de escribir, revisar y fusionar, lo que es mucho más divertido que trabajar en un solo PR gigante que tarda una eternidad en escribirse, " +"revisarse y fusionarse. Los cambios pequeños no toman mucho tiempo, así que, si necesitas dejar de trabajar en un cambio pequeño, no habrás perdido mucho tiempo a comparación de " +"un cambio más grande en las que se invirtieron muchas horas de trabajo. Conseguir que un PR se fusione rápidamente mejora el proyecto de inmediato, en lugar de tener que esperar " +"mucho tiempo para una mejora más grande. Los cambios pequeños tienen menos probabilidades de acumular conflictos de fusión. _Como decían los atenienses: _Los rápidos hacen lo que " +"quieren, los lentos hacen lo que deben._" -#: src/guides/collecting/sparrow-wallet.md:83 +#: src/contributing.md:67 +msgid "Get help" +msgstr "Busca ayuda" + +#: src/contributing.md:70 +msgid "If you're stuck for more than 15 minutes, ask for help, like a Rust Discord, Stack Exchange, or in a project issue or discussion." +msgstr "Si te ves atascado por más de 15 minutos, busca ayuda en espacios como el Discord de Rust, en Stack Exchange, o en una discusión sobre el problema dentro del proyecto." + +#: src/contributing.md:73 +msgid "Practice hypothesis-driven debugging" +msgstr "Practica la depuración basada en hipótesis" + +#: src/contributing.md:76 msgid "" -"When setting up `ord`, instead of running `ord wallet create` to create a " -"brand-new wallet, you can import your existing wallet using `ord wallet " -"restore \"BIP39 SEED PHRASE\"` using the seed phrase you generated with " -"Sparrow Wallet." +"Formulate a hypothesis as to what is causing the problem. Figure out how to test that hypothesis. Perform that tests. If it works, great, you fixed the issue or now you know how " +"to fix the issue. If not, repeat with a new hypothesis." msgstr "" -"Cuando configures `ord`, en lugar de ejecutar` ord wallet create` para " -"crear un nuevo monedero, puedes importar tu monedero existente usando " -"`ord wallet restore \"BIP39 SEED PHRASE\"` con la frase semilla que generaste " -"en el monedero Sparrow." +"Formula una hipótesis sobre la causa del problema. Define cómo podrías verificar esa hipótesis. Ejecuta las pruebas correspondientes. Si funciona, genial, has solucionado el " +"problema o, al menos, ahora sabes cómo hacerlo. Si no, vuelve a empezar con una nueva hipótesis." -#: src/guides/collecting/sparrow-wallet.md:85 +#: src/contributing.md:81 +msgid "Pay attention to error messages" +msgstr "Presta atención a los mensajes de error" + +#: src/contributing.md:84 +msgid "Read all error messages and don't tolerate warnings." +msgstr "Lee todos los mensajes de error y no toleres las advertencias." + +#: src/donate.md:4 msgid "" -"There is currently a [bug](https://github.com/ordinals/ord/issues/1589) " -"which causes an imported wallet to not be automatically rescanned against " -"the blockchain. To work around this you will need to manually trigger a " -"rescan using the bitcoin core cli: `bitcoin-cli -rpcwallet=ord " -"rescanblockchain 767430`" +"Ordinals is open-source and community funded. The current lead maintainer of `ord` is [raphjaph](https://github.com/raphjaph/). Raph's work on `ord` is entirely funded by " +"donations. If you can, please consider donating!" msgstr "" -"Actualmente hay un [bug](https://github.com/ordinals/ord/issues/1589) que " -"impide que un monedero importado no se escanee automáticamente para encontrar " -"su contenido en la blockchain. Para solucionar esto tendrás que ejecutar " -"manualmente un escaneo usando el cli de bitcoin core: `bitcoin-cli -rpcwallet=ord rescanblockchain 767430`" +"Ordinals es de código abierto y financiado por la comunidad. El encargado principal de `ord` actualmente es [raphjaph](https://github.com/raphjaph/). El trabajo de Raph en `ord` " +"está financiado íntegramente por donaciones. ¡Si puedes, considera hacer una donación!" -#: src/guides/collecting/sparrow-wallet.md:88 +#: src/donate.md:8 msgid "" -"You can then check your wallet's inscriptions using `ord wallet inscriptions`" +"The donation address for Bitcoin is [bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt](https://mempool.space/address/" +"bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt). The donation address for inscriptions is [bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0](https://" +"mempool.space/address/bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0)." msgstr "" -"Luego puedes revisar las inscripciones de tu monedero usando `ord wallet inscriptions`" +"La dirección de donaciones en Bitcoin es [bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt](https://mempool.space/address/" +"bc1q8kt9pyd6r27k2840l8g5d7zshz3cg9v6rfda0m248lva3ve5072q3sxelt). La dirección de donaciones de inscripciones es [bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0]" +"(https://mempool.space/address/bc1qn3map8m9hmk5jyqdkkwlwvt335g94zvxwd9aql7q3vdkdw9r5eyqvlvec0)." -#: src/guides/collecting/sparrow-wallet.md:90 +#: src/donate.md:11 msgid "" -"Note that if you have previously created a wallet with `ord`, then you will " -"already have a wallet with the default name, and will need to give your " -"imported wallet a different name. You can use the `--wallet` parameter in " -"all `ord` commands to reference a different wallet, eg:" +"Both addresses are in a 2 of 4 multisig wallet with keys held by [raphjaph](https://twitter.com/raphjaph), [erin](https://twitter.com/realizingerin), [rodarmor](https://twitter." +"com/rodarmor), and [ordinally](https://twitter.com/veryordinally)." msgstr "" -"Ten en cuenta que si has creado previamente una cartera con `ord`, ya tendrás " -"una cartera con el nombre predeterminado y tendrás que darle un nombre diferente " -"a tu cartera importada. Puedes usar el parámetro `--wallet` en todos los comandos " -"de `ord` para hacer referencia a un monedero diferente, por ejemplo:" +"Ambas direcciones están en un monedero multisig 2 de 4 con las llaves en manos de [raphjaph](https://twitter.com/raphjaph), [erin](https://twitter.com/realizingerin), [rodarmor]" +"(https://twitter.com/rodarmor) y [ordinally](https://twitter.com/veryordinally)." -#: src/guides/collecting/sparrow-wallet.md:92 -msgid "`ord --wallet ord_from_sparrow wallet restore \"BIP39 SEED PHRASE\"`" -msgstr "`ord --wallet ord_from_sparrow wallet restore \"BIP39 SEED PHRASE\"`" +#: src/donate.md:17 +msgid "Donations received will go towards funding maintenance and development of `ord`, as well as hosting costs for [ordinals.com](https://ordinals.com)." +msgstr "" +"Las donaciones recibidas se utilizarán para financiar el mantenimiento y desarrollo de `ord`, así como para cubrir los costos asociados con el alojamiento de [ordinals.com]" +"( https://ordinals.com/)." -#: src/guides/collecting/sparrow-wallet.md:94 -msgid "`ord --wallet ord_from_sparrow wallet inscriptions`" -msgstr "`ord --wallet ord_from_sparrow wallet inscriptions`" +#: src/donate.md:20 +msgid "Thank you for donating!" +msgstr "¡Gracias por donar!" -#: src/guides/collecting/sparrow-wallet.md:96 -msgid "`bitcoin-cli -rpcwallet=ord_from_sparrow rescanblockchain 767430`" -msgstr "`bitcoin-cli -rpcwallet=ord_from_sparrow rescanblockchain 767430`" +#: src/guides.md:1 +msgid "Ordinal Theory Guides" +msgstr "Guías de la Teoría Ordinal" -#: src/guides/collecting/sparrow-wallet.md:98 -msgid "Sending inscriptions with Sparrow Wallet" -msgstr "Enviar inscripciones con el Monedero Sparrow" +#: src/guides.md:4 +msgid "See the table of contents for a list of guides, including a guide to the explorer, a guide for sat hunters, and a guide to inscriptions." +msgstr "Consulta la tabla de contenido para ver una lista de guías, incluyendo una guía para el explorador, una guía para cazadores de sats y una guía de las inscripciones." -#: src/guides/collecting/sparrow-wallet.md:100 -msgid "⚠️⚠️ Warning ⚠️⚠️" -msgstr "⚠️⚠️ Advertencia ⚠️⚠️" +#: src/guides/explorer.md:1 +msgid "Ordinal Explorer" +msgstr "Explorador Ordinal" -#: src/guides/collecting/sparrow-wallet.md:101 +#: src/guides/explorer.md:4 msgid "" -"While it is highly recommended that you set up a bitcoin core node and run " -"the `ord` software, there are certain limited ways you can send inscriptions " -"out of Sparrow Wallet in a safe way. Please note that this is not " -"recommended, and you should only do this if you fully understand what you " -"are doing." +"The `ord` binary includes a block explorer. We host an instance of the block explorer on mainnet at [ordinals.com](https://ordinals.com), on signet at [signet.ordinals.com]" +"(https://signet.ordinals.com), and on testnet at [testnet.ordinals.com](https://testnet.ordinals.com). As of version 0.16.0 the wallet needs `ord server` running in the " +"background. This is analogous to how `bitcoin-cli` needs `bitcoind` running in the background." msgstr "" -"Aunque es bastante recomendado que configures un nodo de bitcoin core y ejecutes el software `ord`, " -"existen algunas formas limitadas de enviar inscripciones desde el monedero Sparrow de manera segura. " -"Sin embargo, cabe señalar que esta no es la opción más recomendada y solo deberías proceder si entiendes " -"completamente las implicaciones y riesgos de lo que estás haciendo." +"El ejecutable de `ord` incluye un explorador de bloques. Alojamos una instancia del explorador de bloques en mainnet en [ordinals.com](https://ordinals.com), en signet en [signet." +"ordinals.com](https://signet.ordinals.com)." -#: src/guides/collecting/sparrow-wallet.md:103 -msgid "" -"Using the `ord` software will remove much of the complexity we are " -"describing here, as it is able to automatically and safely handle sending " -"inscriptions in an easy way." -msgstr "" -"Usar el software de `ord` eliminará gran parte de la complejidad que estamos " -"describiendo aquí, permitiéndote manejar el envío de inscripciones de forma automática " -"y segura con mayor facilidad." +#: src/guides/explorer.md:11 +msgid "Running The Explorer" +msgstr "Ejecutando El Explorador" -#: src/guides/collecting/sparrow-wallet.md:105 -msgid "⚠️⚠️ Additional Warning ⚠️⚠️" -msgstr "⚠️⚠️ Advertencia Adicional ⚠️⚠️" +#: src/guides/explorer.md:12 +msgid "The server can be run locally with:" +msgstr "El servidor puede ser ejecutado localmente utilizando:" -#: src/guides/collecting/sparrow-wallet.md:106 -msgid "" -"Don't use your sparrow inscriptions wallet to do general sends of " -"non-inscription bitcoin. You can setup a separate wallet in sparrow if you " -"need to do normal bitcoin transactions, and keep your inscriptions wallet " -"separate." -msgstr "" -"No uses tu monedero de inscripciones de Sparrow para hacer envíos de bitcoin que no involucren inscripciones. " -"Puedes configurar un monedero por separado en Sparrow para gestionar tus transacciones regulares de bitcoin, " -"manteniendo así tu monedero de inscripciones aislado." +#: src/guides/explorer.md:14 +msgid "`ord server`" +msgstr "`ord server`" -#: src/guides/collecting/sparrow-wallet.md:108 -msgid "Bitcoin's UTXO model" -msgstr "Modelo UTXO de Bitcoin" +#: src/guides/explorer.md:16 +msgid "To specify a port add the `--http-port` flag:" +msgstr "Para especificar un puerto agrega la bandera (flag) `--http-port`:" -#: src/guides/collecting/sparrow-wallet.md:109 -msgid "" -"Before sending any transaction it's important that you have a good mental " -"model for bitcoin's Unspent Transaction Output (UTXO) system. The way " -"Bitcoin works is fundamentally different to many other blockchains such as " -"Ethereum. In Ethereum generally you have a single address in which you store " -"ETH, and you cannot differentiate between any of the ETH - it is just all a " -"single value of the total amount in that address. Bitcoin works very " -"differently in that we generate a new address in the wallet for each " -"receive, and every time you receive sats to an address in your wallet you " -"are creating a new UTXO. Each UTXO can be seen and managed individually. You " -"can select specific UTXO's which you want to spend, and you can choose not " -"to spend certain UTXO's." -msgstr "" -"Antes de enviar cualquier transacción, es importante que entiendas a profundidad " -"cómo funciona el sistema de Salidas de Transacciones No Gastadas (UTXO) de Bitcoin. " -"La forma en que funciona Bitcoin es fundamentalmente diferente a muchas otras cadenas " -"de bloques, como Ethereum. En Ethereum, generalmente tienes una única dirección en la " -"que almacenas ETH, y no puedes diferenciar entre ninguno de los ETH: simplemente es " -"un valor único del total acumulado en esa dirección. Bitcoin funciona de manera muy diferente, " -"ya que generamos una nueva dirección en el monedero para cada recepción, y cada vez que recibes " -"sats en una dirección de tu monedero estás creando un nuevo UTXO. Cada UTXO se puede ver " -"y gestionar individualmente. Puedes seleccionar específicamente los UTXO que deseas gastar, " -"y puedes elegir no gastar ciertos UTXO." +#: src/guides/explorer.md:18 +msgid "`ord server --http-port 8080`" +msgstr "` ord server --http-port 8080`" -#: src/guides/collecting/sparrow-wallet.md:111 -msgid "" -"Some Bitcoin wallets do not expose this level of detail, and they just show " -"you a single summed up value of all the bitcoin in your wallet. However, " -"when sending inscriptions it is important that you use a wallet like Sparrow " -"which allows for UTXO control." +#: src/guides/explorer.md:20 +msgid "The JSON-API endpoints are enabled by default, to disable them add the `--disable-json-api` flag (see [here](#json-api) for more info):" msgstr "" -"Algunos monederos de Bitcoin no exponen este nivel de detalle y solo te muestran " -"un valor único que suma todo el bitcoin en tu monedero. Sin embargo, al enviar " -"inscripciones, es importante que uses un monedero como Sparrow que permite el control de UTXO." +"Los endpoints de la API de JSON están habilitados por defecto; para desactivarlos, añade la siguiente bandera:`--disable-json-api` (consulta [aquí](#json-api) para más " +"información):" -#: src/guides/collecting/sparrow-wallet.md:113 -msgid "Inspecting your inscription before sending" -msgstr "Inspeccionando tu inscripción antes de enviarla" +#: src/guides/explorer.md:23 +msgid "`ord server --disable-json-api`" +msgstr "`ord server --disable-json-api`" + +#: src/guides/explorer.md:25 +msgid "Search" +msgstr "Búsqueda" + +#: src/guides/explorer.md:28 +msgid "The search box accepts a variety of object representations." +msgstr "El cuadro de búsqueda acepta una variedad de representaciones de objetos." + +#: src/guides/explorer.md:30 +msgid "Blocks" +msgstr "Bloques" + +#: src/guides/explorer.md:32 +msgid "Blocks can be searched by hash, for example, the genesis block:" +msgstr "Los bloques pueden buscarse por hash, por ejemplo, este es el bloque génesis:" + +#: src/guides/explorer.md:34 +msgid "[000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f](https://ordinals.com/search/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f)" +msgstr "[000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f](https://ordinals.com/search/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f)" + +#: src/guides/explorer.md:36 +msgid "Transactions" +msgstr "Transacciones" + +#: src/guides/explorer.md:38 +msgid "Transactions can be searched by hash, for example, the genesis block coinbase transaction:" +msgstr "Las transacciones se pueden buscar por hash, por ejemplo esta es la transacción coinbase del bloque génesis:" + +#: src/guides/explorer.md:41 +msgid "[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b)" +msgstr "[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b)" + +#: src/guides/explorer.md:43 +msgid "Outputs" +msgstr "Salidas" + +#: src/guides/explorer.md:45 +msgid "Transaction outputs can be searched by outpoint, for example, the only output of the genesis block coinbase transaction:" +msgstr "Las salidas de transacciones se pueden buscar por outpoint, por ejemplo, la única salida de la transacción coinbase del bloque génesis:" + +#: src/guides/explorer.md:48 +msgid "[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0)" +msgstr "[4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0](https://ordinals.com/search/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0)" + +#: src/guides/explorer.md:50 +msgid "Sats" +msgstr "Sats" + +#: src/guides/explorer.md:52 +msgid "Sats can be searched by integer, their position within the entire bitcoin supply:" +msgstr "Los sats se pueden buscar por número entero, según su posición dentro de todo el suministro de bitcoin:" + +#: src/guides/explorer.md:55 +msgid "[2099994106992659](https://ordinals.com/search/2099994106992659)" +msgstr "[2099994106992659](https://ordinals.com/search/2099994106992659)" + +#: src/guides/explorer.md:57 +msgid "By decimal, their block and offset within that block:" +msgstr "Por decimal, según su bloque y el desplazamiento dentro de ese bloque:" + +#: src/guides/explorer.md:59 +msgid "[481824.0](https://ordinals.com/search/481824.0)" +msgstr "[481824.0](https://ordinals.com/search/481824.0)" + +#: src/guides/explorer.md:61 +msgid "By degree, their cycle, blocks since the last halving, blocks since the last difficulty adjustment, and offset within their block:" +msgstr "Por grado sexagesimal, según su ciclo, bloques desde el último halving, bloques desde el último ajuste de dificultad y desplazamiento dentro de su bloque:" + +#: src/guides/explorer.md:64 +msgid "[1°0′0″0‴](https://ordinals.com/search/1°0′0″0‴)" +msgstr "[1°0′0″0‴](https://ordinals.com/search/1°0′0″0‴)" + +#: src/guides/explorer.md:66 +msgid "By name, their base 26 representation using the letters \"a\" through \"z\":" +msgstr "Por nombre, su representación en base 26 utilizando las letras de la \"a\" a la \"z\":" + +#: src/guides/explorer.md:68 +msgid "[ahistorical](https://ordinals.com/search/ahistorical)" +msgstr "[ahistorical](https://ordinals.com/search/ahistorical)" + +#: src/guides/explorer.md:70 +msgid "Or by percentile, the percentage of bitcoin's supply that has been or will have been issued when they are mined:" +msgstr "O por percentil, el cual representa el porcentaje del suministro total de bitcoin que ha sido o será emitido una vez sean minados:" + +#: src/guides/explorer.md:73 +msgid "[100%](https://ordinals.com/search/100%)" +msgstr "[100%](https://ordinals.com/search/100%)" + +#: src/guides/explorer.md:75 +msgid "JSON-API" +msgstr "API JASON" + +#: src/guides/explorer.md:78 +msgid "" +"By default the `ord server` gives access to endpoints that return JSON instead of HTML if you set the HTTP `Accept: application/json` header. The structure of these objects " +"closely follows what is shown in the HTML. These endpoints are:" +msgstr "" +"Por defecto, el `ord server` permite acceder a endpoints que devuelven JSON en lugar de HTML si se configura el encabezado HTTP `Accept: application/json`. La estructura de estos " +"objetos es muy similar a la que se muestra en el HTML. Los endpoints disponibles son:" + +#: src/guides/explorer.md:83 +msgid "`/inscription/`" +msgstr "`/inscription/`" + +#: src/guides/explorer.md:84 +msgid "`/inscriptions`" +msgstr "`/inscriptions`" + +#: src/guides/explorer.md:85 +msgid "`/inscriptions/block/`" +msgstr "`/inscriptions/block/`" + +#: src/guides/explorer.md:86 +msgid "`/inscriptions/block//`" +msgstr "`/inscriptions/block//`" + +#: src/guides/explorer.md:87 +msgid "`/inscriptions/`" +msgstr "`/inscriptions/`" + +#: src/guides/explorer.md:88 +msgid "`/inscriptions//`" +msgstr "`/inscriptions//`" + +#: src/guides/explorer.md:89 +msgid "`/output/`" +msgstr "`/output/`" + +#: src/guides/explorer.md:90 +msgid "`/sat/`" +msgstr "`/sat/`" + +#: src/guides/explorer.md:92 +msgid "To get a list of the latest 100 inscriptions you would do:" +msgstr "Para obtener una lista de las 100 inscripciones más recientes, harías lo siguiente:" + +#: src/guides/explorer.md:94 +msgid "" +"```\n" +"curl -s -H \"Accept: application/json\" 'http://0.0.0.0:80/inscriptions'\n" +"```" +msgstr "" +"```\n" +"curl -s -H \"Accept: application/json\" 'http://0.0.0.0:80/inscriptions'\n" +"```" + +#: src/guides/explorer.md:98 +msgid "To see information about a UTXO, which includes inscriptions inside it, do:" +msgstr "Para obtener información sobre un UTXO, incluyendo las inscripciones que contiene, haz lo siguiente:" + +#: src/guides/explorer.md:100 +msgid "" +"```\n" +"curl -s -H \"Accept: application/json\" 'http://0.0.0.0:80/output/bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:0'\n" +"```" +msgstr "" +"```\n" +"curl -s -H \"Accept: application/json\" 'http://0.0.0.0:80/output/bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed:0'\n" +"```" + +#: src/guides/explorer.md:104 +msgid "Which returns:" +msgstr "Lo cual devuelve:" + +#: src/guides/explorer.md:106 +msgid "" +"```\n" +"{\n" +" \"value\": 10000,\n" +" \"script_pubkey\": \"OP_PUSHNUM_1 OP_PUSHBYTES_32 156cc4878306157720607cdcb4b32afa4cc6853868458d7258b907112e5a434b\",\n" +" \"address\": \"bc1pz4kvfpurqc2hwgrq0nwtfve2lfxvdpfcdpzc6ujchyr3ztj6gd9sfr6ayf\",\n" +" \"transaction\": \"bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed\",\n" +" \"sat_ranges\": null,\n" +" \"inscriptions\": [\n" +" \"6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0\"\n" +" ]\n" +"}\n" +"```" +msgstr "" +"```\n" +"{\n" +" \"value\": 10000,\n" +" \"script_pubkey\": \"OP_PUSHNUM_1 OP_PUSHBYTES_32 156cc4878306157720607cdcb4b32afa4cc6853868458d7258b907112e5a434b\",\n" +" \"address\": \"bc1pz4kvfpurqc2hwgrq0nwtfve2lfxvdpfcdpzc6ujchyr3ztj6gd9sfr6ayf\",\n" +" \"transaction\": \"bc4c30829a9564c0d58e6287195622b53ced54a25711d1b86be7cd3a70ef61ed\",\n" +" \"sat_ranges\": null,\n" +" \"inscriptions\": [\n" +" \"6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0\"\n" +" ]\n" +"}\n" +"```" + +#: src/guides/wallet.md:4 +msgid "" +"Individual sats can be inscribed with arbitrary content, creating Bitcoin-native digital artifacts that can be held in a Bitcoin wallet and transferred using Bitcoin " +"transactions. Inscriptions are as durable, immutable, secure, and decentralized as Bitcoin itself." +msgstr "" +"Cada sat puede ser inscrito con contenido arbitrario, permitiendo la creación de artefactos digitales únicos nativos en Bitcoin. Estos artefactos digitales pueden almacenarse en " +"monederos de Bitcoin y transferirse mediante transacciones de Bitcoin. Las inscripciones son tan duraderas, inmutables, seguras y descentralizadas como el propio Bitcoin." + +#: src/guides/wallet.md:9 +msgid "" +"Working with inscriptions requires a Bitcoin full node, to give you a view of the current state of the Bitcoin blockchain, and a wallet that can create inscriptions and perform " +"sat control when constructing transactions to send inscriptions to another wallet." +msgstr "" +"Trabajar con inscripciones requiere de un nodo de Bitcoin para darte una visión del estado actual de la blockchain de Bitcoin, además de un monedero capaz de crear inscripciones " +"y realizar control de sats a la hora de construir transacciones para enviar inscripciones a otro monedero." + +#: src/guides/wallet.md:14 +msgid "Bitcoin Core provides both a Bitcoin full node and wallet. However, the Bitcoin Core wallet cannot create inscriptions and does not perform sat control." +msgstr "Bitcoin Core proporciona un nodo completo de Bitcoin y un monedero. Sin embargo, el monedero de Bitcoin Core no puede crear inscripciones y no realiza control de sats." + +#: src/guides/wallet.md:17 +msgid "" +"This requires [`ord`](https://github.com/ordinals/ord), the ordinal utility. `ord` doesn't implement its own wallet, so `ord wallet` subcommands interact with Bitcoin Core " +"wallets." +msgstr "" +"Para esto se requiere de [`ord`](https://github.com/ordinals/ord), la utilidad de ordinals. `ord` no implementa su propio monedero, por lo que los subcomandos del monedero ord " +"interactúan con los monederos de Bitcoin Core." + +#: src/guides/wallet.md:21 +msgid "This guide covers:" +msgstr "Esta guía cubre:" + +#: src/guides/wallet.md:23 src/guides/wallet.md:40 +msgid "Installing Bitcoin Core" +msgstr "La instalación de Bitcoin Core" + +#: src/guides/wallet.md:24 +msgid "Syncing the Bitcoin blockchain" +msgstr "Sincronización de la blockchain de Bitcoin Core" + +#: src/guides/wallet.md:25 +msgid "Creating a Bitcoin Core wallet" +msgstr "Creación de un monedero de Bitcoin Core" + +#: src/guides/wallet.md:26 +msgid "Using `ord wallet receive` to receive sats" +msgstr "Utilizando `ord wallet receive` para recibir sats" + +#: src/guides/wallet.md:27 +msgid "Creating inscriptions with `ord wallet inscribe`" +msgstr "Creación de inscripciones usando `ord wallet inscribe`" + +#: src/guides/wallet.md:28 +msgid "Sending inscriptions with `ord wallet send`" +msgstr "Enviar inscripciones usando `ord wallet send`" + +#: src/guides/wallet.md:29 +msgid "Receiving inscriptions with `ord wallet receive`" +msgstr "Recibir inscripciones con `ord wallet receive`" + +#: src/guides/wallet.md:30 +msgid "Batch inscribing with `ord wallet inscribe --batch`" +msgstr "Inscripción por lotes con `ord wallet inscribe --batch`" + +#: src/guides/wallet.md:32 +msgid "Getting Help" +msgstr "Obtener Ayuda" + +#: src/guides/wallet.md:35 +msgid "" +"If you get stuck, try asking for help on the [Ordinals Discord Server](https://discord.com/invite/87cjuz4FYg), or checking GitHub for relevant [issues](https://github.com/" +"ordinals/ord/issues) and [discussions](https://github.com/ordinals/ord/discussions)." +msgstr "" +"Si te atascas, intenta pedir ayuda en el Servidor de [Discord de Ordinals](https://discord.com/invite/87cjuz4FYg), o consulta el GitHub para ver [problemas](https://github.com/" +"ordinals/ord/issues) y [discusiones relevantes](https://github.com/ordinals/ord/discussions)." + +#: src/guides/wallet.md:43 +msgid "Bitcoin Core is available from [bitcoincore.org](https://bitcoincore.org/) on the [download page](https://bitcoincore.org/en/download/)." +msgstr "Bitcoin Core está disponible en la [página de descargas](https://bitcoincore.org/en/download/) de [bitcoincore.org](https://bitcoincore.org/)." + +#: src/guides/wallet.md:46 +msgid "Making inscriptions requires Bitcoin Core 24 or newer." +msgstr "Para crear inscripciones es necesario tener la versión 24 de Bitcoin Core o una más reciente." + +#: src/guides/wallet.md:48 +msgid "" +"This guide does not cover installing Bitcoin Core in detail. Once Bitcoin Core is installed, you should be able to run `bitcoind -version` successfully from the command line. Do " +"_NOT_ use `bitcoin-qt`." +msgstr "" +"Esta guía no cubre en detalle la instalación de Bitcoin Core. Una vez que hayas instalado Bitcoin Core, deberías poder ejecutar `bitcoind -version` exitosamente desde la línea de " +"comandos. *NO* utilices `bitcoin-qt`." + +#: src/guides/wallet.md:52 +msgid "Configuring Bitcoin Core" +msgstr "Configuración de Bitcoin Core" + +#: src/guides/wallet.md:55 +msgid "`ord` requires Bitcoin Core's transaction index and rest interface." +msgstr "`ord` requiere el índice de transacciones y la interfaz REST de Bitcoin Core." + +#: src/guides/wallet.md:57 +msgid "To configure your Bitcoin Core node to maintain a transaction index, add the following to your `bitcoin.conf`:" +msgstr "Debes configurar tu nodo de Bitcoin Core para que mantenga un índice de transacciones. Añade lo siguiente a tu archivo `bitcoin.conf`:" + +#: src/guides/wallet.md:64 +msgid "Or, run `bitcoind` with `-txindex`:" +msgstr "O ejecuta `bitcoind` con `-txindex`:" + +#: src/guides/wallet.md:70 +msgid "Details on creating or modifying your `bitcoin.conf` file can be found [here](https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md)." +msgstr "" +"Los detalles sobre cómo crear o modificar tu archivo `bitcoin.conf` se pueden encontrar\n" +"[aquí](https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md)." + +#: src/guides/wallet.md:73 +msgid "Syncing the Bitcoin Blockchain" +msgstr "Sincronizando la Blockchain de Bitcoin" + +#: src/guides/wallet.md:76 +msgid "To sync the chain, run:" +msgstr "Para sincronizar la blockchain o cadena de bloques de bitcoin, ejecuta:" + +#: src/guides/wallet.md:82 +msgid "…and leave it running until `getblockcount`:" +msgstr "…y déjalo ejecutar hasta que `getblockcount`:" + +#: src/guides/wallet.md:88 +msgid "" +"agrees with the block count on a block explorer like [the mempool.space block explorer](https://mempool.space/). `ord` interacts with `bitcoind`, so you should leave `bitcoind` " +"running in the background when you're using `ord`." +msgstr "" +"coincida con el recuento de bloques en un explorador de bloques como el \n" +"[explorador de bloques mempool.space](https://mempool.space/). `ord` interactúa\n" +" con `bitcoind`, así que debes dejar `bitcoind` ejecutándose en segundo plano \n" +" mientras estés usando `ord`." + +#: src/guides/wallet.md:92 +msgid "" +"The blockchain takes about 600GB of disk space. If you have an external drive you want to store blocks on, use the configuration option `blocksdir=`. This is " +"much simpler than using the `datadir` option because the cookie file will still be in the default location for `bitcoin-cli` and `ord` to find." +msgstr "" +"La cadena de bloques ocupa aproximadamente 600GB de espacio en disco. Si tienes un \n" +"disco externo en el que deseas almacenar los bloques, utiliza la opción de configuración \n" +"`blocksdir=`. Esto es mucho más sencillo que usar \n" +"`datadir`, ya que el archivo de cookies permanecerá en la ubicación predeterminada, \n" +"facilitando su acceso para `bitcoin-cli` y `ord`." + +#: src/guides/wallet.md:98 src/guides/collecting/sparrow-wallet.md:173 +msgid "Troubleshooting" +msgstr "Solución de problemas" + +#: src/guides/wallet.md:101 +msgid "Make sure you can access `bitcoind` with `bitcoin-cli -getinfo` and that it is fully synced." +msgstr "Asegúrate de poder acceder a `bitcoind` utilizando `bitcoin-cli -getinfo` y que esté completamente sincronizado." + +#: src/guides/wallet.md:104 +msgid "If `bitcoin-cli -getinfo` returns `Could not connect to the server`, `bitcoind` is not running." +msgstr "Si `bitcoin-cli -getinfo` devuelve `\"Could not connect to the server\"`, `bitcoind` no se está ejecutando." + +#: src/guides/wallet.md:107 +msgid "" +"Make sure `rpcuser`, `rpcpassword`, or `rpcauth` are _NOT_ set in your `bitcoin.conf` file. `ord` requires using cookie authentication. Make sure there is a file `.cookie` in " +"your bitcoin data directory." +msgstr "" +"Verifica que `rpcuser`, `rpcpassword` o `rpcauth` *NO* estén configurados en tu archivo `bitcoin.conf`. \n" +"`ord` requiere el uso de autenticación con cookies. Asegúrate de que exista un archivo `.cookie` en tu \n" +"directorio de datos de Bitcoin." + +#: src/guides/wallet.md:111 +msgid "" +"If `bitcoin-cli -getinfo` returns `Could not locate RPC credentials`, then you must specify the cookie file location. If you are using a custom data directory (specifying the " +"`datadir` option), then you must specify the cookie location like `bitcoin-cli -rpccookiefile=/.cookie -getinfo`. When running `ord` you must specify the " +"cookie file location with `--cookie-file=/.cookie`." +msgstr "" +"Si `bitcoin-cli -getinfo` muestra `\"Could not locate RPC credentials\"`, necesitas especificar la \n" +"ubicación del archivo de cookies. Si utilizas un directorio de datos personalizado \n" +"(especificando la opción `datadir`), entonces debes indicar la ubicación del archivo de cookies \n" +"de la siguiente manera: `bitcoin-cli -rpccookiefile=/.cookie -getinfo`. \n" +"Al ejecutar `ord`, debes especificar la ubicación del archivo de cookies con \n" +"`--cookie-file=/.cookie`." + +#: src/guides/wallet.md:119 +msgid "" +"Make sure you do _NOT_ have `disablewallet=1` in your `bitcoin.conf` file. If `bitcoin-cli listwallets` returns `Method not found` then the wallet is disabled and you won't be " +"able to use `ord`." +msgstr "" +"Asegúrate de no tener `disablewallet=1` en tu archivo `bitcoin.conf`. Si `bitcoin-cli listwallets` \n" +"devuelve `\"Method not found\"`, entonces la billetera está deshabilitada y no podrás usar `ord`." + +#: src/guides/wallet.md:123 +msgid "Make sure `txindex=1` is set. Run `bitcoin-cli getindexinfo` and it should return something like" +msgstr "" +"Asegúrate de que `txindex=1` esté configurado. Ejecuta `bitcoin-cli getindexinfo` y debería devolver \n" +"algo similar a esto" + +#: src/guides/wallet.md:127 +msgid "\"txindex\"" +msgstr "\"txindex\"" + +#: src/guides/wallet.md:128 +msgid "\"synced\"" +msgstr "\"sincronizado\"" + +#: src/guides/wallet.md:129 +msgid "\"best_block_height\"" +msgstr "\"mejor_altura_de_bloque\"" + +#: src/guides/wallet.md:133 +msgid "" +"If it only returns `{}`, `txindex` is not set. If it returns `\"synced\": false`, `bitcoind` is still creating the `txindex`. Wait until `\"synced\": true` before using `ord`." +msgstr "" +"Si solo sale `{}`, significa que `txindex` no está configurado. \n" +"Si sale `\"synced\": false`, bitcoind todavía está creando el `txindex`. \n" +"Espera hasta que `\"synced\": true` antes de usar `ord`." + +#: src/guides/wallet.md:137 +msgid "If you have `maxuploadtarget` set it can interfere with fetching blocks for `ord` index. Either remove it or set `whitebind=127.0.0.1:8333`." +msgstr "" +"Si tienes configurado `maxuploadtarget`, esto puede interferir con la obtención de bloques para el índice de `ord`. Para solucionarlo, elimínalo o configura " +"`whitebind=127.0.0.1:8333`." + +#: src/guides/wallet.md:140 +msgid "Installing `ord`" +msgstr "Instalación de `ord`" + +#: src/guides/wallet.md:143 +msgid "" +"The `ord` utility is written in Rust and can be built from [source](https://github.com/ordinals/ord). Pre-built binaries are available on the [releases page](https://github.com/" +"ordinals/ord/releases)." +msgstr "" +"La herramienta `ord` está desarrollada en Rust y puede compilarse desde el [código fuente](https://github.com/ordinals/ord). \n" +"Los binarios preconstruidos están disponibles en la página de [lanzamientos](https://github.com/ordinals/ord/releases)." + +#: src/guides/wallet.md:147 +msgid "You can install the latest pre-built binary from the command line with:" +msgstr "Puedes instalar el último binario precompilado desde la línea de comandos usando:" + +#: src/guides/wallet.md:150 +msgid "'=https'" +msgstr "'=https'" + +#: src/guides/wallet.md:153 +msgid "Once `ord` is installed, you should be able to run:" +msgstr "Una vez que ord esté instalado, deberías poder de ejecutar:" + +#: src/guides/wallet.md:159 +msgid "Which prints out `ord`'s version number." +msgstr "Esto mostrará el número de versión de `ord`." + +#: src/guides/wallet.md:161 +msgid "Creating a Wallet" +msgstr "Creando un Monedero" + +#: src/guides/wallet.md:164 +msgid "" +"`ord` uses `bitcoind` to manage private keys, sign transactions, and broadcast transactions to the Bitcoin network. Additionally the `ord wallet` requires [`ord server`](explorer." +"md) running in the background. Make sure these programs are running:" +msgstr "" +"`ord` utiliza `bitcoind` para manejar claves privadas, firmar transacciones y transmitir transacciones a la red de Bitcoin. Además, el `monedero ord` requiere que [`ord server`]" +"(explorer.md) esté ejecutándose en segundo plano. Asegúrate de que estos programas estén en funcionamiento:" + +#: src/guides/wallet.md:177 +msgid "To create a wallet named `ord`, the default, for use with `ord wallet`, run:" +msgstr "Para crear un monedero llamado `ord`, que es el predeterminado, para utilizar con `ord wallet`, ejecuta:" + +#: src/guides/wallet.md:183 +msgid "This will print out your seed phrase mnemonic, store it somewhere safe." +msgstr "Esto mostrará tu frase semilla mnemotécnica. Guárdala en un lugar seguro." + +#: src/guides/wallet.md:185 +msgid "" +"```\n" +"{\n" +" \"mnemonic\": \"dignity buddy actor toast talk crisp city annual tourist orient similar federal\",\n" +" \"passphrase\": \"\"\n" +"}\n" +"```" +msgstr "" +"``\n" +"{\n" +" \"mnemonic\": \"dignity buddy actor toast talk crisp city annual tourist orient similar federal\",\n" +" \"passphrase\": \"\"\n" +"}\n" +"```" + +#: src/guides/wallet.md:192 +msgid "If you want to specify a different name or use an `ord server` running on a non-default URL you can set these options:" +msgstr "Si deseas especificar un nombre diferente o utilizar un `servidor de ord` que se esté ejecutando en una URL no predeterminada, puedes configurar estas opciones:" + +#: src/guides/wallet.md:195 +msgid "" +"```\n" +"ord wallet --name foo --server-url http://127.0.0.1:8080 create\n" +"```" +msgstr "" +"```\n" +"ord wallet --name foo --server-url http://127.0.0.1:8080 create\n" +"```" + +#: src/guides/wallet.md:199 +msgid "To see all available wallet options you can run:" +msgstr "Para ver todas las opciones disponibles del Monedero, puedes usar el siguiente comando:" + +#: src/guides/wallet.md:205 +msgid "Restoring and Dumping Wallet" +msgstr "Restauración y Dump del Monedero" + +#: src/guides/wallet.md:208 +msgid "" +"The `ord` wallet uses descriptors, so you can export the output descriptors and import them into another descriptor-based wallet. To export the wallet descriptors, which include " +"your private keys:" +msgstr "" +"El monedero `ord` utiliza descriptores, lo que te permite exportar los descriptores de salida e importarlos en otro monedero que también use descriptores. Para exportar los " +"descriptores del monedero, que incluyen tus claves privadas:" + +#: src/guides/wallet.md:212 +msgid "" +"```\n" +"$ ord wallet dump\n" +"==========================================\n" +"= THIS STRING CONTAINS YOUR PRIVATE KEYS =\n" +"= DO NOT SHARE WITH ANYONE =\n" +"==========================================\n" +"{\n" +" \"wallet_name\": \"ord\",\n" +" \"descriptors\": [\n" +" {\n" +" \"desc\": \"tr([551ac972/86'/1'/0']tprv8h4xBhrfZwX9o1XtUMmz92yNiGRYjF9B1vkvQ858aN1UQcACZNqN9nFzj3vrYPa4jdPMfw4ooMuNBfR4gcYm7LmhKZNTaF4etbN29Tj7UcH/0/*)#uxn94yt5\",\n" +" \"timestamp\": 1296688602,\n" +" \"active\": true,\n" +" \"internal\": false,\n" +" \"range\": [\n" +" 0,\n" +" 999\n" +" ],\n" +" \"next\": 0\n" +" },\n" +" {\n" +" \"desc\": \"tr([551ac972/86'/1'/0']tprv8h4xBhrfZwX9o1XtUMmz92yNiGRYjF9B1vkvQ858aN1UQcACZNqN9nFzj3vrYPa4jdPMfw4ooMuNBfR4gcYm7LmhKZNTaF4etbN29Tj7UcH/1/*)#djkyg3mv\",\n" +" \"timestamp\": 1296688602,\n" +" \"active\": true,\n" +" \"internal\": true,\n" +" \"range\": [\n" +" 0,\n" +" 999\n" +" ],\n" +" \"next\": 0\n" +" }\n" +" ]\n" +"}\n" +"```" +msgstr "" +"```\n" +"$ ord wallet dump\n" +"============================================\n" +"= ESTE STRING CONTIENE TUS LLAVES PRIVADAS =\n" +"= NO LAS COMPARTAS CON NADIE =\n" +"============================================\n" +"{\n" +" \"wallet_name\": \"ord\",\n" +" \"descriptors\": [\n" +" {\n" +" \"desc\": \"tr([551ac972/86'/1'/0']tprv8h4xBhrfZwX9o1XtUMmz92yNiGRYjF9B1vkvQ858aN1UQcACZNqN9nFzj3vrYPa4jdPMfw4ooMuNBfR4gcYm7LmhKZNTaF4etbN29Tj7UcH/0/*)#uxn94yt5\",\n" +" \"timestamp\": 1296688602,\n" +" \"active\": true,\n" +" \"internal\": false,\n" +" \"range\": [\n" +" 0,\n" +" 999\n" +" ],\n" +" \"next\": 0\n" +" },\n" +" {\n" +" \"desc\": \"tr([551ac972/86'/1'/0']tprv8h4xBhrfZwX9o1XtUMmz92yNiGRYjF9B1vkvQ858aN1UQcACZNqN9nFzj3vrYPa4jdPMfw4ooMuNBfR4gcYm7LmhKZNTaF4etbN29Tj7UcH/1/*)#djkyg3mv\",\n" +" \"timestamp\": 1296688602,\n" +" \"active\": true,\n" +" \"internal\": true,\n" +" \"range\": [\n" +" 0,\n" +" 999\n" +" ],\n" +" \"next\": 0\n" +" }\n" +" ]\n" +"}\n" +"```" + +#: src/guides/wallet.md:247 +msgid "An `ord` wallet can be restored from a mnemonic:" +msgstr "Una billetera ord puede ser restaurada a partir de una frase mnemotécnica:" + +#: src/guides/wallet.md:253 +msgid "Type your mnemonic and press return." +msgstr "Escribe tu frase mnemotécnica y presiona enter." + +#: src/guides/wallet.md:255 +msgid "To restore from a descriptor in `descriptor.json`:" +msgstr "Para restaurar desde un descriptor en `descriptor.json`:" + +#: src/guides/wallet.md:261 +msgid "To restore from a descriptor in the clipboard:" +msgstr "Para restaurar desde un descriptor en el portapapeles:" + +#: src/guides/wallet.md:267 +msgid "Paste the descriptor into the terminal and press CTRL-D on unix and CTRL-Z on Windows." +msgstr "Pega el descriptor en la terminal y presiona CTRL-D en unix y CTRL-Z en Windows." + +#: src/guides/wallet.md:270 +msgid "Receiving Sats" +msgstr "Recibir Sats" + +#: src/guides/wallet.md:273 +msgid "Inscriptions are made on individual sats, using normal Bitcoin transactions that pay fees in sats, so your wallet will need some sats." +msgstr "" +"Las inscripciones se crean en sats individuales, mediante transacciones estándar de Bitcoin que pagan comisiones en sats, por lo que tu monedero necesitará tener algunos sats " +"disponibles." + +#: src/guides/wallet.md:276 +msgid "Get a new address from your `ord` wallet by running:" +msgstr "Obtén una nueva dirección de tu monedero `ord`ejecutando:" + +#: src/guides/wallet.md:282 +msgid "And send it some funds." +msgstr "Y envíale algunos fondos." + +#: src/guides/wallet.md:284 +msgid "You can see pending transactions with:" +msgstr "Puedes ver las transacciones pendientes con:" + +#: src/guides/wallet.md:290 +msgid "Once the transaction confirms, you should be able to see the transactions outputs with `ord wallet outputs`." +msgstr "Una vez que la transacción se confirme, podrás ver las salidas de la transacción con `ord wallet outputs`." + +#: src/guides/wallet.md:293 +msgid "Creating Inscription Content" +msgstr "Creación de Contenido para las Inscripciones" + +#: src/guides/wallet.md:296 +msgid "Sats can be inscribed with any kind of content, but the `ord` wallet only supports content types that can be displayed by the `ord` block explorer." +msgstr "" +"Los sats pueden ser inscritos con cualquier tipo de contenido, pero el monedero `ord` solo admite tipos de contenido que pueden ser mostrados por el explorador de bloques de " +"`ord`." + +#: src/guides/wallet.md:299 +msgid "Additionally, inscriptions are included in transactions, so the larger the content, the higher the fee that the inscription transaction must pay." +msgstr "" +"Además, las inscripciones se incluyen en las transacciones, debido a esto, en cuanto más grande sea el contenido, mayor será la comisión que debe pagar por la transacción de la " +"inscripción." + +#: src/guides/wallet.md:302 +msgid "" +"Inscription content is included in transaction witnesses, which receive the witness discount. To calculate the approximate fee that an inscribe transaction will pay, divide the " +"content size by four and multiply by the fee rate." +msgstr "" +"El contenido de inscripción se incluye en el testigo de la transacción, los cuales reciben el descuento de testigo. Para calcular un aproximado de la comisión que se trendrá que " +"pagar por la transacción de una inscripción, divide el tamaño del contenido por cuatro y multiplica por la tasa de comisión." + +#: src/guides/wallet.md:306 +msgid "" +"Inscription transactions must be less than 400,000 weight units, or they will not be relayed by Bitcoin Core. One byte of inscription content costs one weight unit. Since an " +"inscription transaction includes not just the inscription content, limit inscription content to less than 400,000 weight units. 390,000 weight units should be safe." +msgstr "" +"Las transacciones de inscripción deben tener un peso inferior a 400,000 unidades, de lo contrario, no serán retransmitidas por Bitcoin Core. Un byte del contenido de inscripción " +"equivale a una unidad de peso. Considerando que una transacción de inscripción abarca más que solo el contenido de la inscripción se debe restringir el contenido de cada " +"inscripción a menos de 400,000 unidades de peso. Para mantener un margen de seguridad, se recomienda no exceder las 390,000 unidades de peso." + +#: src/guides/wallet.md:312 +msgid "Creating Inscriptions" +msgstr "Creando una Inscripción" + +#: src/guides/wallet.md:315 +msgid "To create an inscription with the contents of `FILE`, run:" +msgstr "Para crear una inscripción con el contenido de `ARCHIVO`, ejecuta:" + +#: src/guides/wallet.md:321 +msgid "" +"Ord will output two transactions IDs, one for the commit transaction, and one for the reveal transaction, and the inscription ID. Inscription IDs are of the form `TXIDiN`, where " +"`TXID` is the transaction ID of the reveal transaction, and `N` is the index of the inscription in the reveal transaction." +msgstr "" +"Ord mostrará dos IDs de transacciones, uno para la transacción de compromiso, uno para la transacción de revelación, y el ID de inscripción. Los IDs de inscripción tienen el " +"formato `TXIDiN`, donde `TXID` es el ID de la transacción de revelación, y `N` es el índice de la inscripción en la transacción de revelación." + +#: src/guides/wallet.md:326 +msgid "" +"The commit transaction commits to a tapscript containing the content of the inscription, and the reveal transaction spends from that tapscript, revealing the content on chain and " +"inscribing it on the first sat of the input that contains the corresponding tapscript." +msgstr "" +"La transacción de compromiso se compromete a un tapscript que aloja el contenido de la inscripción, mientras que la transacción de revelación consume ese tapscript, revelando el " +"contenido en la cadena e inscribiéndolo en el primer sat del input que contiene el tapscript correspondiente." + +#: src/guides/wallet.md:331 +msgid "" +"Wait for the reveal transaction to be mined. You can check the status of the commit and reveal transactions using [the mempool.space block explorer](https://mempool.space/)." +msgstr "" +"Espera a que la transacción de revelación sea minada. Puedes verificar el estado de las transacciones de compromiso y revelación usando el [explorador de bloques mempool.space]" +"(https://mempool.space/)." + +#: src/guides/wallet.md:335 +msgid "Once the reveal transaction has been mined, the inscription ID should be printed when you run:" +msgstr "Después de que la transacción de revelación sea minada, el ID de inscripción debería salir al ejecutar:" + +#: src/guides/wallet.md:342 +msgid "Parent-Child Inscriptions" +msgstr "Inscripciones Padre-Hijo (Parent-Child)" + +#: src/guides/wallet.md:345 +msgid "Parent-child inscriptions enable what is colloquially known as collections, see [provenance](../inscriptions/provenance.md) for more information." +msgstr "" +"Las inscripciones de tipo padre-hijo permiten crear lo que coloquialmente se conoce como colecciones. Para más información, consulta [proveniencia](../inscriptions/provenance.md)." + +#: src/guides/wallet.md:348 +msgid "" +"To make an inscription a child of another, the parent inscription has to be inscribed and present in the wallet. To choose a parent run `ord wallet inscriptions` and copy the " +"inscription id (``)." +msgstr "" +"Para designar una inscripción como hijo de otra inscripción, la inscripción padre debe estar inscrita y disponible en el monedero. Para seleccionar una inscripción padre, ejecuta " +"`ord wallet inscriptions` y copia el ID de la inscripción (``)." + +#: src/guides/wallet.md:352 +msgid "Now inscribe the child inscription and specify the parent like so:" +msgstr "Luego, inscribe la inscripción hijo y especifica el padre de esta manera:" + +#: src/guides/wallet.md:358 +msgid "This relationship cannot be added retroactively, the parent has to be present at inception of the child." +msgstr "Esta relación no puede añadirse retroactivamente, el padre debe estar presente en el momento de la creación del hijo." + +#: src/guides/wallet.md:361 +msgid "Sending Inscriptions" +msgstr "Envíar Inscripciones" + +#: src/guides/wallet.md:364 src/guides/wallet.md:392 +msgid "Ask the recipient to generate a new address by running:" +msgstr "Pide al destinatario que genere una dirección nueva ejecutando:" + +#: src/guides/wallet.md:370 +msgid "Send the inscription by running:" +msgstr "Envía la inscripción ejecutando:" + +#: src/guides/wallet.md:376 src/guides/wallet.md:412 src/guides/wallet.md:439 +msgid "See the pending transaction with:" +msgstr "Consulta la transacción con:" + +#: src/guides/wallet.md:382 +msgid "Once the send transaction confirms, the recipient can confirm receipt by running:" +msgstr "Una vez que la transacción de envío haya sido confirmada, el destinatario podrá verificarlo ejecutando:" + +#: src/guides/wallet.md:389 +msgid "Sending Runes" +msgstr "Envíar Runas" + +#: src/guides/wallet.md:398 +msgid "Send the runes by running:" +msgstr "Para envíar las runas ejecuta:" + +#: src/guides/wallet.md:404 +msgid "" +"Where `RUNES_AMOUNT` is the number of runes to send, a `:` character, and the name of the rune. For example if you want to send 1000 of the EXAMPLE rune, you would use `1000:" +"EXAMPLE`." +msgstr "" +"En donde `RUNES_AMOUNT` es la cantidad de runas a enviar, seguida por dos puntos `:` y el nombre de la runa. Por ejemplo, si deseas enviar 1000 runas EXAMPLE, usarías `1000:" +"EXAMPLE`." + +#: src/guides/wallet.md:418 +msgid "Once the send transaction confirms, the recipient can confirm receipt with:" +msgstr "Una vez que la transacción de envío se confirme, el destinatario puede verificar la recepción con:" + +#: src/guides/wallet.md:424 +msgid "Receiving Inscriptions" +msgstr "Recibir Inscripciones" + +#: src/guides/wallet.md:427 +msgid "Generate a new receive address using:" +msgstr "Genera una nueva dirección de recepción usando:" + +#: src/guides/wallet.md:433 +msgid "The sender can transfer the inscription to your address using:" +msgstr "El remitente puede transferir la inscripción a tu dirección usando:" + +#: src/guides/wallet.md:444 +msgid "Once the send transaction confirms, you can confirm receipt by running:" +msgstr "Una vez que la transacción se confirme, puedes verificar si lo recibiste ejecutando con:" + +#: src/guides/batch-inscribing.md:4 +msgid "" +"Multiple inscriptions can be created at the same time using the [pointer field](./../inscriptions/pointer.md). This is especially helpful for collections, or other cases when " +"multiple inscriptions should share the same parent, since the parent can passed into a reveal transaction that creates multiple children." +msgstr "" +"Se pueden crear múltiples inscripciones al mismo tiempo usando el [campo pointer](./../inscriptions/pointer.md). Esto es especialmente útil para colecciones u otros casos en los " +"que varias inscripciones deben compartir el mismo padre, ya que el padre se puede incluir en una transacción de revelación que crea múltiples hijos." + +#: src/guides/batch-inscribing.md:10 +msgid "To create a batch inscription using a batchfile in `batch.yaml`, run the following command:" +msgstr "Para crear una inscripción por lotes utilizando un batchfile en `batch.yaml`, ejecuta el siguiente comando:" + +#: src/guides/batch-inscribing.md:17 +msgid "Example `batch.yaml`" +msgstr "Ejemplo `batch.yaml`" + +#: src/guides/batch-inscribing.md:21 +msgid "# example batch file\n" +msgstr "#ejemplo de archivo batch\n" + +#: src/guides/batch-inscribing.md:22 +msgid "" +"# inscription modes:\n" +"# - `same-sat`: inscribe on the same sat\n" +"# - `satpoints`: inscribe on the first sat of specified satpoint's output\n" +"# - `separate-outputs`: inscribe on separate postage-sized outputs\n" +"# - `shared-output`: inscribe on a single output separated by postage\n" +"mode" +msgstr "" +"# metodos de inscripción:\n" +"# - `same-sat`: inscribe en el mismo sat\n" +"# - `satpoints`: inscribe en el primer sat de la salida especificada por satpoint\n" +"# - `separate-outputs`: inscribe en salidas diferentes del tamaño de postage\n" +"# - `shared-output`: inscribe en una única salida separada por postage\n" +"modo" + +#: src/guides/batch-inscribing.md:28 +msgid "separate-outputs" +msgstr "separate-outputs" + +#: src/guides/batch-inscribing.md:29 +msgid "" +"# parent inscription:\n" +"parent" +msgstr "" +"# inscripción padre:\n" +"padre" + +#: src/guides/batch-inscribing.md:31 src/guides/batch-inscribing.md:81 +msgid "6ac5cacb768794f4fd7a78bf00f2074891fce68bd65c4ff36e77177237aacacai0" +msgstr "6ac5cacb768794f4fd7a78bf00f2074891fce68bd65c4ff36e77177237aacacai0" + +#: src/guides/batch-inscribing.md:32 +msgid "" +"# postage for each inscription:\n" +"postage" +msgstr "" +"# postage para cada inscripción:\n" +"postage" + +#: src/guides/batch-inscribing.md:35 +msgid "" +"# allow reinscribing\n" +"reinscribe" +msgstr "" +"# permitir reinscribir\n" +"reinscribir" + +#: src/guides/batch-inscribing.md:38 +msgid "" +"# sat to inscribe on, can only be used with `same-sat`:\n" +"# sat: 5000000000\n" +msgstr "" +"# sat donde se va a inscribir, solo se puede usar con `same-sat`:\n" +"# sat: 5000000000\n" + +#: src/guides/batch-inscribing.md:41 +msgid "" +"# rune to etch (optional)\n" +"etching" +msgstr "" +"# runa a grabar (opcional)\n" +"grabado" + +#: src/guides/batch-inscribing.md:44 +msgid "" +"# rune name\n" +" rune" +msgstr "" +"# nombre de la runa\n" +" runa" + +#: src/guides/batch-inscribing.md:45 +msgid "THE•BEST•RUNE" +msgstr "THE•BEST•RUNE" + +#: src/guides/batch-inscribing.md:46 +msgid "" +"# allow subdividing super-unit into `10^divisibility` sub-units\n" +" divisibility" +msgstr "" +"# permitir subdividir la superunidad en `10^divisibility` subunidades\n" +" divisibilidad" + +#: src/guides/batch-inscribing.md:48 +msgid "" +"# premine\n" +" premine" +msgstr "" +"# premine\n" +" preminado" + +#: src/guides/batch-inscribing.md:50 +msgid "" +"# total supply, must be equal to `premine + terms.cap * terms.amount`\n" +" supply" +msgstr "" +"# suministro total, debe ser igual a `preminado + términos.cap * términos.cantidad`\n" +" suministro: 10000.00" + +#: src/guides/batch-inscribing.md:52 +msgid "" +"# currency symbol\n" +" symbol" +msgstr "" +"# símbolo\n" +" símbolo" + +#: src/guides/batch-inscribing.md:53 +msgid "$" +msgstr "$" + +#: src/guides/batch-inscribing.md:54 +msgid "" +"# mint terms (optional)\n" +" terms" +msgstr "" +"# términos de minteo (opcional)\n" +" términos" + +#: src/guides/batch-inscribing.md:56 +msgid "" +"# amount per mint\n" +" amount" +msgstr "" +"# cantidad por minteo\n" +" cantidad" + +#: src/guides/batch-inscribing.md:58 +msgid "" +"# maximum number of mints\n" +" cap" +msgstr "" +"#número máximo de minteos\n" +" cap" + +#: src/guides/batch-inscribing.md:60 +msgid "" +"# mint start and end absolute block height (optional)\n" +" height" +msgstr "" +"# altura de inicio y fin del minteo en bloques absolutos (opcional)\n" +" altura" + +#: src/guides/batch-inscribing.md:62 src/guides/batch-inscribing.md:66 +msgid "start" +msgstr "inicio" + +#: src/guides/batch-inscribing.md:63 src/guides/batch-inscribing.md:67 +msgid "end" +msgstr "fin" + +#: src/guides/batch-inscribing.md:64 +msgid "" +"# mint start and end block height relative to etching height (optional)\n" +" offset" +msgstr "" +"# Altura de inicio y fin del minteo en relación a la altura de grabado (opcional)\n" +" compensación" + +#: src/guides/batch-inscribing.md:68 +msgid "" +"# future runes protocol changes may be opt-in. this may be for a variety of\n" +" # reasons, including that they make light client validation harder, or simply\n" +" # because they are too degenerate.\n" +" #\n" +" # setting `turbo` to `true` opts in to these future protocol changes,\n" +" # whatever they may be.\n" +" turbo" +msgstr "" +"# cambios futuros en el protocolo de las runas pueden ser opcionales. esto puede ser por una variedad de\n" +" # razones, incluyendo que hacen que la validación de clientes ligeros sea más difícil, o simplemente\n" +" # porque son demasiado degenerados.\n" +" #\n" +" # configurar `turbo` a `true` opta por estos cambios futuros en el protocolo,\n" +" # cualquiera que sean.\n" +" turbo" + +#: src/guides/batch-inscribing.md:75 +msgid "" +"# inscriptions to inscribe\n" +"inscriptions" +msgstr "" +"# inscripciones para inscribir\n" +"inscripciones" + +#: src/guides/batch-inscribing.md:78 +msgid "# path to inscription content\n" +msgstr "# ruta al contenido de la inscripción\n" + +#: src/guides/batch-inscribing.md:79 src/guides/batch-inscribing.md:94 src/guides/batch-inscribing.md:98 +msgid "file" +msgstr "archivo" + +#: src/guides/batch-inscribing.md:79 +msgid "mango.avif" +msgstr "mango.avif" + +#: src/guides/batch-inscribing.md:80 +msgid "" +"# inscription to delegate content to (optional)\n" +" delegate" +msgstr "" +"# inscripción para delegar contenido (opcional)\n" +" delegado" + +#: src/guides/batch-inscribing.md:82 +msgid "" +"# destination (optional, if no destination is specified a new wallet change address will be used)\n" +" destination" +msgstr "" +"# destino (opcional, si no se especifica un destino, se usará una nueva dirección de cambio de billetera)\n" +" destino" + +#: src/guides/batch-inscribing.md:83 +msgid "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4" +msgstr "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4" + +#: src/guides/batch-inscribing.md:84 +msgid "" +"# inscription metadata (optional)\n" +" metadata" +msgstr "" +"# metadatos de la inscripción (opcional)\n" +" metadatos" + +#: src/guides/batch-inscribing.md:86 +msgid "title" +msgstr "título" + +#: src/guides/batch-inscribing.md:86 +msgid "Delicious Mangos" +msgstr "Mangos Deliciosos" + +#: src/guides/batch-inscribing.md:87 +msgid "description" +msgstr "descripción" + +#: src/guides/batch-inscribing.md:87 +msgid "" +" Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam semper,\n" +" ligula ornare laoreet tincidunt, odio nisi euismod tortor, vel blandit\n" +" metus est et odio. Nullam venenatis, urna et molestie vestibulum, orci\n" +" mi efficitur risus, eu malesuada diam lorem sed velit. Nam fermentum\n" +" dolor et luctus euismod.\n" +"\n" +msgstr "" +" Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam semper,\n" +"\n" +" ligula ornare laoreet tincidunt, odio nisi euismod tortor, vel blandit\n" +"\n" +" metus est et odio. Nullam venenatis, urna et molestie vestibulum, orci\n" +"\n" +" mi efficitur risus, eu malesuada diam lorem sed velit. Nam fermentum\n" +"\n" +" dolor et luctus euismod.\n" +"\n" + +#: src/guides/batch-inscribing.md:94 +msgid "token.json" +msgstr "token.json" + +#: src/guides/batch-inscribing.md:95 +msgid "" +"# inscription metaprotocol (optional)\n" +" metaprotocol" +msgstr "" +"# Metaprotocolo de la inscripción (opcional)\n" +" metaprotocolo" + +#: src/guides/batch-inscribing.md:96 +msgid "DOPEPROTOCOL-42069" +msgstr "PROTOCOLO-MARAVILLOSO-42069" + +#: src/guides/batch-inscribing.md:98 +msgid "tulip.png" +msgstr "tulipán.png" + +#: src/guides/batch-inscribing.md:99 +msgid "destination" +msgstr "destino" + +#: src/guides/batch-inscribing.md:99 +msgid "bc1pdqrcrxa8vx6gy75mfdfj84puhxffh4fq46h3gkp6jxdd0vjcsdyspfxcv6" +msgstr "bc1pdqrcrxa8vx6gy75mfdfj84puhxffh4fq46h3gkp6jxdd0vjcsdyspfxcv6" + +#: src/guides/batch-inscribing.md:100 +msgid "metadata" +msgstr "metadatos" + +#: src/guides/batch-inscribing.md:101 +msgid "author" +msgstr "autor" + +#: src/guides/batch-inscribing.md:101 +msgid "Satoshi Nakamoto" +msgstr "Satoshi Nakamoto" + +#: src/guides/collecting.md:4 +msgid "" +"Currently, [ord](https://github.com/ordinals/ord/) is the only wallet supporting sat-control and sat-selection, which are required to safely store and send rare sats and " +"inscriptions, hereafter ordinals." +msgstr "" +"Actualmente, ord es el único monedero que tiene la funcionalidad de control de sat (sat-control) y selección de sat (sat-selection), funciones indispensables para almacenar y " +"enviar de forma segura sats raros e inscripciones, ahora conocidos como ordinals." + +#: src/guides/collecting.md:8 +msgid "" +"The recommended way to send, receive, and store ordinals is with `ord`, but if you are careful, it is possible to safely store, and in some cases send, ordinals with other " +"wallets." +msgstr "" +"La manera sugerida de enviar, recibir y guardar ordinals es utilizando ord, pero si se tiene cuidado, es posible almacenar de forma segura, y en ciertas circunstancias enviar, " +"ordinals utilizando otros monederos." + +#: src/guides/collecting.md:12 +msgid "" +"As a general note, receiving ordinals in an unsupported wallet is not dangerous. Ordinals can be sent to any bitcoin address, and are safe as long as the UTXO that contains them " +"is not spent. However, if that wallet is then used to send bitcoin, it may select the UTXO containing the ordinal as an input, and send the inscription or spend it to fees." +msgstr "" +"En términos generales, recibir ordinals en un monedero no compatible no es peligroso. Los ordinals se pueden enviar a cualquier dirección de bitcoin, y son seguros siempre y " +"cuando el UTXO que los contiene no se gaste. Sin embargo, si luego se utiliza ese monedero para enviar bitcoin, puede seleccionar el UTXO que contiene el ordinal como una entrada " +"y por error enviar la inscripción o gastarlo en comisiones." + +#: src/guides/collecting.md:18 +msgid "A [guide](./collecting/sparrow-wallet.md) to creating an `ord`\\-compatible wallet with [Sparrow Wallet](https://sparrowwallet.com/), is available in this handbook." +msgstr "" +"Hay una [guía](./collecting/sparrow-wallet.md) disponible en este manual para crear un monedero compatible con `ord` usando el [Monedero Sparrow](https://sparrowwallet.com/)." + +#: src/guides/collecting.md:21 +msgid "Please note that if you follow this guide, you should not use the wallet you create to send BTC, unless you perform manual coin-selection to avoid sending ordinals." +msgstr "" +"Ten presente que, si decides seguir esta guía, no deberías utilizar el monedero que creaste para enviar BTC, a menos que realices una selección manual de monedas para evitar " +"enviar ordinals por error." + +#: src/guides/collecting/sparrow-wallet.md:1 +msgid "Collecting Inscriptions and Ordinals with Sparrow Wallet" +msgstr "Coleccionando Inscripciones y Ordinals con Sparrow" + +#: src/guides/collecting/sparrow-wallet.md:4 +msgid "" +"Users who cannot or have not yet set up the [ord](https://github.com/ordinals/ord) wallet can receive inscriptions and ordinals with alternative bitcoin wallets, as long as they " +"are _very_ careful about how they spend from that wallet." +msgstr "" +"Los usuarios que no pueden o no han configurado aún el monedero [ord](https://github.com/ordinals/ord) pueden recibir inscripciones y ordinals usando monederos alternativos de " +"bitcoin, siempre y cuando sean _muy_ cautelosos a la hora de realizar gastos desde ese monedero." + +#: src/guides/collecting/sparrow-wallet.md:6 +msgid "" +"This guide gives some basic steps on how to create a wallet with [Sparrow Wallet](https://sparrowwallet.com/) which is compatible with `ord` and can be later imported into `ord`" +msgstr "" +"Esta guía ofrece instrucciones básicas para crear un monedero con [Sparrow Wallet](https://sparrowwallet.com/) el cual es compatible con `ord` y podrá ser importado a `ord` en un " +"futuro" + +#: src/guides/collecting/sparrow-wallet.md:8 +msgid "⚠️⚠️ Warning!! ⚠️⚠️" +msgstr "⚠️⚠️ ¡¡Advertencia!! ⚠️⚠️" + +#: src/guides/collecting/sparrow-wallet.md:9 +msgid "As a general rule if you take this approach, you should use this wallet with the Sparrow software as a receive-only wallet." +msgstr "Como regla general, si tomas este enfoque, debes usar este monedero con el software Sparrow solo como un monedero para recibir." + +#: src/guides/collecting/sparrow-wallet.md:11 +msgid "" +"Do not spend any satoshis from this wallet unless you are sure you know what you are doing. You could very easily inadvertently lose access to your ordinals and inscriptions if " +"you don't heed this warning." +msgstr "" +"No gastes ningún satoshi de este monedero a menos que estés seguro de lo que estás haciendo. Podrías perder fácilmente el acceso a tus ordinals e inscripciones si no haces caso a " +"esta advertencia." + +#: src/guides/collecting/sparrow-wallet.md:13 +msgid "Wallet Setup & Receiving" +msgstr "Configuración del Monedero y Recibir" + +#: src/guides/collecting/sparrow-wallet.md:15 +msgid "Download the Sparrow Wallet from the [releases page](https://sparrowwallet.com/download/) for your particular operating system." +msgstr "Descarga Sparrow Wallet desde la [página de descargas](https://sparrowwallet.com/download/) para tu sistema operativo." + +#: src/guides/collecting/sparrow-wallet.md:17 +msgid "Select `File -> New Wallet` and create a new wallet called `ord`." +msgstr "Selecciona `File -> New Wallet` y crea un nuevo monedero llamado `ord`." + +#: src/guides/collecting/sparrow-wallet.md:19 +msgid "![](images/wallet_setup_01.png)" +msgstr "![](images/wallet_setup_01.png)" + +#: src/guides/collecting/sparrow-wallet.md:21 +msgid "Change the `Script Type` to `Taproot (P2TR)` and select the `New or Imported Software Wallet` option." +msgstr "Cambia el `Script Type` (Tipo de script) a `Taproot (P2TR)` y selecciona la opción `New or Imported Software Wallet`." + +#: src/guides/collecting/sparrow-wallet.md:23 +msgid "![](images/wallet_setup_02.png)" +msgstr "![](images/wallet_setup_02.png)" + +#: src/guides/collecting/sparrow-wallet.md:25 +msgid "Select `Use 12 Words` and then click `Generate New`. Leave the passphrase blank." +msgstr "Selecciona `Use 12 Words` (Utilizar 12 palabras) y luego haz clic en `Generate New` (Generar nueva). Deja passphrase (Frase de contraseña) en blanco." + +#: src/guides/collecting/sparrow-wallet.md:27 +msgid "![](images/wallet_setup_03.png)" +msgstr "![](images/wallet_setup_03.png)" + +#: src/guides/collecting/sparrow-wallet.md:29 +msgid "" +"A new 12 word BIP39 seed phrase will be generated for you. Write this down somewhere safe as this is your backup to get access to your wallet. NEVER share or show this seed " +"phrase to anyone else." +msgstr "" +"Se generará tu nueva frase semilla BIP39 de 12 palabras. Anota esto en un lugar seguro, ya que será tu respaldo para acceder a tu monedero. NUNCA compartas ni muestres esta frase " +"semilla a nadie." + +#: src/guides/collecting/sparrow-wallet.md:31 +msgid "Once you have written down the seed phrase click `Confirm Backup`." +msgstr "Una vez que hayas anotado la frase semilla, haz clic en `Confirm Backup` (Confirmar copia de seguridad)." + +#: src/guides/collecting/sparrow-wallet.md:33 +msgid "![](images/wallet_setup_04.png)" +msgstr "![](images/wallet_setup_04.png)" + +#: src/guides/collecting/sparrow-wallet.md:35 +msgid "Re-enter the seed phrase which you wrote down, and then click `Create Keystore`." +msgstr "Ingresa la frase que anotaste y luego haz clic en `Create Keystore`." + +#: src/guides/collecting/sparrow-wallet.md:37 +msgid "![](images/wallet_setup_05.png)" +msgstr "![](images/wallet_setup_05.png)" + +#: src/guides/collecting/sparrow-wallet.md:39 +msgid "Click `Import Keystore`." +msgstr "Haz clic en `Import Keystore` (almacenamiento de llaves)." + +#: src/guides/collecting/sparrow-wallet.md:41 +msgid "![](images/wallet_setup_06.png)" +msgstr "![](images/wallet_setup_06.png)" + +#: src/guides/collecting/sparrow-wallet.md:43 +msgid "Click `Apply`. Add a password for the wallet if you want to." +msgstr "Haz clic en `Apply` (aplicar). Luego, agrega una contraseña al monedero si deseas." + +#: src/guides/collecting/sparrow-wallet.md:45 +msgid "![](images/wallet_setup_07.png)" +msgstr "![](images/wallet_setup_07.png)" + +#: src/guides/collecting/sparrow-wallet.md:47 +msgid "" +"You now have a wallet which is compatible with `ord`, and can be imported into `ord` using the BIP39 Seed Phrase. To receive ordinals or inscriptions, click on the `Receive` tab " +"and copy a new address." +msgstr "" +"Ahora tienes un monedero que es compatible con `ord` y que puede ser importado a `ord` utilizando la frase semilla BIP39. Para recibir ordinals o inscripciones, dirígete a la " +"pestaña `Receive` (Recibir) y copia una nueva dirección." + +#: src/guides/collecting/sparrow-wallet.md:49 +msgid "Each time you want to receive you should use a brand-new address, and not re-use existing addresses." +msgstr "Cada vez que quieras recibir, deberías usar una dirección completamente nueva y no reutilizar direcciones existentes." + +#: src/guides/collecting/sparrow-wallet.md:51 +msgid "" +"Note that bitcoin is different to some other blockchain wallets, in that this wallet can generate an unlimited number of new addresses. You can generate a new address by clicking " +"on the `Get Next Address` button. You can see all of your addresses in the `Addresses` tab of the app." +msgstr "" +"Ten en cuenta que bitcoin es diferente a algunos otros monederos de blockchain, en el sentido de que el monedero de bitcoin puede generar un número ilimitado de direcciones " +"nuevas. Puedes generar una dirección nueva haciendo clic en el botón `Get Next Address` (Obtener la próxima dirección). Puedes ver todas tus direcciones en la pestaña `Addresses` " +"(Direcciones)." + +#: src/guides/collecting/sparrow-wallet.md:53 +msgid "You can add a label to each address, so you can keep track of what it was used for." +msgstr "Puedes asignar una etiqueta a cada dirección, permitiéndote llevar un seguimiento de su propósito o uso." + +#: src/guides/collecting/sparrow-wallet.md:55 +msgid "![](images/wallet_setup_08.png)" +msgstr "![](images/wallet_setup_08.png)" + +#: src/guides/collecting/sparrow-wallet.md:57 +msgid "Validating / Viewing Received Inscriptions" +msgstr "Validando / Viendo Inscripciones Recibidas" + +#: src/guides/collecting/sparrow-wallet.md:59 +msgid "Once you have received an inscription you will see a new transaction in the `Transactions` tab of Sparrow, as well as a new UTXO in the `UTXOs` tab." +msgstr "" +"Una vez que hayas recibido una inscripción, podrás observar una nueva transacción en la pestaña `Transactions` (transacciones) de Sparrow, así como un nuevo UTXO en la pestaña " +"`UTXOs`." + +#: src/guides/collecting/sparrow-wallet.md:61 +msgid "Initially this transaction may have an \"Unconfirmed\" status, and you will need to wait for it to be mined into a bitcoin block before it is fully received." +msgstr "" +"Inicialmente, esta transacción puede tener un estado \"Unconfirmed o No confirmado\", y tendrás que esperar a que sea minada en un bloque de bitcoin antes de que la recibas por " +"completo." + +#: src/guides/collecting/sparrow-wallet.md:63 +msgid "![](images/validating_viewing_01.png)" +msgstr "![](images/validating_viewing_01.png)" + +#: src/guides/collecting/sparrow-wallet.md:65 +msgid "" +"To track the status of your transaction you can right-click on it, select `Copy Transaction ID` and then paste that transaction id into [mempool.space](https://mempool.space)." +msgstr "" +"Para rastrear el estado de tu transacción, puedes hacer clic derecho sobre ella, seleccionar `Copy Transaction ID` (Copiar ID de Transacción) y luego pegar ese ID en el buscador " +"de [mempool.space](https://mempool.space)." + +#: src/guides/collecting/sparrow-wallet.md:67 +msgid "![](images/validating_viewing_02.png)" +msgstr "![](images/validating_viewing_02.png)" + +#: src/guides/collecting/sparrow-wallet.md:69 +msgid "" +"Once the transaction has confirmed, you can validate and view your inscription by heading over to the `UTXOs` tab, finding the UTXO you want to check, right-clicking on the " +"`Output` and selecting `Copy Transaction Output`. This transaction output id can then be pasted into the [ordinals.com](https://ordinals.com) search." +msgstr "" +"Una vez que la transacción se confirme, puedes validar y visualizar tu inscripción dirigiéndote a la pestaña de `UTXO`s, encuentra el UTXO que deseas verificar, y haz clic " +"derecho sobre `Output` (Salida) y selecciona `Copy Transaction Output` (Copiar Salida de Transacción). Puedes pegar este ID de salida de transacción en el buscador de [ordinals." +"com](https://ordinals.com) para proceder con la verificación." + +#: src/guides/collecting/sparrow-wallet.md:72 +msgid "Freezing UTXO's" +msgstr "Congelar UTXO's" + +#: src/guides/collecting/sparrow-wallet.md:73 +msgid "" +"As explained above, each of your inscriptions is stored in an Unspent Transaction Output (UTXO). You want to be very careful not to accidentally spend your inscriptions, and one " +"way to make it harder for this to happen is to freeze the UTXO." +msgstr "" +"Como se explicó anteriormente, cada una de tus inscripciones está almacenada en una Salida de Transacción No Gastado (UTXO). Debes tener mucho cuidado de no gastar " +"accidentalmente tus inscripciones. Una manera de prevenir esto es congelar el UTXO correspondiente." + +#: src/guides/collecting/sparrow-wallet.md:75 +msgid "To do this, go to the `UTXOs` tab, find the UTXO you want to freeze, right-click on the `Output` and select `Freeze UTXO`." +msgstr "Para hacerlo, ve a la pestaña `UTXOs`, encuentra el UTXO que deseas congelar, haz clic derecho en `Output` y selecciona `Frreeze UTXO` (Congelar UTXO)." + +#: src/guides/collecting/sparrow-wallet.md:77 +msgid "This UTXO (Inscription) is now un-spendable within the Sparrow Wallet until you unfreeze it." +msgstr "Este UTXO (Inscripción) no se podrá gastar dentro del Monedero Sparrow hasta que lo descongeles." + +#: src/guides/collecting/sparrow-wallet.md:79 +msgid "Importing into `ord` wallet" +msgstr "Importando al monedero ord" + +#: src/guides/collecting/sparrow-wallet.md:81 +msgid "For details on setting up Bitcoin Core and the `ord` wallet check out the [Wallet Guide](../wallet.md)" +msgstr "Para obtener detalles sobre cómo configurar Bitcoin Core y la billetera `ord`, consulta la [Guía de la Billetera](../wallet.md)" + +#: src/guides/collecting/sparrow-wallet.md:83 +msgid "" +"When setting up `ord`, instead of running `ord wallet create` to create a brand-new wallet, you can import your existing wallet using `ord wallet restore \"BIP39 SEED PHRASE\"` " +"using the seed phrase you generated with Sparrow Wallet." +msgstr "" +"Cuando configures `ord`, en lugar de ejecutar `ord wallet create` para crear un nuevo monedero, puedes importar tu monedero existente usando `ord wallet restore \"BIP39 SEED " +"PHRASE\"` con la frase semilla que generaste en el monedero Sparrow." + +#: src/guides/collecting/sparrow-wallet.md:85 +msgid "" +"There is currently a [bug](https://github.com/ordinals/ord/issues/1589) which causes an imported wallet to not be automatically rescanned against the blockchain. To work around " +"this you will need to manually trigger a rescan using the bitcoin core cli: `bitcoin-cli -rpcwallet=ord rescanblockchain 767430`" +msgstr "" +"Actualmente hay un [bug](https://github.com/ordinals/ord/issues/1589) que impide que un monedero importado no se escanee automáticamente para encontrar su contenido en la " +"blockchain. Para solucionar esto tendrás que ejecutar manualmente un escaneo usando el cli de `bitcoin core: bitcoin-cli -rpcwallet=ord rescanblockchain 767430`" + +#: src/guides/collecting/sparrow-wallet.md:88 +msgid "You can then check your wallet's inscriptions using `ord wallet inscriptions`" +msgstr "Luego puedes revisar las inscripciones de tu monedero usando `ord wallet inscriptions`" + +#: src/guides/collecting/sparrow-wallet.md:90 +msgid "" +"Note that if you have previously created a wallet with `ord`, then you will already have a wallet with the default name, and will need to give your imported wallet a different " +"name. You can use the `--wallet` parameter in all `ord` commands to reference a different wallet, eg:" +msgstr "" +"Ten en cuenta que si has creado previamente una cartera con `ord`, ya tendrás una cartera con el nombre predeterminado y tendrás que darle un nombre diferente a tu cartera " +"importada. Puedes usar el parámetro `--wallet` en todos los comandos de `ord` para hacer referencia a un monedero diferente, por ejemplo:" + +#: src/guides/collecting/sparrow-wallet.md:92 +msgid "`ord wallet --name ord_from_sparrow wallet restore --from mnemonic`" +msgstr "`ord wallet --name ord_from_sparrow wallet restore --from mnemonic`" + +#: src/guides/collecting/sparrow-wallet.md:94 +msgid "`ord wallet --name ord_from_sparrow wallet inscriptions`" +msgstr "`ord wallet --name ord_from_sparrow wallet inscriptions`" + +#: src/guides/collecting/sparrow-wallet.md:96 +msgid "`bitcoin-cli -rpcwallet=ord_from_sparrow rescanblockchain 767430`" +msgstr "`bitcoin-cli -rpcwallet=ord_from_sparrow rescanblockchain 767430`" + +#: src/guides/collecting/sparrow-wallet.md:98 +msgid "Sending inscriptions with Sparrow Wallet" +msgstr "Enviar inscripciones con el Monedero Sparrow" + +#: src/guides/collecting/sparrow-wallet.md:100 +msgid "⚠️⚠️ Warning ⚠️⚠️" +msgstr "⚠️⚠️ Advertencia ⚠️⚠️" + +#: src/guides/collecting/sparrow-wallet.md:101 +msgid "" +"While it is highly recommended that you set up a bitcoin core node and run the `ord` software, there are certain limited ways you can send inscriptions out of Sparrow Wallet in a " +"safe way. Please note that this is not recommended, and you should only do this if you fully understand what you are doing." +msgstr "" +"Aunque es bastante recomendado que configures un nodo de bitcoin core y ejecutes el software `ord`, existen algunas formas limitadas de enviar inscripciones desde el monedero " +"Sparrow de manera segura. Sin embargo, cabe señalar que esta no es la opción más recomendada y solo deberías proceder si entiendes completamente las implicaciones y riesgos de lo " +"que estás haciendo." + +#: src/guides/collecting/sparrow-wallet.md:103 +msgid "Using the `ord` software will remove much of the complexity we are describing here, as it is able to automatically and safely handle sending inscriptions in an easy way." +msgstr "" +"Usar el software de `ord` eliminará gran parte de la complejidad que estamos describiendo aquí, permitiéndote manejar el envío de inscripciones de forma automática y segura con " +"mayor facilidad." + +#: src/guides/collecting/sparrow-wallet.md:105 +msgid "⚠️⚠️ Additional Warning ⚠️⚠️" +msgstr "⚠️⚠️ Advertencia Adicional ⚠️⚠️" + +#: src/guides/collecting/sparrow-wallet.md:106 +msgid "" +"Don't use your sparrow inscriptions wallet to do general sends of non-inscription bitcoin. You can setup a separate wallet in sparrow if you need to do normal bitcoin " +"transactions, and keep your inscriptions wallet separate." +msgstr "" +"No uses tu monedero de inscripciones de Sparrow para hacer envíos de bitcoin que no involucren inscripciones. Puedes configurar un monedero por separado en Sparrow para gestionar " +"tus transacciones regulares de bitcoin, manteniendo así tu monedero de inscripciones aislado." + +#: src/guides/collecting/sparrow-wallet.md:108 +msgid "Bitcoin's UTXO model" +msgstr "Modelo UTXO de Bitcoin" + +#: src/guides/collecting/sparrow-wallet.md:109 +msgid "" +"Before sending any transaction it's important that you have a good mental model for bitcoin's Unspent Transaction Output (UTXO) system. The way Bitcoin works is fundamentally " +"different to many other blockchains such as Ethereum. In Ethereum generally you have a single address in which you store ETH, and you cannot differentiate between any of the ETH " +"- it is just all a single value of the total amount in that address. Bitcoin works very differently in that we generate a new address in the wallet for each receive, and every " +"time you receive sats to an address in your wallet you are creating a new UTXO. Each UTXO can be seen and managed individually. You can select specific UTXO's which you want to " +"spend, and you can choose not to spend certain UTXO's." +msgstr "" +"Antes de enviar cualquier transacción, es importante que entiendas a profundidad cómo funciona el sistema de Salidas de Transacciones No Gastadas (UTXO) de Bitcoin. La forma en " +"que funciona Bitcoin es fundamentalmente diferente a muchas otras cadenas de bloques, como Ethereum. En Ethereum, generalmente tienes una única dirección en la que almacenas ETH, " +"y no puedes diferenciar entre ninguno de los ETH: simplemente es un valor único del total acumulado en esa dirección. Bitcoin funciona de manera muy diferente, ya que generamos " +"una nueva dirección en el monedero para cada recepción, y cada vez que recibes sats en una dirección de tu monedero estás creando un nuevo UTXO. Cada UTXO se puede ver y " +"gestionar individualmente. Puedes seleccionar específicamente los UTXO que deseas gastar, y puedes elegir no gastar ciertos UTXO." + +#: src/guides/collecting/sparrow-wallet.md:111 +msgid "" +"Some Bitcoin wallets do not expose this level of detail, and they just show you a single summed up value of all the bitcoin in your wallet. However, when sending inscriptions it " +"is important that you use a wallet like Sparrow which allows for UTXO control." +msgstr "" +"Algunos monederos de Bitcoin no exponen este nivel de detalle y solo te muestran un valor único que suma todo el bitcoin en tu monedero. Sin embargo, al enviar inscripciones, es " +"importante que uses un monedero como Sparrow que permite el control de UTXO." + +#: src/guides/collecting/sparrow-wallet.md:113 +msgid "Inspecting your inscription before sending" +msgstr "Inspeccionando tu inscripción antes de enviarla" #: src/guides/collecting/sparrow-wallet.md:114 msgid "" -"Like we have previously described inscriptions are inscribed onto sats, and " -"sats are stored within UTXOs. UTXO's are a collection of satoshis with some " -"particular value of the number of satoshis (the output value). Usually (but " -"not always) the inscription will be inscribed on the first satoshi in the " -"UTXO." +"Like we have previously described inscriptions are inscribed onto sats, and sats are stored within UTXOs. UTXO's are a collection of satoshis with some particular value of the " +"number of satoshis (the output value). Usually (but not always) the inscription will be inscribed on the first satoshi in the UTXO." +msgstr "" +"Como hemos descrito anteriormente, las inscripciones están inscritas en sats, y los sats se almacenan dentro de los UTXO. Los UTXO son una colección de satoshis con un valor " +"particular del número de satoshis (el valor de salida). Usualmente (pero no siempre) la inscripción estará inscrita en el primer satoshi del UTXO." + +#: src/guides/collecting/sparrow-wallet.md:116 +msgid "When inspecting your inscription before sending the main thing you will want to check is which satoshi in the UTXO your inscription is inscribed on." +msgstr "Al inspeccionar tu inscripción antes de enviar, lo principal que querrás verificar es en cual satoshi del UTXO está inscrita tu inscripción." + +#: src/guides/collecting/sparrow-wallet.md:118 +msgid "" +"To do this, you can follow the [Validating / Viewing Received Inscriptions](./sparrow-wallet.md#validating--viewing-received-inscriptions) described above to find the inscription " +"page for your inscription on ordinals.com" +msgstr "" +"Para hacer esto, puedes leer [Validando / Viendo las Inscripciones Recibidas](./sparrow-wallet.md#validating--viewing-received-inscriptions) descritas anteriormente para " +"encontrar la página de inscripción de tu inscripción en ordinals.com" + +#: src/guides/collecting/sparrow-wallet.md:120 +msgid "There you will find some metadata about your inscription which looks like the following:" +msgstr "Allí encontrarás algunos metadatos sobre tu inscripción, se verá así:" + +#: src/guides/collecting/sparrow-wallet.md:122 +msgid "![](images/sending_01.png)" +msgstr "![](images/sending_01.png)" + +#: src/guides/collecting/sparrow-wallet.md:124 +msgid "There is a few of important things to check here:" +msgstr "Hay varias cosas importantes que verificar en este punto:" + +#: src/guides/collecting/sparrow-wallet.md:125 +msgid "The `output` identifier matches the identifier of the UTXO you are going to send" +msgstr "Que el identificador de `output` coincida con el identificador del UTXO que vas a enviar" + +#: src/guides/collecting/sparrow-wallet.md:126 +msgid "The `offset` of the inscription is `0` (this means that the inscription is located on the first sat in the UTXO)" +msgstr "Que el `offset` (desplazamiento) de la inscripción sea `0` (esto significa que la inscripción está ubicada en el primer sat del UTXO)" + +#: src/guides/collecting/sparrow-wallet.md:127 +msgid "" +"the `output_value` has enough sats to cover the transaction fee (postage) for sending the transaction. The exact amount you will need depends on the fee rate you will select for " +"the transaction" +msgstr "" +"que el valor de ‘output_value’ tenga suficientes sats para cubrir la tarifa de transacción (postage) para enviar la transacción. La cantidad exacta que necesitarás dependerá de " +"la tasa de comisión que seleccionarás para la transacción" + +#: src/guides/collecting/sparrow-wallet.md:129 +msgid "If all of the above are true for your inscription, it should be safe for you to send it using the method below." +msgstr "Si todo lo anterior se sostiene para tu inscripción, deberías poder proceder con seguridad usando el siguiente método." + +#: src/guides/collecting/sparrow-wallet.md:131 +msgid "" +"⚠️⚠️ Be very careful sending your inscription particularly if the `offset` value is not `0`. It is not recommended to use this method if that is the case, as doing so you could " +"accidentally send your inscription to a bitcoin miner unless you know what you are doing." +msgstr "" +"⚠️⚠️ Ten mucho cuidado al enviar tu inscripción, especialmente si el `offset` no es `0`. En tales casos, no se recomienda utilizar este método, ya que podrías enviar " +"accidentalmente tu inscripción a un minero de bitcoin a menos que sepas lo que estás haciendo." + +#: src/guides/collecting/sparrow-wallet.md:133 +msgid "Sending your inscription" +msgstr "Enviando tu inscripción" + +#: src/guides/collecting/sparrow-wallet.md:134 +msgid "To send an inscription navigate to the `UTXOs` tab, and find the UTXO which you previously validated contains your inscription." +msgstr "Para enviar una inscripción, ve a la pestaña `UTXOs` y encuentra el UTXO que previamente validaste y que contiene tu inscripción." + +#: src/guides/collecting/sparrow-wallet.md:136 +msgid "If you previously froze the UXTO you will need to right-click on it and unfreeze it." +msgstr "Si anteriormente habías congelado este UTXO, deberás hacer clic derecho sobre él para descongelarlo." + +#: src/guides/collecting/sparrow-wallet.md:138 +msgid "" +"Select the UTXO you want to send, and ensure that is the _only_ UTXO is selected. You should see `UTXOs 1/1` in the interface. Once you are sure this is the case you can hit " +"`Send Selected`." +msgstr "" +"Selecciona el UTXO que deseas enviar, y asegúrate de que sea el _único_ UTXO seleccionado. Deberías ver una indicación de `UTXOs 1/1` en la interfaz. Una vez estés absolutamente " +"seguro de haber seleccionado el UTXO correcto, haz clic en `Send Selected` (Enviar seleccionados)." + +#: src/guides/collecting/sparrow-wallet.md:140 +msgid "![](images/sending_02.png)" +msgstr "![](images/sending_02.png)" + +#: src/guides/collecting/sparrow-wallet.md:142 +msgid "You will then be presented with the transaction construction interface. There is a few things you need to check here to make sure that this is a safe send:" +msgstr "Luego se te presentará la interfaz de construcción de transacciones. Hay algunas cosas que debes verificar aquí para asegurarte de que se trata de un envío seguro:" + +#: src/guides/collecting/sparrow-wallet.md:144 +msgid "The transaction should have only 1 input, and this should be the UTXO with the label you want to send" +msgstr "La transacción debería tener solo 1 input (entrada), y esta debería ser el UTXO con la etiqueta que quieres enviar." + +#: src/guides/collecting/sparrow-wallet.md:145 +msgid "The transaction should have only 1 output, which is the address/label where you want to send the inscription" +msgstr "La transacción debería tener solo 1 output (salida), siendo esta la dirección/etiqueta a donde deseas enviar la inscripción" + +#: src/guides/collecting/sparrow-wallet.md:147 +msgid "" +"If your transaction looks any different, for example you have multiple inputs, or multiple outputs then this may not be a safe transfer of your inscription, and you should " +"abandon sending until you understand more, or can import into the `ord` wallet." +msgstr "" +"Si tu transacción luce diferente, por ejemplo, tiene múltiples entradas o múltiples salidas, entonces quizás no sea una transferencia segura de tu inscripción, y deberías detener " +"el envío hasta entender completamente el procedimiento, o hasta que logres importarla al monedero `ord`." + +#: src/guides/collecting/sparrow-wallet.md:149 +msgid "" +"You should set an appropriate transaction fee, Sparrow will usually recommend a reasonable one, but you can also check [mempool.space](https://mempool.space) to see what the " +"recommended fee rate is for sending a transaction." +msgstr "" +"Es necesario fijar una comisión de transacción adecuada; Sparrow normalmente sugerirá una adecuada, aunque también puedes ir a [mempool.space](https://mempool.space) para conocer " +"la tarifa recomendada para enviar una transacción." + +#: src/guides/collecting/sparrow-wallet.md:151 +msgid "You should add a label for the recipient address, a label like `alice address for inscription #123` would be ideal." +msgstr "Deberías añadir una etiqueta para la dirección del destinatario; una etiqueta como dirección de `Alice para la inscripción #123` sería ideal." + +#: src/guides/collecting/sparrow-wallet.md:153 +msgid "Once you have checked the transaction is a safe transaction using the checks above, and you are confident to send it you can click `Create Transaction`." +msgstr "" +"Una vez que hayas verificado que la transacción es segura usando los criterios mencionados anteriormente, y te sientas seguro de enviarla, puedes hacer clic en `Create " +"Transaction` (Crear Transacción)." + +#: src/guides/collecting/sparrow-wallet.md:155 +msgid "![](images/sending_03.png)" +msgstr "![](images/sending_03.png)" + +#: src/guides/collecting/sparrow-wallet.md:157 +msgid "Here again you can double check that your transaction looks safe, and once you are confident you can click `Finalize Transaction for Signing`." +msgstr "" +"Aquí puedes volver a revisar que tu transacción este correcta, una vez estés seguro puedes hacer clic en `Finalize Transaction for Signing` (Finalizar Transacción para Firmar)." + +#: src/guides/collecting/sparrow-wallet.md:159 +msgid "![](images/sending_04.png)" +msgstr "![](images/sending_04.png)" + +#: src/guides/collecting/sparrow-wallet.md:161 +msgid "Here you can triple check everything before hitting `Sign`." +msgstr "Aquí puedes revisar toda una vez más antes de hacer clic en `Sign` (Firmar)." + +#: src/guides/collecting/sparrow-wallet.md:163 +msgid "![](images/sending_05.png)" +msgstr "![](images/sending_05.png)" + +#: src/guides/collecting/sparrow-wallet.md:165 +msgid "" +"And then actually you get very very last chance to check everything before hitting `Broadcast Transaction`. Once you broadcast the transaction it is sent to the bitcoin network, " +"and starts being propagated into the mempool." +msgstr "" +"Y luego, de hecho, tienes la última oportunidad de verificar todo antes de hacer clic en `Broadcast Transaction` (Transmitir Transacción). Una vez que transmites la transacción, " +"se envía a la red de Bitcoin y comenzara a propagarse en el mempool." + +#: src/guides/collecting/sparrow-wallet.md:167 +msgid "![](images/sending_06.png)" +msgstr "![](images/sending_06.png)" + +#: src/guides/collecting/sparrow-wallet.md:169 +msgid "If you want to track the status of your transaction you can copy the `Transaction Id (Txid)` and paste that into [mempool.space](https://mempool.space)" +msgstr "" +"Si deseas rastrear el estado de tu transacción, puedes copiar el `Transaction (txid)` (Identificador de la Transacción (Txid)) y pegarlo en [mempool.space](https://mempool.space)" + +#: src/guides/collecting/sparrow-wallet.md:171 +msgid "" +"Once the transaction has confirmed you can check the inscription page on [ordinals.com](https://ordinals.com) to validate that it has moved to the new output location and address." msgstr "" -"Como hemos descrito anteriormente, las inscripciones están inscritas en sats, " -"y los sats se almacenan dentro de los UTXO. Los UTXO son una colección de satoshis " -"con un valor particular del número de satoshis (el valor de salida). Usualmente " -"(pero no siempre) la inscripción estará inscrita en el primer satoshi del UTXO." +"Cuando la transacción haya sido confirmada, puedes revisar la página de inscripciones en [ordinals.com](https://ordinals.com) para confirmar que ha sido movida a la nueva " +"ubicación de salida y dirección." -#: src/guides/collecting/sparrow-wallet.md:116 +#: src/guides/collecting/sparrow-wallet.md:175 +msgid "Sparrow wallet is not showing a transaction/UTXO, but I can see it on mempool.space!" +msgstr "¡El monedero Sparrow no está mostrando una transacción/UTXO, pero puedo verla en mempool.space!" + +#: src/guides/collecting/sparrow-wallet.md:177 +msgid "Make sure that your wallet is connected to a bitcoin node. To validate this, head into the `Preferences`\\-> `Server` settings, and click `Edit Existing Connection`." +msgstr "" +"Asegúrate de que tu monedero esté conectado a un nodo de bitcoin. Para validar esto, dirígete a `Preferences`-> `Server settings` y haz clic en `Edit Existing Connection` (Editar " +"conexión existente)." + +#: src/guides/collecting/sparrow-wallet.md:179 +msgid "![](images/troubleshooting_01.png)" +msgstr "![](images/troubleshooting_01.png)" + +#: src/guides/collecting/sparrow-wallet.md:181 +msgid "From there you can select a node and click `Test Connection` to validate that Sparrow is able to connect successfully." +msgstr "Desde allí puedes seleccionar un nodo y hacer clic en `Test Connection` (Probar conexión) para validar que Sparrow pueda conectarse exitosamente." + +#: src/guides/collecting/sparrow-wallet.md:183 +msgid "![](images/troubleshooting_02.png)" +msgstr "![](images/troubleshooting_02.png)" + +#: src/guides/moderation.md:4 +msgid "`ord` includes a block explorer, which you can run locally with `ord server`." +msgstr "ord incluye un explorador de bloques, el cual puedes ejecutar localmente utilizando `ord server`." + +#: src/guides/moderation.md:6 +msgid "The block explorer allows viewing inscriptions. Inscriptions are user-generated content, which may be objectionable or unlawful." +msgstr "El explorador de bloques ofrece la visualización de inscripciones, las cuales son contenidos generados por usuarios y podrían ser inapropiados o ilicitos." + +#: src/guides/moderation.md:9 +msgid "" +"It is the responsibility of each individual who runs an ordinal block explorer instance to understand their responsibilities with respect to unlawful content, and decide what " +"moderation policy is appropriate for their instance." +msgstr "" +"Quien decida ejecutar una instancia del explorador de bloques de ordinal debe ser consciente de sus responsabilidades ante contenidos ilegales y definir una política de " +"moderación adecuada para su propia instancia." + +#: src/guides/moderation.md:13 +msgid "" +"In order to prevent particular inscriptions from being displayed on an `ord` instance, they can be included in a YAML config file, which is loaded with the `--config` option." +msgstr "" +"Para prevenir que ciertas inscripciones se muestren en una instancia de `ord`, estas pueden incluirse en un archivo de configuración YAML, el cual se carga utilizando la opción " +"`--config`." + +#: src/guides/moderation.md:17 +msgid "To hide inscriptions, first create a config file, with the inscription ID you want to hide:" +msgstr "Para comenzar a ocultar inscripciones, crea un archivo de configuración con el ID de la inscripción que quieres esconder:" + +#: src/guides/moderation.md:21 src/guides/settings.md:51 src/guides/settings.md:87 +msgid "hidden" +msgstr "oculto" + +#: src/guides/moderation.md:22 +msgid "0000000000000000000000000000000000000000000000000000000000000000i0" +msgstr "0000000000000000000000000000000000000000000000000000000000000000i0" + +#: src/guides/moderation.md:25 +msgid "The suggested name for `ord` config files is `ord.yaml`, but any filename can be used." +msgstr "Aunque se recomienda nombrar los archivos de configuración de `ord` como `ord.yaml`, puedes utilizar cualquier otro nombre que prefieras." + +#: src/guides/moderation.md:28 +msgid "Then pass the file to `--config` when starting the server:" +msgstr "Luego pasa el archivo a `--config` cuando inicies el servidor:" + +#: src/guides/moderation.md:30 +msgid "`ord --config ord.yaml server`" +msgstr "`ord --config ord.yaml server`" + +#: src/guides/moderation.md:32 +msgid "Note that the `--config` option comes after `ord` but before the `server` subcommand." +msgstr "Ten en cuenta que la opción `--config` va después de `ord` pero antes del subcomando `server`." + +#: src/guides/moderation.md:35 +msgid "`ord` must be restarted in to load changes to the config file." +msgstr "Deberás reiniciar ord para cargar los cambios realizados en el archivo de configuración." + +#: src/guides/moderation.md:37 +msgid "`ordinals.com`" +msgstr "`ordinals.com`" + +#: src/guides/moderation.md:40 +msgid "The `ordinals.com` instances use `systemd` to run the `ord server` service, which is called `ord`, with a config file located at `/var/lib/ord/ord.yaml`." +msgstr "" +"Las instancias de `ordinals.com` utilizan `system` para ejecutar el servicio del `servidor ord`, que se llama `ord`, con un archivo de configuración situado en `/var/lib/ord/ord." +"yaml`." + +#: src/guides/moderation.md:43 +msgid "To hide an inscription on `ordinals.com`:" +msgstr "Para ocultar una inscripción en `ordinals.com`:" + +#: src/guides/moderation.md:45 +msgid "SSH into the server" +msgstr "Ingresa al servidor a través de SSH" + +#: src/guides/moderation.md:46 +msgid "Add the inscription ID to `/var/lib/ord/ord.yaml`" +msgstr "Añade el ID de la inscripción a `/var/lib/ord/ord.yaml`" + +#: src/guides/moderation.md:47 +msgid "Restart the service with `systemctl restart ord`" +msgstr "Reinicia el servicio utilizando el comando `systemctl restart ord`" + +#: src/guides/moderation.md:48 +msgid "Monitor the restart with `journalctl -u ord`" +msgstr "Supervisa el reinicio con el comando `journalctl -u ord`" + +#: src/guides/moderation.md:50 +msgid "Currently, `ord` is slow to restart, so the site will not come back online immediately." +msgstr "Actualmente, `ord` tarda en reiniciarse, por lo que el sitio no volverá a estar en línea inmediatamente." + +#: src/guides/reindexing.md:4 +msgid "" +"Sometimes the `ord` database must be reindexed, which means deleting the database and restarting the indexing process with either `ord index update` or `ord server`. Reasons to " +"reindex are:" +msgstr "" +"En ocasiones, la base de datos de ord debe ser reindexada, esto implica eliminar la base de datos y reiniciar el proceso de indexación con el comando `ord index` update u `ord " +"server`. Las razones para reindexar son:" + +#: src/guides/reindexing.md:8 +msgid "A new major release of ord, which changes the database scheme" +msgstr "Un nuevo lanzamiento grande de ord, que modifica el esquema de la base de datos" + +#: src/guides/reindexing.md:9 +msgid "The database got corrupted somehow" +msgstr "Corrupción de la base de datos por alguna razón" + +#: src/guides/reindexing.md:11 +msgid "" +"The database `ord` uses is called [redb](https://github.com/cberner/redb), so we give the index the default file name `index.redb`. By default we store this file in different " +"locations depending on your operating system." +msgstr "" +"La base de datos que utiliza ord se llama [redb](https://github.com/cberner/redb), por lo que se le asigna al índice el nombre de archivo predeterminado `index.redb`. Este " +"archivo se guarda de forma predeterminada en distintas ubicaciones, según el sistema operativo que estés utilizando." + +#: src/guides/reindexing.md:15 +msgid "Platform" +msgstr "Plataforma" + +#: src/guides/reindexing.md:15 +msgid "Value" +msgstr "Valor" + +#: src/guides/reindexing.md:17 +msgid "Linux" +msgstr "Linux" + +#: src/guides/reindexing.md:17 +msgid "`$XDG_DATA_HOME`/ord or `$HOME`/.local/share/ord" +msgstr "`$XDG_DATA_HOME`/ord or `$HOME`/.local/share/ord" + +#: src/guides/reindexing.md:17 +msgid "/home/alice/.local/share/ord" +msgstr "/home/alice/.local/share/ord" + +#: src/guides/reindexing.md:18 +msgid "macOS" +msgstr "macOS" + +#: src/guides/reindexing.md:18 +msgid "`$HOME`/Library/Application Support/ord" +msgstr "`$HOME`/Library/Application Support/ord" + +#: src/guides/reindexing.md:18 +msgid "/Users/Alice/Library/Application Support/ord" +msgstr "/Users/Alice/Library/Application Support/ord" + +#: src/guides/reindexing.md:19 +msgid "Windows" +msgstr "Windows" + +#: src/guides/reindexing.md:19 +msgid "`{FOLDERID_RoamingAppData}`\\\\ord" +msgstr "`{FOLDERID_RoamingAppData}`\\\\ord" + +#: src/guides/reindexing.md:19 +msgid "C:\\Users\\Alice\\AppData\\Roaming\\ord" +msgstr "C:\\Users\\Alice\\AppData\\Roaming\\ord" + +#: src/guides/reindexing.md:21 +msgid "So to delete the database and reindex on MacOS you would have to run the following commands in the terminal:" +msgstr "Para eliminar la base de datos y reindexar en MacOS, tendrías que ejecutar los siguientes comandos en la terminal:" + +#: src/guides/reindexing.md:29 +msgid "" +"You can of course also set the location of the data directory yourself with `ord --datadir index update` or give it a specific filename and path with `ord --index " +" index update`." +msgstr "" +"También tienes la opción de determinar la ubicación del directorio de datos utilizando el comando `ord --datadir index update` o asignarle un nombre de archivo y ruta " +"específicos utilizando el comando `ord --index index update`." + +#: src/guides/sat-hunting.md:4 +msgid "Ordinal hunting is difficult but rewarding. The feeling of owning a wallet full of UTXOs, redolent with the scent of rare and exotic sats, is beyond compare." +msgstr "La caza de Ordinals es difícil pero gratificante. La sensación de poseer un monedero lleno de UTXOs, impregnado con el aroma de sats raros y exóticos, es incomparable." + +#: src/guides/sat-hunting.md:7 +msgid "Ordinals are numbers for satoshis. Every satoshi has an ordinal number and every ordinal number has a satoshi." +msgstr "Los Ordinales son números para los satoshis. Cada satoshi tiene un número ordinal y cada número ordinal tiene un satoshi." + +#: src/guides/sat-hunting.md:10 +msgid "Preparation" +msgstr "Preparación" + +#: src/guides/sat-hunting.md:13 +msgid "There are a few things you'll need before you start." +msgstr "Antes de empezar, necesitarás algunas cosas." + +#: src/guides/sat-hunting.md:15 +msgid "First, you'll need a synced Bitcoin Core node with a transaction index. To turn on transaction indexing, pass `-txindex` on the command-line:" +msgstr "" +"Primero, necesitarás un nodo de Bitcoin Core sincronizado con un índice de transacciones. Para activar la indexación de transacciones, ejecuta `-txindex` en la línea de comandos:" + +#: src/guides/sat-hunting.md:22 +msgid "Or put the following in your [Bitcoin configuration file](https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md#configuration-file-path):" +msgstr "O escribe lo siguiente en tu [Archivo de Configuración de Bitcoin](https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md#configuration-file-path)::" + +#: src/guides/sat-hunting.md:29 +msgid "Launch it and wait for it to catch up to the chain tip, at which point the following command should print out the current block height:" +msgstr "Ejecutalo y espera hasta que llegue al final de la cadena; una vez hecho esto, el siguiente comando debería imprimir la altura del bloque actual:" + +#: src/guides/sat-hunting.md:36 +msgid "Second, you'll need a synced `ord` index." +msgstr "En segundo lugar, vas a necesitar un índice de `ord` sincronizado." + +#: src/guides/sat-hunting.md:38 +msgid "Get a copy of `ord` from [the repo](https://github.com/ordinals/ord/)." +msgstr "Obtén una copia de `ord` desde el [repositorio](https://github.com/ordinals/ord/).." + +#: src/guides/sat-hunting.md:40 +msgid "Run `ord --index-sats server`. It should connect to your bitcoin core node and start indexing." +msgstr "Ejecuta `ord --index-sats server`. Esto debería conectar con tu nodo de Bitcoin Core y comenzar el indexado." + +#: src/guides/sat-hunting.md:42 +msgid "Once it has finished indexing, leave the server running and submit new `ord` commands in a separate terminal session." +msgstr "Once it has finished indexing, leave the server running and submit new `ord` commands in a separate terminal session." + +#: src/guides/sat-hunting.md:44 +msgid "Third, you'll need a wallet with UTXOs that you want to search." +msgstr "En tercer lugar, necesitarás un monedero con los UTXOs que quieras analizar." + +#: src/guides/sat-hunting.md:46 +msgid "Searching for Rare Ordinals" +msgstr "Buscando Ordinals Raros" + +#: src/guides/sat-hunting.md:49 +msgid "Searching for Rare Ordinals in a Bitcoin Core Wallet" +msgstr "Buscando Ordinals Raros en un Monedero de Bitcoin Core" + +#: src/guides/sat-hunting.md:51 +msgid "" +"The `ord wallet` command is just a wrapper around Bitcoin Core's RPC API, so searching for rare ordinals in a Bitcoin Core wallet is Easy. Assuming your wallet is named `foo`:" +msgstr "" +"El comando `ord walle`t es solo un envoltorio alrededor de la API RPC de Bitcoin Core, así que buscar ordinals raros en un monedero de Bitcoin Core es fácil. Digamos que tu " +"monedero se llama `foo`:" + +#: src/guides/sat-hunting.md:55 +msgid "Load your wallet:" +msgstr "Carga tu monedero:" + +#: src/guides/sat-hunting.md:61 +msgid "Display any rare ordinals wallet `foo`'s UTXOs:" +msgstr "Visualiza los UTXOs raros del monedero de ordinales `foo`:" + +#: src/guides/sat-hunting.md:67 +msgid "Searching for Rare Ordinals in a Non-Bitcoin Core Wallet" +msgstr "Buscando Ordinals Raros en un Monedero que no es de Bitcoin Core" + +#: src/guides/sat-hunting.md:69 +msgid "" +"The `ord wallet` command is just a wrapper around Bitcoin Core's RPC API, so to search for rare ordinals in a non-Bitcoin Core wallet, you'll need to import your wallet's " +"descriptors into Bitcoin Core." +msgstr "" +"El comando `ord wallet` es solo un envoltorio alrededor de la API RPC de Bitcoin Core, así que para buscar ordinales raros en un monedero que no es de Bitcoin Core, necesitarás " +"importar los descriptores de tu monedero a Bitcoin Core." + +#: src/guides/sat-hunting.md:73 +msgid "[Descriptors](https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md) describe the ways that wallets generate private keys and public keys." +msgstr "Los [descriptors](https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md) describen la manera en que los monederos generan llaves privadas y públicas." + +#: src/guides/sat-hunting.md:76 +msgid "You should only import descriptors into Bitcoin Core for your wallet's public keys, not its private keys." +msgstr "Solo deberías importar los descriptores en Bitcoin Core para las claves públicas de tu monedero, no para las claves privadas." + +#: src/guides/sat-hunting.md:79 +msgid "If your wallet's public key descriptor is compromised, an attacker will be able to see your wallet's addresses, but your funds will be safe." +msgstr "Si el descriptor de llave pública de tu monedero está comprometido, un atacante podrá ver las direcciones de tu monedero, pero tus fondos estarán seguros." + +#: src/guides/sat-hunting.md:82 +msgid "If your wallet's private key descriptor is compromised, an attacker can drain your wallet of funds." +msgstr "Si el descriptor de llave privada de tu monedero está comprometido, un atacante podrá vaciar los fondos de tu monedero." + +#: src/guides/sat-hunting.md:85 +msgid "Get the wallet descriptor from the wallet whose UTXOs you want to search for rare ordinals. It will look something like this:" +msgstr "Obtén el descriptor del monedero cuyos UTXOs quieres analizar para identificar si contiene ordinals raros. Se verá algo así:" + +#: src/guides/sat-hunting.md:92 +msgid "Create a watch-only wallet named `foo-watch-only`:" +msgstr "Crea un monedero de solo lectura llamada `foo-solo-lectura`:" + +#: src/guides/sat-hunting.md:98 +msgid "Feel free to give it a better name than `foo-watch-only`!" +msgstr "¡Siéntete libre de elegir un nombre major que `foo-solo-lectura`!" + +#: src/guides/sat-hunting.md:100 +msgid "Load the `foo-watch-only` wallet:" +msgstr "Carga el monedero `foo-solo-lectura`:" + +#: src/guides/sat-hunting.md:106 +msgid "Import your wallet descriptors into `foo-watch-only`:" +msgstr "Importa los descriptores de tu monedero a `1foo-solo-lectura`:" + +#: src/guides/sat-hunting.md:110 +msgid "" +"'[{ \"desc\": \"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\", " +"\"timestamp\":0 }]'" +msgstr "" +"'[{ \"desc\": \"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\", " +"\"timestamp\":0 }]'" + +#: src/guides/sat-hunting.md:113 +msgid "" +"If you know the Unix timestamp when your wallet first started receive transactions, you may use it for the value of `\"timestamp\"` instead of `0`. This will reduce the time it " +"takes for Bitcoin Core to search for your wallet's UTXOs." +msgstr "" +"Si conoces la marca de tiempo Unix cuando tu monedero comenzó a recibir transacciones, puedes usarla para el valor de `\"timestamp\"` en lugar de `0`. Esto reducirá el tiempo que " +"Bitcoin Core tardará en buscar los UTXO en tu monedero." + +#: src/guides/sat-hunting.md:118 src/guides/sat-hunting.md:219 +msgid "Check that everything worked:" +msgstr "Comprueba que todo haya funcionado correctamente:" + +#: src/guides/sat-hunting.md:124 src/guides/sat-hunting.md:225 +msgid "Display your wallet's rare ordinals:" +msgstr "Visualiza los ordinals raros de tu monedero:" + +#: src/guides/sat-hunting.md:130 +msgid "Searching for Rare Ordinals in a Wallet that Exports Multi-path Descriptors" +msgstr "Buscando Ordinals Raros en un Monedero que Exporta Descriptores de Múltiples Rutas (multi-path)" + +#: src/guides/sat-hunting.md:132 msgid "" -"When inspecting your inscription before sending the main thing you will want " -"to check is which satoshi in the UTXO your inscription is inscribed on." +"Some descriptors describe multiple paths in one descriptor using angle brackets, e.g., `<0;1>`. Multi-path descriptors are not yet supported by Bitcoin Core, so you'll first need " +"to convert them into multiple descriptors, and then import those multiple descriptors into Bitcoin Core." msgstr "" -"Al inspeccionar tu inscripción antes de enviar, lo principal que querrás verificar " -"es en cual satoshi del UTXO está inscrita tu inscripción." +"Algunos descriptores describen múltiples rutas en un descriptor utilizando paréntesis angular, por ejemplo, <0;1>. Los descriptores de múltiples rutas aún no son compatibles con " +"Bitcoin Core, así que primero deberás convertirlos en múltiples descriptores y luego importarlos a Bitcoin Core." + +#: src/guides/sat-hunting.md:137 +msgid "First get the multi-path descriptor from your wallet. It will look something like this:" +msgstr "En primer lugar, obtén el descriptor de múltiples rutas de tu monedero. Se verá algo así:" + +#: src/guides/sat-hunting.md:144 +msgid "Create a descriptor for the receive address path:" +msgstr "Crea un descriptor para la ruta de dirección que lo recibirá:" + +#: src/guides/sat-hunting.md:150 +msgid "And the change address path:" +msgstr "Y la dirección que recibirá lo que sobra de bitcoin o el cambio:" + +#: src/guides/sat-hunting.md:156 +msgid "Get and note the checksum for the receive address descriptor, in this case `tpnxnxax`:" +msgstr "Obtén y anota el checksum del descriptor de la dirección de recepción, en este caso es `tpnxnxax`:" + +#: src/guides/sat-hunting.md:161 +msgid "'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)'" +msgstr "'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)'" + +#: src/guides/sat-hunting.md:166 src/guides/sat-hunting.md:183 +msgid "\"descriptor\"" +msgstr "\"descriptor\"" + +#: src/guides/sat-hunting.md:166 +msgid "\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\"" +msgstr "\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#csvefu29\"" + +#: src/guides/sat-hunting.md:167 src/guides/sat-hunting.md:184 +msgid "\"checksum\"" +msgstr "\"checksum\"" + +#: src/guides/sat-hunting.md:167 +msgid "\"tpnxnxax\"" +msgstr "\"tpnxnxax\"" + +#: src/guides/sat-hunting.md:168 src/guides/sat-hunting.md:185 +msgid "\"isrange\"" +msgstr "\"isrange\"" + +#: src/guides/sat-hunting.md:169 src/guides/sat-hunting.md:186 +msgid "\"issolvable\"" +msgstr "\"issolvable\"" + +#: src/guides/sat-hunting.md:170 src/guides/sat-hunting.md:187 +msgid "\"hasprivatekeys\"" +msgstr "\"hasprivatekeys\"" + +#: src/guides/sat-hunting.md:174 +msgid "And for the change address descriptor, in this case `64k8wnd7`:" +msgstr "Y para el descriptor de la dirección de cambio, en este caso 64k8wnd7:" + +#: src/guides/sat-hunting.md:178 +msgid "'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)'" +msgstr "'wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)'" + +#: src/guides/sat-hunting.md:183 +msgid "\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#fyfc5f6a\"" +msgstr "\"wpkh([bf1dd55e/84'/0'/0']xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#fyfc5f6a\"" + +#: src/guides/sat-hunting.md:184 +msgid "\"64k8wnd7\"" +msgstr "\"64k8wnd7\"" + +#: src/guides/sat-hunting.md:191 +msgid "Load the wallet you want to import the descriptors into:" +msgstr "Carga el monedero al cual deseas importar los descriptores:" + +#: src/guides/sat-hunting.md:197 +msgid "Now import the descriptors, with the correct checksums, into Bitcoin Core." +msgstr "Ahora importa los descriptores, con los checksums correctos, a Bitcoin Core." -#: src/guides/collecting/sparrow-wallet.md:118 -msgid "" -"To do this, you can follow the [Validating / Viewing Received " -"Inscriptions](./sparrow-wallet.md#validating--viewing-received-inscriptions) " -"described above to find the inscription page for your inscription on " -"ordinals.com" -msgstr "" -"Para hacer esto, puedes leer `Validando / Viendo las Inscripciones Recibidas` " -"descritas anteriormente para encontrar la página de inscripción de tu inscripción en ordinals.com" +#: src/guides/sat-hunting.md:202 +msgid "'[\n" +msgstr "'[\n" -#: src/guides/collecting/sparrow-wallet.md:120 +#: src/guides/sat-hunting.md:214 msgid "" -"There you will find some metadata about your inscription which looks like " -"the following:" +"If you know the Unix timestamp when your wallet first started receive transactions, you may use it for the value of the `\"timestamp\"` fields instead of `0`. This will reduce " +"the time it takes for Bitcoin Core to search for your wallet's UTXOs." msgstr "" -"Allí encontrarás algunos metadatos sobre tu inscripción, se verá así:" - -#: src/guides/collecting/sparrow-wallet.md:122 -msgid "![](images/sending_01.png)" -msgstr "![](images/sending_01.png)" +"Si conoces la marca de tiempo de Unix cuando tu monedero comenzó a recibir transacciones por primera vez, puedes utilizarlo como el valor del campo `\"timestamp\"` en lugar de " +"`0`. Esto reducirá el tiempo que tarda Bitcoin Core en buscar los UTXOs de tu monedero." -#: src/guides/collecting/sparrow-wallet.md:124 -msgid "There is a few of important things to check here:" -msgstr "Hay varias cosas importantes que verificar en este punto:" +#: src/guides/sat-hunting.md:231 +msgid "Exporting Descriptors" +msgstr "Exportar Descriptores" -#: src/guides/collecting/sparrow-wallet.md:125 -msgid "" -"The `output` identifier matches the identifier of the UTXO you are going to " -"send" -msgstr "" -"Que el identificador de `output` coincida con el identificador del UTXO que " -"vas a enviar" +#: src/guides/sat-hunting.md:235 +msgid "Navigate to the `Settings` tab, then to `Script Policy`, and press the edit button to display the descriptor." +msgstr "Haz clic en la pestaña Settings, luego en `Script Policy`, y presiona el botón de editar para mostrar el descriptor." -#: src/guides/collecting/sparrow-wallet.md:126 -msgid "" -"The `offset` of the inscription is `0` (this means that the inscription is " -"located on the first sat in the UTXO)" -msgstr "" -"Que el `offset` (desplazamiento) de la inscripción sea 0 (esto significa que la inscripción está ubicada en el primer sat del UTXO)" +#: src/guides/sat-hunting.md:238 +msgid "Transferring Ordinals" +msgstr "Transferir Ordinals" -#: src/guides/collecting/sparrow-wallet.md:127 -msgid "" -"the `output_value` has enough sats to cover the transaction fee (postage) " -"for sending the transaction. The exact amount you will need depends on the " -"fee rate you will select for the transaction" -msgstr "Que el valor de ‘output_value’ tenga suficientes sats para cubrir la tarifa de transacción (postage) para enviar la transacción. La cantidad exacta que necesitarás dependerá de la tasa de comisión que seleccionarás para la transacción" +#: src/guides/sat-hunting.md:240 +msgid "The `ord` wallet supports transferring specific satoshis by using the name of the satoshi. To send the satoshi `zonefruits`, do:" +msgstr "Puedes transferir satoshis específicos utilizando el nombre asignado en el monedero `ord`. Para enviar el satoshi denominado `zonefruits`, sigue estos pasos:" -#: src/guides/collecting/sparrow-wallet.md:129 +#: src/guides/sat-hunting.md:247 msgid "" -"If all of the above are true for your inscription, it should be safe for you " -"to send it using the method below." +"You can also use the `bitcoin-cli` commands `createrawtransaction`, `signrawtransactionwithwallet`, and `sendrawtransaction`, but this method can be complex and is outside the " +"scope of this guide." msgstr "" -"Si todo lo anterior se sostiene para tu inscripción, deberías poder proceder con seguridad usando el siguiente método." +"También puedes utilizar los comandos de `bitcoin-cli` como `createrawtransaction`, `signrawtransactionwithwallet` y `sendrawtransaction`, pero este método puede ser complejo y " +"está fuera del alcance de esta guía." -#: src/guides/collecting/sparrow-wallet.md:131 -msgid "" -"⚠️⚠️ Be very careful sending your inscription particularly if the `offset` " -"value is not `0`. It is not recommended to use this method if that is the " -"case, as doing so you could accidentally send your inscription to a bitcoin " -"miner unless you know what you are doing." +#: src/guides/settings.md:4 +msgid "`ord` can be configured with the command line, environment variables, a configuration file, and default values." +msgstr "`ord` puede configurarse mediante la línea de comandos, variables de entorno, un archivo de configuración y valores predeterminados." + +#: src/guides/settings.md:7 +msgid "The command line takes precedence over environment variables, which take precedence over the configuration file, which takes precedence over defaults." msgstr "" -"⚠️⚠️ Ten mucho cuidado al enviar tu inscripción, especialmente si el `offset` " -"no es `0`. En tales casos, no se recomienda utilizar este método, ya que podrías " -"enviar accidentalmente tu inscripción a un minero de bitcoin a menos que sepas lo que estás haciendo." +"La línea de comandos tiene prioridad sobre las variables de entorno, las cuales tienen prioridad sobre el archivo de configuración, que a su vez tiene prioridad sobre los valores " +"predeterminados." -#: src/guides/collecting/sparrow-wallet.md:133 -msgid "Sending your inscription" -msgstr "Enviando tu inscripción" +#: src/guides/settings.md:10 +msgid "The path to the configuration file can be given with `--config `. `ord` will error if `` doesn't exist." +msgstr "Puedes especificar la ruta al archivo de configuración utilizando `--config `. `ord` mostrará un error si `` no existe." -#: src/guides/collecting/sparrow-wallet.md:134 +#: src/guides/settings.md:13 msgid "" -"To send an inscription navigate to the `UTXOs` tab, and find the UTXO which " -"you previously validated contains your inscription." +"The path to a directory containing a configuration file name named `ord.yaml` can be given with `--config-dir ` or `--datadir ` in which case the " +"config path is `/ord.yaml` or `/ord.yaml`. It is not an error if it does not exist." msgstr "" -"Para enviar una inscripción, ve a la pestaña `UTXOs` y encuentra el UTXO que " -"previamente validaste y que contiene tu inscripción." +"Puedes especificar la ruta a un directorio que contenga un archivo de configuración llamado `ord.yaml` usando `--config-dir ` o `--datadir " +"`. En este caso, \n" +"la ruta del archivo de configuración será `/ord.yaml` o `/ord.yaml`. No habrá error si este archivo no existe." -#: src/guides/collecting/sparrow-wallet.md:136 -msgid "" -"If you previously froze the UXTO you will need to right-click on it and " -"unfreeze it." +#: src/guides/settings.md:18 +msgid "If none of `--config`, `--config-dir`, or `--datadir` are given, and a file named `ord.yaml` exists in the default data directory, it will be loaded." msgstr "" -"Si anteriormente habías congelado este UTXO, " -"deberás hacer clic derecho sobre él para descongelarlo." +"Si no se especifica `--config`, `--config-dir` ni `--datadir`, y existe un archivo llamado \n" +"`ord.yaml` en el directorio de datos predeterminado, este archivo se cargará automáticamente." -#: src/guides/collecting/sparrow-wallet.md:138 +#: src/guides/settings.md:21 msgid "" -"Select the UTXO you want to send, and ensure that is the _only_ UTXO is " -"selected. You should see `UTXOs 1/1` in the interface. Once you are sure " -"this is the case you can hit `Send Selected`." +"For a setting named `--setting-name` on the command line, the environment variable will be named `ORD_SETTING_NAME`, and the config file field will be named `setting_name`. For " +"example, the data directory can be configured with `--datadir` on the command line, the `ORD_DATA_DIR` environment variable, or `data_dir` in the config file." msgstr "" -"Selecciona el UTXO que deseas enviar, y asegúrate de que sea el _único_ " -"UTXO seleccionado. Deberías ver una indicación de `UTXOs 1/1` en la interfaz. " -"Una vez estés absolutamente seguro de haber seleccionado el UTXO correcto, " -"haz clic en `Send Selected` (Enviar seleccionados)." +"Para una configuración con el nombre `--setting-name` en la línea de comandos, la variable de entorno correspondiente será \n" +"`ORD_SETTING_NAME` y el campo en el archivo de configuración será `setting_name`. Por ejemplo, \n" +"el directorio de datos puede configurarse con `--datadir` en la línea de comandos, con la \n" +"variable de entorno `ORD_DATA_DIR` o con el campo `data_dir` en el archivo de configuración." -#: src/guides/collecting/sparrow-wallet.md:140 -msgid "![](images/sending_02.png)" -msgstr "![](images/sending_02.png)" +#: src/guides/settings.md:27 +msgid "See `ord --help` for documentation of all the settings." +msgstr "Consulta `ord --help` para obtener la documentación completa de todas las configuraciones." -#: src/guides/collecting/sparrow-wallet.md:142 -msgid "" -"You will then be presented with the transaction construction interface. " -"There is a few things you need to check here to make sure that this is a " -"safe send:" -msgstr "" -"Luego se te presentará la interfaz de construcción de transacciones. " -"Hay algunas cosas que debes verificar aquí para asegurarte de que se trata " -"de un envío seguro:" +#: src/guides/settings.md:29 +msgid "`ord`'s current configuration can be viewed as JSON with the `ord settings` command." +msgstr "Puedes ver la configuración actual de ord en formato JSON utilizando el comando `ord settings`." -#: src/guides/collecting/sparrow-wallet.md:144 -msgid "" -"The transaction should have only 1 input, and this should be the UTXO with " -"the label you want to send" -msgstr "" -"La transacción debería tener solo 1 input (entrada), y esta debería ser el " -"UTXO con la etiqueta que quieres enviar." +#: src/guides/settings.md:32 +msgid "Example Configuration" +msgstr "Ejemplo de Configuración" -#: src/guides/collecting/sparrow-wallet.md:145 -msgid "" -"The transaction should have only 1 output, which is the address/label where " -"you want to send the inscription" -msgstr "" -"La transacción debería tener solo 1 output (salida), siendo esta la dirección/etiqueta " -"a donde deseas enviar la inscripción." +#: src/guides/settings.md:36 +msgid "# example config\n" +msgstr "# ejemplo de config\n" -#: src/guides/collecting/sparrow-wallet.md:147 -msgid "" -"If your transaction looks any different, for example you have multiple " -"inputs, or multiple outputs then this may not be a safe transfer of your " -"inscription, and you should abandon sending until you understand more, or " -"can import into the `ord` wallet." -msgstr "" -"Si tu transacción luce diferente, por ejemplo, tiene múltiples entradas o " -"múltiples salidas, entonces quizás no sea una transferencia segura de tu " -"inscripción, y deberías detener el envío hasta entender completamente el " -"procedimiento, o hasta que logres importarla al monedero `ord`." +#: src/guides/settings.md:37 +msgid "# see `ord --help` for setting documentation\n" +msgstr "# consulta `ord --help` para obtener la documentación de configuracion.\n" -#: src/guides/collecting/sparrow-wallet.md:149 -msgid "" -"You should set an appropriate transaction fee, Sparrow will usually " -"recommend a reasonable one, but you can also check " -"[mempool.space](https://mempool.space) to see what the recommended fee rate " -"is for sending a transaction." -msgstr "" -"Es necesario fijar una comisión de transacción adecuada; " -"Sparrow normalmente sugerirá una adecuada, aunque también puedes ir a " -"[mempool.space](https://mempool.space/) para conocer la tasa recomendada " -"para enviar una transacción." +#: src/guides/settings.md:39 +msgid "bitcoin_data_dir" +msgstr "bitcoin_data_dir" -#: src/guides/collecting/sparrow-wallet.md:151 -msgid "" -"You should add a label for the recipient address, a label like `alice " -"address for inscription #123` would be ideal." -msgstr "" -"Deberías añadir una etiqueta para la dirección del destinatario; " -"una etiqueta como `dirección de Alice para la inscripción #123` sería ideal." +#: src/guides/settings.md:40 +msgid "/var/lib/bitcoin" +msgstr "/var/lib/bitcoin" -#: src/guides/collecting/sparrow-wallet.md:153 -msgid "" -"Once you have checked the transaction is a safe transaction using the checks " -"above, and you are confident to send it you can click `Create Transaction`." -msgstr "" -"Una vez que hayas verificado que la transacción es segura usando los criterios " -"mencionados anteriormente, y te sientas seguro de enviarla, puedes hacer clic en " -"`Create Transaction` (Crear Transacción)." +#: src/guides/settings.md:40 +msgid "bitcoin_rpc_password" +msgstr "bitcoin_rpc_password" -#: src/guides/collecting/sparrow-wallet.md:155 -msgid "![](images/sending_03.png)" -msgstr "![](images/sending_03.png)" +#: src/guides/settings.md:41 src/guides/settings.md:64 +msgid "bar" +msgstr "bar" -#: src/guides/collecting/sparrow-wallet.md:157 -msgid "" -"Here again you can double check that your transaction looks safe, and once " -"you are confident you can click `Finalize Transaction for Signing`." -msgstr "" -"Aquí puedes volver a revisar que tu transacción este correcta, una vez " -"estés seguro puedes hacer clic en `Finalize Transaction for Signing` " -"(Finalizar Transacción para Firmar)." +#: src/guides/settings.md:41 +msgid "bitcoin_rpc_url" +msgstr "bitcoin_rpc_url" -#: src/guides/collecting/sparrow-wallet.md:159 -msgid "![](images/sending_04.png)" -msgstr "![](images/sending_04.png)" +#: src/guides/settings.md:42 +msgid "https://localhost:8000" +msgstr "https://localhost:8000" -#: src/guides/collecting/sparrow-wallet.md:161 -msgid "Here you can triple check everything before hitting `Sign`." -msgstr "Aquí puedes revisar toda una vez más antes de hacer clic en `Sign` (Firmar)." +#: src/guides/settings.md:42 +msgid "bitcoin_rpc_username" +msgstr "bitcoin_rpc_username" -#: src/guides/collecting/sparrow-wallet.md:163 -msgid "![](images/sending_05.png)" -msgstr "![](images/sending_05.png)" +#: src/guides/settings.md:43 src/guides/settings.md:66 +msgid "foo" +msgstr "foo" -#: src/guides/collecting/sparrow-wallet.md:165 -msgid "" -"And then actually you get very very last chance to check everything before " -"hitting `Broadcast Transaction`. Once you broadcast the transaction it is " -"sent to the bitcoin network, and starts being propagated into the mempool." -msgstr "" -"Y luego, de hecho, tienes la última oportunidad de verificar todo antes de " -"hacer clic en `Broadcast Transaction` (Transmitir Transacción). Una vez que " -"transmites la transacción, se envía a la red de Bitcoin y comenzara a propagarse en el mempool." +#: src/guides/settings.md:43 +msgid "chain" +msgstr "cadena" -#: src/guides/collecting/sparrow-wallet.md:167 -msgid "![](images/sending_06.png)" -msgstr "![](images/sending_06.png)" +#: src/guides/settings.md:44 +msgid "mainnet" +msgstr "mainnet" -#: src/guides/collecting/sparrow-wallet.md:169 -msgid "" -"If you want to track the status of your transaction you can copy the " -"`Transaction Id (Txid)` and paste that into " -"[mempool.space](https://mempool.space)" -msgstr "" -"Si deseas rastrear el estado de tu transacción, puedes copiar el " -"`Identificador de la Transacción (Txid)` y pegarlo en [mempool.space](https://mempool.space/)." +#: src/guides/settings.md:44 +msgid "commit_interval" +msgstr "commit_interval" -#: src/guides/collecting/sparrow-wallet.md:171 -msgid "" -"Once the transaction has confirmed you can check the inscription page on " -"[ordinals.com](https://ordinals.com) to validate that it has moved to the " -"new output location and address." -msgstr "" -"Cuando la transacción haya sido confirmada, puedes revisar la página " -"de inscripciones en [ordinals.com](https://ordinals.com/) para confirmar que " -"ha sido movida a la nueva ubicación de salida y dirección." +#: src/guides/settings.md:45 +msgid "config" +msgstr "config" -#: src/guides/collecting/sparrow-wallet.md:173 -msgid "Troubleshooting" -msgstr "Solución de problemas" +#: src/guides/settings.md:46 +msgid "/var/lib/ord/ord.yaml" +msgstr "/var/lib/ord/ord.yaml" -#: src/guides/collecting/sparrow-wallet.md:175 -msgid "" -"Sparrow wallet is not showing a transaction/UTXO, but I can see it on " -"mempool.space!" -msgstr "" -"¡El monedero Sparrow no está mostrando una transacción/UTXO, pero puedo " -"verla en mempool.space!" +#: src/guides/settings.md:46 +msgid "config_dir" +msgstr "config_dir" -#: src/guides/collecting/sparrow-wallet.md:177 -msgid "" -"Make sure that your wallet is connected to a bitcoin node. To validate this, " -"head into the `Preferences`\\-> `Server` settings, and click `Edit Existing " -"Connection`." -msgstr "" -"Asegúrate de que tu monedero esté conectado a un nodo de bitcoin. Para validar esto, " -"dirígete a `Preferences`\\-> `Server` settings y haz clic en `Edit Existing Connection` " -"(Editar conexión existente)." +#: src/guides/settings.md:47 src/guides/settings.md:49 +msgid "/var/lib/ord" +msgstr "/var/lib/ord" -#: src/guides/collecting/sparrow-wallet.md:179 -msgid "![](images/troubleshooting_01.png)" -msgstr "![](images/troubleshooting_01.png)" +#: src/guides/settings.md:47 +msgid "cookie_file" +msgstr "archivo_cookie" -#: src/guides/collecting/sparrow-wallet.md:181 -msgid "" -"From there you can select a node and click `Test Connection` to validate " -"that Sparrow is able to connect successfully." -msgstr "" -"Desde allí puedes seleccionar un nodo y hacer clic en `Test Connection` " -"(Probar conexión) para validar que Sparrow pueda conectarse exitosamente." +#: src/guides/settings.md:48 +msgid "/var/lib/bitcoin/.cookie" +msgstr "/var/lib/bitcoin/.cookie" -#: src/guides/collecting/sparrow-wallet.md:183 -msgid "![](images/troubleshooting_02.png)" -msgstr "![](images/troubleshooting_02.png)" +#: src/guides/settings.md:48 +msgid "data_dir" +msgstr "data_dir" -#: src/guides/testing.md:4 -msgid "" -"Ord can be tested using the following flags to specify the test network. For " -"more information on running Bitcoin Core for testing, see [Bitcoin's " -"developer " -"documentation](https://developer.bitcoin.org/examples/testing.html)." -msgstr "" -"Puedes hacer pruebas en `ord` utilizando las siguientes flags (banderas) " -"para especificar la red de pruebas. Para obtener más información sobre cómo " -"ejecutar Bitcoin Core en modo de pruebas, consulta la " -"[documentación para desarrolladores de Bitcoin](https://developer.bitcoin.org/examples/testing.html)." +#: src/guides/settings.md:49 +msgid "first_inscription_height" +msgstr "primera_altura_de_inscripcion" -#: src/guides/testing.md:7 -msgid "" -"Most `ord` commands in [inscriptions](inscriptions.md) and " -"[explorer](explorer.md) can be run with the following network flags:" -msgstr "" -"La mayoría de los comandos de `ord` que se mencionaron en la página de " -"[inscripciones](inscriptions.md) y en [explorador](explorer.md) pueden " -"ejecutarse con las siguientes banderas de red:" +#: src/guides/settings.md:50 +msgid "height_limit" +msgstr "limite_de_altura" -#: src/guides/testing.md:10 -msgid "Network" -msgstr "Red" +#: src/guides/settings.md:53 src/guides/settings.md:88 +msgid "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0" +msgstr "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0" -#: src/guides/testing.md:10 -msgid "Flag" -msgstr "Bandera" +#: src/guides/settings.md:54 src/guides/settings.md:89 +msgid "703e5f7c49d82aab99e605af306b9a30e991e57d42f982908a962a81ac439832i0" +msgstr "703e5f7c49d82aab99e605af306b9a30e991e57d42f982908a962a81ac439832i0" -#: src/guides/testing.md:12 -msgid "Testnet" -msgstr "Testnet" +#: src/guides/settings.md:54 +msgid "index" +msgstr "indice" -#: src/guides/testing.md:12 -msgid "`--testnet` or `-t`" -msgstr "`--testnet` o `-t`" +#: src/guides/settings.md:55 +msgid "/var/lib/ord/index.redb" +msgstr "/var/lib/ord/index.redb" -#: src/guides/testing.md:13 -msgid "Signet" -msgstr "Signet" +#: src/guides/settings.md:55 +msgid "index_addresses" +msgstr "index_addresses" -#: src/guides/testing.md:13 -msgid "`--signet` or `-s`" -msgstr "`--signet` o `-s`" +#: src/guides/settings.md:56 +msgid "index_cache_size" +msgstr "index_cache_size" -#: src/guides/testing.md:14 -msgid "Regtest" -msgstr "Regtest" +#: src/guides/settings.md:57 +msgid "index_runes" +msgstr "index_runes" -#: src/guides/testing.md:14 -msgid "`--regtest` or `-r`" -msgstr "`--regtest` o `-r`" +#: src/guides/settings.md:58 +msgid "index_sats" +msgstr "index_sats" -#: src/guides/testing.md:16 -msgid "Regtest doesn't require downloading the blockchain or indexing ord." -msgstr "Regtest no requiere que descargues la blockchain ni que se indexe ord." +#: src/guides/settings.md:59 +msgid "index_spent_sats" +msgstr "index_spent_sats" -#: src/guides/testing.md:21 -msgid "Run bitcoind in regtest with:" -msgstr "Ejecutar bitcoind en regtest con:" +#: src/guides/settings.md:60 +msgid "index_transactions" +msgstr "index_transactions" -#: src/guides/testing.md:22 -msgid "" -"```\n" -"bitcoind -regtest -txindex\n" -"```" -msgstr "" -"```\n" -"bitcoind -regtest -txindex\n" -"```" +#: src/guides/settings.md:61 +msgid "integration_test" +msgstr "integration_test" -#: src/guides/testing.md:25 -msgid "Create a wallet in regtest with:" -msgstr "Crear un monedero en regtest con:" +#: src/guides/settings.md:62 +msgid "no_index_inscriptions" +msgstr "no_index_inscriptions" -#: src/guides/testing.md:26 -msgid "" -"```\n" -"ord -r wallet create\n" -"```" -msgstr "" -"```\n" -"ord -r wallet create\n" -"```" +#: src/guides/settings.md:63 +msgid "server_password" +msgstr "contraseña_del_servidor" -#: src/guides/testing.md:29 -msgid "Get a regtest receive address with:" -msgstr "Obtener una dirección de recepción regtest:" +#: src/guides/settings.md:64 +msgid "server_url" +msgstr "url_del_servidor" -#: src/guides/testing.md:30 -msgid "" -"```\n" -"ord -r wallet receive\n" -"```" -msgstr "" -"```\n" -"ord -r wallet receive\n" -"```" +#: src/guides/settings.md:65 +msgid "http://localhost:8888" +msgstr "http://localhost:8888" -#: src/guides/testing.md:33 -msgid "Mine 101 blocks (to unlock the coinbase) with:" -msgstr "Minar 101 bloques (para desbloquear la transacción coinbase):" +#: src/guides/settings.md:65 +msgid "server_username" +msgstr "usuario_del_servidor" -#: src/guides/testing.md:34 -msgid "" -"```\n" -"bitcoin-cli generatetoaddress 101 \n" -"```" -msgstr "" -"```\n" -"bitcoin-cli generatetoaddress 101 \n" -"```" +#: src/guides/settings.md:69 +msgid "Hiding Inscription Content" +msgstr "Ocultar el Contenido de Inscripciones" -#: src/guides/testing.md:37 -msgid "Inscribe in regtest with:" -msgstr "Inscribir en regtest:" +#: src/guides/settings.md:72 +msgid "Inscription content can be selectively prevented from being served by `ord server`." +msgstr "El contenido de las inscripciones puede ocultarse selectivamente para no ser servido por el `servidor de ord`." -#: src/guides/testing.md:38 -msgid "" -"```\n" -"ord -r wallet inscribe --fee-rate 1 --file \n" -"```" -msgstr "" -"```\n" -"ord -r wallet inscribe --fee-rate 1 --file \n" -"```" +#: src/guides/settings.md:75 +msgid "Unlike other settings, this can only be configured with the configuration file or environment variables." +msgstr "A diferencia de otras configuraciones, esto solo puede configurarse mediante el archivo de configuración o variables de entorno." -#: src/guides/testing.md:41 -msgid "Mine the inscription with:" -msgstr "Minar la inscripcion:" +#: src/guides/settings.md:78 +msgid "To hide inscriptions with an environment variable:" +msgstr "Para ocultar inscripciones usando una variable de entorno:" -#: src/guides/testing.md:42 -msgid "" -"```\n" -"bitcoin-cli generatetoaddress 1 \n" -"```" +#: src/guides/settings.md:84 +msgid "Or with the configuration file:" +msgstr "O con el archivo de configuración:" + +#: src/guides/teleburning.md:4 +msgid "Teleburn addresses can be used to burn assets on other blockchains, leaving behind in the smoking rubble a sort of forwarding address pointing to an inscription on Bitcoin." msgstr "" -"```\n" -"bitcoin-cli generatetoaddress 1 \n" -"```" +"Las direcciones de teleburn permiten quemar activos en otras blockchains, dejando atrás en los escombros una especie de dirección de reenvío que apunta a una inscripción en " +"Bitcoin." -#: src/guides/testing.md:45 -msgid "View the inscription in the regtest explorer:" -msgstr "Visualizar la inscripción en el explorador de regtest:" +#: src/guides/teleburning.md:8 +msgid "Teleburning an asset means something like, \"I'm out. Find me on Bitcoin.\"" +msgstr "Telequemar un activo significa algo así como: \"Me voy. Encuéntrame en Bitcoin.\"" -#: src/guides/testing.md:46 +#: src/guides/teleburning.md:10 msgid "" -"```\n" -"ord -r server\n" -"```" +"Teleburn addresses are derived from inscription IDs. They have no corresponding private key, so assets sent to a teleburn address are burned. Currently, only Ethereum teleburn " +"addresses are supported. Pull requests adding teleburn addresses for other chains are welcome." msgstr "" -"```\n" -"ord -r server\n" -"```" +"Las direcciones de teleburn se derivan de los IDs de inscripción. No tienen una clave privada correspondiente, por lo que los activos enviados a una dirección de teleburn se " +"queman. Actualmente, solo se admiten direcciones de teleburn de Ethereum. Se agradecen las solicitudes de incorporación (pull requests) que añadan direcciones de teleburn para " +"otras cadenas." -#: src/guides/testing.md:50 -msgid "Testing Recursion" -msgstr "Prueba de Recursión" +#: src/guides/teleburning.md:15 +msgid "Ethereum" +msgstr "Ethereum" -#: src/guides/testing.md:53 +#: src/guides/teleburning.md:18 msgid "" -"When testing out [recursion](../inscriptions/recursion.md), inscribe the " -"dependencies first (example with [p5.js](https://p5js.org):" +"Ethereum teleburn addresses are derived by taking the first 20 bytes of the SHA-256 hash of the inscription ID, serialized as 36 bytes, with the first 32 bytes containing the " +"transaction ID, and the last four bytes containing big-endian inscription index, and interpreting it as an Ethereum address." msgstr "" -"Cuando estés probando la [recursión](../inscriptions/recursion.md), inscribe primero las " -"dependencias (por ejemplo, con [p5.js](https://p5js.org/)):" +"Las direcciones de teleburn en Ethereum se derivan tomando los primeros 20 bytes del hash SHA-256 del ID de inscripción. Este ID de inscripción se serializa en 36 bytes, donde " +"los primeros 32 bytes contienen el ID de la transacción y los últimos cuatro bytes contienen el índice de inscripción en formato big-endian. Este resultado se interpreta como una " +"dirección de Ethereum." -#: src/guides/testing.md:55 +#: src/guides/teleburning.md:26 msgid "" -"```\n" -"ord -r wallet inscribe --fee-rate 1 --file p5.js\n" -"```" +"The ENS domain name [rodarmor.eth](https://app.ens.domains/rodarmor.eth), was teleburned to [inscription zero](https://ordinals.com/" +"inscription/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0)." msgstr "" -"```\n" -"ord -r wallet inscribe --fee-rate 1 --file p5.js\n" -"```" +"El dominio ENS [rodarmor.eth](https://app.ens.domains/rodarmor.eth) fue telequemado a la [inscripción cero](https://ordinals.com/" +"inscription/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0)." -#: src/guides/testing.md:58 -msgid "" -"This should return a `inscription_id` which you can then reference in your " -"recursive inscription." +#: src/guides/teleburning.md:30 +msgid "The inscription ID of inscription zero is `6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0`." msgstr "" -"Esto debería proporcionar un `inscription_id` (id de inscripción) que luego " -"puedes referenciar en tu inscripción recursiva." +"El ID de la inscripción cero es:\n" +"\n" +"`6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0`." -#: src/guides/testing.md:61 -msgid "" -"ATTENTION: These ids will be different when inscribing on mainnet or signet, " -"so be sure to change those in your recursive inscription for each chain." -msgstr "" -"ATENCION: Estos IDs serán diferentes dependiendo de si estás inscribiendo en " -"la red principal (mainnet) o en signet, así que recuerda ajustarlos en tu " -"inscripción recursiva según la cadena que estés utilizando." +#: src/guides/teleburning.md:33 +msgid "Passing `6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0` to the teleburn command:" +msgstr "Pasando `6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0` al comando de telequemado:" -#: src/guides/testing.md:65 -msgid "Then you can inscribe your recursive inscription with:" -msgstr "Luego podrás inscribir tu inscripción recursiva utilizando:" +#: src/guides/teleburning.md:40 +msgid "Returns:" +msgstr "Esto regresa:" -#: src/guides/testing.md:66 -msgid "" -"```\n" -"ord -r wallet inscribe --fee-rate 1 --file recursive-inscription.html\n" -"```" -msgstr "" -"```\n" -"ord -r wallet inscribe --fee-rate 1 --file recursive-inscription.html\n" -"```" +#: src/guides/teleburning.md:44 +msgid "\"ethereum\"" +msgstr "\"ethereum\"" -#: src/guides/testing.md:69 -msgid "Finally you will have to mine some blocks and start the server:" -msgstr "Para finalizar, necesitarás minar algunos bloques e iniciar el servidor:" +#: src/guides/teleburning.md:44 +msgid "\"0xe43A06530BdF8A4e067581f48Fae3b535559dA9e\"" +msgstr "\"0xe43A06530BdF8A4e067581f48Fae3b535559dA9e\"" -#: src/guides/testing.md:70 +#: src/guides/teleburning.md:48 msgid "" -"```\n" -"bitcoin-cli generatetoaddress 6 \n" -"ord -r server\n" -"```" +"Indicating that `0xe43A06530BdF8A4e067581f48Fae3b535559dA9e` is the Ethereum teleburn address for inscription zero, which is, indeed, the current owner, on Ethereum, of `rodarmor." +"eth`." msgstr "" -"```\n" -"bitcoin-cli generatetoaddress 6 \n" -"ord -r server\n" -"```" +"Indicando que `0xe43A06530BdF8A4e067581f48Fae3b535559dA9e` es la dirección de telequemado de Ethereum para la inscripción cero, que, de hecho, es el propietario actual en " +"Ethereum de `rodarmor.eth`." -#: src/guides/moderation.md:4 -msgid "" -"`ord` includes a block explorer, which you can run locally with `ord server`." -msgstr "" -"`ord` incluye un explorador de bloques, el cual puedes ejecutar " -"localmente utilizando `ord server`." +#: src/guides/testing.md:4 +msgid "Test Environment" +msgstr "Entorno de Pruebas" -#: src/guides/moderation.md:6 +#: src/guides/testing.md:7 msgid "" -"The block explorer allows viewing inscriptions. Inscriptions are " -"user-generated content, which may be objectionable or unlawful." +"`ord env ` creates a test environment in ``, spins up `bitcoind` and `ord server` instances, prints example commands for interacting with the test " +"`bitcoind` and `ord server` instances, waits for `CTRL-C`, and then shuts down `bitcoind` and `ord server`." msgstr "" -"El explorador de bloques permite visualizar las inscripciones, " -"que son contenidos creados por los usuarios, y que pueden ser de " -"carácter objetable o incluso ilícito." +"El comando `ord env ` crea un entorno de pruebas en ``, inicia instancias de `bitcoind` y `ord server`, imprime comandos de ejemplo para interactuar con " +"las instancias de prueba de `bitcoind` y `ord server`, espera a `CTRL-C`, y luego apaga `bitcoind` y `ord server`." -#: src/guides/moderation.md:9 -msgid "" -"It is the responsibility of each individual who runs an ordinal block " -"explorer instance to understand their responsibilities with respect to " -"unlawful content, and decide what moderation policy is appropriate for their " -"instance." +#: src/guides/testing.md:12 +msgid "`ord env` tries to use port 9000 for `bitcoind`'s RPC interface, and port `9001` for `ord`'s RPC interface, but will fall back to random unused ports." msgstr "" -"Quien decida ejecutar una instancia del explorador de bloques de ordinal " -"debe ser consciente de sus responsabilidades ante contenidos ilegales y " -"definir una política de moderación adecuada para su propia instancia." +"`ord env` trata de usar el puerto 9000 para la interfaz RPC de `bitcoind`, y el puerto `9001` para la interfaz RPC de `ord`, pero recurrirá a puertos no utilizados al azar si " +"estos están ocupados." -#: src/guides/moderation.md:13 -msgid "" -"In order to prevent particular inscriptions from being displayed on an `ord` " -"instance, they can be included in a YAML config file, which is loaded with " -"the `--config` option." +#: src/guides/testing.md:15 +msgid "Inside of the env directory, `ord env` will write `bitcoind`'s configuration to `bitcoin.conf`, `ord`'s configuration to `ord.yaml`, and the env configuration to `env.json`." msgstr "" -"Para prevenir que ciertas inscripciones se muestren en una instancia de `ord`, " -"estas pueden incluirse en un archivo de configuración YAML, el cual se carga utilizando la opción `--config`." +"Dentro del directorio env, `ord env` escribirá la configuración de `bitcoind` en `bitcoin.conf`, la configuración de `ord` en `ord.yaml`, y la configuración del entorno en `env." +"json`." -#: src/guides/moderation.md:17 -msgid "" -"To hide inscriptions, first create a config file, with the inscription ID " -"you want to hide:" -msgstr "" -"Para comenzar a ocultar inscripciones, crea un archivo de configuración con " -"el ID de la inscripción que quieres esconder:" +#: src/guides/testing.md:19 +msgid "`env.json` contains the commands needed to invoke `bitcoin-cli` and `ord wallet`, as well as the ports `bitcoind` and `ord server` are listening on." +msgstr "`env.json` incluye los comandos necesarios para invocar `bitcoin-cli` y `ord wallet`, así como los puertos en los que `bitcoind` y `ord server` están activos." + +#: src/guides/testing.md:22 +msgid "These can be extracted into shell commands using `jq`:" +msgstr "Puedes extraer estos comandos a comandos de shell usando `jq`:" -#: src/guides/moderation.md:20 +#: src/guides/testing.md:24 msgid "" -"```yaml\n" -"hidden:\n" -"- 0000000000000000000000000000000000000000000000000000000000000000i0\n" +"```shell\n" +"bitcoin=`jq -r '.bitcoin_cli_command | join(\" \")' env/env.json`\n" +"$bitcoin listunspent\n" +"\n" +"ord=`jq -r '.ord_wallet_command | join(\" \")' env/env.json`\n" +"$ord outputs\n" "```" msgstr "" -"```yaml\n" -"hidden:\n" -"- 0000000000000000000000000000000000000000000000000000000000000000i0\n" +"```shell\n" +"bitcoin=`jq -r '.bitcoin_cli_command | join(\" \")' env/env.json`\n" +"$bitcoin listunspent\n" +"\n" +"ord=`jq -r '.ord_wallet_command | join(\" \")' env/env.json`\n" +"$ord outputs\n" "```" -#: src/guides/moderation.md:25 -msgid "" -"The suggested name for `ord` config files is `ord.yaml`, but any filename " -"can be used." -msgstr "" -"Aunque se recomienda nombrar los archivos de configuración de `ord` como " -"`ord.yaml`, puedes utilizar cualquier otro nombre que prefieras." +#: src/guides/testing.md:32 +msgid "If `ord` is in the `$PATH` and the env directory is `env`, the `bitcoin-cli` command will be:" +msgstr "Si `ord` está en el `$PATH` y el directorio env se llama `env`, el comando `bitcoin-cli` será:" -#: src/guides/moderation.md:28 -msgid "Then pass the file to `--config` when starting the server:" -msgstr "Luego pasa el archivo a `--config` cuando inicies el servidor:" +#: src/guides/testing.md:39 +msgid "And the `ord` will be:" +msgstr "Y `ord` será:" -#: src/guides/moderation.md:30 -msgid "`ord --config ord.yaml server`" -msgstr "`ord --config ord.yaml server`" +#: src/guides/testing.md:45 +msgid "Test Networks" +msgstr "Redes de Prueba" -#: src/guides/moderation.md:32 +#: src/guides/testing.md:48 msgid "" -"Note that the `--config` option comes after `ord` but before the `server` " -"subcommand." +"Ord can be tested using the following flags to specify the test network. For more information on running Bitcoin Core for testing, see [Bitcoin's developer documentation](https://" +"developer.bitcoin.org/examples/testing.html)." msgstr "" -"Ten en cuenta que la opción `--config` va después de `ord` pero antes del " -"subcomando `server`." +"Puedes probar ord utilizando las siguientes banderas para especificar la red de prueba. Para más información sobre cómo ejecutar Bitcoin Core para pruebas, consulta la " +"[documentación para desarrolladores de Bitcoin]](https://developer.bitcoin.org/examples/testing.html)." -#: src/guides/moderation.md:35 -msgid "`ord` must be restarted in to load changes to the config file." -msgstr "Deberás reiniciar `ord` para cargar los cambios realizados en el archivo de configuración." +#: src/guides/testing.md:51 +msgid "Most `ord` commands in [wallet](wallet.md) and [explorer](explorer.md) can be run with the following network flags:" +msgstr "La mayoría de los comandos `ord` en [monedero](wallet.md) y [explorador](explorer.md) se pueden ejecutar con las siguientes banderas de red:" -#: src/guides/moderation.md:37 -msgid "`ordinals.com`" -msgstr "`ordinals.com`" +#: src/guides/testing.md:54 +msgid "Network" +msgstr "Red" -#: src/guides/moderation.md:40 -msgid "" -"The `ordinals.com` instances use `systemd` to run the `ord server` service, " -"which is called `ord`, with a config file located at `/var/lib/ord/ord.yaml`." -msgstr "" -"Las instancias de `ordinals.com` utilizan `systemd` para ejecutar el servicio " -"del `servidor ord`, el cual se llama `ord`, con un archivo de configuración situado " -"en `/var/lib/ord/ord.yaml`." +#: src/guides/testing.md:54 +msgid "Flag" +msgstr "Bandera" -#: src/guides/moderation.md:43 -msgid "To hide an inscription on `ordinals.com`:" -msgstr "Para ocultar una inscripción en `ordinals.com`:" +#: src/guides/testing.md:56 +msgid "Testnet" +msgstr "Testnet" -#: src/guides/moderation.md:45 -msgid "SSH into the server" -msgstr "Ingresa al servidor a través de SSH" +#: src/guides/testing.md:56 +msgid "`--testnet` or `-t`" +msgstr "`--testnet` or `-t`" -#: src/guides/moderation.md:46 -msgid "Add the inscription ID to `/var/lib/ord/ord.yaml`" -msgstr "Añade el ID de la inscripción a `/var/lib/ord/ord.yaml`" +#: src/guides/testing.md:57 +msgid "Signet" +msgstr "Signet" -#: src/guides/moderation.md:47 -msgid "Restart the service with `systemctl restart ord`" -msgstr "Reinicia el servicio utilizando el comando `systemctl restart ord`" +#: src/guides/testing.md:57 +msgid "`--signet` or `-s`" +msgstr "`--signet` or `-s`" + +#: src/guides/testing.md:58 +msgid "Regtest" +msgstr "Regtest" -#: src/guides/moderation.md:48 -msgid "Monitor the restart with `journalctl -u ord`" -msgstr "Supervisa el reinicio con el comando `journalctl -u ord`" +#: src/guides/testing.md:58 +msgid "`--regtest` or `-r`" +msgstr "`--regtest` or `-r`" -#: src/guides/moderation.md:50 -msgid "" -"Currently, `ord` is slow to restart, so the site will not come back online " -"immediately." -msgstr "" -"Actualmente, `ord` tarda en reiniciarse, por lo que el sitio no volverá a " -"estar en línea inmediatamente." +#: src/guides/testing.md:60 +msgid "Regtest doesn't require downloading the blockchain since you create your own private blockchain, so indexing `ord` is almost instantaneous." +msgstr "Regtest no requiere que se descargue la cadena de bloques ya que puedes crear tu propia cadena de bloques privada, por lo que la indexación de `ord` es casi instantánea." -#: src/guides/reindexing.md:4 -msgid "" -"Sometimes the `ord` database must be reindexed, which means deleting the " -"database and restarting the indexing process with either `ord index update` or " -"`ord server`. Reasons to reindex are:" -msgstr "" -"En ocasiones, la base de datos de ord debe ser reindexada, esto implica eliminar " -"la base de datos y reiniciar el proceso de indexación con el comando " -"`ord index update` u `ord server`. Las razones para reindexar son:" +#: src/guides/testing.md:66 +msgid "Run `bitcoind` in regtest with:" +msgstr "Ejecuta `bitcoind` en regtest con:" -#: src/guides/reindexing.md:8 -msgid "A new major release of ord, which changes the database scheme" -msgstr "Un nuevo lanzamiento grande de ord, que modifica el esquema de la base de datos" +#: src/guides/testing.md:72 +msgid "Run `ord server` in regtest with:" +msgstr "Ejecuta `ord server` en regtest con:" -#: src/guides/reindexing.md:9 -msgid "The database got corrupted somehow" -msgstr "Corrupción de la base de datos por alguna razón." +#: src/guides/testing.md:78 +msgid "Create a wallet in regtest with:" +msgstr "Crea un monedero en regtest con:" -#: src/guides/reindexing.md:11 -msgid "" -"The database `ord` uses is called [redb](https://github.com/cberner/redb), " -"so we give the index the default file name `index.redb`. By default we store " -"this file in different locations depending on your operating system." -msgstr "" -"La base de datos que utiliza ord se llama [redb](https://github.com/cberner/redb), " -"por lo que se le asigna al índice el nombre de archivo predeterminado `index.redb`. " -"Este archivo se guarda de forma predeterminada en distintas ubicaciones, según el " -"sistema operativo que estés utilizando." +#: src/guides/testing.md:84 +msgid "Get a regtest receive address with:" +msgstr "Obtén una dirección de recepción en regtest con:" -#: src/guides/reindexing.md:15 -msgid "Platform" -msgstr "Plataforma" +#: src/guides/testing.md:90 +msgid "Mine 101 blocks (to unlock the coinbase) with:" +msgstr "Mina 101 bloques (para desbloquear coinbase) con:" -#: src/guides/reindexing.md:15 -msgid "Value" -msgstr "Valor " +#: src/guides/testing.md:96 +msgid "Inscribe in regtest with:" +msgstr "Realiza una inscripción en regtest con:" -#: src/guides/reindexing.md:17 -msgid "Linux" -msgstr "" +#: src/guides/testing.md:102 +msgid "Mine the inscription with:" +msgstr "Mina la inscripción con:" -#: src/guides/reindexing.md:17 -msgid "`$XDG_DATA_HOME`/ord or `$HOME`/.local/share/ord" -msgstr "" +#: src/guides/testing.md:108 +msgid "By default, browsers don't support compression over HTTP. To test compressed content over HTTP, use the `--decompress` flag:" +msgstr "Por defecto, los navegadores no soportan la compresión en HTTP. Para probar como se ve el contenido comprimido sobre HTTP, usa la bandera `--decompress`:" -#: src/guides/reindexing.md:17 -msgid "/home/alice/.local/share/ord" -msgstr "" +#: src/guides/testing.md:115 +msgid "Testing Recursion" +msgstr "Pruebas de Recursión" -#: src/guides/reindexing.md:18 -msgid "macOS" -msgstr "" +#: src/guides/testing.md:118 +msgid "When testing out [recursion](../inscriptions/recursion.md), inscribe the dependencies first (example with [p5.js](https://p5js.org)):" +msgstr "Cuando hagas pruebas de [recursión](../inscriptions/recursion.md), primero inscribe las dependencias (por ejemplo, con [p5.js](https://p5js.org)):" -#: src/guides/reindexing.md:18 -msgid "`$HOME`/Library/Application Support/ord" -msgstr "" +#: src/guides/testing.md:125 +msgid "This will return the inscription ID of the dependency which you can then reference in your inscription." +msgstr "Esto retornará el ID de inscripción de la dependencia que luego puedes referenciar en tu inscripción." -#: src/guides/reindexing.md:18 -msgid "/Users/Alice/Library/Application Support/ord" +#: src/guides/testing.md:128 +msgid "" +"However, inscription IDs differ between mainnet and test chains, so you must change the inscription IDs in your inscription to the mainnet inscription IDs of your dependencies " +"before making the final inscription on mainnet." msgstr "" +"Sin embargo, los IDs de inscripción difieren entre mainnet y las cadenas de prueba, por lo que debes cambiar los IDs de inscripción en tu inscripción a los IDs de inscripción de " +"mainnet de tus dependencias antes de hacer la inscripción final en mainnet." -#: src/guides/reindexing.md:19 -msgid "Windows" -msgstr "" +#: src/guides/testing.md:132 +msgid "Then you can inscribe your recursive inscription with:" +msgstr "Luego puedes inscribir tu inscripción recursiva con:" -#: src/guides/reindexing.md:19 -msgid "`{FOLDERID_RoamingAppData}`\\\\ord" -msgstr "" +#: src/guides/testing.md:138 +msgid "Finally you will have to mine some blocks and start the server:" +msgstr "Finalmente, tendrás que minar algunos bloques e iniciar el servidor:" -#: src/guides/reindexing.md:19 -msgid "C:\\Users\\Alice\\AppData\\Roaming\\ord" -msgstr "" +#: src/guides/testing.md:144 +msgid "Mainnet Dependencies" +msgstr "Dependencias en Mainnet" -#: src/guides/reindexing.md:21 +#: src/guides/testing.md:146 msgid "" -"So to delete the database and reindex on MacOS you would have to run the " -"following commands in the terminal:" +"To avoid having to change dependency inscription IDs to mainnet inscription IDs, you may utilize a content proxy when testing. `ord server` accepts a `--proxy` option, which " +"takes the URL of a another `ord server` instance. When making a request to `/content/` when a content proxy is set and the inscription is not found, `ord server` " +"will forward the request to the content proxy. This allows you to run a test `ord server` instance with a mainnet content proxy. You can then use mainnet inscription IDs in your " +"test inscription, which will then return the content of the mainnet inscriptions." msgstr "" -"Para eliminar la base de datos y reindexar en MacOS, tendrías que ejecutar " -"los siguientes comandos en la terminal:" +"Para evitar tener que cambiar los IDs de inscripción de dependencias a los IDs \n" +"de inscripción de mainnet, puedes utilizar un proxy de contenido. `ord server` acepta una \n" +"opción `--proxy`, que toma la URL de otra instancia de `ord server`. Al hacer una solicitud a `/content/` cuando se establece un proxy de contenido \n" +"y no se encuentra la inscripción, `ord server` reenviará la solicitud al proxy de contenido. Esto te permite ejecutar una instancia de prueba de `ord server` con un proxy de \n" +"contenido de mainnet. Luego puedes usar ID de inscripciónes de mainnet en tu inscripción de prueba, lo cual retornará el contenido de las inscripciones en mainnet." -#: src/guides/reindexing.md:24 +#: src/guides/testing.md:156 msgid "" -"```bash\n" -"rm ~/Library/Application Support/ord/index.redb\n" -"ord index update\n" +"```\n" +"ord --regtest server --proxy https://ordinals.com\n" "```" msgstr "" -"```bash\n" -"rm ~/Library/Application Support/ord/index.redb\n" -"ord index update\n" +"```\n" +"ord --regtest server --proxy https://ordinals.com\n" "```" -#: src/guides/reindexing.md:29 -msgid "" -"You can of course also set the location of the data directory yourself with " -"`ord --datadir index update` or give it a specific filename and path " -"with `ord --index index update`." -msgstr "" -"También tienes la opción de determinar la ubicación del directorio de datos " -"utilizando el comando `ord --datadir index update` o asignarle un nombre " -"de archivo y ruta específicos utilizando el comando `ord --index " -"index update`." - #: src/bounties.md:1 msgid "Ordinal Bounty Hunting Hints" msgstr "Pistas para la Caza de Recompensas de Ordinals" - #: src/bounties.md:4 msgid "" -"The `ord` wallet can send and receive specific satoshis. Additionally, " -"ordinal theory is extremely simple. A clever hacker should be able to write " -"code from scratch to manipulate satoshis using ordinal theory in no time." +"The `ord` wallet can send and receive specific satoshis. Additionally, ordinal theory is extremely simple. A clever hacker should be able to write code from scratch to manipulate " +"satoshis using ordinal theory in no time." msgstr "" -"El monedero `ord` tiene la capacidad de enviar y recibir satoshis " -"específicos. Además, la teoría ordinal es sumamente sencilla. Un " -"hacker ingenioso debería poder crear código desde cero para manipular " -"satoshis utilizando la teoría ordinal en poco tiempo." +"El monedero `ord` tiene la capacidad de enviar y recibir satoshis específicos. Además, la teoría ordinal es sumamente sencilla. Un hacker ingenioso debería poder crear código " +"desde cero para manipular satoshis utilizando la teoría ordinal en poco tiempo." #: src/bounties.md:8 msgid "" -"For more information about ordinal theory, check out the [FAQ](./faq.md) for " -"an overview, the " -"[BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki) for the " -"technical details, and the [ord repo](https://github.com/ordinals/ord) for " -"the `ord` wallet and block explorer." +"For more information about ordinal theory, check out the [FAQ](./faq.md) for an overview, the [BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki) for the technical " +"details, and the [ord repo](https://github.com/ordinals/ord) for the `ord` wallet and block explorer." msgstr "" -"Para obtener más información sobre la teoría ordinal, visita la sección de " -"[preguntas frecuentes](./faq.md) para obtener una visión general, " -"el [BIP](https://github.com/ordinals/ord/blob/master/bip.mediawiki) para los detalles " -"técnicos, y el [repositorio de ord](https://github.com/ordinals/ord) para " -"conocer más sobre el monedero y el explorador de bloques de `ord`." +"Para obtener más información sobre la teoría ordinal, visita la sección de [preguntas frecuentes](./faq.md para obtener una visión general, el [BIP](https://github.com/ordinals/" +"ord/blob/master/bip.mediawiki) para los detalles técnicos, y el [repositorio de ord](https://github.com/ordinals/ord) para conocer más sobre el monedero y el explorador de " +"bloques de ord." #: src/bounties.md:14 msgid "" -"Satoshi was the original developer of ordinal theory. However, he knew that " -"others would consider it heretical and dangerous, so he hid his knowledge, " -"and it was lost to the sands of time. This potent theory is only now being " -"rediscovered. You can help by researching rare satoshis." +"Satoshi was the original developer of ordinal theory. However, he knew that others would consider it heretical and dangerous, so he hid his knowledge, and it was lost to the " +"sands of time. This potent theory is only now being rediscovered. You can help by researching rare satoshis." msgstr "" -"Satoshi fue el desarrollador original de la teoría ordinal. Sin embargo, " -"sabía que otros la considerarían herética y peligrosa, por lo que ocultó " -"su conocimiento, que terminó desapareciendo con el paso del tiempo. Solo " -"ahora estamos redescubriendo esta poderosa teoría. Puedes contribuir con " -"este resurgimiento investigando satoshis poco comunes." +"Satoshi fue el desarrollador original de la teoría ordinal. Sin embargo, sabía que otros la considerarían herética y peligrosa, por lo que ocultó su conocimiento, que terminó " +"desapareciendo con el paso del tiempo. Solo ahora estamos redescubriendo esta poderosa teoría. Puedes contribuir con este resurgimiento investigando satoshis poco comunes." #: src/bounties.md:19 msgid "Good luck and godspeed!" @@ -5121,18 +6276,13 @@ msgstr "¡Buena suerte y buen viaje!" msgid "Ordinal Bounty 0" msgstr "Recompensa Ordinal 0" -#: src/bounty/0.md:4 -#: src/bounty/1.md:4 -#: src/bounty/2.md:4 -#: src/bounty/3.md:4 +#: src/bounty/0.md:4 src/bounty/1.md:4 src/bounty/2.md:4 src/bounty/3.md:4 msgid "Criteria" msgstr "Criterios" #: src/bounty/0.md:7 -msgid "" -"Send a sat whose ordinal number ends with a zero to the submission address:" -msgstr "" -"Envía un sat cuyo número ordinal termine en cero a la dirección de entrega:" +msgid "Send a sat whose ordinal number ends with a zero to the submission address:" +msgstr "Envía un sat cuyo número ordinal termine en cero a la dirección de entrega:" #: src/bounty/0.md:9 msgid "✅: [1857578125803250](https://ordinals.com/ordinal/1857578125803250)" @@ -5146,10 +6296,7 @@ msgstr "❌: [1857578125803251](https://ordinals.com/ordinal/1857578125803251)" msgid "The sat must be the first sat of the output you send." msgstr "El sat debe ser el primer sat de la salida que envíes." -#: src/bounty/0.md:15 -#: src/bounty/1.md:14 -#: src/bounty/2.md:15 -#: src/bounty/3.md:63 +#: src/bounty/0.md:15 src/bounty/1.md:14 src/bounty/2.md:15 src/bounty/3.md:63 msgid "Reward" msgstr "Recompensa" @@ -5157,83 +6304,56 @@ msgstr "Recompensa" msgid "100,000 sats" msgstr "100,000 sats" -#: src/bounty/0.md:20 -#: src/bounty/1.md:19 -#: src/bounty/2.md:20 -#: src/bounty/3.md:70 +#: src/bounty/0.md:20 src/bounty/1.md:19 src/bounty/2.md:20 src/bounty/3.md:70 msgid "Submission Address" msgstr "Dirección de Entrega" #: src/bounty/0.md:23 -msgid "" -"[`1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3`](https://mempool.space/address/1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3)" -msgstr "" -"[`1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3`](https://mempool.space/address/1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3)" +msgid "[`1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3`](https://mempool.space/address/1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3)" +msgstr "[`1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3`](https://mempool.space/address/1PE7u4wbDP2RqfKN6geD1bG57v9Gj9FXm3)" -#: src/bounty/0.md:25 -#: src/bounty/1.md:24 -#: src/bounty/2.md:25 -#: src/bounty/3.md:75 +#: src/bounty/0.md:25 src/bounty/1.md:24 src/bounty/2.md:25 src/bounty/3.md:75 msgid "Status" msgstr "Estado" #: src/bounty/0.md:28 -msgid "" -"Claimed by " -"[@count_null](https://twitter.com/rodarmor/status/1560793241473400833)!" -msgstr "" -"Reclamado por " -"[@count_null](https://twitter.com/rodarmor/status/1560793241473400833)!" +msgid "Claimed by [@count_null](https://twitter.com/rodarmor/status/1560793241473400833)!" +msgstr "Reclamado por [@count_null](https://twitter.com/rodarmor/status/1560793241473400833)!" #: src/bounty/1.md:1 msgid "Ordinal Bounty 1" msgstr "Recompensa Ordinal 1" #: src/bounty/1.md:7 -msgid "" -"The transaction that submits a UTXO containing the oldest sat, i.e., that " -"with the lowest number, amongst all submitted UTXOs will be judged the " -"winner." -msgstr "" -"La transacción que envíe un UTXO que contenga el sat más antiguo, " -"es decir, aquel con el número más bajo, entre todos los UTXOs enviados será " -"considerado el ganador." +msgid "The transaction that submits a UTXO containing the oldest sat, i.e., that with the lowest number, amongst all submitted UTXOs will be judged the winner." +msgstr "La transacción que envíe un UTXO que contenga el sat más antiguo, es decir, aquel con el número más bajo, entre todos los UTXOs enviados será considerado el ganador." #: src/bounty/1.md:10 msgid "" -"The bounty is open for submissions until block 753984—the first block of " -"difficulty adjustment period 374. Submissions included in block 753984 or " -"later will not be considered." +"The bounty is open for submissions until block 753984—the first block of difficulty adjustment period 374. Submissions included in block 753984 or later will not be considered." msgstr "" -"La convocatoria para participar en la recompensa permanecerá abierta hasta " -"el bloque 753984, que marca el primer bloque del período de ajuste de " -"dificultad 374. Los envíos que se incluyan a partir del bloque 753984 no " -"serán tomados en cuenta." +"La convocatoria para participar en la recompensa permanecerá abierta hasta el bloque 753984, que marca el primer bloque del período de ajuste de dificultad 374. Los envíos que se " +"incluyan a partir del bloque 753984 no serán tomados en cuenta." #: src/bounty/1.md:17 msgid "200,000 sats" msgstr "200,000 sats" #: src/bounty/1.md:22 -msgid "" -"[`145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap`](https://mempool.space/address/145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap)" -msgstr "" -"[`145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap`](https://mempool.space/address/145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap)" +msgid "[`145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap`](https://mempool.space/address/145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap)" +msgstr "[`145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap`](https://mempool.space/address/145Z7PFHyVrwiMWwEcUmDgFbmUbQSU9aap)" #: src/bounty/1.md:27 -msgid "" -"Claimed by " -"[@ordinalsindex](https://twitter.com/rodarmor/status/1569883266508853251)!" -msgstr "" -"Reclamado por [@ordinalsindex](https://twitter.com/rodarmor/status/1569883266508853251)!" +msgid "Claimed by [@ordinalsindex](https://twitter.com/rodarmor/status/1569883266508853251)!" +msgstr "Reclamado por [@ordinalsindex](https://twitter.com/rodarmor/status/1569883266508853251)!" #: src/bounty/2.md:1 msgid "Ordinal Bounty 2" msgstr "Recompensa Ordinal 2" #: src/bounty/2.md:7 -msgid "Send an uncommon sat to the submission address:" -msgstr "Envía un sat poco común a la dirección de entrega:\n " +msgid "Send an uncommon sat to the submission address:" +msgstr "Envía un sat poco común a la dirección de envío:" #: src/bounty/2.md:9 msgid "✅: [347100000000000](https://ordinals.com/sat/347100000000000)" @@ -5244,30 +6364,20 @@ msgid "❌: [6685000001337](https://ordinals.com/sat/6685000001337)" msgstr "❌: [6685000001337](https://ordinals.com/sat/6685000001337)" #: src/bounty/2.md:13 -msgid "" -"Confirm that the submission address has not received transactions before " -"submitting your entry. Only the first successful submission will be rewarded." -msgstr "" -"Confirma que la dirección de entrega no haya recibido transacciones antes de " -"enviar tu entrega. Solo la primera participación exitosa recibirá recompensa." +msgid "Confirm that the submission address has not received transactions before submitting your entry. Only the first successful submission will be rewarded." +msgstr "Confirma que la dirección de entrega no haya recibido transacciones antes de enviar tu entrega. Solo la primera participación exitosa recibirá recompensa." #: src/bounty/2.md:18 msgid "300,000 sats" msgstr "300,000 sats" #: src/bounty/2.md:23 -msgid "" -"[`1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH`](https://mempool.space/address/1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH)" -msgstr "" -"[`1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH`](https://mempool.space/address/1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH)" +msgid "[`1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH`](https://mempool.space/address/1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH)" +msgstr "[`1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH`](https://mempool.space/address/1Hyr94uypwWq5CQffaXHvwUMEyBPp3TUZH)" #: src/bounty/2.md:28 -msgid "" -"Claimed by " -"[@utxoset](https://twitter.com/rodarmor/status/1582424455615172608)!" -msgstr "" -"Reclamado por [@utxoset]" -"(https://twitter.com/rodarmor/status/1582424455615172608)!" +msgid "Claimed by [@utxoset](https://twitter.com/rodarmor/status/1582424455615172608)!" +msgstr "Reclamado por [@utxoset](https://twitter.com/rodarmor/status/1582424455615172608)!" #: src/bounty/3.md:1 msgid "Ordinal Bounty 3" @@ -5275,92 +6385,46 @@ msgstr "Recompensa Ordinal 3" #: src/bounty/3.md:7 msgid "" -"Ordinal bounty 3 has two parts, both of which are based on _ordinal names_. " -"Ordinal names are a modified base-26 encoding of ordinal numbers. To avoid " -"locking short names inside the unspendable genesis block coinbase reward, " -"ordinal names get _shorter_ as the ordinal number gets _longer_. The name of " -"sat 0, the first sat to be mined is `nvtdijuwxlp` and the name of sat " -"2,099,999,997,689,999, the last sat to be mined, is `a`." -msgstr "" -"La tercera recompensa ordinal consta de dos partes, ambas basadas en los " -"_nombres de ordinals_. Los nombres de los ordinals son una modificación de " -"la codificación base-26 de los números ordinales. Para prevenir que los nombres " -"más cortos queden atrapados en el bloque génesis el cual no se puede utilizar, " -"los nombres de los ordinals se van acortando a medida que el número ordinal " -"aumenta. El nombre del sat 0, el primer sat minado, es `nvtdijuwxlp` y el nombre " -"del sat 2,099,999,997,689,999, el último sat que será minado, es `a`." +"Ordinal bounty 3 has two parts, both of which are based on _ordinal names_. Ordinal names are a modified base-26 encoding of ordinal numbers. To avoid locking short names inside " +"the unspendable genesis block coinbase reward, ordinal names get _shorter_ as the ordinal number gets _longer_. The name of sat 0, the first sat to be mined is `nvtdijuwxlp` and " +"the name of sat 2,099,999,997,689,999, the last sat to be mined, is `a`." +msgstr "" +"La tercera recompensa ordinal consta de dos partes, ambas basadas en los _nombres de ordinals_. Los nombres de los ordinals son una modificación de la codificación base-26 de los " +"números ordinales. Para prevenir que los nombres más cortos queden atrapados en el bloque génesis el cual no se puede utilizar, los nombres de los ordinals se van acortando a " +"medida que el número ordinal aumenta. El nombre del sat 0, el primer sat minado, es `nvtdijuwxlp` y el nombre del sat 2,099,999,997,689,999, el último sat que será minado, es `a`." #: src/bounty/3.md:14 -msgid "" -"The bounty is open for submissions until block 840000—the first block after " -"the fourth halvening. Submissions included in block 840000 or later will not " -"be considered." -msgstr "" -"La convocatoria para participar en la recompensa permanecerá abierta hasta el " -"bloque 840000, el primer bloque después del cuarto halving. Los envíos que se " -"incluyan a partir del bloque 840000 no serán tomados en cuenta." +msgid "The bounty is open for submissions until block 840000—the first block after the fourth halving. Submissions included in block 840000 or later will not be considered." +msgstr "The bounty is open for submissions until block 840000—the first block after the fourth halving. Submissions included in block 840000 or later will not be considered." #: src/bounty/3.md:18 msgid "" -"Both parts use [frequency.tsv](frequency.tsv), a list of words and the " -"number of times they occur in the [Google Books Ngram " -"dataset](http://storage.googleapis.com/books/ngrams/books/datasetsv2.html). " -"filtered to only include the names of sats which will have been mined by the " -"end of the submission period, that appear at least 5000 times in the corpus." +"Both parts use [frequency.tsv](frequency.tsv), a list of words and the number of times they occur in the [Google Books Ngram dataset](http://storage.googleapis.com/books/ngrams/" +"books/datasetsv2.html). filtered to only include the names of sats which will have been mined by the end of the submission period, that appear at least 5000 times in the corpus." msgstr "" -"Ambas partes usan [frequency.tsv](frequency.tsv), un documento que contiene " -"una lista de palabras junto con la cantidad de veces que aparecen en el " -"[set de datos Google Books Ngram](http://storage.googleapis.com/books/ngrams/books/datasetsv2.html), " -"Este archivo ha sido filtrado para incluir solo los nombres de sats que " -"habrán sido minados para el momento de cierre del periodo de entregas, " -"que aparecen por lo menos 5000 veces en el corpus." +"Ambas partes usan[frequency.tsv](frequency.tsv), un documento que contiene una lista de palabras junto con la cantidad de veces que aparecen en el set de datos[Google Books Ngram " +"dataset](http://storage.googleapis.com/books/ngrams/books/datasetsv2.html), Este archivo ha sido filtrado para incluir solo los nombres de sats que habrán sido minados para el " +"momento de cierre del periodo de entregas, que aparecen por lo menos 5000 veces en el cuerpo." #: src/bounty/3.md:24 msgid "" -"`frequency.tsv` is a file of tab-separated values. The first column is the " -"word, and the second is the number of times it appears in the corpus. The " -"entries are sorted from least-frequently occurring to most-frequently " -"occurring." +"`frequency.tsv` is a file of tab-separated values. The first column is the word, and the second is the number of times it appears in the corpus. The entries are sorted from least-" +"frequently occurring to most-frequently occurring." msgstr "" -"`frequency.tsv` es un archivo de valores separados por tabulaciones. La " -"primera columna es la palabra, y la segunda es el número de veces que " -"aparece en el corpus. Los datos están organizados de manera que las palabras " -"que aparecen con menor frecuencia están primero, seguidas por aquellas que " -"se encuentran con una mayor frecuencia." +"`frequency.tsv` es un archivo de valores separados por tabulaciones. La primera columna es la palabra, y la segunda es el número de veces que aparece en el corpus. Los datos " +"están organizados de manera que las palabras que aparecen con menor frecuencia están primero, seguidas por aquellas que se encuentran con una mayor frecuencia." #: src/bounty/3.md:29 -msgid "" -"`frequency.tsv` was compiled using [this " -"program](https://github.com/casey/onegrams)." -msgstr "" -"`frequency.tsv` fue compilado [usando este programa]" -"(https://github.com/casey/onegrams)." +msgid "`frequency.tsv` was compiled using [this program](https://github.com/casey/onegrams)." +msgstr "'frequency.tsv' fue compilado usando este [programa](https://github.com/casey/onegrams).." #: src/bounty/3.md:32 -msgid "" -"To search an `ord` wallet for sats with a name in `frequency.tsv`, use the " -"following [`ord`](https://github.com/ordinals/ord) command:" -msgstr "" -"Para buscar sats en un monedero `ord` que coincidan con un nombre presente en " -"`frequency.tsv`, emplea el siguiente comando [`ord`](https://github.com/ordinals/ord):" - -#: src/bounty/3.md:35 -msgid "" -"```\n" -"ord wallet sats --tsv frequency.tsv\n" -"```" -msgstr "" -"```\n" -"ord wallet sats --tsv frequency.tsv\n" -"```" +msgid "To search an `ord` wallet for sats with a name in `frequency.tsv`, use the following [`ord`](https://github.com/ordinals/ord) command:" +msgstr "Para buscar sats en un monedero [`ord`](https://github.com/ordinals/ord) que coincidan con un nombre presente en `frequency.tsv`, emplea el siguiente comando ord:" #: src/bounty/3.md:39 -msgid "" -"This command requires the sat index, so `--index-sats` must be passed to ord " -"when first creating the index." -msgstr "" -"Este comando requiere el índice de sats, por lo que se debe incluir el " -"parámetro `--index-sats` en ord cuando se crea el índice por primera vez." +msgid "This command requires the sat index, so `--index-sats` must be passed to ord when first creating the index." +msgstr "Este comando requiere el índice de sats, por lo que se debe incluir el parámetro `--index-sats` en ord cuando se crea el índice por primera vez." #: src/bounty/3.md:42 msgid "Part 0" @@ -5371,12 +6435,8 @@ msgid "_Rare sats pair best with rare words._" msgstr "_Los sats raros hacen mejor pareja con palabras raras._" #: src/bounty/3.md:46 -msgid "" -"The transaction that submits the UTXO containing the sat whose name appears " -"with the lowest number of occurrences in `frequency.tsv` shall be the winner " -"of part 0." -msgstr "La transacción que envíe el UTXO que contiene el sat cuyo nombre aparece " -"con el menor número de ocurrencias en `frequency.tsv` será el ganador de la parte 0." +msgid "The transaction that submits the UTXO containing the sat whose name appears with the lowest number of occurrences in `frequency.tsv` shall be the winner of part 0." +msgstr "La transacción que envíe el UTXO que contiene el sat cuyo nombre aparece con el menor número de ocurrencias en \"frequency.tsv\" será el ganador de la parte 0." #: src/bounty/3.md:50 msgid "Part 1" @@ -5387,25 +6447,16 @@ msgid "_Popularity is the font of value._" msgstr "_La popularidad es la fuente del valor._" #: src/bounty/3.md:54 -msgid "" -"The transaction that submits the UTXO containing the sat whose name appears " -"with the highest number of occurrences in `frequency.tsv` shall be the " -"winner of part 1." -msgstr "" -"La transacción que envía el UTXO que contiene el sat cuyo nombre aparece con " -"el mayor número de ocurrencias en `frequency.tsv` será el ganador de la parte 1." +msgid "The transaction that submits the UTXO containing the sat whose name appears with the highest number of occurrences in `frequency.tsv` shall be the winner of part 1." +msgstr "La transacción que envía el UTXO que contiene el sat cuyo nombre aparece con el mayor número de ocurrencias en `frequency.tsv` será el ganador de la parte 1." #: src/bounty/3.md:58 msgid "Tie Breaking" msgstr "Desempate" #: src/bounty/3.md:60 -msgid "" -"In the case of a tie, where two submissions occur with the same frequency, " -"the earlier submission shall be the winner." -msgstr "" -"Si se produce un empate, donde dos presentaciones registren la misma frecuencia, " -"la presentación que se haya realizado primero será la ganadora. " +msgid "In the case of a tie, where two submissions occur with the same frequency, the earlier submission shall be the winner." +msgstr "Si se produce un empate, donde dos presentaciones registren la misma frecuencia, la presentación que se haya realizado primero será la ganadora." #: src/bounty/3.md:66 msgid "Part 0: 200,000 sats" @@ -5420,11 +6471,160 @@ msgid "Total: 400,000 sats" msgstr "Total: 400,000 sats" #: src/bounty/3.md:73 -msgid "" -"[`17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg`](https://mempool.space/address/17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg)" -msgstr "" -"[`17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg`](https://mempool.space/address/17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg)" +msgid "[`17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg`](https://mempool.space/address/17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg)" +msgstr "[`17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg`](https://mempool.space/address/17m5rvMpi78zG8RUpCRd6NWWMJtWmu65kg)" #: src/bounty/3.md:78 msgid "Unclaimed!" msgstr "¡No se ha reclamado!" + +msgid "" +"```\n" +"txindex=1\n" +"```" +msgstr "" +"```\n" +"txindex=1\n" +"```" + +msgid "" +"```\n" +"bitcoind -txindex\n" +"```" +msgstr "" +"```\n" +"bitcoind -txindex\n" +"```" + +msgid "" +"```\n" +"bitcoin-cli getblockcount\n" +"```" +msgstr "" +"```\n" +"bitcoin-cli getblockcount\n" +"```" + +msgid "" +"```sh\n" +"curl --proto '=https' --tlsv1.2 -fsLS https://ordinals.com/install.sh | bash -s\n" +"```" +msgstr "" +"```sh\n" +"curl --proto '=https' --tlsv1.2 -fsLS https://ordinals.com/install.sh | bash -s\n" +"```" + +msgid "" +"_This guide is out of date. Since it was written, the `ord` binary was changed to only build the full satoshi index when the `--index-sats` flag is supplied. Additionally, `ord` " +"now has a built-in wallet that wraps a Bitcoin Core wallet. See `ord wallet --help`._" +msgstr "" +"_Esta guía está desactualizada. Desde que se escribió, el binario `ord` ord fue modificado para construir el índice completo de satoshis únicamente cuando se utiliza la bandera " +"`--index-sats`. Además, `ord` ahora tiene un monedero integrado que envuelve un monedero de Bitcoin Core. Ver `ord wallet –help`._" + +msgid "" +"```sh\n" +"bitcoind -txindex\n" +"```" +msgstr "" +"```sh\n" +"bitcoind -txindex\n" +"```" + +msgid "" +"```sh\n" +"bitcoin-cli getblockcount\n" +"```" +msgstr "" +"```sh\n" +"bitcoin-cli getblockcount\n" +"```" + +msgid "Wait for it to finish indexing." +msgstr "Espera hasta que termine de indexar." + +msgid "" +"```sh\n" +"bitcoin-cli loadwallet foo\n" +"```" +msgstr "" +"```sh\n" +"bitcoin-cli loadwallet foo\n" +"```" + +msgid "" +"```sh\n" +"bitcoin-cli createwallet foo-watch-only true true\n" +"```" +msgstr "" +"```sh\n" +"bitcoin-cli createwallet foo-solo-lectura true true\n" +"```" + +msgid "" +"```sh\n" +"bitcoin-cli loadwallet foo-watch-only\n" +"```" +msgstr "" +"```sh\n" +"bitcoin-cli loadwallet foo-solo-lectura\n" +"```" + +msgid "" +"```sh\n" +"bitcoin-cli getwalletinfo\n" +"```" +msgstr "" +"```sh\n" +"bitcoin-cli getwalletinfo\n" +"```" + +msgid "" +"```sh\n" +"bitcoin-cli \\\n" +" importdescriptors \\\n" +" '[\n" +" {\n" +" \"desc\": \"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\"\n" +" \"timestamp\":0\n" +" },\n" +" {\n" +" \"desc\": \"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#64k8wnd7\",\n" +" \"timestamp\":0\n" +" }\n" +" ]'\n" +"```" +msgstr "" +"```sh\n" +"bitcoin-cli \\\n" +" importdescriptors \\\n" +" '[\n" +" {\n" +" \"desc\": \"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/0/*)#tpnxnxax\"\n" +" \"timestamp\":0\n" +" },\n" +" {\n" +" \"desc\": \"wpkh([bf1dd55e/84h/0h/0h]xpub6CcJtWcvFQaMo39ANFi1MyXkEXM8T8ZhnxMtSjQAdPmVSTHYnc8Hwoc11VpuP8cb8JUTboZB5A7YYGDonYySij4XTawL6iNZvmZwdnSEEep/1/*)#64k8wnd7\",\n" +" \"timestamp\":0\n" +" }\n" +" ]'\n" +"```" + +msgid "" +"```\n" +"bitcoind -regtest -txindex\n" +"```" +msgstr "" +"```\n" +"bitcoind -regtest -txindex\n" +"```" + +msgid "" +"```bash\n" +"rm ~/Library/Application Support/ord/index.redb\n" +"ord index update\n" +"```" +msgstr "" +"```bash\n" +"rm ~/Library/Application Support/ord/index.redb\n" +"ord index update\n" +"```" diff --git a/docs/po/zh.po b/docs/po/zh.po index 05e20a5a21..f8f70d6d82 100644 --- a/docs/po/zh.po +++ b/docs/po/zh.po @@ -7642,7 +7642,7 @@ msgid "" "of the mainnet inscriptions." msgstr "" "为了避免在测试时必须将依赖铭文ID更改为主网铭文ID,你可以在测试时使用内容代" -"理。`ord server`接受一个`--content-proxy`选项,它需要另一个`ord server`实例的" +"理。`ord server`接受一个`--proxy`选项,它需要另一个`ord server`实例的" "URL。当设置了内容代理并且铭文未找到时,向`/content/`发出请" "求,`ord server`将会将请求转发给内容代理。这允许你运行一个带有主网内容代理的" "测试`ord server`实例。然后你可以在测试铭文中使用主网铭文ID,这将返回主网铭文" @@ -7651,7 +7651,7 @@ msgstr "" #: src/guides/testing.md:155 msgid "" "```\n" -"ord --regtest server --content-proxy https://ordinals.com\n" +"ord --regtest server --proxy https://ordinals.com\n" "```" msgstr "" diff --git a/docs/src/guides/teleburning.md b/docs/src/guides/teleburning.md index c54029a92f..7bcef91122 100644 --- a/docs/src/guides/teleburning.md +++ b/docs/src/guides/teleburning.md @@ -27,7 +27,7 @@ The ENS domain name [rodarmor.eth](https://app.ens.domains/rodarmor.eth), was teleburned to [inscription zero](https://ordinals.com/inscription/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0). -Running the inscription ID of inscription zero is +The inscription ID of inscription zero is `6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0`. Passing `6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0` to diff --git a/docs/src/guides/testing.md b/docs/src/guides/testing.md index 26a13272b4..09765b2866 100644 --- a/docs/src/guides/testing.md +++ b/docs/src/guides/testing.md @@ -145,7 +145,7 @@ bitcoin-cli generatetoaddress 6 To avoid having to change dependency inscription IDs to mainnet inscription IDs, you may utilize a content proxy when testing. `ord server` accepts a -`--content-proxy` option, which takes the URL of a another `ord server` +`--proxy` option, which takes the URL of a another `ord server` instance. When making a request to `/content/` when a content proxy is set and the inscription is not found, `ord server` will forward the request to the content proxy. This allows you to run a test `ord server` @@ -154,5 +154,5 @@ in your test inscription, which will then return the content of the mainnet inscriptions. ``` -ord --regtest server --content-proxy https://ordinals.com +ord --regtest server --proxy https://ordinals.com ``` diff --git a/docs/src/inscriptions/recursion.md b/docs/src/inscriptions/recursion.md index 69365a19b1..77b2ef2fb0 100644 --- a/docs/src/inscriptions/recursion.md +++ b/docs/src/inscriptions/recursion.md @@ -40,8 +40,12 @@ The recursive endpoints are: - `/r/blocktime`: UNIX time stamp of latest block. - `/r/children/`: the first 100 child inscription ids. - `/r/children//`: the set of 100 child inscription ids on ``. +- `/r/children//inscriptions`: details of the first 100 child inscriptions. +- `/r/children//inscriptions/`: details of the set of 100 child inscriptions on ``. - `/r/inscription/`: information about an inscription - `/r/metadata/`: JSON string containing the hex-encoded CBOR metadata. +- `/r/parents/`: the first 100 parent inscription ids. +- `/r/parents//`: the set of 100 parent inscription ids on ``. - `/r/sat/`: the first 100 inscription ids on a sat. - `/r/sat//`: the set of 100 inscription ids on ``. - `/r/sat//at/`: 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. @@ -76,6 +80,9 @@ Examples - `/r/blockinfo/0`: +Note: `feerate_percentiles` are feerates at the 10th, 25th, 50th, 75th, and 90th +percentile in sats/vB. + ```json { "average_fee": 0, @@ -85,6 +92,7 @@ Examples "confirmations": 0, "difficulty": 0.0, "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + "feerate_percentiles": [0, 0, 0, 0, 0], "height": 0, "max_fee": 0, "max_fee_rate": 0, @@ -130,6 +138,44 @@ Examples } ``` +- `/r/children/60bcf821240064a9c55225c4f01711b0ebbcab39aa3fafeefe4299ab158536fai0/inscriptions/49`: + +```json +{ + "children": [ + { + "charms": [ + "cursed" + ], + "fee": 44, + "height": 813929, + "id": "7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4900", + "number": -223695, + "output": "dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0", + "sat": 1897135510683785, + "satpoint": "dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0:74188588", + "timestamp": 1698326262 + }, + ... + { + "charms": [ + "cursed" + ], + "fee": 44, + "height": 813929, + "id": "7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4936", + "number": -223731, + "output": "dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0", + "sat": 1897135510683821, + "satpoint": "dcaaeacf58faea0927468ea5a93f33b7d7447841e66f75db5a655d735510c518:0:74188624", + "timestamp": 1698326262 + } + ], + "more": false, + "page": 49 +} +``` + - `/r/inscription/3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36i0` ```json @@ -137,6 +183,7 @@ Examples "charms": [], "content_type": "image/png", "content_length": 144037, + "delegate": null, "fee": 36352, "height": 209, "id": "3bd72a7ef68776c9429961e43043ff65efa7fb2d8bb407386a9e3b19f149bc36i0", @@ -174,19 +221,3 @@ Examples "id":"17541f6adf6eb160d52bc6eb0a3546c7c1d2adfe607b1a3cddc72cc0619526adi0" } ``` - -- `/r/children/60bcf821240064a9c55225c4f01711b0ebbcab39aa3fafeefe4299ab158536fai0/49`: - -```json -{ - "ids":[ - "7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4900", - "7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4901", - ... - "7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4935", - "7cd66b8e3a63dcd2fada917119830286bca0637267709d6df1ca78d98a1b4487i4936" - ], - "more":false, - "page":49 -} -``` diff --git a/docs/src/runes/specification.md b/docs/src/runes/specification.md index d3b9b36354..c13440002e 100644 --- a/docs/src/runes/specification.md +++ b/docs/src/runes/specification.md @@ -517,7 +517,7 @@ ID `0:0` is used to mean the rune being etched in this transaction, if any. An edict with `amount` zero allocates all remaining units of rune `id`. An edict with `output` equal to the number of transaction outputs allocates -`amount` runes to each non-`OP_RETURN` output. +`amount` runes to each non-`OP_RETURN` output in order. An edict with `amount` zero and `output` equal to the number of transaction outputs divides all unallocated units of rune `id` between each non-`OP_RETURN` diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index 4d7c65be2c..1961c66a03 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -195,7 +195,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" dependencies = [ - "brotli", + "brotli 3.5.0", "flate2", "futures-core", "memchr", @@ -574,7 +574,18 @@ checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", - "brotli-decompressor", + "brotli-decompressor 2.5.1", +] + +[[package]] +name = "brotli" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19483b140a7ac7174d34b5a581b406c64f84da5409d3e09cf4fff604f9270e67" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor 4.0.0", ] [[package]] @@ -587,6 +598,16 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "brotli-decompressor" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6221fe77a248b9117d431ad93761222e1cf8ff282d9d1d5d9f53d6299a1cf76" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bumpalo" version = "3.15.4" @@ -2075,7 +2096,7 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ord" -version = "0.16.0" +version = "0.18.5" dependencies = [ "anyhow", "async-trait", @@ -2086,7 +2107,7 @@ dependencies = [ "bip39", "bitcoin", "boilerplate", - "brotli", + "brotli 5.0.0", "chrono", "ciborium", "clap", @@ -2160,7 +2181,7 @@ dependencies = [ [[package]] name = "ordinals" -version = "0.0.4" +version = "0.0.8" dependencies = [ "bitcoin", "derive_more", diff --git a/fuzz/fuzz_targets/runestone_decipher.rs b/fuzz/fuzz_targets/runestone_decipher.rs index 4895530074..9422221e29 100644 --- a/fuzz/fuzz_targets/runestone_decipher.rs +++ b/fuzz/fuzz_targets/runestone_decipher.rs @@ -32,5 +32,5 @@ fuzz_target!(|input: Vec>| { version: 2, }; - Runestone::from_transaction(&tx); + Runestone::decipher(&tx); }); diff --git a/fuzz/fuzz_targets/transaction_builder.rs b/fuzz/fuzz_targets/transaction_builder.rs index 41948b559e..ecdccb0cac 100644 --- a/fuzz/fuzz_targets/transaction_builder.rs +++ b/fuzz/fuzz_targets/transaction_builder.rs @@ -4,10 +4,10 @@ use { arbitrary::Arbitrary, bitcoin::{ address::{Address, NetworkUnchecked}, - Amount, OutPoint, + Amount, OutPoint, TxOut, }, libfuzzer_sys::fuzz_target, - ord::{FeeRate, Target, TransactionBuilder}, + ord::{FeeRate, InscriptionId, Target, TransactionBuilder}, ordinals::SatPoint, std::collections::{BTreeMap, BTreeSet}, }; @@ -16,7 +16,6 @@ use { struct Input { output_value: Option, fee_rate: f64, - utxos: Vec, } fuzz_target!(|input: Input| { @@ -29,23 +28,24 @@ fuzz_target!(|input: Input| { .unwrap(); let inscription_id = "1111111111111111111111111111111111111111111111111111111111111111i1" - .parse() + .parse::() .unwrap(); let mut inscriptions = BTreeMap::new(); - inscriptions.insert(satpoint, inscription_id); + inscriptions.insert(satpoint, vec![inscription_id]); + let address = "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4" + .parse::>() + .unwrap() + .assume_checked(); let mut amounts = BTreeMap::new(); - amounts.insert(outpoint, Amount::from_sat(1_000_000)); - - for (i, value) in input.utxos.into_iter().enumerate() { - amounts.insert( - format!("0000000000000000000000000000000000000000000000000000000000000000:{i}",) - .parse() - .unwrap(), - Amount::from_sat(value), - ); - } + amounts.insert( + outpoint, + TxOut { + value: 50_000, + script_pubkey: address.script_pubkey(), + }, + ); let recipient = "bc1pdqrcrxa8vx6gy75mfdfj84puhxffh4fq46h3gkp6jxdd0vjcsdyspfxcv6" .parse::>() diff --git a/fuzz/fuzz_targets/varint_decode.rs b/fuzz/fuzz_targets/varint_decode.rs index cd54a8712e..5ca215465d 100644 --- a/fuzz/fuzz_targets/varint_decode.rs +++ b/fuzz/fuzz_targets/varint_decode.rs @@ -6,7 +6,7 @@ fuzz_target!(|input: &[u8]| { let mut i = 0; while i < input.len() { - let Some((decoded, length)) = varint::decode(&input[i..]) else { + let Ok((decoded, length)) = varint::decode(&input[i..]) else { break; }; let mut encoded = Vec::new(); diff --git a/justfile b/justfile index 8cffcbe396..86a7c94edc 100644 --- a/justfile +++ b/justfile @@ -160,9 +160,8 @@ publish-tag-and-crate revision='master': cd ../.. rm -rf tmp/release -list-outdated-dependencies: - cargo outdated -R - cd test-bitcoincore-rpc && cargo outdated -R +outdated: + cargo outdated -R --workspace update-modern-normalize: curl \ diff --git a/ord.yaml b/ord.yaml index 8a3dcceade..d68010a0e9 100644 --- a/ord.yaml +++ b/ord.yaml @@ -18,6 +18,7 @@ hidden: - 6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0 - 703e5f7c49d82aab99e605af306b9a30e991e57d42f982908a962a81ac439832i0 index: /var/lib/ord/index.redb +index_addresses: true index_cache_size: 1000000000 index_runes: true index_sats: true diff --git a/src/api.rs b/src/api.rs index f148066b93..c36c8e2c1e 100644 --- a/src/api.rs +++ b/src/api.rs @@ -3,9 +3,12 @@ use { serde_hex::{SerHex, Strict}, }; -pub use crate::templates::{ - BlocksHtml as Blocks, RuneHtml as Rune, RunesHtml as Runes, StatusHtml as Status, - TransactionHtml as Transaction, +pub use crate::{ + subcommand::decode::RawOutput as Decode, + templates::{ + BlocksHtml as Blocks, RuneHtml as Rune, RunesHtml as Runes, StatusHtml as Status, + TransactionHtml as Transaction, + }, }; #[derive(Debug, PartialEq, Serialize, Deserialize)] @@ -16,6 +19,7 @@ pub struct Block { pub inscriptions: Vec, pub runes: Vec, pub target: BlockHash, + pub transactions: Vec, } impl Block { @@ -33,6 +37,7 @@ impl Block { best_height: best_height.0, inscriptions, runes, + transactions: block.txdata, } } } @@ -47,6 +52,7 @@ pub struct BlockInfo { pub confirmations: i32, pub difficulty: f64, pub hash: BlockHash, + pub feerate_percentiles: [u64; 5], pub height: u32, pub max_fee: u64, pub max_fee_rate: u64, @@ -76,6 +82,13 @@ pub struct Children { pub page: usize, } +#[derive(Debug, PartialEq, Serialize, Deserialize)] +pub struct ChildInscriptions { + pub children: Vec, + pub more: bool, + pub page: usize, +} + #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct Inscription { pub address: Option, @@ -109,6 +122,7 @@ pub struct InscriptionRecursive { pub charms: Vec, pub content_type: Option, pub content_length: Option, + pub delegate: Option, pub fee: u64, pub height: u32, pub id: InscriptionId, @@ -120,6 +134,19 @@ pub struct InscriptionRecursive { pub value: Option, } +#[derive(Debug, PartialEq, Serialize, Deserialize)] +pub struct ChildInscriptionRecursive { + pub charms: Vec, + pub fee: u64, + pub height: u32, + pub id: InscriptionId, + pub number: i32, + pub output: OutPoint, + pub sat: Option, + pub satpoint: SatPoint, + pub timestamp: i64, +} + #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Inscriptions { pub ids: Vec, diff --git a/src/arguments.rs b/src/arguments.rs index 2e9b0bd2da..d9df72d868 100644 --- a/src/arguments.rs +++ b/src/arguments.rs @@ -20,29 +20,30 @@ pub(crate) struct Arguments { } impl Arguments { - pub(crate) fn run(self) -> SubcommandResult { + pub(crate) fn run(self) -> SnafuResult>> { let mut env: BTreeMap = BTreeMap::new(); - for (var, value) in env::vars_os() { - let Some(var) = var.to_str() else { + for (variable, value) in env::vars_os() { + let Some(variable) = variable.to_str() else { continue; }; - let Some(key) = var.strip_prefix("ORD_") else { + let Some(key) = variable.strip_prefix("ORD_") else { continue; }; env.insert( key.into(), - value.into_string().map_err(|value| { - anyhow!( - "environment variable `{var}` not valid unicode: `{}`", - value.to_string_lossy() - ) - })?, + value + .into_string() + .map_err(|value| SnafuError::EnvVarUnicode { + backtrace: Backtrace::capture(), + value, + variable: variable.into(), + })?, ); } - self.subcommand.run(Settings::load(self.options)?) + Ok(self.subcommand.run(Settings::load(self.options)?)?) } } diff --git a/src/blocktime.rs b/src/blocktime.rs index c65eb0bd96..b3f5ce65b3 100644 --- a/src/blocktime.rs +++ b/src/blocktime.rs @@ -1,7 +1,7 @@ use super::*; #[derive(Copy, Clone)] -pub(crate) enum Blocktime { +pub enum Blocktime { Confirmed(DateTime), Expected(DateTime), } diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000000..09254db1af --- /dev/null +++ b/src/error.rs @@ -0,0 +1,66 @@ +use super::*; + +#[derive(Debug, Snafu)] +#[snafu(context(suffix(false)), visibility(pub(crate)))] +pub(crate) enum SnafuError { + #[snafu(display("{err}"))] + Anyhow { err: anyhow::Error }, + #[snafu(display("environment variable `{variable}` not valid unicode: `{}`", value.to_string_lossy()))] + EnvVarUnicode { + backtrace: Backtrace, + value: OsString, + variable: String, + }, + #[snafu(display("I/O error at `{}`", path.display()))] + Io { + backtrace: Backtrace, + path: PathBuf, + source: io::Error, + }, +} + +impl From for SnafuError { + fn from(err: Error) -> SnafuError { + Self::Anyhow { err } + } +} + +/// We currently use `anyhow` for error handling but are migrating to typed +/// errors using `snafu`. This trait exists to provide access to +/// `snafu::ResultExt::{context, with_context}`, which are otherwise shadowed +/// by `anhow::Context::{context, with_context}`. Once the migration is +/// complete, this trait can be deleted, and `snafu::ResultExt` used directly. +pub(crate) trait ResultExt: Sized { + fn snafu_context(self, context: C) -> Result + where + C: snafu::IntoError, + E2: std::error::Error + snafu::ErrorCompat; + + #[allow(unused)] + fn with_snafu_context(self, context: F) -> Result + where + F: FnOnce(&mut E) -> C, + C: snafu::IntoError, + E2: std::error::Error + snafu::ErrorCompat; +} + +impl ResultExt for std::result::Result { + fn snafu_context(self, context: C) -> Result + where + C: snafu::IntoError, + E2: std::error::Error + snafu::ErrorCompat, + { + use snafu::ResultExt; + self.context(context) + } + + fn with_snafu_context(self, context: F) -> Result + where + F: FnOnce(&mut E) -> C, + C: snafu::IntoError, + E2: std::error::Error + snafu::ErrorCompat, + { + use snafu::ResultExt; + self.with_context(context) + } +} diff --git a/src/index.rs b/src/index.rs index 9618e9725e..ce79d69872 100644 --- a/src/index.rs +++ b/src/index.rs @@ -2,7 +2,7 @@ use { self::{ entry::{ Entry, HeaderValue, InscriptionEntry, InscriptionEntryValue, InscriptionIdValue, - OutPointValue, RuneEntryValue, RuneIdValue, SatPointValue, SatRange, TxidValue, + OutPointValue, RuneEntryValue, RuneIdValue, SatPointValue, SatRange, TxOutValue, TxidValue, }, event::Event, lot::Lot, @@ -48,11 +48,12 @@ mod updater; #[cfg(test)] pub(crate) mod testing; -const SCHEMA_VERSION: u64 = 25; +const SCHEMA_VERSION: u64 = 26; define_multimap_table! { SATPOINT_TO_SEQUENCE_NUMBER, &SatPointValue, u32 } define_multimap_table! { SAT_TO_SEQUENCE_NUMBER, u64, u32 } define_multimap_table! { SEQUENCE_NUMBER_TO_CHILDREN, u32, u32 } +define_multimap_table! { SCRIPT_PUBKEY_TO_OUTPOINT, &[u8], OutPointValue } define_table! { CONTENT_TYPE_TO_COUNT, Option<&[u8]>, u64 } define_table! { HEIGHT_TO_BLOCK_HEADER, u32, &HeaderValue } define_table! { HEIGHT_TO_LAST_SEQUENCE_NUMBER, u32, u32 } @@ -61,7 +62,7 @@ define_table! { INSCRIPTION_ID_TO_SEQUENCE_NUMBER, InscriptionIdValue, u32 } define_table! { INSCRIPTION_NUMBER_TO_SEQUENCE_NUMBER, i32, u32 } define_table! { OUTPOINT_TO_RUNE_BALANCES, &OutPointValue, &[u8] } define_table! { OUTPOINT_TO_SAT_RANGES, &OutPointValue, &[u8] } -define_table! { OUTPOINT_TO_VALUE, &OutPointValue, u64} +define_table! { OUTPOINT_TO_TXOUT, &OutPointValue, TxOutValue } define_table! { RUNE_ID_TO_RUNE_ENTRY, RuneIdValue, RuneEntryValue } define_table! { RUNE_TO_RUNE_ID, u128, RuneIdValue } define_table! { SAT_TO_SATPOINT, u64, &SatPointValue } @@ -90,6 +91,7 @@ pub(crate) enum Statistic { IndexTransactions = 12, IndexSpentSats = 13, InitialSyncTime = 14, + IndexAddresses = 15, } impl Statistic { @@ -105,7 +107,7 @@ impl From for u64 { } #[derive(Serialize)] -pub(crate) struct Info { +pub struct Info { blocks_indexed: u32, branch_pages: u64, fragmented_bytes: u64, @@ -119,7 +121,7 @@ pub(crate) struct Info { stored_bytes: u64, tables: BTreeMap, total_bytes: u64, - pub(crate) transactions: Vec, + pub transactions: Vec, tree_height: u32, utxos_indexed: u64, } @@ -152,9 +154,9 @@ impl From for TableInfo { } #[derive(Serialize)] -pub(crate) struct TransactionInfo { - pub(crate) starting_block_count: u32, - pub(crate) starting_timestamp: u128, +pub struct TransactionInfo { + pub starting_block_count: u32, + pub starting_timestamp: u128, } pub(crate) trait BitcoinCoreRpcResultExt { @@ -189,12 +191,13 @@ pub struct Index { genesis_block_coinbase_transaction: Transaction, genesis_block_coinbase_txid: Txid, height_limit: Option, + index_addresses: bool, index_runes: bool, index_sats: bool, index_spent_sats: bool, index_transactions: bool, - settings: Settings, path: PathBuf, + settings: Settings, started: DateTime, unrecoverably_reorged: AtomicBool, } @@ -212,12 +215,9 @@ impl Index { let path = settings.index().to_owned(); - if let Err(err) = fs::create_dir_all(path.parent().unwrap()) { - bail!( - "failed to create data dir `{}`: {err}", - path.parent().unwrap().display() - ); - } + let data_dir = path.parent().unwrap(); + + fs::create_dir_all(data_dir).snafu_context(error::Io { path: data_dir })?; let index_cache_size = settings.index_cache_size(); @@ -298,6 +298,7 @@ impl Index { tx.open_multimap_table(SATPOINT_TO_SEQUENCE_NUMBER)?; tx.open_multimap_table(SAT_TO_SEQUENCE_NUMBER)?; + tx.open_multimap_table(SCRIPT_PUBKEY_TO_OUTPOINT)?; tx.open_multimap_table(SEQUENCE_NUMBER_TO_CHILDREN)?; tx.open_table(CONTENT_TYPE_TO_COUNT)?; tx.open_table(HEIGHT_TO_BLOCK_HEADER)?; @@ -306,7 +307,7 @@ impl Index { tx.open_table(INSCRIPTION_ID_TO_SEQUENCE_NUMBER)?; tx.open_table(INSCRIPTION_NUMBER_TO_SEQUENCE_NUMBER)?; tx.open_table(OUTPOINT_TO_RUNE_BALANCES)?; - tx.open_table(OUTPOINT_TO_VALUE)?; + tx.open_table(OUTPOINT_TO_TXOUT)?; tx.open_table(RUNE_ID_TO_RUNE_ENTRY)?; tx.open_table(RUNE_TO_RUNE_ID)?; tx.open_table(SAT_TO_SATPOINT)?; @@ -324,6 +325,12 @@ impl Index { outpoint_to_sat_ranges.insert(&OutPoint::null().store(), [].as_slice())?; } + Self::set_statistic( + &mut statistics, + Statistic::IndexAddresses, + u64::from(settings.index_addresses()), + )?; + Self::set_statistic( &mut statistics, Statistic::IndexRunes, @@ -402,6 +409,7 @@ impl Index { Err(error) => bail!("failed to open index: {error}"), }; + let index_addresses; let index_runes; let index_sats; let index_spent_sats; @@ -410,6 +418,7 @@ impl Index { { let tx = database.begin_read()?; let statistics = tx.open_table(STATISTIC_TO_COUNT)?; + index_addresses = Self::is_statistic_set(&statistics, Statistic::IndexAddresses)?; index_runes = Self::is_statistic_set(&statistics, Statistic::IndexRunes)?; index_sats = Self::is_statistic_set(&statistics, Statistic::IndexSats)?; index_spent_sats = Self::is_statistic_set(&statistics, Statistic::IndexSpentSats)?; @@ -428,6 +437,7 @@ impl Index { first_inscription_height: settings.first_inscription_height(), genesis_block_coinbase_transaction, height_limit: settings.height_limit(), + index_addresses, index_runes, index_sats, index_spent_sats, @@ -444,26 +454,30 @@ impl Index { self.durability = durability; } - pub(crate) fn contains_output(&self, output: &OutPoint) -> Result { + pub fn contains_output(&self, output: &OutPoint) -> Result { Ok( self .database .begin_read()? - .open_table(OUTPOINT_TO_VALUE)? + .open_table(OUTPOINT_TO_TXOUT)? .get(&output.store())? .is_some(), ) } - pub(crate) fn has_rune_index(&self) -> bool { + pub fn has_address_index(&self) -> bool { + self.index_addresses + } + + pub fn has_rune_index(&self) -> bool { self.index_runes } - pub(crate) fn has_sat_index(&self) -> bool { + pub fn has_sat_index(&self) -> bool { self.index_sats } - pub(crate) fn status(&self) -> Result { + pub fn status(&self) -> Result { let rtx = self.database.begin_read()?; let statistic_to_count = rtx.open_table(STATISTIC_TO_COUNT)?; @@ -501,6 +515,7 @@ impl Index { content_type_counts.sort_by_key(|(_content_type, count)| Reverse(*count)); Ok(StatusHtml { + address_index: self.has_address_index(), blessed_inscriptions, chain: self.settings.chain(), content_type_counts, @@ -513,9 +528,9 @@ impl Index { self.settings.chain().network(), Height(next_height), ), - rune_index: statistic(Statistic::IndexRunes)? != 0, + rune_index: self.has_rune_index(), runes: statistic(Statistic::Runes)?, - sat_index: statistic(Statistic::IndexSats)? != 0, + sat_index: self.has_sat_index(), started: self.started, transaction_index: statistic(Statistic::IndexTransactions)? != 0, unrecoverably_reorged: self.unrecoverably_reorged.load(atomic::Ordering::Relaxed), @@ -523,7 +538,7 @@ impl Index { }) } - pub(crate) fn info(&self) -> Result { + pub fn info(&self) -> Result { let stats = self.database.begin_write()?.stats()?; let rtx = self.database.begin_read()?; @@ -651,7 +666,7 @@ impl Index { } } - pub(crate) fn export(&self, filename: &String, include_addresses: bool) -> Result { + pub fn export(&self, filename: &String, include_addresses: bool) -> Result { let mut writer = BufWriter::new(fs::File::create(filename)?); let rtx = self.database.begin_read()?; @@ -785,19 +800,19 @@ impl Index { .inscription_number } - pub(crate) fn block_count(&self) -> Result { + pub fn block_count(&self) -> Result { self.begin_read()?.block_count() } - pub(crate) fn block_height(&self) -> Result> { + pub fn block_height(&self) -> Result> { self.begin_read()?.block_height() } - pub(crate) fn block_hash(&self, height: Option) -> Result> { + pub fn block_hash(&self, height: Option) -> Result> { self.begin_read()?.block_hash(height) } - pub(crate) fn blocks(&self, take: usize) -> Result> { + pub fn blocks(&self, take: usize) -> Result> { let rtx = self.begin_read()?; let block_count = rtx.block_count()?; @@ -818,7 +833,7 @@ impl Index { Ok(blocks) } - pub(crate) fn rare_sat_satpoints(&self) -> Result> { + pub fn rare_sat_satpoints(&self) -> Result> { let rtx = self.database.begin_read()?; let sat_to_satpoint = rtx.open_table(SAT_TO_SATPOINT)?; @@ -833,7 +848,7 @@ impl Index { Ok(result) } - pub(crate) fn rare_sat_satpoint(&self, sat: Sat) -> Result> { + pub fn rare_sat_satpoint(&self, sat: Sat) -> Result> { Ok( self .database @@ -844,7 +859,7 @@ impl Index { ) } - pub(crate) fn get_rune_by_id(&self, id: RuneId) -> Result> { + pub fn get_rune_by_id(&self, id: RuneId) -> Result> { Ok( self .database @@ -855,7 +870,7 @@ impl Index { ) } - pub(crate) fn get_rune_by_number(&self, number: usize) -> Result> { + pub fn get_rune_by_number(&self, number: usize) -> Result> { match self .database .begin_read()? @@ -872,10 +887,7 @@ impl Index { } } - pub(crate) fn rune( - &self, - rune: Rune, - ) -> Result)>> { + pub fn rune(&self, rune: Rune) -> Result)>> { let rtx = self.database.begin_read()?; let Some(id) = rtx @@ -908,7 +920,7 @@ impl Index { Ok(Some((RuneId::load(id), entry, parent))) } - pub(crate) fn runes(&self) -> Result> { + pub fn runes(&self) -> Result> { let mut entries = Vec::new(); for result in self @@ -924,7 +936,7 @@ impl Index { Ok(entries) } - pub(crate) fn runes_paginated( + pub fn runes_paginated( &self, page_size: usize, page_index: usize, @@ -949,13 +961,13 @@ impl Index { Ok((entries, more)) } - pub(crate) fn encode_rune_balance(id: RuneId, balance: u128, buffer: &mut Vec) { + pub fn encode_rune_balance(id: RuneId, balance: u128, buffer: &mut Vec) { varint::encode_to_vec(id.block.into(), buffer); varint::encode_to_vec(id.tx.into(), buffer); varint::encode_to_vec(balance, buffer); } - pub(crate) fn decode_rune_balance(buffer: &[u8]) -> Result<((RuneId, u128), usize)> { + pub fn decode_rune_balance(buffer: &[u8]) -> Result<((RuneId, u128), usize)> { let mut len = 0; let (block, block_len) = varint::decode(&buffer[len..])?; len += block_len; @@ -970,7 +982,7 @@ impl Index { Ok(((id, balance), len)) } - pub(crate) fn get_rune_balances_for_outpoint( + pub fn get_rune_balances_for_output( &self, outpoint: OutPoint, ) -> Result> { @@ -1007,9 +1019,7 @@ impl Index { Ok(balances) } - pub(crate) fn get_rune_balance_map( - &self, - ) -> Result>> { + pub fn get_rune_balance_map(&self) -> Result>> { let outpoint_balances = self.get_rune_balances()?; let rtx = self.database.begin_read()?; @@ -1064,7 +1074,7 @@ impl Index { Ok(rune_balances) } - pub(crate) fn get_rune_balances(&self) -> Result)>> { + pub fn get_rune_balances(&self) -> Result)>> { let mut result = Vec::new(); for entry in self @@ -1091,19 +1101,19 @@ impl Index { Ok(result) } - pub(crate) fn block_header(&self, hash: BlockHash) -> Result> { + pub fn block_header(&self, hash: BlockHash) -> Result> { self.client.get_block_header(&hash).into_option() } - pub(crate) fn block_header_info(&self, hash: BlockHash) -> Result> { + pub fn block_header_info(&self, hash: BlockHash) -> Result> { self.client.get_block_header_info(&hash).into_option() } - pub(crate) fn block_stats(&self, height: u64) -> Result> { + pub fn block_stats(&self, height: u64) -> Result> { self.client.get_block_stats(height).into_option() } - pub(crate) fn get_block_by_height(&self, height: u32) -> Result> { + pub fn get_block_by_height(&self, height: u32) -> Result> { Ok( self .client @@ -1114,11 +1124,11 @@ impl Index { ) } - pub(crate) fn get_block_by_hash(&self, hash: BlockHash) -> Result> { + pub fn get_block_by_hash(&self, hash: BlockHash) -> Result> { self.client.get_block(&hash).into_option() } - pub(crate) fn get_collections_paginated( + pub fn get_collections_paginated( &self, page_size: usize, page_index: usize, @@ -1216,7 +1226,7 @@ impl Index { .collect() } - pub(crate) fn get_children_by_sequence_number_paginated( + pub fn get_children_by_sequence_number_paginated( &self, sequence_number: u32, page_size: usize, @@ -1251,7 +1261,7 @@ impl Index { Ok((children, more)) } - pub(crate) fn get_parents_by_sequence_number_paginated( + pub fn get_parents_by_sequence_number_paginated( &self, parent_sequence_numbers: Vec, page_index: usize, @@ -1282,7 +1292,7 @@ impl Index { Ok((parents, more_parents)) } - pub(crate) fn get_etching(&self, txid: Txid) -> Result> { + pub fn get_etching(&self, txid: Txid) -> Result> { let rtx = self.database.begin_read()?; let transaction_id_to_rune = rtx.open_table(TRANSACTION_ID_TO_RUNE)?; @@ -1299,7 +1309,7 @@ impl Index { Ok(Some(RuneEntry::load(entry.value()).spaced_rune)) } - pub(crate) fn get_inscription_ids_by_sat(&self, sat: Sat) -> Result> { + pub fn get_inscription_ids_by_sat(&self, sat: Sat) -> Result> { let rtx = self.database.begin_read()?; let sequence_number_to_inscription_entry = @@ -1323,7 +1333,7 @@ impl Index { Ok(ids) } - pub(crate) fn get_inscription_ids_by_sat_paginated( + pub fn get_inscription_ids_by_sat_paginated( &self, sat: Sat, page_size: u64, @@ -1360,7 +1370,7 @@ impl Index { Ok((ids, more)) } - pub(crate) fn get_inscription_id_by_sat_indexed( + pub fn get_inscription_id_by_sat_indexed( &self, sat: Sat, inscription_index: isize, @@ -1417,7 +1427,7 @@ impl Index { Ok(inscription_id) } - pub(crate) fn get_inscription_satpoint_by_id( + pub fn get_inscription_satpoint_by_id( &self, inscription_id: InscriptionId, ) -> Result> { @@ -1439,7 +1449,7 @@ impl Index { Ok(satpoint) } - pub(crate) fn get_inscription_by_id( + pub fn get_inscription_by_id( &self, inscription_id: InscriptionId, ) -> Result> { @@ -1455,7 +1465,7 @@ impl Index { })) } - pub(crate) fn inscription_count(&self, txid: Txid) -> Result { + pub fn inscription_count(&self, txid: Txid) -> Result { let start = InscriptionId { index: 0, txid }; let end = InscriptionId { @@ -1475,7 +1485,7 @@ impl Index { ) } - pub(crate) fn inscription_exists(&self, inscription_id: InscriptionId) -> Result { + pub fn inscription_exists(&self, inscription_id: InscriptionId) -> Result { Ok( self .database @@ -1486,7 +1496,7 @@ impl Index { ) } - pub(crate) fn get_inscriptions_on_output_with_satpoints( + pub fn get_inscriptions_on_output_with_satpoints( &self, outpoint: OutPoint, ) -> Result> { @@ -1502,10 +1512,7 @@ impl Index { ) } - pub(crate) fn get_inscriptions_on_output( - &self, - outpoint: OutPoint, - ) -> Result> { + pub fn get_inscriptions_for_output(&self, outpoint: OutPoint) -> Result> { Ok( self .get_inscriptions_on_output_with_satpoints(outpoint)? @@ -1515,7 +1522,24 @@ impl Index { ) } - pub(crate) fn get_transaction(&self, txid: Txid) -> Result> { + pub fn get_inscriptions_for_outputs( + &self, + outpoints: &Vec, + ) -> Result> { + let mut inscriptions = Vec::new(); + for outpoint in outpoints { + inscriptions.extend( + self + .get_inscriptions_on_output_with_satpoints(*outpoint)? + .iter() + .map(|(_satpoint, inscription_id)| *inscription_id), + ); + } + + Ok(inscriptions) + } + + pub fn get_transaction(&self, txid: Txid) -> Result> { if txid == self.genesis_block_coinbase_txid { return Ok(Some(self.genesis_block_coinbase_transaction.clone())); } @@ -1534,7 +1558,7 @@ impl Index { self.client.get_raw_transaction(&txid, None).into_option() } - pub(crate) fn find(&self, sat: Sat) -> Result> { + pub fn find(&self, sat: Sat) -> Result> { let sat = sat.0; let rtx = self.begin_read()?; @@ -1562,7 +1586,7 @@ impl Index { Ok(None) } - pub(crate) fn find_range( + pub fn find_range( &self, range_start: Sat, range_end: Sat, @@ -1615,7 +1639,7 @@ impl Index { Ok(Some(result)) } - pub(crate) fn list(&self, outpoint: OutPoint) -> Result>> { + pub fn list(&self, outpoint: OutPoint) -> Result>> { Ok( self .database @@ -1632,18 +1656,27 @@ impl Index { ) } - pub(crate) fn is_output_spent(&self, outpoint: OutPoint) -> Result { + pub fn is_output_spent(&self, outpoint: OutPoint) -> Result { Ok( outpoint != OutPoint::null() && outpoint != self.settings.chain().genesis_coinbase_outpoint() - && self - .client - .get_tx_out(&outpoint.txid, outpoint.vout, Some(true))? - .is_none(), + && if self.settings.index_addresses() { + self + .database + .begin_read()? + .open_table(OUTPOINT_TO_TXOUT)? + .get(&outpoint.store())? + .is_none() + } else { + self + .client + .get_tx_out(&outpoint.txid, outpoint.vout, Some(true))? + .is_none() + }, ) } - pub(crate) fn is_output_in_active_chain(&self, outpoint: OutPoint) -> Result { + pub fn is_output_in_active_chain(&self, outpoint: OutPoint) -> Result { if outpoint == OutPoint::null() { return Ok(true); } @@ -1660,7 +1693,7 @@ impl Index { return Ok(false); }; - if !info.in_active_chain.unwrap_or_default() { + if info.blockhash.is_none() { return Ok(false); } @@ -1671,7 +1704,7 @@ impl Index { Ok(true) } - pub(crate) fn block_time(&self, height: Height) -> Result { + pub fn block_time(&self, height: Height) -> Result { let height = height.n(); let rtx = self.database.begin_read()?; @@ -1705,7 +1738,7 @@ impl Index { )) } - pub(crate) fn get_inscriptions_paginated( + pub fn get_inscriptions_paginated( &self, page_size: u32, page_index: u32, @@ -1741,7 +1774,7 @@ impl Index { Ok((inscriptions, more)) } - pub(crate) fn get_inscriptions_in_block(&self, block_height: u32) -> Result> { + pub fn get_inscriptions_in_block(&self, block_height: u32) -> Result> { let rtx = self.database.begin_read()?; let height_to_last_sequence_number = rtx.open_table(HEIGHT_TO_LAST_SEQUENCE_NUMBER)?; @@ -1771,7 +1804,7 @@ impl Index { .collect::>>() } - pub(crate) fn get_runes_in_block(&self, block_height: u64) -> Result> { + pub fn get_runes_in_block(&self, block_height: u64) -> Result> { let rtx = self.database.begin_read()?; let rune_id_to_rune_entry = rtx.open_table(RUNE_ID_TO_RUNE_ENTRY)?; @@ -1794,7 +1827,7 @@ impl Index { Ok(runes) } - pub(crate) fn get_highest_paying_inscriptions_in_block( + pub fn get_highest_paying_inscriptions_in_block( &self, block_height: u32, n: usize, @@ -1825,7 +1858,7 @@ impl Index { )) } - pub(crate) fn get_home_inscriptions(&self) -> Result> { + pub fn get_home_inscriptions(&self) -> Result> { Ok( self .database @@ -1838,7 +1871,7 @@ impl Index { ) } - pub(crate) fn get_feed_inscriptions(&self, n: usize) -> Result> { + pub fn get_feed_inscriptions(&self, n: usize) -> Result> { Ok( self .database @@ -1857,6 +1890,7 @@ impl Index { pub(crate) fn inscription_info( &self, query: query::Inscription, + child: Option, ) -> Result, Inscription)>> { let rtx = self.database.begin_read()?; @@ -1881,6 +1915,22 @@ impl Index { return Ok(None); }; + let sequence_number = if let Some(child) = child { + let Some(child) = rtx + .open_multimap_table(SEQUENCE_NUMBER_TO_CHILDREN)? + .get(sequence_number)? + .nth(child) + .transpose()? + .map(|child| child.value()) + else { + return Ok(None); + }; + + child + } else { + sequence_number + }; + let sequence_number_to_inscription_entry = rtx.open_table(SEQUENCE_NUMBER_TO_INSCRIPTION_ENTRY)?; @@ -2041,7 +2091,7 @@ impl Index { ))) } - pub(crate) fn get_inscription_entry( + pub fn get_inscription_entry( &self, inscription_id: InscriptionId, ) -> Result> { @@ -2189,6 +2239,67 @@ impl Index { ) } + pub fn get_address_info(&self, address: &Address) -> Result> { + self + .database + .begin_read()? + .open_multimap_table(SCRIPT_PUBKEY_TO_OUTPOINT)? + .get(address.script_pubkey().as_bytes())? + .map(|result| { + result + .map_err(|err| anyhow!(err)) + .map(|value| OutPoint::load(value.value())) + }) + .collect() + } + + pub(crate) fn get_aggregated_rune_balances_for_outputs( + &self, + outputs: &Vec, + ) -> Result)>> { + let mut runes = BTreeMap::new(); + + for output in outputs { + let rune_balances = self.get_rune_balances_for_output(*output)?; + + for (spaced_rune, pile) in rune_balances { + runes + .entry(spaced_rune) + .and_modify(|(decimal, _symbol): &mut (Decimal, Option)| { + assert_eq!(decimal.scale, pile.divisibility); + decimal.value += pile.amount; + }) + .or_insert(( + Decimal { + value: pile.amount, + scale: pile.divisibility, + }, + pile.symbol, + )); + } + } + + Ok( + runes + .into_iter() + .map(|(spaced_rune, (decimal, symbol))| (spaced_rune, decimal, symbol)) + .collect(), + ) + } + + pub(crate) fn get_sat_balances_for_outputs(&self, outputs: &Vec) -> Result { + let outpoint_to_txout = self.database.begin_read()?.open_table(OUTPOINT_TO_TXOUT)?; + + let mut acc = 0; + for output in outputs { + if let Some(value) = outpoint_to_txout.get(&output.store())? { + acc += TxOut::load(value.value()).value; + }; + } + + Ok(acc) + } + pub(crate) fn get_output_info(&self, outpoint: OutPoint) -> Result> { let sat_ranges = self.list(outpoint)?; @@ -2216,16 +2327,16 @@ impl Index { return Ok(None); }; - let Some(output) = tx.output.into_iter().nth(outpoint.vout as usize) else { + let Some(txout) = tx.output.into_iter().nth(outpoint.vout as usize) else { return Ok(None); }; - output + txout }; - let inscriptions = self.get_inscriptions_on_output(outpoint)?; + let inscriptions = self.get_inscriptions_for_output(outpoint)?; - let runes = self.get_rune_balances_for_outpoint(outpoint)?; + let runes = self.get_rune_balances_for_output(outpoint)?; let spent = self.is_output_spent(outpoint)?; @@ -3375,7 +3486,7 @@ mod tests { assert_eq!( context .index - .get_inscriptions_on_output(OutPoint { txid, vout: 0 }) + .get_inscriptions_for_output(OutPoint { txid, vout: 0 }) .unwrap(), [] ); @@ -3385,7 +3496,7 @@ mod tests { assert_eq!( context .index - .get_inscriptions_on_output(OutPoint { txid, vout: 0 }) + .get_inscriptions_for_output(OutPoint { txid, vout: 0 }) .unwrap(), [inscription_id] ); @@ -3400,7 +3511,7 @@ mod tests { assert_eq!( context .index - .get_inscriptions_on_output(OutPoint { txid, vout: 0 }) + .get_inscriptions_for_output(OutPoint { txid, vout: 0 }) .unwrap(), [] ); @@ -3408,7 +3519,7 @@ mod tests { assert_eq!( context .index - .get_inscriptions_on_output(OutPoint { + .get_inscriptions_for_output(OutPoint { txid: send_id, vout: 0, }) @@ -3438,7 +3549,7 @@ mod tests { assert_eq!( context .index - .get_inscriptions_on_output(OutPoint { + .get_inscriptions_for_output(OutPoint { txid: first, vout: 0 }) @@ -6271,6 +6382,79 @@ mod tests { .unwrap()); } + #[test] + fn output_addresses_are_updated() { + let context = Context::builder() + .arg("--index-addresses") + .arg("--index-sats") + .build(); + + context.mine_blocks(2); + + let txid = context.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, Witness::new()), (2, 0, 0, Witness::new())], + outputs: 2, + ..Default::default() + }); + + context.mine_blocks(1); + + let transaction = context.index.get_transaction(txid).unwrap().unwrap(); + + let first_address = context + .index + .settings + .chain() + .address_from_script(&transaction.output[0].script_pubkey) + .unwrap(); + + let first_address_second_output = OutPoint { + txid: transaction.txid(), + vout: 1, + }; + + assert_eq!( + context.index.get_address_info(&first_address).unwrap(), + [ + OutPoint { + txid: transaction.txid(), + vout: 0 + }, + first_address_second_output + ] + ); + + let txid = context.core.broadcast_tx(TransactionTemplate { + inputs: &[(3, 1, 0, Witness::new())], + p2tr: true, + ..Default::default() + }); + + context.mine_blocks(1); + + let transaction = context.index.get_transaction(txid).unwrap().unwrap(); + + let second_address = context + .index + .settings + .chain() + .address_from_script(&transaction.output[0].script_pubkey) + .unwrap(); + + assert_eq!( + context.index.get_address_info(&first_address).unwrap(), + [first_address_second_output] + ); + + assert_eq!( + context.index.get_address_info(&second_address).unwrap(), + [OutPoint { + txid: transaction.txid(), + vout: 0 + }] + ); + } + #[test] fn fee_spent_inscriptions_are_numbered_last_in_block() { for context in Context::configurations() { diff --git a/src/index/entry.rs b/src/index/entry.rs index faa3d2343a..60dacc3969 100644 --- a/src/index/entry.rs +++ b/src/index/entry.rs @@ -92,6 +92,15 @@ impl RuneEntry { .unwrap_or_default() } + pub fn max_supply(&self) -> u128 { + self.premine + + self.terms.and_then(|terms| terms.cap).unwrap_or_default() + * self + .terms + .and_then(|terms| terms.amount) + .unwrap_or_default() + } + pub fn pile(&self, amount: u128) -> Pile { Pile { amount, @@ -280,16 +289,16 @@ impl Entry for RuneId { } #[derive(Debug, Eq, PartialEq, Clone)] -pub(crate) struct InscriptionEntry { - pub(crate) charms: u16, - pub(crate) fee: u64, - pub(crate) height: u32, - pub(crate) id: InscriptionId, - pub(crate) inscription_number: i32, - pub(crate) parents: Vec, - pub(crate) sat: Option, - pub(crate) sequence_number: u32, - pub(crate) timestamp: u32, +pub struct InscriptionEntry { + pub charms: u16, + pub fee: u64, + pub height: u32, + pub id: InscriptionId, + pub inscription_number: i32, + pub parents: Vec, + pub sat: Option, + pub sequence_number: u32, + pub timestamp: u32, } pub(crate) type InscriptionEntryValue = ( @@ -423,6 +432,26 @@ impl Entry for OutPoint { } } +pub(super) type TxOutValue = ( + u64, // value + Vec, // script_pubkey +); + +impl Entry for TxOut { + type Value = TxOutValue; + + fn load(value: Self::Value) -> Self { + Self { + value: value.0, + script_pubkey: ScriptBuf::from_bytes(value.1), + } + } + + fn store(self) -> Self::Value { + (self.value, self.script_pubkey.to_bytes()) + } +} + pub(super) type SatPointValue = [u8; 44]; impl Entry for SatPoint { @@ -484,6 +513,19 @@ impl Entry for Txid { mod tests { use super::*; + #[test] + fn txout_entry() { + let txout = TxOut { + value: u64::MAX, + script_pubkey: change(0).script_pubkey(), + }; + + let value = (u64::MAX, change(0).script_pubkey().to_bytes()); + + assert_eq!(txout.clone().store(), value); + assert_eq!(TxOut::load(value), txout); + } + #[test] fn inscription_entry() { let id = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefi0" diff --git a/src/index/updater.rs b/src/index/updater.rs index a511f89607..b0afd4459a 100644 --- a/src/index/updater.rs +++ b/src/index/updater.rs @@ -2,8 +2,10 @@ use { self::{inscription_updater::InscriptionUpdater, rune_updater::RuneUpdater}, super::{fetcher::Fetcher, *}, futures::future::try_join_all, - std::sync::mpsc, - tokio::sync::mpsc::{error::TryRecvError, Receiver, Sender}, + tokio::sync::{ + broadcast::{self, error::TryRecvError}, + mpsc::{self}, + }, }; mod inscription_updater; @@ -73,17 +75,19 @@ impl<'index> Updater<'index> { let rx = Self::fetch_blocks_from(self.index, self.height, self.index.index_sats)?; - let (mut outpoint_sender, mut value_receiver) = Self::spawn_fetcher(&self.index.settings)?; + let (mut output_sender, mut txout_receiver, mut address_txout_receiver) = + Self::spawn_fetcher(&self.index.settings)?; let mut uncommitted = 0; - let mut value_cache = HashMap::new(); + let mut utxo_cache = HashMap::new(); while let Ok(block) = rx.recv() { self.index_block( - &mut outpoint_sender, - &mut value_receiver, + &mut output_sender, + &mut address_txout_receiver, + &mut txout_receiver, &mut wtx, block, - &mut value_cache, + &mut utxo_cache, )?; if let Some(progress_bar) = &mut progress_bar { @@ -101,8 +105,8 @@ impl<'index> Updater<'index> { uncommitted += 1; if uncommitted == self.index.settings.commit_interval() { - self.commit(wtx, value_cache)?; - value_cache = HashMap::new(); + self.commit(wtx, utxo_cache)?; + utxo_cache = HashMap::new(); uncommitted = 0; wtx = self.index.begin_write()?; let height = wtx @@ -140,7 +144,7 @@ impl<'index> Updater<'index> { } if uncommitted > 0 { - self.commit(wtx, value_cache)?; + self.commit(wtx, utxo_cache)?; } if let Some(progress_bar) = &mut progress_bar { @@ -154,8 +158,8 @@ impl<'index> Updater<'index> { index: &Index, mut height: u32, index_sats: bool, - ) -> Result> { - let (tx, rx) = mpsc::sync_channel(32); + ) -> Result> { + let (tx, rx) = std::sync::mpsc::sync_channel(32); let height_limit = index.height_limit; @@ -235,22 +239,35 @@ impl<'index> Updater<'index> { } } - fn spawn_fetcher(settings: &Settings) -> Result<(Sender, Receiver)> { + fn spawn_fetcher( + settings: &Settings, + ) -> Result<( + mpsc::Sender, + broadcast::Receiver, + Option>, + )> { let fetcher = Fetcher::new(settings)?; - // Not sure if any block has more than 20k inputs, but none so far after first inscription block + // A block probably has no more than 20k inputs const CHANNEL_BUFFER_SIZE: usize = 20_000; - let (outpoint_sender, mut outpoint_receiver) = - tokio::sync::mpsc::channel::(CHANNEL_BUFFER_SIZE); - let (value_sender, value_receiver) = tokio::sync::mpsc::channel::(CHANNEL_BUFFER_SIZE); - // Batch 2048 missing inputs at a time. Arbitrarily chosen for now, maybe higher or lower can be faster? - // Did rudimentary benchmarks with 1024 and 4096 and time was roughly the same. + // Batch 2048 missing inputs at a time, arbitrarily chosen size const BATCH_SIZE: usize = 2048; + + let (outpoint_sender, mut outpoint_receiver) = mpsc::channel::(CHANNEL_BUFFER_SIZE); + + let (txout_sender, txout_receiver) = broadcast::channel::(CHANNEL_BUFFER_SIZE); + + let address_txout_receiver = if settings.index_addresses() { + Some(txout_sender.subscribe()) + } else { + None + }; + // Default rpcworkqueue in bitcoind is 16, meaning more than 16 concurrent requests will be rejected. // Since we are already requesting blocks on a separate thread, and we don't want to break if anything // else runs a request, we keep this to 12. - let parallel_requests: usize = settings.bitcoin_rpc_limit() as usize; + let parallel_requests: usize = settings.bitcoin_rpc_limit().try_into().unwrap(); thread::spawn(move || { let rt = tokio::runtime::Builder::new_multi_thread() @@ -263,6 +280,7 @@ impl<'index> Updater<'index> { log::debug!("Outpoint channel closed"); return; }; + // There's no try_iter on tokio::sync::mpsc::Receiver like std::sync::mpsc::Receiver. // So we just loop until BATCH_SIZE doing try_recv until it returns None. let mut outpoints = vec![outpoint]; @@ -272,7 +290,8 @@ impl<'index> Updater<'index> { }; outpoints.push(outpoint); } - // Break outpoints into chunks for parallel requests + + // Break outputs into chunks for parallel requests let chunk_size = (outpoints.len() / parallel_requests) + 1; let mut futs = Vec::with_capacity(parallel_requests); for chunk in outpoints.chunks(chunk_size) { @@ -280,6 +299,7 @@ impl<'index> Updater<'index> { let fut = fetcher.get_transactions(txids); futs.push(fut); } + let txs = match try_join_all(futs).await { Ok(txs) => txs, Err(e) => { @@ -287,11 +307,11 @@ impl<'index> Updater<'index> { return; } }; - // Send all tx output values back in order + + // Send all tx outputs back in order for (i, tx) in txs.iter().flatten().enumerate() { - let Ok(_) = value_sender - .send(tx.output[usize::try_from(outpoints[i].vout).unwrap()].value) - .await + let Ok(_) = + txout_sender.send(tx.output[usize::try_from(outpoints[i].vout).unwrap()].clone()) else { log::error!("Value channel closed unexpectedly"); return; @@ -301,16 +321,17 @@ impl<'index> Updater<'index> { }) }); - Ok((outpoint_sender, value_receiver)) + Ok((outpoint_sender, txout_receiver, address_txout_receiver)) } fn index_block( &mut self, - outpoint_sender: &mut Sender, - value_receiver: &mut Receiver, + output_sender: &mut mpsc::Sender, + address_txout_receiver: &mut Option>, + txout_receiver: &mut broadcast::Receiver, wtx: &mut WriteTransaction, block: BlockData, - value_cache: &mut HashMap, + utxo_cache: &mut HashMap, ) -> Result<()> { Reorg::detect_reorg(&block, self.height, self.index)?; @@ -325,51 +346,76 @@ impl<'index> Updater<'index> { block.txdata.len() ); - // If value_receiver still has values something went wrong with the last block - // Could be an assert, shouldn't recover from this and commit the last block - let Err(TryRecvError::Empty) = value_receiver.try_recv() else { - return Err(anyhow!("Previous block did not consume all input values")); - }; - - let mut outpoint_to_value = wtx.open_table(OUTPOINT_TO_VALUE)?; + let mut outpoint_to_txout = wtx.open_table(OUTPOINT_TO_TXOUT)?; let index_inscriptions = self.height >= self.index.first_inscription_height && self.index.settings.index_inscriptions(); + // If the receiver still has inputs something went wrong in the last + // block and we shouldn't recover from this and commit the last block if index_inscriptions { - // Send all missing input outpoints to be fetched right away + assert!( + matches!(txout_receiver.try_recv(), Err(TryRecvError::Empty)), + "Previous block did not consume all inputs" + ); + } + + if let Some(receiver) = address_txout_receiver { + assert!( + matches!(receiver.try_recv(), Err(TryRecvError::Empty)), + "Previous block did not consume all inputs" + ); + } + + if index_inscriptions || self.index.index_addresses { + // Send all missing input outpoints to be fetched let txids = block .txdata .iter() .map(|(_, txid)| txid) .collect::>(); + for (tx, _) in &block.txdata { for input in &tx.input { let prev_output = input.previous_output; - // We don't need coinbase input value + // We don't need coinbase inputs if prev_output.is_null() { continue; } - // We don't need input values from txs earlier in the block, since they'll be added to value_cache - // when the tx is indexed + // We don't need inputs from txs earlier in the block, since + // they'll be added to cache when the tx is indexed if txids.contains(&prev_output.txid) { continue; } - // We don't need input values we already have in our value_cache from earlier blocks - if value_cache.contains_key(&prev_output) { + // We don't need inputs we already have in our cache from earlier blocks + if utxo_cache.contains_key(&prev_output) { continue; } - // We don't need input values we already have in our outpoint_to_value table from earlier blocks that - // were committed to db already - if outpoint_to_value.get(&prev_output.store())?.is_some() { + // We don't need inputs we already have in our database + if outpoint_to_txout.get(&prev_output.store())?.is_some() { continue; } - // We don't know the value of this tx input. Send this outpoint to background thread to be fetched - outpoint_sender.blocking_send(prev_output)?; + // Send this outpoint to background thread to be fetched + output_sender.blocking_send(prev_output)?; } } } + if let Some(address_txout_receiver) = address_txout_receiver { + let mut script_pubkey_to_outpoint = wtx.open_multimap_table(SCRIPT_PUBKEY_TO_OUTPOINT)?; + for (tx, txid) in &block.txdata { + self.index_transaction_output_script_pubkeys( + tx, + txid, + address_txout_receiver, + utxo_cache, + &mut script_pubkey_to_outpoint, + &mut outpoint_to_txout, + index_inscriptions, + )?; + } + }; + let mut content_type_to_count = wtx.open_table(CONTENT_TYPE_TO_COUNT)?; let mut height_to_block_header = wtx.open_table(HEIGHT_TO_BLOCK_HEADER)?; let mut height_to_last_sequence_number = wtx.open_table(HEIGHT_TO_LAST_SEQUENCE_NUMBER)?; @@ -431,7 +477,7 @@ impl<'index> Updater<'index> { inscription_number_to_sequence_number: &mut inscription_number_to_sequence_number, lost_sats, next_sequence_number, - outpoint_to_value: &mut outpoint_to_value, + outpoint_to_txout: &mut outpoint_to_txout, reward: Height(self.height).subsidy(), sat_to_sequence_number: &mut sat_to_sequence_number, satpoint_to_sequence_number: &mut satpoint_to_sequence_number, @@ -442,8 +488,8 @@ impl<'index> Updater<'index> { transaction_buffer: Vec::new(), transaction_id_to_transaction: &mut transaction_id_to_transaction, unbound_inscriptions, - value_cache, - value_receiver, + utxo_cache, + txout_receiver, }; if self.index.index_sats { @@ -630,6 +676,58 @@ impl<'index> Updater<'index> { Ok(()) } + fn index_transaction_output_script_pubkeys( + &mut self, + tx: &Transaction, + txid: &Txid, + txout_receiver: &mut broadcast::Receiver, + utxo_cache: &mut HashMap, + script_pubkey_to_outpoint: &mut MultimapTable<&[u8], OutPointValue>, + outpoint_to_txout: &mut Table<&OutPointValue, TxOutValue>, + index_inscriptions: bool, + ) -> Result { + for txin in &tx.input { + let output = txin.previous_output; + if output.is_null() { + continue; + } + + // multi-level cache for UTXO set to get to the script pubkey + let txout = if let Some(txout) = utxo_cache.get(&txin.previous_output) { + txout.clone() + } else if let Some(value) = outpoint_to_txout.get(&txin.previous_output.store())? { + TxOut::load(value.value()) + } else { + txout_receiver.blocking_recv().map_err(|err| { + anyhow!( + "failed to get transaction for {}: {err}", + txin.previous_output.txid + ) + })? + }; + + // If we are indexing inscriptions, the InscriptionUpdater will remove these + if !index_inscriptions { + utxo_cache.remove(&output); + outpoint_to_txout.remove(&output.store())?; + } + + script_pubkey_to_outpoint.remove(&txout.script_pubkey.as_bytes(), output.store())?; + } + + for (vout, txout) in tx.output.iter().enumerate() { + let vout: u32 = vout.try_into().unwrap(); + script_pubkey_to_outpoint.insert( + txout.script_pubkey.as_bytes(), + OutPoint { txid: *txid, vout }.store(), + )?; + + utxo_cache.insert(OutPoint { txid: *txid, vout }, txout.clone()); + } + + Ok(()) + } + fn index_transaction_sats( &mut self, tx: &Transaction, @@ -696,7 +794,7 @@ impl<'index> Updater<'index> { Ok(()) } - fn commit(&mut self, wtx: WriteTransaction, value_cache: HashMap) -> Result { + fn commit(&mut self, wtx: WriteTransaction, utxo_cache: HashMap) -> Result { log::info!( "Committing at block height {}, {} outputs traversed, {} in map, {} cached", self.height, @@ -723,10 +821,12 @@ impl<'index> Updater<'index> { } { - let mut outpoint_to_value = wtx.open_table(OUTPOINT_TO_VALUE)?; + log::info!("Flushing utxo cache with {} entries", utxo_cache.len()); + + let mut outpoint_to_txout = wtx.open_table(OUTPOINT_TO_TXOUT)?; - for (outpoint, value) in value_cache { - outpoint_to_value.insert(&outpoint.store(), &value)?; + for (outpoint, txout) in utxo_cache { + outpoint_to_txout.insert(&outpoint.store(), txout.store())?; } } diff --git a/src/index/updater/inscription_updater.rs b/src/index/updater/inscription_updater.rs index c8ab5ebec5..8668052c24 100644 --- a/src/index/updater/inscription_updater.rs +++ b/src/index/updater/inscription_updater.rs @@ -42,7 +42,7 @@ pub(super) struct InscriptionUpdater<'a, 'tx> { pub(super) chain: Chain, pub(super) content_type_to_count: &'a mut Table<'tx, Option<&'static [u8]>, u64>, pub(super) cursed_inscription_count: u64, - pub(super) event_sender: Option<&'a Sender>, + pub(super) event_sender: Option<&'a mpsc::Sender>, pub(super) flotsam: Vec, pub(super) height: u32, pub(super) home_inscription_count: u64, @@ -52,7 +52,7 @@ pub(super) struct InscriptionUpdater<'a, 'tx> { pub(super) inscription_number_to_sequence_number: &'a mut Table<'tx, i32, u32>, pub(super) lost_sats: u64, pub(super) next_sequence_number: u32, - pub(super) outpoint_to_value: &'a mut Table<'tx, &'static OutPointValue, u64>, + pub(super) outpoint_to_txout: &'a mut Table<'tx, &'static OutPointValue, TxOutValue>, pub(super) reward: u64, pub(super) transaction_buffer: Vec, pub(super) transaction_id_to_transaction: &'a mut Table<'tx, &'static TxidValue, &'static [u8]>, @@ -63,8 +63,8 @@ pub(super) struct InscriptionUpdater<'a, 'tx> { pub(super) sequence_number_to_satpoint: &'a mut Table<'tx, u32, &'static SatPointValue>, pub(super) timestamp: u32, pub(super) unbound_inscriptions: u64, - pub(super) value_cache: &'a mut HashMap, - pub(super) value_receiver: &'a mut Receiver, + pub(super) utxo_cache: &'a mut HashMap, + pub(super) txout_receiver: &'a mut broadcast::Receiver, } impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { @@ -85,9 +85,9 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { let inscriptions = !envelopes.is_empty(); let mut envelopes = envelopes.into_iter().peekable(); - for (input_index, tx_in) in tx.input.iter().enumerate() { + for (input_index, txin) in tx.input.iter().enumerate() { // skip subsidy since no inscriptions possible - if tx_in.previous_output.is_null() { + if txin.previous_output.is_null() { total_input_value += Height(self.height).subsidy(); continue; } @@ -96,7 +96,7 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { for (old_satpoint, inscription_id) in Index::inscriptions_on_output( self.satpoint_to_sequence_number, self.sequence_number_to_entry, - tx_in.previous_output, + txin.previous_output, )? { let offset = total_input_value + old_satpoint.offset; floating_inscriptions.push(Flotsam { @@ -114,24 +114,23 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { let offset = total_input_value; // multi-level cache for UTXO set to get to the input amount - let current_input_value = if let Some(value) = self.value_cache.remove(&tx_in.previous_output) - { - value + let txout = if let Some(txout) = self.utxo_cache.remove(&txin.previous_output) { + txout } else if let Some(value) = self - .outpoint_to_value - .remove(&tx_in.previous_output.store())? + .outpoint_to_txout + .remove(&txin.previous_output.store())? { - value.value() + TxOut::load(value.value()) } else { - self.value_receiver.blocking_recv().ok_or_else(|| { + self.txout_receiver.blocking_recv().map_err(|err| { anyhow!( - "failed to get transaction for {}", - tx_in.previous_output.txid + "failed to get transaction for {}: {err}", + txin.previous_output.txid ) })? }; - total_input_value += current_input_value; + total_input_value += txout.value; // go through all inscriptions in this input while let Some(inscription) = envelopes.peek() { @@ -216,7 +215,7 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { parents: inscription.payload.parents(), pointer: inscription.payload.pointer(), reinscription: inscribed_offsets.contains_key(&offset), - unbound: current_input_value == 0 + unbound: txout.value == 0 || curse == Some(Curse::UnrecognizedEvenField) || inscription.payload.unrecognized_even_field, vindicated: curse.is_some() && jubilant, @@ -291,8 +290,8 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { let mut range_to_vout = BTreeMap::new(); let mut new_locations = Vec::new(); let mut output_value = 0; - for (vout, tx_out) in tx.output.iter().enumerate() { - let end = output_value + tx_out.value; + for (vout, txout) in tx.output.iter().enumerate() { + let end = output_value + txout.value; while let Some(flotsam) = inscriptions.peek() { if flotsam.offset >= end { @@ -307,23 +306,27 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { offset: flotsam.offset - output_value, }; - new_locations.push((new_satpoint, inscriptions.next().unwrap())); + new_locations.push(( + new_satpoint, + inscriptions.next().unwrap(), + txout.script_pubkey.is_op_return(), + )); } range_to_vout.insert((output_value, end), vout.try_into().unwrap()); output_value = end; - self.value_cache.insert( + self.utxo_cache.insert( OutPoint { vout: vout.try_into().unwrap(), txid, }, - tx_out.value, + txout.clone(), ); } - for (new_satpoint, mut flotsam) in new_locations.into_iter() { + for (new_satpoint, mut flotsam, op_return) in new_locations.into_iter() { let new_satpoint = match flotsam.origin { Origin::New { pointer: Some(pointer), @@ -345,7 +348,7 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { _ => new_satpoint, }; - self.update_inscription_location(input_sat_ranges, flotsam, new_satpoint)?; + self.update_inscription_location(input_sat_ranges, flotsam, new_satpoint, op_return)?; } if is_coinbase { @@ -354,7 +357,7 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { outpoint: OutPoint::null(), offset: self.lost_sats + flotsam.offset - output_value, }; - self.update_inscription_location(input_sat_ranges, flotsam, new_satpoint)?; + self.update_inscription_location(input_sat_ranges, flotsam, new_satpoint, false)?; } self.lost_sats += self.reward - output_value; Ok(()) @@ -392,6 +395,7 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { input_sat_ranges: Option<&VecDeque<(u64, u64)>>, flotsam: Flotsam, new_satpoint: SatPoint, + op_return: bool, ) -> Result { let inscription_id = flotsam.inscription_id; let (unbound, sequence_number) = match flotsam.origin { @@ -406,6 +410,24 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { .unwrap() .value(); + if op_return { + let entry = InscriptionEntry::load( + self + .sequence_number_to_entry + .get(&sequence_number)? + .unwrap() + .value(), + ); + + let mut charms = entry.charms; + Charm::Burned.set(&mut charms); + + self.sequence_number_to_entry.insert( + sequence_number, + &InscriptionEntry { charms, ..entry }.store(), + )?; + } + if let Some(sender) = self.event_sender { sender.blocking_send(Event::InscriptionTransferred { block_height: self.height, @@ -465,6 +487,10 @@ impl<'a, 'tx> InscriptionUpdater<'a, 'tx> { charms |= sat.charms(); } + if op_return { + Charm::Burned.set(&mut charms); + } + if new_satpoint.outpoint == OutPoint::null() { Charm::Lost.set(&mut charms); } diff --git a/src/index/updater/rune_updater.rs b/src/index/updater/rune_updater.rs index cce4ae552c..6eef345a8a 100644 --- a/src/index/updater/rune_updater.rs +++ b/src/index/updater/rune_updater.rs @@ -4,7 +4,7 @@ pub(super) struct RuneUpdater<'a, 'tx, 'client> { pub(super) block_time: u32, pub(super) burned: HashMap, pub(super) client: &'client Client, - pub(super) event_sender: Option<&'a Sender>, + pub(super) event_sender: Option<&'a mpsc::Sender>, pub(super) height: u32, pub(super) id_to_entry: &'a mut Table<'tx, RuneIdValue, RuneEntryValue>, pub(super) inscription_id_to_sequence_number: &'a Table<'tx, InscriptionIdValue, u32>, diff --git a/src/inscriptions/inscription.rs b/src/inscriptions/inscription.rs index 81b1032d30..24e9914d74 100644 --- a/src/inscriptions/inscription.rs +++ b/src/inscriptions/inscription.rs @@ -106,7 +106,7 @@ impl Inscription { }) } - pub(crate) fn pointer_value(pointer: u64) -> Vec { + pub fn pointer_value(pointer: u64) -> Vec { let mut bytes = pointer.to_le_bytes().to_vec(); while bytes.last().copied() == Some(0) { @@ -202,7 +202,7 @@ impl Inscription { Some(InscriptionId { txid, index }) } - pub(crate) fn media(&self) -> Media { + pub fn media(&self) -> Media { if self.body.is_none() { return Media::Unknown; } @@ -214,19 +214,19 @@ impl Inscription { content_type.parse().unwrap_or(Media::Unknown) } - pub(crate) fn body(&self) -> Option<&[u8]> { + pub fn body(&self) -> Option<&[u8]> { Some(self.body.as_ref()?) } - pub(crate) fn into_body(self) -> Option> { + pub fn into_body(self) -> Option> { self.body } - pub(crate) fn content_length(&self) -> Option { + pub fn content_length(&self) -> Option { Some(self.body()?.len()) } - pub(crate) fn content_type(&self) -> Option<&str> { + pub fn content_type(&self) -> Option<&str> { str::from_utf8(self.content_type.as_ref()?).ok() } @@ -240,19 +240,19 @@ impl Inscription { HeaderValue::from_str(str::from_utf8(self.content_encoding.as_ref()?).unwrap_or_default()).ok() } - pub(crate) fn delegate(&self) -> Option { + pub fn delegate(&self) -> Option { Self::inscription_id_field(self.delegate.as_deref()) } - pub(crate) fn metadata(&self) -> Option { + pub fn metadata(&self) -> Option { ciborium::from_reader(Cursor::new(self.metadata.as_ref()?)).ok() } - pub(crate) fn metaprotocol(&self) -> Option<&str> { + pub fn metaprotocol(&self) -> Option<&str> { str::from_utf8(self.metaprotocol.as_ref()?).ok() } - pub(crate) fn parents(&self) -> Vec { + pub fn parents(&self) -> Vec { self .parents .iter() @@ -260,7 +260,7 @@ impl Inscription { .collect() } - pub(crate) fn pointer(&self) -> Option { + pub fn pointer(&self) -> Option { let value = self.pointer.as_ref()?; if value.iter().skip(8).copied().any(|byte| byte != 0) { @@ -295,7 +295,7 @@ impl Inscription { witness } - pub(crate) fn hidden(&self) -> bool { + pub fn hidden(&self) -> bool { use regex::bytes::Regex; const BVM_NETWORK: &[u8] = b"\ diff --git a/src/inscriptions/media.rs b/src/inscriptions/media.rs index d5ef8e8f1a..cdccbf99ab 100644 --- a/src/inscriptions/media.rs +++ b/src/inscriptions/media.rs @@ -9,7 +9,7 @@ use { }; #[derive(Debug, PartialEq, Copy, Clone)] -pub(crate) enum Media { +pub enum Media { Audio, Code(Language), Font, @@ -24,7 +24,7 @@ pub(crate) enum Media { } #[derive(Debug, PartialEq, Copy, Clone)] -pub(crate) enum Language { +pub enum Language { Css, JavaScript, Json, @@ -49,7 +49,7 @@ impl Display for Language { } #[derive(Debug, PartialEq, Copy, Clone)] -pub(crate) enum ImageRendering { +pub enum ImageRendering { Auto, Pixelated, } diff --git a/src/lib.rs b/src/lib.rs index 2fb5899463..1d98790177 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,6 +47,7 @@ use { chrono::{DateTime, TimeZone, Utc}, ciborium::Value, clap::{ArgGroup, Parser}, + error::{ResultExt, SnafuError}, html_escaper::{Escape, Trusted}, http::HeaderMap, lazy_static::lazy_static, @@ -58,10 +59,13 @@ use { reqwest::Url, serde::{Deserialize, Deserializer, Serialize}, serde_with::{DeserializeFromStr, SerializeDisplay}, + snafu::{Backtrace, ErrorCompat, Snafu}, std::{ + backtrace::BacktraceStatus, cmp::{self, Reverse}, collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque}, env, + ffi::OsString, fmt::{self, Display, Formatter}, fs, io::{self, Cursor, Read}, @@ -104,6 +108,7 @@ mod blocktime; pub mod chain; pub mod decimal; mod deserialize_from_str; +mod error; mod fee_rate; pub mod index; mod inscriptions; @@ -115,7 +120,7 @@ pub mod outgoing; mod re; mod representation; pub mod runes; -mod settings; +pub mod settings; pub mod subcommand; mod tally; pub mod templates; @@ -126,6 +131,7 @@ mod ordzaar; // ---- Ordzaar ---- type Result = std::result::Result; +type SnafuResult = std::result::Result; const TARGET_POSTAGE: Amount = Amount::from_sat(10_000); @@ -224,10 +230,17 @@ pub fn parse_ord_server_args(args: &str) -> (Settings, subcommand::server::Serve } } -fn gracefully_shutdown_indexer() { +pub fn cancel_shutdown() { + SHUTTING_DOWN.store(false, atomic::Ordering::Relaxed); +} + +pub fn shut_down() { + SHUTTING_DOWN.store(true, atomic::Ordering::Relaxed); +} + +fn gracefully_shut_down_indexer() { if let Some(indexer) = INDEXER.lock().unwrap().take() { - // We explicitly set this to true to notify the thread to not take on new work - SHUTTING_DOWN.store(true, atomic::Ordering::Relaxed); + shut_down(); log::info!("Waiting for index thread to finish..."); if indexer.join().is_err() { log::warn!("Index thread panicked; join failed"); @@ -250,7 +263,7 @@ pub fn main() { .iter() .for_each(|handle| handle.graceful_shutdown(Some(Duration::from_millis(100)))); - gracefully_shutdown_indexer(); + gracefully_shut_down_indexer(); }) .expect("Error setting handler"); @@ -261,18 +274,42 @@ pub fn main() { match args.run() { Err(err) => { eprintln!("error: {err}"); - err - .chain() - .skip(1) - .for_each(|cause| eprintln!("because: {cause}")); - if env::var_os("RUST_BACKTRACE") - .map(|val| val == "1") - .unwrap_or_default() - { - eprintln!("{}", err.backtrace()); + + if let SnafuError::Anyhow { err } = err { + for (i, err) in err.chain().skip(1).enumerate() { + if i == 0 { + eprintln!(); + eprintln!("because:"); + } + + eprintln!("- {err}"); + } + + if env::var_os("RUST_BACKTRACE") + .map(|val| val == "1") + .unwrap_or_default() + { + eprintln!("{}", err.backtrace()); + } + } else { + for (i, err) in err.iter_chain().skip(1).enumerate() { + if i == 0 { + eprintln!(); + eprintln!("because:"); + } + + eprintln!("- {err}"); + } + + if let Some(backtrace) = err.backtrace() { + if backtrace.status() == BacktraceStatus::Captured { + eprintln!("backtrace:"); + eprintln!("{backtrace}"); + } + } } - gracefully_shutdown_indexer(); + gracefully_shut_down_indexer(); process::exit(1); } @@ -280,7 +317,7 @@ pub fn main() { if let Some(output) = output { output.print(format.unwrap_or_default()); } - gracefully_shutdown_indexer(); + gracefully_shut_down_indexer(); } } } diff --git a/src/options.rs b/src/options.rs index 6c3c7f2826..051712a364 100644 --- a/src/options.rs +++ b/src/options.rs @@ -47,6 +47,8 @@ pub struct Options { pub(crate) height_limit: Option, #[arg(long, help = "Use index at .")] pub(crate) index: Option, + #[arg(long, help = "Track unspent output addresses.")] + pub(crate) index_addresses: bool, #[arg( long, help = "Set index cache size to bytes. [default: 1/4 available RAM]" diff --git a/src/re.rs b/src/re.rs index b8ece332e6..7a82fac15d 100644 --- a/src/re.rs +++ b/src/re.rs @@ -5,6 +5,9 @@ fn re(s: &'static str) -> Regex { } lazy_static! { + pub(crate) static ref ADDRESS: Regex = re( + r"((bc1|tb1|bcrt1)[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39,60}|[123][a-km-zA-HJ-NP-Z1-9]{25,34})" + ); pub(crate) static ref HASH: Regex = re(r"[[:xdigit:]]{64}"); pub(crate) static ref INSCRIPTION_ID: Regex = re(r"[[:xdigit:]]{64}i\d+"); pub(crate) static ref INSCRIPTION_NUMBER: Regex = re(r"-?[0-9]+"); diff --git a/src/settings.rs b/src/settings.rs index 295827200a..2c1f60db9b 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -17,7 +17,9 @@ pub struct Settings { first_inscription_height: Option, height_limit: Option, hidden: Option>, + http_port: Option, index: Option, + index_addresses: bool, index_cache_size: Option, index_runes: bool, index_sats: bool, @@ -31,7 +33,7 @@ pub struct Settings { } impl Settings { - pub(crate) fn load(options: Options) -> Result { + pub fn load(options: Options) -> Result { let mut env = BTreeMap::::new(); for (var, value) in env::vars_os() { @@ -57,7 +59,7 @@ impl Settings { Self::merge(options, env) } - pub(crate) fn merge(options: Options, env: BTreeMap) -> Result { + pub fn merge(options: Options, env: BTreeMap) -> Result { let settings = Settings::from_options(options).or(Settings::from_env(env)?); let config_path = if let Some(path) = &settings.config { @@ -106,7 +108,7 @@ impl Settings { Ok(settings) } - pub(crate) fn or(self, source: Settings) -> Self { + pub fn or(self, source: Settings) -> Self { Self { bitcoin_data_dir: self.bitcoin_data_dir.or(source.bitcoin_data_dir), bitcoin_rpc_limit: self.bitcoin_rpc_limit.or(source.bitcoin_rpc_limit), @@ -132,7 +134,9 @@ impl Settings { .cloned() .collect(), ), + http_port: self.http_port.or(source.http_port), index: self.index.or(source.index), + index_addresses: self.index_addresses || source.index_addresses, index_cache_size: self.index_cache_size.or(source.index_cache_size), index_runes: self.index_runes || source.index_runes, index_sats: self.index_sats || source.index_sats, @@ -146,7 +150,7 @@ impl Settings { } } - pub(crate) fn from_options(options: Options) -> Self { + pub fn from_options(options: Options) -> Self { Self { bitcoin_data_dir: options.bitcoin_data_dir, bitcoin_rpc_limit: options.bitcoin_rpc_limit, @@ -167,7 +171,9 @@ impl Settings { first_inscription_height: options.first_inscription_height, height_limit: options.height_limit, hidden: None, + http_port: None, index: options.index, + index_addresses: options.index_addresses, index_cache_size: options.index_cache_size, index_runes: options.index_runes, index_sats: options.index_sats, @@ -181,7 +187,7 @@ impl Settings { } } - pub(crate) fn from_env(env: BTreeMap) -> Result { + pub fn from_env(env: BTreeMap) -> Result { let get_bool = |key| { env .get(key) @@ -216,6 +222,14 @@ impl Settings { }) }; + let get_u16 = |key| { + env + .get(key) + .map(|int| int.parse::()) + .transpose() + .with_context(|| format!("failed to parse environment variable ORD_{key} as u16")) + }; + let get_u32 = |key| { env .get(key) @@ -223,6 +237,7 @@ impl Settings { .transpose() .with_context(|| format!("failed to parse environment variable ORD_{key} as u32")) }; + let get_usize = |key| { env .get(key) @@ -246,7 +261,9 @@ impl Settings { first_inscription_height: get_u32("FIRST_INSCRIPTION_HEIGHT")?, height_limit: get_u32("HEIGHT_LIMIT")?, hidden: inscriptions("HIDDEN")?, + http_port: get_u16("HTTP_PORT")?, index: get_path("INDEX"), + index_addresses: get_bool("INDEX_ADDRESSES"), index_cache_size: get_usize("INDEX_CACHE_SIZE")?, index_runes: get_bool("INDEX_RUNES"), index_sats: get_bool("INDEX_SATS"), @@ -260,7 +277,7 @@ impl Settings { }) } - pub(crate) fn for_env(dir: &Path, rpc_url: &str, server_url: &str) -> Self { + pub fn for_env(dir: &Path, rpc_url: &str, server_url: &str) -> Self { Self { bitcoin_data_dir: Some(dir.into()), bitcoin_rpc_password: None, @@ -276,7 +293,9 @@ impl Settings { first_inscription_height: None, height_limit: None, hidden: None, + http_port: None, index: None, + index_addresses: true, index_cache_size: None, index_runes: true, index_sats: true, @@ -290,7 +309,7 @@ impl Settings { } } - pub(crate) fn or_defaults(self) -> Result { + pub fn or_defaults(self) -> Result { let chain = self.chain.unwrap_or_default(); let bitcoin_data_dir = match &self.bitcoin_data_dir { @@ -349,7 +368,9 @@ impl Settings { }), height_limit: self.height_limit, hidden: self.hidden, + http_port: self.http_port, index: Some(index), + index_addresses: self.index_addresses, index_cache_size: Some(match self.index_cache_size { Some(index_cache_size) => index_cache_size, None => { @@ -370,7 +391,7 @@ impl Settings { }) } - pub(crate) fn default_data_dir() -> Result { + pub fn default_data_dir() -> Result { Ok( dirs::data_dir() .context("could not get data dir")? @@ -378,7 +399,7 @@ impl Settings { ) } - pub(crate) fn bitcoin_credentials(&self) -> Result { + pub fn bitcoin_credentials(&self) -> Result { if let Some((user, pass)) = &self .bitcoin_rpc_username .as_ref() @@ -390,7 +411,7 @@ impl Settings { } } - pub(crate) fn bitcoin_rpc_client(&self, wallet: Option) -> Result { + pub fn bitcoin_rpc_client(&self, wallet: Option) -> Result { let rpc_url = self.bitcoin_rpc_url(wallet); let bitcoin_credentials = self.bitcoin_credentials()?; @@ -451,15 +472,15 @@ impl Settings { Ok(client) } - pub(crate) fn chain(&self) -> Chain { + pub fn chain(&self) -> Chain { self.chain.unwrap() } - pub(crate) fn commit_interval(&self) -> usize { + pub fn commit_interval(&self) -> usize { self.commit_interval.unwrap() } - pub(crate) fn cookie_file(&self) -> Result { + pub fn cookie_file(&self) -> Result { if let Some(cookie_file) = &self.cookie_file { return Ok(cookie_file.clone()); } @@ -481,22 +502,22 @@ impl Settings { Ok(path.join(".cookie")) } - pub(crate) fn credentials(&self) -> Option<(&str, &str)> { + pub fn credentials(&self) -> Option<(&str, &str)> { self .server_username .as_deref() .zip(self.server_password.as_deref()) } - pub(crate) fn data_dir(&self) -> PathBuf { + pub fn data_dir(&self) -> PathBuf { self.data_dir.as_ref().unwrap().into() } - pub(crate) fn first_inscription_height(&self) -> u32 { + pub fn first_inscription_height(&self) -> u32 { self.first_inscription_height.unwrap() } - pub(crate) fn first_rune_height(&self) -> u32 { + pub fn first_rune_height(&self) -> u32 { if self.integration_test { 0 } else { @@ -504,43 +525,47 @@ impl Settings { } } - pub(crate) fn height_limit(&self) -> Option { + pub fn height_limit(&self) -> Option { self.height_limit } - pub(crate) fn index(&self) -> &Path { + pub fn index(&self) -> &Path { self.index.as_ref().unwrap() } - pub(crate) fn index_inscriptions(&self) -> bool { + pub fn index_addresses(&self) -> bool { + self.index_addresses + } + + pub fn index_inscriptions(&self) -> bool { !self.no_index_inscriptions } - pub(crate) fn index_runes(&self) -> bool { + pub fn index_runes(&self) -> bool { self.index_runes } - pub(crate) fn index_cache_size(&self) -> usize { + pub fn index_cache_size(&self) -> usize { self.index_cache_size.unwrap() } - pub(crate) fn index_sats(&self) -> bool { + pub fn index_sats(&self) -> bool { self.index_sats } - pub(crate) fn index_spent_sats(&self) -> bool { + pub fn index_spent_sats(&self) -> bool { self.index_spent_sats } - pub(crate) fn index_transactions(&self) -> bool { + pub fn index_transactions(&self) -> bool { self.index_transactions } - pub(crate) fn integration_test(&self) -> bool { + pub fn integration_test(&self) -> bool { self.integration_test } - pub(crate) fn is_hidden(&self, inscription_id: InscriptionId) -> bool { + pub fn is_hidden(&self, inscription_id: InscriptionId) -> bool { self .hidden .as_ref() @@ -548,7 +573,7 @@ impl Settings { .unwrap_or_default() } - pub(crate) fn bitcoin_rpc_url(&self, wallet_name: Option) -> String { + pub fn bitcoin_rpc_url(&self, wallet_name: Option) -> String { let base_url = self.bitcoin_rpc_url.as_ref().unwrap(); match wallet_name { Some(wallet_name) => format!("{base_url}/wallet/{wallet_name}"), @@ -556,11 +581,11 @@ impl Settings { } } - pub(crate) fn bitcoin_rpc_limit(&self) -> u32 { + pub fn bitcoin_rpc_limit(&self) -> u32 { self.bitcoin_rpc_limit.unwrap() } - pub(crate) fn server_url(&self) -> Option<&str> { + pub fn server_url(&self) -> Option<&str> { self.server_url.as_deref() } } @@ -1001,8 +1026,10 @@ mod tests { ("FIRST_INSCRIPTION_HEIGHT", "2"), ("HEIGHT_LIMIT", "3"), ("HIDDEN", "6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0 703e5f7c49d82aab99e605af306b9a30e991e57d42f982908a962a81ac439832i0"), + ("HTTP_PORT", "8080"), ("INDEX", "index"), ("INDEX_CACHE_SIZE", "4"), + ("INDEX_ADDRESSES", "1"), ("INDEX_RUNES", "1"), ("INDEX_SATS", "1"), ("INDEX_SPENT_SATS", "1"), @@ -1045,7 +1072,9 @@ mod tests { .into_iter() .collect() ), + http_port: Some(8080), index: Some("index".into()), + index_addresses: true, index_cache_size: Some(4), index_runes: true, index_sats: true, @@ -1079,6 +1108,7 @@ mod tests { "--datadir=/data/dir", "--first-inscription-height=2", "--height-limit=3", + "--index-addresses", "--index-cache-size=4", "--index-runes", "--index-sats", @@ -1107,7 +1137,9 @@ mod tests { first_inscription_height: Some(2), height_limit: Some(3), hidden: None, + http_port: None, index: Some("index".into()), + index_addresses: true, index_cache_size: Some(4), index_runes: true, index_sats: true, diff --git a/src/subcommand/env.rs b/src/subcommand/env.rs index 8f3478a0c5..1e38a8a576 100644 --- a/src/subcommand/env.rs +++ b/src/subcommand/env.rs @@ -4,12 +4,11 @@ struct KillOnDrop(process::Child); impl Drop for KillOnDrop { fn drop(&mut self) { - assert!(Command::new("kill") - .arg(self.0.id().to_string()) - .status() - .unwrap() - .success()); - self.0.wait().unwrap(); + let _ = Command::new("kill").arg(self.0.id().to_string()).status(); + + let _ = self.0.kill(); + + let _ = self.0.wait(); } } @@ -24,9 +23,9 @@ pub(crate) struct Env { pub(crate) decompress: bool, #[arg( long, - help = "Proxy `/content/INSCRIPTION_ID` requests to `/content/INSCRIPTION_ID` if the inscription is not present on current chain." + help = "Proxy `/content/INSCRIPTION_ID` and other recursive endpoints to `` if the inscription is not present on current chain." )] - pub(crate) content_proxy: Option, + pub(crate) proxy: Option, } #[derive(Serialize)] @@ -138,7 +137,7 @@ rpcport={bitcoind_port} let ord = std::env::current_exe()?; let decompress = self.decompress; - let content_proxy = self.content_proxy.map(|url| url.to_string()); + let proxy = self.proxy.map(|url| url.to_string()); let mut command = Command::new(&ord); let ord_server = command @@ -153,8 +152,8 @@ rpcport={bitcoind_port} ord_server.arg("--decompress"); } - if let Some(content_proxy) = content_proxy { - ord_server.arg("--content-proxy").arg(content_proxy); + if let Some(proxy) = proxy { + ord_server.arg("--proxy").arg(proxy); } let _ord = KillOnDrop(ord_server.spawn()?); diff --git a/src/subcommand/list.rs b/src/subcommand/list.rs index 290dcf4db1..3a522eb165 100644 --- a/src/subcommand/list.rs +++ b/src/subcommand/list.rs @@ -2,24 +2,31 @@ use super::*; #[derive(Debug, Parser)] pub(crate) struct List { - #[arg(help = "List sats in .")] + #[arg(help = "List information for .")] outpoint: OutPoint, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Output { - pub ranges: Option>, + pub address: Option>, + pub indexed: bool, + pub inscriptions: Vec, + pub runes: BTreeMap, + pub sat_ranges: Option>, + pub script_pubkey: String, pub spent: bool, + pub transaction: String, + pub value: u64, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Range { - pub end: u64, + pub start: u64, pub name: String, pub offset: u64, pub rarity: Rarity, + pub end: u64, pub size: u64, - pub start: u64, } impl List { @@ -37,13 +44,21 @@ impl List { "output not found" } - let ranges = index.list(self.outpoint)?; - - let spent = index.is_output_spent(self.outpoint)?; + let (list, _txout) = match index.get_output_info(self.outpoint)? { + Some((output, txout)) => (output, txout), + None => return Ok(None), + }; Ok(Some(Box::new(Output { - spent, - ranges: ranges.map(output_ranges), + address: list.address, + indexed: list.indexed, + inscriptions: list.inscriptions, + runes: list.runes, + sat_ranges: list.sat_ranges.map(output_ranges), + script_pubkey: list.script_pubkey, + spent: list.spent, + transaction: list.transaction, + value: list.value, }))) } } diff --git a/src/subcommand/server.rs b/src/subcommand/server.rs index 772feba523..898af91796 100644 --- a/src/subcommand/server.rs +++ b/src/subcommand/server.rs @@ -9,9 +9,9 @@ use { crate::ordzaar, // ---- Ordzaar ---- crate::templates::{ - BlockHtml, BlocksHtml, ChildrenHtml, ClockSvg, CollectionsHtml, HomeHtml, InputHtml, - InscriptionHtml, InscriptionsBlockHtml, InscriptionsHtml, OutputHtml, PageContent, PageHtml, - ParentsHtml, PreviewAudioHtml, PreviewCodeHtml, PreviewFontHtml, PreviewImageHtml, + AddressHtml, BlockHtml, BlocksHtml, ChildrenHtml, ClockSvg, CollectionsHtml, HomeHtml, + InputHtml, InscriptionHtml, InscriptionsBlockHtml, InscriptionsHtml, OutputHtml, PageContent, + PageHtml, ParentsHtml, PreviewAudioHtml, PreviewCodeHtml, PreviewFontHtml, PreviewImageHtml, PreviewMarkdownHtml, PreviewModelHtml, PreviewPdfHtml, PreviewTextHtml, PreviewUnknownHtml, PreviewVideoHtml, RangeHtml, RareTxt, RuneHtml, RunesHtml, SatHtml, TransactionHtml, }, @@ -65,23 +65,6 @@ struct Search { #[folder = "static"] struct StaticAssets; -struct StaticHtml { - title: &'static str, - html: &'static str, -} - -impl PageContent for StaticHtml { - fn title(&self) -> String { - self.title.into() - } -} - -impl Display for StaticHtml { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - f.write_str(self.html) - } -} - #[derive(Debug, Parser, Clone)] pub struct Server { #[arg( @@ -131,9 +114,9 @@ pub struct Server { pub(crate) no_sync: bool, #[arg( long, - help = "Proxy `/content/INSCRIPTION_ID` requests to `/content/INSCRIPTION_ID` if the inscription is not present on current chain." + help = "Proxy `/content/INSCRIPTION_ID` and other recursive endpoints to `` if the inscription is not present on current chain." )] - pub(crate) content_proxy: Option, + pub(crate) proxy: Option, #[arg( long, default_value = "5s", @@ -173,7 +156,7 @@ impl Server { let server_config = Arc::new(ServerConfig { chain: settings.chain(), - content_proxy: self.content_proxy.clone(), + proxy: self.proxy.clone(), csp_origin: self.csp_origin.clone(), decompress: self.decompress, domain: acme_domains.first().cloned(), @@ -183,6 +166,7 @@ impl Server { let router = Router::new() .route("/", get(Self::home)) + .route("/address/:address", get(Self::address)) .route("/block/:query", get(Self::block)) .route("/blockcount", get(Self::block_count)) .route("/blockhash", get(Self::block_hash)) @@ -205,6 +189,10 @@ impl Server { .route("/feed.xml", get(Self::feed)) .route("/input/:block/:transaction/:input", get(Self::input)) .route("/inscription/:inscription_query", get(Self::inscription)) + .route( + "/inscription/:inscription_query/:child", + get(Self::inscription_child), + ) .route("/inscriptions", get(Self::inscriptions)) .route("/inscriptions", post(Self::inscriptions_json)) .route("/inscriptions/:page", get(Self::inscriptions_paginated)) @@ -243,7 +231,20 @@ impl Server { "/r/children/:inscription_id/:page", get(Self::children_recursive_paginated), ) + .route( + "/r/children/:inscription_id/inscriptions", + get(Self::child_inscriptions_recursive), + ) + .route( + "/r/children/:inscription_id/inscriptions/:page", + get(Self::child_inscriptions_recursive_paginated), + ) .route("/r/metadata/:inscription_id", get(Self::metadata)) + .route("/r/parents/:inscription_id", get(Self::parents_recursive)) + .route( + "/r/parents/:inscription_id/:page", + get(Self::parents_recursive_paginated), + ) .route("/r/sat/:sat_number", get(Self::sat_inscriptions)) .route( "/r/sat/:sat_number/:page", @@ -265,6 +266,7 @@ impl Server { .route("/static/*path", get(Self::static_asset)) .route("/status", get(Self::status)) .route("/tx/:txid", get(Self::transaction)) + .route("/decode/:txid", get(Self::decode)) .route("/update", get(Self::update)) // ---- Ordzaar routes ---- // Deprecated: Ordzaar custom routes should use"ordzaar" prefix/path @@ -449,7 +451,7 @@ impl Server { "this server has no rune index".to_string(), )); } - let runes = index.get_rune_balances_for_outpoint(outpoint)?; + let runes = index.get_rune_balances_for_output(outpoint)?; let response: Vec = runes .into_iter() @@ -479,7 +481,7 @@ impl Server { "error parsing outpoint: {outpoint_str}" ))); } - let runes = index.get_rune_balances_for_outpoint(outpoint_result.unwrap())?; + let runes = index.get_rune_balances_for_output(outpoint_result.unwrap())?; let response: Vec = runes .into_iter() @@ -968,6 +970,49 @@ impl Server { Redirect::to("https://raw.githubusercontent.com/ordinals/ord/master/install.sh") } + async fn address( + Extension(server_config): Extension>, + Extension(index): Extension>, + Path(address): Path>, + AcceptJson(accept_json): AcceptJson, + ) -> ServerResult { + task::block_in_place(|| { + if !index.has_address_index() { + return Err(ServerError::NotFound( + "this server has no address index".to_string(), + )); + } + + let address = address + .require_network(server_config.chain.network()) + .map_err(|err| ServerError::BadRequest(err.to_string()))?; + + let mut outputs = index.get_address_info(&address)?; + + outputs.sort(); + + let sat_balance = index.get_sat_balances_for_outputs(&outputs)?; + + let inscriptions = index.get_inscriptions_for_outputs(&outputs)?; + + let runes_balances = index.get_aggregated_rune_balances_for_outputs(&outputs)?; + + Ok(if accept_json { + Json(outputs).into_response() + } else { + AddressHtml { + address, + outputs, + inscriptions, + sat_balance, + runes_balances, + } + .page(server_config) + .into_response() + }) + }) + } + async fn block( Extension(server_config): Extension>, Extension(index): Extension>, @@ -1060,6 +1105,31 @@ impl Server { }) } + async fn decode( + Extension(index): Extension>, + Path(txid): Path, + AcceptJson(accept_json): AcceptJson, + ) -> ServerResult { + task::block_in_place(|| { + let transaction = index + .get_transaction(txid)? + .ok_or_not_found(|| format!("transaction {txid}"))?; + + let inscriptions = ParsedEnvelope::from_transaction(&transaction); + let runestone = Runestone::decipher(&transaction); + + Ok(if accept_json { + Json(api::Decode { + inscriptions, + runestone, + }) + .into_response() + } else { + StatusCode::NOT_FOUND.into_response() + }) + }) + } + async fn update( Extension(settings): Extension>, Extension(index): Extension>, @@ -1076,27 +1146,45 @@ impl Server { async fn metadata( Extension(index): Extension>, + Extension(server_config): Extension>, Path(inscription_id): Path, - ) -> ServerResult> { + ) -> ServerResult { task::block_in_place(|| { - let metadata = index - .get_inscription_by_id(inscription_id)? - .ok_or_not_found(|| format!("inscription {inscription_id}"))? + let Some(inscription) = index.get_inscription_by_id(inscription_id)? else { + return if let Some(proxy) = server_config.proxy.as_ref() { + Self::proxy(proxy, &format!("r/metadata/{}", inscription_id)) + } else { + Err(ServerError::NotFound(format!( + "inscription {} not found", + inscription_id + ))) + }; + }; + + let metadata = inscription .metadata .ok_or_not_found(|| format!("inscription {inscription_id} metadata"))?; - Ok(Json(hex::encode(metadata))) + Ok(Json(hex::encode(metadata)).into_response()) }) } async fn inscription_recursive( Extension(index): Extension>, + Extension(server_config): Extension>, Path(inscription_id): Path, ) -> ServerResult { task::block_in_place(|| { - let inscription = index - .get_inscription_by_id(inscription_id)? - .ok_or_not_found(|| format!("inscription {inscription_id}"))?; + let Some(inscription) = index.get_inscription_by_id(inscription_id)? else { + return if let Some(proxy) = server_config.proxy.as_ref() { + Self::proxy(proxy, &format!("r/inscription/{}", inscription_id)) + } else { + Err(ServerError::NotFound(format!( + "inscription {} not found", + inscription_id + ))) + }; + }; let entry = index .get_inscription_entry(inscription_id) @@ -1130,6 +1218,7 @@ impl Server { charms: Charm::charms(entry.charms), content_type: inscription.content_type().map(|s| s.to_string()), content_length: inscription.content_length(), + delegate: inscription.delegate(), fee: entry.fee, height: entry.height, id: inscription_id, @@ -1201,6 +1290,8 @@ impl Server { let rune = index.get_rune_by_id(id)?.ok_or_not_found(|| "rune ID")?; Ok(Redirect::to(&format!("/rune/{rune}"))) + } else if re::ADDRESS.is_match(query) { + Ok(Redirect::to(&format!("/address/{query}"))) } else { Ok(Redirect::to(&format!("/sat/{query}"))) } @@ -1373,6 +1464,13 @@ impl Server { confirmations: info.confirmations, difficulty: info.difficulty, hash, + feerate_percentiles: [ + stats.fee_rate_percentiles.fr_10th.to_sat(), + stats.fee_rate_percentiles.fr_25th.to_sat(), + stats.fee_rate_percentiles.fr_50th.to_sat(), + stats.fee_rate_percentiles.fr_75th.to_sat(), + stats.fee_rate_percentiles.fr_90th.to_sat(), + ], height: info.height.try_into().unwrap(), max_fee: stats.max_fee.to_sat(), max_fee_rate: stats.max_fee_rate.to_sat(), @@ -1447,9 +1545,9 @@ impl Server { Redirect::to("https://docs.ordinals.com/bounty/") } - fn proxy_content(proxy: &Url, inscription_id: InscriptionId) -> ServerResult { + fn proxy(proxy: &Url, path: &String) -> ServerResult { let response = reqwest::blocking::Client::new() - .get(format!("{}content/{}", proxy, inscription_id)) + .get(format!("{}{}", proxy, path)) .send() .map_err(|err| anyhow!(err))?; @@ -1486,11 +1584,11 @@ impl Server { } let Some(mut inscription) = index.get_inscription_by_id(inscription_id)? else { - return if let Some(proxy) = server_config.content_proxy.as_ref() { - Self::proxy_content(proxy, inscription_id) + return if let Some(proxy) = server_config.proxy.as_ref() { + Self::proxy(proxy, &format!("content/{}", inscription_id)) } else { Err(ServerError::NotFound(format!( - "{} not found", + "inscription {} not found", inscription_id ))) }; @@ -1669,8 +1767,27 @@ impl Server { async fn inscription( Extension(server_config): Extension>, Extension(index): Extension>, + AcceptJson(accept_json): AcceptJson, Path(DeserializeFromStr(query)): Path>, + ) -> ServerResult { + Self::inscription_inner(server_config, &index, accept_json, query, None).await + } + + async fn inscription_child( + Extension(server_config): Extension>, + Extension(index): Extension>, AcceptJson(accept_json): AcceptJson, + Path((DeserializeFromStr(query), child)): Path<(DeserializeFromStr, usize)>, + ) -> ServerResult { + Self::inscription_inner(server_config, &index, accept_json, query, Some(child)).await + } + + async fn inscription_inner( + server_config: Arc, + index: &Index, + accept_json: bool, + query: query::Inscription, + child: Option, ) -> ServerResult { task::block_in_place(|| { if let query::Inscription::Sat(_) = query { @@ -1680,7 +1797,7 @@ impl Server { } let (info, txout, inscription) = index - .inscription_info(query)? + .inscription_info(query, child)? .ok_or_not_found(|| format!("inscription {query}"))?; Ok(if accept_json { @@ -1705,7 +1822,7 @@ impl Server { rune: info.rune, sat: info.sat, satpoint: info.satpoint, - timestamp: Utc.timestamp_opt(info.timestamp, 0).unwrap(), + timestamp: Utc.timestamp_opt(info.timestamp, 0).unwrap(), } .page(server_config) .into_response() @@ -1724,7 +1841,7 @@ impl Server { for inscription in inscriptions { let query = query::Inscription::Id(inscription); let (info, _, _) = index - .inscription_info(query)? + .inscription_info(query, None)? .ok_or_not_found(|| format!("inscription {query}"))?; response.push(info); @@ -1816,12 +1933,51 @@ impl Server { async fn children_recursive( Extension(index): Extension>, + Extension(server_config): Extension>, Path(inscription_id): Path, ) -> ServerResult { - Self::children_recursive_paginated(Extension(index), Path((inscription_id, 0))).await + Self::children_recursive_paginated( + Extension(index), + Extension(server_config), + Path((inscription_id, 0)), + ) + .await } async fn children_recursive_paginated( + Extension(index): Extension>, + Extension(server_config): Extension>, + Path((parent, page)): Path<(InscriptionId, usize)>, + ) -> ServerResult { + task::block_in_place(|| { + let Some(parent) = index.get_inscription_entry(parent)? else { + return if let Some(proxy) = server_config.proxy.as_ref() { + Self::proxy(proxy, &format!("r/children/{}/{}", parent, page)) + } else { + Err(ServerError::NotFound(format!( + "inscription {} not found", + parent + ))) + }; + }; + + let parent_sequence_number = parent.sequence_number; + + let (ids, more) = + index.get_children_by_sequence_number_paginated(parent_sequence_number, 100, page)?; + + Ok(Json(api::Children { ids, more, page }).into_response()) + }) + } + + async fn child_inscriptions_recursive( + Extension(index): Extension>, + Path(inscription_id): Path, + ) -> ServerResult { + Self::child_inscriptions_recursive_paginated(Extension(index), Path((inscription_id, 0))).await + } + + async fn child_inscriptions_recursive_paginated( Extension(index): Extension>, Path((parent, page)): Path<(InscriptionId, usize)>, ) -> ServerResult { @@ -1834,7 +1990,42 @@ impl Server { let (ids, more) = index.get_children_by_sequence_number_paginated(parent_sequence_number, 100, page)?; - Ok(Json(api::Children { ids, more, page }).into_response()) + let children = ids + .into_iter() + .map(|inscription_id| { + let entry = index + .get_inscription_entry(inscription_id) + .unwrap() + .unwrap(); + + let satpoint = index + .get_inscription_satpoint_by_id(inscription_id) + .ok() + .flatten() + .unwrap(); + + api::ChildInscriptionRecursive { + charms: Charm::charms(entry.charms), + fee: entry.fee, + height: entry.height, + id: inscription_id, + number: entry.inscription_number, + output: satpoint.outpoint, + sat: entry.sat, + satpoint, + timestamp: timestamp(entry.timestamp.into()).timestamp(), + } + }) + .collect(); + + Ok( + Json(api::ChildInscriptions { + children, + more, + page, + }) + .into_response(), + ) }) } @@ -1988,6 +2179,38 @@ impl Server { }) } + async fn parents_recursive( + Extension(index): Extension>, + Path(inscription_id): Path, + ) -> ServerResult { + Self::parents_recursive_paginated(Extension(index), Path((inscription_id, 0))).await + } + + async fn parents_recursive_paginated( + Extension(index): Extension>, + Path((inscription_id, page)): Path<(InscriptionId, usize)>, + ) -> ServerResult { + task::block_in_place(|| { + let child = index + .get_inscription_entry(inscription_id)? + .ok_or_not_found(|| format!("inscription {inscription_id}"))?; + + let (ids, more) = index.get_parents_by_sequence_number_paginated(child.parents, page)?; + + let page_index = + u32::try_from(page).map_err(|_| anyhow!("page index {} out of range", page))?; + + Ok( + Json(api::Inscriptions { + ids, + more, + page_index, + }) + .into_response(), + ) + }) + } + async fn sat_inscriptions( Extension(index): Extension>, Path(sat): Path, @@ -2354,7 +2577,12 @@ mod tests { regex: impl AsRef, ) { let response = self.get(path); - assert_eq!(response.status(), status); + assert_eq!( + response.status(), + status, + "response: {}", + response.text().unwrap() + ); assert_regex_match!(response.text().unwrap(), regex.as_ref()); } @@ -3028,6 +3256,8 @@ mod tests {
      no
      supply
      340282366920938463463374607431768211455\u{A0}%
      +
      mint progress
      +
      100%
      premine
      340282366920938463463374607431768211455\u{A0}%
      premine percentage
      @@ -3472,6 +3702,8 @@ mod tests {
      .*
      unrecoverably reorged
      false
      +
      address index
      +
      false
      rune index
      false
      sat index
      @@ -4704,7 +4936,7 @@ mod tests { server.assert_response_regex( format!("/inscription/{}", InscriptionId { txid, index: 0 }), StatusCode::OK, - r".*
      sat
      \s*
      5000000000
      \s*
      preview
      .*", + r".*
      sat
      \s*
      5000000000
      \s*
      sat name
      \s*
      nvtcsezkbth
      \s*
      preview
      .*", ); } @@ -5298,6 +5530,87 @@ next ); } + #[test] + fn inscription_child() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + server.mine_blocks(1); + + let parent_txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], + ..default() + }); + + server.mine_blocks(2); + + let parent_inscription_id = InscriptionId { + txid: parent_txid, + index: 0, + }; + + let child_txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[ + ( + 2, + 0, + 0, + Inscription { + content_type: Some("text/plain".into()), + body: Some("hello".into()), + parents: vec![parent_inscription_id.value()], + ..default() + } + .to_witness(), + ), + ( + 3, + 0, + 0, + Inscription { + content_type: Some("text/plain".into()), + body: Some("hello".into()), + parents: vec![parent_inscription_id.value()], + ..default() + } + .to_witness(), + ), + (2, 1, 0, Default::default()), + ], + ..default() + }); + + server.mine_blocks(1); + + let child0 = InscriptionId { + txid: child_txid, + index: 0, + }; + + server.assert_response_regex( + format!("/inscription/{parent_inscription_id}/0"), + StatusCode::OK, + format!( + ".*Inscription 1.* +.*
      id
      +.*
      {child0}
      .*" + ), + ); + + let child1 = InscriptionId { + txid: child_txid, + index: 1, + }; + + server.assert_response_regex( + format!("/inscription/{parent_inscription_id}/1"), + StatusCode::OK, + format!( + ".*Inscription -1.* +.*
      id
      +.*
      {child1}
      .*" + ), + ); + } + #[test] fn inscription_with_parent_page() { let server = TestServer::builder().chain(Chain::Regtest).build(); @@ -6116,21 +6429,187 @@ next } #[test] - fn inscriptions_in_block_page() { - let server = TestServer::builder() - .chain(Chain::Regtest) - .index_sats() - .build(); + fn parents_recursive_endpoint() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + server.mine_blocks(1); + + let mut parent_ids = Vec::new(); + let mut inputs = Vec::new(); + for i in 0..111 { + parent_ids.push(InscriptionId { + txid: server.core.broadcast_tx(TransactionTemplate { + inputs: &[(i + 1, 0, 0, inscription("text/plain", "hello").to_witness())], + ..default() + }), + index: 0, + }); + + inputs.push((i + 2, 1, 0, Witness::default())); - for _ in 0..101 { server.mine_blocks(1); } - for i in 0..101 { - server.core.broadcast_tx(TransactionTemplate { - inputs: &[(i + 1, 0, 0, inscription("text/foo", "hello").to_witness())], - ..default() - }); + inputs.insert( + 0, + ( + 112, + 0, + 0, + Inscription { + content_type: Some("text/plain".into()), + body: Some("hello".into()), + parents: parent_ids.iter().map(|id| id.value()).collect(), + ..default() + } + .to_witness(), + ), + ); + + let txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &inputs, + ..default() + }); + + server.mine_blocks(1); + + let inscription_id = InscriptionId { txid, index: 0 }; + + let first_parent_inscription_id = parent_ids[0]; + let hundredth_parent_inscription_id = parent_ids[99]; + let hundred_first_parent_inscription_id = parent_ids[100]; + let hundred_eleventh_parent_inscription_id = parent_ids[110]; + + let parents_json = server.get_json::(format!("/r/parents/{inscription_id}")); + + assert_eq!(parents_json.ids.len(), 100); + assert_eq!(parents_json.ids[0], first_parent_inscription_id); + assert_eq!(parents_json.ids[99], hundredth_parent_inscription_id); + assert!(parents_json.more); + assert_eq!(parents_json.page_index, 0); + + let parents_json = + server.get_json::(format!("/r/parents/{inscription_id}/1")); + + assert_eq!(parents_json.ids.len(), 11); + assert_eq!(parents_json.ids[0], hundred_first_parent_inscription_id); + assert_eq!(parents_json.ids[10], hundred_eleventh_parent_inscription_id); + assert!(!parents_json.more); + assert_eq!(parents_json.page_index, 1); + } + + #[test] + fn child_inscriptions_recursive_endpoint() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + server.mine_blocks(1); + + let parent_txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], + ..default() + }); + + let parent_inscription_id = InscriptionId { + txid: parent_txid, + index: 0, + }; + + server.assert_response( + format!("/r/children/{parent_inscription_id}/inscriptions"), + StatusCode::NOT_FOUND, + &format!("inscription {parent_inscription_id} not found"), + ); + + server.mine_blocks(1); + + let child_inscriptions_json = server.get_json::(format!( + "/r/children/{parent_inscription_id}/inscriptions" + )); + assert_eq!(child_inscriptions_json.children.len(), 0); + + let mut builder = script::Builder::new(); + for _ in 0..111 { + builder = Inscription { + content_type: Some("text/plain".into()), + body: Some("hello".into()), + parents: vec![parent_inscription_id.value()], + unrecognized_even_field: false, + ..default() + } + .append_reveal_script_to_builder(builder); + } + + let witness = Witness::from_slice(&[builder.into_bytes(), Vec::new()]); + + let txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(2, 0, 0, witness), (2, 1, 0, Default::default())], + ..default() + }); + + server.mine_blocks(1); + + let first_child_inscription_id = InscriptionId { txid, index: 0 }; + let hundredth_child_inscription_id = InscriptionId { txid, index: 99 }; + let hundred_first_child_inscription_id = InscriptionId { txid, index: 100 }; + let hundred_eleventh_child_inscription_id = InscriptionId { txid, index: 110 }; + + let child_inscriptions_json = server.get_json::(format!( + "/r/children/{parent_inscription_id}/inscriptions" + )); + + assert_eq!(child_inscriptions_json.children.len(), 100); + + assert_eq!( + child_inscriptions_json.children[0].id, + first_child_inscription_id + ); + assert_eq!(child_inscriptions_json.children[0].number, 1); // parent is #0, 1st child is #1 + + assert_eq!( + child_inscriptions_json.children[99].id, + hundredth_child_inscription_id + ); + assert_eq!(child_inscriptions_json.children[99].number, -99); // all but 1st child are cursed + + assert!(child_inscriptions_json.more); + assert_eq!(child_inscriptions_json.page, 0); + + let child_inscriptions_json = server.get_json::(format!( + "/r/children/{parent_inscription_id}/inscriptions/1" + )); + + assert_eq!(child_inscriptions_json.children.len(), 11); + + assert_eq!( + child_inscriptions_json.children[0].id, + hundred_first_child_inscription_id + ); + assert_eq!(child_inscriptions_json.children[0].number, -100); + + assert_eq!( + child_inscriptions_json.children[10].id, + hundred_eleventh_child_inscription_id + ); + assert_eq!(child_inscriptions_json.children[10].number, -110); + + assert!(!child_inscriptions_json.more); + assert_eq!(child_inscriptions_json.page, 1); + } + + #[test] + fn inscriptions_in_block_page() { + let server = TestServer::builder() + .chain(Chain::Regtest) + .index_sats() + .build(); + + for _ in 0..101 { + server.mine_blocks(1); + } + + for i in 0..101 { + server.core.broadcast_tx(TransactionTemplate { + inputs: &[(i + 1, 0, 0, inscription("text/foo", "hello").to_witness())], + ..default() + }); } server.mine_blocks(1); @@ -6236,10 +6715,17 @@ next server.assert_response(format!("/content/{id}"), StatusCode::OK, "foo"); server.assert_response(format!("/preview/{id}"), StatusCode::OK, "foo"); + + assert_eq!( + server + .get_json::(format!("/r/inscription/{id}")) + .delegate, + Some(delegate) + ); } #[test] - fn proxy() { + fn content_proxy() { let server = TestServer::builder().chain(Chain::Regtest).build(); server.mine_blocks(1); @@ -6263,7 +6749,7 @@ next let server_with_proxy = TestServer::builder() .chain(Chain::Regtest) - .server_option("--content-proxy", server.url.as_ref()) + .server_option("--proxy", server.url.as_ref()) .build(); server_with_proxy.mine_blocks(1); @@ -6272,6 +6758,226 @@ next server_with_proxy.assert_response(format!("/content/{id}"), StatusCode::OK, "foo"); } + #[test] + fn metadata_proxy() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + + server.mine_blocks(1); + + let mut metadata = Vec::new(); + ciborium::into_writer("bar", &mut metadata).unwrap(); + + let inscription = Inscription { + content_type: Some("text/html".into()), + body: Some("foo".into()), + metadata: Some(metadata.clone()), + ..default() + }; + + let txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, inscription.to_witness())], + ..default() + }); + + server.mine_blocks(1); + + let id = InscriptionId { txid, index: 0 }; + + server.assert_response( + format!("/r/metadata/{id}"), + StatusCode::OK, + &format!("\"{}\"", hex::encode(metadata.clone())), + ); + + let server_with_proxy = TestServer::builder() + .chain(Chain::Regtest) + .server_option("--proxy", server.url.as_ref()) + .build(); + + server_with_proxy.mine_blocks(1); + + server.assert_response( + format!("/r/metadata/{id}"), + StatusCode::OK, + &format!("\"{}\"", hex::encode(metadata.clone())), + ); + + server_with_proxy.assert_response( + format!("/r/metadata/{id}"), + StatusCode::OK, + &format!("\"{}\"", hex::encode(metadata.clone())), + ); + } + + #[test] + fn children_proxy() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + + server.mine_blocks(1); + + let parent_txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, inscription("text/plain", "hello").to_witness())], + ..default() + }); + + let parent_id = InscriptionId { + txid: parent_txid, + index: 0, + }; + + server.assert_response( + format!("/r/children/{parent_id}"), + StatusCode::NOT_FOUND, + &format!("inscription {parent_id} not found"), + ); + + server.mine_blocks(1); + + let children = server.get_json::(format!("/r/children/{parent_id}")); + + assert_eq!(children.ids.len(), 0); + + let mut builder = script::Builder::new(); + for _ in 0..11 { + builder = Inscription { + content_type: Some("text/plain".into()), + body: Some("hello".into()), + parents: vec![parent_id.value()], + unrecognized_even_field: false, + ..default() + } + .append_reveal_script_to_builder(builder); + } + + let witness = Witness::from_slice(&[builder.into_bytes(), Vec::new()]); + + let txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(2, 0, 0, witness), (2, 1, 0, Default::default())], + ..default() + }); + + server.mine_blocks(1); + + let first_child_id = InscriptionId { txid, index: 0 }; + + let children = server.get_json::(format!("/r/children/{parent_id}")); + + assert_eq!(children.ids.len(), 11); + assert_eq!(first_child_id, children.ids[0]); + + let server_with_proxy = TestServer::builder() + .chain(Chain::Regtest) + .server_option("--proxy", server.url.as_ref()) + .build(); + + server_with_proxy.mine_blocks(1); + + let children = server.get_json::(format!("/r/children/{parent_id}")); + + assert_eq!(children.ids.len(), 11); + assert_eq!(first_child_id, children.ids[0]); + + let children = server_with_proxy.get_json::(format!("/r/children/{parent_id}")); + + assert_eq!(children.ids.len(), 11); + assert_eq!(first_child_id, children.ids[0]); + } + + #[test] + fn inscription_proxy() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + + server.mine_blocks(1); + + let inscription = Inscription { + content_type: Some("text/html".into()), + body: Some("foo".into()), + ..default() + }; + + let txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, inscription.to_witness())], + ..default() + }); + + server.mine_blocks(1); + + let id = InscriptionId { txid, index: 0 }; + + pretty_assert_eq!( + server.get_json::(format!("/r/inscription/{id}")), + api::InscriptionRecursive { + charms: Vec::new(), + content_type: Some("text/html".into()), + content_length: Some(3), + delegate: None, + fee: 0, + height: 2, + id, + number: 0, + output: OutPoint { txid, vout: 0 }, + sat: None, + satpoint: SatPoint { + outpoint: OutPoint { txid, vout: 0 }, + offset: 0 + }, + timestamp: 2, + value: Some(50 * COIN_VALUE), + } + ); + + let server_with_proxy = TestServer::builder() + .chain(Chain::Regtest) + .server_option("--proxy", server.url.as_ref()) + .build(); + + server_with_proxy.mine_blocks(1); + + pretty_assert_eq!( + server.get_json::(format!("/r/inscription/{id}")), + api::InscriptionRecursive { + charms: Vec::new(), + content_type: Some("text/html".into()), + content_length: Some(3), + delegate: None, + fee: 0, + height: 2, + id, + number: 0, + output: OutPoint { txid, vout: 0 }, + sat: None, + satpoint: SatPoint { + outpoint: OutPoint { txid, vout: 0 }, + offset: 0 + }, + timestamp: 2, + value: Some(50 * COIN_VALUE), + } + ); + + assert_eq!( + server_with_proxy.get_json::(format!("/r/inscription/{id}")), + api::InscriptionRecursive { + charms: Vec::new(), + content_type: Some("text/html".into()), + content_length: Some(3), + delegate: None, + fee: 0, + height: 2, + id, + number: 0, + output: OutPoint { txid, vout: 0 }, + sat: None, + satpoint: SatPoint { + outpoint: OutPoint { txid, vout: 0 }, + offset: 0 + }, + timestamp: 2, + value: Some(50 * COIN_VALUE), + } + ); + } + #[test] fn block_info() { let server = TestServer::new(); @@ -6288,6 +6994,7 @@ next hash: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" .parse() .unwrap(), + feerate_percentiles: [0, 0, 0, 0, 0], height: 0, max_fee: 0, max_fee_rate: 0, @@ -6327,6 +7034,7 @@ next hash: "56d05060a0280d0712d113f25321158747310ece87ea9e299bde06cf385b8d85" .parse() .unwrap(), + feerate_percentiles: [0, 0, 0, 0, 0], height: 1, max_fee: 0, max_fee_rate: 0, @@ -6402,4 +7110,154 @@ next let server = TestServer::builder().build(); server.assert_response("/update", StatusCode::NOT_FOUND, ""); } + + #[test] + fn burned_charm() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + + server.mine_blocks(1); + + let inscription = Inscription { + content_type: Some("text/html".into()), + body: Some("foo".into()), + ..default() + }; + + let txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, inscription.to_witness())], + outputs: 0, + op_return_index: Some(0), + op_return_value: Some(50 * COIN_VALUE), + op_return: Some( + script::Builder::new() + .push_opcode(opcodes::all::OP_RETURN) + .into_script(), + ), + ..default() + }); + + server.mine_blocks(1); + + let id = InscriptionId { txid, index: 0 }; + + pretty_assert_eq!( + server.get_json::(format!("/r/inscription/{id}")), + api::InscriptionRecursive { + charms: vec![Charm::Burned], + content_type: Some("text/html".into()), + content_length: Some(3), + delegate: None, + fee: 0, + height: 2, + id, + number: 0, + output: OutPoint { txid, vout: 0 }, + sat: None, + satpoint: SatPoint { + outpoint: OutPoint { txid, vout: 0 }, + offset: 0 + }, + timestamp: 2, + value: Some(50 * COIN_VALUE), + } + ); + } + + #[test] + fn burned_charm_on_transfer() { + let server = TestServer::builder().chain(Chain::Regtest).build(); + + server.mine_blocks(1); + + let inscription = Inscription { + content_type: Some("text/html".into()), + body: Some("foo".into()), + ..default() + }; + + let create_txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, inscription.to_witness())], + outputs: 1, + ..default() + }); + + server.mine_blocks(1); + + let id = InscriptionId { + txid: create_txid, + index: 0, + }; + + pretty_assert_eq!( + server.get_json::(format!("/r/inscription/{id}")), + api::InscriptionRecursive { + charms: vec![], + content_type: Some("text/html".into()), + content_length: Some(3), + delegate: None, + fee: 0, + height: 2, + id, + number: 0, + output: OutPoint { + txid: create_txid, + vout: 0 + }, + sat: None, + satpoint: SatPoint { + outpoint: OutPoint { + txid: create_txid, + vout: 0 + }, + offset: 0 + }, + timestamp: 2, + value: Some(50 * COIN_VALUE), + } + ); + + let transfer_txid = server.core.broadcast_tx(TransactionTemplate { + inputs: &[(2, 1, 0, Default::default())], + fee: 0, + outputs: 0, + op_return_index: Some(0), + op_return_value: Some(50 * COIN_VALUE), + op_return: Some( + script::Builder::new() + .push_opcode(opcodes::all::OP_RETURN) + .into_script(), + ), + ..default() + }); + + server.mine_blocks(1); + + pretty_assert_eq!( + server.get_json::(format!("/r/inscription/{id}")), + api::InscriptionRecursive { + charms: vec![Charm::Burned], + content_type: Some("text/html".into()), + content_length: Some(3), + delegate: None, + fee: 0, + height: 2, + id, + number: 0, + output: OutPoint { + txid: transfer_txid, + vout: 0 + }, + sat: None, + satpoint: SatPoint { + outpoint: OutPoint { + txid: transfer_txid, + vout: 0 + }, + offset: 0 + }, + timestamp: 2, + value: Some(50 * COIN_VALUE), + } + ); + } } diff --git a/src/subcommand/server/server_config.rs b/src/subcommand/server/server_config.rs index 79f141ebdd..ffa9c02ca8 100644 --- a/src/subcommand/server/server_config.rs +++ b/src/subcommand/server/server_config.rs @@ -3,7 +3,7 @@ use {super::*, axum::http::HeaderName}; #[derive(Default)] pub(crate) struct ServerConfig { pub(crate) chain: Chain, - pub(crate) content_proxy: Option, + pub(crate) proxy: Option, pub(crate) csp_origin: Option, pub(crate) decompress: bool, pub(crate) domain: Option, diff --git a/src/subcommand/wallet.rs b/src/subcommand/wallet.rs index b555ee0f9c..fa135076d7 100644 --- a/src/subcommand/wallet.rs +++ b/src/subcommand/wallet.rs @@ -15,9 +15,11 @@ pub mod inscriptions; mod label; pub mod mint; pub mod outputs; +pub mod pending; pub mod receive; pub mod restore; pub mod resume; +pub mod runics; pub mod sats; pub mod send; mod shared_args; @@ -60,13 +62,17 @@ pub(crate) enum Subcommand { #[command(about = "Mint a rune")] Mint(mint::Mint), #[command(about = "List all unspent outputs in wallet")] - Outputs, + Outputs(outputs::Outputs), + #[command(about = "List pending etchings")] + Pending(pending::Pending), #[command(about = "Generate receive address")] Receive(receive::Receive), #[command(about = "Restore wallet")] Restore(restore::Restore), #[command(about = "Resume pending etchings")] Resume(resume::Resume), + #[command(about = "List unspent runic outputs in wallet")] + Runics, #[command(about = "List wallet satoshis")] Sats(sats::Sats), #[command(about = "Send sat or inscription")] @@ -107,9 +113,11 @@ impl WalletCommand { Subcommand::Inscriptions => inscriptions::run(wallet), Subcommand::Label => label::run(wallet), Subcommand::Mint(mint) => mint.run(wallet), - Subcommand::Outputs => outputs::run(wallet), + Subcommand::Outputs(outputs) => outputs.run(wallet), + Subcommand::Pending(pending) => pending.run(wallet), Subcommand::Receive(receive) => receive.run(wallet), Subcommand::Resume(resume) => resume.run(wallet), + Subcommand::Runics => runics::run(wallet), Subcommand::Sats(sats) => sats.run(wallet), Subcommand::Send(send) => send.run(wallet), Subcommand::Transactions(transactions) => transactions.run(wallet), diff --git a/src/subcommand/wallet/label.rs b/src/subcommand/wallet/label.rs index 646db83ec2..e1a633f1cc 100644 --- a/src/subcommand/wallet/label.rs +++ b/src/subcommand/wallet/label.rs @@ -23,7 +23,7 @@ struct Line { pub(crate) fn run(wallet: Wallet) -> SubcommandResult { let mut lines: Vec = Vec::new(); - let sat_ranges = wallet.get_output_sat_ranges()?; + let sat_ranges = wallet.get_wallet_sat_ranges()?; let mut inscriptions_by_output: BTreeMap>> = BTreeMap::new(); diff --git a/src/subcommand/wallet/mint.rs b/src/subcommand/wallet/mint.rs index 281bdf5fe6..9a5ce1a083 100644 --- a/src/subcommand/wallet/mint.rs +++ b/src/subcommand/wallet/mint.rs @@ -53,7 +53,7 @@ impl Mint { }; ensure!( - destination.script_pubkey().dust_value() < postage, + destination.script_pubkey().dust_value() <= postage, "postage below dust limit of {}sat", destination.script_pubkey().dust_value().to_sat() ); diff --git a/src/subcommand/wallet/outputs.rs b/src/subcommand/wallet/outputs.rs index a5aa925854..f313792c93 100644 --- a/src/subcommand/wallet/outputs.rs +++ b/src/subcommand/wallet/outputs.rs @@ -1,19 +1,39 @@ use super::*; +#[derive(Debug, Parser)] +pub(crate) struct Outputs { + #[arg(short, long, help = "Show list of sat in outputs.")] + ranges: bool, +} + #[derive(Serialize, Deserialize)] pub struct Output { pub output: OutPoint, pub amount: u64, + pub sat_ranges: Vec, } -pub(crate) fn run(wallet: Wallet) -> SubcommandResult { - let mut outputs = Vec::new(); - for (output, txout) in wallet.utxos() { - outputs.push(Output { - output: *output, - amount: txout.value, - }); - } +impl Outputs { + pub(crate) fn run(&self, wallet: Wallet) -> SubcommandResult { + let mut outputs = Vec::new(); + for (output, txout) in wallet.utxos() { + let sat_ranges = if wallet.has_sat_index() && self.ranges { + wallet + .get_output_sat_ranges(output)? + .into_iter() + .map(|(start, end)| format!("{start}-{end}")) + .collect() + } else { + Vec::new() + }; - Ok(Some(Box::new(outputs))) + outputs.push(Output { + output: *output, + amount: txout.value, + sat_ranges, + }); + } + + Ok(Some(Box::new(outputs))) + } } diff --git a/src/subcommand/wallet/pending.rs b/src/subcommand/wallet/pending.rs new file mode 100644 index 0000000000..5eeeaa7e88 --- /dev/null +++ b/src/subcommand/wallet/pending.rs @@ -0,0 +1,28 @@ +use super::*; + +#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] +pub struct PendingOutput { + pub commit: Txid, + pub rune: SpacedRune, +} +#[derive(Debug, Parser)] +pub(crate) struct Pending {} + +impl Pending { + pub(crate) fn run(self, wallet: Wallet) -> SubcommandResult { + let etchings = wallet + .pending_etchings()? + .into_iter() + .map(|(_, entry)| { + let spaced_rune = entry.output.rune.unwrap().rune; + + PendingOutput { + rune: spaced_rune, + commit: entry.commit.txid(), + } + }) + .collect::>(); + + Ok(Some(Box::new(etchings) as Box)) + } +} diff --git a/src/subcommand/wallet/resume.rs b/src/subcommand/wallet/resume.rs index 64c3fcff0b..8e95171e5c 100644 --- a/src/subcommand/wallet/resume.rs +++ b/src/subcommand/wallet/resume.rs @@ -8,6 +8,8 @@ pub struct ResumeOutput { pub(crate) struct Resume { #[arg(long, help = "Don't broadcast transactions.")] pub(crate) dry_run: bool, + #[arg(long, help = "Pending etching to resume.")] + pub(crate) rune: Option, } impl Resume { @@ -18,7 +20,22 @@ impl Resume { break; } - for (rune, entry) in wallet.pending_etchings()? { + let spaced_rune = self.rune; + + let pending_etchings = if let Some(spaced_rune) = spaced_rune { + let pending_etching = wallet.load_etching(spaced_rune.rune)?; + + ensure!( + pending_etching.is_some(), + "rune {spaced_rune} does not correspond to any pending etching." + ); + + vec![(spaced_rune.rune, pending_etching.unwrap())] + } else { + wallet.pending_etchings()? + }; + + for (rune, entry) in pending_etchings { if self.dry_run { etchings.push(batch::Output { reveal_broadcast: false, diff --git a/src/subcommand/wallet/runics.rs b/src/subcommand/wallet/runics.rs new file mode 100644 index 0000000000..12631e0e70 --- /dev/null +++ b/src/subcommand/wallet/runics.rs @@ -0,0 +1,44 @@ +use super::*; + +#[derive(Serialize, Deserialize)] +pub struct RunicUtxo { + pub output: OutPoint, + pub runes: BTreeMap, +} + +pub(crate) fn run(wallet: Wallet) -> SubcommandResult { + let unspent_outputs = wallet.utxos(); + let runic_utxos = wallet.get_runic_outputs()?; + + let runic_utxos = unspent_outputs + .iter() + .filter_map(|(output, _)| { + if runic_utxos.contains(output) { + let rune_balances = wallet.get_runes_balances_in_output(output).ok()?; + let mut runes = BTreeMap::new(); + + for (spaced_rune, pile) in rune_balances { + runes + .entry(spaced_rune) + .and_modify(|decimal: &mut Decimal| { + assert_eq!(decimal.scale, pile.divisibility); + decimal.value += pile.amount; + }) + .or_insert(Decimal { + value: pile.amount, + scale: pile.divisibility, + }); + } + + Some(RunicUtxo { + output: *output, + runes, + }) + } else { + None + } + }) + .collect::>(); + + Ok(Some(Box::new(runic_utxos))) +} diff --git a/src/subcommand/wallet/sats.rs b/src/subcommand/wallet/sats.rs index 7cdbe72c74..ba8634cb8a 100644 --- a/src/subcommand/wallet/sats.rs +++ b/src/subcommand/wallet/sats.rs @@ -4,9 +4,16 @@ use super::*; pub(crate) struct Sats { #[arg( long, + conflicts_with = "all", help = "Find satoshis listed in first column of tab-separated value file ." )] tsv: Option, + #[arg( + long, + conflicts_with = "tsv", + help = "Display list of all sat ranges in wallet." + )] + all: bool, } #[derive(Serialize, Deserialize)] @@ -23,6 +30,12 @@ pub struct OutputRare { pub rarity: Rarity, } +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct OutputAll { + pub output: OutPoint, + pub ranges: Vec, +} + impl Sats { pub(crate) fn run(&self, wallet: Wallet) -> SubcommandResult { ensure!( @@ -30,9 +43,22 @@ impl Sats { "sats requires index created with `--index-sats` flag" ); - let haystacks = wallet.get_output_sat_ranges()?; - - if let Some(path) = &self.tsv { + let haystacks = wallet.get_wallet_sat_ranges()?; + + if self.all { + Ok(Some(Box::new( + haystacks + .into_iter() + .map(|(outpoint, ranges)| OutputAll { + output: outpoint, + ranges: ranges + .into_iter() + .map(|range| format!("{}-{}", range.0, range.1)) + .collect::>(), + }) + .collect::>(), + ))) + } else if let Some(path) = &self.tsv { let tsv = fs::read_to_string(path) .with_context(|| format!("I/O error reading `{}`", path.display()))?; @@ -57,6 +83,7 @@ impl Sats { rarity, }); } + Ok(Some(Box::new(output))) } } diff --git a/src/templates.rs b/src/templates.rs index 57f0db5030..218975986a 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -2,6 +2,7 @@ use {super::*, boilerplate::Boilerplate}; pub(crate) use { crate::subcommand::server::ServerConfig, + address::AddressHtml, block::BlockHtml, children::ChildrenHtml, clock::ClockSvg, @@ -29,6 +30,7 @@ pub use { transaction::TransactionHtml, }; +pub mod address; pub mod block; pub mod blocks; mod children; diff --git a/src/templates/address.rs b/src/templates/address.rs new file mode 100644 index 0000000000..db4cd29003 --- /dev/null +++ b/src/templates/address.rs @@ -0,0 +1,93 @@ +use super::*; + +#[derive(Boilerplate)] +pub(crate) struct AddressHtml { + pub(crate) address: Address, + pub(crate) outputs: Vec, + pub(crate) inscriptions: Vec, + pub(crate) sat_balance: u64, + pub(crate) runes_balances: Vec<(SpacedRune, Decimal, Option)>, +} + +impl PageContent for AddressHtml { + fn title(&self) -> String { + format!("Address {}", self.address) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn setup() -> AddressHtml { + AddressHtml { + address: Address::from_str("bc1phuq0vkls6w926zdaem6x9n02z2gg7j2xfudgwddyey7uyquarlgsh40ev8") + .unwrap() + .require_network(Network::Bitcoin) + .unwrap(), + outputs: vec![outpoint(1), outpoint(2)], + inscriptions: vec![inscription_id(1)], + sat_balance: 99, + runes_balances: vec![ + ( + SpacedRune { + rune: Rune::from_str("TEEEEEEEEESTRUNE").unwrap(), + spacers: 0, + }, + Decimal { + scale: 0, + value: 20000, + }, + Some('R'), + ), + ( + SpacedRune { + rune: Rune::from_str("ANOTHERTEESTRUNE").unwrap(), + spacers: 0, + }, + Decimal { + scale: 0, + value: 10000, + }, + Some('F'), + ), + ], + } + } + + #[test] + fn test_address_rendering() { + let address_html = setup(); + let expected_pattern = + r#".*

      Address bc1phuq0vkls6w926zdaem6x9n02z2gg7j2xfudgwddyey7uyquarlgsh40ev8

      .*"#; + assert_regex_match!(address_html, expected_pattern); + } + + #[test] + fn test_sat_balance_rendering() { + let address_html = setup(); + let expected_pattern = r#".*
      sat balance
      \n\s*
      99
      .*"#; + assert_regex_match!(address_html, expected_pattern); + } + + #[test] + fn test_inscriptions_rendering() { + let address_html = setup(); + let expected_pattern = r#".*
      inscriptions
      \n\s*
      .*.*
      .*"#; + assert_regex_match!(address_html, expected_pattern); + } + + #[test] + fn test_runes_balances_rendering() { + let address_html = setup(); + let expected_pattern = r#".*
      runes balances
      \n\s*
      TEEEEEEEEESTRUNE: 20000R
      \n\s*
      ANOTHERTEESTRUNE: 10000F
      .*"#; + assert_regex_match!(address_html, expected_pattern); + } + + #[test] + fn test_outputs_rendering() { + let address_html = setup(); + let expected_pattern = r#".*
      outputs
      \n\s*
      \n\s*\n\s*
      .*"#; + assert_regex_match!(address_html, expected_pattern); + } +} diff --git a/src/templates/inscription.rs b/src/templates/inscription.rs index a81431d48c..fd43fbe412 100644 --- a/src/templates/inscription.rs +++ b/src/templates/inscription.rs @@ -94,7 +94,7 @@ mod tests { ..default() }, " -

      Inscription 1

      + .*

      Inscription 1

      @@ -103,7 +103,7 @@ mod tests {
      .*
      address
      -
      bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
      +
      bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
      value
      1
      .* @@ -133,6 +133,8 @@ mod tests { .*
      sat
      1
      +
      sat name
      +
      nvtdijuwxlo
      preview
      .*
      diff --git a/src/templates/output.rs b/src/templates/output.rs index b68e702733..37d96ab333 100644 --- a/src/templates/output.rs +++ b/src/templates/output.rs @@ -41,7 +41,7 @@ mod tests {
      value
      3
      script pubkey
      OP_DUP OP_HASH160 OP_PUSHBYTES_20 0{40} OP_EQUALVERIFY OP_CHECKSIG
      -
      address
      1111111111111111111114oLvT2
      +
      address
      1111111111111111111114oLvT2
      transaction
      1{64}
      spent
      false
      @@ -100,7 +100,7 @@ mod tests {
      value
      3
      script pubkey
      OP_DUP OP_HASH160 OP_PUSHBYTES_20 0{40} OP_EQUALVERIFY OP_CHECKSIG
      -
      address
      1111111111111111111114oLvT2
      +
      address
      1111111111111111111114oLvT2
      transaction
      1{64}
      spent
      true
      @@ -132,7 +132,7 @@ mod tests {
      value
      3
      script pubkey
      OP_DUP OP_HASH160 OP_PUSHBYTES_20 0{40} OP_EQUALVERIFY OP_CHECKSIG
      -
      address
      1111111111111111111114oLvT2
      +
      address
      1111111111111111111114oLvT2
      transaction
      1{64}
      spent
      false
      diff --git a/src/templates/rune.rs b/src/templates/rune.rs index c4333315fa..b85c477915 100644 --- a/src/templates/rune.rs +++ b/src/templates/rune.rs @@ -85,6 +85,8 @@ mod tests {
      supply
      100.123456889\u{A0}%
      +
      mint progress
      +
      99.01%
      premine
      0.123456789\u{A0}%
      premine percentage
      diff --git a/src/templates/status.rs b/src/templates/status.rs index 1ea12b0e1d..000f2274f1 100644 --- a/src/templates/status.rs +++ b/src/templates/status.rs @@ -2,6 +2,7 @@ use super::*; #[derive(Boilerplate, Debug, PartialEq, Serialize, Deserialize)] pub struct StatusHtml { + pub address_index: bool, pub blessed_inscriptions: u64, pub chain: Chain, pub content_type_counts: Vec<(Option>, u64)>, diff --git a/src/wallet.rs b/src/wallet.rs index cbca88c7fc..4507fd1299 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -72,7 +72,7 @@ pub(crate) struct Wallet { } impl Wallet { - pub(crate) fn get_output_sat_ranges(&self) -> Result)>> { + pub(crate) fn get_wallet_sat_ranges(&self) -> Result)>> { ensure!( self.has_sat_index, "ord index must be built with `--index-sats` to use `--sat`" @@ -90,6 +90,23 @@ impl Wallet { Ok(output_sat_ranges) } + pub(crate) fn get_output_sat_ranges(&self, output: &OutPoint) -> Result> { + ensure!( + self.has_sat_index, + "ord index must be built with `--index-sats` to see sat ranges" + ); + + if let Some(info) = self.output_info.get(output) { + if let Some(sat_ranges) = &info.sat_ranges { + Ok(sat_ranges.clone()) + } else { + bail!("output {output} in wallet but is spent according to ord server"); + } + } else { + bail!("output {output} not found in wallet"); + } + } + pub(crate) fn find_sat_in_outputs(&self, sat: Sat) -> Result { ensure!( self.has_sat_index, diff --git a/templates/address.html b/templates/address.html new file mode 100644 index 0000000000..bca79fbf78 --- /dev/null +++ b/templates/address.html @@ -0,0 +1,29 @@ +

      Address {{ self.address }}

      +
      +
      sat balance
      +
      {{ self.sat_balance }}
      +%% if !self.inscriptions.is_empty() { +
      inscriptions
      +
      +%% for inscription in &self.inscriptions { + {{Iframe::thumbnail(*inscription)}} +%% } +
      +%% } +
      runes balances
      +%% for (rune, decimal, symbol) in self.runes_balances.iter() { +%% if let Some(symbol) = symbol { +
      {{ rune }}: {{ decimal }}{{ symbol }}
      +%% } else { +
      {{ rune }}: {{ decimal }}
      +%% } +%% } +
      outputs
      +
      +
        +%% for output in self.outputs.iter() { +
      • {{ output }}
      • +%% } +
      +
      +
      diff --git a/templates/inscription.html b/templates/inscription.html index fd044035e2..11117e48c0 100644 --- a/templates/inscription.html +++ b/templates/inscription.html @@ -64,7 +64,7 @@

      Inscription {{ self.number }}

      %% if let Some(output) = &self.output { %% if let Ok(address) = self.chain.address_from_script(&output.script_pubkey ) {
      address
      -
      {{ address }}
      +
      {{ address }}
      %% }
      value
      {{ output.value }}
      @@ -72,6 +72,8 @@

      Inscription {{ self.number }}

      %% if let Some(sat) = self.sat {
      sat
      {{sat}}
      +
      sat name
      +
      {{ sat.name() }}
      %% } %% if let Some(metaprotocol) = self.inscription.metaprotocol() {
      metaprotocol
      diff --git a/templates/output.html b/templates/output.html index e5e6f55d60..e3e83e7c08 100644 --- a/templates/output.html +++ b/templates/output.html @@ -28,7 +28,7 @@

      Output {{self.outpoint}}

      value
      {{ self.output.value }}
      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 }}
      spent
      {{ self.spent }}
      diff --git a/templates/rune.html b/templates/rune.html index 98a9b1ac00..a45aecaff1 100644 --- a/templates/rune.html +++ b/templates/rune.html @@ -52,6 +52,8 @@

      {{ self.entry.spaced_rune }}

      %% }
      supply
      {{ self.entry.pile(self.entry.supply()) }}
      +
      mint progress
      +
      {{ Decimal { value: ((self.entry.supply() as f64 / self.entry.max_supply() as f64) * 10000.0) as u128, scale: 2 } }}%
      premine
      {{ self.entry.pile(self.entry.premine) }}
      premine percentage
      diff --git a/templates/status.html b/templates/status.html index f35cb5309b..426226a836 100644 --- a/templates/status.html +++ b/templates/status.html @@ -28,6 +28,8 @@

      Status

      {{ env!("CARGO_PKG_VERSION") }}
      unrecoverably reorged
      {{ self.unrecoverably_reorged }}
      +
      address index
      +
      {{ self.address_index }}
      rune index
      {{ self.rune_index }}
      sat index
      diff --git a/templates/transaction.html b/templates/transaction.html index d1e9cc29bf..1818cd939d 100644 --- a/templates/transaction.html +++ b/templates/transaction.html @@ -31,7 +31,7 @@

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

      value
      {{ output.value }}
      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/json_api.rs b/tests/json_api.rs index 2d2f6fc66d..08d987870f 100644 --- a/tests/json_api.rs +++ b/tests/json_api.rs @@ -1,4 +1,8 @@ -use {super::*, bitcoin::BlockHash}; +use { + super::*, + bitcoin::BlockHash, + ord::{Envelope, Inscription}, +}; #[test] fn get_sat_without_sat_index() { @@ -398,6 +402,7 @@ fn get_block() { height: 0, inscriptions: Vec::new(), runes: Vec::new(), + transactions: block_json.transactions.clone(), } ); } @@ -494,6 +499,7 @@ fn get_status() { pretty_assert_eq!( status_json, api::Status { + address_index: false, blessed_inscriptions: 1, chain: Chain::Regtest, content_type_counts: vec![(Some("text/plain;charset=utf-8".into()), 1)], @@ -711,3 +717,46 @@ fn get_runes_balances() { pretty_assert_eq!(runes_balance_json, rune_balances); } + +#[test] +fn get_decode_tx() { + let core = mockcore::builder().network(Network::Regtest).build(); + + let ord = TestServer::spawn_with_server_args(&core, &["--index-runes", "--regtest"], &[]); + + create_wallet(&core, &ord); + core.mine_blocks(3); + + let envelope = envelope(&[b"ord", &[1], b"text/plain;charset=utf-8", &[], b"bar"]); + + let txid = core.broadcast_tx(TransactionTemplate { + inputs: &[(1, 0, 0, envelope.clone())], + ..default() + }); + + let transaction = core.mine_blocks(1)[0].txdata[0].clone(); + + let inscriptions = vec![Envelope { + payload: Inscription { + body: Some(vec![98, 97, 114]), + content_type: Some(b"text/plain;charset=utf-8".into()), + ..default() + }, + input: 0, + offset: 0, + pushnum: false, + stutter: false, + }]; + let runestone = Runestone::decipher(&transaction); + let response = ord.json_request(format!("/decode/{txid}")); + + assert_eq!(response.status(), StatusCode::OK); + + assert_eq!( + serde_json::from_str::(&response.text().unwrap()).unwrap(), + api::Decode { + inscriptions, + runestone, + } + ); +} diff --git a/tests/lib.rs b/tests/lib.rs index 8c53a04cd3..6afc3cefe1 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -12,8 +12,8 @@ use { executable_path::executable_path, mockcore::TransactionTemplate, ord::{ - api, chain::Chain, outgoing::Outgoing, subcommand::runes::RuneInfo, wallet::batch, - InscriptionId, RuneEntry, + api, chain::Chain, decimal::Decimal, outgoing::Outgoing, subcommand::runes::RuneInfo, + wallet::batch, InscriptionId, RuneEntry, }, ordinals::{ Artifact, Charm, Edict, Pile, Rarity, Rune, RuneId, Runestone, Sat, SatPoint, SpacedRune, @@ -321,6 +321,14 @@ fn batch(core: &mockcore::Handle, ord: &TestServer, batchfile: batch::File) -> E let RuneId { block, tx } = id; + let supply_int = supply.to_integer(divisibility).unwrap(); + let premine_int = premine.to_integer(divisibility).unwrap(); + + let mint_progress = Decimal { + value: ((premine_int as f64 / supply_int as f64) * 10000.0) as u128, + scale: 2, + }; + ord.assert_response_regex( format!("/rune/{rune}"), format!( @@ -334,6 +342,8 @@ fn batch(core: &mockcore::Handle, ord: &TestServer, batchfile: batch::File) -> E {}
      supply
      {premine} {symbol}
      +
      mint progress
      +
      {mint_progress}%
      premine
      {premine} {symbol}
      premine percentage
      diff --git a/tests/list.rs b/tests/list.rs index f59e79b314..58dde2edee 100644 --- a/tests/list.rs +++ b/tests/list.rs @@ -15,15 +15,22 @@ fn output_found() { assert_eq!( output, Output { - ranges: Some(vec![Range { + address: None, + indexed: true, + inscriptions: vec![], + runes: BTreeMap::new(), + sat_ranges: Some(vec![Range { end: 50 * COIN_VALUE, name: "nvtdijuwxlp".into(), offset: 0, rarity: "mythic".parse().unwrap(), size: 50 * COIN_VALUE, start: 0, - }]), + }]), + script_pubkey: "OP_PUSHBYTES_65 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG".to_string(), spent: false, + transaction: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b".to_string(), + value: 5000000000, } ); } diff --git a/tests/server.rs b/tests/server.rs index 89fb77af08..788bb8be70 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -34,6 +34,196 @@ fn run() { child.kill().unwrap(); } +#[test] +fn address_page_shows_outputs_and_sat_balance() { + let core = mockcore::spawn(); + let ord = TestServer::spawn_with_args(&core, &["--index-addresses"]); + + create_wallet(&core, &ord); + core.mine_blocks(1); + + let address = "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"; + + let send = CommandBuilder::new(format!("wallet send --fee-rate 13.3 {address} 2btc")) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + ord.assert_response_regex( + format!("/address/{address}"), + format!( + ".*

      Address {address}

      .*
      200000000
      .*(); + + core.mine_blocks(6); + + ord.assert_response_regex( + format!("/address/{address}"), + format!(".*
      .*{}.*: 1000¢
      .*", Rune(RUNE)), + ); +} + +#[test] +fn address_page_shows_multiple_runes() { + let core = mockcore::builder().network(Network::Regtest).build(); + let ord = + TestServer::spawn_with_args(&core, &["--index-runes", "--index-addresses", "--regtest"]); + + create_wallet(&core, &ord); + + etch(&core, &ord, Rune(RUNE)); + etch(&core, &ord, Rune(RUNE + 1)); + + let address = "bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw"; + + 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::(); + + core.mine_blocks(6); + + CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 1 {address} 1000:{}", + Rune(RUNE + 1) + )) + .core(&core) + .ord(&ord) + .stdout_regex(".*") + .run_and_deserialize_output::(); + + core.mine_blocks(6); + + ord.assert_response_regex( + format!("/address/{address}"), + format!( + ".*
      .*{}.*: 1000¢
      .*
      .*{}.*: 1000¢
      .*", + Rune(RUNE), + Rune(RUNE + 1) + ), + ); +} + +#[test] +fn address_page_shows_aggregated_runes_balance() { + let core = mockcore::builder().network(Network::Regtest).build(); + let ord = + TestServer::spawn_with_args(&core, &["--index-runes", "--index-addresses", "--regtest"]); + + create_wallet(&core, &ord); + + etch(&core, &ord, Rune(RUNE)); + + let address = "bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw"; + + CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 1 {address} 250:{}", + Rune(RUNE) + )) + .core(&core) + .ord(&ord) + .stdout_regex(".*") + .run_and_deserialize_output::(); + + core.mine_blocks(6); + + CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 1 {address} 250:{}", + Rune(RUNE) + )) + .core(&core) + .ord(&ord) + .stdout_regex(".*") + .run_and_deserialize_output::(); + + core.mine_blocks(6); + + ord.assert_response_regex( + format!("/address/{address}"), + format!(".*
      .*{}.*: 500¢
      .*", Rune(RUNE)), + ); +} + +#[test] +fn address_page_shows_aggregated_inscriptions() { + 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 (inscription_id_1, _reveal) = inscribe(&core, &ord); + + let address = "bcrt1qs758ursh4q9z627kt3pp5yysm78ddny6txaqgw"; + + CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 1 {address} {inscription_id_1}", + )) + .core(&core) + .ord(&ord) + .stdout_regex(".*") + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + let (inscription_id_2, _reveal) = inscribe(&core, &ord); + + CommandBuilder::new(format!( + "--chain regtest --index-runes wallet send --fee-rate 1 {address} {inscription_id_2}", + )) + .core(&core) + .ord(&ord) + .stdout_regex(".*") + .run_and_deserialize_output::(); + + core.mine_blocks(1); + + ord.assert_response_regex( + format!("/address/{address}"), + r".* +
      .* +
      inscriptions
      +
      + + +
      .*" + , + ); +} + #[test] fn inscription_page() { let core = mockcore::spawn(); @@ -60,7 +250,7 @@ fn inscription_page() {
      id
      {inscription}
      address
      -
      bc1.*
      +
      bc1.*
      value
      10000
      preview
      @@ -190,7 +380,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
      .*", ), ) } @@ -313,6 +503,7 @@ fn recursive_inscription_endpoint() { charms: vec![Charm::Coin, Charm::Uncommon], content_type: Some("text/plain;charset=utf-8".to_string()), content_length: Some(3), + delegate: None, fee: 138, height: 2, id: inscription.id, diff --git a/tests/settings.rs b/tests/settings.rs index 0244259be4..d5d310e9ea 100644 --- a/tests/settings.rs +++ b/tests/settings.rs @@ -20,7 +20,9 @@ fn default() { "first_inscription_height": 767430, "height_limit": null, "hidden": \[\], + "http_port": null, "index": ".*index\.redb", + "index_addresses": false, "index_cache_size": \d+, "index_runes": false, "index_sats": false, @@ -63,7 +65,7 @@ fn config_invalid_error_message() { fs::write(&config, "foo").unwrap(); CommandBuilder::new(format!("--config {} settings", config.to_str().unwrap())) - .stderr_regex("error: failed to deserialize config file `.*ord.yaml`\nbecause:.*") + .stderr_regex("error: failed to deserialize config file `.*ord.yaml`\n\nbecause:.*") .expected_exit_code(1) .run_and_extract_stdout(); } @@ -75,7 +77,7 @@ fn config_not_found_error_message() { let config = tempdir.path().join("ord.yaml"); CommandBuilder::new(format!("--config {} settings", config.to_str().unwrap())) - .stderr_regex("error: failed to open config file `.*ord.yaml`\nbecause:.*") + .stderr_regex("error: failed to open config file `.*ord.yaml`\n\nbecause:.*") .expected_exit_code(1) .run_and_extract_stdout(); } diff --git a/tests/wallet.rs b/tests/wallet.rs index d82edf11a8..efa75d628e 100644 --- a/tests/wallet.rs +++ b/tests/wallet.rs @@ -11,10 +11,13 @@ mod inscriptions; mod label; mod mint; mod outputs; +#[cfg(unix)] +mod pending; mod receive; mod restore; #[cfg(unix)] mod resume; +mod runics; mod sats; mod selection; mod send; diff --git a/tests/wallet/batch_command.rs b/tests/wallet/batch_command.rs index 3a91f9b423..dfebb41f44 100644 --- a/tests/wallet/batch_command.rs +++ b/tests/wallet/batch_command.rs @@ -576,7 +576,7 @@ inscriptions: format!("/inscription/{}", output.inscriptions[0].id), ".*
      address
      -
      bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
      .*", +
      bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
      .*", ); ord.assert_response_regex( @@ -584,7 +584,7 @@ inscriptions: format!( ".*
      address
      -
      {}
      .*", +
      {0}
      .*", core.state().change_addresses[0], ), ); @@ -593,7 +593,7 @@ inscriptions: format!("/inscription/{}", output.inscriptions[2].id), ".*
      address
      -
      bc1pxwww0ct9ue7e8tdnlmug5m2tamfn7q06sahstg39ys4c9f3340qqxrdu9k
      .*", +
      bc1pxwww0ct9ue7e8tdnlmug5m2tamfn7q06sahstg39ys4c9f3340qqxrdu9k
      .*", ); } diff --git a/tests/wallet/outputs.rs b/tests/wallet/outputs.rs index a606841277..ae9a3950d7 100644 --- a/tests/wallet/outputs.rs +++ b/tests/wallet/outputs.rs @@ -66,3 +66,25 @@ fn outputs_includes_unbound_outputs() { assert_eq!(output[0].output, outpoint); assert_eq!(output[0].amount, amount); } + +#[test] +fn outputs_includes_sat_ranges() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &["--index-sats"], &[]); + + create_wallet(&core, &ord); + + let coinbase_tx = &core.mine_blocks_with_subsidy(1, 1_000_000)[0].txdata[0]; + let outpoint = OutPoint::new(coinbase_tx.txid(), 0); + let amount = coinbase_tx.output[0].value; + + let output = CommandBuilder::new("wallet outputs --ranges") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::>(); + + assert_eq!(output[0].output, outpoint); + assert_eq!(output[0].amount, amount); + assert_eq!(output[0].sat_ranges, vec!["5000000000-5001000000"]); +} diff --git a/tests/wallet/pending.rs b/tests/wallet/pending.rs new file mode 100644 index 0000000000..24f5f6965b --- /dev/null +++ b/tests/wallet/pending.rs @@ -0,0 +1,90 @@ +use { + super::*, + nix::{ + sys::signal::{self, Signal}, + unistd::Pid, + }, +}; + +#[test] +fn wallet_pending() { + 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); + + let batchfile = batch::File { + etching: Some(batch::Etching { + divisibility: 0, + rune: SpacedRune { + rune: Rune(RUNE), + spacers: 0, + }, + supply: "1000".parse().unwrap(), + premine: "1000".parse().unwrap(), + symbol: '¢', + ..default() + }), + inscriptions: vec![batch::Entry { + file: Some("inscription.jpeg".into()), + ..default() + }], + ..default() + }; + + let tempdir = Arc::new(TempDir::new().unwrap()); + + { + let mut spawn = + CommandBuilder::new("--regtest --index-runes wallet batch --fee-rate 0 --batch batch.yaml") + .temp_dir(tempdir.clone()) + .write("batch.yaml", serde_yaml::to_string(&batchfile).unwrap()) + .write("inscription.jpeg", "inscription") + .core(&core) + .ord(&ord) + .expected_exit_code(1) + .spawn(); + + let mut buffer = String::new(); + + BufReader::new(spawn.child.stderr.as_mut().unwrap()) + .read_line(&mut buffer) + .unwrap(); + + assert_regex_match!( + buffer, + "Waiting for rune AAAAAAAAAAAAA commitment [[:xdigit:]]{64} to mature…\n" + ); + + core.mine_blocks(1); + + signal::kill( + Pid::from_raw(spawn.child.id().try_into().unwrap()), + Signal::SIGINT, + ) + .unwrap(); + + buffer.clear(); + + BufReader::new(spawn.child.stderr.as_mut().unwrap()) + .read_line(&mut buffer) + .unwrap(); + + assert_eq!( + buffer, + "Shutting down gracefully. Press again to shutdown immediately.\n" + ); + + spawn.child.wait().unwrap(); + } + + let output = CommandBuilder::new("--regtest --index-runes wallet pending") + .temp_dir(tempdir) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::>(); + + assert_eq!(output.first().unwrap().rune.rune, Rune(RUNE)); +} diff --git a/tests/wallet/resume.rs b/tests/wallet/resume.rs index 3658b789e8..6d1b632f19 100644 --- a/tests/wallet/resume.rs +++ b/tests/wallet/resume.rs @@ -6,17 +6,8 @@ use { }, }; -#[test] -fn wallet_resume() { - 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); - - let batchfile = batch::File { +fn get_batchfile() -> batch::File { + batch::File { etching: Some(batch::Etching { divisibility: 0, rune: SpacedRune { @@ -33,53 +24,71 @@ fn wallet_resume() { ..default() }], ..default() - }; + } +} - let tempdir = Arc::new(TempDir::new().unwrap()); +fn inscribe_batch( + batchfile: &batch::File, + tempdir: &Arc, + core: &mockcore::Handle, + ord: &TestServer, +) { + let mut spawn = + CommandBuilder::new("--regtest --index-runes wallet batch --fee-rate 0 --batch batch.yaml") + .temp_dir(tempdir.clone()) + .write("batch.yaml", serde_yaml::to_string(&batchfile).unwrap()) + .write("inscription.jpeg", "inscription") + .core(core) + .ord(ord) + .expected_exit_code(1) + .spawn(); + + let mut buffer = String::new(); - { - let mut spawn = - CommandBuilder::new("--regtest --index-runes wallet batch --fee-rate 0 --batch batch.yaml") - .temp_dir(tempdir.clone()) - .write("batch.yaml", serde_yaml::to_string(&batchfile).unwrap()) - .write("inscription.jpeg", "inscription") - .core(&core) - .ord(&ord) - .expected_exit_code(1) - .spawn(); - - let mut buffer = String::new(); - - BufReader::new(spawn.child.stderr.as_mut().unwrap()) - .read_line(&mut buffer) - .unwrap(); - - assert_regex_match!( - buffer, - "Waiting for rune AAAAAAAAAAAAA commitment [[:xdigit:]]{64} to mature…\n" - ); - - core.mine_blocks(1); - - signal::kill( - Pid::from_raw(spawn.child.id().try_into().unwrap()), - Signal::SIGINT, - ) + BufReader::new(spawn.child.stderr.as_mut().unwrap()) + .read_line(&mut buffer) .unwrap(); - buffer.clear(); + assert_regex_match!( + buffer, + "Waiting for rune AAAAAAAAAAAAA commitment [[:xdigit:]]{64} to mature…\n" + ); - BufReader::new(spawn.child.stderr.as_mut().unwrap()) - .read_line(&mut buffer) - .unwrap(); + core.mine_blocks(1); - assert_eq!( - buffer, - "Shutting down gracefully. Press again to shutdown immediately.\n" - ); + signal::kill( + Pid::from_raw(spawn.child.id().try_into().unwrap()), + Signal::SIGINT, + ) + .unwrap(); - spawn.child.wait().unwrap(); - } + buffer.clear(); + + BufReader::new(spawn.child.stderr.as_mut().unwrap()) + .read_line(&mut buffer) + .unwrap(); + + assert_eq!( + buffer, + "Shutting down gracefully. Press again to shutdown immediately.\n" + ); + + spawn.child.wait().unwrap(); +} + +#[test] +fn wallet_resume() { + 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); + + let batchfile = get_batchfile(); + let tempdir = Arc::new(TempDir::new().unwrap()); + + inscribe_batch(&batchfile, &tempdir, &core, &ord); core.mine_blocks(6); @@ -106,79 +115,79 @@ fn wallet_resume() { } #[test] -fn resume_suspended() { +fn wallet_resume_by_rune_name() { 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); - let batchfile = batch::File { - etching: Some(batch::Etching { - divisibility: 0, - rune: SpacedRune { - rune: Rune(RUNE), - spacers: 0, - }, - supply: "1000".parse().unwrap(), - premine: "1000".parse().unwrap(), - symbol: '¢', - ..default() - }), - inscriptions: vec![batch::Entry { - file: Some("inscription.jpeg".into()), - ..default() - }], - ..default() - }; + let batchfile = get_batchfile(); + let tempdir = Arc::new(TempDir::new().unwrap()); + + inscribe_batch(&batchfile, &tempdir, &core, &ord); + + core.mine_blocks(6); + + let output = CommandBuilder::new("--regtest --index-runes wallet resume --rune AAAAAAAAAAAAA") + .temp_dir(tempdir) + .core(&core) + .ord(&ord) + .run_and_deserialize_output::(); + + assert_eq!( + output + .etchings + .first() + .unwrap() + .rune + .clone() + .unwrap() + .rune + .rune, + Rune(RUNE) + ); + + assert!(output.etchings.first().unwrap().reveal_broadcast); +} + +#[test] +fn wallet_resume_by_rune_not_found() { + 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); + + let batchfile = get_batchfile(); let tempdir = Arc::new(TempDir::new().unwrap()); - { - let mut spawn = - CommandBuilder::new("--regtest --index-runes wallet batch --fee-rate 0 --batch batch.yaml") - .temp_dir(tempdir.clone()) - .write("batch.yaml", serde_yaml::to_string(&batchfile).unwrap()) - .write("inscription.jpeg", "inscription") - .core(&core) - .ord(&ord) - .expected_exit_code(1) - .spawn(); - - let mut buffer = String::new(); - - BufReader::new(spawn.child.stderr.as_mut().unwrap()) - .read_line(&mut buffer) - .unwrap(); - - assert_regex_match!( - buffer, - "Waiting for rune AAAAAAAAAAAAA commitment [[:xdigit:]]{64} to mature…\n" - ); - - core.mine_blocks(1); - - signal::kill( - Pid::from_raw(spawn.child.id().try_into().unwrap()), - Signal::SIGINT, - ) - .unwrap(); + inscribe_batch(&batchfile, &tempdir, &core, &ord); + + core.mine_blocks(6); + + CommandBuilder::new("--regtest --index-runes wallet resume --rune BBBBBBBBBBBBB") + .temp_dir(tempdir) + .core(&core) + .ord(&ord) + .expected_stderr("error: rune BBBBBBBBBBBBB does not correspond to any pending etching."); +} - buffer.clear(); +#[test] +fn resume_suspended() { + let core = mockcore::builder().network(Network::Regtest).build(); + let ord = TestServer::spawn_with_server_args(&core, &["--regtest", "--index-runes"], &[]); - BufReader::new(spawn.child.stderr.as_mut().unwrap()) - .read_line(&mut buffer) - .unwrap(); + create_wallet(&core, &ord); - assert_eq!( - buffer, - "Shutting down gracefully. Press again to shutdown immediately.\n" - ); + core.mine_blocks(1); - spawn.child.wait().unwrap(); - } + let batchfile = get_batchfile(); + let tempdir = Arc::new(TempDir::new().unwrap()); + + inscribe_batch(&batchfile, &tempdir, &core, &ord); let mut spawn = CommandBuilder::new("--regtest --index-runes wallet resume") .temp_dir(tempdir) @@ -216,25 +225,7 @@ fn commitment_output_is_locked() { core.mine_blocks(1); - let batchfile = batch::File { - etching: Some(batch::Etching { - divisibility: 0, - rune: SpacedRune { - rune: Rune(RUNE), - spacers: 0, - }, - supply: "1000".parse().unwrap(), - premine: "1000".parse().unwrap(), - symbol: '¢', - ..default() - }), - inscriptions: vec![batch::Entry { - file: Some("inscription.jpeg".into()), - ..default() - }], - ..default() - }; - + let batchfile = get_batchfile(); let tempdir = Arc::new(TempDir::new().unwrap()); let mut spawn = diff --git a/tests/wallet/runics.rs b/tests/wallet/runics.rs new file mode 100644 index 0000000000..39450127d2 --- /dev/null +++ b/tests/wallet/runics.rs @@ -0,0 +1,54 @@ +use { + super::*, + ord::{decimal::Decimal, subcommand::wallet::runics::RunicUtxo}, +}; + +#[test] +fn wallet_runics() { + 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); + + batch( + &core, + &ord, + batch::File { + etching: Some(batch::Etching { + divisibility: 0, + premine: "1000".parse().unwrap(), + rune: SpacedRune { rune, spacers: 1 }, + supply: "1000".parse().unwrap(), + symbol: '¢', + terms: None, + turbo: false, + }), + inscriptions: vec![batch::Entry { + file: Some("inscription.jpeg".into()), + ..default() + }], + ..default() + }, + ); + + pretty_assert_eq!( + CommandBuilder::new("--regtest --index-runes wallet runics") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::>() + .first() + .unwrap() + .runes, + vec![( + SpacedRune { rune, spacers: 1 }, + Decimal { + value: 1000, + scale: 0 + } + )] + .into_iter() + .collect() + ); +} diff --git a/tests/wallet/sats.rs b/tests/wallet/sats.rs index 44e8650bb5..71de77186f 100644 --- a/tests/wallet/sats.rs +++ b/tests/wallet/sats.rs @@ -1,6 +1,6 @@ use { super::*, - ord::subcommand::wallet::sats::{OutputRare, OutputTsv}, + ord::subcommand::wallet::sats::{OutputAll, OutputRare, OutputTsv}, }; #[test] @@ -91,6 +91,32 @@ fn sats_from_tsv_file_not_found() { .core(&core) .ord(&ord) .expected_exit_code(1) - .stderr_regex("error: I/O error reading `.*`\nbecause: .*\n") + .stderr_regex("error: I/O error reading `.*`\n\nbecause:.*") .run_and_extract_stdout(); } + +#[test] +fn sats_all() { + let core = mockcore::spawn(); + + let ord = TestServer::spawn_with_server_args(&core, &["--index-sats"], &[]); + + create_wallet(&core, &ord); + + let second_coinbase = core.mine_blocks(1)[0].txdata[0].txid(); + + let output = CommandBuilder::new("--index-sats wallet sats --all") + .core(&core) + .ord(&ord) + .run_and_deserialize_output::>(); + + assert_eq!( + output, + vec![OutputAll { + output: format!("{second_coinbase}:0").parse::().unwrap(), + ranges: vec![format!("{}-{}", 50 * COIN_VALUE, 100 * COIN_VALUE)], + }] + .into_iter() + .collect::>() + ); +} diff --git a/tests/wallet/send.rs b/tests/wallet/send.rs index 6779da1ec9..dbfae3bdfb 100644 --- a/tests/wallet/send.rs +++ b/tests/wallet/send.rs @@ -155,7 +155,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
      .*", ), ); }