program.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  1. import { PublicKey } from "@solana/web3.js";
  2. import { Program, AnchorProvider } from "@coral-xyz/anchor";
  3. import { SplBinaryOptionCoder } from "./coder";
  4. export const SPL_BINARY_OPTION_PROGRAM_ID = new PublicKey(
  5. "betw959P4WToez4DkuXwNsJszqbpe3HuY56AcG5yevx"
  6. );
  7. interface GetProgramParams {
  8. programId?: PublicKey;
  9. provider?: AnchorProvider;
  10. }
  11. export function splBinaryOptionProgram(
  12. params?: GetProgramParams
  13. ): Program<SplBinaryOption> {
  14. return new Program<SplBinaryOption>(
  15. IDL,
  16. params?.programId ?? SPL_BINARY_OPTION_PROGRAM_ID,
  17. params?.provider,
  18. new SplBinaryOptionCoder(IDL)
  19. );
  20. }
  21. type SplBinaryOption = {
  22. version: "0.1.0";
  23. name: "spl_binary_option";
  24. instructions: [
  25. {
  26. name: "initializeBinaryOption";
  27. accounts: [
  28. {
  29. name: "poolAccount";
  30. isMut: true;
  31. isSigner: true;
  32. },
  33. {
  34. name: "escrowMint";
  35. isMut: false;
  36. isSigner: false;
  37. },
  38. {
  39. name: "escrowAccount";
  40. isMut: true;
  41. isSigner: true;
  42. },
  43. {
  44. name: "longTokenMint";
  45. isMut: true;
  46. isSigner: true;
  47. },
  48. {
  49. name: "shortTokenMint";
  50. isMut: true;
  51. isSigner: true;
  52. },
  53. {
  54. name: "mintAuthority";
  55. isMut: false;
  56. isSigner: true;
  57. },
  58. {
  59. name: "updateAuthority";
  60. isMut: false;
  61. isSigner: true;
  62. },
  63. {
  64. name: "tokenProgram";
  65. isMut: false;
  66. isSigner: false;
  67. },
  68. {
  69. name: "systemProgram";
  70. isMut: false;
  71. isSigner: false;
  72. },
  73. {
  74. name: "rent";
  75. isMut: false;
  76. isSigner: false;
  77. }
  78. ];
  79. args: [
  80. {
  81. name: "decimals";
  82. type: "u8";
  83. }
  84. ];
  85. },
  86. {
  87. name: "trade";
  88. accounts: [
  89. {
  90. name: "poolAccount";
  91. isMut: true;
  92. isSigner: false;
  93. },
  94. {
  95. name: "escrowAccount";
  96. isMut: true;
  97. isSigner: false;
  98. },
  99. {
  100. name: "longTokenMint";
  101. isMut: true;
  102. isSigner: false;
  103. },
  104. {
  105. name: "shortTokenMint";
  106. isMut: true;
  107. isSigner: false;
  108. },
  109. {
  110. name: "buyer";
  111. isMut: false;
  112. isSigner: true;
  113. },
  114. {
  115. name: "seller";
  116. isMut: false;
  117. isSigner: true;
  118. },
  119. {
  120. name: "buyerAccount";
  121. isMut: true;
  122. isSigner: false;
  123. },
  124. {
  125. name: "sellerAccount";
  126. isMut: true;
  127. isSigner: false;
  128. },
  129. {
  130. name: "buyerLongTokenAccount";
  131. isMut: true;
  132. isSigner: false;
  133. },
  134. {
  135. name: "buyerShortTokenAccount";
  136. isMut: true;
  137. isSigner: false;
  138. },
  139. {
  140. name: "sellerLongTokenAccount";
  141. isMut: true;
  142. isSigner: false;
  143. },
  144. {
  145. name: "sellerShortTokenAccount";
  146. isMut: true;
  147. isSigner: false;
  148. },
  149. {
  150. name: "escrowAuthority";
  151. isMut: false;
  152. isSigner: false;
  153. },
  154. {
  155. name: "tokenProgram";
  156. isMut: false;
  157. isSigner: false;
  158. }
  159. ];
  160. args: [
  161. {
  162. name: "size";
  163. type: "u64";
  164. },
  165. {
  166. name: "buyPrice";
  167. type: "u64";
  168. },
  169. {
  170. name: "sellPrice";
  171. type: "u64";
  172. }
  173. ];
  174. },
  175. {
  176. name: "settle";
  177. accounts: [
  178. {
  179. name: "poolAccount";
  180. isMut: true;
  181. isSigner: false;
  182. },
  183. {
  184. name: "winningMint";
  185. isMut: false;
  186. isSigner: false;
  187. },
  188. {
  189. name: "poolAuthority";
  190. isMut: false;
  191. isSigner: true;
  192. }
  193. ];
  194. args: [];
  195. },
  196. {
  197. name: "collect";
  198. accounts: [
  199. {
  200. name: "poolAccount";
  201. isMut: true;
  202. isSigner: false;
  203. },
  204. {
  205. name: "collectorAccount";
  206. isMut: false;
  207. isSigner: false;
  208. },
  209. {
  210. name: "collectorLongTokenAccount";
  211. isMut: true;
  212. isSigner: false;
  213. },
  214. {
  215. name: "collectorShortTokenAccount";
  216. isMut: true;
  217. isSigner: false;
  218. },
  219. {
  220. name: "collectorCollateralAccount";
  221. isMut: true;
  222. isSigner: false;
  223. },
  224. {
  225. name: "longTokenMintAccount";
  226. isMut: true;
  227. isSigner: false;
  228. },
  229. {
  230. name: "shortTokenMintAccount";
  231. isMut: true;
  232. isSigner: false;
  233. },
  234. {
  235. name: "escrowAccount";
  236. isMut: true;
  237. isSigner: false;
  238. },
  239. {
  240. name: "escrowAuthorityAccount";
  241. isMut: true;
  242. isSigner: false;
  243. },
  244. {
  245. name: "tokenProgram";
  246. isMut: false;
  247. isSigner: false;
  248. }
  249. ];
  250. args: [];
  251. }
  252. ];
  253. accounts: [
  254. {
  255. name: "binaryOption";
  256. type: {
  257. kind: "struct";
  258. fields: [
  259. {
  260. name: "decimals";
  261. type: "u8";
  262. },
  263. {
  264. name: "circulation";
  265. type: "u64";
  266. },
  267. {
  268. name: "settled";
  269. type: "bool";
  270. },
  271. {
  272. name: "escrowMintAccountPubkey";
  273. type: "publicKey";
  274. },
  275. {
  276. name: "escrowAccountPubkey";
  277. type: "publicKey";
  278. },
  279. {
  280. name: "longMintAccountPubkey";
  281. type: "publicKey";
  282. },
  283. {
  284. name: "shortMintAccountPubkey";
  285. type: "publicKey";
  286. },
  287. {
  288. name: "owner";
  289. type: "publicKey";
  290. },
  291. {
  292. name: "winningSidePubkey";
  293. type: "publicKey";
  294. }
  295. ];
  296. };
  297. }
  298. ];
  299. errors: [
  300. {
  301. code: 0;
  302. name: "PublicKeyMismatch";
  303. msg: "PublicKeyMismatch";
  304. },
  305. {
  306. code: 1;
  307. name: "InvalidMintAuthority";
  308. msg: "InvalidMintAuthority";
  309. },
  310. {
  311. code: 2;
  312. name: "NotMintAuthority";
  313. msg: "NotMintAuthority";
  314. },
  315. {
  316. code: 3;
  317. name: "InvalidSupply";
  318. msg: "InvalidSupply";
  319. },
  320. {
  321. code: 4;
  322. name: "InvalidWinner";
  323. msg: "InvalidWinner";
  324. },
  325. {
  326. code: 5;
  327. name: "UninitializedAccount";
  328. msg: "UninitializedAccount";
  329. },
  330. {
  331. code: 6;
  332. name: "IncorrectOwner";
  333. msg: "IncorrectOwner";
  334. },
  335. {
  336. code: 7;
  337. name: "AlreadySettled";
  338. msg: "AlreadySettled";
  339. },
  340. {
  341. code: 8;
  342. name: "BetNotSettled";
  343. msg: "BetNotSettled";
  344. },
  345. {
  346. code: 9;
  347. name: "TokenNotFoundInPool";
  348. msg: "TokenNotFoundInPool";
  349. },
  350. {
  351. code: 10;
  352. name: "PublicKeysShouldBeUnique";
  353. msg: "PublicKeysShouldBeUnique";
  354. },
  355. {
  356. code: 11;
  357. name: "TradePricesIncorrect";
  358. msg: "TradePricesIncorrect";
  359. }
  360. ];
  361. };
  362. const IDL: SplBinaryOption = {
  363. version: "0.1.0",
  364. name: "spl_binary_option",
  365. instructions: [
  366. {
  367. name: "initializeBinaryOption",
  368. accounts: [
  369. {
  370. name: "poolAccount",
  371. isMut: true,
  372. isSigner: true,
  373. },
  374. {
  375. name: "escrowMint",
  376. isMut: false,
  377. isSigner: false,
  378. },
  379. {
  380. name: "escrowAccount",
  381. isMut: true,
  382. isSigner: true,
  383. },
  384. {
  385. name: "longTokenMint",
  386. isMut: true,
  387. isSigner: true,
  388. },
  389. {
  390. name: "shortTokenMint",
  391. isMut: true,
  392. isSigner: true,
  393. },
  394. {
  395. name: "mintAuthority",
  396. isMut: false,
  397. isSigner: true,
  398. },
  399. {
  400. name: "updateAuthority",
  401. isMut: false,
  402. isSigner: true,
  403. },
  404. {
  405. name: "tokenProgram",
  406. isMut: false,
  407. isSigner: false,
  408. },
  409. {
  410. name: "systemProgram",
  411. isMut: false,
  412. isSigner: false,
  413. },
  414. {
  415. name: "rent",
  416. isMut: false,
  417. isSigner: false,
  418. },
  419. ],
  420. args: [
  421. {
  422. name: "decimals",
  423. type: "u8",
  424. },
  425. ],
  426. },
  427. {
  428. name: "trade",
  429. accounts: [
  430. {
  431. name: "poolAccount",
  432. isMut: true,
  433. isSigner: false,
  434. },
  435. {
  436. name: "escrowAccount",
  437. isMut: true,
  438. isSigner: false,
  439. },
  440. {
  441. name: "longTokenMint",
  442. isMut: true,
  443. isSigner: false,
  444. },
  445. {
  446. name: "shortTokenMint",
  447. isMut: true,
  448. isSigner: false,
  449. },
  450. {
  451. name: "buyer",
  452. isMut: false,
  453. isSigner: true,
  454. },
  455. {
  456. name: "seller",
  457. isMut: false,
  458. isSigner: true,
  459. },
  460. {
  461. name: "buyerAccount",
  462. isMut: true,
  463. isSigner: false,
  464. },
  465. {
  466. name: "sellerAccount",
  467. isMut: true,
  468. isSigner: false,
  469. },
  470. {
  471. name: "buyerLongTokenAccount",
  472. isMut: true,
  473. isSigner: false,
  474. },
  475. {
  476. name: "buyerShortTokenAccount",
  477. isMut: true,
  478. isSigner: false,
  479. },
  480. {
  481. name: "sellerLongTokenAccount",
  482. isMut: true,
  483. isSigner: false,
  484. },
  485. {
  486. name: "sellerShortTokenAccount",
  487. isMut: true,
  488. isSigner: false,
  489. },
  490. {
  491. name: "escrowAuthority",
  492. isMut: false,
  493. isSigner: false,
  494. },
  495. {
  496. name: "tokenProgram",
  497. isMut: false,
  498. isSigner: false,
  499. },
  500. ],
  501. args: [
  502. {
  503. name: "size",
  504. type: "u64",
  505. },
  506. {
  507. name: "buyPrice",
  508. type: "u64",
  509. },
  510. {
  511. name: "sellPrice",
  512. type: "u64",
  513. },
  514. ],
  515. },
  516. {
  517. name: "settle",
  518. accounts: [
  519. {
  520. name: "poolAccount",
  521. isMut: true,
  522. isSigner: false,
  523. },
  524. {
  525. name: "winningMint",
  526. isMut: false,
  527. isSigner: false,
  528. },
  529. {
  530. name: "poolAuthority",
  531. isMut: false,
  532. isSigner: true,
  533. },
  534. ],
  535. args: [],
  536. },
  537. {
  538. name: "collect",
  539. accounts: [
  540. {
  541. name: "poolAccount",
  542. isMut: true,
  543. isSigner: false,
  544. },
  545. {
  546. name: "collectorAccount",
  547. isMut: false,
  548. isSigner: false,
  549. },
  550. {
  551. name: "collectorLongTokenAccount",
  552. isMut: true,
  553. isSigner: false,
  554. },
  555. {
  556. name: "collectorShortTokenAccount",
  557. isMut: true,
  558. isSigner: false,
  559. },
  560. {
  561. name: "collectorCollateralAccount",
  562. isMut: true,
  563. isSigner: false,
  564. },
  565. {
  566. name: "longTokenMintAccount",
  567. isMut: true,
  568. isSigner: false,
  569. },
  570. {
  571. name: "shortTokenMintAccount",
  572. isMut: true,
  573. isSigner: false,
  574. },
  575. {
  576. name: "escrowAccount",
  577. isMut: true,
  578. isSigner: false,
  579. },
  580. {
  581. name: "escrowAuthorityAccount",
  582. isMut: true,
  583. isSigner: false,
  584. },
  585. {
  586. name: "tokenProgram",
  587. isMut: false,
  588. isSigner: false,
  589. },
  590. ],
  591. args: [],
  592. },
  593. ],
  594. accounts: [
  595. {
  596. name: "binaryOption",
  597. type: {
  598. kind: "struct",
  599. fields: [
  600. {
  601. name: "decimals",
  602. type: "u8",
  603. },
  604. {
  605. name: "circulation",
  606. type: "u64",
  607. },
  608. {
  609. name: "settled",
  610. type: "bool",
  611. },
  612. {
  613. name: "escrowMintAccountPubkey",
  614. type: "publicKey",
  615. },
  616. {
  617. name: "escrowAccountPubkey",
  618. type: "publicKey",
  619. },
  620. {
  621. name: "longMintAccountPubkey",
  622. type: "publicKey",
  623. },
  624. {
  625. name: "shortMintAccountPubkey",
  626. type: "publicKey",
  627. },
  628. {
  629. name: "owner",
  630. type: "publicKey",
  631. },
  632. {
  633. name: "winningSidePubkey",
  634. type: "publicKey",
  635. },
  636. ],
  637. },
  638. },
  639. ],
  640. errors: [
  641. {
  642. code: 0,
  643. name: "PublicKeyMismatch",
  644. msg: "PublicKeyMismatch",
  645. },
  646. {
  647. code: 1,
  648. name: "InvalidMintAuthority",
  649. msg: "InvalidMintAuthority",
  650. },
  651. {
  652. code: 2,
  653. name: "NotMintAuthority",
  654. msg: "NotMintAuthority",
  655. },
  656. {
  657. code: 3,
  658. name: "InvalidSupply",
  659. msg: "InvalidSupply",
  660. },
  661. {
  662. code: 4,
  663. name: "InvalidWinner",
  664. msg: "InvalidWinner",
  665. },
  666. {
  667. code: 5,
  668. name: "UninitializedAccount",
  669. msg: "UninitializedAccount",
  670. },
  671. {
  672. code: 6,
  673. name: "IncorrectOwner",
  674. msg: "IncorrectOwner",
  675. },
  676. {
  677. code: 7,
  678. name: "AlreadySettled",
  679. msg: "AlreadySettled",
  680. },
  681. {
  682. code: 8,
  683. name: "BetNotSettled",
  684. msg: "BetNotSettled",
  685. },
  686. {
  687. code: 9,
  688. name: "TokenNotFoundInPool",
  689. msg: "TokenNotFoundInPool",
  690. },
  691. {
  692. code: 10,
  693. name: "PublicKeysShouldBeUnique",
  694. msg: "PublicKeysShouldBeUnique",
  695. },
  696. {
  697. code: 11,
  698. name: "TradePricesIncorrect",
  699. msg: "TradePricesIncorrect",
  700. },
  701. ],
  702. };