{"version":3,"file":"nft.cjs","sources":["../../../src/states/nft.ts"],"sourcesContent":["import {\r\n  Address,\r\n  Base58EncodedBytes,\r\n  GetAccountInfoApi,\r\n  GetProgramAccountsApi,\r\n  Rpc,\r\n  fetchEncodedAccount,\r\n  getProgramDerivedAddress,\r\n} from \"@solana/kit\";\r\nimport { deserialize } from \"borsh\";\r\n\r\nimport { addressCodec, base64Codec, utf8Codec } from \"../codecs\";\r\nimport { NAME_TOKENIZER_ADDRESS } from \"../constants/addresses\";\r\nimport { InvalidSerializedDataError, NftAccountNotFoundError } from \"../errors\";\r\n\r\n/** Tags identifying the SNS NFT state variant. */\r\nexport enum NftTag {\r\n  Uninitialized = 0,\r\n  CentralState = 1,\r\n  ActiveRecord = 2,\r\n  InactiveRecord = 3,\r\n}\r\n\r\n/**\r\n * Input for decoding an SNS NFT account.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: NftStateParams = { tag: 2, nonce: 0, nameAccount, owner, nftMint };\r\n * ```\r\n */\r\nexport interface NftStateParams {\r\n  /** NFT state tag. */\r\n  tag: number;\r\n  /** NFT record nonce. */\r\n  nonce: number;\r\n  /** Encoded SNS domain account address. */\r\n  nameAccount: Uint8Array;\r\n  /** Encoded NFT owner address. */\r\n  owner: Uint8Array;\r\n  /** Encoded NFT mint address. */\r\n  nftMint: Uint8Array;\r\n}\r\n\r\n/** Decoded state of an SNS NFT account. */\r\nexport class NftState {\r\n  /** NFT state tag. */\r\n  tag: NftTag;\r\n  /** NFT record nonce. */\r\n  nonce: number;\r\n  /** SNS domain account address. */\r\n  nameAccount: Address;\r\n  /** NFT owner address. */\r\n  owner: Address;\r\n  /** NFT mint address. */\r\n  nftMint: Address;\r\n\r\n  static schema = {\r\n    struct: {\r\n      tag: \"u8\",\r\n      nonce: \"u8\",\r\n      nameAccount: { array: { type: \"u8\", len: 32 } },\r\n      owner: { array: { type: \"u8\", len: 32 } },\r\n      nftMint: { array: { type: \"u8\", len: 32 } },\r\n    },\r\n  };\r\n\r\n  // The total length of the struct is calculated as the sum of:\r\n  // - `tag`: 1 byte (`u8`)\r\n  // - `nonce`: 1 byte (`u8`)\r\n  // - `nameAccount`: 32 bytes (array of `u8` with length 32)\r\n  // - `owner`: 32 bytes (array of `u8` with length 32)\r\n  // - `nftMint`: 32 bytes (array of `u8` with length 32)\r\n  static LEN = 1 + 1 + 32 + 32 + 32;\r\n\r\n  constructor(obj: NftStateParams) {\r\n    this.tag = obj.tag as NftTag;\r\n    this.nonce = obj.nonce;\r\n    this.nameAccount = addressCodec.decode(obj.nameAccount);\r\n    this.owner = addressCodec.decode(obj.owner);\r\n    this.nftMint = addressCodec.decode(obj.nftMint);\r\n  }\r\n\r\n  static deserialize(data: Uint8Array): NftState {\r\n    try {\r\n      return new NftState(deserialize(this.schema, data) as any);\r\n    } catch {\r\n      throw new InvalidSerializedDataError(\r\n        \"Failed to deserialize NftState data\"\r\n      );\r\n    }\r\n  }\r\n\r\n  static async retrieve(\r\n    rpc: Rpc<GetAccountInfoApi>,\r\n    address: Address\r\n  ): Promise<NftState> {\r\n    const nftAccount = await fetchEncodedAccount(rpc, address);\r\n    if (!nftAccount.exists) {\r\n      throw new NftAccountNotFoundError(`NFT not found: ${address}`);\r\n    }\r\n    return this.deserialize(nftAccount.data);\r\n  }\r\n\r\n  static async retrieveFromMint(\r\n    rpc: Rpc<GetProgramAccountsApi>,\r\n    mint: Address\r\n  ): Promise<NftState> {\r\n    const data = await rpc\r\n      .getProgramAccounts(NAME_TOKENIZER_ADDRESS, {\r\n        encoding: \"base64\",\r\n        filters: [\r\n          { dataSize: BigInt(NftState.LEN) },\r\n          {\r\n            memcmp: {\r\n              offset: BigInt(0),\r\n              bytes: \"3\" as Base58EncodedBytes,\r\n              encoding: \"base58\",\r\n            },\r\n          },\r\n          {\r\n            memcmp: {\r\n              offset: BigInt(1 + 1 + 32 + 32),\r\n              bytes: mint as string as Base58EncodedBytes,\r\n              encoding: \"base58\",\r\n            },\r\n          },\r\n        ],\r\n      })\r\n      .send();\r\n\r\n    if (data.length !== 1) {\r\n      throw new NftAccountNotFoundError(`NFT not found: ${mint}`);\r\n    }\r\n\r\n    return this.deserialize(\r\n      base64Codec.encode(data[0].account.data[0]) as Uint8Array\r\n    );\r\n  }\r\n\r\n  static async getAddress(domainAddress: Address): Promise<Address> {\r\n    const [address] = await getProgramDerivedAddress({\r\n      programAddress: NAME_TOKENIZER_ADDRESS,\r\n      seeds: [\r\n        utf8Codec.encode(\"nft_record\"),\r\n        addressCodec.encode(domainAddress),\r\n      ],\r\n    });\r\n\r\n    return address;\r\n  }\r\n}\r\n"],"names":["NftTag","addressCodec","deserialize","InvalidSerializedDataError","fetchEncodedAccount","NftAccountNotFoundError","NAME_TOKENIZER_ADDRESS","base64Codec","getProgramDerivedAddress","utf8Codec"],"mappings":"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"}