Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions casper-name-contracts/src/contracts/reverse_resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ impl ReverseResolver {
fn existing_resolution(&self, name: &str) -> Option<Address> {
let token_name = utils::extract_token_name(name)?;
let token_id = self.token_id(token_name);

// Check if the token ID is valid and if it has a resolver set. If not, return None.
if !self.name_token.is_token_valid(token_id) {
return None;
}

let resolver_address = self.name_token.resolver(token_id)?;
ResolverContractRef::new(self.env(), resolver_address).resolve(name.to_owned())
}
Expand Down Expand Up @@ -252,6 +258,76 @@ mod tests {
assert_eq!(reverse_resolver.get_primary_name(&user), None);
}

#[test]
fn test_set_new_primary_name_after_old_one_burned() {
let (mut ctx, mut reverse_resolver) = setup();
let (admin, user) = (ctx.admin, ctx.alice);

// Register a name and set it as the primary name.
ctx.with_name_registered(admin, user, TOKEN_TEST);
ctx.set_caller(user);
ctx.default_resolver
.set_resolution(DOMAIN_TEST.to_string(), Some(user));
reverse_resolver.set_primary_name(DOMAIN_TEST.to_string());
assert_eq!(
reverse_resolver.get_primary_name(&user),
Some(DOMAIN_TEST.to_string())
);

// Burn the name backing the primary name. The primary name no longer
// resolves, so it reads as None instead of reverting.
ctx.admin_burn(vec![TOKEN_TEST]);
assert_eq!(reverse_resolver.get_primary_name(&user), None);

// Register a fresh name with a resolution and set it as the new primary
// name. This must succeed even though the previous primary was burned.
ctx.with_name_registered(admin, user, TOKEN_TEST2);
ctx.set_caller(user);
ctx.default_resolver
.set_resolution(DOMAIN_TEST2.to_string(), Some(user));
reverse_resolver.set_primary_name(DOMAIN_TEST2.to_string());
assert_eq!(
reverse_resolver.get_primary_name(&user),
Some(DOMAIN_TEST2.to_string())
);
}

#[test]
fn test_set_primary_name_after_burn_and_remint() {
let (mut ctx, mut reverse_resolver) = setup();
let (admin, user) = (ctx.admin, ctx.alice);

// Register a name, set its resolution and make it the primary name.
ctx.with_name_registered(admin, user, TOKEN_TEST);
ctx.set_caller(user);
ctx.default_resolver
.set_resolution(DOMAIN_TEST.to_string(), Some(user));
reverse_resolver.set_primary_name(DOMAIN_TEST.to_string());
assert_eq!(
reverse_resolver.get_primary_name(&user),
Some(DOMAIN_TEST.to_string())
);

// Burn the name. The primary name no longer resolves.
ctx.admin_burn(vec![TOKEN_TEST]);
assert_eq!(reverse_resolver.get_primary_name(&user), None);

// Re-mint the same name. The fresh token has no resolution yet, so the
// primary name still does not resolve.
ctx.with_name_registered(admin, user, TOKEN_TEST);
assert_eq!(reverse_resolver.get_primary_name(&user), None);

// Set the resolution again and re-set the primary name. It succeeds.
ctx.set_caller(user);
ctx.default_resolver
.set_resolution(DOMAIN_TEST.to_string(), Some(user));
reverse_resolver.set_primary_name(DOMAIN_TEST.to_string());
assert_eq!(
reverse_resolver.get_primary_name(&user),
Some(DOMAIN_TEST.to_string())
);
}

fn setup() -> (TestContext, ReverseResolverHostRef) {
let ctx = TestContext::install_and_setup();
let reverse_resolver = ReverseResolver::deploy(
Expand Down