multiversx_sc_snippets/interactor/
interactor_dns.rs1use 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 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}