feat(actions): manual auction start (#127)
This commit is contained in:
parent
c63820b4f5
commit
5d14dc958f
|
@ -0,0 +1,35 @@
|
|||
import { Connection, Keypair, TransactionInstruction } from '@solana/web3.js';
|
||||
import { startAuction } from '../models/metaplex';
|
||||
import { notify, sendTransactionWithRetry } from '@oyster/common';
|
||||
import { AuctionView } from '../hooks';
|
||||
|
||||
export async function startAuctionManually(
|
||||
connection: Connection,
|
||||
wallet: any,
|
||||
auctionView: AuctionView,
|
||||
) {
|
||||
try {
|
||||
const signers: Keypair[] = [];
|
||||
let instructions: TransactionInstruction[] = [];
|
||||
|
||||
await startAuction(
|
||||
auctionView.vault.pubkey,
|
||||
auctionView.auctionManager.info.authority,
|
||||
instructions,
|
||||
);
|
||||
|
||||
await sendTransactionWithRetry(connection, wallet, instructions, signers);
|
||||
|
||||
notify({
|
||||
message: 'Auction started',
|
||||
type: 'success',
|
||||
});
|
||||
} catch (e) {
|
||||
notify({
|
||||
message: 'Transaction failed...',
|
||||
description: 'Failed to start the auction',
|
||||
type: 'error',
|
||||
});
|
||||
return Promise.reject(e);
|
||||
}
|
||||
}
|
|
@ -17,6 +17,7 @@ import {
|
|||
ParsedAccount,
|
||||
getAuctionExtended,
|
||||
programIds,
|
||||
AuctionState,
|
||||
} from '@oyster/common';
|
||||
import { AuctionView, useUserBalance } from '../../hooks';
|
||||
import { sendPlaceBid } from '../../actions/sendPlaceBid';
|
||||
|
@ -26,6 +27,7 @@ import {
|
|||
eligibleForParticipationPrizeGivenWinningIndex,
|
||||
} from '../../actions/sendRedeemBid';
|
||||
import { sendCancelBid } from '../../actions/cancelBid';
|
||||
import { startAuctionManually } from '../../actions/startAuctionManually';
|
||||
import BN from 'bn.js';
|
||||
import { Confetti } from '../Confetti';
|
||||
import { QUOTE_MINT } from '../../constants';
|
||||
|
@ -163,6 +165,13 @@ export const AuctionCard = ({
|
|||
|
||||
const gapBidInvalid = useGapTickCheck(value, gapTick, gapTime, auctionView);
|
||||
|
||||
const isAuctionManagerAuthorityNotWalletOwner =
|
||||
auctionView.auctionManager.info.authority.toBase58() !=
|
||||
wallet?.publicKey?.toBase58();
|
||||
|
||||
const isAuctionNotStarted =
|
||||
auctionView.auction.info.state === AuctionState.Created;
|
||||
|
||||
return (
|
||||
<div className="auction-container" style={style}>
|
||||
<Col>
|
||||
|
@ -182,8 +191,7 @@ export const AuctionCard = ({
|
|||
disabled={
|
||||
!myPayingAccount ||
|
||||
(!auctionView.myBidderMetadata &&
|
||||
auctionView.auctionManager.info.authority.toBase58() !=
|
||||
wallet?.publicKey?.toBase58()) ||
|
||||
isAuctionManagerAuthorityNotWalletOwner) ||
|
||||
loading ||
|
||||
!!auctionView.items.find(i => i.find(it => !it.metadata))
|
||||
}
|
||||
|
@ -227,18 +235,40 @@ export const AuctionCard = ({
|
|||
</Button>
|
||||
)}
|
||||
|
||||
{!hideDefaultAction && connected && !auctionView.auction.info.ended() && (
|
||||
<Button
|
||||
type="primary"
|
||||
size="large"
|
||||
className="action-btn"
|
||||
disabled={loading}
|
||||
onClick={() => setShowBidModal(true)}
|
||||
style={{ marginTop: 20 }}
|
||||
>
|
||||
{loading ? <Spin /> : 'Place bid'}
|
||||
</Button>
|
||||
)}
|
||||
{!hideDefaultAction &&
|
||||
connected &&
|
||||
!auctionView.auction.info.ended() &&
|
||||
(isAuctionNotStarted && !isAuctionManagerAuthorityNotWalletOwner ? (
|
||||
<Button
|
||||
type="primary"
|
||||
size="large"
|
||||
className="action-btn"
|
||||
disabled={loading}
|
||||
onClick={async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
await startAuctionManually(connection, wallet, auctionView);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
setLoading(false);
|
||||
}}
|
||||
style={{ marginTop: 20 }}
|
||||
>
|
||||
{loading ? <Spin /> : 'Start auction'}
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
type="primary"
|
||||
size="large"
|
||||
className="action-btn"
|
||||
disabled={loading}
|
||||
onClick={() => setShowBidModal(true)}
|
||||
style={{ marginTop: 20 }}
|
||||
>
|
||||
{loading ? <Spin /> : 'Place bid'}
|
||||
</Button>
|
||||
))}
|
||||
|
||||
{!hideDefaultAction && !connected && (
|
||||
<Button
|
||||
|
|
|
@ -20,6 +20,7 @@ import { decommAuctionManagerAndReturnPrizes } from '../../actions/decommAuction
|
|||
import { sendSignMetadata } from '../../actions/sendSignMetadata';
|
||||
import { unwindVault } from '../../actions/unwindVault';
|
||||
import { settle } from '../../actions/settle';
|
||||
import { startAuctionManually } from '../../actions/startAuctionManually';
|
||||
|
||||
import { QUOTE_MINT } from '../../constants';
|
||||
import { useMeta } from '../../contexts';
|
||||
|
@ -290,6 +291,7 @@ export function Notifications() {
|
|||
const possiblyBrokenAuctionManagerSetups = useAuctions(
|
||||
AuctionViewState.Defective,
|
||||
);
|
||||
const upcomingAuctions = useAuctions(AuctionViewState.Upcoming);
|
||||
const connection = useConnection();
|
||||
const { wallet } = useWallet();
|
||||
const { accountByMint } = useUserAccounts();
|
||||
|
@ -409,6 +411,25 @@ export function Notifications() {
|
|||
});
|
||||
});
|
||||
|
||||
upcomingAuctions
|
||||
.filter(v => v.auctionManager.info.authority.toBase58() === walletPubkey)
|
||||
.forEach(v => {
|
||||
notifications.push({
|
||||
id: v.auctionManager.pubkey.toBase58(),
|
||||
title: 'You have an auction which is not started yet!',
|
||||
description: <span>You can activate it now if you wish.</span>,
|
||||
action: async () => {
|
||||
try {
|
||||
await startAuctionManually(connection, wallet, v);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
const content = notifications.length ? (
|
||||
<div style={{ width: '300px' }}>
|
||||
<List
|
||||
|
|
Loading…
Reference in New Issue