diff --git a/packages/metavinci/src/actions/nft.tsx b/packages/metavinci/src/actions/nft.tsx index 5be69f1..9c76a3d 100644 --- a/packages/metavinci/src/actions/nft.tsx +++ b/packages/metavinci/src/actions/nft.tsx @@ -151,7 +151,7 @@ export const mintNFT = async ( // Force wait for max confirmations // await connection.confirmTransaction(txid, 'max'); - await connection.getParsedConfirmedTransaction(txid, 'confirmed'); + await connection.getParsedConfirmedTransaction(txid); // this means we're done getting AR txn setup. Ship it off to ARWeave! const data = new FormData(); diff --git a/packages/metavinci/src/actions/sendRedeemBid.ts b/packages/metavinci/src/actions/sendRedeemBid.ts index 70ba1c0..aa505ad 100644 --- a/packages/metavinci/src/actions/sendRedeemBid.ts +++ b/packages/metavinci/src/actions/sendRedeemBid.ts @@ -30,6 +30,7 @@ import { redeemLimitedEditionBid, redeemMasterEditionBid, redeemOpenEditionBid, + WinningConfig, WinningConstraint, } from '../models/metaplex'; const { createTokenAccount } = actions; @@ -78,6 +79,7 @@ export async function sendRedeemBid( item, signers, instructions, + winningConfig, ); break; case EditionType.MasterEdition: @@ -249,11 +251,17 @@ async function setupRedeemLimitedInstructions( item: AuctionViewItem, signers: Array, instructions: Array, + winningConfig: WinningConfig, ) { const updateAuth = item.metadata.info.nonUniqueSpecificUpdateAuthority || item.nameSymbol?.info.updateAuthority; - + console.log( + 'item', + item, + item.metadata.info.mint.toBase58(), + item.metadata.info.masterEdition?.toBase58(), + ); if (item.masterEdition && updateAuth && auctionView.myBidderMetadata) { let newTokenAccount: PublicKey | undefined = accountsByMint.get( item.masterEdition.info.masterMint.toBase58(), @@ -280,6 +288,7 @@ async function setupRedeemLimitedInstructions( item.metadata.pubkey, ), ); + console.log('Original auth', originalAuthorityAcct); if (originalAuthorityAcct) { const originalAuthority = new PublicKey( originalAuthorityAcct.data.slice(1, 33), @@ -300,61 +309,63 @@ async function setupRedeemLimitedInstructions( ); } - let cashInLimitedPrizeAuthorizationTokenSigner: Account[] = []; - let cashInLimitedPrizeAuthorizationTokenInstruction: TransactionInstruction[] = []; - signers.push(cashInLimitedPrizeAuthorizationTokenSigner); - instructions.push(cashInLimitedPrizeAuthorizationTokenInstruction); + for (let i = 0; i < winningConfig.amount; i++) { + let cashInLimitedPrizeAuthorizationTokenSigner: Account[] = []; + let cashInLimitedPrizeAuthorizationTokenInstruction: TransactionInstruction[] = []; + signers.push(cashInLimitedPrizeAuthorizationTokenSigner); + instructions.push(cashInLimitedPrizeAuthorizationTokenInstruction); - const newLimitedEditionMint = createMint( - cashInLimitedPrizeAuthorizationTokenInstruction, - wallet.publicKey, - mintRentExempt, - 0, - wallet.publicKey, - wallet.publicKey, - cashInLimitedPrizeAuthorizationTokenSigner, - ); - const newLimitedEdition = createTokenAccount( - cashInLimitedPrizeAuthorizationTokenInstruction, - wallet.publicKey, - accountRentExempt, - newLimitedEditionMint, - wallet.publicKey, - cashInLimitedPrizeAuthorizationTokenSigner, - ); - - cashInLimitedPrizeAuthorizationTokenInstruction.push( - Token.createMintToInstruction( - programIds().token, - newLimitedEditionMint, - newLimitedEdition, + const newLimitedEditionMint = createMint( + cashInLimitedPrizeAuthorizationTokenInstruction, wallet.publicKey, + mintRentExempt, + 0, + wallet.publicKey, + wallet.publicKey, + cashInLimitedPrizeAuthorizationTokenSigner, + ); + const newLimitedEdition = createTokenAccount( + cashInLimitedPrizeAuthorizationTokenInstruction, + wallet.publicKey, + accountRentExempt, + newLimitedEditionMint, + wallet.publicKey, + cashInLimitedPrizeAuthorizationTokenSigner, + ); + + cashInLimitedPrizeAuthorizationTokenInstruction.push( + Token.createMintToInstruction( + programIds().token, + newLimitedEditionMint, + newLimitedEdition, + wallet.publicKey, + [], + 1, + ), + ); + + const burnAuthority = approve( + cashInLimitedPrizeAuthorizationTokenInstruction, [], + newTokenAccount, + wallet.publicKey, 1, - ), - ); + ); - const burnAuthority = approve( - cashInLimitedPrizeAuthorizationTokenInstruction, - [], - newTokenAccount, - wallet.publicKey, - 1, - ); + cashInLimitedPrizeAuthorizationTokenSigner.push(burnAuthority); - cashInLimitedPrizeAuthorizationTokenSigner.push(burnAuthority); - - mintNewEditionFromMasterEditionViaToken( - newLimitedEditionMint, - item.metadata.info.mint, - wallet.publicKey, - item.masterEdition.info.masterMint, - newTokenAccount, - burnAuthority.publicKey, - updateAuth, - cashInLimitedPrizeAuthorizationTokenInstruction, - wallet.publicKey, - ); + mintNewEditionFromMasterEditionViaToken( + newLimitedEditionMint, + item.metadata.info.mint, + wallet.publicKey, + item.masterEdition.info.masterMint, + newTokenAccount, + burnAuthority.publicKey, + updateAuth, + cashInLimitedPrizeAuthorizationTokenInstruction, + wallet.publicKey, + ); + } } } } @@ -399,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/useAuction.ts b/packages/metavinci/src/hooks/useAuction.ts index 87e2ff8..22c5c4f 100644 --- a/packages/metavinci/src/hooks/useAuction.ts +++ b/packages/metavinci/src/hooks/useAuction.ts @@ -10,13 +10,9 @@ export const useAuction = (id: string) => { prev.set(acc.info.mint.toBase58(), acc); return prev; }, new Map()); - const [clock, setClock] = useState(0); const [existingAuctionView, setAuctionView] = useState( null, ); - useEffect(() => { - connection.getSlot().then(setClock); - }, [connection]); const { auctions, @@ -46,14 +42,12 @@ export const useAuction = (id: string) => { masterEditions, vaults, accountByMint, - clock, undefined, existingAuctionView || undefined, ); if (auctionView) setAuctionView(auctionView); } }, [ - clock, auctions, auctionManagers, safetyDepositBoxesByVaultAndIndex, diff --git a/packages/metavinci/src/hooks/useAuctions.ts b/packages/metavinci/src/hooks/useAuctions.ts index a7f4341..354aea1 100644 --- a/packages/metavinci/src/hooks/useAuctions.ts +++ b/packages/metavinci/src/hooks/useAuctions.ts @@ -47,20 +47,15 @@ export interface AuctionView { } export const useAuctions = (state: AuctionViewState) => { - const connection = useConnection(); const { userAccounts } = useUserAccounts(); const accountByMint = userAccounts.reduce((prev, acc) => { prev.set(acc.info.mint.toBase58(), acc); return prev; }, new Map()); - const [clock, setClock] = useState(0); const [auctionViews, setAuctionViews] = useState< Record >({}); - useEffect(() => { - connection.getSlot().then(setClock); - }, [connection]); const { auctions, @@ -76,30 +71,27 @@ export const useAuctions = (state: AuctionViewState) => { } = useMeta(); useEffect(() => { - if (clock != 0) - Object.keys(auctions).forEach(a => { - const auction = auctions[a]; - const existingAuctionView = auctionViews[a]; - const nextAuctionView = processAccountsIntoAuctionView( - auction, - auctionManagers, - safetyDepositBoxesByVaultAndIndex, - metadataByMint, - nameSymbolTuples, - bidRedemptions, - bidderMetadataByAuctionAndBidder, - bidderPotsByAuctionAndBidder, - masterEditions, - vaults, - accountByMint, - clock, - state, - existingAuctionView, - ); - setAuctionViews(nA => ({ ...nA, [a]: nextAuctionView })); - }); + Object.keys(auctions).forEach(a => { + const auction = auctions[a]; + const existingAuctionView = auctionViews[a]; + const nextAuctionView = processAccountsIntoAuctionView( + auction, + auctionManagers, + safetyDepositBoxesByVaultAndIndex, + metadataByMint, + nameSymbolTuples, + bidRedemptions, + bidderMetadataByAuctionAndBidder, + bidderPotsByAuctionAndBidder, + masterEditions, + vaults, + accountByMint, + state, + existingAuctionView, + ); + setAuctionViews(nA => ({ ...nA, [a]: nextAuctionView })); + }); }, [ - clock, state, auctions, auctionManagers, @@ -135,20 +127,13 @@ export function processAccountsIntoAuctionView( masterEditions: Record>, vaults: Record>, accountByMint: Map, - clock: number, desiredState: AuctionViewState | undefined, existingAuctionView?: AuctionView, ): AuctionView | undefined { let state: AuctionViewState; - if ( - auction.info.state == AuctionState.Ended || - (auction.info.endedAt && auction.info.endedAt.toNumber() <= clock) - ) { + if (auction.info.state == AuctionState.Ended) { state = AuctionViewState.Ended; - } else if ( - auction.info.state == AuctionState.Started || - (auction.info.endedAt && auction.info.endedAt.toNumber() > clock) - ) { + } else if (auction.info.state == AuctionState.Started) { state = AuctionViewState.Live; } else if (auction.info.state == AuctionState.Created) { state = AuctionViewState.Upcoming; @@ -193,25 +178,26 @@ export function processAccountsIntoAuctionView( let foundMetadata = metadataByMint[curr.safetyDeposit.info.tokenMint.toBase58()]; curr.metadata = foundMetadata; - if ( - curr.metadata && - !curr.nameSymbol && - curr.metadata.info.nameSymbolTuple - ) { - let foundNS = - nameSymbolTuples[curr.metadata.info.nameSymbolTuple.toBase58()]; - curr.nameSymbol = foundNS; - } + } + if ( + curr.metadata && + !curr.nameSymbol && + curr.metadata.info.nameSymbolTuple + ) { + let foundNS = + nameSymbolTuples[curr.metadata.info.nameSymbolTuple.toBase58()]; + curr.nameSymbol = foundNS; + } - if ( - curr.metadata && - !curr.masterEdition && - curr.metadata.info.masterEdition - ) { - let foundMaster = - masterEditions[curr.metadata.info.masterEdition.toBase58()]; - curr.masterEdition = foundMaster; - } + if ( + curr.metadata && + !curr.masterEdition && + curr.metadata.info.masterEdition + ) { + let foundMaster = + masterEditions[curr.metadata.info.masterEdition.toBase58()]; + + curr.masterEdition = foundMaster; } } 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/models/metaplex/redeemLimitedEditionBid.ts b/packages/metavinci/src/models/metaplex/redeemLimitedEditionBid.ts index a9f81b0..fc4d915 100644 --- a/packages/metavinci/src/models/metaplex/redeemLimitedEditionBid.ts +++ b/packages/metavinci/src/models/metaplex/redeemLimitedEditionBid.ts @@ -145,7 +145,7 @@ export async function redeemLimitedEditionBid( { pubkey: masterMint, isSigner: false, - isWritable: false, + isWritable: true, }, { pubkey: masterEdition, 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 48069a6..61ffb0f 100644 --- a/packages/metavinci/src/views/auctionCreate/index.tsx +++ b/packages/metavinci/src/views/auctionCreate/index.tsx @@ -53,7 +53,7 @@ import { WinningConstraint, } from '../../models/metaplex'; import { serialize } from 'borsh'; -import moment from 'moment' +import moment from 'moment'; import { createAuctionManager, SafetyDepositDraft, @@ -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; @@ -95,7 +96,6 @@ export interface AuctionState { // suggested date time when auction should end UTC+0 endDate?: Date; - ////////////////// category: AuctionCategory; saleType?: 'auction' | 'sale'; @@ -153,39 +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.Single) { - console.log('Using single'); + } 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: item.masterEdition - ? EditionType.MasterEdition - : EditionType.NA, + editionType: + attributes.category == AuctionCategory.Limited + ? EditionType.LimitedEdition + : 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'); } @@ -197,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('3EVo6RQfu5D1DC18jsqrQnbiKLYoig8yckJC7QgMiJVY'), ); @@ -462,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 ( @@ -491,6 +508,7 @@ const CopiesStep = (props: { { props.setAttributes({ ...props.attributes, items }); @@ -532,12 +550,12 @@ const CopiesStep = (props: { tiers: !props.attributes.tiers || props.attributes.tiers?.length == 0 ? [ - { - to: 0, - name: 'Default Tier', - items: props.attributes.items, - }, - ] + { + to: 0, + name: 'Default Tier', + items: props.attributes.items, + }, + ] : props.attributes.tiers, }); props.confirm(); @@ -607,7 +625,7 @@ const TierWinners = (props: { previousTo?: number; lastTier?: Tier; }) => { - const from = (props.previousTo || 0) + 1 + const from = (props.previousTo || 0) + 1; return ( <> @@ -620,9 +638,7 @@ const TierWinners = (props: { type="number" className="input" style={{ width: '30%' }} - onChange={value => - null - } + onChange={value => null} />  to  - { }} allowMultiple={true} /> + {}} allowMultiple={true} /> ); }; @@ -720,7 +736,7 @@ const TierStep = (props: { (_, idx) => ({ to: Math.trunc( ((idx + 1) * (props.attributes.spots as number)) / - parseInt(info.target.value), + parseInt(info.target.value), ), name: '', description: '', @@ -742,7 +758,6 @@ const TierStep = (props: { lastTier={tiers.slice(-1)[0]} /> ))} - @@ -959,30 +974,38 @@ const InitialPhaseStep = (props: { const [startNow, setStartNow] = useState(true); const [listNow, setListNow] = useState(true); - const [saleMoment, setSaleMoment] = useState(props.attributes.startSaleTS ? moment.unix(props.attributes.startSaleTS) : undefined) - const [listMoment, setListMoment] = useState(props.attributes.startListTS ? moment.unix(props.attributes.startListTS) : undefined) + const [saleMoment, setSaleMoment] = useState( + props.attributes.startSaleTS + ? moment.unix(props.attributes.startSaleTS) + : undefined, + ); + const [listMoment, setListMoment] = useState( + props.attributes.startListTS + ? moment.unix(props.attributes.startListTS) + : undefined, + ); useEffect(() => { props.setAttributes({ ...props.attributes, - startSaleTS: saleMoment && saleMoment.unix() * 1000 - }) - }, [saleMoment]) + startSaleTS: saleMoment && saleMoment.unix() * 1000, + }); + }, [saleMoment]); useEffect(() => { props.setAttributes({ ...props.attributes, - startListTS: listMoment && listMoment.unix() * 1000 - }) - }, [listMoment]) + startListTS: listMoment && listMoment.unix() * 1000, + }); + }, [listMoment]); useEffect(() => { - if (startNow) setSaleMoment(moment()) - }, [startNow]) + if (startNow) setSaleMoment(moment()); + }, [startNow]); useEffect(() => { - if (listNow) setListMoment(moment()) - }, [listNow]) + if (listNow) setListMoment(moment()); + }, [listNow]); return ( <> @@ -1201,18 +1224,20 @@ const EndingPhaseSale = (props: { confirm: () => void; }) => { const [untilSold, setUntilSold] = useState(true); - const [endMoment, setEndMoment] = useState(props.attributes.endTS ? moment.unix(props.attributes.endTS) : undefined) + const [endMoment, setEndMoment] = useState( + props.attributes.endTS ? moment.unix(props.attributes.endTS) : undefined, + ); useEffect(() => { props.setAttributes({ ...props.attributes, - endTS: endMoment && endMoment.unix() * 1000 - }) - }, [endMoment]) + endTS: endMoment && endMoment.unix() * 1000, + }); + }, [endMoment]); useEffect(() => { - if (untilSold) setEndMoment(undefined) - }, [untilSold]) + if (untilSold) setEndMoment(undefined); + }, [untilSold]); return ( <> @@ -1252,17 +1277,19 @@ const EndingPhaseSale = (props: { current && current < moment().endOf('day')} + disabledDate={current => + current && current < moment().endOf('day') + } value={endMoment} onChange={value => { - if (!value) return - if (!endMoment) return setEndMoment(value) + if (!value) return; + if (!endMoment) return setEndMoment(value); - const currentMoment = endMoment.clone() - currentMoment.hour(value.hour()) - currentMoment.minute(value.minute()) - currentMoment.second(value.second()) - setEndMoment(currentMoment) + const currentMoment = endMoment.clone(); + currentMoment.hour(value.hour()); + currentMoment.minute(value.minute()); + currentMoment.second(value.second()); + setEndMoment(currentMoment); }} /> { - if (!value) return - if (!endMoment) return setEndMoment(value) + if (!value) return; + if (!endMoment) return setEndMoment(value); - const currentMoment = endMoment.clone() - currentMoment.hour(value.hour()) - currentMoment.minute(value.minute()) - currentMoment.second(value.second()) - setEndMoment(currentMoment) + const currentMoment = endMoment.clone(); + currentMoment.hour(value.hour()); + currentMoment.minute(value.minute()); + currentMoment.second(value.second()); + setEndMoment(currentMoment); }} /> @@ -1315,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 diff --git a/packages/metavinci/src/views/home/index.tsx b/packages/metavinci/src/views/home/index.tsx index de2fbcb..2a45539 100644 --- a/packages/metavinci/src/views/home/index.tsx +++ b/packages/metavinci/src/views/home/index.tsx @@ -15,7 +15,6 @@ const { Content } = Layout; export const HomeView = () => { const [activeKey, setActiveKey] = useState(AuctionViewState.Live); const auctions = useAuctions(activeKey); - console.log('Auctions', auctions); const breakpointColumnsObj = { default: 4, 1100: 3,