11package systems .glam .services .state ;
22
33import software .sava .core .accounts .PublicKey ;
4+ import software .sava .core .accounts .SolanaAccounts ;
45import software .sava .core .encoding .ByteUtil ;
56import software .sava .idl .clients .core .gen .SerDeUtil ;
67import software .sava .rpc .json .http .response .AccountInfo ;
@@ -12,6 +13,7 @@ public record MinGlamStateAccount(long slot,
1213 AccountType accountType ,
1314 int baseAssetIndex ,
1415 int baseAssetDecimals ,
16+ int baseAssetTokenProgram ,
1517 byte [] assetBytes ,
1618 PublicKey [] assets ,
1719 byte [] externalPositionsBytes ,
@@ -33,14 +35,21 @@ public boolean doesNotContainsAsset(final PublicKey mint) {
3335 return Arrays .binarySearch (assets , mint ) < 0 ;
3436 }
3537
38+ public PublicKey tokenProgram (final SolanaAccounts solanaAccounts ) {
39+ return baseAssetTokenProgram == 0
40+ ? solanaAccounts .tokenProgram ()
41+ : solanaAccounts .token2022Program ();
42+ }
43+
3644 public byte [] serialize () {
37- final int len = Long .BYTES + 1 + 1 + 1 + 1 + assetBytes .length + 1 + externalPositionsBytes .length ;
45+ final int len = Long .BYTES + 1 + 1 + 1 + 1 + 1 + assetBytes .length + 1 + externalPositionsBytes .length ;
3846 final byte [] data = new byte [len ];
3947 ByteUtil .putInt64LE (data , 0 , slot );
4048 int i = Long .BYTES ;
4149 data [i ++] = (byte ) accountType .ordinal ();
4250 data [i ++] = (byte ) baseAssetIndex ;
4351 data [i ++] = (byte ) baseAssetDecimals ;
52+ data [i ++] = (byte ) baseAssetTokenProgram ;
4453 data [i ++] = (byte ) assets .length ;
4554 System .arraycopy (assetBytes , 0 , data , i , assetBytes .length );
4655 i += assetBytes .length ;
@@ -55,6 +64,7 @@ public static MinGlamStateAccount deserialize(final byte[] data) {
5564 final var accountType = AccountType .values ()[data [i ++] & 0xFF ];
5665 final var baseAssetMintIndex = data [i ++] & 0xFF ;
5766 final int baseAssetDecimals = data [i ++] & 0xFF ;
67+ final int baseAssetTokenProgram = data [i ++] & 0xFF ;
5868 final var assets = SerDeUtil .readPublicKeyVector (1 , data , i ++);
5969 Arrays .sort (assets );
6070 final int to = i + (assets .length * PublicKey .PUBLIC_KEY_LENGTH );
@@ -66,7 +76,7 @@ public static MinGlamStateAccount deserialize(final byte[] data) {
6676 return new MinGlamStateAccount (
6777 slot ,
6878 accountType ,
69- baseAssetMintIndex , baseAssetDecimals ,
79+ baseAssetMintIndex , baseAssetDecimals , baseAssetTokenProgram ,
7080 assetBytes , assets ,
7181 externalPositionsBytes , externalPositions
7282 );
@@ -123,11 +133,12 @@ public static MinGlamStateAccount createRecord(final long slot, final byte[] dat
123133 final var baseAssetMint = PublicKey .readPubKey (data , StateAccount .BASE_ASSET_MINT_OFFSET );
124134 final int baseAssetIndex = Arrays .binarySearch (assets , baseAssetMint );
125135 final int baseAssetDecimals = data [StateAccount .BASE_ASSET_DECIMALS_OFFSET ] & 0xFF ;
136+ final int baseAssetTokenProgram = data [StateAccount .BASE_ASSET_TOKEN_PROGRAM_OFFSET ] & 0xFF ;
126137
127138 return new MinGlamStateAccount (
128139 slot ,
129140 accountType ,
130- baseAssetIndex , baseAssetDecimals ,
141+ baseAssetIndex , baseAssetDecimals , baseAssetTokenProgram ,
131142 assetBytes , assets , externalPositionsBytes , externalPositions
132143 );
133144 }
@@ -203,7 +214,7 @@ public MinGlamStateAccount createIfChanged(final long slot, final PublicKey stat
203214 return new MinGlamStateAccount (
204215 slot ,
205216 this .accountType ,
206- baseAssetIndex , this .baseAssetDecimals ,
217+ baseAssetIndex , this .baseAssetDecimals , this . baseAssetTokenProgram ,
207218 assetBytes , assets ,
208219 externalPositionsBytes , externalPositions
209220 );
@@ -214,12 +225,14 @@ public boolean equals(final Object o) {
214225 if (!(o instanceof MinGlamStateAccount (
215226 _,
216227 AccountType type ,
217- int assetIndex , int assetDecimals ,
228+ int assetIndex , int assetDecimals , int assetTokenProgram ,
218229 byte [] bytes , _,
219230 byte [] positionsBytes , _
220231 ))) return false ;
221232 return baseAssetIndex == assetIndex
222- && baseAssetDecimals == assetDecimals && Arrays .equals (assetBytes , bytes )
233+ && baseAssetDecimals == assetDecimals
234+ && baseAssetTokenProgram == assetTokenProgram
235+ && Arrays .equals (assetBytes , bytes )
223236 && accountType == type
224237 && Arrays .equals (externalPositionsBytes , positionsBytes );
225238 }
@@ -229,6 +242,7 @@ public int hashCode() {
229242 int result = accountType .hashCode ();
230243 result = 31 * result + baseAssetIndex ;
231244 result = 31 * result + baseAssetDecimals ;
245+ result = 31 * result + baseAssetTokenProgram ;
232246 result = 31 * result + Arrays .hashCode (assetBytes );
233247 result = 31 * result + Arrays .hashCode (externalPositionsBytes );
234248 return result ;
0 commit comments