From c8a28eb0f276c317c0bd4a959805c812d4133ce7 Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Tue, 16 Jun 2026 19:58:45 +0200 Subject: [PATCH] chore: migrate rust/exchange-rates to icp-cli Replaces dfx.json with icp.yaml, moves source to backend/, updates Cargo.toml workspace, adds Makefile/rust-toolchain.toml, and adds CI workflow using icp-dev-env-rust:1.0.0 with rust recipe v3.3.0. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/exchange-rates.yml | 28 ++ rust/exchange-rates/Cargo.lock | 296 +++++++++----------- rust/exchange-rates/Cargo.toml | 16 +- rust/exchange-rates/Makefile | 18 ++ rust/exchange-rates/README.md | 42 ++- rust/exchange-rates/backend/Cargo.toml | 14 + rust/exchange-rates/{src => backend}/lib.rs | 0 rust/exchange-rates/dfx.json | 17 -- rust/exchange-rates/icp.yaml | 4 + rust/exchange-rates/rust-toolchain.toml | 2 + rust/exchange-rates/src/exchange-rates.did | 10 - 11 files changed, 237 insertions(+), 210 deletions(-) create mode 100644 .github/workflows/exchange-rates.yml create mode 100644 rust/exchange-rates/Makefile create mode 100644 rust/exchange-rates/backend/Cargo.toml rename rust/exchange-rates/{src => backend}/lib.rs (100%) delete mode 100644 rust/exchange-rates/dfx.json create mode 100644 rust/exchange-rates/icp.yaml create mode 100644 rust/exchange-rates/rust-toolchain.toml delete mode 100644 rust/exchange-rates/src/exchange-rates.did diff --git a/.github/workflows/exchange-rates.yml b/.github/workflows/exchange-rates.yml new file mode 100644 index 000000000..95c904c0e --- /dev/null +++ b/.github/workflows/exchange-rates.yml @@ -0,0 +1,28 @@ +name: exchange-rates + +on: + push: + branches: [master] + pull_request: + paths: + - rust/exchange-rates/** + - .github/workflows/exchange-rates.yml + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + rust-exchange-rates: + runs-on: ubuntu-24.04 + container: ghcr.io/dfinity/icp-dev-env-rust:1.0.0 + env: + ICP_CLI_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - name: Deploy and test + working-directory: rust/exchange-rates + run: | + icp network start -d + icp deploy + make test diff --git a/rust/exchange-rates/Cargo.lock b/rust/exchange-rates/Cargo.lock index 271783a60..e7312dbe6 100644 --- a/rust/exchange-rates/Cargo.lock +++ b/rust/exchange-rates/Cargo.lock @@ -4,9 +4,18 @@ version = 4 [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "ar_archive_writer" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4087686b4b0a3427190bae57a1d9a478dbb2d40c5dc1bd6e2b6d797913bdd348" +dependencies = [ + "object", +] [[package]] name = "arrayvec" @@ -16,9 +25,19 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "backend" +version = "0.1.0" +dependencies = [ + "candid", + "ic-cdk", + "ic-xrc-types", + "serde", +] [[package]] name = "binread" @@ -60,9 +79,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "candid" -version = "0.10.19" +version = "0.10.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea81e16df186fae1979175058f05dfbfac6e2fdf3b161edcbdc440ef09232cf" +checksum = "f8f781afa4a1303e3eab4ada0720a874942bcfa936ce01b816ac6378945c43a9" dependencies = [ "anyhow", "binread", @@ -83,21 +102,21 @@ dependencies = [ [[package]] name = "candid_derive" -version = "0.10.19" +version = "0.10.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6d499625531c41f474e55160a40313b33d002262ddaae40cade71bcc3bc75a" +checksum = "ad6ae8e7944dd0035651bc0e7b3a3e4cb16f5fc43f8ae4fd76b36ff2cd52759f" dependencies = [ "lazy_static", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] name = "cc" -version = "1.2.41" +version = "1.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f" dependencies = [ "find-msvc-tools", "shlex", @@ -129,9 +148,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -139,9 +158,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.11" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ "darling_core", "darling_macro", @@ -149,34 +168,33 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.11" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] name = "darling_macro" -version = "0.20.11" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] name = "digest" @@ -190,37 +208,21 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "exchange-rates-demo" -version = "0.1.0" -dependencies = [ - "candid", - "ic-cdk", - "ic-xrc-types", - "serde", -] +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "find-msvc-tools" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" - -[[package]] -name = "fnv" -version = "1.0.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -240,43 +242,42 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "ic-cdk" -version = "0.18.7" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4efb278f5d3ef033b3eed7f01f1096eaf67701896aa5ef69f5eddf5a84833dc0" +checksum = "6a7971f4983db147afbbc4e7f87f60b09fcd60ac707af37ff3d2468dcddbf551" dependencies = [ "candid", "ic-cdk-executor", "ic-cdk-macros", "ic-error-types", - "ic-management-canister-types", "ic0", + "pin-project-lite", "serde", - "serde_bytes", - "slotmap", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "ic-cdk-executor" -version = "1.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99f4ee8930fd2e491177e2eb7fff53ee1c407c13b9582bdc7d6920cf83109a2d" +checksum = "33716b730ded33690b8a704bff3533fda87d229e58046823647d28816e9bcee7" dependencies = [ "ic0", "slotmap", + "smallvec", ] [[package]] name = "ic-cdk-macros" -version = "0.18.7" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb14c5d691cc9d72bb95459b4761e3a4b3444b85a63d17555d5ddd782969a1e" +checksum = "a7c20c002200c720958f321bb78b4d4987fc2c380bf9ef69ed4404730810f45f" dependencies = [ "candid", "darling", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] @@ -290,17 +291,6 @@ dependencies = [ "strum_macros", ] -[[package]] -name = "ic-management-canister-types" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea7e5b8a0f7c3b320d9450ac950547db4f24a31601b5d398f9680b64427455d2" -dependencies = [ - "candid", - "serde", - "serde_bytes", -] - [[package]] name = "ic-xrc-types" version = "1.2.0" @@ -313,15 +303,15 @@ dependencies = [ [[package]] name = "ic0" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1499d08fd5be8f790d477e1865d63bab6a8d748300e141270c4296e6d5fdd6bc" +checksum = "c77c8932bff1f09502d0d8c079d5a206a06afe523e35e816162cf4d30b5bf80d" [[package]] name = "ic_principal" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1762deb6f7c8d8c2bdee4b6c5a47b60195b74e9b5280faa5ba29692f8e17429c" +checksum = "1aea751965eaf92990be8c79c64b4f3174ff22dd3604e6696a06a494afbaba2a" dependencies = [ "crc32fast", "data-encoding", @@ -344,15 +334,21 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leb128" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "memchr" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "num-bigint" @@ -383,12 +379,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + [[package]] name = "pretty" version = "0.12.5" @@ -402,27 +413,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "psm" -version = "0.1.27" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e66fcd288453b748497d8fb18bccc83a16b0518e3906d4b8df0a8d42d93dbb1c" +checksum = "645dbe486e346d9b5de3ef16ede18c26e6c70ad97418f4874b8b1889d6e761ea" dependencies = [ + "ar_archive_writer", "cc", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -470,7 +482,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] @@ -486,24 +498,30 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "slotmap" -version = "1.0.7" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" dependencies = [ "version_check", ] +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + [[package]] name = "stacker" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59" +checksum = "640c8cdd92b6b12f5bcb1803ca3bbf5ab96e5e6b6b96b9ab77dabe9e880b3190" dependencies = [ "cc", "cfg-if", @@ -537,7 +555,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] @@ -553,9 +571,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", @@ -573,11 +591,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -588,18 +606,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.118", ] [[package]] @@ -610,15 +628,15 @@ checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-width" @@ -633,74 +651,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "windows-sys" -version = "0.59.0" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] -name = "windows-targets" -version = "0.52.6" +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows-link", ] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/rust/exchange-rates/Cargo.toml b/rust/exchange-rates/Cargo.toml index 324c939c0..d1e49e317 100644 --- a/rust/exchange-rates/Cargo.toml +++ b/rust/exchange-rates/Cargo.toml @@ -1,13 +1,3 @@ -[package] -name = "exchange-rates-demo" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -candid = "0.10.19" -ic-cdk = "0.18.7" -ic-xrc-types = "1.2.0" -serde = "1.0.228" +[workspace] +members = ["backend"] +resolver = "2" diff --git a/rust/exchange-rates/Makefile b/rust/exchange-rates/Makefile new file mode 100644 index 000000000..5ffac7331 --- /dev/null +++ b/rust/exchange-rates/Makefile @@ -0,0 +1,18 @@ +.PHONY: test + +# Note: get_exchange_rate calls the XRC canister (uf6dk-hyaaa-aaaaq-qaaaq-cai) on mainnet. +# Live rate queries require deployment to the IC mainnet — the XRC canister does not exist +# on a local replica. The test below verifies the canister is deployed and callable. +# On mainnet, use: icp canister call --network ic backend get_exchange_rate \ +# '(record { symbol = "ICP"; class = variant { Cryptocurrency } }, \ +# record { symbol = "USD"; class = variant { FiatCurrency } })' +test: + @echo "=== Test 1: canister is deployed and get_exchange_rate exists ===" + @result=$$(icp canister call backend get_exchange_rate \ + '(record { symbol = "ICP"; class = variant { Cryptocurrency } }, record { symbol = "USD"; class = variant { FiatCurrency } })' 2>&1); \ + echo "$$result"; \ + (echo "$$result" | grep -qE 'trapped|Call to exchange canister failed|CanisterError|reject' && \ + echo "PASS: canister deployed; XRC call rejected as expected on local replica") || \ + (echo "$$result" | grep -qE '^[[:space:]]*\([0-9]' && \ + echo "PASS: got a rate response (running on mainnet)") || \ + (echo "FAIL" && exit 1) diff --git a/rust/exchange-rates/README.md b/rust/exchange-rates/README.md index 9f0253def..87d8ab817 100644 --- a/rust/exchange-rates/README.md +++ b/rust/exchange-rates/README.md @@ -1,5 +1,43 @@ # Exchange Rates Canister -A simple Rust canister demonstrating how to query the Internet Computer Exchange Rate Canister (XRC) to get cryptocurrency and fiat currency exchange rates. +A Rust canister demonstrating how to query the Internet Computer Exchange Rate Canister (XRC) to get cryptocurrency and fiat currency exchange rates. The XRC canister (`uf6dk-hyaaa-aaaaq-qaaaq-cai`) is a system canister on the IC mainnet that returns real-time exchange rates sourced via HTTPS outcalls to external data providers, with decentralized consensus across the subnet. -This canister can be deployed on [ICP Ninja](https://icp.ninja/) for quick testing and demonstration. +> **Note:** Live exchange rate queries require deployment to the IC mainnet — the XRC canister does not exist on a local replica. Local deployment verifies the canister builds and runs correctly; calling `get_exchange_rate` on local will trap as expected. + +## Build and deploy from the command line + +### Prerequisites + +- Node.js +- icp-cli: `npm install -g @icp-sdk/icp-cli @icp-sdk/ic-wasm` + +### Install + +```bash +git clone https://github.com/dfinity/examples +cd examples/rust/exchange-rates +``` + +### Deploy and test + +```bash +icp network start -d +icp deploy +make test +icp network stop +``` + +### Query on mainnet + +To query live exchange rates, deploy to the IC mainnet and call: + +```bash +icp deploy -e ic +icp canister call -e ic backend get_exchange_rate \ + '(record { symbol = "ICP"; class = variant { Cryptocurrency } }, \ + record { symbol = "USD"; class = variant { FiatCurrency } })' +``` + +## Security considerations and best practices + +Refer to the [security best practices](https://docs.internetcomputer.org/guides/security/overview) for information on security and best practices for your ICP app. diff --git a/rust/exchange-rates/backend/Cargo.toml b/rust/exchange-rates/backend/Cargo.toml new file mode 100644 index 000000000..0378d123d --- /dev/null +++ b/rust/exchange-rates/backend/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "backend" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] +path = "lib.rs" + +[dependencies] +candid = "0.10" +ic-cdk = "0.20" +ic-xrc-types = "1.2.0" +serde = "1.0" diff --git a/rust/exchange-rates/src/lib.rs b/rust/exchange-rates/backend/lib.rs similarity index 100% rename from rust/exchange-rates/src/lib.rs rename to rust/exchange-rates/backend/lib.rs diff --git a/rust/exchange-rates/dfx.json b/rust/exchange-rates/dfx.json deleted file mode 100644 index fbbbf1965..000000000 --- a/rust/exchange-rates/dfx.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "canisters": { - "exchange-rates": { - "candid": "src/exchange-rates.did", - "package": "exchange-rates-demo", - "type": "rust" - } - }, - "defaults": { - "build": { - "args": "", - "packtool": "" - } - }, - "output_env_file": ".env", - "version": 1 -} diff --git a/rust/exchange-rates/icp.yaml b/rust/exchange-rates/icp.yaml new file mode 100644 index 000000000..b7c87727a --- /dev/null +++ b/rust/exchange-rates/icp.yaml @@ -0,0 +1,4 @@ +canisters: + - name: backend + recipe: + type: "@dfinity/rust@v3.3.0" diff --git a/rust/exchange-rates/rust-toolchain.toml b/rust/exchange-rates/rust-toolchain.toml new file mode 100644 index 000000000..990104f05 --- /dev/null +++ b/rust/exchange-rates/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +targets = ["wasm32-unknown-unknown"] diff --git a/rust/exchange-rates/src/exchange-rates.did b/rust/exchange-rates/src/exchange-rates.did deleted file mode 100644 index 957e15b44..000000000 --- a/rust/exchange-rates/src/exchange-rates.did +++ /dev/null @@ -1,10 +0,0 @@ -type AssetClass = variant { Cryptocurrency; FiatCurrency; }; - -type Asset = record { - symbol: text; - class: AssetClass; -}; - -service exchange_rate_demo: { - get_exchange_rate: (base: Asset, quote: Asset) -> (nat); -}