Skip to content

Commit 5657c5d

Browse files
authored
feat(sdk-coin-sol): support SetComputeUnitLimit instructions
2 parents 198ce0c + 307dca3 commit 5657c5d

File tree

7 files changed

+84
-3
lines changed

7 files changed

+84
-3
lines changed

modules/sdk-coin-sol/src/lib/constants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export enum ValidInstructionTypesEnum {
3434
Assign = 'Assign',
3535
Split = 'Split',
3636
Authorize = 'Authorize',
37+
SetComputeUnitLimit = 'SetComputeUnitLimit',
3738
SetPriorityFee = 'SetPriorityFee',
3839
MintTo = 'MintTo',
3940
Burn = 'Burn',
@@ -57,6 +58,7 @@ export enum InstructionBuilderTypes {
5758
TokenTransfer = 'TokenTransfer',
5859
StakingAuthorize = 'Authorize',
5960
StakingDelegate = 'Delegate',
61+
SetComputeUnitLimit = 'SetComputeUnitLimit',
6062
SetPriorityFee = 'SetPriorityFee',
6163
MintTo = 'MintTo',
6264
Burn = 'Burn',
@@ -83,6 +85,7 @@ export const VALID_SYSTEM_INSTRUCTION_TYPES: ValidInstructionTypes[] = [
8385
ValidInstructionTypesEnum.Assign,
8486
ValidInstructionTypesEnum.Split,
8587
ValidInstructionTypesEnum.Authorize,
88+
ValidInstructionTypesEnum.SetComputeUnitLimit,
8689
ValidInstructionTypesEnum.SetPriorityFee,
8790
ValidInstructionTypesEnum.MintTo,
8891
ValidInstructionTypesEnum.Burn,

modules/sdk-coin-sol/src/lib/iface.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export type InstructionParams =
3636
| Nonce
3737
| Memo
3838
| WalletInit
39+
| SetComputeUnitLimit
3940
| SetPriorityFee
4041
| Transfer
4142
| StakingActivate
@@ -188,6 +189,13 @@ export interface StakingAuthorize {
188189
};
189190
}
190191

192+
export interface SetComputeUnitLimit {
193+
type: InstructionBuilderTypes.SetComputeUnitLimit;
194+
params: {
195+
units: number;
196+
};
197+
}
198+
191199
export interface SetPriorityFee {
192200
type: InstructionBuilderTypes.SetPriorityFee;
193201
params: {
@@ -221,6 +229,7 @@ export type ValidInstructionTypes =
221229
| 'CloseAssociatedTokenAccount'
222230
| DecodedCloseAccountInstruction
223231
| 'TokenTransfer'
232+
| 'SetComputeUnitLimit'
224233
| 'SetPriorityFee'
225234
| 'MintTo'
226235
| 'Burn'

modules/sdk-coin-sol/src/lib/instructionParamsFactory.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import {
4545
TokenTransfer,
4646
Transfer,
4747
WalletInit,
48+
SetComputeUnitLimit,
4849
SetPriorityFee,
4950
CustomInstruction,
5051
Approve,
@@ -138,9 +139,31 @@ function parseSendInstructions(
138139
instructions: TransactionInstruction[],
139140
instructionMetadata?: InstructionParams[],
140141
_useTokenAddressTokenName?: boolean
141-
): Array<Nonce | Memo | Transfer | TokenTransfer | AtaInit | AtaClose | SetPriorityFee | MintTo | Burn | Approve> {
142+
): Array<
143+
| Nonce
144+
| Memo
145+
| Transfer
146+
| TokenTransfer
147+
| AtaInit
148+
| AtaClose
149+
| SetComputeUnitLimit
150+
| SetPriorityFee
151+
| MintTo
152+
| Burn
153+
| Approve
154+
> {
142155
const instructionData: Array<
143-
Nonce | Memo | Transfer | TokenTransfer | AtaInit | AtaClose | SetPriorityFee | MintTo | Burn | Approve
156+
| Nonce
157+
| Memo
158+
| Transfer
159+
| TokenTransfer
160+
| AtaInit
161+
| AtaClose
162+
| SetComputeUnitLimit
163+
| SetPriorityFee
164+
| MintTo
165+
| Burn
166+
| Approve
144167
> = [];
145168
for (const instruction of instructions) {
146169
const type = getInstructionType(instruction);
@@ -252,6 +275,16 @@ function parseSendInstructions(
252275
};
253276
instructionData.push(ataClose);
254277
break;
278+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
279+
const setComputeUnitLimitParams = ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction);
280+
const setComputeUnitLimit: SetComputeUnitLimit = {
281+
type: InstructionBuilderTypes.SetComputeUnitLimit,
282+
params: {
283+
units: setComputeUnitLimitParams.units,
284+
},
285+
};
286+
instructionData.push(setComputeUnitLimit);
287+
break;
255288
case ValidInstructionTypesEnum.SetPriorityFee:
256289
const setComputeUnitPriceParams = ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction);
257290
const setPriorityFee: SetPriorityFee = {

modules/sdk-coin-sol/src/lib/solInstructionFactory.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
TokenTransfer,
4141
Transfer,
4242
WalletInit,
43+
SetComputeUnitLimit,
4344
SetPriorityFee,
4445
CustomInstruction,
4546
Approve,
@@ -82,6 +83,8 @@ export function solInstructionFactory(instructionToBuild: InstructionParams): Tr
8283
return stakingAuthorizeInstruction(instructionToBuild);
8384
case InstructionBuilderTypes.StakingDelegate:
8485
return stakingDelegateInstruction(instructionToBuild);
86+
case InstructionBuilderTypes.SetComputeUnitLimit:
87+
return setComputeUnitLimitInstruction(instructionToBuild);
8588
case InstructionBuilderTypes.SetPriorityFee:
8689
return fetchPriorityFeeInstruction(instructionToBuild);
8790
case InstructionBuilderTypes.MintTo:
@@ -114,6 +117,14 @@ function advanceNonceInstruction(data: Nonce): TransactionInstruction[] {
114117
return [nonceInstruction];
115118
}
116119

120+
function setComputeUnitLimitInstruction(instructionToBuild: SetComputeUnitLimit): TransactionInstruction[] {
121+
const setComputeUnitLimit = ComputeBudgetProgram.setComputeUnitLimit({
122+
units: instructionToBuild.params.units,
123+
});
124+
125+
return [setComputeUnitLimit];
126+
}
127+
117128
function fetchPriorityFeeInstruction(instructionToBuild: SetPriorityFee): TransactionInstruction[] {
118129
const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
119130
microLamports: instructionToBuild.params.fee,

modules/sdk-coin-sol/src/lib/transaction.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,8 @@ export class Transaction extends BaseTransaction {
489489
break;
490490
case InstructionBuilderTypes.StakingDelegate:
491491
break;
492+
case InstructionBuilderTypes.SetComputeUnitLimit:
493+
break;
492494
case InstructionBuilderTypes.SetPriorityFee:
493495
break;
494496
case InstructionBuilderTypes.CustomInstruction:

modules/sdk-coin-sol/src/lib/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
SystemInstruction,
2828
SystemProgram,
2929
TransactionInstruction,
30+
ComputeBudgetInstruction,
3031
} from '@solana/web3.js';
3132
import assert from 'assert';
3233
import BigNumber from 'bignumber.js';
@@ -420,6 +421,9 @@ export function getInstructionType(instruction: TransactionInstruction): ValidIn
420421
);
421422
}
422423
case COMPUTE_BUDGET:
424+
if (ComputeBudgetInstruction.decodeInstructionType(instruction) === 'SetComputeUnitLimit') {
425+
return 'SetComputeUnitLimit';
426+
}
423427
return 'SetPriorityFee';
424428
default:
425429
return 'CustomInstruction';

modules/sdk-coin-sol/test/unit/utils.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import should from 'should';
22
import { Utils } from '../../src/lib';
33
import * as testData from '../resources/sol';
4-
import { Lockup, PublicKey, StakeProgram, SystemProgram, TransactionInstruction } from '@solana/web3.js';
4+
import {
5+
ComputeBudgetProgram,
6+
Lockup,
7+
PublicKey,
8+
StakeProgram,
9+
SystemProgram,
10+
TransactionInstruction,
11+
} from '@solana/web3.js';
512
import {
613
MEMO_PROGRAM_PK,
714
stakingActivateInstructionsIndexes,
@@ -244,6 +251,18 @@ describe('SOL util library', function () {
244251
});
245252
Utils.getInstructionType(invalidInstruction).should.equal('CustomInstruction');
246253
});
254+
it('should succeed for ComputeBudget SetComputeUnitLimit instruction', function () {
255+
const setComputeUnitLimitInstruction = ComputeBudgetProgram.setComputeUnitLimit({
256+
units: 300000,
257+
});
258+
Utils.getInstructionType(setComputeUnitLimitInstruction).should.equal('SetComputeUnitLimit');
259+
});
260+
it('should succeed for ComputeBudget SetComputeUnitPrice instruction', function () {
261+
const setComputeUnitPriceInstruction = ComputeBudgetProgram.setComputeUnitPrice({
262+
microLamports: 100000,
263+
});
264+
Utils.getInstructionType(setComputeUnitPriceInstruction).should.equal('SetPriorityFee');
265+
});
247266
});
248267

249268
describe('validateIntructionTypes', function () {

0 commit comments

Comments
 (0)