{"version":3,"file":"initializeProtocol.mjs","sources":["../../../../../src/plugins/protocolModule/operations/initializeProtocol.ts"],"sourcesContent":["import {\n  createInitializeProtocolInstruction,\n  FeeParameters,\n} from '@convergence-rfq/rfq';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SendAndConfirmTransactionResponse } from '../../rpcModule';\nimport { assertProtocol, Protocol } from '../models';\nimport {\n  TransactionBuilder,\n  TransactionBuilderOptions,\n} from '../../../utils/TransactionBuilder';\nimport {\n  Operation,\n  OperationHandler,\n  OperationScope,\n  useOperation,\n} from '../../../types';\nimport { Convergence } from '../../../Convergence';\nimport { addDecimals } from '../../../utils/conversions';\n\nconst Key = 'InitializeProtocolOperation' as const;\n\n/**\n * Initialize a new protocol. Note the PDA is derived from a seed, meaning\n * only one protocol can be initialized per network.\n *\n * ```ts\n * const { protocol } = await convergence\n *   .protocol()\n *   .initialize();\n * ```\n *\n * @group Operations\n * @category Constructors\n */\nexport const initializeProtocolOperation =\n  useOperation<InitializeProtocolOperation>(Key);\n\n/**\n * @group Operations\n * @category Types\n */\nexport type InitializeProtocolOperation = Operation<\n  typeof Key,\n  InitializeProtocolInput,\n  InitializeProtocolOutput\n>;\n\n/**\n * @group Operations\n * @category Inputs\n */\nexport type InitializeProtocolInput = {\n  /**\n   * The owner of the Rfq to create.\n   *\n   * @defaultValue `convergence.identity().publicKey`\n   */\n  owner?: PublicKey;\n\n  /**\n   * The protocol collateral token mint.\n   */\n  collateralMint: PublicKey;\n\n  /**\n   * The protocol maker fee.\n   */\n  protocolMakerFee?: number;\n\n  /**\n   * The protocol taker fee.\n   */\n  protocolTakerFee?: number;\n\n  /**\n   * The protocol settlement maker fee.\n   */\n  settlementMakerFee?: number;\n\n  /**\n   * The protocol settlement taker fee.\n   */\n  settlementTakerFee?: number;\n\n  /**\n   * The add user asset sol fee.\n   */\n  addAssetFee?: number;\n};\n\n/**\n * @group Operations\n * @category Outputs\n */\nexport type InitializeProtocolOutput = {\n  /** The blockchain response from sending and confirming the transaction. */\n  response: SendAndConfirmTransactionResponse;\n\n  /** The newly initialized protocol. */\n  protocol: Protocol;\n};\n\n/**\n * @group Operations\n * @category Handlers\n */\nexport const initializeProtocolOperationHandler: OperationHandler<InitializeProtocolOperation> =\n  {\n    handle: async (\n      operation: InitializeProtocolOperation,\n      convergence: Convergence,\n      scope: OperationScope\n    ) => {\n      const { owner = convergence.identity().publicKey } = operation.input;\n\n      const builder = await createProtocolBuilder(\n        convergence,\n        {\n          ...operation.input,\n          owner,\n        },\n        scope\n      );\n\n      const output = await builder.sendAndConfirm(\n        convergence,\n        scope.confirmOptions\n      );\n      scope.throwIfCanceled();\n\n      const protocol = await convergence.protocol().get({});\n      assertProtocol(protocol);\n\n      return { ...output, protocol };\n    },\n  };\n\n/**\n * @group Transaction Builders\n * @category Inputs\n */\nexport type CreateProtocolBuilderParams = Omit<\n  InitializeProtocolInput,\n  'confirmOptions'\n> & {\n  /**\n   * Whether or not the provided token account already exists.\n   * If `false`, we'll add another instruction to create it.\n   *\n   * @defaultValue `true`\n   */\n  owner?: PublicKey;\n};\n\n/**\n * @group Transaction Builders\n * @category Contexts\n */\nexport type InitializeProtocolBuilderContext = Omit<\n  InitializeProtocolOutput,\n  'protocol'\n>;\n\n/**\n * Creates a new Protocol.\n *\n * ```ts\n * const transactionBuilder = await convergence\n *   .protocol()\n *   .builders()\n *   .create();\n * ```\n *\n * @group Transaction Builders\n * @category Constructors\n */\nexport const createProtocolBuilder = async (\n  convergence: Convergence,\n  params: CreateProtocolBuilderParams,\n  options: TransactionBuilderOptions = {}\n): Promise<TransactionBuilder<InitializeProtocolBuilderContext>> => {\n  const { programs, payer = convergence.rpc().getDefaultFeePayer() } = options;\n  const {\n    collateralMint,\n    protocolMakerFee = 0,\n    protocolTakerFee = 0,\n    settlementTakerFee = 0,\n    settlementMakerFee = 0,\n    addAssetFee = 0,\n  } = params;\n\n  const systemProgram = convergence.programs().getSystem(programs);\n  const rfqProgram = convergence.programs().getRfq();\n  const riskEngineProgram = convergence.programs().getRiskEngine();\n\n  const protocol = convergence.protocol().pdas().protocol();\n  const collateralMintTokenAccount = await convergence\n    .tokens()\n    .findMintByAddress({ address: collateralMint });\n\n  const settleFees: FeeParameters = {\n    takerBps: addDecimals(\n      settlementTakerFee,\n      collateralMintTokenAccount.decimals\n    ),\n    makerBps: addDecimals(\n      settlementMakerFee,\n      collateralMintTokenAccount.decimals\n    ),\n  };\n  const defaultFees: FeeParameters = {\n    takerBps: addDecimals(\n      protocolTakerFee,\n      collateralMintTokenAccount.decimals\n    ),\n    makerBps: addDecimals(\n      protocolMakerFee,\n      collateralMintTokenAccount.decimals\n    ),\n  };\n  const solitaAddAssetFee = addDecimals(addAssetFee, 9);\n\n  return TransactionBuilder.make<InitializeProtocolBuilderContext>()\n    .setFeePayer(payer)\n    .add({\n      instruction: createInitializeProtocolInstruction(\n        {\n          protocol,\n          signer: payer.publicKey,\n          riskEngine: riskEngineProgram.address,\n          collateralMint,\n          systemProgram: systemProgram.address,\n        },\n        {\n          settleFees,\n          defaultFees,\n          assetAddFee: solitaAddAssetFee,\n        },\n        rfqProgram.address\n      ),\n      signers: [payer],\n      key: 'initializeProtocol',\n    });\n};\n"],"names":["Key","initializeProtocolOperation","useOperation","initializeProtocolOperationHandler","handle","_handle","_asyncToGenerator","_regeneratorRuntime","mark","_callee","operation","convergence","scope","_operation$input$owne","owner","builder","output","protocol","wrap","_callee$","_context","prev","next","input","identity","publicKey","createProtocolBuilder","_objectSpread","sent","sendAndConfirm","confirmOptions","throwIfCanceled","get","assertProtocol","abrupt","stop","_x","_x2","_x3","apply","arguments","_ref","_callee2","params","options","programs","_options$payer","payer","collateralMint","_params$protocolMaker","protocolMakerFee","_params$protocolTaker","protocolTakerFee","_params$settlementTak","settlementTakerFee","_params$settlementMak","settlementMakerFee","_params$addAssetFee","addAssetFee","systemProgram","rfqProgram","riskEngineProgram","collateralMintTokenAccount","settleFees","defaultFees","solitaAddAssetFee","_args2","_callee2$","_context2","length","undefined","rpc","getDefaultFeePayer","getSystem","getRfq","getRiskEngine","pdas","tokens","findMintByAddress","address","takerBps","addDecimals","decimals","makerBps","TransactionBuilder","make","setFeePayer","add","instruction","createInitializeProtocolInstruction","signer","riskEngine","assetAddFee","signers","key","_x4","_x5"],"mappings":";;;;;;;AAqBA,IAAMA,GAAG,GAAG,6BAAsC,CAAA;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACaC,2BAA2B,GACtCC,YAAY,CAA8BF,GAAG,EAAC;;AAEhD;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;;AAwCA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;AACO,IAAMG,kCAAiF,GAC5F;EACEC,MAAM,EAAA,YAAA;AAAA,IAAA,IAAAC,OAAA,GAAAC,iBAAA,eAAAC,mBAAA,EAAAC,CAAAA,IAAA,CAAE,SAAAC,OACNC,CAAAA,SAAsC,EACtCC,WAAwB,EACxBC,KAAqB,EAAA;MAAA,IAAAC,qBAAA,EAAAC,KAAA,EAAAC,OAAA,EAAAC,MAAA,EAAAC,QAAA,CAAA;AAAA,MAAA,OAAAV,mBAAA,EAAA,CAAAW,IAAA,CAAA,SAAAC,SAAAC,QAAA,EAAA;AAAA,QAAA,OAAA,CAAA,EAAA,QAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;AAAA,UAAA,KAAA,CAAA;AAAAT,YAAAA,qBAAA,GAEgCH,SAAS,CAACa,KAAK,CAA5DT,KAAK,EAALA,KAAK,GAAAD,qBAAA,KAAGF,KAAAA,CAAAA,GAAAA,WAAW,CAACa,QAAQ,EAAE,CAACC,SAAS,GAAAZ,qBAAA,CAAA;AAAAO,YAAAA,QAAA,CAAAE,IAAA,GAAA,CAAA,CAAA;YAAA,OAE1BI,qBAAqB,CACzCf,WAAW,EAAAgB,cAAA,CAAAA,cAAA,CAAA,EAAA,EAENjB,SAAS,CAACa,KAAK,CAAA,EAAA,EAAA,EAAA;AAClBT,cAAAA,KAAK,EAALA,KAAAA;AAAK,aAAA,CAAA,EAEPF,KACF,CAAC,CAAA;AAAA,UAAA,KAAA,CAAA;YAPKG,OAAO,GAAAK,QAAA,CAAAQ,IAAA,CAAA;AAAAR,YAAAA,QAAA,CAAAE,IAAA,GAAA,CAAA,CAAA;YAAA,OASQP,OAAO,CAACc,cAAc,CACzClB,WAAW,EACXC,KAAK,CAACkB,cACR,CAAC,CAAA;AAAA,UAAA,KAAA,CAAA;YAHKd,MAAM,GAAAI,QAAA,CAAAQ,IAAA,CAAA;YAIZhB,KAAK,CAACmB,eAAe,EAAE,CAAA;AAACX,YAAAA,QAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;YAAA,OAEDX,WAAW,CAACM,QAAQ,EAAE,CAACe,GAAG,CAAC,EAAE,CAAC,CAAA;AAAA,UAAA,KAAA,EAAA;YAA/Cf,QAAQ,GAAAG,QAAA,CAAAQ,IAAA,CAAA;YACdK,cAAc,CAAChB,QAAQ,CAAC,CAAA;YAAC,OAAAG,QAAA,CAAAc,MAAA,CAAA,QAAA,EAAAP,cAAA,CAAAA,cAAA,KAEbX,MAAM,CAAA,EAAA,EAAA,EAAA;AAAEC,cAAAA,QAAQ,EAARA,QAAAA;AAAQ,aAAA,CAAA,CAAA,CAAA;AAAA,UAAA,KAAA,EAAA,CAAA;AAAA,UAAA,KAAA,KAAA;YAAA,OAAAG,QAAA,CAAAe,IAAA,EAAA,CAAA;AAAA,SAAA;AAAA,OAAA,EAAA1B,OAAA,CAAA,CAAA;KAC7B,CAAA,CAAA,CAAA;AAAA,IAAA,SAAAL,MAAAgC,CAAAA,EAAA,EAAAC,GAAA,EAAAC,GAAA,EAAA;AAAA,MAAA,OAAAjC,OAAA,CAAAkC,KAAA,CAAA,IAAA,EAAAC,SAAA,CAAA,CAAA;AAAA,KAAA;AAAA,IAAA,OAAApC,MAAA,CAAA;AAAA,GAAA,EAAA;AACH,EAAC;;AAEH;AACA;AACA;AACA;;AAcA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACasB,qBAAqB,gBAAA,YAAA;AAAA,EAAA,IAAAe,IAAA,GAAAnC,iBAAA,eAAAC,mBAAA,EAAA,CAAAC,IAAA,CAAG,SAAAkC,QAAAA,CACnC/B,WAAwB,EACxBgC,MAAmC,EAAA;AAAA,IAAA,IAAAC,OAAA;MAAAC,QAAA;MAAAC,cAAA;MAAAC,KAAA;MAAAC,cAAA;MAAAC,qBAAA;MAAAC,gBAAA;MAAAC,qBAAA;MAAAC,gBAAA;MAAAC,qBAAA;MAAAC,kBAAA;MAAAC,qBAAA;MAAAC,kBAAA;MAAAC,mBAAA;MAAAC,WAAA;MAAAC,aAAA;MAAAC,UAAA;MAAAC,iBAAA;MAAA5C,QAAA;MAAA6C,0BAAA;MAAAC,UAAA;MAAAC,WAAA;MAAAC,iBAAA;AAAAC,MAAAA,MAAA,GAAA1B,SAAA,CAAA;AAAA,IAAA,OAAAjC,mBAAA,EAAA,CAAAW,IAAA,CAAA,SAAAiD,UAAAC,SAAA,EAAA;AAAA,MAAA,OAAA,CAAA,EAAA,QAAAA,SAAA,CAAA/C,IAAA,GAAA+C,SAAA,CAAA9C,IAAA;AAAA,QAAA,KAAA,CAAA;AACnCsB,UAAAA,OAAkC,GAAAsB,MAAA,CAAAG,MAAA,GAAAH,CAAAA,IAAAA,MAAA,CAAAI,CAAAA,CAAAA,KAAAA,SAAA,GAAAJ,MAAA,CAAG,CAAA,CAAA,GAAA,EAAE,CAAA;UAE/BrB,QAAQ,GAAqDD,OAAO,CAApEC,QAAQ,EAAAC,cAAA,GAAqDF,OAAO,CAA1DG,KAAK,EAALA,KAAK,GAAAD,cAAA,KAAA,KAAA,CAAA,GAAGnC,WAAW,CAAC4D,GAAG,EAAE,CAACC,kBAAkB,EAAE,GAAA1B,cAAA,CAAA;AAE9DE,UAAAA,cAAc,GAMZL,MAAM,CANRK,cAAc,EAAAC,qBAAA,GAMZN,MAAM,CALRO,gBAAgB,EAAhBA,gBAAgB,GAAAD,qBAAA,cAAG,CAAC,GAAAA,qBAAA,EAAAE,qBAAA,GAKlBR,MAAM,CAJRS,gBAAgB,EAAhBA,gBAAgB,GAAAD,qBAAA,cAAG,CAAC,GAAAA,qBAAA,EAAAE,qBAAA,GAIlBV,MAAM,CAHRW,kBAAkB,EAAlBA,kBAAkB,GAAAD,qBAAA,cAAG,CAAC,GAAAA,qBAAA,EAAAE,qBAAA,GAGpBZ,MAAM,CAFRa,kBAAkB,EAAlBA,kBAAkB,GAAAD,qBAAA,KAAA,KAAA,CAAA,GAAG,CAAC,GAAAA,qBAAA,EAAAE,mBAAA,GAEpBd,MAAM,CADRe,WAAW,EAAXA,WAAW,GAAAD,mBAAA,KAAG,KAAA,CAAA,GAAA,CAAC,GAAAA,mBAAA,CAAA;UAGXE,aAAa,GAAGhD,WAAW,CAACkC,QAAQ,EAAE,CAAC4B,SAAS,CAAC5B,QAAQ,CAAC,CAAA;UAC1De,UAAU,GAAGjD,WAAW,CAACkC,QAAQ,EAAE,CAAC6B,MAAM,EAAE,CAAA;UAC5Cb,iBAAiB,GAAGlD,WAAW,CAACkC,QAAQ,EAAE,CAAC8B,aAAa,EAAE,CAAA;AAE1D1D,UAAAA,QAAQ,GAAGN,WAAW,CAACM,QAAQ,EAAE,CAAC2D,IAAI,EAAE,CAAC3D,QAAQ,EAAE,CAAA;AAAAmD,UAAAA,SAAA,CAAA9C,IAAA,GAAA,CAAA,CAAA;AAAA,UAAA,OAChBX,WAAW,CACjDkE,MAAM,EAAE,CACRC,iBAAiB,CAAC;AAAEC,YAAAA,OAAO,EAAE/B,cAAAA;AAAe,WAAC,CAAC,CAAA;AAAA,QAAA,KAAA,CAAA;UAF3Cc,0BAA0B,GAAAM,SAAA,CAAAxC,IAAA,CAAA;AAI1BmC,UAAAA,UAAyB,GAAG;YAChCiB,QAAQ,EAAEC,WAAW,CACnB3B,kBAAkB,EAClBQ,0BAA0B,CAACoB,QAC7B,CAAC;AACDC,YAAAA,QAAQ,EAAEF,WAAW,CACnBzB,kBAAkB,EAClBM,0BAA0B,CAACoB,QAC7B,CAAA;WACD,CAAA;AACKlB,UAAAA,WAA0B,GAAG;YACjCgB,QAAQ,EAAEC,WAAW,CACnB7B,gBAAgB,EAChBU,0BAA0B,CAACoB,QAC7B,CAAC;AACDC,YAAAA,QAAQ,EAAEF,WAAW,CACnB/B,gBAAgB,EAChBY,0BAA0B,CAACoB,QAC7B,CAAA;WACD,CAAA;AACKjB,UAAAA,iBAAiB,GAAGgB,WAAW,CAACvB,WAAW,EAAE,CAAC,CAAC,CAAA;AAAA,UAAA,OAAAU,SAAA,CAAAlC,MAAA,CAE9CkD,QAAAA,EAAAA,kBAAkB,CAACC,IAAI,EAAoC,CAC/DC,WAAW,CAACvC,KAAK,CAAC,CAClBwC,GAAG,CAAC;YACHC,WAAW,EAAEC,mCAAmC,CAC9C;AACExE,cAAAA,QAAQ,EAARA,QAAQ;cACRyE,MAAM,EAAE3C,KAAK,CAACtB,SAAS;cACvBkE,UAAU,EAAE9B,iBAAiB,CAACkB,OAAO;AACrC/B,cAAAA,cAAc,EAAdA,cAAc;cACdW,aAAa,EAAEA,aAAa,CAACoB,OAAAA;AAC/B,aAAC,EACD;AACEhB,cAAAA,UAAU,EAAVA,UAAU;AACVC,cAAAA,WAAW,EAAXA,WAAW;AACX4B,cAAAA,WAAW,EAAE3B,iBAAAA;AACf,aAAC,EACDL,UAAU,CAACmB,OACb,CAAC;YACDc,OAAO,EAAE,CAAC9C,KAAK,CAAC;AAChB+C,YAAAA,GAAG,EAAE,oBAAA;AACP,WAAC,CAAC,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA,CAAA;AAAA,QAAA,KAAA,KAAA;UAAA,OAAA1B,SAAA,CAAAjC,IAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA,EAAAO,QAAA,CAAA,CAAA;GACL,CAAA,CAAA,CAAA;AAAA,EAAA,OAAA,SAnEYhB,qBAAqBA,CAAAqE,GAAA,EAAAC,GAAA,EAAA;AAAA,IAAA,OAAAvD,IAAA,CAAAF,KAAA,CAAA,IAAA,EAAAC,SAAA,CAAA,CAAA;AAAA,GAAA,CAAA;AAAA,CAmEjC;;;;"}