Merge remote-tracking branch 'origin/feature/m-jordan' into feature/m

This commit is contained in:
bartosz-lipinski 2021-04-28 16:39:35 -05:00
commit a6107cc2df
11 changed files with 242 additions and 212 deletions

View File

@ -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();

View File

@ -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<Account[]>,
instructions: Array<TransactionInstruction[]>,
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);

View File

@ -138,14 +138,16 @@ export function MetaProvider({ children = null as any }) {
const account = cache.add(
a.pubkey,
a.account,
AuctionParser) as
ParsedAccount<AuctionData>;
AuctionParser,
) as ParsedAccount<AuctionData>;
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<BidderMetadata>;
BidderMetadataParser,
) as ParsedAccount<BidderMetadata>;
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<BidderPot>;
BidderPotParser,
) as ParsedAccount<BidderPot>;
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

View File

@ -10,13 +10,9 @@ export const useAuction = (id: string) => {
prev.set(acc.info.mint.toBase58(), acc);
return prev;
}, new Map<string, TokenAccount>());
const [clock, setClock] = useState<number>(0);
const [existingAuctionView, setAuctionView] = useState<AuctionView | null>(
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,

View File

@ -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<string, TokenAccount>());
const [clock, setClock] = useState<number>(0);
const [auctionViews, setAuctionViews] = useState<
Record<string, AuctionView | undefined>
>({});
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<string, ParsedAccount<MasterEdition>>,
vaults: Record<string, ParsedAccount<Vault>>,
accountByMint: Map<string, TokenAccount>,
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;
}
}

View File

@ -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,

View File

@ -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<any, any>([
['openEditionNonWinningConstraint', 'u8'],
['winningConfigs', [WinningConfig]],
['openEditionConfig', { kind: 'option', type: 'u8' }],
['openEditionFixedPrice', { kind: 'option', type: 'u8' }],
['openEditionFixedPrice', { kind: 'option', type: 'u64' }],
],
},
],

View File

@ -145,7 +145,7 @@ export async function redeemLimitedEditionBid(
{
pubkey: masterMint,
isSigner: false,
isWritable: false,
isWritable: true,
},
{
pubkey: masterEdition,

View File

@ -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<Set<string>>(() =>
new Set(selected.map(item => item.metadata.pubkey.toBase58()))
, [selected]);
let items = useUserArts();
if (props.filter) items = items.filter(props.filter);
const selectedItems = useMemo<Set<string>>(
() => 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();

View File

@ -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: {
<Row className="content-action">
<Col xl={24}>
<ArtSelector
filter={filter}
selected={props.attributes.items}
setSelected={items => {
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 (
<>
<Divider />
@ -620,9 +638,7 @@ const TierWinners = (props: {
type="number"
className="input"
style={{ width: '30%' }}
onChange={value =>
null
}
onChange={value => null}
/>
&nbsp;to&nbsp;
<InputNumber
@ -671,7 +687,7 @@ const TierWinners = (props: {
/>
</label>
<ArtSelector selected={[]} setSelected={_ => { }} allowMultiple={true} />
<ArtSelector selected={[]} setSelected={_ => {}} 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]}
/>
))}
</Col>
</Row>
<Row>
@ -959,30 +974,38 @@ const InitialPhaseStep = (props: {
const [startNow, setStartNow] = useState<boolean>(true);
const [listNow, setListNow] = useState<boolean>(true);
const [saleMoment, setSaleMoment] = useState<moment.Moment | undefined>(props.attributes.startSaleTS ? moment.unix(props.attributes.startSaleTS) : undefined)
const [listMoment, setListMoment] = useState<moment.Moment | undefined>(props.attributes.startListTS ? moment.unix(props.attributes.startListTS) : undefined)
const [saleMoment, setSaleMoment] = useState<moment.Moment | undefined>(
props.attributes.startSaleTS
? moment.unix(props.attributes.startSaleTS)
: undefined,
);
const [listMoment, setListMoment] = useState<moment.Moment | undefined>(
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<boolean>(true);
const [endMoment, setEndMoment] = useState<moment.Moment | undefined>(props.attributes.endTS ? moment.unix(props.attributes.endTS) : undefined)
const [endMoment, setEndMoment] = useState<moment.Moment | undefined>(
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: {
<DatePicker
className="field-date"
size="large"
disabledDate={current => 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);
}}
/>
<TimePicker
@ -1270,14 +1297,14 @@ const EndingPhaseSale = (props: {
size="large"
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);
}}
/>
</label>
@ -1315,11 +1342,21 @@ const ParticipationStep = (props: {
<Row className="content-action">
<Col className="section" xl={24}>
<ArtSelector
selected={[]}
setSelected={() => { }}
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
</ArtSelector>
</Col>
</Row>

View File

@ -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,