Rand Protocol
دستاویزات
RISC-V پروگرام

Rust پروگرام ڈیپلائے کریں

ایک no_std Rust crate سے ڈیپلائے شدہ خفیہ پروگرام تک قدم بہ قدم: مقررہ ٹول چین انسٹال کریں، guest لکھیں، اسے rand-guest کے ساتھ بنائیں اور جانچیں، ایمولیٹر پر چلائیں، اسے ڈیپلائے کریں اور کال کریں۔

یہ صفحہ ایک چھوٹے Rust پروگرام کو سورس کوڈ سے لے کر Rand پر تعینات شدہ پروگرام تک لے جاتا ہے۔ نیچے دی گئی ہر rand-guest کمانڈ واقعی چلائی گئی، اور اس کا آؤٹ پٹ خلاصہ کیے بغیر جوں کا توں نقل کیا گیا ہے۔ یہ رنز 2026-09-19 کو سرکٹس کمٹ 7ef3220 پر کیے گئے۔ testnet اب چین 20 ہے، جس کی ٹول چین، چین 18 اور 19 کی طرح، aeacf31 پر بنی ہے (fullnode v0.6.8 وہی کمٹ مقرر کرتا ہے جو v0.6.7 کرتا تھا)، اور آؤٹ پٹس وہاں دوبارہ نہیں چلائے گئے۔ RISC-V ISA مشین، سسٹم کالز اور فائل فارمیٹ کی وضاحت کرتا ہے۔

1. ٹول چین انسٹال کریں

hc عین اسی کمپائلر پر منحصر ہے، اس لیے ٹول چین کا ورژن مقرر کیا گیا ہے۔

ٹولورژنوجہ
Rust1.98.1گیسٹ اور خود rand-guest کو کمپائل کرتا ہے
riscv32im-unknown-none-elf ٹارگٹ1.98.1 کے لیےگیسٹ کا ٹارگٹ
سرکٹس کی ایک چیک آؤٹچین 18 تا 20 کے لیے aeacf31 پر randprotocol/zkp-circuitsrand-guest، guest-sdk اور لنکر اسکرپٹ اسی میں ہیں
git clone https://github.com/randprotocol/zkp-circuits circuits
cd circuits
git checkout aeacf31                      # branch feat/v067-circuits, what fullnode v0.6.7 and v0.6.8 pin
rustup toolchain install 1.98.1
rustup target add riscv32im-unknown-none-elf --toolchain 1.98.1
(cd rand-guest && cargo +1.98.1 build --release)
alias rand-guest="$PWD/rand-guest/target/release/rand-guest"

rand-guest کی پانچ ذیلی کمانڈز ہیں: build، check، pack، run اور info۔

کمٹ اس لیے اہم ہے کہ hc سورس اور ٹول چین کا فنکشن ہے: guest-sdk کے کسی دوسرے کمٹ کے ساتھ دوبارہ بنایا گیا گیسٹ مختلف hc پا سکتا ہے۔ 7ef3220 اور aeacf31 کے درمیان rand-guest ڈائریکٹری تبدیل نہیں ہوئی، جبکہ guest-sdk/src/lib.rs تبدیل ہوئی (مرحلہ 2)۔

2. گیسٹ لکھیں

گیسٹ ایک no_std، no_main بائنری کریٹ ہے جو guest-sdk پر منحصر ہے۔ اس کا سرکٹس چیک آؤٹ کے اندر ہونا لازم ہے: rand-guest build گیسٹ کی ڈائریکٹری سے اوپر guest-sdk/ تلاش کر کے چیک آؤٹ ڈھونڈتا ہے، اور کسی چیک آؤٹ سے باہر موجود گیسٹ کو رد کر دیتا ہے۔

یہ گیسٹ ایک کم از کم حد، ایک گنتی اور اتنی ہی تعداد میں نجی بیلنس پڑھتا ہے۔ اگر بیلنس اس حد کو پورا کرتے ہوں تو یہ 1 اور فاضل رقم شائع کرتا ہے۔ بیلنس یہ کبھی شائع نہیں کرتا۔

circuits/
  guest-sdk/
  rand-guest/
  my-guests/
    threshold/
      Cargo.toml
      src/main.rs

my-guests/threshold/Cargo.toml:

[package]
name = "threshold"
version = "0.1.0"
edition = "2021"

[dependencies]
guest-sdk = { path = "../../guest-sdk" }

[profile.release]
opt-level = 3
lto = true
panic = "abort"
codegen-units = 1

[workspace]

خالی [workspace] کریٹ کو کسی بھی بالائی ورک اسپیس سے باہر رکھتا ہے، جیسا کہ کمٹ شدہ fib گیسٹ کرتا ہے۔

my-guests/threshold/src/main.rs:

#![no_std]
#![no_main]

use guest_sdk::{halt, read_input, write_output};

/// Input 0 is a threshold, input 1 a count n, inputs 2..2+n are private balances.
/// Output 0 is 1 if the balances sum to at least the threshold, else 0.
/// Output 1 is the surplus when they do. The balances themselves are never published.
#[no_mangle]
pub extern "C" fn main() -> ! {
    let threshold = read_input(0);
    let n = read_input(1);
    let mut sum: u32 = 0;
    for i in 0..n {
        sum = sum.wrapping_add(read_input(2 + i));
    }
    if sum >= threshold {
        write_output(0, 1);
        write_output(1, sum - threshold);
    }
    halt();
}

guest-sdk یہ فنکشنز برآمد کرتا ہے: read_input، read_public، write_output، poseidon2، keccak، keccak256، sha256_compress، sha256 اور halt، اور _start فراہم کرتا ہے، جو اسٹیک پوائنٹر سیٹ کرتا ہے اور main کو کال کرتا ہے۔ اس میں نہ کوئی ایلوکیٹر ہے اور نہ فلوٹنگ پوائنٹ۔

aeacf31 پر ان میں سے تین کے فنکشن سگنیچرز 7ef3220 سے مختلف ہیں، اور ایک نئی برآمد شامل ہے:

فنکشن7ef3220 پرaeacf31 پر
keccakfn keccak(ptr: *mut u32)fn keccak(state: &mut [u32; 50])
sha256_compressfn sha256_compress(ptr: *mut u32)fn sha256_compress(buf: &mut [u32; 24])
poseidon2fn poseidon2(ptr: *mut u32, n: usize)unsafe fn poseidon2(ptr: *mut u32, n: usize)
poseidon2_lenموجود نہیںfn poseidon2_len(buf: &mut [u32], n: usize) -> [u32; 8]، سسٹم کال 7

poseidon2_len پیغام کی لمبائی کو اسپونج میں شامل کر کے باندھ دیتا ہے اور یہی محفوظ کال ہے۔ aeacf31 پر rand-guest check اب بھی صرف سسٹم کالز 0 تا 6 درج کرتا ہے، اس لیے جو گیسٹ اسے کال کرے وہ ایسی امیج بنتا ہے جسے build اس پیغام کے ساتھ رد کر دیتا ہے: ecall with a7 = 7, which is no syscall the machine implements (zkp-circuits ایشو #1)۔ جب تک یہ درست نہیں ہوتا، گیسٹ مقررہ لمبائی کے ٹیگ شدہ پیغامات پر unsafe { poseidon2(ptr, n) } سے ہیش کرتا ہے۔ اس صفحے کا گیسٹ ان چاروں میں سے کوئی بھی استعمال نہیں کرتا۔

گیسٹ ڈائریکٹری کے قواعد:

  • کوئی .cargo/config یا .cargo/config.toml نہیں، نہ اس میں، نہ کسی بالائی ڈائریکٹری میں، اور نہ $CARGO_HOME میں۔ build انکار کر دیتا ہے اور ہر فائل کا نام بتاتا ہے، کیونکہ cargo اسے بلڈ میں ضم کر دیتا۔
  • اپنا کوئی کمپائلر فلیگ نہیں۔ build تمام فلیگ خود سیٹ کرتا ہے: لنکر اسکرپٹ، -unaligned-scalar-mem، اور ایک پاتھ ری میپ جو امیج کو اس بات سے آزاد کر دیتا ہے کہ چیک آؤٹ کہاں رکھی ہے۔
  • زیادہ سے زیادہ ایک .ld فائل۔ build گیسٹ کی ڈائریکٹری میں موجود واحد .ld استعمال کرتا ہے، اور اگر کوئی نہ ہو تو guest-sdk/guest.ld۔ ایک سے زیادہ ہوں تو --ld کے ذریعے مطلوبہ فائل کا نام دیں۔

3. بلڈ اور جانچ

$ rand-guest build my-guests/threshold --out threshold.bin
   Compiling guest-sdk v0.1.0 (…/circuits/guest-sdk)
warning: unstable feature specified for `-Ctarget-feature`: `unaligned-scalar-mem`
  |
  = note: this feature is not stably supported; its behavior can change in the future

warning: `guest-sdk` (lib) generated 1 warning
   Compiling threshold v0.1.0 (…/circuits/my-guests/threshold)
warning: `threshold` (bin "threshold") generated 1 warning (1 duplicate)
    Finished `release` profile [optimized] target(s) in 0.15s
40 words against a cap of 4096 (fits); 0 ecall(s) with a non-static a7
OK
wrote threshold.bin and its .sha256 (40 words, hc a491df99f289d81e2b6e09849a850b14e36e2bd6edc5f5a6de46c3d67c703665, program id 1b129cbce89df252150ab3d387a927beb1650a40e6cb0b04e86cdc203ca1b853)

unaligned-scalar-mem والی وارننگ متوقع ہے: ٹول چین غیر ہم ترتیب میموری رسائی جان بوجھ کر بند رکھتی ہے۔

build، cargo +1.98.1 build --release --target riscv32im-unknown-none-elf سے کمپائل کرتا ہے، نتیجے پر check چلاتا ہے، اور امیج کنٹینر اور ایک .sha256 پن لکھتا ہے۔ اگر check پروگرام کو رد کر دے تب بھی build امیج لکھ دیتا ہے اور غیر صفر کوڈ کے ساتھ ختم ہوتا ہے۔

فلیگطے شدہ قدرمطلب
--out <path><dir>/image.binامیج کہاں لکھی جائے
--max-words <n>4096وہ حد جس کے مقابل check پیمائش کرتا ہے؛ ہدف چین کی حد دیں (چین 20 پر 65,535)
--ld <path>ڈائریکٹری میں موجود واحد .ld، ورنہ guest-sdk/guest.ldلنکر اسکرپٹ
--lang rust|crustکمپائلر

4. اسے ایمولیٹر پر چلائیں

نجی ان پٹ --input کے ذریعے دیں، ہر ان پٹ ایک ورڈ۔ --tier t یہ بھی بتاتا ہے کہ آیا رن ٹیئر t میں سماتا ہے۔

$ rand-guest run threshold.bin --input 1000 --input 4 --input 400 --input 250 --input 300 --input 75 --tier 10
out[0] = 1
out[1] = 25
out[2] = 0
out[3] = 0
out[4] = 0
out[5] = 0
out[6] = 0
out[7] = 0
cycles 52
tier 10
tier 10: fits (cycles 66 of 1023, Poseidon2 permutations 14 of 128)

بیلنس کا مجموعہ 1,025 ہے، اس لیے پروگرام 1 اور 25 کی فاضل رقم شائع کرتا ہے۔ بیلنس 400 اور 250 ہوں تو مجموعہ کم پڑتا ہے اور ہر آؤٹ پٹ صفر ہوتا ہے۔ ٹریپ کی صورت میں trap: <error> پرنٹ ہوتا ہے اور پروگرام کوڈ 2 کے ساتھ ختم ہوتا ہے۔

5. امیج کا معائنہ کریں

$ rand-guest info threshold.bin
form: image container
text 40 words at 0x1000; data 0 words (0 non-zero) at 0x0; prologue 0 words; program 40 words from base_pc 0x1000
hc a491df99f289d81e2b6e09849a850b14e36e2bd6edc5f5a6de46c3d67c703665
program id 1b129cbce89df252150ab3d387a927beb1650a40e6cb0b04e86cdc203ca1b853
40 words against a cap of 4096: fits

hc وہ قدر ہے جس کے مقابل کسی کال کے ثبوت کی تصدیق کی جاتی ہے۔ پروگرام آئی ڈی وہ ہے جس کے تحت آپ پروگرام تعینات کرتے اور اسے کال کرتے ہیں۔

6. تعینات کریں

fullnode v0.3 یا اس کے بعد کا rand والیٹ استعمال کریں؛ پرانے والیٹ امیج کنٹینر نہیں پڑھ سکتے۔ چین 14 سے ہر بنڈل ثبوت کی تصدیق اس کی ٹرانزیکشن کی بائنڈنگ کے مقابل کی جاتی ہے، اس لیے چین 14 کے بلڈ (b3c594c) سے پرانا والیٹ ایسے بنڈل کا ثبوت بناتا ہے جسے چین رد کر دیتی ہے۔ چین 20 پر، جو اس وقت فعال چین ہے، fullnode v0.6.8 یا اس کے بعد کا rand استعمال کریں (نوڈز کا بیڑا v0.6.8 چلاتا ہے، اور Linux پر بنا ہوا rand اس کی GitHub ریلیز کے ساتھ منسلک ہے)۔ v0.6.7 والیٹ چین 20 پر کچھ نہیں بھیج سکتا: چین 20 کا جینیسس binding_domain: 1 سیٹ کرتا ہے، اس لیے ہر ثبوت کی بائنڈنگ اور ہر دستخط شدہ پیغام میں جینیسس ہیش شامل ہوتا ہے، جبکہ v0.6.7 والیٹ صرف چین آئی ڈی کو باندھتا ہے۔ عوامی اینڈ پوائنٹ https://rpc.randprotocol.org والیٹ کو ہم آہنگ کرنے، تعینات کرنے اور کال کرنے کے لیے کافی ہے (سیٹ اپ)۔

rand fee deploy 40               # the floor for a 40-word program
rand program deploy threshold.bin

program deploy پروگرام آئی ڈی، ورڈز کی تعداد اور hc پرنٹ کرتا ہے۔ پھر یہ rand_estimateFee کے ذریعے نوڈ سے تعیناتی فیس پوچھتا ہے، جو چین کی حد سے بڑے پروگرام کو ثبوت سازی شروع ہونے سے پہلے ہی رد کر دیتا ہے۔ اس کے بعد یہ صفر قدر کی اپنے ہی پتے پر منتقلی کے اس بنڈل کا ثبوت بناتا ہے جو فیس ادا کرتا ہے، اسے جمع کراتا ہے، اور کمٹ ہونے کا انتظار کرتا ہے۔ یہ بنڈل وہی 4 ان پٹ اور 4 آؤٹ پٹ والا پوشیدہ اثاثہ بنڈل ہے جو ہر ٹرانزیکشن میں ہوتا ہے۔ چین 17 سے یہ دو ثبوت ہیں، اور والیٹ ہر ایک کے لیے ایک سطر پرنٹ کرتا ہے: ٹیئر 10 کی خرچ اجازت (چند سیکنڈ، تقریباً 1.37 MB) اور ٹیئر 14 کا بنڈل (لیپ ٹاپ پر تقریباً دو منٹ، تقریباً 1.5 MB)۔ چین 15 پر یہ تقریباً 100 s اور تقریباً 1.42 MB کا ایک ہی ٹیئر 14 ثبوت تھا۔ ایک گمنام ووٹ چین 18 پر ایک تعیناتی اسی طرح دکھاتا ہے جیسے والیٹ نے اسے پرنٹ کیا تھا۔

تعیناتی فیس 0.001 RAND + 0.0001 RAND × words ہے، اور چین 20 پر بھی پہلے کی طرح یہی ہے۔ گیس کالوں کی قیمت طے کرتی ہے، تعیناتیوں کی نہیں:

پروگرامورڈزتعیناتی فیس
threshold400.005 RAND
طے شدہ حد پر ایک پروگرام (چین 12)4,0960.4106 RAND
سب سے بڑا پروگرام جسے چین 20 کسی عوامی سیگمنٹ کے بغیر تعینات کرتی ہے8,1800.819 RAND
65,535 ورڈز کی حد پر ایک پروگرام (چین 13 تا 15)65,5356.5545 RAND

threshold 4,096 ورڈز سے چھوٹا ہے، اس لیے یہ طے شدہ حد میں بھی سما جاتا ہے اور چین 20 کی 65,535 کی حد میں بھی۔ 4,096 ورڈز سے بڑے پروگرام کے لیے ایسی چین درکار ہے جس کا جینیسس max_program_words کو کم از کم اتنا سیٹ کرے، جیسے چین 20 (RISC-V ISA)۔ چین 20، چین 19 کی طرح، ایک دوسری اور کم تر حد بھی رکھتی ہے: یہ ایسا پروگرام تعینات کرنے سے انکار کرتی ہے جسے کوئی ٹیئر 14 کال سمو نہ سکے (ProgramUncallable)، یعنی عوامی سیگمنٹ کے بغیر 8,180 ورڈز سے بڑا، اور عوامی سیگمنٹ کے ساتھ اس سے کم۔ rand program deploy --input <word> … (یا بغیر ان پٹ والی کال کے لیے --check-call) آپ کے پیشِ نظر کال کو پہلے ایمولیٹر میں چلاتا ہے اور تعیناتی سے انکار کر دیتا ہے جب تک وہ کال ٹیئر 14 یا اس سے نیچے نہ رہے۔

ریکارڈ کی جانچ کریں:

rand program show 1b129cbce89df252150ab3d387a927beb1650a40e6cb0b04e86cdc203ca1b853

اس کا code_hash وہی hc ہے جو rand-guest نے پرنٹ کیا تھا، بس مختلف انداز میں لکھا گیا ہے۔ rand-guest ڈائجسٹ کے آٹھ ورڈز میں سے ہر ایک کو بگ اینڈین ترتیب میں پرنٹ کرتا ہے، جبکہ والیٹ، rand program show اور rand_getProgram ہر ورڈ کے بائٹس لٹل اینڈین ترتیب میں پرنٹ کرتے ہیں۔ اس لیے a491df99…3665، 99df91a4…707c کی صورت میں ظاہر ہوتا ہے: آٹھ ہیکس ہندسوں کے ہر گروپ میں بائٹس کی ترتیب الٹ جاتی ہے۔ پروگرام آئی ڈی دونوں میں ایک ہی طرح لکھی جاتی ہے۔

7. اسے کال کریں

rand call 1b129cbce89df252150ab3d387a927beb1650a40e6cb0b04e86cdc203ca1b853 \
    --input 1000 --input 4 --input 400 --input 250 --input 300 --input 75

والیٹ کوڈ حاصل کرتا ہے، کال کو ایمولیٹر میں چلاتا ہے، اور کسی بھی ثبوت سازی سے پہلے gas: <exact> (declaring <limit>, tier <t>) اور فیس پرنٹ کرتا ہے۔ پھر یہ ان پٹ ٹرانسکرپٹ کو مہر بند کرتا ہے، رن کا ثبوت مقامی طور پر بناتا ہے، ایک بنڈل کے ذریعے فیس ادا کرتا ہے، اور رسید پرنٹ کرتا ہے۔ چین 20 پر یہ تین ثبوت ہیں: کال، ٹیئر 10 کی خرچ اجازت اور ٹیئر 14 کا بنڈل۔

چین 20 پر فیس اب 0.001 + call_fee(tier) نہیں رہی، جس کے تحت چین 15 پر یہ کال 0.002 RAND کی پڑتی تھی۔ کم از کم فیس BUNDLE_BASE + gas_price × declared gas limit + byte_price × ⌈bytes / 1024⌉ ہے: 0.001 RAND، جمع گیس کی قیمت پر اعلان کردہ حد (جینیسس پر 100 یونٹ، ایک یونٹ 10⁻⁹ RAND کے برابر)، جمع بائٹ کی قیمت پر ثبوت اور لفافے کے بائٹس (جینیسس پر 800 یونٹ فی KiB)۔ چین 20 پر یہ دونوں قیمتیں 10,000 اور 80,000 یونٹ سے آگے نہیں بڑھ سکتیں۔ اصل گیس نجی رہتی ہے۔ بطورِ طے شدہ والیٹ اسے 2^(tier − 2) کے کسی مضرب تک بڑھا کر اعلان کرتا ہے، ثبوت کی قیمت چین کی 4,194,304 بائٹ کی حد پر لگاتا ہے کیونکہ فیس ثبوت کے وجود میں آنے سے پہلے طے ہو جاتی ہے، اور گنجائش کے لیے قیمت کے دو مدارج کا اضافہ کرتا ہے۔ چین 18 پر ناپی گئی چار کالوں میں سے ہر ایک پر 0.0057 سے 0.0075 RAND لاگت آئی (مثالی پروگرام)۔ یہ کال چین 18 سے 20 پر نہیں کی گئی، اس لیے اس کے لیے کوئی عدد نہیں دیا گیا۔

چین درجہ، اعلان کردہ گیس کی حد، H_IN اور آؤٹ پٹ کے آٹھ الفاظ [1, 25, 0, 0, 0, 0, 0, 0] دیکھتی ہے۔ بیلنس اسے کبھی نظر نہیں آتے۔

پروگرام میں رسیدوں، ان پٹ لفافوں اور rand open-call کا بیان ہے۔ اس جیسی Call حالت سے آزاد ہوتی ہے؛ چین 20 پر کوئی پروگرام Invoke کے ذریعے سیلز اور ایک تجوری بھی رکھ سکتا ہے (پروگرام کی حالت (RPL-2))۔

دوسروں کو اپنا hc جانچنے دیں

بلڈ قابلِ اعادہ ہے۔ build کمپائلر کے ماحول کو صاف کرتا ہے (RUSTFLAGS، CARGO_* اوور رائیڈز، RUSTC ریپرز اور مزید)، cargo کی کنفیگ فائلوں کو مسترد کرتا ہے، اور چیک آؤٹ کے راستے کو /rand-circuits پر منتقل کر دیتا ہے۔ Rust 1.98.1 کے ساتھ ایک ہی سورس کسی بھی مشین پر ایک ہی hc دیتا ہے۔ دوسروں کو یہ تصدیق کرنے کا موقع دینے کے لیے کہ آپ نے کیا ڈیپلائے کیا، گیسٹ کا سورس اور اپنا circuits کمٹ شائع کریں (چین 18 سے 20 کے لیے بنائے گئے گیسٹ کے لیے aeacf31)۔ پھر کوئی بھی دوبارہ بلڈ کر کے hc کا موازنہ rand_getProgram کے code_hash سے کر سکتا ہے۔ چین صرف الفاظ محفوظ کرتی ہے، سورس نہیں۔

مسائل کا حل

پیغاموجہ
… is not inside a circuits checkout (no guest-sdk/ above it)گیسٹ ڈائریکٹری کو چیک آؤٹ کے اندر منتقل کریں
build کسی .cargo/config.toml کا نام لیتا ہےاسے حذف یا منتقل کریں؛ اسے صاف نہیں کیا جا سکتا
Cap کے ساتھ REJECTEDپروگرام --max-words سے بڑا ہے؛ اسے ہدف چین کی حد تک بڑھائیں، یا پروگرام کو چھوٹا کریں (opt-level = "s")
Syscall اور a7 = 7 کے ساتھ REJECTEDگیسٹ poseidon2_len کو کال کرتا ہے؛ aeacf31 پر rand-guest check ابھی سسٹم کال 7 سے واقف نہیں (zkp-circuits مسئلہ #1)
Fence، Csr یا Ebreak کے ساتھ REJECTEDبلڈ نے ایسی ہدایت پیدا کی جو مشین میں موجود نہیں؛ دیکھیں کیا مسترد کیا جاتا ہے
run سے trap: …رن ٹائم خرابی، جیسے غیر ہم ترتیب پتہ یا غیر نافذ شدہ سسٹم کال نمبر
run کہتا ہے کہ رن کسی درجے میں نہیں سماتارن 2²⁰ قطاروں یا اپنے Poseidon2 بجٹ سے تجاوز کرتا ہے؛ اسے ثابت نہیں کیا جا سکتا

آخری بار 2026-10-12 کو fullnode کمٹ c0878c3f (چین 21)، اور circuits `7ef3220` (`rand-guest/README.md`, `guest-sdk/`, `guests-compiled/fib`); every `rand-guest` output on this page was produced on 2026-09-19, circuits `aeacf31` (`guest-sdk/src/lib.rs`, `rand-guest/src/check.rs`; `git diff 7ef3220 aeacf31 -- guest-sdk rand-guest`), read on 2026-09-30; no output on this page was re-run at that commit, fullnode tag v0.6.8 `c9c9bd3c` (`docs/deploy.md` on `binding_domain`, `.github/workflows/ci.yml` circuits pin) and `rand_getLimits` on chain 20, read on 2026-10-01; nothing on this page was deployed or called on chain 20, fullnode tag v0.8.0 `c0878c3f` (`CHANGELOG.md`, `docs/zkvm.md` §8a) and `rand_getLimits` on chain 21, read on 2026-10-12; nothing on this page was deployed or called on chain 21 کے مقابل تصدیق کی گئی۔ جہاں کوڈ اور یہ صفحہ ایک دوسرے سے مختلف ہوں، وہاں کوڈ درست ہے؛ ہمیں مطلع کریں۔