From e00f4bd33b83fbc3645c807224f1a6efea062f66 Mon Sep 17 00:00:00 2001 From: Jordan Prince Date: Wed, 28 Apr 2021 14:23:18 -0500 Subject: [PATCH] Fixed for multi auctions --- .../metavinci/src/actions/sendRedeemBid.ts | 3 +- packages/metavinci/src/contexts/meta.tsx | 25 +++-- packages/metavinci/src/hooks/useUserArts.ts | 1 + .../metavinci/src/models/metaplex/index.ts | 5 +- .../src/views/auctionCreate/artSelector.tsx | 23 +++-- .../src/views/auctionCreate/index.tsx | 94 ++++++++++--------- 6 files changed, 82 insertions(+), 69 deletions(-) diff --git a/packages/metavinci/src/actions/sendRedeemBid.ts b/packages/metavinci/src/actions/sendRedeemBid.ts index 3d18add..aa505ad 100644 --- a/packages/metavinci/src/actions/sendRedeemBid.ts +++ b/packages/metavinci/src/actions/sendRedeemBid.ts @@ -410,7 +410,8 @@ async function setupRedeemOpenInstructions( [], auctionView.myBidderMetadata.info.bidderPubkey, wallet.publicKey, - auctionView.auctionManager.info.settings.openEditionFixedPrice || 0, + auctionView.auctionManager.info.settings.openEditionFixedPrice?.toNumber() || + 0, ); winningPrizeSigner.push(transferAuthority); diff --git a/packages/metavinci/src/contexts/meta.tsx b/packages/metavinci/src/contexts/meta.tsx index f18c625..9151c37 100644 --- a/packages/metavinci/src/contexts/meta.tsx +++ b/packages/metavinci/src/contexts/meta.tsx @@ -138,14 +138,16 @@ export function MetaProvider({ children = null as any }) { const account = cache.add( a.pubkey, a.account, - AuctionParser) as - ParsedAccount; + AuctionParser, + ) as ParsedAccount; account.info.auctionManagerKey = await getAuctionManagerKey( account.info.resource, a.pubkey, ); - const payerAcct = accountByMint.get(account.info.tokenMint.toBase58()); + const payerAcct = accountByMint.get( + account.info.tokenMint.toBase58(), + ); if (payerAcct) account.info.bidRedemptionKey = ( await getBidderKeys(a.pubkey, payerAcct.pubkey) @@ -154,13 +156,7 @@ export function MetaProvider({ children = null as any }) { ...e, [a.pubkey.toBase58()]: account, })); - } catch (e) { - if ( - a.pubkey.toBase58() === - 'yNPR97243ke5cV3QGW9ZhSxfVP1K2YVQxzkjikCVbee' - ) { - console.error(e); - } + } catch { // ignore errors // add type as first byte for easier deserialization } @@ -170,8 +166,8 @@ export function MetaProvider({ children = null as any }) { const account = cache.add( a.pubkey, a.account, - BidderMetadataParser) as - ParsedAccount; + BidderMetadataParser, + ) as ParsedAccount; setBidderMetadataByAuctionAndBidder(e => ({ ...e, @@ -189,8 +185,8 @@ export function MetaProvider({ children = null as any }) { const account = cache.add( a.pubkey, a.account, - BidderPotParser) as - ParsedAccount; + BidderPotParser, + ) as ParsedAccount; setBidderPotsByAuctionAndBidder(e => ({ ...e, @@ -370,6 +366,7 @@ export function MetaProvider({ children = null as any }) { try { if (meta.account.data[0] == MetadataKey.MetadataV1) { const metadata = await decodeMetadata(meta.account.data); + if ( isValidHttpUrl(metadata.uri) && metadata.uri.indexOf('arweave') >= 0 diff --git a/packages/metavinci/src/hooks/useUserArts.ts b/packages/metavinci/src/hooks/useUserArts.ts index 1ec723c..5c06c8c 100644 --- a/packages/metavinci/src/hooks/useUserArts.ts +++ b/packages/metavinci/src/hooks/useUserArts.ts @@ -37,6 +37,7 @@ export const useUserArts = (): SafetyDepositDraft[] => { let i = 0; ownedMetadata.forEach(m => { let a = accountByMint.get(m.info.mint.toBase58()); + if (a) { safetyDeposits.push({ holding: a.pubkey, diff --git a/packages/metavinci/src/models/metaplex/index.ts b/packages/metavinci/src/models/metaplex/index.ts index f9f3d55..c4f36a6 100644 --- a/packages/metavinci/src/models/metaplex/index.ts +++ b/packages/metavinci/src/models/metaplex/index.ts @@ -7,6 +7,7 @@ import { EDITION, } from '@oyster/common'; import { PublicKey } from '@solana/web3.js'; +import BN from 'bn.js'; import { serialize, BinaryReader, BinaryWriter } from 'borsh'; export * from './initAuctionManager'; @@ -104,7 +105,7 @@ export class AuctionManagerSettings { NonWinningConstraint.GivenForFixedPrice; winningConfigs: WinningConfig[] = []; openEditionConfig: number | null = 0; - openEditionFixedPrice: number | null = 0; + openEditionFixedPrice: BN | null = new BN(0); constructor(args?: AuctionManagerSettings) { Object.assign(this, args); @@ -221,7 +222,7 @@ export const SCHEMA = new Map([ ['openEditionNonWinningConstraint', 'u8'], ['winningConfigs', [WinningConfig]], ['openEditionConfig', { kind: 'option', type: 'u8' }], - ['openEditionFixedPrice', { kind: 'option', type: 'u8' }], + ['openEditionFixedPrice', { kind: 'option', type: 'u64' }], ], }, ], diff --git a/packages/metavinci/src/views/auctionCreate/artSelector.tsx b/packages/metavinci/src/views/auctionCreate/artSelector.tsx index 871a03d..f913452 100644 --- a/packages/metavinci/src/views/auctionCreate/artSelector.tsx +++ b/packages/metavinci/src/views/auctionCreate/artSelector.tsx @@ -11,14 +11,17 @@ export interface ArtSelectorProps extends ButtonProps { selected: SafetyDepositDraft[]; setSelected: (selected: SafetyDepositDraft[]) => void; allowMultiple: boolean; + filter?: (i: SafetyDepositDraft) => boolean; } export const ArtSelector = (props: ArtSelectorProps) => { const { selected, setSelected, allowMultiple, ...rest } = props; - const items = useUserArts(); - const selectedItems = useMemo>(() => - new Set(selected.map(item => item.metadata.pubkey.toBase58())) - , [selected]); + let items = useUserArts(); + if (props.filter) items = items.filter(props.filter); + const selectedItems = useMemo>( + () => new Set(selected.map(item => item.metadata.pubkey.toBase58())), + [selected], + ); const [visible, setVisible] = useState(false); @@ -37,7 +40,7 @@ export const ArtSelector = (props: ArtSelectorProps) => { }; const confirm = () => { - close(); + close(); }; const breakpointColumnsObj = { @@ -72,7 +75,7 @@ export const ArtSelector = (props: ArtSelectorProps) => { onClick={open} close={() => { setSelected( - selected.filter(_ => _.metadata.pubkey.toBase58() !== key) + selected.filter(_ => _.metadata.pubkey.toBase58() !== key), ); confirm(); }} @@ -123,10 +126,10 @@ export const ArtSelector = (props: ArtSelectorProps) => { ? new Set(list.filter(item => item !== id)) : new Set([...list, id]); - let selected = items.filter(item => - newSet.has(item.metadata.pubkey.toBase58()), - ); - setSelected(selected); + let selected = items.filter(item => + newSet.has(item.metadata.pubkey.toBase58()), + ); + setSelected(selected); if (!allowMultiple) { confirm(); diff --git a/packages/metavinci/src/views/auctionCreate/index.tsx b/packages/metavinci/src/views/auctionCreate/index.tsx index 61d83a4..c2c6095 100644 --- a/packages/metavinci/src/views/auctionCreate/index.tsx +++ b/packages/metavinci/src/views/auctionCreate/index.tsx @@ -86,6 +86,7 @@ export interface AuctionState { // listed NFTs items: SafetyDepositDraft[]; + participationNFT?: SafetyDepositDraft; // number of editions for this auction (only applicable to limited edition) editions?: number; @@ -152,58 +153,54 @@ export const AuctionCreateView = () => { if (attributes.category == AuctionCategory.Open) { settings = new AuctionManagerSettings({ openEditionWinnerConstraint: WinningConstraint.OpenEditionGiven, - openEditionNonWinningConstraint: NonWinningConstraint.GivenForBidPrice, + openEditionNonWinningConstraint: + NonWinningConstraint.GivenForFixedPrice, winningConfigs: [], openEditionConfig: 0, - openEditionFixedPrice: null, + openEditionFixedPrice: new BN(attributes.reservationPrice), }); winnerLimit = new WinnerLimit({ type: WinnerLimitType.Unlimited, usize: ZERO, }); - } else if (attributes.category == AuctionCategory.Limited) { + } else if ( + attributes.category == AuctionCategory.Limited || + attributes.category == AuctionCategory.Single + ) { settings = new AuctionManagerSettings({ - openEditionWinnerConstraint: WinningConstraint.NoOpenEdition, - openEditionNonWinningConstraint: NonWinningConstraint.NoOpenEdition, + openEditionWinnerConstraint: attributes.participationNFT + ? WinningConstraint.OpenEditionGiven + : WinningConstraint.NoOpenEdition, + openEditionNonWinningConstraint: attributes.participationNFT + ? NonWinningConstraint.GivenForFixedPrice + : NonWinningConstraint.NoOpenEdition, winningConfigs: attributes.items.map( (item, index) => new WinningConfig({ // TODO: check index safetyDepositBoxIndex: index, amount: 1, - editionType: EditionType.LimitedEdition, + editionType: + attributes.category == AuctionCategory.Limited + ? EditionType.LimitedEdition + : item.masterEdition + ? EditionType.MasterEdition + : EditionType.NA, }), ), - openEditionConfig: null, - openEditionFixedPrice: null, - }); - winnerLimit = new WinnerLimit({ - type: WinnerLimitType.Capped, - usize: new BN(attributes.winnersCount), - }); - } else if (attributes.category == AuctionCategory.Single) { - settings = new AuctionManagerSettings({ - openEditionWinnerConstraint: WinningConstraint.NoOpenEdition, - openEditionNonWinningConstraint: NonWinningConstraint.NoOpenEdition, - winningConfigs: attributes.items.map( - (item, index) => - new WinningConfig({ - // TODO: check index - safetyDepositBoxIndex: index, - amount: 1, - editionType: item.masterEdition - ? EditionType.MasterEdition - : EditionType.NA, - }), - ), - openEditionConfig: null, - openEditionFixedPrice: null, + openEditionConfig: attributes.participationNFT + ? attributes.items.length + : null, + openEditionFixedPrice: attributes.participationNFT + ? new BN(attributes.reservationPrice) + : null, }); winnerLimit = new WinnerLimit({ type: WinnerLimitType.Capped, usize: new BN(attributes.winnersCount), }); + console.log('Settings', settings); } else { throw new Error('Not supported'); } @@ -215,7 +212,10 @@ export const AuctionCreateView = () => { winnerLimit, new BN((attributes.auctionDuration || 1) * 60), new BN((attributes.gapTime || 1) * 60), - attributes.items, + [ + ...attributes.items, + ...(attributes.participationNFT ? [attributes.participationNFT] : []), + ], // TODO: move to config new PublicKey('4XEUcBjLyBHuMDKTARycf4VXqpsAsDcThMbhWgFuDGsC'), ); @@ -480,22 +480,21 @@ const CopiesStep = (props: { setAttributes: (attr: AuctionState) => void; confirm: () => void; }) => { - const items = useUserArts(); - let eligibleItems: SafetyDepositDraft[] = []; + let filter: ((i: SafetyDepositDraft) => boolean) | undefined; if (props.attributes.category == AuctionCategory.Limited) { - eligibleItems = items.filter(i => i.masterEdition); + filter = (i: SafetyDepositDraft) => !!i.masterEdition; } else if ( props.attributes.category == AuctionCategory.Single || props.attributes.category == AuctionCategory.Tiered ) { - eligibleItems = items; + filter = undefined; } else if (props.attributes.category == AuctionCategory.Open) { - eligibleItems = items.filter( - i => + filter = (i: SafetyDepositDraft) => + !!( i.masterEdition && (i.masterEdition.info.maxSupply == undefined || - i.masterEdition.info.maxSupply == null), - ); + i.masterEdition.info.maxSupply == null) + ); } return ( @@ -509,6 +508,7 @@ const CopiesStep = (props: { { props.setAttributes({ ...props.attributes, items }); @@ -1342,11 +1342,21 @@ const ParticipationStep = (props: { {}} + filter={(i: SafetyDepositDraft) => !!i.masterEdition} + selected={ + props.attributes.participationNFT + ? [props.attributes.participationNFT] + : [] + } + setSelected={items => { + props.setAttributes({ + ...props.attributes, + participationNFT: items[0], + }); + }} allowMultiple={false} > - Select NFT + Select Participation NFT