transfer100.pizza#71,227,079brc-20deploy.uniai#66,803,221brc-20deploy.deweb#66,803,055brc-20dmt-mint.grok42#65,369,083tapdmt-mint.grok42#65,368,915tapdmt-mint.grok42#65,368,906tapdmt-mint.grok42#65,368,617tapdmt-mint.grok42#65,368,575tapInscription #64856873#64,856,873htmlInscription #64856872#64,856,872htmlInscription #64856871#64,856,871htmlInscription #64856870#64,856,870htmlInscription #64856869#64,856,869htmlInscription #64856868#64,856,868htmlInscription #64856867#64,856,867htmlInscription #64856866#64,856,866htmlInscription #64856865#64,856,865htmlInscription #64856864#64,856,864htmlInscription #62776079#62,776,079pngmint1,000.▣ #61,745,882brc-20mint1,000.▣ #61,745,877brc-20mint1,000.▣ #61,745,873brc-20mint1,000.▣ #61,745,871brc-20mint1,000.▣ #61,745,869brc-20mint1,000.▣ #61,745,865brc-20mint1,000.▣ #61,745,860brc-20mint1,000.▣ #61,745,858brc-20mint1,000.▣ #61,745,856brc-20mint1,000.▣ #61,745,853brc-20383836.bitnats#61,219,840text644447.bitnats#61,219,779text644449.bitnats#61,219,742text71700.bitnats#61,217,503text384375.bitnats#61,216,783text70893.bitnats#61,216,742text71066.bitnats#61,216,708text71836.bitnats#61,216,707text71741.bitnats#61,216,685text#59,136,498Inscription #59136497#59,136,497pngInscription #56251063#56,251,063pngtransfer5,000.dada#54,438,675brc-20transfer10,000.hotx#52,322,251brc-20transfer2,000.hotx#52,101,175brc-20transfer10,000.hotx#52,093,180brc-20transfer5,000.dada#51,879,010brc-20transfer10,000,000,000.sats#46,542,218brc-20considered to have an implicit input equal in size to the subsidy, followed by an input for every fee-paying transaction in the block, in the order that those transactions appear in the block. The implicit subsidy input carries the block's newly created sats. The implicit fee inputs carry the sats that were paid as fees in the block's transactions. Underpaying the subsidy does not change the ordinal numbers of sats mined in subsequent blocks. Ordinals depend only on how many sats could have been mined, not how many actually were. === Specification === Sats are numbered and transferred with the following algorithm: <pre> # subsidy of block at given height def subsidy(height): return 50 * 100_000_000 >> height // 210_000 # first ordinal of subsidy of block at given height def first_ordinal(height): start = 0 for height in range(height): start += subsidy(height) return start # assign ordinals in given block def assign_ordinals(block): first = first_ordinal(block.height) last = first + subsidy(block.height)#44,990,139textuse {super::*, std::ops::Deref}; #[test] fn inscribe_creates_inscriptions() { let rpc_server = test_bitcoincore_rpc::spawn(); rpc_server.mine_blocks(1); assert_eq!(rpc_server.descriptors().len(), 0); create_wallet(&rpc_server); let (inscription, _) = inscribe(&rpc_server); assert_eq!(rpc_server.descriptors().len(), 3); let request = TestServer::spawn_with_args(&rpc_server, &[]).request(format!("/content/{inscription}")); assert_eq!(request.status(), 200); assert_eq!( request.headers().get("content-type").unwrap(), "text/plain;charset=utf-8" ); assert_eq!(request.text().unwrap(), "FOO"); } #[test] fn inscribe_works_with_huge_expensive_inscriptions() { let rpc_server = test_bitcoincore_rpc::spawn(); create_wallet(&rpc_server); let txid = rpc_server.mine_blocks(1)[0].txdata[0].txid(); CommandBuilder::new(format!( "wallet inscribe --file foo.txt --satpoint {txid}:0:0 --fee-rate 10" )) .write("foo.txt", [0; 350_000]) .rpc_server(&rpc_server) .run_and_deserialize_output::<Inscribe>(); #44,990,117textuse super::*; pub(crate) struct MetadataHtml<'a>(pub &'a Value); impl<'a> Display for MetadataHtml<'a> { fn fmt(&self, f: &mut Formatter) -> fmt::Result { match self.0 { Value::Array(x) => { write!(f, "<ul>")?; for element in x { write!(f, "<li>{}</li>", MetadataHtml(element))?; } write!(f, "</ul>") } Value::Bool(x) => write!(f, "{x}"), Value::Bytes(x) => { for byte in x { write!(f, "{byte:02X}")?; } Ok(()) } Value::Float(x) => write!(f, "{x}"), Value::Integer(x) => write!(f, "{}", i128::from(*x)), Value::Map(x) => { write!(f, "<dl>")?; for (key, value) in x { write!(f, "<dt>{}</dt>", MetadataHtml(key))?; write!(f, "<dd>{}</dd>", MetadataHtml(value))?; } write!(f, "</dl>") } Value::Null => write!(f, "null"), Value::Tag(tag, value) => write!(f, "<sup>{tag}</sup>{}", MetadataHtml(value)), Value::Text(x) => x.escape(f, false), #44,988,395text <div>❯</div> </div> <dl> <dt>children</dt> <dd> <div class=thumbnails> <a href=/inscription/2{64}i2><iframe .* src=/preview/2{64}i2></iframe></a> <a href=/inscription/3{64}i3><iframe .* src=/preview/3{64}i3></iframe></a> </div> <div class=center> <a href=/children/1{64}i1>all</a> </div> </dd> <dt>id</dt> <dd class=monospace>1{64}i1</dd> <dt>preview</dt> <dd><a href=/preview/1{64}i1>link</a></dd> <dt>content</dt> <dd><a href=/content/1{64}i1>link</a></dd> <dt>content length</dt> <dd>10 bytes</dd> <dt>content type</dt> <dd>text/plain;charset=utf-8</dd> <dt>timestamp</dt> <dd><time>1970-01-01 00:00:00 UTC</time></dd> <dt>genesis height</dt> <dd><a href=/block/0>0</a></dd> <dt>genesis fee</dt> <dd>1</dd> <dt>genesis transaction</dt> #44,988,393text header::STRICT_TRANSPORT_SECURITY, HeaderValue::from_static("max-age=31536000; includeSubDomains; preload"), )) .layer( CorsLayer::new() .allow_methods([http::Method::GET]) .allow_origin(Any), ) .layer(CompressionLayer::new()) .with_state(server_config); match (self.http_port(), self.https_port()) { (Some(http_port), None) => { self .spawn(router, handle, http_port, SpawnConfig::Http)? .await?? } (None, Some(https_port)) => { self .spawn( router, handle, https_port, SpawnConfig::Https(self.acceptor(&options)?), )? .await?? } (Some(http_port), Some(https_port)) => { let http_spawn_config = if self.redirect_http_to_https { SpawnConfig::Redirect(if https_port == 443 { format!("https://{}", acme_domains[0]) #44,988,392textmsgid "" "```\n" "ord wallet send --fee-rate <FEE_RATE> <ADDRESS> <INSCRIPTION_ID>\n" "```" msgstr "" "```\n" "ord wallet send --fee-rate <TAXA> <ENDEREÇO> <ID_INSCRIÇãO>\n" "```" #: src/guides/inscriptions.md:211 #: src/guides/inscriptions.md:239 msgid "See the pending transaction with:" msgstr "Veja a transação pendente com:" #: src/guides/inscriptions.md:217 msgid "" "Once the send transaction confirms, the recipient can confirm receipt by " "running:" msgstr "" "Assim que a transação de envio for confirmada, o destinatário poderá confirmar " "o recebimento executando:" #: src/guides/inscriptions.md:224 msgid "Receiving Inscriptions" msgstr "Recebendo Inscrições" #: src/guides/inscriptions.md:227 msgid "Generate a new receive address using:" msgstr "Gere um novo endereço de recebimento usando:" #: src/guides/inscriptions.md:233 msgid "The sender can transfer the inscription to your address using:" msgstr "O remetente pode transferir a inscrição para o seu endereço usando:" #: src/guides/inscriptions.md:235 #44,987,657text .insert(&sequence_number, inscription_id.store())?; if self.home_inscription_count == 100 { self.home_inscriptions.pop_first()?; } else { self.home_inscription_count += 1; } } (unbound, sequence_number) } }; let satpoint = if unbound { let new_unbound_satpoint = SatPoint { outpoint: unbound_outpoint(), offset: self.unbound_inscriptions, }; self.unbound_inscriptions += 1; new_unbound_satpoint.store() } else { new_satpoint.store() }; self .satpoint_to_sequence_number .insert(&satpoint, sequence_number)?; self .sequence_number_to_satpoint .insert(sequence_number, &satpoint)?; Ok(()) } } #44,987,656textuse { super::*, bitcoin::blockdata::{ opcodes, script::{self, Instruction, Instructions}, }, }; pub(crate) const PROTOCOL_ID: [u8; 3] = *b"ord"; pub(crate) const BODY_TAG: [u8; 0] = []; pub(crate) const CONTENT_TYPE_TAG: [u8; 1] = [1]; pub(crate) const POINTER_TAG: [u8; 1] = [2]; pub(crate) const PARENT_TAG: [u8; 1] = [3]; pub(crate) const METADATA_TAG: [u8; 1] = [5]; pub(crate) const METAPROTOCOL_TAG: [u8; 1] = [7]; pub(crate) const CONTENT_ENCODING_TAG: [u8; 1] = [9]; type Result<T> = std::result::Result<T, script::Error>; type RawEnvelope = Envelope<Vec<Vec<u8>>>; pub(crate) type ParsedEnvelope = Envelope<Inscription>; #[derive(Debug, Default, PartialEq, Clone)] pub(crate) struct Envelope<T> { pub(crate) payload: T, pub(crate) input: u32, pub(crate) offset: u32, pub(crate) pushnum: bool, } fn remove_field(fields: &mut BTreeMap<&[u8], Vec<&[u8]>>, field: &[u8]) -> Option<Vec<u8>> { let values = fields.get_mut(field)?; if values.is_empty() { None } else { let value = values.remove(0).to_vec(); #44,987,127textmint1,000.xone#42,169,869brc-20mint1,000.xone#42,168,784brc-20mint1,000.xone#42,168,759brc-20mint1,000.xone#42,168,721brc-20mint1,000.xone#42,168,695brc-20