Skip to content

Commit 500f6d8

Browse files
committed
Add more tests for ClaimVesting instruction
1 parent ed38c72 commit 500f6d8

File tree

1 file changed

+233
-13
lines changed

1 file changed

+233
-13
lines changed

solana/tests/vesting.ts

+233-13
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,8 @@ describe("vesting", () => {
836836
.accounts({
837837
...accounts,
838838
vest: vestNow,
839-
stakeAccountCheckpoints: null,
839+
delegateStakeAccountCheckpoints: null,
840+
delegateStakeAccountMetadata: null,
840841
stakeAccountMetadata: null,
841842
globalConfig: stakeConnection.configAddress,
842843
})
@@ -1006,7 +1007,8 @@ describe("vesting", () => {
10061007
.accounts({
10071008
...accounts,
10081009
vest: vestEvenLater,
1009-
stakeAccountCheckpoints: null,
1010+
delegateStakeAccountCheckpoints: null,
1011+
delegateStakeAccountMetadata: null,
10101012
stakeAccountMetadata: null,
10111013
globalConfig: stakeConnection.configAddress,
10121014
})
@@ -1308,7 +1310,8 @@ describe("vesting", () => {
13081310
.accounts({
13091311
...accounts,
13101312
vest: vestNow,
1311-
stakeAccountCheckpoints: null,
1313+
delegateStakeAccountCheckpoints: null,
1314+
delegateStakeAccountMetadata: null,
13121315
stakeAccountMetadata: null,
13131316
globalConfig: stakeConnection.configAddress,
13141317
})
@@ -1336,7 +1339,8 @@ describe("vesting", () => {
13361339
.accounts({
13371340
...accounts,
13381341
vest: vestNow,
1339-
stakeAccountCheckpoints: null,
1342+
delegateStakeAccountCheckpoints: null,
1343+
delegateStakeAccountMetadata: stakeAccountMetadataAddress,
13401344
stakeAccountMetadata: stakeAccountMetadataAddress,
13411345
globalConfig: stakeConnection.configAddress,
13421346
})
@@ -1369,7 +1373,8 @@ describe("vesting", () => {
13691373
.accounts({
13701374
...accounts,
13711375
vest: vestNow,
1372-
stakeAccountCheckpoints: incorrectStakeAccountCheckpointsAddress,
1376+
delegateStakeAccountCheckpoints: incorrectStakeAccountCheckpointsAddress,
1377+
delegateStakeAccountMetadata: incorrectStakeAccountMetadataAddress,
13731378
stakeAccountMetadata: incorrectStakeAccountMetadataAddress,
13741379
globalConfig: stakeConnection.configAddress,
13751380
})
@@ -1408,7 +1413,8 @@ describe("vesting", () => {
14081413
.accounts({
14091414
...accounts,
14101415
vest: vestNow,
1411-
stakeAccountCheckpoints: incorrectStakeAccountCheckpointsAddress,
1416+
delegateStakeAccountCheckpoints: incorrectStakeAccountCheckpointsAddress,
1417+
delegateStakeAccountMetadata: stakeAccountMetadataAddress,
14121418
stakeAccountMetadata: stakeAccountMetadataAddress,
14131419
globalConfig: stakeConnection.configAddress,
14141420
})
@@ -1501,7 +1507,8 @@ describe("vesting", () => {
15011507
.accounts({
15021508
...accounts,
15031509
vest: vestNow,
1504-
stakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
1510+
delegateStakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
1511+
delegateStakeAccountMetadata: stakeAccountMetadataAddress,
15051512
stakeAccountMetadata: stakeAccountMetadataAddress,
15061513
globalConfig: stakeConnection.configAddress,
15071514
})
@@ -1651,7 +1658,8 @@ describe("vesting", () => {
16511658
.accounts({
16521659
...accounts,
16531660
vest: vestFewLater,
1654-
stakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
1661+
delegateStakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
1662+
delegateStakeAccountMetadata: stakeAccountMetadataAddress,
16551663
stakeAccountMetadata: stakeAccountMetadataAddress,
16561664
globalConfig: stakeConnection.configAddress,
16571665
})
@@ -1923,7 +1931,8 @@ describe("vesting", () => {
19231931
.accounts({
19241932
...accounts,
19251933
vest: vestFewLater,
1926-
stakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
1934+
delegateStakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
1935+
delegateStakeAccountMetadata: stakeAccountMetadataAddress,
19271936
stakeAccountMetadata: stakeAccountMetadataAddress,
19281937
globalConfig: stakeConnection.configAddress,
19291938
})
@@ -2728,6 +2737,7 @@ describe("vesting", () => {
27282737
"0",
27292738
);
27302739

2740+
await sleep(2000);
27312741
await vester2StakeConnection.program.methods
27322742
.transferVesting()
27332743
.accounts({
@@ -2813,6 +2823,179 @@ describe("vesting", () => {
28132823
);
28142824
});
28152825

2826+
it("should fail to claim staked vest with votes delegated to another user with incorrect accounts", async () => {
2827+
let stakeAccountMetadataAddress =
2828+
await newVester2StakeConnection.getStakeMetadataAddress(
2829+
newVester2StakeConnection.userPublicKey(),
2830+
);
2831+
2832+
await sleep(2000);
2833+
await newVester2StakeConnection.delegateWithVest(
2834+
vester2StakeConnection.userPublicKey(),
2835+
WHTokenBalance.fromString("10"),
2836+
true,
2837+
config,
2838+
);
2839+
2840+
let stakeAccountMetadataData =
2841+
await newVester2StakeConnection.fetchStakeAccountMetadata(
2842+
newVester2StakeConnection.userPublicKey(),
2843+
);
2844+
let delegateStakeAccountCheckpointsOwner =
2845+
stakeAccountMetadataData.delegate;
2846+
let delegateStakeAccountMetadataAddress =
2847+
await newVester2StakeConnection.getStakeMetadataAddress(
2848+
delegateStakeAccountCheckpointsOwner,
2849+
);
2850+
2851+
let delegateStakeAccountCheckpointsAddress =
2852+
await newVester2StakeConnection.getStakeAccountCheckpointsAddressByMetadata(
2853+
delegateStakeAccountMetadataAddress,
2854+
false,
2855+
);
2856+
2857+
let newVest2 = PublicKey.findProgramAddressSync(
2858+
[
2859+
Buffer.from(wasm.Constants.VEST_SEED()),
2860+
config.toBuffer(),
2861+
newVester2Ta.toBuffer(),
2862+
FEW_LATER.toBuffer("le", 8),
2863+
],
2864+
stakeConnection.program.programId,
2865+
)[0];
2866+
2867+
try {
2868+
await newVester2StakeConnection.program.methods
2869+
.claimVesting()
2870+
.accounts({
2871+
...accounts,
2872+
vester: newVester2.publicKey,
2873+
vesterTa: newVester2Ta,
2874+
vest: newVest2,
2875+
vestingBalance: newVesting2Balance,
2876+
delegateStakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
2877+
delegateStakeAccountMetadata: stakeAccountMetadataAddress, // invalid delegateStakeAccountMetadata
2878+
stakeAccountMetadata: stakeAccountMetadataAddress,
2879+
globalConfig: stakeConnection.configAddress,
2880+
})
2881+
.signers([newVester2])
2882+
.rpc()
2883+
.then(confirm);
2884+
2885+
assert.fail("Expected error was not thrown");
2886+
} catch (e) {
2887+
assert(
2888+
(e as AnchorError).error?.errorCode?.code === "InvalidStakeAccountOwner",
2889+
);
2890+
}
2891+
2892+
let newVesterStakeAccountMetadataAddress =
2893+
await newVesterStakeConnection.getStakeMetadataAddress(
2894+
newVesterStakeConnection.userPublicKey(),
2895+
);
2896+
let newVesterStakeAccountCheckpointsAddress =
2897+
await newVesterStakeConnection.getStakeAccountCheckpointsAddressByMetadata(
2898+
newVesterStakeAccountMetadataAddress,
2899+
false,
2900+
);
2901+
2902+
try {
2903+
await newVester2StakeConnection.program.methods
2904+
.claimVesting()
2905+
.accounts({
2906+
...accounts,
2907+
vester: newVester2.publicKey,
2908+
vesterTa: newVester2Ta,
2909+
vest: newVest2,
2910+
vestingBalance: newVesting2Balance,
2911+
delegateStakeAccountCheckpoints: newVesterStakeAccountCheckpointsAddress, // invalid delegateStakeAccountCheckpoints
2912+
delegateStakeAccountMetadata: delegateStakeAccountMetadataAddress,
2913+
stakeAccountMetadata: stakeAccountMetadataAddress,
2914+
globalConfig: stakeConnection.configAddress,
2915+
})
2916+
.signers([newVester2])
2917+
.rpc()
2918+
.then(confirm);
2919+
2920+
assert.fail("Expected error was not thrown");
2921+
} catch (e) {
2922+
assert(
2923+
(e as AnchorError).error?.errorCode?.code === "InvalidStakeAccountCheckpoints",
2924+
);
2925+
}
2926+
});
2927+
2928+
it("should successfully claim staked vest with votes delegated to another user", async () => {
2929+
let stakeAccountMetadataAddress =
2930+
await newVester2StakeConnection.getStakeMetadataAddress(
2931+
newVester2StakeConnection.userPublicKey(),
2932+
);
2933+
2934+
let stakeAccountMetadataData =
2935+
await newVester2StakeConnection.fetchStakeAccountMetadata(
2936+
newVester2StakeConnection.userPublicKey(),
2937+
);
2938+
let delegateStakeAccountCheckpointsOwner =
2939+
stakeAccountMetadataData.delegate;
2940+
let delegateStakeAccountMetadataAddress =
2941+
await newVester2StakeConnection.getStakeMetadataAddress(
2942+
delegateStakeAccountCheckpointsOwner,
2943+
);
2944+
2945+
let delegateStakeAccountCheckpointsAddress =
2946+
await newVester2StakeConnection.getStakeAccountCheckpointsAddressByMetadata(
2947+
delegateStakeAccountMetadataAddress,
2948+
false,
2949+
);
2950+
2951+
let newVest2 = PublicKey.findProgramAddressSync(
2952+
[
2953+
Buffer.from(wasm.Constants.VEST_SEED()),
2954+
config.toBuffer(),
2955+
newVester2Ta.toBuffer(),
2956+
FEW_LATER.toBuffer("le", 8),
2957+
],
2958+
stakeConnection.program.programId,
2959+
)[0];
2960+
2961+
await sleep(2000);
2962+
await newVester2StakeConnection.program.methods
2963+
.claimVesting()
2964+
.accounts({
2965+
...accounts,
2966+
vester: newVester2.publicKey,
2967+
vesterTa: newVester2Ta,
2968+
vest: newVest2,
2969+
vestingBalance: newVesting2Balance,
2970+
delegateStakeAccountCheckpoints: delegateStakeAccountCheckpointsAddress,
2971+
delegateStakeAccountMetadata: delegateStakeAccountMetadataAddress,
2972+
stakeAccountMetadata: stakeAccountMetadataAddress,
2973+
globalConfig: stakeConnection.configAddress,
2974+
})
2975+
.signers([newVester2])
2976+
.rpc()
2977+
.then(confirm);
2978+
2979+
let vesterStakeMetadata: StakeAccountMetadata =
2980+
await newVester2StakeConnection.fetchStakeAccountMetadata(
2981+
newVester2StakeConnection.userPublicKey(),
2982+
);
2983+
2984+
let vesterStakeCheckpoints: CheckpointAccount =
2985+
await newVester2StakeConnection.fetchCheckpointAccount(
2986+
delegateStakeAccountCheckpointsAddress,
2987+
);
2988+
2989+
assert.equal(
2990+
vesterStakeMetadata.recordedVestingBalance.toString(),
2991+
"0",
2992+
);
2993+
assert.equal(
2994+
vesterStakeCheckpoints.getLastCheckpoint().value.toString(),
2995+
"30000000",
2996+
);
2997+
});
2998+
28162999
it("should successfully transfer vest to another vester with an existing vest of the same kind", async () => {
28173000
let stakeAccountMetadataAddress =
28183001
await vesterStakeConnection.getStakeMetadataAddress(
@@ -2853,6 +3036,7 @@ describe("vesting", () => {
28533036
"2353000000",
28543037
);
28553038

3039+
await sleep(2000);
28563040
await stakeConnection.program.methods
28573041
.transferVesting()
28583042
.accounts({
@@ -2932,14 +3116,16 @@ describe("vesting", () => {
29323116
stakeAccountMetadataAddress,
29333117
);
29343118

3119+
await sleep(2000);
29353120
await stakeConnection.program.methods
29363121
.claimVesting()
29373122
.accounts({
29383123
...accounts,
29393124
vester: newVester.publicKey,
29403125
vest: vestNowTransfered,
29413126
vesterTa: newVesterTa,
2942-
stakeAccountCheckpoints: stakeAccountCheckpointsAddress,
3127+
delegateStakeAccountCheckpoints: stakeAccountCheckpointsAddress,
3128+
delegateStakeAccountMetadata: stakeAccountMetadataAddress,
29433129
stakeAccountMetadata: stakeAccountMetadataAddress,
29443130
vestingBalance: newVestingBalance,
29453131
globalConfig: stakeConnection.configAddress,
@@ -2969,11 +3155,45 @@ describe("vesting", () => {
29693155
newVesterStakeAccountMetadataAddress,
29703156
false,
29713157
);
2972-
let newVesterStakeAccountMetadata =
2973-
await newVesterStakeConnection.fetchStakeAccountMetadata(
2974-
newVesterStakeConnection.userPublicKey(),
3158+
3159+
if (newVesterStakeAccountCheckpointsAddress == undefined) {
3160+
let previousNewVesterStakeAccountCheckpointsAddress =
3161+
await newVesterStakeConnection.getStakeAccountCheckpointsAddressByMetadata(
3162+
newVesterStakeAccountMetadataAddress,
3163+
true,
3164+
);
3165+
3166+
let previousNewVesterStakeCheckpoints: CheckpointAccount =
3167+
await newVesterStakeConnection.fetchCheckpointAccount(
3168+
previousNewVesterStakeAccountCheckpointsAddress,
3169+
);
3170+
3171+
// previous checkpoint account is filled
3172+
assert.equal(
3173+
previousNewVesterStakeCheckpoints.getCheckpointCount(),
3174+
TINY_CHECKPOINTS_ACCOUNT_LIMIT,
29753175
);
29763176

3177+
await sleep(2000);
3178+
await stakeConnection.program.methods
3179+
.createCheckpoints()
3180+
.accounts({
3181+
payer: accounts.vester,
3182+
stakeAccountCheckpoints: previousNewVesterStakeAccountCheckpointsAddress,
3183+
stakeAccountMetadata: newVesterStakeAccountMetadataAddress,
3184+
})
3185+
.signers([vester])
3186+
.rpc({ skipPreflight: true })
3187+
.then(confirm);
3188+
3189+
newVesterStakeAccountCheckpointsAddress =
3190+
await newVesterStakeConnection.getStakeAccountCheckpointsAddressByMetadata(
3191+
newVesterStakeAccountMetadataAddress,
3192+
false,
3193+
);
3194+
}
3195+
3196+
await sleep(2000);
29773197
// transfer vestLaterForTransfer from newVester to vesterWithoutAccount
29783198
await stakeConnection.program.methods
29793199
.transferVesting()

0 commit comments

Comments
 (0)