Skip to content

Commit 5a668a0

Browse files
committed
Add token program type to MinGlamStateAccount. null account checks on all account consumers.
1 parent e8f49db commit 5a668a0

File tree

7 files changed

+39
-14
lines changed

7 files changed

+39
-14
lines changed

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

gradlew

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

services/src/main/java/systems/glam/services/integrations/IntegrationServiceContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ default AccountMeta readClockSysVar() {
6060

6161
Path resolveGlamStateFilePath(final PublicKey glamStateKey);
6262

63+
AccountFetcher accountFetcher();
64+
6365
void queue(final Collection<PublicKey> accounts, final AccountConsumer callback);
6466

6567
void executeTask(final Runnable task);

services/src/main/java/systems/glam/services/integrations/IntegrationServiceContextImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ public StakePoolContext stakePoolContextForMint(final PublicKey mintKey) {
6565
return stakePoolCache.get(mintKey);
6666
}
6767

68+
@Override
69+
public AccountFetcher accountFetcher() {
70+
return accountFetcher;
71+
}
72+
6873
@Override
6974
public MintContext mintContext(final PublicKey mint) {
7075
return mintCache.get(mint);

services/src/main/java/systems/glam/services/integrations/kamino/KaminoCacheImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,9 @@ public void accept(final AccountInfo<byte[]> accountInfo) {
539539
@Override
540540
public void accept(final List<AccountInfo<byte[]>> accounts, final Map<PublicKey, AccountInfo<byte[]>> accountMap) {
541541
for (final var accountInfo : accounts) {
542+
if (AccountFetcher.isNull(accountInfo)) {
543+
continue;
544+
}
542545
final byte[] data = accountInfo.data();
543546
if (data.length == Reserve.BYTES && Reserve.DISCRIMINATOR.equals(data, 0)) {
544547
final var reserveContext = ReserveContext.createContext(accountInfo, mappingsContextMap);

services/src/main/java/systems/glam/services/state/GlobalConfigCacheImpl.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -647,12 +647,13 @@ public void accept(final List<AccountInfo<byte[]>> accounts, final Map<PublicKey
647647
}
648648
final var assetMap = this.assetMetaMap;
649649
for (final var accountInfo : accounts) {
650-
if (accountInfo != null) {
651-
final var key = accountInfo.pubKey();
652-
if (assetMap.containsKey(key) && mintCache.get(key) == null) {
653-
final var mintContext = mintCache.setGet(MintContext.createContext(solanaAccounts, accountInfo));
654-
topPriorityForMintChecked(mintContext);
655-
}
650+
if (AccountFetcher.isNull(accountInfo)) {
651+
continue;
652+
}
653+
final var key = accountInfo.pubKey();
654+
if (assetMap.containsKey(key) && mintCache.get(key) == null) {
655+
final var mintContext = mintCache.setGet(MintContext.createContext(solanaAccounts, accountInfo));
656+
topPriorityForMintChecked(mintContext);
656657
}
657658
}
658659
}

services/src/main/java/systems/glam/services/state/MinGlamStateAccount.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package systems.glam.services.state;
22

33
import software.sava.core.accounts.PublicKey;
4+
import software.sava.core.accounts.SolanaAccounts;
45
import software.sava.core.encoding.ByteUtil;
56
import software.sava.idl.clients.core.gen.SerDeUtil;
67
import 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

Comments
 (0)