From 5e56a3c8acf762cc04f67d1e2bb223883ea1b6bb Mon Sep 17 00:00:00 2001 From: Islam El-Ashi Date: Tue, 15 Aug 2023 16:43:29 +0200 Subject: [PATCH 01/32] chore: use ic-cdk in bitcoin rust example. Rather than using the ic-btc-interface library, we should be using the ic-cdk wrapper around it as provided in the latest versions. --- rust/basic_bitcoin/Cargo.lock | 644 ++++-------------- .../src/basic_bitcoin/Cargo.toml | 7 +- .../src/basic_bitcoin/src/bitcoin_api.rs | 21 +- .../src/basic_bitcoin/src/bitcoin_wallet.rs | 25 +- .../src/basic_bitcoin/src/ecdsa_api.rs | 3 +- .../src/basic_bitcoin/src/lib.rs | 14 +- 6 files changed, 177 insertions(+), 537 deletions(-) diff --git a/rust/basic_bitcoin/Cargo.lock b/rust/basic_bitcoin/Cargo.lock index 831d5abe6..3e5e68300 100644 --- a/rust/basic_bitcoin/Cargo.lock +++ b/rust/basic_bitcoin/Cargo.lock @@ -2,20 +2,11 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - [[package]] name = "anyhow" -version = "1.0.57" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +checksum = "f768393e7fabd388fe8409b13faa4d93ab0fef35db1508438dfdb066918bcf38" [[package]] name = "arrayvec" @@ -23,26 +14,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -57,7 +28,6 @@ dependencies = [ "bs58", "candid", "hex", - "ic-btc-interface", "ic-cdk", "ic-cdk-macros", "ripemd", @@ -71,12 +41,6 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" -[[package]] -name = "beef" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed554bd50246729a1ec158d08aa3235d1b69d94ad120ebe187e28894787e736" - [[package]] name = "binread" version = "2.2.0" @@ -97,29 +61,14 @@ dependencies = [ "either", "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "bit-set" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" -dependencies = [ - "bit-vec", + "syn 1.0.109", ] -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bitcoin" -version = "0.28.1" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05bba324e6baf655b882df672453dbbc527bc938cadd27750ae510aaccc3a66a" +checksum = "d4d30fb43d287492017964a1fd7d3f82e8cc760818471c6ef2d44111e317d5c3" dependencies = [ "bech32", "bitcoin_hashes", @@ -132,17 +81,11 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "006cc91e1a1d99819bc5b8214be3555c1f0611b169f527a1fdc54ed1f2b745b0" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "block-buffer" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -161,9 +104,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "candid" -version = "0.8.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244005a1917bb7614cd775ca8a5d59efeb5ac74397bb14ba29a19347ebd78591" +checksum = "a31e5ab22cdcd093b93b02bdff4ba18ffee324b05e669b25cdd93fdb8402d207" dependencies = [ "anyhow", "binread", @@ -173,10 +116,7 @@ dependencies = [ "crc32fast", "data-encoding", "hex", - "lalrpop", - "lalrpop-util", "leb128", - "logos", "num-bigint", "num-traits", "num_enum", @@ -185,26 +125,30 @@ dependencies = [ "serde", "serde_bytes", "sha2", + "stacker", "thiserror", ] [[package]] name = "candid_derive" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f1f4db7c7d04b87b70b3a35c5dc5c2c9dd73cef8bdf6760e2f18a0d45350dd" +checksum = "810b3bd60244f282090652ffc7c30a9d23892e72dfe443e46ee55569044f7dd5" dependencies = [ "lazy_static", "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] name = "cc" -version = "1.0.73" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -224,9 +168,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -240,17 +184,11 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", @@ -262,105 +200,43 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" -[[package]] -name = "diff" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" - [[package]] name = "digest" -version = "0.10.3" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "either" -version = "1.6.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] -name = "ena" -version = "0.14.0" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3" -dependencies = [ - "log", -] - -[[package]] -name = "fixedbitset" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] -[[package]] -name = "getrandom" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "hermit-abi" -version = "0.1.19" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" [[package]] name = "hex" @@ -368,21 +244,11 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "ic-btc-interface" -version = "0.1.0" -source = "git+https://github.com/dfinity/bitcoin-canister#a757c1c4c89de43536410649e00361d8c8f8a551" -dependencies = [ - "candid", - "serde", - "serde_bytes", -] - [[package]] name = "ic-cdk" -version = "0.8.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1faa7b42964694fb38d7f62172e0d8261381e39ce85b4d6b519929f7cad9b4fb" +checksum = "08d4c0b932bf454d5d60e61e13c3c944972fcfd74dc82b9ed5c8b0a75979cf50" dependencies = [ "candid", "ic-cdk-macros", @@ -393,75 +259,34 @@ dependencies = [ [[package]] name = "ic-cdk-macros" -version = "0.6.10" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebf50458685a0fc6b0e414cdba487610aeb199ac94db52d9fd76270565debee7" +checksum = "411c0dd4c149132b68e679274d397053332ee29996c6a541075895881916333b" dependencies = [ "candid", "proc-macro2", "quote", "serde", "serde_tokenstream", - "syn", + "syn 1.0.109", ] [[package]] name = "ic0" -version = "0.18.10" +version = "0.18.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187fa0cecf46628330b7a390a1a65fb0637ea00d3a1121aa847ecbebc0f3ff79" +checksum = "576c539151d4769fb4d1a0c25c4108dd18facd04c5695b02cf2d226ab4e43aa5" [[package]] name = "indexmap" -version = "1.7.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" dependencies = [ - "autocfg", + "equivalent", "hashbrown", ] -[[package]] -name = "itertools" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" -dependencies = [ - "either", -] - -[[package]] -name = "lalrpop" -version = "0.19.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30455341b0e18f276fa64540aff54deafb54c589de6aca68659c63dd2d5d823" -dependencies = [ - "ascii-canvas", - "atty", - "bit-set", - "diff", - "ena", - "itertools", - "lalrpop-util", - "petgraph", - "pico-args", - "regex", - "regex-syntax", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "lalrpop-util" -version = "0.19.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf796c978e9b4d983414f4caedc9273aa33ee214c5b887bd55fde84c85d2dc4" -dependencies = [ - "regex", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -476,52 +301,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" - -[[package]] -name = "lock_api" -version = "0.4.7" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "logos" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427e2abca5be13136da9afdbf874e6b34ad9001dd70f2b103b083a85daa7b345" -dependencies = [ - "logos-derive", -] - -[[package]] -name = "logos-derive" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56a7d287fd2ac3f75b11f19a1c8a874a7d55744bd91f7a1b3e7cf87d4343c36d" -dependencies = [ - "beef", - "fnv", - "proc-macro2", - "quote", - "regex-syntax", - "syn", - "utf8-ranges", -] +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "memchr" @@ -529,12 +311,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "new_debug_unreachable" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" - [[package]] name = "num-bigint" version = "0.4.3" @@ -559,195 +335,108 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] [[package]] name = "num_enum" -version = "0.5.7" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.7" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] name = "once_cell" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" - -[[package]] -name = "parking_lot" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.3" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-sys", -] +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "paste" -version = "1.0.7" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" - -[[package]] -name = "petgraph" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b305cc4569dd4e8765bab46261f67ef5d4d11a4b6e745100ee5dad8948b46c" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pico-args" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pretty" -version = "0.10.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9940b913ee56ddd94aec2d3cd179dd47068236f42a1a6415ccf9d880ce2a61" +checksum = "563c9d701c3a31dfffaaf9ce23507ba09cbe0b9125ba176d15e629b0235e9acc" dependencies = [ "arrayvec", "typed-arena", + "unicode-segmentation", ] [[package]] name = "proc-macro-crate" -version = "1.1.3" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "thiserror", - "toml", + "once_cell", + "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.39" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] -name = "quote" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "redox_syscall" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.3" +name = "psm" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" dependencies = [ - "getrandom", - "redox_syscall", - "thiserror", + "cc", ] [[package]] -name = "regex" -version = "1.5.6" +name = "quote" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "proc-macro2", ] -[[package]] -name = "regex-syntax" -version = "0.6.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" - [[package]] name = "ripemd" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1facec54cb5e0dc08553501fa740091086d0259ad0067e0d4103448e4cb22ed3" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ "digest", ] [[package]] name = "rustversion" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" - -[[package]] -name = "scopeguard" -version = "1.1.0" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "secp256k1" @@ -769,49 +458,49 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.137" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.9" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] name = "serde_tokenstream" -version = "0.1.3" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6deb15c3a535e81438110111d90168d91721652f502abb147f31cde129f683d" +checksum = "797ba1d80299b264f3aac68ab5d12e5825a561749db4df7cd7c8083900c5d4e9" dependencies = [ "proc-macro2", "serde", - "syn", + "syn 1.0.109", ] [[package]] name = "sha2" -version = "0.10.2" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -819,35 +508,23 @@ dependencies = [ ] [[package]] -name = "siphasher" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" - -[[package]] -name = "smallvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" - -[[package]] -name = "string_cache" -version = "0.8.4" +name = "stacker" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" dependencies = [ - "new_debug_unreachable", - "once_cell", - "parking_lot", - "phf_shared", - "precomputed-hash", + "cc", + "cfg-if", + "libc", + "psm", + "winapi", ] [[package]] name = "syn" -version = "1.0.95" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -855,98 +532,91 @@ dependencies = [ ] [[package]] -name = "term" -version = "0.7.0" +name = "syn" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ - "dirs-next", - "rustversion", - "winapi", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "dedd246497092a89beedfe2c9f176d44c1b672ea6090edc20544ade01fbb7ea0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "7d7b1fadccbbc7e19ea64708629f9d8dccd007c260d66485f20a6d41bc1cf4b3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.28", ] [[package]] -name = "tiny-keccak" -version = "2.0.2" +name = "toml_datetime" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] -name = "toml" -version = "0.5.9" +name = "toml_edit" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ - "serde", + "indexmap", + "toml_datetime", + "winnow", ] [[package]] name = "typed-arena" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-ident" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" - -[[package]] -name = "unicode-width" -version = "0.1.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] -name = "unicode-xid" -version = "0.2.3" +name = "unicode-segmentation" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] -name = "utf8-ranges" -version = "1.0.5" +name = "unicode-width" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "version_check" @@ -954,12 +624,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - [[package]] name = "winapi" version = "0.3.9" @@ -992,44 +656,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.36.1" +name = "winnow" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "5504cc7644f4b593cbc05c4a55bf9bd4e94b867c3c0bd440934174d50482427d" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "memchr", ] - -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" - -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" - -[[package]] -name = "windows_i686_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" diff --git a/rust/basic_bitcoin/src/basic_bitcoin/Cargo.toml b/rust/basic_bitcoin/src/basic_bitcoin/Cargo.toml index e98d5778b..6668e515c 100644 --- a/rust/basic_bitcoin/src/basic_bitcoin/Cargo.toml +++ b/rust/basic_bitcoin/src/basic_bitcoin/Cargo.toml @@ -12,10 +12,9 @@ crate-type = ["cdylib"] hex = "0.4.3" bitcoin = "0.28.1" bs58 = "0.4.0" -candid = "0.8.1" -ic-btc-interface = { git = "https://github.com/dfinity/bitcoin-canister" } -ic-cdk = "0.8.1" -ic-cdk-macros = "0.6.10" +candid = "0.9.3" +ic-cdk = "0.10.0" +ic-cdk-macros = "0.7.1" ripemd = "0.1.1" serde = "1.0.132" sha2 = "0.10.2" diff --git a/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_api.rs b/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_api.rs index 0645d19dc..fb9f99013 100644 --- a/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_api.rs +++ b/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_api.rs @@ -1,8 +1,9 @@ -use ic_btc_interface::{ - GetBalanceRequest, GetCurrentFeePercentilesRequest, GetUtxosRequest, GetUtxosResponse, - MillisatoshiPerByte, Network, Satoshi, SendTransactionRequest, +use candid::Principal; +use ic_cdk::api::call::call_with_payment; +use ic_cdk::api::management_canister::bitcoin::{ + BitcoinNetwork, GetBalanceRequest, GetCurrentFeePercentilesRequest, GetUtxosRequest, + GetUtxosResponse, MillisatoshiPerByte, Satoshi, SendTransactionRequest, }; -use ic_cdk::{api::call::call_with_payment, export::Principal}; // The fees for the various bitcoin endpoints. const GET_BALANCE_COST_CYCLES: u64 = 100_000_000; @@ -15,7 +16,7 @@ const SEND_TRANSACTION_PER_BYTE_CYCLES: u64 = 20_000_000; /// /// Relies on the `bitcoin_get_balance` endpoint. /// See https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-bitcoin_get_balance -pub async fn get_balance(network: Network, address: String) -> u64 { +pub async fn get_balance(network: BitcoinNetwork, address: String) -> u64 { let balance_res: Result<(Satoshi,), _> = call_with_payment( Principal::management_canister(), "bitcoin_get_balance", @@ -37,7 +38,7 @@ pub async fn get_balance(network: Network, address: String) -> u64 { /// of UTXOs, then subsequent calls to `bitcoin_get_utxos` are required. /// /// See https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-bitcoin_get_utxos -pub async fn get_utxos(network: Network, address: String) -> GetUtxosResponse { +pub async fn get_utxos(network: BitcoinNetwork, address: String) -> GetUtxosResponse { let utxos_res: Result<(GetUtxosResponse,), _> = call_with_payment( Principal::management_canister(), "bitcoin_get_utxos", @@ -58,11 +59,13 @@ pub async fn get_utxos(network: Network, address: String) -> GetUtxosResponse { /// /// Relies on the `bitcoin_get_current_fee_percentiles` endpoint. /// See https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-bitcoin_get_current_fee_percentiles -pub async fn get_current_fee_percentiles(network: Network) -> Vec { +pub async fn get_current_fee_percentiles(network: BitcoinNetwork) -> Vec { let res: Result<(Vec,), _> = call_with_payment( Principal::management_canister(), "bitcoin_get_current_fee_percentiles", - (GetCurrentFeePercentilesRequest { network: network.into() },), + (GetCurrentFeePercentilesRequest { + network: network.into(), + },), GET_CURRENT_FEE_PERCENTILES_CYCLES, ) .await; @@ -74,7 +77,7 @@ pub async fn get_current_fee_percentiles(network: Network) -> Vec) { +pub async fn send_transaction(network: BitcoinNetwork, transaction: Vec) { let transaction_fee = SEND_TRANSACTION_BASE_CYCLES + (transaction.len() as u64) * SEND_TRANSACTION_PER_BYTE_CYCLES; diff --git a/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_wallet.rs b/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_wallet.rs index 096838762..6859a33e0 100644 --- a/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_wallet.rs +++ b/rust/basic_bitcoin/src/basic_bitcoin/src/bitcoin_wallet.rs @@ -10,10 +10,11 @@ use crate::{bitcoin_api, ecdsa_api}; use bitcoin::util::psbt::serialize::Serialize; use bitcoin::{ - blockdata::{script::Builder, witness::Witness}, hashes::Hash, Address, AddressType, OutPoint, Script, EcdsaSighashType, - Transaction, TxIn, TxOut, Txid, + blockdata::{script::Builder, witness::Witness}, + hashes::Hash, + Address, AddressType, EcdsaSighashType, OutPoint, Script, Transaction, TxIn, TxOut, Txid, }; -use ic_btc_interface::{MillisatoshiPerByte, Network, Satoshi, Utxo}; +use ic_cdk::api::management_canister::bitcoin::{MillisatoshiPerByte, BitcoinNetwork, Satoshi, Utxo}; use ic_cdk::print; use sha2::Digest; use std::str::FromStr; @@ -22,7 +23,7 @@ const SIG_HASH_TYPE: EcdsaSighashType = EcdsaSighashType::All; /// Returns the P2PKH address of this canister at the given derivation path. pub async fn get_p2pkh_address( - network: Network, + network: BitcoinNetwork, key_name: String, derivation_path: Vec>, ) -> String { @@ -37,7 +38,7 @@ pub async fn get_p2pkh_address( /// given destination, where the source of the funds is the canister itself /// at the given derivation path. pub async fn send( - network: Network, + network: BitcoinNetwork, derivation_path: Vec>, key_name: String, dst_address: String, @@ -139,7 +140,7 @@ async fn build_transaction( own_address, transaction.clone(), String::from(""), // mock key name - vec![], // mock derivation path + vec![], // mock derivation path mock_signer, ) .await; @@ -277,15 +278,15 @@ fn sha256(data: &[u8]) -> Vec { } // Converts a public key to a P2PKH address. -fn public_key_to_p2pkh_address(network: Network, public_key: &[u8]) -> String { +fn public_key_to_p2pkh_address(network: BitcoinNetwork, public_key: &[u8]) -> String { // sha256 + ripmd160 let mut hasher = ripemd::Ripemd160::new(); hasher.update(sha256(public_key)); let result = hasher.finalize(); let prefix = match network { - Network::Testnet | Network::Regtest => 0x6f, - Network::Mainnet => 0x00, + BitcoinNetwork::Testnet | BitcoinNetwork::Regtest => 0x6f, + BitcoinNetwork::Mainnet => 0x00, }; let mut data_with_prefix = vec![prefix]; data_with_prefix.extend(result); @@ -299,7 +300,11 @@ fn public_key_to_p2pkh_address(network: Network, public_key: &[u8]) -> String { } // A mock for rubber-stamping ECDSA signatures. -async fn mock_signer(_key_name: String, _derivation_path: Vec>, _message_hash: Vec) -> Vec { +async fn mock_signer( + _key_name: String, + _derivation_path: Vec>, + _message_hash: Vec, +) -> Vec { vec![255; 64] } diff --git a/rust/basic_bitcoin/src/basic_bitcoin/src/ecdsa_api.rs b/rust/basic_bitcoin/src/basic_bitcoin/src/ecdsa_api.rs index 47958b992..ab720bc8f 100644 --- a/rust/basic_bitcoin/src/basic_bitcoin/src/ecdsa_api.rs +++ b/rust/basic_bitcoin/src/basic_bitcoin/src/ecdsa_api.rs @@ -1,5 +1,6 @@ use crate::types::*; -use ic_cdk::{api::call::call_with_payment, call, export::Principal}; +use candid::Principal; +use ic_cdk::{api::call::call_with_payment, call}; /// Returns the ECDSA public key of this canister at the given derivation path. pub async fn ecdsa_public_key(key_name: String, derivation_path: Vec>) -> Vec { diff --git a/rust/basic_bitcoin/src/basic_bitcoin/src/lib.rs b/rust/basic_bitcoin/src/basic_bitcoin/src/lib.rs index de160381a..bd6284fbe 100644 --- a/rust/basic_bitcoin/src/basic_bitcoin/src/lib.rs +++ b/rust/basic_bitcoin/src/basic_bitcoin/src/lib.rs @@ -3,7 +3,9 @@ mod bitcoin_wallet; mod ecdsa_api; mod types; -use ic_btc_interface::{GetUtxosResponse, MillisatoshiPerByte, Network}; +use ic_cdk::api::management_canister::bitcoin::{ + BitcoinNetwork, GetUtxosResponse, MillisatoshiPerByte, +}; use ic_cdk_macros::{init, post_upgrade, pre_upgrade, update}; use std::cell::{Cell, RefCell}; @@ -13,7 +15,7 @@ thread_local! { // When developing locally this should be `Regtest`. // When deploying to the IC this should be `Testnet`. // `Mainnet` is currently unsupported. - static NETWORK: Cell = Cell::new(Network::Testnet); + static NETWORK: Cell = Cell::new(BitcoinNetwork::Testnet); // The derivation path to use for ECDSA secp256k1. static DERIVATION_PATH: Vec> = vec![]; @@ -23,15 +25,15 @@ thread_local! { } #[init] -pub fn init(network: Network) { +pub fn init(network: BitcoinNetwork) { NETWORK.with(|n| n.set(network)); KEY_NAME.with(|key_name| { key_name.replace(String::from(match network { // For local development, we use a special test key with dfx. - Network::Regtest => "dfx_test_key", + BitcoinNetwork::Regtest => "dfx_test_key", // On the IC we're using a test ECDSA key. - Network::Mainnet | Network::Testnet => "test_key_1", + BitcoinNetwork::Mainnet | BitcoinNetwork::Testnet => "test_key_1", })) }); } @@ -94,7 +96,7 @@ fn pre_upgrade() { #[post_upgrade] fn post_upgrade() { - let network = ic_cdk::storage::stable_restore::<(Network,)>() + let network = ic_cdk::storage::stable_restore::<(BitcoinNetwork,)>() .expect("Failed to read network from stable memory.") .0; From e30fe1dd6c03ccc2484a22f3ff246470824a16a9 Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Thu, 7 Sep 2023 21:51:45 +0800 Subject: [PATCH 02/32] Rename the project folders. --- .../README.md | 0 .../ii_integration_dapp}/.gitignore | 0 .../ii_integration_dapp}/Makefile | 0 .../ii_integration_dapp}/README.md | 0 .../ii_integration_dapp}/dfx.json | 0 .../ii_integration_dapp}/package-lock.json | 0 .../ii_integration_dapp}/package.json | 0 .../ii_integration_dapp}/src/greet_backend/main.mo | 0 .../src/greet_frontend/assets/favicon.ico | Bin .../src/greet_frontend/assets/logo2.svg | 0 .../src/greet_frontend/assets/main.css | 0 .../src/greet_frontend/assets/sample-asset.txt | 0 .../src/greet_frontend/src/index.html | 0 .../src/greet_frontend/src/index.js | 0 .../ii_integration_dapp}/webpack.config.js | 0 .../unity_project}/.gitignore | 0 .../unity_project}/Assets/Android.meta | 0 .../unity_project}/Assets/Android/Plugins.meta | 0 .../unity_project}/Assets/Android/Plugins/com.meta | 0 .../Assets/Android/Plugins/com/icgamekit.meta | 0 .../Android/Plugins/com/icgamekit/plugin.meta | 0 .../com/icgamekit/plugin/ICGameKitPlugin.java | 0 .../com/icgamekit/plugin/ICGameKitPlugin.java.meta | 0 .../unity_project}/Assets/Editor.meta | 0 .../Assets/Editor/AndroidPostBuildProcessor.cs | 0 .../Assets/Editor/AndroidPostBuildProcessor.cs.meta | 0 .../unity_project}/Assets/ICP.NET.meta | 0 .../unity_project}/Assets/ICP.NET/Chaos.NaCl.dll | Bin .../Assets/ICP.NET/Chaos.NaCl.dll.meta | 0 .../unity_project}/Assets/ICP.NET/Dahomey.Cbor.dll | Bin .../Assets/ICP.NET/Dahomey.Cbor.dll.meta | 0 .../Assets/ICP.NET/EdjCase.Cryptography.BLS.dll | Bin .../ICP.NET/EdjCase.Cryptography.BLS.dll.meta | 0 .../Assets/ICP.NET/EdjCase.ICP.Agent.dll | Bin .../Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta | 0 .../Assets/ICP.NET/EdjCase.ICP.Candid.dll | Bin .../Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta | 0 .../unity_project}/Assets/ICP.NET/LICENSE | 0 .../unity_project}/Assets/ICP.NET/LICENSE.meta | 0 .../Assets/ICP.NET/Microsoft.Bcl.HashCode.dll | Bin .../Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta | 0 .../Assets/ICP.NET/System.Collections.Immutable.dll | Bin .../ICP.NET/System.Collections.Immutable.dll.meta | 0 .../Assets/ICP.NET/System.Formats.Asn1.dll | Bin .../Assets/ICP.NET/System.Formats.Asn1.dll.meta | 0 .../Assets/ICP.NET/System.IO.Pipelines.dll | Bin .../Assets/ICP.NET/System.IO.Pipelines.dll.meta | 0 .../System.Runtime.CompilerServices.Unsafe.dll | Bin .../System.Runtime.CompilerServices.Unsafe.dll.meta | 0 .../unity_project}/Assets/Scenes.meta | 0 .../unity_project}/Assets/Scenes/SampleScene.unity | 0 .../Assets/Scenes/SampleScene.unity.meta | 0 .../unity_project}/Assets/Scripts.meta | 0 .../Assets/Scripts/DelegationUtils.cs | 0 .../Assets/Scripts/DelegationUtils.cs.meta | 0 .../unity_project}/Assets/Scripts/GreetingClient.cs | 0 .../Assets/Scripts/GreetingClient.cs.meta | 0 .../unity_project}/Assets/Scripts/PluginProxy.cs | 0 .../Assets/Scripts/PluginProxy.cs.meta | 0 .../unity_project}/Assets/Scripts/TestICPAgent.cs | 0 .../Assets/Scripts/TestICPAgent.cs.meta | 0 .../ProjectSettings/AudioManager.asset | 0 .../ProjectSettings/AutoStreamingSettings.asset | 0 .../ProjectSettings/ClusterInputManager.asset | 0 .../ProjectSettings/DynamicsManager.asset | 0 .../ProjectSettings/EditorBuildSettings.asset | 0 .../ProjectSettings/EditorSettings.asset | 0 .../ProjectSettings/GraphicsSettings.asset | 0 .../ProjectSettings/InputManager.asset | 0 .../ProjectSettings/MemorySettings.asset | 0 .../ProjectSettings/NavMeshAreas.asset | 0 .../ProjectSettings/PackageManagerSettings.asset | 0 .../ProjectSettings/Physics2DSettings.asset | 0 .../ProjectSettings/PresetManager.asset | 0 .../ProjectSettings/ProjectSettings.asset | 0 .../ProjectSettings/ProjectVersion.txt | 0 .../ProjectSettings/QualitySettings.asset | 0 .../unity_project}/ProjectSettings/TagManager.asset | 0 .../ProjectSettings/TimeManager.asset | 0 .../ProjectSettings/UnityConnectSettings.asset | 0 .../unity_project}/ProjectSettings/VFXManager.asset | 0 .../ProjectSettings/VersionControlSettings.asset | 0 .../unity_project}/ProjectSettings/boot.config | 0 .../unity_project}/README.md | 0 84 files changed, 0 insertions(+), 0 deletions(-) rename native-apps/{unity_android_deeplink => unity_ii_deeplink}/README.md (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/.gitignore (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/Makefile (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/README.md (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/dfx.json (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/package-lock.json (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/package.json (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/src/greet_backend/main.mo (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/src/greet_frontend/assets/favicon.ico (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/src/greet_frontend/assets/logo2.svg (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/src/greet_frontend/assets/main.css (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/src/greet_frontend/assets/sample-asset.txt (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/src/greet_frontend/src/index.html (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/src/greet_frontend/src/index.js (100%) rename native-apps/{unity_android_deeplink/ii_integration_page => unity_ii_deeplink/ii_integration_dapp}/webpack.config.js (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/.gitignore (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Android.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Android/Plugins.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Android/Plugins/com.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Android/Plugins/com/icgamekit.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Android/Plugins/com/icgamekit/plugin.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Editor.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Editor/AndroidPostBuildProcessor.cs (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Editor/AndroidPostBuildProcessor.cs.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/Chaos.NaCl.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/Chaos.NaCl.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/Dahomey.Cbor.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/Dahomey.Cbor.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Agent.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Candid.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/LICENSE (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/LICENSE.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.Collections.Immutable.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.Collections.Immutable.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.Formats.Asn1.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.Formats.Asn1.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.IO.Pipelines.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.IO.Pipelines.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scenes.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scenes/SampleScene.unity (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scenes/SampleScene.unity.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/DelegationUtils.cs (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/DelegationUtils.cs.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/GreetingClient.cs (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/GreetingClient.cs.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/PluginProxy.cs (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/PluginProxy.cs.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/TestICPAgent.cs (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/Assets/Scripts/TestICPAgent.cs.meta (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/AudioManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/AutoStreamingSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/ClusterInputManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/DynamicsManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/EditorBuildSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/EditorSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/GraphicsSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/InputManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/MemorySettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/NavMeshAreas.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/PackageManagerSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/Physics2DSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/PresetManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/ProjectSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/ProjectVersion.txt (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/QualitySettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/TagManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/TimeManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/UnityConnectSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/VFXManager.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/VersionControlSettings.asset (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/ProjectSettings/boot.config (100%) rename native-apps/{unity_android_deeplink/android_integration => unity_ii_deeplink/unity_project}/README.md (100%) diff --git a/native-apps/unity_android_deeplink/README.md b/native-apps/unity_ii_deeplink/README.md similarity index 100% rename from native-apps/unity_android_deeplink/README.md rename to native-apps/unity_ii_deeplink/README.md diff --git a/native-apps/unity_android_deeplink/ii_integration_page/.gitignore b/native-apps/unity_ii_deeplink/ii_integration_dapp/.gitignore similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/.gitignore rename to native-apps/unity_ii_deeplink/ii_integration_dapp/.gitignore diff --git a/native-apps/unity_android_deeplink/ii_integration_page/Makefile b/native-apps/unity_ii_deeplink/ii_integration_dapp/Makefile similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/Makefile rename to native-apps/unity_ii_deeplink/ii_integration_dapp/Makefile diff --git a/native-apps/unity_android_deeplink/ii_integration_page/README.md b/native-apps/unity_ii_deeplink/ii_integration_dapp/README.md similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/README.md rename to native-apps/unity_ii_deeplink/ii_integration_dapp/README.md diff --git a/native-apps/unity_android_deeplink/ii_integration_page/dfx.json b/native-apps/unity_ii_deeplink/ii_integration_dapp/dfx.json similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/dfx.json rename to native-apps/unity_ii_deeplink/ii_integration_dapp/dfx.json diff --git a/native-apps/unity_android_deeplink/ii_integration_page/package-lock.json b/native-apps/unity_ii_deeplink/ii_integration_dapp/package-lock.json similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/package-lock.json rename to native-apps/unity_ii_deeplink/ii_integration_dapp/package-lock.json diff --git a/native-apps/unity_android_deeplink/ii_integration_page/package.json b/native-apps/unity_ii_deeplink/ii_integration_dapp/package.json similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/package.json rename to native-apps/unity_ii_deeplink/ii_integration_dapp/package.json diff --git a/native-apps/unity_android_deeplink/ii_integration_page/src/greet_backend/main.mo b/native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_backend/main.mo similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/src/greet_backend/main.mo rename to native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_backend/main.mo diff --git a/native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/favicon.ico b/native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/favicon.ico similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/favicon.ico rename to native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/favicon.ico diff --git a/native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/logo2.svg b/native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/logo2.svg similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/logo2.svg rename to native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/logo2.svg diff --git a/native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/main.css b/native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/main.css similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/main.css rename to native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/main.css diff --git a/native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/sample-asset.txt b/native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/sample-asset.txt similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/assets/sample-asset.txt rename to native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/assets/sample-asset.txt diff --git a/native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/src/index.html b/native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/src/index.html similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/src/index.html rename to native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/src/index.html diff --git a/native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/src/index.js b/native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/src/index.js similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/src/greet_frontend/src/index.js rename to native-apps/unity_ii_deeplink/ii_integration_dapp/src/greet_frontend/src/index.js diff --git a/native-apps/unity_android_deeplink/ii_integration_page/webpack.config.js b/native-apps/unity_ii_deeplink/ii_integration_dapp/webpack.config.js similarity index 100% rename from native-apps/unity_android_deeplink/ii_integration_page/webpack.config.js rename to native-apps/unity_ii_deeplink/ii_integration_dapp/webpack.config.js diff --git a/native-apps/unity_android_deeplink/android_integration/.gitignore b/native-apps/unity_ii_deeplink/unity_project/.gitignore similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/.gitignore rename to native-apps/unity_ii_deeplink/unity_project/.gitignore diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Android.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Android.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Android.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java rename to native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Editor.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Editor.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Editor.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Editor.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs rename to native-apps/unity_ii_deeplink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/LICENSE b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/LICENSE similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/LICENSE rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/LICENSE diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/LICENSE.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/LICENSE.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/LICENSE.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/LICENSE.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scenes.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scenes.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scenes.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scenes.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scenes/SampleScene.unity b/native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scenes/SampleScene.unity rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scenes/SampleScene.unity.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scenes/SampleScene.unity.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/DelegationUtils.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DelegationUtils.cs similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/DelegationUtils.cs rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DelegationUtils.cs diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/DelegationUtils.cs.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DelegationUtils.cs.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/DelegationUtils.cs.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DelegationUtils.cs.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/GreetingClient.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/GreetingClient.cs similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/GreetingClient.cs rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/GreetingClient.cs diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/GreetingClient.cs.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/GreetingClient.cs.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/GreetingClient.cs.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/GreetingClient.cs.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/PluginProxy.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/PluginProxy.cs rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/PluginProxy.cs.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/PluginProxy.cs.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs.meta diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/TestICPAgent.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/TestICPAgent.cs rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs diff --git a/native-apps/unity_android_deeplink/android_integration/Assets/Scripts/TestICPAgent.cs.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs.meta similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/Assets/Scripts/TestICPAgent.cs.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs.meta diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/AudioManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/AudioManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/AudioManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/AudioManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/AutoStreamingSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/AutoStreamingSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/AutoStreamingSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/AutoStreamingSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/ClusterInputManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/ClusterInputManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/ClusterInputManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/ClusterInputManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/DynamicsManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/DynamicsManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/DynamicsManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/DynamicsManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/EditorBuildSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/EditorBuildSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/EditorBuildSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/EditorBuildSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/EditorSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/EditorSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/EditorSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/EditorSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/GraphicsSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/GraphicsSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/GraphicsSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/GraphicsSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/InputManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/InputManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/InputManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/InputManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/MemorySettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/MemorySettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/MemorySettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/MemorySettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/NavMeshAreas.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/NavMeshAreas.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/NavMeshAreas.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/NavMeshAreas.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/PackageManagerSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/PackageManagerSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/PackageManagerSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/PackageManagerSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/Physics2DSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/Physics2DSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/Physics2DSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/Physics2DSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/PresetManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/PresetManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/PresetManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/PresetManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/ProjectSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/ProjectSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/ProjectSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/ProjectSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/ProjectVersion.txt b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/ProjectVersion.txt similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/ProjectVersion.txt rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/ProjectVersion.txt diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/QualitySettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/QualitySettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/QualitySettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/QualitySettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/TagManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/TagManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/TagManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/TagManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/TimeManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/TimeManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/TimeManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/TimeManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/UnityConnectSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/UnityConnectSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/UnityConnectSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/UnityConnectSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/VFXManager.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/VFXManager.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/VFXManager.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/VFXManager.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/VersionControlSettings.asset b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/VersionControlSettings.asset similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/VersionControlSettings.asset rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/VersionControlSettings.asset diff --git a/native-apps/unity_android_deeplink/android_integration/ProjectSettings/boot.config b/native-apps/unity_ii_deeplink/unity_project/ProjectSettings/boot.config similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/ProjectSettings/boot.config rename to native-apps/unity_ii_deeplink/unity_project/ProjectSettings/boot.config diff --git a/native-apps/unity_android_deeplink/android_integration/README.md b/native-apps/unity_ii_deeplink/unity_project/README.md similarity index 100% rename from native-apps/unity_android_deeplink/android_integration/README.md rename to native-apps/unity_ii_deeplink/unity_project/README.md From 3257923d2db05109b5156bce3706c83b562d8931 Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Thu, 7 Sep 2023 22:04:19 +0800 Subject: [PATCH 03/32] Update the document to reflect the directory changes. --- native-apps/unity_ii_deeplink/README.md | 23 +++++++++++-------- .../ii_integration_dapp/README.md | 6 ++--- .../unity_ii_deeplink/unity_project/README.md | 6 ++--- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/native-apps/unity_ii_deeplink/README.md b/native-apps/unity_ii_deeplink/README.md index f8f6547b0..a8c40341b 100644 --- a/native-apps/unity_ii_deeplink/README.md +++ b/native-apps/unity_ii_deeplink/README.md @@ -1,23 +1,28 @@ # Internet Identity Integration -This sample shows one way to integrate Internet Identity with Android apps. It contains two parts: a dapp with II integrated, and an Unity Project which interacts with this dapp. +This sample shows one way to integrate Internet Identity with native mobile apps. It contains two parts: a dapp with II integrated, and an Unity Project which interacts with this dapp. -## ii_integration_page +## ii_integration_dapp It's an example that integrates with Internet Identity, with the backend and frontend. It derives from the [Internet Identity integration sample](https://github.com/dfinity/examples/tree/master/motoko/internet_identity_integration) demo with some modifications. -Please refer to [README](./ii_integration_page/README.md) for details. +Please refer to [README](./ii_integration_dapp/README.md) for details. -## android_integration -This is a Unity project with [ICP.NET](https://github.com/BoomDAO/ICP.NET) embedded, which is a C# agent that is able to communicate with the IC from C#. Please refer to [README](./android_integration/README.md) for details. +## unity_project +This is a Unity project with [ICP.NET](https://github.com/BoomDAO/ICP.NET) embedded, which is a C# agent that is able to communicate with the IC from C#. Please refer to [README](./unity_project/README.md) for details. ## Workflow Here is the basic workflow that how to integrate with Internet Identity from a Unity Android game. The basic idea is to open the Web Browser from the game, login in with II in the browser, and pass the DelegationIdentity back to the game. The steps in detail are described below: -1. Set up an [Internet Identity integration dapp](#ii_integration_page) which supports logging in with II. - Please refer to [ii_integration_page](./ii_integration_page/README.md) to set up the dapp. -2. Run a Unity game on Android, which is built from [android_integration sample](#android_integration). - Please refer to [android_integration](./android_integration/README.md) to build the Unity Android game. +1. Set up an [Internet Identity integration dapp](#ii_integration_dapp) which supports logging in with II. + Please refer to [ii_integration_dapp](./ii_integration_dapp/README.md) to set up the dapp. + +2. Run a Unity game on Android, which is built from [a unity sample](#unity_project). + Please refer to [unity_project](./unity_project/README.md) to build the Unity Android game. + 3. Launch the Web Browser from the game to open the dapp frontend deployed in #1, with the public key of `Ed25519Identity` as a parameter. + 4. Login with your Internet Identity in the Web Browser. + 5. Launch the application via DeepLink, and pass the `DelegationIdentity` back to the game as the URL parameter. + 6. Call the backend canister with the `DelegationIdentity` to greet. diff --git a/native-apps/unity_ii_deeplink/ii_integration_dapp/README.md b/native-apps/unity_ii_deeplink/ii_integration_dapp/README.md index 5fe9ede46..99b959fac 100644 --- a/native-apps/unity_ii_deeplink/ii_integration_dapp/README.md +++ b/native-apps/unity_ii_deeplink/ii_integration_dapp/README.md @@ -18,12 +18,12 @@ With this, users don't need to pass the private key around, also they don't need If you never work on the IC and don't know how to deploy a dapp, please refer to the [Hello World sample](https://internetcomputer.org/docs/current/tutorials/deploy_sample_app) to learn the basic knowledge about the IC. -And this example is configured to launch the Unity Android project by opening the `internetidentity://authorize` URL, you can change the URL scheme as you want in [index.js](./src/greet_frontend/src/index.js). +And this example is configured to launch the Unity Android/iOS app by opening the `internetidentity://authorize` URL, you can change the URL scheme as you want in [index.js](./src/greet_frontend/src/index.js). Once you set up the IC development environment locally and update the example as you want, you can follow the below steps to deploy to the IC mainnet. -1. Enter the `ii_integration_page` directory from the command line +1. Enter the `ii_integration_dapp` directory from the command line 2. Run `npm install` to install the npm packages 3. Run `dfx start --background` 4. Run `dfx deploy --network=ic --with-cycles=1000000000000` - Here we recommend deploying the dapp to the IC mainnet as it's easier to access it from your Android devices. Or you can use the [deployed dapp](https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io) instead. + Here we recommend deploying the dapp to the IC mainnet as it's easier to access it from your mobile devices. Or you can use the [deployed dapp](https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io) instead. diff --git a/native-apps/unity_ii_deeplink/unity_project/README.md b/native-apps/unity_ii_deeplink/unity_project/README.md index f57366c38..6d1ad7a24 100644 --- a/native-apps/unity_ii_deeplink/unity_project/README.md +++ b/native-apps/unity_ii_deeplink/unity_project/README.md @@ -1,5 +1,5 @@ -# Unity Android sample -This sample demonstrates one way to integrate Identity Integration with Unity on Android. If you never play with Unity Android, please read [Getting started with Android](https://docs.unity3d.com/Manual/android-getting-started.html) document. +# Unity sample +This sample demonstrates one way to integrate Identity Integration with Unity on mobile platforms. If you never play with Unity Android/iOS, please read [Getting started with Android](https://docs.unity3d.com/Manual/android-getting-started.html) and [Gettting Started with iOS](https://docs.unity3d.com/Manual/iphone-GettingStarted.html). ## Overview @@ -25,7 +25,7 @@ There're several important files in this example. PluginProxy works as a bridge between Unity C# and Android Java, which calls the functions inside [ICGameKitPlugin.java](./Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java). - [GreetingClient.cs](./Assets/Scripts/GreetingClient.cs) - This provides the C# APIs for calling the Greeting backend canister in [ii_integration_page](../ii_integration_page/README.md). It can be generated by running the `ClientGenerator` provided by [ICP.NET](https://github.com/BoomDAO/ICP.NET). + This provides the C# APIs for calling the Greeting backend canister in [ii_integration_dapp](../ii_integration_dapp/README.md). It can be generated by running the `ClientGenerator` provided by [ICP.NET](https://github.com/BoomDAO/ICP.NET). - [TestICPAgent.cs](./Assets/Scripts/TestICPAgent.cs) This is a testing script which can parse the delegation identity and call the APIs provided by [GreetingClient.cs](./Assets/Scripts/GreetingClient.cs) to communicate with the greeting backend canister. From 8e73ea90522ea35f90c15992e50de74af908dc42 Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Thu, 7 Sep 2023 22:45:07 +0800 Subject: [PATCH 04/32] Simplify the deep link workflow, and iOS can share the same code path. --- .../unity_project/Assets/Android.meta | 8 -- .../unity_project/Assets/Android/Plugins.meta | 8 -- .../Assets/Android/Plugins/com.meta | 8 -- .../Assets/Android/Plugins/com/icgamekit.meta | 8 -- .../Android/Plugins/com/icgamekit/plugin.meta | 8 -- .../com/icgamekit/plugin/ICGameKitPlugin.java | 77 ------------------- .../plugin/ICGameKitPlugin.java.meta | 32 -------- .../Assets/Scenes/SampleScene.unity | 4 +- .../Assets/Scripts/DeepLinkPlugin.cs | 47 +++++++++++ ...inProxy.cs.meta => DeepLinkPlugin.cs.meta} | 0 .../Assets/Scripts/PluginProxy.cs | 53 ------------- .../Assets/Scripts/TestICPAgent.cs | 49 ++++-------- 12 files changed, 65 insertions(+), 237 deletions(-) delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Android.meta delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins.meta delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com.meta delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit.meta delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta create mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DeepLinkPlugin.cs rename native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/{PluginProxy.cs.meta => DeepLinkPlugin.cs.meta} (100%) delete mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Android.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android.meta deleted file mode 100644 index 9b91e55e8..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Android.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2655c98839f2a3d45832406122f52a08 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins.meta deleted file mode 100644 index 4e7a3f552..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9bc52b823e4726e4c992caabcb215c49 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com.meta deleted file mode 100644 index 8d353af3b..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c8fae1178b05d304f9b65266d78c7861 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit.meta deleted file mode 100644 index a38c11962..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 22bfb1d087e132d49aee8d6b77c16596 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta deleted file mode 100644 index 986985373..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3649a729052c9154f92028141feef64c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java deleted file mode 100644 index 910557683..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.icgamekit.plugin; - -import android.content.Intent; -import android.net.Uri; -import android.util.Log; - -import com.unity3d.player.UnityPlayer; - -import java.io.File; -import java.io.FileOutputStream; - -public class ICGameKitPlugin { - static final String TAG_PLUGIN = "ICGameKitPlugin"; - - public static ICGameKitPlugin sCurrentPlugin; - - public static ICGameKitPlugin initImpl() { - if (sCurrentPlugin != null) - return sCurrentPlugin; - - sCurrentPlugin = new ICGameKitPlugin(); - - return sCurrentPlugin; - } - - public void openBrowser(String url) { - Log.i(TAG_PLUGIN, url); - - //String url = "https://6x7nu-oaaaa-aaaan-qdaua-cai.ic0.app"; - Uri uri = Uri.parse(url); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - UnityPlayer.currentActivity.startActivity(intent); - } - - public void sendMessage(String[] arguments) { - if (arguments == null || arguments.length != 2) - return; - - String gameObjectName = arguments[0]; - String methodName = arguments[1]; - - if (gameObjectName == null || gameObjectName.length() == 0 - || methodName == null || methodName.length() == 0) - return; - - Uri uri = UnityPlayer.currentActivity.getIntent().getData(); - if (uri == null) - return; - - String url = uri.toString(); - int index = url.indexOf("delegation="); - if (index == -1) - return; - - String delegation = url.substring(index); - //Log.i(TAG_PLUGIN, delegation); - - // Write to a temporary file to internal storage and read it back from C# side. - // The reason is we can only pass 1024 bytes as string back to the C# side, but the params string with delegation is more than 3k bytes. - String delegationPath = UnityPlayer.currentActivity.getFilesDir().getPath() + "/delegation.file"; - File delegationFile = new File(delegationPath); - try { - if (delegationFile.exists()) - delegationFile.delete(); - - FileOutputStream fileOutputStream = new FileOutputStream(delegationFile); - fileOutputStream.write(delegation.getBytes()); - fileOutputStream.flush(); - fileOutputStream.close(); - } catch (Exception e) { - e.printStackTrace(); - } - - // Pass the delegation path back to C#. - UnityPlayer.UnitySendMessage(gameObjectName, methodName, delegationPath); - } -} diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta deleted file mode 100644 index cce2dbea9..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta +++ /dev/null @@ -1,32 +0,0 @@ -fileFormatVersion: 2 -guid: 7e6eb76733b18a441bc73656627d8f52 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Android: Android - second: - enabled: 1 - settings: {} - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity b/native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity index 663f55b0b..62a199e0d 100644 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity +++ b/native-apps/unity_ii_deeplink/unity_project/Assets/Scenes/SampleScene.unity @@ -182,8 +182,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: greetFrontend: https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io/ - gameObjectName: AgentAndPlugin - methodName: OnMessageSent --- !u!1 &671559154 GameObject: m_ObjectHideFlags: 0 @@ -889,7 +887,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: - m_Target: {fileID: 272906662} - m_TargetAssemblyTypeName: IC.GameKit.PluginProxy, Assembly-CSharp + m_TargetAssemblyTypeName: IC.GameKit.DeepLinkPlugin, Assembly-CSharp m_MethodName: OpenBrowser m_Mode: 1 m_Arguments: diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DeepLinkPlugin.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DeepLinkPlugin.cs new file mode 100644 index 000000000..7e297d3d2 --- /dev/null +++ b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DeepLinkPlugin.cs @@ -0,0 +1,47 @@ +using UnityEngine; +using EdjCase.ICP.Candid.Utilities; +using Newtonsoft.Json; +using System.Web; + +namespace IC.GameKit +{ + public class DeepLinkPlugin : MonoBehaviour + { + TestICPAgent mTestICPAgent = null; + + private void Awake() + { + // Register action for deep link activated. + Application.deepLinkActivated += OnDeepLinkActivated; + } + + public void Start() + { + mTestICPAgent = gameObject.GetComponent(); + } + + public void OpenBrowser() + { + var target = mTestICPAgent.greetFrontend + "?sessionkey=" + ByteUtil.ToHexString(mTestICPAgent.TestIdentity.PublicKey.Value); + Application.OpenURL(target); + } + + public void OnDeepLinkActivated(string url) + { + if (string.IsNullOrEmpty(url)) + return; + + const string kDelegationParam = "delegation="; + var indexOfDelegation = url.IndexOf(kDelegationParam); + if (indexOfDelegation == -1) + { + Debug.LogError("Cannot find delegation"); + return; + } + + var delegationString = HttpUtility.UrlDecode(url.Substring(indexOfDelegation + kDelegationParam.Length)); + var delegation = JsonConvert.DeserializeObject(delegationString); + mTestICPAgent.Delegation = delegation; + } + } +} diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DeepLinkPlugin.cs.meta similarity index 100% rename from native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs.meta rename to native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/DeepLinkPlugin.cs.meta diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs deleted file mode 100644 index cbf71301c..000000000 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/PluginProxy.cs +++ /dev/null @@ -1,53 +0,0 @@ -using UnityEngine; -using EdjCase.ICP.Candid.Utilities; - -namespace IC.GameKit -{ - public class PluginProxy : MonoBehaviour - { - const string kGameObjectName = "AgentAndPlugin"; - const string kMethodName = "OnMessageSent"; - - public string greetFrontend = "https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io/"; - - TestICPAgent mTestICPAgent = null; - -#if UNITY_ANDROID - private AndroidJavaObject mPlugin = null; -#endif - - public void Start() - { - mTestICPAgent = gameObject.GetComponent(); - -#if UNITY_ANDROID - var pluginClass = new AndroidJavaClass("com.icgamekit.plugin.ICGameKitPlugin"); - mPlugin = pluginClass.CallStatic("initImpl"); -#endif - } - - public void OpenBrowser() - { - var target = greetFrontend + "?sessionkey=" + ByteUtil.ToHexString(mTestICPAgent.TestIdentity.PublicKey.Value); - -#if UNITY_ANDROID - mPlugin.Call("openBrowser", target); -#endif - } - - public void OnApplicationPause(bool pause) - { - // If it's resuming. - if (!pause) - { -#if UNITY_ANDROID - // OnApplicationPause will be called while launching the app, before mPlugin is initialized. - if (mPlugin == null) - return; - - mPlugin.Call("sendMessage", new string[] { kGameObjectName, kMethodName }); -#endif - } - } - } -} diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs index 52a379a08..98c60208a 100644 --- a/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs +++ b/native-apps/unity_ii_deeplink/unity_project/Assets/Scripts/TestICPAgent.cs @@ -8,15 +8,14 @@ using System.Collections.Generic; using EdjCase.ICP.Agent.Models; using System; -using System.IO; -using Newtonsoft.Json; -using System.Web; namespace IC.GameKit { public class TestICPAgent : MonoBehaviour { + public string greetFrontend = "https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io/"; public string greetBackendCanister = "72rj2-biaaa-aaaan-qdatq-cai"; + Text mMyPrincipalText = null; Button mGreetButton = null; Ed25519Identity mEd25519Identity = null; @@ -24,6 +23,19 @@ public class TestICPAgent : MonoBehaviour public Ed25519Identity TestIdentity { get { return mEd25519Identity; } } + internal DelegationChainModel Delegation { + get { return mDelegation; } + set + { + mDelegation = value; + + if (mDelegation != null && mGreetButton != null) + { + mGreetButton.interactable = true; + } + } + } + // Start is called before the first frame update void Start() { @@ -41,33 +53,6 @@ void Update() { } - public void OnMessageSent(string delegationPath) - { - if (string.IsNullOrEmpty(delegationPath) || !File.Exists(delegationPath)) - return; - - //Debug.Log("Identity path '" + identityPath + "' exists."); - - var parameters = File.ReadAllText(delegationPath); - //Debug.Log("Params length is: " + parameters.Length); - - const string kDelegationParam = "delegation="; - var indexOfDelegation = parameters.IndexOf(kDelegationParam); - if (indexOfDelegation == -1) - { - Debug.LogError("Cannot find delegation"); - return; - } - - var delegationString = HttpUtility.UrlDecode(parameters.Substring(indexOfDelegation + kDelegationParam.Length)); - mDelegation = JsonConvert.DeserializeObject(delegationString); - - if (mDelegation != null && mGreetButton != null) - { - mGreetButton.interactable = true; - } - } - public void Greet() { if (mDelegation == null) @@ -99,9 +84,9 @@ private async void CallCanister(DelegationChainModel delegationChainModel) // Initialize HttpAgent. var agent = new HttpAgent(delegationIdentity); - Principal canisterId = Principal.FromText(greetBackendCanister); + var canisterId = Principal.FromText(greetBackendCanister); - // Intialize Client and make the call. + // Intialize the client and make the call. var client = new GreetingClient.GreetingClient(agent, canisterId); var content = await client.Greet(); From bed57ab01fa73ca456be0203ce04f01136088897 Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Thu, 7 Sep 2023 22:57:05 +0800 Subject: [PATCH 05/32] Update the readme file accordingly. --- .../unity_ii_deeplink/unity_project/README.md | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/native-apps/unity_ii_deeplink/unity_project/README.md b/native-apps/unity_ii_deeplink/unity_project/README.md index 6d1ad7a24..ed409d04e 100644 --- a/native-apps/unity_ii_deeplink/unity_project/README.md +++ b/native-apps/unity_ii_deeplink/unity_project/README.md @@ -3,9 +3,9 @@ This sample demonstrates one way to integrate Identity Integration with Unity on ## Overview -In this example, you can learn how to communicate with the IC from C#. As we described in [Internet Identity Integration](../unity_android_deeplink/README.md#workflow), the game mainly focuses on: +In this example, you can learn how to communicate with the IC from C#. As we described in [Internet Identity Integration](../README.md#workflow), the game mainly focuses on: -1. Provide an Android Java plugin which can be a bridge between C# and the browser. +1. Provide an plugin to handle the communication between C# and the browser. 2. Register the DeepLink in the Android manifest file. 3. Generate the `Ed25519KeyIdentity` in C# and pass the public key to the Web Brower. 4. Receive the `DelegationIdentity` from the Web Brower and pass it from Java to C#. @@ -15,30 +15,27 @@ In this example, you can learn how to communicate with the IC from C#. As we des There're several important files in this example. -- [ICGameKitPlugin.java](./Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java) - This is a Unity Android native plugin written in java, provided with functions including opening browser, sending messages back to Unity. - - [AndroidPostBuildProcessor.cs](./Assets/Editor/AndroidPostBuildProcessor.cs) - This is a Unity post-build processor for Android platform, which inserts the DeepLink URLScheme into the AndroidManifest.xml. + This is a Unity post-build processor for Android platform, which inserts the DeepLink URL scheme into the AndroidManifest.xml. -- [PluginProxy.cs](./Assets/Scripts/PluginProxy.cs) - PluginProxy works as a bridge between Unity C# and Android Java, which calls the functions inside [ICGameKitPlugin.java](./Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java). +- [DeepLinkPlugin.cs](./Assets/Scripts/DeepLinkPlugin.cs) + It's a plugin which provides functions to open the web browser, handle the deep link activation, and parse the delegation from Json string. - [GreetingClient.cs](./Assets/Scripts/GreetingClient.cs) This provides the C# APIs for calling the Greeting backend canister in [ii_integration_dapp](../ii_integration_dapp/README.md). It can be generated by running the `ClientGenerator` provided by [ICP.NET](https://github.com/BoomDAO/ICP.NET). - [TestICPAgent.cs](./Assets/Scripts/TestICPAgent.cs) - This is a testing script which can parse the delegation identity and call the APIs provided by [GreetingClient.cs](./Assets/Scripts/GreetingClient.cs) to communicate with the greeting backend canister. + This is a testing script which calls the APIs provided by [GreetingClient.cs](./Assets/Scripts/GreetingClient.cs) to communicate with the greeting backend canister. ## Deployment -The current Unity project is configured to use the [deployed dapp](https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io). If you deploy your own dapp by following [ii_integration_page](../ii_integration_page/README.md), you need to make some modifications before you start to build this project to Android platform in Unity. +The current Unity project is configured to use the [deployed dapp](https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io). If you deploy your own dapp by following [ii_integration_dapp](../ii_integration_dapp/README.md), you need to make some modifications before you start to build this project to Android platform in Unity. 1. In Unity, open the `Assets\Scenes\SampleScene.unity` 2. Navigate to the `AgentAndPlugin` in the scene hierarchy 3. Update the `Greet Backend Canister` with your own greeting backend canister id 4. Update the `Greet Frontend` with your own greeting frontend -5. If you use a different URL scheme to launch your Unity project in [ii_integration_page](../ii_integration_page/README.md), please update the `kAndroidScheme` & `kAndroidHost` in [AndroidPostBuildProcessor.cs](./Assets/Editor/AndroidPostBuildProcessor.cs) accordingly. +5. If you use a different URL scheme to launch your Unity project in [ii_integration_dapp](../ii_integration_dapp/README.md), please update the `kAndroidScheme` & `kAndroidHost` in [AndroidPostBuildProcessor.cs](./Assets/Editor/AndroidPostBuildProcessor.cs) accordingly. After updating your Unity project correctly, please build to Android platform in Unity, just 1. Go to `File -> Build Settings` window From d341ee6ec93c0c350f59e482d450dad673692a8c Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Fri, 8 Sep 2023 16:31:20 +0800 Subject: [PATCH 06/32] Add iOS post-build script to add the URL scheme to plist file. --- .../Assets/Editor/iOSPostBuildProcessor.cs | 57 +++++++++++++++++++ .../Editor/iOSPostBuildProcessor.cs.meta | 11 ++++ 2 files changed, 68 insertions(+) create mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs create mode 100644 native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs.meta diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs b/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs new file mode 100644 index 000000000..752657ef5 --- /dev/null +++ b/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs @@ -0,0 +1,57 @@ +#if UNITY_IOS +using System.IO; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEditor.iOS.Xcode; +using UnityEngine; + +public class iOSPostBuildProcessor : MonoBehaviour +{ + [PostProcessBuild] + public static void OnPostprocessBuild(BuildTarget buildTarget, string path) + { + if (buildTarget != BuildTarget.iOS) + return; + + const string kURLScheme = "internetidentity"; + const string kURLIdentifier = "authorize"; + + // Patch the plist file to add URL schemes. + PatchPlist(path, kURLScheme, kURLIdentifier); + } + + private static void PatchPlist(string path, string urlScheme, string urlIdentifier) + { + var plistPath = path + "/Info.plist"; + var plist = new PlistDocument(); + plist.ReadFromString(File.ReadAllText(plistPath)); + + var rootDict = plist.root; + var needsToWriteChanges = false; + + const string kURLTypesKey = "CFBundleURLTypes"; + const string kURLNameKey = "CFBundleURLName"; + const string kURLSchemeKey = "CFBundleURLSchemes"; + + if (!rootDict.values.ContainsKey(kURLTypesKey)) + { + var urlTypesArray = rootDict.CreateArray(kURLTypesKey); + var itemDict = urlTypesArray.AddDict(); + itemDict.SetString(kURLNameKey, urlIdentifier); + var schemeArray = itemDict.CreateArray(kURLSchemeKey); + schemeArray.AddString(urlScheme); + + needsToWriteChanges = true; + } + else + { + // TODO: Check if the url shceme has been updated. + } + + if (needsToWriteChanges) + { + File.WriteAllText(plistPath, plist.WriteToString()); + } + } +} +#endif diff --git a/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs.meta b/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs.meta new file mode 100644 index 000000000..5519f95d6 --- /dev/null +++ b/native-apps/unity_ii_deeplink/unity_project/Assets/Editor/iOSPostBuildProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e44635aa576c1bb40ab1321e47f4eb05 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From a1bf4e2564c8fdfee7aa310068e766b4e659f698 Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Fri, 8 Sep 2023 16:38:48 +0800 Subject: [PATCH 07/32] Update the document to cover iOS integration. --- native-apps/unity_ii_deeplink/README.md | 6 +++--- .../unity_ii_deeplink/unity_project/README.md | 21 ++++++++++++------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/native-apps/unity_ii_deeplink/README.md b/native-apps/unity_ii_deeplink/README.md index a8c40341b..0d24a9b80 100644 --- a/native-apps/unity_ii_deeplink/README.md +++ b/native-apps/unity_ii_deeplink/README.md @@ -9,15 +9,15 @@ Please refer to [README](./ii_integration_dapp/README.md) for details. This is a Unity project with [ICP.NET](https://github.com/BoomDAO/ICP.NET) embedded, which is a C# agent that is able to communicate with the IC from C#. Please refer to [README](./unity_project/README.md) for details. ## Workflow -Here is the basic workflow that how to integrate with Internet Identity from a Unity Android game. The basic idea is to open the Web Browser from the game, login in with II in the browser, and pass the DelegationIdentity back to the game. +Here is the basic workflow that how to integrate with Internet Identity from a Unity mobile game. The basic idea is to open the Web Browser from the game, login in with II in the browser, and pass the DelegationIdentity back to the game. The steps in detail are described below: 1. Set up an [Internet Identity integration dapp](#ii_integration_dapp) which supports logging in with II. Please refer to [ii_integration_dapp](./ii_integration_dapp/README.md) to set up the dapp. -2. Run a Unity game on Android, which is built from [a unity sample](#unity_project). - Please refer to [unity_project](./unity_project/README.md) to build the Unity Android game. +2. Run a Unity game on Android/iOS, which is built from [a unity sample](#unity_project). + Please refer to [unity_project](./unity_project/README.md) to build the Unity game. 3. Launch the Web Browser from the game to open the dapp frontend deployed in #1, with the public key of `Ed25519Identity` as a parameter. diff --git a/native-apps/unity_ii_deeplink/unity_project/README.md b/native-apps/unity_ii_deeplink/unity_project/README.md index ed409d04e..6e7725e6d 100644 --- a/native-apps/unity_ii_deeplink/unity_project/README.md +++ b/native-apps/unity_ii_deeplink/unity_project/README.md @@ -5,8 +5,8 @@ This sample demonstrates one way to integrate Identity Integration with Unity on In this example, you can learn how to communicate with the IC from C#. As we described in [Internet Identity Integration](../README.md#workflow), the game mainly focuses on: -1. Provide an plugin to handle the communication between C# and the browser. -2. Register the DeepLink in the Android manifest file. +1. Provide a plugin to handle the communication between C# and the browser. +2. Register the DeepLink URL scheme. 3. Generate the `Ed25519KeyIdentity` in C# and pass the public key to the Web Brower. 4. Receive the `DelegationIdentity` from the Web Brower and pass it from Java to C#. 5. Use the `DelegationIdentity` to communicate with the backend canister. @@ -18,8 +18,11 @@ There're several important files in this example. - [AndroidPostBuildProcessor.cs](./Assets/Editor/AndroidPostBuildProcessor.cs) This is a Unity post-build processor for Android platform, which inserts the DeepLink URL scheme into the AndroidManifest.xml. +- [iOSPostBuildProcessor.cs](./Assets/Editor/iOSPostBuildProcessor.cs) + This is a Unity post-build processor for iOS platform, which inserts the DeepLink URL scheme into the pList file. + - [DeepLinkPlugin.cs](./Assets/Scripts/DeepLinkPlugin.cs) - It's a plugin which provides functions to open the web browser, handle the deep link activation, and parse the delegation from Json string. + It's a plugin which provides functions to open the web browser, handle the DeepLink activation, and parse the delegation from Json string. - [GreetingClient.cs](./Assets/Scripts/GreetingClient.cs) This provides the C# APIs for calling the Greeting backend canister in [ii_integration_dapp](../ii_integration_dapp/README.md). It can be generated by running the `ClientGenerator` provided by [ICP.NET](https://github.com/BoomDAO/ICP.NET). @@ -29,15 +32,17 @@ There're several important files in this example. ## Deployment -The current Unity project is configured to use the [deployed dapp](https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io). If you deploy your own dapp by following [ii_integration_dapp](../ii_integration_dapp/README.md), you need to make some modifications before you start to build this project to Android platform in Unity. +The current Unity project is configured to use the [deployed dapp](https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io). If you deploy your own dapp by following [ii_integration_dapp](../ii_integration_dapp/README.md), you need to make some modifications before you start to build this project to mobile platforms in Unity. 1. In Unity, open the `Assets\Scenes\SampleScene.unity` 2. Navigate to the `AgentAndPlugin` in the scene hierarchy 3. Update the `Greet Backend Canister` with your own greeting backend canister id 4. Update the `Greet Frontend` with your own greeting frontend -5. If you use a different URL scheme to launch your Unity project in [ii_integration_dapp](../ii_integration_dapp/README.md), please update the `kAndroidScheme` & `kAndroidHost` in [AndroidPostBuildProcessor.cs](./Assets/Editor/AndroidPostBuildProcessor.cs) accordingly. +5. If you use a different URL scheme to launch your Unity project in [ii_integration_dapp](../ii_integration_dapp/README.md), please + - Update the `kAndroidScheme` & `kAndroidHost` in [AndroidPostBuildProcessor.cs](./Assets/Editor/AndroidPostBuildProcessor.cs) accordingly. + - Or update the `kURLScheme` & `kURLIdentifier` in [iOSPostBuildProcessor.cs](./Assets/Editor/iOSPostBuildProcessor.cs) accordingly. -After updating your Unity project correctly, please build to Android platform in Unity, just +After updating your Unity project correctly, please build to the platform you want to build to in Unity, just 1. Go to `File -> Build Settings` window -2. Switch to `Android` platform -3. Click `Build` to build the Android app, or Click `Build And Run` to build and run on the connected device. +2. Switch to `Android` / `iOS` platform +3. Click `Build` to build the app, or Click `Build And Run` to build and run on the connected device. From 6b828bce66421542ff2d8fed2bca8f0939060edc Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Fri, 8 Sep 2023 16:42:05 +0800 Subject: [PATCH 08/32] Reorg the folder structure to be same as the unity_ii_deeplink. --- .../README.md | 0 .../ii_integration_dapp}/.gitignore | 0 .../ii_integration_dapp}/Makefile | 0 .../ii_integration_dapp}/README.md | 0 .../ii_integration_dapp}/dfx.json | 0 .../ii_integration_dapp}/package-lock.json | 0 .../ii_integration_dapp}/package.json | 0 .../ii_integration_dapp}/src/greet_backend/main.mo | 0 .../src/greet_frontend/assets/.ic-assets.json | 0 .../assets/.well-known/assetlinks.json | 0 .../src/greet_frontend/assets/favicon.ico | Bin .../src/greet_frontend/assets/logo2.svg | 0 .../src/greet_frontend/assets/main.css | 0 .../src/greet_frontend/assets/sample-asset.txt | 0 .../src/greet_frontend/src/index.html | 0 .../src/greet_frontend/src/index.js | 0 .../ii_integration_dapp}/webpack.config.js | 0 .../unity_project}/.gitignore | 0 .../unity_project}/Assets/Android.meta | 0 .../unity_project}/Assets/Android/Plugins.meta | 0 .../unity_project}/Assets/Android/Plugins/com.meta | 0 .../Assets/Android/Plugins/com/icgamekit.meta | 0 .../Android/Plugins/com/icgamekit/plugin.meta | 0 .../com/icgamekit/plugin/ICGameKitPlugin.java | 0 .../com/icgamekit/plugin/ICGameKitPlugin.java.meta | 0 .../unity_project}/Assets/Editor.meta | 0 .../Assets/Editor/AndroidPostBuildProcessor.cs | 0 .../Assets/Editor/AndroidPostBuildProcessor.cs.meta | 0 .../unity_project}/Assets/ICP.NET.meta | 0 .../unity_project}/Assets/ICP.NET/Chaos.NaCl.dll | Bin .../Assets/ICP.NET/Chaos.NaCl.dll.meta | 0 .../unity_project}/Assets/ICP.NET/Dahomey.Cbor.dll | Bin .../Assets/ICP.NET/Dahomey.Cbor.dll.meta | 0 .../Assets/ICP.NET/EdjCase.Cryptography.BLS.dll | Bin .../ICP.NET/EdjCase.Cryptography.BLS.dll.meta | 0 .../Assets/ICP.NET/EdjCase.ICP.Agent.dll | Bin .../Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta | 0 .../Assets/ICP.NET/EdjCase.ICP.Candid.dll | Bin .../Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta | 0 .../unity_project}/Assets/ICP.NET/LICENSE | 0 .../unity_project}/Assets/ICP.NET/LICENSE.meta | 0 .../Assets/ICP.NET/Microsoft.Bcl.HashCode.dll | Bin .../Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta | 0 .../Assets/ICP.NET/System.Collections.Immutable.dll | Bin .../ICP.NET/System.Collections.Immutable.dll.meta | 0 .../Assets/ICP.NET/System.Formats.Asn1.dll | Bin .../Assets/ICP.NET/System.Formats.Asn1.dll.meta | 0 .../Assets/ICP.NET/System.IO.Pipelines.dll | Bin .../Assets/ICP.NET/System.IO.Pipelines.dll.meta | 0 .../System.Runtime.CompilerServices.Unsafe.dll | Bin .../System.Runtime.CompilerServices.Unsafe.dll.meta | 0 .../unity_project}/Assets/Scenes.meta | 0 .../unity_project}/Assets/Scenes/SampleScene.unity | 0 .../Assets/Scenes/SampleScene.unity.meta | 0 .../unity_project}/Assets/Scripts.meta | 0 .../Assets/Scripts/DelegationUtils.cs | 0 .../Assets/Scripts/DelegationUtils.cs.meta | 0 .../unity_project}/Assets/Scripts/GreetingClient.cs | 0 .../Assets/Scripts/GreetingClient.cs.meta | 0 .../unity_project}/Assets/Scripts/PluginProxy.cs | 0 .../Assets/Scripts/PluginProxy.cs.meta | 0 .../unity_project}/Assets/Scripts/TestICPAgent.cs | 0 .../Assets/Scripts/TestICPAgent.cs.meta | 0 .../unity_project}/Assets/test.keystore | Bin .../unity_project}/Assets/test.keystore.meta | 0 .../ProjectSettings/AudioManager.asset | 0 .../ProjectSettings/AutoStreamingSettings.asset | 0 .../ProjectSettings/ClusterInputManager.asset | 0 .../ProjectSettings/DynamicsManager.asset | 0 .../ProjectSettings/EditorBuildSettings.asset | 0 .../ProjectSettings/EditorSettings.asset | 0 .../ProjectSettings/GraphicsSettings.asset | 0 .../ProjectSettings/InputManager.asset | 0 .../ProjectSettings/MemorySettings.asset | 0 .../ProjectSettings/NavMeshAreas.asset | 0 .../ProjectSettings/PackageManagerSettings.asset | 0 .../ProjectSettings/Physics2DSettings.asset | 0 .../ProjectSettings/PresetManager.asset | 0 .../ProjectSettings/ProjectSettings.asset | 0 .../ProjectSettings/ProjectVersion.txt | 0 .../ProjectSettings/QualitySettings.asset | 0 .../unity_project}/ProjectSettings/TagManager.asset | 0 .../ProjectSettings/TimeManager.asset | 0 .../ProjectSettings/UnityConnectSettings.asset | 0 .../unity_project}/ProjectSettings/VFXManager.asset | 0 .../ProjectSettings/VersionControlSettings.asset | 0 .../unity_project}/ProjectSettings/boot.config | 0 .../unity_project}/README.md | 0 88 files changed, 0 insertions(+), 0 deletions(-) rename native-apps/{unity_android_applink => unity_ii_applink}/README.md (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/.gitignore (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/Makefile (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/README.md (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/dfx.json (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/package-lock.json (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/package.json (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_backend/main.mo (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/assets/.ic-assets.json (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/assets/.well-known/assetlinks.json (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/assets/favicon.ico (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/assets/logo2.svg (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/assets/main.css (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/assets/sample-asset.txt (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/src/index.html (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/src/greet_frontend/src/index.js (100%) rename native-apps/{unity_android_applink/ii_integration_page => unity_ii_applink/ii_integration_dapp}/webpack.config.js (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/.gitignore (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Android.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Android/Plugins.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Android/Plugins/com.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Android/Plugins/com/icgamekit.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Android/Plugins/com/icgamekit/plugin.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Editor.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Editor/AndroidPostBuildProcessor.cs (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Editor/AndroidPostBuildProcessor.cs.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/Chaos.NaCl.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/Chaos.NaCl.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/Dahomey.Cbor.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/Dahomey.Cbor.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Agent.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Candid.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/LICENSE (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/LICENSE.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.Collections.Immutable.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.Collections.Immutable.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.Formats.Asn1.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.Formats.Asn1.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.IO.Pipelines.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.IO.Pipelines.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scenes.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scenes/SampleScene.unity (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scenes/SampleScene.unity.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/DelegationUtils.cs (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/DelegationUtils.cs.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/GreetingClient.cs (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/GreetingClient.cs.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/PluginProxy.cs (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/PluginProxy.cs.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/TestICPAgent.cs (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/Scripts/TestICPAgent.cs.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/test.keystore (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/Assets/test.keystore.meta (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/AudioManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/AutoStreamingSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/ClusterInputManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/DynamicsManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/EditorBuildSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/EditorSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/GraphicsSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/InputManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/MemorySettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/NavMeshAreas.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/PackageManagerSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/Physics2DSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/PresetManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/ProjectSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/ProjectVersion.txt (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/QualitySettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/TagManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/TimeManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/UnityConnectSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/VFXManager.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/VersionControlSettings.asset (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/ProjectSettings/boot.config (100%) rename native-apps/{unity_android_applink/android_integration => unity_ii_applink/unity_project}/README.md (100%) diff --git a/native-apps/unity_android_applink/README.md b/native-apps/unity_ii_applink/README.md similarity index 100% rename from native-apps/unity_android_applink/README.md rename to native-apps/unity_ii_applink/README.md diff --git a/native-apps/unity_android_applink/ii_integration_page/.gitignore b/native-apps/unity_ii_applink/ii_integration_dapp/.gitignore similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/.gitignore rename to native-apps/unity_ii_applink/ii_integration_dapp/.gitignore diff --git a/native-apps/unity_android_applink/ii_integration_page/Makefile b/native-apps/unity_ii_applink/ii_integration_dapp/Makefile similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/Makefile rename to native-apps/unity_ii_applink/ii_integration_dapp/Makefile diff --git a/native-apps/unity_android_applink/ii_integration_page/README.md b/native-apps/unity_ii_applink/ii_integration_dapp/README.md similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/README.md rename to native-apps/unity_ii_applink/ii_integration_dapp/README.md diff --git a/native-apps/unity_android_applink/ii_integration_page/dfx.json b/native-apps/unity_ii_applink/ii_integration_dapp/dfx.json similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/dfx.json rename to native-apps/unity_ii_applink/ii_integration_dapp/dfx.json diff --git a/native-apps/unity_android_applink/ii_integration_page/package-lock.json b/native-apps/unity_ii_applink/ii_integration_dapp/package-lock.json similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/package-lock.json rename to native-apps/unity_ii_applink/ii_integration_dapp/package-lock.json diff --git a/native-apps/unity_android_applink/ii_integration_page/package.json b/native-apps/unity_ii_applink/ii_integration_dapp/package.json similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/package.json rename to native-apps/unity_ii_applink/ii_integration_dapp/package.json diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_backend/main.mo b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_backend/main.mo similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_backend/main.mo rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_backend/main.mo diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/.ic-assets.json b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/.ic-assets.json similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/.ic-assets.json rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/.ic-assets.json diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/.well-known/assetlinks.json b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/.well-known/assetlinks.json similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/.well-known/assetlinks.json rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/.well-known/assetlinks.json diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/favicon.ico b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/favicon.ico similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/favicon.ico rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/favicon.ico diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/logo2.svg b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/logo2.svg similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/logo2.svg rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/logo2.svg diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/main.css b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/main.css similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/main.css rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/main.css diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/sample-asset.txt b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/sample-asset.txt similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/assets/sample-asset.txt rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/assets/sample-asset.txt diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/src/index.html b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/src/index.html similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/src/index.html rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/src/index.html diff --git a/native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/src/index.js b/native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/src/index.js similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/src/greet_frontend/src/index.js rename to native-apps/unity_ii_applink/ii_integration_dapp/src/greet_frontend/src/index.js diff --git a/native-apps/unity_android_applink/ii_integration_page/webpack.config.js b/native-apps/unity_ii_applink/ii_integration_dapp/webpack.config.js similarity index 100% rename from native-apps/unity_android_applink/ii_integration_page/webpack.config.js rename to native-apps/unity_ii_applink/ii_integration_dapp/webpack.config.js diff --git a/native-apps/unity_android_applink/android_integration/.gitignore b/native-apps/unity_ii_applink/unity_project/.gitignore similarity index 100% rename from native-apps/unity_android_applink/android_integration/.gitignore rename to native-apps/unity_ii_applink/unity_project/.gitignore diff --git a/native-apps/unity_android_applink/android_integration/Assets/Android.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Android.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Android.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Android/Plugins.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Android/Plugins.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java rename to native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java diff --git a/native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Editor.meta b/native-apps/unity_ii_applink/unity_project/Assets/Editor.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Editor.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Editor.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs b/native-apps/unity_ii_applink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs rename to native-apps/unity_ii_applink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs diff --git a/native-apps/unity_android_applink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs.meta b/native-apps/unity_ii_applink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Editor/AndroidPostBuildProcessor.cs.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Editor/AndroidPostBuildProcessor.cs.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Chaos.NaCl.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Chaos.NaCl.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Dahomey.Cbor.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Dahomey.Cbor.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.Cryptography.BLS.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Agent.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/EdjCase.ICP.Candid.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/LICENSE b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/LICENSE similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/LICENSE rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/LICENSE diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/LICENSE.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/LICENSE.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/LICENSE.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/LICENSE.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/Microsoft.Bcl.HashCode.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Collections.Immutable.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Collections.Immutable.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Formats.Asn1.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Formats.Asn1.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.IO.Pipelines.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.IO.Pipelines.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll diff --git a/native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta b/native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta rename to native-apps/unity_ii_applink/unity_project/Assets/ICP.NET/System.Runtime.CompilerServices.Unsafe.dll.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scenes.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scenes.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scenes.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scenes.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scenes/SampleScene.unity b/native-apps/unity_ii_applink/unity_project/Assets/Scenes/SampleScene.unity similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scenes/SampleScene.unity rename to native-apps/unity_ii_applink/unity_project/Assets/Scenes/SampleScene.unity diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scenes/SampleScene.unity.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scenes/SampleScene.unity.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scenes/SampleScene.unity.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scenes/SampleScene.unity.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scripts.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/DelegationUtils.cs b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/DelegationUtils.cs similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/DelegationUtils.cs rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/DelegationUtils.cs diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/DelegationUtils.cs.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/DelegationUtils.cs.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/DelegationUtils.cs.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/DelegationUtils.cs.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/GreetingClient.cs b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/GreetingClient.cs similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/GreetingClient.cs rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/GreetingClient.cs diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/GreetingClient.cs.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/GreetingClient.cs.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/GreetingClient.cs.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/GreetingClient.cs.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/PluginProxy.cs b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/PluginProxy.cs rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/PluginProxy.cs.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/PluginProxy.cs.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/TestICPAgent.cs b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/TestICPAgent.cs rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs diff --git a/native-apps/unity_android_applink/android_integration/Assets/Scripts/TestICPAgent.cs.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/Scripts/TestICPAgent.cs.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs.meta diff --git a/native-apps/unity_android_applink/android_integration/Assets/test.keystore b/native-apps/unity_ii_applink/unity_project/Assets/test.keystore similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/test.keystore rename to native-apps/unity_ii_applink/unity_project/Assets/test.keystore diff --git a/native-apps/unity_android_applink/android_integration/Assets/test.keystore.meta b/native-apps/unity_ii_applink/unity_project/Assets/test.keystore.meta similarity index 100% rename from native-apps/unity_android_applink/android_integration/Assets/test.keystore.meta rename to native-apps/unity_ii_applink/unity_project/Assets/test.keystore.meta diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/AudioManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/AudioManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/AudioManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/AudioManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/AutoStreamingSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/AutoStreamingSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/AutoStreamingSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/AutoStreamingSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/ClusterInputManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/ClusterInputManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/ClusterInputManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/ClusterInputManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/DynamicsManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/DynamicsManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/DynamicsManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/DynamicsManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/EditorBuildSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/EditorBuildSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/EditorBuildSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/EditorBuildSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/EditorSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/EditorSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/EditorSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/EditorSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/GraphicsSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/GraphicsSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/GraphicsSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/GraphicsSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/InputManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/InputManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/InputManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/InputManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/MemorySettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/MemorySettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/MemorySettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/MemorySettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/NavMeshAreas.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/NavMeshAreas.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/NavMeshAreas.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/NavMeshAreas.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/PackageManagerSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/PackageManagerSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/PackageManagerSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/PackageManagerSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/Physics2DSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/Physics2DSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/Physics2DSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/Physics2DSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/PresetManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/PresetManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/PresetManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/PresetManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/ProjectSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/ProjectSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/ProjectSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/ProjectSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/ProjectVersion.txt b/native-apps/unity_ii_applink/unity_project/ProjectSettings/ProjectVersion.txt similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/ProjectVersion.txt rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/ProjectVersion.txt diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/QualitySettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/QualitySettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/QualitySettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/QualitySettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/TagManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/TagManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/TagManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/TagManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/TimeManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/TimeManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/TimeManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/TimeManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/UnityConnectSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/UnityConnectSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/UnityConnectSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/UnityConnectSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/VFXManager.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/VFXManager.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/VFXManager.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/VFXManager.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/VersionControlSettings.asset b/native-apps/unity_ii_applink/unity_project/ProjectSettings/VersionControlSettings.asset similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/VersionControlSettings.asset rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/VersionControlSettings.asset diff --git a/native-apps/unity_android_applink/android_integration/ProjectSettings/boot.config b/native-apps/unity_ii_applink/unity_project/ProjectSettings/boot.config similarity index 100% rename from native-apps/unity_android_applink/android_integration/ProjectSettings/boot.config rename to native-apps/unity_ii_applink/unity_project/ProjectSettings/boot.config diff --git a/native-apps/unity_android_applink/android_integration/README.md b/native-apps/unity_ii_applink/unity_project/README.md similarity index 100% rename from native-apps/unity_android_applink/android_integration/README.md rename to native-apps/unity_ii_applink/unity_project/README.md From bf23f9f60af504879c66537e9760d7a9741f0fed Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Fri, 8 Sep 2023 17:10:37 +0800 Subject: [PATCH 09/32] Update readme files, simply the app link workflow which can be used by iOS integration in the future. --- native-apps/unity_ii_applink/README.md | 16 ++-- .../ii_integration_dapp/README.md | 2 +- .../unity_ii_applink/unity_project/.gitignore | 1 - .../unity_project/Assets/Android.meta | 8 -- .../unity_project/Assets/Android/Plugins.meta | 8 -- .../Assets/Android/Plugins/com.meta | 8 -- .../Assets/Android/Plugins/com/icgamekit.meta | 8 -- .../Android/Plugins/com/icgamekit/plugin.meta | 8 -- .../com/icgamekit/plugin/ICGameKitPlugin.java | 77 ------------------- .../plugin/ICGameKitPlugin.java.meta | 32 -------- .../Assets/Scripts/DeepLinkPlugin.cs | 47 +++++++++++ ...inProxy.cs.meta => DeepLinkPlugin.cs.meta} | 0 .../Assets/Scripts/PluginProxy.cs | 53 ------------- .../Assets/Scripts/TestICPAgent.cs | 49 ++++-------- .../unity_ii_applink/unity_project/README.md | 11 +-- 15 files changed, 77 insertions(+), 251 deletions(-) delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Android.meta delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins.meta delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com.meta delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit.meta delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta create mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Scripts/DeepLinkPlugin.cs rename native-apps/unity_ii_applink/unity_project/Assets/Scripts/{PluginProxy.cs.meta => DeepLinkPlugin.cs.meta} (100%) delete mode 100644 native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs diff --git a/native-apps/unity_ii_applink/README.md b/native-apps/unity_ii_applink/README.md index 9b815f2e7..8880d7407 100644 --- a/native-apps/unity_ii_applink/README.md +++ b/native-apps/unity_ii_applink/README.md @@ -1,12 +1,12 @@ # Internet Identity Integration This sample shows one way to integrate Internet Identity with Android apps. It contains two parts: a dapp with II integrated, and an Unity Project which interacts with this dapp. -## ii_integration_page +## ii_integration_dapp It's an example that integrates with Internet Identity, with the backend and frontend. It derives from the [Internet Identity integration sample](https://github.com/dfinity/examples/tree/master/motoko/internet_identity_integration) demo with some modifications. -Please refer to [README](./ii_integration_page/README.md) for details. +Please refer to [README](./ii_integration_dapp/README.md) for details. -## android_integration -This is a Unity project with [ICP.NET](https://github.com/BoomDAO/ICP.NET) embedded, which is a C# agent that is able to communicate with the IC from C#. Please refer to [README](./android_integration/README.md) for details. +## unity_project +This is a Unity project with [ICP.NET](https://github.com/BoomDAO/ICP.NET) embedded, which is a C# agent that is able to communicate with the IC from C#. Please refer to [README](./unity_project/README.md) for details. ## Workflow Before continuing, please read through the [Android App Links](https://developer.android.com/studio/write/app-link-indexing) to understand how Android App Links works. @@ -15,10 +15,10 @@ Here is the basic workflow that how to integrate with Internet Identity from a U The steps in detail are described below: -1. Set up an [Internet Identity integration dapp](#ii_integration_page) which supports logging in with II, with an `assetlinks.json` file associated. - Please refer to [ii_integration_page](./ii_integration_page/README.md) to set up the dapp. -2. Run a Unity game on Android, which is built from [android_integration sample](#android_integration). - Please refer to [android_integration](./android_integration/README.md) to build the Unity Android game. +1. Set up an [Internet Identity integration dapp](#ii_integration_dapp) which supports logging in with II, with an `assetlinks.json` file associated. + Please refer to [ii_integration_dapp](./ii_integration_dapp/README.md) to set up the dapp. +2. Run a Unity game on Android, which is built from [android_integration sample](#unity_project). + Please refer to [unity_project](./unity_project/README.md) to build the Unity Android game. 3. Launch the Web Browser from the game to open the dapp frontend deployed in #1, with the public key of `Ed25519Identity` as a parameter. 4. Login with your Internet Identity in the Web Browser. 5. Launch the application via App Links, and pass the `DelegationIdentity` back to the game as the URL parameter. diff --git a/native-apps/unity_ii_applink/ii_integration_dapp/README.md b/native-apps/unity_ii_applink/ii_integration_dapp/README.md index 112af6a4b..4592266ea 100644 --- a/native-apps/unity_ii_applink/ii_integration_dapp/README.md +++ b/native-apps/unity_ii_applink/ii_integration_dapp/README.md @@ -42,7 +42,7 @@ Here is an example of [.ic-assets.json](./src/greet_frontend/assets/.ic-assets.j Once you set up the IC development environment locally and update the example as you want, you can follow the below steps to deploy to the IC mainnet. -1. Enter the `ii_integration_page` directory from the command line +1. Enter the `ii_integration_dapp` directory from the command line 2. Run `npm install` to install the npm packages 3. Run `dfx start --background` 4. Run `dfx deploy --network=ic --with-cycles=1000000000000` diff --git a/native-apps/unity_ii_applink/unity_project/.gitignore b/native-apps/unity_ii_applink/unity_project/.gitignore index 0e69084d4..8af868e8e 100644 --- a/native-apps/unity_ii_applink/unity_project/.gitignore +++ b/native-apps/unity_ii_applink/unity_project/.gitignore @@ -24,7 +24,6 @@ # Gradle cache directory .gradle/ -gradle/ # Autogenerated VS/MD/Consulo solution and project files ExportedObj/ diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Android.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android.meta deleted file mode 100644 index 9b91e55e8..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Android.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2655c98839f2a3d45832406122f52a08 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins.meta deleted file mode 100644 index 4e7a3f552..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9bc52b823e4726e4c992caabcb215c49 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com.meta deleted file mode 100644 index 8d353af3b..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c8fae1178b05d304f9b65266d78c7861 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit.meta deleted file mode 100644 index a38c11962..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 22bfb1d087e132d49aee8d6b77c16596 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta deleted file mode 100644 index 986985373..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3649a729052c9154f92028141feef64c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java deleted file mode 100644 index 910557683..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.icgamekit.plugin; - -import android.content.Intent; -import android.net.Uri; -import android.util.Log; - -import com.unity3d.player.UnityPlayer; - -import java.io.File; -import java.io.FileOutputStream; - -public class ICGameKitPlugin { - static final String TAG_PLUGIN = "ICGameKitPlugin"; - - public static ICGameKitPlugin sCurrentPlugin; - - public static ICGameKitPlugin initImpl() { - if (sCurrentPlugin != null) - return sCurrentPlugin; - - sCurrentPlugin = new ICGameKitPlugin(); - - return sCurrentPlugin; - } - - public void openBrowser(String url) { - Log.i(TAG_PLUGIN, url); - - //String url = "https://6x7nu-oaaaa-aaaan-qdaua-cai.ic0.app"; - Uri uri = Uri.parse(url); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - UnityPlayer.currentActivity.startActivity(intent); - } - - public void sendMessage(String[] arguments) { - if (arguments == null || arguments.length != 2) - return; - - String gameObjectName = arguments[0]; - String methodName = arguments[1]; - - if (gameObjectName == null || gameObjectName.length() == 0 - || methodName == null || methodName.length() == 0) - return; - - Uri uri = UnityPlayer.currentActivity.getIntent().getData(); - if (uri == null) - return; - - String url = uri.toString(); - int index = url.indexOf("delegation="); - if (index == -1) - return; - - String delegation = url.substring(index); - //Log.i(TAG_PLUGIN, delegation); - - // Write to a temporary file to internal storage and read it back from C# side. - // The reason is we can only pass 1024 bytes as string back to the C# side, but the params string with delegation is more than 3k bytes. - String delegationPath = UnityPlayer.currentActivity.getFilesDir().getPath() + "/delegation.file"; - File delegationFile = new File(delegationPath); - try { - if (delegationFile.exists()) - delegationFile.delete(); - - FileOutputStream fileOutputStream = new FileOutputStream(delegationFile); - fileOutputStream.write(delegation.getBytes()); - fileOutputStream.flush(); - fileOutputStream.close(); - } catch (Exception e) { - e.printStackTrace(); - } - - // Pass the delegation path back to C#. - UnityPlayer.UnitySendMessage(gameObjectName, methodName, delegationPath); - } -} diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta b/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta deleted file mode 100644 index cce2dbea9..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java.meta +++ /dev/null @@ -1,32 +0,0 @@ -fileFormatVersion: 2 -guid: 7e6eb76733b18a441bc73656627d8f52 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Android: Android - second: - enabled: 1 - settings: {} - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Scripts/DeepLinkPlugin.cs b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/DeepLinkPlugin.cs new file mode 100644 index 000000000..7e297d3d2 --- /dev/null +++ b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/DeepLinkPlugin.cs @@ -0,0 +1,47 @@ +using UnityEngine; +using EdjCase.ICP.Candid.Utilities; +using Newtonsoft.Json; +using System.Web; + +namespace IC.GameKit +{ + public class DeepLinkPlugin : MonoBehaviour + { + TestICPAgent mTestICPAgent = null; + + private void Awake() + { + // Register action for deep link activated. + Application.deepLinkActivated += OnDeepLinkActivated; + } + + public void Start() + { + mTestICPAgent = gameObject.GetComponent(); + } + + public void OpenBrowser() + { + var target = mTestICPAgent.greetFrontend + "?sessionkey=" + ByteUtil.ToHexString(mTestICPAgent.TestIdentity.PublicKey.Value); + Application.OpenURL(target); + } + + public void OnDeepLinkActivated(string url) + { + if (string.IsNullOrEmpty(url)) + return; + + const string kDelegationParam = "delegation="; + var indexOfDelegation = url.IndexOf(kDelegationParam); + if (indexOfDelegation == -1) + { + Debug.LogError("Cannot find delegation"); + return; + } + + var delegationString = HttpUtility.UrlDecode(url.Substring(indexOfDelegation + kDelegationParam.Length)); + var delegation = JsonConvert.DeserializeObject(delegationString); + mTestICPAgent.Delegation = delegation; + } + } +} diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs.meta b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/DeepLinkPlugin.cs.meta similarity index 100% rename from native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs.meta rename to native-apps/unity_ii_applink/unity_project/Assets/Scripts/DeepLinkPlugin.cs.meta diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs deleted file mode 100644 index 3bdf44b2d..000000000 --- a/native-apps/unity_ii_applink/unity_project/Assets/Scripts/PluginProxy.cs +++ /dev/null @@ -1,53 +0,0 @@ -using UnityEngine; -using EdjCase.ICP.Candid.Utilities; - -namespace IC.GameKit -{ - public class PluginProxy : MonoBehaviour - { - const string kGameObjectName = "AgentAndPlugin"; - const string kMethodName = "OnMessageSent"; - - public string greetFrontend = "https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io"; - - TestICPAgent mTestICPAgent = null; - -#if UNITY_ANDROID - private AndroidJavaObject mPlugin = null; -#endif - - public void Start() - { - mTestICPAgent = gameObject.GetComponent(); - -#if UNITY_ANDROID - var pluginClass = new AndroidJavaClass("com.icgamekit.plugin.ICGameKitPlugin"); - mPlugin = pluginClass.CallStatic("initImpl"); -#endif - } - - public void OpenBrowser() - { - var target = greetFrontend + "?sessionkey=" + ByteUtil.ToHexString(mTestICPAgent.TestIdentity.PublicKey.Value); - -#if UNITY_ANDROID - mPlugin.Call("openBrowser", target); -#endif - } - - public void OnApplicationPause(bool pause) - { - // If it's resuming. - if (!pause) - { -#if UNITY_ANDROID - // OnApplicationPause will be called while launching the app, before mPlugin is initialized. - if (mPlugin == null) - return; - - mPlugin.Call("sendMessage", new string[] { kGameObjectName, kMethodName }); -#endif - } - } - } -} diff --git a/native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs index 52a379a08..98c60208a 100644 --- a/native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs +++ b/native-apps/unity_ii_applink/unity_project/Assets/Scripts/TestICPAgent.cs @@ -8,15 +8,14 @@ using System.Collections.Generic; using EdjCase.ICP.Agent.Models; using System; -using System.IO; -using Newtonsoft.Json; -using System.Web; namespace IC.GameKit { public class TestICPAgent : MonoBehaviour { + public string greetFrontend = "https://6x7nu-oaaaa-aaaan-qdaua-cai.icp0.io/"; public string greetBackendCanister = "72rj2-biaaa-aaaan-qdatq-cai"; + Text mMyPrincipalText = null; Button mGreetButton = null; Ed25519Identity mEd25519Identity = null; @@ -24,6 +23,19 @@ public class TestICPAgent : MonoBehaviour public Ed25519Identity TestIdentity { get { return mEd25519Identity; } } + internal DelegationChainModel Delegation { + get { return mDelegation; } + set + { + mDelegation = value; + + if (mDelegation != null && mGreetButton != null) + { + mGreetButton.interactable = true; + } + } + } + // Start is called before the first frame update void Start() { @@ -41,33 +53,6 @@ void Update() { } - public void OnMessageSent(string delegationPath) - { - if (string.IsNullOrEmpty(delegationPath) || !File.Exists(delegationPath)) - return; - - //Debug.Log("Identity path '" + identityPath + "' exists."); - - var parameters = File.ReadAllText(delegationPath); - //Debug.Log("Params length is: " + parameters.Length); - - const string kDelegationParam = "delegation="; - var indexOfDelegation = parameters.IndexOf(kDelegationParam); - if (indexOfDelegation == -1) - { - Debug.LogError("Cannot find delegation"); - return; - } - - var delegationString = HttpUtility.UrlDecode(parameters.Substring(indexOfDelegation + kDelegationParam.Length)); - mDelegation = JsonConvert.DeserializeObject(delegationString); - - if (mDelegation != null && mGreetButton != null) - { - mGreetButton.interactable = true; - } - } - public void Greet() { if (mDelegation == null) @@ -99,9 +84,9 @@ private async void CallCanister(DelegationChainModel delegationChainModel) // Initialize HttpAgent. var agent = new HttpAgent(delegationIdentity); - Principal canisterId = Principal.FromText(greetBackendCanister); + var canisterId = Principal.FromText(greetBackendCanister); - // Intialize Client and make the call. + // Intialize the client and make the call. var client = new GreetingClient.GreetingClient(agent, canisterId); var content = await client.Greet(); diff --git a/native-apps/unity_ii_applink/unity_project/README.md b/native-apps/unity_ii_applink/unity_project/README.md index 2aec328cd..fbdc33bdd 100644 --- a/native-apps/unity_ii_applink/unity_project/README.md +++ b/native-apps/unity_ii_applink/unity_project/README.md @@ -3,9 +3,9 @@ This sample demonstrates one way to integrate Identity Integration with Unity on ## Overview -In this example, you can learn how to communicate with the IC from C#. As we described in [Internet Identity Integration](../unity_android_deeplink/README.md#workflow), the game mainly focuses on: +In this example, you can learn how to communicate with the IC from C#. As we described in [Internet Identity Integration](../README.md#workflow), the game mainly focuses on: -1. Provide an Android Java plugin which can be a bridge between C# and the browser. +1. Provide a plugin to handle the communication between C# and the browser. 2. Register the App Links in the Android manifest file. 3. Generate the `Ed25519KeyIdentity` in C# and pass the public key to the Web Brower. 4. Receive the `DelegationIdentity` from the Web Brower and pass it from Java to C#. @@ -15,14 +15,11 @@ In this example, you can learn how to communicate with the IC from C#. As we des There're several important files in this example. -- [ICGameKitPlugin.java](./Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java) - This is a Unity Android native plugin written in java, provided with functions including opening browser, sending messages back to Unity. - - [AndroidPostBuildProcessor.cs](./Assets/Editor/AndroidPostBuildProcessor.cs) This is a Unity post-build processor for Android platform, which inserts the App Links URL scheme into the AndroidManifest.xml. -- [PluginProxy.cs](./Assets/Scripts/PluginProxy.cs) - PluginProxy works as a bridge between Unity C# and Android Java, which calls the functions inside [ICGameKitPlugin.java](./Assets/Android/Plugins/com/icgamekit/plugin/ICGameKitPlugin.java). +- [DeepLinkPlugin.cs](./Assets/Scripts/DeepLinkPlugin.cs) + It's a plugin which provides functions to open the web browser, handle the DeepLink activation, and parse the delegation from Json string. - [GreetingClient.cs](./Assets/Scripts/GreetingClient.cs) This provides the C# APIs for calling the Greeting backend canister in [ii_integration_page](../ii_integration_page/README.md). It can be generated by running the `ClientGenerator` provided by [ICP.NET](https://github.com/BoomDAO/ICP.NET). From 9d778fa16de1597ac64ffd30d177c900b275d70f Mon Sep 17 00:00:00 2001 From: Kristofer Date: Tue, 12 Sep 2023 13:33:54 +0200 Subject: [PATCH 10/32] Add ic-pos to motoko examples --- motoko/ic-pos/.eslintrc.cjs | 14 + motoko/ic-pos/.gitignore | 34 + motoko/ic-pos/.yarn/install-state.gz | Bin 0 -> 467051 bytes motoko/ic-pos/CHANGELOG.md | 29 + motoko/ic-pos/LICENSE | 7 + motoko/ic-pos/README.md | 231 + motoko/ic-pos/canister_ids.json | 8 + motoko/ic-pos/components.json | 15 + motoko/ic-pos/dfx.json | 62 + motoko/ic-pos/media/header.png | Bin 0 -> 40928 bytes motoko/ic-pos/package.json | 87 + motoko/ic-pos/postcss.config.js | 6 + motoko/ic-pos/src/.env.template | 37 + .../src/declarations/icpos/icpos.did.d.ts | 23 + .../src/declarations/icpos/icpos.did.js | 29 + .../ic-pos/src/declarations/icpos/index.d.ts | 50 + motoko/ic-pos/src/declarations/icpos/index.js | 44 + .../icpos_frontend/icpos_frontend.did | 228 + .../icpos_frontend/icpos_frontend.did.d.ts | 215 + .../icpos_frontend/icpos_frontend.did.js | 245 + .../declarations/icpos_frontend/index.d.ts | 50 + .../src/declarations/icpos_frontend/index.js | 45 + .../declarations/internet_identity/index.d.ts | 50 + .../declarations/internet_identity/index.js | 44 + .../internet_identity/internet_identity.did | 468 ++ .../internet_identity.did.d.ts | 272 + .../internet_identity.did.js | 340 ++ .../icpos/ckbtc-ledger/ckbtc-ledger.types.mo | 52 + motoko/ic-pos/src/icpos/http/http.types.mo | 57 + motoko/ic-pos/src/icpos/main.mo | 270 + motoko/ic-pos/src/icpos/main.types.mo | 16 + motoko/ic-pos/src/icpos_frontend/App.tsx | 45 + .../src/icpos_frontend/assets/ckBTC.svg | 19 + .../icpos_frontend/assets/dfinity-logo.png | Bin 0 -> 55438 bytes .../auth/context/AuthProvider.tsx | 91 + .../src/icpos_frontend/auth/hooks/useAuth.tsx | 5 + .../auth/types/auth-context.type.ts | 15 + .../ckbtc-index/hooks/useCkBtcIndex.tsx | 27 + .../ckbtc-ledger/hooks/useCkBtcLedger.tsx | 52 + .../ckbtc-ledger/hooks/useCkBtcLedgerAnon.tsx | 44 + .../canisters/ic-pos/hooks/useIcPos.tsx | 58 + .../canisters/ic-pos/state/merchant.state.ts | 12 + .../canisters/icrc/types/transfer.type.ts | 10 + .../components/FullpageLoading.tsx | 12 + .../components/HeaderSection.tsx | 9 + .../components/HistoryButton.tsx | 24 + .../icpos_frontend/components/MainSection.tsx | 5 + .../src/icpos_frontend/components/Page.tsx | 10 + .../components/PrincipalPill.tsx | 36 + .../icpos_frontend/components/QRReader.tsx | 33 + .../icpos_frontend/components/ui/button.tsx | 56 + .../src/icpos_frontend/components/ui/form.tsx | 178 + .../icpos_frontend/components/ui/input.tsx | 25 + .../icpos_frontend/components/ui/label.tsx | 23 + .../icpos_frontend/components/ui/switch.tsx | 27 + motoko/ic-pos/src/icpos_frontend/index.css | 92 + motoko/ic-pos/src/icpos_frontend/main.tsx | 17 + .../pages/charge/ChargePage.tsx | 62 + .../pages/charge/components/ChargeButton.tsx | 15 + .../pages/charge/components/KeyPad.tsx | 20 + .../pages/charge/components/KeyPadButton.tsx | 14 + .../pages/charge/types/key.type.ts | 13 + .../pages/config/ConfigPage.tsx | 38 + .../pages/config/components/ConfigForm.tsx | 207 + .../pages/history/HistoryPage.tsx | 72 + .../history/components/TransactionRow.tsx | 46 + .../initial-config/InitialConfigPage.tsx | 34 + .../initial-config/components/ConfigForm.tsx | 98 + .../pages/merchant/MerchantPage.tsx | 88 + .../merchant/components/ChargeButton.tsx | 12 + .../pages/merchant/components/SendButton.tsx | 12 + .../pages/not-found/NotFoundPage.tsx | 21 + .../ReceiveSelectPrincipalPage.tsx | 61 + .../components/SelectPrincipalForm.tsx | 86 + .../pages/receive/ReceivePage.tsx | 82 + .../receive/components/TransactionOverlay.tsx | 117 + .../icpos_frontend/pages/send/SendPage.tsx | 82 + .../pages/send/components/SendForm.tsx | 159 + .../icpos_frontend/pages/start/StartPage.tsx | 45 + .../pages/start/components/LoginButton.tsx | 13 + motoko/ic-pos/src/icpos_frontend/router.tsx | 98 + .../icpos_frontend/utils/convertToBigInt.ts | 3 + .../src/icpos_frontend/utils/formatCkBtc.ts | 10 + .../icpos_frontend/utils/principalToString.ts | 9 + .../ic-pos/src/icpos_frontend/utils/shadcn.ts | 6 + .../icpos_frontend/utils/shortenPrincipal.ts | 8 + .../ic-pos/src/icpos_frontend/vite-env.d.ts | 3 + motoko/ic-pos/src/index.html | 16 + motoko/ic-pos/src/public/cash-register.mp3 | Bin 0 -> 45120 bytes motoko/ic-pos/src/public/ckBTC.svg | 19 + motoko/ic-pos/tailwind.config.js | 80 + motoko/ic-pos/tsconfig.json | 25 + motoko/ic-pos/tsconfig.node.json | 10 + motoko/ic-pos/vite.config.ts | 16 + motoko/ic-pos/yarn.lock | 4673 +++++++++++++++++ 95 files changed, 10326 insertions(+) create mode 100644 motoko/ic-pos/.eslintrc.cjs create mode 100644 motoko/ic-pos/.gitignore create mode 100644 motoko/ic-pos/.yarn/install-state.gz create mode 100644 motoko/ic-pos/CHANGELOG.md create mode 100644 motoko/ic-pos/LICENSE create mode 100644 motoko/ic-pos/README.md create mode 100644 motoko/ic-pos/canister_ids.json create mode 100644 motoko/ic-pos/components.json create mode 100644 motoko/ic-pos/dfx.json create mode 100644 motoko/ic-pos/media/header.png create mode 100644 motoko/ic-pos/package.json create mode 100644 motoko/ic-pos/postcss.config.js create mode 100644 motoko/ic-pos/src/.env.template create mode 100644 motoko/ic-pos/src/declarations/icpos/icpos.did.d.ts create mode 100644 motoko/ic-pos/src/declarations/icpos/icpos.did.js create mode 100644 motoko/ic-pos/src/declarations/icpos/index.d.ts create mode 100644 motoko/ic-pos/src/declarations/icpos/index.js create mode 100644 motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did create mode 100644 motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.d.ts create mode 100644 motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.js create mode 100644 motoko/ic-pos/src/declarations/icpos_frontend/index.d.ts create mode 100644 motoko/ic-pos/src/declarations/icpos_frontend/index.js create mode 100644 motoko/ic-pos/src/declarations/internet_identity/index.d.ts create mode 100644 motoko/ic-pos/src/declarations/internet_identity/index.js create mode 100644 motoko/ic-pos/src/declarations/internet_identity/internet_identity.did create mode 100644 motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.d.ts create mode 100644 motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.js create mode 100644 motoko/ic-pos/src/icpos/ckbtc-ledger/ckbtc-ledger.types.mo create mode 100644 motoko/ic-pos/src/icpos/http/http.types.mo create mode 100644 motoko/ic-pos/src/icpos/main.mo create mode 100644 motoko/ic-pos/src/icpos/main.types.mo create mode 100644 motoko/ic-pos/src/icpos_frontend/App.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/assets/ckBTC.svg create mode 100644 motoko/ic-pos/src/icpos_frontend/assets/dfinity-logo.png create mode 100644 motoko/ic-pos/src/icpos_frontend/auth/context/AuthProvider.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/auth/hooks/useAuth.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/auth/types/auth-context.type.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-index/hooks/useCkBtcIndex.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedger.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedgerAnon.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/hooks/useIcPos.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/state/merchant.state.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/canisters/icrc/types/transfer.type.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/components/FullpageLoading.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/HeaderSection.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/HistoryButton.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/MainSection.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/Page.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/PrincipalPill.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/QRReader.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/ui/button.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/ui/form.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/ui/input.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/ui/label.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/components/ui/switch.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/index.css create mode 100644 motoko/ic-pos/src/icpos_frontend/main.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/charge/ChargePage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/charge/components/ChargeButton.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/charge/components/KeyPad.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/charge/components/KeyPadButton.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/charge/types/key.type.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/config/ConfigPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/config/components/ConfigForm.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/history/HistoryPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/history/components/TransactionRow.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/initial-config/InitialConfigPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/initial-config/components/ConfigForm.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/merchant/MerchantPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/merchant/components/ChargeButton.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/merchant/components/SendButton.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/not-found/NotFoundPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/receive-select-principal/ReceiveSelectPrincipalPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/receive-select-principal/components/SelectPrincipalForm.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/receive/ReceivePage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/receive/components/TransactionOverlay.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/send/SendPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/send/components/SendForm.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/start/StartPage.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/pages/start/components/LoginButton.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/router.tsx create mode 100644 motoko/ic-pos/src/icpos_frontend/utils/convertToBigInt.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/utils/formatCkBtc.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/utils/principalToString.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/utils/shadcn.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/utils/shortenPrincipal.ts create mode 100644 motoko/ic-pos/src/icpos_frontend/vite-env.d.ts create mode 100644 motoko/ic-pos/src/index.html create mode 100644 motoko/ic-pos/src/public/cash-register.mp3 create mode 100644 motoko/ic-pos/src/public/ckBTC.svg create mode 100644 motoko/ic-pos/tailwind.config.js create mode 100644 motoko/ic-pos/tsconfig.json create mode 100644 motoko/ic-pos/tsconfig.node.json create mode 100644 motoko/ic-pos/vite.config.ts create mode 100644 motoko/ic-pos/yarn.lock diff --git a/motoko/ic-pos/.eslintrc.cjs b/motoko/ic-pos/.eslintrc.cjs new file mode 100644 index 000000000..4020bcbf4 --- /dev/null +++ b/motoko/ic-pos/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + }, +} diff --git a/motoko/ic-pos/.gitignore b/motoko/ic-pos/.gitignore new file mode 100644 index 000000000..b2e288695 --- /dev/null +++ b/motoko/ic-pos/.gitignore @@ -0,0 +1,34 @@ +# Various IDEs and Editors +.vscode/ +.idea/ +**/*~ + +# Mac OSX temporary files +.DS_Store +**/.DS_Store + +# dfx temporary files +.dfx/ + +# rust +target/ + +# frontend code +node_modules/ +dist/ + +# environment variables +.env + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# yarn cache +.yarn/cache + +# misc +scratch/ diff --git a/motoko/ic-pos/.yarn/install-state.gz b/motoko/ic-pos/.yarn/install-state.gz new file mode 100644 index 0000000000000000000000000000000000000000..257940e496c55c9fa9c6c3a5a895f25e65f8c038 GIT binary patch literal 467051 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ℜnonpnr&%kj4%Ce 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

wNf7-u%M(QY}CXbf+&o3T4MPt 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 pH$bs3ronPC=u*lYmq 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

yJ5;|Dd%bXkGnDb-PVo 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

s==;Gl_DBHqLCQehL*Mla(0p`?@LT} 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 literal 0 HcmV?d00001 diff --git a/motoko/ic-pos/CHANGELOG.md b/motoko/ic-pos/CHANGELOG.md new file mode 100644 index 000000000..e24531075 --- /dev/null +++ b/motoko/ic-pos/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelog + +## [0.3.0] - 2022-09-10 + +### Added + +- Now you can charge a set amount, similar to Sumup and the likes. Enter the amount to charge and click the "Charge" button. The generated QR code will contain information about the token and amount to charge. The customer can then scan and pay with any wallet that supports the QR format, NNS for instance. Raad more about ICRC-22 payment requests: https://github.com/dfinity/ICRC/issues/22 + +### Fixed + +- Improved printing styles, QR code now fills more of the page. + +## [0.2.0] - 2022-09-06 + +### Added + +- Principal pills are now clickable. Click to copy the principal id to the clipboard. + +### Changed + +- The `icpos` canister continuoulsy monitors the ckBTC ledger and sends notifications to merchants that choosen to receive email or sms. The ledger id used to be hardcode, now there is a function `setLedgerId` that can be called at runtime. +- `dfx.json`: settings now included to run an ICRC-1 ledger and index locally. +- Upgraded to latest versions of `@dfinity/xxx` packages. +- Removed reliance on the HTTP ckBTC transaction API. Instead, IC-POS now uses the ledger canister directly to monitor transactions. +- ckBTC balances are now updated in the UI after received transfers. + +## [0.1.0] + +Initial release. diff --git a/motoko/ic-pos/LICENSE b/motoko/ic-pos/LICENSE new file mode 100644 index 000000000..0ff9c84d0 --- /dev/null +++ b/motoko/ic-pos/LICENSE @@ -0,0 +1,7 @@ +Copyright 2023 Kristofer Lund + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/motoko/ic-pos/README.md b/motoko/ic-pos/README.md new file mode 100644 index 000000000..e129d0f56 --- /dev/null +++ b/motoko/ic-pos/README.md @@ -0,0 +1,231 @@ +![](./media/header.png) + +# IC-POS + +IC-POS is an experimental app to demonstrate a real world use case for ckBTC on the Internet Computer. It is a simple Point of Sale app that allows users to accept ckBTC payments. + +The Internet Computer [integrates directly with the Bitcoin network](https://internetcomputer.org/docs/current/developer-docs/integrations/bitcoin/). This allows canisters on the Internet Computer to receive, hold, and send Bitcoin, all directly with transactions on the Bitcoin network. Chain-key Bitcoin (ckBTC) is an ICRC-1-compliant token that is backed 1:1 by Bitcoin held 100% on the IC mainnet. + +For deeper understanding of the ICP < > BTC integration, see the IC wiki article on [Bitcoin integration](https://wiki.internetcomputer.org/wiki/Bitcoin_Integration). + +## Features + +- **Create store**: Users logs in with their Internet Identity and configure the store with a name and other settings. +- **Charge customer**: Users can charge a customer by entering an amount. This will generate and display a QR code for the customer to scan and pay. QR code follows the ICR-22 standard. +- **Send tokens**: Users can send ckBTC tokens to other users. +- **Receive notifications**: Users can choose to receive notifications by email or SMS when a payment is received. This uses the [HTTP Outcall](https://internetcomputer.org/docs/current/developer-docs/integrations/https-outcalls/) feature of the Internet Computer. +- **Transaction history**: Users can view a list of transactions made to the store. + +## Try it! + +IC-POS is deployed on the Internet Computer. You can try it out here: + +https://hngac-6aaaa-aaaal-qb6tq-cai.icp0.io/ + +https://github.com/kristoferlund/ic-pos/assets/9698363/f67d9952-3ee1-4876-a5e5-6ed0e29bae9d + +## Architecture + +### Backend + +The backend is written in Motoko and consist of one canister, `icpos`. It exposes four public methods: + +- `getMerchant` - returns the store configuration for a given principal. +- `updateMerchant` - updates the store configuration for a given principal. +- `setCourierApiKey` - sets the Courier API key used to send email and SMS notifications. Only the canister controller can call this method. +- `setLedgerId` - sets the ledger id to monitor for transactions. Only the canister controller can call this method. +- `getLogs` - The canister maintains a debug log that can be fetched using this method. + +In addition to the public methods, the canister uses a [timer](https://internetcomputer.org/docs/current/motoko/main/timers/) to monitor ledger transactions. When a new transaction is found that matches a configured store – depending on the store settings – the canister will send a notification either by email or SMS. + +### Frontend + +The frontend is written in Typescript/Vite/React/TailwindCSS. Users authenticate using the Internet Identity to access their store. The first time a user logs in, a store is created for them. + +The frontend interacts with the following IC canisters: + +- `icpos` - to fetch and update store configuration. +- `ckbtc ledger` - to send ckBTC to other users. +- `ckbtc index` - to fetch transaction history. +- `internet identity` - to authenticate users. + +# Local deployment + +## Prerequisites + +- [x] Install the [IC SDK](https://internetcomputer.org/docs/current/developer-docs/setup/install/index.mdx). + +### Step 1: Start a local instance of the Internet Computer + +```bash +dfx start --background +``` + +### Step 2: Deploy the Internet Identity canister + +Integration with the [Internet Identity](https://internetcomputer.org/internet-identity/) allows store owners to securely setup and manage their store. The Internet Identity canister is already deployed on the IC mainnet. For local development, you need to deploy it to your local instance of the IC. + +```bash +dfx deploy --network local internet_identity +``` + +### Step 3: Save current principal as a variable + +The principal will be used when deploying the ledger canister. + +```bash +export OWNER=$(dfx identity get-principal) +``` + +### Step 3: Deploy the ckBTC ledger canister + +The responsibilities of the ledger canister is to keep track of token balances and handle token transfers. + +The ckBTC ledger canister is already deployed on the IC mainnet. ckBTC implements the [ICRC-1](https://internetcomputer.org/docs/current/developer-docs/integrations/icrc-1/) token standard. For local development, we deploy the ledger for an ICRC-1 token mimicking the mainnet setup. + +Take a moment to read the details of the call we are making below. Not only are we deploying the ledger canister, we are also: + +- Naming the token `Local ckBTC / LCKBTC` +- Setting the owner principal to the principal we saved in the previous step. +- Minting 100_000_000_000 tokens to the owner principal. +- Setting the transfer fee to 10 LCKBTC. + +```bash +dfx deploy --network local icrc1-ledger --argument ' + (variant { + Init = record { + token_name = "Local ckBTC"; + token_symbol = "LCKBTC"; + minting_account = record { owner = principal "'${OWNER}'";}; + initial_balances = vec { record { record { owner = principal "'${OWNER}'";}; 100_000_000_000; }; }; + metadata = vec {}; + transfer_fee = 10; + archive_options = record { + trigger_threshold = 2000; + num_blocks_to_archive = 1000; + controller_id = principal "'${OWNER}'"; + } + } + }) +' +``` + +### Step 4: Save the ledger principal as a variable + +We need this information in the next step, when deploying the index canister. + +```bash +export LEDGER_PRINCIPAL=$(dfx canister --network local id icrc1-ledger) +``` + +### Step 5: Deploy the index canister + +The index canister syncs the ledger transactions and indexes them by account. + +```bash +dfx deploy --network local icrc1-index --argument ' + record { + ledger_id = (principal "'${LEDGER_PRINCIPAL}'"); + } +' +``` + +### Step 6: Deploy the icpos canister + +The icpos canister manages the store configuration and sends notifications when a payment is received. + +The `--argument '(0)'` argument is used to initialize the canister with `startBlock` set to 0. This is used to tell the canister to start monitoring the ledger from block 0. When deploying to the IC mainnet, this should be set to the current block height to prevent the canister from processing old transactions. + +```bash +dfx deploy --network local icpos --argument '(0)' +``` + +### Step 7: Configure the icpos canister + +The icpos canister needs to be configured with the ledger id to be able to monitor for new transactions and send notifications. + +```bash +dfx canister --network local call icpos setLedgerId "${LEDGER_PRINCIPAL}" +``` + +ic-pos uses [Courier](https://courier.com/) to send email and SMS notifications. If you want to enable notifications, you need to sign up for a Courier account and and create and API key. Then issue the following command: + +```bash +dfx canister --network local call icpos setCourierApiKey "pk_prod_..." +``` + +### Step 8 - Setup `.env` for the frontend environment + +The frontend needs information about how to access the canisters. This is done by setting environment variables. Copy the `.env.template` file and rename it to `.env`. Then update the values to match your local setup. + +```bash +cp src/.env.template src/.env +``` + +### Step 9: Build and run the frontend + +Run yarn to install dependencies and start the frontend. The frontend will be available at http://localhost:5173. + +```bash +yarn +yarn dev +``` + +Why don't we deploy the frontend as a local canister? Vite uses lazy loading of modules. This does not work when deploying to a local canister. When deploying to the IC mainnet, this is not an issue. Also, running using `yarn dev` allows for hot reloading of the frontend code when making changes. + +### Step 10: Make a transfer! + +Now that everything is up and running, you can make a transfer to your newly created store. + +Transfers made from the owner principal will not trigger notifications in the UI since they are regarded as `mint` transactions. To test notifications, you need to make a transfer from another principal. + +The easiest way to do this is to create two stores using two different Internet Identity accounts, using two different web browsers. Then, transfer some tokens from one store to the other. + +#### 10.1: Create the first store and supply it with some tokens + +Log in to the frontend using the Internet Identity. Configure the store and navigate to the `Receive` page. Click on the principal pill to copy the address to your clipboard. Then, using the `dfx` command, mint some tokens from your owner principal to the store principal. + +```bash +dfx canister --network local call icrc1-ledger icrc1_transfer ' + (record { + to=(record { + owner=(principal "[STORE PRINCIPAL 1 HERE]") + }); + amount=100_000 + }) +' +``` + +#### 10.2: Create the second store + +Log in to the frontend using **a new Internet Identity on another web browser**. Configure the store and navigate to the `Receive` page. Click on the principal pill to copy the address to your clipboard. + +Now, go back to the first browser/store, navigate to the `Send` page and transfer some tokens to the second store. + +If everything is working, you should see a notification in the second store. + +🎉 + +## Possible Improvements + +- Login state is not persisted. Reloading the app will log the user out. This should be done using `localStorage` or `sessionStorage`. +- Show more information about transactions. A transaction detail page. +- Show a confirmation dialog after user clicks on `Send` button. + +## Known issues + +- + +## Contributing + +Contributions are welcome! Please open an issue or submit a pull request. + +## Author + +- [kristofer@fmckl.se](mailto:kristofer@fmckl.se) +- Twitter: [@kristoferlund](https://twitter.com/kristoferlund) +- Discord: kristoferkristofer + +## License + +[MIT](LICENSE) diff --git a/motoko/ic-pos/canister_ids.json b/motoko/ic-pos/canister_ids.json new file mode 100644 index 000000000..5f233644e --- /dev/null +++ b/motoko/ic-pos/canister_ids.json @@ -0,0 +1,8 @@ +{ + "icpos": { + "ic": "imhb7-2yaaa-aaaal-qb7va-cai" + }, + "icpos_frontend": { + "ic": "hngac-6aaaa-aaaal-qb6tq-cai" + } +} diff --git a/motoko/ic-pos/components.json b/motoko/ic-pos/components.json new file mode 100644 index 000000000..d73d27e41 --- /dev/null +++ b/motoko/ic-pos/components.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/icpos_frontend/index.css", + "baseColor": "zinc", + "cssVariables": true + }, + "aliases": { + "components": "src/icpos_frontend/components", + "utils": "src/icpos_frontend/utils/shadcn" + } +} diff --git a/motoko/ic-pos/dfx.json b/motoko/ic-pos/dfx.json new file mode 100644 index 000000000..da45a8544 --- /dev/null +++ b/motoko/ic-pos/dfx.json @@ -0,0 +1,62 @@ +{ + "canisters": { + "icpos": { + "main": "src/icpos/main.mo", + "type": "motoko" + }, + "icpos_frontend": { + "dependencies": ["icpos"], + "frontend": { + "entrypoint": "dist/index.html" + }, + "source": ["dist"], + "type": "assets", + "build": ["yarn run build"] + }, + "internet_identity": { + "type": "custom", + "candid": "https://github.com/dfinity/internet-identity/releases/latest/download/internet_identity.did", + "wasm": "https://github.com/dfinity/internet-identity/releases/latest/download/internet_identity_dev.wasm.gz", + "remote": { + "id": { + "ic": "be2us-64aaa-aaaaa-qaabq-cai" + } + }, + "frontend": {} + }, + "icrc1-ledger": { + "type": "custom", + "candid": "https://raw.githubusercontent.com/dfinity/ic/95787355499f3be929f2ab302ed44cdad7c64061/rs/rosetta-api/icrc1/ledger/ledger.did", + "wasm": "https://download.dfinity.systems/ic/95787355499f3be929f2ab302ed44cdad7c64061/canisters/ic-icrc1-ledger.wasm.gz", + "remote": { + "id": { + "ic": "mxzaz-hqaaa-aaaar-qaada-cai" + } + } + }, + "icrc1-index": { + "type": "custom", + "candid": "https://raw.githubusercontent.com/dfinity/ic/95787355499f3be929f2ab302ed44cdad7c64061/rs/rosetta-api/icrc1/index/index.did", + "wasm": "https://download.dfinity.systems/ic/95787355499f3be929f2ab302ed44cdad7c64061/canisters/ic-icrc1-index.wasm.gz", + "remote": { + "id": { + "ic": "n5wcd-faaaa-aaaar-qaaea-cai" + } + } + } + }, + "defaults": { + "build": { + "args": "", + "packtool": "" + } + }, + "networks": { + "local": { + "bind": "127.0.0.1:8000", + "type": "ephemeral" + } + }, + "output_env_file": ".env", + "version": 1 +} diff --git a/motoko/ic-pos/media/header.png b/motoko/ic-pos/media/header.png new file mode 100644 index 0000000000000000000000000000000000000000..d144dd96567e84eee35fa138bb5610115c5b3fa3 GIT binary patch literal 40928 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 literal 0 HcmV?d00001 diff --git a/motoko/ic-pos/package.json b/motoko/ic-pos/package.json new file mode 100644 index 000000000..9ce7c0690 --- /dev/null +++ b/motoko/ic-pos/package.json @@ -0,0 +1,87 @@ +{ + "name": "ic-pos", + "private": true, + "version": "0.2.0", + "type": "module", + "description": "Accept Bitcoin payments (ckBTC) on the Internet Computer using this simple Point of Sale (POS) application.", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/kristoferlund/ic-pos" + }, + "bugs": "https://github.com/kristoferlund/ic-pos/issues", + "homepage": "https://github.com/kristoferlund/ic-pos", + "author": "Kristofer Lund ", + "keywords": [ + "pos", + "bitcoin", + "ckbtc", + "dfinity", + "ic", + "vite", + "react", + "tailwindcss", + "typescript" + ], + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "dfx:start": "dfx start --background", + "dfx:deploy:local": "dfx deploy --network=local --argument '(0)'", + "dfx:deploy:ic": "dfx deploy --network=ic --argument '(64051)'", + "dfx:generate": "dfx generate icpos" + }, + "dependencies": { + "@dfinity/agent": "^0.19.2", + "@dfinity/candid": "^0.19.2", + "@dfinity/ledger": "^0.0.15", + "@dfinity/principal": "^0.19.2", + "@dfinity/utils": "^0.0.22", + "@hookform/resolvers": "^3.1.1", + "@internet-identity-labs/react-ic-ii-auth": "^0.0.19", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@tanstack/react-loaders": "^0.0.1-beta.53", + "@tanstack/router": "0.0.1-beta.86", + "axios": "^1.4.0", + "class-variance-authority": "^0.6.0", + "clsx": "^1.2.1", + "local-storage": "^2.0.0", + "lucide-react": "^0.252.0", + "qrcode.react": "^3.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.45.0", + "react-hot-toast": "^2.4.1", + "react-zxing": "^1.1.4", + "recoil": "^0.7.7", + "tailwind-merge": "^1.13.2", + "use-sound": "^4.0.1", + "zod": "^3.21.4" + }, + "devDependencies": { + "@dfinity/auth-client": "^0.19.2", + "@dfinity/identity": "^0.19.2", + "@tailwindcss/forms": "^0.5.3", + "@tailwindcss/typography": "^0.5.9", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "@vitejs/plugin-react-swc": "^3.0.0", + "autoprefixer": "^10.4.14", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "postcss": "^8.4.24", + "tailwindcss": "^3.3.2", + "tailwindcss-animate": "^1.0.6", + "typescript": "^5.0.2", + "vite": "^4.3.9", + "vite-plugin-svgr": "^3.2.0" + } +} diff --git a/motoko/ic-pos/postcss.config.js b/motoko/ic-pos/postcss.config.js new file mode 100644 index 000000000..2e7af2b7f --- /dev/null +++ b/motoko/ic-pos/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/motoko/ic-pos/src/.env.template b/motoko/ic-pos/src/.env.template new file mode 100644 index 000000000..b0a1137d0 --- /dev/null +++ b/motoko/ic-pos/src/.env.template @@ -0,0 +1,37 @@ +# These environment variables only apply to the frontend package +# +# Replace all local values with the corresponding values for the ic network +# when deploying to ic network + +# 'local' or 'ic' +VITE_DFX_NETWORK='local' + +# local +VITE_IC_HOST='http://127.0.0.1:8000' +# ic +# VITE_IC_HOST='https://identity.ic0.app' + +# local +VITE_CANISTER_ID_II= +# ic +# VITE_CANISTER_ID_II='be2us-64aaa-aaaaa-qaabq-cai' + +# local +VITE_CANISTER_ID_ICPOS_FRONTEND= +# ic +# VITE_CANISTER_ID_ICPOS_FRONTEND= + +# local +VITE_CANISTER_ID_ICPOS= +# ic +# VITE_CANISTER_ID_ICPOS= + +# local +VITE_CANISTER_ID_CKBTC_LEDGER= +# ic +# VITE_CANISTER_ID_CKBTC_LEDGER='mxzaz-hqaaa-aaaar-qaada-cai' + +# local +VITE_CANISTER_ID_CKBTC_INDEX= +# ic +# VITE_CANISTER_ID_CKBTC_INDEX='n5wcd-faaaa-aaaar-qaaea-cai' diff --git a/motoko/ic-pos/src/declarations/icpos/icpos.did.d.ts b/motoko/ic-pos/src/declarations/icpos/icpos.did.d.ts new file mode 100644 index 000000000..7e959535d --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos/icpos.did.d.ts @@ -0,0 +1,23 @@ +import type { ActorMethod } from "@dfinity/agent"; + +export interface Merchant { + name: string; + email_notifications: boolean; + email_address: string; + phone_notifications: boolean; + phone_number: string; +} + +export interface Response { + status: number; + status_text: string; + data: T | null; + error_text: string | null; +} + +export interface _SERVICE { + getMerchant: ActorMethod<[], Response<[Merchant]>>; + updateMerchant: ActorMethod<[Merchant], Response<[Merchant]>>; + setCourierApiKey: ActorMethod<[string], string>; + getLogs: ActorMethod<[], string[]>; +} diff --git a/motoko/ic-pos/src/declarations/icpos/icpos.did.js b/motoko/ic-pos/src/declarations/icpos/icpos.did.js new file mode 100644 index 000000000..5c91a3612 --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos/icpos.did.js @@ -0,0 +1,29 @@ +export const idlFactory = ({ IDL }) => { + const Merchant = IDL.Record({ + email_address: IDL.Text, + phone_notifications: IDL.Bool, + name: IDL.Text, + email_notifications: IDL.Bool, + phone_number: IDL.Text, + }); + const ResponseMerchant = IDL.Record({ + status: IDL.Nat16, + data: IDL.Opt(Merchant), + status_text: IDL.Text, + error_text: IDL.Opt(IDL.Text), + }); + const ResponseText = IDL.Record({ + status: IDL.Nat16, + data: IDL.Opt(IDL.Text), + status_text: IDL.Text, + error_text: IDL.Opt(IDL.Text), + }); + return IDL.Service({ + getMerchant: IDL.Func([], [ResponseMerchant], ["query"]), + updateMerchant: IDL.Func([Merchant], [ResponseMerchant], []), + setCourierApiKey: IDL.Func([IDL.Text], [ResponseText], []), + }); +}; +export const init = ({ IDL }) => { + return []; +}; diff --git a/motoko/ic-pos/src/declarations/icpos/index.d.ts b/motoko/ic-pos/src/declarations/icpos/index.d.ts new file mode 100644 index 000000000..5ec09627b --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos/index.d.ts @@ -0,0 +1,50 @@ +import type { + ActorSubclass, + HttpAgentOptions, + ActorConfig, + Agent, +} from "@dfinity/agent"; +import type { Principal } from "@dfinity/principal"; +import type { IDL } from "@dfinity/candid"; + +import { _SERVICE } from "./icpos.did"; + +export declare const idlFactory: IDL.InterfaceFactory; +export declare const canisterId: string; + +export declare interface CreateActorOptions { + /** + * @see {@link Agent} + */ + agent?: Agent; + /** + * @see {@link HttpAgentOptions} + */ + agentOptions?: HttpAgentOptions; + /** + * @see {@link ActorConfig} + */ + actorOptions?: ActorConfig; +} + +/** + * Intializes an {@link ActorSubclass}, configured with the provided SERVICE interface of a canister. + * @constructs {@link ActorSubClass} + * @param {string | Principal} canisterId - ID of the canister the {@link Actor} will talk to + * @param {CreateActorOptions} options - see {@link CreateActorOptions} + * @param {CreateActorOptions["agent"]} options.agent - a pre-configured agent you'd like to use. Supercedes agentOptions + * @param {CreateActorOptions["agentOptions"]} options.agentOptions - options to set up a new agent + * @see {@link HttpAgentOptions} + * @param {CreateActorOptions["actorOptions"]} options.actorOptions - options for the Actor + * @see {@link ActorConfig} + */ +export declare const createActor: ( + canisterId: string | Principal, + options?: CreateActorOptions +) => ActorSubclass<_SERVICE>; + +/** + * Intialized Actor using default settings, ready to talk to a canister using its candid interface + * @constructs {@link ActorSubClass} + */ +export declare const icpos: ActorSubclass<_SERVICE>; diff --git a/motoko/ic-pos/src/declarations/icpos/index.js b/motoko/ic-pos/src/declarations/icpos/index.js new file mode 100644 index 000000000..2a17a516b --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos/index.js @@ -0,0 +1,44 @@ +import { Actor, HttpAgent } from "@dfinity/agent"; + +// Imports and re-exports candid interface +import { idlFactory } from "./icpos.did.js"; + +export { idlFactory } from "./icpos.did.js"; + +/* CANISTER_ID is replaced by webpack based on node environment + * Note: canister environment variable will be standardized as + * process.env.CANISTER_ID_ + * beginning in dfx 0.15.0 + */ +export const canisterId = import.meta.env.VITE_CANISTER_ID_ICPOS; + +export const createActor = (canisterId, options = {}) => { + const agent = options.agent || new HttpAgent({ ...options.agentOptions }); + + if (options.agent && options.agentOptions) { + console.warn( + "Detected both agent and agentOptions passed to createActor. Ignoring agentOptions and proceeding with the provided agent." + ); + } + + // Fetch root key for certificate validation during development + if (import.meta.env.VITE_DFX_NETWORK !== "ic") { + agent.fetchRootKey().catch((err) => { + console.warn( + "Unable to fetch root key. Check to ensure that your local replica is running" + ); + console.error(err); + }); + } + + // Creates an actor with using the candid interface and the HttpAgent + return Actor.createActor(idlFactory, { + agent, + canisterId, + ...options.actorOptions, + }); +}; + +export const icpos = createActor(canisterId, { + agentOptions: { host: import.meta.env.VITE_IC_HOST }, +}); diff --git a/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did b/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did new file mode 100644 index 000000000..508bda651 --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did @@ -0,0 +1,228 @@ +type BatchId = nat; +type ChunkId = nat; +type Key = text; +type Time = int; + +type CreateAssetArguments = record { + key: Key; + content_type: text; + max_age: opt nat64; + headers: opt vec HeaderField; + enable_aliasing: opt bool; + allow_raw_access: opt bool; +}; + +// Add or change content for an asset, by content encoding +type SetAssetContentArguments = record { + key: Key; + content_encoding: text; + chunk_ids: vec ChunkId; + sha256: opt blob; +}; + +// Remove content for an asset, by content encoding +type UnsetAssetContentArguments = record { + key: Key; + content_encoding: text; +}; + +// Delete an asset +type DeleteAssetArguments = record { + key: Key; +}; + +// Reset everything +type ClearArguments = record {}; + +type BatchOperationKind = variant { + CreateAsset: CreateAssetArguments; + SetAssetContent: SetAssetContentArguments; + + SetAssetProperties: SetAssetPropertiesArguments; + + UnsetAssetContent: UnsetAssetContentArguments; + DeleteAsset: DeleteAssetArguments; + + Clear: ClearArguments; +}; + +type CommitBatchArguments = record { + batch_id: BatchId; + operations: vec BatchOperationKind +}; + +type CommitProposedBatchArguments = record { + batch_id: BatchId; + evidence: blob; +}; + +type ComputeEvidenceArguments = record { + batch_id: BatchId; + max_iterations: opt nat16 +}; + +type DeleteBatchArguments = record { + batch_id: BatchId; +}; + +type HeaderField = record { text; text; }; + +type HttpRequest = record { + method: text; + url: text; + headers: vec HeaderField; + body: blob; + certificate_version: opt nat16; +}; + +type HttpResponse = record { + status_code: nat16; + headers: vec HeaderField; + body: blob; + streaming_strategy: opt StreamingStrategy; +}; + +type StreamingCallbackHttpResponse = record { + body: blob; + token: opt StreamingCallbackToken; +}; + +type StreamingCallbackToken = record { + key: Key; + content_encoding: text; + index: nat; + sha256: opt blob; +}; + +type StreamingStrategy = variant { + Callback: record { + callback: func (StreamingCallbackToken) -> (opt StreamingCallbackHttpResponse) query; + token: StreamingCallbackToken; + }; +}; + +type SetAssetPropertiesArguments = record { + key: Key; + max_age: opt opt nat64; + headers: opt opt vec HeaderField; + allow_raw_access: opt opt bool; + is_aliased: opt opt bool; +}; + +type Permission = variant { + Commit; + ManagePermissions; + Prepare; +}; + +type GrantPermission = record { + to_principal: principal; + permission: Permission; +}; +type RevokePermission = record { + of_principal: principal; + permission: Permission; +}; +type ListPermitted = record { permission: Permission }; + +type ValidationResult = variant { Ok : text; Err : text }; + +service: { + api_version: () -> (nat16) query; + + get: (record { + key: Key; + accept_encodings: vec text; + }) -> (record { + content: blob; // may be the entirety of the content, or just chunk index 0 + content_type: text; + content_encoding: text; + sha256: opt blob; // sha256 of entire asset encoding, calculated by dfx and passed in SetAssetContentArguments + total_length: nat; // all chunks except last have size == content.size() + }) query; + + // if get() returned chunks > 1, call this to retrieve them. + // chunks may or may not be split up at the same boundaries as presented to create_chunk(). + get_chunk: (record { + key: Key; + content_encoding: text; + index: nat; + sha256: opt blob; // sha256 of entire asset encoding, calculated by dfx and passed in SetAssetContentArguments + }) -> (record { content: blob }) query; + + list : (record {}) -> (vec record { + key: Key; + content_type: text; + encodings: vec record { + content_encoding: text; + sha256: opt blob; // sha256 of entire asset encoding, calculated by dfx and passed in SetAssetContentArguments + length: nat; // Size of this encoding's blob. Calculated when uploading assets. + modified: Time; + }; + }) query; + + certified_tree : (record {}) -> (record { + certificate: blob; + tree: blob; + }) query; + + create_batch : (record {}) -> (record { batch_id: BatchId }); + + create_chunk: (record { batch_id: BatchId; content: blob }) -> (record { chunk_id: ChunkId }); + + // Perform all operations successfully, or reject + commit_batch: (CommitBatchArguments) -> (); + + // Save the batch operations for later commit + propose_commit_batch: (CommitBatchArguments) -> (); + + // Given a batch already proposed, perform all operations successfully, or reject + commit_proposed_batch: (CommitProposedBatchArguments) -> (); + + // Compute a hash over the CommitBatchArguments. Call until it returns Some(evidence). + compute_evidence: (ComputeEvidenceArguments) -> (opt blob); + + // Delete a batch that has been created, or proposed for commit, but not yet committed + delete_batch: (DeleteBatchArguments) -> (); + + create_asset: (CreateAssetArguments) -> (); + set_asset_content: (SetAssetContentArguments) -> (); + unset_asset_content: (UnsetAssetContentArguments) -> (); + + delete_asset: (DeleteAssetArguments) -> (); + + clear: (ClearArguments) -> (); + + // Single call to create an asset with content for a single content encoding that + // fits within the message ingress limit. + store: (record { + key: Key; + content_type: text; + content_encoding: text; + content: blob; + sha256: opt blob + }) -> (); + + http_request: (request: HttpRequest) -> (HttpResponse) query; + http_request_streaming_callback: (token: StreamingCallbackToken) -> (opt StreamingCallbackHttpResponse) query; + + authorize: (principal) -> (); + deauthorize: (principal) -> (); + list_authorized: () -> (vec principal) query; + grant_permission: (GrantPermission) -> (); + revoke_permission: (RevokePermission) -> (); + list_permitted: (ListPermitted) -> (vec principal) query; + take_ownership: () -> (); + + get_asset_properties : (key: Key) -> (record { + max_age: opt nat64; + headers: opt vec HeaderField; + allow_raw_access: opt bool; + is_aliased: opt bool; } ) query; + set_asset_properties: (SetAssetPropertiesArguments) -> (); + + validate_grant_permission: (GrantPermission) -> (ValidationResult); + validate_revoke_permission: (RevokePermission) -> (ValidationResult); + validate_take_ownership: () -> (ValidationResult); + validate_commit_proposed_batch: (CommitProposedBatchArguments) -> (ValidationResult); +} diff --git a/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.d.ts b/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.d.ts new file mode 100644 index 000000000..d5bc1a4b4 --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.d.ts @@ -0,0 +1,215 @@ +import type { Principal } from '@dfinity/principal'; +import type { ActorMethod } from '@dfinity/agent'; + +export type BatchId = bigint; +export type BatchOperationKind = { + 'SetAssetProperties' : SetAssetPropertiesArguments + } | + { 'CreateAsset' : CreateAssetArguments } | + { 'UnsetAssetContent' : UnsetAssetContentArguments } | + { 'DeleteAsset' : DeleteAssetArguments } | + { 'SetAssetContent' : SetAssetContentArguments } | + { 'Clear' : ClearArguments }; +export type ChunkId = bigint; +export type ClearArguments = {}; +export interface CommitBatchArguments { + 'batch_id' : BatchId, + 'operations' : Array, +} +export interface CommitProposedBatchArguments { + 'batch_id' : BatchId, + 'evidence' : Uint8Array | number[], +} +export interface ComputeEvidenceArguments { + 'batch_id' : BatchId, + 'max_iterations' : [] | [number], +} +export interface CreateAssetArguments { + 'key' : Key, + 'content_type' : string, + 'headers' : [] | [Array], + 'allow_raw_access' : [] | [boolean], + 'max_age' : [] | [bigint], + 'enable_aliasing' : [] | [boolean], +} +export interface DeleteAssetArguments { 'key' : Key } +export interface DeleteBatchArguments { 'batch_id' : BatchId } +export interface GrantPermission { + 'permission' : Permission, + 'to_principal' : Principal, +} +export type HeaderField = [string, string]; +export interface HttpRequest { + 'url' : string, + 'method' : string, + 'body' : Uint8Array | number[], + 'headers' : Array, + 'certificate_version' : [] | [number], +} +export interface HttpResponse { + 'body' : Uint8Array | number[], + 'headers' : Array, + 'streaming_strategy' : [] | [StreamingStrategy], + 'status_code' : number, +} +export type Key = string; +export interface ListPermitted { 'permission' : Permission } +export type Permission = { 'Prepare' : null } | + { 'ManagePermissions' : null } | + { 'Commit' : null }; +export interface RevokePermission { + 'permission' : Permission, + 'of_principal' : Principal, +} +export interface SetAssetContentArguments { + 'key' : Key, + 'sha256' : [] | [Uint8Array | number[]], + 'chunk_ids' : Array, + 'content_encoding' : string, +} +export interface SetAssetPropertiesArguments { + 'key' : Key, + 'headers' : [] | [[] | [Array]], + 'is_aliased' : [] | [[] | [boolean]], + 'allow_raw_access' : [] | [[] | [boolean]], + 'max_age' : [] | [[] | [bigint]], +} +export interface StreamingCallbackHttpResponse { + 'token' : [] | [StreamingCallbackToken], + 'body' : Uint8Array | number[], +} +export interface StreamingCallbackToken { + 'key' : Key, + 'sha256' : [] | [Uint8Array | number[]], + 'index' : bigint, + 'content_encoding' : string, +} +export type StreamingStrategy = { + 'Callback' : { + 'token' : StreamingCallbackToken, + 'callback' : [Principal, string], + } + }; +export type Time = bigint; +export interface UnsetAssetContentArguments { + 'key' : Key, + 'content_encoding' : string, +} +export type ValidationResult = { 'Ok' : string } | + { 'Err' : string }; +export interface _SERVICE { + 'api_version' : ActorMethod<[], number>, + 'authorize' : ActorMethod<[Principal], undefined>, + 'certified_tree' : ActorMethod< + [{}], + { 'certificate' : Uint8Array | number[], 'tree' : Uint8Array | number[] } + >, + 'clear' : ActorMethod<[ClearArguments], undefined>, + 'commit_batch' : ActorMethod<[CommitBatchArguments], undefined>, + 'commit_proposed_batch' : ActorMethod< + [CommitProposedBatchArguments], + undefined + >, + 'compute_evidence' : ActorMethod< + [ComputeEvidenceArguments], + [] | [Uint8Array | number[]] + >, + 'create_asset' : ActorMethod<[CreateAssetArguments], undefined>, + 'create_batch' : ActorMethod<[{}], { 'batch_id' : BatchId }>, + 'create_chunk' : ActorMethod< + [{ 'content' : Uint8Array | number[], 'batch_id' : BatchId }], + { 'chunk_id' : ChunkId } + >, + 'deauthorize' : ActorMethod<[Principal], undefined>, + 'delete_asset' : ActorMethod<[DeleteAssetArguments], undefined>, + 'delete_batch' : ActorMethod<[DeleteBatchArguments], undefined>, + 'get' : ActorMethod< + [{ 'key' : Key, 'accept_encodings' : Array }], + { + 'content' : Uint8Array | number[], + 'sha256' : [] | [Uint8Array | number[]], + 'content_type' : string, + 'content_encoding' : string, + 'total_length' : bigint, + } + >, + 'get_asset_properties' : ActorMethod< + [Key], + { + 'headers' : [] | [Array], + 'is_aliased' : [] | [boolean], + 'allow_raw_access' : [] | [boolean], + 'max_age' : [] | [bigint], + } + >, + 'get_chunk' : ActorMethod< + [ + { + 'key' : Key, + 'sha256' : [] | [Uint8Array | number[]], + 'index' : bigint, + 'content_encoding' : string, + }, + ], + { 'content' : Uint8Array | number[] } + >, + 'grant_permission' : ActorMethod<[GrantPermission], undefined>, + 'http_request' : ActorMethod<[HttpRequest], HttpResponse>, + 'http_request_streaming_callback' : ActorMethod< + [StreamingCallbackToken], + [] | [StreamingCallbackHttpResponse] + >, + 'list' : ActorMethod< + [{}], + Array< + { + 'key' : Key, + 'encodings' : Array< + { + 'modified' : Time, + 'sha256' : [] | [Uint8Array | number[]], + 'length' : bigint, + 'content_encoding' : string, + } + >, + 'content_type' : string, + } + > + >, + 'list_authorized' : ActorMethod<[], Array>, + 'list_permitted' : ActorMethod<[ListPermitted], Array>, + 'propose_commit_batch' : ActorMethod<[CommitBatchArguments], undefined>, + 'revoke_permission' : ActorMethod<[RevokePermission], undefined>, + 'set_asset_content' : ActorMethod<[SetAssetContentArguments], undefined>, + 'set_asset_properties' : ActorMethod< + [SetAssetPropertiesArguments], + undefined + >, + 'store' : ActorMethod< + [ + { + 'key' : Key, + 'content' : Uint8Array | number[], + 'sha256' : [] | [Uint8Array | number[]], + 'content_type' : string, + 'content_encoding' : string, + }, + ], + undefined + >, + 'take_ownership' : ActorMethod<[], undefined>, + 'unset_asset_content' : ActorMethod<[UnsetAssetContentArguments], undefined>, + 'validate_commit_proposed_batch' : ActorMethod< + [CommitProposedBatchArguments], + ValidationResult + >, + 'validate_grant_permission' : ActorMethod< + [GrantPermission], + ValidationResult + >, + 'validate_revoke_permission' : ActorMethod< + [RevokePermission], + ValidationResult + >, + 'validate_take_ownership' : ActorMethod<[], ValidationResult>, +} diff --git a/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.js b/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.js new file mode 100644 index 000000000..d390f7c0d --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos_frontend/icpos_frontend.did.js @@ -0,0 +1,245 @@ +export const idlFactory = ({ IDL }) => { + const ClearArguments = IDL.Record({}); + const BatchId = IDL.Nat; + const Key = IDL.Text; + const HeaderField = IDL.Tuple(IDL.Text, IDL.Text); + const SetAssetPropertiesArguments = IDL.Record({ + 'key' : Key, + 'headers' : IDL.Opt(IDL.Opt(IDL.Vec(HeaderField))), + 'is_aliased' : IDL.Opt(IDL.Opt(IDL.Bool)), + 'allow_raw_access' : IDL.Opt(IDL.Opt(IDL.Bool)), + 'max_age' : IDL.Opt(IDL.Opt(IDL.Nat64)), + }); + const CreateAssetArguments = IDL.Record({ + 'key' : Key, + 'content_type' : IDL.Text, + 'headers' : IDL.Opt(IDL.Vec(HeaderField)), + 'allow_raw_access' : IDL.Opt(IDL.Bool), + 'max_age' : IDL.Opt(IDL.Nat64), + 'enable_aliasing' : IDL.Opt(IDL.Bool), + }); + const UnsetAssetContentArguments = IDL.Record({ + 'key' : Key, + 'content_encoding' : IDL.Text, + }); + const DeleteAssetArguments = IDL.Record({ 'key' : Key }); + const ChunkId = IDL.Nat; + const SetAssetContentArguments = IDL.Record({ + 'key' : Key, + 'sha256' : IDL.Opt(IDL.Vec(IDL.Nat8)), + 'chunk_ids' : IDL.Vec(ChunkId), + 'content_encoding' : IDL.Text, + }); + const BatchOperationKind = IDL.Variant({ + 'SetAssetProperties' : SetAssetPropertiesArguments, + 'CreateAsset' : CreateAssetArguments, + 'UnsetAssetContent' : UnsetAssetContentArguments, + 'DeleteAsset' : DeleteAssetArguments, + 'SetAssetContent' : SetAssetContentArguments, + 'Clear' : ClearArguments, + }); + const CommitBatchArguments = IDL.Record({ + 'batch_id' : BatchId, + 'operations' : IDL.Vec(BatchOperationKind), + }); + const CommitProposedBatchArguments = IDL.Record({ + 'batch_id' : BatchId, + 'evidence' : IDL.Vec(IDL.Nat8), + }); + const ComputeEvidenceArguments = IDL.Record({ + 'batch_id' : BatchId, + 'max_iterations' : IDL.Opt(IDL.Nat16), + }); + const DeleteBatchArguments = IDL.Record({ 'batch_id' : BatchId }); + const Permission = IDL.Variant({ + 'Prepare' : IDL.Null, + 'ManagePermissions' : IDL.Null, + 'Commit' : IDL.Null, + }); + const GrantPermission = IDL.Record({ + 'permission' : Permission, + 'to_principal' : IDL.Principal, + }); + const HttpRequest = IDL.Record({ + 'url' : IDL.Text, + 'method' : IDL.Text, + 'body' : IDL.Vec(IDL.Nat8), + 'headers' : IDL.Vec(HeaderField), + 'certificate_version' : IDL.Opt(IDL.Nat16), + }); + const StreamingCallbackToken = IDL.Record({ + 'key' : Key, + 'sha256' : IDL.Opt(IDL.Vec(IDL.Nat8)), + 'index' : IDL.Nat, + 'content_encoding' : IDL.Text, + }); + const StreamingCallbackHttpResponse = IDL.Record({ + 'token' : IDL.Opt(StreamingCallbackToken), + 'body' : IDL.Vec(IDL.Nat8), + }); + const StreamingStrategy = IDL.Variant({ + 'Callback' : IDL.Record({ + 'token' : StreamingCallbackToken, + 'callback' : IDL.Func( + [StreamingCallbackToken], + [IDL.Opt(StreamingCallbackHttpResponse)], + ['query'], + ), + }), + }); + const HttpResponse = IDL.Record({ + 'body' : IDL.Vec(IDL.Nat8), + 'headers' : IDL.Vec(HeaderField), + 'streaming_strategy' : IDL.Opt(StreamingStrategy), + 'status_code' : IDL.Nat16, + }); + const Time = IDL.Int; + const ListPermitted = IDL.Record({ 'permission' : Permission }); + const RevokePermission = IDL.Record({ + 'permission' : Permission, + 'of_principal' : IDL.Principal, + }); + const ValidationResult = IDL.Variant({ 'Ok' : IDL.Text, 'Err' : IDL.Text }); + return IDL.Service({ + 'api_version' : IDL.Func([], [IDL.Nat16], ['query']), + 'authorize' : IDL.Func([IDL.Principal], [], []), + 'certified_tree' : IDL.Func( + [IDL.Record({})], + [ + IDL.Record({ + 'certificate' : IDL.Vec(IDL.Nat8), + 'tree' : IDL.Vec(IDL.Nat8), + }), + ], + ['query'], + ), + 'clear' : IDL.Func([ClearArguments], [], []), + 'commit_batch' : IDL.Func([CommitBatchArguments], [], []), + 'commit_proposed_batch' : IDL.Func([CommitProposedBatchArguments], [], []), + 'compute_evidence' : IDL.Func( + [ComputeEvidenceArguments], + [IDL.Opt(IDL.Vec(IDL.Nat8))], + [], + ), + 'create_asset' : IDL.Func([CreateAssetArguments], [], []), + 'create_batch' : IDL.Func( + [IDL.Record({})], + [IDL.Record({ 'batch_id' : BatchId })], + [], + ), + 'create_chunk' : IDL.Func( + [IDL.Record({ 'content' : IDL.Vec(IDL.Nat8), 'batch_id' : BatchId })], + [IDL.Record({ 'chunk_id' : ChunkId })], + [], + ), + 'deauthorize' : IDL.Func([IDL.Principal], [], []), + 'delete_asset' : IDL.Func([DeleteAssetArguments], [], []), + 'delete_batch' : IDL.Func([DeleteBatchArguments], [], []), + 'get' : IDL.Func( + [IDL.Record({ 'key' : Key, 'accept_encodings' : IDL.Vec(IDL.Text) })], + [ + IDL.Record({ + 'content' : IDL.Vec(IDL.Nat8), + 'sha256' : IDL.Opt(IDL.Vec(IDL.Nat8)), + 'content_type' : IDL.Text, + 'content_encoding' : IDL.Text, + 'total_length' : IDL.Nat, + }), + ], + ['query'], + ), + 'get_asset_properties' : IDL.Func( + [Key], + [ + IDL.Record({ + 'headers' : IDL.Opt(IDL.Vec(HeaderField)), + 'is_aliased' : IDL.Opt(IDL.Bool), + 'allow_raw_access' : IDL.Opt(IDL.Bool), + 'max_age' : IDL.Opt(IDL.Nat64), + }), + ], + ['query'], + ), + 'get_chunk' : IDL.Func( + [ + IDL.Record({ + 'key' : Key, + 'sha256' : IDL.Opt(IDL.Vec(IDL.Nat8)), + 'index' : IDL.Nat, + 'content_encoding' : IDL.Text, + }), + ], + [IDL.Record({ 'content' : IDL.Vec(IDL.Nat8) })], + ['query'], + ), + 'grant_permission' : IDL.Func([GrantPermission], [], []), + 'http_request' : IDL.Func([HttpRequest], [HttpResponse], ['query']), + 'http_request_streaming_callback' : IDL.Func( + [StreamingCallbackToken], + [IDL.Opt(StreamingCallbackHttpResponse)], + ['query'], + ), + 'list' : IDL.Func( + [IDL.Record({})], + [ + IDL.Vec( + IDL.Record({ + 'key' : Key, + 'encodings' : IDL.Vec( + IDL.Record({ + 'modified' : Time, + 'sha256' : IDL.Opt(IDL.Vec(IDL.Nat8)), + 'length' : IDL.Nat, + 'content_encoding' : IDL.Text, + }) + ), + 'content_type' : IDL.Text, + }) + ), + ], + ['query'], + ), + 'list_authorized' : IDL.Func([], [IDL.Vec(IDL.Principal)], ['query']), + 'list_permitted' : IDL.Func( + [ListPermitted], + [IDL.Vec(IDL.Principal)], + ['query'], + ), + 'propose_commit_batch' : IDL.Func([CommitBatchArguments], [], []), + 'revoke_permission' : IDL.Func([RevokePermission], [], []), + 'set_asset_content' : IDL.Func([SetAssetContentArguments], [], []), + 'set_asset_properties' : IDL.Func([SetAssetPropertiesArguments], [], []), + 'store' : IDL.Func( + [ + IDL.Record({ + 'key' : Key, + 'content' : IDL.Vec(IDL.Nat8), + 'sha256' : IDL.Opt(IDL.Vec(IDL.Nat8)), + 'content_type' : IDL.Text, + 'content_encoding' : IDL.Text, + }), + ], + [], + [], + ), + 'take_ownership' : IDL.Func([], [], []), + 'unset_asset_content' : IDL.Func([UnsetAssetContentArguments], [], []), + 'validate_commit_proposed_batch' : IDL.Func( + [CommitProposedBatchArguments], + [ValidationResult], + [], + ), + 'validate_grant_permission' : IDL.Func( + [GrantPermission], + [ValidationResult], + [], + ), + 'validate_revoke_permission' : IDL.Func( + [RevokePermission], + [ValidationResult], + [], + ), + 'validate_take_ownership' : IDL.Func([], [ValidationResult], []), + }); +}; +export const init = ({ IDL }) => { return []; }; diff --git a/motoko/ic-pos/src/declarations/icpos_frontend/index.d.ts b/motoko/ic-pos/src/declarations/icpos_frontend/index.d.ts new file mode 100644 index 000000000..d5576f452 --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos_frontend/index.d.ts @@ -0,0 +1,50 @@ +import type { + ActorSubclass, + HttpAgentOptions, + ActorConfig, + Agent, +} from "@dfinity/agent"; +import type { Principal } from "@dfinity/principal"; +import type { IDL } from "@dfinity/candid"; + +import { _SERVICE } from './icpos_frontend.did'; + +export declare const idlFactory: IDL.InterfaceFactory; +export declare const canisterId: string; + +export declare interface CreateActorOptions { + /** + * @see {@link Agent} + */ + agent?: Agent; + /** + * @see {@link HttpAgentOptions} + */ + agentOptions?: HttpAgentOptions; + /** + * @see {@link ActorConfig} + */ + actorOptions?: ActorConfig; +} + +/** + * Intializes an {@link ActorSubclass}, configured with the provided SERVICE interface of a canister. + * @constructs {@link ActorSubClass} + * @param {string | Principal} canisterId - ID of the canister the {@link Actor} will talk to + * @param {CreateActorOptions} options - see {@link CreateActorOptions} + * @param {CreateActorOptions["agent"]} options.agent - a pre-configured agent you'd like to use. Supercedes agentOptions + * @param {CreateActorOptions["agentOptions"]} options.agentOptions - options to set up a new agent + * @see {@link HttpAgentOptions} + * @param {CreateActorOptions["actorOptions"]} options.actorOptions - options for the Actor + * @see {@link ActorConfig} + */ +export declare const createActor: ( + canisterId: string | Principal, + options?: CreateActorOptions +) => ActorSubclass<_SERVICE>; + +/** + * Intialized Actor using default settings, ready to talk to a canister using its candid interface + * @constructs {@link ActorSubClass} + */ +export declare const icpos_frontend: ActorSubclass<_SERVICE>; diff --git a/motoko/ic-pos/src/declarations/icpos_frontend/index.js b/motoko/ic-pos/src/declarations/icpos_frontend/index.js new file mode 100644 index 000000000..e4bde85cb --- /dev/null +++ b/motoko/ic-pos/src/declarations/icpos_frontend/index.js @@ -0,0 +1,45 @@ +import { Actor, HttpAgent } from "@dfinity/agent"; + +// Imports and re-exports candid interface +import { idlFactory } from "./icpos_frontend.did.js"; + +export { idlFactory } from "./icpos_frontend.did.js"; + +/* CANISTER_ID is replaced by webpack based on node environment + * Note: canister environment variable will be standardized as + * process.env.CANISTER_ID_ + * beginning in dfx 0.15.0 + */ + +export const canisterId = import.meta.env.VITE_CANISTER_ID_ICPOS_FRONTEND; + +export const createActor = (canisterId, options = {}) => { + const agent = options.agent || new HttpAgent({ ...options.agentOptions }); + + if (options.agent && options.agentOptions) { + console.warn( + "Detected both agent and agentOptions passed to createActor. Ignoring agentOptions and proceeding with the provided agent." + ); + } + + // Fetch root key for certificate validation during development + if (import.meta.env.VITE_DFX_NETWORK !== "ic") { + agent.fetchRootKey().catch((err) => { + console.warn( + "Unable to fetch root key. Check to ensure that your local replica is running" + ); + console.error(err); + }); + } + + // Creates an actor with using the candid interface and the HttpAgent + return Actor.createActor(idlFactory, { + agent, + canisterId, + ...options.actorOptions, + }); +}; + +export const icpos_frontend = createActor(canisterId, { + agentOptions: { host: import.meta.env.VITE_IC_HOST }, +}); diff --git a/motoko/ic-pos/src/declarations/internet_identity/index.d.ts b/motoko/ic-pos/src/declarations/internet_identity/index.d.ts new file mode 100644 index 000000000..da7d67666 --- /dev/null +++ b/motoko/ic-pos/src/declarations/internet_identity/index.d.ts @@ -0,0 +1,50 @@ +import type { + ActorSubclass, + HttpAgentOptions, + ActorConfig, + Agent, +} from "@dfinity/agent"; +import type { Principal } from "@dfinity/principal"; +import type { IDL } from "@dfinity/candid"; + +import { _SERVICE } from './internet_identity.did'; + +export declare const idlFactory: IDL.InterfaceFactory; +export declare const canisterId: string; + +export declare interface CreateActorOptions { + /** + * @see {@link Agent} + */ + agent?: Agent; + /** + * @see {@link HttpAgentOptions} + */ + agentOptions?: HttpAgentOptions; + /** + * @see {@link ActorConfig} + */ + actorOptions?: ActorConfig; +} + +/** + * Intializes an {@link ActorSubclass}, configured with the provided SERVICE interface of a canister. + * @constructs {@link ActorSubClass} + * @param {string | Principal} canisterId - ID of the canister the {@link Actor} will talk to + * @param {CreateActorOptions} options - see {@link CreateActorOptions} + * @param {CreateActorOptions["agent"]} options.agent - a pre-configured agent you'd like to use. Supercedes agentOptions + * @param {CreateActorOptions["agentOptions"]} options.agentOptions - options to set up a new agent + * @see {@link HttpAgentOptions} + * @param {CreateActorOptions["actorOptions"]} options.actorOptions - options for the Actor + * @see {@link ActorConfig} + */ +export declare const createActor: ( + canisterId: string | Principal, + options?: CreateActorOptions +) => ActorSubclass<_SERVICE>; + +/** + * Intialized Actor using default settings, ready to talk to a canister using its candid interface + * @constructs {@link ActorSubClass} + */ +export declare const internet_identity: ActorSubclass<_SERVICE>; diff --git a/motoko/ic-pos/src/declarations/internet_identity/index.js b/motoko/ic-pos/src/declarations/internet_identity/index.js new file mode 100644 index 000000000..ad3dc5233 --- /dev/null +++ b/motoko/ic-pos/src/declarations/internet_identity/index.js @@ -0,0 +1,44 @@ +import { Actor, HttpAgent } from "@dfinity/agent"; + +// Imports and re-exports candid interface +import { idlFactory } from "./internet_identity.did.js"; + +export { idlFactory } from "./internet_identity.did.js"; + +/* CANISTER_ID is replaced by webpack based on node environment + * Note: canister environment variable will be standardized as + * process.env.CANISTER_ID_ + * beginning in dfx 0.15.0 + */ +export const canisterId = import.meta.env.VITE_CANISTER_ID_INTERNET_IDENTITY; + +export const createActor = (canisterId, options = {}) => { + const agent = options.agent || new HttpAgent({ ...options.agentOptions }); + + if (options.agent && options.agentOptions) { + console.warn( + "Detected both agent and agentOptions passed to createActor. Ignoring agentOptions and proceeding with the provided agent." + ); + } + + // Fetch root key for certificate validation during development + if (import.meta.env.VITE_DFX_NETWORK !== "ic") { + agent.fetchRootKey().catch((err) => { + console.warn( + "Unable to fetch root key. Check to ensure that your local replica is running" + ); + console.error(err); + }); + } + + // Creates an actor with using the candid interface and the HttpAgent + return Actor.createActor(idlFactory, { + agent, + canisterId, + ...options.actorOptions, + }); +}; + +export const internet_identity = createActor(canisterId, { + agentOptions: { host: import.meta.env.VITE_IC_HOST }, +}); diff --git a/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did b/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did new file mode 100644 index 000000000..e6bea7d4a --- /dev/null +++ b/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did @@ -0,0 +1,468 @@ +type UserNumber = nat64; +type PublicKey = blob; +type CredentialId = blob; +type DeviceKey = PublicKey; +type UserKey = PublicKey; +type SessionKey = PublicKey; +type FrontendHostname = text; +type Timestamp = nat64; + +type HeaderField = record { + text; + text; +}; + +type HttpRequest = record { + method: text; + url: text; + headers: vec HeaderField; + body: blob; + certificate_version: opt nat16; +}; + +type HttpResponse = record { + status_code: nat16; + headers: vec HeaderField; + body: blob; + upgrade : opt bool; + streaming_strategy: opt StreamingStrategy; +}; + +type StreamingCallbackHttpResponse = record { + body: blob; + token: opt Token; +}; + +type Token = record {}; + +type StreamingStrategy = variant { + Callback: record { + callback: func (Token) -> (StreamingCallbackHttpResponse) query; + token: Token; + }; +}; + +type Purpose = variant { + recovery; + authentication; +}; + +type KeyType = variant { + unknown; + platform; + cross_platform; + seed_phrase; +}; + +// This describes whether a device is "protected" or not. +// When protected, a device can only be updated or removed if the +// user is authenticated with that very device. +type DeviceProtection = variant { + protected; + unprotected; +}; + +type Challenge = record { + png_base64: text; + challenge_key: ChallengeKey; +}; + +type DeviceData = record { + pubkey : DeviceKey; + alias : text; + credential_id : opt CredentialId; + purpose: Purpose; + key_type: KeyType; + protection: DeviceProtection; + origin: opt text; + // Metadata map for additional device information. + // + // Note: some fields above will be moved to the metadata map in the future. + // All field names of `DeviceData` (such as 'alias', 'origin, etc.) are + // reserved and cannot be written. + metadata: opt MetadataMap; +}; + +// The same as `DeviceData` but with the `last_usage` field. +// This field cannot be written, hence the separate type. +type DeviceWithUsage = record { + pubkey : DeviceKey; + alias : text; + credential_id : opt CredentialId; + purpose: Purpose; + key_type: KeyType; + protection: DeviceProtection; + origin: opt text; + last_usage: opt Timestamp; + metadata: opt MetadataMap; +}; + +// Map with some variants for the value type. +// Note, due to the Candid mapping this must be a tuple type thus we cannot name the fields `key` and `value`. +type MetadataMap = vec record { + text; + variant { map : MetadataMap; string : text; bytes : vec nat8 }; +}; + +type RegisterResponse = variant { + // A new user was successfully registered. + registered: record { + user_number: UserNumber; + }; + // No more registrations are possible in this instance of the II service canister. + canister_full; + // The challenge was not successful. + bad_challenge; +}; + +type AddTentativeDeviceResponse = variant { + // The device was tentatively added. + added_tentatively: record { + verification_code: text; + // Expiration date, in nanos since the epoch + device_registration_timeout: Timestamp; + }; + // Device registration mode is off, either due to timeout or because it was never enabled. + device_registration_mode_off; + // There is another device already added tentatively + another_device_tentatively_added; +}; + +type VerifyTentativeDeviceResponse = variant { + // The device was successfully verified. + verified; + // Wrong verification code entered. Retry with correct code. + wrong_code: record { + retries_left: nat8 + }; + // Device registration mode is off, either due to timeout or because it was never enabled. + device_registration_mode_off; + // There is no tentative device to be verified. + no_device_to_verify; +}; + +type Delegation = record { + pubkey: PublicKey; + expiration: Timestamp; + targets: opt vec principal; +}; + +type SignedDelegation = record { + delegation: Delegation; + signature: blob; +}; + +type GetDelegationResponse = variant { + // The signed delegation was successfully retrieved. + signed_delegation: SignedDelegation; + + // The signature is not ready. Maybe retry by calling `prepare_delegation` + no_such_delegation +}; + +type InternetIdentityStats = record { + users_registered: nat64; + storage_layout_version: nat8; + assigned_user_number_range: record { + nat64; + nat64; + }; + archive_info: ArchiveInfo; + canister_creation_cycles_cost: nat64; + active_anchor_stats: opt ActiveAnchorStatistics; + domain_active_anchor_stats: opt DomainActiveAnchorStatistics; + max_num_latest_delegation_origins: nat64; + latest_delegation_origins: vec FrontendHostname +}; + +// Configuration parameters related to the archive. +type ArchiveConfig = record { + // The allowed module hash of the archive canister. + // Changing this parameter does _not_ deploy the archive, but enable archive deployments with the + // corresponding wasm module. + module_hash : blob; + // Buffered archive entries limit. If reached, II will stop accepting new anchor operations + // until the buffered operations are acknowledged by the archive. + entries_buffer_limit: nat64; + // The maximum number of entries to be transferred to the archive per call. + entries_fetch_limit: nat16; + // Polling interval to fetch new entries from II (in nanoseconds). + // Changes to this parameter will only take effect after an archive deployment. + polling_interval_ns: nat64; +}; + +// Information about the archive. +type ArchiveInfo = record { + // Canister id of the archive or empty if no archive has been deployed yet. + archive_canister : opt principal; + // Configuration parameters related to the II archive. + archive_config: opt ArchiveConfig; +}; + +// Rate limit configuration. +// Currently only used for `register`. +type RateLimitConfig = record { + // Time it takes (in ns) for a rate limiting token to be replenished. + time_per_token_ns : nat64; + // How many tokens are at most generated (to accommodate peaks). + max_tokens: nat64; +}; + +type ActiveAnchorStatistics = record { + // Stats for the last completed collection period for daily and monthly active anchors + completed: CompletedActiveAnchorStats; + // ongoing periods for daily and monthly active anchors + ongoing: OngoingActiveAnchorStats; +}; + +type CompletedActiveAnchorStats = record { + daily_active_anchors: opt ActiveAnchorCounter; + monthly_active_anchors: opt ActiveAnchorCounter; +}; + +type OngoingActiveAnchorStats = record { + // Ongoing active anchor counter for the current 24 h time bucket. + daily_active_anchors: ActiveAnchorCounter; + // Monthly active users are collected using 30-day sliding windows. + // This vec contains up to 30 30-day active windows each offset by one day. + // The vec is sorted, new collection windows are added at the end. + monthly_active_anchors: vec ActiveAnchorCounter; +}; + +type ActiveAnchorCounter = record { + start_timestamp: Timestamp; + counter: nat64; +}; + +type DomainActiveAnchorStatistics = record { + // Stats for the last completed collection period for daily and monthly active anchors + completed: DomainCompletedActiveAnchorStats; + // ongoing periods for daily and monthly active anchors + ongoing: DomainOngoingActiveAnchorStats; +}; + +type DomainCompletedActiveAnchorStats = record { + daily_active_anchors: opt DomainActiveAnchorCounter; + monthly_active_anchors: opt DomainActiveAnchorCounter; +}; + +type DomainOngoingActiveAnchorStats = record { + // Ongoing active anchor counter for the current 24 h time bucket. + daily_active_anchors: DomainActiveAnchorCounter; + // Monthly active users are collected using 30-day sliding windows. + // This vec contains up to 30 30-day active windows each offset by one day. + // The vec is sorted, new collection windows are added at the end. + monthly_active_anchors: vec DomainActiveAnchorCounter; +}; + +type DomainActiveAnchorCounter = record { + start_timestamp: Timestamp; + ic0_app_counter: nat64; + internetcomputer_org_counter: nat64; + both_ii_domains_counter: nat64; +}; + +// Init arguments of II which can be supplied on install and upgrade. +// Setting a value to null keeps the previous value. +type InternetIdentityInit = record { + // Set lowest and highest anchor + assigned_user_number_range : opt record { + nat64; + nat64; + }; + // Configuration parameters related to the II archive. + // Note: some parameters changes (like the polling interval) will only take effect after an archive deployment. + // See ArchiveConfig for details. + archive_config: opt ArchiveConfig; + // Set the amounts of cycles sent with the create canister message. + // This is configurable because in the staging environment cycles are required. + // The canister creation cost on mainnet is currently 100'000'000'000 cycles. If this value is higher thant the + // canister creation cost, the newly created canister will keep extra cycles. + canister_creation_cycles_cost : opt nat64; + // Rate limit for the `register` call. + register_rate_limit : opt RateLimitConfig; + // Maximum number of latest delegation origins to track. + // Default: 1000 + max_num_latest_delegation_origins : opt nat64; +}; + +type ChallengeKey = text; + +type ChallengeResult = record { + key : ChallengeKey; + chars : text; +}; + +// Extra information about registration status for new devices +type DeviceRegistrationInfo = record { + // If present, the user has tentatively added a new device. This + // new device needs to be verified (see relevant endpoint) before + // 'expiration'. + tentative_device : opt DeviceData; + // The timestamp at which the anchor will turn off registration mode + // (and the tentative device will be forgotten, if any, and if not verified) + expiration: Timestamp; +}; + +// Information about the anchor +type IdentityAnchorInfo = record { + // All devices that can authenticate to this anchor + devices : vec DeviceWithUsage; + // Device registration status used when adding devices, see DeviceRegistrationInfo + device_registration: opt DeviceRegistrationInfo; +}; + +type AnchorCredentials = record { + credentials : vec WebAuthnCredential; + recovery_credentials : vec WebAuthnCredential; + recovery_phrases: vec PublicKey; +}; + +type WebAuthnCredential = record { + credential_id : CredentialId; + pubkey: PublicKey; +}; + +type DeployArchiveResult = variant { + // The archive was deployed successfully and the supplied wasm module has been installed. The principal of the archive + // canister is returned. + success: principal; + // Initial archive creation is already in progress. + creation_in_progress; + // Archive deployment failed. An error description is returned. + failed: text; +}; + +type BufferedArchiveEntry = record { + anchor_number: UserNumber; + timestamp: Timestamp; + sequence_number: nat64; + entry: blob; +}; + +// API V2 specific types +// WARNING: These type are experimental and may change in the future. + +type IdentityNumber = nat64; + +// Authentication method using WebAuthn signatures +// See https://www.w3.org/TR/webauthn-2/ +// This is a separate type because WebAuthn requires to also store +// the credential id (in addition to the public key). +type WebAuthn = record { + credential_id: CredentialId; + pubkey: PublicKey; +}; + +// Authentication method using generic signatures +// See https://internetcomputer.org/docs/current/references/ic-interface-spec/#signatures for +// supported signature schemes. +type PublicKeyAuthn = record { + pubkey: PublicKey; +}; + +// The authentication methods currently supported by II. +type AuthnMethod = variant { + webauthn: WebAuthn; + pubkey: PublicKeyAuthn; +}; + +// This describes whether an authentication method is "protected" or not. +// When protected, a authentication method can only be updated or removed if the +// user is authenticated with that very authentication method. +type AuthnMethodProtection = variant { + protected; + unprotected; +}; + +type AuthnMethodData = record { + authn_method: AuthnMethod; + protection: AuthnMethodProtection; + purpose: Purpose; + // contains the following fields of the DeviceWithUsage type: + // - alias + // - origin + // - key_type: reduced to "platform", "cross_platform" on migration + // Note: for compatibility reasons with the v1 API, the entries above (if present) + // must be of the `string` variant. This restriction may be lifted in the future. + metadata: MetadataMap; + last_authentication: opt Timestamp; +}; + +// Extra information about registration status for new authentication methods +type AuthnMethodRegistrationInfo = record { + // If present, the user has registered a new authentication method. This + // new authentication needs to be verified before 'expiration' in order to + // be added to the identity. + authn_method : opt AuthnMethodData; + // The timestamp at which the identity will turn off registration mode + // (and the authentication method will be forgotten, if any, and if not verified) + expiration: Timestamp; +}; + +type IdentityInfo = record { + authn_methods: vec AuthnMethodData; + authn_data_registration: opt AuthnMethodRegistrationInfo; +}; + +type IdentityInfoResponse = variant { + ok: IdentityInfo; +}; + +type AuthnMethodAddResponse = variant { + ok; + invalid_metadata: text; +}; + +service : (opt InternetIdentityInit) -> { + init_salt: () -> (); + create_challenge : () -> (Challenge); + register : (DeviceData, ChallengeResult, opt principal) -> (RegisterResponse); + add : (UserNumber, DeviceData) -> (); + update : (UserNumber, DeviceKey, DeviceData) -> (); + // Atomically replace device matching the device key with the new device data + replace : (UserNumber, DeviceKey, DeviceData) -> (); + remove : (UserNumber, DeviceKey) -> (); + // Returns all devices of the user (authentication and recovery) but no information about device registrations. + // Note: Clears out the 'alias' fields on the devices. Use 'get_anchor_info' to obtain the full information. + // Deprecated: Use 'get_anchor_credentials' instead. + lookup : (UserNumber) -> (vec DeviceData) query; + get_anchor_credentials : (UserNumber) -> (AnchorCredentials) query; + get_anchor_info : (UserNumber) -> (IdentityAnchorInfo); + get_principal : (UserNumber, FrontendHostname) -> (principal) query; + stats : () -> (InternetIdentityStats) query; + + enter_device_registration_mode : (UserNumber) -> (Timestamp); + exit_device_registration_mode : (UserNumber) -> (); + add_tentative_device : (UserNumber, DeviceData) -> (AddTentativeDeviceResponse); + verify_tentative_device : (UserNumber, verification_code: text) -> (VerifyTentativeDeviceResponse); + + prepare_delegation : (UserNumber, FrontendHostname, SessionKey, maxTimeToLive : opt nat64) -> (UserKey, Timestamp); + get_delegation: (UserNumber, FrontendHostname, SessionKey, Timestamp) -> (GetDelegationResponse) query; + + http_request: (request: HttpRequest) -> (HttpResponse) query; + http_request_update: (request: HttpRequest) -> (HttpResponse); + + deploy_archive: (wasm: blob) -> (DeployArchiveResult); + /// Returns a batch of entries _sorted by sequence number_ to be archived. + /// This is an update call because the archive information _must_ be certified. + /// Only callable by this IIs archive canister. + fetch_entries: () -> (vec BufferedArchiveEntry); + acknowledge_entries: (sequence_number: nat64) -> (); + + // V2 API + // WARNING: The following methods are experimental and may change in the future. + // + // Note: the responses of v2 API calls are `opt` for compatibility reasons + // with future variant extensions. + // A client decoding a response as `null` indicates outdated type information + // and should be treated as an error. + + // Returns information about the identity with the given number. + // Requires authentication. + identity_info: (IdentityNumber) -> (opt IdentityInfoResponse); + + // Adds a new authentication method to the identity. + // Requires authentication. + authn_method_add: (IdentityNumber, AuthnMethodData) -> (opt AuthnMethodAddResponse); +} diff --git a/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.d.ts b/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.d.ts new file mode 100644 index 000000000..f430c51d4 --- /dev/null +++ b/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.d.ts @@ -0,0 +1,272 @@ +import type { Principal } from '@dfinity/principal'; +import type { ActorMethod } from '@dfinity/agent'; + +export interface ActiveAnchorCounter { + 'counter' : bigint, + 'start_timestamp' : Timestamp, +} +export interface ActiveAnchorStatistics { + 'completed' : CompletedActiveAnchorStats, + 'ongoing' : OngoingActiveAnchorStats, +} +export type AddTentativeDeviceResponse = { + 'device_registration_mode_off' : null + } | + { 'another_device_tentatively_added' : null } | + { + 'added_tentatively' : { + 'verification_code' : string, + 'device_registration_timeout' : Timestamp, + } + }; +export interface AnchorCredentials { + 'recovery_phrases' : Array, + 'credentials' : Array, + 'recovery_credentials' : Array, +} +export interface ArchiveConfig { + 'polling_interval_ns' : bigint, + 'entries_buffer_limit' : bigint, + 'module_hash' : Uint8Array | number[], + 'entries_fetch_limit' : number, +} +export interface ArchiveInfo { + 'archive_config' : [] | [ArchiveConfig], + 'archive_canister' : [] | [Principal], +} +export type AuthnMethod = { 'webauthn' : WebAuthn } | + { 'pubkey' : PublicKeyAuthn }; +export type AuthnMethodAddResponse = { 'ok' : null } | + { 'invalid_metadata' : string }; +export interface AuthnMethodData { + 'metadata' : MetadataMap, + 'protection' : AuthnMethodProtection, + 'last_authentication' : [] | [Timestamp], + 'authn_method' : AuthnMethod, + 'purpose' : Purpose, +} +export type AuthnMethodProtection = { 'unprotected' : null } | + { 'protected' : null }; +export interface AuthnMethodRegistrationInfo { + 'expiration' : Timestamp, + 'authn_method' : [] | [AuthnMethodData], +} +export interface BufferedArchiveEntry { + 'sequence_number' : bigint, + 'entry' : Uint8Array | number[], + 'anchor_number' : UserNumber, + 'timestamp' : Timestamp, +} +export interface Challenge { + 'png_base64' : string, + 'challenge_key' : ChallengeKey, +} +export type ChallengeKey = string; +export interface ChallengeResult { 'key' : ChallengeKey, 'chars' : string } +export interface CompletedActiveAnchorStats { + 'monthly_active_anchors' : [] | [ActiveAnchorCounter], + 'daily_active_anchors' : [] | [ActiveAnchorCounter], +} +export type CredentialId = Uint8Array | number[]; +export interface Delegation { + 'pubkey' : PublicKey, + 'targets' : [] | [Array], + 'expiration' : Timestamp, +} +export type DeployArchiveResult = { 'creation_in_progress' : null } | + { 'success' : Principal } | + { 'failed' : string }; +export interface DeviceData { + 'alias' : string, + 'metadata' : [] | [MetadataMap], + 'origin' : [] | [string], + 'protection' : DeviceProtection, + 'pubkey' : DeviceKey, + 'key_type' : KeyType, + 'purpose' : Purpose, + 'credential_id' : [] | [CredentialId], +} +export type DeviceKey = PublicKey; +export type DeviceProtection = { 'unprotected' : null } | + { 'protected' : null }; +export interface DeviceRegistrationInfo { + 'tentative_device' : [] | [DeviceData], + 'expiration' : Timestamp, +} +export interface DeviceWithUsage { + 'alias' : string, + 'last_usage' : [] | [Timestamp], + 'metadata' : [] | [MetadataMap], + 'origin' : [] | [string], + 'protection' : DeviceProtection, + 'pubkey' : DeviceKey, + 'key_type' : KeyType, + 'purpose' : Purpose, + 'credential_id' : [] | [CredentialId], +} +export interface DomainActiveAnchorCounter { + 'start_timestamp' : Timestamp, + 'internetcomputer_org_counter' : bigint, + 'ic0_app_counter' : bigint, + 'both_ii_domains_counter' : bigint, +} +export interface DomainActiveAnchorStatistics { + 'completed' : DomainCompletedActiveAnchorStats, + 'ongoing' : DomainOngoingActiveAnchorStats, +} +export interface DomainCompletedActiveAnchorStats { + 'monthly_active_anchors' : [] | [DomainActiveAnchorCounter], + 'daily_active_anchors' : [] | [DomainActiveAnchorCounter], +} +export interface DomainOngoingActiveAnchorStats { + 'monthly_active_anchors' : Array, + 'daily_active_anchors' : DomainActiveAnchorCounter, +} +export type FrontendHostname = string; +export type GetDelegationResponse = { 'no_such_delegation' : null } | + { 'signed_delegation' : SignedDelegation }; +export type HeaderField = [string, string]; +export interface HttpRequest { + 'url' : string, + 'method' : string, + 'body' : Uint8Array | number[], + 'headers' : Array, + 'certificate_version' : [] | [number], +} +export interface HttpResponse { + 'body' : Uint8Array | number[], + 'headers' : Array, + 'upgrade' : [] | [boolean], + 'streaming_strategy' : [] | [StreamingStrategy], + 'status_code' : number, +} +export interface IdentityAnchorInfo { + 'devices' : Array, + 'device_registration' : [] | [DeviceRegistrationInfo], +} +export interface IdentityInfo { + 'authn_methods' : Array, + 'authn_data_registration' : [] | [AuthnMethodRegistrationInfo], +} +export type IdentityInfoResponse = { 'ok' : IdentityInfo }; +export type IdentityNumber = bigint; +export interface InternetIdentityInit { + 'max_num_latest_delegation_origins' : [] | [bigint], + 'assigned_user_number_range' : [] | [[bigint, bigint]], + 'archive_config' : [] | [ArchiveConfig], + 'canister_creation_cycles_cost' : [] | [bigint], + 'register_rate_limit' : [] | [RateLimitConfig], +} +export interface InternetIdentityStats { + 'storage_layout_version' : number, + 'users_registered' : bigint, + 'domain_active_anchor_stats' : [] | [DomainActiveAnchorStatistics], + 'max_num_latest_delegation_origins' : bigint, + 'assigned_user_number_range' : [bigint, bigint], + 'latest_delegation_origins' : Array, + 'archive_info' : ArchiveInfo, + 'canister_creation_cycles_cost' : bigint, + 'active_anchor_stats' : [] | [ActiveAnchorStatistics], +} +export type KeyType = { 'platform' : null } | + { 'seed_phrase' : null } | + { 'cross_platform' : null } | + { 'unknown' : null }; +export type MetadataMap = Array< + [ + string, + { 'map' : MetadataMap } | + { 'string' : string } | + { 'bytes' : Uint8Array | number[] }, + ] +>; +export interface OngoingActiveAnchorStats { + 'monthly_active_anchors' : Array, + 'daily_active_anchors' : ActiveAnchorCounter, +} +export type PublicKey = Uint8Array | number[]; +export interface PublicKeyAuthn { 'pubkey' : PublicKey } +export type Purpose = { 'authentication' : null } | + { 'recovery' : null }; +export interface RateLimitConfig { + 'max_tokens' : bigint, + 'time_per_token_ns' : bigint, +} +export type RegisterResponse = { 'bad_challenge' : null } | + { 'canister_full' : null } | + { 'registered' : { 'user_number' : UserNumber } }; +export type SessionKey = PublicKey; +export interface SignedDelegation { + 'signature' : Uint8Array | number[], + 'delegation' : Delegation, +} +export interface StreamingCallbackHttpResponse { + 'token' : [] | [Token], + 'body' : Uint8Array | number[], +} +export type StreamingStrategy = { + 'Callback' : { 'token' : Token, 'callback' : [Principal, string] } + }; +export type Timestamp = bigint; +export type Token = {}; +export type UserKey = PublicKey; +export type UserNumber = bigint; +export type VerifyTentativeDeviceResponse = { + 'device_registration_mode_off' : null + } | + { 'verified' : null } | + { 'wrong_code' : { 'retries_left' : number } } | + { 'no_device_to_verify' : null }; +export interface WebAuthn { + 'pubkey' : PublicKey, + 'credential_id' : CredentialId, +} +export interface WebAuthnCredential { + 'pubkey' : PublicKey, + 'credential_id' : CredentialId, +} +export interface _SERVICE { + 'acknowledge_entries' : ActorMethod<[bigint], undefined>, + 'add' : ActorMethod<[UserNumber, DeviceData], undefined>, + 'add_tentative_device' : ActorMethod< + [UserNumber, DeviceData], + AddTentativeDeviceResponse + >, + 'authn_method_add' : ActorMethod< + [IdentityNumber, AuthnMethodData], + [] | [AuthnMethodAddResponse] + >, + 'create_challenge' : ActorMethod<[], Challenge>, + 'deploy_archive' : ActorMethod<[Uint8Array | number[]], DeployArchiveResult>, + 'enter_device_registration_mode' : ActorMethod<[UserNumber], Timestamp>, + 'exit_device_registration_mode' : ActorMethod<[UserNumber], undefined>, + 'fetch_entries' : ActorMethod<[], Array>, + 'get_anchor_credentials' : ActorMethod<[UserNumber], AnchorCredentials>, + 'get_anchor_info' : ActorMethod<[UserNumber], IdentityAnchorInfo>, + 'get_delegation' : ActorMethod< + [UserNumber, FrontendHostname, SessionKey, Timestamp], + GetDelegationResponse + >, + 'get_principal' : ActorMethod<[UserNumber, FrontendHostname], Principal>, + 'http_request' : ActorMethod<[HttpRequest], HttpResponse>, + 'http_request_update' : ActorMethod<[HttpRequest], HttpResponse>, + 'identity_info' : ActorMethod<[IdentityNumber], [] | [IdentityInfoResponse]>, + 'init_salt' : ActorMethod<[], undefined>, + 'lookup' : ActorMethod<[UserNumber], Array>, + 'prepare_delegation' : ActorMethod< + [UserNumber, FrontendHostname, SessionKey, [] | [bigint]], + [UserKey, Timestamp] + >, + 'register' : ActorMethod< + [DeviceData, ChallengeResult, [] | [Principal]], + RegisterResponse + >, + 'remove' : ActorMethod<[UserNumber, DeviceKey], undefined>, + 'replace' : ActorMethod<[UserNumber, DeviceKey, DeviceData], undefined>, + 'stats' : ActorMethod<[], InternetIdentityStats>, + 'update' : ActorMethod<[UserNumber, DeviceKey, DeviceData], undefined>, + 'verify_tentative_device' : ActorMethod< + [UserNumber, string], + VerifyTentativeDeviceResponse + >, +} diff --git a/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.js b/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.js new file mode 100644 index 000000000..549af0b96 --- /dev/null +++ b/motoko/ic-pos/src/declarations/internet_identity/internet_identity.did.js @@ -0,0 +1,340 @@ +export const idlFactory = ({ IDL }) => { + const MetadataMap = IDL.Rec(); + const ArchiveConfig = IDL.Record({ + 'polling_interval_ns' : IDL.Nat64, + 'entries_buffer_limit' : IDL.Nat64, + 'module_hash' : IDL.Vec(IDL.Nat8), + 'entries_fetch_limit' : IDL.Nat16, + }); + const RateLimitConfig = IDL.Record({ + 'max_tokens' : IDL.Nat64, + 'time_per_token_ns' : IDL.Nat64, + }); + const InternetIdentityInit = IDL.Record({ + 'max_num_latest_delegation_origins' : IDL.Opt(IDL.Nat64), + 'assigned_user_number_range' : IDL.Opt(IDL.Tuple(IDL.Nat64, IDL.Nat64)), + 'archive_config' : IDL.Opt(ArchiveConfig), + 'canister_creation_cycles_cost' : IDL.Opt(IDL.Nat64), + 'register_rate_limit' : IDL.Opt(RateLimitConfig), + }); + const UserNumber = IDL.Nat64; + MetadataMap.fill( + IDL.Vec( + IDL.Tuple( + IDL.Text, + IDL.Variant({ + 'map' : MetadataMap, + 'string' : IDL.Text, + 'bytes' : IDL.Vec(IDL.Nat8), + }), + ) + ) + ); + const DeviceProtection = IDL.Variant({ + 'unprotected' : IDL.Null, + 'protected' : IDL.Null, + }); + const PublicKey = IDL.Vec(IDL.Nat8); + const DeviceKey = PublicKey; + const KeyType = IDL.Variant({ + 'platform' : IDL.Null, + 'seed_phrase' : IDL.Null, + 'cross_platform' : IDL.Null, + 'unknown' : IDL.Null, + }); + const Purpose = IDL.Variant({ + 'authentication' : IDL.Null, + 'recovery' : IDL.Null, + }); + const CredentialId = IDL.Vec(IDL.Nat8); + const DeviceData = IDL.Record({ + 'alias' : IDL.Text, + 'metadata' : IDL.Opt(MetadataMap), + 'origin' : IDL.Opt(IDL.Text), + 'protection' : DeviceProtection, + 'pubkey' : DeviceKey, + 'key_type' : KeyType, + 'purpose' : Purpose, + 'credential_id' : IDL.Opt(CredentialId), + }); + const Timestamp = IDL.Nat64; + const AddTentativeDeviceResponse = IDL.Variant({ + 'device_registration_mode_off' : IDL.Null, + 'another_device_tentatively_added' : IDL.Null, + 'added_tentatively' : IDL.Record({ + 'verification_code' : IDL.Text, + 'device_registration_timeout' : Timestamp, + }), + }); + const IdentityNumber = IDL.Nat64; + const AuthnMethodProtection = IDL.Variant({ + 'unprotected' : IDL.Null, + 'protected' : IDL.Null, + }); + const WebAuthn = IDL.Record({ + 'pubkey' : PublicKey, + 'credential_id' : CredentialId, + }); + const PublicKeyAuthn = IDL.Record({ 'pubkey' : PublicKey }); + const AuthnMethod = IDL.Variant({ + 'webauthn' : WebAuthn, + 'pubkey' : PublicKeyAuthn, + }); + const AuthnMethodData = IDL.Record({ + 'metadata' : MetadataMap, + 'protection' : AuthnMethodProtection, + 'last_authentication' : IDL.Opt(Timestamp), + 'authn_method' : AuthnMethod, + 'purpose' : Purpose, + }); + const AuthnMethodAddResponse = IDL.Variant({ + 'ok' : IDL.Null, + 'invalid_metadata' : IDL.Text, + }); + const ChallengeKey = IDL.Text; + const Challenge = IDL.Record({ + 'png_base64' : IDL.Text, + 'challenge_key' : ChallengeKey, + }); + const DeployArchiveResult = IDL.Variant({ + 'creation_in_progress' : IDL.Null, + 'success' : IDL.Principal, + 'failed' : IDL.Text, + }); + const BufferedArchiveEntry = IDL.Record({ + 'sequence_number' : IDL.Nat64, + 'entry' : IDL.Vec(IDL.Nat8), + 'anchor_number' : UserNumber, + 'timestamp' : Timestamp, + }); + const WebAuthnCredential = IDL.Record({ + 'pubkey' : PublicKey, + 'credential_id' : CredentialId, + }); + const AnchorCredentials = IDL.Record({ + 'recovery_phrases' : IDL.Vec(PublicKey), + 'credentials' : IDL.Vec(WebAuthnCredential), + 'recovery_credentials' : IDL.Vec(WebAuthnCredential), + }); + const DeviceWithUsage = IDL.Record({ + 'alias' : IDL.Text, + 'last_usage' : IDL.Opt(Timestamp), + 'metadata' : IDL.Opt(MetadataMap), + 'origin' : IDL.Opt(IDL.Text), + 'protection' : DeviceProtection, + 'pubkey' : DeviceKey, + 'key_type' : KeyType, + 'purpose' : Purpose, + 'credential_id' : IDL.Opt(CredentialId), + }); + const DeviceRegistrationInfo = IDL.Record({ + 'tentative_device' : IDL.Opt(DeviceData), + 'expiration' : Timestamp, + }); + const IdentityAnchorInfo = IDL.Record({ + 'devices' : IDL.Vec(DeviceWithUsage), + 'device_registration' : IDL.Opt(DeviceRegistrationInfo), + }); + const FrontendHostname = IDL.Text; + const SessionKey = PublicKey; + const Delegation = IDL.Record({ + 'pubkey' : PublicKey, + 'targets' : IDL.Opt(IDL.Vec(IDL.Principal)), + 'expiration' : Timestamp, + }); + const SignedDelegation = IDL.Record({ + 'signature' : IDL.Vec(IDL.Nat8), + 'delegation' : Delegation, + }); + const GetDelegationResponse = IDL.Variant({ + 'no_such_delegation' : IDL.Null, + 'signed_delegation' : SignedDelegation, + }); + const HeaderField = IDL.Tuple(IDL.Text, IDL.Text); + const HttpRequest = IDL.Record({ + 'url' : IDL.Text, + 'method' : IDL.Text, + 'body' : IDL.Vec(IDL.Nat8), + 'headers' : IDL.Vec(HeaderField), + 'certificate_version' : IDL.Opt(IDL.Nat16), + }); + const Token = IDL.Record({}); + const StreamingCallbackHttpResponse = IDL.Record({ + 'token' : IDL.Opt(Token), + 'body' : IDL.Vec(IDL.Nat8), + }); + const StreamingStrategy = IDL.Variant({ + 'Callback' : IDL.Record({ + 'token' : Token, + 'callback' : IDL.Func( + [Token], + [StreamingCallbackHttpResponse], + ['query'], + ), + }), + }); + const HttpResponse = IDL.Record({ + 'body' : IDL.Vec(IDL.Nat8), + 'headers' : IDL.Vec(HeaderField), + 'upgrade' : IDL.Opt(IDL.Bool), + 'streaming_strategy' : IDL.Opt(StreamingStrategy), + 'status_code' : IDL.Nat16, + }); + const AuthnMethodRegistrationInfo = IDL.Record({ + 'expiration' : Timestamp, + 'authn_method' : IDL.Opt(AuthnMethodData), + }); + const IdentityInfo = IDL.Record({ + 'authn_methods' : IDL.Vec(AuthnMethodData), + 'authn_data_registration' : IDL.Opt(AuthnMethodRegistrationInfo), + }); + const IdentityInfoResponse = IDL.Variant({ 'ok' : IdentityInfo }); + const UserKey = PublicKey; + const ChallengeResult = IDL.Record({ + 'key' : ChallengeKey, + 'chars' : IDL.Text, + }); + const RegisterResponse = IDL.Variant({ + 'bad_challenge' : IDL.Null, + 'canister_full' : IDL.Null, + 'registered' : IDL.Record({ 'user_number' : UserNumber }), + }); + const DomainActiveAnchorCounter = IDL.Record({ + 'start_timestamp' : Timestamp, + 'internetcomputer_org_counter' : IDL.Nat64, + 'ic0_app_counter' : IDL.Nat64, + 'both_ii_domains_counter' : IDL.Nat64, + }); + const DomainCompletedActiveAnchorStats = IDL.Record({ + 'monthly_active_anchors' : IDL.Opt(DomainActiveAnchorCounter), + 'daily_active_anchors' : IDL.Opt(DomainActiveAnchorCounter), + }); + const DomainOngoingActiveAnchorStats = IDL.Record({ + 'monthly_active_anchors' : IDL.Vec(DomainActiveAnchorCounter), + 'daily_active_anchors' : DomainActiveAnchorCounter, + }); + const DomainActiveAnchorStatistics = IDL.Record({ + 'completed' : DomainCompletedActiveAnchorStats, + 'ongoing' : DomainOngoingActiveAnchorStats, + }); + const ArchiveInfo = IDL.Record({ + 'archive_config' : IDL.Opt(ArchiveConfig), + 'archive_canister' : IDL.Opt(IDL.Principal), + }); + const ActiveAnchorCounter = IDL.Record({ + 'counter' : IDL.Nat64, + 'start_timestamp' : Timestamp, + }); + const CompletedActiveAnchorStats = IDL.Record({ + 'monthly_active_anchors' : IDL.Opt(ActiveAnchorCounter), + 'daily_active_anchors' : IDL.Opt(ActiveAnchorCounter), + }); + const OngoingActiveAnchorStats = IDL.Record({ + 'monthly_active_anchors' : IDL.Vec(ActiveAnchorCounter), + 'daily_active_anchors' : ActiveAnchorCounter, + }); + const ActiveAnchorStatistics = IDL.Record({ + 'completed' : CompletedActiveAnchorStats, + 'ongoing' : OngoingActiveAnchorStats, + }); + const InternetIdentityStats = IDL.Record({ + 'storage_layout_version' : IDL.Nat8, + 'users_registered' : IDL.Nat64, + 'domain_active_anchor_stats' : IDL.Opt(DomainActiveAnchorStatistics), + 'max_num_latest_delegation_origins' : IDL.Nat64, + 'assigned_user_number_range' : IDL.Tuple(IDL.Nat64, IDL.Nat64), + 'latest_delegation_origins' : IDL.Vec(FrontendHostname), + 'archive_info' : ArchiveInfo, + 'canister_creation_cycles_cost' : IDL.Nat64, + 'active_anchor_stats' : IDL.Opt(ActiveAnchorStatistics), + }); + const VerifyTentativeDeviceResponse = IDL.Variant({ + 'device_registration_mode_off' : IDL.Null, + 'verified' : IDL.Null, + 'wrong_code' : IDL.Record({ 'retries_left' : IDL.Nat8 }), + 'no_device_to_verify' : IDL.Null, + }); + return IDL.Service({ + 'acknowledge_entries' : IDL.Func([IDL.Nat64], [], []), + 'add' : IDL.Func([UserNumber, DeviceData], [], []), + 'add_tentative_device' : IDL.Func( + [UserNumber, DeviceData], + [AddTentativeDeviceResponse], + [], + ), + 'authn_method_add' : IDL.Func( + [IdentityNumber, AuthnMethodData], + [IDL.Opt(AuthnMethodAddResponse)], + [], + ), + 'create_challenge' : IDL.Func([], [Challenge], []), + 'deploy_archive' : IDL.Func([IDL.Vec(IDL.Nat8)], [DeployArchiveResult], []), + 'enter_device_registration_mode' : IDL.Func([UserNumber], [Timestamp], []), + 'exit_device_registration_mode' : IDL.Func([UserNumber], [], []), + 'fetch_entries' : IDL.Func([], [IDL.Vec(BufferedArchiveEntry)], []), + 'get_anchor_credentials' : IDL.Func( + [UserNumber], + [AnchorCredentials], + ['query'], + ), + 'get_anchor_info' : IDL.Func([UserNumber], [IdentityAnchorInfo], []), + 'get_delegation' : IDL.Func( + [UserNumber, FrontendHostname, SessionKey, Timestamp], + [GetDelegationResponse], + ['query'], + ), + 'get_principal' : IDL.Func( + [UserNumber, FrontendHostname], + [IDL.Principal], + ['query'], + ), + 'http_request' : IDL.Func([HttpRequest], [HttpResponse], ['query']), + 'http_request_update' : IDL.Func([HttpRequest], [HttpResponse], []), + 'identity_info' : IDL.Func( + [IdentityNumber], + [IDL.Opt(IdentityInfoResponse)], + [], + ), + 'init_salt' : IDL.Func([], [], []), + 'lookup' : IDL.Func([UserNumber], [IDL.Vec(DeviceData)], ['query']), + 'prepare_delegation' : IDL.Func( + [UserNumber, FrontendHostname, SessionKey, IDL.Opt(IDL.Nat64)], + [UserKey, Timestamp], + [], + ), + 'register' : IDL.Func( + [DeviceData, ChallengeResult, IDL.Opt(IDL.Principal)], + [RegisterResponse], + [], + ), + 'remove' : IDL.Func([UserNumber, DeviceKey], [], []), + 'replace' : IDL.Func([UserNumber, DeviceKey, DeviceData], [], []), + 'stats' : IDL.Func([], [InternetIdentityStats], ['query']), + 'update' : IDL.Func([UserNumber, DeviceKey, DeviceData], [], []), + 'verify_tentative_device' : IDL.Func( + [UserNumber, IDL.Text], + [VerifyTentativeDeviceResponse], + [], + ), + }); +}; +export const init = ({ IDL }) => { + const ArchiveConfig = IDL.Record({ + 'polling_interval_ns' : IDL.Nat64, + 'entries_buffer_limit' : IDL.Nat64, + 'module_hash' : IDL.Vec(IDL.Nat8), + 'entries_fetch_limit' : IDL.Nat16, + }); + const RateLimitConfig = IDL.Record({ + 'max_tokens' : IDL.Nat64, + 'time_per_token_ns' : IDL.Nat64, + }); + const InternetIdentityInit = IDL.Record({ + 'max_num_latest_delegation_origins' : IDL.Opt(IDL.Nat64), + 'assigned_user_number_range' : IDL.Opt(IDL.Tuple(IDL.Nat64, IDL.Nat64)), + 'archive_config' : IDL.Opt(ArchiveConfig), + 'canister_creation_cycles_cost' : IDL.Opt(IDL.Nat64), + 'register_rate_limit' : IDL.Opt(RateLimitConfig), + }); + return [IDL.Opt(InternetIdentityInit)]; +}; diff --git a/motoko/ic-pos/src/icpos/ckbtc-ledger/ckbtc-ledger.types.mo b/motoko/ic-pos/src/icpos/ckbtc-ledger/ckbtc-ledger.types.mo new file mode 100644 index 000000000..50ffbd83e --- /dev/null +++ b/motoko/ic-pos/src/icpos/ckbtc-ledger/ckbtc-ledger.types.mo @@ -0,0 +1,52 @@ +module CkBtcLedgerTypes { + + public type Actor = actor { + get_transactions : (GetTransactionsRequest) -> async GetTransactionsResponse; + }; + + public type Memo = Blob; + + public type Account = { owner : Principal; subaccount : ?Blob }; + + public type Mint = { + amount : Nat; + to : Account; + memo : ?Memo; + created_at_time : ?Nat64; + }; + + public type Burn = { + amount : Nat; + from : Account; + memo : ?Memo; + created_at_time : ?Nat64; + }; + + public type Transfer = { + amount : Nat; + from : Account; + to : Account; + memo : ?Memo; + fee : ?Nat; + created_at_time : ?Nat64; + }; + + public type Transaction = { + kind : Text; + mint : ?Mint; + burn : ?Burn; + transfer : ?Transfer; + timestamp : Nat64; + }; + + public type GetTransactionsResponse = { + log_length : Nat; + first_index : Nat; + transactions : [Transaction]; + }; + + public type GetTransactionsRequest = { + start : Nat; + length : Nat; + }; +}; diff --git a/motoko/ic-pos/src/icpos/http/http.types.mo b/motoko/ic-pos/src/icpos/http/http.types.mo new file mode 100644 index 000000000..cc5332bf8 --- /dev/null +++ b/motoko/ic-pos/src/icpos/http/http.types.mo @@ -0,0 +1,57 @@ +module Types { + + public type Timestamp = Nat64; + + //1. Type that describes the Request arguments for an HTTPS Outcall + //See: https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-http_request + public type HttpRequestArgs = { + url : Text; + max_response_bytes : ?Nat64; + headers : [HttpHeader]; + body : ?[Nat8]; + method : HttpMethod; + transform : ?TransformRawResponseFunction; + }; + + public type HttpHeader = { + name : Text; + value : Text; + }; + + public type HttpMethod = { + #get; + #post; + #head; + }; + + public type HttpResponsePayload = { + status : Nat; + headers : [HttpHeader]; + body : [Nat8]; + }; + + //2. HTTPS outcalls have an optional "transform" key. These two types help describe it. + //"The transform function may, for example, transform the body in any way, add or remove headers, + //modify headers, etc. " + //See: https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-http_request + + //2.1 This type describes a function called "TransformRawResponse" used in line 14 above + //"If provided, the calling canister itself must export this function." + //In this minimal example for a GET request, we declare the type for completeness, but + //we do not use this function. We will pass "null" to the HTTP request. + public type TransformRawResponseFunction = { + function : shared query TransformArgs -> async HttpResponsePayload; + context : Blob; + }; + + //2.2 This type describes the arguments the transform function needs + public type TransformArgs = { + response : HttpResponsePayload; + context : Blob; + }; + + //3. Declaring the IC management canister which we use to make the HTTPS outcall + public type IC = actor { + http_request : HttpRequestArgs -> async HttpResponsePayload; + }; +}; diff --git a/motoko/ic-pos/src/icpos/main.mo b/motoko/ic-pos/src/icpos/main.mo new file mode 100644 index 000000000..e0846f315 --- /dev/null +++ b/motoko/ic-pos/src/icpos/main.mo @@ -0,0 +1,270 @@ +// Importing base modules +import Array "mo:base/Array"; +import Blob "mo:base/Blob"; +import Char "mo:base/Char"; +import Cycles "mo:base/ExperimentalCycles"; +import Debug "mo:base/Debug"; +import HashMap "mo:base/HashMap"; +import Hash "mo:base/Hash"; +import Nat "mo:base/Nat"; +import Nat32 "mo:base/Nat32"; +import Nat64 "mo:base/Nat64"; +import Option "mo:base/Option"; +import Principal "mo:base/Principal"; +import Text "mo:base/Text"; +import Time "mo:base/Time"; +import Trie "mo:base/Trie"; +import TrieMap "mo:base/TrieMap"; +import Buffer "mo:base/Buffer"; + +// Importing local modules +import MainTypes "main.types"; +import CkBtcLedgerTypes "ckbtc-ledger/ckbtc-ledger.types"; +import HttpTypes "http/http.types"; + +/** +* This actor is responsible for: +* - Storing merchant information +* - Monitoring the ledger for new transactions +* - Notifying merchants of new transactions +* +* `_startBlock` is the block number to start monitoring transactions from. +*/ +shared (actorContext) actor class Main(_startBlock : Nat) { + + private stable var merchantStore : Trie.Trie = Trie.empty(); + private stable var latestTransactionIndex : Nat = 0; + private stable var courierApiKey : Text = ""; + private stable var ledgerActor : CkBtcLedgerTypes.Actor = actor ("mxzaz-hqaaa-aaaar-qaada-cai") : CkBtcLedgerTypes.Actor; + private var logData = Buffer.Buffer(0); + + /** + * Get the merchant's information + */ + public query (context) func getMerchant() : async MainTypes.Response { + let caller : Principal = context.caller; + + switch (Trie.get(merchantStore, merchantKey(Principal.toText(caller)), Text.equal)) { + case (?merchant) { + { + status = 200; + status_text = "OK"; + data = ?merchant; + error_text = null; + }; + }; + case null { + { + status = 404; + status_text = "Not Found"; + data = null; + error_text = ?("Merchant with principal ID: " # Principal.toText(caller) # " not found."); + }; + }; + }; + }; + + /** + * Update the merchant's information + */ + public shared (context) func updateMerchant(merchant : MainTypes.Merchant) : async MainTypes.Response { + + let caller : Principal = context.caller; + merchantStore := Trie.replace( + merchantStore, + merchantKey(Principal.toText(caller)), + Text.equal, + ?merchant, + ).0; + { + status = 200; + status_text = "OK"; + data = ?merchant; + error_text = null; + }; + }; + + /** + * Set the courier API key. Only the owner can set the courier API key. + */ + public shared (context) func setCourierApiKey(apiKey : Text) : async MainTypes.Response { + if (not Principal.equal(context.caller, actorContext.caller)) { + return { + status = 403; + status_text = "Forbidden"; + data = null; + error_text = ?"Only the owner can set the courier API key."; + }; + }; + courierApiKey := apiKey; + { + status = 200; + status_text = "OK"; + data = ?courierApiKey; + error_text = null; + }; + }; + + /** + * Set the ledger principal, used when monitoring transactions. Only the owner can set the Ledger principal. + */ + public shared (context) func setLedgerId(ledgerId : Text) : async MainTypes.Response { + if (not Principal.equal(context.caller, actorContext.caller)) { + return { + status = 403; + status_text = "Forbidden"; + data = null; + error_text = ?"Only the owner can set the Ledger principal."; + }; + }; + ledgerActor := actor (ledgerId); + { + status = 200; + status_text = "OK"; + data = ?ledgerId; + error_text = null; + }; + }; + + /** + * Get latest log items. Log output is capped at 100 items. + */ + public query func getLogs() : async [Text] { + Buffer.toArray(logData); + }; + + /** + * Log a message. Log output is capped at 100 items. + */ + private func log(text : Text) { + Debug.print(text); + logData.reserve(logData.size() + 1); + logData.insert(0, text); + // Cap the log at 100 items + if (logData.size() == 100) { + let x = logData.removeLast(); + }; + return; + }; + + /** + * Generate a Trie key based on a merchant's principal ID + */ + private func merchantKey(x : Text) : Trie.Key { + return { hash = Text.hash(x); key = x }; + }; + + /** + * Check for new transactions and notify the merchant if a new transaction is found. + * This function is called by the global timer. + */ + system func timer(setGlobalTimer : Nat64 -> ()) : async () { + let next = Nat64.fromIntWrap(Time.now()) + 20_000_000_000; // 20 seconds + setGlobalTimer(next); + await notify(); + }; + + /** + * Notify the merchant if a new transaction is found. + */ + private func notify() : async () { + var start : Nat = _startBlock; + if (latestTransactionIndex > 0) { + start := latestTransactionIndex + 1; + }; + + var response = await ledgerActor.get_transactions({ + start = start; + length = 1; + }); + + if (Array.size(response.transactions) > 0) { + latestTransactionIndex := start; + + if (response.transactions[0].kind == "transfer") { + let t = response.transactions[0]; + switch (t.transfer) { + case (?transfer) { + let to = transfer.to.owner; + switch (Trie.get(merchantStore, merchantKey(Principal.toText(to)), Text.equal)) { + case (?merchant) { + if (merchant.email_notifications or merchant.phone_notifications) { + log("Sending notification to: " # debug_show (merchant.email_address)); + await sendNotification(merchant, t); + }; + }; + case null { + // No action required if merchant not found + }; + }; + }; + case null { + // No action required if transfer is null + }; + }; + }; + }; + }; + + /** + * Send a notification to a merchant about a received payment + */ + private func sendNotification(merchant : MainTypes.Merchant, transaction : CkBtcLedgerTypes.Transaction) : async () { + // Managment canister + let ic : HttpTypes.IC = actor ("aaaaa-aa"); + + // Create request body + var amount = "0"; + var from = ""; + switch (transaction.transfer) { + case (?transfer) { + amount := Nat.toText(transfer.amount); + from := Principal.toText(transfer.from.owner); + }; + case null {}; + }; + let idempotencyKey : Text = Text.concat(merchant.name, Nat64.toText(transaction.timestamp)); + let requestBodyJson : Text = "{ \"idempotencyKey\": \"" # idempotencyKey # "\", \"email\": \"" # merchant.email_address # "\", \"phone\": \"" # merchant.phone_number # "\", \"amount\": \"" # amount # "\", \"payer\": \"" # from # "\"}"; + let requestBodyAsBlob : Blob = Text.encodeUtf8(requestBodyJson); + let requestBodyAsNat8 : [Nat8] = Blob.toArray(requestBodyAsBlob); + + // Setup request + let httpRequest : HttpTypes.HttpRequestArgs = { + // The notification service is hosted on Netlify and the URL is hardcoded + // in this example. In a real application, the URL would be configurable. + url = "https://icpos-notifications.xyz/.netlify/functions/notify"; + max_response_bytes = ?Nat64.fromNat(1000); + headers = [ + { name = "Content-Type"; value = "application/json" }, + ]; + body = ?requestBodyAsNat8; + method = #post; + transform = null; + }; + + // Cycle cost of sending a notification + // 49.14M + 5200 * request_size + 10400 * max_response_bytes + // 49.14M + (5200 * 1000) + (10400 * 1000) = 64.74M + Cycles.add(70_000_000); + + // Send the request + let httpResponse : HttpTypes.HttpResponsePayload = await ic.http_request(httpRequest); + + // Check the response + if (httpResponse.status > 299) { + let response_body : Blob = Blob.fromArray(httpResponse.body); + let decoded_text : Text = switch (Text.decodeUtf8(response_body)) { + case (null) { "No value returned" }; + case (?y) { y }; + }; + log("Error sending notification: " # decoded_text); + } else { + log("Notification sent"); + }; + }; + + system func postupgrade() { + // Make sure we start to montitor transactions from the block set on deployment + latestTransactionIndex := _startBlock; + }; +}; diff --git a/motoko/ic-pos/src/icpos/main.types.mo b/motoko/ic-pos/src/icpos/main.types.mo new file mode 100644 index 000000000..9bf0f25c6 --- /dev/null +++ b/motoko/ic-pos/src/icpos/main.types.mo @@ -0,0 +1,16 @@ +module Types { + public type Merchant = { + name : Text; + email_notifications : Bool; + email_address : Text; + phone_notifications : Bool; + phone_number : Text; + }; + + public type Response = { + status : Nat16; + status_text : Text; + data : ?T; + error_text : ?Text; + }; +}; diff --git a/motoko/ic-pos/src/icpos_frontend/App.tsx b/motoko/ic-pos/src/icpos_frontend/App.tsx new file mode 100644 index 000000000..a9f4c6c72 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/App.tsx @@ -0,0 +1,45 @@ +import FullpageLoading from "./components/FullpageLoading"; +import { GithubIcon } from "lucide-react"; +import React from "react"; +import { RouterProvider } from "@tanstack/router"; +import { Toaster } from "react-hot-toast"; +import { router } from "./router"; + +// document.documentElement.classList.add("dark"); + +function App() { + return ( + <> +

+ + ); +} + +export default App; diff --git a/motoko/ic-pos/src/icpos_frontend/assets/ckBTC.svg b/motoko/ic-pos/src/icpos_frontend/assets/ckBTC.svg new file mode 100644 index 000000000..bcb1acebd --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/assets/ckBTC.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/motoko/ic-pos/src/icpos_frontend/assets/dfinity-logo.png b/motoko/ic-pos/src/icpos_frontend/assets/dfinity-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e42c867048f84c726c2b8b2e78a3dfadf61c0644 GIT binary patch literal 55438 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%0D4yRLOz@|@UwFFeD$V|mUz1$}b3=Jc=45Jij~ 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 z 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 literal 0 HcmV?d00001 diff --git a/motoko/ic-pos/src/icpos_frontend/auth/context/AuthProvider.tsx b/motoko/ic-pos/src/icpos_frontend/auth/context/AuthProvider.tsx new file mode 100644 index 000000000..432f2576f --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/auth/context/AuthProvider.tsx @@ -0,0 +1,91 @@ +import { HttpAgent, Identity } from "@dfinity/agent"; +import { ReactNode, createContext, useEffect, useState } from "react"; + +import { AuthClient } from "@dfinity/auth-client"; +import { AuthContextType } from "../types/auth-context.type"; +import { createAgent } from "@dfinity/utils"; + +// Identity provider URL +const IDENTITY_PROVIDER = `${import.meta.env.VITE_IC_HOST}/?canisterId=${ + import.meta.env.VITE_CANISTER_ID_II +}#authorize`; + +// Create a context for authentication +export const AuthContext = createContext>({}); + +// AuthProvider component that provides authentication functionality to its children +export const AuthProvider = ({ children }: { children: ReactNode }) => { + // State variables + const [authClient, setAuthClient] = useState(); + const [identity, setIdentity] = useState(undefined); + const [agent, setAgent] = useState(undefined); + const [isAuthenticated, setIsAuthenticated] = useState( + undefined + ); + const [hasLoggedIn, setHasLoggedIn] = useState(false); + + // Initialize the auth client on component mount + useEffect(() => { + AuthClient.create({ + idleOptions: { + disableDefaultIdleCallback: true, + disableIdle: true, + }, + }).then(async (client) => { + const isAuthenticated = await client.isAuthenticated(); + setAuthClient(client); + setIsAuthenticated(isAuthenticated); + }); + }, []); + + // Function to handle login + const login = () => { + if (!authClient) return; + authClient.login({ + identityProvider: IDENTITY_PROVIDER, + onSuccess: async () => { + // Save the identity + const identity = authClient.getIdentity(); + setIdentity(identity); + + // Create an agent + const agent = await createAgent({ + identity, + host: import.meta.env.VITE_IC_HOST, + }); + if (import.meta.env.MODE === "development") { + await agent.fetchRootKey(); + } + setAgent(agent); + + setIsAuthenticated(true); + setHasLoggedIn(true); + }, + }); + }; + + // Function to handle logout + const logout = () => { + authClient?.logout(); + // setActor(undefined); + setIdentity(undefined); + setIsAuthenticated(false); + }; + + // Provide the auth context to children + return ( + + {children} + + ); +}; diff --git a/motoko/ic-pos/src/icpos_frontend/auth/hooks/useAuth.tsx b/motoko/ic-pos/src/icpos_frontend/auth/hooks/useAuth.tsx new file mode 100644 index 000000000..9592542d9 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/auth/hooks/useAuth.tsx @@ -0,0 +1,5 @@ +import { AuthContext } from "../context/AuthProvider"; +import { AuthContextType } from "../types/auth-context.type"; +import { useContext } from "react"; + +export const useAuth = (): Partial => useContext(AuthContext); diff --git a/motoko/ic-pos/src/icpos_frontend/auth/types/auth-context.type.ts b/motoko/ic-pos/src/icpos_frontend/auth/types/auth-context.type.ts new file mode 100644 index 000000000..1cd7ca6ec --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/auth/types/auth-context.type.ts @@ -0,0 +1,15 @@ +import { ActorSubclass, HttpAgent, Identity } from "@dfinity/agent"; + +import { AuthClient } from "@dfinity/auth-client"; +import { _SERVICE } from "../../../declarations/icpos_frontend/icpos_frontend.did"; + +export type AuthContextType = { + authClient: AuthClient | undefined; + actor: ActorSubclass<_SERVICE> | undefined; + identity: Identity | undefined; + agent: HttpAgent | undefined; + isAuthenticated: boolean | undefined; + hasLoggedIn: boolean; + login: () => void; + logout: () => void; +}; diff --git a/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-index/hooks/useCkBtcIndex.tsx b/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-index/hooks/useCkBtcIndex.tsx new file mode 100644 index 000000000..b46da24c1 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-index/hooks/useCkBtcIndex.tsx @@ -0,0 +1,27 @@ +import { IcrcIndexCanister } from "@dfinity/ledger"; +import { Principal } from "@dfinity/principal"; +import React from "react"; +import { useAuth } from "../../../auth/hooks/useAuth"; + +export default function useCkBtcIndex() { + const { identity, agent } = useAuth(); + const [indexCanister, setIndexCanister] = React.useState< + IcrcIndexCanister | undefined + >(); + + React.useEffect(() => { + if (!identity) return; + const init = async () => { + const indexCanister = IcrcIndexCanister.create({ + agent, + canisterId: Principal.fromText( + import.meta.env.VITE_CANISTER_ID_CKBTC_INDEX + ), + }); + setIndexCanister(indexCanister); + }; + init(); + }, [identity, agent]); + + return indexCanister; +} diff --git a/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedger.tsx b/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedger.tsx new file mode 100644 index 000000000..fa313a80a --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedger.tsx @@ -0,0 +1,52 @@ +import { IcrcLedgerCanister, IcrcTokenMetadataResponse } from "@dfinity/ledger"; +import { useCallback, useEffect, useState } from "react"; + +import { Principal } from "@dfinity/principal"; +import { useAuth } from "../../../auth/hooks/useAuth"; + +export default function useCkBtcLedger() { + const { identity, agent } = useAuth(); + const [ledgerCanister, setLedgerCanister] = useState< + IcrcLedgerCanister | undefined + >(); + + const [metadata, setMetadata] = useState(); + const [balance, setBalance] = useState(); + + const getMetadata = useCallback(async () => { + if (!ledgerCanister) { + throw new Error("LedgerCanister not initialized"); + } + setMetadata(await ledgerCanister.metadata({ certified: false })); + }, [ledgerCanister]); + + const getBalance = useCallback(async () => { + if (!ledgerCanister || !identity) { + return null; + } + setBalance( + await ledgerCanister.balance({ + owner: identity.getPrincipal(), + certified: false, + }) + ); + }, [ledgerCanister, identity]); + + useEffect(() => { + if (!identity || !agent || metadata || balance) return; + const init = async () => { + const ledgerCanister = IcrcLedgerCanister.create({ + agent, + canisterId: Principal.fromText( + import.meta.env.VITE_CANISTER_ID_CKBTC_LEDGER + ), + }); + setLedgerCanister(ledgerCanister); + await getMetadata(); + await getBalance(); + }; + init(); + }, [identity, agent, getBalance, getMetadata, metadata, balance]); + + return { ledgerCanister, getMetadata, getBalance, metadata, balance }; +} diff --git a/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedgerAnon.tsx b/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedgerAnon.tsx new file mode 100644 index 000000000..ca64a08a6 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/canisters/ckbtc-ledger/hooks/useCkBtcLedgerAnon.tsx @@ -0,0 +1,44 @@ +import { + Actor, + ActorSubclass, + AnonymousIdentity, + HttpAgent, +} from "@dfinity/agent"; + +import React from "react"; +import { _SERVICE } from "@dfinity/ledger/dist/candid/icrc1_ledger"; +import { idlFactory } from "@dfinity/ledger/dist/candid/icrc1_ledger.idl"; + +export function useCkBtcLedgerAnon() { + const [ckBtcLedger, setCkBtcLedger] = React.useState< + ActorSubclass<_SERVICE> | undefined + >(); + + const createActor = (): ActorSubclass<_SERVICE> => { + const agent = new HttpAgent({ + identity: new AnonymousIdentity(), + host: import.meta.env.VITE_IC_HOST, + }); + + if (import.meta.env.VITE_DFX_NETWORK !== "ic") { + agent.fetchRootKey().catch((err) => { + console.warn( + "Unable to fetch root key. Check to ensure that your local replica is running" + ); + console.error(err); + }); + } + // Creates an actor with using the candid interface and the HttpAgent + return Actor.createActor(idlFactory, { + agent, + canisterId: import.meta.env.VITE_CANISTER_ID_CKBTC_LEDGER, + }); + }; + + React.useEffect(() => { + const actor = createActor(); + setCkBtcLedger(actor); + }, []); + + return { ckBtcLedger }; +} diff --git a/motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/hooks/useIcPos.tsx b/motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/hooks/useIcPos.tsx new file mode 100644 index 000000000..4e269cffb --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/hooks/useIcPos.tsx @@ -0,0 +1,58 @@ +import { Merchant, _SERVICE } from "../../../../declarations/icpos/icpos.did"; + +import { ActorSubclass } from "@dfinity/agent"; +import { MerchantState } from "../state/merchant.state"; +import React from "react"; +import { createActor } from "../../../../declarations/icpos"; +import { useAuth } from "../../../auth/hooks/useAuth"; +import { useRecoilState } from "recoil"; + +export function useIcPos() { + const { isAuthenticated, authClient, hasLoggedIn, identity, agent } = + useAuth(); + const [icPos, setIcPos] = React.useState | null>( + null + ); + const [merchantState, setMerchantState] = useRecoilState(MerchantState); + + React.useEffect(() => { + if (!isAuthenticated || !authClient || !hasLoggedIn || !agent) return; + const actor = createActor(import.meta.env.VITE_CANISTER_ID_ICPOS, { + agent, + }); + setIcPos(actor); + }, [isAuthenticated, authClient, hasLoggedIn, identity, agent]); + + React.useEffect(() => { + if (!icPos) return; + icPos.getMerchant().then((response) => { + if (response.status === 200) { + if (!response.data) return; + setMerchantState({ + initialized: true, + merchant: response.data[0], + }); + return; + } + setMerchantState({ + initialized: true, + merchant: undefined, + }); + }); + }, [icPos, setMerchantState]); + + const updateMerchant = async (merchant: Merchant) => { + if (!icPos) return; + const response = await icPos.updateMerchant(merchant); + if (response.status === 200) { + if (!response.data) return; + setMerchantState({ + initialized: true, + merchant: response.data[0], + }); + } + return response; + }; + + return { merchantState, updateMerchant }; +} diff --git a/motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/state/merchant.state.ts b/motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/state/merchant.state.ts new file mode 100644 index 000000000..a07f34c87 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/canisters/ic-pos/state/merchant.state.ts @@ -0,0 +1,12 @@ +import { Merchant } from "../../../../declarations/icpos/icpos.did"; +import { atom } from "recoil"; + +type MerchantStateType = { + initialized: boolean; + merchant: Merchant | undefined; +}; + +export const MerchantState = atom({ + key: "MerchantState", + default: { initialized: false, merchant: undefined }, +}); diff --git a/motoko/ic-pos/src/icpos_frontend/canisters/icrc/types/transfer.type.ts b/motoko/ic-pos/src/icpos_frontend/canisters/icrc/types/transfer.type.ts new file mode 100644 index 000000000..ea5739c2e --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/canisters/icrc/types/transfer.type.ts @@ -0,0 +1,10 @@ +import { Account } from "@dfinity/ledger/dist/candid/icrc1_ledger"; + +export type Transfer = { + to: Account; + fee: [] | [bigint]; + from: Account; + memo: [] | [Uint8Array]; + created_at_time: [] | [bigint]; + amount: bigint; +}; diff --git a/motoko/ic-pos/src/icpos_frontend/components/FullpageLoading.tsx b/motoko/ic-pos/src/icpos_frontend/components/FullpageLoading.tsx new file mode 100644 index 000000000..d72f05862 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/FullpageLoading.tsx @@ -0,0 +1,12 @@ +import { Loader2 } from "lucide-react"; +import MainSection from "./MainSection"; + +export default function FullpageLoading() { + return ( + +
+ +
+
+ ); +} diff --git a/motoko/ic-pos/src/icpos_frontend/components/HeaderSection.tsx b/motoko/ic-pos/src/icpos_frontend/components/HeaderSection.tsx new file mode 100644 index 000000000..faec13863 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/HeaderSection.tsx @@ -0,0 +1,9 @@ +import { ReactNode } from "react"; + +export default function HeaderSection({ children }: { children: ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/motoko/ic-pos/src/icpos_frontend/components/HistoryButton.tsx b/motoko/ic-pos/src/icpos_frontend/components/HistoryButton.tsx new file mode 100644 index 000000000..a14cab77e --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/HistoryButton.tsx @@ -0,0 +1,24 @@ +import { Button } from "./ui/button"; +import { Inbox } from "lucide-react"; +import { Link } from "@tanstack/router"; + +type HistoryButtonProps = { + principal: string; +}; + +export default function HistoryButton({ principal }: HistoryButtonProps) { + return ( + + + + ); +} diff --git a/motoko/ic-pos/src/icpos_frontend/components/MainSection.tsx b/motoko/ic-pos/src/icpos_frontend/components/MainSection.tsx new file mode 100644 index 000000000..dbf1c3843 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/MainSection.tsx @@ -0,0 +1,5 @@ +import { ReactNode } from "react"; + +export default function MainSection({ children }: { children: ReactNode }) { + return
{children}
; +} diff --git a/motoko/ic-pos/src/icpos_frontend/components/Page.tsx b/motoko/ic-pos/src/icpos_frontend/components/Page.tsx new file mode 100644 index 000000000..1335db816 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/Page.tsx @@ -0,0 +1,10 @@ +import { ReactNode } from "react"; + +type PageProps = { + children: ReactNode; +}; + +export default function Page(props: PageProps) { + const { children } = props; + return children; +} diff --git a/motoko/ic-pos/src/icpos_frontend/components/PrincipalPill.tsx b/motoko/ic-pos/src/icpos_frontend/components/PrincipalPill.tsx new file mode 100644 index 000000000..23d957a7d --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/PrincipalPill.tsx @@ -0,0 +1,36 @@ +import DfinityLogo from "../assets/dfinity-logo.png"; +import { Principal } from "@dfinity/principal"; +import { principalToString } from "../utils/principalToString"; +import { shortenPrincipal } from "../utils/shortenPrincipal"; +import { toast } from "react-hot-toast"; + +function copyPrincipal(principal: string | Principal | undefined) { + if (principal) { + navigator.clipboard.writeText(principalToString(principal)); + toast.success("Copied"); + } +} + +type PrincipalPillProps = { + principal: string | Principal | undefined; + className?: string; + variant?: "short" | "full"; +}; + +export default function PrincipalPill({ + principal, + className, + variant = "short", +}: PrincipalPillProps) { + return ( +
copyPrincipal(principal)} + > + {" "} + {variant === "short" + ? shortenPrincipal(principal) + : principalToString(principal)} +
+ ); +} diff --git a/motoko/ic-pos/src/icpos_frontend/components/QRReader.tsx b/motoko/ic-pos/src/icpos_frontend/components/QRReader.tsx new file mode 100644 index 000000000..278f6936e --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/QRReader.tsx @@ -0,0 +1,33 @@ +import { Button } from "./ui/button"; +import { Result, useZxing } from "react-zxing"; + +type QrReaderProps = { + onResult: (result: Result) => void; + setVisible: (visible: boolean) => void; + visible: boolean; +}; + +export default function QRReader(props: QrReaderProps) { + const { ref } = useZxing({ + onResult: props.onResult, + paused: !props.visible, + constraints: { + video: { + facingMode: "environment", + }, + }, + }); + + if (!props.visible) return null; + return ( +
+
+
+ + +
+ ); +} diff --git a/motoko/ic-pos/src/icpos_frontend/components/ui/button.tsx b/motoko/ic-pos/src/icpos_frontend/components/ui/button.tsx new file mode 100644 index 000000000..829ceb796 --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import { cn } from "../../utils/shadcn"; + +const buttonVariants = cva( + "h-12 inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "px-4 py-2", + sm: "rounded-md px-3 text-xs", + lg: "rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + } +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/motoko/ic-pos/src/icpos_frontend/components/ui/form.tsx b/motoko/ic-pos/src/icpos_frontend/components/ui/form.tsx new file mode 100644 index 000000000..c6a85e50a --- /dev/null +++ b/motoko/ic-pos/src/icpos_frontend/components/ui/form.tsx @@ -0,0 +1,178 @@ +import * as LabelPrimitive from "@radix-ui/react-label"; +import * as React from "react"; + +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, + useFormContext, +} from "react-hook-form"; + +import { Label } from "./label"; +import { Slot } from "@radix-ui/react-slot"; +import { cn } from "../../utils/shadcn"; + +const Form = FormProvider; + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +> = { + name: TName; +}; + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue +); + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath +>({ + ...props +}: ControllerProps) => { + return ( + + + + ); +}; + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext); + const itemContext = React.useContext(FormItemContext); + const { getFieldState, formState } = useFormContext(); + + const fieldState = getFieldState(fieldContext.name, formState); + + if (!fieldContext) { + throw new Error("useFormField should be used within "); + } + + const { id } = itemContext; + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + }; +}; + +type FormItemContextValue = { + id: string; +}; + +const FormItemContext = React.createContext( + {} as FormItemContextValue +); + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId(); + + return ( + +
+ + ); +}); +FormItem.displayName = "FormItem"; + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField(); + + return ( +

V6qQK4D@7#i2fej__x6K(gUds;Enk`_f z6?I5VMR5I)k)FB9y8seDB!<5ssD{`;tf^DyM-|x-`&z}FWl&){T@j~Ug>0UVLw5UKxylJ|W1Q)RYCNni%fPK1F z4rwRI@5qgkmQjHw$$BnGV~F3$2dZs-!$S*$I)HqTDiS6C z(wS;=vgB(p*M|BwRd#CMZO^*m7eXsf_QD@NdHn48c=qhxv-NNdw!*z9?dh`%(uP+a z#k0JgbS3h7Jt7w7%m!SONH&IOsoF)XM4iDM1FD_W&S8e%5l}WW z)O?9=sn&dppKWs-RqE9|IDYKNF5sQbN`~2%VQJFwr%4SC4?QsD=HLG0(6ogML6MEP z-FAJSk{)1BUO)BSGizwf}+^3A{d$sM?mJ#ACJ^5dMQna`iCd(Zy-(YUw1 zc)p$jdhfmM;=M^=gGlHC2!UyGPUjr}Lt84dsMhK*RDKbXs*0HqFu$zf*3Qfd(8c#U zb7!lS#w@Zdjs|BLcRBXUv}LzF%yOHJ*jY5rbvVKnIBmw97W%lChTk9VxhgE|1T!4lR4uX#I%IDNpjlHUff~2S;A{oEgS_6Lo~MaG?o=`IxiNch z8hJS!%EKUHb|vI~~qNop=$T?X=plUxy4ULC|jI&r#gByz)UtGjgJ)-f@?-xY!5gMT%5#B0%S-?l~7TFgcRwZacxP{jcD3g z8e=ejSw^;@AGT(s@VsySz2h9AuqKr4O^`cfo#gnk_=greRZ@fnIjMN1VAN2xGf%0@ zz`X*%Y?vhLtF%Z!@@ggJOhc$3X9L71(4)&0!6=%`vT+~ebyea4lZ4nLQ*0qiYQ4cpG)nIc|gRMn7@(7jb9|NE~zj*ZOC==j4Fc&yJseh zh0OcZd_0)Wob8IMHwc(?uZFx%0DHRCJ#3@`=#O|U!yEwYeuJyrF5H(n(RrZWkkMV| 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