Merge remote-tracking branch 'origin/feature/m-jordan' into feature/m

This commit is contained in:
bartosz-lipinski 2021-04-26 08:55:10 -05:00
commit cc2d58a264
20 changed files with 265 additions and 158 deletions

View File

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

View File

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

View File

@ -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 = [
{ {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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],
], ],
}, },
], ],

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 = [
{ {

View File

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

View File

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