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
cc2d58a264
|
@ -142,27 +142,30 @@ export class WinnerLimit {
|
||||||
class CreateAuctionArgs {
|
class CreateAuctionArgs {
|
||||||
instruction: number = 0;
|
instruction: number = 0;
|
||||||
/// How many winners are allowed for this auction. See AuctionData.
|
/// How many winners are allowed for this auction. See AuctionData.
|
||||||
winners: WinnerLimit;
|
winnerType: number;
|
||||||
|
winnerAmount: BN | null;
|
||||||
/// The resource being auctioned. See AuctionData.
|
/// The resource being auctioned. See AuctionData.
|
||||||
resource: PublicKey;
|
resource: PublicKey;
|
||||||
/// End time is the cut-off point that the auction is forced to end by. See AuctionData.
|
/// End time is the cut-off point that the auction is forced to end by. See AuctionData.
|
||||||
endAuctionAt?: BN;
|
endAuctionAt: BN | null;
|
||||||
/// Gap time is how much time after the previous bid where the auction ends. See AuctionData.
|
/// Gap time is how much time after the previous bid where the auction ends. See AuctionData.
|
||||||
endAuctionGap?: BN;
|
endAuctionGap: BN | null;
|
||||||
/// Token mint for the SPL token used for bidding.
|
/// Token mint for the SPL token used for bidding.
|
||||||
tokenMint: PublicKey;
|
tokenMint: PublicKey;
|
||||||
/// Authority
|
/// Authority
|
||||||
authority: PublicKey;
|
authority: PublicKey;
|
||||||
|
|
||||||
constructor(args: {
|
constructor(args: {
|
||||||
winners: WinnerLimit;
|
winnerType: number;
|
||||||
|
winnerAmount: BN | null;
|
||||||
resource: PublicKey;
|
resource: PublicKey;
|
||||||
endAuctionAt?: BN;
|
endAuctionAt: BN | null;
|
||||||
endAuctionGap?: BN;
|
endAuctionGap: BN | null;
|
||||||
tokenMint: PublicKey;
|
tokenMint: PublicKey;
|
||||||
authority: PublicKey;
|
authority: PublicKey;
|
||||||
}) {
|
}) {
|
||||||
this.winners = args.winners;
|
this.winnerType = args.winnerType;
|
||||||
|
this.winnerAmount = args.winnerAmount;
|
||||||
this.resource = args.resource;
|
this.resource = args.resource;
|
||||||
this.endAuctionAt = args.endAuctionAt;
|
this.endAuctionAt = args.endAuctionAt;
|
||||||
this.endAuctionGap = args.endAuctionGap;
|
this.endAuctionGap = args.endAuctionGap;
|
||||||
|
@ -198,8 +201,8 @@ export const AUCTION_SCHEMA = new Map<any, any>([
|
||||||
kind: 'struct',
|
kind: 'struct',
|
||||||
fields: [
|
fields: [
|
||||||
['instruction', 'u8'],
|
['instruction', 'u8'],
|
||||||
['winnerLimitType', 'u8'],
|
['winnerType', 'u8'],
|
||||||
['usize', { kind: 'option', type: 'u64' }],
|
['winnerAmount', { kind: 'option', type: 'u64' }],
|
||||||
['resource', 'pubkey'],
|
['resource', 'pubkey'],
|
||||||
['endAuctionAt', { kind: 'option', type: 'u64' }],
|
['endAuctionAt', { kind: 'option', type: 'u64' }],
|
||||||
['endAuctionGap', { kind: 'option', type: 'u64' }],
|
['endAuctionGap', { kind: 'option', type: 'u64' }],
|
||||||
|
@ -296,8 +299,8 @@ export const decodeAuctionData = (buffer: Buffer) => {
|
||||||
export async function createAuction(
|
export async function createAuction(
|
||||||
winners: WinnerLimit,
|
winners: WinnerLimit,
|
||||||
resource: PublicKey,
|
resource: PublicKey,
|
||||||
endAuctionAt: BN | undefined,
|
endAuctionAt: BN | null,
|
||||||
endAuctionGap: BN | undefined,
|
endAuctionGap: BN | null,
|
||||||
tokenMint: PublicKey,
|
tokenMint: PublicKey,
|
||||||
authority: PublicKey,
|
authority: PublicKey,
|
||||||
creator: PublicKey,
|
creator: PublicKey,
|
||||||
|
@ -309,7 +312,8 @@ export async function createAuction(
|
||||||
serialize(
|
serialize(
|
||||||
AUCTION_SCHEMA,
|
AUCTION_SCHEMA,
|
||||||
new CreateAuctionArgs({
|
new CreateAuctionArgs({
|
||||||
winners,
|
winnerType: winners.type,
|
||||||
|
winnerAmount: winners.usize == undefined ? null : winners.usize,
|
||||||
resource,
|
resource,
|
||||||
endAuctionAt,
|
endAuctionAt,
|
||||||
endAuctionGap,
|
endAuctionGap,
|
||||||
|
@ -319,6 +323,10 @@ export async function createAuction(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
console.log('Winner', winners);
|
||||||
|
|
||||||
|
console.log('Data', data);
|
||||||
|
|
||||||
const auctionKey: PublicKey = (
|
const auctionKey: PublicKey = (
|
||||||
await PublicKey.findProgramAddress(
|
await PublicKey.findProgramAddress(
|
||||||
[
|
[
|
||||||
|
|
|
@ -529,7 +529,7 @@ export async function createMasterEdition(
|
||||||
const metadataAccount = (
|
const metadataAccount = (
|
||||||
await PublicKey.findProgramAddress(
|
await PublicKey.findProgramAddress(
|
||||||
[
|
[
|
||||||
Buffer.from('metadata'),
|
Buffer.from(METADATA_PREFIX),
|
||||||
metadataProgramId.toBuffer(),
|
metadataProgramId.toBuffer(),
|
||||||
mintKey.toBuffer(),
|
mintKey.toBuffer(),
|
||||||
],
|
],
|
||||||
|
@ -540,7 +540,7 @@ export async function createMasterEdition(
|
||||||
const nameSymbolAccount = (
|
const nameSymbolAccount = (
|
||||||
await PublicKey.findProgramAddress(
|
await PublicKey.findProgramAddress(
|
||||||
[
|
[
|
||||||
Buffer.from('metadata'),
|
Buffer.from(METADATA_PREFIX),
|
||||||
metadataProgramId.toBuffer(),
|
metadataProgramId.toBuffer(),
|
||||||
Buffer.from(name),
|
Buffer.from(name),
|
||||||
Buffer.from(symbol),
|
Buffer.from(symbol),
|
||||||
|
@ -552,10 +552,10 @@ export async function createMasterEdition(
|
||||||
const editionAccount = (
|
const editionAccount = (
|
||||||
await PublicKey.findProgramAddress(
|
await PublicKey.findProgramAddress(
|
||||||
[
|
[
|
||||||
Buffer.from('metadata'),
|
Buffer.from(METADATA_PREFIX),
|
||||||
metadataProgramId.toBuffer(),
|
metadataProgramId.toBuffer(),
|
||||||
mintKey.toBuffer(),
|
mintKey.toBuffer(),
|
||||||
Buffer.from('edition'),
|
Buffer.from(EDITION),
|
||||||
],
|
],
|
||||||
metadataProgramId,
|
metadataProgramId,
|
||||||
)
|
)
|
||||||
|
|
|
@ -204,10 +204,7 @@ export const VAULT_SCHEMA = new Map<any, any>([
|
||||||
kind: 'struct',
|
kind: 'struct',
|
||||||
fields: [
|
fields: [
|
||||||
['instruction', 'u8'],
|
['instruction', 'u8'],
|
||||||
['key', 'u8'],
|
['externalPriceAccount', ExternalPriceAccount],
|
||||||
['pricePerShare', 'u64'],
|
|
||||||
['priceMint', 'pubkey'],
|
|
||||||
['allowToCombine', 'u8'],
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -251,7 +248,7 @@ export const VAULT_SCHEMA = new Map<any, any>([
|
||||||
['key', 'u8'],
|
['key', 'u8'],
|
||||||
['pricePerShare', 'u64'],
|
['pricePerShare', 'u64'],
|
||||||
['priceMint', 'pubkey'],
|
['priceMint', 'pubkey'],
|
||||||
['allowToCombine', 'u8'],
|
['allowedToCombine', 'u8'],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -671,6 +668,7 @@ export async function updateExternalPriceAccount(
|
||||||
|
|
||||||
const value = new UpdateExternalPriceAccountArgs({ externalPriceAccount });
|
const value = new UpdateExternalPriceAccountArgs({ externalPriceAccount });
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
||||||
|
console.log('Data', data);
|
||||||
|
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
|
|
|
@ -487,6 +487,11 @@ export async function sendSignedTransaction({
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (confirmation.err) {
|
||||||
|
console.error(confirmation.err);
|
||||||
|
throw new Error('Transaction failed: Custom instruction error');
|
||||||
|
}
|
||||||
|
|
||||||
slot = confirmation?.slot || 0;
|
slot = confirmation?.slot || 0;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.timeout) {
|
if (err.timeout) {
|
||||||
|
@ -580,8 +585,10 @@ async function awaitTransactionSignatureConfirmation(
|
||||||
confirmations: 0,
|
confirmations: 0,
|
||||||
};
|
};
|
||||||
if (result.err) {
|
if (result.err) {
|
||||||
|
console.log('Rejected via websocket', result.err);
|
||||||
reject(result.err);
|
reject(result.err);
|
||||||
} else {
|
} else {
|
||||||
|
console.log('Resolved via websocket', result);
|
||||||
resolve(result);
|
resolve(result);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -624,7 +631,7 @@ async function awaitTransactionSignatureConfirmation(
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
})
|
})
|
||||||
.catch(_ => {
|
.catch(err => {
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
if (connection._signatureSubscriptions[subId])
|
if (connection._signatureSubscriptions[subId])
|
||||||
connection.removeSignatureListener(subId);
|
connection.removeSignatureListener(subId);
|
||||||
|
|
|
@ -40,12 +40,6 @@ export async function closeVault(
|
||||||
);
|
);
|
||||||
let signers: Account[] = [];
|
let signers: Account[] = [];
|
||||||
let instructions: TransactionInstruction[] = [];
|
let instructions: TransactionInstruction[] = [];
|
||||||
const vaultAuthority = (
|
|
||||||
await PublicKey.findProgramAddress(
|
|
||||||
[Buffer.from(VAULT_PREFIX), PROGRAM_IDS.vault.toBuffer()],
|
|
||||||
PROGRAM_IDS.vault,
|
|
||||||
)
|
|
||||||
)[0];
|
|
||||||
|
|
||||||
const auctionKey: PublicKey = (
|
const auctionKey: PublicKey = (
|
||||||
await PublicKey.findProgramAddress(
|
await PublicKey.findProgramAddress(
|
||||||
|
@ -70,7 +64,7 @@ export async function closeVault(
|
||||||
vault,
|
vault,
|
||||||
fractionMint,
|
fractionMint,
|
||||||
fractionTreasury,
|
fractionTreasury,
|
||||||
vaultAuthority,
|
wallet.publicKey,
|
||||||
instructions,
|
instructions,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -92,14 +86,30 @@ export async function closeVault(
|
||||||
signers,
|
signers,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let transferAuthority = new Account();
|
||||||
|
|
||||||
// Shouldn't need to pay anything since we activated vault with 0 shares, but we still
|
// Shouldn't need to pay anything since we activated vault with 0 shares, but we still
|
||||||
// need this setup anyway.
|
// need this setup anyway.
|
||||||
const transferAuthority = approve(
|
approve(
|
||||||
instructions,
|
instructions,
|
||||||
[],
|
[],
|
||||||
payingTokenAccount,
|
payingTokenAccount,
|
||||||
wallet.publicKey,
|
wallet.publicKey,
|
||||||
0,
|
0,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
transferAuthority,
|
||||||
|
);
|
||||||
|
|
||||||
|
approve(
|
||||||
|
instructions,
|
||||||
|
[],
|
||||||
|
outstandingShareAccount,
|
||||||
|
wallet.publicKey,
|
||||||
|
0,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
transferAuthority,
|
||||||
);
|
);
|
||||||
|
|
||||||
signers.push(transferAuthority);
|
signers.push(transferAuthority);
|
|
@ -31,6 +31,7 @@ import { createVault } from './createVault';
|
||||||
import { closeVault } from './closeVault';
|
import { closeVault } from './closeVault';
|
||||||
import { addTokensToVault } from './addTokensToVault';
|
import { addTokensToVault } from './addTokensToVault';
|
||||||
import { makeAuction } from './makeAuction';
|
import { makeAuction } from './makeAuction';
|
||||||
|
import { createExternalPriceAccount } from './createExternalPriceAccount';
|
||||||
const { createTokenAccount } = actions;
|
const { createTokenAccount } = actions;
|
||||||
|
|
||||||
interface normalPattern {
|
interface normalPattern {
|
||||||
|
@ -51,6 +52,7 @@ interface byType {
|
||||||
makeAuction: normalPattern;
|
makeAuction: normalPattern;
|
||||||
initAuctionManager: normalPattern;
|
initAuctionManager: normalPattern;
|
||||||
startAuction: normalPattern;
|
startAuction: normalPattern;
|
||||||
|
externalPriceAccount: normalPattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SafetyDepositDraft {
|
export interface SafetyDepositDraft {
|
||||||
|
@ -77,16 +79,21 @@ export async function createAuctionManager(
|
||||||
auction: PublicKey;
|
auction: PublicKey;
|
||||||
auctionManager: PublicKey;
|
auctionManager: PublicKey;
|
||||||
}> {
|
}> {
|
||||||
|
const {
|
||||||
|
externalPriceAccount,
|
||||||
|
priceMint,
|
||||||
|
instructions: epaInstructions,
|
||||||
|
signers: epaSigners,
|
||||||
|
} = await createExternalPriceAccount(connection, wallet);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
instructions: createVaultInstructions,
|
instructions: createVaultInstructions,
|
||||||
signers: createVaultSigners,
|
signers: createVaultSigners,
|
||||||
vault,
|
vault,
|
||||||
externalPriceAccount,
|
|
||||||
fractionalMint,
|
fractionalMint,
|
||||||
redeemTreasury,
|
redeemTreasury,
|
||||||
fractionTreasury,
|
fractionTreasury,
|
||||||
priceMint,
|
} = await createVault(connection, wallet, priceMint, externalPriceAccount);
|
||||||
} = await createVault(connection, wallet);
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
instructions: makeAuctionInstructions,
|
instructions: makeAuctionInstructions,
|
||||||
|
@ -131,6 +138,10 @@ export async function createAuctionManager(
|
||||||
} = await addTokensToVault(connection, wallet, vault, nftConfigs);
|
} = await addTokensToVault(connection, wallet, vault, nftConfigs);
|
||||||
|
|
||||||
let lookup: byType = {
|
let lookup: byType = {
|
||||||
|
externalPriceAccount: {
|
||||||
|
instructions: epaInstructions,
|
||||||
|
signers: epaSigners,
|
||||||
|
},
|
||||||
createVault: {
|
createVault: {
|
||||||
instructions: createVaultInstructions,
|
instructions: createVaultInstructions,
|
||||||
signers: createVaultSigners,
|
signers: createVaultSigners,
|
||||||
|
@ -159,6 +170,7 @@ export async function createAuctionManager(
|
||||||
};
|
};
|
||||||
|
|
||||||
let signers: Account[][] = [
|
let signers: Account[][] = [
|
||||||
|
lookup.externalPriceAccount.signers,
|
||||||
lookup.createVault.signers,
|
lookup.createVault.signers,
|
||||||
...lookup.addTokens.signers,
|
...lookup.addTokens.signers,
|
||||||
lookup.closeVault.signers,
|
lookup.closeVault.signers,
|
||||||
|
@ -168,6 +180,7 @@ export async function createAuctionManager(
|
||||||
lookup.startAuction.signers,
|
lookup.startAuction.signers,
|
||||||
];
|
];
|
||||||
let instructions: TransactionInstruction[][] = [
|
let instructions: TransactionInstruction[][] = [
|
||||||
|
lookup.externalPriceAccount.instructions,
|
||||||
lookup.createVault.instructions,
|
lookup.createVault.instructions,
|
||||||
...lookup.addTokens.instructions,
|
...lookup.addTokens.instructions,
|
||||||
lookup.closeVault.instructions,
|
lookup.closeVault.instructions,
|
||||||
|
@ -225,13 +238,13 @@ async function setupAuctionManagerInstructions(
|
||||||
vault,
|
vault,
|
||||||
openEditionSafetyDeposit?.metadata.pubkey,
|
openEditionSafetyDeposit?.metadata.pubkey,
|
||||||
openEditionSafetyDeposit?.nameSymbol?.pubkey,
|
openEditionSafetyDeposit?.nameSymbol?.pubkey,
|
||||||
wallet.pubkey,
|
wallet.publicKey,
|
||||||
openEditionSafetyDeposit?.masterEdition?.pubkey,
|
openEditionSafetyDeposit?.masterEdition?.pubkey,
|
||||||
openEditionSafetyDeposit?.metadata.info.mint,
|
openEditionSafetyDeposit?.metadata.info.mint,
|
||||||
openEditionSafetyDeposit?.masterEdition?.info.masterMint,
|
openEditionSafetyDeposit?.masterEdition?.info.masterMint,
|
||||||
wallet.pubkey,
|
wallet.publicKey,
|
||||||
wallet.pubkey,
|
wallet.publicKey,
|
||||||
wallet.pubkey,
|
wallet.publicKey,
|
||||||
acceptPayment,
|
acceptPayment,
|
||||||
settings,
|
settings,
|
||||||
instructions,
|
instructions,
|
||||||
|
@ -282,12 +295,12 @@ async function validateBoxes(
|
||||||
safetyDepositBox,
|
safetyDepositBox,
|
||||||
stores[i],
|
stores[i],
|
||||||
safetyDeposits[i].metadata.info.mint,
|
safetyDeposits[i].metadata.info.mint,
|
||||||
wallet.pubkey,
|
wallet.publicKey,
|
||||||
wallet.pubkey,
|
wallet.publicKey,
|
||||||
wallet.pubkey,
|
wallet.publicKey,
|
||||||
tokenInstructions,
|
tokenInstructions,
|
||||||
safetyDeposits[i].masterEdition?.info.masterMint,
|
safetyDeposits[i].masterEdition?.info.masterMint,
|
||||||
safetyDeposits[i].masterEdition ? wallet.pubkey : undefined,
|
safetyDeposits[i].masterEdition ? wallet.publicKey : undefined,
|
||||||
);
|
);
|
||||||
|
|
||||||
signers.push(tokenSigners);
|
signers.push(tokenSigners);
|
|
@ -0,0 +1,81 @@
|
||||||
|
import {
|
||||||
|
Account,
|
||||||
|
Connection,
|
||||||
|
PublicKey,
|
||||||
|
SystemProgram,
|
||||||
|
TransactionInstruction,
|
||||||
|
} from '@solana/web3.js';
|
||||||
|
import { utils, actions, createMint, VAULT_SCHEMA } from '@oyster/common';
|
||||||
|
|
||||||
|
import { MintLayout } from '@solana/spl-token';
|
||||||
|
import BN from 'bn.js';
|
||||||
|
const {
|
||||||
|
updateExternalPriceAccount,
|
||||||
|
ExternalPriceAccount,
|
||||||
|
MAX_EXTERNAL_ACCOUNT_SIZE,
|
||||||
|
} = actions;
|
||||||
|
|
||||||
|
// This command creates the external pricing oracle
|
||||||
|
export async function createExternalPriceAccount(
|
||||||
|
connection: Connection,
|
||||||
|
wallet: any,
|
||||||
|
): Promise<{
|
||||||
|
priceMint: PublicKey;
|
||||||
|
externalPriceAccount: PublicKey;
|
||||||
|
instructions: TransactionInstruction[];
|
||||||
|
signers: Account[];
|
||||||
|
}> {
|
||||||
|
const PROGRAM_IDS = utils.programIds();
|
||||||
|
|
||||||
|
let signers: Account[] = [];
|
||||||
|
let instructions: TransactionInstruction[] = [];
|
||||||
|
|
||||||
|
const mintRentExempt = await connection.getMinimumBalanceForRentExemption(
|
||||||
|
MintLayout.span,
|
||||||
|
);
|
||||||
|
|
||||||
|
const epaRentExempt = await connection.getMinimumBalanceForRentExemption(
|
||||||
|
MAX_EXTERNAL_ACCOUNT_SIZE,
|
||||||
|
);
|
||||||
|
|
||||||
|
let externalPriceAccount = new Account();
|
||||||
|
|
||||||
|
const priceMint = createMint(
|
||||||
|
instructions,
|
||||||
|
wallet.publicKey,
|
||||||
|
mintRentExempt,
|
||||||
|
0,
|
||||||
|
wallet.publicKey,
|
||||||
|
wallet.publicKey,
|
||||||
|
signers,
|
||||||
|
);
|
||||||
|
|
||||||
|
let epaStruct = new ExternalPriceAccount({
|
||||||
|
pricePerShare: new BN(0),
|
||||||
|
priceMint: priceMint,
|
||||||
|
allowedToCombine: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const uninitializedEPA = SystemProgram.createAccount({
|
||||||
|
fromPubkey: wallet.publicKey,
|
||||||
|
newAccountPubkey: externalPriceAccount.publicKey,
|
||||||
|
lamports: epaRentExempt,
|
||||||
|
space: MAX_EXTERNAL_ACCOUNT_SIZE,
|
||||||
|
programId: PROGRAM_IDS.vault,
|
||||||
|
});
|
||||||
|
instructions.push(uninitializedEPA);
|
||||||
|
signers.push(externalPriceAccount);
|
||||||
|
|
||||||
|
await updateExternalPriceAccount(
|
||||||
|
externalPriceAccount.publicKey,
|
||||||
|
epaStruct,
|
||||||
|
instructions,
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
externalPriceAccount: externalPriceAccount.publicKey,
|
||||||
|
priceMint,
|
||||||
|
instructions,
|
||||||
|
signers,
|
||||||
|
};
|
||||||
|
}
|
|
@ -5,32 +5,23 @@ import {
|
||||||
SystemProgram,
|
SystemProgram,
|
||||||
TransactionInstruction,
|
TransactionInstruction,
|
||||||
} from '@solana/web3.js';
|
} from '@solana/web3.js';
|
||||||
import { contexts, utils, actions, createMint } from '@oyster/common';
|
import { utils, actions, createMint } from '@oyster/common';
|
||||||
|
|
||||||
import { AccountLayout, MintLayout } from '@solana/spl-token';
|
import { AccountLayout, MintLayout } from '@solana/spl-token';
|
||||||
import BN from 'bn.js';
|
const { createTokenAccount, initVault, MAX_VAULT_SIZE, VAULT_PREFIX } = actions;
|
||||||
const {
|
|
||||||
createTokenAccount,
|
|
||||||
initVault,
|
|
||||||
updateExternalPriceAccount,
|
|
||||||
ExternalPriceAccount,
|
|
||||||
MAX_VAULT_SIZE,
|
|
||||||
VAULT_PREFIX,
|
|
||||||
MAX_EXTERNAL_ACCOUNT_SIZE,
|
|
||||||
} = actions;
|
|
||||||
|
|
||||||
// This command creates the external pricing oracle a vault
|
// This command creates the external pricing oracle a vault
|
||||||
// This gets the vault ready for adding the tokens.
|
// This gets the vault ready for adding the tokens.
|
||||||
export async function createVault(
|
export async function createVault(
|
||||||
connection: Connection,
|
connection: Connection,
|
||||||
wallet: any,
|
wallet: any,
|
||||||
|
priceMint: PublicKey,
|
||||||
|
externalPriceAccount: PublicKey,
|
||||||
): Promise<{
|
): Promise<{
|
||||||
vault: PublicKey;
|
vault: PublicKey;
|
||||||
externalPriceAccount: PublicKey;
|
|
||||||
fractionalMint: PublicKey;
|
fractionalMint: PublicKey;
|
||||||
redeemTreasury: PublicKey;
|
redeemTreasury: PublicKey;
|
||||||
fractionTreasury: PublicKey;
|
fractionTreasury: PublicKey;
|
||||||
priceMint: PublicKey;
|
|
||||||
instructions: TransactionInstruction[];
|
instructions: TransactionInstruction[];
|
||||||
signers: Account[];
|
signers: Account[];
|
||||||
}> {
|
}> {
|
||||||
|
@ -51,12 +42,7 @@ export async function createVault(
|
||||||
MAX_VAULT_SIZE,
|
MAX_VAULT_SIZE,
|
||||||
);
|
);
|
||||||
|
|
||||||
const epaRentExempt = await connection.getMinimumBalanceForRentExemption(
|
|
||||||
MAX_EXTERNAL_ACCOUNT_SIZE,
|
|
||||||
);
|
|
||||||
|
|
||||||
let vault = new Account();
|
let vault = new Account();
|
||||||
let externalPriceAccount = new Account();
|
|
||||||
|
|
||||||
const vaultAuthority = (
|
const vaultAuthority = (
|
||||||
await PublicKey.findProgramAddress(
|
await PublicKey.findProgramAddress(
|
||||||
|
@ -74,21 +60,6 @@ export async function createVault(
|
||||||
vaultAuthority,
|
vaultAuthority,
|
||||||
signers,
|
signers,
|
||||||
);
|
);
|
||||||
const priceMint = createMint(
|
|
||||||
instructions,
|
|
||||||
wallet.publicKey,
|
|
||||||
mintRentExempt,
|
|
||||||
0,
|
|
||||||
vaultAuthority,
|
|
||||||
vaultAuthority,
|
|
||||||
signers,
|
|
||||||
);
|
|
||||||
|
|
||||||
let epaStruct = new ExternalPriceAccount({
|
|
||||||
pricePerShare: new BN(0),
|
|
||||||
priceMint: priceMint,
|
|
||||||
allowedToCombine: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const redeemTreasury = createTokenAccount(
|
const redeemTreasury = createTokenAccount(
|
||||||
instructions,
|
instructions,
|
||||||
|
@ -115,23 +86,8 @@ export async function createVault(
|
||||||
space: MAX_VAULT_SIZE,
|
space: MAX_VAULT_SIZE,
|
||||||
programId: PROGRAM_IDS.vault,
|
programId: PROGRAM_IDS.vault,
|
||||||
});
|
});
|
||||||
const uninitializedEPA = SystemProgram.createAccount({
|
|
||||||
fromPubkey: wallet.publicKey,
|
|
||||||
newAccountPubkey: vault.publicKey,
|
|
||||||
lamports: epaRentExempt,
|
|
||||||
space: MAX_EXTERNAL_ACCOUNT_SIZE,
|
|
||||||
programId: PROGRAM_IDS.vault,
|
|
||||||
});
|
|
||||||
instructions.push(uninitializedVault);
|
instructions.push(uninitializedVault);
|
||||||
instructions.push(uninitializedEPA);
|
|
||||||
signers.push(vault);
|
signers.push(vault);
|
||||||
signers.push(externalPriceAccount);
|
|
||||||
|
|
||||||
await updateExternalPriceAccount(
|
|
||||||
externalPriceAccount.publicKey,
|
|
||||||
epaStruct,
|
|
||||||
instructions,
|
|
||||||
);
|
|
||||||
|
|
||||||
await initVault(
|
await initVault(
|
||||||
true,
|
true,
|
||||||
|
@ -140,17 +96,15 @@ export async function createVault(
|
||||||
fractionTreasury,
|
fractionTreasury,
|
||||||
vault.publicKey,
|
vault.publicKey,
|
||||||
wallet.publicKey,
|
wallet.publicKey,
|
||||||
externalPriceAccount.publicKey,
|
externalPriceAccount,
|
||||||
instructions,
|
instructions,
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
vault: vault.publicKey,
|
vault: vault.publicKey,
|
||||||
externalPriceAccount: externalPriceAccount.publicKey,
|
|
||||||
fractionalMint,
|
fractionalMint,
|
||||||
redeemTreasury,
|
redeemTreasury,
|
||||||
fractionTreasury,
|
fractionTreasury,
|
||||||
priceMint,
|
|
||||||
signers,
|
signers,
|
||||||
instructions,
|
instructions,
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,8 +10,11 @@ export const useUserArts = (): SafetyDepositDraft[] => {
|
||||||
return prev;
|
return prev;
|
||||||
}, new Map<string, TokenAccount>());
|
}, new Map<string, TokenAccount>());
|
||||||
|
|
||||||
const ownedMetadata = metadata.filter(m =>
|
const ownedMetadata = metadata.filter(
|
||||||
accountByMint.has(m.info.mint.toBase58()),
|
m =>
|
||||||
|
accountByMint.has(m.info.mint.toBase58()) &&
|
||||||
|
(accountByMint?.get(m.info.mint.toBase58())?.info?.amount?.toNumber() ||
|
||||||
|
0) > 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
const possibleNameSymbols = ownedMetadata.map(m =>
|
const possibleNameSymbols = ownedMetadata.map(m =>
|
||||||
|
|
|
@ -65,7 +65,7 @@ export class AuctionManager {
|
||||||
|
|
||||||
export class InitAuctionManagerArgs {
|
export class InitAuctionManagerArgs {
|
||||||
instruction = 0;
|
instruction = 0;
|
||||||
settings?: AuctionManagerSettings;
|
settings: AuctionManagerSettings;
|
||||||
|
|
||||||
constructor(args: { settings: AuctionManagerSettings }) {
|
constructor(args: { settings: AuctionManagerSettings }) {
|
||||||
this.settings = args.settings;
|
this.settings = args.settings;
|
||||||
|
@ -102,8 +102,8 @@ export class AuctionManagerSettings {
|
||||||
openEditionNonWinningConstraint: NonWinningConstraint =
|
openEditionNonWinningConstraint: NonWinningConstraint =
|
||||||
NonWinningConstraint.GivenForFixedPrice;
|
NonWinningConstraint.GivenForFixedPrice;
|
||||||
winningConfigs: WinningConfig[] = [];
|
winningConfigs: WinningConfig[] = [];
|
||||||
openEditionConfig?: number = 0;
|
openEditionConfig: number | null = 0;
|
||||||
openEditionFixedPrice?: number = 0;
|
openEditionFixedPrice: number | null = 0;
|
||||||
|
|
||||||
constructor(args?: AuctionManagerSettings) {
|
constructor(args?: AuctionManagerSettings) {
|
||||||
Object.assign(this, args);
|
Object.assign(this, args);
|
||||||
|
@ -196,8 +196,8 @@ export const SCHEMA = new Map<any, any>([
|
||||||
['tokenMetadataProgram', 'pubkey'],
|
['tokenMetadataProgram', 'pubkey'],
|
||||||
['tokenProgram', 'pubkey'],
|
['tokenProgram', 'pubkey'],
|
||||||
['acceptPayment', 'pubkey'],
|
['acceptPayment', 'pubkey'],
|
||||||
['state', 'AuctionManagerState'],
|
['state', AuctionManagerState],
|
||||||
['settings', 'AuctionManagerSettings'],
|
['settings', AuctionManagerSettings],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -265,7 +265,7 @@ export const SCHEMA = new Map<any, any>([
|
||||||
kind: 'struct',
|
kind: 'struct',
|
||||||
fields: [
|
fields: [
|
||||||
['instruction', 'u8'],
|
['instruction', 'u8'],
|
||||||
['manager', 'AuctionManagerSettings'],
|
['settings', AuctionManagerSettings],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { programIds, VAULT_SCHEMA } from '@oyster/common';
|
import { programIds } from '@oyster/common';
|
||||||
import {
|
import {
|
||||||
PublicKey,
|
PublicKey,
|
||||||
SystemProgram,
|
SystemProgram,
|
||||||
|
@ -11,6 +11,7 @@ import {
|
||||||
AuctionManagerSettings,
|
AuctionManagerSettings,
|
||||||
getAuctionKeys,
|
getAuctionKeys,
|
||||||
InitAuctionManagerArgs,
|
InitAuctionManagerArgs,
|
||||||
|
SCHEMA,
|
||||||
} from '.';
|
} from '.';
|
||||||
|
|
||||||
export async function initAuctionManager(
|
export async function initAuctionManager(
|
||||||
|
@ -35,7 +36,16 @@ export async function initAuctionManager(
|
||||||
settings,
|
settings,
|
||||||
});
|
});
|
||||||
|
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(SCHEMA, value));
|
||||||
|
console.log(
|
||||||
|
'Auction',
|
||||||
|
auctionManagerKey,
|
||||||
|
vault,
|
||||||
|
auctionKey,
|
||||||
|
auctionManagerAuthority,
|
||||||
|
payer,
|
||||||
|
acceptPaymentAccount,
|
||||||
|
);
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
pubkey: auctionManagerKey,
|
pubkey: auctionManagerKey,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { programIds, VAULT_SCHEMA, VAULT_PREFIX } from '@oyster/common';
|
import { programIds, VAULT_PREFIX } from '@oyster/common';
|
||||||
import {
|
import {
|
||||||
PublicKey,
|
PublicKey,
|
||||||
SystemProgram,
|
SystemProgram,
|
||||||
|
@ -8,7 +8,7 @@ import {
|
||||||
} from '@solana/web3.js';
|
} from '@solana/web3.js';
|
||||||
import { serialize } from 'borsh';
|
import { serialize } from 'borsh';
|
||||||
|
|
||||||
import { getAuctionKeys, getBidderKeys, RedeemBidArgs } from '.';
|
import { getAuctionKeys, getBidderKeys, RedeemBidArgs, SCHEMA } from '.';
|
||||||
|
|
||||||
export async function redeemBid(
|
export async function redeemBid(
|
||||||
vault: PublicKey,
|
vault: PublicKey,
|
||||||
|
@ -37,7 +37,7 @@ export async function redeemBid(
|
||||||
)[0];
|
)[0];
|
||||||
|
|
||||||
const value = new RedeemBidArgs();
|
const value = new RedeemBidArgs();
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(SCHEMA, value));
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
pubkey: auctionManagerKey,
|
pubkey: auctionManagerKey,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { getEdition, programIds, VAULT_SCHEMA } from '@oyster/common';
|
import { getEdition, programIds } from '@oyster/common';
|
||||||
import {
|
import {
|
||||||
PublicKey,
|
PublicKey,
|
||||||
SystemProgram,
|
SystemProgram,
|
||||||
|
@ -14,6 +14,7 @@ import {
|
||||||
getMetadata,
|
getMetadata,
|
||||||
getOriginalAuthority,
|
getOriginalAuthority,
|
||||||
RedeemLimitedEditionBidArgs,
|
RedeemLimitedEditionBidArgs,
|
||||||
|
SCHEMA,
|
||||||
} from '.';
|
} from '.';
|
||||||
|
|
||||||
export async function redeemLimitedEditionBid(
|
export async function redeemLimitedEditionBid(
|
||||||
|
@ -50,7 +51,7 @@ export async function redeemLimitedEditionBid(
|
||||||
);
|
);
|
||||||
|
|
||||||
const value = new RedeemLimitedEditionBidArgs();
|
const value = new RedeemLimitedEditionBidArgs();
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(SCHEMA, value));
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
pubkey: auctionManagerKey,
|
pubkey: auctionManagerKey,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { programIds, VAULT_SCHEMA, VAULT_PREFIX } from '@oyster/common';
|
import { programIds, VAULT_PREFIX } from '@oyster/common';
|
||||||
import {
|
import {
|
||||||
PublicKey,
|
PublicKey,
|
||||||
SystemProgram,
|
SystemProgram,
|
||||||
|
@ -13,6 +13,7 @@ import {
|
||||||
getBidderKeys,
|
getBidderKeys,
|
||||||
getMetadata,
|
getMetadata,
|
||||||
RedeemMasterEditionBidArgs,
|
RedeemMasterEditionBidArgs,
|
||||||
|
SCHEMA,
|
||||||
} from '.';
|
} from '.';
|
||||||
|
|
||||||
export async function redeemMasterEditionBid(
|
export async function redeemMasterEditionBid(
|
||||||
|
@ -45,7 +46,7 @@ export async function redeemMasterEditionBid(
|
||||||
)[0];
|
)[0];
|
||||||
|
|
||||||
const value = new RedeemMasterEditionBidArgs();
|
const value = new RedeemMasterEditionBidArgs();
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(SCHEMA, value));
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
pubkey: auctionManagerKey,
|
pubkey: auctionManagerKey,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { getEdition, programIds, VAULT_SCHEMA } from '@oyster/common';
|
import { getEdition, programIds } from '@oyster/common';
|
||||||
import {
|
import {
|
||||||
PublicKey,
|
PublicKey,
|
||||||
SystemProgram,
|
SystemProgram,
|
||||||
|
@ -13,6 +13,7 @@ import {
|
||||||
getBidderKeys,
|
getBidderKeys,
|
||||||
getMetadata,
|
getMetadata,
|
||||||
RedeemOpenEditionBidArgs,
|
RedeemOpenEditionBidArgs,
|
||||||
|
SCHEMA,
|
||||||
} from '.';
|
} from '.';
|
||||||
|
|
||||||
export async function redeemOpenEditionBid(
|
export async function redeemOpenEditionBid(
|
||||||
|
@ -43,7 +44,7 @@ export async function redeemOpenEditionBid(
|
||||||
const masterEdition: PublicKey = await getEdition(tokenMint);
|
const masterEdition: PublicKey = await getEdition(tokenMint);
|
||||||
|
|
||||||
const value = new RedeemOpenEditionBidArgs();
|
const value = new RedeemOpenEditionBidArgs();
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(SCHEMA, value));
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
pubkey: auctionManagerKey,
|
pubkey: auctionManagerKey,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { programIds, VAULT_SCHEMA } from '@oyster/common';
|
import { programIds } from '@oyster/common';
|
||||||
import {
|
import {
|
||||||
PublicKey,
|
PublicKey,
|
||||||
SYSVAR_CLOCK_PUBKEY,
|
SYSVAR_CLOCK_PUBKEY,
|
||||||
|
@ -6,7 +6,7 @@ import {
|
||||||
} from '@solana/web3.js';
|
} from '@solana/web3.js';
|
||||||
import { serialize } from 'borsh';
|
import { serialize } from 'borsh';
|
||||||
|
|
||||||
import { getAuctionKeys, StartAuctionArgs } from '.';
|
import { getAuctionKeys, SCHEMA, StartAuctionArgs } from '.';
|
||||||
|
|
||||||
export async function startAuction(
|
export async function startAuction(
|
||||||
vault: PublicKey,
|
vault: PublicKey,
|
||||||
|
@ -18,7 +18,7 @@ export async function startAuction(
|
||||||
const { auctionKey, auctionManagerKey } = await getAuctionKeys(vault);
|
const { auctionKey, auctionManagerKey } = await getAuctionKeys(vault);
|
||||||
|
|
||||||
const value = new StartAuctionArgs();
|
const value = new StartAuctionArgs();
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(SCHEMA, value));
|
||||||
|
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { programIds, getEdition } from '@oyster/common';
|
||||||
programIds,
|
|
||||||
VAULT_SCHEMA,
|
|
||||||
METADATA_PREFIX,
|
|
||||||
EDITION,
|
|
||||||
getEdition,
|
|
||||||
} from '@oyster/common';
|
|
||||||
import {
|
import {
|
||||||
PublicKey,
|
PublicKey,
|
||||||
SystemProgram,
|
SystemProgram,
|
||||||
|
@ -16,7 +10,7 @@ import { serialize } from 'borsh';
|
||||||
import {
|
import {
|
||||||
getAuctionKeys,
|
getAuctionKeys,
|
||||||
getOriginalAuthority,
|
getOriginalAuthority,
|
||||||
METAPLEX_PREFIX,
|
SCHEMA,
|
||||||
ValidateSafetyDepositBoxArgs,
|
ValidateSafetyDepositBoxArgs,
|
||||||
} from '.';
|
} from '.';
|
||||||
|
|
||||||
|
@ -46,7 +40,7 @@ export async function validateSafetyDepositBox(
|
||||||
const edition: PublicKey = await getEdition(tokenMint);
|
const edition: PublicKey = await getEdition(tokenMint);
|
||||||
const value = new ValidateSafetyDepositBoxArgs();
|
const value = new ValidateSafetyDepositBoxArgs();
|
||||||
|
|
||||||
const data = Buffer.from(serialize(VAULT_SCHEMA, value));
|
const data = Buffer.from(serialize(SCHEMA, value));
|
||||||
const keys = [
|
const keys = [
|
||||||
{
|
{
|
||||||
pubkey: auctionManagerKey,
|
pubkey: auctionManagerKey,
|
||||||
|
|
|
@ -31,6 +31,8 @@ import {
|
||||||
Metadata,
|
Metadata,
|
||||||
ParsedAccount,
|
ParsedAccount,
|
||||||
deserializeBorsh,
|
deserializeBorsh,
|
||||||
|
WinnerLimit,
|
||||||
|
WinnerLimitType,
|
||||||
} from '@oyster/common';
|
} from '@oyster/common';
|
||||||
import { getAssetCostToStore, LAMPORT_MULTIPLIER } from '../../utils/assets';
|
import { getAssetCostToStore, LAMPORT_MULTIPLIER } from '../../utils/assets';
|
||||||
import { Connection, ParsedAccountData, PublicKey } from '@solana/web3.js';
|
import { Connection, ParsedAccountData, PublicKey } from '@solana/web3.js';
|
||||||
|
@ -44,12 +46,17 @@ import {
|
||||||
AuctionManagerSettings,
|
AuctionManagerSettings,
|
||||||
AuctionManagerState,
|
AuctionManagerState,
|
||||||
AuctionManagerStatus,
|
AuctionManagerStatus,
|
||||||
|
EditionType,
|
||||||
NonWinningConstraint,
|
NonWinningConstraint,
|
||||||
SCHEMA,
|
SCHEMA,
|
||||||
WinningConstraint,
|
WinningConstraint,
|
||||||
} from '../../models/metaplex';
|
} from '../../models/metaplex';
|
||||||
import { serialize } from 'borsh';
|
import { serialize } from 'borsh';
|
||||||
import { SafetyDepositDraft } from '../../actions/createAuctionManager';
|
import {
|
||||||
|
createAuctionManager,
|
||||||
|
SafetyDepositDraft,
|
||||||
|
} from '../../actions/createAuctionManager';
|
||||||
|
import BN from 'bn.js';
|
||||||
|
|
||||||
const { Step } = Steps;
|
const { Step } = Steps;
|
||||||
const { Option } = Select;
|
const { Option } = Select;
|
||||||
|
@ -76,9 +83,6 @@ export interface AuctionState {
|
||||||
|
|
||||||
// listed NFTs
|
// listed NFTs
|
||||||
items: SafetyDepositDraft[];
|
items: SafetyDepositDraft[];
|
||||||
|
|
||||||
settings: AuctionManagerSettings;
|
|
||||||
|
|
||||||
// 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;
|
||||||
|
|
||||||
|
@ -111,6 +115,7 @@ export interface AuctionState {
|
||||||
export const AuctionCreateView = () => {
|
export const AuctionCreateView = () => {
|
||||||
const connection = useConnection();
|
const connection = useConnection();
|
||||||
const { env } = useConnectionConfig();
|
const { env } = useConnectionConfig();
|
||||||
|
const items = useUserArts();
|
||||||
const { wallet, connected } = useWallet();
|
const { wallet, connected } = useWallet();
|
||||||
const { step_param }: { step_param: string } = useParams();
|
const { step_param }: { step_param: string } = useParams();
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
|
@ -123,13 +128,6 @@ export const AuctionCreateView = () => {
|
||||||
items: [],
|
items: [],
|
||||||
category: AuctionCategory.Open,
|
category: AuctionCategory.Open,
|
||||||
saleType: 'auction',
|
saleType: 'auction',
|
||||||
settings: {
|
|
||||||
openEditionWinnerConstraint: WinningConstraint.NoOpenEdition,
|
|
||||||
openEditionNonWinningConstraint: NonWinningConstraint.NoOpenEdition,
|
|
||||||
winningConfigs: [],
|
|
||||||
openEditionConfig: undefined,
|
|
||||||
openEditionFixedPrice: undefined,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -143,7 +141,53 @@ export const AuctionCreateView = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const createAuction = async () => {
|
const createAuction = async () => {
|
||||||
// TODO: ....
|
let settings: AuctionManagerSettings;
|
||||||
|
let winnerLimit: WinnerLimit;
|
||||||
|
if (attributes.category == AuctionCategory.Open) {
|
||||||
|
settings = new AuctionManagerSettings({
|
||||||
|
openEditionWinnerConstraint: WinningConstraint.OpenEditionGiven,
|
||||||
|
openEditionNonWinningConstraint: NonWinningConstraint.GivenForBidPrice,
|
||||||
|
winningConfigs: [],
|
||||||
|
openEditionConfig: 0,
|
||||||
|
openEditionFixedPrice: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
winnerLimit = new WinnerLimit({ type: WinnerLimitType.Unlimited });
|
||||||
|
} else if (attributes.category == AuctionCategory.Single) {
|
||||||
|
settings = new AuctionManagerSettings({
|
||||||
|
openEditionWinnerConstraint: WinningConstraint.NoOpenEdition,
|
||||||
|
openEditionNonWinningConstraint: NonWinningConstraint.NoOpenEdition,
|
||||||
|
winningConfigs: [
|
||||||
|
{
|
||||||
|
safetyDepositBoxIndex: 0,
|
||||||
|
amount: 1,
|
||||||
|
hasAuthority: false,
|
||||||
|
editionType: items[0].masterEdition
|
||||||
|
? EditionType.MasterEdition
|
||||||
|
: EditionType.NA,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
openEditionConfig: null,
|
||||||
|
openEditionFixedPrice: null,
|
||||||
|
});
|
||||||
|
winnerLimit = new WinnerLimit({
|
||||||
|
type: WinnerLimitType.Capped,
|
||||||
|
usize: new BN(1),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
throw new Error('Not supported');
|
||||||
|
}
|
||||||
|
|
||||||
|
await createAuctionManager(
|
||||||
|
connection,
|
||||||
|
wallet,
|
||||||
|
settings,
|
||||||
|
winnerLimit,
|
||||||
|
new BN((attributes.auctionDuration || 1) * 60),
|
||||||
|
new BN((attributes.gapTime || 1) * 60),
|
||||||
|
[items[0]],
|
||||||
|
new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const categoryStep = (
|
const categoryStep = (
|
||||||
|
@ -255,6 +299,7 @@ export const AuctionCreateView = () => {
|
||||||
],
|
],
|
||||||
[AuctionCategory.Single]: [
|
[AuctionCategory.Single]: [
|
||||||
['Category', categoryStep],
|
['Category', categoryStep],
|
||||||
|
['Copies', copiesStep],
|
||||||
['Price', priceStep],
|
['Price', priceStep],
|
||||||
['Initial Phase', initialStep],
|
['Initial Phase', initialStep],
|
||||||
['Ending Phase', endingStep],
|
['Ending Phase', endingStep],
|
||||||
|
@ -422,21 +467,6 @@ const CopiesStep = (props: {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const [selectedItems, setSelectedItems] = useState<Set<string>>(
|
|
||||||
new Set(
|
|
||||||
props.attributes.items.map(item => item.metadata.pubkey.toBase58()),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
props.setAttributes({
|
|
||||||
...props.attributes,
|
|
||||||
items: eligibleItems.filter((item: SafetyDepositDraft) =>
|
|
||||||
selectedItems.has(item.metadata.pubkey.toBase58()),
|
|
||||||
),
|
|
||||||
});
|
|
||||||
}, [selectedItems]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Row className="call-to-action" style={{ marginBottom: 0 }}>
|
<Row className="call-to-action" style={{ marginBottom: 0 }}>
|
||||||
|
@ -448,14 +478,10 @@ const CopiesStep = (props: {
|
||||||
<Row className="content-action">
|
<Row className="content-action">
|
||||||
<Col xl={24}>
|
<Col xl={24}>
|
||||||
<ArtSelector
|
<ArtSelector
|
||||||
selected={eligibleItems.filter(item =>
|
selected={props.attributes.items}
|
||||||
selectedItems.has(item.metadata.pubkey.toBase58()),
|
setSelected={items => {
|
||||||
)}
|
props.setAttributes({ ...props.attributes, items });
|
||||||
setSelected={items =>
|
}}
|
||||||
setSelectedItems(
|
|
||||||
new Set(items.map(item => item.metadata.pubkey.toBase58())),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
allowMultiple={false}
|
allowMultiple={false}
|
||||||
>
|
>
|
||||||
Select NFT
|
Select NFT
|
||||||
|
|
Loading…
Reference in New Issue