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

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

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

@ -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: {
<Row className="content-action">
<Col xl={24}>
<ArtSelector
filter={filter}
selected={props.attributes.items}
setSelected={items => {
props.setAttributes({ ...props.attributes, items });
@ -1342,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>