{"version":3,"file":"getPrimaryDomainsBatch.cjs","sources":["../../../src/address/getPrimaryDomainsBatch.ts"],"sourcesContent":["import { findAssociatedTokenPda } from \"@solana-program/token\";\r\nimport {\r\n  Address,\r\n  GetMultipleAccountsApi,\r\n  GetTokenLargestAccountsApi,\r\n  Rpc,\r\n  fetchEncodedAccounts,\r\n} from \"@solana/kit\";\r\n\r\nimport { tokenCodec } from \"../codecs\";\r\nimport {\r\n  DEFAULT_ADDRESS,\r\n  NAME_OFFERS_ADDRESS,\r\n  NAME_PROGRAM_ADDRESS,\r\n  ROOT_DOMAIN_ADDRESS,\r\n  TOKEN_PROGRAM_ADDRESS,\r\n} from \"../constants/addresses\";\r\nimport { getNftMint } from \"../nft/getNftMint\";\r\nimport { PrimaryDomainState } from \"../states/primaryDomain\";\r\nimport { RegistryState } from \"../states/registry\";\r\nimport { deserializeReverse } from \"../utils/deserializers/deserializeReverse\";\r\nimport { getReverseAddressFromDomainAddress } from \"../utils/getReverseAddressFromDomainAddress\";\r\n\r\ninterface GetPrimaryDomainsBatchParams {\r\n  rpc: Rpc<GetMultipleAccountsApi & GetTokenLargestAccountsApi>;\r\n  walletAddresses: Address[];\r\n}\r\n\r\ninterface ValidPrimary {\r\n  index: number;\r\n  domainAddress: Address;\r\n  registry?: RegistryState;\r\n}\r\n\r\n/**\r\n * Batch retrieves the primary domains associated with a list of wallet addresses.\r\n *\r\n * @param params - An object containing the following properties:\r\n *   - `rpc`: An RPC interface implementing GetMultipleAccountsApi and GetTokenLargestAccountsApi.\r\n *   - `walletAddresses`: An array of wallet addresses for which primary domains are to be fetched.\r\n * @returns A promise resolving to an array of strings or undefined values, where each string represents\r\n *          the primary domain name if available and non-stale.\r\n */\r\nexport const getPrimaryDomainsBatch = async ({\r\n  rpc,\r\n  walletAddresses,\r\n}: GetPrimaryDomainsBatchParams): Promise<(string | undefined)[]> => {\r\n  const result: (string | undefined)[] = new Array(walletAddresses.length).fill(\r\n    undefined\r\n  );\r\n  const addresses = await Promise.all(\r\n    walletAddresses.map((address) =>\r\n      PrimaryDomainState.getAddress(NAME_OFFERS_ADDRESS, address)\r\n    )\r\n  );\r\n  const primaries = await PrimaryDomainState.retrieveBatch(rpc, addresses);\r\n\r\n  let validPrimaries = primaries.reduce<ValidPrimary[]>((acc, curr, idx) => {\r\n    if (curr) {\r\n      acc.push({ index: idx, domainAddress: curr.nameAccount });\r\n    }\r\n    return acc;\r\n  }, []);\r\n\r\n  const registries = await RegistryState.retrieveBatch(\r\n    rpc,\r\n    validPrimaries.map((item) => item.domainAddress)\r\n  );\r\n\r\n  validPrimaries = validPrimaries\r\n    .map((primary, idx) => ({ ...primary, registry: registries[idx] }))\r\n    .filter(({ registry }) => !!registry);\r\n\r\n  const revAddressesPromises: Promise<Address>[] = [];\r\n  const parentRevAddressesPromises: (Promise<Address> | Address)[] = [];\r\n  const atasPromises: Promise<Address>[] = [];\r\n\r\n  for (const { index, domainAddress, registry } of validPrimaries) {\r\n    const isSub = registry!.parentName !== ROOT_DOMAIN_ADDRESS;\r\n\r\n    parentRevAddressesPromises.push(\r\n      isSub\r\n        ? getReverseAddressFromDomainAddress({\r\n            domainAddress: registry!.parentName,\r\n          })\r\n        : DEFAULT_ADDRESS\r\n    );\r\n    revAddressesPromises.push(\r\n      getReverseAddressFromDomainAddress({\r\n        domainAddress,\r\n        parentAddress: isSub ? registry!.parentName : undefined,\r\n      })\r\n    );\r\n    atasPromises.push(\r\n      getNftMint({ domainAddress })\r\n        .then((mint) =>\r\n          findAssociatedTokenPda({\r\n            mint,\r\n            owner: walletAddresses[index],\r\n            tokenProgram: TOKEN_PROGRAM_ADDRESS,\r\n          })\r\n        )\r\n        .then(([pda]) => pda)\r\n    );\r\n  }\r\n\r\n  const [revs, parentRevs, tokenAccs] = await Promise.all([\r\n    Promise.all(revAddressesPromises).then((addresses) =>\r\n      fetchEncodedAccounts(rpc, addresses)\r\n    ),\r\n    Promise.all(parentRevAddressesPromises).then((addresses) =>\r\n      fetchEncodedAccounts(rpc, addresses)\r\n    ),\r\n    Promise.all(atasPromises).then((addresses) =>\r\n      fetchEncodedAccounts(rpc, addresses)\r\n    ),\r\n  ]);\r\n\r\n  for (const [i, { index, registry }] of validPrimaries.entries()) {\r\n    let parentRev = \"\";\r\n    const rev = revs[i];\r\n    const parentRevAccount = parentRevs[i];\r\n    const tokenAcc = tokenAccs[i];\r\n\r\n    if (!rev.exists) {\r\n      continue;\r\n    }\r\n\r\n    if (\r\n      parentRevAccount.exists &&\r\n      parentRevAccount.programAddress === NAME_PROGRAM_ADDRESS\r\n    ) {\r\n      const des = deserializeReverse({ data: parentRevAccount.data.slice(96) });\r\n      parentRev = `.${des}`;\r\n    }\r\n\r\n    if (registry!.owner === walletAddresses[index]) {\r\n      result[index] =\r\n        deserializeReverse({\r\n          data: rev.data.slice(96),\r\n          trimFirstNullByte: true,\r\n        }) + parentRev;\r\n      continue;\r\n    }\r\n\r\n    // Tokenized\r\n    if (\r\n      tokenAcc.exists &&\r\n      Number(tokenCodec.decode(tokenAcc.data).amount) === 1\r\n    ) {\r\n      result[index] =\r\n        deserializeReverse({ data: rev?.data.slice(96) }) + parentRev;\r\n      continue;\r\n    }\r\n\r\n    // Stale otherwise\r\n  }\r\n\r\n  return result;\r\n};\r\n"],"names":["async","rpc","walletAddresses","result","Array","length","fill","undefined","addresses","Promise","all","map","address","PrimaryDomainState","getAddress","NAME_OFFERS_ADDRESS","validPrimaries","retrieveBatch","reduce","acc","curr","idx","push","index","domainAddress","nameAccount","registries","RegistryState","item","primary","registry","filter","revAddressesPromises","parentRevAddressesPromises","atasPromises","isSub","parentName","ROOT_DOMAIN_ADDRESS","getReverseAddressFromDomainAddress","DEFAULT_ADDRESS","parentAddress","getNftMint","then","mint","findAssociatedTokenPda","owner","tokenProgram","TOKEN_PROGRAM_ADDRESS","pda","revs","parentRevs","tokenAccs","fetchEncodedAccounts","i","entries","parentRev","rev","parentRevAccount","tokenAcc","exists","programAddress","NAME_PROGRAM_ADDRESS","deserializeReverse","data","slice","Number","tokenCodec","decode","amount","trimFirstNullByte"],"mappings":"0bA2CsCA,OACpCC,MACAC,sBAEA,MAAMC,EAAiC,IAAIC,MAAMF,EAAgBG,QAAQC,UACvEC,GAEIC,QAAkBC,QAAQC,IAC9BR,EAAgBS,KAAKC,GACnBC,EAAkBA,mBAACC,WAAWC,sBAAqBH,MAKvD,IAAII,SAFoBH,EAAAA,mBAAmBI,cAAchB,EAAKO,IAE/BU,QAAuB,CAACC,EAAKC,EAAMC,KAC5DD,GACFD,EAAIG,KAAK,CAAEC,MAAOF,EAAKG,cAAeJ,EAAKK,cAEtCN,IACN,IAEH,MAAMO,QAAmBC,gBAAcV,cACrChB,EACAe,EAAeL,KAAKiB,GAASA,EAAKJ,iBAGpCR,EAAiBA,EACdL,KAAI,CAACkB,EAASR,SAAcQ,EAASC,SAAUJ,EAAWL,OAC1DU,QAAO,EAAGD,gBAAiBA,IAE9B,MAAME,EAA2C,GAC3CC,EAA6D,GAC7DC,EAAmC,GAEzC,IAAK,MAAMX,MAAEA,EAAKC,cAAEA,EAAaM,SAAEA,KAAcd,EAAgB,CAC/D,MAAMmB,EAAQL,EAAUM,aAAeC,EAAmBA,oBAE1DJ,EAA2BX,KACzBa,EACIG,qCAAmC,CACjCd,cAAeM,EAAUM,aAE3BG,mBAENP,EAAqBV,KACnBgB,qCAAmC,CACjCd,gBACAgB,cAAeL,EAAQL,EAAUM,gBAAa7B,KAGlD2B,EAAaZ,KACXmB,aAAW,CAAEjB,kBACVkB,MAAMC,GACLC,yBAAuB,CACrBD,OACAE,MAAO3C,EAAgBqB,GACvBuB,aAAcC,EAAqBA,0BAGtCL,MAAK,EAAEM,KAASA,KAIvB,MAAOC,EAAMC,EAAYC,SAAmB1C,QAAQC,IAAI,CACtDD,QAAQC,IAAIsB,GAAsBU,MAAMlC,GACtC4C,EAAoBA,qBAACnD,EAAKO,KAE5BC,QAAQC,IAAIuB,GAA4BS,MAAMlC,GAC5C4C,EAAoBA,qBAACnD,EAAKO,KAE5BC,QAAQC,IAAIwB,GAAcQ,MAAMlC,GAC9B4C,EAAoBA,qBAACnD,EAAKO,OAI9B,IAAK,MAAO6C,GAAG9B,MAAEA,EAAKO,SAAEA,MAAed,EAAesC,UAAW,CAC/D,IAAIC,EAAY,GAChB,MAAMC,EAAMP,EAAKI,GACXI,EAAmBP,EAAWG,GAC9BK,EAAWP,EAAUE,GAE3B,GAAKG,EAAIG,OAAT,CAIA,GACEF,EAAiBE,QACjBF,EAAiBG,iBAAmBC,uBACpC,CAEAN,EAAY,IADAO,EAAkBA,mBAAC,CAAEC,KAAMN,EAAiBM,KAAKC,MAAM,QAIjElC,EAAUe,QAAU3C,EAAgBqB,GAWtCmC,EAASC,QAC2C,IAApDM,OAAOC,EAAUA,WAACC,OAAOT,EAASK,MAAMK,UAExCjE,EAAOoB,GACLuC,qBAAmB,CAAEC,KAAMP,GAAKO,KAAKC,MAAM,MAAST,GAdtDpD,EAAOoB,GACLuC,qBAAmB,CACjBC,KAAMP,EAAIO,KAAKC,MAAM,IACrBK,mBAAmB,IAChBd,GAiBX,OAAOpD,CAAM"}