{"version":3,"file":"RfqPdasClient.mjs","sources":["../../../../src/plugins/rfqModule/RfqPdasClient.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport { Sha256 } from '@aws-crypto/sha256-js';\nimport {\n  OrderType as SolitaOrderType,\n  QuoteAsset,\n  Quote,\n  quoteBeet,\n  quoteAssetBeet,\n} from '@convergence-rfq/rfq';\nimport * as beet from '@convergence-rfq/beet';\n\nimport BN from 'bn.js';\nimport {\n  createSerializerFromFixableBeetArgsStruct,\n  createSerializerFromFixableBeet,\n  createSerializerFromFixedSizeBeet,\n  Pda,\n  Program,\n  PublicKey,\n} from '../../types';\nimport type { Convergence } from '../../Convergence';\nimport { Option } from '../../utils';\nimport { FixedSize, toSolitaFixedSize } from './models';\nimport { OrderType, toSolitaOrderType } from './models/OrderType';\nimport { serializeFixedSizeData } from './helpers';\n\nfunction toLittleEndian(value: number, bytes: number) {\n  const buf = Buffer.allocUnsafe(bytes);\n  buf.writeUIntLE(value, 0, bytes);\n  return buf;\n}\n\n/**\n * This client allows you to build PDAs related to the RFQ module.\n *\n * @see {@link RfqClient}\n * @group Module Pdas\n */\nexport class RfqPdasClient {\n  constructor(protected readonly convergence: Convergence) {}\n\n  /** Finds the PDA of a given quote asset. */\n  quote({ quoteAsset }: QuoteInput): Pda {\n    const programId = this.programId();\n    return Pda.find(programId, [\n      Buffer.from('mint_info', 'utf8'),\n      quoteAsset.data,\n    ]);\n  }\n\n  /** Finds the PDA of an RFQ. */\n  rfq({\n    taker,\n    legsHash,\n    printTradeProvider,\n    orderType,\n    quoteAsset,\n    fixedSize,\n    activeWindow,\n    settlingWindow,\n    recentTimestamp,\n  }: RfqInput): Pda {\n    const programId = this.programId();\n\n    const hash = new Sha256();\n    hash.update(serializeQuoteAssetData(quoteAsset));\n    const quoteHash = hash.digestSync();\n\n    return Pda.find(programId, [\n      Buffer.from('rfq', 'utf8'),\n      taker.toBuffer(),\n      legsHash,\n      (printTradeProvider || PublicKey.default).toBuffer(),\n      serializeOrderTypeData(toSolitaOrderType(orderType)),\n      quoteHash,\n      serializeFixedSizeData(toSolitaFixedSize(fixedSize, quoteAsset.decimals)),\n      toLittleEndian(activeWindow, 4),\n      toLittleEndian(settlingWindow, 4),\n      recentTimestamp.toArrayLike(Buffer, 'le', 8),\n    ]);\n  }\n\n  /** Finds the PDA of a Response. */\n  response({ rfq, maker, bid, ask, pdaDistinguisher }: ResponseInput): Pda {\n    const programId = this.programId();\n    return Pda.find(programId, [\n      Buffer.from('response', 'utf8'),\n      rfq.toBuffer(),\n      maker.toBuffer(),\n      serializeOptionQuote(bid),\n      serializeOptionQuote(ask),\n      toLittleEndian(pdaDistinguisher, 2),\n    ]);\n  }\n\n  private programId(programs?: Program[]) {\n    return this.convergence.programs().getRfq(programs).address;\n  }\n}\n\nconst serializeOptionQuote = (quote: Option<Quote>) => {\n  if (quote === null) {\n    return Buffer.from([0]);\n  }\n\n  const serializedQuote = serializeQuoteData(quote);\n  return Buffer.concat([Buffer.from([1]), serializedQuote]);\n};\n\nconst serializeOrderTypeData = (orderType: SolitaOrderType): Buffer => {\n  const orderTypeBeet = beet.fixedScalarEnum(\n    SolitaOrderType\n  ) as beet.FixedSizeBeet<SolitaOrderType, SolitaOrderType>;\n  const orderTypeSerializer = createSerializerFromFixedSizeBeet(orderTypeBeet);\n\n  return orderTypeSerializer.serialize(orderType);\n};\n\nconst serializeQuoteData = (quote: Quote): Buffer => {\n  const quoteSerializer = createSerializerFromFixableBeet(quoteBeet);\n\n  return quoteSerializer.serialize(quote);\n};\n\nconst serializeQuoteAssetData = (quoteAsset: QuoteAsset): Buffer => {\n  const quoteAssetSerializer =\n    createSerializerFromFixableBeetArgsStruct(quoteAssetBeet);\n\n  return quoteAssetSerializer.serialize(quoteAsset);\n};\n\ntype QuoteInput = {\n  /** The quote asset. */\n  quoteAsset: QuoteAsset;\n\n  /** An optional set of programs that override the registered ones. */\n  programs?: Program[];\n};\n\ntype RfqInput = {\n  /** The taker's public key address. */\n  taker: PublicKey;\n\n  /** The SHA256 hash of the serialized legs of the RFQ. */\n  legsHash: Buffer;\n\n  printTradeProvider: PublicKey | null;\n\n  /** The order type of the Rfq. */\n  orderType: OrderType;\n\n  /** The quote asset of the Rfq. */\n  quoteAsset: QuoteAsset;\n\n  /**\n   * The type of the Rfq, specifying whether we fix the number of\n   * base assets to be exchanged, the number of quote assets,\n   * or neither.\n   */\n  fixedSize: FixedSize;\n\n  /** The number of seconds during which this Rfq can be responded to. */\n  activeWindow: number;\n\n  /**\n   * The number of seconds within which this Rfq must be settled\n   *  after starting the settlement process.\n   * */\n  settlingWindow: number;\n\n  /** A recent timestamp. */\n  recentTimestamp: BN;\n  // recentTimestamp: number;\n};\n\ntype ResponseInput = {\n  /** The Rfq public key. */\n  rfq: PublicKey;\n\n  /** The maker's public key address. */\n  maker: PublicKey;\n\n  /** Optional `bid` quote. */\n  bid: Option<Quote>;\n\n  /** Optional `ask` quote. */\n  ask: Option<Quote>;\n\n  /** A number to distinguish this response from other responses,\n   * in the case that the maker responds to the same RFQ multiple\n   * times with the same response. Otherwise it will always be 0. */\n  pdaDistinguisher: number;\n};\n"],"names":["toLittleEndian","value","bytes","buf","Buffer","allocUnsafe","writeUIntLE","RfqPdasClient","convergence","_classCallCheck","_createClass","key","quote","_ref","quoteAsset","programId","Pda","find","from","data","rfq","_ref2","taker","legsHash","printTradeProvider","orderType","fixedSize","activeWindow","settlingWindow","recentTimestamp","hash","Sha256","update","serializeQuoteAssetData","quoteHash","digestSync","toBuffer","PublicKey","serializeOrderTypeData","toSolitaOrderType","serializeFixedSizeData","toSolitaFixedSize","decimals","toArrayLike","response","_ref3","maker","bid","ask","pdaDistinguisher","serializeOptionQuote","programs","getRfq","address","serializedQuote","serializeQuoteData","concat","orderTypeBeet","beet","fixedScalarEnum","SolitaOrderType","orderTypeSerializer","createSerializerFromFixedSizeBeet","serialize","quoteSerializer","createSerializerFromFixableBeet","quoteBeet","quoteAssetSerializer","createSerializerFromFixableBeetArgsStruct","quoteAssetBeet"],"mappings":"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"}