@tradeport/sui-trading-sdk 0.5.1 → 0.5.3

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 (154) hide show
  1. package/dist/index.js +19 -1
  2. package/dist/index.js.map +1 -1
  3. package/package.json +71 -66
  4. package/.babel.config.js +0 -3
  5. package/.claude/settings.json +0 -5
  6. package/.env.demo +0 -5
  7. package/.eslintrc.json +0 -46
  8. package/.prettierignore +0 -4
  9. package/.prettierrc.json +0 -7
  10. package/.vscode/launch.json +0 -23
  11. package/CHANGELOG.md +0 -746
  12. package/dist/index.d.mts +0 -193
  13. package/dist/index.mjs +0 -7386
  14. package/dist/index.mjs.map +0 -1
  15. package/jest.config.js +0 -12
  16. package/src/SuiTradingClient.ts +0 -442
  17. package/src/apiClients/createKioskClient.ts +0 -10
  18. package/src/apiClients/createSuiClient.ts +0 -5
  19. package/src/apiClients/graphqlClient.ts +0 -17
  20. package/src/bigNumberConfig.ts +0 -10
  21. package/src/constants.ts +0 -1052
  22. package/src/graphql/createChainGQLQuery.ts +0 -27
  23. package/src/graphql/gqlChainRequest.ts +0 -21
  24. package/src/graphql/queries/fetchAccountKiosks.ts +0 -12
  25. package/src/graphql/queries/fetchActiveLockStateByNftId.ts +0 -15
  26. package/src/graphql/queries/fetchBidsById.ts +0 -36
  27. package/src/graphql/queries/fetchCollectionBidById.ts +0 -21
  28. package/src/graphql/queries/fetchCollectionBidsAtSamePrice.ts +0 -29
  29. package/src/graphql/queries/fetchCollectionChainState.ts +0 -17
  30. package/src/graphql/queries/fetchCollectionFloorListingForMarket.ts +0 -28
  31. package/src/graphql/queries/fetchCollectionFloorListings.ts +0 -15
  32. package/src/graphql/queries/fetchCollectionsById.ts +0 -39
  33. package/src/graphql/queries/fetchCommissionByListingId.ts +0 -13
  34. package/src/graphql/queries/fetchCryptoToUsdRate.ts +0 -13
  35. package/src/graphql/queries/fetchKiosksByOwner.ts +0 -14
  36. package/src/graphql/queries/fetchListingsById.ts +0 -29
  37. package/src/graphql/queries/fetchListingsByNftId.ts +0 -23
  38. package/src/graphql/queries/fetchLockById.ts +0 -23
  39. package/src/graphql/queries/fetchMultibidById.ts +0 -34
  40. package/src/graphql/queries/fetchNftCollectionChainState.ts +0 -12
  41. package/src/graphql/queries/fetchNftsById.ts +0 -75
  42. package/src/graphql/queries/fetchNftsByKioskId.ts +0 -45
  43. package/src/graphql/queries/fetchOwnerCapByKiosk.ts +0 -10
  44. package/src/graphql/queries/fetchPersonalCapByKiosk.ts +0 -10
  45. package/src/graphql/queries/fetchSharedObjectsByType.ts +0 -12
  46. package/src/graphql/queries/fetchTransferPoliciesByType.ts +0 -12
  47. package/src/graphql/queries/fetchWalletKiosks.ts +0 -14
  48. package/src/graphql/queries/getCommissionByListingId.ts +0 -15
  49. package/src/helpers/addOneDollarFee.ts +0 -17
  50. package/src/helpers/addThirdPartyTxFee.ts +0 -17
  51. package/src/helpers/calculatePremium.ts +0 -9
  52. package/src/helpers/calculateRoyaltyFee.ts +0 -28
  53. package/src/helpers/destroyZeroCoin.ts +0 -14
  54. package/src/helpers/getActiveLockStateByNftId.ts +0 -15
  55. package/src/helpers/getCollectionChainState.ts +0 -31
  56. package/src/helpers/getCollectionFloorPrice.ts +0 -12
  57. package/src/helpers/getLockById.ts +0 -29
  58. package/src/helpers/getMarketFeePrice.ts +0 -82
  59. package/src/helpers/getNftType.ts +0 -38
  60. package/src/helpers/getRoyaltyRuleModule.ts +0 -7
  61. package/src/helpers/getSharedObjects.ts +0 -119
  62. package/src/helpers/getSuiToUsdRate.ts +0 -14
  63. package/src/helpers/getTradeportBiddingContractBidAmount.ts +0 -31
  64. package/src/helpers/getTransferPolicyRuleNamesFromSuiObject.ts +0 -24
  65. package/src/helpers/hasPersonalKioskRule.ts +0 -7
  66. package/src/helpers/hasRoyaltyRule.ts +0 -7
  67. package/src/helpers/hasTransferPolicyRules.ts +0 -6
  68. package/src/helpers/isExpiredListing.ts +0 -9
  69. package/src/helpers/isNonKioskListing.ts +0 -14
  70. package/src/helpers/isSIngleBid.ts +0 -13
  71. package/src/helpers/kiosk/assertNftInSharedKiosk.ts +0 -31
  72. package/src/helpers/kiosk/getKioskCollectionRoyaltyFeeAmount.ts +0 -71
  73. package/src/helpers/kiosk/getKioskIdFromKioskTx.ts +0 -29
  74. package/src/helpers/kiosk/getKioskPlaceBidCoin.ts +0 -59
  75. package/src/helpers/kiosk/getNativeKioskTransferPolicies.ts +0 -29
  76. package/src/helpers/kiosk/getNativeKioskTransferPoliciesByNftType.ts +0 -21
  77. package/src/helpers/kiosk/getRulePackageId.ts +0 -59
  78. package/src/helpers/kiosk/getTransferPoliciesToResolve.ts +0 -154
  79. package/src/helpers/kiosk/isBluemoveKioskBid.ts +0 -1
  80. package/src/helpers/kiosk/isTradePortKioskBid.ts +0 -4
  81. package/src/helpers/kiosk/kioskListingBcs.ts +0 -19
  82. package/src/helpers/kiosk/kioskTxWrapper.ts +0 -152
  83. package/src/helpers/kiosk/lockNftInsideKioskIfNotLocked.ts +0 -100
  84. package/src/helpers/kiosk/preProcessSharedBulkBuyingData.ts +0 -171
  85. package/src/helpers/kiosk/resolveCustomTransferPolicyRules.ts +0 -75
  86. package/src/helpers/kiosk/resolveFloorPriceRule.ts +0 -21
  87. package/src/helpers/kiosk/resolveKioskLockRule.ts +0 -47
  88. package/src/helpers/kiosk/resolvePersonalKioskRule.ts +0 -23
  89. package/src/helpers/kiosk/resolveRoyaltyRule.ts +0 -57
  90. package/src/helpers/kiosk/resolveTableAllowlistRule.ts +0 -34
  91. package/src/helpers/kiosk/resolveTransferPolicies.ts +0 -158
  92. package/src/helpers/kiosk/sharedKioskState.type.ts +0 -11
  93. package/src/helpers/kiosk/takeAndBorrowNftFromKiosk.ts +0 -50
  94. package/src/helpers/kiosk/takeLockedNftFromKiosk.ts +0 -73
  95. package/src/helpers/kiosk/upgradeKioskRulesPackageId.ts +0 -17
  96. package/src/helpers/originByte/confirmOBTranfer.ts +0 -33
  97. package/src/helpers/originByte/createOBKiosk.ts +0 -14
  98. package/src/helpers/originByte/depositNftIntoOBKiosk.ts +0 -16
  99. package/src/helpers/originByte/getOBBidderKiosk.ts +0 -12
  100. package/src/helpers/originByte/getOBKiosk.ts +0 -24
  101. package/src/helpers/originByte/getOrCreateOBKiosk.ts +0 -42
  102. package/src/helpers/originByte/isOBKiosk.ts +0 -13
  103. package/src/helpers/originByte/isOriginByteBid.ts +0 -6
  104. package/src/helpers/originByte/isOriginByteCollection.ts +0 -11
  105. package/src/helpers/originByte/shareOriginByteKiosk.ts +0 -14
  106. package/src/helpers/rpc/getAcountBalance.ts +0 -18
  107. package/src/helpers/rpc/getObjectType.ts +0 -25
  108. package/src/helpers/splitCoins.ts +0 -12
  109. package/src/helpers/track.ts +0 -20
  110. package/src/helpers/validateMinFloorPrice.ts +0 -22
  111. package/src/index.ts +0 -2
  112. package/src/methods/acceptCollectionBid/acceptCollectionBid.ts +0 -189
  113. package/src/methods/acceptCollectionBid/addAcceptCollectionBIdTxs.ts +0 -398
  114. package/src/methods/acceptNftBids/acceptNftBids.ts +0 -174
  115. package/src/methods/acceptNftBids/addAcceptNftBidTxs.ts +0 -438
  116. package/src/methods/applyFtStrategy/applyFtStrategy.ts +0 -55
  117. package/src/methods/applyNftStrategy/applyNftStrategy.ts +0 -90
  118. package/src/methods/buyListings/addBuyListingTxs.ts +0 -803
  119. package/src/methods/buyListings/buyListings.ts +0 -230
  120. package/src/methods/cancelMultiBid/cancelMultiBid.ts +0 -51
  121. package/src/methods/cancelNftTransfers/addCancelNftTransfersTx.ts +0 -20
  122. package/src/methods/cancelNftTransfers/cancelNftTransfers.ts +0 -118
  123. package/src/methods/claimNfts/addClaimNftsTxs.ts +0 -247
  124. package/src/methods/claimNfts/claimNfts.ts +0 -270
  125. package/src/methods/createMultiBid/createMultiBid.ts +0 -36
  126. package/src/methods/listNfts/addListTxs.ts +0 -210
  127. package/src/methods/listNfts/addRelistTxs.ts +0 -87
  128. package/src/methods/listNfts/listNfts.ts +0 -152
  129. package/src/methods/migrateNftsFromUnsharedToSharedKiosks/migrateNftsFromUnsharedToSharedKiosks.ts +0 -226
  130. package/src/methods/placeCollectionBids/addPlaceCollectionBidTxs.ts +0 -149
  131. package/src/methods/placeCollectionBids/placeCollectionBids.ts +0 -153
  132. package/src/methods/placeNftBids/addPlaceNftBidTxs.ts +0 -154
  133. package/src/methods/placeNftBids/placeNftBids.ts +0 -111
  134. package/src/methods/relistNft/relistNft.ts +0 -153
  135. package/src/methods/removeCollectionBids/addRemoveCollectionBidsTxs.ts +0 -132
  136. package/src/methods/removeCollectionBids/removeCollectionBids.ts +0 -117
  137. package/src/methods/removeNftBids/addRemoveNftBidTxs.ts +0 -122
  138. package/src/methods/removeNftBids/removeNftBids.ts +0 -116
  139. package/src/methods/sponsorNftListing/addSponsorNftListingTx.ts +0 -40
  140. package/src/methods/sponsorNftListing/sponsorNftListing.ts +0 -60
  141. package/src/methods/transferNfts/addTransferNftTx.ts +0 -220
  142. package/src/methods/transferNfts/transferNfts.ts +0 -216
  143. package/src/methods/unlistListings/addUnlistListingTxs.ts +0 -399
  144. package/src/methods/unlistListings/unlistListings.ts +0 -158
  145. package/src/methods/updateMultiBid/updateMultiBid.ts +0 -66
  146. package/src/methods/withdrawProfitsFromKiosks/withdrawProfitsFromKiosks.ts +0 -100
  147. package/src/tests/SuiWallet.ts +0 -83
  148. package/src/utils/addHexPrefix.ts +0 -7
  149. package/src/utils/addLeadingZerosAfter0x.ts +0 -9
  150. package/src/utils/normalizeNftType.ts +0 -7
  151. package/src/utils/printTxBlockTxs.ts +0 -11
  152. package/src/utils/pureValues.ts +0 -13
  153. package/src/utils/toUint8Array.ts +0 -12
  154. package/tsconfig.json +0 -16
@@ -1,803 +0,0 @@
1
- import { bcs } from '@mysten/sui/bcs';
2
- import { KioskListing } from '../../helpers/kiosk/kioskListingBcs';
3
- import {
4
- BLUEMOVE_CREATOR_CONFIG_OBJECT,
5
- BLUEMOVE_KIOSK_MARKETPLACE_KIOSK_OBJECT,
6
- BLUEMOVE_MARKET_CONFIG_OBJECT,
7
- BLUEMOVE_ROYALTY_COLLECTION_OBJECT,
8
- HYPERSPACE_MP_TRANSFER_POLICY_TYPE,
9
- HYPERSPACE_TRANSFER_POLICY_TYPE,
10
- KEEPSAKE_MARKETPLACE_KIOSK,
11
- KEEPSAKE_MARKETPLACE_OBJECT,
12
- NON_KIOSK_LISTING_NONCE_TYPE,
13
- SOUFFL3_EXTENSION_OBJECT,
14
- SOUFFL3_GENERIC_BUY_METHOD_COLLECTIONS,
15
- SOUFFL3_MARKETPLACE_OBJECT,
16
- SOUFFL3_VERSION_OBJECT,
17
- TOCEN_MARKETPLACE_OBJECT,
18
- TRADEPORT_LISTINGS_DEFAULT_COMMISSION_BPS,
19
- TRADEPORT_KIOSK_LISTING_STORE,
20
- TRADEPORT_LISTING_STORE,
21
- TRADEPORT_LISTINGS_PACKAGE,
22
- CUSTOM_TRANSFER_RULES_BY_COLLECTION,
23
- TRADEPORT_LISTINGS_STORE,
24
- XOCIETY_FRONTIER_COLLECTION_ID,
25
- TRADEPORT_ORDERBOOK_STORE,
26
- } from '../../constants';
27
- import { getCommissionByNftContractId } from '../../graphql/queries/getCommissionByListingId';
28
- import { destroyZeroCoin } from '../../helpers/destroyZeroCoin';
29
- import { getMarketFeePrice } from '../../helpers/getMarketFeePrice';
30
- import { getSharedObjects } from '../../helpers/getSharedObjects';
31
- import { assertNftInSharedKiosk } from '../../helpers/kiosk/assertNftInSharedKiosk';
32
- import { getNativeKioskTransferPolicies } from '../../helpers/kiosk/getNativeKioskTransferPolicies';
33
- import { kioskTxWrapper } from '../../helpers/kiosk/kioskTxWrapper';
34
- import { resolveCustomTransferPolicyRules } from '../../helpers/kiosk/resolveCustomTransferPolicyRules';
35
- import { resolveTransferPolicies } from '../../helpers/kiosk/resolveTransferPolicies';
36
- import { confirmOBTranfer } from '../../helpers/originByte/confirmOBTranfer';
37
- import { getOrCreateOBKiosk } from '../../helpers/originByte/getOrCreateOBKiosk';
38
- import { isOriginByteCollection } from '../../helpers/originByte/isOriginByteCollection';
39
- import { shareOriginByteKiosk } from '../../helpers/originByte/shareOriginByteKiosk';
40
- import { addLeadingZerosAfter0x } from '../../utils/addLeadingZerosAfter0x';
41
- import { type BuyTx, type TocenBuyTx } from './buyListings';
42
- import BigNumber from '../../bigNumberConfig';
43
- import { calculateRoyaltyFee } from '../../helpers/calculateRoyaltyFee';
44
- import { getCollectionChainState } from '../../helpers/getCollectionChainState';
45
- import { normalizeSuiObjectId } from '@mysten/sui/utils';
46
- import { applyFtStrategy } from '../applyFtStrategy/applyFtStrategy';
47
-
48
- export function addLegacyTradePortBuyTx({
49
- tx,
50
- nftType,
51
- listingNonce,
52
- price,
53
- sharedObjects,
54
- coinToSplit,
55
- }: BuyTx) {
56
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(price)]);
57
-
58
- if (!coin) throw new Error('Coin could not be split');
59
-
60
- const { collection, royaltyStrategy } = sharedObjects;
61
- if (collection && royaltyStrategy) {
62
- tx.moveCall({
63
- target:
64
- '0xb42dbb7413b79394e1a0175af6ae22b69a5c7cc5df259cd78072b6818217c027::listings::ob_buy',
65
- arguments: [
66
- tx.object(TRADEPORT_LISTING_STORE),
67
- tx.pure.address(listingNonce),
68
- tx.object(coin),
69
- tx.object(collection),
70
- tx.object(royaltyStrategy),
71
- ],
72
- typeArguments: [nftType],
73
- });
74
- } else {
75
- tx.moveCall({
76
- target: '0xb42dbb7413b79394e1a0175af6ae22b69a5c7cc5df259cd78072b6818217c027::listings::buy',
77
- arguments: [
78
- tx.object(TRADEPORT_LISTING_STORE),
79
- tx.pure.address(listingNonce),
80
- tx.object(coin),
81
- ],
82
- typeArguments: [nftType],
83
- });
84
- }
85
-
86
- destroyZeroCoin({ tx, coin });
87
- }
88
-
89
- export const addLegacyTradeportKioskBuyTx = async ({
90
- tx,
91
- transferPolicies,
92
- kioskTx,
93
- suiClient,
94
- kioskClient,
95
- listingId,
96
- nftType,
97
- nftTokenId,
98
- price,
99
- sellerKiosk,
100
- seller,
101
- coinToSplit,
102
- beforeResolveKioskTransferRequest,
103
- sharedBulkBuyingDataByNftType,
104
- collectionId,
105
- }: BuyTx) => {
106
- let commissionFeeAmount: number =
107
- sharedBulkBuyingDataByNftType?.[nftType]?.commissionFeeAmountsByListingId?.[listingId] ?? 0;
108
-
109
- if (!commissionFeeAmount) {
110
- try {
111
- const { object } = await suiClient.core.getDynamicObjectField({
112
- parentId: TRADEPORT_KIOSK_LISTING_STORE,
113
- name: { type: '0x2::object::ID', bcs: bcs.Address.serialize(nftTokenId).toBytes() },
114
- include: { content: true },
115
- });
116
- commissionFeeAmount = Number(KioskListing.parse(object.content).commission);
117
- } catch {
118
- throw new Error(`Not found kiosk listing object of token ${nftTokenId}`);
119
- }
120
- }
121
-
122
- if (commissionFeeAmount === 0) {
123
- // Fallback to default commission if had trouble fetching commission from dynamic field object
124
- commissionFeeAmount = getMarketFeePrice({ price, collectionId });
125
- }
126
-
127
- const coin = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [
128
- tx.pure.u64(price + commissionFeeAmount),
129
- ]);
130
-
131
- if (!coin) throw new Error('Coin could not be split');
132
-
133
- const [kioskItem, transferRequest] = tx.moveCall({
134
- target:
135
- '0x475e98e9c436ec118909f3b9e241d86bcbbc2cf9fba05e99a934823fefb375b7::kiosk_listings::buy',
136
- arguments: [
137
- tx.object(TRADEPORT_KIOSK_LISTING_STORE),
138
- tx.object(sellerKiosk),
139
- tx.object(kioskTx.kiosk),
140
- tx.pure.address(nftTokenId),
141
- tx.object(coin),
142
- ],
143
- typeArguments: [nftType],
144
- });
145
-
146
- await resolveTransferPolicies({
147
- tx,
148
- transferPolicies,
149
- suiClient,
150
- walletAddress: seller,
151
- kioskTx,
152
- kioskClient,
153
- nftType,
154
- price: price?.toString(),
155
- kioskItem,
156
- transferRequest,
157
- coinToSplit,
158
- beforeResolveKioskTransferRequest,
159
- transferPoliciesToResolve: sharedBulkBuyingDataByNftType?.[nftType]?.transferPoliciesToResolve,
160
- royaltyFeeAmount:
161
- sharedBulkBuyingDataByNftType?.[nftType]?.royaltyFeeAmountsByListingId?.[listingId],
162
- });
163
-
164
- destroyZeroCoin({ tx, coin });
165
- };
166
-
167
- export async function addTradePortBuyTx({ tx, nftType, nftTokenId, price, coinToSplit }: BuyTx) {
168
- const marketFee = new BigNumber(price)
169
- .times(TRADEPORT_LISTINGS_DEFAULT_COMMISSION_BPS)
170
- .div(10_000)
171
- .integerValue(BigNumber.ROUND_DOWN)
172
- .toNumber();
173
- const totalAmount = new BigNumber(price).plus(marketFee).toNumber();
174
-
175
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(totalAmount)]);
176
-
177
- if (!coin) throw new Error('Coin could not be split');
178
-
179
- tx.moveCall({
180
- target: `${TRADEPORT_LISTINGS_PACKAGE}::tradeport_listings::buy_ob_listing_without_transfer_policy`,
181
- arguments: [
182
- tx.object(TRADEPORT_LISTINGS_STORE),
183
- tx.object(TRADEPORT_ORDERBOOK_STORE),
184
- tx.pure.id(nftTokenId),
185
- tx.object(coin),
186
- ],
187
- typeArguments: [nftType],
188
- });
189
-
190
- destroyZeroCoin({ tx, coin });
191
- }
192
-
193
- export async function addKioskTradePortBuyTx({
194
- tx,
195
- transferPolicies,
196
- kioskTx,
197
- nftType,
198
- nftTokenId,
199
- price,
200
- sellerKiosk,
201
- coinToSplit,
202
- buyer,
203
- collectionId,
204
- }: BuyTx) {
205
- const transferPolicyId = getNativeKioskTransferPolicies(transferPolicies)?.at(0)?.id;
206
-
207
- const marketFee = new BigNumber(price)
208
- .times(TRADEPORT_LISTINGS_DEFAULT_COMMISSION_BPS)
209
- .div(10000)
210
- .integerValue(BigNumber.ROUND_DOWN);
211
-
212
- const royaltyFee = calculateRoyaltyFee(
213
- getNativeKioskTransferPolicies(transferPolicies)?.at(0)?.rules,
214
- new BigNumber(price),
215
- );
216
-
217
- const totalAmount = new BigNumber(price).plus(marketFee).plus(royaltyFee).toNumber();
218
-
219
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(totalAmount)]);
220
-
221
- if (!coin) throw new Error('Coin could not be split');
222
-
223
- const transferRequest = tx.moveCall({
224
- target: `${TRADEPORT_LISTINGS_PACKAGE}::tradeport_listings::buy_ob_listing_with_transfer_policy`,
225
- arguments: [
226
- tx.object(TRADEPORT_LISTINGS_STORE),
227
- tx.object(TRADEPORT_ORDERBOOK_STORE),
228
- tx.object(sellerKiosk),
229
- tx.object(kioskTx.kiosk),
230
- tx.object(kioskTx.kioskCap),
231
- tx.pure.address(buyer),
232
- tx.pure.id(nftTokenId),
233
- tx.object(coin),
234
- tx.object(transferPolicyId),
235
- ],
236
- typeArguments: [nftType],
237
- });
238
-
239
- // Resolve custom transfer policy rules if this collection has any
240
- const customRuleConfigs = CUSTOM_TRANSFER_RULES_BY_COLLECTION[collectionId];
241
- if (customRuleConfigs?.length > 0) {
242
- resolveCustomTransferPolicyRules({
243
- tx,
244
- rules: customRuleConfigs.map((config) => ({
245
- rule: `${config.packageId}::${config.moduleName}`,
246
- rulePackageId: config.packageId,
247
- moduleName: config.moduleName,
248
- params: config.params,
249
- })),
250
- transferRequest,
251
- nftType,
252
- policyId: transferPolicyId,
253
- });
254
- }
255
-
256
- tx.moveCall({
257
- target: '0x2::transfer_policy::confirm_request',
258
- arguments: [tx.object(transferPolicyId), transferRequest],
259
- typeArguments: [nftType],
260
- });
261
-
262
- destroyZeroCoin({ tx, coin });
263
- }
264
-
265
- export async function addOriginByteBuyTx({
266
- tx,
267
- sharedObjects,
268
- buyer,
269
- sellerKiosk,
270
- seller,
271
- nftTokenId,
272
- nftType,
273
- listingNonce,
274
- price,
275
- sharedKioskState,
276
- coinToSplit,
277
- }: BuyTx) {
278
- await assertNftInSharedKiosk({
279
- kioskId: sellerKiosk,
280
- walletAddress: seller,
281
- sharedKioskState,
282
- });
283
-
284
- const { orderbook } = sharedObjects;
285
- const { kiosk: buyerKiosk, isNewKiosk: isNewBuyerKiosk } = await getOrCreateOBKiosk({
286
- tx,
287
- address: buyer,
288
- sharedKioskState,
289
- });
290
-
291
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(price)]);
292
-
293
- if (!coin) throw new Error('Coin could not be split');
294
-
295
- const transferRequest = tx.moveCall({
296
- target:
297
- '0x8534e4cdfd28709c94330a9783c3d5fe6f5daba0bffb69102ce303c5b38aed5a::orderbook::buy_nft',
298
- arguments: [
299
- tx.object(orderbook),
300
- tx.object(listingNonce),
301
- tx.object(buyerKiosk),
302
- tx.pure.address(nftTokenId),
303
- tx.pure.u64(price),
304
- tx.object(coin),
305
- ],
306
- typeArguments: [nftType, '0x2::sui::SUI'],
307
- });
308
-
309
- confirmOBTranfer({ tx, sharedObjects, transferRequest, nftType });
310
-
311
- destroyZeroCoin({ tx, coin });
312
-
313
- if (isNewBuyerKiosk) {
314
- shareOriginByteKiosk({ tx, kiosk: buyerKiosk });
315
- }
316
- }
317
-
318
- export const addHyperspaceKioskBuyTx = async ({
319
- tx,
320
- transferPolicies,
321
- suiClient,
322
- kioskTx,
323
- kioskClient,
324
- nftType,
325
- nftTokenId,
326
- price,
327
- sellerKiosk,
328
- seller,
329
- beforeResolveKioskTransferRequest,
330
- coinToSplit,
331
- }: BuyTx) => {
332
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(price)]);
333
-
334
- if (!coin) throw new Error('Coin could not be split');
335
-
336
- const [kioskItem, transferRequest, hyperspaceTransferRequest, hyperspaceMpTransferRequest] =
337
- tx.moveCall({
338
- target:
339
- '0x6ea97b03c441edd54ae89224bf9560e583ee66c37e6c246f5db35258e580ba94::hyperspace::purchase',
340
- arguments: [tx.object(sellerKiosk), tx.pure.address(nftTokenId), tx.object(coin)],
341
- typeArguments: [nftType, HYPERSPACE_MP_TRANSFER_POLICY_TYPE],
342
- });
343
-
344
- const customTransferPolicies = [
345
- {
346
- type: HYPERSPACE_TRANSFER_POLICY_TYPE,
347
- transferRequest: hyperspaceTransferRequest,
348
- },
349
- {
350
- type: HYPERSPACE_MP_TRANSFER_POLICY_TYPE,
351
- transferRequest: hyperspaceMpTransferRequest,
352
- },
353
- ].filter((customTransferPolicy) => customTransferPolicy.transferRequest !== transferRequest);
354
-
355
- await beforeResolveKioskTransferRequest?.(transferRequest);
356
-
357
- await resolveTransferPolicies({
358
- tx,
359
- transferPolicies,
360
- suiClient,
361
- walletAddress: seller,
362
- kioskTx,
363
- kioskClient,
364
- nftType,
365
- price: price?.toString(),
366
- kioskItem,
367
- transferRequest,
368
- customTransferPolicies,
369
- });
370
- };
371
-
372
- export function addBluemoveBuyTx({ tx, nftTokenId, nftType, price, coinToSplit }: BuyTx) {
373
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(price)]);
374
-
375
- if (!coin) throw new Error('Coin could not be split');
376
-
377
- tx.moveCall({
378
- target:
379
- '0xd5dd28cc24009752905689b2ba2bf90bfc8de4549b9123f93519bb8ba9bf9981::marketplace::buy_and_take',
380
- arguments: [
381
- tx.object(BLUEMOVE_MARKET_CONFIG_OBJECT),
382
- tx.object(BLUEMOVE_ROYALTY_COLLECTION_OBJECT),
383
- tx.object(BLUEMOVE_CREATOR_CONFIG_OBJECT),
384
- tx.pure.address(nftTokenId),
385
- tx.object(coin),
386
- tx.pure.u64(price),
387
- ],
388
- typeArguments: [nftType, nftType],
389
- });
390
- }
391
-
392
- export async function addBluemoveKioskBuyTx({
393
- tx,
394
- suiClient,
395
- transferPolicies,
396
- kioskTx,
397
- kioskClient,
398
- nftTokenId,
399
- nftType,
400
- price,
401
- sellerKiosk,
402
- seller,
403
- beforeResolveKioskTransferRequest,
404
- coinToSplit,
405
- }: BuyTx) {
406
- const transferPolicyId = getNativeKioskTransferPolicies(transferPolicies)?.at(0)?.id;
407
-
408
- const [coin1, coin2] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [
409
- tx.pure.u64(price),
410
- tx.pure.u64(price * 0.025),
411
- ]);
412
-
413
- if (!coin1 || !coin2) throw new Error('Coin could not be split');
414
-
415
- tx.mergeCoins(tx.object(coin1), [tx.object(coin2)]);
416
-
417
- const [kioskItem, transferRequest] = tx.moveCall({
418
- target:
419
- '0xcc97b74ed95c8e8a3ed88050a898727dee37896da579fc400d482b64db6149ff::kiosk_trade::kiosk_buy_v2',
420
- arguments: [
421
- tx.object(BLUEMOVE_KIOSK_MARKETPLACE_KIOSK_OBJECT),
422
- tx.object(sellerKiosk),
423
- tx.object(transferPolicyId),
424
- tx.object(kioskTx.kiosk),
425
- tx.pure.address(nftTokenId),
426
- tx.pure.u64(price),
427
- tx.object(coin1),
428
- ],
429
- typeArguments: [nftType],
430
- });
431
- await beforeResolveKioskTransferRequest?.(transferRequest);
432
- await resolveTransferPolicies({
433
- tx,
434
- transferPolicies,
435
- suiClient,
436
- walletAddress: seller,
437
- kioskTx,
438
- kioskClient,
439
- nftType,
440
- price: price?.toString(),
441
- kioskItem,
442
- transferRequest,
443
- });
444
- }
445
-
446
- export async function addSouffl3BuyTx({
447
- tx,
448
- nftType,
449
- price,
450
- listingNonce,
451
- collectionId,
452
- transferPolicies,
453
- coinToSplit,
454
- }: BuyTx) {
455
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(price)]);
456
-
457
- const transferPolicyId = getNativeKioskTransferPolicies(transferPolicies)?.at(0)?.id;
458
-
459
- if (transferPolicyId && !SOUFFL3_GENERIC_BUY_METHOD_COLLECTIONS?.includes(collectionId)) {
460
- const [coinToDestroy] = tx.moveCall({
461
- target:
462
- '0x30d90b5b67be77e6e06f02dae9f0f2fcdad16e38854316ae8a7b4f5b4971f5e0::Market::buy_with_sui_with_ext',
463
- arguments: [
464
- tx.object(SOUFFL3_VERSION_OBJECT),
465
- tx.object(SOUFFL3_EXTENSION_OBJECT),
466
- tx.object(transferPolicyId),
467
- tx.object(listingNonce),
468
- tx.pure.u64(price),
469
- tx.object(SOUFFL3_MARKETPLACE_OBJECT),
470
- tx.object(coin),
471
- ],
472
- typeArguments: [nftType],
473
- });
474
-
475
- destroyZeroCoin({ tx, coin: coinToDestroy });
476
- } else {
477
- const [coinToDestroy] = tx.moveCall({
478
- target:
479
- '0x30d90b5b67be77e6e06f02dae9f0f2fcdad16e38854316ae8a7b4f5b4971f5e0::Market::buy_generic_with_ext',
480
- arguments: [
481
- tx.object(SOUFFL3_VERSION_OBJECT),
482
- tx.object(SOUFFL3_EXTENSION_OBJECT),
483
- tx.object(listingNonce),
484
- tx.pure.u64(price),
485
- tx.object(SOUFFL3_MARKETPLACE_OBJECT),
486
- tx.object(coin),
487
- ],
488
- typeArguments: [nftType, '0x2::sui::SUI'],
489
- });
490
-
491
- destroyZeroCoin({ tx, coin: coinToDestroy });
492
- }
493
- }
494
-
495
- export function addSomisBuyTx({
496
- tx,
497
- sharedObjects,
498
- nftTokenId,
499
- nftType,
500
- price,
501
- coinToSplit,
502
- }: BuyTx) {
503
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(price)]);
504
-
505
- if (!coin) throw new Error('Coin could not be split');
506
-
507
- tx.moveCall({
508
- target:
509
- '0xf0b0beb956e26bde50dbd6ac393026c4525aee3b194a9478f09748f7211b5a02::marketplace::buy_nft',
510
- arguments: [
511
- tx.object(sharedObjects?.marketplace),
512
- tx.pure.address(nftTokenId),
513
- tx.object(coin),
514
- ],
515
- typeArguments: [nftType, '0x2::sui::SUI'],
516
- });
517
- }
518
-
519
- export async function addKeepsakeBuyTx({
520
- tx,
521
- sharedObjects,
522
- buyer,
523
- nftTokenId,
524
- nftType,
525
- price,
526
- royalty,
527
- transferPolicies,
528
- coinToSplit,
529
- }: BuyTx) {
530
- const { keepsakeRoyaltyStrategy } = sharedObjects;
531
- const transferPolicyId = getNativeKioskTransferPolicies(transferPolicies)?.at(0)?.id;
532
-
533
- const [coin1, coin2] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [
534
- tx.pure.u64(price),
535
- tx.pure.u64((price * Number(royalty)) / 100 + price * Number(royalty) * 0.00005),
536
- ]);
537
-
538
- if (!coin1 || !coin2) throw new Error('Coin could not be split');
539
-
540
- const [balance] = tx.moveCall({
541
- target: '0x2::coin::into_balance',
542
- arguments: [tx.object(coin2)],
543
- typeArguments: ['0x2::sui::SUI'],
544
- });
545
-
546
- if (!balance) throw new Error('Coin into_balance failed');
547
-
548
- const [transferRequest] = tx.moveCall({
549
- target:
550
- '0x02be8c4a1a3cea4d3255d870d367c87838a8cc2bfe4f216a6b67b153027087a7::keepsake_marketplace::buy',
551
- arguments: [
552
- tx.object(KEEPSAKE_MARKETPLACE_OBJECT),
553
- tx.object(KEEPSAKE_MARKETPLACE_KIOSK),
554
- tx.pure.address(nftTokenId),
555
- tx.object(coin1),
556
- ],
557
- typeArguments: [nftType],
558
- });
559
-
560
- if (!transferRequest) throw new Error('Transfer request could not be created');
561
-
562
- tx.moveCall({
563
- target:
564
- '0x02be8c4a1a3cea4d3255d870d367c87838a8cc2bfe4f216a6b67b153027087a7::keepsake_royalties::confirm_transfer_with_balance',
565
- arguments: [tx.object(keepsakeRoyaltyStrategy), tx.object(transferRequest), tx.object(balance)],
566
- typeArguments: [nftType],
567
- });
568
-
569
- tx.moveCall({
570
- target:
571
- '0x02be8c4a1a3cea4d3255d870d367c87838a8cc2bfe4f216a6b67b153027087a7::transfer_policy::confirm_request',
572
- arguments: [tx.object(transferPolicyId), tx.object(transferRequest)],
573
- typeArguments: [nftType],
574
- });
575
-
576
- const [balanceToTransfer] = tx.moveCall({
577
- target: '0x2::coin::from_balance',
578
- arguments: [tx.object(balance)],
579
- typeArguments: ['0x2::sui::SUI'],
580
- });
581
-
582
- if (!balanceToTransfer) throw new Error('Coin from_balance failed');
583
-
584
- tx.transferObjects(
585
- [tx.object(balanceToTransfer)],
586
- tx.pure.address(addLeadingZerosAfter0x(buyer)),
587
- );
588
- }
589
-
590
- export const addTocenBuyTx = ({ tx, nftTokenIds, nftType, price, coinToSplit }: TocenBuyTx) => {
591
- const [coin] = tx.splitCoins(coinToSplit ? coinToSplit : tx.gas, [tx.pure.u64(price)]);
592
-
593
- if (!coin) throw new Error('Coin could not be split');
594
-
595
- tx.moveCall({
596
- target:
597
- '0x3605d91c559e80cf8fdeabae9abaccb0bc38f96eac0b32bf47e95a9159a5277f::tocen_marketplace::buy_cart',
598
- arguments: [
599
- tx.object(TOCEN_MARKETPLACE_OBJECT),
600
- tx.pure(bcs.vector(bcs.Address).serialize(nftTokenIds)),
601
- tx.object(coin),
602
- ],
603
- typeArguments: [nftType],
604
- });
605
- };
606
-
607
- export async function addTradePortBuyTxHandler(txData: BuyTx) {
608
- // If origin byte collection, add origin byte buy tx
609
- if (txData?.listingNonce && isOriginByteCollection(txData?.transferPolicies)) {
610
- const sharedObjects =
611
- txData?.sharedBulkBuyingDataByNftType?.[txData?.nftType]?.sharedObjects ??
612
- (await getSharedObjects(txData?.nftType));
613
- await addOriginByteBuyTx({ ...txData, sharedObjects });
614
-
615
- return;
616
- }
617
-
618
- // If non kiosk listing (nonce starts with "0::")
619
- if (txData?.listingNonce?.startsWith('0::')) {
620
- await addTradePortBuyTx(txData);
621
- return;
622
- }
623
-
624
- // If kiosk listing (nonce starts with "1::")
625
- if (txData?.listingNonce?.startsWith('1::')) {
626
- await kioskTxWrapper({
627
- tx: txData?.tx,
628
- kioskClient: txData?.kioskClient,
629
- kioskOwner: txData?.buyer,
630
- kiosk: txData?.sellerKiosk,
631
- shouldConvertToPersonalKiosk: true,
632
- sharedKioskState: txData?.sharedKioskState,
633
- async runCommands(kioskTx) {
634
- await addKioskTradePortBuyTx({
635
- ...txData,
636
- kioskTx,
637
- });
638
-
639
- // If XOCIETY Frontier collection, take NFT out of kiosk and transfer it back to user (buyer)
640
- if (txData?.collectionId === XOCIETY_FRONTIER_COLLECTION_ID) {
641
- const borrowedItem = kioskTx.take({
642
- itemId: txData?.nftTokenId,
643
- itemType: txData?.nftType,
644
- });
645
-
646
- txData?.tx.transferObjects(
647
- [txData?.tx.object(borrowedItem as any)],
648
- txData?.tx.pure.address(addLeadingZerosAfter0x(txData?.buyer)),
649
- );
650
- }
651
- },
652
- });
653
-
654
- // If seller kiosk is associated with an NFT strategy, apply the strategy after the buy command
655
- const chainState = await getCollectionChainState(txData.collectionId);
656
- const nftStrategies = (chainState?.nft_strategies ?? {}) as Record<
657
- string,
658
- Record<string, unknown>
659
- >;
660
- const normalizedSellerKiosk = normalizeSuiObjectId(txData.sellerKiosk);
661
- for (const [strategyFtType, strategyData] of Object.entries(nftStrategies)) {
662
- const strategyKioskId = (strategyData as { kiosk_id: string }).kiosk_id ?? '0x0';
663
- if (normalizeSuiObjectId(strategyKioskId) === normalizedSellerKiosk) {
664
- await applyFtStrategy({
665
- collectionId: txData.collectionId,
666
- strategyFtType,
667
- tx: txData.tx,
668
- collectionChainState: chainState,
669
- });
670
- break;
671
- }
672
- }
673
-
674
- return;
675
- }
676
-
677
- // Legacy contract logic below
678
- if (txData.listingNonce?.startsWith('0x')) {
679
- const response = await txData?.suiClient.getObject({
680
- objectId: txData.listingNonce,
681
- include: {},
682
- });
683
-
684
- if (response.object.type === NON_KIOSK_LISTING_NONCE_TYPE) {
685
- const sharedObjects =
686
- txData?.sharedBulkBuyingDataByNftType?.[txData?.nftType]?.sharedObjects ??
687
- (await getSharedObjects(txData?.nftType));
688
- addLegacyTradePortBuyTx({ ...txData, sharedObjects });
689
- return;
690
- }
691
- }
692
-
693
- // If legacy kiosk listing
694
- if (txData?.sellerKiosk) {
695
- return kioskTxWrapper({
696
- tx: txData?.tx,
697
- kioskClient: txData?.kioskClient,
698
- kioskOwner: txData?.buyer,
699
- kiosk: txData?.sellerKiosk,
700
- shouldConvertToPersonalKiosk: true,
701
- sharedKioskState: txData?.sharedKioskState,
702
- async runCommands(kioskTx) {
703
- await addLegacyTradeportKioskBuyTx({
704
- ...txData,
705
- kioskTx,
706
- });
707
- },
708
- });
709
- }
710
-
711
- const sharedObjects =
712
- txData?.sharedBulkBuyingDataByNftType?.[txData?.nftType]?.sharedObjects ??
713
- (await getSharedObjects(txData?.nftType));
714
-
715
- // If legacy non kiosk listing
716
- addLegacyTradePortBuyTx({ ...txData, sharedObjects });
717
- }
718
-
719
- export async function addHyperspaceBuyTxHandler(txData: BuyTx) {
720
- if (txData?.listingNonce && isOriginByteCollection(txData?.transferPolicies)) {
721
- const sharedObjects =
722
- txData?.sharedBulkBuyingDataByNftType?.[txData?.nftType]?.sharedObjects ??
723
- (await getSharedObjects(txData?.nftType));
724
- await addOriginByteBuyTx({ ...txData, sharedObjects });
725
-
726
- return;
727
- }
728
-
729
- return kioskTxWrapper({
730
- tx: txData?.tx,
731
- kioskClient: txData?.kioskClient,
732
- kioskOwner: txData?.buyer,
733
- kiosk: txData?.sellerKiosk,
734
- shouldConvertToPersonalKiosk: true,
735
- sharedKioskState: txData?.sharedKioskState,
736
- async runCommands(kioskTx) {
737
- await addHyperspaceKioskBuyTx({
738
- ...txData,
739
- kioskTx,
740
- });
741
- },
742
- });
743
- }
744
-
745
- export async function addBluemoveBuyTxHandler(txData: BuyTx) {
746
- if (txData?.listingNonce && isOriginByteCollection(txData?.transferPolicies)) {
747
- const sharedObjects =
748
- txData?.sharedBulkBuyingDataByNftType?.[txData?.nftType]?.sharedObjects ??
749
- (await getSharedObjects(txData?.nftType));
750
- await addOriginByteBuyTx({ ...txData, sharedObjects });
751
-
752
- return;
753
- }
754
-
755
- if (txData?.sellerKiosk) {
756
- return kioskTxWrapper({
757
- tx: txData?.tx,
758
- kioskClient: txData?.kioskClient,
759
- kioskOwner: txData?.buyer,
760
- kiosk: txData?.sellerKiosk,
761
- shouldConvertToPersonalKiosk: true,
762
- sharedKioskState: txData?.sharedKioskState,
763
- async runCommands(kioskTx) {
764
- await addBluemoveKioskBuyTx({
765
- ...txData,
766
- kioskTx,
767
- });
768
- },
769
- });
770
- }
771
-
772
- addBluemoveBuyTx(txData);
773
- }
774
-
775
- export async function addClutchyBuyTxHandler(txData: BuyTx) {
776
- await addOriginByteBuyTx(txData);
777
- }
778
-
779
- export async function addSouffl3BuyTxHandler(txData: BuyTx) {
780
- await addSouffl3BuyTx(txData);
781
- }
782
-
783
- export async function addSomisBuyTxHandler(txData: BuyTx) {
784
- if (txData?.sharedObjects?.marketplace) {
785
- addSomisBuyTx(txData);
786
- return;
787
- }
788
-
789
- return addOriginByteBuyTx(txData);
790
- }
791
-
792
- export async function addKeepsakeBuyTxHandler(txData: BuyTx) {
793
- const commission = await getCommissionByNftContractId(txData?.nftContractId);
794
-
795
- await addKeepsakeBuyTx({
796
- ...txData,
797
- royalty: commission?.royalty,
798
- });
799
- }
800
-
801
- export function addTocenBuyTxHandler(txData: TocenBuyTx) {
802
- addTocenBuyTx(txData);
803
- }