diff --git a/.github/workflows/try-runtime.yml b/.github/workflows/try-runtime.yml index 1241ca94d0..24fc91268d 100644 --- a/.github/workflows/try-runtime.yml +++ b/.github/workflows/try-runtime.yml @@ -9,6 +9,7 @@ env: jobs: check-devnet: name: check devnet + if: github.base_ref != 'main' runs-on: SubtensorCI steps: - name: Checkout sources @@ -29,7 +30,7 @@ jobs: check-testnet: name: check testnet - # if: github.base_ref == 'testnet' || github.base_ref == 'devnet' || github.base_ref == 'main' + if: github.base_ref != 'main' runs-on: SubtensorCI steps: - name: Checkout sources diff --git a/Cargo.lock b/Cargo.lock index 7e5d44fc09..ce6924d7b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5918,9 +5918,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.70" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -5959,9 +5959,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.105" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", diff --git a/Dockerfile b/Dockerfile index 2439d5b2a2..35e1e20b56 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,5 @@ -ARG BASE_IMAGE=ubuntu:latest - -FROM $BASE_IMAGE AS builder -SHELL ["/bin/bash", "-c"] - -# Set noninteractive mode for apt-get -ARG DEBIAN_FRONTEND=noninteractive +ARG BASE_IMAGE=rust:1.83 +FROM $BASE_IMAGE AS base_builder LABEL ai.opentensor.image.authors="operations@opentensor.ai" \ ai.opentensor.image.vendor="Opentensor Foundation" \ @@ -12,37 +7,56 @@ LABEL ai.opentensor.image.authors="operations@opentensor.ai" \ ai.opentensor.image.description="Opentensor Subtensor Blockchain" \ ai.opentensor.image.documentation="https://docs.bittensor.com" +RUN rustup update stable +RUN rustup target add wasm32-unknown-unknown --toolchain stable + + # Set up Rust environment ENV RUST_BACKTRACE=1 -RUN apt-get update && \ - apt-get install -y curl build-essential protobuf-compiler clang git pkg-config libssl-dev && \ - rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y curl build-essential protobuf-compiler clang git pkg-config libssl-dev +RUN rm -rf /var/lib/apt/lists/* # Copy entire repository COPY . /build WORKDIR /build -# Install Rust -RUN set -o pipefail && curl https://sh.rustup.rs -sSf | sh -s -- -y -ENV PATH="/root/.cargo/bin:${PATH}" -RUN rustup toolchain install -RUN rustup target add wasm32-unknown-unknown - +# +# Image for building prod +# +FROM base_builder AS prod_builder # Build the project RUN cargo build -p node-subtensor --profile production --features="metadata-hash" --locked - -# Slim down image -RUN rm -rf /root/.cargo - # Verify the binary was produced RUN test -e /build/target/production/node-subtensor - EXPOSE 30333 9933 9944 +# +# Final prod image +# FROM $BASE_IMAGE AS subtensor - # Copy all chainspec files -COPY --from=builder /build/chainspecs/*.json / +COPY --from=prod_builder /build/*.json / +# Copy final binary +COPY --from=prod_builder /build/target/production/node-subtensor /usr/local/bin + + +# +# Image for building local +# +FROM base_builder AS local_builder +# Build the project +RUN cargo build --workspace --profile release --features="pow-faucet" +# Verify the binary was produced +RUN test -e /build/target/release/node-subtensor +EXPOSE 30333 9933 9944 + +# +# Final local image +# +FROM $BASE_IMAGE AS subtensor-local +# Copy all chainspec files +COPY --from=local_builder /build/*.json / # Copy final binary -COPY --from=builder /build/target/production/node-subtensor /usr/local/bin +COPY --from=local_builder /build/target/release/node-subtensor /usr/local/bin +RUN "node-subtensor" build-spec --disable-default-bootnode --raw --chain local > /localnet.json diff --git a/docker-compose.localnet.yml b/docker-compose.localnet.yml new file mode 100644 index 0000000000..30acb2fd94 --- /dev/null +++ b/docker-compose.localnet.yml @@ -0,0 +1,74 @@ +volumes: + subtensor-alice: + subtensor-bob: + +services: + common: &common + image: ghcr.io/opentensor/subtensor:latest-local + cpu_count: 4 + mem_limit: 40000000000 + memswap_limit: 80000000000 + environment: + - CARGO_HOME=/var/www/node-subtensor/.cargo + + alice: + <<: *common + container_name: subtensor-alice + build: + context: . + dockerfile: Dockerfile + target: subtensor-local + ports: + - "9944:9944" + - "30334:30334" + expose: + - 9944 + - 30334 + volumes: + - subtensor-alice:/tmp/blockchain + command: + - /bin/bash + - -c + - | + node-subtensor \ + --base-path /tmp/blockchain \ + --chain localnet.json \ + --rpc-external \ + --rpc-methods=unsafe \ + --alice \ + --port 30334 \ + --rpc-port 9944 \ + --validator \ + --rpc-cors=all \ + --allow-private-ipv4 \ + --discover-local \ + --unsafe-force-node-key-generation + + bob: + <<: *common + container_name: subtensor-bob + expose: + - 9945 + - 30335 + ports: + - "9945:9945" + - "30335:30335" + volumes: + - subtensor-bob:/tmp/blockchain + command: + - /bin/bash + - -c + - | + node-subtensor \ + --base-path /tmp/blockchain \ + --chain localnet.json \ + --bob \ + --rpc-methods=unsafe \ + --rpc-external \ + --port 30335 \ + --rpc-port 9945 \ + --validator \ + --rpc-cors=all \ + --allow-private-ipv4 \ + --discover-local \ + --unsafe-force-node-key-generation diff --git a/docs/running-subtensor-locally.md b/docs/running-subtensor-locally.md index 82bb87356d..070d4edb50 100644 --- a/docs/running-subtensor-locally.md +++ b/docs/running-subtensor-locally.md @@ -1,3 +1,32 @@ # Running subtensor node locally -See the [**Subtensor Nodes** section in Bittensor Developer Documentation](https://docs.bittensor.com/subtensor-nodes). +For General information on running Subtensors, see +[**Subtensor Nodes** section in Bittensor Developer Documentation](https://docs.bittensor.com/subtensor-nodes). + +### Running a localnet subtensor node + +Running a localnet in docker compose is the easiest way to quickly iterate on +chain state, like building on the evm. + +1. install docker and docker compose, along with cloning this repository. + +1. build the images from source on the desired branch using + `docker compose -f docker-compose.localnet.yml build`. Note this will take + quite a while. + +1. Run the docker compose file via + `docker compose -f docker-compose.localnet.yml up -d` + +Now you should have a full local validator running. To test your connection, you +can use the following script to check `//Alice`'s balance. Alice is a sudo +account in localnet. + +```py +# pip install substrate-interface +from substrateinterface import Keypair, SubstrateInterface + +substrate = SubstrateInterface(url="ws://127.0.0.1:9945") +hotkey = Keypair.create_from_uri('//Alice') +result = substrate.query("System", "Account", [hotkey.ss58_address]) +print(result.value) +``` diff --git a/pallets/subtensor/src/staking/stake_utils.rs b/pallets/subtensor/src/staking/stake_utils.rs index d00c478444..b67821a7d2 100644 --- a/pallets/subtensor/src/staking/stake_utils.rs +++ b/pallets/subtensor/src/staking/stake_utils.rs @@ -68,10 +68,6 @@ impl Pallet { Self::get_current_block_as_u64().saturating_sub(start_call_block) }); - // Use halving time hyperparameter. The meaning of this parameter can be best explained under - // the assumption of a constant price and SubnetMovingAlpha == 0.5: It is how many blocks it - // will take in order for the distance between current EMA of price and current price to shorten - // by half. let halving_time = EMAPriceHalvingBlocks::::get(netuid); let current_ma_unsigned = U96F32::saturating_from_num(SubnetMovingAlpha::::get()); let alpha: U96F32 = current_ma_unsigned.saturating_mul(blocks_since_start_call.safe_div( diff --git a/pallets/subtensor/src/subnets/symbols.rs b/pallets/subtensor/src/subnets/symbols.rs index 6350c303e5..e68b08e8b5 100644 --- a/pallets/subtensor/src/subnets/symbols.rs +++ b/pallets/subtensor/src/subnets/symbols.rs @@ -88,245 +88,245 @@ impl Pallet { 78 => b"waw".to_vec(), 79 => b"ya".to_vec(), 80 => b"alef".to_vec(), - 81 => b"ya".to_vec(), - 82 => b"fehu".to_vec(), - 83 => b"uruz".to_vec(), - 84 => b"thurisaz".to_vec(), - 85 => b"ansuz".to_vec(), - 86 => b"raidho".to_vec(), - 87 => b"kaunan".to_vec(), - 88 => b"eihwaz".to_vec(), - 89 => b"algiz".to_vec(), - 90 => b"berkanan".to_vec(), - 91 => b"ogham".to_vec(), - 92 => b"beith".to_vec(), - 93 => b"luis".to_vec(), - 94 => b"fearn".to_vec(), - 95 => b"sail".to_vec(), - 96 => b"nion".to_vec(), - 97 => b"forfeda".to_vec(), - 98 => b"ani".to_vec(), - 99 => b"bani".to_vec(), - 100 => b"gani".to_vec(), - 101 => b"doni".to_vec(), - 102 => b"eni".to_vec(), - 103 => b"vini".to_vec(), - 104 => b"ayp".to_vec(), - 105 => b"ben".to_vec(), - 106 => b"gim".to_vec(), - 107 => b"da".to_vec(), - 108 => b"ech".to_vec(), - 109 => b"za".to_vec(), - 110 => b"armeni".to_vec(), - 111 => b"grave".to_vec(), - 112 => b"io".to_vec(), - 113 => b"dje".to_vec(), - 114 => b"gje".to_vec(), - 115 => b"ie".to_vec(), - 116 => b"dze".to_vec(), + 81 => b"fehu".to_vec(), + 82 => b"uruz".to_vec(), + 83 => b"thurisaz".to_vec(), + 84 => b"ansuz".to_vec(), + 85 => b"raidho".to_vec(), + 86 => b"kaunan".to_vec(), + 87 => b"cyr_yeru".to_vec(), + 88 => b"algiz".to_vec(), + 89 => b"berkanan".to_vec(), + 90 => b"ogham".to_vec(), + 91 => b"beith".to_vec(), + 92 => b"luis".to_vec(), + 93 => b"fearn".to_vec(), + 94 => b"sail".to_vec(), + 95 => b"nion".to_vec(), + 96 => b"forfeda".to_vec(), + 97 => b"ani".to_vec(), + 98 => b"bani".to_vec(), + 99 => b"gani".to_vec(), + 100 => b"doni".to_vec(), + 101 => b"eni".to_vec(), + 102 => b"vini".to_vec(), + 103 => b"ayp".to_vec(), + 104 => b"ben".to_vec(), + 105 => b"gim".to_vec(), + 106 => b"da".to_vec(), + 107 => b"ech".to_vec(), + 108 => b"za".to_vec(), + 109 => b"armeni".to_vec(), + 110 => b"grave".to_vec(), + 111 => b"io".to_vec(), + 112 => b"dje".to_vec(), + 113 => b"gje".to_vec(), + 114 => b"ie".to_vec(), + 115 => b"dze".to_vec(), + 116 => b"hard_sign".to_vec(), 117 => b"alfa".to_vec(), 118 => b"alfas".to_vec(), - 119 => b"vida".to_vec(), // Ⲃ (Vida, 119) - 120 => b"vida_small".to_vec(), // ⲃ (Small Vida, 120) - 121 => b"gamma".to_vec(), // Ⲅ (Gamma, 121) - 122 => b"gamma_small".to_vec(), // ⲅ (Small Gamma, 122) - 123 => b"brahmi_a".to_vec(), // 𑀀 (A, 123) - 124 => b"brahmi_aa".to_vec(), // 𑀁 (Aa, 124) - 125 => b"brahmi_i".to_vec(), // 𑀂 (I, 125) - 126 => b"brahmi_ii".to_vec(), // 𑀃 (Ii, 126) - 127 => b"brahmi_u".to_vec(), // 𑀅 (U, 127) - 128 => b"tifinagh_ya".to_vec(), // ⴰ (Ya, 128) - 129 => b"tifinagh_yab".to_vec(), // ⴱ (Yab, 129) - 130 => b"tifinagh_yabh".to_vec(), // ⴲ (Yabh, 130) - 131 => b"tifinagh_yag".to_vec(), // ⴳ (Yag, 131) - 132 => b"tifinagh_yagh".to_vec(), // ⴴ (Yagh, 132) - 133 => b"tifinagh_yaj".to_vec(), // ⴵ (Yaj, 133) - 134 => b"glagolitic_az".to_vec(), // Ⰰ (Az, 134) - 135 => b"glagolitic_buky".to_vec(), // Ⰱ (Buky, 135) - 136 => b"glagolitic_vede".to_vec(), // Ⰲ (Vede, 136) - 137 => b"glagolitic_glagoli".to_vec(), // Ⰳ (Glagoli, 137) - 138 => b"glagolitic_dobro".to_vec(), // Ⰴ (Dobro, 138) - 139 => b"glagolitic_yest".to_vec(), // Ⰵ (Yest, 139) - 140 => b"glagolitic_zhivete".to_vec(), // Ⰶ (Zhivete, 140) - 141 => b"glagolitic_zemlja".to_vec(), // Ⰷ (Zemlja, 141) - 142 => b"glagolitic_izhe".to_vec(), // Ⰸ (Izhe, 142) + 119 => b"vida".to_vec(), // Ⲃ (Vida, 119) + 120 => b"vida_small".to_vec(), // ⲃ (Small Vida, 120) + 121 => b"gamma".to_vec(), // Ⲅ (Gamma, 121) + 122 => b"gamma_small".to_vec(), // ⲅ (Small Gamma, 122) + 123 => b"brahmi_a".to_vec(), // 𑀀 (A, 123) + 124 => b"brahmi_aa".to_vec(), // 𑀁 (Aa, 124) + 125 => b"brahmi_i".to_vec(), // 𑀂 (I, 125) + 126 => b"brahmi_ii".to_vec(), // 𑀃 (Ii, 126) + 127 => b"brahmi_u".to_vec(), // 𑀅 (U, 127) + 128 => b"la".to_vec(), + 129 => b"va".to_vec(), + 130 => b"sha".to_vec(), + 131 => b"ssa".to_vec(), + 132 => b"sa".to_vec(), + 133 => b"ha".to_vec(), + 134 => b"glagolitic_az".to_vec(), // Ⰰ (Az, 134) + 135 => b"glagolitic_buky".to_vec(), // Ⰱ (Buky, 135) + 136 => b"glagolitic_vede".to_vec(), // Ⰲ (Vede, 136) + 137 => b"glagolitic_glagoli".to_vec(), // Ⰳ (Glagoli, 137) + 138 => b"glagolitic_dobro".to_vec(), // Ⰴ (Dobro, 138) + 139 => b"glagolitic_yest".to_vec(), // Ⰵ (Yest, 139) + 140 => b"glagolitic_zhivete".to_vec(), // Ⰶ (Zhivete, 140) + 141 => b"glagolitic_zemlja".to_vec(), // Ⰷ (Zemlja, 141) + 142 => b"glagolitic_izhe".to_vec(), // Ⰸ (Izhe, 142) 143 => b"glagolitic_initial_izhe".to_vec(), // Ⰹ (Initial Izhe, 143) - 144 => b"glagolitic_i".to_vec(), // Ⰺ (I, 144) - 145 => b"glagolitic_djerv".to_vec(), // Ⰻ (Djerv, 145) - 146 => b"glagolitic_kako".to_vec(), // Ⰼ (Kako, 146) - 147 => b"glagolitic_ljudije".to_vec(), // Ⰽ (Ljudije, 147) - 148 => b"glagolitic_myse".to_vec(), // Ⰾ (Myse, 148) - 149 => b"glagolitic_nash".to_vec(), // Ⰿ (Nash, 149) - 150 => b"glagolitic_on".to_vec(), // Ⱀ (On, 150) - 151 => b"glagolitic_pokoj".to_vec(), // Ⱁ (Pokoj, 151) - 152 => b"glagolitic_rtsy".to_vec(), // Ⱂ (Rtsy, 152) - 153 => b"glagolitic_slovo".to_vec(), // Ⱃ (Slovo, 153) - 154 => b"glagolitic_tvrido".to_vec(), // Ⱄ (Tvrido, 154) - 155 => b"glagolitic_uku".to_vec(), // Ⱅ (Uku, 155) - 156 => b"glagolitic_fert".to_vec(), // Ⱆ (Fert, 156) - 157 => b"glagolitic_xrivi".to_vec(), // Ⱇ (Xrivi, 157) - 158 => b"glagolitic_ot".to_vec(), // Ⱈ (Ot, 158) - 159 => b"glagolitic_cy".to_vec(), // Ⱉ (Cy, 159) - 160 => b"glagolitic_shcha".to_vec(), // Ⱊ (Shcha, 160) - 161 => b"glagolitic_er".to_vec(), // Ⱋ (Er, 161) - 162 => b"glagolitic_yeru".to_vec(), // Ⱌ (Yeru, 162) - 163 => b"glagolitic_small_yer".to_vec(), // Ⱍ (Small Yer, 163) - 164 => b"glagolitic_yo".to_vec(), // Ⱎ (Yo, 164) - 165 => b"glagolitic_yu".to_vec(), // Ⱏ (Yu, 165) - 166 => b"glagolitic_ja".to_vec(), // Ⱐ (Ja, 166) - 167 => b"thai_ko_kai".to_vec(), // ก (Ko Kai, 167) - 168 => b"thai_kho_khai".to_vec(), // ข (Kho Khai, 168) - 169 => b"thai_kho_khuat".to_vec(), // ฃ (Kho Khuat, 169) - 170 => b"thai_kho_khon".to_vec(), // ค (Kho Khon, 170) - 171 => b"thai_kho_rakhang".to_vec(), // ฅ (Kho Rakhang, 171) - 172 => b"thai_kho_khwai".to_vec(), // ฆ (Kho Khwai, 172) - 173 => b"thai_ngo_ngu".to_vec(), // ง (Ngo Ngu, 173) - 174 => b"thai_cho_chan".to_vec(), // จ (Cho Chan, 174) - 175 => b"thai_cho_ching".to_vec(), // ฉ (Cho Ching, 175) - 176 => b"thai_cho_chang".to_vec(), // ช (Cho Chang, 176) - 177 => b"thai_so_so".to_vec(), // ซ (So So, 177) - 178 => b"thai_cho_choe".to_vec(), // ฌ (Cho Choe, 178) - 179 => b"thai_yo_ying".to_vec(), // ญ (Yo Ying, 179) - 180 => b"thai_do_chada".to_vec(), // ฎ (Do Chada, 180) - 181 => b"thai_to_patak".to_vec(), // ฏ (To Patak, 181) - 182 => b"thai_tho_than".to_vec(), // ฐ (Tho Than, 182) - 183 => b"thai_tho_nangmontho".to_vec(), // ฑ (Tho Nangmontho, 183) - 184 => b"thai_tho_phuthao".to_vec(), // ฒ (Tho Phuthao, 184) - 185 => b"thai_no_nen".to_vec(), // ณ (No Nen, 185) - 186 => b"thai_do_dek".to_vec(), // ด (Do Dek, 186) - 187 => b"thai_to_tao".to_vec(), // ต (To Tao, 187) - 188 => b"thai_tho_thung".to_vec(), // ถ (Tho Thung, 188) - 189 => b"thai_tho_thahan".to_vec(), // ท (Tho Thahan, 189) - 190 => b"thai_tho_thong".to_vec(), // ธ (Tho Thong, 190) - 191 => b"thai_no_nu".to_vec(), // น (No Nu, 191) - 192 => b"thai_bo_baimai".to_vec(), // บ (Bo Baimai, 192) - 193 => b"thai_po_pla".to_vec(), // ป (Po Pla, 193) - 194 => b"thai_pho_phung".to_vec(), // ผ (Pho Phung, 194) - 195 => b"thai_fo_fa".to_vec(), // ฝ (Fo Fa, 195) - 196 => b"thai_pho_phan".to_vec(), // พ (Pho Phan, 196) - 197 => b"thai_fo_fan".to_vec(), // ฟ (Fo Fan, 197) - 198 => b"thai_pho_samphao".to_vec(), // ภ (Pho Samphao, 198) - 199 => b"thai_mo_ma".to_vec(), // ม (Mo Ma, 199) - 200 => b"thai_yo_yak".to_vec(), // ย (Yo Yak, 200) - 201 => b"thai_ro_rua".to_vec(), // ร (Ro Rua, 201) - 202 => b"thai_lo_ling".to_vec(), // ล (Lo Ling, 202) - 203 => b"thai_wo_waen".to_vec(), // ว (Wo Waen, 203) - 204 => b"thai_so_sala".to_vec(), // ศ (So Sala, 204) - 205 => b"thai_so_rusi".to_vec(), // ษ (So Rusi, 205) - 206 => b"thai_so_sua".to_vec(), // ส (So Sua, 206) - 207 => b"thai_ho_hip".to_vec(), // ห (Ho Hip, 207) - 208 => b"thai_lo_chula".to_vec(), // ฬ (Lo Chula, 208) - 209 => b"thai_o_ang".to_vec(), // อ (O Ang, 209) - 210 => b"thai_ho_nokhuk".to_vec(), // ฮ (Ho Nokhuk, 210) - 211 => b"hangul_giyeok".to_vec(), // ㄱ (Giyeok, 211) - 212 => b"hangul_nieun".to_vec(), // ㄴ (Nieun, 212) - 213 => b"hangul_digeut".to_vec(), // ㄷ (Digeut, 213) - 214 => b"hangul_rieul".to_vec(), // ㄹ (Rieul, 214) - 215 => b"hangul_mieum".to_vec(), // ㅁ (Mieum, 215) - 216 => b"hangul_bieup".to_vec(), // ㅂ (Bieup, 216) - 217 => b"hangul_siot".to_vec(), // ㅅ (Siot, 217) - 218 => b"hangul_ieung".to_vec(), // ㅇ (Ieung, 218) - 219 => b"hangul_jieut".to_vec(), // ㅈ (Jieut, 219) - 220 => b"hangul_chieut".to_vec(), // ㅊ (Chieut, 220) - 221 => b"hangul_kieuk".to_vec(), // ㅋ (Kieuk, 221) - 222 => b"hangul_tieut".to_vec(), // ㅌ (Tieut, 222) - 223 => b"hangul_pieup".to_vec(), // ㅍ (Pieup, 223) - 224 => b"hangul_hieut".to_vec(), // ㅎ (Hieut, 224) - 225 => b"hangul_a".to_vec(), // ㅏ (A, 225) - 226 => b"hangul_ae".to_vec(), // ㅐ (Ae, 226) - 227 => b"hangul_ya".to_vec(), // ㅑ (Ya, 227) - 228 => b"hangul_yae".to_vec(), // ㅒ (Yae, 228) - 229 => b"hangul_eo".to_vec(), // ㅓ (Eo, 229) - 230 => b"hangul_e".to_vec(), // ㅔ (E, 230) - 231 => b"hangul_yeo".to_vec(), // ㅕ (Yeo, 231) - 232 => b"hangul_ye".to_vec(), // ㅖ (Ye, 232) - 233 => b"hangul_o".to_vec(), // ㅗ (O, 233) - 234 => b"hangul_wa".to_vec(), // ㅘ (Wa, 234) - 235 => b"hangul_wae".to_vec(), // ㅙ (Wae, 235) - 236 => b"hangul_oe".to_vec(), // ㅚ (Oe, 236) - 237 => b"hangul_yo".to_vec(), // ㅛ (Yo, 237) - 238 => b"hangul_u".to_vec(), // ㅜ (U, 238) - 239 => b"hangul_weo".to_vec(), // ㅝ (Weo, 239) - 240 => b"hangul_we".to_vec(), // ㅞ (We, 240) - 241 => b"hangul_wi".to_vec(), // ㅟ (Wi, 241) - 242 => b"hangul_yu".to_vec(), // ㅠ (Yu, 242) - 243 => b"hangul_eu".to_vec(), // ㅡ (Eu, 243) - 244 => b"hangul_ui".to_vec(), // ㅢ (Ui, 244) - 245 => b"hangul_i".to_vec(), // ㅣ (I, 245) - 246 => b"ethiopic_glottal_a".to_vec(), // አ (Glottal A, 246) - 247 => b"ethiopic_glottal_u".to_vec(), // ኡ (Glottal U, 247) - 248 => b"ethiopic_glottal_i".to_vec(), // ኢ (Glottal I, 248) - 249 => b"ethiopic_glottal_aa".to_vec(), // ኣ (Glottal Aa, 249) - 250 => b"ethiopic_glottal_e".to_vec(), // ኤ (Glottal E, 250) - 251 => b"ethiopic_glottal_ie".to_vec(), // እ (Glottal Ie, 251) - 252 => b"ethiopic_glottal_o".to_vec(), // ኦ (Glottal O, 252) - 253 => b"ethiopic_glottal_wa".to_vec(), // ኧ (Glottal Wa, 253) - 254 => b"ethiopic_wa".to_vec(), // ወ (Wa, 254) - 255 => b"ethiopic_wu".to_vec(), // ዉ (Wu, 255) - 256 => b"ethiopic_wi".to_vec(), // ዊ (Wi, 256) - 257 => b"ethiopic_waa".to_vec(), // ዋ (Waa, 257) - 258 => b"ethiopic_we".to_vec(), // ዌ (We, 258) - 259 => b"ethiopic_wye".to_vec(), // ው (Wye, 259) - 260 => b"ethiopic_wo".to_vec(), // ዎ (Wo, 260) - 261 => b"ethiopic_ko".to_vec(), // ኰ (Ko, 261) - 262 => b"ethiopic_ku".to_vec(), // ኱ (Ku, 262) - 263 => b"ethiopic_ki".to_vec(), // ኲ (Ki, 263) - 264 => b"ethiopic_kua".to_vec(), // ኳ (Kua, 264) - 265 => b"ethiopic_ke".to_vec(), // ኴ (Ke, 265) - 266 => b"ethiopic_kwe".to_vec(), // ኵ (Kwe, 266) - 267 => b"ethiopic_ko_alt".to_vec(), // ኶ (Ko, 267) - 268 => b"ethiopic_go".to_vec(), // ጐ (Go, 268) - 269 => b"ethiopic_gu".to_vec(), // ጑ (Gu, 269) - 270 => b"ethiopic_gi".to_vec(), // ጒ (Gi, 270) - 271 => b"ethiopic_gua".to_vec(), // መ (Gua, 271) - 272 => b"ethiopic_ge".to_vec(), // ጔ (Ge, 272) - 273 => b"ethiopic_gwe".to_vec(), // ጕ (Gwe, 273) - 274 => b"ethiopic_go_alt".to_vec(), // ጖ (Go, 274) - 275 => b"devanagari_a".to_vec(), // अ (A, 275) - 276 => b"devanagari_aa".to_vec(), // आ (Aa, 276) - 277 => b"devanagari_i".to_vec(), // इ (I, 277) - 278 => b"devanagari_ii".to_vec(), // ई (Ii, 278) - 279 => b"devanagari_u".to_vec(), // उ (U, 279) - 280 => b"devanagari_uu".to_vec(), // ऊ (Uu, 280) - 281 => b"devanagari_r".to_vec(), // ऋ (R, 281) - 282 => b"devanagari_e".to_vec(), // ए (E, 282) - 283 => b"devanagari_ai".to_vec(), // ऐ (Ai, 283) - 284 => b"devanagari_o".to_vec(), // ओ (O, 284) - 285 => b"devanagari_au".to_vec(), // औ (Au, 285) - 286 => b"devanagari_ka".to_vec(), // क (Ka, 286) - 287 => b"devanagari_kha".to_vec(), // ख (Kha, 287) - 288 => b"devanagari_ga".to_vec(), // ग (Ga, 288) - 289 => b"devanagari_gha".to_vec(), // घ (Gha, 289) - 290 => b"devanagari_nga".to_vec(), // ङ (Nga, 290) - 291 => b"devanagari_cha".to_vec(), // च (Cha, 291) - 292 => b"devanagari_chha".to_vec(), // छ (Chha, 292) - 293 => b"devanagari_ja".to_vec(), // ज (Ja, 293) - 294 => b"devanagari_jha".to_vec(), // झ (Jha, 294) - 295 => b"devanagari_nya".to_vec(), // ञ (Nya, 295) - 296 => b"devanagari_ta".to_vec(), // ट (Ta, 296) - 297 => b"devanagari_tha".to_vec(), // ठ (Tha, 297) - 298 => b"devanagari_da".to_vec(), // ड (Da, 298) - 299 => b"devanagari_dha".to_vec(), // ढ (Dha, 299) - 300 => b"devanagari_na".to_vec(), // ण (Na, 300) - 301 => b"devanagari_ta_alt".to_vec(), // त (Ta, 301) - 302 => b"devanagari_tha_alt".to_vec(), // थ (Tha, 302) - 303 => b"devanagari_da_alt".to_vec(), // द (Da, 303) - 304 => b"devanagari_dha_alt".to_vec(), // ध (Dha, 304) - 305 => b"devanagari_na_alt".to_vec(), // न (Na, 305) - 306 => b"devanagari_pa".to_vec(), // प (Pa, 306) - 307 => b"devanagari_pha".to_vec(), // फ (Pha, 307) - 308 => b"devanagari_ba".to_vec(), // ब (Ba, 308) - 309 => b"devanagari_bha".to_vec(), // भ (Bha, 309) - 310 => b"devanagari_ma".to_vec(), // म (Ma, 310) - 311 => b"devanagari_ya".to_vec(), // य (Ya, 311) - 312 => b"devanagari_ra".to_vec(), // र (Ra, 312) - 313 => b"devanagari_la".to_vec(), // ल (La, 313) - 314 => b"devanagari_va".to_vec(), // व (Va, 314) - 315 => b"devanagari_sha".to_vec(), // श (Sha, 315) - 316 => b"devanagari_ssa".to_vec(), // ष (Ssa, 316) - 317 => b"devanagari_sa".to_vec(), // स (Sa, 317) - 318 => b"devanagari_ha".to_vec(), // ह (Ha, 318) - 319 => b"katakana_a".to_vec(), // ア (A, 319) + 144 => b"glagolitic_i".to_vec(), // Ⰺ (I, 144) + 145 => b"glagolitic_djerv".to_vec(), // Ⰻ (Djerv, 145) + 146 => b"glagolitic_kako".to_vec(), // Ⰼ (Kako, 146) + 147 => b"glagolitic_ljudije".to_vec(), // Ⰽ (Ljudije, 147) + 148 => b"glagolitic_myse".to_vec(), // Ⰾ (Myse, 148) + 149 => b"glagolitic_nash".to_vec(), // Ⰿ (Nash, 149) + 150 => b"glagolitic_on".to_vec(), // Ⱀ (On, 150) + 151 => b"glagolitic_pokoj".to_vec(), // Ⱁ (Pokoj, 151) + 152 => b"glagolitic_rtsy".to_vec(), // Ⱂ (Rtsy, 152) + 153 => b"glagolitic_slovo".to_vec(), // Ⱃ (Slovo, 153) + 154 => b"glagolitic_tvrido".to_vec(), // Ⱄ (Tvrido, 154) + 155 => b"glagolitic_uku".to_vec(), // Ⱅ (Uku, 155) + 156 => b"glagolitic_fert".to_vec(), // Ⱆ (Fert, 156) + 157 => b"glagolitic_xrivi".to_vec(), // Ⱇ (Xrivi, 157) + 158 => b"glagolitic_ot".to_vec(), // Ⱈ (Ot, 158) + 159 => b"glagolitic_cy".to_vec(), // Ⱉ (Cy, 159) + 160 => b"glagolitic_shcha".to_vec(), // Ⱊ (Shcha, 160) + 161 => b"glagolitic_er".to_vec(), // Ⱋ (Er, 161) + 162 => b"glagolitic_yeru".to_vec(), // Ⱌ (Yeru, 162) + 163 => b"glagolitic_small_yer".to_vec(), // Ⱍ (Small Yer, 163) + 164 => b"glagolitic_yo".to_vec(), // Ⱎ (Yo, 164) + 165 => b"glagolitic_yu".to_vec(), // Ⱏ (Yu, 165) + 166 => b"glagolitic_ja".to_vec(), // Ⱐ (Ja, 166) + 167 => b"thai_ko_kai".to_vec(), // ก (Ko Kai, 167) + 168 => b"thai_kho_khai".to_vec(), // ข (Kho Khai, 168) + 169 => b"thai_kho_khuat".to_vec(), // ฃ (Kho Khuat, 169) + 170 => b"thai_kho_khon".to_vec(), // ค (Kho Khon, 170) + 171 => b"thai_kho_rakhang".to_vec(), // ฅ (Kho Rakhang, 171) + 172 => b"thai_kho_khwai".to_vec(), // ฆ (Kho Khwai, 172) + 173 => b"thai_ngo_ngu".to_vec(), // ง (Ngo Ngu, 173) + 174 => b"thai_cho_chan".to_vec(), // จ (Cho Chan, 174) + 175 => b"thai_cho_ching".to_vec(), // ฉ (Cho Ching, 175) + 176 => b"thai_cho_chang".to_vec(), // ช (Cho Chang, 176) + 177 => b"thai_so_so".to_vec(), // ซ (So So, 177) + 178 => b"thai_cho_choe".to_vec(), // ฌ (Cho Choe, 178) + 179 => b"thai_yo_ying".to_vec(), // ญ (Yo Ying, 179) + 180 => b"thai_do_chada".to_vec(), // ฎ (Do Chada, 180) + 181 => b"thai_to_patak".to_vec(), // ฏ (To Patak, 181) + 182 => b"thai_tho_than".to_vec(), // ฐ (Tho Than, 182) + 183 => b"thai_tho_nangmontho".to_vec(), // ฑ (Tho Nangmontho, 183) + 184 => b"thai_tho_phuthao".to_vec(), // ฒ (Tho Phuthao, 184) + 185 => b"thai_no_nen".to_vec(), // ณ (No Nen, 185) + 186 => b"thai_do_dek".to_vec(), // ด (Do Dek, 186) + 187 => b"thai_to_tao".to_vec(), // ต (To Tao, 187) + 188 => b"thai_tho_thung".to_vec(), // ถ (Tho Thung, 188) + 189 => b"thai_tho_thahan".to_vec(), // ท (Tho Thahan, 189) + 190 => b"thai_tho_thong".to_vec(), // ธ (Tho Thong, 190) + 191 => b"thai_no_nu".to_vec(), // น (No Nu, 191) + 192 => b"thai_bo_baimai".to_vec(), // บ (Bo Baimai, 192) + 193 => b"thai_po_pla".to_vec(), // ป (Po Pla, 193) + 194 => b"thai_pho_phung".to_vec(), // ผ (Pho Phung, 194) + 195 => b"thai_fo_fa".to_vec(), // ฝ (Fo Fa, 195) + 196 => b"thai_pho_phan".to_vec(), // พ (Pho Phan, 196) + 197 => b"thai_fo_fan".to_vec(), // ฟ (Fo Fan, 197) + 198 => b"thai_pho_samphao".to_vec(), // ภ (Pho Samphao, 198) + 199 => b"thai_mo_ma".to_vec(), // ม (Mo Ma, 199) + 200 => b"thai_yo_yak".to_vec(), // ย (Yo Yak, 200) + 201 => b"thai_ro_rua".to_vec(), // ร (Ro Rua, 201) + 202 => b"thai_lo_ling".to_vec(), // ล (Lo Ling, 202) + 203 => b"thai_wo_waen".to_vec(), // ว (Wo Waen, 203) + 204 => b"thai_so_sala".to_vec(), // ศ (So Sala, 204) + 205 => b"thai_so_rusi".to_vec(), // ษ (So Rusi, 205) + 206 => b"thai_so_sua".to_vec(), // ส (So Sua, 206) + 207 => b"thai_ho_hip".to_vec(), // ห (Ho Hip, 207) + 208 => b"thai_lo_chula".to_vec(), // ฬ (Lo Chula, 208) + 209 => b"thai_o_ang".to_vec(), // อ (O Ang, 209) + 210 => b"thai_ho_nokhuk".to_vec(), // ฮ (Ho Nokhuk, 210) + 211 => b"hangul_giyeok".to_vec(), // ㄱ (Giyeok, 211) + 212 => b"hangul_nieun".to_vec(), // ㄴ (Nieun, 212) + 213 => b"hangul_digeut".to_vec(), // ㄷ (Digeut, 213) + 214 => b"hangul_rieul".to_vec(), // ㄹ (Rieul, 214) + 215 => b"hangul_mieum".to_vec(), // ㅁ (Mieum, 215) + 216 => b"hangul_bieup".to_vec(), // ㅂ (Bieup, 216) + 217 => b"hangul_siot".to_vec(), // ㅅ (Siot, 217) + 218 => b"hangul_ieung".to_vec(), // ㅇ (Ieung, 218) + 219 => b"hangul_jieut".to_vec(), // ㅈ (Jieut, 219) + 220 => b"hangul_chieut".to_vec(), // ㅊ (Chieut, 220) + 221 => b"hangul_kieuk".to_vec(), // ㅋ (Kieuk, 221) + 222 => b"hangul_tieut".to_vec(), // ㅌ (Tieut, 222) + 223 => b"hangul_pieup".to_vec(), // ㅍ (Pieup, 223) + 224 => b"hangul_hieut".to_vec(), // ㅎ (Hieut, 224) + 225 => b"hangul_a".to_vec(), // ㅏ (A, 225) + 226 => b"hangul_ae".to_vec(), // ㅐ (Ae, 226) + 227 => b"hangul_ya".to_vec(), // ㅑ (Ya, 227) + 228 => b"hangul_yae".to_vec(), // ㅒ (Yae, 228) + 229 => b"hangul_eo".to_vec(), // ㅓ (Eo, 229) + 230 => b"hangul_e".to_vec(), // ㅔ (E, 230) + 231 => b"hangul_yeo".to_vec(), // ㅕ (Yeo, 231) + 232 => b"hangul_ye".to_vec(), // ㅖ (Ye, 232) + 233 => b"hangul_o".to_vec(), // ㅗ (O, 233) + 234 => b"hangul_wa".to_vec(), // ㅘ (Wa, 234) + 235 => b"hangul_wae".to_vec(), // ㅙ (Wae, 235) + 236 => b"hangul_oe".to_vec(), // ㅚ (Oe, 236) + 237 => b"hangul_yo".to_vec(), // ㅛ (Yo, 237) + 238 => b"hangul_u".to_vec(), // ㅜ (U, 238) + 239 => b"hangul_weo".to_vec(), // ㅝ (Weo, 239) + 240 => b"hangul_we".to_vec(), // ㅞ (We, 240) + 241 => b"hangul_wi".to_vec(), // ㅟ (Wi, 241) + 242 => b"hangul_yu".to_vec(), // ㅠ (Yu, 242) + 243 => b"hangul_eu".to_vec(), // ㅡ (Eu, 243) + 244 => b"hangul_ui".to_vec(), // ㅢ (Ui, 244) + 245 => b"hangul_i".to_vec(), // ㅣ (I, 245) + 246 => b"ethiopic_glottal_a".to_vec(), // አ (Glottal A, 246) + 247 => b"ethiopic_glottal_u".to_vec(), // ኡ (Glottal U, 247) + 248 => b"ethiopic_glottal_i".to_vec(), // ኢ (Glottal I, 248) + 249 => b"ethiopic_glottal_aa".to_vec(), // ኣ (Glottal Aa, 249) + 250 => b"ethiopic_glottal_e".to_vec(), // ኤ (Glottal E, 250) + 251 => b"ethiopic_glottal_ie".to_vec(), // እ (Glottal Ie, 251) + 252 => b"ethiopic_glottal_o".to_vec(), // ኦ (Glottal O, 252) + 253 => b"ethiopic_glottal_wa".to_vec(), // ኧ (Glottal Wa, 253) + 254 => b"ethiopic_wa".to_vec(), // ወ (Wa, 254) + 255 => b"ethiopic_wu".to_vec(), // ዉ (Wu, 255) + 256 => b"ethiopic_wi".to_vec(), // ዊ (Wi, 256) + 257 => b"ethiopic_waa".to_vec(), // ዋ (Waa, 257) + 258 => b"ethiopic_we".to_vec(), // ዌ (We, 258) + 259 => b"ethiopic_wye".to_vec(), // ው (Wye, 259) + 260 => b"ethiopic_wo".to_vec(), // ዎ (Wo, 260) + 261 => b"ethiopic_ko".to_vec(), // ኰ (Ko, 261) + 262 => b"ethiopic_ku".to_vec(), // ኱ (Ku, 262) + 263 => b"ethiopic_ki".to_vec(), // ኲ (Ki, 263) + 264 => b"ethiopic_kua".to_vec(), // ኳ (Kua, 264) + 265 => b"ethiopic_ke".to_vec(), // ኴ (Ke, 265) + 266 => b"ethiopic_kwe".to_vec(), // ኵ (Kwe, 266) + 267 => b"ethiopic_ko_alt".to_vec(), // ኶ (Ko, 267) + 268 => b"ethiopic_go".to_vec(), // ጐ (Go, 268) + 269 => b"ethiopic_gu".to_vec(), // ጑ (Gu, 269) + 270 => b"ethiopic_gi".to_vec(), // ጒ (Gi, 270) + 271 => b"ethiopic_gua".to_vec(), // መ (Gua, 271) + 272 => b"ethiopic_ge".to_vec(), // ጔ (Ge, 272) + 273 => b"ethiopic_gwe".to_vec(), // ጕ (Gwe, 273) + 274 => b"ethiopic_go_alt".to_vec(), // ጖ (Go, 274) + 275 => b"devanagari_a".to_vec(), // अ (A, 275) + 276 => b"devanagari_aa".to_vec(), // आ (Aa, 276) + 277 => b"devanagari_i".to_vec(), // इ (I, 277) + 278 => b"devanagari_ii".to_vec(), // ई (Ii, 278) + 279 => b"devanagari_u".to_vec(), // उ (U, 279) + 280 => b"devanagari_uu".to_vec(), // ऊ (Uu, 280) + 281 => b"devanagari_r".to_vec(), // ऋ (R, 281) + 282 => b"devanagari_e".to_vec(), // ए (E, 282) + 283 => b"devanagari_ai".to_vec(), // ऐ (Ai, 283) + 284 => b"devanagari_o".to_vec(), // ओ (O, 284) + 285 => b"devanagari_au".to_vec(), // औ (Au, 285) + 286 => b"devanagari_ka".to_vec(), // क (Ka, 286) + 287 => b"devanagari_kha".to_vec(), // ख (Kha, 287) + 288 => b"devanagari_ga".to_vec(), // ग (Ga, 288) + 289 => b"devanagari_gha".to_vec(), // घ (Gha, 289) + 290 => b"devanagari_nga".to_vec(), // ङ (Nga, 290) + 291 => b"devanagari_cha".to_vec(), // च (Cha, 291) + 292 => b"devanagari_chha".to_vec(), // छ (Chha, 292) + 293 => b"devanagari_ja".to_vec(), // ज (Ja, 293) + 294 => b"devanagari_jha".to_vec(), // झ (Jha, 294) + 295 => b"devanagari_nya".to_vec(), // ञ (Nya, 295) + 296 => b"devanagari_ta".to_vec(), // ट (Ta, 296) + 297 => b"devanagari_tha".to_vec(), // ठ (Tha, 297) + 298 => b"devanagari_da".to_vec(), // ड (Da, 298) + 299 => b"devanagari_dha".to_vec(), // ढ (Dha, 299) + 300 => b"devanagari_na".to_vec(), // ण (Na, 300) + 301 => b"devanagari_ta_alt".to_vec(), // त (Ta, 301) + 302 => b"devanagari_tha_alt".to_vec(), // थ (Tha, 302) + 303 => b"devanagari_da_alt".to_vec(), // द (Da, 303) + 304 => b"devanagari_dha_alt".to_vec(), // ध (Dha, 304) + 305 => b"devanagari_na_alt".to_vec(), // न (Na, 305) + 306 => b"devanagari_pa".to_vec(), // प (Pa, 306) + 307 => b"devanagari_pha".to_vec(), // फ (Pha, 307) + 308 => b"devanagari_ba".to_vec(), // ब (Ba, 308) + 309 => b"devanagari_bha".to_vec(), // भ (Bha, 309) + 310 => b"devanagari_ma".to_vec(), // म (Ma, 310) + 311 => b"devanagari_ya".to_vec(), // य (Ya, 311) + 312 => b"devanagari_ra".to_vec(), // र (Ra, 312) + 313 => b"devanagari_la".to_vec(), // ल (La, 313) + 314 => b"devanagari_va".to_vec(), // व (Va, 314) + 315 => b"devanagari_sha".to_vec(), // श (Sha, 315) + 316 => b"devanagari_ssa".to_vec(), // ष (Ssa, 316) + 317 => b"devanagari_sa".to_vec(), // स (Sa, 317) + 318 => b"devanagari_ha".to_vec(), // ह (Ha, 318) + 319 => b"katakana_a".to_vec(), // ア (A, 319) 320 => b"kana_i".to_vec(), 321 => b"kana_u".to_vec(), 322 => b"kana_e".to_vec(), @@ -446,12 +446,6 @@ impl Pallet { 436 => b"ma".to_vec(), 437 => b"ya".to_vec(), 438 => b"ra".to_vec(), - 439 => b"la".to_vec(), - 440 => b"va".to_vec(), - 441 => b"sha".to_vec(), - 442 => b"ssa".to_vec(), - 443 => b"sa".to_vec(), - 444 => b"ha".to_vec(), _ => b"unknown".to_vec(), } // match netuid { @@ -614,52 +608,52 @@ impl Pallet { 78 => b"\xD9\x88".to_vec(), // و (Waw) 79 => b"\xD9\x8A".to_vec(), // ي (Ya) 80 => b"\xD9\x89".to_vec(), // ى (Alef Maksura, 80) - 81 => b"\xD9\x8A".to_vec(), // ي (Ya, 81) // Runic Alphabet - 82 => b"\xE1\x9A\xA0".to_vec(), // ᚠ (Fehu, wealth, 82) - 83 => b"\xE1\x9A\xA2".to_vec(), // ᚢ (Uruz, strength, 83) - 84 => b"\xE1\x9A\xA6".to_vec(), // ᚦ (Thurisaz, giant, 84) - 85 => b"\xE1\x9A\xA8".to_vec(), // ᚨ (Ansuz, god, 85) - 86 => b"\xE1\x9A\xB1".to_vec(), // ᚱ (Raidho, ride, 86) - 87 => b"\xE1\x9A\xB3".to_vec(), // ᚲ (Kaunan, ulcer, 87) - 88 => b"\xE1\x9B\x87".to_vec(), // ᛇ (Eihwaz, yew, 88) - 89 => b"\xE1\x9B\x89".to_vec(), // ᛉ (Algiz, protection, 89) - 90 => b"\xE1\x9B\x92".to_vec(), // ᛒ (Berkanan, birch, 90) + 81 => b"\xE1\x9A\xA0".to_vec(), // ᚠ (Fehu, wealth, 81) + 82 => b"\xE1\x9A\xA2".to_vec(), // ᚢ (Uruz, strength, 82) + 83 => b"\xE1\x9A\xA6".to_vec(), // ᚦ (Thurisaz, giant, 83) + 84 => b"\xE1\x9A\xA8".to_vec(), // ᚨ (Ansuz, god, 84) + 85 => b"\xE1\x9A\xB1".to_vec(), // ᚱ (Raidho, ride, 85) + 86 => b"\xE1\x9A\xB3".to_vec(), // ᚲ (Kaunan, ulcer, 86) + 87 => b"\xD0\xAB".to_vec(), // Ы (Cyrillic Yeru, 87) + 88 => b"\xE1\x9B\x89".to_vec(), // ᛉ (Algiz, protection, 88) + 89 => b"\xE1\x9B\x92".to_vec(), // ᛒ (Berkanan, birch, 89) // Ogham Alphabet - 91 => b"\xE1\x9A\x80".to_vec(), //   (Space, 91) - 92 => b"\xE1\x9A\x81".to_vec(), // ᚁ (Beith, birch, 92) - 93 => b"\xE1\x9A\x82".to_vec(), // ᚂ (Luis, rowan, 93) - 94 => b"\xE1\x9A\x83".to_vec(), // ᚃ (Fearn, alder, 94) - 95 => b"\xE1\x9A\x84".to_vec(), // ᚄ (Sail, willow, 95) - 96 => b"\xE1\x9A\x85".to_vec(), // ᚅ (Nion, ash, 96) - 97 => b"\xE1\x9A\x9B".to_vec(), // ᚛ (Forfeda, 97) + 90 => b"\xE1\x9A\x80".to_vec(), //   (Space, 90) + 91 => b"\xE1\x9A\x81".to_vec(), // ᚁ (Beith, birch, 91) + 92 => b"\xE1\x9A\x82".to_vec(), // ᚂ (Luis, rowan, 92) + 93 => b"\xE1\x9A\x83".to_vec(), // ᚃ (Fearn, alder, 93) + 94 => b"\xE1\x9A\x84".to_vec(), // ᚄ (Sail, willow, 94) + 95 => b"\xE1\x9A\x85".to_vec(), // ᚅ (Nion, ash, 95) + 96 => b"\xE1\x9A\x9B".to_vec(), // ᚛ (Forfeda, 96) // Georgian Alphabet (Mkhedruli) - 98 => b"\xE1\x83\x90".to_vec(), // ა (Ani, 98) - 99 => b"\xE1\x83\x91".to_vec(), // ბ (Bani, 99) - 100 => b"\xE1\x83\x92".to_vec(), // გ (Gani, 100) - 101 => b"\xE1\x83\x93".to_vec(), // დ (Doni, 101) - 102 => b"\xE1\x83\x94".to_vec(), // ე (Eni, 102) - 103 => b"\xE1\x83\x95".to_vec(), // ვ (Vini, 103) + 97 => b"\xE1\x83\x90".to_vec(), // ა (Ani, 97) + 98 => b"\xE1\x83\x91".to_vec(), // ბ (Bani, 98) + 99 => b"\xE1\x83\x92".to_vec(), // გ (Gani, 99) + 100 => b"\xE1\x83\x93".to_vec(), // დ (Doni, 100) + 101 => b"\xE1\x83\x94".to_vec(), // ე (Eni, 101) + 102 => b"\xE1\x83\x95".to_vec(), // ვ (Vini, 102) // Armenian Alphabet - 104 => b"\xD4\xB1".to_vec(), // Ա (Ayp, 104) - 105 => b"\xD4\xB2".to_vec(), // Բ (Ben, 105) - 106 => b"\xD4\xB3".to_vec(), // Գ (Gim, 106) - 107 => b"\xD4\xB4".to_vec(), // Դ (Da, 107) - 108 => b"\xD4\xB5".to_vec(), // Ե (Ech, 108) - 109 => b"\xD4\xB6".to_vec(), // Զ (Za, 109) - 110 => b"\xD5\x9E".to_vec(), // ՞ (Question mark, 110) + 103 => b"\xD4\xB1".to_vec(), // Ա (Ayp, 103) + 104 => b"\xD4\xB2".to_vec(), // Բ (Ben, 104) + 105 => b"\xD4\xB3".to_vec(), // Գ (Gim, 105) + 106 => b"\xD4\xB4".to_vec(), // Դ (Da, 106) + 107 => b"\xD4\xB5".to_vec(), // Ե (Ech, 107) + 108 => b"\xD4\xB6".to_vec(), // Զ (Za, 108) + 109 => b"\xD5\x9E".to_vec(), // ՞ (Question mark, 109) // Cyrillic Alphabet - 111 => b"\xD0\x80".to_vec(), // Ѐ (Ie with grave, 111) - 112 => b"\xD0\x81".to_vec(), // Ё (Io, 112) - 113 => b"\xD0\x82".to_vec(), // Ђ (Dje, 113) - 114 => b"\xD0\x83".to_vec(), // Ѓ (Gje, 114) - 115 => b"\xD0\x84".to_vec(), // Є (Ukrainian Ie, 115) - 116 => b"\xD0\x85".to_vec(), // Ѕ (Dze, 116) + 110 => b"\xD0\x80".to_vec(), // Ѐ (Ie with grave, 110) + 111 => b"\xD0\x81".to_vec(), // Ё (Io, 111) + 112 => b"\xD0\x82".to_vec(), // Ђ (Dje, 112) + 113 => b"\xD0\x83".to_vec(), // Ѓ (Gje, 113) + 114 => b"\xD0\x84".to_vec(), // Є (Ukrainian Ie, 114) + 115 => b"\xD0\x85".to_vec(), // Ѕ (Dze, 115) + 116 => b"\xD1\x8A".to_vec(), // Ъ (Hard sign, 116) // Coptic Alphabet 117 => b"\xE2\xB2\x80".to_vec(), // Ⲁ (Alfa, 117) @@ -676,13 +670,13 @@ impl Pallet { 126 => b"\xF0\x91\x80\x83".to_vec(), // 𑀃 (Ii, 126) 127 => b"\xF0\x91\x80\x85".to_vec(), // 𑀅 (U, 127) - // Tifinagh Alphabet - 128 => b"\xE2\xB4\xB0".to_vec(), // ⴰ (Ya, 128) - 129 => b"\xE2\xB4\xB1".to_vec(), // ⴱ (Yab, 129) - 130 => b"\xE2\xB4\xB2".to_vec(), // ⴲ (Yabh, 130) - 131 => b"\xE2\xB4\xB3".to_vec(), // ⴳ (Yag, 131) - 132 => b"\xE2\xB4\xB4".to_vec(), // ⴴ (Yagh, 132) - 133 => b"\xE2\xB4\xB5".to_vec(), // ⴵ (Yaj, 133) + // End of Sinhala Alphabet + 128 => b"\xE0\xB6\xB1".to_vec(), // ඲ (La, 128) + 129 => b"\xE0\xB6\xB2".to_vec(), // ඳ (Va, 129) + 130 => b"\xE0\xB6\xB3".to_vec(), // ප (Sha, 130) + 131 => b"\xE0\xB6\xB4".to_vec(), // ඵ (Ssa, 131) + 132 => b"\xE0\xB6\xB5".to_vec(), // බ (Sa, 132) + 133 => b"\xE0\xB6\xB6".to_vec(), // භ (Ha, 133) // Glagolitic Alphabet 134 => b"\xE2\xB0\x80".to_vec(), // Ⰰ (Az, 134) @@ -1006,12 +1000,6 @@ impl Pallet { 436 => b"\xE0\xB6\xAE".to_vec(), // ථ (Ma, 436) 437 => b"\xE0\xB6\xAF".to_vec(), // ද (Ya, 437) 438 => b"\xE0\xB6\xB0".to_vec(), // ධ (Ra, 438) - 439 => b"\xE0\xB6\xB1".to_vec(), // ඲ (La, 439) - 440 => b"\xE0\xB6\xB2".to_vec(), // ඳ (Va, 440) - 441 => b"\xE0\xB6\xB3".to_vec(), // ප (Sha, 441) - 442 => b"\xE0\xB6\xB4".to_vec(), // ඵ (Ssa, 442) - 443 => b"\xE0\xB6\xB5".to_vec(), // බ (Sa, 443) - 444 => b"\xE0\xB6\xB6".to_vec(), // භ (Ha, 444) // Default case _ => b"\xCE\xA4".to_vec(), // Default to TAO uppercase symbol. diff --git a/pallets/subtensor/src/tests/subnet.rs b/pallets/subtensor/src/tests/subnet.rs index 4ceeaab897..999c02dd65 100644 --- a/pallets/subtensor/src/tests/subnet.rs +++ b/pallets/subtensor/src/tests/subnet.rs @@ -259,3 +259,20 @@ fn test_register_network_min_burn_at_default() { assert_eq!(MinBurn::::get(netuid), InitialMinBurn::get()); }); } + +// cargo test --package pallet-subtensor --lib -- tests::subnet::test_no_duplicates_in_get_symbol_for_subnet --exact --show-output +#[test] +fn test_no_duplicates_in_get_symbol_for_subnet() { + use std::collections::HashSet; + + let mut seen = HashSet::new(); + for netuid in 0u16..=438 { + let symbol = Pallet::::get_symbol_for_subnet(netuid); + assert!( + seen.insert(symbol.clone()), + "Duplicate symbol found for netuid {}: {:?}", + netuid, + symbol + ); + } +}