{"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 {\r\n  Address,\r\n  GetAccountInfoApi,\r\n  IInstruction,\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<IInstruction[]> => {\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: IInstruction[] = [];\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":["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":"kdAwD8BA,OAC5BC,MACAC,SACAC,QACAC,QACAC,oBACAC,OAAOC,YACPC,eAGA,GAAIN,EAAOO,SAAS,MAAQP,EAAOQ,OAAOC,gBAAkBT,EAC1D,MAAM,IAAIU,EAAkBA,mBAAC,gCAG/B,MAAMC,QAAsBC,gBAAcZ,EAAQa,EAAAA,qBAE5CC,QAA6BF,EAAAA,cACjCD,OACAI,EACAC,EAAAA,gBAGKC,SAAsBC,2BAAyB,CACpDC,eAAgBC,EAAwBA,yBACxCC,MAAO,CAACC,EAAAA,aAAaC,OAAOZ,MAGxBa,EAAsB,GACtBC,EAAgBC,EAAAA,UAAUC,WAAWC,GAAMA,IAAMtB,IACjDuB,EAAgBvB,IAAgC,IAApBmB,EAClC,IAAIK,EAEJ,GAAID,EAAe,EAChBC,SAAaC,yBAAuB,CACnC3B,OACA4B,MAAO1B,EACP2B,aAAcC,EAAqBA,wBAIrC,WAFyBC,sBAAoBpC,EAAK+B,IAElCM,OAAQ,CACtB,MAAMC,EAAKC,wBACTC,EAAAA,iCACArC,EACA4B,EACAxB,EACAF,EACAoC,EAAsBA,uBACtBN,yBAGFV,EAAIiB,KAAKJ,IAIb,MAAOK,SAAkBX,yBAAuB,CAC9C3B,OACA4B,MAAOW,EAAWA,YAClBV,aAAcC,EAAqBA,wBAE/BU,EAAYC,EAAAA,WAAWC,IAAI1C,GAEjC,IAAKwC,EACH,MAAM,IAAIG,EAAqBA,sBAC7B,wDAIJ,MAAMC,QAAwBC,qBAAmB,CAC/CC,MAAO,EACPN,cAGIP,EAAK,IAAIc,2BAAyB,CACtCC,KAAMpD,EACNC,QACAoD,eAAgBxB,EAAgBJ,EAAgB,OAC/C6B,eACDlC,EAAAA,yBACAmC,EAAoBA,qBACpB1C,EAAmBA,oBACnBF,EACAG,EACA0B,EAAAA,uBACAxB,EAAaA,cACbd,EACAA,EACAA,EACAC,EACA6C,EACAN,EACAR,wBACAsB,EAAAA,oBACAvC,EACAa,GAIF,OAFAN,EAAIiB,KAAKJ,GAEFb,CAAG"}