@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,326 @@
1
+ import { observable, when } from '@legendapp/state';
2
+ import { useMount, useSelector } from '@legendapp/state/react';
3
+ import { useCollection } from '@react-hooks/useCollection';
4
+ import { useGenerateListingTransaction } from '@react-hooks/useGenerateListingTransaction';
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 type { Hex } from 'viem';
15
+ import { useAccount, useSendTransaction } from 'wagmi';
16
+ import type { ShowCreateListingModalArgs } from '.';
17
+ import type { Messages } from '../../../../types/messages';
18
+ import { useTransactionStatusModal } from '../_internal/components/transactionStatusModal';
19
+ import {
20
+ getCreateListingTransactionMessage,
21
+ getCreateListingTransactionTitle,
22
+ } from './_utils/getCreateListingTransactionTitleMessage';
23
+ import { useCollectible } from '@react-hooks/useCollectible';
24
+ import type { CollectionType } from '@internal';
25
+
26
+ export interface CreateListingModalState {
27
+ isOpen: boolean;
28
+ open: (args: ShowCreateListingModalArgs) => void;
29
+ close: () => void;
30
+ state: {
31
+ collectionName: string;
32
+ collectionType: CollectionType | undefined;
33
+ listingPrice: 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' | 'createListing';
45
+ tokenApproval: {
46
+ isNeeded: () => boolean;
47
+ pending: boolean;
48
+ getStep: () => Step | undefined;
49
+ execute: () => void;
50
+ };
51
+ createListing: {
52
+ pending: boolean;
53
+ execute: () => void;
54
+ };
55
+ };
56
+ hash: Hex | undefined;
57
+ }
58
+
59
+ export const initialState: CreateListingModalState = {
60
+ isOpen: false,
61
+ open: ({
62
+ collectionAddress,
63
+ chainId,
64
+ collectibleId,
65
+ messages,
66
+ }: ShowCreateListingModalArgs) => {
67
+ createListingModal$.state.set({
68
+ ...createListingModal$.state.get(),
69
+ collectionAddress,
70
+ chainId,
71
+ collectibleId,
72
+ messages,
73
+ });
74
+ createListingModal$.isOpen.set(true);
75
+ },
76
+ close: () => {
77
+ createListingModal$.isOpen.set(false);
78
+ },
79
+ state: {
80
+ collectionName: '',
81
+ listingPrice: {
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: () => !!createListingModal$.steps.stepsData.get(),
94
+ stepsData: undefined,
95
+ _currentStep: null,
96
+ tokenApproval: {} as CreateListingModalState['steps']['tokenApproval'],
97
+ createListing: {} as CreateListingModalState['steps']['createListing'],
98
+ },
99
+ hash: undefined,
100
+ };
101
+
102
+ export const createListingModal$ = observable(initialState);
103
+
104
+ const exp = new Date(addDays(new Date(), 7).toJSON());
105
+
106
+ export const useHydrate = () => {
107
+ const chainId = useSelector(createListingModal$.state.chainId);
108
+ const collectionAddress = useSelector(
109
+ createListingModal$.state.collectionAddress,
110
+ );
111
+ const collectionType = useSelector(createListingModal$.state.collectionType);
112
+ const { data: collection, isSuccess: isSuccessCollection } = useCollection({
113
+ chainId,
114
+ collectionAddress,
115
+ });
116
+
117
+ when(isSuccessCollection, () => {
118
+ createListingModal$.state.collectionName.set(collection!.name);
119
+ createListingModal$.state.collectionType.set(
120
+ collection!.type as CollectionType,
121
+ );
122
+ });
123
+
124
+ useTokenApprovalHandler(chainId);
125
+ useCreateListingHandler(chainId);
126
+ useShowTransactionStatusModal();
127
+
128
+ const onListingSuccess = (data?: Step[]) => {
129
+ createListingModal$.steps.stepsData.set(data);
130
+ };
131
+
132
+ const { generateListingTransactionAsync } = useGenerateListingTransaction({
133
+ chainId,
134
+ onSuccess: onListingSuccess,
135
+ });
136
+
137
+ const { connector, address: userAddress } = useAccount();
138
+
139
+ useMount(() => {
140
+ const setSteps = async () => {
141
+ const createListingTransactionSteps =
142
+ await generateListingTransactionAsync({
143
+ collectionAddress,
144
+ orderbook: OrderbookKind.sequence_marketplace_v1,
145
+ listing: {
146
+ tokenId: '1',
147
+ quantity: '1',
148
+ expiry: exp,
149
+ currencyAddress:
150
+ createListingModal$.state.listingPrice.currency.contractAddress.get(),
151
+ pricePerToken:
152
+ createListingModal$.state.listingPrice.amountRaw.get() || '1',
153
+ },
154
+ contractType: collectionType!,
155
+ walletType: connector?.id as WalletKind,
156
+ owner: userAddress!,
157
+ });
158
+
159
+ createListingModal$.steps.stepsData.set(createListingTransactionSteps);
160
+ };
161
+
162
+ when(isSuccessCollection && collectionType, setSteps);
163
+ });
164
+ };
165
+
166
+ const useTokenApprovalHandler = (chainId: string) => {
167
+ const { sendTransactionAsync, isPending, isSuccess } = useSendTransaction();
168
+ const {
169
+ onUnknownError,
170
+ onSuccess,
171
+ }: { onUnknownError?: Function; onSuccess?: Function } =
172
+ createListingModal$.state.get().messages?.approveToken || {};
173
+
174
+ createListingModal$.steps.tokenApproval.set({
175
+ isNeeded: () => !!createListingModal$.steps.tokenApproval.getStep(),
176
+ getStep: () =>
177
+ createListingModal$.steps.stepsData
178
+ ?.get()
179
+ ?.find((s) => s.id === StepType.tokenApproval),
180
+ pending:
181
+ createListingModal$.steps._currentStep.get() === 'tokenApproval' &&
182
+ isPending,
183
+ execute: () => {
184
+ const step = createListingModal$.steps.tokenApproval.getStep();
185
+ if (!step) return;
186
+ createListingModal$.steps._currentStep.set('tokenApproval');
187
+
188
+ try {
189
+ sendTransactionAsync({
190
+ to: step.to as Hex,
191
+ chainId: Number(chainId),
192
+ data: step.data as Hex,
193
+ value: BigInt(step.value || '0'),
194
+ });
195
+
196
+ onSuccess && onSuccess();
197
+ } catch (error) {
198
+ onUnknownError && onUnknownError(error);
199
+ }
200
+ },
201
+ });
202
+
203
+ if (
204
+ isSuccess &&
205
+ createListingModal$.steps._currentStep.get() === 'tokenApproval'
206
+ ) {
207
+ createListingModal$.steps._currentStep.set(null);
208
+ }
209
+ };
210
+
211
+ const useCreateListingHandler = (chainId: string) => {
212
+ const { collectibleId, collectionAddress } = createListingModal$.state.get();
213
+ const { connector, address } = useAccount();
214
+ const {
215
+ generateListingTransactionAsync,
216
+ isPending: generateListingTransactionPending,
217
+ error: generateListingTransactionError,
218
+ } = useGenerateListingTransaction({ chainId });
219
+ const { data: collectible } = useCollectible({
220
+ chainId,
221
+ collectionAddress,
222
+ collectibleId,
223
+ });
224
+ const {
225
+ onUnknownError,
226
+ onSuccess,
227
+ }: { onUnknownError?: Function; onSuccess?: Function } =
228
+ createListingModal$.state.get().messages?.sellCollectible || {};
229
+
230
+ const { sendTransactionAsync, isPending: sendTransactionPending } =
231
+ useSendTransaction();
232
+
233
+ const { show: showTransactionStatusModal } = useTransactionStatusModal();
234
+
235
+ createListingModal$.steps.createListing.set({
236
+ pending:
237
+ createListingModal$.steps._currentStep.get() === 'createListing' &&
238
+ (generateListingTransactionPending || sendTransactionPending),
239
+ execute: () => {
240
+ createListingModal$.steps._currentStep.set('createListing');
241
+ generateListingTransactionAsync({
242
+ collectionAddress: createListingModal$.state.collectionAddress.get(),
243
+ contractType: createListingModal$.state.collectionType.get()!,
244
+ orderbook: OrderbookKind.sequence_marketplace_v1,
245
+ walletType: connector?.id as WalletKind,
246
+ listing: {
247
+ tokenId: createListingModal$.state.collectibleId.get(),
248
+ quantity: createListingModal$.state.quantity.get(),
249
+ expiry: createListingModal$.state.expiry.get(),
250
+ currencyAddress:
251
+ createListingModal$.state.listingPrice.currency.contractAddress.get(),
252
+ pricePerToken:
253
+ createListingModal$.state.listingPrice.amountRaw.get() || '1',
254
+ },
255
+ owner: address!,
256
+ })
257
+ .then(async (steps) => {
258
+ const step = steps.find((s) => s.id === StepType.createListing);
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
+ createListingModal$.hash.set(hash);
268
+
269
+ createListingModal$.steps._currentStep.set(null);
270
+
271
+ showTransactionStatusModal({
272
+ hash: hash!,
273
+ price: createListingModal$.state.listingPrice.get(),
274
+ collectionAddress,
275
+ chainId,
276
+ tokenId: collectibleId,
277
+ getTitle: getCreateListingTransactionTitle,
278
+ getMessage: (params) =>
279
+ getCreateListingTransactionMessage(
280
+ params,
281
+ collectible?.name || '',
282
+ ),
283
+ type: 'transfer',
284
+ });
285
+
286
+ createListingModal$.close();
287
+
288
+ onSuccess && onSuccess();
289
+ })
290
+ .catch((error) => {
291
+ onUnknownError && onUnknownError(error);
292
+ });
293
+ },
294
+ });
295
+
296
+ if (generateListingTransactionError) {
297
+ onUnknownError && onUnknownError(generateListingTransactionError);
298
+ }
299
+ };
300
+
301
+ const useShowTransactionStatusModal = () => {
302
+ const { hash } = createListingModal$.get();
303
+ const { collectibleId, chainId, collectionAddress } =
304
+ createListingModal$.state.get();
305
+ const { data: collectible } = useCollectible({
306
+ collectionAddress,
307
+ chainId,
308
+ collectibleId,
309
+ });
310
+
311
+ const { show: showTransactionStatusModal } = useTransactionStatusModal();
312
+
313
+ when(!!hash, () => {
314
+ showTransactionStatusModal({
315
+ hash: hash!,
316
+ collectionAddress,
317
+ chainId,
318
+ price: createListingModal$.state.listingPrice.get(),
319
+ tokenId: collectibleId,
320
+ getTitle: getCreateListingTransactionTitle,
321
+ getMessage: (params) =>
322
+ getCreateListingTransactionMessage(params, collectible?.name || ''),
323
+ type: StepType.createListing,
324
+ });
325
+ });
326
+ };
@@ -0,0 +1,30 @@
1
+ import type { ConfirmationStatus } from '../../_internal/components/transactionStatusModal/store';
2
+
3
+ export const getCreateListingTransactionTitle = (
4
+ params: ConfirmationStatus,
5
+ ) => {
6
+ if (params.isConfirmed) {
7
+ return 'Listing has processed';
8
+ }
9
+
10
+ if (params.isFailed) {
11
+ return 'Listing has failed';
12
+ }
13
+
14
+ return 'Listing is processing';
15
+ };
16
+
17
+ export const getCreateListingTransactionMessage = (
18
+ params: ConfirmationStatus,
19
+ collectibleName: string,
20
+ ) => {
21
+ if (params.isConfirmed) {
22
+ return `You just listed ${collectibleName}. It’s been confirmed on the blockchain!`;
23
+ }
24
+
25
+ if (params.isFailed) {
26
+ return `Your listing of ${collectibleName} has failed. Please try again.`;
27
+ }
28
+
29
+ return `You just listed ${collectibleName}. It should be confirmed on the blockchain shortly.`;
30
+ };
@@ -0,0 +1,146 @@
1
+ import { Box } from '@0xsequence/design-system';
2
+ import { ContractType } from '@internal';
3
+ import { Show, observer } from '@legendapp/state/react';
4
+ import {
5
+ ActionModal,
6
+ type ActionModalProps,
7
+ } from '../_internal/components/actionModal/ActionModal';
8
+ import ExpirationDateSelect from '../_internal/components/expirationDateSelect';
9
+ import FloorPriceText from '../_internal/components/floorPriceText';
10
+ import PriceInput from '../_internal/components/priceInput';
11
+ import QuantityInput from '../_internal/components/quantityInput';
12
+ import TokenPreview from '../_internal/components/tokenPreview';
13
+ import TransactionDetails from '../_internal/components/transactionDetails';
14
+ import { createListingModal$, useHydrate } from './_store';
15
+ import { useAccount } from 'wagmi';
16
+ import { useSwitchChainModal } from '../_internal/components/switchChainModal';
17
+ import type { Messages } from '../../../../types/messages';
18
+
19
+ export type ShowCreateListingModalArgs = {
20
+ collectionAddress: string;
21
+ chainId: string;
22
+ collectibleId: string;
23
+ messages?: Messages;
24
+ };
25
+
26
+ export const useCreateListingModal = () => {
27
+ const { chainId: accountChainId } = useAccount();
28
+ const { show: showSwitchNetworkModal } = useSwitchChainModal();
29
+
30
+ const openModal = (args: ShowCreateListingModalArgs) => {
31
+ createListingModal$.open(args);
32
+ };
33
+
34
+ const handleShowModal = (args: ShowCreateListingModalArgs) => {
35
+ const isSameChain = accountChainId === Number(args.chainId);
36
+
37
+ if (!isSameChain) {
38
+ showSwitchNetworkModal({
39
+ chainIdToSwitchTo: Number(args.chainId),
40
+ onSwitchChain: () => openModal(args),
41
+ messages: args.messages?.switchChain,
42
+ });
43
+ return;
44
+ }
45
+
46
+ openModal(args);
47
+ };
48
+
49
+ return {
50
+ show: handleShowModal,
51
+ close: () => createListingModal$.close(),
52
+ };
53
+ };
54
+
55
+ export const CreateListingModal = () => {
56
+ return (
57
+ <Show if={createListingModal$.isOpen}>
58
+ <Modal />
59
+ </Show>
60
+ );
61
+ };
62
+
63
+ const Modal = () => {
64
+ useHydrate();
65
+ return <ModalContent />;
66
+ };
67
+
68
+ const ModalContent = observer(() => {
69
+ const {
70
+ chainId,
71
+ collectionAddress,
72
+ collectibleId,
73
+ collectionName,
74
+ collectionType,
75
+ listingPrice,
76
+ } = createListingModal$.state.get();
77
+
78
+ const { steps } = createListingModal$.get();
79
+
80
+ const ctas = [
81
+ {
82
+ label: 'Approve TOKEN',
83
+ onClick: steps.tokenApproval.execute,
84
+ hidden: !steps.tokenApproval.isNeeded(),
85
+ pending: steps.tokenApproval.pending,
86
+ variant: 'glass' as const,
87
+ },
88
+ {
89
+ label: 'List item for sale',
90
+ onClick: steps.createListing.execute,
91
+ pending: steps.createListing.pending,
92
+ disabled:
93
+ steps.tokenApproval.isNeeded() || listingPrice.amountRaw === '0',
94
+ },
95
+ ] satisfies ActionModalProps['ctas'];
96
+
97
+ return (
98
+ <ActionModal
99
+ store={createListingModal$}
100
+ onClose={() => createListingModal$.close()}
101
+ title="List item for sale"
102
+ ctas={ctas}
103
+ >
104
+ <TokenPreview
105
+ collectionName={collectionName}
106
+ collectionAddress={collectionAddress}
107
+ collectibleId={collectibleId}
108
+ chainId={chainId}
109
+ />
110
+
111
+ <Box display="flex" flexDirection="column" width="full" gap="1">
112
+ <PriceInput
113
+ chainId={chainId}
114
+ collectionAddress={collectionAddress}
115
+ $listingPrice={createListingModal$.state.listingPrice}
116
+ />
117
+ {!!listingPrice && (
118
+ <FloorPriceText
119
+ tokenId={collectibleId}
120
+ chainId={chainId}
121
+ collectionAddress={collectionAddress}
122
+ price={listingPrice}
123
+ />
124
+ )}
125
+ </Box>
126
+
127
+ {collectionType === ContractType.ERC1155 && (
128
+ <QuantityInput
129
+ chainId={chainId}
130
+ collectionAddress={collectionAddress}
131
+ collectibleId={collectibleId}
132
+ $quantity={createListingModal$.state.quantity}
133
+ />
134
+ )}
135
+
136
+ <ExpirationDateSelect $date={createListingModal$.state.expiry} />
137
+
138
+ <TransactionDetails
139
+ collectibleId={collectibleId}
140
+ collectionAddress={collectionAddress}
141
+ chainId={chainId}
142
+ price={createListingModal$.state.listingPrice.get()}
143
+ />
144
+ </ActionModal>
145
+ );
146
+ });