From 387e990543314a48b3698a84ac0982ec5c060114 Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Sun, 21 Jan 2024 23:15:52 -0500 Subject: [PATCH] Inscription Example --- plugin-example/Cargo.toml | 3 +- plugin-example/ordinal-inscription/Cargo.toml | 60 ++++++++++ plugin-example/ordinal-inscription/README.md | 6 + .../ordinal-inscription/src/logo.png | Bin 0 -> 32878 bytes .../ordinal-inscription/src/plugin.rs | 109 ++++++++++++++++++ 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 plugin-example/ordinal-inscription/Cargo.toml create mode 100644 plugin-example/ordinal-inscription/README.md create mode 100644 plugin-example/ordinal-inscription/src/logo.png create mode 100644 plugin-example/ordinal-inscription/src/plugin.rs diff --git a/plugin-example/Cargo.toml b/plugin-example/Cargo.toml index 7812c5c4..c671bce9 100644 --- a/plugin-example/Cargo.toml +++ b/plugin-example/Cargo.toml @@ -17,4 +17,5 @@ members = ["treepay" , "nft-auction" , "clause-module" , "clause-module-trampoline" - , "ordinal-example"] + , "ordinal-example" + , "ordinal-inscription"] diff --git a/plugin-example/ordinal-inscription/Cargo.toml b/plugin-example/ordinal-inscription/Cargo.toml new file mode 100644 index 00000000..5b1e4e82 --- /dev/null +++ b/plugin-example/ordinal-inscription/Cargo.toml @@ -0,0 +1,60 @@ +[package] +name = "sapio-wasm-ordinal-inscription" +version = "0.1.0" +license = "MPL-2.0" +authors = ["Jeremy Rubin "] +edition = "2021" +repository = "https://github.com/sapio-lang/sapio" +homepage = "https://sapio-lang.org" +description = "An Example Sapio Application" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] +path = "src/plugin.rs" +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[dependencies] +serde_json = "1.0" +serde = "1.0" +serde_derive = "1.0" + + +[dependencies.schemars] +version = "0.8.0" +features = ['impl_json_schema'] +[dependencies.bitcoin] +package = "sapio-bitcoin" +version = "0.28.0" +features = ['use-serde'] +[dependencies.sapio] +path = "../../sapio" +version = "0.2.0" + +[dependencies.batching-trait] +path = "../batching-trait" +version = "0.1.0" + +[dependencies.sapio-base] +path = "../../sapio-base" +version = "0.2.0" +[dependencies.sapio-contrib] +path = "../../sapio-contrib" +version = "0.2.0" + + +[dependencies.sapio-ctv-emulator-trait] +path = "../../emulator-trait" +version = "0.2.0" + + +[dependencies.sapio-wasm-plugin] +path = "../../plugins" +version = "0.2.0" +features = ["client"] + +[dependencies.sapio-wasm-nft-trait] +path = "../nft-trait" +version = "0.1.0" diff --git a/plugin-example/ordinal-inscription/README.md b/plugin-example/ordinal-inscription/README.md new file mode 100644 index 00000000..acabbf6d --- /dev/null +++ b/plugin-example/ordinal-inscription/README.md @@ -0,0 +1,6 @@ +# Sapio Vault Example + +This crate can be compiled with `wasm-pack build`. The `*.wasm` artifact will +be created in the `pkg` directory, not in `target`. + +Feel free to modify this code to experiment with creating your own Sapio plugins. diff --git a/plugin-example/ordinal-inscription/src/logo.png b/plugin-example/ordinal-inscription/src/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d3bd711deed5707b1dec9cfa6b5c7e53a3fc7553 GIT binary patch literal 32878 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 N3NlL4WpBR({11nOgpB|I literal 0 HcmV?d00001 diff --git a/plugin-example/ordinal-inscription/src/plugin.rs b/plugin-example/ordinal-inscription/src/plugin.rs new file mode 100644 index 00000000..bdd80c1d --- /dev/null +++ b/plugin-example/ordinal-inscription/src/plugin.rs @@ -0,0 +1,109 @@ +use bitcoin::util::amount::Amount; +use bitcoin::Address; +use bitcoin::XOnlyPublicKey; +use sapio::contract::CompilationError; +use sapio::contract::Compiled; +use sapio::contract::Contract; +use sapio::contract::StatefulArgumentsTrait; +use sapio::ordinals::OrdinalPlanner; +use sapio::util::amountrange::AmountU64; +use sapio::*; +use sapio_base::Clause; +use sapio_wasm_plugin::*; +use schemars::*; +use serde::*; +/// # SimpleInscription +/// A really Ordinal Bearing Contract +#[derive(JsonSchema, Serialize, Deserialize)] +pub struct InscribingStep { + #[schemars(with = "bitcoin::hashes::sha256::Hash")] + owner: XOnlyPublicKey, + data: Vec, + content_type: String, +} +impl InscribingStep { + /// # signed + /// Get the current owners signature. + #[guard] + fn signed(self, _ctx: Context) { + Clause::Key(self.owner) + } + + #[guard] + fn inscription(self, _ctx: Context) { + let insc = sapio_base::miniscript::ord::Inscription::new( + Some(self.content_type.as_bytes().into()), + Some(self.data.clone()), + ); + Clause::Inscribe(Box::new(insc), Box::new(Clause::Trivial)) + } +} + +#[derive(JsonSchema, Serialize, Deserialize)] +pub struct Reveal { + fee: AmountU64, + alternative: Option
, +} +impl Reveal { + fn parse( + k: ::StatefulArguments, + ) -> Result { + Ok(k) + } +} +impl Default for Reveal { + fn default() -> Self { + Self { + fee: Amount::from_sat(500).into(), + alternative: None, + } + } +} +// ASSUMES 500 sats after Ord are "dust" +impl InscribingStep { + #[continuation( + guarded_by = "[Self::signed, Self::inscription]", + web_api, + coerce_args = "Reveal::parse" + )] + fn reveal(self, ctx: Context, reveal: Reveal) { + let ord = ctx + .get_ordinals() + .as_ref() + .ok_or_else(|| CompilationError::OrdinalsError("Missing Ordinals Info".into()))? + .0[0] + .0; + let funds = ctx.funds(); + if funds < Amount::from(reveal.fee) + ord.padding() + Amount::ONE_SAT { + return Err(CompilationError::OutOfFunds); + } + let send_with = funds - reveal.fee.into(); + let tmpl = ctx.template(); + if let Some(address) = reveal.alternative { + tmpl.add_output(send_with, &Compiled::from_address(address, None), None) + } else { + tmpl.add_output(send_with, &self.owner, None) + }? + .add_fees(reveal.fee.into())? + .into() + } +} +impl StatefulArgumentsTrait for Reveal {} + +/// # The SimpleInscription Contract +impl Contract for InscribingStep { + declare! {updatable, Self::reveal} + + fn ensure_amount(&self, ctx: Context) -> Result { + // Optional if we want to require ordinal info provided -- we can + // happily track ordinals abstractly with some future patches. + let ords = ctx + .get_ordinals() + .as_ref() + .ok_or_else(|| CompilationError::OrdinalsError("Missing Ordinals Info".into()))?; + Ok(ords.total()) + } +} + + +REGISTER![InscribingStep, "logo.png"];