diff --git a/Cargo.lock b/Cargo.lock index bc19260..d302656 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,38 +17,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - -[[package]] -name = "anyhow" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" - -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" - -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - [[package]] name = "arrayvec" version = "0.7.6" @@ -61,29 +29,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "av1-grain" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom 8.0.0", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" -dependencies = [ - "arrayvec", -] - [[package]] name = "bech32" version = "0.11.0" @@ -99,7 +44,7 @@ dependencies = [ "bitflags", "cexpr", "clang-sys", - "itertools", + "itertools 0.12.1", "log", "prettyplease", "proc-macro2", @@ -110,62 +55,24 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "bit_field" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" - [[package]] name = "bitflags" version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" -[[package]] -name = "bitstream-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" - -[[package]] -name = "built" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - [[package]] name = "byte-slice-cast" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" -[[package]] -name = "bytemuck" -version = "1.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - [[package]] name = "cc" version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ - "jobserver", - "libc", "shlex", ] @@ -175,17 +82,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "nom 7.1.3", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", + "nom", ] [[package]] @@ -291,37 +188,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - [[package]] name = "derive_more" version = "2.1.1" @@ -361,53 +227,12 @@ dependencies = [ "linked_list_allocator", ] -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "exr" -version = "1.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fax" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" - [[package]] name = "fdeflate" version = "0.3.7" @@ -436,39 +261,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - -[[package]] -name = "gif" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" -dependencies = [ - "color_quant", - "weezl", -] - [[package]] name = "gif" version = "0.14.2" @@ -485,17 +277,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - [[package]] name = "hashbrown" version = "0.15.4" @@ -508,46 +289,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "image" -version = "0.25.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif 0.13.3", - "image-webp", - "moxcms", - "num-traits", - "png", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-webp" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imgref" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" - [[package]] name = "impl-trait-for-tuples" version = "0.2.3" @@ -566,7 +307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea4eb136482331643291b2e5a41246e3df97d86076cda428dd0b65098a6309be" dependencies = [ "flate2", - "gif 0.14.2", + "gif", "png", "syn 1.0.109", ] @@ -582,21 +323,19 @@ dependencies = [ ] [[package]] -name = "interpolate_name" -version = "0.2.4" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", + "either", ] [[package]] name = "itertools" -version = "0.12.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" dependencies = [ "either", ] @@ -607,22 +346,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "lebe" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" - [[package]] name = "ledger_device_sdk" version = "1.36.0" @@ -658,16 +381,6 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" -[[package]] -name = "libfuzzer-sys" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" -dependencies = [ - "arbitrary", - "cc", -] - [[package]] name = "libloading" version = "0.8.8" @@ -690,25 +403,6 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - [[package]] name = "memchr" version = "2.7.5" @@ -735,7 +429,6 @@ dependencies = [ name = "mintlayer-app" version = "1.0.0" dependencies = [ - "image", "ledger_device_sdk", "mintlayer-app-core", ] @@ -747,6 +440,7 @@ dependencies = [ "bech32", "chrono", "const-hex", + "itertools 0.15.0", "ledger_device_sdk", "ledger_secure_sdk_sys", "mintlayer-core-primitives", @@ -775,25 +469,10 @@ dependencies = [ "num-traits", "num_enum", "parity-scale-codec", + "strum", "test-utils", ] -[[package]] -name = "moxcms" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c588e11a3082784af229e23e8e4ecf5bcc6fbe4f69101e0421ce8d79da7f0b40" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - [[package]] name = "nom" version = "7.1.3" @@ -804,62 +483,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -896,12 +519,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f" -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -926,18 +543,6 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - [[package]] name = "png" version = "0.18.0" @@ -988,25 +593,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "profiling" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" -dependencies = [ - "quote", - "syn 2.0.104", -] - [[package]] name = "proptest" version = "1.11.0" @@ -1015,36 +601,12 @@ checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bitflags", "num-traits", - "rand 0.9.4", - "rand_chacha 0.9.0", + "rand", + "rand_chacha", "rand_xorshift", "unarray", ] -[[package]] -name = "pxfm" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" -dependencies = [ - "num-traits", -] - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - [[package]] name = "quote" version = "1.0.40" @@ -1054,23 +616,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - [[package]] name = "rand" version = "0.9.4" @@ -1080,16 +625,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - [[package]] name = "rand_chacha" version = "0.9.0" @@ -1105,9 +640,6 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] [[package]] name = "rand_core" @@ -1124,76 +656,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand 0.8.6", - "rand_chacha 0.3.1", - "simd_helpers", - "system-deps", - "thiserror", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "regex" version = "1.11.1" @@ -1223,12 +685,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "rgb" -version = "0.8.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -1298,15 +754,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - [[package]] name = "shlex" version = "1.3.0" @@ -1319,21 +766,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - [[package]] name = "static_assertions" version = "1.1.0" @@ -1383,25 +815,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - [[package]] name = "test-utils" version = "1.0.0" @@ -1420,60 +833,11 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "tiff" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" -dependencies = [ - "fax", - "flate2", - "half", - "quick-error", - "weezl", - "zune-jpeg", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - [[package]] name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] [[package]] name = "toml_edit" @@ -1482,8 +846,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", - "serde", - "serde_spanned", "toml_datetime", "winnow", ] @@ -1512,83 +874,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.3+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.122" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.122" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.122" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.104", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.122" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" -dependencies = [ - "unicode-ident", -] - [[package]] name = "weezl" version = "0.1.10" @@ -1675,12 +960,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - [[package]] name = "zerocopy" version = "0.8.49" @@ -1712,27 +991,3 @@ name = "zmij" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" - -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zune-jpeg" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" -dependencies = [ - "zune-core", -] diff --git a/Cargo.toml b/Cargo.toml index b2ff483..958c7bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,11 +15,12 @@ bech32 = { version = "0.11", default-features = false } chrono = { version = "0.4", default-features = false } const-hex = { version = "1.19", default-features = false } derive_more = { version = "2.1", default-features = false } -image = "0.25" +itertools = { version = "0.15", default-features = false } ledger_device_sdk = "1.35" ledger_secure_sdk_sys = "1.16" num_enum = { version = "0.7", default-features = false } num-traits = { version = "0.2", default-features = false } +strum = { version = "0.27", default-features = false } # Note: the testmacro crate is published by Ledger and its source code comes from the `testmacro` # dir inside the sdk repo, i.e. https://github.com/LedgerHQ/ledger-device-rust-sdk/tree/cad196841dbd72c037cfa01bec81a4a3ae57a04e/testmacro # (though the published version is a bit older). @@ -51,9 +52,6 @@ ledger_device_sdk.workspace = true mintlayer-app-core.workspace = true -[build-dependencies] -image.workspace = true - [[bin]] # Note: we only have this section to disable tests, but Cargo insists that "name" should also # be specified. diff --git a/build.rs b/build.rs index 0b997fb..409295a 100644 --- a/build.rs +++ b/build.rs @@ -18,44 +18,8 @@ use std::process::Command; -use image::{ImageFormat, ImageReader, Pixel}; - -// TODO: all image files currently contain the Rust logo; need to replace them with Mintlayer logo. -// See https://github.com/mintlayer/mintlayer-ledger-app/issues/10. - fn main() { println!("cargo:rerun-if-changed=script.ld"); - println!("cargo:rerun-if-changed=media/icons/mintlayer_14x14.gif"); - println!("cargo:rerun-if-changed=media/icons/mask_14x14.gif"); - - let icons_path = std::path::PathBuf::from("media/icons"); - let mut gray = ImageReader::open(icons_path.join("mintlayer_14x14.gif")) - .unwrap() - .decode() - .unwrap() - .into_luma8(); - - // Apply mask - let mask = ImageReader::open(icons_path.join("mask_14x14.gif")) - .unwrap() - .decode() - .unwrap() - .into_luma8(); - - for (x, y, mask_pixel) in mask.enumerate_pixels() { - let mask_value = mask_pixel[0]; - let mut gray_pixel = *gray.get_pixel(x, y); - if mask_value == 0 { - gray_pixel = image::Luma([0]); - } else { - gray_pixel.invert(); - } - gray.put_pixel(x, y, gray_pixel); - } - - let glyph_path = std::path::PathBuf::from("media/glyphs"); - gray.save_with_format(glyph_path.join("home_nano_nbgl.png"), ImageFormat::Png) - .unwrap(); let output = Command::new("git") .args(["rev-parse", "HEAD"]) diff --git a/crates/app-core/Cargo.toml b/crates/app-core/Cargo.toml index 44b98f2..8f3c539 100644 --- a/crates/app-core/Cargo.toml +++ b/crates/app-core/Cargo.toml @@ -7,6 +7,7 @@ edition = "2024" bech32 = { workspace = true, default-features = false, features = ["alloc"] } chrono = { workspace = true, default-features = false, features = ["alloc"] } const-hex = { workspace = true, default-features = false, features = ["alloc"] } +itertools = { workspace = true, default-features = false } ledger_device_sdk.workspace = true ledger_secure_sdk_sys.workspace = true diff --git a/crates/app-core/src/app_ui/address.rs b/crates/app-core/src/app_ui/address.rs index 2eb2577..a16d896 100644 --- a/crates/app-core/src/app_ui/address.rs +++ b/crates/app-core/src/app_ui/address.rs @@ -25,8 +25,9 @@ use mintlayer_messages::{Destination, PublicKey}; use crate::{ StatusWord, - app_ui::utils::{compress_public_key, load_glyph, to_address}, + app_ui::utils::{load_glyph, to_address}, mlcp, + utils::compress_public_key, }; pub fn ui_display_pk( diff --git a/crates/app-core/src/app_ui/sign.rs b/crates/app-core/src/app_ui/sign.rs index 633efdb..1ac6a9a 100644 --- a/crates/app-core/src/app_ui/sign.rs +++ b/crates/app-core/src/app_ui/sign.rs @@ -36,12 +36,13 @@ use mintlayer_messages::{ use crate::{ StatusWord, - app_ui::utils::{ - bech32m_encode, compress_public_key, load_glyph, to_address, to_public_key_hash, - }, + app_ui::utils::{bech32m_encode, load_glyph, to_address}, handlers::sign_tx::{CoinOrTokenId, InputCommand, TxSummaryCollector, TxType}, mlcp, - utils::{make_displayable, make_displayable_str, output_value_with_amount}, + utils::{ + compress_public_key, make_displayable, make_displayable_str, output_value_with_amount, + to_public_key_hash, + }, }; struct FormattedOutput { @@ -64,9 +65,9 @@ pub fn ui_start_streaming_review(review: &NbglStreamingReview) -> bool { pub fn ui_streaming_review_show_input( review: &NbglStreamingReview, input: &InputCommand, - coin: mlcp::CoinType, + coin_type: mlcp::CoinType, ) -> Result { - let input = format_input(input, coin)?; + let input = format_input(input, coin_type)?; let fields = [Field { name: input.name, @@ -84,9 +85,10 @@ pub fn ui_streaming_review_show_input( pub fn ui_streaming_review_show_output( review: &NbglStreamingReview, output: &TxOutput, - coin: mlcp::CoinType, + coin_type: mlcp::CoinType, + is_change: bool, ) -> Result { - let output = format_output(output, coin)?; + let output = format_output(output, coin_type, is_change)?; let fields = [Field { name: output.name, @@ -104,7 +106,7 @@ pub fn ui_streaming_review_show_output( pub fn ui_approve_streaming_review( review: &NbglStreamingReview, tx_summary: &TxSummaryCollector, - coin: mlcp::CoinType, + coin_type: mlcp::CoinType, ) -> Result { let fees = tx_summary.fees_iter().try_fold( String::new(), @@ -115,7 +117,7 @@ pub fn ui_approve_streaming_review( CoinOrTokenId::Coin => writeln!( acc, "{}", - format_coin_amount_with_name(Amount::from_atoms(fee), coin), + format_coin_amount_with_name(Amount::from_atoms(fee), coin_type), ) .map_err(|_| StatusWord::TxDisplayFail)?, @@ -124,7 +126,11 @@ pub fn ui_approve_streaming_review( writeln!( acc, "{}", - format_token_amount_with_name(token_id, Amount::from_atoms(fee), coin)?, + format_token_amount_with_name( + token_id, + Amount::from_atoms(fee), + coin_type + )?, ) .map_err(|_| StatusWord::TxDisplayFail)?; } @@ -136,7 +142,7 @@ pub fn ui_approve_streaming_review( )?; let fields = [Field { - name: "Fees:", + name: "Fees", value: &fees, }]; @@ -241,33 +247,36 @@ pub fn ui_display_message( Ok(review.show(&msg_fields)) } -fn vrf_to_address(key: &VrfPublicKey, coin: mlcp::CoinType) -> Result { - bech32m_encode(coin.vrf_public_key_address_prefix(), &encode(key)) +fn vrf_to_address(key: &VrfPublicKey, coin_type: mlcp::CoinType) -> Result { + bech32m_encode(coin_type.vrf_public_key_address_prefix(), &encode(key)) } fn id_to_address(id: &H256, hrp: &str) -> Result { bech32m_encode(hrp, &id.0) } -fn token_id_to_address(id: &TokenId, coin: mlcp::CoinType) -> Result { - id_to_address(id.hash(), coin.token_id_address_prefix()) +fn token_id_to_address(id: &TokenId, coin_type: mlcp::CoinType) -> Result { + id_to_address(id.hash(), coin_type.token_id_address_prefix()) } -fn pool_id_to_address(id: &PoolId, coin: mlcp::CoinType) -> Result { - id_to_address(id.hash(), coin.pool_id_address_prefix()) +fn pool_id_to_address(id: &PoolId, coin_type: mlcp::CoinType) -> Result { + id_to_address(id.hash(), coin_type.pool_id_address_prefix()) } -fn delegation_id_to_address(id: &DelegationId, coin: mlcp::CoinType) -> Result { - id_to_address(id.hash(), coin.delegation_id_address_prefix()) +fn delegation_id_to_address( + id: &DelegationId, + coin_type: mlcp::CoinType, +) -> Result { + id_to_address(id.hash(), coin_type.delegation_id_address_prefix()) } -fn order_id_to_address(id: &OrderId, coin: mlcp::CoinType) -> Result { - id_to_address(id.hash(), coin.order_id_address_prefix()) +fn order_id_to_address(id: &OrderId, coin_type: mlcp::CoinType) -> Result { + id_to_address(id.hash(), coin_type.order_id_address_prefix()) } /// Format a coin amount as a decimal string. -fn format_coin_amount(amount: Amount, coin: mlcp::CoinType) -> String { - let decimals = coin.coin_decimals() as usize; +fn format_coin_amount(amount: Amount, coin_type: mlcp::CoinType) -> String { + let decimals = coin_type.coin_decimals() as usize; let mantissa = amount.into_atoms(); // ceil(log10(u128::MAX)) + 1 for decimal point = 40 @@ -279,20 +288,20 @@ fn format_coin_amount(amount: Amount, coin: mlcp::CoinType) -> String { } /// Same as format_coin_amount, but also append the coin ticker to the amount. -fn format_coin_amount_with_name(amount: Amount, coin: mlcp::CoinType) -> String { - let mut amount = format_coin_amount(amount, coin); +fn format_coin_amount_with_name(amount: Amount, coin_type: mlcp::CoinType) -> String { + let mut amount = format_coin_amount(amount, coin_type); amount.push(' '); - amount.push_str(coin.coin_ticker()); + amount.push_str(coin_type.coin_ticker()); amount } fn format_token_amount_with_name( token_id: &TokenId, amount: Amount, - coin: mlcp::CoinType, + coin_type: mlcp::CoinType, ) -> Result { let atoms = amount.into_atoms(); - let id_str = id_to_address(token_id.hash(), coin.token_id_address_prefix())?; + let id_str = id_to_address(token_id.hash(), coin_type.token_id_address_prefix())?; Ok(format!("{atoms} atoms of {id_str}")) } @@ -301,11 +310,11 @@ fn format_atoms(amount: Amount) -> String { format!("{} atoms", amount.into_atoms()) } -fn format_value(value: &OutputValue, coin: mlcp::CoinType) -> Result { +fn format_value(value: &OutputValue, coin_type: mlcp::CoinType) -> Result { match value { - OutputValue::Coin(amount) => Ok(format_coin_amount_with_name(*amount, coin)), + OutputValue::Coin(amount) => Ok(format_coin_amount_with_name(*amount, coin_type)), OutputValue::TokenV1(token_id, amount) => { - format_token_amount_with_name(token_id, *amount, coin) + format_token_amount_with_name(token_id, *amount, coin_type) } } } @@ -324,10 +333,10 @@ fn format_timestamp(seconds_u64: u64) -> Result { fn format_lock(lock: &OutputTimeLock) -> Result { let s = match lock { - OutputTimeLock::UntilHeight(h) => format!("Lock until block height {}", h.0), - OutputTimeLock::UntilTime(t) => format!("Lock until {}", format_timestamp(t.0.0)?), - OutputTimeLock::ForBlockCount(b) => format!("Lock for {} blocks", b.0), - OutputTimeLock::ForSeconds(s) => format!("Lock for {} seconds", s.0), + OutputTimeLock::UntilHeight(h) => format!("until block height {}", h.0), + OutputTimeLock::UntilTime(t) => format!("until {}", format_timestamp(t.0.0)?), + OutputTimeLock::ForBlockCount(b) => format!("for {} blocks", b.0), + OutputTimeLock::ForSeconds(s) => format!("for {} seconds", s.0), }; Ok(s) } @@ -335,12 +344,17 @@ fn format_lock(lock: &OutputTimeLock) -> Result { /// Formats a transaction output into a FormattedOutput. /// /// # Arguments -/// * `output` - A reference to the `TxOutput` enum variant to format. -/// * `coin` - The coin type (mainnet, testnet etc). +/// * `output` - A reference to the `TxOutput` enum variant to format. +/// * `coin_type` - The coin type (mainnet, testnet etc). +/// * `is_change` - Whether the output is a change one. Only applicable to `Transfer` outputs. /// /// # Returns /// A FormattedOutput containing the title and value of the output. -fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result { +fn format_output( + output: &TxOutput, + coin_type: mlcp::CoinType, + is_change: bool, +) -> Result { // Note: on nanox and nanosp the screen space is very limited. Moreover, if the name part of // a field doesn't fit into one line, it will be shrunk instead of being wrapped to the next // line, which will make it incomprehensible. @@ -350,41 +364,55 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result ( - "Transfer", - format!( - "Destination: {}\n{}\n", - to_address(destination, coin)?, - format_value(value, coin)? - ), - ), + TxOutput::Transfer(value, destination) => { + let label = if is_change { + if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { + "Transfer chg" + } else { + "Transfer change" + } + } else { + "Transfer" + }; + ( + label, + format!( + "Destination: {}\nAmount: {}", + to_address(destination, coin_type)?, + format_value(value, coin_type)? + ), + ) + } TxOutput::LockThenTransfer(value, destination, lock) => { - let address_short = format!( - "Destination: {}\n{}\n{}\n", - to_address(destination, coin)?, + let description = format!( + "Destination: {}\nLock: {}\nAmount: {}", + to_address(destination, coin_type)?, format_lock(lock)?, - format_value(value, coin)? + format_value(value, coin_type)? ); if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { - ("LockThenXfer", address_short) + ("LockThenXfer", description) } else { - ("Lock then Transfer", address_short) + ("Lock then Transfer", description) } } - TxOutput::Burn(value) => ("Burn", format_value(value, coin)?), + TxOutput::Burn(value) => ( + "Burn", + format!("Amount: {}", format_value(value, coin_type)?), + ), TxOutput::CreateStakePool(pool_id, data) => { - let address_short = format!( - "Pool ID: {}\nStaker key: {}\nDecommission key: {}\nVRF public key: {}\nMargin ratio per thousand: {}\nCost per block: {}\nPledge: {}\n", - pool_id_to_address(pool_id, coin)?, - to_address(&data.staker, coin)?, - to_address(&data.decommission_key, coin)?, - vrf_to_address(&data.vrf_public_key, coin)?, + let description = format!( + "Pool ID: {}\nStaker key: {}\nDecommission key: {}\nVRF public key: {}\nMargin ratio per thousand: {}\nCost per block: {}\nPledge: {}", + pool_id_to_address(pool_id, coin_type)?, + to_address(&data.staker, coin_type)?, + to_address(&data.decommission_key, coin_type)?, + vrf_to_address(&data.vrf_public_key, coin_type)?, data.margin_ratio_per_thousand.0, - format_coin_amount_with_name(data.cost_per_block, coin), - format_coin_amount_with_name(data.pledge, coin) + format_coin_amount_with_name(data.cost_per_block, coin_type), + format_coin_amount_with_name(data.pledge, coin_type) ); let name = if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { @@ -392,7 +420,7 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result { @@ -404,14 +432,14 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result { - let address_short = format!( - "Address: {}\nPoolId: {}", - to_address(destination, coin)?, - pool_id_to_address(pool_id, coin)? + let description = format!( + "Address: {}\nPool ID: {}", + to_address(destination, coin_type)?, + pool_id_to_address(pool_id, coin_type)? ); let name = if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { @@ -420,7 +448,7 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result { @@ -433,9 +461,9 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result Result "UNLIMITED".to_string(), - TokenTotalSupply::Lockable => "LOCKABLE".to_string(), + TokenTotalSupply::Unlimited => "unlimited".to_string(), + TokenTotalSupply::Lockable => "lockable".to_string(), TokenTotalSupply::Fixed(amount) => { let formatted_amount = format_atoms(amount); - format!("FIXED {}", formatted_amount) + format!("fixed ({})", formatted_amount) } }; let is_freezable = match data.is_freezable { @@ -463,10 +491,10 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result "No", }; - let address_short = format!( + let description = format!( "Ticker: {}\nAuthority: {}\nMetadata URI: {}\nTotal token supply: {}\nNumber of decimals: {}\nIs freezable: {}", ticker, - to_address(&data.authority, coin)?, + to_address(&data.authority, coin_type)?, metadata_uri, total_supply_str, data.number_of_decimals, @@ -478,7 +506,7 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result { @@ -493,135 +521,144 @@ fn format_output(output: &TxOutput, coin: mlcp::CoinType) -> Result ("Data deposit", const_hex::encode(data)), + TxOutput::DataDeposit(data) => ( + "Data deposit", + format!("Hex data: {}", const_hex::encode(data)), + ), TxOutput::Htlc(value, data) => { - let address_short = format!( - "Secret hash: {:x}\nSpend key: {}\nRefund key: {}\nRefund time lock: {}\n{}", + let description = format!( + "Secret hash: {:x}\nSpend key: {}\nRefund key: {}\nRefund lock: {}\nAmount: {}", const_hex::display(data.secret_hash.0), - to_address(&data.spend_key, coin)?, - to_address(&data.refund_key, coin)?, + to_address(&data.spend_key, coin_type)?, + to_address(&data.refund_key, coin_type)?, format_lock(&data.refund_timelock)?, - format_value(value, coin)? + format_value(value, coin_type)? ); - ("HTLC", address_short) + ("HTLC", description) } TxOutput::CreateOrder(data) => { - let ask_amount = format_value(&data.ask, coin)?; - let give_amount = format_value(&data.give, coin)?; - let address_short = format!( + let ask_amount = format_value(&data.ask, coin_type)?; + let give_amount = format_value(&data.give, coin_type)?; + let description = format!( "Conclude key: {}\nAsk: {}\nGive: {}", - to_address(&data.conclude_key, coin)?, + to_address(&data.conclude_key, coin_type)?, ask_amount, give_amount ); - ("Create order", address_short) + ("Create order", description) } }; Ok(FormattedOutput { name, value }) } -fn format_input(input: &InputCommand, coin: mlcp::CoinType) -> Result { +fn format_input( + input: &InputCommand, + coin_type: mlcp::CoinType, +) -> Result { let (name, value) = match input { InputCommand::AccountSpending(cmd) => match cmd { AccountSpending::DelegationBalance(delegation_id, amount) => { - let address_short = format!( + let description = format!( "Delegation ID: {}\nAmount: {}", - delegation_id_to_address(delegation_id, coin)?, - format_coin_amount_with_name(*amount, coin) + delegation_id_to_address(delegation_id, coin_type)?, + format_coin_amount_with_name(*amount, coin_type) ); if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { - ("Deleg wdrwl", address_short) + ("Deleg wdrwl", description) } else { - ("Delegation withdrawal", address_short) + ("Delegation withdrawal", description) } } }, InputCommand::AccountCommand(cmd) => match cmd { AccountCommand::MintTokens(token_id, amount) => { - let address_short = format!( + let description = format!( "Token ID: {}\nAmount: {}", - token_id_to_address(token_id, coin)?, + token_id_to_address(token_id, coin_type)?, format_atoms(*amount) ); - ("Mint tokens", address_short) + ("Mint tokens", description) } AccountCommand::UnmintTokens(token_id) => { - let address_short = format!("Token ID: {}", token_id_to_address(token_id, coin)?,); - ("Unmint tokens", address_short) + let description = + format!("Token ID: {}", token_id_to_address(token_id, coin_type)?,); + ("Unmint tokens", description) } AccountCommand::LockTokenSupply(token_id) => { - let address_short = format!("Token ID: {}", token_id_to_address(token_id, coin)?); + let description = + format!("Token ID: {}", token_id_to_address(token_id, coin_type)?); if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { - ("Lock supply", address_short) + ("Lock supply", description) } else { - ("Lock token supply", address_short) + ("Lock token supply", description) } } AccountCommand::FreezeToken(token_id, is_unfreezable) => { - let address_short = format!( + let description = format!( "Token ID: {}\nIs unfreezable: {}", - token_id_to_address(token_id, coin)?, + token_id_to_address(token_id, coin_type)?, if *is_unfreezable == IsTokenUnfreezable::Yes { "Yes" } else { "No" } ); - ("Freeze token", address_short) + ("Freeze token", description) } AccountCommand::UnfreezeToken(token_id) => { - let address_short = format!("Token ID: {}", token_id_to_address(token_id, coin)?,); + let description = + format!("Token ID: {}", token_id_to_address(token_id, coin_type)?,); if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { - ("Unfrz token", address_short) + ("Unfrz token", description) } else { - ("Unfreeze token", address_short) + ("Unfreeze token", description) } } AccountCommand::ChangeTokenAuthority(token_id, new_authority) => { - let address_short = format!( + let description = format!( "Token ID: {}\nNew authority: {}", - token_id_to_address(token_id, coin)?, - to_address(new_authority, coin)? + token_id_to_address(token_id, coin_type)?, + to_address(new_authority, coin_type)? ); if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { - ("Chg tkn auth", address_short) + ("Chg tkn auth", description) } else { - ("Change token authority", address_short) + ("Change token authority", description) } } AccountCommand::ChangeTokenMetadataUri(token_id, new_metadata_uri) => { - let address_short = format!( + let description = format!( "Token ID: {}\nNew metadata URI: {}", - token_id_to_address(token_id, coin)?, + token_id_to_address(token_id, coin_type)?, make_displayable(new_metadata_uri) ); if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { - ("Chg tkn meta", address_short) + ("Chg tkn meta", description) } else { - ("Change token metadata URI", address_short) + ("Change token metadata URI", description) } } AccountCommand::ConcludeOrder(_) | AccountCommand::FillOrder(_, _, _) => { @@ -632,23 +669,25 @@ fn format_input(input: &InputCommand, coin: mlcp::CoinType) -> Result { let fill_value = output_value_with_amount(&additional_info.initially_asked, *fill_amount); - let address_short = format!( + let description = format!( "Order ID: {}\nFill amount: {}", - order_id_to_address(order_id, coin)?, - format_value(&fill_value, coin)?, + order_id_to_address(order_id, coin_type)?, + format_value(&fill_value, coin_type)?, ); - ("Fill order", address_short) + ("Fill order", description) } OrderAccountCommand::FreezeOrder(order_id) => { - let address_short = format!("Order ID: {}", order_id_to_address(order_id, coin)?); - ("Freeze order", address_short) + let description = + format!("Order ID: {}", order_id_to_address(order_id, coin_type)?); + ("Freeze order", description) } OrderAccountCommand::ConcludeOrder(order_id) => { - let address_short = format!("Order ID: {}", order_id_to_address(order_id, coin)?); + let description = + format!("Order ID: {}", order_id_to_address(order_id, coin_type)?); if cfg!(any(target_os = "nanosplus", target_os = "nanox")) { - ("Conclude ord", address_short) + ("Conclude ord", description) } else { - ("Conclude order", address_short) + ("Conclude order", description) } } }, diff --git a/crates/app-core/src/app_ui/utils.rs b/crates/app-core/src/app_ui/utils.rs index 614d716..d7f7254 100644 --- a/crates/app-core/src/app_ui/utils.rs +++ b/crates/app-core/src/app_ui/utils.rs @@ -17,12 +17,11 @@ use alloc::string::String; -use ledger_device_sdk::{ecc::ECPublicKey, include_gif, nbgl::NbglGlyph}; +use ledger_device_sdk::{include_gif, nbgl::NbglGlyph}; -use mintlayer_core_primitives::PUBLIC_KEY_HASH_SIZE; -use mintlayer_messages::{Destination, PublicKeyHash, Secp256k1PublicKey, encode, encode_to}; +use mintlayer_messages::{Destination, encode}; -use crate::{StatusWord, hasher::Hasher, mlcp, utils::cut_array}; +use crate::{StatusWord, mlcp}; pub fn bech32m_encode(hrp: &str, data: &[u8]) -> Result { let parsed_hrp = bech32::Hrp::parse(hrp).map_err(|_| StatusWord::AddressEncodingFail)?; @@ -33,58 +32,35 @@ pub fn bech32m_encode(hrp: &str, data: &[u8]) -> Result { Ok(encoded) } -pub fn to_address(destination: &Destination, coin: mlcp::CoinType) -> Result { - let hrp = coin.address_prefix(destination.into()); +pub fn to_address( + destination: &Destination, + coin_type: mlcp::CoinType, +) -> Result { + let hrp = coin_type.address_prefix(destination.into()); bech32m_encode(hrp, &encode(destination)) } +// TODO: all image files currently contain the Rust logo; need to replace them with Mintlayer logo. +// See https://github.com/mintlayer/mintlayer-ledger-app/issues/10. /// Load glyph from file with include_gif macro. Creates an NBGL compatible glyph. pub const fn load_glyph() -> NbglGlyph<'static> { #[cfg(target_os = "apex_p")] - const MINTLAYER: NbglGlyph = + const GLYPH: NbglGlyph = NbglGlyph::from_include(include_gif!("../../media/glyphs/mintlayer_48x48.png", NBGL)); #[cfg(any(target_os = "stax", target_os = "flex"))] - const MINTLAYER: NbglGlyph = + const GLYPH: NbglGlyph = NbglGlyph::from_include(include_gif!("../../media/glyphs/mintlayer_64x64.gif", NBGL)); #[cfg(any(target_os = "nanosplus", target_os = "nanox"))] - const MINTLAYER: NbglGlyph = + // Note: the original boilerplate app used different images on nano devices, depending on whether + // it's for review screens or for the menu. Moreover, in the menu case the file, called + // "home_nano_nbgl.png", was generated by `build.rs` based on "mask_14x14.gif"; the gist was + // that the inscribed circle area of the image was inverted, while the remaining corner areas + // were turned black. The purpose of this is unclear, as all screens have black background + // on nano devices, so the generated image didn't look better on the menu screen. In any case, + // even if we decide to use different images based on purpose, it's better to pre-make a nice + // alternative image instead of generating it. + const GLYPH: NbglGlyph = NbglGlyph::from_include(include_gif!("../../media/icons/mintlayer_14x14.gif", NBGL)); - MINTLAYER -} - -pub fn compress_public_key( - public_key: &ECPublicKey<65, T>, -) -> Result { - let uncompressed_key = &public_key.pubkey; - if uncompressed_key[0] != 0x04 { - return Err(StatusWord::InvalidUncompressedPublicKey); - } - - let mut compressed_key = [0u8; 33]; - - let y_coordinate = &uncompressed_key[33..65]; - let prefix = if y_coordinate[31].is_multiple_of(2) { - 0x02 - } else { - 0x03 - }; - - compressed_key[0] = prefix; - - let x_coordinate = &uncompressed_key[1..33]; - compressed_key[1..].copy_from_slice(x_coordinate); - - Ok(Secp256k1PublicKey(compressed_key)) -} - -pub fn to_public_key_hash(pk: &Secp256k1PublicKey) -> Result { - let mut hasher = Hasher::new(); - - encode_to(mlcp::PublicKey::Secp256k1Schnorr(*pk), &mut hasher); - - let full_hash = hasher.finalize()?; - let pkh: [u8; PUBLIC_KEY_HASH_SIZE] = cut_array(full_hash.as_fixed_bytes()); - - Ok(PublicKeyHash(pkh)) + GLYPH } diff --git a/crates/app-core/src/handlers/sign_message.rs b/crates/app-core/src/handlers/sign_message.rs index 67f3736..dfc9fcf 100644 --- a/crates/app-core/src/handlers/sign_message.rs +++ b/crates/app-core/src/handlers/sign_message.rs @@ -31,7 +31,7 @@ use crate::{ pub struct SignMessageContext { path: Bip32Path, - coin: mlcp::CoinType, + coin_type: mlcp::CoinType, addr_type: AddrType, review_finished: bool, } @@ -40,7 +40,7 @@ impl SignMessageContext { pub fn new(req: SignMessageStartReq) -> Self { Self { path: req.path, - coin: req.coin.into(), + coin_type: req.coin_type.into(), addr_type: req.addr_type, review_finished: false, } @@ -52,7 +52,7 @@ impl SignMessageContext { } pub fn setup_sign_message(req: SignMessageStartReq) -> Result { - check_derivation_path(req.path.as_ref(), req.coin.into())?; + check_derivation_path(req.path.as_ref(), req.coin_type.into())?; Ok(DataContext::SignMessageContext(SignMessageContext::new( req, @@ -73,7 +73,7 @@ pub fn handle_sign_message( // Display review. If user approves, sign it. // Otherwise, return a "deny" status word. - if ui_display_message(message, &public_key, ctx.coin, ctx.addr_type)? { + if ui_display_message(message, &public_key, ctx.coin_type, ctx.addr_type)? { ctx.review_finished = true; Ok(compute_signature(&private_key, message)?) } else { diff --git a/crates/app-core/src/handlers/sign_tx/mod.rs b/crates/app-core/src/handlers/sign_tx/mod.rs index 20a6f16..ae91ae1 100644 --- a/crates/app-core/src/handlers/sign_tx/mod.rs +++ b/crates/app-core/src/handlers/sign_tx/mod.rs @@ -23,9 +23,10 @@ use ledger_device_sdk::{ }; use mintlayer_messages::{ - H256, InputAddressPath, OrderAccountCommand, Response, SignTxNextReq, SignTxStartReq, - Signature, TransactionVersion, TxInputCommitmentData, TxInputData, TxInputSignatureResponse, - TxInputWithAdditionalInfo, TxOutputData, encode_as_compact_to, encode_to, + Destination, H256, InputAddressPath, OrderAccountCommand, PublicKey, Response, SignTxNextReq, + SignTxStartReq, Signature, TransactionVersion, TxInputCommitmentData, TxInputData, + TxInputSignatureResponse, TxInputWithAdditionalInfo, TxOutput, TxOutputData, + encode_as_compact_to, encode_to, }; use crate::{ @@ -34,10 +35,14 @@ use crate::{ ui_approve_streaming_review, ui_new_streaming_review, ui_start_streaming_review, ui_streaming_review_show_input, ui_streaming_review_show_output, }, + errors::cx_err_to_status, handlers::sign_message::schnorr_sign, hasher::Hasher, mlcp, - utils::{CompressedDerivationPathForTxSigning, check_derivation_path_for_tx_signing}, + utils::{ + CompressedDerivationPathForTxSigning, check_derivation_path_for_tx_signing, + compress_public_key, ensure, ensure_change_output, to_public_key_hash, + }, }; mod summary_collector; @@ -61,9 +66,9 @@ impl SigTarget { fn new( addr: InputAddressPath, input_idx: Index, - coin: mlcp::CoinType, + coin_type: mlcp::CoinType, ) -> Result { - let path = check_derivation_path_for_tx_signing(addr.path.as_ref(), coin)?; + let path = check_derivation_path_for_tx_signing(addr.path.as_ref(), coin_type)?; Ok(Self { path, @@ -74,7 +79,7 @@ impl SigTarget { } pub struct TxMetadata { - coin: mlcp::CoinType, + coin_type: mlcp::CoinType, num_inputs: Index, num_outputs: Index, } @@ -169,7 +174,7 @@ impl TxInputCommitmentsProcessingContext { } if let Some(command) = self.summary.input_command() - && !ui_streaming_review_show_input(review, command, self.metadata.coin)? + && !ui_streaming_review_show_input(review, command, self.metadata.coin_type)? { return Err(StatusWord::Deny); } @@ -217,8 +222,8 @@ pub struct TxOutputsProcessingContext { } impl TxOutputsProcessingContext { - pub fn coin(&self) -> mlcp::CoinType { - self.metadata.coin + pub fn coin_type(&self) -> mlcp::CoinType { + self.metadata.coin_type } pub fn summary(&self) -> &TxSummaryCollector { @@ -243,6 +248,61 @@ impl TxOutputsProcessingContext { ) } } + + fn validate_change_output(&self, output_data: &TxOutputData) -> Result<(), StatusWord> { + if let Some(path) = &output_data.change_path { + ensure_change_output(&path.0, self.coin_type())?; + + let expected_pubkey = compress_public_key( + &Secp256k1::derive_from_path(&path.0) + .public_key() + .map_err(cx_err_to_status)?, + )?; + + let destination = match &output_data.output { + TxOutput::Transfer(_, destination) => destination, + TxOutput::LockThenTransfer(_, _, _) + | TxOutput::Burn(_) + | TxOutput::CreateStakePool(_, _) + | TxOutput::ProduceBlockFromStake(_, _) + | TxOutput::CreateDelegationId(_, _) + | TxOutput::DelegateStaking(_, _) + | TxOutput::IssueFungibleToken(_) + | TxOutput::IssueNft(_, _, _) + | TxOutput::DataDeposit(_) + | TxOutput::Htlc(_, _) + | TxOutput::CreateOrder(_) => { + return Err(StatusWord::WrongChangeOutputType); + } + }; + + match destination { + Destination::PublicKeyHash(pubkey_hash) => { + let expected_pubkey_hash = to_public_key_hash(&expected_pubkey)?; + ensure!( + pubkey_hash == &expected_pubkey_hash, + StatusWord::MismatchedChangeOutputDestination + ); + } + Destination::PublicKey(pubkey) => match pubkey { + PublicKey::Secp256k1Schnorr(pubkey) => { + ensure!( + pubkey == &expected_pubkey, + StatusWord::MismatchedChangeOutputDestination + ); + } + }, + + Destination::AnyoneCanSpend + | Destination::ScriptHash(_) + | Destination::ClassicMultisig(_) => { + return Err(StatusWord::WrongChangeOutputDestination); + } + }; + } + + Ok(()) + } } fn switch_to_signing( @@ -253,7 +313,7 @@ fn switch_to_signing( sig_targets: Vec, spinner: NbglSpinner, ) -> Result { - if ui_approve_streaming_review(review, &summary, metadata.coin)? { + if ui_approve_streaming_review(review, &summary, metadata.coin_type)? { // Finalize the tx hash for signing let first_hash = tx_hasher.finalize()?; let tx_hash = Hasher::hash(first_hash.as_bytes())?; @@ -290,7 +350,7 @@ impl TxSigningContext { .get(self.num_sigs_produced as usize) .ok_or(StatusWord::WrongContext)?; - let path = sig_target.path.to_full_path(self.metadata.coin); + let path = sig_target.path.to_full_path(self.metadata.coin_type); let private_key = Secp256k1::derive_from_path(&path); let sig = schnorr_sign(&private_key, self.tx_hash.as_bytes())?; @@ -329,7 +389,7 @@ pub enum TxProcessingContext { impl TxProcessingContext { pub fn new( SignTxStartReq { - coin, + coin_type, version, num_inputs, num_outputs, @@ -357,7 +417,7 @@ impl TxProcessingContext { Ok(Self::ProcessingInputs(Box::new( TxInputsProcessingContext { metadata: TxMetadata { - coin: coin.into(), + coin_type: coin_type.into(), num_inputs, num_outputs, }, @@ -389,7 +449,7 @@ impl TxProcessingContext { // See https://github.com/mintlayer/mintlayer-ledger-app/issues/14. // Also see the TODO near `TxSummaryCollector::input_command`. - // TODO: change outputs should be detected and not presented for review; once this is + // TODO: change outputs should be omitted from review (when possible); once this is // implemented, the spinner logic may need to be revised. // See https://github.com/mintlayer/mintlayer-ledger-app/issues/17. Self::ProcessingOutputs(_) | Self::Finished => return, @@ -433,7 +493,7 @@ fn handle_input( let sig_targets = input_data .addresses .into_iter() - .map(|a| SigTarget::new(a, num_inputs_parsed, ctx.metadata.coin)) + .map(|a| SigTarget::new(a, num_inputs_parsed, ctx.metadata.coin_type)) .collect::, StatusWord>>()?; ctx.sig_targets.extend(sig_targets); @@ -472,7 +532,13 @@ fn handle_output( mut ctx: Box, review: &NbglStreamingReview, ) -> Result { - if ui_streaming_review_show_output(review, &output_data.output, ctx.metadata.coin)? { + ctx.validate_change_output(output_data)?; + if ui_streaming_review_show_output( + review, + &output_data.output, + ctx.metadata.coin_type, + output_data.change_path.is_some(), + )? { ctx.summary.process_output(&output_data.output)?; encode_to(&output_data.output, &mut ctx.tx_hasher); ctx.advance_next_output_state(review) diff --git a/crates/app-core/src/handlers/sign_tx/summary_collector.rs b/crates/app-core/src/handlers/sign_tx/summary_collector.rs index 2425ea8..69938d3 100644 --- a/crates/app-core/src/handlers/sign_tx/summary_collector.rs +++ b/crates/app-core/src/handlers/sign_tx/summary_collector.rs @@ -80,19 +80,28 @@ impl TxSummaryCollector { } } - // TODO: - // 1) currently consensus only forbids multiple account commands (AccountCommand or OrderAccountCommand) per tx, - // but the number of account spendings is unlimited and they can co-exist with an account command; - // 2) probably the app shouldn't try being smart and assume any number of account commands is possible, asking - // the user to approve them as they arrive, same as it's done for outputs; - // 3) if the app does try to be smart, then it should fail when multiple commands are encountered, instead of - // silently overwriting `input_command`. + // TODO: currently consensus only forbids multiple account commands (AccountCommand or OrderAccountCommand) + // per tx, but the number of account spendings is unlimited and they can co-exist with an account command. + // This is an unlikely situation and core wallets will never create a tx like this, but still it'd be better + // if the app assumed that any number of input commands is possible, asking the user to approve them as they + // arrive, same as it's done for outputs; // See https://github.com/mintlayer/mintlayer-ledger-app/issues/14. // Also see the TODO near `TxProcessingContext::show_spinner`. pub fn input_command(&self) -> Option<&InputCommand> { self.input_command.as_ref() } + fn set_input_command(&mut self, cmd: InputCommand) -> Result<(), StatusWord> { + // Since we can currently review only one input command, reject txs that have more than + // one of those, to avoid blind signing. + if self.input_command.is_some() { + return Err(StatusWord::TxWithMultipleReviewableInputs); + } + + self.input_command = Some(cmd); + Ok(()) + } + pub fn tx_type(&self) -> Option { self.tx_type } @@ -108,24 +117,24 @@ impl TxSummaryCollector { pub fn fees_iter( &self, ) -> impl Iterator> + '_ { - // TODO: if an asset is only present in total_outputs, this will not fail with TxFeeUnderflow, - // but it should. - // See https://github.com/mintlayer/mintlayer-ledger-app/issues/15. - self.total_inputs() - .iter() - .map(move |(coin_or_token, amount)| { - let out = *self - .total_outputs() - .get(coin_or_token) - .unwrap_or(&Amount::ZERO); - - let fee = amount - .into_atoms() - .checked_sub(out.into_atoms()) - .ok_or(StatusWord::TxFeeUnderflow)?; - - Ok((coin_or_token, fee)) - }) + // If an asset is present only in the outputs, the tx definitely has fee underflow, + // so we return a single-item iterator with the corresponding error. + for output_asset in self.total_outputs.keys() { + if !self.total_inputs.contains_key(output_asset) { + return itertools::Either::Left([Err(StatusWord::TxFeeUnderflow)].into_iter()); + } + } + + itertools::Either::Right(self.total_inputs.iter().map(move |(asset, amount)| { + let out = *self.total_outputs().get(asset).unwrap_or(&Amount::ZERO); + + let fee = amount + .into_atoms() + .checked_sub(out.into_atoms()) + .ok_or(StatusWord::TxFeeUnderflow)?; + + Ok((asset, fee)) + })) } pub fn process_output(&mut self, out: &TxOutput) -> Result<(), StatusWord> { @@ -220,16 +229,15 @@ impl TxSummaryCollector { } }, TxInputWithAdditionalInfo::Account(acc) => { - self.input_command = Some(InputCommand::AccountSpending(acc.spending.clone())); match acc.spending { AccountSpending::DelegationBalance(_, amount) => { self.tx_type = merge_tx_type(self.tx_type, TxType::DelegationWithdrawal); self.increase_input_totals(CoinOrTokenId::Coin, amount)?; } } + self.set_input_command(InputCommand::AccountSpending(acc.spending.clone()))?; } TxInputWithAdditionalInfo::AccountCommand(_, cmd) => { - self.input_command = Some(InputCommand::AccountCommand(cmd.clone())); match cmd { AccountCommand::MintTokens(token_id, amount) => { self.tx_type = merge_tx_type(self.tx_type, TxType::MintTokens); @@ -257,12 +265,10 @@ impl TxSummaryCollector { self.tx_type = merge_tx_type(self.tx_type, TxType::ChangeTokenMetadataUri); } } + + self.set_input_command(InputCommand::AccountCommand(cmd.clone()))?; } TxInputWithAdditionalInfo::OrderAccountCommand(cmd, additional_info) => { - self.input_command = Some(InputCommand::OrderCommand( - cmd.clone(), - additional_info.clone(), - )); match cmd { OrderAccountCommand::FillOrder(_, fill_amount) => { let (fill_coin_or_token_id, asked_amount) = @@ -270,16 +276,19 @@ impl TxSummaryCollector { let (given_coin_or_token_id, given_amount) = into_coin_or_token_id_and_amount(&additional_info.initially_given)?; + // Add the fill amount as a "pseudo-output" (it goes into the order account). self.increase_output_totals(fill_coin_or_token_id, *fill_amount)?; - let atoms = given_amount + let filled_atoms = given_amount .into_atoms() .checked_mul(fill_amount.into_atoms()) .ok_or(StatusWord::TxNumericOperationFail)? .checked_div(asked_amount.into_atoms()) .ok_or(StatusWord::TxNumericOperationFail)?; - let amount = Amount::from_atoms(atoms); - self.increase_input_totals(given_coin_or_token_id, amount)?; + let filled_amount = Amount::from_atoms(filled_atoms); + // Add the filled amount as a "pseudo-input", so that actual transfer outputs + // can consume it. + self.increase_input_totals(given_coin_or_token_id, filled_amount)?; self.tx_type = merge_tx_type(self.tx_type, TxType::FillOrder); } @@ -298,6 +307,11 @@ impl TxSummaryCollector { self.tx_type = merge_tx_type(self.tx_type, TxType::FreezeOrder); } } + + self.set_input_command(InputCommand::OrderCommand( + cmd.clone(), + additional_info.clone(), + ))?; } }; @@ -363,6 +377,8 @@ fn into_coin_or_token_id_and_amount( #[cfg(test)] mod tests { + use alloc::vec::Vec; + use mintlayer_messages::{AdditionalOrderInfo, AdditionalUtxoInfo, TxInputWithAdditionalInfo}; use test_utils::prelude::*; @@ -1063,4 +1079,94 @@ mod tests { StatusWord::TxNumericOperationFail ); } + + #[test_item] + fn test_tx_with_multiple_reviewable_inputs() { + let inp1 = { + let order_id = mlcp::Id::new(mlcp::H256::zero()); + let additional_info = AdditionalOrderInfo { + initially_asked: mlcp::OutputValue::Coin(mlcp::Amount::from_atoms(100)), + initially_given: mlcp::OutputValue::Coin(mlcp::Amount::from_atoms(200)), + ask_balance: mlcp::Amount::from_atoms(0), + give_balance: mlcp::Amount::from_atoms(0), + }; + TxInputWithAdditionalInfo::OrderAccountCommand( + mlcp::OrderAccountCommand::FreezeOrder(order_id), + additional_info, + ) + }; + let inp2 = { + let token_id = mlcp::Id::new(mlcp::H256::zero()); + TxInputWithAdditionalInfo::AccountCommand( + mlcp::AccountNonce(11), + mlcp::AccountCommand::ChangeTokenMetadataUri(token_id, alloc::vec::Vec::new()), + ) + }; + let inp3 = { + let delegation_balance = mlcp::Amount::from_atoms(111); + let acc = mlcp::AccountOutPoint { + nonce: mlcp::AccountNonce(0), + spending: mlcp::AccountSpending::DelegationBalance( + mlcp::Id::new(mlcp::H256::zero()), + delegation_balance, + ), + }; + TxInputWithAdditionalInfo::Account(acc) + }; + let inputs = [inp1, inp2, inp3]; + + for (inp1_idx, inp1) in inputs.iter().enumerate() { + for inp2 in &inputs[inp1_idx + 1..] { + let mut collector = TxSummaryCollector::new(); + + collector.process_input(inp1).unwrap(); + assert!(collector.input_command().is_some()); + + let err = collector.process_input(inp2).unwrap_err(); + assert_eq!(err, StatusWord::TxWithMultipleReviewableInputs); + } + } + } + + // Output has coins, but input tokens; `fees_iter` must fail with `TxFeeUnderflow`. + #[test_item] + fn test_asset_only_in_outputs() { + let mut collector = TxSummaryCollector::new(); + + let token_id = mlcp::Id::new(mlcp::H256::zero()); + let token_amount = mlcp::Amount::from_atoms(222); + let inp_token = TxInputWithAdditionalInfo::Utxo( + make_utxo_outpoint(), + AdditionalUtxoInfo::Utxo(mlcp::TxOutput::Transfer( + mlcp::OutputValue::TokenV1(token_id, token_amount), + mlcp::Destination::AnyoneCanSpend, + )), + ); + collector.process_input(&inp_token).unwrap(); + + let coin_amount = mlcp::Amount::from_atoms(111); + let out_coin = mlcp::TxOutput::Transfer( + mlcp::OutputValue::Coin(coin_amount), + mlcp::Destination::AnyoneCanSpend, + ); + collector.process_output(&out_coin).unwrap(); + + assert_eq!( + collector + .total_inputs() + .get(&CoinOrTokenId::TokenId(token_id)), + Some(&token_amount) + ); + + assert_eq!( + collector.total_outputs().get(&CoinOrTokenId::Coin), + Some(&coin_amount) + ); + + let fees_err = collector + .fees_iter() + .collect::, _>>() + .unwrap_err(); + assert_eq!(fees_err, StatusWord::TxFeeUnderflow); + } } diff --git a/crates/app-core/src/lib.rs b/crates/app-core/src/lib.rs index e0bf220..7685e6b 100644 --- a/crates/app-core/src/lib.rs +++ b/crates/app-core/src/lib.rs @@ -106,7 +106,10 @@ impl ApduTransport { /// - If `P2 == P2_DONE`, it finishes accumulation and returns `Ok(Some(RawInstruction))`. pub fn receive(&mut self, comm: &mut Comm) -> Result { let header: ApduHeader = comm.next_command(); - let data = comm.get_data().map_err(sdk_err_to_status)?; + let data = comm.get_data().map_err(|err| { + self.reset(); + sdk_err_to_status(err) + })?; // Validation: If we are in the middle of a stream, INS and P1 must match if let (Some(curr_ins), Some(curr_p1)) = (self.current_ins, self.current_p1) { @@ -164,6 +167,17 @@ pub enum Command { Ping, } +impl Command { + pub fn tag(&self) -> CommandTag { + match self { + Command::GetPubKey { p1, .. } => CommandTag::GetPubKey { p1: *p1 }, + Command::SignTx { p1, .. } => CommandTag::SignTx { p1: *p1 }, + Command::SignMessage { p1, .. } => CommandTag::SignMessage { p1: *p1 }, + Command::Ping => CommandTag::Ping, + } + } +} + impl TryFrom for Command { type Error = StatusWord; @@ -196,33 +210,12 @@ impl TryFrom for Command { } } -fn show_status_and_home_if_needed(cmd: &Command, ctx: &mut AppContext, status: StatusWord) { - let (show_status, status_type) = match (cmd, status) { - (Command::GetPubKey { p1, .. }, StatusWord::Deny | StatusWord::Ok) if p1.display() => { - (true, StatusType::Address) - } - (Command::SignTx { .. }, StatusWord::Deny | StatusWord::Ok) if ctx.finished() => { - (true, StatusType::Transaction) - } - (Command::SignMessage { .. }, StatusWord::Deny | StatusWord::Ok) if ctx.finished() => { - (true, StatusType::Message) - } - (Command::Ping, StatusWord::Ok) => { - ctx.home.show_and_return(); - return; - } - (_, _) => (false, StatusType::Transaction), // Default fallback - }; - - if show_status { - let success = status == StatusWord::Ok; - NbglReviewStatus::new() - .status_type(status_type) - .show(success); - - // call home.show_and_return() to show home and setting screen - ctx.home.show_and_return(); - } +/// Same as `Command` but without the data part. +pub enum CommandTag { + GetPubKey { p1: GetPubKeyP1 }, + SignTx { p1: SignTxP1 }, + SignMessage { p1: SignMsgP1 }, + Ping, } pub enum DataContext { @@ -268,12 +261,13 @@ pub fn mintlayer_main() { Ok(ReceiveInstructionResult::Instruction(raw)) => raw, Ok(ReceiveInstructionResult::ExpectingNextChunk) => { // Signal host that we received the chunk and are waiting for more - comm.append(&encode(Response::ExpectingNextChunk)); + comm.append(&encode(&Response::ExpectingNextChunk)); comm.reply(Reply(StatusWord::Ok as u16)); continue; // Waiting for more chunks, loop around } Err(sw) => { comm.reply(Reply(sw as u16)); + show_home_on_error_before_command_handling(&mut app_ctx); continue; } }; @@ -282,13 +276,16 @@ pub fn mintlayer_main() { Ok(cmd) => cmd, Err(sw) => { comm.reply(Reply(sw as u16)); + show_home_on_error_before_command_handling(&mut app_ctx); continue; } }; - let status = match handle_command(&command, &mut app_ctx) { + let command_tag = command.tag(); + + let status = match handle_command(command, &mut app_ctx) { Ok(response) => { - comm.append(&encode(response)); + comm.append(&encode(&response)); comm.reply_ok(); StatusWord::Ok } @@ -298,34 +295,19 @@ pub fn mintlayer_main() { } }; - show_status_and_home_if_needed(&command, &mut app_ctx, status); + show_status_and_home_if_needed_after_command_handling(command_tag, &mut app_ctx, status); } } -// TODO: -// 1) On all errors, the context should probably be reset. -// 2) Note that the simple `ctx.data_context = None` doesn't reset the UI, while `show_status_and_home_if_needed` -// doesn't reset the UI on any error. -// See https://github.com/mintlayer/mintlayer-ledger-app/issues/12. -// Also see the TODO inside the function. -fn handle_command(cmd: &Command, ctx: &mut AppContext) -> Result { +fn handle_command(cmd: Command, ctx: &mut AppContext) -> Result { match cmd { Command::GetPubKey { p1, data } => { - // TODO: the context should be reset here, especially if `display` is true. - // Note that `show_status_and_home_if_needed` calls `ctx.home.show_and_return()` - // on Pings, so: - // a) the context should be reset on Command::Ping below as well, - // b) since a Ping resets the context, then GetPubKey should do it even if `display` - // is false; - // c) Command::SignMessage below should also reset the context when it's done. - // In any case, it's better to put UI update (at least on success) in the same place where - // the context is changed. - let req = decode_all(data).ok_or(StatusWord::DeserializeFail)?; + let req = decode_all(&data).ok_or(StatusWord::DeserializeFail)?; handle_get_public_key(req, p1.display()).map(Response::PublicKey) } Command::SignTx { p1, data } => match p1 { SignTxP1::Start => { - let req = decode_all(data).ok_or(StatusWord::DeserializeFail)?; + let req = decode_all(&data).ok_or(StatusWord::DeserializeFail)?; ctx.data_context = Some(setup_sign_tx(req)?); Ok(Response::TxSetup) } @@ -335,27 +317,23 @@ fn handle_command(cmd: &Command, ctx: &mut AppContext) -> Result return Err(StatusWord::WrongContext), }; - let req = decode_all(data).ok_or(StatusWord::DeserializeFail)?; + let req = decode_all(&data).ok_or(StatusWord::DeserializeFail)?; - // TODO: it makes sense to drop `data` right after decoding, to free the memory. + // `data` can be relatively large here, so we drop it right after decoding, + // to free the memory. + drop(data); tx_ctx.show_spinner(); - match handle_sign_tx(req, tx_ctx, &mut review) { - Ok((response, new_ctx)) => { - ctx.data_context = Some(DataContext::TxContext(new_ctx, review)); - Ok(response) - } - Err(sw) => { - ctx.data_context = None; - Err(sw) - } - } + let (response, new_ctx) = handle_sign_tx(req, tx_ctx, &mut review)?; + ctx.data_context = Some(DataContext::TxContext(new_ctx, review)); + + Ok(response) } }, Command::SignMessage { p1, data } => match p1 { SignMsgP1::Start => { - let req = decode_all(data).ok_or(StatusWord::DeserializeFail)?; + let req = decode_all(&data).ok_or(StatusWord::DeserializeFail)?; ctx.data_context = Some(setup_sign_message(req)?); Ok(Response::MessageSetup) } @@ -364,9 +342,59 @@ fn handle_command(cmd: &Command, ctx: &mut AppContext) -> Result ctx, _ => return Err(StatusWord::WrongContext), }; - handle_sign_message(data, msg_ctx).map(Response::MessageSignature) + handle_sign_message(&data, msg_ctx).map(Response::MessageSignature) } }, Command::Ping => Ok(Response::Pong), } } + +/// Show status screen and return to the home screen if needed. +/// +/// This is called after a command has been handled. +fn show_status_and_home_if_needed_after_command_handling( + cmd_tag: CommandTag, + ctx: &mut AppContext, + status: StatusWord, +) { + let success = status == StatusWord::Ok; + let show_status = |status_type| { + NbglReviewStatus::new() + .status_type(status_type) + .show(success); + }; + + match cmd_tag { + CommandTag::GetPubKey { p1 } => { + if p1.display() { + show_status(StatusType::Address); + } + ctx.home.show_and_return(); + ctx.data_context = None; + } + CommandTag::SignTx { .. } => { + if ctx.finished() || !success { + show_status(StatusType::Transaction); + ctx.home.show_and_return(); + ctx.data_context = None; + } + } + CommandTag::SignMessage { .. } => { + if ctx.finished() || !success { + show_status(StatusType::Message); + ctx.home.show_and_return(); + ctx.data_context = None; + } + } + CommandTag::Ping => { + ctx.home.show_and_return(); + ctx.data_context = None; + } + } +} + +/// This is called on errors that happen before a command could be decoded. +fn show_home_on_error_before_command_handling(ctx: &mut AppContext) { + ctx.home.show_and_return(); + ctx.data_context = None; +} diff --git a/crates/app-core/src/utils.rs b/crates/app-core/src/utils.rs index e9a4f3c..bca214a 100644 --- a/crates/app-core/src/utils.rs +++ b/crates/app-core/src/utils.rs @@ -18,9 +18,15 @@ use alloc::{borrow::Cow, format}; use core::fmt; -use mintlayer_messages::{Amount, OutputValue, StatusWord}; +use ledger_device_sdk::ecc::ECPublicKey; -use crate::mlcp; +use mintlayer_core_primitives::PUBLIC_KEY_HASH_SIZE; + +use mintlayer_messages::{ + Amount, OutputValue, PublicKeyHash, Secp256k1PublicKey, StatusWord, encode_to, +}; + +use crate::{hasher::Hasher, mlcp}; const DERIV_PATH_IDX_BIP44: usize = 0; const DERIV_PATH_IDX_COIN_TYPE: usize = 1; @@ -28,25 +34,36 @@ const DERIV_PATH_IDX_ACCOUNT_IDX: usize = 2; const DERIV_PATH_IDX_ADDR_PURPOSE: usize = 3; const DERIV_PATH_IDX_ADDR_IDX: usize = 4; -// Path should be at least [bip44, coin_type, account_index] +// Path should be at least [bip44', coin_type', account_index'] const DERIV_PATH_MIN_LEN: usize = 3; // For tx signing the path should also contain the purpose and the index. const DERIV_PATH_LEN_FOR_TX_SIGNING: usize = 5; -const DERIV_PATH_BIP44_ITEM: u32 = 44 + (1 << 31); +const HARDENED_DERIVATION_MASK: u32 = 1 << 31; +const DERIV_PATH_BIP44_ITEM: u32 = 44 | HARDENED_DERIVATION_MASK; + +const ADDR_PURPOSE_RECEIVE: u32 = 0; +const ADDR_PURPOSE_CHANGE: u32 = 1; pub fn check_derivation_path(path: &[u32], coin_type: mlcp::CoinType) -> Result<(), StatusWord> { - if path.len() < DERIV_PATH_MIN_LEN { - return Err(StatusWord::InvalidPath); - } + ensure!(path.len() >= DERIV_PATH_MIN_LEN, StatusWord::InvalidPath); - if path[DERIV_PATH_IDX_BIP44] != DERIV_PATH_BIP44_ITEM { - return Err(StatusWord::InvalidPath); - } + ensure!( + path[DERIV_PATH_IDX_BIP44] == DERIV_PATH_BIP44_ITEM, + StatusWord::InvalidPath + ); - if path[DERIV_PATH_IDX_COIN_TYPE] != coin_type.bip44_coin_type() { - return Err(StatusWord::InvalidPath); - } + // Note: bip44_coin_type already has the hardened bit set. + ensure!( + path[DERIV_PATH_IDX_COIN_TYPE] == coin_type.bip44_coin_type(), + StatusWord::InvalidPath + ); + + // Account index must be hardened. + ensure!( + (path[DERIV_PATH_IDX_ACCOUNT_IDX] & HARDENED_DERIVATION_MASK) != 0, + StatusWord::InvalidPath + ); Ok(()) } @@ -61,6 +78,18 @@ pub fn check_derivation_path_for_tx_signing( return Err(StatusWord::InvalidPath); } + let addr_purpose = path[DERIV_PATH_IDX_ADDR_PURPOSE]; + ensure!( + addr_purpose == ADDR_PURPOSE_RECEIVE || addr_purpose == ADDR_PURPOSE_CHANGE, + StatusWord::InvalidPath + ); + + // Key index must not be hardened. + ensure!( + (path[DERIV_PATH_IDX_ADDR_IDX] & HARDENED_DERIVATION_MASK) == 0, + StatusWord::InvalidPath + ); + Ok(CompressedDerivationPathForTxSigning { account_index: path[DERIV_PATH_IDX_ACCOUNT_IDX], addr_purpose: path[DERIV_PATH_IDX_ADDR_PURPOSE], @@ -86,6 +115,51 @@ impl CompressedDerivationPathForTxSigning { } } +pub fn ensure_change_output(path: &[u32], coin_type: mlcp::CoinType) -> Result<(), StatusWord> { + let parsed_path = check_derivation_path_for_tx_signing(path, coin_type)?; + if parsed_path.addr_purpose != ADDR_PURPOSE_CHANGE { + Err(StatusWord::InvalidPath) + } else { + Ok(()) + } +} + +pub fn compress_public_key( + public_key: &ECPublicKey<65, T>, +) -> Result { + let uncompressed_key = &public_key.pubkey; + if uncompressed_key[0] != 0x04 { + return Err(StatusWord::InvalidUncompressedPublicKey); + } + + let mut compressed_key = [0u8; 33]; + + let y_coordinate = &uncompressed_key[33..65]; + let prefix = if y_coordinate[31].is_multiple_of(2) { + 0x02 + } else { + 0x03 + }; + + compressed_key[0] = prefix; + + let x_coordinate = &uncompressed_key[1..33]; + compressed_key[1..].copy_from_slice(x_coordinate); + + Ok(Secp256k1PublicKey(compressed_key)) +} + +pub fn to_public_key_hash(pk: &Secp256k1PublicKey) -> Result { + let mut hasher = Hasher::new(); + + encode_to(&mlcp::PublicKey::Secp256k1Schnorr(*pk), &mut hasher); + + let full_hash = hasher.finalize()?; + let pkh: [u8; PUBLIC_KEY_HASH_SIZE] = cut_array(full_hash.as_fixed_bytes()); + + Ok(PublicKeyHash(pkh)) +} + /// Cut an array of Copy types to a smaller size. /// /// Fail at compile time if the destination size is bigger than the original. @@ -157,6 +231,15 @@ pub fn output_value_with_amount(value: &OutputValue, amount: Amount) -> OutputVa } } +/// Exit early if the given condition is not satisfied. +macro_rules! ensure { + ($cond:expr, $err:expr $(,)?) => { + ::core::primitive::bool::then($cond, || ()).ok_or_else(|| $err)? + }; +} + +pub(crate) use ensure; + #[cfg(test)] mod tests { use test_utils::prelude::*; diff --git a/crates/messages/Cargo.toml b/crates/messages/Cargo.toml index 438ef1e..bc30ac0 100644 --- a/crates/messages/Cargo.toml +++ b/crates/messages/Cargo.toml @@ -11,6 +11,7 @@ num-traits = { workspace = true, default-features = false } # more informative. But in the Ledger app we never examine or even print those errors, so enabling this # feature would only increase the size of the binary and make the app use more stack during decoding. parity-scale-codec = { workspace = true, default-features = false, features = ["derive"] } +strum = { workspace = true, default-features = false, features = ["derive"] } mintlayer-core-primitives.workspace = true diff --git a/crates/messages/src/lib.rs b/crates/messages/src/lib.rs index 7031553..8bc9026 100644 --- a/crates/messages/src/lib.rs +++ b/crates/messages/src/lib.rs @@ -30,10 +30,6 @@ test_utils::impl_main!(); #[cfg(test)] mod tests; -// TODO: need tests that ensure encoding stability - encode a certain message or a message part and -// expect concrete bytes, decode it back, expect the same object. -// See https://github.com/mintlayer/mintlayer-ledger-app/issues/16. - // TODO: types from mintlayer core primitives should probably not be used as part of the protocol // (but note that this will increase the size of the binary slightly - a test attempt at using distinct // types increased the binary from ~100Kb to ~106Kb). @@ -126,35 +122,36 @@ pub enum PingP1 { Dummy = 0, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct GetPubKeyReq { pub coin_type: CoinType, pub path: Bip32Path, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct SignMessageStartReq { - pub coin: CoinType, + pub coin_type: CoinType, pub addr_type: AddrType, pub path: Bip32Path, } -#[derive(Debug, Clone, Copy, Eq, PartialEq, Encode, Decode)] +#[derive(Debug, Clone, Copy, Eq, PartialEq, Encode, Decode, strum::EnumIter)] #[repr(u8)] pub enum TransactionVersion { #[codec(index = 0)] V1, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct SignTxStartReq { - pub coin: CoinType, + pub coin_type: CoinType, pub version: TransactionVersion, pub num_inputs: u32, pub num_outputs: u32, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq, strum::EnumDiscriminants)] +#[strum_discriminants(name(SignTxNextReqTag), derive(strum::EnumIter))] pub enum SignTxNextReq { #[codec(index = 0)] ProcessInput(Box), @@ -183,36 +180,31 @@ pub enum SignTxNextReq { // and input 1 with key A; in such a case the signature 0 will be valid for input 1 and vice versa. // This does not allow the host to change the reviewed transaction, but it means that the app must // not promise the user that a particular input was signed by the key specified in `addresses`. -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct TxInputData { pub addresses: Vec, pub input: TxInputWithAdditionalInfo, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct TxInputCommitmentData { pub commitment: SighashInputCommitment, } -// TODO: -// 1) In order to be able to detect change outputs, there should be a way of specifying the destination -// via a derivation path. -// Note: the contents of Destination::PublicKeyHash and Destination::PublicKey should probably be -// enums of the form `enum PublicKeyHash { Own(derivation path), Foreign(actual hash) }`. -// 2) Possible ways of handling change outputs (simplified version of what the cardano app seems to do): -// * a) require that all derivation paths (in inputs and in outputs) belong to the same account, -// fail if they don't; -// b) if an output is a simple Transfer to a change address in the account, omit it from review; -// if it's something more complicated, don't omit it from review, but mark is as change output. -// * Same as above, but only track (without failing) whether all inputs are signed with keys from the -// same account; if so and an output is a simple Transfer to a change address in that same account, -// omit the output from review. If the output references a change address but multiple accounts -// are referenced by inputs, or if the output is not a simple Transfer, then don't omit it, -// but mark it as change. +// TODO: currently change outputs are always shown during review. Though they are marked as change, +// it's still redundant to show them in most cases. +// One possible way of handling change outputs could be: track whether all inputs are signed with +// keys from the same account; if so and a change output is to an address in that same account, omit +// the output from review. // See https://github.com/mintlayer/mintlayer-ledger-app/issues/17. -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct TxOutputData { pub output: TxOutput, + + /// This field specifies that this output is a change output. If set, `output` must be a simple + /// `Transfer` with a `PublicKey` or `PublicKeyHash` destination corresponding to the specified + /// derivation path, which must be of the form "m/44'/coin_type'/account_idx'/1/change_idx". + pub change_path: Option, } #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] @@ -223,7 +215,8 @@ pub struct AdditionalOrderInfo { pub give_balance: Amount, } -#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] +#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, strum::EnumDiscriminants)] +#[strum_discriminants(name(AdditionalUtxoInfoTag), derive(strum::EnumIter))] pub enum AdditionalUtxoInfo { #[codec(index = 0)] Utxo(TxOutput), @@ -250,7 +243,8 @@ impl From for SighashInputCommitment { } } -#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] +#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, strum::EnumDiscriminants)] +#[strum_discriminants(name(TxInputWithAdditionalInfoTag), derive(strum::EnumIter))] pub enum TxInputWithAdditionalInfo { #[codec(index = 0)] Utxo(UtxoOutPoint, AdditionalUtxoInfo), @@ -300,7 +294,7 @@ impl TxInputWithAdditionalInfo { } } -#[derive(Encode, Decode, Clone, Copy, Debug, Eq, PartialEq, IntoPrimitive)] +#[derive(Encode, Decode, Clone, Copy, Debug, Eq, PartialEq, IntoPrimitive, strum::EnumIter)] #[repr(u8)] pub enum CoinType { Mainnet = 0, @@ -321,14 +315,14 @@ impl From for mlcp::CoinType { } #[repr(u8)] -#[derive(Encode, Decode, Clone, Copy, IntoPrimitive)] +#[derive(Encode, Decode, Debug, Clone, Copy, PartialEq, Eq, IntoPrimitive, strum::EnumIter)] pub enum AddrType { PublicKey = 0, PublicKeyHash = 1, } /// BIP32 path stored as an array of [`u32`]. -#[derive(Default, Encode, Decode, Clone)] +#[derive(Default, Encode, Decode, Debug, Clone, PartialEq, Eq)] pub struct Bip32Path(pub Vec); impl AsRef<[u32]> for Bip32Path { @@ -338,28 +332,28 @@ impl AsRef<[u32]> for Bip32Path { } /// Address path to be signed for an input -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct InputAddressPath { pub path: Bip32Path, pub multisig_idx: Option, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct UncompressedSecp256k1PublicKey(pub [u8; 65]); -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct ChainCode(pub [u8; 32]); -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct PublicKeyResponse { pub public_key: UncompressedSecp256k1PublicKey, pub chain_code: ChainCode, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct Signature(pub [u8; 64]); -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct TxInputSignatureResponse { pub signature: Signature, pub input_idx: u32, @@ -367,12 +361,13 @@ pub struct TxInputSignatureResponse { pub has_next: bool, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq)] pub struct MsgSignatureResponse { pub signature: Signature, } -#[derive(Encode, Decode)] +#[derive(Debug, Encode, Decode, PartialEq, Eq, strum::EnumDiscriminants)] +#[strum_discriminants(name(ResponseTag), derive(strum::EnumIter))] pub enum Response { #[codec(index = 0)] ExpectingNextChunk, @@ -392,11 +387,11 @@ pub enum Response { Pong, } -pub fn encode(t: T) -> Vec { +pub fn encode(t: &T) -> Vec { t.encode() } -pub fn encode_to(t: T, output: &mut O) +pub fn encode_to(t: &T, output: &mut O) where T: Encode, O: parity_scale_codec::Output, @@ -585,6 +580,14 @@ pub enum StatusWord { FillOrderSigRequested = 0xB015, #[display("Transaction has zero inputs")] TxWithZeroInputs = 0xB016, + #[display("Transaction has multiple reviewable inputs")] + TxWithMultipleReviewableInputs = 0xB017, + #[display("Wrong change output type")] + WrongChangeOutputType = 0xB018, + #[display("Wrong change output destination")] + WrongChangeOutputDestination = 0xB019, + #[display("Mismatched change output destination")] + MismatchedChangeOutputDestination = 0xB01A, // Ecc Errors #[display("ECC Carry")] diff --git a/crates/messages/src/tests/message_encoding.rs b/crates/messages/src/tests/message_encoding.rs new file mode 100644 index 0000000..408f1b0 --- /dev/null +++ b/crates/messages/src/tests/message_encoding.rs @@ -0,0 +1,2042 @@ +/***************************************************************************** + * Mintlayer Ledger App. + * (c) 2025-2026 RBB S.r.l. + * + * 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 alloc::{boxed::Box, vec}; + +use strum::IntoEnumIterator as _; + +use mintlayer_core_primitives::{ + AccountCommandTag, AccountSpendingTag, DestinationTag, HtlcSecretHash, NftIssuanceTag, + NftIssuanceV0, OrderAccountCommandTag, OutPointSourceIdTag, OutputTimeLockTag, OutputValueTag, + PublicKeyTag, SchnorrkelPublicKey, SighashInputCommitmentTag, TokenIssuanceTag, + TokenIssuanceV1, TokenTotalSupplyTag, TxInputTag, TxOutputTag, VrfPublicKeyTag, +}; + +use test_utils::prelude::*; + +use crate::{ + AccountCommand, AccountNonce, AccountOutPoint, AccountSpending, AdditionalOrderInfo, + AdditionalUtxoInfo, AdditionalUtxoInfoTag, AddrType, Amount, Bip32Path, BlockHeight, + BlockTimestamp, BlocksCount, ChainCode, CoinType, DelegationId, Destination, GenBlockId, + GetPubKeyReq, H256, HashedTimelockContract, InputAddressPath, IsTokenFreezable, + IsTokenUnfreezable, MsgSignatureResponse, NftIssuance, OrderAccountCommand, OrderData, OrderId, + OutPointSourceId, OutputTimeLock, OutputValue, PerThousand, PoolId, PublicKey, PublicKeyHash, + PublicKeyResponse, Response, ResponseTag, ScriptId, SecondsCount, Secp256k1PublicKey, + SighashInputCommitment, SignMessageStartReq, SignTxNextReq, SignTxNextReqTag, SignTxStartReq, + Signature, StakePoolData, TokenId, TokenIssuance, TokenTotalSupply, TransactionId, + TransactionVersion, TxInput, TxInputCommitmentData, TxInputData, TxInputSignatureResponse, + TxInputWithAdditionalInfo, TxInputWithAdditionalInfoTag, TxOutput, TxOutputData, + UncompressedSecp256k1PublicKey, UtxoOutPoint, VrfPublicKey, decode_all, encode, +}; + +#[test_item] +fn test_response() { + for tag in ResponseTag::iter() { + match tag { + ResponseTag::ExpectingNextChunk => { + let obj = Response::ExpectingNextChunk; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + ResponseTag::PublicKey => { + let obj = Response::PublicKey(sample_public_key_response()); + let expected_enc_data = [ + 1, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + ResponseTag::TxSetup => { + let obj = Response::TxSetup; + let expected_enc_data = [2]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + ResponseTag::TxNext => { + let obj = Response::TxNext; + let expected_enc_data = [3]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + ResponseTag::TxInputSignature => { + let obj = Response::TxInputSignature(sample_tx_input_signature_response()); + let expected_enc_data = [ + 4, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 123, 0, 0, 0, 1, 234, 0, 0, 0, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + ResponseTag::MessageSetup => { + let obj = Response::MessageSetup; + let expected_enc_data = [5]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + ResponseTag::MessageSignature => { + let obj = Response::MessageSignature(sample_msg_signature_response()); + let expected_enc_data = [ + 6, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + ResponseTag::Pong => { + let obj = Response::Pong; + let expected_enc_data = [7]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Response = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_public_key_response() { + let obj = sample_public_key_response(); + let expected_enc_data = [ + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: PublicKeyResponse = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_tx_input_signature_response() { + let obj = sample_tx_input_signature_response(); + let expected_enc_data = [ + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 123, 0, 0, 0, 1, 234, 0, 0, 0, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInputSignatureResponse = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_msg_signature_response() { + let obj = sample_msg_signature_response(); + let expected_enc_data = [ + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: MsgSignatureResponse = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_get_pub_key_req() { + let obj = sample_get_pub_key_req(); + let expected_enc_data = [0, 12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: GetPubKeyReq = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_sign_msg_start_req() { + let obj = sample_sign_message_start_req(); + let expected_enc_data = [0, 0, 12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SignMessageStartReq = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_sign_tx_start_req() { + let obj = sample_sign_tx_start_req(); + let expected_enc_data = [0, 0, 12, 0, 0, 0, 23, 0, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SignTxStartReq = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_sign_tx_next_req() { + for tag in SignTxNextReqTag::iter() { + match tag { + SignTxNextReqTag::ProcessInput => { + let obj = SignTxNextReq::ProcessInput(Box::new(sample_tx_input_data())); + let expected_enc_data = [ + 0, 4, 12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1, 123, 0, 0, 0, 1, 237, 1, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SignTxNextReq = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + SignTxNextReqTag::ProcessInputCommitment => { + let obj = SignTxNextReq::ProcessInputCommitment(Box::new( + sample_tx_input_commitment_data(), + )); + let expected_enc_data = [1, 1, 2, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SignTxNextReq = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + SignTxNextReqTag::ProcessOutput => { + let obj = SignTxNextReq::ProcessOutput(Box::new(sample_tx_output_data())); + let expected_enc_data = + [2, 2, 0, 237, 1, 1, 12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SignTxNextReq = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + SignTxNextReqTag::ReturnNextSignature => { + let obj = SignTxNextReq::ReturnNextSignature; + let expected_enc_data = [3]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SignTxNextReq = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_tx_input_data() { + let obj = sample_tx_input_data(); + let expected_enc_data = [ + 4, 12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1, 123, 0, 0, 0, 1, 237, 1, 0, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInputData = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_tx_input_commitment_data() { + let obj = sample_tx_input_commitment_data(); + let expected_enc_data = [1, 2, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInputCommitmentData = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_tx_output_data() { + let obj = sample_tx_output_data(); + let expected_enc_data = [2, 0, 237, 1, 1, 12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutputData = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_tx_input_with_additional_info() { + for tag in TxInputWithAdditionalInfoTag::iter() { + match tag { + TxInputWithAdditionalInfoTag::Utxo => { + let obj = TxInputWithAdditionalInfo::Utxo( + sample_utxo_out_point(), + AdditionalUtxoInfo::Utxo(sample_tx_output()), + ); + let expected_enc_data = [ + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 123, 0, 0, 0, 0, 2, 0, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInputWithAdditionalInfo = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxInputWithAdditionalInfoTag::Account => { + let obj = TxInputWithAdditionalInfo::Account(sample_account_out_point()); + let expected_enc_data = [ + 1, 237, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInputWithAdditionalInfo = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxInputWithAdditionalInfoTag::AccountCommand => { + let obj = TxInputWithAdditionalInfo::AccountCommand( + AccountNonce(123), + sample_account_command(), + ); + let expected_enc_data = [ + 2, 237, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInputWithAdditionalInfo = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxInputWithAdditionalInfoTag::OrderAccountCommand => { + let obj = TxInputWithAdditionalInfo::OrderAccountCommand( + sample_order_account_command(), + sample_additional_order_info(), + ); + let expected_enc_data = [ + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 237, 1, 0, 237, 1, 237, 1, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInputWithAdditionalInfo = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_additional_utxo_info() { + for tag in AdditionalUtxoInfoTag::iter() { + match tag { + AdditionalUtxoInfoTag::Utxo => { + let obj = AdditionalUtxoInfo::Utxo(sample_tx_output()); + let expected_enc_data = [0, 2, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AdditionalUtxoInfo = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AdditionalUtxoInfoTag::UtxoWithPoolData => { + let obj = AdditionalUtxoInfo::UtxoWithPoolData { + utxo: sample_tx_output(), + staker_balance: sample_amount(), + }; + let expected_enc_data = [1, 2, 0, 237, 1, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AdditionalUtxoInfo = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_additional_order_info() { + let obj = sample_additional_order_info(); + let expected_enc_data = [0, 237, 1, 0, 237, 1, 237, 1, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AdditionalOrderInfo = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_tx_input() { + for tag in TxInputTag::iter() { + match tag { + TxInputTag::Utxo => { + let obj = TxInput::Utxo(sample_utxo_out_point()); + let expected_enc_data = [ + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 123, 0, 0, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxInputTag::Account => { + let obj = TxInput::Account(sample_account_out_point()); + let expected_enc_data = [ + 1, 237, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxInputTag::AccountCommand => { + let obj = TxInput::AccountCommand(AccountNonce(123), sample_account_command()); + let expected_enc_data = [ + 2, 237, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxInputTag::OrderAccountCommand => { + let obj = TxInput::OrderAccountCommand(sample_order_account_command()); + let expected_enc_data = [ + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxInput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_tx_output() { + for tag in TxOutputTag::iter() { + match tag { + TxOutputTag::Transfer => { + let obj = TxOutput::Transfer(sample_output_value(), sample_destination()); + let expected_enc_data = [0, 0, 237, 1, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::LockThenTransfer => { + let obj = TxOutput::LockThenTransfer( + sample_output_value(), + sample_destination(), + sample_output_time_lock(), + ); + let expected_enc_data = [1, 0, 237, 1, 0, 2, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::Burn => { + let obj = TxOutput::Burn(sample_output_value()); + let expected_enc_data = [2, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::CreateStakePool => { + let obj = TxOutput::CreateStakePool(sample_pool_id(), sample_stake_pool_data()); + let expected_enc_data = [ + 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 237, 1, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 123, 0, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::ProduceBlockFromStake => { + let obj = TxOutput::ProduceBlockFromStake(sample_destination(), sample_pool_id()); + let expected_enc_data = [ + 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::CreateDelegationId => { + let obj = TxOutput::CreateDelegationId(sample_destination(), sample_pool_id()); + let expected_enc_data = [ + 5, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::DelegateStaking => { + let obj = TxOutput::DelegateStaking(sample_amount(), sample_delegation_id()); + let expected_enc_data = [ + 6, 237, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::IssueFungibleToken => { + let obj = TxOutput::IssueFungibleToken(TokenIssuance::V1( + sample_token_issuance_v1(TokenTotalSupply::Unlimited), + )); + let expected_enc_data = [7, 1, 12, 1, 2, 3, 8, 12, 4, 5, 6, 2, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::IssueNft => { + let obj = TxOutput::IssueNft( + sample_token_id(), + NftIssuance::V0(sample_nft_issuance_v0(Some(sample_public_key()))), + sample_destination(), + ); + let expected_enc_data = [ + 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 1, 2, 3, 12, 4, 5, 6, + 12, 7, 8, 9, 12, 10, 11, 12, 12, 13, 14, 15, 12, 16, 17, 18, 12, 19, 20, 21, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::DataDeposit => { + let obj = TxOutput::DataDeposit(vec![1, 2, 3]); + let expected_enc_data = [9, 12, 1, 2, 3]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::Htlc => { + let obj = TxOutput::Htlc(sample_output_value(), sample_hashed_timelock_contract()); + let expected_enc_data = [ + 10, 0, 237, 1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 0, 2, 237, 1, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TxOutputTag::CreateOrder => { + let obj = TxOutput::CreateOrder(sample_order_data()); + let expected_enc_data = [11, 0, 0, 237, 1, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TxOutput = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_sighash_input_commitment() { + for tag in SighashInputCommitmentTag::iter() { + match tag { + SighashInputCommitmentTag::None => { + let obj = SighashInputCommitment::None; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SighashInputCommitment = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + SighashInputCommitmentTag::Utxo => { + let obj = SighashInputCommitment::Utxo(sample_tx_output()); + let expected_enc_data = [1, 2, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SighashInputCommitment = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + SighashInputCommitmentTag::ProduceBlockFromStakeUtxo => { + let obj = SighashInputCommitment::ProduceBlockFromStakeUtxo { + utxo: sample_tx_output(), + staker_balance: sample_amount(), + }; + let expected_enc_data = [2, 2, 0, 237, 1, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SighashInputCommitment = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + SighashInputCommitmentTag::FillOrderAccountCommand => { + let obj = SighashInputCommitment::FillOrderAccountCommand { + initially_asked: sample_output_value(), + initially_given: sample_output_value(), + }; + let expected_enc_data = [3, 0, 237, 1, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SighashInputCommitment = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + SighashInputCommitmentTag::ConcludeOrderAccountCommand => { + let obj = SighashInputCommitment::ConcludeOrderAccountCommand { + initially_asked: sample_output_value(), + initially_given: sample_output_value(), + ask_balance: sample_amount(), + give_balance: sample_amount(), + }; + let expected_enc_data = [4, 0, 237, 1, 0, 237, 1, 237, 1, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SighashInputCommitment = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_account_out_point() { + let obj = sample_account_out_point(); + let expected_enc_data = [ + 237, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountOutPoint = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_account_spending() { + for tag in AccountSpendingTag::iter() { + match tag { + AccountSpendingTag::DelegationBalance => { + let obj = + AccountSpending::DelegationBalance(sample_delegation_id(), sample_amount()); + let expected_enc_data = [ + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountSpending = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_account_command() { + for tag in AccountCommandTag::iter() { + match tag { + AccountCommandTag::MintTokens => { + let obj = AccountCommand::MintTokens(sample_token_id(), sample_amount()); + let expected_enc_data = [ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::UnmintTokens => { + let obj = AccountCommand::UnmintTokens(sample_token_id()); + let expected_enc_data = [ + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::LockTokenSupply => { + let obj = AccountCommand::LockTokenSupply(sample_token_id()); + let expected_enc_data = [ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::FreezeToken => { + let obj = AccountCommand::FreezeToken(sample_token_id(), IsTokenUnfreezable::No); + let expected_enc_data = [ + 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::UnfreezeToken => { + let obj = AccountCommand::UnfreezeToken(sample_token_id()); + let expected_enc_data = [ + 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::ChangeTokenAuthority => { + let obj = + AccountCommand::ChangeTokenAuthority(sample_token_id(), sample_destination()); + let expected_enc_data = [ + 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::ConcludeOrder => { + let obj = AccountCommand::ConcludeOrder(sample_order_id()); + let expected_enc_data = [ + 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::FillOrder => { + let obj = AccountCommand::FillOrder( + sample_order_id(), + sample_amount(), + sample_destination(), + ); + let expected_enc_data = [ + 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 237, 1, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AccountCommandTag::ChangeTokenMetadataUri => { + let obj = AccountCommand::ChangeTokenMetadataUri(sample_token_id(), vec![1, 2, 3]); + let expected_enc_data = [ + 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 12, 1, 2, 3, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_order_account_command() { + for tag in OrderAccountCommandTag::iter() { + match tag { + OrderAccountCommandTag::FillOrder => { + let obj = OrderAccountCommand::FillOrder(sample_order_id(), sample_amount()); + let expected_enc_data = [ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OrderAccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + OrderAccountCommandTag::FreezeOrder => { + let obj = OrderAccountCommand::FreezeOrder(sample_order_id()); + let expected_enc_data = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OrderAccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + OrderAccountCommandTag::ConcludeOrder => { + let obj = OrderAccountCommand::ConcludeOrder(sample_order_id()); + let expected_enc_data = [ + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OrderAccountCommand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_utxo_out_point() { + let obj = sample_utxo_out_point(); + let expected_enc_data = [ + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 123, 0, 0, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: UtxoOutPoint = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_out_point_source_id() { + for tag in OutPointSourceIdTag::iter() { + match tag { + OutPointSourceIdTag::Transaction => { + let obj = OutPointSourceId::Transaction(sample_transaction_id()); + let expected_enc_data = [ + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutPointSourceId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + OutPointSourceIdTag::BlockReward => { + let obj = OutPointSourceId::BlockReward(sample_gen_block_id()); + let expected_enc_data = [ + 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutPointSourceId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_stake_pool_data() { + let obj = sample_stake_pool_data(); + let expected_enc_data = [ + 237, 1, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 123, 0, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: StakePoolData = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_order_data() { + let obj = sample_order_data(); + let expected_enc_data = [0, 0, 237, 1, 0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OrderData = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_hashed_timelock_contract() { + let obj = sample_hashed_timelock_contract(); + let expected_enc_data = [ + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 2, 237, + 1, 0, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: HashedTimelockContract = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_token_issuance() { + for tag in TokenIssuanceTag::iter() { + match tag { + TokenIssuanceTag::V1 => { + let obj = TokenIssuance::V1(sample_token_issuance_v1(TokenTotalSupply::Unlimited)); + let expected_enc_data = [1, 12, 1, 2, 3, 8, 12, 4, 5, 6, 2, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TokenIssuance = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_token_issuance_v1() { + let obj = sample_token_issuance_v1(TokenTotalSupply::Unlimited); + let expected_enc_data = [12, 1, 2, 3, 8, 12, 4, 5, 6, 2, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TokenIssuanceV1 = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_token_total_supply() { + for tag in TokenTotalSupplyTag::iter() { + match tag { + TokenTotalSupplyTag::Fixed => { + let obj = TokenTotalSupply::Fixed(sample_amount()); + let expected_enc_data = [0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TokenTotalSupply = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TokenTotalSupplyTag::Lockable => { + let obj = TokenTotalSupply::Lockable; + let expected_enc_data = [1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TokenTotalSupply = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + TokenTotalSupplyTag::Unlimited => { + let obj = TokenTotalSupply::Unlimited; + let expected_enc_data = [2]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TokenTotalSupply = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_nft_issuance() { + for tag in NftIssuanceTag::iter() { + match tag { + NftIssuanceTag::V0 => { + let obj = NftIssuance::V0(sample_nft_issuance_v0(Some(sample_public_key()))); + let expected_enc_data = [ + 0, 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 1, 2, 3, 12, 4, 5, 6, 12, 7, 8, 9, 12, 10, + 11, 12, 12, 13, 14, 15, 12, 16, 17, 18, 12, 19, 20, 21, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: NftIssuance = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_nft_issuance_v0() { + let obj = sample_nft_issuance_v0(Some(sample_public_key())); + let expected_enc_data = [ + 1, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 12, 1, 2, 3, 12, 4, 5, 6, 12, 7, 8, 9, 12, 10, 11, 12, 12, 13, 14, 15, 12, + 16, 17, 18, 12, 19, 20, 21, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: NftIssuanceV0 = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_destination() { + for tag in DestinationTag::iter() { + match tag { + DestinationTag::AnyoneCanSpend => { + let obj = Destination::AnyoneCanSpend; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Destination = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + DestinationTag::PublicKeyHash => { + let obj = Destination::PublicKeyHash(sample_public_key_hash()); + let expected_enc_data = [ + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Destination = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + DestinationTag::PublicKey => { + let obj = Destination::PublicKey(sample_public_key()); + let expected_enc_data = [ + 2, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Destination = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + DestinationTag::ScriptHash => { + let obj = Destination::ScriptHash(sample_script_id()); + let expected_enc_data = [ + 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Destination = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + DestinationTag::ClassicMultisig => { + let obj = Destination::ClassicMultisig(sample_public_key_hash()); + let expected_enc_data = [ + 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Destination = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_public_key() { + for tag in PublicKeyTag::iter() { + match tag { + PublicKeyTag::Secp256k1Schnorr => { + let obj = PublicKey::Secp256k1Schnorr(sample_secp256k1_public_key()); + let expected_enc_data = [ + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: PublicKey = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_vrf_public_key() { + for tag in VrfPublicKeyTag::iter() { + match tag { + VrfPublicKeyTag::Schnorrkel => { + let obj = VrfPublicKey::Schnorrkel(sample_schnorrkel_public_key()); + let expected_enc_data = [ + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: VrfPublicKey = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_output_value() { + for tag in OutputValueTag::iter() { + match tag { + OutputValueTag::Coin => { + let obj = OutputValue::Coin(sample_amount()); + let expected_enc_data = [0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutputValue = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + OutputValueTag::TokenV1 => { + let obj = OutputValue::TokenV1(sample_token_id(), sample_amount()); + let expected_enc_data = [ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 237, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutputValue = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_output_time_lock() { + for tag in OutputTimeLockTag::iter() { + match tag { + OutputTimeLockTag::UntilHeight => { + let obj = OutputTimeLock::UntilHeight(BlockHeight(123)); + let expected_enc_data = [0, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutputTimeLock = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + OutputTimeLockTag::UntilTime => { + let obj = OutputTimeLock::UntilTime(BlockTimestamp(SecondsCount(123))); + let expected_enc_data = [1, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutputTimeLock = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + OutputTimeLockTag::ForBlockCount => { + let obj = OutputTimeLock::ForBlockCount(BlocksCount(123)); + let expected_enc_data = [2, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutputTimeLock = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + OutputTimeLockTag::ForSeconds => { + let obj = OutputTimeLock::ForSeconds(SecondsCount(123)); + let expected_enc_data = [3, 237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OutputTimeLock = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_input_address_path() { + let obj = sample_input_address_path(); + let expected_enc_data = [12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1, 123, 0, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: InputAddressPath = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_bip32_path() { + let obj = sample_bip32_path(); + let expected_enc_data = [12, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Bip32Path = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_coin_type() { + for coin_type in CoinType::iter() { + match coin_type { + CoinType::Mainnet => { + let obj = CoinType::Mainnet; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: CoinType = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + CoinType::Testnet => { + let obj = CoinType::Testnet; + let expected_enc_data = [1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: CoinType = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + CoinType::Regtest => { + let obj = CoinType::Regtest; + let expected_enc_data = [2]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: CoinType = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + CoinType::Signet => { + let obj = CoinType::Signet; + let expected_enc_data = [3]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: CoinType = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_addr_type() { + for addr_type in AddrType::iter() { + match addr_type { + AddrType::PublicKey => { + let obj = AddrType::PublicKey; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AddrType = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + AddrType::PublicKeyHash => { + let obj = AddrType::PublicKeyHash; + let expected_enc_data = [1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: AddrType = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_tx_version() { + for version in TransactionVersion::iter() { + match version { + TransactionVersion::V1 => { + let obj = TransactionVersion::V1; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TransactionVersion = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_uncompressed_secp256k1_public_key() { + let obj = UncompressedSecp256k1PublicKey([0xAB; 65]); + let expected_enc_data = [ + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: UncompressedSecp256k1PublicKey = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_chain_code() { + let obj = ChainCode([0xCD; 32]); + let expected_enc_data = [ + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: ChainCode = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_signature() { + let obj = sample_signature(); + let expected_enc_data = [ + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Signature = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_htlc_secret_hash() { + let obj: HtlcSecretHash = [0x0B; 20].into(); + let expected_enc_data = [ + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: HtlcSecretHash = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_per_thousand() { + let obj = PerThousand(123); + let expected_enc_data = [123, 0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: PerThousand = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_public_key_hash() { + let obj = sample_public_key_hash(); + let expected_enc_data = [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: PublicKeyHash = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_secp256k1_public_key() { + let obj = sample_secp256k1_public_key(); + let expected_enc_data = [ + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: Secp256k1PublicKey = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_schnorrkel_public_key() { + let obj = sample_schnorrkel_public_key(); + let expected_enc_data = [ + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: SchnorrkelPublicKey = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_h256() { + let obj = sample_h256(0x01); + let expected_enc_data = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: H256 = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_order_id() { + let obj = sample_order_id(); + let expected_enc_data = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: OrderId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_token_id() { + let obj = sample_token_id(); + let expected_enc_data = [ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TokenId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_delegation_id() { + let obj = sample_delegation_id(); + let expected_enc_data = [ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: DelegationId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_pool_id() { + let obj = sample_pool_id(); + let expected_enc_data = [ + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: PoolId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_transaction_id() { + let obj = sample_transaction_id(); + let expected_enc_data = [ + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: TransactionId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_gen_block_id() { + let obj = sample_gen_block_id(); + let expected_enc_data = [ + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: GenBlockId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_script_id() { + let obj = sample_script_id(); + let expected_enc_data = [ + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, + ]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: ScriptId = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_is_token_freezable() { + for freezable in IsTokenFreezable::iter() { + match freezable { + IsTokenFreezable::No => { + let obj = IsTokenFreezable::No; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: IsTokenFreezable = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + IsTokenFreezable::Yes => { + let obj = IsTokenFreezable::Yes; + let expected_enc_data = [1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: IsTokenFreezable = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_is_token_unfreezable() { + for unfreezable in IsTokenUnfreezable::iter() { + match unfreezable { + IsTokenUnfreezable::No => { + let obj = IsTokenUnfreezable::No; + let expected_enc_data = [0]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: IsTokenUnfreezable = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + IsTokenUnfreezable::Yes => { + let obj = IsTokenUnfreezable::Yes; + let expected_enc_data = [1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, &expected_enc_data); + let decoded_obj: IsTokenUnfreezable = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } + } + } +} + +#[test_item] +fn test_block_timestamp() { + let obj = BlockTimestamp(SecondsCount(123)); + let expected_enc_data = [237, 1]; + + let enc_data = encode(&obj); + assert_eq!(enc_data, expected_enc_data); + let decoded_obj: BlockTimestamp = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); +} + +#[test_item] +fn test_account_nonce() { + let tests = [ + (AccountNonce(0), vec![0]), + (AccountNonce(1_u64 << 6), vec![1, 1]), + (AccountNonce(1_u64 << 14), vec![2, 0, 1, 0]), + (AccountNonce(1_u64 << 30), vec![3, 0, 0, 0, 64]), + (AccountNonce(1_u64 << 32), vec![7, 0, 0, 0, 0, 1]), + (AccountNonce(1_u64 << 40), vec![11, 0, 0, 0, 0, 0, 1]), + (AccountNonce(1_u64 << 48), vec![15, 0, 0, 0, 0, 0, 0, 1]), + (AccountNonce(1_u64 << 56), vec![19, 0, 0, 0, 0, 0, 0, 0, 1]), + ( + AccountNonce(1_u64 << 63), + vec![19, 0, 0, 0, 0, 0, 0, 0, 128], + ), + ]; + + for (obj, expected_enc_data) in tests { + let enc_data = encode(&obj); + assert_eq!(enc_data, expected_enc_data); + let decoded_obj: AccountNonce = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } +} + +#[test_item] +fn test_block_height() { + let tests = [ + (BlockHeight(0), vec![0]), + (BlockHeight(1_u64 << 6), vec![1, 1]), + (BlockHeight(1_u64 << 14), vec![2, 0, 1, 0]), + (BlockHeight(1_u64 << 30), vec![3, 0, 0, 0, 64]), + (BlockHeight(1_u64 << 32), vec![7, 0, 0, 0, 0, 1]), + (BlockHeight(1_u64 << 40), vec![11, 0, 0, 0, 0, 0, 1]), + (BlockHeight(1_u64 << 48), vec![15, 0, 0, 0, 0, 0, 0, 1]), + (BlockHeight(1_u64 << 56), vec![19, 0, 0, 0, 0, 0, 0, 0, 1]), + (BlockHeight(1_u64 << 63), vec![19, 0, 0, 0, 0, 0, 0, 0, 128]), + ]; + + for (obj, expected_enc_data) in tests { + let enc_data = encode(&obj); + assert_eq!(enc_data, expected_enc_data); + let decoded_obj: BlockHeight = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } +} + +#[test_item] +fn test_blocks_count() { + let tests = [ + (BlocksCount(0), vec![0]), + (BlocksCount(1_u64 << 6), vec![1, 1]), + (BlocksCount(1_u64 << 14), vec![2, 0, 1, 0]), + (BlocksCount(1_u64 << 30), vec![3, 0, 0, 0, 64]), + (BlocksCount(1_u64 << 32), vec![7, 0, 0, 0, 0, 1]), + (BlocksCount(1_u64 << 40), vec![11, 0, 0, 0, 0, 0, 1]), + (BlocksCount(1_u64 << 48), vec![15, 0, 0, 0, 0, 0, 0, 1]), + (BlocksCount(1_u64 << 56), vec![19, 0, 0, 0, 0, 0, 0, 0, 1]), + (BlocksCount(1_u64 << 63), vec![19, 0, 0, 0, 0, 0, 0, 0, 128]), + ]; + + for (obj, expected_enc_data) in tests { + let enc_data = encode(&obj); + assert_eq!(enc_data, expected_enc_data); + let decoded_obj: BlocksCount = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } +} + +#[test_item] +fn test_seconds_count() { + let tests = [ + (SecondsCount(0), vec![0]), + (SecondsCount(1_u64 << 6), vec![1, 1]), + (SecondsCount(1_u64 << 14), vec![2, 0, 1, 0]), + (SecondsCount(1_u64 << 30), vec![3, 0, 0, 0, 64]), + (SecondsCount(1_u64 << 32), vec![7, 0, 0, 0, 0, 1]), + (SecondsCount(1_u64 << 40), vec![11, 0, 0, 0, 0, 0, 1]), + (SecondsCount(1_u64 << 48), vec![15, 0, 0, 0, 0, 0, 0, 1]), + (SecondsCount(1_u64 << 56), vec![19, 0, 0, 0, 0, 0, 0, 0, 1]), + ( + SecondsCount(1_u64 << 63), + vec![19, 0, 0, 0, 0, 0, 0, 0, 128], + ), + ]; + + for (obj, expected_enc_data) in tests { + let enc_data = encode(&obj); + assert_eq!(enc_data, expected_enc_data); + let decoded_obj: SecondsCount = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } +} + +#[test_item] +fn test_amount() { + let tests = [ + (Amount::from_atoms(0), vec![0]), + (Amount::from_atoms(1_u128 << 6), vec![1, 1]), + (Amount::from_atoms(1_u128 << 14), vec![2, 0, 1, 0]), + (Amount::from_atoms(1_u128 << 30), vec![3, 0, 0, 0, 64]), + (Amount::from_atoms(1_u128 << 32), vec![7, 0, 0, 0, 0, 1]), + (Amount::from_atoms(1_u128 << 40), vec![11, 0, 0, 0, 0, 0, 1]), + ( + Amount::from_atoms(1_u128 << 48), + vec![15, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 56), + vec![19, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 64), + vec![23, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 72), + vec![27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 80), + vec![31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 88), + vec![35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 96), + vec![39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 104), + vec![43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 112), + vec![47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 120), + vec![51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], + ), + ( + Amount::from_atoms(1_u128 << 127), + vec![51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128], + ), + ]; + + for (obj, expected_enc_data) in tests { + let enc_data = encode(&obj); + assert_eq!(enc_data, expected_enc_data); + let decoded_obj: Amount = decode_all(&enc_data).unwrap(); + assert_eq!(decoded_obj, obj); + } +} + +fn sample_get_pub_key_req() -> GetPubKeyReq { + GetPubKeyReq { + coin_type: CoinType::Mainnet, + path: sample_bip32_path(), + } +} + +fn sample_sign_message_start_req() -> SignMessageStartReq { + SignMessageStartReq { + coin_type: CoinType::Mainnet, + addr_type: AddrType::PublicKey, + path: sample_bip32_path(), + } +} + +fn sample_sign_tx_start_req() -> SignTxStartReq { + SignTxStartReq { + coin_type: CoinType::Mainnet, + version: TransactionVersion::V1, + num_inputs: 12, + num_outputs: 23, + } +} + +fn sample_tx_input_data() -> TxInputData { + TxInputData { + addresses: vec![sample_input_address_path()], + input: sample_tx_input_with_additional_info(), + } +} + +fn sample_tx_input_commitment_data() -> TxInputCommitmentData { + TxInputCommitmentData { + commitment: SighashInputCommitment::Utxo(sample_tx_output()), + } +} + +fn sample_tx_output_data() -> TxOutputData { + TxOutputData { + output: sample_tx_output(), + change_path: Some(sample_bip32_path()), + } +} + +fn sample_public_key_response() -> PublicKeyResponse { + PublicKeyResponse { + public_key: UncompressedSecp256k1PublicKey([0xAB; 65]), + chain_code: ChainCode([0xCD; 32]), + } +} + +fn sample_tx_input_signature_response() -> TxInputSignatureResponse { + TxInputSignatureResponse { + signature: sample_signature(), + input_idx: 123, + multisig_idx: Some(234), + has_next: true, + } +} + +fn sample_msg_signature_response() -> MsgSignatureResponse { + MsgSignatureResponse { + signature: sample_signature(), + } +} + +fn sample_tx_input_with_additional_info() -> TxInputWithAdditionalInfo { + TxInputWithAdditionalInfo::Account(sample_account_out_point()) +} + +fn sample_additional_order_info() -> AdditionalOrderInfo { + AdditionalOrderInfo { + initially_asked: sample_output_value(), + initially_given: sample_output_value(), + ask_balance: sample_amount(), + give_balance: sample_amount(), + } +} + +fn sample_tx_output() -> TxOutput { + TxOutput::Burn(sample_output_value()) +} + +fn sample_account_out_point() -> AccountOutPoint { + AccountOutPoint { + nonce: AccountNonce(123), + spending: sample_account_spending(), + } +} + +fn sample_account_spending() -> AccountSpending { + AccountSpending::DelegationBalance(sample_delegation_id(), sample_amount()) +} + +fn sample_account_command() -> AccountCommand { + AccountCommand::UnmintTokens(sample_token_id()) +} + +fn sample_order_account_command() -> OrderAccountCommand { + OrderAccountCommand::FreezeOrder(sample_order_id()) +} + +fn sample_utxo_out_point() -> UtxoOutPoint { + UtxoOutPoint::new(sample_out_point_source_id(), 123) +} + +fn sample_out_point_source_id() -> OutPointSourceId { + OutPointSourceId::Transaction(sample_transaction_id()) +} + +fn sample_stake_pool_data() -> StakePoolData { + StakePoolData { + pledge: sample_amount(), + staker: sample_destination(), + vrf_public_key: sample_vrf_public_key(), + decommission_key: sample_destination(), + margin_ratio_per_thousand: PerThousand(123), + cost_per_block: sample_amount(), + } +} + +fn sample_order_data() -> OrderData { + OrderData { + conclude_key: sample_destination(), + ask: sample_output_value(), + give: sample_output_value(), + } +} + +fn sample_hashed_timelock_contract() -> HashedTimelockContract { + HashedTimelockContract { + secret_hash: [0x0B; 20].into(), + spend_key: sample_destination(), + refund_timelock: sample_output_time_lock(), + refund_key: sample_destination(), + } +} + +fn sample_token_issuance_v1(total_supply: TokenTotalSupply) -> TokenIssuanceV1 { + TokenIssuanceV1 { + token_ticker: vec![1, 2, 3], + number_of_decimals: 8, + metadata_uri: vec![4, 5, 6], + total_supply, + authority: sample_destination(), + is_freezable: IsTokenFreezable::No, + } +} + +fn sample_nft_issuance_v0(creator: Option) -> NftIssuanceV0 { + NftIssuanceV0 { + creator, + name: vec![1, 2, 3], + description: vec![4, 5, 6], + ticker: vec![7, 8, 9], + icon_uri: vec![10, 11, 12], + additional_metadata_uri: vec![13, 14, 15], + media_uri: vec![16, 17, 18], + media_hash: vec![19, 20, 21], + } +} + +fn sample_destination() -> Destination { + Destination::AnyoneCanSpend +} + +fn sample_output_value() -> OutputValue { + OutputValue::Coin(sample_amount()) +} + +fn sample_output_time_lock() -> OutputTimeLock { + OutputTimeLock::ForBlockCount(BlocksCount(123)) +} + +fn sample_public_key() -> PublicKey { + PublicKey::Secp256k1Schnorr(sample_secp256k1_public_key()) +} + +fn sample_vrf_public_key() -> VrfPublicKey { + VrfPublicKey::Schnorrkel(sample_schnorrkel_public_key()) +} + +fn sample_input_address_path() -> InputAddressPath { + InputAddressPath { + path: sample_bip32_path(), + multisig_idx: Some(123), + } +} + +fn sample_bip32_path() -> Bip32Path { + Bip32Path(vec![1, 2, 3]) +} + +fn sample_amount() -> Amount { + Amount::from_atoms(123) +} + +fn sample_order_id() -> OrderId { + OrderId::new(sample_h256(0x01)) +} + +fn sample_token_id() -> TokenId { + TokenId::new(sample_h256(0x02)) +} + +fn sample_delegation_id() -> DelegationId { + DelegationId::new(sample_h256(0x03)) +} + +fn sample_pool_id() -> PoolId { + PoolId::new(sample_h256(0x04)) +} + +fn sample_transaction_id() -> TransactionId { + TransactionId::new(sample_h256(0x05)) +} + +fn sample_gen_block_id() -> GenBlockId { + GenBlockId::new(sample_h256(0x06)) +} + +fn sample_script_id() -> ScriptId { + ScriptId::new(sample_h256(0x07)) +} + +fn sample_h256(byte: u8) -> H256 { + [byte; 32].into() +} + +fn sample_public_key_hash() -> PublicKeyHash { + [0x08; 20].into() +} + +fn sample_secp256k1_public_key() -> Secp256k1PublicKey { + Secp256k1PublicKey([0x09; 33]) +} + +fn sample_schnorrkel_public_key() -> SchnorrkelPublicKey { + SchnorrkelPublicKey([0x0A; 32]) +} + +fn sample_signature() -> Signature { + Signature([0xAB; 64]) +} diff --git a/crates/messages/src/tests.rs b/crates/messages/src/tests/misc.rs similarity index 99% rename from crates/messages/src/tests.rs rename to crates/messages/src/tests/misc.rs index aba727f..7620661 100644 --- a/crates/messages/src/tests.rs +++ b/crates/messages/src/tests/misc.rs @@ -19,7 +19,7 @@ use alloc::vec::Vec; use test_utils::prelude::*; -use super::*; +use crate::Apdu; #[test_item] fn test_apdu_chunking() { diff --git a/crates/messages/src/tests/mod.rs b/crates/messages/src/tests/mod.rs new file mode 100644 index 0000000..e020122 --- /dev/null +++ b/crates/messages/src/tests/mod.rs @@ -0,0 +1,19 @@ +/***************************************************************************** + * Mintlayer Ledger App. + * (c) 2025-2026 RBB S.r.l. + * + * 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. + *****************************************************************************/ + +mod message_encoding; +mod misc; diff --git a/docs/technical_specification.md b/docs/technical_specification.md index 7535768..da53c67 100644 --- a/docs/technical_specification.md +++ b/docs/technical_specification.md @@ -55,58 +55,62 @@ Any successful command output described below is prefixed by its corresponding 1 The application returns standard Ledger status words as well as app-specific and ECC cryptographic errors. -| SW | SW name | Description | -| ------ | ------------------------------ | ---------------------------------------------- | -| 0x5515 | `DeviceLocked` | Device locked | -| 0x6982 | `NothingReceived` | Nothing received | -| 0x6985 | `Deny` | Rejected by user / User cancelled | -| 0x6D00 | `Unknown` | Unknown | -| 0x6E00 | `ClaNotSupported` | CLA not supported | -| 0x6E01 | `InsNotSupported` | Instruction not supported | -| 0x6E02 | `WrongP1P2` | Wrong P1/P2 parameters | -| 0x6E03 | `WrongApduLength` | Wrong APDU length | -| 0x9000 | `Ok` | Success | -| 0xB000 | `TxDisplayFail` | Transaction display failed | -| 0xB001 | `TxLockTimeInvalid` | Transaction lock time value is invalid | -| 0xB002 | `TxWrongLength` | Transaction wrong length | -| 0xB003 | `HashFail` | Hashing failed | -| 0xB004 | `AddressEncodingFail` | Address encoding failed | -| 0xB005 | `WrongInstruction` | Different instruction than expected | -| 0xB006 | `KeyDeriveFail` | Key derivation failed | -| 0xB007 | `OrdersV0NotSupported` | Orders V0 not supported | -| 0xB008 | `WrongContext` | Wrong context (e.g., Next called before Start) | -| 0xB009 | `DeserializeFail` | SCALE deserialization failed | -| 0xB00A | `TxInvalidInputUtxo` | Invalid input UTXO | -| 0xB00B | `TxNumericOperationFail` | Numeric operation failed | -| 0xB00C | `TxFeeUnderflow` | Tx fee underflow | -| 0xB00D | `InvalidData` | Invalid data | -| 0xB00E | `NothingToSign` | Nothing to sign | -| 0xB00F | `TxAlreadyFinished` | Transaction already finished | -| 0xB010 | `InvalidPath` | Invalid BIP32 path | -| 0xB011 | `InvalidUncompressedPublicKey` | Invalid uncompressed public key | -| 0xB012 | `MaxBufferLenExceeded` | Max buffer length exceeded (Chunking limit) | -| 0xB013 | `DifferentInputCommitmentHash` | Different input commitment hash | -| 0xB014 | `InvalidTimestamp` | Invalid timestamp | -| 0xB015 | `FillOrderSigRequested` | Signature for FillOrder input requested | -| 0xB016 | `TxWithZeroInputs` | Transaction has zero inputs | -| 0xB100 | `EccCarry` | ECC Carry | -| 0xB101 | `EccLocked` | ECC Locked | -| 0xB102 | `EccUnlocked` | ECC Unlocked | -| 0xB103 | `EccNotLocked` | ECC Not Locked | -| 0xB104 | `EccNotUnlocked` | ECC Not Unlocked | -| 0xB105 | `EccInternalError` | ECC Internal Error | -| 0xB106 | `EccInvalidParameterSize` | ECC Invalid Parameter Size | -| 0xB107 | `EccInvalidParameterValue` | ECC Invalid Parameter Value | -| 0xB108 | `EccInvalidParameter` | ECC Invalid Parameter | -| 0xB109 | `EccNotInvertible` | ECC Not Invertible | -| 0xB10A | `EccOverflow` | ECC Overflow | -| 0xB10B | `EccMemoryFull` | ECC Memory Full | -| 0xB10C | `EccNoResidue` | ECC No Residue | -| 0xB10D | `EccPointAtInfinity` | ECC Point At Infinity | -| 0xB10E | `EccInvalidPoint` | ECC Invalid Point | -| 0xB10F | `EccInvalidCurve` | ECC Invalid Curve | -| 0xB110 | `EccGenericError` | ECC Generic Error | -| 0xE000 | `Panic` | Panic | +| SW | SW name | Description | +| ------ | ----------------------------------- | ---------------------------------------------- | +| 0x5515 | `DeviceLocked` | Device locked | +| 0x6982 | `NothingReceived` | Nothing received | +| 0x6985 | `Deny` | Rejected by user / User cancelled | +| 0x6D00 | `Unknown` | Unknown | +| 0x6E00 | `ClaNotSupported` | CLA not supported | +| 0x6E01 | `InsNotSupported` | Instruction not supported | +| 0x6E02 | `WrongP1P2` | Wrong P1/P2 parameters | +| 0x6E03 | `WrongApduLength` | Wrong APDU length | +| 0x9000 | `Ok` | Success | +| 0xB000 | `TxDisplayFail` | Transaction display failed | +| 0xB001 | `TxLockTimeInvalid` | Transaction lock time value is invalid | +| 0xB002 | `TxWrongLength` | Transaction wrong length | +| 0xB003 | `HashFail` | Hashing failed | +| 0xB004 | `AddressEncodingFail` | Address encoding failed | +| 0xB005 | `WrongInstruction` | Different instruction than expected | +| 0xB006 | `KeyDeriveFail` | Key derivation failed | +| 0xB007 | `OrdersV0NotSupported` | Orders V0 not supported | +| 0xB008 | `WrongContext` | Wrong context (e.g., Next called before Start) | +| 0xB009 | `DeserializeFail` | SCALE deserialization failed | +| 0xB00A | `TxInvalidInputUtxo` | Invalid input UTXO | +| 0xB00B | `TxNumericOperationFail` | Numeric operation failed | +| 0xB00C | `TxFeeUnderflow` | Tx fee underflow | +| 0xB00D | `InvalidData` | Invalid data | +| 0xB00E | `NothingToSign` | Nothing to sign | +| 0xB00F | `TxAlreadyFinished` | Transaction already finished | +| 0xB010 | `InvalidPath` | Invalid BIP32 path | +| 0xB011 | `InvalidUncompressedPublicKey` | Invalid uncompressed public key | +| 0xB012 | `MaxBufferLenExceeded` | Max buffer length exceeded (Chunking limit) | +| 0xB013 | `DifferentInputCommitmentHash` | Different input commitment hash | +| 0xB014 | `InvalidTimestamp` | Invalid timestamp | +| 0xB015 | `FillOrderSigRequested` | Signature for FillOrder input requested | +| 0xB016 | `TxWithZeroInputs` | Transaction has zero inputs | +| 0xB017 | `TxWithMultipleReviewableInputs` | Transaction has multiple reviewable inputs | +| 0xB018 | `WrongChangeOutputType` | Wrong change output type | +| 0xB019 | `WrongChangeOutputDestination` | Wrong change output destination | +| 0xB01A | `MismatchedChangeOutputDestination` | Mismatched change output destination | +| 0xB100 | `EccCarry` | ECC Carry | +| 0xB101 | `EccLocked` | ECC Locked | +| 0xB102 | `EccUnlocked` | ECC Unlocked | +| 0xB103 | `EccNotLocked` | ECC Not Locked | +| 0xB104 | `EccNotUnlocked` | ECC Not Unlocked | +| 0xB105 | `EccInternalError` | ECC Internal Error | +| 0xB106 | `EccInvalidParameterSize` | ECC Invalid Parameter Size | +| 0xB107 | `EccInvalidParameterValue` | ECC Invalid Parameter Value | +| 0xB108 | `EccInvalidParameter` | ECC Invalid Parameter | +| 0xB109 | `EccNotInvertible` | ECC Not Invertible | +| 0xB10A | `EccOverflow` | ECC Overflow | +| 0xB10B | `EccMemoryFull` | ECC Memory Full | +| 0xB10C | `EccNoResidue` | ECC No Residue | +| 0xB10D | `EccPointAtInfinity` | ECC Point At Infinity | +| 0xB10E | `EccInvalidPoint` | ECC Invalid Point | +| 0xB10F | `EccInvalidCurve` | ECC Invalid Curve | +| 0xB110 | `EccGenericError` | ECC Generic Error | +| 0xE000 | `Panic` | Panic | --- @@ -165,8 +169,8 @@ Because transactions can be larger than available APDU buffers and RAM, the pars | Type | Name | Description | | ----- | ------------- | --------------------------------------------------------- | -| `u8` | `coin` | `0` = Mainnet, `1` = Testnet, `2` = Regtest, `3` = Signet | -| `u8` | `version` | Transaction version (0 = V1) | +| `u8` | `coin_type` | `0` = Mainnet, `1` = Testnet, `2` = Regtest, `3` = Signet | +| `u8` | `version` | Transaction version (0 = V1) | | `u32` | `num_inputs` | Total number of inputs in the transaction | | `u32` | `num_outputs` | Total number of outputs in the transaction | @@ -221,7 +225,7 @@ Signs a generic message using a BIP-32 derived key. | Type | Name | Description | | ----------- | ----------- | --------------------------------------------- | -| `u8` (Enum) | `coin` | Coin type (Mainnet, Testnet, Regtest, Signet) | +| `u8` (Enum) | `coin_type` | Coin type (Mainnet, Testnet, Regtest, Signet) | | `u8` (Enum) | `addr_type` | `0` = PublicKey, `1` = PublicKeyHash | | `Vec` | `path` | The BIP32 derivation path to use for signing | diff --git a/media/README.md b/media/README.md new file mode 100644 index 0000000..4b3345e --- /dev/null +++ b/media/README.md @@ -0,0 +1,24 @@ +## This directory contains images used by the app. + +Some of the images are called icons - they are used as Ledger dashboard icons for the app. +This is specified in the root Cargo.toml, which is parsed by the Ledger SDK build script. + +The others are called glyphs and they are used inside the app itself (embedded in the Rust code via `load_glyph`). + +Note that `icons/mintlayer_14x14.gif` serves both as an icon and as a glyph. + +⚠️ After an image is modified, do a clean build, otherwise it may not be picked up. + +ℹ️ For the glyphs, it's possible to force Rust code rebuild via `cargo:rerun-if-changed` in `build.rs` +(in `crates/app-core`), which would cause the images to be picked up. But it doesn't seem to be possible +to force a rerun of the SDK build script. So we don't do it for the glyphs either. + +### The purpose and required format for each image: +| File | Purpose | Required format | +| -------------------------- | --------------------------------------- | ---------------------------- | +| icons/mintlayer_14x14.gif | app icon and in-app glyph for Nano X/S+ | 14x14, 1-bit black/white | +| icons/mintlayer_32x32.gif | app icon for Stax | 32x32, grayscale <=16 colors | +| icons/mintlayer_32x32.png | app icon for Apex P | 32x32, 1-bit black/white | +| icons/mintlayer_40x40.gif | app icon for Flex | 40x40, grayscale <=16 colors | +| glyphs/mintlayer_48x48.png | in-app glyph for Apex P | 48x48, 1-bit black/white | +| glyphs/mintlayer_64x64.gif | in-app glyph for Stax/Flex | 64x64, grayscale <=16 colors | diff --git a/media/glyphs/home_nano_nbgl.png b/media/glyphs/home_nano_nbgl.png deleted file mode 100644 index 4fa2028..0000000 Binary files a/media/glyphs/home_nano_nbgl.png and /dev/null differ diff --git a/media/glyphs/mintlayer_48x48.png b/media/glyphs/mintlayer_48x48.png index 991e98d..86d478e 100644 Binary files a/media/glyphs/mintlayer_48x48.png and b/media/glyphs/mintlayer_48x48.png differ diff --git a/media/glyphs/mintlayer_64x64.gif b/media/glyphs/mintlayer_64x64.gif index d5bdcef..02e3180 100644 Binary files a/media/glyphs/mintlayer_64x64.gif and b/media/glyphs/mintlayer_64x64.gif differ diff --git a/media/icons/mask_14x14.gif b/media/icons/mask_14x14.gif deleted file mode 100644 index 1568a9f..0000000 Binary files a/media/icons/mask_14x14.gif and /dev/null differ diff --git a/media/icons/mintlayer_14x14.gif b/media/icons/mintlayer_14x14.gif index df802c2..d4c8e58 100644 Binary files a/media/icons/mintlayer_14x14.gif and b/media/icons/mintlayer_14x14.gif differ diff --git a/media/icons/mintlayer_32x32.gif b/media/icons/mintlayer_32x32.gif index c1dbbf1..8f8bcb3 100644 Binary files a/media/icons/mintlayer_32x32.gif and b/media/icons/mintlayer_32x32.gif differ diff --git a/media/icons/mintlayer_32x32.png b/media/icons/mintlayer_32x32.png index 790b9cd..b3814ca 100644 Binary files a/media/icons/mintlayer_32x32.png and b/media/icons/mintlayer_32x32.png differ diff --git a/media/icons/mintlayer_40x40.gif b/media/icons/mintlayer_40x40.gif index c2532c5..cfcf637 100644 Binary files a/media/icons/mintlayer_40x40.gif and b/media/icons/mintlayer_40x40.gif differ diff --git a/tests/application_client/__init__.py b/tests/application_client/__init__.py index fbcf26c..48ae23a 100644 --- a/tests/application_client/__init__.py +++ b/tests/application_client/__init__.py @@ -305,7 +305,7 @@ def init_mintlayer_types(): "SignTxStartReq": { "type": "struct", "type_mapping": [ - ["coin", "u8"], + ["coin_type", "u8"], ["version", "u8"], ["num_inputs", "u32"], ["num_outputs", "u32"], @@ -351,6 +351,7 @@ def init_mintlayer_types(): "type": "struct", "type_mapping": [ ["output", "TxOutput"], + ["change_path", "Option"], ], }, "SignTxNextReq": { diff --git a/tests/application_client/mintlayer_command_sender.py b/tests/application_client/mintlayer_command_sender.py index 529b330..e5cef40 100644 --- a/tests/application_client/mintlayer_command_sender.py +++ b/tests/application_client/mintlayer_command_sender.py @@ -3,19 +3,19 @@ from enum import IntEnum from typing import Generator, List +import pytest import scalecodec # type: ignore +from ragger.error import ExceptionRAPDU from ragger.backend.interface import RAPDU, BackendInterface from ragger.navigator import NavInsID from ragger.navigator.navigation_scenario import NavigationScenarioData, UseCase -from .mintlayer_response_unpacker import ( - unpack_get_public_key_response, -) from .mintlayer_utils import ( Transaction, TxInputSignatureResponse, TxInputSignature, decode_response_variant, + mintlayer_hash, sign_tx_start_req_obj, sign_tx_next_req_obj, verify_tx_signature, @@ -38,6 +38,11 @@ class SignTxStep: kind: str +class ReviewUntil(IntEnum): + End = 0 + Outputs = 1 + + class GetAppAndVersionP1(IntEnum): # Parameter 1 for first APDU number. P1_START = 0x00 @@ -88,7 +93,9 @@ class Errors(IntEnum): SW_WRONG_TX_LENGTH = 0xB002 SW_WRONG_CONTEXT = 0xB008 SW_DESERIALIZE_FAIL = 0xB009 + SW_INVALID_PATH = 0xB010 SW_MAX_BUFFER_LEN_EXCEEDED = 0xB012 + SW_MISMATCHED_CHANGE_OUTPUT_DESTINATION = 0xB01A def split_message(message: bytes, max_size: int) -> List[bytes]: @@ -111,19 +118,8 @@ def get_app_and_version(self) -> RAPDU: data=b"", ) - def get_public_key(self, coin: int, path: str) -> RAPDU: - data = coin.to_bytes(1, "little") + pack_derivation_path_from_str(path) - - return self.backend.exchange( - cla=CLA, - ins=InsType.GET_PUBLIC_KEY, - p1=GetPublicKeyP1.P1_DO_NOT_CONFIRM, - p2=P2.P2_LAST, - data=data, - ) - - def get_public_key_by_ints_path(self, coin: int, path: list[int]) -> RAPDU: - data = coin.to_bytes(1, "little") + pack_derivation_path_from_ints(path) + def get_public_key(self, coin_type: int, path: list[int]) -> RAPDU: + data = coin_type.to_bytes(1, "little") + pack_derivation_path(path) return self.backend.exchange( cla=CLA, @@ -135,9 +131,9 @@ def get_public_key_by_ints_path(self, coin: int, path: list[int]) -> RAPDU: @contextmanager def get_public_key_with_confirmation( - self, coin: int, path: str + self, coin_type: int, path: list[int] ) -> Generator[None, None, None]: - data = coin.to_bytes(1, "little") + pack_derivation_path_from_str(path) + data = coin_type.to_bytes(1, "little") + pack_derivation_path(path) with self.backend.exchange_async( cla=CLA, @@ -150,12 +146,12 @@ def get_public_key_with_confirmation( @contextmanager def sign_message( - self, coin: int, addr_type: int, path: str, message: bytes + self, coin_type: int, addr_type: int, path: list[int], message: bytes ) -> Generator[None, None, None]: data = ( - coin.to_bytes(1, "little") + coin_type.to_bytes(1, "little") + addr_type.to_bytes(1, "little") - + pack_derivation_path_from_str(path) + + pack_derivation_path(path) ) response = self.backend.exchange( @@ -189,11 +185,15 @@ def sign_message( yield # pylint: disable-next=too-many-locals - def sign_tx(self, transaction: Transaction) -> Generator[SignTxStep, None, None]: + def sign_tx( + self, + transaction: Transaction, + review_until: ReviewUntil = ReviewUntil.End, + ) -> Generator[SignTxStep, None, None]: # ---- Start req ---- start_req = sign_tx_start_req_obj.encode( { - "coin": transaction.coin, + "coin_type": transaction.coin_type, "version": 0, "num_inputs": len(transaction.inputs), "num_outputs": len(transaction.outputs), @@ -256,12 +256,15 @@ def encode_output(outp): ): yield SignTxStep(kind="start") - if len(transaction.outputs) == 0: + if len(transaction.outputs) == 0 and review_until == ReviewUntil.End: yield SignTxStep(kind="sign") response = self.get_async_response() decode_response_variant(response.data, "TxNext") + if review_until == ReviewUntil.Outputs: + return + # ---- OUTPUTS ---- print("streaming outputs") @@ -350,45 +353,100 @@ def get_all_signatures(self, transaction: Transaction) -> List[TxInputSignature] return sigs -def hardened_index(index: int) -> int: - return index | 1 << 31 +def pack_derivation_path(path: list[int]) -> bytes: + path_obj = scalecodec.base.RuntimeConfiguration().create_scale_object("Bip32Path") + return path_obj.encode(path).data -def parse_derivation_path(derivation_path: str) -> list[int]: - split = derivation_path.split("/") +def _compress_public_key(uncompressed_public_key: bytes) -> bytes: + assert len(uncompressed_public_key) == 65 + assert uncompressed_public_key[0] == 0x04 - if split[0] != "m": - raise ValueError("Error master expected") + prefix = 0x02 if uncompressed_public_key[64] % 2 == 0 else 0x03 + return bytes([prefix]) + uncompressed_public_key[1:33] - result = [] - for value in split[1:]: - if value == "": - raise ValueError(f'Error missing value in split list "{split}"') - if value.endswith("'"): - result.append(hardened_index(int(value[:-1]))) - else: - result.append(int(value)) - return result +def _public_key_destination(public_key: bytes) -> dict: + compressed_public_key = _compress_public_key(public_key) + return { + "PublicKey": { + "key": { + "Secp256k1Schnorr": { + "pubkey_data": compressed_public_key, + } + } + } + } -def pack_derivation_path_from_str(path: str) -> bytes: - parsed_path = parse_derivation_path(path) - return pack_derivation_path_from_ints(parsed_path) +def _public_key_hash_destination(public_key: bytes) -> dict: + compressed_public_key = _compress_public_key(public_key) + encoded_public_key = bytes([0]) + compressed_public_key + return {"PublicKeyHash": mintlayer_hash(encoded_public_key)[:20]} -def pack_derivation_path_from_ints(path: list[int]) -> bytes: - path_obj = scalecodec.base.RuntimeConfiguration().create_scale_object("Bip32Path") - return path_obj.encode(path).data +def fetch_public_key( + client: MintlayerCommandSender, coin_type: int, path: list[int] +) -> bytes: + rapdu = client.get_public_key(coin_type, path) + msg = decode_response_variant(rapdu.data, "PublicKey") + + public_key = bytes.fromhex(msg["public_key"][2:]) + assert len(public_key) == 65 + + chain_code = bytes.fromhex(msg["chain_code"][2:]) + assert len(chain_code) == 32 + + return public_key + +def fetch_public_key_as_pk_destination( + client: MintlayerCommandSender, coin_type: int, path: list[int] +) -> dict: + return _public_key_destination(fetch_public_key(client, coin_type, path)) -# pylint: disable-next=too-many-locals,too-many-branches,too-many-statements + +def fetch_public_key_as_pkh_destination( + client: MintlayerCommandSender, coin_type: int, path: list[int] +) -> dict: + return _public_key_hash_destination(fetch_public_key(client, coin_type, path)) + + +def send_output_expect_error(client: MintlayerCommandSender, output: dict, expected_status: int): + encoded_out = sign_tx_next_req_obj.encode({"ProcessOutput": output}).data + chunks = split_message(encoded_out, MAX_APDU_LEN) + + for chunk in chunks[:-1]: + response = client.backend.exchange( + cla=CLA, + ins=InsType.SIGN_TX, + p1=SignTxP1.P1_NEXT, + p2=P2.P2_MORE, + data=chunk, + ) + assert response.status == 0x9000 + + with pytest.raises(ExceptionRAPDU) as e: + client.backend.exchange( + cla=CLA, + ins=InsType.SIGN_TX, + p1=SignTxP1.P1_NEXT, + p2=P2.P2_LAST, + data=chunks[-1], + ) + + assert e.value.status == expected_status + assert len(e.value.data) == 0 + + +# pylint: disable-next=too-many-locals,too-many-branches,too-many-positional-arguments def sign_tx_review( client, device, navigator, scenario_navigator, review_transaction: ReviewTransaction, + review_until: ReviewUntil = ReviewUntil.End, ): transaction = review_transaction.transaction has_command_input = review_transaction.has_command_input @@ -397,10 +455,9 @@ def sign_tx_review( addr_paths_by_indices = transaction.addr_paths_by_indices() pubkeys_by_indices = {} for indices, addr_path in addr_paths_by_indices.items(): - pubkey_rapdu = client.get_public_key_by_ints_path(transaction.coin, addr_path) - _, pubkey, _, _ = unpack_get_public_key_response(pubkey_rapdu.data) - - pubkeys_by_indices[indices] = pubkey + pubkeys_by_indices[indices] = fetch_public_key( + client, transaction.coin_type, addr_path + ) # The snapshot index (used to make its name) and the amount by which it should be increased # after each step. The increase should be large enough, so that snapshots from later steps @@ -415,7 +472,7 @@ def sign_tx_review( last_page_pattern = r".*\((\d+)/\1\)$" - for step in client.sign_tx(transaction): + for step in client.sign_tx(transaction, review_until): print("step kind: ", step.kind) if step.kind == "start": navigator.navigate_and_compare( @@ -501,6 +558,9 @@ def sign_tx_review( ) start_idx += idx_inc + if review_until == ReviewUntil.Outputs: + return + # After review approval, explicitly request every signature. signatures = client.get_all_signatures(transaction) diff --git a/tests/application_client/mintlayer_utils.py b/tests/application_client/mintlayer_utils.py index ebd1220..25ed1a5 100644 --- a/tests/application_client/mintlayer_utils.py +++ b/tests/application_client/mintlayer_utils.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from enum import IntEnum from hashlib import blake2b from typing import List, Optional @@ -72,7 +73,7 @@ def indices(self) -> TxInputSignatureIndices: @dataclass class Transaction: - coin: int + coin_type: int # A list of TxInputData objects. inputs: List[dict] # A list of TxInputCommitmentData objects. @@ -170,6 +171,43 @@ def mintlayer_hash(data: bytes) -> bytes: return blake2b(data, digest_size=64).digest()[:32] +def hardened_index(index: int) -> int: + return index | 1 << 31 + + +class KeyPurpose(IntEnum): + Receive = 0 + Change = 1 + + +def make_path(account_index: int, key_purpose: KeyPurpose, key_index: int) -> list[int]: + return [ + hardened_index(44), + hardened_index(19788), + hardened_index(account_index), + key_purpose, + key_index, + ] + + +def parse_derivation_path(derivation_path: str) -> list[int]: + split = derivation_path.split("/") + + if split[0] != "m": + raise ValueError("Error master expected") + + result = [] + for value in split[1:]: + if value == "": + raise ValueError(f'Error missing value in split list "{split}"') + if value.endswith("'"): + result.append(hardened_index(int(value[:-1]))) + else: + result.append(int(value)) + + return result + + MESSAGE_MAGIC_PREFIX = b"===MINTLAYER MESSAGE BEGIN===\n" MESSAGE_MAGIC_SUFFIX = b"\n===MINTLAYER MESSAGE END===" diff --git a/tests/snapshots/apex_p/test_app_mainmenu/00000.png b/tests/snapshots/apex_p/test_app_mainmenu/00000.png index 5784e46..0ea88bc 100644 Binary files a/tests/snapshots/apex_p/test_app_mainmenu/00000.png and b/tests/snapshots/apex_p/test_app_mainmenu/00000.png differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00000.png index d405490..4cd6ab1 100644 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00000.png and b/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00003.png index 5784e46..0ea88bc 100644 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00003.png and b/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00003.png differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/apex_p/test_get_public_key_confirm_refused/00000.png index d405490..4cd6ab1 100644 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/00000.png and b/tests/snapshots/apex_p/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_large_message/00000.png b/tests/snapshots/apex_p/test_sign_large_message/00000.png index b5959c6..089391d 100644 Binary files a/tests/snapshots/apex_p/test_sign_large_message/00000.png and b/tests/snapshots/apex_p/test_sign_large_message/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_large_message/00003.png b/tests/snapshots/apex_p/test_sign_large_message/00003.png index 857f887..1ea032a 100644 Binary files a/tests/snapshots/apex_p/test_sign_large_message/00003.png and b/tests/snapshots/apex_p/test_sign_large_message/00003.png differ diff --git a/tests/snapshots/apex_p/test_sign_large_message/00005.png b/tests/snapshots/apex_p/test_sign_large_message/00005.png index 5784e46..0ea88bc 100644 Binary files a/tests/snapshots/apex_p/test_sign_large_message/00005.png and b/tests/snapshots/apex_p/test_sign_large_message/00005.png differ diff --git a/tests/snapshots/apex_p/test_sign_message/00000.png b/tests/snapshots/apex_p/test_sign_message/00000.png index be2479e..f7459cf 100644 Binary files a/tests/snapshots/apex_p/test_sign_message/00000.png and b/tests/snapshots/apex_p/test_sign_message/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_message/00002.png b/tests/snapshots/apex_p/test_sign_message/00002.png index fc21acc..e8fcb21 100644 Binary files a/tests/snapshots/apex_p/test_sign_message/00002.png and b/tests/snapshots/apex_p/test_sign_message/00002.png differ diff --git a/tests/snapshots/apex_p/test_sign_message/00004.png b/tests/snapshots/apex_p/test_sign_message/00004.png index 5784e46..0ea88bc 100644 Binary files a/tests/snapshots/apex_p/test_sign_message/00004.png and b/tests/snapshots/apex_p/test_sign_message/00004.png differ diff --git a/tests/snapshots/apex_p/test_sign_message_pkh/00000.png b/tests/snapshots/apex_p/test_sign_message_pkh/00000.png index be2479e..f7459cf 100644 Binary files a/tests/snapshots/apex_p/test_sign_message_pkh/00000.png and b/tests/snapshots/apex_p/test_sign_message_pkh/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_message_pkh/00002.png b/tests/snapshots/apex_p/test_sign_message_pkh/00002.png index fc21acc..e8fcb21 100644 Binary files a/tests/snapshots/apex_p/test_sign_message_pkh/00002.png and b/tests/snapshots/apex_p/test_sign_message_pkh/00002.png differ diff --git a/tests/snapshots/apex_p/test_sign_message_pkh/00004.png b/tests/snapshots/apex_p/test_sign_message_pkh/00004.png index 5784e46..0ea88bc 100644 Binary files a/tests/snapshots/apex_p/test_sign_message_pkh/00004.png and b/tests/snapshots/apex_p/test_sign_message_pkh/00004.png differ diff --git a/tests/snapshots/apex_p/test_sign_message_refused/00000.png b/tests/snapshots/apex_p/test_sign_message_refused/00000.png index be2479e..f7459cf 100644 Binary files a/tests/snapshots/apex_p/test_sign_message_refused/00000.png and b/tests/snapshots/apex_p/test_sign_message_refused/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_message_refused/00002.png b/tests/snapshots/apex_p/test_sign_message_refused/00002.png index fc21acc..e8fcb21 100644 Binary files a/tests/snapshots/apex_p/test_sign_message_refused/00002.png and b/tests/snapshots/apex_p/test_sign_message_refused/00002.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00000.png b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00000.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00200.png b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00200.png index d019bb5..ec7361c 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00200.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00201.png b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00201.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00201.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00202.png b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00202.png index 3f03cbc..eb3c4fb 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00202.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_authority/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00000.png b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00000.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00200.png b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00200.png index d019bb5..ec7361c 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00200.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00201.png b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00201.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00201.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00202.png b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00202.png index 61b4e75..7243a30 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00202.png and b/tests/snapshots/apex_p/test_sign_tx_change_token_metadata_uri/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00000.png b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00000.png and b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00100.png b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00100.png index a3a5a41..94dcda0 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00100.png and b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00100.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00101.png b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00101.png index fd7c3fd..fdabf51 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00101.png and b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00102.png b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00102.png index e9c3e68..7173dea 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_create_delegation/00102.png and b/tests/snapshots/apex_p/test_sign_tx_create_delegation/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00000.png b/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00000.png and b/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00101.png b/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00101.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00101.png and b/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00102.png b/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00102.png index 8afd400..cdd758b 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00102.png and b/tests/snapshots/apex_p/test_sign_tx_create_stake_pool/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00000.png b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00000.png and b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00100.png b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00100.png index 5a6372a..899fa46 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00100.png and b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00100.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00101.png b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00101.png index 8a3ce9b..58dee44 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00101.png and b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00102.png b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00102.png index f471ae0..2318644 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00102.png and b/tests/snapshots/apex_p/test_sign_tx_delegate_staking/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00000.png b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00000.png and b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00200.png b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00200.png index d019bb5..ec7361c 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00200.png and b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00201.png b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00201.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00201.png and b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00202.png b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00202.png index 9b7a3e8..3c9b1e9 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00202.png and b/tests/snapshots/apex_p/test_sign_tx_freeze_tokens/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_htlc/00000.png b/tests/snapshots/apex_p/test_sign_tx_htlc/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_htlc/00000.png and b/tests/snapshots/apex_p/test_sign_tx_htlc/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_htlc/00200.png b/tests/snapshots/apex_p/test_sign_tx_htlc/00200.png index e3945ee..72ee088 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_htlc/00200.png and b/tests/snapshots/apex_p/test_sign_tx_htlc/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_htlc/00201.png b/tests/snapshots/apex_p/test_sign_tx_htlc/00201.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_htlc/00201.png and b/tests/snapshots/apex_p/test_sign_tx_htlc/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_htlc/00202.png b/tests/snapshots/apex_p/test_sign_tx_htlc/00202.png index 41f624c..aa295fd 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_htlc/00202.png and b/tests/snapshots/apex_p/test_sign_tx_htlc/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00000.png b/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00000.png and b/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00101.png b/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00101.png index fd7c3fd..fdabf51 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00101.png and b/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00102.png b/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00102.png index 039058c..20efd58 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00102.png and b/tests/snapshots/apex_p/test_sign_tx_issue_fungible_token/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_issue_nft/00000.png b/tests/snapshots/apex_p/test_sign_tx_issue_nft/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_issue_nft/00000.png and b/tests/snapshots/apex_p/test_sign_tx_issue_nft/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_issue_nft/00101.png b/tests/snapshots/apex_p/test_sign_tx_issue_nft/00101.png index 3eda950..2cb855e 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_issue_nft/00101.png and b/tests/snapshots/apex_p/test_sign_tx_issue_nft/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_issue_nft/00102.png b/tests/snapshots/apex_p/test_sign_tx_issue_nft/00102.png index 6fa38da..96b7b2a 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_issue_nft/00102.png and b/tests/snapshots/apex_p/test_sign_tx_issue_nft/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00000.png b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00000.png and b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00200.png b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00200.png index bd21edc..37209d7 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00200.png and b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00201.png b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00201.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00201.png and b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00202.png b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00202.png index 59494e0..802c3ea 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00202.png and b/tests/snapshots/apex_p/test_sign_tx_lock_then_transfer/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00000.png b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00000.png and b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00200.png b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00200.png index 3d58ef7..9454415 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00200.png and b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00201.png b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00201.png index 5974993..164f134 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00201.png and b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00202.png b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00202.png index 923e3f2..b020204 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00202.png and b/tests/snapshots/apex_p/test_sign_tx_mint_tokens/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00000.png b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00000.png and b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00200.png b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00200.png index d6ba17f..72ce0d8 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00200.png and b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00201.png b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00201.png index d6ba17f..72ce0d8 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00201.png and b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00300.png b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00300.png index 1b27f40..7fd55b8 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00300.png and b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00300.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00301.png b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00301.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00301.png and b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00301.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00302.png b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00302.png index 931b256..4d5743a 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_conclude/00302.png and b/tests/snapshots/apex_p/test_sign_tx_order_conclude/00302.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_fill/00000.png b/tests/snapshots/apex_p/test_sign_tx_order_fill/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_fill/00000.png and b/tests/snapshots/apex_p/test_sign_tx_order_fill/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_fill/00200.png b/tests/snapshots/apex_p/test_sign_tx_order_fill/00200.png index e3945ee..72ee088 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_fill/00200.png and b/tests/snapshots/apex_p/test_sign_tx_order_fill/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_fill/00201.png b/tests/snapshots/apex_p/test_sign_tx_order_fill/00201.png index e3945ee..72ee088 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_fill/00201.png and b/tests/snapshots/apex_p/test_sign_tx_order_fill/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_fill/00300.png b/tests/snapshots/apex_p/test_sign_tx_order_fill/00300.png index 5ced57b..0dbf10d 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_fill/00300.png and b/tests/snapshots/apex_p/test_sign_tx_order_fill/00300.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_fill/00301.png b/tests/snapshots/apex_p/test_sign_tx_order_fill/00301.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_fill/00301.png and b/tests/snapshots/apex_p/test_sign_tx_order_fill/00301.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_order_fill/00302.png b/tests/snapshots/apex_p/test_sign_tx_order_fill/00302.png index 700876b..35c9bbc 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_order_fill/00302.png and b/tests/snapshots/apex_p/test_sign_tx_order_fill/00302.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer/00000.png deleted file mode 100644 index f89ff1c..0000000 Binary files a/tests/snapshots/apex_p/test_sign_tx_transfer/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer/00100.png b/tests/snapshots/apex_p/test_sign_tx_transfer/00100.png deleted file mode 100644 index a7f38f9..0000000 Binary files a/tests/snapshots/apex_p/test_sign_tx_transfer/00100.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer/00101.png b/tests/snapshots/apex_p/test_sign_tx_transfer/00101.png deleted file mode 100644 index a9958ff..0000000 Binary files a/tests/snapshots/apex_p/test_sign_tx_transfer/00101.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer/00102.png b/tests/snapshots/apex_p/test_sign_tx_transfer/00102.png deleted file mode 100644 index 4b44940..0000000 Binary files a/tests/snapshots/apex_p/test_sign_tx_transfer/00102.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_invalid_change_path/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_invalid_change_path/00000.png new file mode 100644 index 0000000..d77fb93 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_invalid_change_path/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_mismatched_destination/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_mismatched_destination/00000.png new file mode 100644 index 0000000..d77fb93 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_mismatched_destination/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00000.png new file mode 100644 index 0000000..d77fb93 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00100.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00100.png new file mode 100644 index 0000000..d1af0df Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00100.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00101.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00101.png new file mode 100644 index 0000000..d1af0df Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00200.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00200.png new file mode 100644 index 0000000..39237d8 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00201.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00201.png new file mode 100644 index 0000000..98875b8 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00202.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00202.png new file mode 100644 index 0000000..bbdd9be Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer/00200.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00300.png similarity index 100% rename from tests/snapshots/apex_p/test_sign_tx_transfer/00200.png rename to tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key/00300.png diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00000.png new file mode 100644 index 0000000..d77fb93 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00100.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00100.png new file mode 100644 index 0000000..d1af0df Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00100.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00101.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00101.png new file mode 100644 index 0000000..d1af0df Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00200.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00200.png new file mode 100644 index 0000000..6869dda Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00201.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00201.png new file mode 100644 index 0000000..98875b8 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00202.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00202.png new file mode 100644 index 0000000..bbdd9be Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00300.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00300.png new file mode 100644 index 0000000..4aba0a2 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_public_key_hash/00300.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_receive_path/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_receive_path/00000.png new file mode 100644 index 0000000..d77fb93 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_receive_path/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00000.png new file mode 100644 index 0000000..d77fb93 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00100.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00100.png new file mode 100644 index 0000000..d1af0df Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00100.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00101.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00101.png new file mode 100644 index 0000000..d1af0df Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00200.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00200.png new file mode 100644 index 0000000..ecd8d9f Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00201.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00201.png new file mode 100644 index 0000000..98875b8 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00202.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00202.png new file mode 100644 index 0000000..bbdd9be Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00300.png b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00300.png new file mode 100644 index 0000000..4aba0a2 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_change_output_without_change_path/00300.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00000.png b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00000.png new file mode 100644 index 0000000..d77fb93 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00100.png b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00100.png new file mode 100644 index 0000000..ac2e3e3 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00100.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00101.png b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00101.png new file mode 100644 index 0000000..98875b8 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00102.png b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00102.png new file mode 100644 index 0000000..bbdd9be Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00200.png b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00200.png new file mode 100644 index 0000000..4aba0a2 Binary files /dev/null and b/tests/snapshots/apex_p/test_sign_tx_transfer_no_change/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00000.png b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00000.png and b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00200.png b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00200.png index d019bb5..ec7361c 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00200.png and b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00201.png b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00201.png index 113692d..217c241 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00201.png and b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00202.png b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00202.png index 01174e8..0a8054b 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00202.png and b/tests/snapshots/apex_p/test_sign_tx_unfreeze_tokens/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00000.png b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00000.png and b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00200.png b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00200.png index d019bb5..ec7361c 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00200.png and b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00200.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00201.png b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00201.png index c74205e..334a102 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00201.png and b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00201.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00202.png b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00202.png index f737ad3..8bc8fb4 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00202.png and b/tests/snapshots/apex_p/test_sign_tx_unmint_tokens/00202.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00000.png b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00000.png and b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00100.png b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00100.png index 886bbaf..449cb0b 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00100.png and b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00100.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00101.png b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00101.png index cd92a0f..5845709 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00101.png and b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00102.png b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00102.png index 4b44940..bbdd9be 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00102.png and b/tests/snapshots/apex_p/test_sign_tx_with_large_input_and_commitment/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_with_large_output/00000.png b/tests/snapshots/apex_p/test_sign_tx_with_large_output/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_with_large_output/00000.png and b/tests/snapshots/apex_p/test_sign_tx_with_large_output/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_with_large_output/00101.png b/tests/snapshots/apex_p/test_sign_tx_with_large_output/00101.png index 3eda950..2cb855e 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_with_large_output/00101.png and b/tests/snapshots/apex_p/test_sign_tx_with_large_output/00101.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_with_large_output/00102.png b/tests/snapshots/apex_p/test_sign_tx_with_large_output/00102.png index 6fa38da..96b7b2a 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_with_large_output/00102.png and b/tests/snapshots/apex_p/test_sign_tx_with_large_output/00102.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_without_outputs/00000.png b/tests/snapshots/apex_p/test_sign_tx_without_outputs/00000.png index f89ff1c..d77fb93 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_without_outputs/00000.png and b/tests/snapshots/apex_p/test_sign_tx_without_outputs/00000.png differ diff --git a/tests/snapshots/apex_p/test_sign_tx_without_outputs/00200.png b/tests/snapshots/apex_p/test_sign_tx_without_outputs/00200.png index 9b7a3e8..3c9b1e9 100644 Binary files a/tests/snapshots/apex_p/test_sign_tx_without_outputs/00200.png and b/tests/snapshots/apex_p/test_sign_tx_without_outputs/00200.png differ diff --git a/tests/snapshots/flex/test_app_mainmenu/00000.png b/tests/snapshots/flex/test_app_mainmenu/00000.png index f2fa972..59db38f 100644 Binary files a/tests/snapshots/flex/test_app_mainmenu/00000.png and b/tests/snapshots/flex/test_app_mainmenu/00000.png differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00000.png index 22e90c6..8c0a9e0 100644 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00000.png and b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00003.png index f2fa972..59db38f 100644 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00003.png and b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00003.png differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png index 22e90c6..8c0a9e0 100644 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png and b/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/snapshots/flex/test_sign_large_message/00000.png b/tests/snapshots/flex/test_sign_large_message/00000.png index 44e3d67..7c5d842 100644 Binary files a/tests/snapshots/flex/test_sign_large_message/00000.png and b/tests/snapshots/flex/test_sign_large_message/00000.png differ diff --git a/tests/snapshots/flex/test_sign_large_message/00003.png b/tests/snapshots/flex/test_sign_large_message/00003.png index 2675d2d..2a0c193 100644 Binary files a/tests/snapshots/flex/test_sign_large_message/00003.png and b/tests/snapshots/flex/test_sign_large_message/00003.png differ diff --git a/tests/snapshots/flex/test_sign_large_message/00005.png b/tests/snapshots/flex/test_sign_large_message/00005.png index f2fa972..59db38f 100644 Binary files a/tests/snapshots/flex/test_sign_large_message/00005.png and b/tests/snapshots/flex/test_sign_large_message/00005.png differ diff --git a/tests/snapshots/flex/test_sign_message/00000.png b/tests/snapshots/flex/test_sign_message/00000.png index a2a9b36..f58cb54 100644 Binary files a/tests/snapshots/flex/test_sign_message/00000.png and b/tests/snapshots/flex/test_sign_message/00000.png differ diff --git a/tests/snapshots/flex/test_sign_message/00002.png b/tests/snapshots/flex/test_sign_message/00002.png index 3849275..350fb38 100644 Binary files a/tests/snapshots/flex/test_sign_message/00002.png and b/tests/snapshots/flex/test_sign_message/00002.png differ diff --git a/tests/snapshots/flex/test_sign_message/00004.png b/tests/snapshots/flex/test_sign_message/00004.png index f2fa972..59db38f 100644 Binary files a/tests/snapshots/flex/test_sign_message/00004.png and b/tests/snapshots/flex/test_sign_message/00004.png differ diff --git a/tests/snapshots/flex/test_sign_message_pkh/00000.png b/tests/snapshots/flex/test_sign_message_pkh/00000.png index a2a9b36..f58cb54 100644 Binary files a/tests/snapshots/flex/test_sign_message_pkh/00000.png and b/tests/snapshots/flex/test_sign_message_pkh/00000.png differ diff --git a/tests/snapshots/flex/test_sign_message_pkh/00002.png b/tests/snapshots/flex/test_sign_message_pkh/00002.png index 3849275..350fb38 100644 Binary files a/tests/snapshots/flex/test_sign_message_pkh/00002.png and b/tests/snapshots/flex/test_sign_message_pkh/00002.png differ diff --git a/tests/snapshots/flex/test_sign_message_pkh/00004.png b/tests/snapshots/flex/test_sign_message_pkh/00004.png index f2fa972..59db38f 100644 Binary files a/tests/snapshots/flex/test_sign_message_pkh/00004.png and b/tests/snapshots/flex/test_sign_message_pkh/00004.png differ diff --git a/tests/snapshots/flex/test_sign_message_refused/00000.png b/tests/snapshots/flex/test_sign_message_refused/00000.png index a2a9b36..f58cb54 100644 Binary files a/tests/snapshots/flex/test_sign_message_refused/00000.png and b/tests/snapshots/flex/test_sign_message_refused/00000.png differ diff --git a/tests/snapshots/flex/test_sign_message_refused/00002.png b/tests/snapshots/flex/test_sign_message_refused/00002.png index 3849275..350fb38 100644 Binary files a/tests/snapshots/flex/test_sign_message_refused/00002.png and b/tests/snapshots/flex/test_sign_message_refused/00002.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_authority/00000.png b/tests/snapshots/flex/test_sign_tx_change_token_authority/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_authority/00000.png and b/tests/snapshots/flex/test_sign_tx_change_token_authority/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_authority/00200.png b/tests/snapshots/flex/test_sign_tx_change_token_authority/00200.png index ada16a3..318c086 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_authority/00200.png and b/tests/snapshots/flex/test_sign_tx_change_token_authority/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_authority/00201.png b/tests/snapshots/flex/test_sign_tx_change_token_authority/00201.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_authority/00201.png and b/tests/snapshots/flex/test_sign_tx_change_token_authority/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_authority/00202.png b/tests/snapshots/flex/test_sign_tx_change_token_authority/00202.png index 68f59e1..94f9823 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_authority/00202.png and b/tests/snapshots/flex/test_sign_tx_change_token_authority/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00000.png b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00000.png and b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00200.png b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00200.png index ada16a3..318c086 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00200.png and b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00201.png b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00201.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00201.png and b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00202.png b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00202.png index bcf4b40..1e15521 100644 Binary files a/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00202.png and b/tests/snapshots/flex/test_sign_tx_change_token_metadata_uri/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_create_delegation/00000.png b/tests/snapshots/flex/test_sign_tx_create_delegation/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_create_delegation/00000.png and b/tests/snapshots/flex/test_sign_tx_create_delegation/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_create_delegation/00100.png b/tests/snapshots/flex/test_sign_tx_create_delegation/00100.png index 428cd7e..720bcfc 100644 Binary files a/tests/snapshots/flex/test_sign_tx_create_delegation/00100.png and b/tests/snapshots/flex/test_sign_tx_create_delegation/00100.png differ diff --git a/tests/snapshots/flex/test_sign_tx_create_delegation/00101.png b/tests/snapshots/flex/test_sign_tx_create_delegation/00101.png index bdfc1af..3983091 100644 Binary files a/tests/snapshots/flex/test_sign_tx_create_delegation/00101.png and b/tests/snapshots/flex/test_sign_tx_create_delegation/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_create_delegation/00102.png b/tests/snapshots/flex/test_sign_tx_create_delegation/00102.png index 48c4ef2..dd9cf48 100644 Binary files a/tests/snapshots/flex/test_sign_tx_create_delegation/00102.png and b/tests/snapshots/flex/test_sign_tx_create_delegation/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_create_stake_pool/00000.png b/tests/snapshots/flex/test_sign_tx_create_stake_pool/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_create_stake_pool/00000.png and b/tests/snapshots/flex/test_sign_tx_create_stake_pool/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_create_stake_pool/00101.png b/tests/snapshots/flex/test_sign_tx_create_stake_pool/00101.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_create_stake_pool/00101.png and b/tests/snapshots/flex/test_sign_tx_create_stake_pool/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_create_stake_pool/00102.png b/tests/snapshots/flex/test_sign_tx_create_stake_pool/00102.png index c6b89cb..bb16258 100644 Binary files a/tests/snapshots/flex/test_sign_tx_create_stake_pool/00102.png and b/tests/snapshots/flex/test_sign_tx_create_stake_pool/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_delegate_staking/00000.png b/tests/snapshots/flex/test_sign_tx_delegate_staking/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_delegate_staking/00000.png and b/tests/snapshots/flex/test_sign_tx_delegate_staking/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_delegate_staking/00100.png b/tests/snapshots/flex/test_sign_tx_delegate_staking/00100.png index d3234b0..f520408 100644 Binary files a/tests/snapshots/flex/test_sign_tx_delegate_staking/00100.png and b/tests/snapshots/flex/test_sign_tx_delegate_staking/00100.png differ diff --git a/tests/snapshots/flex/test_sign_tx_delegate_staking/00101.png b/tests/snapshots/flex/test_sign_tx_delegate_staking/00101.png index 51e3005..6caf314 100644 Binary files a/tests/snapshots/flex/test_sign_tx_delegate_staking/00101.png and b/tests/snapshots/flex/test_sign_tx_delegate_staking/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_delegate_staking/00102.png b/tests/snapshots/flex/test_sign_tx_delegate_staking/00102.png index 824c2d0..00aa897 100644 Binary files a/tests/snapshots/flex/test_sign_tx_delegate_staking/00102.png and b/tests/snapshots/flex/test_sign_tx_delegate_staking/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00000.png b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00000.png and b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00200.png b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00200.png index ada16a3..318c086 100644 Binary files a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00200.png and b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00201.png b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00201.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00201.png and b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00202.png b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00202.png index aa0f0aa..75e92a5 100644 Binary files a/tests/snapshots/flex/test_sign_tx_freeze_tokens/00202.png and b/tests/snapshots/flex/test_sign_tx_freeze_tokens/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_htlc/00000.png b/tests/snapshots/flex/test_sign_tx_htlc/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_htlc/00000.png and b/tests/snapshots/flex/test_sign_tx_htlc/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_htlc/00200.png b/tests/snapshots/flex/test_sign_tx_htlc/00200.png index 72c7dec..4d355fc 100644 Binary files a/tests/snapshots/flex/test_sign_tx_htlc/00200.png and b/tests/snapshots/flex/test_sign_tx_htlc/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_htlc/00201.png b/tests/snapshots/flex/test_sign_tx_htlc/00201.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_htlc/00201.png and b/tests/snapshots/flex/test_sign_tx_htlc/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_htlc/00202.png b/tests/snapshots/flex/test_sign_tx_htlc/00202.png index 77f2381..dad816a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_htlc/00202.png and b/tests/snapshots/flex/test_sign_tx_htlc/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00000.png b/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00000.png and b/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00101.png b/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00101.png index bdfc1af..3983091 100644 Binary files a/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00101.png and b/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00102.png b/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00102.png index 55dce88..7bb5b24 100644 Binary files a/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00102.png and b/tests/snapshots/flex/test_sign_tx_issue_fungible_token/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_issue_nft/00000.png b/tests/snapshots/flex/test_sign_tx_issue_nft/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_issue_nft/00000.png and b/tests/snapshots/flex/test_sign_tx_issue_nft/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_issue_nft/00101.png b/tests/snapshots/flex/test_sign_tx_issue_nft/00101.png index c77916a..8a97a71 100644 Binary files a/tests/snapshots/flex/test_sign_tx_issue_nft/00101.png and b/tests/snapshots/flex/test_sign_tx_issue_nft/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_issue_nft/00102.png b/tests/snapshots/flex/test_sign_tx_issue_nft/00102.png index b1edb3e..55933f8 100644 Binary files a/tests/snapshots/flex/test_sign_tx_issue_nft/00102.png and b/tests/snapshots/flex/test_sign_tx_issue_nft/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00000.png b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00000.png and b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00200.png b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00200.png index ea07f63..11bdfc6 100644 Binary files a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00200.png and b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00201.png b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00201.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00201.png and b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00202.png b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00202.png index c8eb2cf..2dc3332 100644 Binary files a/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00202.png and b/tests/snapshots/flex/test_sign_tx_lock_then_transfer/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_mint_tokens/00000.png b/tests/snapshots/flex/test_sign_tx_mint_tokens/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_mint_tokens/00000.png and b/tests/snapshots/flex/test_sign_tx_mint_tokens/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_mint_tokens/00200.png b/tests/snapshots/flex/test_sign_tx_mint_tokens/00200.png index 7f084db..7a71089 100644 Binary files a/tests/snapshots/flex/test_sign_tx_mint_tokens/00200.png and b/tests/snapshots/flex/test_sign_tx_mint_tokens/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_mint_tokens/00201.png b/tests/snapshots/flex/test_sign_tx_mint_tokens/00201.png index 9882d41..7110304 100644 Binary files a/tests/snapshots/flex/test_sign_tx_mint_tokens/00201.png and b/tests/snapshots/flex/test_sign_tx_mint_tokens/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_mint_tokens/00202.png b/tests/snapshots/flex/test_sign_tx_mint_tokens/00202.png index ad35bf1..31d02f9 100644 Binary files a/tests/snapshots/flex/test_sign_tx_mint_tokens/00202.png and b/tests/snapshots/flex/test_sign_tx_mint_tokens/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_conclude/00000.png b/tests/snapshots/flex/test_sign_tx_order_conclude/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_conclude/00000.png and b/tests/snapshots/flex/test_sign_tx_order_conclude/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_conclude/00200.png b/tests/snapshots/flex/test_sign_tx_order_conclude/00200.png index eddbba3..e217342 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_conclude/00200.png and b/tests/snapshots/flex/test_sign_tx_order_conclude/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_conclude/00201.png b/tests/snapshots/flex/test_sign_tx_order_conclude/00201.png index eddbba3..e217342 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_conclude/00201.png and b/tests/snapshots/flex/test_sign_tx_order_conclude/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_conclude/00300.png b/tests/snapshots/flex/test_sign_tx_order_conclude/00300.png index a05b1c4..7aa1096 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_conclude/00300.png and b/tests/snapshots/flex/test_sign_tx_order_conclude/00300.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_conclude/00301.png b/tests/snapshots/flex/test_sign_tx_order_conclude/00301.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_conclude/00301.png and b/tests/snapshots/flex/test_sign_tx_order_conclude/00301.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_conclude/00302.png b/tests/snapshots/flex/test_sign_tx_order_conclude/00302.png index f4f3a10..093972c 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_conclude/00302.png and b/tests/snapshots/flex/test_sign_tx_order_conclude/00302.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_fill/00000.png b/tests/snapshots/flex/test_sign_tx_order_fill/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_fill/00000.png and b/tests/snapshots/flex/test_sign_tx_order_fill/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_fill/00200.png b/tests/snapshots/flex/test_sign_tx_order_fill/00200.png index 72c7dec..4d355fc 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_fill/00200.png and b/tests/snapshots/flex/test_sign_tx_order_fill/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_fill/00201.png b/tests/snapshots/flex/test_sign_tx_order_fill/00201.png index 72c7dec..4d355fc 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_fill/00201.png and b/tests/snapshots/flex/test_sign_tx_order_fill/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_fill/00300.png b/tests/snapshots/flex/test_sign_tx_order_fill/00300.png index e312050..27a0d3a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_fill/00300.png and b/tests/snapshots/flex/test_sign_tx_order_fill/00300.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_fill/00301.png b/tests/snapshots/flex/test_sign_tx_order_fill/00301.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_fill/00301.png and b/tests/snapshots/flex/test_sign_tx_order_fill/00301.png differ diff --git a/tests/snapshots/flex/test_sign_tx_order_fill/00302.png b/tests/snapshots/flex/test_sign_tx_order_fill/00302.png index 5b7bcb1..23365e9 100644 Binary files a/tests/snapshots/flex/test_sign_tx_order_fill/00302.png and b/tests/snapshots/flex/test_sign_tx_order_fill/00302.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00000.png b/tests/snapshots/flex/test_sign_tx_transfer/00000.png deleted file mode 100644 index 5d42a9a..0000000 Binary files a/tests/snapshots/flex/test_sign_tx_transfer/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00100.png b/tests/snapshots/flex/test_sign_tx_transfer/00100.png deleted file mode 100644 index a6e4d55..0000000 Binary files a/tests/snapshots/flex/test_sign_tx_transfer/00100.png and /dev/null differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00101.png b/tests/snapshots/flex/test_sign_tx_transfer/00101.png deleted file mode 100644 index 67a9b5a..0000000 Binary files a/tests/snapshots/flex/test_sign_tx_transfer/00101.png and /dev/null differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00102.png b/tests/snapshots/flex/test_sign_tx_transfer/00102.png deleted file mode 100644 index 77025cd..0000000 Binary files a/tests/snapshots/flex/test_sign_tx_transfer/00102.png and /dev/null differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_invalid_change_path/00000.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_invalid_change_path/00000.png new file mode 100644 index 0000000..1175f88 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_invalid_change_path/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_mismatched_destination/00000.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_mismatched_destination/00000.png new file mode 100644 index 0000000..1175f88 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_mismatched_destination/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00000.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00000.png new file mode 100644 index 0000000..1175f88 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00100.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00100.png new file mode 100644 index 0000000..f580560 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00100.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00101.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00101.png new file mode 100644 index 0000000..f580560 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00200.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00200.png new file mode 100644 index 0000000..94f140e Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00201.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00201.png new file mode 100644 index 0000000..db894b8 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00202.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00202.png new file mode 100644 index 0000000..6405b27 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00200.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00300.png similarity index 100% rename from tests/snapshots/flex/test_sign_tx_transfer/00200.png rename to tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key/00300.png diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00000.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00000.png new file mode 100644 index 0000000..1175f88 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00100.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00100.png new file mode 100644 index 0000000..f580560 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00100.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00101.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00101.png new file mode 100644 index 0000000..f580560 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00200.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00200.png new file mode 100644 index 0000000..92bcb7b Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00201.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00201.png new file mode 100644 index 0000000..db894b8 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00202.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00202.png new file mode 100644 index 0000000..6405b27 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00300.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00300.png new file mode 100644 index 0000000..435aa78 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_public_key_hash/00300.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_receive_path/00000.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_receive_path/00000.png new file mode 100644 index 0000000..1175f88 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_receive_path/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00000.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00000.png new file mode 100644 index 0000000..1175f88 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00100.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00100.png new file mode 100644 index 0000000..f580560 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00100.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00101.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00101.png new file mode 100644 index 0000000..f580560 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00200.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00200.png new file mode 100644 index 0000000..0ea72d3 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00201.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00201.png new file mode 100644 index 0000000..db894b8 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00202.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00202.png new file mode 100644 index 0000000..6405b27 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00300.png b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00300.png new file mode 100644 index 0000000..435aa78 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_change_output_without_change_path/00300.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_no_change/00000.png b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00000.png new file mode 100644 index 0000000..1175f88 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_no_change/00100.png b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00100.png new file mode 100644 index 0000000..209e270 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00100.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_no_change/00101.png b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00101.png new file mode 100644 index 0000000..db894b8 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_no_change/00102.png b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00102.png new file mode 100644 index 0000000..6405b27 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_transfer_no_change/00200.png b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00200.png new file mode 100644 index 0000000..435aa78 Binary files /dev/null and b/tests/snapshots/flex/test_sign_tx_transfer_no_change/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00000.png b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00000.png and b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00200.png b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00200.png index ada16a3..318c086 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00200.png and b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00201.png b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00201.png index 8a8445e..3aa116a 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00201.png and b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00202.png b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00202.png index 5a46298..d52bfc2 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00202.png and b/tests/snapshots/flex/test_sign_tx_unfreeze_tokens/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00000.png b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00000.png and b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00200.png b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00200.png index ada16a3..318c086 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00200.png and b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00200.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00201.png b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00201.png index bf6752a..0117cb2 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00201.png and b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00201.png differ diff --git a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00202.png b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00202.png index 62478ed..795009d 100644 Binary files a/tests/snapshots/flex/test_sign_tx_unmint_tokens/00202.png and b/tests/snapshots/flex/test_sign_tx_unmint_tokens/00202.png differ diff --git a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00000.png b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00000.png and b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00100.png b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00100.png index b8e8fc2..cd3216f 100644 Binary files a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00100.png and b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00100.png differ diff --git a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00101.png b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00101.png index 5880f40..0559c99 100644 Binary files a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00101.png and b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00102.png b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00102.png index 77025cd..6405b27 100644 Binary files a/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00102.png and b/tests/snapshots/flex/test_sign_tx_with_large_input_and_commitment/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_with_large_output/00000.png b/tests/snapshots/flex/test_sign_tx_with_large_output/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_with_large_output/00000.png and b/tests/snapshots/flex/test_sign_tx_with_large_output/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_with_large_output/00101.png b/tests/snapshots/flex/test_sign_tx_with_large_output/00101.png index c77916a..8a97a71 100644 Binary files a/tests/snapshots/flex/test_sign_tx_with_large_output/00101.png and b/tests/snapshots/flex/test_sign_tx_with_large_output/00101.png differ diff --git a/tests/snapshots/flex/test_sign_tx_with_large_output/00102.png b/tests/snapshots/flex/test_sign_tx_with_large_output/00102.png index b1edb3e..55933f8 100644 Binary files a/tests/snapshots/flex/test_sign_tx_with_large_output/00102.png and b/tests/snapshots/flex/test_sign_tx_with_large_output/00102.png differ diff --git a/tests/snapshots/flex/test_sign_tx_without_outputs/00000.png b/tests/snapshots/flex/test_sign_tx_without_outputs/00000.png index 5d42a9a..1175f88 100644 Binary files a/tests/snapshots/flex/test_sign_tx_without_outputs/00000.png and b/tests/snapshots/flex/test_sign_tx_without_outputs/00000.png differ diff --git a/tests/snapshots/flex/test_sign_tx_without_outputs/00200.png b/tests/snapshots/flex/test_sign_tx_without_outputs/00200.png index aa0f0aa..75e92a5 100644 Binary files a/tests/snapshots/flex/test_sign_tx_without_outputs/00200.png and b/tests/snapshots/flex/test_sign_tx_without_outputs/00200.png differ diff --git a/tests/snapshots/nanosp/test_app_mainmenu/00000.png b/tests/snapshots/nanosp/test_app_mainmenu/00000.png index 4073303..6b4e7d7 100644 Binary files a/tests/snapshots/nanosp/test_app_mainmenu/00000.png and b/tests/snapshots/nanosp/test_app_mainmenu/00000.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png index e2ead08..a7868c4 100644 Binary files a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png and b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png index e2ead08..a7868c4 100644 Binary files a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png and b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_large_message/00000.png b/tests/snapshots/nanosp/test_sign_large_message/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanosp/test_sign_large_message/00000.png and b/tests/snapshots/nanosp/test_sign_large_message/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_message/00000.png b/tests/snapshots/nanosp/test_sign_message/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanosp/test_sign_message/00000.png and b/tests/snapshots/nanosp/test_sign_message/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_message_pkh/00000.png b/tests/snapshots/nanosp/test_sign_message_pkh/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanosp/test_sign_message_pkh/00000.png and b/tests/snapshots/nanosp/test_sign_message_pkh/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_message_refused/00000.png b/tests/snapshots/nanosp/test_sign_message_refused/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanosp/test_sign_message_refused/00000.png and b/tests/snapshots/nanosp/test_sign_message_refused/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00000.png b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00000.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00201.png b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00201.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00202.png b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00202.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00203.png b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00203.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00204.png b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00204.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00205.png b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00205.png index c81329e..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00205.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00206.png b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00206.png new file mode 100644 index 0000000..c81329e Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_change_token_authority/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00000.png b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00000.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00201.png b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00201.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00202.png b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00202.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00203.png b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00203.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00204.png b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00204.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00205.png b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00205.png index d3f5cd6..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00205.png and b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00206.png b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00206.png new file mode 100644 index 0000000..d3f5cd6 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_change_token_metadata_uri/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_create_delegation/00000.png b/tests/snapshots/nanosp/test_sign_tx_create_delegation/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_create_delegation/00000.png and b/tests/snapshots/nanosp/test_sign_tx_create_delegation/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_create_delegation/00102.png b/tests/snapshots/nanosp/test_sign_tx_create_delegation/00102.png index 3d01046..d0577d0 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_create_delegation/00102.png and b/tests/snapshots/nanosp/test_sign_tx_create_delegation/00102.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_create_delegation/00105.png b/tests/snapshots/nanosp/test_sign_tx_create_delegation/00105.png index 0f6ca54..f25f614 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_create_delegation/00105.png and b/tests/snapshots/nanosp/test_sign_tx_create_delegation/00105.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00000.png b/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00000.png and b/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00111.png b/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00111.png index 2737bf9..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00111.png and b/tests/snapshots/nanosp/test_sign_tx_create_stake_pool/00111.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00000.png b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00000.png and b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00100.png b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00100.png index 15001c0..8f743d3 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00100.png and b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00100.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00101.png b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00101.png index 722145c..00ee020 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00101.png and b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00101.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00102.png b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00102.png index 11e1d3f..3a2b90f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00102.png and b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00102.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00103.png b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00103.png index 0623b1b..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00103.png and b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00103.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00104.png b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00104.png index e0ad1f1..2e9abd6 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00104.png and b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00104.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00105.png b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00105.png new file mode 100644 index 0000000..e0ad1f1 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_delegate_staking/00105.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00000.png b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00000.png and b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00201.png b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00201.png and b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00202.png b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00202.png and b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00203.png b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00203.png and b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00204.png b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00204.png and b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00205.png b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00205.png index 567675f..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00205.png and b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00206.png b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00206.png new file mode 100644 index 0000000..567675f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_freeze_tokens/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00000.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00000.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00104.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00104.png index 0d5d509..2024d86 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00104.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00104.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00105.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00105.png index 9949b8d..f8f69d3 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00105.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00105.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00201.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00201.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00202.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00202.png index 607670c..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00202.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00203.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00203.png index 11e1d3f..d715b04 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00203.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00204.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00204.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00205.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00205.png index 32f349e..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_htlc/00205.png and b/tests/snapshots/nanosp/test_sign_tx_htlc/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_htlc/00206.png b/tests/snapshots/nanosp/test_sign_tx_htlc/00206.png new file mode 100644 index 0000000..32f349e Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_htlc/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00000.png b/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00000.png and b/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00103.png b/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00103.png index 77eedd9..caf1043 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00103.png and b/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00103.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00106.png b/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00106.png index 0f6ca54..f25f614 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00106.png and b/tests/snapshots/nanosp/test_sign_tx_issue_fungible_token/00106.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00000.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00000.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00100.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00100.png index 8b7b71f..ddb67cc 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00100.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00100.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00101.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00101.png index 9d40b0b..3d0e26d 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00101.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00101.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00102.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00102.png index 64c4618..3284d53 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00102.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00102.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00103.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00103.png index 2400405..cecb00e 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00103.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00103.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00104.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00104.png index 2f750b3..208e764 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00104.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00104.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00105.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00105.png index e3ef4c1..e972992 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00105.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00105.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00106.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00106.png index bc9c4a5..8b3a32c 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00106.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00106.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00107.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00107.png index 77dec68..0bf9117 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00107.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00107.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00108.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00108.png index 6d7bef4..19790cf 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00108.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00108.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00109.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00109.png index 8bf8d9b..ef370ee 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00109.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00109.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00110.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00110.png index 11e1d3f..18eb013 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00110.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00110.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00111.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00111.png index af149c9..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00111.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00111.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00112.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00112.png index 8a6f6ed..389bfe9 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00112.png and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00112.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_issue_nft/00113.png b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00113.png new file mode 100644 index 0000000..8a6f6ed Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_issue_nft/00113.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00000.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00000.png and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00201.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00201.png index 7a9b805..88eeffa 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00201.png and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00202.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00202.png index 342974f..aeea128 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00202.png and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00203.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00203.png index 53e8899..dd68cc7 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00203.png and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00204.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00204.png index 11e1d3f..94f014e 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00204.png and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00205.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00205.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00205.png and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00206.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00206.png index f7d545b..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00206.png and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00207.png b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00207.png new file mode 100644 index 0000000..f7d545b Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_lock_then_transfer/00207.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00000.png b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00000.png and b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00202.png b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00202.png index b1ff363..158e7e9 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00202.png and b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00203.png b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00203.png index f12db18..b6415b8 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00203.png and b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00204.png b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00204.png index 1a58b12..aac4728 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00204.png and b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00206.png b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00206.png index eeaad30..608a814 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00206.png and b/tests/snapshots/nanosp/test_sign_tx_mint_tokens/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00000.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00000.png and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00201.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00201.png and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00202.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00202.png index d596bdf..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00202.png and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00203.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00203.png new file mode 100644 index 0000000..a20400f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00302.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00302.png index e820252..535779f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00302.png and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00302.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00303.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00303.png index 376ff24..d685542 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00303.png and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00303.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00304.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00304.png index 3d1d652..2f1c148 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00304.png and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00304.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00306.png b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00306.png index 2737bf9..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_conclude/00306.png and b/tests/snapshots/nanosp/test_sign_tx_order_conclude/00306.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00000.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_fill/00000.png and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00201.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_fill/00201.png and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00202.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00202.png index 607670c..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_fill/00202.png and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00203.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00203.png new file mode 100644 index 0000000..d715b04 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00302.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00302.png index d48537e..84560a8 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_fill/00302.png and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00302.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00303.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00303.png index f12db18..b6415b8 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_fill/00303.png and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00303.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00304.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00304.png index 1a58b12..aac4728 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_fill/00304.png and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00304.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_order_fill/00306.png b/tests/snapshots/nanosp/test_sign_tx_order_fill/00306.png index 2737bf9..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_order_fill/00306.png and b/tests/snapshots/nanosp/test_sign_tx_order_fill/00306.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer/00000.png deleted file mode 100644 index 640e079..0000000 Binary files a/tests/snapshots/nanosp/test_sign_tx_transfer/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00102.png b/tests/snapshots/nanosp/test_sign_tx_transfer/00102.png deleted file mode 100644 index c759d9b..0000000 Binary files a/tests/snapshots/nanosp/test_sign_tx_transfer/00102.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00104.png b/tests/snapshots/nanosp/test_sign_tx_transfer/00104.png deleted file mode 100644 index 639af51..0000000 Binary files a/tests/snapshots/nanosp/test_sign_tx_transfer/00104.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_invalid_change_path/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_invalid_change_path/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_invalid_change_path/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_mismatched_destination/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_mismatched_destination/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_mismatched_destination/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00100.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00100.png similarity index 100% rename from tests/snapshots/nanosp/test_sign_tx_transfer/00100.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00100.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00101.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00101.png similarity index 100% rename from tests/snapshots/nanosp/test_sign_tx_transfer/00101.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00101.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00102.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00102.png new file mode 100644 index 0000000..46ccb4f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00102.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00103.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00200.png similarity index 100% rename from tests/snapshots/nanosp/test_sign_tx_transfer/00103.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00200.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00201.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00201.png new file mode 100644 index 0000000..3917500 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00202.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00202.png new file mode 100644 index 0000000..e7d3e48 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00203.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00203.png new file mode 100644 index 0000000..56b3d6d Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00103.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00204.png similarity index 100% rename from tests/snapshots/nanox/test_sign_tx_transfer/00103.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00204.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00205.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00205.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00105.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00206.png similarity index 100% rename from tests/snapshots/nanosp/test_sign_tx_transfer/00105.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00206.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00200.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00300.png similarity index 100% rename from tests/snapshots/nanosp/test_sign_tx_transfer/00200.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key/00300.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00100.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00100.png similarity index 100% rename from tests/snapshots/nanox/test_sign_tx_transfer/00100.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00100.png diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00101.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00101.png similarity index 100% rename from tests/snapshots/nanox/test_sign_tx_transfer/00101.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00101.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00102.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00102.png new file mode 100644 index 0000000..46ccb4f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00102.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00200.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00200.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00200.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00201.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00201.png new file mode 100644 index 0000000..111ac4d Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00202.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00202.png new file mode 100644 index 0000000..40f4079 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00203.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00203.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00204.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00204.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00105.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00205.png similarity index 100% rename from tests/snapshots/nanox/test_sign_tx_transfer/00105.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00205.png diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00200.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00300.png similarity index 100% rename from tests/snapshots/nanox/test_sign_tx_transfer/00200.png rename to tests/snapshots/nanosp/test_sign_tx_transfer_change_output_public_key_hash/00300.png diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_receive_path/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_receive_path/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_receive_path/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00100.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00100.png new file mode 100644 index 0000000..e2e6efc Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00100.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00101.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00101.png new file mode 100644 index 0000000..75337cb Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00101.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00102.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00102.png new file mode 100644 index 0000000..46ccb4f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00102.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00200.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00200.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00200.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00201.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00201.png new file mode 100644 index 0000000..8759b24 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00202.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00202.png new file mode 100644 index 0000000..9b4a3b7 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00203.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00203.png new file mode 100644 index 0000000..caabe16 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00204.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00204.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00205.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00205.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00206.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00206.png new file mode 100644 index 0000000..7898c99 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00300.png b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00300.png new file mode 100644 index 0000000..3a16119 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_change_output_without_change_path/00300.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00000.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00100.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00100.png new file mode 100644 index 0000000..e2e6efc Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00100.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00101.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00101.png new file mode 100644 index 0000000..75337cb Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00101.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00102.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00102.png new file mode 100644 index 0000000..ce81b92 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00102.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00103.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00103.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00103.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00104.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00104.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00104.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00105.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00105.png new file mode 100644 index 0000000..7898c99 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00105.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00200.png b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00200.png new file mode 100644 index 0000000..3a16119 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_transfer_no_change/00200.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00000.png b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00000.png and b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00201.png b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00201.png and b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00202.png b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00202.png and b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00203.png b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00203.png and b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00204.png b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00204.png and b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00205.png b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00205.png index ddae9bc..b550e7a 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00205.png and b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00206.png b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00206.png new file mode 100644 index 0000000..ddae9bc Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_unfreeze_tokens/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00000.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00000.png and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00201.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00201.png and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00201.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00202.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00202.png and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00202.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00203.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00203.png and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00203.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00204.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00204.png index 10fa236..11e1d3f 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00204.png and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00204.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00205.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00205.png index 8ed052d..b1df925 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00205.png and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00205.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00206.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00206.png index 39ef4a2..e3c3aad 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00206.png and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00206.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00207.png b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00207.png new file mode 100644 index 0000000..39ef4a2 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_tx_unmint_tokens/00207.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00000.png b/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00000.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00101.png b/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00101.png index eeca286..29ab192 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00101.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00101.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00105.png b/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00105.png index ca25279..1152a8e 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00105.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_input_and_commitment/00105.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00000.png b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00000.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00116.png b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00116.png index f4ec1f4..89c1a67 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00116.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00116.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00117.png b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00117.png index 3f4b57f..13e8542 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00117.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00117.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00118.png b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00118.png index 175dcbd..6682d90 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00118.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00118.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00120.png b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00120.png index af149c9..389bfe9 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_with_large_output/00120.png and b/tests/snapshots/nanosp/test_sign_tx_with_large_output/00120.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_without_outputs/00000.png b/tests/snapshots/nanosp/test_sign_tx_without_outputs/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_without_outputs/00000.png and b/tests/snapshots/nanosp/test_sign_tx_without_outputs/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_tx_without_outputs/00201.png b/tests/snapshots/nanosp/test_sign_tx_without_outputs/00201.png index eeaad30..608a814 100644 Binary files a/tests/snapshots/nanosp/test_sign_tx_without_outputs/00201.png and b/tests/snapshots/nanosp/test_sign_tx_without_outputs/00201.png differ diff --git a/tests/snapshots/nanox/test_app_mainmenu/00000.png b/tests/snapshots/nanox/test_app_mainmenu/00000.png index 4073303..6b4e7d7 100644 Binary files a/tests/snapshots/nanox/test_app_mainmenu/00000.png and b/tests/snapshots/nanox/test_app_mainmenu/00000.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png index e2ead08..a7868c4 100644 Binary files a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png and b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00000.png index e2ead08..a7868c4 100644 Binary files a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00000.png and b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_large_message/00000.png b/tests/snapshots/nanox/test_sign_large_message/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanox/test_sign_large_message/00000.png and b/tests/snapshots/nanox/test_sign_large_message/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_message/00000.png b/tests/snapshots/nanox/test_sign_message/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanox/test_sign_message/00000.png and b/tests/snapshots/nanox/test_sign_message/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_message_pkh/00000.png b/tests/snapshots/nanox/test_sign_message_pkh/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanox/test_sign_message_pkh/00000.png and b/tests/snapshots/nanox/test_sign_message_pkh/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_message_refused/00000.png b/tests/snapshots/nanox/test_sign_message_refused/00000.png index 2e4d511..76d88e5 100644 Binary files a/tests/snapshots/nanox/test_sign_message_refused/00000.png and b/tests/snapshots/nanox/test_sign_message_refused/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00000.png b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00000.png and b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00201.png b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00201.png and b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00202.png b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00202.png and b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00203.png b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00203.png and b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00204.png b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00204.png and b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00205.png b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00205.png index c81329e..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00205.png and b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_authority/00206.png b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00206.png new file mode 100644 index 0000000..c81329e Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_change_token_authority/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00000.png b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00000.png and b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00201.png b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00201.png and b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00202.png b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00202.png and b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00203.png b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00203.png and b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00204.png b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00204.png and b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00205.png b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00205.png index d3f5cd6..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00205.png and b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00206.png b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00206.png new file mode 100644 index 0000000..d3f5cd6 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_change_token_metadata_uri/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_create_delegation/00000.png b/tests/snapshots/nanox/test_sign_tx_create_delegation/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_create_delegation/00000.png and b/tests/snapshots/nanox/test_sign_tx_create_delegation/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_create_delegation/00102.png b/tests/snapshots/nanox/test_sign_tx_create_delegation/00102.png index 3d01046..d0577d0 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_create_delegation/00102.png and b/tests/snapshots/nanox/test_sign_tx_create_delegation/00102.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_create_delegation/00105.png b/tests/snapshots/nanox/test_sign_tx_create_delegation/00105.png index 0f6ca54..f25f614 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_create_delegation/00105.png and b/tests/snapshots/nanox/test_sign_tx_create_delegation/00105.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00000.png b/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00000.png and b/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00111.png b/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00111.png index 2737bf9..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00111.png and b/tests/snapshots/nanox/test_sign_tx_create_stake_pool/00111.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00000.png b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00000.png and b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00100.png b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00100.png index 15001c0..8f743d3 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00100.png and b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00100.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00101.png b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00101.png index 722145c..00ee020 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00101.png and b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00101.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00102.png b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00102.png index 11e1d3f..3a2b90f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00102.png and b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00102.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00103.png b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00103.png index 0623b1b..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00103.png and b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00103.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00104.png b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00104.png index e0ad1f1..2e9abd6 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00104.png and b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00104.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_delegate_staking/00105.png b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00105.png new file mode 100644 index 0000000..e0ad1f1 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_delegate_staking/00105.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00000.png b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00000.png and b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00201.png b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00201.png and b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00202.png b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00202.png and b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00203.png b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00203.png and b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00204.png b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00204.png and b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00205.png b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00205.png index 567675f..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00205.png and b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00206.png b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00206.png new file mode 100644 index 0000000..567675f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_freeze_tokens/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00000.png b/tests/snapshots/nanox/test_sign_tx_htlc/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00000.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00104.png b/tests/snapshots/nanox/test_sign_tx_htlc/00104.png index 0d5d509..2024d86 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00104.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00104.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00105.png b/tests/snapshots/nanox/test_sign_tx_htlc/00105.png index 9949b8d..f8f69d3 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00105.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00105.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00201.png b/tests/snapshots/nanox/test_sign_tx_htlc/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00201.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00202.png b/tests/snapshots/nanox/test_sign_tx_htlc/00202.png index 607670c..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00202.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00203.png b/tests/snapshots/nanox/test_sign_tx_htlc/00203.png index 11e1d3f..d715b04 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00203.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00204.png b/tests/snapshots/nanox/test_sign_tx_htlc/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00204.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00205.png b/tests/snapshots/nanox/test_sign_tx_htlc/00205.png index 32f349e..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_htlc/00205.png and b/tests/snapshots/nanox/test_sign_tx_htlc/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_htlc/00206.png b/tests/snapshots/nanox/test_sign_tx_htlc/00206.png new file mode 100644 index 0000000..32f349e Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_htlc/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00000.png b/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00000.png and b/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00103.png b/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00103.png index 77eedd9..caf1043 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00103.png and b/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00103.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00106.png b/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00106.png index 0f6ca54..f25f614 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00106.png and b/tests/snapshots/nanox/test_sign_tx_issue_fungible_token/00106.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00000.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00000.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00100.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00100.png index 8b7b71f..ddb67cc 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00100.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00100.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00101.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00101.png index 9d40b0b..3d0e26d 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00101.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00101.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00102.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00102.png index 64c4618..3284d53 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00102.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00102.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00103.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00103.png index 2400405..cecb00e 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00103.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00103.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00104.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00104.png index 2f750b3..208e764 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00104.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00104.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00105.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00105.png index e3ef4c1..e972992 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00105.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00105.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00106.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00106.png index bc9c4a5..8b3a32c 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00106.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00106.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00107.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00107.png index 77dec68..0bf9117 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00107.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00107.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00108.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00108.png index 6d7bef4..19790cf 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00108.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00108.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00109.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00109.png index 8bf8d9b..ef370ee 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00109.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00109.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00110.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00110.png index 11e1d3f..18eb013 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00110.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00110.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00111.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00111.png index af149c9..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00111.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00111.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00112.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00112.png index 8a6f6ed..389bfe9 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_issue_nft/00112.png and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00112.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_issue_nft/00113.png b/tests/snapshots/nanox/test_sign_tx_issue_nft/00113.png new file mode 100644 index 0000000..8a6f6ed Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_issue_nft/00113.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00000.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00000.png and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00201.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00201.png index 7a9b805..88eeffa 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00201.png and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00202.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00202.png index 342974f..aeea128 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00202.png and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00203.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00203.png index 53e8899..dd68cc7 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00203.png and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00204.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00204.png index 11e1d3f..94f014e 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00204.png and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00205.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00205.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00205.png and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00206.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00206.png index f7d545b..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00206.png and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00207.png b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00207.png new file mode 100644 index 0000000..f7d545b Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_lock_then_transfer/00207.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00000.png b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00000.png and b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00202.png b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00202.png index b1ff363..158e7e9 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00202.png and b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00203.png b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00203.png index f12db18..b6415b8 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00203.png and b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00204.png b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00204.png index 1a58b12..aac4728 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00204.png and b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00206.png b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00206.png index eeaad30..608a814 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_mint_tokens/00206.png and b/tests/snapshots/nanox/test_sign_tx_mint_tokens/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00000.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_conclude/00000.png and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00201.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_conclude/00201.png and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00202.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00202.png index d596bdf..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_conclude/00202.png and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00203.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00203.png new file mode 100644 index 0000000..a20400f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00302.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00302.png index e820252..535779f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_conclude/00302.png and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00302.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00303.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00303.png index 376ff24..d685542 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_conclude/00303.png and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00303.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00304.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00304.png index 3d1d652..2f1c148 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_conclude/00304.png and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00304.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_conclude/00306.png b/tests/snapshots/nanox/test_sign_tx_order_conclude/00306.png index 2737bf9..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_conclude/00306.png and b/tests/snapshots/nanox/test_sign_tx_order_conclude/00306.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00000.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_fill/00000.png and b/tests/snapshots/nanox/test_sign_tx_order_fill/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00201.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_fill/00201.png and b/tests/snapshots/nanox/test_sign_tx_order_fill/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00202.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00202.png index 607670c..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_fill/00202.png and b/tests/snapshots/nanox/test_sign_tx_order_fill/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00203.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00203.png new file mode 100644 index 0000000..d715b04 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_order_fill/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00302.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00302.png index d48537e..84560a8 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_fill/00302.png and b/tests/snapshots/nanox/test_sign_tx_order_fill/00302.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00303.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00303.png index f12db18..b6415b8 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_fill/00303.png and b/tests/snapshots/nanox/test_sign_tx_order_fill/00303.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00304.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00304.png index 1a58b12..aac4728 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_fill/00304.png and b/tests/snapshots/nanox/test_sign_tx_order_fill/00304.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_order_fill/00306.png b/tests/snapshots/nanox/test_sign_tx_order_fill/00306.png index 2737bf9..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_order_fill/00306.png and b/tests/snapshots/nanox/test_sign_tx_order_fill/00306.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer/00000.png deleted file mode 100644 index 640e079..0000000 Binary files a/tests/snapshots/nanox/test_sign_tx_transfer/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00102.png b/tests/snapshots/nanox/test_sign_tx_transfer/00102.png deleted file mode 100644 index c759d9b..0000000 Binary files a/tests/snapshots/nanox/test_sign_tx_transfer/00102.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00104.png b/tests/snapshots/nanox/test_sign_tx_transfer/00104.png deleted file mode 100644 index 639af51..0000000 Binary files a/tests/snapshots/nanox/test_sign_tx_transfer/00104.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_invalid_change_path/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_invalid_change_path/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_invalid_change_path/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_mismatched_destination/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_mismatched_destination/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_mismatched_destination/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00100.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00100.png new file mode 100644 index 0000000..e2e6efc Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00100.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00101.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00101.png new file mode 100644 index 0000000..75337cb Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00101.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00102.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00102.png new file mode 100644 index 0000000..46ccb4f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00102.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00200.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00200.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00200.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00201.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00201.png new file mode 100644 index 0000000..3917500 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00202.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00202.png new file mode 100644 index 0000000..e7d3e48 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00203.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00203.png new file mode 100644 index 0000000..56b3d6d Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00204.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00204.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00205.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00205.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00206.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00206.png new file mode 100644 index 0000000..7898c99 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00300.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00300.png new file mode 100644 index 0000000..3a16119 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key/00300.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00100.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00100.png new file mode 100644 index 0000000..e2e6efc Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00100.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00101.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00101.png new file mode 100644 index 0000000..75337cb Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00101.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00102.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00102.png new file mode 100644 index 0000000..46ccb4f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00102.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00200.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00200.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00200.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00201.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00201.png new file mode 100644 index 0000000..111ac4d Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00202.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00202.png new file mode 100644 index 0000000..40f4079 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00203.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00203.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00204.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00204.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00205.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00205.png new file mode 100644 index 0000000..7898c99 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00300.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00300.png new file mode 100644 index 0000000..3a16119 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_public_key_hash/00300.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_receive_path/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_receive_path/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_receive_path/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00100.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00100.png new file mode 100644 index 0000000..e2e6efc Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00100.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00101.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00101.png new file mode 100644 index 0000000..75337cb Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00101.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00102.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00102.png new file mode 100644 index 0000000..46ccb4f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00102.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00200.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00200.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00200.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00201.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00201.png new file mode 100644 index 0000000..8759b24 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00202.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00202.png new file mode 100644 index 0000000..9b4a3b7 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00203.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00203.png new file mode 100644 index 0000000..caabe16 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00204.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00204.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00205.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00205.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00206.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00206.png new file mode 100644 index 0000000..7898c99 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00300.png b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00300.png new file mode 100644 index 0000000..3a16119 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_change_output_without_change_path/00300.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00000.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00000.png new file mode 100644 index 0000000..2958ad5 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00100.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00100.png new file mode 100644 index 0000000..e2e6efc Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00100.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00101.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00101.png new file mode 100644 index 0000000..75337cb Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00101.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00102.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00102.png new file mode 100644 index 0000000..ce81b92 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00102.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00103.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00103.png new file mode 100644 index 0000000..11e1d3f Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00103.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00104.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00104.png new file mode 100644 index 0000000..e7176d0 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00104.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00105.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00105.png new file mode 100644 index 0000000..7898c99 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00105.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00200.png b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00200.png new file mode 100644 index 0000000..3a16119 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_transfer_no_change/00200.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00000.png b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00000.png and b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00201.png b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00201.png and b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00202.png b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00202.png and b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00203.png b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00203.png and b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00204.png b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00204.png index 2737bf9..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00204.png and b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00205.png b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00205.png index ddae9bc..b550e7a 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00205.png and b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00206.png b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00206.png new file mode 100644 index 0000000..ddae9bc Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_unfreeze_tokens/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00000.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00000.png and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00201.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00201.png index f8e1b29..3917500 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00201.png and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00201.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00202.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00202.png index 85319c5..e7d3e48 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00202.png and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00202.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00203.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00203.png index 11e1d3f..f8de520 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00203.png and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00203.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00204.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00204.png index 10fa236..11e1d3f 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00204.png and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00204.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00205.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00205.png index 8ed052d..b1df925 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00205.png and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00205.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00206.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00206.png index 39ef4a2..e3c3aad 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00206.png and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00206.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00207.png b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00207.png new file mode 100644 index 0000000..39ef4a2 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_tx_unmint_tokens/00207.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00000.png b/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00000.png and b/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00101.png b/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00101.png index eeca286..29ab192 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00101.png and b/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00101.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00105.png b/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00105.png index ca25279..1152a8e 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00105.png and b/tests/snapshots/nanox/test_sign_tx_with_large_input_and_commitment/00105.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_output/00000.png b/tests/snapshots/nanox/test_sign_tx_with_large_output/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_output/00000.png and b/tests/snapshots/nanox/test_sign_tx_with_large_output/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_output/00116.png b/tests/snapshots/nanox/test_sign_tx_with_large_output/00116.png index f4ec1f4..89c1a67 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_output/00116.png and b/tests/snapshots/nanox/test_sign_tx_with_large_output/00116.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_output/00117.png b/tests/snapshots/nanox/test_sign_tx_with_large_output/00117.png index 3f4b57f..13e8542 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_output/00117.png and b/tests/snapshots/nanox/test_sign_tx_with_large_output/00117.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_output/00118.png b/tests/snapshots/nanox/test_sign_tx_with_large_output/00118.png index 175dcbd..6682d90 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_output/00118.png and b/tests/snapshots/nanox/test_sign_tx_with_large_output/00118.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_with_large_output/00120.png b/tests/snapshots/nanox/test_sign_tx_with_large_output/00120.png index af149c9..389bfe9 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_with_large_output/00120.png and b/tests/snapshots/nanox/test_sign_tx_with_large_output/00120.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_without_outputs/00000.png b/tests/snapshots/nanox/test_sign_tx_without_outputs/00000.png index 640e079..2958ad5 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_without_outputs/00000.png and b/tests/snapshots/nanox/test_sign_tx_without_outputs/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_tx_without_outputs/00201.png b/tests/snapshots/nanox/test_sign_tx_without_outputs/00201.png index eeaad30..608a814 100644 Binary files a/tests/snapshots/nanox/test_sign_tx_without_outputs/00201.png and b/tests/snapshots/nanox/test_sign_tx_without_outputs/00201.png differ diff --git a/tests/snapshots/stax/test_app_mainmenu/00000.png b/tests/snapshots/stax/test_app_mainmenu/00000.png index a08dbb1..059e373 100644 Binary files a/tests/snapshots/stax/test_app_mainmenu/00000.png and b/tests/snapshots/stax/test_app_mainmenu/00000.png differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png index bbae86a..613faeb 100644 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png and b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00003.png index a08dbb1..059e373 100644 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00003.png and b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00003.png differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/00000.png index bbae86a..613faeb 100644 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/00000.png and b/tests/snapshots/stax/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/snapshots/stax/test_sign_large_message/00000.png b/tests/snapshots/stax/test_sign_large_message/00000.png index 9beaf55..613cc3a 100644 Binary files a/tests/snapshots/stax/test_sign_large_message/00000.png and b/tests/snapshots/stax/test_sign_large_message/00000.png differ diff --git a/tests/snapshots/stax/test_sign_large_message/00003.png b/tests/snapshots/stax/test_sign_large_message/00003.png index 9645708..368d15a 100644 Binary files a/tests/snapshots/stax/test_sign_large_message/00003.png and b/tests/snapshots/stax/test_sign_large_message/00003.png differ diff --git a/tests/snapshots/stax/test_sign_large_message/00005.png b/tests/snapshots/stax/test_sign_large_message/00005.png index a08dbb1..059e373 100644 Binary files a/tests/snapshots/stax/test_sign_large_message/00005.png and b/tests/snapshots/stax/test_sign_large_message/00005.png differ diff --git a/tests/snapshots/stax/test_sign_message/00000.png b/tests/snapshots/stax/test_sign_message/00000.png index c75b6df..e4c4f6c 100644 Binary files a/tests/snapshots/stax/test_sign_message/00000.png and b/tests/snapshots/stax/test_sign_message/00000.png differ diff --git a/tests/snapshots/stax/test_sign_message/00002.png b/tests/snapshots/stax/test_sign_message/00002.png index 6b6fc92..c711a7b 100644 Binary files a/tests/snapshots/stax/test_sign_message/00002.png and b/tests/snapshots/stax/test_sign_message/00002.png differ diff --git a/tests/snapshots/stax/test_sign_message/00004.png b/tests/snapshots/stax/test_sign_message/00004.png index a08dbb1..059e373 100644 Binary files a/tests/snapshots/stax/test_sign_message/00004.png and b/tests/snapshots/stax/test_sign_message/00004.png differ diff --git a/tests/snapshots/stax/test_sign_message_pkh/00000.png b/tests/snapshots/stax/test_sign_message_pkh/00000.png index c75b6df..e4c4f6c 100644 Binary files a/tests/snapshots/stax/test_sign_message_pkh/00000.png and b/tests/snapshots/stax/test_sign_message_pkh/00000.png differ diff --git a/tests/snapshots/stax/test_sign_message_pkh/00002.png b/tests/snapshots/stax/test_sign_message_pkh/00002.png index 6b6fc92..c711a7b 100644 Binary files a/tests/snapshots/stax/test_sign_message_pkh/00002.png and b/tests/snapshots/stax/test_sign_message_pkh/00002.png differ diff --git a/tests/snapshots/stax/test_sign_message_pkh/00004.png b/tests/snapshots/stax/test_sign_message_pkh/00004.png index a08dbb1..059e373 100644 Binary files a/tests/snapshots/stax/test_sign_message_pkh/00004.png and b/tests/snapshots/stax/test_sign_message_pkh/00004.png differ diff --git a/tests/snapshots/stax/test_sign_message_refused/00000.png b/tests/snapshots/stax/test_sign_message_refused/00000.png index c75b6df..e4c4f6c 100644 Binary files a/tests/snapshots/stax/test_sign_message_refused/00000.png and b/tests/snapshots/stax/test_sign_message_refused/00000.png differ diff --git a/tests/snapshots/stax/test_sign_message_refused/00002.png b/tests/snapshots/stax/test_sign_message_refused/00002.png index 6b6fc92..c711a7b 100644 Binary files a/tests/snapshots/stax/test_sign_message_refused/00002.png and b/tests/snapshots/stax/test_sign_message_refused/00002.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_authority/00000.png b/tests/snapshots/stax/test_sign_tx_change_token_authority/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_authority/00000.png and b/tests/snapshots/stax/test_sign_tx_change_token_authority/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_authority/00200.png b/tests/snapshots/stax/test_sign_tx_change_token_authority/00200.png index 14a4dca..f069257 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_authority/00200.png and b/tests/snapshots/stax/test_sign_tx_change_token_authority/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_authority/00201.png b/tests/snapshots/stax/test_sign_tx_change_token_authority/00201.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_authority/00201.png and b/tests/snapshots/stax/test_sign_tx_change_token_authority/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_authority/00202.png b/tests/snapshots/stax/test_sign_tx_change_token_authority/00202.png index 9f62ac4..9c96a72 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_authority/00202.png and b/tests/snapshots/stax/test_sign_tx_change_token_authority/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00000.png b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00000.png and b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00200.png b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00200.png index 14a4dca..f069257 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00200.png and b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00201.png b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00201.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00201.png and b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00202.png b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00202.png index 5154b60..b23ee05 100644 Binary files a/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00202.png and b/tests/snapshots/stax/test_sign_tx_change_token_metadata_uri/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_create_delegation/00000.png b/tests/snapshots/stax/test_sign_tx_create_delegation/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_create_delegation/00000.png and b/tests/snapshots/stax/test_sign_tx_create_delegation/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_create_delegation/00100.png b/tests/snapshots/stax/test_sign_tx_create_delegation/00100.png index 8c29405..91e2260 100644 Binary files a/tests/snapshots/stax/test_sign_tx_create_delegation/00100.png and b/tests/snapshots/stax/test_sign_tx_create_delegation/00100.png differ diff --git a/tests/snapshots/stax/test_sign_tx_create_delegation/00101.png b/tests/snapshots/stax/test_sign_tx_create_delegation/00101.png index 1ba7dbc..fa93cfe 100644 Binary files a/tests/snapshots/stax/test_sign_tx_create_delegation/00101.png and b/tests/snapshots/stax/test_sign_tx_create_delegation/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_create_delegation/00102.png b/tests/snapshots/stax/test_sign_tx_create_delegation/00102.png index db55f1e..5b2c0be 100644 Binary files a/tests/snapshots/stax/test_sign_tx_create_delegation/00102.png and b/tests/snapshots/stax/test_sign_tx_create_delegation/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_create_stake_pool/00000.png b/tests/snapshots/stax/test_sign_tx_create_stake_pool/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_create_stake_pool/00000.png and b/tests/snapshots/stax/test_sign_tx_create_stake_pool/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_create_stake_pool/00101.png b/tests/snapshots/stax/test_sign_tx_create_stake_pool/00101.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_create_stake_pool/00101.png and b/tests/snapshots/stax/test_sign_tx_create_stake_pool/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_create_stake_pool/00102.png b/tests/snapshots/stax/test_sign_tx_create_stake_pool/00102.png index c05cf3b..475e5f0 100644 Binary files a/tests/snapshots/stax/test_sign_tx_create_stake_pool/00102.png and b/tests/snapshots/stax/test_sign_tx_create_stake_pool/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_delegate_staking/00000.png b/tests/snapshots/stax/test_sign_tx_delegate_staking/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_delegate_staking/00000.png and b/tests/snapshots/stax/test_sign_tx_delegate_staking/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_delegate_staking/00100.png b/tests/snapshots/stax/test_sign_tx_delegate_staking/00100.png index ec8dd5b..2a0626d 100644 Binary files a/tests/snapshots/stax/test_sign_tx_delegate_staking/00100.png and b/tests/snapshots/stax/test_sign_tx_delegate_staking/00100.png differ diff --git a/tests/snapshots/stax/test_sign_tx_delegate_staking/00101.png b/tests/snapshots/stax/test_sign_tx_delegate_staking/00101.png index 171985a..bba49d2 100644 Binary files a/tests/snapshots/stax/test_sign_tx_delegate_staking/00101.png and b/tests/snapshots/stax/test_sign_tx_delegate_staking/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_delegate_staking/00102.png b/tests/snapshots/stax/test_sign_tx_delegate_staking/00102.png index 2bc14dc..468c6c9 100644 Binary files a/tests/snapshots/stax/test_sign_tx_delegate_staking/00102.png and b/tests/snapshots/stax/test_sign_tx_delegate_staking/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00000.png b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00000.png and b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00200.png b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00200.png index 14a4dca..f069257 100644 Binary files a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00200.png and b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00201.png b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00201.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00201.png and b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00202.png b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00202.png index c40ddea..546a3aa 100644 Binary files a/tests/snapshots/stax/test_sign_tx_freeze_tokens/00202.png and b/tests/snapshots/stax/test_sign_tx_freeze_tokens/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_htlc/00000.png b/tests/snapshots/stax/test_sign_tx_htlc/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_htlc/00000.png and b/tests/snapshots/stax/test_sign_tx_htlc/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_htlc/00200.png b/tests/snapshots/stax/test_sign_tx_htlc/00200.png index c1443b8..7920f44 100644 Binary files a/tests/snapshots/stax/test_sign_tx_htlc/00200.png and b/tests/snapshots/stax/test_sign_tx_htlc/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_htlc/00201.png b/tests/snapshots/stax/test_sign_tx_htlc/00201.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_htlc/00201.png and b/tests/snapshots/stax/test_sign_tx_htlc/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_htlc/00202.png b/tests/snapshots/stax/test_sign_tx_htlc/00202.png index f316ee9..edf9808 100644 Binary files a/tests/snapshots/stax/test_sign_tx_htlc/00202.png and b/tests/snapshots/stax/test_sign_tx_htlc/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00000.png b/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00000.png and b/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00101.png b/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00101.png index 1ba7dbc..fa93cfe 100644 Binary files a/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00101.png and b/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00102.png b/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00102.png index efce194..db9a256 100644 Binary files a/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00102.png and b/tests/snapshots/stax/test_sign_tx_issue_fungible_token/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_issue_nft/00000.png b/tests/snapshots/stax/test_sign_tx_issue_nft/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_issue_nft/00000.png and b/tests/snapshots/stax/test_sign_tx_issue_nft/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_issue_nft/00101.png b/tests/snapshots/stax/test_sign_tx_issue_nft/00101.png index 82af017..3714407 100644 Binary files a/tests/snapshots/stax/test_sign_tx_issue_nft/00101.png and b/tests/snapshots/stax/test_sign_tx_issue_nft/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_issue_nft/00102.png b/tests/snapshots/stax/test_sign_tx_issue_nft/00102.png index 63885c4..0ca6044 100644 Binary files a/tests/snapshots/stax/test_sign_tx_issue_nft/00102.png and b/tests/snapshots/stax/test_sign_tx_issue_nft/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00000.png b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00000.png and b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00200.png b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00200.png index 42cc985..9c09324 100644 Binary files a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00200.png and b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00201.png b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00201.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00201.png and b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00202.png b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00202.png index e4a5bc4..3c491be 100644 Binary files a/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00202.png and b/tests/snapshots/stax/test_sign_tx_lock_then_transfer/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_mint_tokens/00000.png b/tests/snapshots/stax/test_sign_tx_mint_tokens/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_mint_tokens/00000.png and b/tests/snapshots/stax/test_sign_tx_mint_tokens/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_mint_tokens/00200.png b/tests/snapshots/stax/test_sign_tx_mint_tokens/00200.png index 0ae4a95..d07bece 100644 Binary files a/tests/snapshots/stax/test_sign_tx_mint_tokens/00200.png and b/tests/snapshots/stax/test_sign_tx_mint_tokens/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_mint_tokens/00201.png b/tests/snapshots/stax/test_sign_tx_mint_tokens/00201.png index bf4012c..ba3e3d7 100644 Binary files a/tests/snapshots/stax/test_sign_tx_mint_tokens/00201.png and b/tests/snapshots/stax/test_sign_tx_mint_tokens/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_mint_tokens/00202.png b/tests/snapshots/stax/test_sign_tx_mint_tokens/00202.png index 6aa859c..43d5d8f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_mint_tokens/00202.png and b/tests/snapshots/stax/test_sign_tx_mint_tokens/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_conclude/00000.png b/tests/snapshots/stax/test_sign_tx_order_conclude/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_conclude/00000.png and b/tests/snapshots/stax/test_sign_tx_order_conclude/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_conclude/00200.png b/tests/snapshots/stax/test_sign_tx_order_conclude/00200.png index 87f9c29..16b2f39 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_conclude/00200.png and b/tests/snapshots/stax/test_sign_tx_order_conclude/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_conclude/00201.png b/tests/snapshots/stax/test_sign_tx_order_conclude/00201.png index 87f9c29..16b2f39 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_conclude/00201.png and b/tests/snapshots/stax/test_sign_tx_order_conclude/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_conclude/00300.png b/tests/snapshots/stax/test_sign_tx_order_conclude/00300.png index 8da0054..c0072e7 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_conclude/00300.png and b/tests/snapshots/stax/test_sign_tx_order_conclude/00300.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_conclude/00301.png b/tests/snapshots/stax/test_sign_tx_order_conclude/00301.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_conclude/00301.png and b/tests/snapshots/stax/test_sign_tx_order_conclude/00301.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_conclude/00302.png b/tests/snapshots/stax/test_sign_tx_order_conclude/00302.png index 49dbd18..5088354 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_conclude/00302.png and b/tests/snapshots/stax/test_sign_tx_order_conclude/00302.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_fill/00000.png b/tests/snapshots/stax/test_sign_tx_order_fill/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_fill/00000.png and b/tests/snapshots/stax/test_sign_tx_order_fill/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_fill/00200.png b/tests/snapshots/stax/test_sign_tx_order_fill/00200.png index c1443b8..7920f44 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_fill/00200.png and b/tests/snapshots/stax/test_sign_tx_order_fill/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_fill/00201.png b/tests/snapshots/stax/test_sign_tx_order_fill/00201.png index c1443b8..7920f44 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_fill/00201.png and b/tests/snapshots/stax/test_sign_tx_order_fill/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_fill/00300.png b/tests/snapshots/stax/test_sign_tx_order_fill/00300.png index b74dcaa..19f00bc 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_fill/00300.png and b/tests/snapshots/stax/test_sign_tx_order_fill/00300.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_fill/00301.png b/tests/snapshots/stax/test_sign_tx_order_fill/00301.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_fill/00301.png and b/tests/snapshots/stax/test_sign_tx_order_fill/00301.png differ diff --git a/tests/snapshots/stax/test_sign_tx_order_fill/00302.png b/tests/snapshots/stax/test_sign_tx_order_fill/00302.png index 6abc393..9da35a5 100644 Binary files a/tests/snapshots/stax/test_sign_tx_order_fill/00302.png and b/tests/snapshots/stax/test_sign_tx_order_fill/00302.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00000.png b/tests/snapshots/stax/test_sign_tx_transfer/00000.png deleted file mode 100644 index a46449f..0000000 Binary files a/tests/snapshots/stax/test_sign_tx_transfer/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00100.png b/tests/snapshots/stax/test_sign_tx_transfer/00100.png deleted file mode 100644 index 3dfb266..0000000 Binary files a/tests/snapshots/stax/test_sign_tx_transfer/00100.png and /dev/null differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00101.png b/tests/snapshots/stax/test_sign_tx_transfer/00101.png deleted file mode 100644 index 7f25a0d..0000000 Binary files a/tests/snapshots/stax/test_sign_tx_transfer/00101.png and /dev/null differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00102.png b/tests/snapshots/stax/test_sign_tx_transfer/00102.png deleted file mode 100644 index fad9bf9..0000000 Binary files a/tests/snapshots/stax/test_sign_tx_transfer/00102.png and /dev/null differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_invalid_change_path/00000.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_invalid_change_path/00000.png new file mode 100644 index 0000000..fd2961f Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_invalid_change_path/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_mismatched_destination/00000.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_mismatched_destination/00000.png new file mode 100644 index 0000000..fd2961f Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_mismatched_destination/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00000.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00000.png new file mode 100644 index 0000000..fd2961f Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00100.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00100.png new file mode 100644 index 0000000..ca48b3d Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00100.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00101.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00101.png new file mode 100644 index 0000000..ca48b3d Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00200.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00200.png new file mode 100644 index 0000000..5b2b134 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00201.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00201.png new file mode 100644 index 0000000..f363e2c Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00202.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00202.png new file mode 100644 index 0000000..f62ed82 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00200.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00300.png similarity index 100% rename from tests/snapshots/stax/test_sign_tx_transfer/00200.png rename to tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key/00300.png diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00000.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00000.png new file mode 100644 index 0000000..fd2961f Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00100.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00100.png new file mode 100644 index 0000000..ca48b3d Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00100.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00101.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00101.png new file mode 100644 index 0000000..ca48b3d Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00200.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00200.png new file mode 100644 index 0000000..0e71bad Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00201.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00201.png new file mode 100644 index 0000000..f363e2c Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00202.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00202.png new file mode 100644 index 0000000..f62ed82 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00300.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00300.png new file mode 100644 index 0000000..ceda6a8 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_public_key_hash/00300.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_receive_path/00000.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_receive_path/00000.png new file mode 100644 index 0000000..fd2961f Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_receive_path/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00000.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00000.png new file mode 100644 index 0000000..fd2961f Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00100.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00100.png new file mode 100644 index 0000000..ca48b3d Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00100.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00101.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00101.png new file mode 100644 index 0000000..ca48b3d Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00200.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00200.png new file mode 100644 index 0000000..ebc32a6 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00201.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00201.png new file mode 100644 index 0000000..f363e2c Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00202.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00202.png new file mode 100644 index 0000000..f62ed82 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00300.png b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00300.png new file mode 100644 index 0000000..ceda6a8 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_change_output_without_change_path/00300.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_no_change/00000.png b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00000.png new file mode 100644 index 0000000..fd2961f Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_no_change/00100.png b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00100.png new file mode 100644 index 0000000..f52c97b Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00100.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_no_change/00101.png b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00101.png new file mode 100644 index 0000000..f363e2c Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_no_change/00102.png b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00102.png new file mode 100644 index 0000000..f62ed82 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_transfer_no_change/00200.png b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00200.png new file mode 100644 index 0000000..ceda6a8 Binary files /dev/null and b/tests/snapshots/stax/test_sign_tx_transfer_no_change/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00000.png b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00000.png and b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00200.png b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00200.png index 14a4dca..f069257 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00200.png and b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00201.png b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00201.png index 33b0672..8d1966f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00201.png and b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00202.png b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00202.png index a94fb9e..f4efb44 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00202.png and b/tests/snapshots/stax/test_sign_tx_unfreeze_tokens/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00000.png b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00000.png and b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00200.png b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00200.png index 14a4dca..f069257 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00200.png and b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00200.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00201.png b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00201.png index 595823c..4bbb1f3 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00201.png and b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00201.png differ diff --git a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00202.png b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00202.png index b6ae52c..02f7af3 100644 Binary files a/tests/snapshots/stax/test_sign_tx_unmint_tokens/00202.png and b/tests/snapshots/stax/test_sign_tx_unmint_tokens/00202.png differ diff --git a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00000.png b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00000.png and b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00100.png b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00100.png index 93dbdfd..a3ead91 100644 Binary files a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00100.png and b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00100.png differ diff --git a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00101.png b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00101.png index 38c3471..588d267 100644 Binary files a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00101.png and b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00102.png b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00102.png index fad9bf9..f62ed82 100644 Binary files a/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00102.png and b/tests/snapshots/stax/test_sign_tx_with_large_input_and_commitment/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_with_large_output/00000.png b/tests/snapshots/stax/test_sign_tx_with_large_output/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_with_large_output/00000.png and b/tests/snapshots/stax/test_sign_tx_with_large_output/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_with_large_output/00101.png b/tests/snapshots/stax/test_sign_tx_with_large_output/00101.png index 82af017..3714407 100644 Binary files a/tests/snapshots/stax/test_sign_tx_with_large_output/00101.png and b/tests/snapshots/stax/test_sign_tx_with_large_output/00101.png differ diff --git a/tests/snapshots/stax/test_sign_tx_with_large_output/00102.png b/tests/snapshots/stax/test_sign_tx_with_large_output/00102.png index 63885c4..0ca6044 100644 Binary files a/tests/snapshots/stax/test_sign_tx_with_large_output/00102.png and b/tests/snapshots/stax/test_sign_tx_with_large_output/00102.png differ diff --git a/tests/snapshots/stax/test_sign_tx_without_outputs/00000.png b/tests/snapshots/stax/test_sign_tx_without_outputs/00000.png index a46449f..fd2961f 100644 Binary files a/tests/snapshots/stax/test_sign_tx_without_outputs/00000.png and b/tests/snapshots/stax/test_sign_tx_without_outputs/00000.png differ diff --git a/tests/snapshots/stax/test_sign_tx_without_outputs/00200.png b/tests/snapshots/stax/test_sign_tx_without_outputs/00200.png index c40ddea..546a3aa 100644 Binary files a/tests/snapshots/stax/test_sign_tx_without_outputs/00200.png and b/tests/snapshots/stax/test_sign_tx_without_outputs/00200.png differ diff --git a/tests/test_error_cmd.py b/tests/test_error_cmd.py index 88c6b2b..81815ee 100644 --- a/tests/test_error_cmd.py +++ b/tests/test_error_cmd.py @@ -87,7 +87,7 @@ def test_sign_tx_invalid_coin(backend, scenario_navigator, device, navigator): num_outputs = 1 start_req = sign_tx_start_req_obj.encode( { - "coin": invalid_coin, + "coin_type": invalid_coin, "version": 0, "num_inputs": num_inputs, "num_outputs": num_outputs, @@ -115,7 +115,7 @@ def test_sign_tx_invalid_context(backend, scenario_navigator, device, navigator) num_outputs = 2 start_req = sign_tx_start_req_obj.encode( { - "coin": MAINNET, + "coin_type": MAINNET, "version": 0, "num_inputs": num_inputs, "num_outputs": num_outputs, @@ -154,7 +154,8 @@ def test_sign_tx_invalid_context(backend, scenario_navigator, device, navigator) } }, ], - } + }, + "change_path": None, } } ).data, @@ -167,7 +168,7 @@ def test_sign_tx_invalid_input(backend, scenario_navigator, device, navigator): num_outputs = 2 start_req = sign_tx_start_req_obj.encode( { - "coin": MAINNET, + "coin_type": MAINNET, "version": 0, "num_inputs": num_inputs, "num_outputs": num_outputs, @@ -202,7 +203,7 @@ def test_sign_tx_too_large_data(backend, scenario_navigator, device, navigator): num_outputs = 2 start_req = sign_tx_start_req_obj.encode( { - "coin": MAINNET, + "coin_type": MAINNET, "version": 0, "num_inputs": num_inputs, "num_outputs": num_outputs, diff --git a/tests/test_pubkey_cmd.py b/tests/test_pubkey_cmd.py index 8f3ef23..c3a5b79 100644 --- a/tests/test_pubkey_cmd.py +++ b/tests/test_pubkey_cmd.py @@ -7,6 +7,7 @@ from application_client.mintlayer_response_unpacker import ( unpack_get_public_key_response, ) +from application_client.mintlayer_utils import parse_derivation_path MNEMONIC = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" @@ -15,13 +16,12 @@ def test_get_public_key_no_confirm(backend): for path in [ "m/44'/19788'/0'/0/0", - "m/44'/19788'/0/0/0", "m/44'/19788'/911'/0/0", - "m/44'/19788'/255/255/255", - "m/44'/19788'/2147483647/0/0/0/0/0/0/0", + "m/44'/19788'/255'/255/255", + "m/44'/19788'/2147483647'/0/0/0/0/0/0/0", ]: client = MintlayerCommandSender(backend) - response = client.get_public_key(coin=MAINNET, path=path).data + response = client.get_public_key(MAINNET, parse_derivation_path(path)).data _, public_key, _, _ = unpack_get_public_key_response(response) ref_public_key, _ = calculate_public_key_and_chaincode( @@ -33,13 +33,12 @@ def test_get_public_key_no_confirm(backend): def test_get_public_key_no_confirm_testnet(backend): for path in [ "m/44'/1'/0'/0/0", - "m/44'/1'/0/0/0", "m/44'/1'/911'/0/0", - "m/44'/1'/255/255/255", - "m/44'/1'/2147483647/0/0/0/0/0/0/0", + "m/44'/1'/255'/255/255", + "m/44'/1'/2147483647'/0/0/0/0/0/0/0", ]: client = MintlayerCommandSender(backend) - response = client.get_public_key(coin=TESTNET, path=path).data + response = client.get_public_key(TESTNET, parse_derivation_path(path)).data _, public_key, _, _ = unpack_get_public_key_response(response) ref_public_key, _ = calculate_public_key_and_chaincode( @@ -48,12 +47,25 @@ def test_get_public_key_no_confirm_testnet(backend): assert public_key.hex() == ref_public_key +def test_get_public_key_non_hardened_account_index(backend): + client = MintlayerCommandSender(backend) + path = "m/44'/19788'/0/0/0" + + with pytest.raises(ExceptionRAPDU) as e: + client.get_public_key(MAINNET, parse_derivation_path(path)) + + assert e.value.status == Errors.SW_INVALID_PATH + assert len(e.value.data) == 0 + + # In this test we check that the GET_PUBLIC_KEY works in confirmation mode def test_get_public_key_confirm_accepted(backend, scenario_navigator): client = MintlayerCommandSender(backend) path = "m/44'/19788'/0'/0/0" - with client.get_public_key_with_confirmation(coin=MAINNET, path=path): + with client.get_public_key_with_confirmation( + MAINNET, parse_derivation_path(path) + ): scenario_navigator.address_review_approve() response = client.get_async_response().data @@ -71,7 +83,9 @@ def test_get_public_key_confirm_refused(backend, scenario_navigator): path = "m/44'/19788'/0'/0/0" with pytest.raises(ExceptionRAPDU) as e: - with client.get_public_key_with_confirmation(coin=MAINNET, path=path): + with client.get_public_key_with_confirmation( + MAINNET, parse_derivation_path(path) + ): scenario_navigator.address_review_reject() # Assert that we have received a refusal diff --git a/tests/test_sign_message.py b/tests/test_sign_message.py index b7b7dd0..abc4a23 100644 --- a/tests/test_sign_message.py +++ b/tests/test_sign_message.py @@ -8,6 +8,7 @@ unpack_get_public_key_response, ) from application_client.mintlayer_utils import ( + parse_derivation_path, verify_message_signature, ) @@ -16,12 +17,17 @@ def test_sign_message(backend, scenario_navigator): path = "m/44'/19788'/0'/0/0" message = b"Hello" - coin = MAINNET + coin_type = MAINNET client = MintlayerCommandSender(backend) - pubkey = get_pub_key(client, coin=coin, path=path) + pubkey = get_pub_key(client, coin_type=coin_type, path=path) - with client.sign_message(coin=coin, addr_type=0, path=path, message=message): + with client.sign_message( + coin_type=coin_type, + addr_type=0, + path=parse_derivation_path(path), + message=message, + ): scenario_navigator.review_approve() sig = unpack_sign_message_response(client.get_async_response().data) @@ -34,12 +40,17 @@ def test_sign_message(backend, scenario_navigator): def test_sign_large_message(backend, scenario_navigator): path = "m/44'/19788'/0'/0/0" message = b"Hello" * 100 - coin = MAINNET + coin_type = MAINNET client = MintlayerCommandSender(backend) - pubkey = get_pub_key(client, coin=coin, path=path) + pubkey = get_pub_key(client, coin_type=coin_type, path=path) - with client.sign_message(coin=coin, addr_type=0, path=path, message=message): + with client.sign_message( + coin_type=coin_type, + addr_type=0, + path=parse_derivation_path(path), + message=message, + ): scenario_navigator.review_approve() sig = unpack_sign_message_response(client.get_async_response().data) @@ -52,12 +63,17 @@ def test_sign_large_message(backend, scenario_navigator): def test_sign_message_pkh(backend, scenario_navigator): path = "m/44'/19788'/0'/0/0" message = b"Hello" - coin = MAINNET + coin_type = MAINNET client = MintlayerCommandSender(backend) - pubkey = get_pub_key(client, coin=coin, path=path) + pubkey = get_pub_key(client, coin_type=coin_type, path=path) - with client.sign_message(coin=coin, addr_type=1, path=path, message=message): + with client.sign_message( + coin_type=coin_type, + addr_type=1, + path=parse_derivation_path(path), + message=message, + ): scenario_navigator.review_approve() sig = unpack_sign_message_response(client.get_async_response().data) @@ -73,10 +89,15 @@ def test_sign_message_refused(backend, scenario_navigator): client = MintlayerCommandSender(backend) path: str = "m/44'/19788'/0'/0/0" message: bytes = b"Hello" - coin = MAINNET + coin_type = MAINNET with pytest.raises(ExceptionRAPDU) as e: - with client.sign_message(coin=coin, addr_type=0, path=path, message=message): + with client.sign_message( + coin_type=coin_type, + addr_type=0, + path=parse_derivation_path(path), + message=message, + ): scenario_navigator.review_reject() # Assert that we have received a refusal @@ -84,7 +105,7 @@ def test_sign_message_refused(backend, scenario_navigator): assert len(e.value.data) == 0 -def get_pub_key(client: MintlayerCommandSender, coin: int, path: str) -> bytes: - rapdu = client.get_public_key(coin, path) +def get_pub_key(client: MintlayerCommandSender, coin_type: int, path: str) -> bytes: + rapdu = client.get_public_key(coin_type, parse_derivation_path(path)) _, pubkey, _, _ = unpack_get_public_key_response(rapdu.data) return pubkey diff --git a/tests/test_sign_tx.py b/tests/test_sign_tx.py index 029ba00..7bfbf4c 100644 --- a/tests/test_sign_tx.py +++ b/tests/test_sign_tx.py @@ -1,13 +1,20 @@ from application_client import MAINNET from application_client.mintlayer_command_sender import ( + Errors, MintlayerCommandSender, + ReviewUntil, + send_output_expect_error, + fetch_public_key_as_pk_destination, + fetch_public_key_as_pkh_destination, sign_tx_review, ReviewTransaction, ) -from application_client.mintlayer_response_unpacker import ( - unpack_get_public_key_response, +from application_client.mintlayer_utils import ( + KeyPurpose, + Transaction, + make_path, + sign_tx_next_req_obj, ) -from application_client.mintlayer_utils import Transaction, sign_tx_next_req_obj # TODO: implement missing tests: # * CreateOrder, DataDeposit, Burn outputs; @@ -17,33 +24,22 @@ # See https://github.com/mintlayer/mintlayer-ledger-app/issues/19. -def test_sign_tx_transfer(backend, scenario_navigator, device, navigator): +# Test a simple transfer without a change output. +def test_sign_tx_transfer_no_change(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - # The path used for this entire test - path: str = "m/44'/19788'/0'/0/0" - # First we need to get the public key of the device in order to build the transaction - rapdu = client.get_public_key(coin=MAINNET, path=path) - _, public_key, _, _ = unpack_get_public_key_response(rapdu.data) - - print("pk", len(public_key)) - - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) additional_info = { "Utxo": { "Transfer": [ {"Coin": 10}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -67,11 +63,15 @@ def test_sign_tx_transfer(backend, scenario_navigator, device, navigator): } }, ], - } + }, + "change_path": None, } # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -82,15 +82,253 @@ def test_sign_tx_transfer(backend, scenario_navigator, device, navigator): sign_tx_review(client, device, navigator, scenario_navigator, review_tx) +# Test a simple transfer with a change output whose change_path is None. +def test_sign_tx_transfer_change_output_without_change_path( + backend, scenario_navigator, device, navigator +): + _sign_tx_transfer_with_change_output( + backend, + scenario_navigator, + device, + navigator, + lambda client, path, amount: _make_transfer_output( + amount, + fetch_public_key_as_pk_destination(client, MAINNET, path), + None, + ), + ) + + +# Test a simple transfer with a change output whose change_path is not None and the destination +# is the PublicKey one. +def test_sign_tx_transfer_change_output_public_key( + backend, scenario_navigator, device, navigator +): + _sign_tx_transfer_with_change_output( + backend, + scenario_navigator, + device, + navigator, + lambda client, path, amount: _make_transfer_output( + amount, + fetch_public_key_as_pk_destination(client, MAINNET, path), + path, + ), + ) + + +# Test a simple transfer with a change output whose change_path is not None and the destination +# is the PublicKeyHash one. +def test_sign_tx_transfer_change_output_public_key_hash( + backend, scenario_navigator, device, navigator +): + _sign_tx_transfer_with_change_output( + backend, + scenario_navigator, + device, + navigator, + lambda client, path, amount: _make_transfer_output( + amount, + fetch_public_key_as_pkh_destination(client, MAINNET, path), + path, + ), + ) + + +def _sign_tx_transfer_with_change_output( + backend, + scenario_navigator, + device, + navigator, + make_change_output, +): + client = MintlayerCommandSender(backend) + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) + + additional_info = { + "Utxo": { + "Transfer": [ + {"Coin": 10}, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), + ], + } + } + inp = { + "addresses": [{"path": bip44_path, "multisig_idx": None}], + "input": { + "Utxo": [ + { + "id": {"Transaction": bytes([0] * 32)}, + "index": 1, + }, + additional_info, + ] + }, + } + inp_commitment = {"commitment": additional_info} + + recipient_output = _make_transfer_output( + 9, + { + "PublicKey": { + "key": { + "Secp256k1Schnorr": { + "pubkey_data": bytes([0] * 33), + } + } + } + }, + None, + ) + change_output = make_change_output(client, bip44_change_path, 1) + + transaction = Transaction( + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[recipient_output, change_output], + ) + + review_tx = ReviewTransaction( + transaction=transaction, + has_command_input=False, + review_custom_screen_text=r"Sign\stransfer", + ) + sign_tx_review(client, device, navigator, scenario_navigator, review_tx) + + +# Test a simple transfer with a change output whose change_path is not None and is invalid (has +# an extra element). +def test_sign_tx_transfer_change_output_invalid_change_path( + backend, scenario_navigator, device, navigator +): + client = MintlayerCommandSender(backend) + change_path = make_path(0, KeyPurpose.Change, 0) + + _assert_sign_tx_transfer_change_path_fails( + client, + scenario_navigator, + device, + navigator, + lambda amount: _make_transfer_output( + amount, + fetch_public_key_as_pk_destination(client, MAINNET, change_path), + change_path + [0], + ), + Errors.SW_INVALID_PATH, + ) + + +# Test a simple transfer with a change output whose change_path is not None, is valid, but +# doesn't match the actual destination. +def test_sign_tx_transfer_change_output_mismatched_destination( + backend, scenario_navigator, device, navigator +): + client = MintlayerCommandSender(backend) + destination_path = make_path(0, KeyPurpose.Change, 0) + change_path = make_path(0, KeyPurpose.Change, 1) + + _assert_sign_tx_transfer_change_path_fails( + client, + scenario_navigator, + device, + navigator, + lambda amount: _make_transfer_output( + amount, + fetch_public_key_as_pk_destination(client, MAINNET, destination_path), + change_path, + ), + Errors.SW_MISMATCHED_CHANGE_OUTPUT_DESTINATION, + ) + + +# Test a simple transfer with a change output whose change_path is not None, is invalid, matches +# the actual destination, but is a "receive" path, not a "change" one. +def test_sign_tx_transfer_change_output_receive_path( + backend, scenario_navigator, device, navigator +): + client = MintlayerCommandSender(backend) + receive_path = make_path(0, KeyPurpose.Receive, 1) + + _assert_sign_tx_transfer_change_path_fails( + client, + scenario_navigator, + device, + navigator, + lambda amount: _make_transfer_output( + amount, + fetch_public_key_as_pk_destination(client, MAINNET, receive_path), + receive_path, + ), + Errors.SW_INVALID_PATH, + ) + + +def _assert_sign_tx_transfer_change_path_fails( + client, + scenario_navigator, + device, + navigator, + make_change_output, + expected_status, +): + bip44_path = make_path(0, KeyPurpose.Receive, 0) + + additional_info = { + "Utxo": { + "Transfer": [ + {"Coin": 10}, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), + ], + } + } + inp = { + "addresses": [{"path": bip44_path, "multisig_idx": None}], + "input": { + "Utxo": [ + { + "id": {"Transaction": bytes([0] * 32)}, + "index": 1, + }, + additional_info, + ] + }, + } + inp_commitment = {"commitment": additional_info} + output = make_change_output(1) + + transaction = Transaction( + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], + ) + + review_tx = ReviewTransaction( + transaction=transaction, + has_command_input=False, + review_custom_screen_text=r"Sign\stransfer", + ) + sign_tx_review( + client, + device, + navigator, + scenario_navigator, + review_tx, + ReviewUntil.Outputs, + ) + send_output_expect_error(client, transaction.outputs[0], expected_status) + + def test_sign_tx_lock_then_transfer(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - # The path used for this entire test - path: str = "m/44'/19788'/0'/0/0" - h = 1 << 31 inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [ + {"path": make_path(0, KeyPurpose.Receive, 0), "multisig_idx": None} + ], "input": { "Account": { "nonce": 1, @@ -112,12 +350,16 @@ def test_sign_tx_lock_then_transfer(backend, scenario_navigator, device, navigat }, {"UntilHeight": 10}, ], - } + }, + "change_path": None, } # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -131,22 +373,18 @@ def test_sign_tx_lock_then_transfer(backend, scenario_navigator, device, navigat def test_sign_tx_create_delegation(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) additional_info = { "Utxo": { "Transfer": [ {"Coin": 10}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -170,12 +408,16 @@ def test_sign_tx_create_delegation(backend, scenario_navigator, device, navigato }, [0] * 32, ], - } + }, + "change_path": None, } # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -189,22 +431,18 @@ def test_sign_tx_create_delegation(backend, scenario_navigator, device, navigato def test_sign_tx_delegate_staking(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) additional_info = { "Utxo": { "Transfer": [ {"Coin": 10}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -221,12 +459,16 @@ def test_sign_tx_delegate_staking(backend, scenario_navigator, device, navigator output = { "output": { "DelegateStaking": [5, [0] * 32], - } + }, + "change_path": None, } # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -240,22 +482,18 @@ def test_sign_tx_delegate_staking(backend, scenario_navigator, device, navigator def test_sign_tx_create_stake_pool(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) additional_info = { "Utxo": { "Transfer": [ {"Coin": 40001}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -294,11 +532,15 @@ def test_sign_tx_create_stake_pool(backend, scenario_navigator, device, navigato "cost_per_block": 5, }, ], - } + }, + "change_path": None, } # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -312,21 +554,17 @@ def test_sign_tx_create_stake_pool(backend, scenario_navigator, device, navigato def test_sign_tx_issue_fungible_token(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) additional_info = { "Utxo": { "Transfer": [ {"Coin": 10}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -358,12 +596,16 @@ def test_sign_tx_issue_fungible_token(backend, scenario_navigator, device, navig "is_freezable": {"Yes": None}, } }, - } + }, + "change_path": None, } # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -377,21 +619,17 @@ def test_sign_tx_issue_fungible_token(backend, scenario_navigator, device, navig def test_sign_tx_issue_nft(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) additional_info = { "Utxo": { "Transfer": [ {"Coin": 2000}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -439,12 +677,16 @@ def test_sign_tx_issue_nft(backend, scenario_navigator, device, navigator): } }, ], - } + }, + "change_path": None, } # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -463,8 +705,7 @@ def test_sign_tx_mint_tokens(backend, scenario_navigator, device, navigator): And one output to transfer the newly minted tokens. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) # The utxo (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -472,11 +713,7 @@ def test_sign_tx_mint_tokens(backend, scenario_navigator, device, navigator): "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -524,11 +761,12 @@ def test_sign_tx_mint_tokens(backend, scenario_navigator, device, navigator): } }, ], - } + }, + "change_path": None, } transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, acc_inp_commitment], outputs=[mint_output], @@ -551,8 +789,8 @@ def test_sign_tx_unmint_tokens(backend, scenario_navigator, device, navigator): And one output to transfer the newly minted tokens. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional data (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -560,11 +798,7 @@ def test_sign_tx_unmint_tokens(backend, scenario_navigator, device, navigator): "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -572,11 +806,7 @@ def test_sign_tx_unmint_tokens(backend, scenario_navigator, device, navigator): "Utxo": { "Transfer": [ {"TokenV1": [bytes([0] * 32), 1000]}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -626,21 +856,14 @@ def test_sign_tx_unmint_tokens(backend, scenario_navigator, device, navigator): acc_inp_commitment = {"commitment": {"None": None}} - change_output = { - "output": { - "Transfer": [ - {"Coin": 99}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 99, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input, utxo_input2], input_commitments=[inp_commitment, acc_inp_commitment, inp_commitment2], outputs=[change_output], @@ -662,8 +885,8 @@ def test_sign_tx_freeze_tokens(backend, scenario_navigator, device, navigator): And one output to transfer the change coins. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional info (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -671,11 +894,7 @@ def test_sign_tx_freeze_tokens(backend, scenario_navigator, device, navigator): "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -709,21 +928,14 @@ def test_sign_tx_freeze_tokens(backend, scenario_navigator, device, navigator): acc_inp_commitment = {"commitment": {"None": None}} - change_output = { - "output": { - "Transfer": [ - {"Coin": 99}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 99, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, acc_inp_commitment], outputs=[change_output], @@ -745,8 +957,8 @@ def test_sign_tx_unfreeze_tokens(backend, scenario_navigator, device, navigator) And one output to transfer the change coins. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional data (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -754,11 +966,7 @@ def test_sign_tx_unfreeze_tokens(backend, scenario_navigator, device, navigator) "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -793,21 +1001,14 @@ def test_sign_tx_unfreeze_tokens(backend, scenario_navigator, device, navigator) acc_inp_commitment = {"commitment": {"None": None}} - change_output = { - "output": { - "Transfer": [ - {"Coin": 99}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 99, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, acc_inp_commitment], outputs=[change_output], @@ -829,8 +1030,8 @@ def test_sign_tx_change_token_authority(backend, scenario_navigator, device, nav And one output to transfer the change coins. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional data (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -838,11 +1039,7 @@ def test_sign_tx_change_token_authority(backend, scenario_navigator, device, nav "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -886,21 +1083,14 @@ def test_sign_tx_change_token_authority(backend, scenario_navigator, device, nav acc_inp_commitment = {"commitment": {"None": None}} - change_output = { - "output": { - "Transfer": [ - {"Coin": 99}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 99, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, acc_inp_commitment], outputs=[change_output], @@ -924,8 +1114,8 @@ def test_sign_tx_change_token_metadata_uri( And one output to transfer the change coins. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional info (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -933,11 +1123,7 @@ def test_sign_tx_change_token_metadata_uri( "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -975,21 +1161,14 @@ def test_sign_tx_change_token_metadata_uri( acc_inp_commitment = {"commitment": {"None": None}} - change_output = { - "output": { - "Transfer": [ - {"Coin": 99}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 99, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, acc_inp_commitment], outputs=[change_output], @@ -1012,8 +1191,8 @@ def test_sign_tx_order_fill(backend, scenario_navigator, device, navigator): And one output to transfer the change coins. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional info (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -1021,11 +1200,7 @@ def test_sign_tx_order_fill(backend, scenario_navigator, device, navigator): "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -1079,18 +1254,11 @@ def test_sign_tx_order_fill(backend, scenario_navigator, device, navigator): }, } - change_output = { - "output": { - "Transfer": [ - {"Coin": 100 - 1 - fill_amount}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 100 - 1 - fill_amount, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) fill_output = { "output": { @@ -1107,11 +1275,12 @@ def test_sign_tx_order_fill(backend, scenario_navigator, device, navigator): } }, ], - } + }, + "change_path": None, } transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, fill_order_inp_commitment], outputs=[change_output, fill_output], @@ -1133,8 +1302,8 @@ def test_sign_tx_order_conclude(backend, scenario_navigator, device, navigator): And one output to transfer the change coins + ask balance and another output for the give balance. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional_data (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -1142,11 +1311,7 @@ def test_sign_tx_order_conclude(backend, scenario_navigator, device, navigator): "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -1201,18 +1366,11 @@ def test_sign_tx_order_conclude(backend, scenario_navigator, device, navigator): }, } - change_output = { - "output": { - "Transfer": [ - {"Coin": 100 - 1 + ask_balance}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 100 - 1 + ask_balance, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) conclude_output = { "output": { @@ -1224,11 +1382,12 @@ def test_sign_tx_order_conclude(backend, scenario_navigator, device, navigator): } }, ], - } + }, + "change_path": None, } transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, conclude_order_inp_commitment], outputs=[change_output, conclude_output], @@ -1249,8 +1408,8 @@ def test_sign_tx_htlc(backend, scenario_navigator, device, navigator): And one output to transfer the change coins and the HTLC output. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) + bip44_change_path = make_path(0, KeyPurpose.Change, 0) # The additional info (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -1258,11 +1417,7 @@ def test_sign_tx_htlc(backend, scenario_navigator, device, navigator): "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -1281,18 +1436,11 @@ def test_sign_tx_htlc(backend, scenario_navigator, device, navigator): inp_commitment = {"commitment": additional_info} - change_output = { - "output": { - "Transfer": [ - {"Coin": 89}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, - ], - } - } + change_output = _make_transfer_output( + 89, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_change_path), + bip44_change_path, + ) htlc_output = { "output": { @@ -1317,11 +1465,12 @@ def test_sign_tx_htlc(backend, scenario_navigator, device, navigator): }, }, ], - } + }, + "change_path": None, } transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input], input_commitments=[inp_commitment], outputs=[htlc_output, change_output], @@ -1343,8 +1492,7 @@ def test_sign_tx_without_outputs(backend, scenario_navigator, device, navigator) And no outputs. """ client = MintlayerCommandSender(backend) - h = 1 << 31 - bip44_path = [44 + h, 19788 + h, 0 + h, 0, 0] + bip44_path = make_path(0, KeyPurpose.Receive, 0) # The additional info (the previous TxOutput that this UTXO input spends) # This represents an output of 100 coins owned by our key @@ -1352,11 +1500,7 @@ def test_sign_tx_without_outputs(backend, scenario_navigator, device, navigator) "Utxo": { "Transfer": [ {"Coin": 100}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([2] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } @@ -1391,7 +1535,7 @@ def test_sign_tx_without_outputs(backend, scenario_navigator, device, navigator) acc_inp_commitment = {"commitment": {"None": None}} transaction = Transaction( - coin=MAINNET, + coin_type=MAINNET, inputs=[utxo_input, account_input], input_commitments=[inp_commitment, acc_inp_commitment], outputs=[], @@ -1409,21 +1553,17 @@ def test_sign_tx_without_outputs(backend, scenario_navigator, device, navigator) def test_sign_tx_with_large_output(backend, scenario_navigator, device, navigator): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) additional_info = { "Utxo": { "Transfer": [ {"Coin": 2000}, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -1474,7 +1614,8 @@ def test_sign_tx_with_large_output(backend, scenario_navigator, device, navigato } }, ], - } + }, + "change_path": None, } # Sanity check @@ -1482,7 +1623,10 @@ def test_sign_tx_with_large_output(backend, scenario_navigator, device, navigato # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -1499,7 +1643,7 @@ def test_sign_tx_with_large_input_and_commitment( ): # Use the app interface instead of raw interface client = MintlayerCommandSender(backend) - h = 1 << 31 + bip44_path = make_path(0, KeyPurpose.Receive, 0) # Make the additional info big metadata_uri = b"abcef" * 100 @@ -1533,16 +1677,12 @@ def test_sign_tx_with_large_input_and_commitment( } } }, - { - "PublicKey": { - "key": {"Secp256k1Schnorr": {"pubkey_data": bytes([0] * 33)}} - } - }, + fetch_public_key_as_pk_destination(client, MAINNET, bip44_path), ], } } inp = { - "addresses": [{"path": [44 + h, 19788 + h, 0 + h, 0, 0], "multisig_idx": None}], + "addresses": [{"path": bip44_path, "multisig_idx": None}], "input": { "Utxo": [ { @@ -1566,7 +1706,8 @@ def test_sign_tx_with_large_input_and_commitment( } }, ], - } + }, + "change_path": None, } # Sanity checks @@ -1580,7 +1721,10 @@ def test_sign_tx_with_large_input_and_commitment( # Create the transaction that will be sent to the device for signing transaction = Transaction( - coin=MAINNET, inputs=[inp], input_commitments=[inp_commitment], outputs=[output] + coin_type=MAINNET, + inputs=[inp], + input_commitments=[inp_commitment], + outputs=[output], ) review_tx = ReviewTransaction( @@ -1589,3 +1733,15 @@ def test_sign_tx_with_large_input_and_commitment( review_custom_screen_text=r"Sign\stransfer", ) sign_tx_review(client, device, navigator, scenario_navigator, review_tx) + + +def _make_transfer_output(amount, destination, change_path): + return { + "output": { + "Transfer": [ + {"Coin": amount}, + destination, + ], + }, + "change_path": change_path, + } diff --git a/tools/codecheck.py b/tools/codecheck.py index 847d8ed..e58bdc1 100755 --- a/tools/codecheck.py +++ b/tools/codecheck.py @@ -151,7 +151,11 @@ def check_trailing_whitespaces(): print("==== Checking for trailing whitespaces:") # List of files/dirs excluded from the check - exclude = ["media", "tests/snapshots"] + exclude = [ + "media", + "tests/snapshots", + "tests/snapshots-tmp", + ] ok = True for path in all_files(exclude):