@@ -836,7 +836,8 @@ describe("vesting", () => {
836
836
. accounts ( {
837
837
...accounts ,
838
838
vest : vestNow ,
839
- stakeAccountCheckpoints : null ,
839
+ delegateStakeAccountCheckpoints : null ,
840
+ delegateStakeAccountMetadata : null ,
840
841
stakeAccountMetadata : null ,
841
842
globalConfig : stakeConnection . configAddress ,
842
843
} )
@@ -1006,7 +1007,8 @@ describe("vesting", () => {
1006
1007
. accounts ( {
1007
1008
...accounts ,
1008
1009
vest : vestEvenLater ,
1009
- stakeAccountCheckpoints : null ,
1010
+ delegateStakeAccountCheckpoints : null ,
1011
+ delegateStakeAccountMetadata : null ,
1010
1012
stakeAccountMetadata : null ,
1011
1013
globalConfig : stakeConnection . configAddress ,
1012
1014
} )
@@ -1308,7 +1310,8 @@ describe("vesting", () => {
1308
1310
. accounts ( {
1309
1311
...accounts ,
1310
1312
vest : vestNow ,
1311
- stakeAccountCheckpoints : null ,
1313
+ delegateStakeAccountCheckpoints : null ,
1314
+ delegateStakeAccountMetadata : null ,
1312
1315
stakeAccountMetadata : null ,
1313
1316
globalConfig : stakeConnection . configAddress ,
1314
1317
} )
@@ -1336,7 +1339,8 @@ describe("vesting", () => {
1336
1339
. accounts ( {
1337
1340
...accounts ,
1338
1341
vest : vestNow ,
1339
- stakeAccountCheckpoints : null ,
1342
+ delegateStakeAccountCheckpoints : null ,
1343
+ delegateStakeAccountMetadata : stakeAccountMetadataAddress ,
1340
1344
stakeAccountMetadata : stakeAccountMetadataAddress ,
1341
1345
globalConfig : stakeConnection . configAddress ,
1342
1346
} )
@@ -1369,7 +1373,8 @@ describe("vesting", () => {
1369
1373
. accounts ( {
1370
1374
...accounts ,
1371
1375
vest : vestNow ,
1372
- stakeAccountCheckpoints : incorrectStakeAccountCheckpointsAddress ,
1376
+ delegateStakeAccountCheckpoints : incorrectStakeAccountCheckpointsAddress ,
1377
+ delegateStakeAccountMetadata : incorrectStakeAccountMetadataAddress ,
1373
1378
stakeAccountMetadata : incorrectStakeAccountMetadataAddress ,
1374
1379
globalConfig : stakeConnection . configAddress ,
1375
1380
} )
@@ -1408,7 +1413,8 @@ describe("vesting", () => {
1408
1413
. accounts ( {
1409
1414
...accounts ,
1410
1415
vest : vestNow ,
1411
- stakeAccountCheckpoints : incorrectStakeAccountCheckpointsAddress ,
1416
+ delegateStakeAccountCheckpoints : incorrectStakeAccountCheckpointsAddress ,
1417
+ delegateStakeAccountMetadata : stakeAccountMetadataAddress ,
1412
1418
stakeAccountMetadata : stakeAccountMetadataAddress ,
1413
1419
globalConfig : stakeConnection . configAddress ,
1414
1420
} )
@@ -1501,7 +1507,8 @@ describe("vesting", () => {
1501
1507
. accounts ( {
1502
1508
...accounts ,
1503
1509
vest : vestNow ,
1504
- stakeAccountCheckpoints : delegateStakeAccountCheckpointsAddress ,
1510
+ delegateStakeAccountCheckpoints : delegateStakeAccountCheckpointsAddress ,
1511
+ delegateStakeAccountMetadata : stakeAccountMetadataAddress ,
1505
1512
stakeAccountMetadata : stakeAccountMetadataAddress ,
1506
1513
globalConfig : stakeConnection . configAddress ,
1507
1514
} )
@@ -1651,7 +1658,8 @@ describe("vesting", () => {
1651
1658
. accounts ( {
1652
1659
...accounts ,
1653
1660
vest : vestFewLater ,
1654
- stakeAccountCheckpoints : delegateStakeAccountCheckpointsAddress ,
1661
+ delegateStakeAccountCheckpoints : delegateStakeAccountCheckpointsAddress ,
1662
+ delegateStakeAccountMetadata : stakeAccountMetadataAddress ,
1655
1663
stakeAccountMetadata : stakeAccountMetadataAddress ,
1656
1664
globalConfig : stakeConnection . configAddress ,
1657
1665
} )
@@ -1923,7 +1931,8 @@ describe("vesting", () => {
1923
1931
. accounts ( {
1924
1932
...accounts ,
1925
1933
vest : vestFewLater ,
1926
- stakeAccountCheckpoints : delegateStakeAccountCheckpointsAddress ,
1934
+ delegateStakeAccountCheckpoints : delegateStakeAccountCheckpointsAddress ,
1935
+ delegateStakeAccountMetadata : stakeAccountMetadataAddress ,
1927
1936
stakeAccountMetadata : stakeAccountMetadataAddress ,
1928
1937
globalConfig : stakeConnection . configAddress ,
1929
1938
} )
@@ -2728,6 +2737,7 @@ describe("vesting", () => {
2728
2737
"0" ,
2729
2738
) ;
2730
2739
2740
+ await sleep ( 2000 ) ;
2731
2741
await vester2StakeConnection . program . methods
2732
2742
. transferVesting ( )
2733
2743
. accounts ( {
@@ -2813,6 +2823,179 @@ describe("vesting", () => {
2813
2823
) ;
2814
2824
} ) ;
2815
2825
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
+
2816
2999
it ( "should successfully transfer vest to another vester with an existing vest of the same kind" , async ( ) => {
2817
3000
let stakeAccountMetadataAddress =
2818
3001
await vesterStakeConnection . getStakeMetadataAddress (
@@ -2853,6 +3036,7 @@ describe("vesting", () => {
2853
3036
"2353000000" ,
2854
3037
) ;
2855
3038
3039
+ await sleep ( 2000 ) ;
2856
3040
await stakeConnection . program . methods
2857
3041
. transferVesting ( )
2858
3042
. accounts ( {
@@ -2932,14 +3116,16 @@ describe("vesting", () => {
2932
3116
stakeAccountMetadataAddress ,
2933
3117
) ;
2934
3118
3119
+ await sleep ( 2000 ) ;
2935
3120
await stakeConnection . program . methods
2936
3121
. claimVesting ( )
2937
3122
. accounts ( {
2938
3123
...accounts ,
2939
3124
vester : newVester . publicKey ,
2940
3125
vest : vestNowTransfered ,
2941
3126
vesterTa : newVesterTa ,
2942
- stakeAccountCheckpoints : stakeAccountCheckpointsAddress ,
3127
+ delegateStakeAccountCheckpoints : stakeAccountCheckpointsAddress ,
3128
+ delegateStakeAccountMetadata : stakeAccountMetadataAddress ,
2943
3129
stakeAccountMetadata : stakeAccountMetadataAddress ,
2944
3130
vestingBalance : newVestingBalance ,
2945
3131
globalConfig : stakeConnection . configAddress ,
@@ -2969,11 +3155,45 @@ describe("vesting", () => {
2969
3155
newVesterStakeAccountMetadataAddress ,
2970
3156
false ,
2971
3157
) ;
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 ,
2975
3175
) ;
2976
3176
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 ) ;
2977
3197
// transfer vestLaterForTransfer from newVester to vesterWithoutAccount
2978
3198
await stakeConnection . program . methods
2979
3199
. transferVesting ( )
0 commit comments