{"version":3,"file":"registerDomain.cjs","sources":["../../../src/bindings/registerDomain.ts"],"sourcesContent":["import {\r\n  ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\r\n  findAssociatedTokenPda,\r\n} from \"@solana-program/token\";\r\nimport { Address, Instruction, getProgramDerivedAddress } from \"@solana/kit\";\r\n\r\nimport { addressCodec } from \"../codecs\";\r\nimport {\r\n  CENTRAL_STATE,\r\n  NAME_PROGRAM_ADDRESS,\r\n  REFERRERS,\r\n  REGISTRY_PROGRAM_ADDRESS,\r\n  SNS_ROOT_DOMAIN_ACCOUNT,\r\n  SYSTEM_PROGRAM_ADDRESS,\r\n  SYSVAR_RENT_ADDRESS,\r\n  TOKEN_PROGRAM_ADDRESS,\r\n  USDC_MINT,\r\n  VAULT_OWNER,\r\n} from \"../constants/addresses\";\r\nimport { PYTH_FEEDS } from \"../constants/pythFeeds\";\r\nimport { PythFeedNotFoundError } from \"../errors\";\r\nimport { _createAtaIdempotentInstruction } from \"../instructions/createAtaIdempotentInstruction\";\r\nimport { CreateSplitV2Instruction } from \"../instructions/createSplitV2Instruction\";\r\nimport { _deriveAddress } from \"../utils/deriveAddress\";\r\nimport { getPythFeedAddress } from \"../utils/getPythFeedAddress\";\r\nimport { _parseSnsTopLevelDomain } from \"../utils/parseSnsDomain\";\r\n\r\n/**\r\n * Parameters for registering an SNS domain.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: RegisterDomainParams = {\r\n *   domain: \"example.sns\",\r\n *   space: 1_000,\r\n *   buyer,\r\n *   buyerTokenAccount,\r\n * };\r\n * ```\r\n */\r\nexport interface RegisterDomainParams {\r\n  /** Full `.sns` domain name. */\r\n  domain: string;\r\n  /** Domain registry size in bytes. */\r\n  space: number;\r\n  /** Account paying for registration. */\r\n  buyer: Address;\r\n  /** Buyer's payment token account. */\r\n  buyerTokenAccount: Address;\r\n  /** Payment token mint. Defaults to USDC. */\r\n  mint?: Address;\r\n  /** Supported referrer address. */\r\n  referrer?: Address;\r\n}\r\n\r\n/**\r\n * Builds the instructions to register a top-level `.sns` domain.\r\n *\r\n * If a supported referrer is provided, the returned instructions include an\r\n * idempotent associated token account creation instruction before the\r\n * registration instruction.\r\n *\r\n * @param params Registration parameters\r\n * @param params.domain Full `.sns` domain name\r\n * @param params.space Number of bytes to allocate for the domain registry\r\n * @param params.buyer Buyer paying for the registration\r\n * @param params.buyerTokenAccount Buyer's token account used to pay for registration\r\n * @param params.mint Token mint used for payment. Defaults to USDC\r\n * @param params.referrer Optional referrer address\r\n * @returns Transaction instructions.\r\n *\r\n * @example\r\n * ```ts\r\n * const instructions = await registerDomain({\r\n *   domain: \"example.sns\",\r\n *   space: 1_000,\r\n *   buyer,\r\n *   buyerTokenAccount,\r\n * });\r\n * ```\r\n */\r\nexport const registerDomain = async ({\r\n  domain,\r\n  space,\r\n  buyer,\r\n  buyerTokenAccount,\r\n  mint = USDC_MINT,\r\n  referrer,\r\n}: RegisterDomainParams): Promise<Instruction[]> => {\r\n  domain = _parseSnsTopLevelDomain(domain);\r\n\r\n  const domainAddress = await _deriveAddress(domain, SNS_ROOT_DOMAIN_ACCOUNT);\r\n\r\n  const reverseLookupAccount = await _deriveAddress(\r\n    domainAddress,\r\n    undefined,\r\n    CENTRAL_STATE\r\n  );\r\n\r\n  const [stateAddress] = await getProgramDerivedAddress({\r\n    programAddress: REGISTRY_PROGRAM_ADDRESS,\r\n    seeds: [addressCodec.encode(domainAddress)],\r\n  });\r\n\r\n  const ixs: Instruction[] = [];\r\n  const referrerIndex = REFERRERS.findIndex((e) => e === referrer);\r\n  const validReferrer = referrer && referrerIndex !== -1;\r\n  let ata: Address | undefined = undefined;\r\n\r\n  if (validReferrer) {\r\n    [ata] = await findAssociatedTokenPda({\r\n      mint,\r\n      owner: referrer,\r\n      tokenProgram: TOKEN_PROGRAM_ADDRESS,\r\n    });\r\n    const ix = _createAtaIdempotentInstruction(\r\n      ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\r\n      buyer,\r\n      ata,\r\n      referrer,\r\n      mint,\r\n      SYSTEM_PROGRAM_ADDRESS,\r\n      TOKEN_PROGRAM_ADDRESS\r\n    );\r\n\r\n    ixs.push(ix);\r\n  }\r\n\r\n  const [vaultAta] = await findAssociatedTokenPda({\r\n    mint,\r\n    owner: VAULT_OWNER,\r\n    tokenProgram: TOKEN_PROGRAM_ADDRESS,\r\n  });\r\n  const priceFeed = PYTH_FEEDS.get(mint);\r\n\r\n  if (!priceFeed) {\r\n    throw new PythFeedNotFoundError(\r\n      \"The Pyth account for the provided mint was not found\"\r\n    );\r\n  }\r\n\r\n  const pythFeedAddress = await getPythFeedAddress({\r\n    shard: 0,\r\n    priceFeed,\r\n  });\r\n\r\n  const ix = new CreateSplitV2Instruction({\r\n    name: domain,\r\n    space,\r\n    referrerIdxOpt: validReferrer ? referrerIndex : null,\r\n  }).getInstruction(\r\n    REGISTRY_PROGRAM_ADDRESS,\r\n    NAME_PROGRAM_ADDRESS,\r\n    SNS_ROOT_DOMAIN_ACCOUNT,\r\n    domainAddress,\r\n    reverseLookupAccount,\r\n    SYSTEM_PROGRAM_ADDRESS,\r\n    CENTRAL_STATE,\r\n    buyer,\r\n    buyer,\r\n    buyer,\r\n    buyerTokenAccount,\r\n    pythFeedAddress,\r\n    vaultAta,\r\n    TOKEN_PROGRAM_ADDRESS,\r\n    SYSVAR_RENT_ADDRESS,\r\n    stateAddress,\r\n    ata\r\n  );\r\n  ixs.push(ix);\r\n\r\n  return ixs;\r\n};\r\n"],"names":["USDC_MINT","_parseSnsTopLevelDomain","_deriveAddress","SNS_ROOT_DOMAIN_ACCOUNT","CENTRAL_STATE","getProgramDerivedAddress","REGISTRY_PROGRAM_ADDRESS","addressCodec","REFERRERS","findAssociatedTokenPda","TOKEN_PROGRAM_ADDRESS","_createAtaIdempotentInstruction","ASSOCIATED_TOKEN_PROGRAM_ADDRESS","SYSTEM_PROGRAM_ADDRESS","VAULT_OWNER","PYTH_FEEDS","PythFeedNotFoundError","getPythFeedAddress","CreateSplitV2Instruction","NAME_PROGRAM_ADDRESS","SYSVAR_RENT_ADDRESS"],"mappings":";;;;;;;;;;;;;;;;AAuDA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MACU,cAAc,GAAG,OAAO,EACnC,MAAM,EACN,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,IAAI,GAAGA,mBAAS,EAChB,QAAQ,GACa,KAA4B;AACjD,IAAA,MAAM,GAAGC,sCAAuB,CAAC,MAAM,CAAC;IAExC,MAAM,aAAa,GAAG,MAAMC,4BAAc,CAAC,MAAM,EAAEC,iCAAuB,CAAC;IAE3E,MAAM,oBAAoB,GAAG,MAAMD,4BAAc,CAC/C,aAAa,EACb,SAAS,EACTE,uBAAa,CACd;AAED,IAAA,MAAM,CAAC,YAAY,CAAC,GAAG,MAAMC,4BAAwB,CAAC;AACpD,QAAA,cAAc,EAAEC,kCAAwB;QACxC,KAAK,EAAE,CAACC,mBAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAC5C,KAAA,CAAC;IAEF,MAAM,GAAG,GAAkB,EAAE;AAC7B,IAAA,MAAM,aAAa,GAAGC,mBAAS,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;IAChE,MAAM,aAAa,GAAG,QAAQ,IAAI,aAAa,KAAK,EAAE;IACtD,IAAI,GAAG,GAAwB,SAAS;IAExC,IAAI,aAAa,EAAE;AACjB,QAAA,CAAC,GAAG,CAAC,GAAG,MAAMC,4BAAsB,CAAC;YACnC,IAAI;AACJ,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,YAAY,EAAEC,+BAAqB;AACpC,SAAA,CAAC;AACF,QAAA,MAAM,EAAE,GAAGC,8DAA+B,CACxCC,sCAAgC,EAChC,KAAK,EACL,GAAG,EACH,QAAQ,EACR,IAAI,EACJC,gCAAsB,EACtBH,+BAAqB,CACtB;AAED,QAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;;AAGd,IAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAMD,4BAAsB,CAAC;QAC9C,IAAI;AACJ,QAAA,KAAK,EAAEK,qBAAW;AAClB,QAAA,YAAY,EAAEJ,+BAAqB;AACpC,KAAA,CAAC;IACF,MAAM,SAAS,GAAGK,oBAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,MAAM,IAAIC,4BAAqB,CAC7B,sDAAsD,CACvD;;AAGH,IAAA,MAAM,eAAe,GAAG,MAAMC,qCAAkB,CAAC;AAC/C,QAAA,KAAK,EAAE,CAAC;QACR,SAAS;AACV,KAAA,CAAC;AAEF,IAAA,MAAM,EAAE,GAAG,IAAIC,iDAAwB,CAAC;AACtC,QAAA,IAAI,EAAE,MAAM;QACZ,KAAK;QACL,cAAc,EAAE,aAAa,GAAG,aAAa,GAAG,IAAI;AACrD,KAAA,CAAC,CAAC,cAAc,CACfZ,kCAAwB,EACxBa,8BAAoB,EACpBhB,iCAAuB,EACvB,aAAa,EACb,oBAAoB,EACpBU,gCAAsB,EACtBT,uBAAa,EACb,KAAK,EACL,KAAK,EACL,KAAK,EACL,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACRM,+BAAqB,EACrBU,6BAAmB,EACnB,YAAY,EACZ,GAAG,CACJ;AACD,IAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAEZ,IAAA,OAAO,GAAG;AACZ;;;;"}