{"version":3,"file":"transferSubdomain.mjs","sources":["../../../src/bindings/transferSubdomain.ts"],"sourcesContent":["import { Address, GetAccountInfoApi, Instruction, Rpc } from \"@solana/kit\";\r\n\r\nimport { NAME_PROGRAM_ADDRESS } from \"../constants/addresses\";\r\nimport { getSnsDomainAddress } from \"../domain/getSnsDomainAddress\";\r\nimport { InvalidSubdomainError } from \"../errors\";\r\nimport { TransferInstruction } from \"../instructions/transferInstruction\";\r\nimport { RegistryState } from \"../states/registry\";\r\nimport { _parseSnsSubdomain } from \"../utils/parseSnsDomain\";\r\n\r\n/**\r\n * Parameters for transferring an SNS subdomain.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: TransferSubdomainParams = {\r\n *   rpc,\r\n *   subdomain: \"sub.example.sns\",\r\n *   newOwner,\r\n * };\r\n * ```\r\n */\r\nexport interface TransferSubdomainParams {\r\n  /** RPC client. */\r\n  rpc: Rpc<GetAccountInfoApi>;\r\n  /** Full `.sns` subdomain name. */\r\n  subdomain: string;\r\n  /** New subdomain owner. */\r\n  newOwner: Address;\r\n  /** Whether the parent domain owner signs. */\r\n  isParentOwnerSigner?: boolean;\r\n  /** Current subdomain owner. Resolved when omitted. */\r\n  currentOwner?: Address;\r\n}\r\n\r\n/**\r\n * Builds an instruction to transfer a `.sns` subdomain.\r\n *\r\n * @param params Transfer parameters\r\n * @param params.rpc RPC client implementing account lookup\r\n * @param params.subdomain Full `.sns` subdomain name\r\n * @param params.newOwner New owner of the subdomain\r\n * @param params.isParentOwnerSigner Whether the parent domain owner signs the transfer\r\n * @param params.currentOwner Optional current owner of the subdomain. Resolved automatically when omitted\r\n * @returns Transaction instruction.\r\n *\r\n * @example\r\n * ```ts\r\n * const instruction = await transferSubdomain({ rpc, subdomain: \"sub.example.sns\", newOwner });\r\n * ```\r\n */\r\nexport const transferSubdomain = async ({\r\n  rpc,\r\n  subdomain,\r\n  newOwner,\r\n  isParentOwnerSigner,\r\n  currentOwner,\r\n}: TransferSubdomainParams): Promise<Instruction> => {\r\n  const [sub, parent] = _parseSnsSubdomain(subdomain);\r\n\r\n  const {\r\n    domainAddress,\r\n    isSub,\r\n    parentAddress: _parentAddress,\r\n  } = await getSnsDomainAddress({ domain: `${sub}.${parent}` });\r\n\r\n  if (!isSub || !_parentAddress) {\r\n    throw new InvalidSubdomainError(\"The subdomain is not valid\");\r\n  }\r\n\r\n  if (!currentOwner) {\r\n    const registry = await RegistryState.retrieve(rpc, domainAddress);\r\n    currentOwner = registry.owner;\r\n  }\r\n\r\n  let parentAddress: Address | undefined = undefined;\r\n  let parentOwner: Address | undefined = undefined;\r\n\r\n  if (isParentOwnerSigner) {\r\n    parentAddress = _parentAddress;\r\n    parentOwner = (await RegistryState.retrieve(rpc, _parentAddress)).owner;\r\n  }\r\n\r\n  const ix = new TransferInstruction({ newOwner }).getInstruction(\r\n    NAME_PROGRAM_ADDRESS,\r\n    domainAddress,\r\n    currentOwner,\r\n    undefined,\r\n    parentAddress,\r\n    parentOwner\r\n  );\r\n\r\n  return ix;\r\n};\r\n"],"names":[],"mappings":";;;;;;;AAkCA;;;;;;;;;;;;;;;AAeG;AACU,MAAA,iBAAiB,GAAG,OAAO,EACtC,GAAG,EACH,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,YAAY,GACY,KAA0B;IAClD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAEnD,MAAM,EACJ,aAAa,EACb,KAAK,EACL,aAAa,EAAE,cAAc,GAC9B,GAAG,MAAM,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAG,EAAA,GAAG,IAAI,MAAM,CAAA,CAAE,EAAE,CAAC;AAE7D,IAAA,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,EAAE;AAC7B,QAAA,MAAM,IAAI,qBAAqB,CAAC,4BAA4B,CAAC;;IAG/D,IAAI,CAAC,YAAY,EAAE;QACjB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;AACjE,QAAA,YAAY,GAAG,QAAQ,CAAC,KAAK;;IAG/B,IAAI,aAAa,GAAwB,SAAS;IAClD,IAAI,WAAW,GAAwB,SAAS;IAEhD,IAAI,mBAAmB,EAAE;QACvB,aAAa,GAAG,cAAc;AAC9B,QAAA,WAAW,GAAG,CAAC,MAAM,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,KAAK;;IAGzE,MAAM,EAAE,GAAG,IAAI,mBAAmB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,cAAc,CAC7D,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,SAAS,EACT,aAAa,EACb,WAAW,CACZ;AAED,IAAA,OAAO,EAAE;AACX;;;;"}