metaplex/rust/auction/program/src/instruction.rs

414 lines
14 KiB
Rust

use crate::{EXTENDED, PREFIX};
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
sysvar,
};
pub use crate::processor::{
cancel_bid::CancelBidArgs, claim_bid::ClaimBidArgs, create_auction::CreateAuctionArgs,
create_auction_v2::CreateAuctionArgsV2, end_auction::EndAuctionArgs, place_bid::PlaceBidArgs,
start_auction::StartAuctionArgs,
};
#[derive(Clone, BorshSerialize, BorshDeserialize, PartialEq)]
pub enum AuctionInstruction {
/// Cancel a bid on a running auction.
/// 0. `[signer]` The bidders primary account, for PDA calculation/transit auth.
/// 1. `[writable]` The bidders token account they'll receive refund with
/// 2. `[writable]` The pot, containing a reference to the stored SPL token account.
/// 3. `[writable]` The pot SPL account, where the tokens will be deposited.
/// 4. `[writable]` The metadata account, storing information about the bidders actions.
/// 5. `[writable]` Auction account, containing data about the auction and item being bid on.
/// 6. `[writable]` Token mint, for transfer instructions and verification.
/// 7. `[]` Clock sysvar
/// 8. `[]` Rent sysvar
/// 9. `[]` System program
/// 10. `[]` SPL Token Program
CancelBid(CancelBidArgs),
/// Create a new auction account bound to a resource, initially in a pending state.
/// 0. `[signer]` The account creating the auction, which is authorised to make changes.
/// 1. `[writable]` Uninitialized auction account.
/// 2. `[writable]` Auction extended data account (pda relative to auction of ['auction', program id, vault key, 'extended']).
/// 3. `[]` Rent sysvar
/// 4. `[]` System account
CreateAuction(CreateAuctionArgs),
/// Move SPL tokens from winning bid to the destination account.
/// 0. `[writable]` The destination account
/// 1. `[writable]` The bidder pot token account
/// 2. `[]` The bidder pot pda account [seed of ['auction', program_id, auction key, bidder key]]
/// 3. `[signer]` The authority on the auction
/// 4. `[]` The auction
/// 5. `[]` The bidder wallet
/// 6. `[]` Token mint of the auction
/// 7. `[]` Clock sysvar
/// 8. `[]` Token program
/// 9. `[]` Auction extended (pda relative to auction of ['auction', program id, vault key, 'extended'])
ClaimBid(ClaimBidArgs),
/// Ends an auction, regardless of end timing conditions
EndAuction(EndAuctionArgs),
/// Start an inactive auction.
/// 0. `[signer]` The creator/authorised account.
/// 1. `[writable]` Initialized auction account.
/// 2. `[]` Clock sysvar
StartAuction(StartAuctionArgs),
/// Update the authority for an auction account.
SetAuthority,
/// Place a bid on a running auction.
/// 0. `[signer]` The bidders primary account, for PDA calculation/transit auth.
/// 1. `[writable]` The bidders token account they'll pay with
/// 2. `[writable]` The pot, containing a reference to the stored SPL token account.
/// 3. `[writable]` The pot SPL account, where the tokens will be deposited.
/// 4. `[writable]` The metadata account, storing information about the bidders actions.
/// 5. `[writable]` Auction account, containing data about the auction and item being bid on.
/// 6. `[writable]` Token mint, for transfer instructions and verification.
/// 7. `[signer]` Transfer authority, for moving tokens into the bid pot.
/// 8. `[signer]` Payer
/// 9. `[]` Clock sysvar
/// 10. `[]` Rent sysvar
/// 11. `[]` System program
/// 12. `[]` SPL Token Program
PlaceBid(PlaceBidArgs),
/// Create a new auction account bound to a resource, initially in a pending state.
/// The only one difference with above instruction it's additional parameters in CreateAuctionArgsV2
/// 0. `[signer]` The account creating the auction, which is authorised to make changes.
/// 1. `[writable]` Uninitialized auction account.
/// 2. `[writable]` Auction extended data account (pda relative to auction of ['auction', program id, vault key, 'extended']).
/// 3. `[]` Rent sysvar
/// 4. `[]` System account
CreateAuctionV2(CreateAuctionArgsV2),
}
/// Creates an CreateAuction instruction.
pub fn create_auction_instruction(
program_id: Pubkey,
creator_pubkey: Pubkey,
args: CreateAuctionArgs,
) -> Instruction {
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
args.resource.as_ref(),
];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
let seeds = &[
PREFIX.as_bytes(),
program_id.as_ref(),
args.resource.as_ref(),
EXTENDED.as_bytes(),
];
let (auction_extended_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(creator_pubkey, true),
AccountMeta::new(auction_pubkey, false),
AccountMeta::new(auction_extended_pubkey, false),
AccountMeta::new_readonly(sysvar::rent::id(), false),
AccountMeta::new_readonly(solana_program::system_program::id(), false),
],
data: AuctionInstruction::CreateAuction(args)
.try_to_vec()
.unwrap(),
}
}
/// Creates an CreateAuctionV2 instruction.
pub fn create_auction_instruction_v2(
program_id: Pubkey,
creator_pubkey: Pubkey,
args: CreateAuctionArgsV2,
) -> Instruction {
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
args.resource.as_ref(),
];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
let seeds = &[
PREFIX.as_bytes(),
program_id.as_ref(),
args.resource.as_ref(),
EXTENDED.as_bytes(),
];
let (auction_extended_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(creator_pubkey, true),
AccountMeta::new(auction_pubkey, false),
AccountMeta::new(auction_extended_pubkey, false),
AccountMeta::new_readonly(sysvar::rent::id(), false),
AccountMeta::new_readonly(solana_program::system_program::id(), false),
],
data: AuctionInstruction::CreateAuctionV2(args)
.try_to_vec()
.unwrap(),
}
}
/// Creates an SetAuthority instruction.
pub fn set_authority_instruction(
program_id: Pubkey,
resource: Pubkey,
authority: Pubkey,
new_authority: Pubkey,
) -> Instruction {
let seeds = &[PREFIX.as_bytes(), &program_id.as_ref(), resource.as_ref()];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(auction_pubkey, false),
AccountMeta::new_readonly(authority, true),
AccountMeta::new_readonly(new_authority, false),
],
data: AuctionInstruction::SetAuthority.try_to_vec().unwrap(),
}
}
/// Creates an StartAuction instruction.
pub fn start_auction_instruction(
program_id: Pubkey,
authority_pubkey: Pubkey,
args: StartAuctionArgs,
) -> Instruction {
// Derive Auction Key
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
args.resource.as_ref(),
];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(authority_pubkey, true),
AccountMeta::new(auction_pubkey, false),
AccountMeta::new_readonly(sysvar::clock::id(), false),
],
data: AuctionInstruction::StartAuction(args).try_to_vec().unwrap(),
}
}
/// Creates an PlaceBid instruction.
pub fn place_bid_instruction(
program_id: Pubkey,
bidder_pubkey: Pubkey,
bidder_token_pubkey: Pubkey,
bidder_pot_token_pubkey: Pubkey,
token_mint_pubkey: Pubkey,
transfer_authority: Pubkey,
payer: Pubkey,
args: PlaceBidArgs,
) -> Instruction {
// Derive Auction Key
let seeds = &[
PREFIX.as_bytes(),
program_id.as_ref(),
args.resource.as_ref(),
];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
let seeds = &[
PREFIX.as_bytes(),
program_id.as_ref(),
args.resource.as_ref(),
EXTENDED.as_bytes(),
];
let (auction_extended_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
// Derive Bidder Pot
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
auction_pubkey.as_ref(),
bidder_pubkey.as_ref(),
];
let (bidder_pot_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
// Derive Bidder Meta
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
auction_pubkey.as_ref(),
bidder_pubkey.as_ref(),
"metadata".as_bytes(),
];
let (bidder_meta_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(bidder_pubkey, true),
AccountMeta::new(bidder_token_pubkey, false),
AccountMeta::new(bidder_pot_pubkey, false),
AccountMeta::new(bidder_pot_token_pubkey, false),
AccountMeta::new(bidder_meta_pubkey, false),
AccountMeta::new(auction_pubkey, false),
AccountMeta::new(auction_extended_pubkey, false),
AccountMeta::new(token_mint_pubkey, false),
AccountMeta::new_readonly(transfer_authority, true),
AccountMeta::new_readonly(payer, true),
AccountMeta::new_readonly(sysvar::clock::id(), false),
AccountMeta::new_readonly(sysvar::rent::id(), false),
AccountMeta::new_readonly(solana_program::system_program::id(), false),
AccountMeta::new_readonly(spl_token::id(), false),
],
data: AuctionInstruction::PlaceBid(args).try_to_vec().unwrap(),
}
}
/// Creates an CancelBidinstruction.
pub fn cancel_bid_instruction(
program_id: Pubkey,
bidder_pubkey: Pubkey,
bidder_token_pubkey: Pubkey,
bidder_pot_token_pubkey: Pubkey,
token_mint_pubkey: Pubkey,
args: CancelBidArgs,
) -> Instruction {
// Derive Auction Key
let seeds = &[
PREFIX.as_bytes(),
program_id.as_ref(),
args.resource.as_ref(),
];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
let seeds = &[
PREFIX.as_bytes(),
program_id.as_ref(),
args.resource.as_ref(),
EXTENDED.as_bytes(),
];
let (auction_extended_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
// Derive Bidder Pot
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
auction_pubkey.as_ref(),
bidder_pubkey.as_ref(),
];
let (bidder_pot_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
// Derive Bidder Meta
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
auction_pubkey.as_ref(),
bidder_pubkey.as_ref(),
"metadata".as_bytes(),
];
let (bidder_meta_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(bidder_pubkey, true),
AccountMeta::new(bidder_token_pubkey, false),
AccountMeta::new(bidder_pot_pubkey, false),
AccountMeta::new(bidder_pot_token_pubkey, false),
AccountMeta::new(bidder_meta_pubkey, false),
AccountMeta::new(auction_pubkey, false),
AccountMeta::new(auction_extended_pubkey, false),
AccountMeta::new(token_mint_pubkey, false),
AccountMeta::new_readonly(sysvar::clock::id(), false),
AccountMeta::new_readonly(sysvar::rent::id(), false),
AccountMeta::new_readonly(solana_program::system_program::id(), false),
AccountMeta::new_readonly(spl_token::id(), false),
],
data: AuctionInstruction::CancelBid(args).try_to_vec().unwrap(),
}
}
pub fn end_auction_instruction(
program_id: Pubkey,
authority_pubkey: Pubkey,
args: EndAuctionArgs,
) -> Instruction {
// Derive Auction Key
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
args.resource.as_ref(),
];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(authority_pubkey, true),
AccountMeta::new(auction_pubkey, false),
AccountMeta::new_readonly(sysvar::clock::id(), false),
],
data: AuctionInstruction::EndAuction(args).try_to_vec().unwrap(),
}
}
pub fn claim_bid_instruction(
program_id: Pubkey,
destination_pubkey: Pubkey,
authority_pubkey: Pubkey,
bidder_pubkey: Pubkey,
bidder_pot_token_pubkey: Pubkey,
token_mint_pubkey: Pubkey,
args: ClaimBidArgs,
) -> Instruction {
// Derive Auction Key
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
args.resource.as_ref(),
];
let (auction_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
// Derive Bidder Pot
let seeds = &[
PREFIX.as_bytes(),
&program_id.as_ref(),
auction_pubkey.as_ref(),
bidder_pubkey.as_ref(),
];
let (bidder_pot_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
let seeds = &[
PREFIX.as_bytes(),
program_id.as_ref(),
args.resource.as_ref(),
EXTENDED.as_bytes(),
];
let (auction_extended_pubkey, _) = Pubkey::find_program_address(seeds, &program_id);
Instruction {
program_id,
accounts: vec![
AccountMeta::new(destination_pubkey, false),
AccountMeta::new(bidder_pot_token_pubkey, false),
AccountMeta::new(bidder_pot_pubkey, false),
AccountMeta::new_readonly(authority_pubkey, true),
AccountMeta::new_readonly(auction_pubkey, false),
AccountMeta::new_readonly(bidder_pubkey, false),
AccountMeta::new_readonly(token_mint_pubkey, false),
AccountMeta::new_readonly(sysvar::clock::id(), false),
AccountMeta::new_readonly(spl_token::id(), false),
AccountMeta::new_readonly(auction_extended_pubkey, false),
],
data: AuctionInstruction::ClaimBid(args).try_to_vec().unwrap(),
}
}