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,
|
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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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' }],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue