From da4f43ede6f99ded543aca5655c59ccb3eccb6f2 Mon Sep 17 00:00:00 2001 From: Sander Bosma Date: Thu, 3 Aug 2023 15:01:50 +0200 Subject: [PATCH 1/2] feat: basic bitcoin type conversions --- crates/bitcoin/Cargo.toml | 3 + crates/bitcoin/src/compat.rs | 111 +++++++++++++++++++++++++++++++++ crates/bitcoin/src/lib.rs | 3 + crates/bitcoin/src/parser.rs | 116 +++++++++++++++++++---------------- 4 files changed, 180 insertions(+), 53 deletions(-) create mode 100644 crates/bitcoin/src/compat.rs diff --git a/crates/bitcoin/Cargo.toml b/crates/bitcoin/Cargo.toml index da310e6bc8..24ead977cc 100644 --- a/crates/bitcoin/Cargo.toml +++ b/crates/bitcoin/Cargo.toml @@ -15,6 +15,7 @@ spin = { version = "0.7.1", default-features = false } primitive-types = { version = "0.12.1", default-features = false, features = ["codec", "scale-info"] } bitcoin_hashes = { version = "0.7.3", default-features = false } secp256k1 = { package = "secp256k1", git = "https://github.com/rust-bitcoin/rust-secp256k1", rev = "8e61874", default-features = false } +rust-bitcoin = { package = "bitcoin", version = "0.30.1", default-features = false, features = ["no-std"], optional = true } [dev-dependencies] mocktopus = "0.8.0" @@ -33,9 +34,11 @@ std = [ "primitive-types/std", "primitive-types/serde", "secp256k1/std", + "rust-bitcoin?/std" ] parser = [] runtime-benchmarks = [] +bitcoin-types-compat = ["rust-bitcoin", "parser"] [[example]] name = "parse-transaction" diff --git a/crates/bitcoin/src/compat.rs b/crates/bitcoin/src/compat.rs new file mode 100644 index 0000000000..061348ab83 --- /dev/null +++ b/crates/bitcoin/src/compat.rs @@ -0,0 +1,111 @@ +use crate::{formatter::TryFormat, parser::Parsable}; +pub use rust_bitcoin; +use rust_bitcoin::consensus::{Decodable, Encodable}; + +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + +#[derive(Debug)] +pub enum ConversionError { + ParsingError, + FormattingError, +} + +pub trait ConvertFromInterlayBitcoin { + type Output; + fn to_rust_bitcoin(&self) -> Result; +} + +pub trait ConvertToInterlayBitcoin { + type Output; + fn to_interlay(&self) -> Result; +} + +/// Macro to implement type conversion from interlay type to rust-bitcoin, using consensus encoding +macro_rules! impl_bitcoin_conversion { + ($a:path, $b:path) => { + impl ConvertFromInterlayBitcoin for $a { + type Output = $b; + fn to_rust_bitcoin(&self) -> Result { + let mut bytes = Vec::::new(); + self.try_format(&mut bytes) + .map_err(|_| ConversionError::FormattingError)?; + + let result = Self::Output::consensus_decode_from_finite_reader(&mut &bytes[..]) + .map_err(|_| ConversionError::ParsingError)?; + + Ok(result) + } + } + }; +} +/// Macro to implement type conversion to interlay type from rust-bitcoin, using consensus encoding +macro_rules! impl_to_interlay_bitcoin_conversion { + ($a:path, $b:path) => { + impl ConvertToInterlayBitcoin for $b { + type Output = $a; + fn to_interlay(&self) -> Result { + let mut data: Vec = Vec::new(); + self.consensus_encode(&mut data) + .map_err(|_| ConversionError::FormattingError)?; + let result = Self::Output::parse(&data, 0).map_err(|_| ConversionError::ParsingError)?; + Ok(result.0) + } + } + }; +} + +macro_rules! impl_bidirectional_bitcoin_conversion { + ($a:path, $b:path) => { + impl_bitcoin_conversion!($a, $b); + impl_to_interlay_bitcoin_conversion!($a, $b); + }; +} + +// there also exists rust_bitcoin::Script but we can't convert to that since it's unsized +impl_bitcoin_conversion!(crate::Script, rust_bitcoin::ScriptBuf); + +// Transcation conversions +impl_bidirectional_bitcoin_conversion!(crate::types::Transaction, rust_bitcoin::Transaction); + +// Address <--> Payload +impl ConvertToInterlayBitcoin for rust_bitcoin::address::Payload { + type Output = crate::Address; + fn to_interlay(&self) -> Result { + let bitcoin_script = self.script_pubkey(); + let bitcoin_script_bytes = bitcoin_script.to_bytes(); + let interlay_script = crate::Script::from(bitcoin_script_bytes); + Ok(crate::Address::from_script_pub_key(&interlay_script).map_err(|_| ConversionError::ParsingError)?) + } +} +impl ConvertFromInterlayBitcoin for crate::Address { + type Output = rust_bitcoin::address::Payload; + fn to_rust_bitcoin(&self) -> Result { + let interlay_script = self.to_script_pub_key(); + let bitcoin_script = rust_bitcoin::blockdata::script::Script::from_bytes(interlay_script.as_bytes()); + Ok(rust_bitcoin::address::Payload::from_script(&bitcoin_script).map_err(|_| ConversionError::ParsingError)?) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::parser::parse_transaction; + #[test] + fn test_bitcoin_compat() { + // txid eb3db053cd139147f2fd676cf59a491fd5aebc54bddfde829704585b659126fc + let raw_tx = "0100000000010120e6fb8f0e2cfb8667a140a92d045d5db7c1b56635790bc907c3e71d43720a150e00000017160014641e441c2ba32dd7cf05afde7922144dd106b09bffffffff019dbd54000000000017a914bd847a4912984cf6152547feca51c1b9c2bcbe2787024830450221008f00033064c26cfca4dc98e5dba800b18729c3441dca37b49358ae0df9be7fad02202a81085318466ea66ef390d5dab6737e44a05f7f2e747932ebba917e0098f37d012102c109fc47335c3a2e206d462ad52590b1842aa9d6e0eb9c683c896fa8723590b400000000"; + let tx_bytes = hex::decode(&raw_tx).unwrap(); + let interlay_transaction = parse_transaction(&tx_bytes).unwrap(); + + let rust_bitcoin_transaction = interlay_transaction.to_rust_bitcoin().unwrap(); + + // check that the rust-bitcoin type encoded to the same bytes + let mut reencoded_bytes: Vec = Vec::new(); + rust_bitcoin_transaction.consensus_encode(&mut reencoded_bytes).unwrap(); + assert_eq!(tx_bytes, reencoded_bytes); + + // check that the conversion back works + assert_eq!(interlay_transaction, rust_bitcoin_transaction.to_interlay().unwrap()); + } +} diff --git a/crates/bitcoin/src/lib.rs b/crates/bitcoin/src/lib.rs index 90115bcd7d..e0b8a3b79a 100644 --- a/crates/bitcoin/src/lib.rs +++ b/crates/bitcoin/src/lib.rs @@ -45,6 +45,9 @@ pub mod formatter; #[cfg(any(feature = "parser", test))] pub mod parser; +#[cfg(feature = "bitcoin-types-compat")] +pub mod compat; + pub mod utils; pub mod pow; diff --git a/crates/bitcoin/src/parser.rs b/crates/bitcoin/src/parser.rs index f57345eda2..4fd031e8c0 100644 --- a/crates/bitcoin/src/parser.rs +++ b/crates/bitcoin/src/parser.rs @@ -110,6 +110,68 @@ impl Parsable for Vec { } } +impl Parsable for Transaction { + fn parse(raw_bytes: &[u8], position: usize) -> Result<(Transaction, usize), Error> { + let slice = raw_bytes.get(position..).ok_or(Error::EndOfFile)?; + let mut parser = BytesParser::new(slice); + let version: i32 = parser.parse()?; + + // fail if incorrect version: we only support version 1 and 2 + if version != 1 && version != 2 { + return Err(Error::MalformedTransaction); + } + + let allow_witness = (version & SERIALIZE_TRANSACTION_NO_WITNESS) == 0; + + // TODO: bound maximum? + let mut inputs: Vec = parser.parse_with(version)?; + + let mut flags: u8 = 0; + if inputs.is_empty() && allow_witness { + flags = parser.parse()?; + inputs = parser.parse_with(version)?; + } + + // TODO: bound maximum? + let outputs: Vec = parser.parse()?; + + if (flags & 1) != 0 && allow_witness { + flags ^= 1; + for input in &mut inputs { + input.with_witness(parser.parse()?); + } + + if inputs.iter().all(|input| input.witness.is_empty()) { + // A transaction with a set witness-flag must actually include witnesses in the transaction. + // see https://github.com/bitcoin/bitcoin/blob/be4171679b8eab8205e04ff86140329bd67878a0/src/primitives/transaction.h#L214-L217 + return Err(Error::MalformedTransaction); + } + } + + // https://en.bitcoin.it/wiki/NLockTime + let locktime_or_blockheight: u32 = parser.parse()?; + let lock_at = if locktime_or_blockheight < LOCKTIME_THRESHOLD { + LockTime::BlockHeight(locktime_or_blockheight) + } else { + LockTime::Time(locktime_or_blockheight) + }; + + if flags != 0 { + return Err(Error::MalformedTransaction); + } + + Ok(( + Transaction { + version, + inputs, + outputs, + lock_at, + }, + parser.position, + )) + } +} + impl ParsableMeta for TransactionInput { fn parse_with(raw_bytes: &[u8], position: usize, version: i32) -> Result<(TransactionInput, usize), Error> { let slice = raw_bytes.get(position..).ok_or(Error::EndOfFile)?; @@ -270,59 +332,7 @@ pub fn parse_compact_uint(varint: &[u8]) -> Result<(u64, usize), Error> { /// /// * `raw_transaction` - the raw bytes of the transaction pub fn parse_transaction(raw_transaction: &[u8]) -> Result { - let mut parser = BytesParser::new(raw_transaction); - let version: i32 = parser.parse()?; - - // fail if incorrect version: we only support version 1 and 2 - if version != 1 && version != 2 { - return Err(Error::MalformedTransaction); - } - - let allow_witness = (version & SERIALIZE_TRANSACTION_NO_WITNESS) == 0; - - // TODO: bound maximum? - let mut inputs: Vec = parser.parse_with(version)?; - - let mut flags: u8 = 0; - if inputs.is_empty() && allow_witness { - flags = parser.parse()?; - inputs = parser.parse_with(version)?; - } - - // TODO: bound maximum? - let outputs: Vec = parser.parse()?; - - if (flags & 1) != 0 && allow_witness { - flags ^= 1; - for input in &mut inputs { - input.with_witness(parser.parse()?); - } - - if inputs.iter().all(|input| input.witness.is_empty()) { - // A transaction with a set witness-flag must actually include witnesses in the transaction. - // see https://github.com/bitcoin/bitcoin/blob/be4171679b8eab8205e04ff86140329bd67878a0/src/primitives/transaction.h#L214-L217 - return Err(Error::MalformedTransaction); - } - } - - // https://en.bitcoin.it/wiki/NLockTime - let locktime_or_blockheight: u32 = parser.parse()?; - let lock_at = if locktime_or_blockheight < LOCKTIME_THRESHOLD { - LockTime::BlockHeight(locktime_or_blockheight) - } else { - LockTime::Time(locktime_or_blockheight) - }; - - if flags != 0 { - return Err(Error::MalformedTransaction); - } - - Ok(Transaction { - version, - inputs, - outputs, - lock_at, - }) + Transaction::parse(raw_transaction, 0).map(|(tx, _len)| tx) } /// Parses a transaction input From 504cdb6fa70eb2ee138083d25cbc371afd3d1821 Mon Sep 17 00:00:00 2001 From: Sander Bosma Date: Thu, 3 Aug 2023 15:03:19 +0200 Subject: [PATCH 2/2] test: brc21 parsing --- Cargo.lock | 99 +++++++-- contracts/btc_swap/Cargo.toml | 5 +- contracts/btc_swap/brc21.rs | 116 +++++++++++ contracts/btc_swap/lib.rs | 53 ++++- contracts/btc_swap/ord.rs | 212 ++++++++++++++++++++ contracts/btc_swap/target/ink/btc_swap.json | 2 +- contracts/btc_swap/target/ink/btc_swap.wasm | Bin 10981 -> 76919 bytes 7 files changed, 470 insertions(+), 17 deletions(-) create mode 100644 contracts/btc_swap/brc21.rs create mode 100644 contracts/btc_swap/ord.rs diff --git a/Cargo.lock b/Cargo.lock index 44f1949205..6f88e07a41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -610,6 +610,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "beef" version = "0.5.2" @@ -672,11 +678,26 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bitcoin" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e99ff7289b20a7385f66a0feda78af2fc119d28fb56aea8886a9cd0a4abdd75" +dependencies = [ + "bech32", + "bitcoin-private", + "bitcoin_hashes 0.12.0", + "core2 0.3.3", + "hex_lit", + "secp256k1 0.27.0", +] + [[package]] name = "bitcoin" version = "1.2.0" dependencies = [ - "bitcoin_hashes", + "bitcoin 0.30.1", + "bitcoin_hashes 0.7.6", "frame-support", "hex", "impl-serde 0.3.2", @@ -690,12 +711,28 @@ dependencies = [ "spin 0.7.1", ] +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + [[package]] name = "bitcoin_hashes" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b375d62f341cef9cd9e77793ec8f1db3fc9ce2e4d57e982c8fe697a2c16af3b6" +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", + "core2 0.3.3", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -861,7 +898,7 @@ checksum = "bd769563b4ea2953e2825c9e6b7470a5f55f67e0be00030bf3e390a2a6071f64" name = "btc-relay" version = "1.2.0" dependencies = [ - "bitcoin", + "bitcoin 1.2.0", "frame-benchmarking", "frame-support", "frame-system", @@ -1085,7 +1122,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" dependencies = [ - "core2", + "core2 0.4.0", "multibase", "multihash 0.16.3", "serde", @@ -1332,6 +1369,15 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "core2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239fa3ae9b63c2dc74bd3fa852d4792b8b305ae64eeede946265b6af62f1fff3" +dependencies = [ + "memchr", +] + [[package]] name = "core2" version = "0.4.0" @@ -4401,6 +4447,12 @@ dependencies = [ "proc-macro-hack", ] +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + [[package]] name = "hkdf" version = "0.12.3" @@ -4751,7 +4803,7 @@ name = "interbtc-parachain" version = "1.2.0" dependencies = [ "async-trait", - "bitcoin", + "bitcoin 1.2.0", "btc-relay-rpc-runtime-api", "clap", "cumulus-client-cli", @@ -4852,7 +4904,7 @@ dependencies = [ name = "interbtc-primitives" version = "1.2.0" dependencies = [ - "bitcoin", + "bitcoin 1.2.0", "bstringify", "parity-scale-codec", "primitive-types", @@ -4930,7 +4982,7 @@ name = "interlay-runtime-parachain" version = "1.2.0" dependencies = [ "annuity", - "bitcoin", + "bitcoin 1.2.0", "btc-relay", "btc-relay-rpc-runtime-api", "clients-info", @@ -5097,7 +5149,7 @@ dependencies = [ name = "issue" version = "1.2.0" dependencies = [ - "bitcoin", + "bitcoin 1.2.0", "btc-relay", "currency", "fee", @@ -5353,7 +5405,7 @@ name = "kintsugi-runtime-parachain" version = "1.2.0" dependencies = [ "annuity", - "bitcoin", + "bitcoin 1.2.0", "btc-relay", "btc-relay-rpc-runtime-api", "clients-info", @@ -6741,7 +6793,7 @@ dependencies = [ "blake2b_simd", "blake2s_simd", "blake3", - "core2", + "core2 0.4.0", "digest 0.10.7", "multihash-derive", "sha2 0.10.7", @@ -6755,7 +6807,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" dependencies = [ - "core2", + "core2 0.4.0", "multihash-derive", "unsigned-varint", ] @@ -8644,7 +8696,7 @@ name = "parachain-tests" version = "1.2.0" dependencies = [ "annuity", - "bitcoin", + "bitcoin 1.2.0", "btc-relay", "btc-relay-rpc-runtime-api", "clients-info", @@ -10896,7 +10948,7 @@ dependencies = [ name = "redeem" version = "1.2.0" dependencies = [ - "bitcoin", + "bitcoin 1.2.0", "btc-relay", "currency", "fee", @@ -11069,7 +11121,7 @@ dependencies = [ name = "replace" version = "1.2.0" dependencies = [ - "bitcoin", + "bitcoin 1.2.0", "btc-relay", "currency", "fee", @@ -13016,6 +13068,16 @@ dependencies = [ "secp256k1-sys 0.6.1", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes 0.12.0", + "secp256k1-sys 0.8.1", +] + [[package]] name = "secp256k1-sys" version = "0.4.0" @@ -13033,6 +13095,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + [[package]] name = "secrecy" version = "0.8.0" @@ -15430,7 +15501,7 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" name = "vault-registry" version = "1.2.0" dependencies = [ - "bitcoin", + "bitcoin 1.2.0", "currency", "fee", "fixed-hash 0.7.0", diff --git a/contracts/btc_swap/Cargo.toml b/contracts/btc_swap/Cargo.toml index 552ee72e0a..d9402823c5 100755 --- a/contracts/btc_swap/Cargo.toml +++ b/contracts/btc_swap/Cargo.toml @@ -12,10 +12,13 @@ ink = { version = "4.2.0", default-features = false } scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } scale-info = { version = "2.6", default-features = false, features = ["derive"], optional = true } -bitcoin = { path = "../../crates/bitcoin", default-features = false } +bitcoin = { path = "../../crates/bitcoin", default-features = false, features = ["bitcoin-types-compat"] } +serde = { version = "1.0.136",default-features = false, features = ["derive"] } +serde_json = { version = "1.0.71", default-features = false, features = ["alloc"]} [dev-dependencies] ink_e2e = "4.2.0" +hex = { version = "0.4.2", default-features = false } [lib] path = "lib.rs" diff --git a/contracts/btc_swap/brc21.rs b/contracts/btc_swap/brc21.rs new file mode 100644 index 0000000000..8ed7a8e2ff --- /dev/null +++ b/contracts/btc_swap/brc21.rs @@ -0,0 +1,116 @@ +use crate::*; + +use serde::Deserializer; +use serde_json::Value; +use serde::Deserialize; +fn deserialize_quoted_integer<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + match Value::deserialize(deserializer)? { + Value::String(s) => { + serde_json::from_str::(&s).map_err(|_| serde::de::Error::custom("wrong type")) + } + _ => Err(serde::de::Error::custom("wrong type")), + } +} + +#[derive(serde::Deserialize, Debug, PartialEq)] +#[serde(tag="p", rename = "brc-21")] +pub struct Brc21<'a> { + #[serde(flatten)] + pub op: Brc21Operation<'a>, + pub tick: &'a str, +} + +#[derive(serde::Deserialize, Debug, PartialEq)] +#[serde(tag="op")] +#[serde(rename_all = "camelCase")] +pub enum Brc21Operation<'a> { + Deploy { + #[serde(deserialize_with = "deserialize_quoted_integer")] + max: u64, + src: &'a str, + id: &'a str, + }, + Mint { + #[serde(deserialize_with = "deserialize_quoted_integer")] + amt: u64, + src: &'a str, + }, + Transfer{ + #[serde(deserialize_with = "deserialize_quoted_integer")] + amt: u64, + }, + Redeem { + #[serde(deserialize_with = "deserialize_quoted_integer")] + amt: u64, + dest:&'a str, + acc: &'a str, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use bitcoin::parser::parse_transaction; + use crate::ord::Inscription; + + #[test] + fn test_inscription() { + // txid b61b0172d95e266c18aea0c624db987e971a5d6d4ebc2aaed85da4642d635735 + let raw_tx = "01000000000101ace8423f874c95f5f9042d7cda6b9f0727251f3059ef827f373a56831cc621a30000000000fdffffff01102700000000000022512037679ea62eab55ebfd442c53c4ad46b6b75e45d8a8fa9cb31a87d0df268b029a03406c00eb3c4d35fedd257051333b4ca81d1a25a37a9af4891f1fec2869edd56b14180eafbda8851d63138a724c9b15384bc5f0536de658bd294d426a36212e6f08a5209e2849b90a2353691fccedd467215c88eec89a5d0dcf468e6cf37abed344d746ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c5e7b200a20202270223a20226272632d3230222c0a2020226f70223a20226465706c6f79222c0a2020227469636b223a20226f726469222c0a2020226d6178223a20223231303030303030222c0a2020226c696d223a202231303030220a7d6821c19e2849b90a2353691fccedd467215c88eec89a5d0dcf468e6cf37abed344d74600000000"; + let tx_bytes = hex::decode(&raw_tx).unwrap(); + let interlay_transaction = parse_transaction(&tx_bytes).unwrap(); + + let rust_bitcoin_transaction = interlay_transaction.to_rust_bitcoin().unwrap(); + let inscriptions = Inscription::from_transaction(&rust_bitcoin_transaction); + let expected = "{ \n \"p\": \"brc-20\",\n \"op\": \"deploy\",\n \"tick\": \"ordi\",\n \"max\": \"21000000\",\n \"lim\": \"1000\"\n}"; + + assert_eq!(inscriptions.len(), 1); + let body_bytes = inscriptions[0].clone().inscription.into_body().unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + assert_eq!(body, expected); + } + + #[test] + fn test_parse_transfer() { + let s = r#"{"p": "brc-21", "a": "12", "tick": "ticker", "op": "transfer", "amt": "25"}"#; + let parsed: Brc21 = serde_json::from_str(s).unwrap(); + let expected = Brc21{ + op: Brc21Operation::Transfer { amt: 25 }, + tick: "ticker" + }; + assert_eq!(parsed, expected); + } + + #[test] + fn test_parse_redeem() { + let s = r#"{"p": "brc-21", "a": "12", "tick": "ticker", "op": "redeem", "acc": "someAccount", "amt": "10", "dest": "someDest"}"#; + let parsed: Brc21 = serde_json::from_str(s).unwrap(); + let expected = Brc21{ + op: Brc21Operation::Redeem { acc: "someAccount", amt: 10, dest: "someDest" }, + tick: "ticker" + }; + assert_eq!(parsed, expected); + } + + #[test] + fn test_parse_mint() { + let s = r#"{"p": "brc-21", "a": "12", "tick": "ticker", "op": "mint", "src": "someSource", "amt": "10"}"#; + let parsed: Brc21 = serde_json::from_str(s).unwrap(); + let expected = Brc21{ + op: Brc21Operation::Mint { amt: 10, src: "someSource" }, + tick: "ticker" + }; + assert_eq!(parsed, expected); + } + + #[test] + fn test_parse_deploy() { + let s = r#"{"p": "brc-21", "a": "12", "tick": "ticker", "op": "deploy","id":"myId", "src": "someSource", "max": "10"}"#; + let parsed: Brc21 = serde_json::from_str(s).unwrap(); + let expected = Brc21{ + op: Brc21Operation::Deploy { id: "myId", max: 10, src: "someSource" }, + tick: "ticker" + }; + assert_eq!(parsed, expected); + } +} diff --git a/contracts/btc_swap/lib.rs b/contracts/btc_swap/lib.rs index a97ea4fbb8..b8b6092809 100755 --- a/contracts/btc_swap/lib.rs +++ b/contracts/btc_swap/lib.rs @@ -1,7 +1,15 @@ #![cfg_attr(not(feature = "std"), no_std, no_main)] -use bitcoin::types::{FullTransactionProof, MerkleProof, Transaction}; +use bitcoin::{ + compat::ConvertFromInterlayBitcoin, + types::{FullTransactionProof, Transaction}, +}; +use brc21::{Brc21, Brc21Operation}; use ink::{env::Environment, prelude::vec::Vec}; + use ord::Inscription; + +mod brc21; +mod ord; #[derive(Debug, Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] @@ -128,5 +136,48 @@ mod btc_swap { self.env().transfer(caller, order.plancks).unwrap(); } + + #[ink(message)] + pub fn brc21_test(&mut self, interlay_tx: Transaction) { + let tx = interlay_tx.to_rust_bitcoin().unwrap(); + let has_taproot_outputs = tx.output.iter().any(|x| x.script_pubkey.is_v1_p2tr()); + if has_taproot_outputs { + self.env().transfer(self.env().caller(), 1).unwrap(); + } else { + self.env().transfer(self.env().caller(), 2).unwrap(); + } + + let inscriptions = Inscription::from_transaction(&tx); + + let body_bytes = inscriptions[0].clone().inscription.into_body().unwrap(); + let parsed: Brc21 = serde_json::from_slice(&body_bytes).unwrap(); + + match parsed { + Brc21 { + op: Brc21Operation::Transfer { amt }, + tick, + } => { + todo!() + } + Brc21 { + op: Brc21Operation::Mint { amt, src }, + tick, + } => { + todo!() + } + Brc21 { + op: Brc21Operation::Redeem { acc, amt, dest }, + tick, + } => { + todo!() + } + Brc21 { + op: Brc21Operation::Deploy { id, max, src }, + tick, + } => { + todo!() + } + } + } } } diff --git a/contracts/btc_swap/ord.rs b/contracts/btc_swap/ord.rs new file mode 100644 index 0000000000..f590709fea --- /dev/null +++ b/contracts/btc_swap/ord.rs @@ -0,0 +1,212 @@ +use bitcoin::compat::rust_bitcoin::{ + blockdata::{ + opcodes, + script::{self, Instruction, Instructions}, + }, + taproot::TAPROOT_ANNEX_PREFIX, + ScriptBuf, Witness, + Transaction as RustBitcoinTransaction +}; +use ink::prelude::vec::Vec; +use core::iter::Peekable; +use ink::prelude::collections::BTreeMap; + +const PROTOCOL_ID: [u8; 3] = *b"ord"; +const BODY_TAG: [u8; 0] = []; +const CONTENT_TYPE_TAG: [u8; 1] = [1]; + + +#[derive(Debug, PartialEq, Clone)] +pub(crate) struct Inscription { + body: Option>, + content_type: Option>, +} + +#[derive(Debug, PartialEq, Clone)] +pub(crate) struct TransactionInscription { + pub(crate) inscription: Inscription, + pub(crate) tx_in_index: u32, + pub(crate) tx_in_offset: u32, +} + +impl Inscription { + pub(crate) fn from_transaction(tx: &RustBitcoinTransaction) -> Vec { + let mut result = Vec::new(); + for (index, tx_in) in tx.input.iter().enumerate() { + let Ok(inscriptions) = InscriptionParser::parse(&tx_in.witness) else { continue }; + + result.extend( + inscriptions + .into_iter() + .enumerate() + .map(|(offset, inscription)| TransactionInscription { + inscription, + tx_in_index: u32::try_from(index).unwrap(), + tx_in_offset: u32::try_from(offset).unwrap(), + }) + .collect::>(), + ) + } + + result + } + + pub(crate) fn into_body(self) -> Option> { + self.body + } +} + +#[derive(Debug, PartialEq)] +pub(crate) enum InscriptionError { + EmptyWitness, + InvalidInscription, + KeyPathSpend, + NoInscription, + Script(script::Error), + UnrecognizedEvenField, +} + +type Result = core::result::Result; + +#[derive(Debug)] +struct InscriptionParser<'a> { + instructions: Peekable>, +} + +impl<'a> InscriptionParser<'a> { + fn parse(witness: &Witness) -> Result> { + if witness.is_empty() { + return Err(InscriptionError::EmptyWitness); + } + + if witness.len() == 1 { + return Err(InscriptionError::KeyPathSpend); + } + + let annex = witness + .last() + .and_then(|element| element.first().map(|byte| *byte == TAPROOT_ANNEX_PREFIX)) + .unwrap_or(false); + + if witness.len() == 2 && annex { + return Err(InscriptionError::KeyPathSpend); + } + + let script = witness + .iter() + .nth(if annex { witness.len() - 1 } else { witness.len() - 2 }) + .unwrap(); + + InscriptionParser { + instructions: ScriptBuf::from(Vec::from(script)).instructions().peekable(), + } + .parse_inscriptions() + .into_iter() + .collect() + } + + fn parse_inscriptions(&mut self) -> Vec> { + let mut inscriptions = Vec::new(); + loop { + let current = self.parse_one_inscription(); + if current == Err(InscriptionError::NoInscription) { + break; + } + inscriptions.push(current); + } + + inscriptions + } + + fn parse_one_inscription(&mut self) -> Result { + self.advance_into_inscription_envelope()?; + let mut fields = BTreeMap::new(); + + loop { + match self.advance()? { + Instruction::PushBytes(tag) if tag.as_bytes() == BODY_TAG.as_slice() => { + let mut body = Vec::new(); + while !self.accept(&Instruction::Op(opcodes::all::OP_ENDIF))? { + body.extend_from_slice(self.expect_push()?); + } + fields.insert(BODY_TAG.as_slice(), body); + break; + } + Instruction::PushBytes(tag) => { + if fields.contains_key(tag.as_bytes()) { + return Err(InscriptionError::InvalidInscription); + } + fields.insert(tag.as_bytes(), self.expect_push()?.to_vec()); + } + Instruction::Op(opcodes::all::OP_ENDIF) => break, + _ => return Err(InscriptionError::InvalidInscription), + } + } + + let body = fields.remove(BODY_TAG.as_slice()); + let content_type = fields.remove(CONTENT_TYPE_TAG.as_slice()); + + for tag in fields.keys() { + if let Some(lsb) = tag.first() { + if lsb % 2 == 0 { + return Err(InscriptionError::UnrecognizedEvenField); + } + } + } + + Ok(Inscription { body, content_type }) + } + + fn advance(&mut self) -> Result> { + self.instructions + .next() + .ok_or(InscriptionError::NoInscription)? + .map_err(InscriptionError::Script) + } + + fn advance_into_inscription_envelope(&mut self) -> Result<()> { + loop { + if self.match_instructions(&[ + Instruction::PushBytes((&[]).into()), // represents an OF_FALSE + Instruction::Op(opcodes::all::OP_IF), + Instruction::PushBytes((&PROTOCOL_ID).into()), + ])? { + break; + } + } + + Ok(()) + } + + fn match_instructions(&mut self, instructions: &[Instruction]) -> Result { + for instruction in instructions { + if &self.advance()? != instruction { + return Ok(false); + } + } + + Ok(true) + } + + fn expect_push(&mut self) -> Result<&'a [u8]> { + match self.advance()? { + Instruction::PushBytes(bytes) => Ok(bytes.as_bytes()), + _ => Err(InscriptionError::InvalidInscription), + } + } + + fn accept(&mut self, instruction: &Instruction) -> Result { + match self.instructions.peek() { + Some(Ok(next)) => { + if next == instruction { + self.advance()?; + Ok(true) + } else { + Ok(false) + } + } + Some(Err(err)) => Err(InscriptionError::Script(*err)), + None => Ok(false), + } + } +} diff --git a/contracts/btc_swap/target/ink/btc_swap.json b/contracts/btc_swap/target/ink/btc_swap.json index 753fe50733..4f2b49ac8d 100644 --- a/contracts/btc_swap/target/ink/btc_swap.json +++ b/contracts/btc_swap/target/ink/btc_swap.json @@ -1,6 +1,6 @@ { "source": { - "hash": "0x17df59e4cc35a3991615a3d38bf4ac245a3d8aa81a21f5042b8fd8dce8c461f6", + "hash": "0xa92429845f5910fef699820c0536c95e0ff141c4a435c5da19112b4d03e86497", "language": "ink! 4.2.1", "compiler": "rustc 1.69.0-nightly", "build_info": { diff --git a/contracts/btc_swap/target/ink/btc_swap.wasm b/contracts/btc_swap/target/ink/btc_swap.wasm index 24aae54bc9809a27206225d4cb81f64d2bc8b3ff..cc6e2d87439d580d823b89235007a6f8f70c4471 100644 GIT binary patch delta 67459 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 delta 1061 zcmY*YO-NKx6h7zP`{q68&DhgQoas&7dHys?1tQFVo4kPo<3fXqib4u4;yGZnixxh? zg$o1g8HF*6BEdxqWj5|?)6Y_+g`2`n5Y;N87GZSmv$1h=&-v~-_q*qu``uq#;?sq> zKSk#7tP}ts0BN-V(P%Ir0&(ELc?@GQ3nx(pfw0XcCPuH9%g`1ZyK%cbaTnU-^XFuB z04I#nY#=16gzpFm>V6=)01ANQH~8w&KL`Yyd{wD~t-g9u2Z<%zi7kXX@te&KNG8!a zKr4`Kw3oss=IKF0@=}sQIR@F7Hgqrfo+-IwWeG^i7|-i%$))M%8AvfeCqVK%v&aY? z1R1Nk)^Egg*cyLd9kqKIy5ZyGD!SFPjoX||PxDAa%XA<#J5}I&TmoIKW~j);BUe&n zHKk^*1<_V?AWXS#6SbnC4?tmpc6DP#x07o-;r2!LrRzm@!#x#QmKou56d%nLE-lbd z5DHw6Y|HS~^E&*I@X{_u9bXQpqad1+YNyVp$yE>k9e8J`2Z1;VkVQr0)$f@yw$-!0 zGWWB;Ax!My)UlSy8p*P$FVQ6YKif(ms52?lp;FSI8&~OIJ@FdhXEZ&4JVY~6sd0}g z-B%tl@0GVm8p|3)XqA#$MayA}e5)r@-In(dQ{h!FT}qM4NHlmyf^#szY=Sd1eNf!d zp>6PM2~Ju+OpcA|<(6|;7h6jPCl#)F=OxKH&#sYDu#5K>bn2NPzyh149sOq2-nLDQ z9>?mKCw){pDjC|&vvpI;Qmvc5$D9m#pABD<7hde#jPg$$f89@+6rn#s!pX4&6*(2) zu$H0{!=hhbK-yAIKm7b*6qC$WsL+vMgY9G^#q{JVTyK3n^4)_g-Cm=eK!`rNu)ZF>{1;X# B*-!ug