{"version":3,"file":"registerDomain.mjs","sources":["../../../src/bindings/registerDomain.ts"],"sourcesContent":["import {\r\n  ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\r\n  findAssociatedTokenPda,\r\n} from \"@solana-program/token\";\r\nimport {\r\n  Address,\r\n  GetAccountInfoApi,\r\n  Instruction,\r\n  Rpc,\r\n  fetchEncodedAccount,\r\n  getProgramDerivedAddress,\r\n} 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  ROOT_DOMAIN_ADDRESS,\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 { InvalidDomainError, PythFeedNotFoundError } from \"../errors\";\r\nimport { _createAtaInstruction } from \"../instructions/createAtaInstruction\";\r\nimport { createSplitV2Instruction } from \"../instructions/createSplitV2Instruction\";\r\nimport { deriveAddress } from \"../utils/deriveAddress\";\r\nimport { getPythFeedAddress } from \"../utils/getPythFeedAddress\";\r\n\r\ninterface RegisterDomainParams {\r\n  rpc: Rpc<GetAccountInfoApi>;\r\n  domain: string;\r\n  space: number;\r\n  buyer: Address;\r\n  buyerTokenAccount: Address;\r\n  mint?: Address;\r\n  referrer?: Address;\r\n}\r\n\r\n/**\r\n * Registers a .sol domain.\r\n *\r\n * @param params - An object containing the following properties:\r\n *   - `rpc`: An RPC interface implementing GetAccountInfoApi.\r\n *   - `domain`: The domain name to be registered in lowercase.\r\n *   - `space`: The space in bytes to be allocated for the domain registry (max: 10,000).\r\n *   - `buyer`: The address of the buyer registering the domain.\r\n *   - `buyerTokenAccount`: The associated token account of the buyer.\r\n *   - `mint`: (Optional) The token mint used for payment. Defaults to USDC.\r\n *   - `referrer`: (Optional) The address of the referrer.\r\n * @returns A promise which resolves to an array of instructions required for domain registration.\r\n */\r\nexport const registerDomain = async ({\r\n  rpc,\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  // Basic validation\r\n  if (domain.includes(\".\") || domain.trim().toLowerCase() !== domain) {\r\n    throw new InvalidDomainError(\"The domain name is malformed\");\r\n  }\r\n\r\n  const domainAddress = await deriveAddress(domain, ROOT_DOMAIN_ADDRESS);\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 ataAccount = await fetchEncodedAccount(rpc, ata);\r\n\r\n    if (!ataAccount.exists) {\r\n      const ix = _createAtaInstruction(\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\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    ROOT_DOMAIN_ADDRESS,\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":["registerDomain","async","rpc","domain","space","buyer","buyerTokenAccount","mint","USDC_MINT","referrer","includes","trim","toLowerCase","InvalidDomainError","domainAddress","deriveAddress","ROOT_DOMAIN_ADDRESS","reverseLookupAccount","undefined","CENTRAL_STATE","stateAddress","getProgramDerivedAddress","programAddress","REGISTRY_PROGRAM_ADDRESS","seeds","addressCodec","encode","ixs","referrerIndex","REFERRERS","findIndex","e","validReferrer","ata","findAssociatedTokenPda","owner","tokenProgram","TOKEN_PROGRAM_ADDRESS","fetchEncodedAccount","exists","ix","_createAtaInstruction","ASSOCIATED_TOKEN_PROGRAM_ADDRESS","SYSTEM_PROGRAM_ADDRESS","push","vaultAta","VAULT_OWNER","priceFeed","PYTH_FEEDS","get","PythFeedNotFoundError","pythFeedAddress","getPythFeedAddress","shard","createSplitV2Instruction","name","referrerIdxOpt","getInstruction","NAME_PROGRAM_ADDRESS","SYSVAR_RENT_ADDRESS"],"mappings":"+7BAwDa,MAAAA,EAAiBC,OAC5BC,MACAC,SACAC,QACAC,QACAC,oBACAC,OAAOC,EACPC,eAGA,GAAIN,EAAOO,SAAS,MAAQP,EAAOQ,OAAOC,gBAAkBT,EAC1D,MAAM,IAAIU,EAAmB,gCAG/B,MAAMC,QAAsBC,EAAcZ,EAAQa,GAE5CC,QAA6BF,EACjCD,OACAI,EACAC,IAGKC,SAAsBC,EAAyB,CACpDC,eAAgBC,EAChBC,MAAO,CAACC,EAAaC,OAAOZ,MAGxBa,EAAqB,GACrBC,EAAgBC,EAAUC,WAAWC,GAAMA,IAAMtB,IACjDuB,EAAgBvB,IAAgC,IAApBmB,EAClC,IAAIK,EAEJ,GAAID,EAAe,EAChBC,SAAaC,EAAuB,CACnC3B,OACA4B,MAAO1B,EACP2B,aAAcC,IAIhB,WAFyBC,EAAoBpC,EAAK+B,IAElCM,OAAQ,CACtB,MAAMC,EAAKC,EACTC,EACArC,EACA4B,EACAxB,EACAF,EACAoC,EACAN,GAGFV,EAAIiB,KAAKJ,IAIb,MAAOK,SAAkBX,EAAuB,CAC9C3B,OACA4B,MAAOW,EACPV,aAAcC,IAEVU,EAAYC,EAAWC,IAAI1C,GAEjC,IAAKwC,EACH,MAAM,IAAIG,EACR,wDAIJ,MAAMC,QAAwBC,EAAmB,CAC/CC,MAAO,EACPN,cAGIP,EAAK,IAAIc,EAAyB,CACtCC,KAAMpD,EACNC,QACAoD,eAAgBxB,EAAgBJ,EAAgB,OAC/C6B,eACDlC,EACAmC,EACA1C,EACAF,EACAG,EACA0B,EACAxB,EACAd,EACAA,EACAA,EACAC,EACA6C,EACAN,EACAR,EACAsB,EACAvC,EACAa,GAIF,OAFAN,EAAIiB,KAAKJ,GAEFb,CAAG"}