Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit dd035ed

Browse files
dr497mvines
dr497
authored andcommitted
name-service: allow parent owner to transfer subdomains
1 parent 00b8a4b commit dd035ed

File tree

4 files changed

+33
-4
lines changed

4 files changed

+33
-4
lines changed

name-service/js/src/bindings.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ export async function transferNameOwnership(
169169
nameAccountKey,
170170
newOwner,
171171
curentNameOwner,
172-
nameClass
172+
nameClass,
173+
nameParent
173174
);
174175

175176
return transferInstr;

name-service/js/src/instructions.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ export function transferInstruction(
138138
nameAccountKey: PublicKey,
139139
newOwnerKey: PublicKey,
140140
currentNameOwnerKey: PublicKey,
141-
nameClassKey?: PublicKey
141+
nameClassKey?: PublicKey,
142+
nameParent?:PublicKey
142143
): TransactionInstruction {
143144
const buffers = [Buffer.from(Int8Array.from([2])), newOwnerKey.toBuffer()];
144145

@@ -165,6 +166,14 @@ export function transferInstruction(
165166
});
166167
}
167168

169+
if(nameParent){
170+
keys.push({
171+
pubkey: nameParent,
172+
isSigner: false,
173+
isWritable: false,
174+
});
175+
}
176+
168177
return new TransactionInstruction({
169178
keys,
170179
programId: nameProgramId,

name-service/program/src/instruction.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,13 @@ pub enum NameRegistryInstruction {
7070
/// * If account class is not `Pubkey::default()`:
7171
/// 0. `[writeable]` Name record to be transferred
7272
/// 1. `[signer]` Account owner
73-
/// 1. `[signer]` Account class
73+
/// 2. `[signer]` Account class
7474
///
75+
/// * If the signer is the parent name account owner
76+
/// 0. `[writeable]` Name record to be transferred
77+
/// 1. `[signer]` Account owner
78+
/// 2. `[signer]` Account class
79+
/// 3. `[]` Parent name record
7580
Transfer { new_owner: Pubkey },
7681

7782
/// Delete a name record.

name-service/program/src/processor.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,26 @@ impl Processor {
169169
let name_account = next_account_info(accounts_iter)?;
170170
let name_owner = next_account_info(accounts_iter)?;
171171
let name_class_opt = next_account_info(accounts_iter).ok();
172+
let parent_name = next_account_info(accounts_iter).ok();
172173

173174
let mut name_record_header =
174175
NameRecordHeader::unpack_from_slice(&name_account.data.borrow())?;
175176

176177
// Verifications
177-
if !name_owner.is_signer || name_record_header.owner != *name_owner.key {
178+
let is_parent_owner = if let Some(parent_name) = parent_name {
179+
if name_record_header.parent_name != *parent_name.key {
180+
msg!("Invalid parent name account");
181+
return Err(ProgramError::InvalidArgument);
182+
}
183+
let parent_name_record_header =
184+
NameRecordHeader::unpack_from_slice(&parent_name.data.borrow())?;
185+
parent_name_record_header.owner == *name_owner.key
186+
} else {
187+
false
188+
};
189+
if !name_owner.is_signer
190+
|| (name_record_header.owner != *name_owner.key && !is_parent_owner)
191+
{
178192
msg!("The given name owner is incorrect or not a signer.");
179193
return Err(ProgramError::InvalidArgument);
180194
}

0 commit comments

Comments
 (0)