@tradeport/sui-trading-sdk 0.0.0
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.
- package/.babel.config.js +3 -0
- package/.env.demo +4 -0
- package/.eslintrc.json +46 -0
- package/.prettierignore +4 -0
- package/.prettierrc.json +7 -0
- package/README.md +1 -0
- package/dist/index.d.mts +90 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +3760 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3733 -0
- package/dist/index.mjs.map +1 -0
- package/jest.config.js +7 -0
- package/package.json +45 -0
- package/src/SuiTradingClient.ts +158 -0
- package/src/apiClients/graphqlClient.ts +5 -0
- package/src/apiClients/kioskClient.ts +10 -0
- package/src/apiClients/suiClient.ts +5 -0
- package/src/constants.ts +74 -0
- package/src/graphql/createChainGQLQuery.ts +25 -0
- package/src/graphql/gqlChainRequest.ts +20 -0
- package/src/graphql/queries/fetchAccountKiosks.ts +12 -0
- package/src/graphql/queries/fetchBidsById.ts +28 -0
- package/src/graphql/queries/fetchCollectionBidById.ts +20 -0
- package/src/graphql/queries/fetchCollectionBidsAtSamePrice.ts +28 -0
- package/src/graphql/queries/fetchCollectionsById.ts +30 -0
- package/src/graphql/queries/fetchCommissionByListingId.ts +13 -0
- package/src/graphql/queries/fetchCryptoToUsdRate.ts +13 -0
- package/src/graphql/queries/fetchKiosksByOwner.ts +13 -0
- package/src/graphql/queries/fetchListingsById.ts +24 -0
- package/src/graphql/queries/fetchListingsByNftId.ts +23 -0
- package/src/graphql/queries/fetchNftsById.ts +61 -0
- package/src/graphql/queries/fetchOwnerCapByKiosk.ts +10 -0
- package/src/graphql/queries/fetchPersonalCapByKiosk.ts +10 -0
- package/src/graphql/queries/fetchSharedObjectsByType.ts +12 -0
- package/src/graphql/queries/fetchTransferPoliciesByType.ts +12 -0
- package/src/graphql/queries/getCommissionByListingId.ts +15 -0
- package/src/helpers/addOneDollarFee.ts +17 -0
- package/src/helpers/addThirdPartyTxFee.ts +17 -0
- package/src/helpers/destroyZeroCoin.ts +14 -0
- package/src/helpers/getMarketFeePrice.ts +78 -0
- package/src/helpers/getNftTypeFromNft.ts +8 -0
- package/src/helpers/getSharedObjects.ts +113 -0
- package/src/helpers/getSuiToUsdRate.ts +17 -0
- package/src/helpers/getTradeportBiddingContractParsedBidAmount.ts +32 -0
- package/src/helpers/hasRoyaltyRule.ts +14 -0
- package/src/helpers/hasTransferPolicyRules.ts +21 -0
- package/src/helpers/isNonKioskListing.ts +7 -0
- package/src/helpers/kiosk/getRulePackageId.ts +26 -0
- package/src/helpers/kiosk/isBluemoveKioskBid.ts +1 -0
- package/src/helpers/kiosk/isTradePortKioskBid.ts +4 -0
- package/src/helpers/kiosk/kioskTxWrapper.ts +102 -0
- package/src/helpers/kiosk/resolveFloorPriceRule.ts +25 -0
- package/src/helpers/kiosk/resolveKioskLockRule.ts +49 -0
- package/src/helpers/kiosk/resolvePersonalKioskRule.ts +26 -0
- package/src/helpers/kiosk/resolveRoyaltyRule.ts +41 -0
- package/src/helpers/kiosk/resolveTransferPolicies.ts +150 -0
- package/src/helpers/originByte/confirmOBTranfer.ts +33 -0
- package/src/helpers/originByte/createOBKiosk.ts +14 -0
- package/src/helpers/originByte/depositNftIntoOBKiosk.ts +14 -0
- package/src/helpers/originByte/getOBBidderKiosk.ts +9 -0
- package/src/helpers/originByte/getOBKiosk.ts +24 -0
- package/src/helpers/originByte/getOrCreateOBKiosk.ts +37 -0
- package/src/helpers/originByte/isOBKiosk.ts +13 -0
- package/src/helpers/originByte/isOriginByteBid.ts +6 -0
- package/src/helpers/originByte/isOriginByteTx.ts +2 -0
- package/src/helpers/originByte/shareOriginByteKiosk.ts +14 -0
- package/src/helpers/rpc/getAcountBalance.ts +17 -0
- package/src/helpers/rpc/getObjectType.ts +10 -0
- package/src/helpers/splitCoins.ts +12 -0
- package/src/index.ts +3 -0
- package/src/methods/acceptCollectionBid/acceptCollectionBid.ts +119 -0
- package/src/methods/acceptCollectionBid/addAcceptCollectionBIdTxs.ts +359 -0
- package/src/methods/acceptNftBids/acceptNftBids.ts +100 -0
- package/src/methods/acceptNftBids/addAcceptNftBidTxs.ts +214 -0
- package/src/methods/buyListings/addBuyListingTxs.ts +503 -0
- package/src/methods/buyListings/buyListings.ts +143 -0
- package/src/methods/claimNfts/addClaimNftsTxs.ts +104 -0
- package/src/methods/claimNfts/claimNfts.ts +139 -0
- package/src/methods/listNfts/addListTxs.ts +186 -0
- package/src/methods/listNfts/addRelistTxs.ts +79 -0
- package/src/methods/listNfts/listNfts.ts +80 -0
- package/src/methods/placeCollectionBids/addPlaceCollectionBidTxs.ts +146 -0
- package/src/methods/placeCollectionBids/placeCollectionBids.ts +120 -0
- package/src/methods/placeNftBids/addPlaceNftBidTxs.ts +146 -0
- package/src/methods/placeNftBids/placeNftBids.ts +69 -0
- package/src/methods/relistNft/relistNft.ts +104 -0
- package/src/methods/removeCollectionBid/addRemoveCollectionBidTxs.ts +119 -0
- package/src/methods/removeCollectionBid/removeCollectionBid.ts +97 -0
- package/src/methods/removeNftBids/addRemoveNftBidTxs.ts +84 -0
- package/src/methods/removeNftBids/removeNftBids.ts +80 -0
- package/src/methods/transferNfts/addTransferNftTx.ts +78 -0
- package/src/methods/transferNfts/transferNfts.ts +107 -0
- package/src/methods/unlistListings/addUnlistListingTxs.ts +258 -0
- package/src/methods/unlistListings/unlistListings.ts +108 -0
- package/src/methods/withdrawKioskProfits/withdrawKioskProfits.ts +25 -0
- package/src/tests/SuiWallet.ts +49 -0
- package/src/utils/addHexPrefix.ts +7 -0
- package/src/utils/addLeadingZerosAfter0x.ts +2 -0
- package/src/utils/parseSUI.ts +1 -0
- package/src/utils/printTxBlockTxs.ts +5 -0
- package/src/utils/toUint8Array.ts +12 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { type ObjectArgument } from '@mysten/kiosk';
|
|
2
|
+
import {
|
|
3
|
+
BLUEMOVE_CREATOR_CONFIG_OBJECT,
|
|
4
|
+
BLUEMOVE_KIOSK_MARKETPLACE_KIOSK_OBJECT,
|
|
5
|
+
BLUEMOVE_KIOSK_OFFER_COLLECTION_BIDDER_BAG,
|
|
6
|
+
BLUEMOVE_KIOSK_OFFER_COLLECTION_DATA_OBJECT,
|
|
7
|
+
BLUEMOVE_MARKET_CONFIG_OBJECT,
|
|
8
|
+
BLUEMOVE_OFFER_COLLECTION_DATA_OBJECT,
|
|
9
|
+
BLUEMOVE_ROYALTY_COLLECTION_OBJECT,
|
|
10
|
+
TOCEN_MARKETPLACE_OBJECT,
|
|
11
|
+
TRADEPORT_BIDDING_STORE,
|
|
12
|
+
} from '../../constants';
|
|
13
|
+
import { hasTransferPolicyRules } from '../../helpers/hasTransferPolicyRules';
|
|
14
|
+
import { getRulePackageId } from '../../helpers/kiosk/getRulePackageId';
|
|
15
|
+
import { isBluemoveKioskBid } from '../../helpers/kiosk/isBluemoveKioskBid';
|
|
16
|
+
import { isTradePortKioskBid } from '../../helpers/kiosk/isTradePortKioskBid';
|
|
17
|
+
import { kioskTxWrapper } from '../../helpers/kiosk/kioskTxWrapper';
|
|
18
|
+
import { confirmOBTranfer } from '../../helpers/originByte/confirmOBTranfer';
|
|
19
|
+
import { depositItemIntoOBKiosk } from '../../helpers/originByte/depositNftIntoOBKiosk';
|
|
20
|
+
import { getOrCreateOBKiosk } from '../../helpers/originByte/getOrCreateOBKiosk';
|
|
21
|
+
import { isOriginByteBid } from '../../helpers/originByte/isOriginByteBid';
|
|
22
|
+
import { isOriginByteTx } from '../../helpers/originByte/isOriginByteTx';
|
|
23
|
+
import { shareOriginByteKiosk } from '../../helpers/originByte/shareOriginByteKiosk';
|
|
24
|
+
import { getObjectType } from '../../helpers/rpc/getObjectType';
|
|
25
|
+
import { addTradeportKioskAcceptNftBidTx } from '../acceptNftBids/addAcceptNftBidTxs';
|
|
26
|
+
import { addOriginByteUnlistTx } from '../unlistListings/addUnlistListingTxs';
|
|
27
|
+
import { type AcceptCollectionBidTx } from './acceptCollectionBid';
|
|
28
|
+
|
|
29
|
+
export function addTradeportAcceptCollectionBidTx({
|
|
30
|
+
txBlock,
|
|
31
|
+
sharedObjects,
|
|
32
|
+
nftTokenId,
|
|
33
|
+
nftType,
|
|
34
|
+
itemTakenOutOfNativeKiosk,
|
|
35
|
+
bidNonce,
|
|
36
|
+
}: AcceptCollectionBidTx) {
|
|
37
|
+
const { collection, royaltyStrategy } = sharedObjects;
|
|
38
|
+
|
|
39
|
+
if (collection && royaltyStrategy) {
|
|
40
|
+
txBlock.moveCall({
|
|
41
|
+
target:
|
|
42
|
+
'0xb42dbb7413b79394e1a0175af6ae22b69a5c7cc5df259cd78072b6818217c027::biddings::ob_accept_bid',
|
|
43
|
+
arguments: [
|
|
44
|
+
txBlock.object(TRADEPORT_BIDDING_STORE),
|
|
45
|
+
txBlock.pure(bidNonce),
|
|
46
|
+
itemTakenOutOfNativeKiosk
|
|
47
|
+
? txBlock.object(itemTakenOutOfNativeKiosk)
|
|
48
|
+
: txBlock.pure(nftTokenId),
|
|
49
|
+
txBlock.object(collection),
|
|
50
|
+
txBlock.object(royaltyStrategy),
|
|
51
|
+
],
|
|
52
|
+
typeArguments: [nftType],
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
txBlock.moveCall({
|
|
56
|
+
target:
|
|
57
|
+
'0xb42dbb7413b79394e1a0175af6ae22b69a5c7cc5df259cd78072b6818217c027::biddings::accept_bid',
|
|
58
|
+
arguments: [
|
|
59
|
+
txBlock.object(TRADEPORT_BIDDING_STORE),
|
|
60
|
+
txBlock.pure(bidNonce),
|
|
61
|
+
itemTakenOutOfNativeKiosk
|
|
62
|
+
? txBlock.object(itemTakenOutOfNativeKiosk)
|
|
63
|
+
: txBlock.pure(nftTokenId),
|
|
64
|
+
],
|
|
65
|
+
typeArguments: [nftType],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const addTradeportKioskAcceptCollectionBidTx = async (txData: AcceptCollectionBidTx) => {
|
|
71
|
+
await addTradeportKioskAcceptNftBidTx(txData);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export async function addOriginByteAcceptCollectionBidTx(txData: AcceptCollectionBidTx) {
|
|
75
|
+
const {
|
|
76
|
+
txBlock,
|
|
77
|
+
sharedObjects,
|
|
78
|
+
sellerKiosk,
|
|
79
|
+
itemOwner,
|
|
80
|
+
nftTokenId,
|
|
81
|
+
nftType,
|
|
82
|
+
bidAmount,
|
|
83
|
+
bidNonce,
|
|
84
|
+
listingPrice,
|
|
85
|
+
} = txData;
|
|
86
|
+
|
|
87
|
+
if (listingPrice && listingPrice > 0) {
|
|
88
|
+
addOriginByteUnlistTx({
|
|
89
|
+
...txData,
|
|
90
|
+
price: txData?.listingPrice,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const { kiosk, isNewKiosk } = await getOrCreateOBKiosk({
|
|
95
|
+
txBlock,
|
|
96
|
+
address: itemOwner,
|
|
97
|
+
kioskToUseIfExists: sellerKiosk,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
if (isNewKiosk) {
|
|
101
|
+
depositItemIntoOBKiosk({
|
|
102
|
+
txBlock,
|
|
103
|
+
kiosk: sellerKiosk,
|
|
104
|
+
nftTokenId,
|
|
105
|
+
nftType,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const { orderbook } = sharedObjects;
|
|
110
|
+
|
|
111
|
+
const [tradeInfo] = txBlock.moveCall({
|
|
112
|
+
target:
|
|
113
|
+
'0x8534e4cdfd28709c94330a9783c3d5fe6f5daba0bffb69102ce303c5b38aed5a::orderbook::market_sell',
|
|
114
|
+
arguments: [
|
|
115
|
+
txBlock.object(orderbook),
|
|
116
|
+
txBlock.object(kiosk),
|
|
117
|
+
txBlock.pure(bidAmount),
|
|
118
|
+
txBlock.pure(nftTokenId),
|
|
119
|
+
],
|
|
120
|
+
typeArguments: [nftType, '0x2::sui::SUI'],
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const [id] = txBlock.moveCall({
|
|
124
|
+
target:
|
|
125
|
+
'0xa0bab69d913e5a0ce8b448235a08bcf4c42da45c50622743dc9cab2dc0dff30f::orderbook::trade_id',
|
|
126
|
+
arguments: [txBlock.object(tradeInfo)],
|
|
127
|
+
typeArguments: [],
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const transferRequest = txBlock.moveCall({
|
|
131
|
+
target:
|
|
132
|
+
'0xa0bab69d913e5a0ce8b448235a08bcf4c42da45c50622743dc9cab2dc0dff30f::orderbook::finish_trade',
|
|
133
|
+
arguments: [
|
|
134
|
+
txBlock.object(orderbook),
|
|
135
|
+
txBlock.object(id),
|
|
136
|
+
txBlock.object(kiosk),
|
|
137
|
+
txBlock.object(bidNonce),
|
|
138
|
+
],
|
|
139
|
+
typeArguments: [nftType, '0x2::sui::SUI'],
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
confirmOBTranfer({ txBlock, sharedObjects, transferRequest, nftType });
|
|
143
|
+
|
|
144
|
+
if (isNewKiosk) {
|
|
145
|
+
await shareOriginByteKiosk({ txBlock, kiosk });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function addBluemoveAcceptCollectionBidTx({
|
|
150
|
+
txBlock,
|
|
151
|
+
nftTokenId,
|
|
152
|
+
nftType,
|
|
153
|
+
bidNonce,
|
|
154
|
+
listingPrice,
|
|
155
|
+
itemTakenOutOfNativeKiosk,
|
|
156
|
+
}: AcceptCollectionBidTx) {
|
|
157
|
+
let unlistedItem: ObjectArgument;
|
|
158
|
+
if (listingPrice && listingPrice > 0) {
|
|
159
|
+
unlistedItem = txBlock.moveCall({
|
|
160
|
+
target:
|
|
161
|
+
'0xd5dd28cc24009752905689b2ba2bf90bfc8de4549b9123f93519bb8ba9bf9981::marketplace::delist',
|
|
162
|
+
arguments: [txBlock.object(BLUEMOVE_MARKET_CONFIG_OBJECT), txBlock.pure(nftTokenId)],
|
|
163
|
+
typeArguments: [nftType, nftType],
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
txBlock.moveCall({
|
|
168
|
+
target:
|
|
169
|
+
'0xd5dd28cc24009752905689b2ba2bf90bfc8de4549b9123f93519bb8ba9bf9981::offer_collection::accept_offer_collection',
|
|
170
|
+
arguments: [
|
|
171
|
+
txBlock.object(BLUEMOVE_MARKET_CONFIG_OBJECT),
|
|
172
|
+
txBlock.object(BLUEMOVE_ROYALTY_COLLECTION_OBJECT),
|
|
173
|
+
txBlock.object(BLUEMOVE_CREATOR_CONFIG_OBJECT),
|
|
174
|
+
txBlock.object(BLUEMOVE_OFFER_COLLECTION_DATA_OBJECT),
|
|
175
|
+
txBlock.pure(bidNonce),
|
|
176
|
+
itemTakenOutOfNativeKiosk
|
|
177
|
+
? txBlock.object(itemTakenOutOfNativeKiosk)
|
|
178
|
+
: unlistedItem
|
|
179
|
+
? txBlock.object(unlistedItem)
|
|
180
|
+
: txBlock.pure(nftTokenId),
|
|
181
|
+
],
|
|
182
|
+
typeArguments: [nftType],
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export async function addBluemoveKioskAcceptCollectionBidTx({
|
|
187
|
+
txBlock,
|
|
188
|
+
kioskTx,
|
|
189
|
+
nftTokenId,
|
|
190
|
+
nftType,
|
|
191
|
+
bidNonce,
|
|
192
|
+
}: AcceptCollectionBidTx) {
|
|
193
|
+
txBlock.moveCall({
|
|
194
|
+
target:
|
|
195
|
+
'0x2949e130ca4dabfe6448173758468a3e45ea3f070e3264f112b51c023f3ecf9f::kiosk_offer_collection_v2::accept_offer_collection_v2',
|
|
196
|
+
arguments: [
|
|
197
|
+
txBlock.object(BLUEMOVE_KIOSK_MARKETPLACE_KIOSK_OBJECT),
|
|
198
|
+
txBlock.object(BLUEMOVE_KIOSK_OFFER_COLLECTION_DATA_OBJECT),
|
|
199
|
+
txBlock.object(BLUEMOVE_KIOSK_OFFER_COLLECTION_BIDDER_BAG),
|
|
200
|
+
txBlock.pure(bidNonce),
|
|
201
|
+
txBlock.object(kioskTx.kiosk.value ?? kioskTx.kiosk),
|
|
202
|
+
txBlock.object(kioskTx.kioskCap.value ?? kioskTx.kioskCap),
|
|
203
|
+
txBlock.pure(nftTokenId),
|
|
204
|
+
],
|
|
205
|
+
typeArguments: [nftType],
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function addTocenAcceptCollectionBidTx({
|
|
210
|
+
txBlock,
|
|
211
|
+
nftTokenId,
|
|
212
|
+
nftType,
|
|
213
|
+
bidAmount,
|
|
214
|
+
bidder,
|
|
215
|
+
}: AcceptCollectionBidTx) {
|
|
216
|
+
txBlock.moveCall({
|
|
217
|
+
target:
|
|
218
|
+
'0x3605d91c559e80cf8fdeabae9abaccb0bc38f96eac0b32bf47e95a9159a5277f::tocen_marketplace::accept_offer_list',
|
|
219
|
+
arguments: [
|
|
220
|
+
txBlock.object(TOCEN_MARKETPLACE_OBJECT),
|
|
221
|
+
txBlock.pure(nftTokenId),
|
|
222
|
+
txBlock.pure(bidder),
|
|
223
|
+
txBlock.pure(bidAmount),
|
|
224
|
+
],
|
|
225
|
+
typeArguments: [nftType],
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export async function addTradePortAcceptCollectionBidTxHandler(txData: AcceptCollectionBidTx) {
|
|
230
|
+
const bidType = await getObjectType(txData?.bidNonce);
|
|
231
|
+
|
|
232
|
+
if (isOriginByteBid(bidType)) {
|
|
233
|
+
if (isOriginByteTx(txData?.sharedObjects)) {
|
|
234
|
+
await addOriginByteAcceptCollectionBidTx(txData);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
throw new Error(
|
|
239
|
+
`You cannot accept an Origin Byte bid with a NFT outside of an Origin Byte kiosk. Nft Token Id: ${txData?.nftTokenId}`,
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// If nft has no transfer policy rules but is inside a kiosk, take it out of the kiosk
|
|
244
|
+
if (!(await hasTransferPolicyRules(txData?.nftType)) && txData?.sellerKiosk) {
|
|
245
|
+
return kioskTxWrapper({
|
|
246
|
+
txBlock: txData?.txBlock,
|
|
247
|
+
kioskOwner: txData?.seller,
|
|
248
|
+
kiosk: txData?.sellerKiosk,
|
|
249
|
+
async tx(kioskTx) {
|
|
250
|
+
const item = kioskTx.take({
|
|
251
|
+
itemId: txData?.nftTokenId,
|
|
252
|
+
itemType: txData?.nftType,
|
|
253
|
+
});
|
|
254
|
+
addTradeportAcceptCollectionBidTx({ ...txData, itemTakenOutOfNativeKiosk: item });
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (isTradePortKioskBid(bidType)) {
|
|
260
|
+
if (txData?.sellerKiosk) {
|
|
261
|
+
const royaltyRulePackageId = await getRulePackageId(txData.nftType, 'royalty_rule');
|
|
262
|
+
return kioskTxWrapper({
|
|
263
|
+
txBlock: txData?.txBlock,
|
|
264
|
+
kioskOwner: txData?.itemOwner,
|
|
265
|
+
kiosk: txData?.sellerKiosk,
|
|
266
|
+
async tx(kioskTx) {
|
|
267
|
+
await addTradeportKioskAcceptCollectionBidTx({
|
|
268
|
+
...txData,
|
|
269
|
+
kioskTx,
|
|
270
|
+
royaltyRulePackageId,
|
|
271
|
+
});
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// If NFT not in a kiosk, but nft type has a transfer policy rule, create kiosk and place NFT in kiosk first
|
|
277
|
+
if ((await hasTransferPolicyRules(txData?.nftType)) && !txData?.sellerKiosk) {
|
|
278
|
+
const royaltyRulePackageId = await getRulePackageId(txData.nftType, 'royalty_rule');
|
|
279
|
+
|
|
280
|
+
return kioskTxWrapper({
|
|
281
|
+
txBlock: txData?.txBlock,
|
|
282
|
+
kioskOwner: txData?.seller,
|
|
283
|
+
kiosk: txData?.sellerKiosk,
|
|
284
|
+
async tx(kioskTx) {
|
|
285
|
+
kioskTx.place({
|
|
286
|
+
item: txData?.nftTokenId,
|
|
287
|
+
itemType: txData?.nftType,
|
|
288
|
+
});
|
|
289
|
+
await addTradeportKioskAcceptCollectionBidTx({
|
|
290
|
+
...txData,
|
|
291
|
+
kioskTx,
|
|
292
|
+
royaltyRulePackageId,
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
addTradeportAcceptCollectionBidTx(txData);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export async function addBluemoveAcceptCollectionBidTxHandler(txData: AcceptCollectionBidTx) {
|
|
303
|
+
const bidType = await getObjectType(txData?.bidNonce);
|
|
304
|
+
|
|
305
|
+
if (isOriginByteBid(bidType)) {
|
|
306
|
+
if (isOriginByteTx(txData?.sharedObjects)) {
|
|
307
|
+
await addOriginByteAcceptCollectionBidTx(txData);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
throw new Error(
|
|
312
|
+
`You cannot accept an Origin Byte bid with a NFT outside of an Origin Byte kiosk. Nft Token Id: ${txData?.nftTokenId}`,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (isBluemoveKioskBid(txData?.bidNonce)) {
|
|
317
|
+
if (txData?.sellerKiosk) {
|
|
318
|
+
return kioskTxWrapper({
|
|
319
|
+
txBlock: txData?.txBlock,
|
|
320
|
+
kioskOwner: txData?.itemOwner,
|
|
321
|
+
kiosk: txData?.sellerKiosk,
|
|
322
|
+
async tx(kioskTx) {
|
|
323
|
+
await addBluemoveKioskAcceptCollectionBidTx({
|
|
324
|
+
...txData,
|
|
325
|
+
kioskTx,
|
|
326
|
+
});
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
throw new Error(
|
|
332
|
+
`You cannot accept an Native Kiosk Bid with a NFT outside of a native kiosk. Nft Token Id: ${txData?.nftTokenId}`,
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (!isBluemoveKioskBid(txData?.bidNonce)) {
|
|
337
|
+
if (txData?.sellerKiosk) {
|
|
338
|
+
return kioskTxWrapper({
|
|
339
|
+
txBlock: txData?.txBlock,
|
|
340
|
+
kioskOwner: txData?.itemOwner,
|
|
341
|
+
kiosk: txData?.sellerKiosk,
|
|
342
|
+
async tx(kioskTx) {
|
|
343
|
+
const item = kioskTx.take({
|
|
344
|
+
itemId: txData?.nftTokenId,
|
|
345
|
+
itemType: txData?.nftType,
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
addBluemoveAcceptCollectionBidTx({ ...txData, itemTakenOutOfNativeKiosk: item });
|
|
349
|
+
},
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
addBluemoveAcceptCollectionBidTx(txData);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export function addTocenAcceptCollectionBidTxHandler(txData: AcceptCollectionBidTx) {
|
|
358
|
+
addTocenAcceptCollectionBidTx(txData);
|
|
359
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { TransactionBlock } from '@mysten/sui.js/transactions';
|
|
2
|
+
import { gqlChainRequest } from '../../graphql/gqlChainRequest';
|
|
3
|
+
import { fetchBidsById } from '../../graphql/queries/fetchBidsById';
|
|
4
|
+
import { getNftTypeFromNft } from '../../helpers/getNftTypeFromNft';
|
|
5
|
+
import { getSharedObjects } from '../../helpers/getSharedObjects';
|
|
6
|
+
import {
|
|
7
|
+
addBluemoveAcceptNftBidTx,
|
|
8
|
+
addOriginByteAcceptNftBidTx,
|
|
9
|
+
addTradePortAcceptNftBidTxHandler,
|
|
10
|
+
} from './addAcceptNftBidTxs';
|
|
11
|
+
|
|
12
|
+
export type AcceptNftBidTx = {
|
|
13
|
+
txBlock: TransactionBlock;
|
|
14
|
+
sharedObjects: any;
|
|
15
|
+
kioskTx?: any;
|
|
16
|
+
bidNonce: string;
|
|
17
|
+
nftType: string;
|
|
18
|
+
nftTokenId: string;
|
|
19
|
+
itemOwner: string;
|
|
20
|
+
listingPrice: number;
|
|
21
|
+
bidAmount: number;
|
|
22
|
+
sellerKiosk: string;
|
|
23
|
+
isListedOnBluemove: boolean;
|
|
24
|
+
bidMarketName: string;
|
|
25
|
+
royaltyRulePackageId?: string;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type AcceptNftBid = {
|
|
29
|
+
bidId: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type AcceptNftBids = {
|
|
33
|
+
bidIds: string[];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const ERROR_UNLIST_FIRST = 'Item must be unlisted first before you can accept a solo bid on it';
|
|
37
|
+
|
|
38
|
+
export const acceptNftBids = async ({ bidIds }: AcceptNftBids): Promise<TransactionBlock> => {
|
|
39
|
+
const res = await gqlChainRequest({
|
|
40
|
+
chain: 'sui',
|
|
41
|
+
query: fetchBidsById,
|
|
42
|
+
variables: { bidIds },
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
if (res?.bids?.length === 0) {
|
|
46
|
+
throw new Error('No bids found');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const txBlock = new TransactionBlock();
|
|
50
|
+
|
|
51
|
+
for (const bid of res.bids) {
|
|
52
|
+
if (bid?.status !== 'active') {
|
|
53
|
+
throw new Error('Bid not active');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (bid?.type !== 'solo') {
|
|
57
|
+
throw new Error('Bid is not an individual item bid. Use acceptCollectionBid() instead.');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const sharedObjects = await getSharedObjects(
|
|
61
|
+
bid?.nft?.properties?.nft_type || bid?.nft?.contract?.properties?.nft_type,
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const txData: AcceptNftBidTx = {
|
|
65
|
+
txBlock,
|
|
66
|
+
sharedObjects,
|
|
67
|
+
bidNonce: bid?.nonce,
|
|
68
|
+
nftType: getNftTypeFromNft(bid?.nft),
|
|
69
|
+
listingPrice: bid?.nft?.listings?.[0]?.price,
|
|
70
|
+
nftTokenId: bid?.nft?.token_id,
|
|
71
|
+
itemOwner: bid?.nft?.owner,
|
|
72
|
+
bidAmount: bid?.price,
|
|
73
|
+
sellerKiosk: bid?.nft?.chain_state?.kiosk_id,
|
|
74
|
+
isListedOnBluemove: bid?.nft?.listings?.[0]?.market_name === 'bluemove',
|
|
75
|
+
bidMarketName: bid?.market_contract?.name,
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
switch (txData.bidMarketName) {
|
|
79
|
+
case 'tradeport':
|
|
80
|
+
if (txData?.listingPrice && txData?.listingPrice > 0) {
|
|
81
|
+
throw new Error(ERROR_UNLIST_FIRST);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
await addTradePortAcceptNftBidTxHandler(txData);
|
|
85
|
+
break;
|
|
86
|
+
case 'clutchy':
|
|
87
|
+
case 'hyperspace':
|
|
88
|
+
case 'somis':
|
|
89
|
+
await addOriginByteAcceptNftBidTx(txData);
|
|
90
|
+
break;
|
|
91
|
+
case 'bluemove':
|
|
92
|
+
addBluemoveAcceptNftBidTx(txData);
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
throw new Error('Marketplace not supported');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return new TransactionBlock(txBlock);
|
|
100
|
+
};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { type TransactionObjectArgument } from '@mysten/sui.js/transactions';
|
|
2
|
+
import {
|
|
3
|
+
BLUEMOVE_CREATOR_CONFIG_OBJECT,
|
|
4
|
+
BLUEMOVE_MARKET_CONFIG_OBJECT,
|
|
5
|
+
BLUEMOVE_OFFER_DATA_OBJECT,
|
|
6
|
+
BLUEMOVE_ROYALTY_COLLECTION_OBJECT,
|
|
7
|
+
TRADEPORT_BIDDING_STORE,
|
|
8
|
+
TRADEPORT_KIOSK_BIDDING_ESCROW_KIOSK,
|
|
9
|
+
TRADEPORT_KIOSK_BIDDING_STORE,
|
|
10
|
+
} from '../../constants';
|
|
11
|
+
import { getRulePackageId } from '../../helpers/kiosk/getRulePackageId';
|
|
12
|
+
import { isTradePortKioskBid } from '../../helpers/kiosk/isTradePortKioskBid';
|
|
13
|
+
import { kioskTxWrapper } from '../../helpers/kiosk/kioskTxWrapper';
|
|
14
|
+
import { resolveTransferPolicies } from '../../helpers/kiosk/resolveTransferPolicies';
|
|
15
|
+
import { confirmOBTranfer } from '../../helpers/originByte/confirmOBTranfer';
|
|
16
|
+
import { getOBBidderKiosk } from '../../helpers/originByte/getOBBidderKiosk';
|
|
17
|
+
import { isOriginByteBid } from '../../helpers/originByte/isOriginByteBid';
|
|
18
|
+
import { isOriginByteTx } from '../../helpers/originByte/isOriginByteTx';
|
|
19
|
+
import { getObjectType } from '../../helpers/rpc/getObjectType';
|
|
20
|
+
import { type AcceptNftBidTx } from './acceptNftBids';
|
|
21
|
+
|
|
22
|
+
export function addTradeportAcceptNftBidTx({
|
|
23
|
+
txBlock,
|
|
24
|
+
sharedObjects,
|
|
25
|
+
bidNonce,
|
|
26
|
+
nftTokenId,
|
|
27
|
+
nftType,
|
|
28
|
+
}: AcceptNftBidTx) {
|
|
29
|
+
const { collection, royaltyStrategy } = sharedObjects;
|
|
30
|
+
|
|
31
|
+
if (collection && royaltyStrategy) {
|
|
32
|
+
txBlock.moveCall({
|
|
33
|
+
target:
|
|
34
|
+
'0xb42dbb7413b79394e1a0175af6ae22b69a5c7cc5df259cd78072b6818217c027::biddings::ob_accept_bid',
|
|
35
|
+
arguments: [
|
|
36
|
+
txBlock.object(TRADEPORT_BIDDING_STORE),
|
|
37
|
+
txBlock.pure(bidNonce),
|
|
38
|
+
txBlock.pure(nftTokenId),
|
|
39
|
+
txBlock.object(collection),
|
|
40
|
+
txBlock.object(royaltyStrategy),
|
|
41
|
+
],
|
|
42
|
+
typeArguments: [nftType],
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
txBlock.moveCall({
|
|
46
|
+
target:
|
|
47
|
+
'0xb42dbb7413b79394e1a0175af6ae22b69a5c7cc5df259cd78072b6818217c027::biddings::accept_bid',
|
|
48
|
+
arguments: [
|
|
49
|
+
txBlock.object(TRADEPORT_BIDDING_STORE),
|
|
50
|
+
txBlock.pure(bidNonce),
|
|
51
|
+
txBlock.pure(nftTokenId),
|
|
52
|
+
],
|
|
53
|
+
typeArguments: [nftType],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export async function addTradeportKioskAcceptNftBidTx({
|
|
59
|
+
txBlock,
|
|
60
|
+
sharedObjects,
|
|
61
|
+
kioskTx,
|
|
62
|
+
bidNonce,
|
|
63
|
+
nftTokenId,
|
|
64
|
+
nftType,
|
|
65
|
+
royaltyRulePackageId,
|
|
66
|
+
}: AcceptNftBidTx) {
|
|
67
|
+
const { transferPolicy } = sharedObjects;
|
|
68
|
+
|
|
69
|
+
const [feeCoin, transferRequest] = txBlock.moveCall({
|
|
70
|
+
target:
|
|
71
|
+
'0x33a9e4a3089d911c2a2bf16157a1d6a4a8cbd9a2106a98ecbaefe6ed370d7a25::kiosk_biddings::accept_bid',
|
|
72
|
+
arguments: [
|
|
73
|
+
txBlock.object(TRADEPORT_KIOSK_BIDDING_STORE),
|
|
74
|
+
txBlock.pure(bidNonce),
|
|
75
|
+
txBlock.object(TRADEPORT_KIOSK_BIDDING_ESCROW_KIOSK),
|
|
76
|
+
txBlock.object(kioskTx.kiosk.value ?? kioskTx.kiosk),
|
|
77
|
+
txBlock.object(kioskTx.kioskCap.value ?? kioskTx.kioskCap),
|
|
78
|
+
txBlock.pure(nftTokenId),
|
|
79
|
+
txBlock.object(transferPolicy),
|
|
80
|
+
],
|
|
81
|
+
typeArguments: [nftType],
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
txBlock.moveCall({
|
|
85
|
+
target: `${royaltyRulePackageId}::royalty_rule::pay`,
|
|
86
|
+
typeArguments: [nftType],
|
|
87
|
+
arguments: [txBlock.object(transferPolicy), transferRequest, feeCoin],
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
await resolveTransferPolicies({
|
|
91
|
+
txBlock,
|
|
92
|
+
kioskTx,
|
|
93
|
+
nftType,
|
|
94
|
+
price: '0',
|
|
95
|
+
transferRequest,
|
|
96
|
+
kioskToLockRuleProve: TRADEPORT_KIOSK_BIDDING_ESCROW_KIOSK,
|
|
97
|
+
shouldSkipKioskLocking: true,
|
|
98
|
+
shouldSkipResolvingRoyaltyRule: true,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function addOriginByteAcceptNftBidTx({
|
|
103
|
+
txBlock,
|
|
104
|
+
sharedObjects,
|
|
105
|
+
sellerKiosk,
|
|
106
|
+
bidNonce,
|
|
107
|
+
nftTokenId,
|
|
108
|
+
nftType,
|
|
109
|
+
}: AcceptNftBidTx) {
|
|
110
|
+
const receiverKiosk = await getOBBidderKiosk(bidNonce);
|
|
111
|
+
|
|
112
|
+
let transferRequest: TransactionObjectArgument;
|
|
113
|
+
if (sellerKiosk) {
|
|
114
|
+
transferRequest = txBlock.moveCall({
|
|
115
|
+
target:
|
|
116
|
+
'0x8534e4cdfd28709c94330a9783c3d5fe6f5daba0bffb69102ce303c5b38aed5a::bidding::sell_nft_from_kiosk',
|
|
117
|
+
arguments: [
|
|
118
|
+
txBlock.object(bidNonce),
|
|
119
|
+
txBlock.object(sellerKiosk),
|
|
120
|
+
txBlock.object(receiverKiosk),
|
|
121
|
+
txBlock.pure(nftTokenId),
|
|
122
|
+
],
|
|
123
|
+
typeArguments: [nftType, '0x2::sui::SUI'],
|
|
124
|
+
});
|
|
125
|
+
} else {
|
|
126
|
+
transferRequest = txBlock.moveCall({
|
|
127
|
+
target:
|
|
128
|
+
'0x8534e4cdfd28709c94330a9783c3d5fe6f5daba0bffb69102ce303c5b38aed5a::bidding::sell_nft',
|
|
129
|
+
arguments: [
|
|
130
|
+
txBlock.object(bidNonce),
|
|
131
|
+
txBlock.object(receiverKiosk),
|
|
132
|
+
txBlock.pure(nftTokenId),
|
|
133
|
+
],
|
|
134
|
+
typeArguments: [nftType, '0x2::sui::SUI'],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
confirmOBTranfer({ txBlock, sharedObjects, transferRequest, nftType });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function addBluemoveAcceptNftBidTx({
|
|
142
|
+
txBlock,
|
|
143
|
+
nftTokenId,
|
|
144
|
+
nftType,
|
|
145
|
+
bidNonce,
|
|
146
|
+
isListedOnBluemove,
|
|
147
|
+
}: AcceptNftBidTx) {
|
|
148
|
+
if (isListedOnBluemove) {
|
|
149
|
+
txBlock.moveCall({
|
|
150
|
+
target:
|
|
151
|
+
'0xd5dd28cc24009752905689b2ba2bf90bfc8de4549b9123f93519bb8ba9bf9981::marketplace::delist',
|
|
152
|
+
arguments: [txBlock.object(BLUEMOVE_MARKET_CONFIG_OBJECT), txBlock.pure(nftTokenId)],
|
|
153
|
+
typeArguments: [nftType, nftType],
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
txBlock.moveCall({
|
|
158
|
+
target:
|
|
159
|
+
'0xd5dd28cc24009752905689b2ba2bf90bfc8de4549b9123f93519bb8ba9bf9981::offer_item::accept_offer_nft',
|
|
160
|
+
arguments: [
|
|
161
|
+
txBlock.object(BLUEMOVE_MARKET_CONFIG_OBJECT),
|
|
162
|
+
txBlock.object(BLUEMOVE_ROYALTY_COLLECTION_OBJECT),
|
|
163
|
+
txBlock.object(BLUEMOVE_CREATOR_CONFIG_OBJECT),
|
|
164
|
+
txBlock.object(BLUEMOVE_OFFER_DATA_OBJECT),
|
|
165
|
+
txBlock.pure(bidNonce),
|
|
166
|
+
isListedOnBluemove
|
|
167
|
+
? {
|
|
168
|
+
kind: 'Result',
|
|
169
|
+
index: 0,
|
|
170
|
+
}
|
|
171
|
+
: txBlock.pure(nftTokenId),
|
|
172
|
+
],
|
|
173
|
+
typeArguments: [nftType],
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export async function addTradePortAcceptNftBidTxHandler(txData: AcceptNftBidTx) {
|
|
178
|
+
const bidType = await getObjectType(txData?.bidNonce);
|
|
179
|
+
|
|
180
|
+
if (isOriginByteBid(bidType)) {
|
|
181
|
+
if (isOriginByteTx(txData?.sharedObjects)) {
|
|
182
|
+
await addOriginByteAcceptNftBidTx(txData);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
throw new Error(
|
|
187
|
+
`You cannot accept an Origin Byte bid with a NFT outside of an Origin Byte kiosk. Nft Token Id: ${txData?.nftTokenId}`,
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (isTradePortKioskBid(bidType)) {
|
|
192
|
+
if (txData?.sellerKiosk) {
|
|
193
|
+
const royaltyRulePackageId = await getRulePackageId(txData.nftType, 'royalty_rule');
|
|
194
|
+
return kioskTxWrapper({
|
|
195
|
+
txBlock: txData?.txBlock,
|
|
196
|
+
kioskOwner: txData?.itemOwner,
|
|
197
|
+
kiosk: txData?.sellerKiosk,
|
|
198
|
+
async tx(kioskTx) {
|
|
199
|
+
await addTradeportKioskAcceptNftBidTx({
|
|
200
|
+
...txData,
|
|
201
|
+
kioskTx,
|
|
202
|
+
royaltyRulePackageId,
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
throw new Error(
|
|
209
|
+
`You cannot accept an Native Kiosk Bid with a NFT outside of a native kiosk. Nft Token Id: ${txData?.nftTokenId}`,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
addTradeportAcceptNftBidTx(txData);
|
|
214
|
+
}
|