feat(actions): manual auction start (#127)

This commit is contained in:
shotgunofdeath 2021-07-16 02:30:37 +03:00 committed by GitHub
parent c63820b4f5
commit 5d14dc958f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 100 additions and 14 deletions

View File

@ -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);
}
}

View File

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

View File

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