mirror of https://github.com/certusone/oyster.git
Fixed for multi auctions
This commit is contained in:
parent
676c7c7440
commit
e00f4bd33b
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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' }],
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue