Fixed for multi auctions

This commit is contained in:
Jordan Prince 2021-04-28 14:23:18 -05:00
parent 676c7c7440
commit e00f4bd33b
6 changed files with 82 additions and 69 deletions

View File

@ -410,7 +410,8 @@ async function setupRedeemOpenInstructions(
[], [],
auctionView.myBidderMetadata.info.bidderPubkey, auctionView.myBidderMetadata.info.bidderPubkey,
wallet.publicKey, wallet.publicKey,
auctionView.auctionManager.info.settings.openEditionFixedPrice || 0, auctionView.auctionManager.info.settings.openEditionFixedPrice?.toNumber() ||
0,
); );
winningPrizeSigner.push(transferAuthority); winningPrizeSigner.push(transferAuthority);

View File

@ -138,14 +138,16 @@ export function MetaProvider({ children = null as any }) {
const account = cache.add( const account = cache.add(
a.pubkey, a.pubkey,
a.account, a.account,
AuctionParser) as AuctionParser,
ParsedAccount<AuctionData>; ) as ParsedAccount<AuctionData>;
account.info.auctionManagerKey = await getAuctionManagerKey( account.info.auctionManagerKey = await getAuctionManagerKey(
account.info.resource, account.info.resource,
a.pubkey, a.pubkey,
); );
const payerAcct = accountByMint.get(account.info.tokenMint.toBase58()); const payerAcct = accountByMint.get(
account.info.tokenMint.toBase58(),
);
if (payerAcct) if (payerAcct)
account.info.bidRedemptionKey = ( account.info.bidRedemptionKey = (
await getBidderKeys(a.pubkey, payerAcct.pubkey) await getBidderKeys(a.pubkey, payerAcct.pubkey)
@ -154,13 +156,7 @@ export function MetaProvider({ children = null as any }) {
...e, ...e,
[a.pubkey.toBase58()]: account, [a.pubkey.toBase58()]: account,
})); }));
} catch (e) { } catch {
if (
a.pubkey.toBase58() ===
'yNPR97243ke5cV3QGW9ZhSxfVP1K2YVQxzkjikCVbee'
) {
console.error(e);
}
// ignore errors // ignore errors
// add type as first byte for easier deserialization // add type as first byte for easier deserialization
} }
@ -170,8 +166,8 @@ export function MetaProvider({ children = null as any }) {
const account = cache.add( const account = cache.add(
a.pubkey, a.pubkey,
a.account, a.account,
BidderMetadataParser) as BidderMetadataParser,
ParsedAccount<BidderMetadata>; ) as ParsedAccount<BidderMetadata>;
setBidderMetadataByAuctionAndBidder(e => ({ setBidderMetadataByAuctionAndBidder(e => ({
...e, ...e,
@ -189,8 +185,8 @@ export function MetaProvider({ children = null as any }) {
const account = cache.add( const account = cache.add(
a.pubkey, a.pubkey,
a.account, a.account,
BidderPotParser) as BidderPotParser,
ParsedAccount<BidderPot>; ) as ParsedAccount<BidderPot>;
setBidderPotsByAuctionAndBidder(e => ({ setBidderPotsByAuctionAndBidder(e => ({
...e, ...e,
@ -370,6 +366,7 @@ export function MetaProvider({ children = null as any }) {
try { try {
if (meta.account.data[0] == MetadataKey.MetadataV1) { if (meta.account.data[0] == MetadataKey.MetadataV1) {
const metadata = await decodeMetadata(meta.account.data); const metadata = await decodeMetadata(meta.account.data);
if ( if (
isValidHttpUrl(metadata.uri) && isValidHttpUrl(metadata.uri) &&
metadata.uri.indexOf('arweave') >= 0 metadata.uri.indexOf('arweave') >= 0

View File

@ -37,6 +37,7 @@ export const useUserArts = (): SafetyDepositDraft[] => {
let i = 0; let i = 0;
ownedMetadata.forEach(m => { ownedMetadata.forEach(m => {
let a = accountByMint.get(m.info.mint.toBase58()); let a = accountByMint.get(m.info.mint.toBase58());
if (a) { if (a) {
safetyDeposits.push({ safetyDeposits.push({
holding: a.pubkey, holding: a.pubkey,

View File

@ -7,6 +7,7 @@ import {
EDITION, EDITION,
} from '@oyster/common'; } from '@oyster/common';
import { PublicKey } from '@solana/web3.js'; import { PublicKey } from '@solana/web3.js';
import BN from 'bn.js';
import { serialize, BinaryReader, BinaryWriter } from 'borsh'; import { serialize, BinaryReader, BinaryWriter } from 'borsh';
export * from './initAuctionManager'; export * from './initAuctionManager';
@ -104,7 +105,7 @@ export class AuctionManagerSettings {
NonWinningConstraint.GivenForFixedPrice; NonWinningConstraint.GivenForFixedPrice;
winningConfigs: WinningConfig[] = []; winningConfigs: WinningConfig[] = [];
openEditionConfig: number | null = 0; openEditionConfig: number | null = 0;
openEditionFixedPrice: number | null = 0; openEditionFixedPrice: BN | null = new BN(0);
constructor(args?: AuctionManagerSettings) { constructor(args?: AuctionManagerSettings) {
Object.assign(this, args); Object.assign(this, args);
@ -221,7 +222,7 @@ export const SCHEMA = new Map<any, any>([
['openEditionNonWinningConstraint', 'u8'], ['openEditionNonWinningConstraint', 'u8'],
['winningConfigs', [WinningConfig]], ['winningConfigs', [WinningConfig]],
['openEditionConfig', { kind: 'option', type: 'u8' }], ['openEditionConfig', { kind: 'option', type: 'u8' }],
['openEditionFixedPrice', { kind: 'option', type: 'u8' }], ['openEditionFixedPrice', { kind: 'option', type: 'u64' }],
], ],
}, },
], ],

View File

@ -11,14 +11,17 @@ export interface ArtSelectorProps extends ButtonProps {
selected: SafetyDepositDraft[]; selected: SafetyDepositDraft[];
setSelected: (selected: SafetyDepositDraft[]) => void; setSelected: (selected: SafetyDepositDraft[]) => void;
allowMultiple: boolean; allowMultiple: boolean;
filter?: (i: SafetyDepositDraft) => boolean;
} }
export const ArtSelector = (props: ArtSelectorProps) => { export const ArtSelector = (props: ArtSelectorProps) => {
const { selected, setSelected, allowMultiple, ...rest } = props; const { selected, setSelected, allowMultiple, ...rest } = props;
const items = useUserArts(); let items = useUserArts();
const selectedItems = useMemo<Set<string>>(() => if (props.filter) items = items.filter(props.filter);
new Set(selected.map(item => item.metadata.pubkey.toBase58())) const selectedItems = useMemo<Set<string>>(
, [selected]); () => new Set(selected.map(item => item.metadata.pubkey.toBase58())),
[selected],
);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
@ -37,7 +40,7 @@ export const ArtSelector = (props: ArtSelectorProps) => {
}; };
const confirm = () => { const confirm = () => {
close(); close();
}; };
const breakpointColumnsObj = { const breakpointColumnsObj = {
@ -72,7 +75,7 @@ export const ArtSelector = (props: ArtSelectorProps) => {
onClick={open} onClick={open}
close={() => { close={() => {
setSelected( setSelected(
selected.filter(_ => _.metadata.pubkey.toBase58() !== key) selected.filter(_ => _.metadata.pubkey.toBase58() !== key),
); );
confirm(); confirm();
}} }}
@ -123,10 +126,10 @@ export const ArtSelector = (props: ArtSelectorProps) => {
? new Set(list.filter(item => item !== id)) ? new Set(list.filter(item => item !== id))
: new Set([...list, id]); : new Set([...list, id]);
let selected = items.filter(item => let selected = items.filter(item =>
newSet.has(item.metadata.pubkey.toBase58()), newSet.has(item.metadata.pubkey.toBase58()),
); );
setSelected(selected); setSelected(selected);
if (!allowMultiple) { if (!allowMultiple) {
confirm(); confirm();

View File

@ -86,6 +86,7 @@ export interface AuctionState {
// listed NFTs // listed NFTs
items: SafetyDepositDraft[]; items: SafetyDepositDraft[];
participationNFT?: SafetyDepositDraft;
// number of editions for this auction (only applicable to limited edition) // number of editions for this auction (only applicable to limited edition)
editions?: number; editions?: number;
@ -152,58 +153,54 @@ export const AuctionCreateView = () => {
if (attributes.category == AuctionCategory.Open) { if (attributes.category == AuctionCategory.Open) {
settings = new AuctionManagerSettings({ settings = new AuctionManagerSettings({
openEditionWinnerConstraint: WinningConstraint.OpenEditionGiven, openEditionWinnerConstraint: WinningConstraint.OpenEditionGiven,
openEditionNonWinningConstraint: NonWinningConstraint.GivenForBidPrice, openEditionNonWinningConstraint:
NonWinningConstraint.GivenForFixedPrice,
winningConfigs: [], winningConfigs: [],
openEditionConfig: 0, openEditionConfig: 0,
openEditionFixedPrice: null, openEditionFixedPrice: new BN(attributes.reservationPrice),
}); });
winnerLimit = new WinnerLimit({ winnerLimit = new WinnerLimit({
type: WinnerLimitType.Unlimited, type: WinnerLimitType.Unlimited,
usize: ZERO, usize: ZERO,
}); });
} else if (attributes.category == AuctionCategory.Limited) { } else if (
attributes.category == AuctionCategory.Limited ||
attributes.category == AuctionCategory.Single
) {
settings = new AuctionManagerSettings({ settings = new AuctionManagerSettings({
openEditionWinnerConstraint: WinningConstraint.NoOpenEdition, openEditionWinnerConstraint: attributes.participationNFT
openEditionNonWinningConstraint: NonWinningConstraint.NoOpenEdition, ? WinningConstraint.OpenEditionGiven
: WinningConstraint.NoOpenEdition,
openEditionNonWinningConstraint: attributes.participationNFT
? NonWinningConstraint.GivenForFixedPrice
: NonWinningConstraint.NoOpenEdition,
winningConfigs: attributes.items.map( winningConfigs: attributes.items.map(
(item, index) => (item, index) =>
new WinningConfig({ new WinningConfig({
// TODO: check index // TODO: check index
safetyDepositBoxIndex: index, safetyDepositBoxIndex: index,
amount: 1, amount: 1,
editionType: EditionType.LimitedEdition, editionType:
attributes.category == AuctionCategory.Limited
? EditionType.LimitedEdition
: item.masterEdition
? EditionType.MasterEdition
: EditionType.NA,
}), }),
), ),
openEditionConfig: null, openEditionConfig: attributes.participationNFT
openEditionFixedPrice: null, ? attributes.items.length
}); : null,
winnerLimit = new WinnerLimit({ openEditionFixedPrice: attributes.participationNFT
type: WinnerLimitType.Capped, ? new BN(attributes.reservationPrice)
usize: new BN(attributes.winnersCount), : null,
});
} 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,
}); });
winnerLimit = new WinnerLimit({ winnerLimit = new WinnerLimit({
type: WinnerLimitType.Capped, type: WinnerLimitType.Capped,
usize: new BN(attributes.winnersCount), usize: new BN(attributes.winnersCount),
}); });
console.log('Settings', settings);
} else { } else {
throw new Error('Not supported'); throw new Error('Not supported');
} }
@ -215,7 +212,10 @@ export const AuctionCreateView = () => {
winnerLimit, winnerLimit,
new BN((attributes.auctionDuration || 1) * 60), new BN((attributes.auctionDuration || 1) * 60),
new BN((attributes.gapTime || 1) * 60), new BN((attributes.gapTime || 1) * 60),
attributes.items, [
...attributes.items,
...(attributes.participationNFT ? [attributes.participationNFT] : []),
],
// TODO: move to config // TODO: move to config
new PublicKey('4XEUcBjLyBHuMDKTARycf4VXqpsAsDcThMbhWgFuDGsC'), new PublicKey('4XEUcBjLyBHuMDKTARycf4VXqpsAsDcThMbhWgFuDGsC'),
); );
@ -480,22 +480,21 @@ const CopiesStep = (props: {
setAttributes: (attr: AuctionState) => void; setAttributes: (attr: AuctionState) => void;
confirm: () => void; confirm: () => void;
}) => { }) => {
const items = useUserArts(); let filter: ((i: SafetyDepositDraft) => boolean) | undefined;
let eligibleItems: SafetyDepositDraft[] = [];
if (props.attributes.category == AuctionCategory.Limited) { if (props.attributes.category == AuctionCategory.Limited) {
eligibleItems = items.filter(i => i.masterEdition); filter = (i: SafetyDepositDraft) => !!i.masterEdition;
} else if ( } else if (
props.attributes.category == AuctionCategory.Single || props.attributes.category == AuctionCategory.Single ||
props.attributes.category == AuctionCategory.Tiered props.attributes.category == AuctionCategory.Tiered
) { ) {
eligibleItems = items; filter = undefined;
} else if (props.attributes.category == AuctionCategory.Open) { } else if (props.attributes.category == AuctionCategory.Open) {
eligibleItems = items.filter( filter = (i: SafetyDepositDraft) =>
i => !!(
i.masterEdition && i.masterEdition &&
(i.masterEdition.info.maxSupply == undefined || (i.masterEdition.info.maxSupply == undefined ||
i.masterEdition.info.maxSupply == null), i.masterEdition.info.maxSupply == null)
); );
} }
return ( return (
@ -509,6 +508,7 @@ const CopiesStep = (props: {
<Row className="content-action"> <Row className="content-action">
<Col xl={24}> <Col xl={24}>
<ArtSelector <ArtSelector
filter={filter}
selected={props.attributes.items} selected={props.attributes.items}
setSelected={items => { setSelected={items => {
props.setAttributes({ ...props.attributes, items }); props.setAttributes({ ...props.attributes, items });
@ -1342,11 +1342,21 @@ const ParticipationStep = (props: {
<Row className="content-action"> <Row className="content-action">
<Col className="section" xl={24}> <Col className="section" xl={24}>
<ArtSelector <ArtSelector
selected={[]} filter={(i: SafetyDepositDraft) => !!i.masterEdition}
setSelected={() => {}} selected={
props.attributes.participationNFT
? [props.attributes.participationNFT]
: []
}
setSelected={items => {
props.setAttributes({
...props.attributes,
participationNFT: items[0],
});
}}
allowMultiple={false} allowMultiple={false}
> >
Select NFT Select Participation NFT
</ArtSelector> </ArtSelector>
</Col> </Col>
</Row> </Row>