@0xsequence/marketplace-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README.md +8 -0
  2. package/dist/chunk-3TYUQEFM.js +115 -0
  3. package/dist/chunk-3TYUQEFM.js.map +1 -0
  4. package/dist/chunk-4ESPWOBV.js +13 -0
  5. package/dist/chunk-4ESPWOBV.js.map +1 -0
  6. package/dist/chunk-4PFMUVE4.js +78 -0
  7. package/dist/chunk-4PFMUVE4.js.map +1 -0
  8. package/dist/chunk-5WRI5ZAA.js +31 -0
  9. package/dist/chunk-5WRI5ZAA.js.map +1 -0
  10. package/dist/chunk-6S4FYXP6.js +43 -0
  11. package/dist/chunk-6S4FYXP6.js.map +1 -0
  12. package/dist/chunk-7OO74L2K.js +41 -0
  13. package/dist/chunk-7OO74L2K.js.map +1 -0
  14. package/dist/chunk-BBB3XUB4.js +213 -0
  15. package/dist/chunk-BBB3XUB4.js.map +1 -0
  16. package/dist/chunk-BCNFYVAL.js +1 -0
  17. package/dist/chunk-BCNFYVAL.js.map +1 -0
  18. package/dist/chunk-D7QQP6MS.js +2 -0
  19. package/dist/chunk-D7QQP6MS.js.map +1 -0
  20. package/dist/chunk-DBFOPEV6.js +23 -0
  21. package/dist/chunk-DBFOPEV6.js.map +1 -0
  22. package/dist/chunk-EDTC7UES.js +176 -0
  23. package/dist/chunk-EDTC7UES.js.map +1 -0
  24. package/dist/chunk-G3D572BT.js +249 -0
  25. package/dist/chunk-G3D572BT.js.map +1 -0
  26. package/dist/chunk-HGBEC3WX.js +1285 -0
  27. package/dist/chunk-HGBEC3WX.js.map +1 -0
  28. package/dist/chunk-MJ4YU7RW.js +2 -0
  29. package/dist/chunk-MJ4YU7RW.js.map +1 -0
  30. package/dist/chunk-NJ2GXOPW.js +2 -0
  31. package/dist/chunk-NJ2GXOPW.js.map +1 -0
  32. package/dist/chunk-O5JXKTWP.js +1029 -0
  33. package/dist/chunk-O5JXKTWP.js.map +1 -0
  34. package/dist/chunk-O642NH7U.js +15 -0
  35. package/dist/chunk-O642NH7U.js.map +1 -0
  36. package/dist/chunk-QOJXWHRZ.js +71 -0
  37. package/dist/chunk-QOJXWHRZ.js.map +1 -0
  38. package/dist/chunk-QVFMD6S2.js +21 -0
  39. package/dist/chunk-QVFMD6S2.js.map +1 -0
  40. package/dist/chunk-RNUHUVLC.js +214 -0
  41. package/dist/chunk-RNUHUVLC.js.map +1 -0
  42. package/dist/chunk-SM7V6ZWI.js +2740 -0
  43. package/dist/chunk-SM7V6ZWI.js.map +1 -0
  44. package/dist/chunk-STO74F2I.js +14 -0
  45. package/dist/chunk-STO74F2I.js.map +1 -0
  46. package/dist/chunk-TZGLKJRF.js +198 -0
  47. package/dist/chunk-TZGLKJRF.js.map +1 -0
  48. package/dist/chunk-UYRQ5MJQ.js +1027 -0
  49. package/dist/chunk-UYRQ5MJQ.js.map +1 -0
  50. package/dist/chunk-VPGWEMWL.js +162 -0
  51. package/dist/chunk-VPGWEMWL.js.map +1 -0
  52. package/dist/chunk-ZE2LNX65.js +394 -0
  53. package/dist/chunk-ZE2LNX65.js.map +1 -0
  54. package/dist/create-config-Dz0gCiQ0.d.ts +8 -0
  55. package/dist/get-query-client-D46hbjk6.d.ts +5 -0
  56. package/dist/index.css +232 -0
  57. package/dist/index.d.ts +16 -0
  58. package/dist/index.js +76 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/marketplace-config-DZbtyrma.d.ts +57 -0
  61. package/dist/marketplace.gen-Ceofb9Cs.d.ts +904 -0
  62. package/dist/react/_internal/api/index.d.ts +51 -0
  63. package/dist/react/_internal/api/index.js +134 -0
  64. package/dist/react/_internal/api/index.js.map +1 -0
  65. package/dist/react/_internal/index.d.ts +22 -0
  66. package/dist/react/_internal/index.js +150 -0
  67. package/dist/react/_internal/index.js.map +1 -0
  68. package/dist/react/_internal/wagmi/index.d.ts +12 -0
  69. package/dist/react/_internal/wagmi/index.js +12 -0
  70. package/dist/react/_internal/wagmi/index.js.map +1 -0
  71. package/dist/react/hooks/index.d.ts +381 -0
  72. package/dist/react/hooks/index.js +82 -0
  73. package/dist/react/hooks/index.js.map +1 -0
  74. package/dist/react/index.css +233 -0
  75. package/dist/react/index.css.map +1 -0
  76. package/dist/react/index.d.ts +27 -0
  77. package/dist/react/index.js +113 -0
  78. package/dist/react/index.js.map +1 -0
  79. package/dist/react/ssr/index.d.ts +94 -0
  80. package/dist/react/ssr/index.js +351 -0
  81. package/dist/react/ssr/index.js.map +1 -0
  82. package/dist/react/ui/icons/index.css +25 -0
  83. package/dist/react/ui/icons/index.css.map +1 -0
  84. package/dist/react/ui/icons/index.d.ts +2 -0
  85. package/dist/react/ui/icons/index.js +12 -0
  86. package/dist/react/ui/icons/index.js.map +1 -0
  87. package/dist/react/ui/index.css +233 -0
  88. package/dist/react/ui/index.css.map +1 -0
  89. package/dist/react/ui/index.d.ts +112 -0
  90. package/dist/react/ui/index.js +34 -0
  91. package/dist/react/ui/index.js.map +1 -0
  92. package/dist/react/ui/modals/_internal/components/actionModal/index.css +44 -0
  93. package/dist/react/ui/modals/_internal/components/actionModal/index.css.map +1 -0
  94. package/dist/react/ui/modals/_internal/components/actionModal/index.d.ts +31 -0
  95. package/dist/react/ui/modals/_internal/components/actionModal/index.js +39 -0
  96. package/dist/react/ui/modals/_internal/components/actionModal/index.js.map +1 -0
  97. package/dist/react/ui/styles/index.css +36 -0
  98. package/dist/react/ui/styles/index.css.map +1 -0
  99. package/dist/react/ui/styles/index.d.ts +5 -0
  100. package/dist/react/ui/styles/index.js +13 -0
  101. package/dist/react/ui/styles/index.js.map +1 -0
  102. package/dist/sdk-config-xWkdBdrL.d.ts +24 -0
  103. package/dist/services-BIwQ1C1c.d.ts +20 -0
  104. package/dist/styles/index.css +233 -0
  105. package/dist/styles/index.css.map +1 -0
  106. package/dist/styles/index.d.ts +58 -0
  107. package/dist/styles/index.js +5019 -0
  108. package/dist/styles/index.js.map +1 -0
  109. package/dist/styles.css-BVaTR5nO.d.ts +3 -0
  110. package/dist/types/index.d.ts +12 -0
  111. package/dist/types/index.js +39 -0
  112. package/dist/types/index.js.map +1 -0
  113. package/dist/types-BrAQ8-w4.d.ts +12 -0
  114. package/dist/utils/abi/abi/standard/index.d.ts +25 -0
  115. package/dist/utils/abi/abi/standard/index.js +8 -0
  116. package/dist/utils/abi/abi/standard/index.js.map +1 -0
  117. package/dist/utils/abi/abi/token/index.d.ts +1125 -0
  118. package/dist/utils/abi/abi/token/index.js +13 -0
  119. package/dist/utils/abi/abi/token/index.js.map +1 -0
  120. package/dist/utils/abi/clients/index.d.ts +27 -0
  121. package/dist/utils/abi/clients/index.js +13 -0
  122. package/dist/utils/abi/clients/index.js.map +1 -0
  123. package/dist/utils/index.d.ts +23 -0
  124. package/dist/utils/index.js +37 -0
  125. package/dist/utils/index.js.map +1 -0
  126. package/package.json +74 -0
  127. package/src/consts.ts +2 -0
  128. package/src/index.ts +3 -0
  129. package/src/react/_internal/api/get-query-client.ts +32 -0
  130. package/src/react/_internal/api/index.ts +5 -0
  131. package/src/react/_internal/api/marketplace-api.ts +31 -0
  132. package/src/react/_internal/api/marketplace.gen.ts +1911 -0
  133. package/src/react/_internal/api/query-keys.ts +61 -0
  134. package/src/react/_internal/api/services.ts +101 -0
  135. package/src/react/_internal/consts.ts +1 -0
  136. package/src/react/_internal/get-provider.ts +6 -0
  137. package/src/react/_internal/index.ts +5 -0
  138. package/src/react/_internal/types.ts +13 -0
  139. package/src/react/_internal/wagmi/create-config.ts +62 -0
  140. package/src/react/_internal/wagmi/embedded.ts +87 -0
  141. package/src/react/_internal/wagmi/index.ts +3 -0
  142. package/src/react/_internal/wagmi/universal.ts +82 -0
  143. package/src/react/hooks/index.ts +17 -0
  144. package/src/react/hooks/options/marketplaceConfigOptions.ts +62 -0
  145. package/src/react/hooks/useBalanceOfCollectible.tsx +51 -0
  146. package/src/react/hooks/useCollectible.tsx +47 -0
  147. package/src/react/hooks/useCollection.tsx +42 -0
  148. package/src/react/hooks/useCollectionCounts.tsx +61 -0
  149. package/src/react/hooks/useConfig.tsx +15 -0
  150. package/src/react/hooks/useCurrencies.tsx +76 -0
  151. package/src/react/hooks/useFilters.tsx +39 -0
  152. package/src/react/hooks/useFloorOrder.tsx +28 -0
  153. package/src/react/hooks/useGenerateListingTransaction.tsx +63 -0
  154. package/src/react/hooks/useGenerateOfferTransaction.tsx +60 -0
  155. package/src/react/hooks/useGenerateSellTransaction.tsx +43 -0
  156. package/src/react/hooks/useHighestOffer.tsx +46 -0
  157. package/src/react/hooks/useListBalances.tsx +56 -0
  158. package/src/react/hooks/useListCollectibles.tsx +54 -0
  159. package/src/react/hooks/useListOffersForCollectible.tsx +53 -0
  160. package/src/react/hooks/useLowestListing.tsx +47 -0
  161. package/src/react/hooks/useMarketplaceConfig.tsx +10 -0
  162. package/src/react/hooks/useRoyaltyPercentage.tsx +45 -0
  163. package/src/react/hooks/useTransferTokens.tsx +81 -0
  164. package/src/react/index.ts +5 -0
  165. package/src/react/provider.tsx +24 -0
  166. package/src/react/ssr/create-ssr-client.ts +31 -0
  167. package/src/react/ssr/index.ts +1 -0
  168. package/src/react/ui/icons/ArrowUp.tsx +29 -0
  169. package/src/react/ui/icons/CalendarIcon.tsx +29 -0
  170. package/src/react/ui/icons/InfoIcon.tsx +36 -0
  171. package/src/react/ui/icons/InventoryIcon.tsx +41 -0
  172. package/src/react/ui/icons/MinusIcon.tsx +31 -0
  173. package/src/react/ui/icons/PlusIcon.tsx +29 -0
  174. package/src/react/ui/icons/PositiveCircleIcon.tsx +35 -0
  175. package/src/react/ui/icons/index.ts +7 -0
  176. package/src/react/ui/icons/styles.css.ts +35 -0
  177. package/src/react/ui/index.ts +6 -0
  178. package/src/react/ui/modals/Account/index.tsx +29 -0
  179. package/src/react/ui/modals/CreateListingModal/_store.ts +326 -0
  180. package/src/react/ui/modals/CreateListingModal/_utils/getCreateListingTransactionTitleMessage.ts +30 -0
  181. package/src/react/ui/modals/CreateListingModal/index.tsx +146 -0
  182. package/src/react/ui/modals/MakeOfferModal/_store.ts +296 -0
  183. package/src/react/ui/modals/MakeOfferModal/_utils/getMakeOfferTransactionTitleMessage.ts +28 -0
  184. package/src/react/ui/modals/MakeOfferModal/index.tsx +157 -0
  185. package/src/react/ui/modals/SellModal/_store.ts +274 -0
  186. package/src/react/ui/modals/SellModal/_utils/getSellTransactionTitleMessage.ts +28 -0
  187. package/src/react/ui/modals/SellModal/index.tsx +126 -0
  188. package/src/react/ui/modals/SellModal/utils.ts +38 -0
  189. package/src/react/ui/modals/SuccessfulPurchaseModal/_store.ts +58 -0
  190. package/src/react/ui/modals/SuccessfulPurchaseModal/index.tsx +186 -0
  191. package/src/react/ui/modals/SuccessfulPurchaseModal/styles.css.ts +52 -0
  192. package/src/react/ui/modals/TransferModal/_store.ts +58 -0
  193. package/src/react/ui/modals/TransferModal/_utils/getTransferTransactionTitleMessage.ts +28 -0
  194. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/index.tsx +102 -0
  195. package/src/react/ui/modals/TransferModal/_views/followWalletInstructions/index.tsx +130 -0
  196. package/src/react/ui/modals/TransferModal/index.tsx +92 -0
  197. package/src/react/ui/modals/TransferModal/messages.ts +14 -0
  198. package/src/react/ui/modals/TransferModal/styles.css.ts +20 -0
  199. package/src/react/ui/modals/_internal/components/actionModal/ActionModal.tsx +94 -0
  200. package/src/react/ui/modals/_internal/components/actionModal/index.ts +3 -0
  201. package/src/react/ui/modals/_internal/components/actionModal/store.ts +19 -0
  202. package/src/react/ui/modals/_internal/components/actionModal/styles.css.ts +15 -0
  203. package/src/react/ui/modals/_internal/components/alertMessage/index.tsx +21 -0
  204. package/src/react/ui/modals/_internal/components/alertMessage/styles.css.ts +22 -0
  205. package/src/react/ui/modals/_internal/components/calendar/index.tsx +59 -0
  206. package/src/react/ui/modals/_internal/components/calendarPopover/index.tsx +41 -0
  207. package/src/react/ui/modals/_internal/components/calendarPopover/styles.css.ts +16 -0
  208. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/index.tsx +76 -0
  209. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/styles.css.ts +33 -0
  210. package/src/react/ui/modals/_internal/components/expirationDateSelect/index.tsx +127 -0
  211. package/src/react/ui/modals/_internal/components/expirationDateSelect/styles.css.ts +25 -0
  212. package/src/react/ui/modals/_internal/components/floorPriceText/index.tsx +54 -0
  213. package/src/react/ui/modals/_internal/components/priceInput/index.tsx +72 -0
  214. package/src/react/ui/modals/_internal/components/priceInput/styles.css.ts +23 -0
  215. package/src/react/ui/modals/_internal/components/priceInput/types.ts +4 -0
  216. package/src/react/ui/modals/_internal/components/quantityInput/index.tsx +168 -0
  217. package/src/react/ui/modals/_internal/components/quantityInput/styles.css.ts +30 -0
  218. package/src/react/ui/modals/_internal/components/switchChainModal/index.tsx +132 -0
  219. package/src/react/ui/modals/_internal/components/switchChainModal/store.ts +41 -0
  220. package/src/react/ui/modals/_internal/components/switchChainModal/styles.css.ts +37 -0
  221. package/src/react/ui/modals/_internal/components/timeAgo/index.tsx +32 -0
  222. package/src/react/ui/modals/_internal/components/tokenPreview/index.tsx +58 -0
  223. package/src/react/ui/modals/_internal/components/tokenPreview/styles.css.ts +11 -0
  224. package/src/react/ui/modals/_internal/components/transaction-footer/index.tsx +48 -0
  225. package/src/react/ui/modals/_internal/components/transactionDetails/index.tsx +80 -0
  226. package/src/react/ui/modals/_internal/components/transactionHeader/index.tsx +30 -0
  227. package/src/react/ui/modals/_internal/components/transactionPreview/consts.ts +27 -0
  228. package/src/react/ui/modals/_internal/components/transactionPreview/index.tsx +111 -0
  229. package/src/react/ui/modals/_internal/components/transactionPreview/useTransactionPreviewTitle.tsx +24 -0
  230. package/src/react/ui/modals/_internal/components/transactionStatusModal/index.tsx +123 -0
  231. package/src/react/ui/modals/_internal/components/transactionStatusModal/store.ts +87 -0
  232. package/src/react/ui/modals/_internal/components/transactionStatusModal/styles.css.ts +15 -0
  233. package/src/react/ui/modals/_internal/stores/accountModal.ts +3 -0
  234. package/src/react/ui/modals/modal-provider.tsx +27 -0
  235. package/src/react/ui/styles/index.ts +1 -0
  236. package/src/react/ui/styles/modal.css.ts +73 -0
  237. package/src/styles/index.ts +18 -0
  238. package/src/types/api-types.ts +48 -0
  239. package/src/types/index.ts +4 -0
  240. package/src/types/marketplace-config.ts +63 -0
  241. package/src/types/messages.ts +43 -0
  242. package/src/types/sdk-config.ts +23 -0
  243. package/src/types/types.ts +6 -0
  244. package/src/utils/abi/abi/standard/EIP2981.ts +15 -0
  245. package/src/utils/abi/abi/standard/index.ts +1 -0
  246. package/src/utils/abi/abi/token/ERC1155.ts +324 -0
  247. package/src/utils/abi/abi/token/ERC20.ts +185 -0
  248. package/src/utils/abi/abi/token/ERC721.ts +506 -0
  249. package/src/utils/abi/abi/token/index.ts +3 -0
  250. package/src/utils/abi/clients/ERC1155.ts +82 -0
  251. package/src/utils/abi/clients/ERC20.ts +101 -0
  252. package/src/utils/abi/clients/ERC721.ts +97 -0
  253. package/src/utils/abi/clients/index.ts +3 -0
  254. package/src/utils/address.ts +26 -0
  255. package/src/utils/get-public-rpc-client.ts +32 -0
  256. package/src/utils/index.ts +6 -0
  257. package/src/utils/network.ts +5 -0
  258. package/src/utils/price.ts +21 -0
@@ -0,0 +1,296 @@
1
+ import { observable, when } from '@legendapp/state';
2
+ import { useMount, useSelector } from '@legendapp/state/react';
3
+ import { useCollection } from '@react-hooks/useCollection';
4
+ import { useGenerateOfferTransaction } from '@react-hooks/useGenerateOfferTransaction';
5
+ import {
6
+ type Currency,
7
+ OrderbookKind,
8
+ type Price,
9
+ type Step,
10
+ StepType,
11
+ type WalletKind,
12
+ } from '@types';
13
+ import { addDays } from 'date-fns/addDays';
14
+ import { parseUnits, type Hex } from 'viem';
15
+ import { useAccount, useSendTransaction } from 'wagmi';
16
+ import type { ShowMakeOfferModalArgs } from '.';
17
+ import type { Messages } from '../../../../types/messages';
18
+ import { useTransactionStatusModal } from '../_internal/components/transactionStatusModal';
19
+ import {
20
+ getMakeOfferTransactionMessage,
21
+ getMakeOfferTransactionTitle,
22
+ } from './_utils/getMakeOfferTransactionTitleMessage';
23
+ import { useCollectible } from '@react-hooks/useCollectible';
24
+ import type { CollectionType } from '@internal';
25
+
26
+ export interface MakeOfferModalState {
27
+ isOpen: boolean;
28
+ open: (args: ShowMakeOfferModalArgs) => void;
29
+ close: () => void;
30
+ state: {
31
+ collectionName: string;
32
+ collectionType: CollectionType | undefined;
33
+ offerPrice: Price;
34
+ quantity: string;
35
+ collectionAddress: string;
36
+ chainId: string;
37
+ collectibleId: string;
38
+ expiry: Date;
39
+ messages?: Messages;
40
+ };
41
+ steps: {
42
+ isLoading: () => boolean;
43
+ stepsData: Step[] | undefined;
44
+ _currentStep: null | 'tokenApproval' | 'createOffer';
45
+ tokenApproval: {
46
+ isNeeded: () => boolean;
47
+ pending: boolean;
48
+ getStep: () => Step | undefined;
49
+ execute: () => void;
50
+ };
51
+ createOffer: {
52
+ pending: boolean;
53
+ execute: () => void;
54
+ };
55
+ };
56
+ hash: Hex | undefined;
57
+ }
58
+
59
+ export const initialState: MakeOfferModalState = {
60
+ isOpen: false,
61
+ open: ({
62
+ collectionAddress,
63
+ chainId,
64
+ collectibleId,
65
+ messages,
66
+ }: ShowMakeOfferModalArgs) => {
67
+ makeOfferModal$.state.set({
68
+ ...makeOfferModal$.state.get(),
69
+ collectionAddress,
70
+ chainId,
71
+ collectibleId,
72
+ messages,
73
+ });
74
+ makeOfferModal$.isOpen.set(true);
75
+ },
76
+ close: () => {
77
+ makeOfferModal$.isOpen.set(false);
78
+ },
79
+ state: {
80
+ collectionName: '',
81
+ offerPrice: {
82
+ amountRaw: '0',
83
+ currency: {} as Currency,
84
+ },
85
+ quantity: '1',
86
+ expiry: new Date(addDays(new Date(), 7).toJSON()),
87
+ collectionType: undefined,
88
+ collectionAddress: '',
89
+ chainId: '',
90
+ collectibleId: '',
91
+ },
92
+ steps: {
93
+ isLoading: () => !!makeOfferModal$.steps.stepsData.get(),
94
+ stepsData: undefined,
95
+ _currentStep: null,
96
+ tokenApproval: {} as MakeOfferModalState['steps']['tokenApproval'],
97
+ createOffer: {} as MakeOfferModalState['steps']['createOffer'],
98
+ },
99
+ hash: undefined,
100
+ };
101
+
102
+ export const makeOfferModal$ = observable(initialState);
103
+
104
+ const exp = new Date(addDays(new Date(), 7).toJSON());
105
+
106
+ export const useHydrate = () => {
107
+ const chainId = useSelector(makeOfferModal$.state.chainId);
108
+ const collectionAddress = useSelector(
109
+ makeOfferModal$.state.collectionAddress,
110
+ );
111
+ const currencyAddress = useSelector(
112
+ makeOfferModal$.state.offerPrice.currency.contractAddress,
113
+ );
114
+ const collectionType = useSelector(makeOfferModal$.state.collectionType);
115
+ const { data: collection, isSuccess: isSuccessCollection } = useCollection({
116
+ chainId,
117
+ collectionAddress,
118
+ });
119
+
120
+ when(isSuccessCollection, () => {
121
+ makeOfferModal$.state.collectionName.set(collection!.name);
122
+ makeOfferModal$.state.collectionType.set(
123
+ collection!.type as CollectionType,
124
+ );
125
+ });
126
+
127
+ useTokenApprovalHandler(chainId);
128
+ useCreateOfferHandler(chainId);
129
+
130
+ const onOfferSuccess = (data?: Step[]) => {
131
+ makeOfferModal$.steps.stepsData.set(data);
132
+ };
133
+
134
+ const { generateOfferTransactionAsync } = useGenerateOfferTransaction({
135
+ chainId,
136
+ onSuccess: onOfferSuccess,
137
+ });
138
+
139
+ const { connector, address: userAddress } = useAccount();
140
+
141
+ useMount(() => {
142
+ const setSteps = async () => {
143
+ const makeOfferTransactionData = await generateOfferTransactionAsync({
144
+ collectionAddress,
145
+ orderbook: OrderbookKind.sequence_marketplace_v1,
146
+ offer: {
147
+ tokenId: '1',
148
+ quantity: '1',
149
+ expiry: exp,
150
+ currencyAddress,
151
+ pricePerToken:
152
+ makeOfferModal$.state.offerPrice.amountRaw.get() || '1',
153
+ },
154
+ maker: userAddress!,
155
+ contractType: collectionType!,
156
+ walletType: connector?.id as WalletKind,
157
+ });
158
+ makeOfferModal$.steps.stepsData.set(makeOfferTransactionData);
159
+ };
160
+
161
+ when(isSuccessCollection && collectionType && currencyAddress, setSteps);
162
+ });
163
+ };
164
+
165
+ const useTokenApprovalHandler = (chainId: string) => {
166
+ const { sendTransactionAsync, isPending, isSuccess } = useSendTransaction();
167
+ const {
168
+ onUnknownError,
169
+ onSuccess,
170
+ }: { onUnknownError?: Function; onSuccess?: Function } =
171
+ makeOfferModal$.state.get().messages?.approveToken || {};
172
+
173
+ makeOfferModal$.steps.tokenApproval.set({
174
+ isNeeded: () => !!makeOfferModal$.steps.tokenApproval.getStep(),
175
+ getStep: () =>
176
+ makeOfferModal$.steps.stepsData
177
+ ?.get()
178
+ ?.find((s) => s.id === StepType.tokenApproval),
179
+ pending:
180
+ makeOfferModal$.steps._currentStep.get() === 'tokenApproval' && isPending,
181
+ execute: () => {
182
+ const step = makeOfferModal$.steps.tokenApproval.getStep();
183
+ if (!step) return;
184
+ makeOfferModal$.steps._currentStep.set('tokenApproval');
185
+ try {
186
+ sendTransactionAsync({
187
+ to: step.to as Hex,
188
+ chainId: Number(chainId),
189
+ data: step.data as Hex,
190
+ value: BigInt(step.value || '0'),
191
+ });
192
+
193
+ onSuccess && onSuccess();
194
+ } catch (error) {
195
+ onUnknownError && onUnknownError(error);
196
+ }
197
+ },
198
+ });
199
+
200
+ if (
201
+ isSuccess &&
202
+ makeOfferModal$.steps._currentStep.get() === 'tokenApproval'
203
+ ) {
204
+ makeOfferModal$.steps._currentStep.set(null);
205
+ }
206
+ };
207
+
208
+ const useCreateOfferHandler = (chainId: string) => {
209
+ const { collectibleId, collectionAddress } = makeOfferModal$.state.get();
210
+ const { connector, address } = useAccount();
211
+ const {
212
+ generateOfferTransactionAsync,
213
+ isPending: generateOfferTransactionPending,
214
+ error: generateOfferTransactionError,
215
+ } = useGenerateOfferTransaction({ chainId });
216
+ const { data: collectible } = useCollectible({
217
+ chainId,
218
+ collectionAddress,
219
+ collectibleId,
220
+ });
221
+
222
+ const {
223
+ onUnknownError,
224
+ onSuccess,
225
+ }: { onUnknownError?: Function; onSuccess?: Function } =
226
+ makeOfferModal$.state.get().messages?.sellCollectible || {};
227
+
228
+ const { sendTransactionAsync, isPending: sendTransactionPending } =
229
+ useSendTransaction();
230
+
231
+ const { show: showTransactionStatusModal } = useTransactionStatusModal();
232
+
233
+ makeOfferModal$.steps.createOffer.set({
234
+ pending:
235
+ makeOfferModal$.steps._currentStep.get() === 'createOffer' &&
236
+ (generateOfferTransactionPending || sendTransactionPending),
237
+ execute: () => {
238
+ makeOfferModal$.steps._currentStep.set('createOffer');
239
+ generateOfferTransactionAsync({
240
+ collectionAddress: makeOfferModal$.state.collectionAddress.get(),
241
+ maker: address!,
242
+ contractType: makeOfferModal$.state.collectionType.get()!,
243
+ orderbook: OrderbookKind.sequence_marketplace_v1,
244
+ walletType: connector?.id as WalletKind,
245
+ offer: {
246
+ tokenId: makeOfferModal$.state.collectibleId.get(),
247
+ quantity: makeOfferModal$.state.quantity.get(),
248
+ expiry: makeOfferModal$.state.expiry.get(),
249
+ currencyAddress:
250
+ makeOfferModal$.state.offerPrice.currency.contractAddress.get(),
251
+ pricePerToken: parseUnits(
252
+ makeOfferModal$.state.offerPrice.amountRaw.get(),
253
+ makeOfferModal$.state.offerPrice.currency.decimals.get(),
254
+ ).toString(),
255
+ },
256
+ })
257
+ .then(async (steps) => {
258
+ const step = steps.find((s) => s.id === StepType.createOffer);
259
+ if (!step) throw new Error('No steps found');
260
+ const hash = await sendTransactionAsync({
261
+ to: step.to as Hex,
262
+ chainId: Number(chainId),
263
+ data: step.data as Hex,
264
+ value: BigInt(step.value || '0'),
265
+ });
266
+
267
+ makeOfferModal$.hash.set(hash);
268
+
269
+ makeOfferModal$.steps._currentStep.set(null);
270
+
271
+ showTransactionStatusModal({
272
+ hash: hash!,
273
+ price: makeOfferModal$.state.offerPrice.get(),
274
+ collectionAddress,
275
+ chainId,
276
+ tokenId: collectibleId,
277
+ getTitle: getMakeOfferTransactionTitle,
278
+ getMessage: (params) =>
279
+ getMakeOfferTransactionMessage(params, collectible?.name || ''),
280
+ type: StepType.createOffer,
281
+ });
282
+
283
+ makeOfferModal$.close();
284
+
285
+ onSuccess && onSuccess();
286
+ })
287
+ .catch((error) => {
288
+ onUnknownError && onUnknownError(error);
289
+ });
290
+ },
291
+ });
292
+
293
+ if (generateOfferTransactionError) {
294
+ onUnknownError && onUnknownError(generateOfferTransactionError);
295
+ }
296
+ };
@@ -0,0 +1,28 @@
1
+ import type { ConfirmationStatus } from '../../_internal/components/transactionStatusModal/store';
2
+
3
+ export const getMakeOfferTransactionTitle = (params: ConfirmationStatus) => {
4
+ if (params.isConfirmed) {
5
+ return 'Your offer has processed';
6
+ }
7
+
8
+ if (params.isFailed) {
9
+ return 'Your offer has failed';
10
+ }
11
+
12
+ return 'Your offer is processing';
13
+ };
14
+
15
+ export const getMakeOfferTransactionMessage = (
16
+ params: ConfirmationStatus,
17
+ collectibleName: string,
18
+ ) => {
19
+ if (params.isConfirmed) {
20
+ return `You just made offer for ${collectibleName}. It’s been confirmed on the blockchain!`;
21
+ }
22
+
23
+ if (params.isFailed) {
24
+ return `Your offer for ${collectibleName} has failed. Please try again.`;
25
+ }
26
+
27
+ return `You just made offer for ${collectibleName}. It should be confirmed on the blockchain shortly.`;
28
+ };
@@ -0,0 +1,157 @@
1
+ import { ContractType } from '@internal';
2
+ import { Show, observer } from '@legendapp/state/react';
3
+ import { type Hex, erc20Abi, parseUnits } from 'viem';
4
+ import { useAccount, useReadContract } from 'wagmi';
5
+ import {
6
+ ActionModal,
7
+ type ActionModalProps,
8
+ } from '../_internal/components/actionModal/ActionModal';
9
+ import ExpirationDateSelect from '../_internal/components/expirationDateSelect';
10
+ import FloorPriceText from '../_internal/components/floorPriceText';
11
+ import PriceInput from '../_internal/components/priceInput';
12
+ import QuantityInput from '../_internal/components/quantityInput';
13
+ import TokenPreview from '../_internal/components/tokenPreview';
14
+ import { makeOfferModal$, useHydrate } from './_store';
15
+ import { useSwitchChainModal } from '../_internal/components/switchChainModal';
16
+ import type { Messages } from '../../../../types/messages';
17
+
18
+ export type ShowMakeOfferModalArgs = {
19
+ collectionAddress: string;
20
+ chainId: string;
21
+ collectibleId: string;
22
+ messages?: Messages;
23
+ };
24
+
25
+ export const useMakeOfferModal = () => {
26
+ const { chainId: accountChainId } = useAccount();
27
+ const { show: showSwitchNetworkModal } = useSwitchChainModal();
28
+
29
+ const openModal = (args: ShowMakeOfferModalArgs) => {
30
+ makeOfferModal$.open(args);
31
+ };
32
+
33
+ const handleShowModal = (args: ShowMakeOfferModalArgs) => {
34
+ const isSameChain = accountChainId === Number(args.chainId);
35
+
36
+ if (!isSameChain) {
37
+ showSwitchNetworkModal({
38
+ chainIdToSwitchTo: Number(args.chainId),
39
+ onSwitchChain: () => openModal(args),
40
+ messages: args.messages?.switchChain,
41
+ });
42
+ return;
43
+ }
44
+
45
+ openModal(args);
46
+ };
47
+
48
+ return {
49
+ show: handleShowModal,
50
+ close: () => makeOfferModal$.close(),
51
+ };
52
+ };
53
+
54
+ export const MakeOfferModal = () => {
55
+ return (
56
+ <Show if={makeOfferModal$.isOpen}>
57
+ <Modal />
58
+ </Show>
59
+ );
60
+ };
61
+
62
+ const Modal = () => {
63
+ useHydrate();
64
+ return <ModalContent />;
65
+ };
66
+
67
+ const ModalContent = observer(() => {
68
+ const {
69
+ chainId,
70
+ collectionAddress,
71
+ collectibleId,
72
+ collectionName,
73
+ collectionType,
74
+ offerPrice,
75
+ } = makeOfferModal$.state.get();
76
+
77
+ const { steps } = makeOfferModal$.get();
78
+
79
+ const { address: accountAddress } = useAccount();
80
+ const { data: balance, isSuccess: isBalanceSuccess } = useReadContract({
81
+ address:
82
+ makeOfferModal$.state.offerPrice.currency.contractAddress.get() as Hex,
83
+ abi: erc20Abi,
84
+ functionName: 'balanceOf',
85
+ args: [accountAddress as Hex],
86
+ });
87
+
88
+ let balanceError = '';
89
+ if (
90
+ isBalanceSuccess &&
91
+ parseUnits(offerPrice.amountRaw, offerPrice.currency.decimals) >
92
+ (balance || 0)
93
+ ) {
94
+ balanceError = 'Insufficient balance';
95
+ }
96
+
97
+ const ctas = [
98
+ {
99
+ label: 'Approve TOKEN',
100
+ onClick: steps.tokenApproval.execute,
101
+ hidden: !steps.tokenApproval.isNeeded(),
102
+ pending: steps.tokenApproval.pending,
103
+ variant: 'glass' as const,
104
+ },
105
+ {
106
+ label: 'Make offer',
107
+ onClick: steps.createOffer.execute,
108
+ pending: steps.createOffer.pending,
109
+ disabled: steps.tokenApproval.isNeeded() || offerPrice.amountRaw === '0',
110
+ },
111
+ ] satisfies ActionModalProps['ctas'];
112
+
113
+ return (
114
+ <ActionModal
115
+ store={makeOfferModal$}
116
+ onClose={() => {
117
+ makeOfferModal$.close();
118
+ }}
119
+ title="Make an offer"
120
+ ctas={ctas}
121
+ >
122
+ <TokenPreview
123
+ collectionName={collectionName}
124
+ collectionAddress={collectionAddress}
125
+ collectibleId={collectibleId}
126
+ chainId={chainId}
127
+ />
128
+
129
+ <PriceInput
130
+ chainId={chainId}
131
+ collectionAddress={collectionAddress}
132
+ $listingPrice={makeOfferModal$.state.offerPrice}
133
+ error={balanceError}
134
+ />
135
+
136
+ {collectionType === ContractType.ERC1155 && (
137
+ <QuantityInput
138
+ chainId={chainId}
139
+ $quantity={makeOfferModal$.state.quantity}
140
+ collectionAddress={collectionAddress}
141
+ collectibleId={collectibleId}
142
+ />
143
+ )}
144
+
145
+ {!!offerPrice && (
146
+ <FloorPriceText
147
+ tokenId={collectibleId}
148
+ chainId={chainId}
149
+ collectionAddress={collectionAddress}
150
+ price={offerPrice}
151
+ />
152
+ )}
153
+
154
+ <ExpirationDateSelect $date={makeOfferModal$.state.expiry} />
155
+ </ActionModal>
156
+ );
157
+ });