feat: add support for more system instructions
This commit is contained in:
		
				
					committed by
					
						
						Michael Vines
					
				
			
			
				
	
			
			
			
						parent
						
							09d1b7f39f
						
					
				
				
					commit
					c584fbdf39
				
			
							
								
								
									
										67
									
								
								web3.js/module.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										67
									
								
								web3.js/module.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -578,17 +578,6 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    programId: PublicKey;
 | 
					    programId: PublicKey;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export type TransferParams = {
 | 
					 | 
				
			||||||
    fromPubkey: PublicKey;
 | 
					 | 
				
			||||||
    toPubkey: PublicKey;
 | 
					 | 
				
			||||||
    lamports: number;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  export type AssignParams = {
 | 
					 | 
				
			||||||
    fromPubkey: PublicKey;
 | 
					 | 
				
			||||||
    programId: PublicKey;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  export type CreateAccountWithSeedParams = {
 | 
					  export type CreateAccountWithSeedParams = {
 | 
				
			||||||
    fromPubkey: PublicKey;
 | 
					    fromPubkey: PublicKey;
 | 
				
			||||||
    newAccountPubkey: PublicKey;
 | 
					    newAccountPubkey: PublicKey;
 | 
				
			||||||
@@ -599,6 +588,37 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    programId: PublicKey;
 | 
					    programId: PublicKey;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export type AllocateParams = {
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey;
 | 
				
			||||||
 | 
					    space: number;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export type AllocateWithSeedParams = {
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey;
 | 
				
			||||||
 | 
					    basePubkey: PublicKey;
 | 
				
			||||||
 | 
					    seed: string;
 | 
				
			||||||
 | 
					    space: number;
 | 
				
			||||||
 | 
					    programId: PublicKey;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export type AssignParams = {
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey;
 | 
				
			||||||
 | 
					    programId: PublicKey;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export type AssignWithSeedParams = {
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey;
 | 
				
			||||||
 | 
					    basePubkey: PublicKey;
 | 
				
			||||||
 | 
					    seed: string;
 | 
				
			||||||
 | 
					    programId: PublicKey;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  export type TransferParams = {
 | 
				
			||||||
 | 
					    fromPubkey: PublicKey;
 | 
				
			||||||
 | 
					    toPubkey: PublicKey;
 | 
				
			||||||
 | 
					    lamports: number;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export type CreateNonceAccountParams = {
 | 
					  export type CreateNonceAccountParams = {
 | 
				
			||||||
    fromPubkey: PublicKey;
 | 
					    fromPubkey: PublicKey;
 | 
				
			||||||
    noncePubkey: PublicKey;
 | 
					    noncePubkey: PublicKey;
 | 
				
			||||||
@@ -642,11 +662,14 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    static programId: PublicKey;
 | 
					    static programId: PublicKey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static createAccount(params: CreateAccountParams): Transaction;
 | 
					    static createAccount(params: CreateAccountParams): Transaction;
 | 
				
			||||||
    static transfer(params: TransferParams): Transaction;
 | 
					 | 
				
			||||||
    static assign(params: AssignParams): Transaction;
 | 
					 | 
				
			||||||
    static createAccountWithSeed(
 | 
					    static createAccountWithSeed(
 | 
				
			||||||
      params: CreateAccountWithSeedParams,
 | 
					      params: CreateAccountWithSeedParams,
 | 
				
			||||||
    ): Transaction;
 | 
					    ): Transaction;
 | 
				
			||||||
 | 
					    static allocate(
 | 
				
			||||||
 | 
					      params: AllocateParams | AllocateWithSeedParams,
 | 
				
			||||||
 | 
					    ): Transaction;
 | 
				
			||||||
 | 
					    static assign(params: AssignParams | AssignWithSeedParams): Transaction;
 | 
				
			||||||
 | 
					    static transfer(params: TransferParams): Transaction;
 | 
				
			||||||
    static createNonceAccount(
 | 
					    static createNonceAccount(
 | 
				
			||||||
      params: CreateNonceAccountParams | CreateNonceAccountWithSeedParams,
 | 
					      params: CreateNonceAccountParams | CreateNonceAccountWithSeedParams,
 | 
				
			||||||
    ): Transaction;
 | 
					    ): Transaction;
 | 
				
			||||||
@@ -657,9 +680,12 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  export type SystemInstructionType =
 | 
					  export type SystemInstructionType =
 | 
				
			||||||
    | 'Create'
 | 
					    | 'Create'
 | 
				
			||||||
    | 'Assign'
 | 
					 | 
				
			||||||
    | 'Transfer'
 | 
					 | 
				
			||||||
    | 'CreateWithSeed'
 | 
					    | 'CreateWithSeed'
 | 
				
			||||||
 | 
					    | 'Allocate'
 | 
				
			||||||
 | 
					    | 'AllocateWithSeed'
 | 
				
			||||||
 | 
					    | 'Assign'
 | 
				
			||||||
 | 
					    | 'AssignWithSeed'
 | 
				
			||||||
 | 
					    | 'Transfer'
 | 
				
			||||||
    | 'AdvanceNonceAccount'
 | 
					    | 'AdvanceNonceAccount'
 | 
				
			||||||
    | 'WithdrawNonceAccount'
 | 
					    | 'WithdrawNonceAccount'
 | 
				
			||||||
    | 'InitializeNonceAccount'
 | 
					    | 'InitializeNonceAccount'
 | 
				
			||||||
@@ -676,11 +702,18 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    static decodeCreateAccount(
 | 
					    static decodeCreateAccount(
 | 
				
			||||||
      instruction: TransactionInstruction,
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
    ): CreateAccountParams;
 | 
					    ): CreateAccountParams;
 | 
				
			||||||
    static decodeTransfer(instruction: TransactionInstruction): TransferParams;
 | 
					 | 
				
			||||||
    static decodeAssign(instruction: TransactionInstruction): AssignParams;
 | 
					 | 
				
			||||||
    static decodeCreateWithSeed(
 | 
					    static decodeCreateWithSeed(
 | 
				
			||||||
      instruction: TransactionInstruction,
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
    ): CreateAccountWithSeedParams;
 | 
					    ): CreateAccountWithSeedParams;
 | 
				
			||||||
 | 
					    static decodeAllocate(instruction: TransactionInstruction): AllocateParams;
 | 
				
			||||||
 | 
					    static decodeAllocateWithSeed(
 | 
				
			||||||
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
 | 
					    ): AllocateWithSeedParams;
 | 
				
			||||||
 | 
					    static decodeAssign(instruction: TransactionInstruction): AssignParams;
 | 
				
			||||||
 | 
					    static decodeAssignWithSeed(
 | 
				
			||||||
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
 | 
					    ): AssignWithSeedParams;
 | 
				
			||||||
 | 
					    static decodeTransfer(instruction: TransactionInstruction): TransferParams;
 | 
				
			||||||
    static decodeNonceInitialize(
 | 
					    static decodeNonceInitialize(
 | 
				
			||||||
      instruction: TransactionInstruction,
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
    ): InitializeNonceParams;
 | 
					    ): InitializeNonceParams;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -593,17 +593,6 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    programId: PublicKey,
 | 
					    programId: PublicKey,
 | 
				
			||||||
  |};
 | 
					  |};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  declare export type TransferParams = {|
 | 
					 | 
				
			||||||
    fromPubkey: PublicKey,
 | 
					 | 
				
			||||||
    toPubkey: PublicKey,
 | 
					 | 
				
			||||||
    lamports: number,
 | 
					 | 
				
			||||||
  |};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  declare export type AssignParams = {|
 | 
					 | 
				
			||||||
    fromPubkey: PublicKey,
 | 
					 | 
				
			||||||
    programId: PublicKey,
 | 
					 | 
				
			||||||
  |};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  declare export type CreateAccountWithSeedParams = {|
 | 
					  declare export type CreateAccountWithSeedParams = {|
 | 
				
			||||||
    fromPubkey: PublicKey,
 | 
					    fromPubkey: PublicKey,
 | 
				
			||||||
    newAccountPubkey: PublicKey,
 | 
					    newAccountPubkey: PublicKey,
 | 
				
			||||||
@@ -614,6 +603,37 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    programId: PublicKey,
 | 
					    programId: PublicKey,
 | 
				
			||||||
  |};
 | 
					  |};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  declare export type AllocateParams = {|
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey,
 | 
				
			||||||
 | 
					    space: number,
 | 
				
			||||||
 | 
					  |};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  declare export type AllocateWithSeedParams = {|
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey,
 | 
				
			||||||
 | 
					    basePubkey: PublicKey,
 | 
				
			||||||
 | 
					    seed: string,
 | 
				
			||||||
 | 
					    space: number,
 | 
				
			||||||
 | 
					    programId: PublicKey,
 | 
				
			||||||
 | 
					  |};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  declare export type AssignParams = {|
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey,
 | 
				
			||||||
 | 
					    programId: PublicKey,
 | 
				
			||||||
 | 
					  |};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  declare export type AssignWithSeedParams = {|
 | 
				
			||||||
 | 
					    accountPubkey: PublicKey,
 | 
				
			||||||
 | 
					    basePubkey: PublicKey,
 | 
				
			||||||
 | 
					    seed: string,
 | 
				
			||||||
 | 
					    programId: PublicKey,
 | 
				
			||||||
 | 
					  |};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  declare export type TransferParams = {|
 | 
				
			||||||
 | 
					    fromPubkey: PublicKey,
 | 
				
			||||||
 | 
					    toPubkey: PublicKey,
 | 
				
			||||||
 | 
					    lamports: number,
 | 
				
			||||||
 | 
					  |};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  declare export type CreateNonceAccountParams = {|
 | 
					  declare export type CreateNonceAccountParams = {|
 | 
				
			||||||
    fromPubkey: PublicKey,
 | 
					    fromPubkey: PublicKey,
 | 
				
			||||||
    noncePubkey: PublicKey,
 | 
					    noncePubkey: PublicKey,
 | 
				
			||||||
@@ -657,11 +677,14 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    static programId: PublicKey;
 | 
					    static programId: PublicKey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static createAccount(params: CreateAccountParams): Transaction;
 | 
					    static createAccount(params: CreateAccountParams): Transaction;
 | 
				
			||||||
    static transfer(params: TransferParams): Transaction;
 | 
					 | 
				
			||||||
    static assign(params: AssignParams): Transaction;
 | 
					 | 
				
			||||||
    static createAccountWithSeed(
 | 
					    static createAccountWithSeed(
 | 
				
			||||||
      params: CreateAccountWithSeedParams,
 | 
					      params: CreateAccountWithSeedParams,
 | 
				
			||||||
    ): Transaction;
 | 
					    ): Transaction;
 | 
				
			||||||
 | 
					    static allocate(
 | 
				
			||||||
 | 
					      params: AllocateParams | AllocateWithSeedParams,
 | 
				
			||||||
 | 
					    ): Transaction;
 | 
				
			||||||
 | 
					    static assign(params: AssignParams | AssignWithSeedParams): Transaction;
 | 
				
			||||||
 | 
					    static transfer(params: TransferParams): Transaction;
 | 
				
			||||||
    static createNonceAccount(
 | 
					    static createNonceAccount(
 | 
				
			||||||
      params: CreateNonceAccountParams | CreateNonceAccountWithSeedParams,
 | 
					      params: CreateNonceAccountParams | CreateNonceAccountWithSeedParams,
 | 
				
			||||||
    ): Transaction;
 | 
					    ): Transaction;
 | 
				
			||||||
@@ -672,9 +695,12 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  declare export type SystemInstructionType =
 | 
					  declare export type SystemInstructionType =
 | 
				
			||||||
    | 'Create'
 | 
					    | 'Create'
 | 
				
			||||||
    | 'Assign'
 | 
					 | 
				
			||||||
    | 'Transfer'
 | 
					 | 
				
			||||||
    | 'CreateWithSeed'
 | 
					    | 'CreateWithSeed'
 | 
				
			||||||
 | 
					    | 'Allocate'
 | 
				
			||||||
 | 
					    | 'AllocateWithSeed'
 | 
				
			||||||
 | 
					    | 'Assign'
 | 
				
			||||||
 | 
					    | 'AssignWithSeed'
 | 
				
			||||||
 | 
					    | 'Transfer'
 | 
				
			||||||
    | 'AdvanceNonceAccount'
 | 
					    | 'AdvanceNonceAccount'
 | 
				
			||||||
    | 'WithdrawNonceAccount'
 | 
					    | 'WithdrawNonceAccount'
 | 
				
			||||||
    | 'InitializeNonceAccount'
 | 
					    | 'InitializeNonceAccount'
 | 
				
			||||||
@@ -691,11 +717,18 @@ declare module '@solana/web3.js' {
 | 
				
			|||||||
    static decodeCreateAccount(
 | 
					    static decodeCreateAccount(
 | 
				
			||||||
      instruction: TransactionInstruction,
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
    ): CreateAccountParams;
 | 
					    ): CreateAccountParams;
 | 
				
			||||||
    static decodeTransfer(instruction: TransactionInstruction): TransferParams;
 | 
					 | 
				
			||||||
    static decodeAssign(instruction: TransactionInstruction): AssignParams;
 | 
					 | 
				
			||||||
    static decodeCreateWithSeed(
 | 
					    static decodeCreateWithSeed(
 | 
				
			||||||
      instruction: TransactionInstruction,
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
    ): CreateAccountWithSeedParams;
 | 
					    ): CreateAccountWithSeedParams;
 | 
				
			||||||
 | 
					    static decodeAllocate(instruction: TransactionInstruction): AllocateParams;
 | 
				
			||||||
 | 
					    static decodeAllocateWithSeed(
 | 
				
			||||||
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
 | 
					    ): AllocateWithSeedParams;
 | 
				
			||||||
 | 
					    static decodeAssign(instruction: TransactionInstruction): AssignParams;
 | 
				
			||||||
 | 
					    static decodeAssignWithSeed(
 | 
				
			||||||
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
 | 
					    ): AssignWithSeedParams;
 | 
				
			||||||
 | 
					    static decodeTransfer(instruction: TransactionInstruction): TransferParams;
 | 
				
			||||||
    static decodeNonceInitialize(
 | 
					    static decodeNonceInitialize(
 | 
				
			||||||
      instruction: TransactionInstruction,
 | 
					      instruction: TransactionInstruction,
 | 
				
			||||||
    ): InitializeNonceParams;
 | 
					    ): InitializeNonceParams;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,11 +42,11 @@ export type TransferParams = {|
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Assign system transaction params
 | 
					 * Assign system transaction params
 | 
				
			||||||
 * @typedef {Object} AssignParams
 | 
					 * @typedef {Object} AssignParams
 | 
				
			||||||
 * @property {PublicKey} fromPubkey
 | 
					 * @property {PublicKey} accountPubkey
 | 
				
			||||||
 * @property {PublicKey} programId
 | 
					 * @property {PublicKey} programId
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export type AssignParams = {|
 | 
					export type AssignParams = {|
 | 
				
			||||||
  fromPubkey: PublicKey,
 | 
					  accountPubkey: PublicKey,
 | 
				
			||||||
  programId: PublicKey,
 | 
					  programId: PublicKey,
 | 
				
			||||||
|};
 | 
					|};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -155,6 +155,49 @@ export type AuthorizeNonceParams = {|
 | 
				
			|||||||
  newAuthorizedPubkey: PublicKey,
 | 
					  newAuthorizedPubkey: PublicKey,
 | 
				
			||||||
|};
 | 
					|};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Allocate account system transaction params
 | 
				
			||||||
 | 
					 * @typedef {Object} AllocateParams
 | 
				
			||||||
 | 
					 * @property {PublicKey} accountPubkey
 | 
				
			||||||
 | 
					 * @property {number} space
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export type AllocateParams = {|
 | 
				
			||||||
 | 
					  accountPubkey: PublicKey,
 | 
				
			||||||
 | 
					  space: number,
 | 
				
			||||||
 | 
					|};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Allocate account with seed system transaction params
 | 
				
			||||||
 | 
					 * @typedef {Object} AllocateWithSeedParams
 | 
				
			||||||
 | 
					 * @property {PublicKey} accountPubkey
 | 
				
			||||||
 | 
					 * @property {PublicKey} basePubkey
 | 
				
			||||||
 | 
					 * @property {string} seed
 | 
				
			||||||
 | 
					 * @property {number} space
 | 
				
			||||||
 | 
					 * @property {PublicKey} programId
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export type AllocateWithSeedParams = {|
 | 
				
			||||||
 | 
					  accountPubkey: PublicKey,
 | 
				
			||||||
 | 
					  basePubkey: PublicKey,
 | 
				
			||||||
 | 
					  seed: string,
 | 
				
			||||||
 | 
					  space: number,
 | 
				
			||||||
 | 
					  programId: PublicKey,
 | 
				
			||||||
 | 
					|};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Assign account with seed system transaction params
 | 
				
			||||||
 | 
					 * @typedef {Object} AssignWithSeedParams
 | 
				
			||||||
 | 
					 * @property {PublicKey} accountPubkey
 | 
				
			||||||
 | 
					 * @property {PublicKey} basePubkey
 | 
				
			||||||
 | 
					 * @property {string} seed
 | 
				
			||||||
 | 
					 * @property {PublicKey} programId
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export type AssignWithSeedParams = {|
 | 
				
			||||||
 | 
					  accountPubkey: PublicKey,
 | 
				
			||||||
 | 
					  basePubkey: PublicKey,
 | 
				
			||||||
 | 
					  seed: string,
 | 
				
			||||||
 | 
					  programId: PublicKey,
 | 
				
			||||||
 | 
					|};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * System Instruction class
 | 
					 * System Instruction class
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -226,6 +269,47 @@ export class SystemInstruction {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Decode an allocate system instruction and retrieve the instruction params.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  static decodeAllocate(instruction: TransactionInstruction): AllocateParams {
 | 
				
			||||||
 | 
					    this.checkProgramId(instruction.programId);
 | 
				
			||||||
 | 
					    this.checkKeyLength(instruction.keys, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const {space} = decodeData(
 | 
				
			||||||
 | 
					      SYSTEM_INSTRUCTION_LAYOUTS.Allocate,
 | 
				
			||||||
 | 
					      instruction.data,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      accountPubkey: instruction.keys[0].pubkey,
 | 
				
			||||||
 | 
					      space,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Decode an allocate with seed system instruction and retrieve the instruction params.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  static decodeAllocateWithSeed(
 | 
				
			||||||
 | 
					    instruction: TransactionInstruction,
 | 
				
			||||||
 | 
					  ): AllocateWithSeedParams {
 | 
				
			||||||
 | 
					    this.checkProgramId(instruction.programId);
 | 
				
			||||||
 | 
					    this.checkKeyLength(instruction.keys, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const {base, seed, space, programId} = decodeData(
 | 
				
			||||||
 | 
					      SYSTEM_INSTRUCTION_LAYOUTS.AllocateWithSeed,
 | 
				
			||||||
 | 
					      instruction.data,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      accountPubkey: instruction.keys[0].pubkey,
 | 
				
			||||||
 | 
					      basePubkey: new PublicKey(base),
 | 
				
			||||||
 | 
					      seed,
 | 
				
			||||||
 | 
					      space,
 | 
				
			||||||
 | 
					      programId: new PublicKey(programId),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Decode an assign system instruction and retrieve the instruction params.
 | 
					   * Decode an assign system instruction and retrieve the instruction params.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
@@ -239,7 +323,29 @@ export class SystemInstruction {
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      fromPubkey: instruction.keys[0].pubkey,
 | 
					      accountPubkey: instruction.keys[0].pubkey,
 | 
				
			||||||
 | 
					      programId: new PublicKey(programId),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Decode an assign with seed system instruction and retrieve the instruction params.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  static decodeAssignWithSeed(
 | 
				
			||||||
 | 
					    instruction: TransactionInstruction,
 | 
				
			||||||
 | 
					  ): AssignWithSeedParams {
 | 
				
			||||||
 | 
					    this.checkProgramId(instruction.programId);
 | 
				
			||||||
 | 
					    this.checkKeyLength(instruction.keys, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const {base, seed, programId} = decodeData(
 | 
				
			||||||
 | 
					      SYSTEM_INSTRUCTION_LAYOUTS.AssignWithSeed,
 | 
				
			||||||
 | 
					      instruction.data,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      accountPubkey: instruction.keys[0].pubkey,
 | 
				
			||||||
 | 
					      basePubkey: new PublicKey(base),
 | 
				
			||||||
 | 
					      seed,
 | 
				
			||||||
      programId: new PublicKey(programId),
 | 
					      programId: new PublicKey(programId),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -444,6 +550,32 @@ export const SYSTEM_INSTRUCTION_LAYOUTS = Object.freeze({
 | 
				
			|||||||
      Layout.publicKey('authorized'),
 | 
					      Layout.publicKey('authorized'),
 | 
				
			||||||
    ]),
 | 
					    ]),
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  Allocate: {
 | 
				
			||||||
 | 
					    index: 8,
 | 
				
			||||||
 | 
					    layout: BufferLayout.struct([
 | 
				
			||||||
 | 
					      BufferLayout.u32('instruction'),
 | 
				
			||||||
 | 
					      BufferLayout.ns64('space'),
 | 
				
			||||||
 | 
					    ]),
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  AllocateWithSeed: {
 | 
				
			||||||
 | 
					    index: 9,
 | 
				
			||||||
 | 
					    layout: BufferLayout.struct([
 | 
				
			||||||
 | 
					      BufferLayout.u32('instruction'),
 | 
				
			||||||
 | 
					      Layout.publicKey('base'),
 | 
				
			||||||
 | 
					      Layout.rustString('seed'),
 | 
				
			||||||
 | 
					      BufferLayout.ns64('space'),
 | 
				
			||||||
 | 
					      Layout.publicKey('programId'),
 | 
				
			||||||
 | 
					    ]),
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  AssignWithSeed: {
 | 
				
			||||||
 | 
					    index: 10,
 | 
				
			||||||
 | 
					    layout: BufferLayout.struct([
 | 
				
			||||||
 | 
					      BufferLayout.u32('instruction'),
 | 
				
			||||||
 | 
					      Layout.publicKey('base'),
 | 
				
			||||||
 | 
					      Layout.rustString('seed'),
 | 
				
			||||||
 | 
					      Layout.publicKey('programId'),
 | 
				
			||||||
 | 
					    ]),
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -498,12 +630,22 @@ export class SystemProgram {
 | 
				
			|||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Generate a Transaction that assigns an account to a program
 | 
					   * Generate a Transaction that assigns an account to a program
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  static assign(params: AssignParams): Transaction {
 | 
					  static assign(params: AssignParams | AssignWithSeedParams): Transaction {
 | 
				
			||||||
    const type = SYSTEM_INSTRUCTION_LAYOUTS.Assign;
 | 
					    let data;
 | 
				
			||||||
    const data = encodeData(type, {programId: params.programId.toBuffer()});
 | 
					    if (params.basePubkey) {
 | 
				
			||||||
 | 
					      const type = SYSTEM_INSTRUCTION_LAYOUTS.AssignWithSeed;
 | 
				
			||||||
 | 
					      data = encodeData(type, {
 | 
				
			||||||
 | 
					        base: params.basePubkey.toBuffer(),
 | 
				
			||||||
 | 
					        seed: params.seed,
 | 
				
			||||||
 | 
					        programId: params.programId.toBuffer(),
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      const type = SYSTEM_INSTRUCTION_LAYOUTS.Assign;
 | 
				
			||||||
 | 
					      data = encodeData(type, {programId: params.programId.toBuffer()});
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return new Transaction().add({
 | 
					    return new Transaction().add({
 | 
				
			||||||
      keys: [{pubkey: params.fromPubkey, isSigner: true, isWritable: true}],
 | 
					      keys: [{pubkey: params.accountPubkey, isSigner: true, isWritable: true}],
 | 
				
			||||||
      programId: this.programId,
 | 
					      programId: this.programId,
 | 
				
			||||||
      data,
 | 
					      data,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -666,4 +808,33 @@ export class SystemProgram {
 | 
				
			|||||||
      data,
 | 
					      data,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Generate a Transaction that allocates space in an account without funding
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  static allocate(
 | 
				
			||||||
 | 
					    params: AllocateParams | AllocateWithSeedParams,
 | 
				
			||||||
 | 
					  ): Transaction {
 | 
				
			||||||
 | 
					    let data;
 | 
				
			||||||
 | 
					    if (params.basePubkey) {
 | 
				
			||||||
 | 
					      const type = SYSTEM_INSTRUCTION_LAYOUTS.AllocateWithSeed;
 | 
				
			||||||
 | 
					      data = encodeData(type, {
 | 
				
			||||||
 | 
					        base: params.basePubkey.toBuffer(),
 | 
				
			||||||
 | 
					        seed: params.seed,
 | 
				
			||||||
 | 
					        space: params.space,
 | 
				
			||||||
 | 
					        programId: params.programId.toBuffer(),
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      const type = SYSTEM_INSTRUCTION_LAYOUTS.Allocate;
 | 
				
			||||||
 | 
					      data = encodeData(type, {
 | 
				
			||||||
 | 
					        space: params.space,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return new Transaction().add({
 | 
				
			||||||
 | 
					      keys: [{pubkey: params.accountPubkey, isSigner: true, isWritable: true}],
 | 
				
			||||||
 | 
					      programId: this.programId,
 | 
				
			||||||
 | 
					      data,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -132,7 +132,7 @@ test('get program accounts', async () => {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
  let transaction = SystemProgram.assign({
 | 
					  let transaction = SystemProgram.assign({
 | 
				
			||||||
    fromPubkey: account0.publicKey,
 | 
					    accountPubkey: account0.publicKey,
 | 
				
			||||||
    programId: programId.publicKey,
 | 
					    programId: programId.publicKey,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
  await sendAndConfirmTransaction(connection, transaction, account0);
 | 
					  await sendAndConfirmTransaction(connection, transaction, account0);
 | 
				
			||||||
@@ -176,7 +176,7 @@ test('get program accounts', async () => {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
  transaction = SystemProgram.assign({
 | 
					  transaction = SystemProgram.assign({
 | 
				
			||||||
    fromPubkey: account1.publicKey,
 | 
					    accountPubkey: account1.publicKey,
 | 
				
			||||||
    programId: programId.publicKey,
 | 
					    programId: programId.publicKey,
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,9 +49,36 @@ test('transfer', () => {
 | 
				
			|||||||
  expect(params).toEqual(SystemInstruction.decodeTransfer(systemInstruction));
 | 
					  expect(params).toEqual(SystemInstruction.decodeTransfer(systemInstruction));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('allocate', () => {
 | 
				
			||||||
 | 
					  const params = {
 | 
				
			||||||
 | 
					    accountPubkey: new Account().publicKey,
 | 
				
			||||||
 | 
					    space: 42,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  const transaction = SystemProgram.allocate(params);
 | 
				
			||||||
 | 
					  expect(transaction.instructions).toHaveLength(1);
 | 
				
			||||||
 | 
					  const [systemInstruction] = transaction.instructions;
 | 
				
			||||||
 | 
					  expect(params).toEqual(SystemInstruction.decodeAllocate(systemInstruction));
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('allocateWithSeed', () => {
 | 
				
			||||||
 | 
					  const params = {
 | 
				
			||||||
 | 
					    accountPubkey: new Account().publicKey,
 | 
				
			||||||
 | 
					    basePubkey: new Account().publicKey,
 | 
				
			||||||
 | 
					    seed: '你好',
 | 
				
			||||||
 | 
					    space: 42,
 | 
				
			||||||
 | 
					    programId: new Account().publicKey,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  const transaction = SystemProgram.allocate(params);
 | 
				
			||||||
 | 
					  expect(transaction.instructions).toHaveLength(1);
 | 
				
			||||||
 | 
					  const [systemInstruction] = transaction.instructions;
 | 
				
			||||||
 | 
					  expect(params).toEqual(
 | 
				
			||||||
 | 
					    SystemInstruction.decodeAllocateWithSeed(systemInstruction),
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test('assign', () => {
 | 
					test('assign', () => {
 | 
				
			||||||
  const params = {
 | 
					  const params = {
 | 
				
			||||||
    fromPubkey: new Account().publicKey,
 | 
					    accountPubkey: new Account().publicKey,
 | 
				
			||||||
    programId: new Account().publicKey,
 | 
					    programId: new Account().publicKey,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  const transaction = SystemProgram.assign(params);
 | 
					  const transaction = SystemProgram.assign(params);
 | 
				
			||||||
@@ -60,6 +87,21 @@ test('assign', () => {
 | 
				
			|||||||
  expect(params).toEqual(SystemInstruction.decodeAssign(systemInstruction));
 | 
					  expect(params).toEqual(SystemInstruction.decodeAssign(systemInstruction));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('assignWithSeed', () => {
 | 
				
			||||||
 | 
					  const params = {
 | 
				
			||||||
 | 
					    accountPubkey: new Account().publicKey,
 | 
				
			||||||
 | 
					    basePubkey: new Account().publicKey,
 | 
				
			||||||
 | 
					    seed: '你好',
 | 
				
			||||||
 | 
					    programId: new Account().publicKey,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  const transaction = SystemProgram.assign(params);
 | 
				
			||||||
 | 
					  expect(transaction.instructions).toHaveLength(1);
 | 
				
			||||||
 | 
					  const [systemInstruction] = transaction.instructions;
 | 
				
			||||||
 | 
					  expect(params).toEqual(
 | 
				
			||||||
 | 
					    SystemInstruction.decodeAssignWithSeed(systemInstruction),
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test('createAccountWithSeed', () => {
 | 
					test('createAccountWithSeed', () => {
 | 
				
			||||||
  const fromPubkey = new Account().publicKey;
 | 
					  const fromPubkey = new Account().publicKey;
 | 
				
			||||||
  const params = {
 | 
					  const params = {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user