From 5bf1ca3cb3ace11fe14eb749a3e78b0b5f5657af Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 11 Dec 2023 00:53:56 +0100 Subject: [PATCH] wip on moving transfers to std lib --- Cargo.lock | 380 ++++++++++++++++++++++++++++++++---------------- Cargo.toml | 7 + cli/Cargo.toml | 1 - psbt/Cargo.toml | 14 +- psbt/src/lib.rs | 74 ++++++++-- src/pay.rs | 168 +++------------------ 6 files changed, 354 insertions(+), 290 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2615c0e..299bcfc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -124,9 +124,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" dependencies = [ "anstyle", "anstyle-parse", @@ -144,30 +144,30 @@ checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -369,6 +369,17 @@ dependencies = [ "ureq", ] +[[package]] +name = "bp-invoice" +version = "0.11.0-beta.2" +source = "git+https://github.com/BP-WG/bp-std?branch=v0.11#664fa950efcb5bb653c9af4238c64e0610447200" +dependencies = [ + "amplify", + "bech32", + "bitcoin_hashes", + "bp-consensus", +] + [[package]] name = "bp-seals" version = "0.11.0-beta.1" @@ -486,14 +497,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] name = "clap" -version = "4.4.8" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", "clap_derive", @@ -501,9 +512,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.8" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", @@ -564,6 +575,16 @@ dependencies = [ "strict_types", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + [[package]] name = "constant_time_eq" version = "0.3.0" @@ -572,9 +593,9 @@ checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -582,9 +603,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" @@ -657,9 +678,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" dependencies = [ "powerfmt", "serde", @@ -705,7 +726,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -744,12 +765,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -800,9 +821,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -871,9 +892,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "h2" @@ -911,9 +932,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" @@ -952,9 +973,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -1047,9 +1068,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1073,7 +1094,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "serde", ] @@ -1091,20 +1112,20 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1134,9 +1155,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "log" @@ -1167,13 +1188,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1224,15 +1245,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.59" +version = "0.10.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -1262,9 +1283,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.95" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", @@ -1286,9 +1307,9 @@ checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" @@ -1322,9 +1343,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -1344,6 +1365,21 @@ dependencies = [ "serde", ] +[[package]] +name = "psbt-rgb" +version = "0.11.0-alpha.2" +dependencies = [ + "amplify", + "baid58", + "bp-std", + "getrandom", + "psbt", + "rand", + "rgb-std", + "wasm-bindgen", + "wasm-bindgen-test", +] + [[package]] name = "quote" version = "1.0.33" @@ -1494,17 +1530,20 @@ dependencies = [ [[package]] name = "rgb-invoice" -version = "0.11.0-alpha.2" +version = "0.11.0-beta.2" +source = "git+https://github.com/RGB-WG/rgb-std?branch=v0.11#a5baa8964039abb3ef639f5ba449fd3f5de043cf" dependencies = [ "amplify", "baid58", - "bp-seals", - "bp-std", + "bp-core", + "bp-invoice", "fluent-uri", "indexmap 2.1.0", "percent-encoding", - "rgb-std", + "rgb-core", + "serde", "strict_encoding", + "strict_types", ] [[package]] @@ -1531,7 +1570,6 @@ dependencies = [ "indexmap 2.1.0", "log", "psbt", - "rgb-invoice", "rgb-persist-fs", "rgb-std", "serde", @@ -1542,8 +1580,7 @@ dependencies = [ [[package]] name = "rgb-std" version = "0.11.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e322467d948a5695007dfb2e25b6a33bd05cb28339a61b4cca6ba6b55d6513d2" +source = "git+https://github.com/RGB-WG/rgb-std?branch=v0.11#a5baa8964039abb3ef639f5ba449fd3f5de043cf" dependencies = [ "amplify", "baid58", @@ -1554,6 +1591,7 @@ dependencies = [ "getrandom", "indexmap 2.1.0", "rgb-core", + "rgb-invoice", "serde", "strict_encoding", "strict_types", @@ -1576,7 +1614,6 @@ dependencies = [ "env_logger", "log", "psbt", - "rgb-invoice", "rgb-runtime", "rgb-std", "serde", @@ -1589,16 +1626,16 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", "getrandom", "libc", "spin", "untrusted", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1618,22 +1655,22 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" dependencies = [ "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", @@ -1653,9 +1690,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "schannel" @@ -1663,9 +1700,15 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "sct" version = "0.7.1" @@ -1694,7 +1737,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2acea373acb8c21ecb5a23741452acd2593ed44ee3d343e72baaa143bc89d0d5" dependencies = [ "rand", - "secp256k1-sys 0.9.0", + "secp256k1-sys 0.9.1", "serde", ] @@ -1709,9 +1752,9 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e67c467c38fd24bd5499dc9a18183b31575c12ee549197e3e20d57aa4fe3b7" +checksum = "4dd97a086ec737e30053fd5c46f097465d25bb81dd3608825f65298c4c98be83" dependencies = [ "cc", ] @@ -1764,18 +1807,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -1921,7 +1964,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2054,7 +2097,7 @@ dependencies = [ "fastrand", "redox_syscall", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2132,9 +2175,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" dependencies = [ "backtrace", "bytes", @@ -2142,7 +2185,7 @@ dependencies = [ "mio", "pin-project-lite", "socket2 0.5.5", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2242,9 +2285,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" @@ -2254,9 +2297,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" @@ -2287,9 +2330,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3" +checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" dependencies = [ "base64", "flate2", @@ -2306,9 +2349,9 @@ dependencies = [ [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -2350,9 +2393,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2360,9 +2403,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", @@ -2375,9 +2418,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -2387,9 +2430,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2397,9 +2440,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", @@ -2410,15 +2453,40 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cf9242c0d27999b831eae4767b2a146feb0b27d332d553e605864acd2afd403" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794645f5408c9a039fd09f4d113cdfb2e7eba5ff1956b07bcf701cf4b394fe89" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -2426,9 +2494,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "winapi" @@ -2467,7 +2535,7 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2476,7 +2544,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -2485,13 +2562,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -2500,47 +2592,89 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" dependencies = [ "memchr", ] @@ -2552,5 +2686,5 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] diff --git a/Cargo.toml b/Cargo.toml index b7327f1..8ece532 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,12 @@ [workspace] members = [ + "psbt", "cli", "fs", "." ] default-members = [ + "psbt", "cli", "fs", "." @@ -84,3 +86,8 @@ serde = ["serde_crate", "serde_yaml", "bp-std/serde", "bp-wallet/serde",] [package.metadata.docs.rs] features = [ "all" ] + +[patch.crates-io] +bp-invoice = { git = "https://github.com/BP-WG/bp-std", branch = "v0.11" } +rgb-std = { git = "https://github.com/RGB-WG/rgb-std", branch = "v0.11" } +rgb-invoice = { git = "https://github.com/RGB-WG/rgb-std", branch = "v0.11" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index b0c334f..a2e7e71 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -28,7 +28,6 @@ bp-esplora = { workspace = true } bp-util = { workspace = true } psbt = { workspace = true } rgb-std = { workspace = true, features = ["serde"] } -rgb-invoice = { version = "0.11.0-alpha.2", path = "../invoice" } rgb-runtime = { version = "0.11.0-alpha.2", path = "..", features = ["log", "serde"] } log = { workspace = true } env_logger = "0.10.1" diff --git a/psbt/Cargo.toml b/psbt/Cargo.toml index 921b443..1aeebb8 100644 --- a/psbt/Cargo.toml +++ b/psbt/Cargo.toml @@ -1,8 +1,8 @@ [package] -name = "psbt-" -version = "0.10.10" -description = "RGB smart contract invoicing library" -keywords = ["bitcoin", "invoices", "rgb", "smart-contracts", "lnp-bp"] +name = "psbt-rgb" +version = { workspace = true } +description = "Partially signed bitcoin transaction RGB extensions" +keywords = ["bitcoin", "invoices", "rgb", "smart-contracts", "psbt"] categories = ["cryptography::cryptocurrencies"] authors = { workspace = true } repository = { workspace = true } @@ -13,15 +13,15 @@ rust-version = { workspace = true } readme = "../README.md" [lib] -name = "rgbpsbt" +name = "psbt" crate-type = ["cdylib", "rlib"] # We need this for WASM [dependencies] amplify = { workspace = true } baid58 = { workspace = true } bp-std = { workspace = true } -psbt = "=0.10.0-BP-beta.1" -rgb-std = { version = "0.10.10", path = "../std" } +psbt = { workspace = true } +rgb-std = { workspace = true } [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2" diff --git a/psbt/src/lib.rs b/psbt/src/lib.rs index 7d12d9a..78b51e2 100644 --- a/psbt/src/lib.rs +++ b/psbt/src/lib.rs @@ -1,14 +1,70 @@ -pub fn add(left: usize, right: usize) -> usize { - left + right +// Partially signed bitcoin transaction RGB extensions +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2020-2023 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2019-2023 LNP/BP Standards Association. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::collections::HashMap; + +use bpstd::secp256k1::serde::{Deserialize, Serialize}; +use psbt::Psbt; +use rgbstd::{AnchoredBundle, ContractId, Outpoint, Transition}; + +/// A batch of state transitions under different contracts which are associated +/// with some specific transfer and will be anchored within a single layer 1 +/// transaction. +#[derive(Clone, PartialEq, Eq, Hash, Debug, Default)] +pub struct Batch { + pub transitions: Vec, +} + +/// Structure exported from a PSBT for merging into the stash. It contains a set +/// of finalized state transitions, packed into bundles, and anchored to a +/// single layer 1 transaction. +#[derive(Clone, PartialEq, Eq, Hash, Debug, Default)] +pub struct Fascia { + pub bundles: Vec, } -#[cfg(test)] -mod tests { - use super::*; +pub enum EmbedError {} +pub enum ExtractError {} - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); +pub trait RgbPsbt { + fn rgb_embed(&mut self, batch: Batch) -> Result<(), EmbedError>; + fn rgb_extract(&mut self) -> Result; +} + +impl RgbPsbt for Psbt { + fn rgb_embed(&mut self, batch: Batch) -> Result<(), EmbedError> { + let mut contract_inputs = HashMap::>::new(); + + contract_inputs.entry(id).or_default().push(output); + for (op_id, transition) in batch { + for input in self.inputs_mut() { + let outpoint = input.prevout().outpoint(); + if inputs.contains(&outpoint) { + input.set_rgb_consumer(transition.contract_id, op_id)?; + } + } + self.push_rgb_transition(transition)?; + } + Ok(()) } + + fn rgb_extract(&mut self) -> Result {} } diff --git a/src/pay.rs b/src/pay.rs index dcf423f..e9af350 100644 --- a/src/pay.rs +++ b/src/pay.rs @@ -19,19 +19,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::cmp::Ordering; -use std::collections::{BTreeMap, HashMap}; +use std::collections::HashMap; use std::convert::Infallible; -use std::error::Error; use std::iter; use bp::seals::txout::CloseMethod; -use bp::{Outpoint, Txid}; -use chrono::Utc; +use bp::Vout; use psbt::Psbt; -use rgbinvoice::{Beneficiary, RgbInvoice}; use rgbstd::containers::{Bindle, BuilderSeal, Transfer}; use rgbstd::interface::{BuilderError, ContractSuppl, TypedState, VelocityHint}; +use rgbstd::invoice::{Beneficiary, RgbInvoice}; use rgbstd::persistence::{ConsignerError, Inventory, InventoryError, Stash}; use rgbstd::{ AssignmentType, ContractId, GraphSeal, Operation, Opout, SealDefinition, @@ -78,39 +75,18 @@ pub struct Payment { impl Runtime { pub fn pay(&mut self, invoice: RgbInvoice, method: CloseMethod) -> Result { - // 1. Prepare the data - if let Some(expiry) = invoice.expiry { - if expiry < Utc::now().timestamp() { - return Err(PayError::InvoiceExpired); - } - } - let contract_id = invoice.contract.ok_or(PayError::NoContract)?; - let iface = invoice.iface.ok_or(PayError::NoIface)?; - let mut main_builder = - self.transition_builder(contract_id, iface.clone(), invoice.operation)?; - // 2. Construct PSBT - - let (beneficiary_output, beneficiary) = match invoice.beneficiary { - Beneficiary::BlindedSeal(seal) => { - let seal = BuilderSeal::Concealed(seal); - (None, seal) - } - Beneficiary::WitnessUtxo(addr) => { - let vout = psbt - .outputs() - .position(|out| out.script == addr.script_pubkey()) - .ok_or(PayError::NoBeneficiaryOutput)?; - let seal = BuilderSeal::Revealed(SealDefinition::Bitcoin(GraphSeal::new_vout( - method, vout, - ))); - (Some(vout), seal) - } + let beneficiary_output = match invoice.beneficiary { + Beneficiary::BlindedSeal(seal) => None, + Beneficiary::WitnessUtxo(addr) => psbt + .outputs() + .position(|out| out.script == addr.script_pubkey()) + .ok_or(PayError::NoBeneficiaryOutput)?, }; let prev_outpoints = psbt.inputs().map(|inp| inp.prevout().outpoint()); // Classify PSBT outputs which can be used for assignments - let mut out_classes = HashMap::>::new(); + let mut out_classes = HashMap::>::new(); for (no, outp) in psbt.outputs().enumerate() { if beneficiary_output == Some(no) { continue; @@ -135,14 +111,11 @@ impl Runtime { .into_iter() .map(|(class, indexes)| (class, indexes.into_iter().cycle())) .collect::>(); - let mut output_for_assignment = |suppl: Option<&ContractSuppl>, - assignment_type: AssignmentType| - -> Result, PayError> { - let velocity = suppl - .and_then(|suppl| suppl.owned_state.get(&assignment_type)) - .map(|s| s.velocity) - .unwrap_or_default(); - let vout = out_classes + let allocator = |id: ContractId, + assignment_type: AssignmentType, + velocity: VelocityHint| + -> Option { + out_classes .get_mut(&velocity) .and_then(iter::Cycle::next) .or_else(|| { @@ -150,120 +123,15 @@ impl Runtime { .get_mut(&VelocityHint::default()) .and_then(iter::Cycle::next) }) - .ok_or(PayError::NoBlankOrChange(velocity, assignment_type))?; - let seal = GraphSeal::new_vout(method, vout); - Ok(BuilderSeal::Revealed(SealDefinition::Bitcoin(seal))) - }; - - // 2. Prepare and self-consume transition - let assignment_name = invoice - .assignment - .as_ref() - .or_else(|| main_builder.default_assignment().ok()) - .ok_or(BuilderError::NoDefaultAssignment)?; - let assignment_id = main_builder - .assignments_type(assignment_name) - .ok_or(BuilderError::InvalidStateField(assignment_name.clone()))?; - // TODO: select supplement basing on the signer trust level - let suppl = self - .contract_suppl(contract_id) - .and_then(|set| set.first()) - .cloned(); - let mut sum_inputs = 0u64; - for (opout, state) in self.state_for_outputs(contract_id, prev_outpoints)? { - main_builder = main_builder.add_input(opout)?; - if opout.ty != assignment_id { - let seal = output_for_assignment(suppl.as_ref(), opout.ty)?; - main_builder = main_builder.add_raw_state(opout.ty, seal, state)?; - } else if let TypedState::Amount(value, _) = state { - sum_inputs += value; - } - } - // Add change - let transition = match invoice.owned_state { - TypedState::Amount(amt) => { - match sum_inputs.cmp(&amt) { - Ordering::Greater => { - let seal = output_for_assignment(suppl.as_ref(), assignment_id)?; - let change = TypedState::Amount(sum_inputs - amt); - main_builder = main_builder.add_raw_state(assignment_id, seal, change)?; - } - Ordering::Less => return Err(PayError::InsufficientState), - Ordering::Equal => {} - } - main_builder - .add_raw_state(assignment_id, beneficiary, TypedState::Amount(amt))? - .complete_transition(contract_id)? - } - _ => { - todo!("only TypedState::Amount is currently supported") - } }; - // 3. Prepare other transitions - // Enumerate state - let mut contract_inputs = HashMap::>::new(); - let mut spent_state = HashMap::>::new(); - for outpoint in prev_outpoints { - for id in self.contracts_by_outpoints([outpoint])? { - contract_inputs.entry(id).or_default().push(outpoint); - if id == contract_id { - continue; - } - spent_state - .entry(id) - .or_default() - .extend(self.state_for_outpoints(id, [outpoint])?); - } - } - // Construct blank transitions - let mut other_transitions = HashMap::with_capacity(spent_state.len()); - for (id, opouts) in spent_state { - let mut blank_builder = self.blank_builder(id, iface.clone())?; - // TODO: select supplement basing on the signer trust level - let suppl = self.contract_suppl(id).and_then(|set| set.first()); - - for (opout, state) in opouts { - let seal = output_for_assignment(suppl, opout.ty)?; - blank_builder = blank_builder - .add_input(opout)? - .add_raw_state(opout.ty, seal, state)?; - } - - other_transitions.insert(id, blank_builder.complete_transition(contract_id)?); - } - // 4. Add transitions to PSBT - other_transitions.insert(contract_id, transition); - for (id, transition) in other_transitions { - let inputs = contract_inputs.remove(&id).unwrap_or_default(); - for input in psbt.inputs() { - let outpoint = input.prevout().outpoint(); - if inputs.contains(&outpoint) { - input.set_rgb_consumer(id, transition.id())?; - } - } - psbt.push_rgb_transition(transition)?; - } - // Here we assume the provided PSBT is final: its inputs and outputs will not be - // modified after calling this method. - let bundles = psbt.rgb_bundles()?; - // TODO: Make it two-staged, such that PSBT editing will be allowed by other - // participants as required for multiparty protocols like coinjoin. - psbt.rgb_bundle_to_lnpbp4()?; - let anchor = psbt.dbc_conclude(method)?; - // TODO: Ensure that with PSBTv2 we remove flag allowing PSBT modification. + psbt.rgb_embed(batch)?; - // 4. Prepare transfer + // 5. Prepare transfer let witness_txid = psbt.txid(); - self.consume_anchor(anchor)?; - for (id, bundle) in bundles { - self.consume_bundle(id, bundle, witness_txid.to_byte_array().into())?; - } let beneficiary = match beneficiary { - BuilderSeal::Revealed(seal) => { - BuilderSeal::Revealed(seal.resolve(witness_txid.to_byte_array())) - } + BuilderSeal::Revealed(seal) => BuilderSeal::Revealed(seal.resolve(witness_txid)), BuilderSeal::Concealed(seal) => BuilderSeal::Concealed(seal), }; let transfer = self.stock().transfer(contract_id, [beneficiary])?;