multiversx_sc_snippets/interactor/
interactor_dns.rs

1use multiversx_sc_scenario::{
2    multiversx_sc::types::Address, scenario_format::value_interpreter::keccak256,
3};
4
5fn get_initial_dns_address() -> Address {
6    Address::from_slice(&[1u8; 32])
7}
8
9fn compute_smart_contract_address(owner_address: Address, owner_nonce: u64) -> Address {
10    // 8 bytes of zero + 2 bytes for VM type + 20 bytes of hash(owner) + 2 bytes of shard(owner)
11    let owner_bytes = owner_address.as_bytes();
12    let nonce_bytes = owner_nonce.to_le_bytes();
13    let bytes_to_hash = [owner_bytes, &nonce_bytes].concat();
14    let initial_padding = [0u8; 8];
15    let vm_type: [u8; 2] = [5, 0];
16    let address = keccak256(&bytes_to_hash);
17    let address = [
18        initial_padding.as_slice(),
19        vm_type.as_slice(),
20        &address[10..30],
21        &owner_bytes[30..],
22    ]
23    .concat();
24    Address::from_slice(&address)
25}
26
27fn compute_dns_address_for_shard_id(shard_id: u8) -> Address {
28    let initial_dns_address = get_initial_dns_address();
29    let initial_dns_address_slice = initial_dns_address.as_array();
30    let shard_identifier = &[0u8, shard_id];
31    let deployer_pubkey_prefix =
32        &initial_dns_address_slice[0..initial_dns_address_slice.len() - shard_identifier.len()];
33
34    let deployer_pubkey = [deployer_pubkey_prefix, shard_identifier].concat();
35    let deployer_address = Address::from_slice(&deployer_pubkey);
36    let deployer_nonce = 0;
37    compute_smart_contract_address(deployer_address, deployer_nonce)
38}
39
40fn shard_id_from_name(name: &str) -> u8 {
41    let name_hash = keccak256(name.as_bytes());
42    name_hash[31]
43}
44
45pub fn dns_address_for_name(name: &str) -> Address {
46    let shard_id = shard_id_from_name(name);
47    compute_dns_address_for_shard_id(shard_id)
48}
49
50#[test]
51fn test_compute_dns_address() {
52    assert_eq!(
53        compute_dns_address_for_shard_id(0).to_bech32_default(),
54        "erd1qqqqqqqqqqqqqpgqnhvsujzd95jz6fyv3ldmynlf97tscs9nqqqq49en6w"
55    );
56    assert_eq!(
57        compute_dns_address_for_shard_id(1).to_bech32_default(),
58        "erd1qqqqqqqqqqqqqpgqysmcsfkqed279x6jvs694th4e4v50p4pqqqsxwywm0"
59    );
60    assert_eq!(
61        compute_dns_address_for_shard_id(2).to_bech32_default(),
62        "erd1qqqqqqqqqqqqqpgqnk5fq8sgg4vc63ffzf7qez550xe2l5jgqqpqe53dcq"
63    );
64}
65
66#[test]
67fn test_dns_for_name() {
68    assert_eq!(
69        dns_address_for_name("test.elrond")
70            .to_bech32_default()
71            .bech32,
72        "erd1qqqqqqqqqqqqqpgqx4ca3eu4k6w63hl8pjjyq2cp7ul7a4ukqz0skq6fxj"
73    );
74    assert_eq!(
75        dns_address_for_name("helloworld.elrond")
76            .to_bech32_default()
77            .bech32,
78        "erd1qqqqqqqqqqqqqpgqhcm9k2xkk75e47wpmvfgj8fuzwaguvzyqqrqsteg8w"
79    );
80}