Skip to content

Commit

Permalink
update Glam program.
Browse files Browse the repository at this point in the history
  • Loading branch information
jpe7s committed Aug 19, 2024
1 parent 60bf66f commit 8630d53
Show file tree
Hide file tree
Showing 13 changed files with 241 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@ static CompletableFuture<List<AccountInfo<FundAccount>>> fetchFundAccounts(final
return rpcClient.getProgramAccounts(programPublicKey, FundAccount.FACTORY);
}

static CompletableFuture<List<AccountInfo<FundAccount>>> fetchFundAccount(final SolanaRpcClient rpcClient,
final String fundName,
final PublicKey programPublicKey) {
static CompletableFuture<List<AccountInfo<FundAccount>>> fetchFundAccountsByManager(final SolanaRpcClient rpcClient,
final PublicKey managerPublicKey,
final PublicKey programPublicKey) {
return rpcClient.getProgramAccounts(
programPublicKey,
List.of(FundAccount.createNameFilter(fundName)),
List.of(FundAccount.createManagerFilter(managerPublicKey)),
FundAccount.FACTORY
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import software.sava.solana.programs.clients.NativeProgramAccountClient;
import software.sava.solana.programs.clients.NativeProgramClient;
import software.sava.solana.programs.stake.StakeAccount;
import software.sava.solana.programs.stake.StakeProgram;
import software.sava.solana.programs.stake.StakeState;

import java.util.Collection;
Expand Down Expand Up @@ -264,6 +265,36 @@ public Instruction initializeStakeAccountChecked(final PublicKey unInitializedSt
return nativeProgramAccountClient.initializeStakeAccountChecked(unInitializedStakeAccount);
}

@Override
public Instruction authorizeStakeAccount(final PublicKey stakeAccount,
final PublicKey stakeOrWithdrawAuthority,
final PublicKey lockupAuthority,
final StakeProgram.StakeAuthorize stakeAuthorize) {
return nativeProgramAccountClient.authorizeStakeAccount(stakeAccount, stakeOrWithdrawAuthority, lockupAuthority, stakeAuthorize);
}

@Override
public Instruction authorizeStakeAccount(final PublicKey stakeAccount,
final PublicKey stakeOrWithdrawAuthority,
final StakeProgram.StakeAuthorize stakeAuthorize) {
return nativeProgramAccountClient.authorizeStakeAccount(stakeAccount, stakeOrWithdrawAuthority, stakeAuthorize);
}

@Override
public Instruction authorizeStakeAccountChecked(final PublicKey stakeAccount,
final PublicKey stakeOrWithdrawAuthority,
final PublicKey newStakeOrWithdrawAuthority,
final StakeProgram.StakeAuthorize stakeAuthorize) {
return nativeProgramAccountClient.authorizeStakeAccountChecked(stakeAccount, stakeOrWithdrawAuthority, stakeAuthorize);
}

@Override
public Instruction authorizeStakeAccountChecked(final PublicKey stakeAccount,
final PublicKey stakeOrWithdrawAuthority,
final StakeProgram.StakeAuthorize stakeAuthorize) {
return nativeProgramAccountClient.authorizeStakeAccountChecked(stakeAccount, stakeOrWithdrawAuthority, stakeAuthorize);
}

@Override
public ProgramDerivedAddress findLookupTableAddress(final long recentSlot) {
return nativeProgramAccountClient.findLookupTableAddress(recentSlot);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,15 +93,45 @@ public static Instruction updateFund(final AccountMeta invokedGlamProgramMeta,

public static final Discriminator CLOSE_FUND_DISCRIMINATOR = toDiscriminator(230, 183, 3, 112, 236, 252, 5, 185);

public static Instruction closeFund(final AccountMeta invokedGlamProgramMeta, final PublicKey fundKey, final PublicKey managerKey) {
public static Instruction closeFund(final AccountMeta invokedGlamProgramMeta,
final PublicKey fundKey,
final PublicKey openfundsKey,
final PublicKey treasuryKey,
final PublicKey managerKey,
final PublicKey systemProgramKey) {
final var keys = List.of(
createWrite(fundKey),
createWritableSigner(managerKey)
createWrite(openfundsKey),
createWrite(treasuryKey),
createWritableSigner(managerKey),
createRead(systemProgramKey)
);

return Instruction.createInstruction(invokedGlamProgramMeta, keys, CLOSE_FUND_DISCRIMINATOR);
}

public static final Discriminator CLOSE_SHARE_CLASS_DISCRIMINATOR = toDiscriminator(35, 248, 168, 150, 244, 251, 61, 91);

public static Instruction closeShareClass(final AccountMeta invokedGlamProgramMeta,
final PublicKey fundKey,
final PublicKey shareClassKey,
final PublicKey managerKey,
final PublicKey token2022ProgramKey,
final int shareClassId) {
final var keys = List.of(
createWrite(fundKey),
createWrite(shareClassKey),
createWritableSigner(managerKey),
createRead(token2022ProgramKey)
);

final byte[] _data = new byte[9];
int i = writeDiscriminator(CLOSE_SHARE_CLASS_DISCRIMINATOR, _data, 0);
_data[i] = (byte) shareClassId;

return Instruction.createInstruction(invokedGlamProgramMeta, keys, _data);
}

public static final Discriminator SUBSCRIBE_DISCRIMINATOR = toDiscriminator(254, 28, 191, 138, 156, 179, 183, 53);

public static Instruction subscribe(final AccountMeta invokedGlamProgramMeta,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@

import static software.sava.core.accounts.PublicKey.readPubKey;

public record Acl(PublicKey pubkey, Permission[] permissions) implements Borsh {
public record DelegateAcl(PublicKey pubkey, Permission[] permissions) implements Borsh {

public static Acl read(final byte[] _data, final int offset) {
public static DelegateAcl read(final byte[] _data, final int offset) {
int i = offset;
final var pubkey = readPubKey(_data, i);
i += 32;
final var permissions = Borsh.readVector(Permission.class, Permission::read, _data, i);
return new Acl(pubkey, permissions);
return new DelegateAcl(pubkey, permissions);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ public enum EngineFieldName implements Borsh.Enum {
AssetsWeights,
ShareClassAllowlist,
ShareClassBlocklist,
Acls;
DelegateAcls,
IntegrationAcls;

public static EngineFieldName read(final byte[] _data, final int offset) {
return Borsh.read(EngineFieldName.values(), _data, offset);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public sealed interface EngineFieldValue extends RustEnum permits
EngineFieldValue.Timestamp,
EngineFieldValue.VecPubkey,
EngineFieldValue.VecU32,
EngineFieldValue.VecAcl {
EngineFieldValue.VecDelegateAcl,
EngineFieldValue.VecIntegrationAcl {

static EngineFieldValue read(final byte[] _data, final int offset) {
final int ordinal = _data[offset] & 0xFF;
Expand All @@ -45,7 +46,8 @@ static EngineFieldValue read(final byte[] _data, final int offset) {
case 11 -> Timestamp.read(_data, i);
case 12 -> VecPubkey.read(_data, i);
case 13 -> VecU32.read(_data, i);
case 14 -> VecAcl.read(_data, i);
case 14 -> VecDelegateAcl.read(_data, i);
case 15 -> VecIntegrationAcl.read(_data, i);
default -> throw new IllegalStateException(java.lang.String.format(
"Unexpected ordinal [%d] for enum [EngineFieldValue]", ordinal
));
Expand Down Expand Up @@ -265,11 +267,11 @@ public int ordinal() {
}
}

record VecAcl(Acl[] val) implements EngineFieldValue {
record VecDelegateAcl(DelegateAcl[] val) implements EngineFieldValue {

public static VecAcl read(final byte[] _data, final int offset) {
final var val = Borsh.readVector(Acl.class, Acl::read, _data, offset);
return new VecAcl(val);
public static VecDelegateAcl read(final byte[] _data, final int offset) {
final var val = Borsh.readVector(DelegateAcl.class, DelegateAcl::read, _data, offset);
return new VecDelegateAcl(val);
}

@Override
Expand All @@ -289,4 +291,29 @@ public int ordinal() {
return 14;
}
}

record VecIntegrationAcl(IntegrationAcl[] val) implements EngineFieldValue {

public static VecIntegrationAcl read(final byte[] _data, final int offset) {
final var val = Borsh.readVector(IntegrationAcl.class, IntegrationAcl::read, _data, offset);
return new VecIntegrationAcl(val);
}

@Override
public int write(final byte[] _data, final int offset) {
int i = writeOrdinal(_data, offset);
i += Borsh.write(val, _data, i);
return i - offset;
}

@Override
public int l() {
return 1 + Borsh.len(val);
}

@Override
public int ordinal() {
return 15;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,46 +17,59 @@

public record FundAccount(PublicKey _address,
Discriminator discriminator,
String name, byte[] _name,
String uri, byte[] _uri,
PublicKey manager,
PublicKey treasury,
PublicKey[] shareClasses,
PublicKey openfunds,
String openfundsUri, byte[] _openfundsUri,
PublicKey manager,
PublicKey engine,
PublicKey[] shareClasses,
String name, byte[] _name,
String uri, byte[] _uri,
String openfundsUri, byte[] _openfundsUri,
EngineField[][] params) implements Borsh {

public static final int NAME_OFFSET = 8;
public static final int MANAGER_OFFSET = 8;
public static final int TREASURY_OFFSET = 40;
public static final int OPENFUNDS_OFFSET = 72;
public static final int ENGINE_OFFSET = 104;
public static final int SHARE_CLASSES_OFFSET = 136;

public static Filter createManagerFilter(final PublicKey manager) {
return Filter.createMemCompFilter(MANAGER_OFFSET, manager);
}

public static Filter createTreasuryFilter(final PublicKey treasury) {
return Filter.createMemCompFilter(TREASURY_OFFSET, treasury);
}

public static Filter createNameFilter(final String name) {
final byte[] bytes = name.getBytes(UTF_8);
final byte[] _data = new byte[4 + bytes.length];
Borsh.write(bytes, _data, 0);
return Filter.createMemCompFilter(NAME_OFFSET, _data);
public static Filter createOpenfundsFilter(final PublicKey openfunds) {
return Filter.createMemCompFilter(OPENFUNDS_OFFSET, openfunds);
}

public static Filter createEngineFilter(final PublicKey engine) {
return Filter.createMemCompFilter(ENGINE_OFFSET, engine);
}

public static FundAccount createRecord(final PublicKey _address,
final Discriminator discriminator,
final String name,
final String uri,
final PublicKey manager,
final PublicKey treasury,
final PublicKey[] shareClasses,
final PublicKey openfunds,
final String openfundsUri,
final PublicKey manager,
final PublicKey engine,
final PublicKey[] shareClasses,
final String name,
final String uri,
final String openfundsUri,
final EngineField[][] params) {
return new FundAccount(_address,
discriminator,
name, name.getBytes(UTF_8),
uri, uri.getBytes(UTF_8),
manager,
treasury,
shareClasses,
openfunds,
openfundsUri, openfundsUri.getBytes(UTF_8),
manager,
engine,
shareClasses,
name, name.getBytes(UTF_8),
uri, uri.getBytes(UTF_8),
openfundsUri, openfundsUri.getBytes(UTF_8),
params);
}

Expand All @@ -73,65 +86,65 @@ public static FundAccount read(final PublicKey _address, final byte[] _data) {
public static FundAccount read(final PublicKey _address, final byte[] _data, final int offset) {
final var discriminator = parseDiscriminator(_data, offset);
int i = offset + discriminator.length();
final var name = Borsh.string(_data, i);
i += (Integer.BYTES + getInt32LE(_data, i));
final var uri = Borsh.string(_data, i);
i += (Integer.BYTES + getInt32LE(_data, i));
final var manager = readPubKey(_data, i);
i += 32;
final var treasury = readPubKey(_data, i);
i += 32;
final var shareClasses = Borsh.readPublicKeyVector(_data, i);
i += Borsh.len(shareClasses);
final var openfunds = readPubKey(_data, i);
i += 32;
final var openfundsUri = Borsh.string(_data, i);
i += (Integer.BYTES + getInt32LE(_data, i));
final var manager = readPubKey(_data, i);
i += 32;
final var engine = readPubKey(_data, i);
i += 32;
final var shareClasses = Borsh.readPublicKeyVector(_data, i);
i += Borsh.len(shareClasses);
final var name = Borsh.string(_data, i);
i += (Integer.BYTES + getInt32LE(_data, i));
final var uri = Borsh.string(_data, i);
i += (Integer.BYTES + getInt32LE(_data, i));
final var openfundsUri = Borsh.string(_data, i);
i += (Integer.BYTES + getInt32LE(_data, i));
final var params = Borsh.readMultiDimensionVector(EngineField.class, EngineField::read, _data, i);
return new FundAccount(_address,
discriminator,
name, name.getBytes(UTF_8),
uri, uri.getBytes(UTF_8),
manager,
treasury,
shareClasses,
openfunds,
openfundsUri, openfundsUri.getBytes(UTF_8),
manager,
engine,
shareClasses,
name, name.getBytes(UTF_8),
uri, uri.getBytes(UTF_8),
openfundsUri, openfundsUri.getBytes(UTF_8),
params);
}

@Override
public int write(final byte[] _data, final int offset) {
int i = offset + discriminator.write(_data, offset);
i += Borsh.write(_name, _data, i);
i += Borsh.write(_uri, _data, i);
manager.write(_data, i);
i += 32;
treasury.write(_data, i);
i += 32;
i += Borsh.write(shareClasses, _data, i);
openfunds.write(_data, i);
i += 32;
i += Borsh.write(_openfundsUri, _data, i);
manager.write(_data, i);
i += 32;
engine.write(_data, i);
i += 32;
i += Borsh.write(shareClasses, _data, i);
i += Borsh.write(_name, _data, i);
i += Borsh.write(_uri, _data, i);
i += Borsh.write(_openfundsUri, _data, i);
i += Borsh.write(params, _data, i);
return i - offset;
}

@Override
public int l() {
return 8 + Borsh.len(_name)
+ Borsh.len(_uri)
+ 32
+ Borsh.len(shareClasses)
return 8 + 32
+ 32
+ Borsh.len(_openfundsUri)
+ 32
+ 32
+ Borsh.len(shareClasses)
+ Borsh.len(_name)
+ Borsh.len(_uri)
+ Borsh.len(_openfundsUri)
+ Borsh.len(params);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

public enum FundError implements Borsh.Enum {

NoShareClassInFund;
NoShareClassInFund,
ShareClassNotEmpty,
CantCloseShareClasses;

public static FundError read(final byte[] _data, final int offset) {
return Borsh.read(FundError.values(), _data, offset);
Expand Down
Loading

0 comments on commit 8630d53

Please sign in to comment.