mirror of https://github.com/certusone/oyster.git
Merge remote-tracking branch 'origin/feature/m-jordan' into feature/m
This commit is contained in:
commit
a6107cc2df
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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' }],
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
|
@ -145,7 +145,7 @@ export async function redeemLimitedEditionBid(
|
|||
{
|
||||
pubkey: masterMint,
|
||||
isSigner: false,
|
||||
isWritable: false,
|
||||
isWritable: true,
|
||||
},
|
||||
{
|
||||
pubkey: masterEdition,
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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}
|
||||
/>
|
||||
to
|
||||
<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>
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue