{"version":3,"file":"createRecord.mjs","sources":["../../../src/bindings/createRecord.ts"],"sourcesContent":["import { Address, Instruction } from \"@solana/kit\";\r\n\r\nimport {\r\n  CENTRAL_STATE_DOMAIN_RECORDS,\r\n  NAME_PROGRAM_ADDRESS,\r\n  RECORDS_PROGRAM_ADDRESS,\r\n  SYSTEM_PROGRAM_ADDRESS,\r\n} from \"../constants/addresses\";\r\nimport { getSnsDomainAddress } from \"../domain/getSnsDomainAddress\";\r\nimport { InvalidParentError } from \"../errors\";\r\nimport { AllocateAndPostRecordInstruction } from \"../instructions/allocateAndPostRecordInstruction\";\r\nimport { Record, RecordVersion } from \"../types/record\";\r\nimport { _parseSnsDomain } from \"../utils/parseSnsDomain\";\r\nimport { serializeRecordContent } from \"../utils/serializers/serializeRecordContent\";\r\n\r\n/**\r\n * Parameters for creating a domain record.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: CreateRecordParams = {\r\n *   domain: \"example.sns\",\r\n *   record: Record.Url,\r\n *   content: \"https://example.com\",\r\n *   owner,\r\n *   payer,\r\n * };\r\n * ```\r\n */\r\nexport interface CreateRecordParams {\r\n  /** Full `.sns` domain name. */\r\n  domain: string;\r\n  /** Record type. */\r\n  record: Record;\r\n  /** Record content. */\r\n  content: string;\r\n  /** Current domain owner. */\r\n  owner: Address;\r\n  /** Instruction fee payer. */\r\n  payer: Address;\r\n}\r\n\r\n/**\r\n * Builds an instruction to create a V2 record for a `.sns` domain or subdomain.\r\n *\r\n * Record content is serialized according to SNS-IP 1.\r\n *\r\n * @param params Record creation parameters\r\n * @param params.domain Full `.sns` domain or subdomain name\r\n * @param params.record Record type\r\n * @param params.content Record content\r\n * @param params.owner Current owner of the domain\r\n * @param params.payer Fee payer for the instruction\r\n * @returns Transaction instruction.\r\n *\r\n * @example\r\n * ```ts\r\n * const instruction = await createRecord({\r\n *   domain: \"example.sns\",\r\n *   record: Record.Url,\r\n *   content: \"https://example.com\",\r\n *   owner,\r\n *   payer,\r\n * });\r\n * ```\r\n */\r\nexport const createRecord = async ({\r\n  domain,\r\n  record,\r\n  content,\r\n  owner,\r\n  payer,\r\n}: CreateRecordParams): Promise<Instruction> => {\r\n  const trimmedDomain = _parseSnsDomain(domain);\r\n\r\n  let { domainAddress, parentAddress, isSub } = await getSnsDomainAddress({\r\n    domain: `${record}.${trimmedDomain}`,\r\n    record: RecordVersion.V2,\r\n  });\r\n\r\n  if (isSub) {\r\n    parentAddress = (await getSnsDomainAddress({ domain: trimmedDomain }))\r\n      .domainAddress;\r\n  }\r\n\r\n  if (!parentAddress) {\r\n    throw new InvalidParentError(\"Parent could not be found\");\r\n  }\r\n\r\n  const ix = new AllocateAndPostRecordInstruction({\r\n    record: `\\x02${record}`,\r\n    content: serializeRecordContent({ content, record }),\r\n  }).getInstruction(\r\n    RECORDS_PROGRAM_ADDRESS,\r\n    SYSTEM_PROGRAM_ADDRESS,\r\n    NAME_PROGRAM_ADDRESS,\r\n    payer,\r\n    domainAddress,\r\n    parentAddress,\r\n    owner,\r\n    CENTRAL_STATE_DOMAIN_RECORDS\r\n  );\r\n\r\n  return ix;\r\n};\r\n"],"names":[],"mappings":";;;;;;;;AA0CA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACU,MAAA,YAAY,GAAG,OAAO,EACjC,MAAM,EACN,MAAM,EACN,OAAO,EACP,KAAK,EACL,KAAK,GACc,KAA0B;AAC7C,IAAA,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC;IAE7C,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAmB,CAAC;AACtE,QAAA,MAAM,EAAE,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,aAAa,CAAE,CAAA;QACpC,MAAM,EAAE,aAAa,CAAC,EAAE;AACzB,KAAA,CAAC;IAEF,IAAI,KAAK,EAAE;QACT,aAAa,GAAG,CAAC,MAAM,mBAAmB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAClE,aAAA,aAAa;;IAGlB,IAAI,CAAC,aAAa,EAAE;AAClB,QAAA,MAAM,IAAI,kBAAkB,CAAC,2BAA2B,CAAC;;AAG3D,IAAA,MAAM,EAAE,GAAG,IAAI,gCAAgC,CAAC;QAC9C,MAAM,EAAE,CAAO,IAAA,EAAA,MAAM,CAAE,CAAA;QACvB,OAAO,EAAE,sBAAsB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACrD,KAAA,CAAC,CAAC,cAAc,CACf,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,EACL,aAAa,EACb,aAAa,EACb,KAAK,EACL,4BAA4B,CAC7B;AAED,IAAA,OAAO,EAAE;AACX;;;;"}