From 15ef7c6f986a7105279c8ce05c2532d1375f6850 Mon Sep 17 00:00:00 2001 From: jpe7s Date: Fri, 16 Aug 2024 15:49:51 -0500 Subject: [PATCH] update drift --- .github/workflows/gradle.yml | 2 +- .github/workflows/release.yml | 2 +- .../programs/drift/anchor/DriftProgram.java | 276 +++++++++++++++++- .../drift/anchor/types/ContractType.java | 3 +- .../programs/drift/anchor/types/FillMode.java | 3 +- .../types/OpenbookV2FulfillmentConfig.java | 186 ++++++++++++ .../drift/anchor/types/OracleSource.java | 3 +- .../anchor/types/OrderActionExplanation.java | 3 +- .../drift/anchor/types/PerpMarket.java | 29 +- .../anchor/types/SpotFulfillmentType.java | 3 +- .../drift/anchor/types/SpotMarket.java | 54 +++- .../types/SpotMarketVaultDepositRecord.java | 72 +++++ .../drift/anchor/types/SpotOperation.java | 1 + .../programs/drift/anchor/types/User.java | 15 +- .../drift/anchor/types/UserStats.java | 74 ++++- 15 files changed, 709 insertions(+), 17 deletions(-) create mode 100644 programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OpenbookV2FulfillmentConfig.java create mode 100644 programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarketVaultDepositRecord.java diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 6087469..cbd7eb9 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -36,7 +36,7 @@ jobs: - name: Generate Source run: ./genSrc.sh --log="INFO" --tabLength=2 --sourceDirectory="programs/src/main/java" --rpc="${{ secrets.RPC_URL }}" --baseDelayMillis=200 --numThreads=5 env: - GITHUB_ACTOR: ${{ secrets.GPR_USER }} + GITHUB_ACTOR: ${{ secrets.GITHUB_ACTOR }} GITHUB_TOKEN: ${{ secrets.GPR_TOKEN }} - name: Gradle Check diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c00959d..898cb80 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,7 +36,7 @@ jobs: - name: Generate Source run: ./genSrc.sh --log="INFO" --tabLength=2 --sourceDirectory="programs/src/main/java" --rpc="${{ secrets.RPC_URL }}" --baseDelayMillis=200 --numThreads=5 env: - GITHUB_ACTOR: ${{ secrets.GPR_USER }} + GITHUB_ACTOR: ${{ secrets.GITHUB_ACTOR }} GITHUB_TOKEN: ${{ secrets.GPR_TOKEN }} - name: Gradle Check diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/DriftProgram.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/DriftProgram.java index 0cae142..c88065b 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/DriftProgram.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/DriftProgram.java @@ -1126,6 +1126,32 @@ public static Instruction liquidatePerp(final AccountMeta invokedDriftProgramMet return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); } + public static final Discriminator LIQUIDATE_PERP_WITH_FILL_DISCRIMINATOR = toDiscriminator(95, 111, 124, 105, 86, 169, 187, 34); + + public static Instruction liquidatePerpWithFill(final AccountMeta invokedDriftProgramMeta, + final AccountMeta authorityKey, + final PublicKey stateKey, + final PublicKey liquidatorKey, + final PublicKey liquidatorStatsKey, + final PublicKey userKey, + final PublicKey userStatsKey, + final int marketIndex) { + final var keys = List.of( + createRead(stateKey), + authorityKey, + createWrite(liquidatorKey), + createWrite(liquidatorStatsKey), + createWrite(userKey), + createWrite(userStatsKey) + ); + + final byte[] _data = new byte[10]; + int i = writeDiscriminator(LIQUIDATE_PERP_WITH_FILL_DISCRIMINATOR, _data, 0); + putInt16LE(_data, i, marketIndex); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + public static final Discriminator LIQUIDATE_SPOT_DISCRIMINATOR = toDiscriminator(107, 0, 128, 41, 35, 229, 251, 18); public static Instruction liquidateSpot(final AccountMeta invokedDriftProgramMeta, @@ -1469,7 +1495,7 @@ public static Instruction updateSpotMarketExpiry(final AccountMeta invokedDriftP public static final Discriminator UPDATE_USER_QUOTE_ASSET_INSURANCE_STAKE_DISCRIMINATOR = toDiscriminator(251, 101, 156, 7, 2, 63, 30, 23); public static Instruction updateUserQuoteAssetInsuranceStake(final AccountMeta invokedDriftProgramMeta, - final AccountMeta authorityKey, + final AccountMeta signerKey, final PublicKey stateKey, final PublicKey spotMarketKey, final PublicKey insuranceFundStakeKey, @@ -1480,13 +1506,34 @@ public static Instruction updateUserQuoteAssetInsuranceStake(final AccountMeta i createRead(spotMarketKey), createWrite(insuranceFundStakeKey), createWrite(userStatsKey), - authorityKey, + signerKey, createWrite(insuranceFundVaultKey) ); return Instruction.createInstruction(invokedDriftProgramMeta, keys, UPDATE_USER_QUOTE_ASSET_INSURANCE_STAKE_DISCRIMINATOR); } + public static final Discriminator UPDATE_USER_GOV_TOKEN_INSURANCE_STAKE_DISCRIMINATOR = toDiscriminator(143, 99, 235, 187, 20, 159, 184, 84); + + public static Instruction updateUserGovTokenInsuranceStake(final AccountMeta invokedDriftProgramMeta, + final AccountMeta signerKey, + final PublicKey stateKey, + final PublicKey spotMarketKey, + final PublicKey insuranceFundStakeKey, + final PublicKey userStatsKey, + final PublicKey insuranceFundVaultKey) { + final var keys = List.of( + createRead(stateKey), + createRead(spotMarketKey), + createWrite(insuranceFundStakeKey), + createWrite(userStatsKey), + signerKey, + createWrite(insuranceFundVaultKey) + ); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, UPDATE_USER_GOV_TOKEN_INSURANCE_STAKE_DISCRIMINATOR); + } + public static final Discriminator INITIALIZE_INSURANCE_FUND_STAKE_DISCRIMINATOR = toDiscriminator(187, 179, 243, 70, 248, 90, 92, 147); public static Instruction initializeInsuranceFundStake(final AccountMeta invokedDriftProgramMeta, @@ -1534,7 +1581,7 @@ public static Instruction addInsuranceFundStake(final AccountMeta invokedDriftPr final long amount) { final var keys = List.of( createRead(stateKey), - createRead(spotMarketKey), + createWrite(spotMarketKey), createWrite(insuranceFundStakeKey), createWrite(userStatsKey), authorityKey, @@ -1565,7 +1612,7 @@ public static Instruction requestRemoveInsuranceFundStake(final AccountMeta invo final int marketIndex, final long amount) { final var keys = List.of( - createRead(spotMarketKey), + createWrite(spotMarketKey), createWrite(insuranceFundStakeKey), createWrite(userStatsKey), authorityKey, @@ -1591,7 +1638,7 @@ public static Instruction cancelRequestRemoveInsuranceFundStake(final AccountMet final PublicKey insuranceFundVaultKey, final int marketIndex) { final var keys = List.of( - createRead(spotMarketKey), + createWrite(spotMarketKey), createWrite(insuranceFundStakeKey), createWrite(userStatsKey), authorityKey, @@ -1620,7 +1667,7 @@ public static Instruction removeInsuranceFundStake(final AccountMeta invokedDrif final int marketIndex) { final var keys = List.of( createRead(stateKey), - createRead(spotMarketKey), + createWrite(spotMarketKey), createWrite(insuranceFundStakeKey), createWrite(userStatsKey), authorityKey, @@ -1718,6 +1765,26 @@ public static Instruction postPythPullOracleUpdateAtomic(final AccountMeta invok return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); } + public static final Discriminator POST_MULTI_PYTH_PULL_ORACLE_UPDATES_ATOMIC_DISCRIMINATOR = toDiscriminator(243, 79, 204, 228, 227, 208, 100, 244); + + public static Instruction postMultiPythPullOracleUpdatesAtomic(final AccountMeta invokedDriftProgramMeta, + final AccountMeta keeperKey, + final PublicKey pythSolanaReceiverKey, + final PublicKey guardianSetKey, + final byte[] params) { + final var keys = List.of( + keeperKey, + createRead(pythSolanaReceiverKey), + createRead(guardianSetKey) + ); + + final byte[] _data = new byte[12 + Borsh.len(params)]; + int i = writeDiscriminator(POST_MULTI_PYTH_PULL_ORACLE_UPDATES_ATOMIC_DISCRIMINATOR, _data, 0); + Borsh.write(params, _data, i); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + public static final Discriminator INITIALIZE_DISCRIMINATOR = toDiscriminator(175, 175, 109, 31, 13, 152, 155, 237); public static Instruction initialize(final AccountMeta invokedDriftProgramMeta, @@ -1913,6 +1980,60 @@ public static Instruction updateSerumFulfillmentConfigStatus(final AccountMeta i return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); } + public static final Discriminator INITIALIZE_OPENBOOK_V2_FULFILLMENT_CONFIG_DISCRIMINATOR = toDiscriminator(7, 221, 103, 153, 107, 57, 27, 197); + + public static Instruction initializeOpenbookV2FulfillmentConfig(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey baseSpotMarketKey, + final PublicKey quoteSpotMarketKey, + final PublicKey stateKey, + final PublicKey openbookV2ProgramKey, + final PublicKey openbookV2MarketKey, + final PublicKey driftSignerKey, + final PublicKey openbookV2FulfillmentConfigKey, + final PublicKey rentKey, + final PublicKey systemProgramKey, + final int marketIndex) { + final var keys = List.of( + createRead(baseSpotMarketKey), + createRead(quoteSpotMarketKey), + createWrite(stateKey), + createRead(openbookV2ProgramKey), + createRead(openbookV2MarketKey), + createRead(driftSignerKey), + createWrite(openbookV2FulfillmentConfigKey), + adminKey, + createRead(rentKey), + createRead(systemProgramKey) + ); + + final byte[] _data = new byte[10]; + int i = writeDiscriminator(INITIALIZE_OPENBOOK_V2_FULFILLMENT_CONFIG_DISCRIMINATOR, _data, 0); + putInt16LE(_data, i, marketIndex); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + + public static final Discriminator OPENBOOK_V2_FULFILLMENT_CONFIG_STATUS_DISCRIMINATOR = toDiscriminator(25, 173, 19, 189, 4, 211, 64, 238); + + public static Instruction openbookV2FulfillmentConfigStatus(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey stateKey, + final PublicKey openbookV2FulfillmentConfigKey, + final SpotFulfillmentConfigStatus status) { + final var keys = List.of( + createRead(stateKey), + createWrite(openbookV2FulfillmentConfigKey), + adminKey + ); + + final byte[] _data = new byte[8 + Borsh.len(status)]; + int i = writeDiscriminator(OPENBOOK_V2_FULFILLMENT_CONFIG_STATUS_DISCRIMINATOR, _data, 0); + Borsh.write(status, _data, i); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + public static final Discriminator INITIALIZE_PHOENIX_FULFILLMENT_CONFIG_DISCRIMINATOR = toDiscriminator(135, 132, 110, 107, 185, 160, 169, 154); public static Instruction initializePhoenixFulfillmentConfig(final AccountMeta invokedDriftProgramMeta, @@ -2078,6 +2199,21 @@ public static Instruction initializePerpMarket(final AccountMeta invokedDriftPro return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); } + public static final Discriminator INITIALIZE_PREDICTION_MARKET_DISCRIMINATOR = toDiscriminator(248, 70, 198, 224, 224, 105, 125, 195); + + public static Instruction initializePredictionMarket(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey stateKey, + final PublicKey perpMarketKey) { + final var keys = List.of( + adminKey, + createRead(stateKey), + createWrite(perpMarketKey) + ); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, INITIALIZE_PREDICTION_MARKET_DISCRIMINATOR); + } + public static final Discriminator DELETE_INITIALIZED_PERP_MARKET_DISCRIMINATOR = toDiscriminator(91, 154, 24, 87, 106, 59, 190, 66); public static Instruction deleteInitializedPerpMarket(final AccountMeta invokedDriftProgramMeta, @@ -2238,6 +2374,32 @@ public static Instruction depositIntoPerpMarketFeePool(final AccountMeta invoked return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); } + public static final Discriminator DEPOSIT_INTO_SPOT_MARKET_VAULT_DISCRIMINATOR = toDiscriminator(48, 252, 119, 73, 255, 205, 174, 247); + + public static Instruction depositIntoSpotMarketVault(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey stateKey, + final PublicKey spotMarketKey, + final PublicKey sourceVaultKey, + final PublicKey spotMarketVaultKey, + final PublicKey tokenProgramKey, + final long amount) { + final var keys = List.of( + createRead(stateKey), + createWrite(spotMarketKey), + adminKey, + createWrite(sourceVaultKey), + createWrite(spotMarketVaultKey), + createRead(tokenProgramKey) + ); + + final byte[] _data = new byte[16]; + int i = writeDiscriminator(DEPOSIT_INTO_SPOT_MARKET_VAULT_DISCRIMINATOR, _data, 0); + putInt64LE(_data, i, amount); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + public static final Discriminator DEPOSIT_INTO_SPOT_MARKET_REVENUE_POOL_DISCRIMINATOR = toDiscriminator(92, 40, 151, 42, 122, 254, 139, 246); public static Instruction depositIntoSpotMarketRevenuePool(final AccountMeta invokedDriftProgramMeta, @@ -2684,6 +2846,26 @@ public static Instruction updateSpotMarketMaxTokenDeposits(final AccountMeta inv return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); } + public static final Discriminator UPDATE_SPOT_MARKET_MAX_TOKEN_BORROWS_DISCRIMINATOR = toDiscriminator(57, 102, 204, 212, 253, 95, 13, 199); + + public static Instruction updateSpotMarketMaxTokenBorrows(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey stateKey, + final PublicKey spotMarketKey, + final int maxTokenBorrowsFraction) { + final var keys = List.of( + adminKey, + createRead(stateKey), + createWrite(spotMarketKey) + ); + + final byte[] _data = new byte[10]; + int i = writeDiscriminator(UPDATE_SPOT_MARKET_MAX_TOKEN_BORROWS_DISCRIMINATOR, _data, 0); + putInt16LE(_data, i, maxTokenBorrowsFraction); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + public static final Discriminator UPDATE_SPOT_MARKET_SCALE_INITIAL_ASSET_WEIGHT_START_DISCRIMINATOR = toDiscriminator(217, 204, 204, 118, 204, 130, 225, 147); public static Instruction updateSpotMarketScaleInitialAssetWeightStart(final AccountMeta invokedDriftProgramMeta, @@ -3468,6 +3650,88 @@ public static Instruction updateSpotMarketFeeAdjustment(final AccountMeta invoke return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); } + public static final Discriminator UPDATE_PERP_MARKET_FUEL_DISCRIMINATOR = toDiscriminator(252, 141, 110, 101, 27, 99, 182, 21); + + public static Instruction updatePerpMarketFuel(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey stateKey, + final PublicKey perpMarketKey, + final OptionalInt fuelBoostTaker, + final OptionalInt fuelBoostMaker, + final OptionalInt fuelBoostPosition) { + final var keys = List.of( + adminKey, + createRead(stateKey), + createWrite(perpMarketKey) + ); + + final byte[] _data = new byte[14]; + int i = writeDiscriminator(UPDATE_PERP_MARKET_FUEL_DISCRIMINATOR, _data, 0); + i += Borsh.writeOptional(fuelBoostTaker, _data, i); + i += Borsh.writeOptional(fuelBoostMaker, _data, i); + Borsh.writeOptional(fuelBoostPosition, _data, i); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + + public static final Discriminator UPDATE_SPOT_MARKET_FUEL_DISCRIMINATOR = toDiscriminator(226, 253, 76, 71, 17, 2, 171, 169); + + public static Instruction updateSpotMarketFuel(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey stateKey, + final PublicKey spotMarketKey, + final OptionalInt fuelBoostDeposits, + final OptionalInt fuelBoostBorrows, + final OptionalInt fuelBoostTaker, + final OptionalInt fuelBoostMaker, + final OptionalInt fuelBoostInsurance) { + final var keys = List.of( + adminKey, + createRead(stateKey), + createWrite(spotMarketKey) + ); + + final byte[] _data = new byte[18]; + int i = writeDiscriminator(UPDATE_SPOT_MARKET_FUEL_DISCRIMINATOR, _data, 0); + i += Borsh.writeOptional(fuelBoostDeposits, _data, i); + i += Borsh.writeOptional(fuelBoostBorrows, _data, i); + i += Borsh.writeOptional(fuelBoostTaker, _data, i); + i += Borsh.writeOptional(fuelBoostMaker, _data, i); + Borsh.writeOptional(fuelBoostInsurance, _data, i); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + + public static final Discriminator INIT_USER_FUEL_DISCRIMINATOR = toDiscriminator(132, 191, 228, 141, 201, 138, 60, 48); + + public static Instruction initUserFuel(final AccountMeta invokedDriftProgramMeta, + final AccountMeta adminKey, + final PublicKey stateKey, + final PublicKey userKey, + final PublicKey userStatsKey, + final OptionalInt fuelBoostDeposits, + final OptionalInt fuelBoostBorrows, + final OptionalInt fuelBoostTaker, + final OptionalInt fuelBoostMaker, + final OptionalInt fuelBoostInsurance) { + final var keys = List.of( + adminKey, + createRead(stateKey), + createWrite(userKey), + createWrite(userStatsKey) + ); + + final byte[] _data = new byte[33]; + int i = writeDiscriminator(INIT_USER_FUEL_DISCRIMINATOR, _data, 0); + i += Borsh.writeOptional(fuelBoostDeposits, _data, i); + i += Borsh.writeOptional(fuelBoostBorrows, _data, i); + i += Borsh.writeOptional(fuelBoostTaker, _data, i); + i += Borsh.writeOptional(fuelBoostMaker, _data, i); + Borsh.writeOptional(fuelBoostInsurance, _data, i); + + return Instruction.createInstruction(invokedDriftProgramMeta, keys, _data); + } + public static final Discriminator UPDATE_ADMIN_DISCRIMINATOR = toDiscriminator(161, 176, 40, 213, 60, 184, 179, 228); public static Instruction updateAdmin(final AccountMeta invokedDriftProgramMeta, diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/ContractType.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/ContractType.java index 89377cb..6317501 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/ContractType.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/ContractType.java @@ -5,7 +5,8 @@ public enum ContractType implements Borsh.Enum { Perpetual, - Future; + Future, + Prediction; public static ContractType read(final byte[] _data, final int offset) { return Borsh.read(ContractType.values(), _data, offset); diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/FillMode.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/FillMode.java index bee48b2..aa352ae 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/FillMode.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/FillMode.java @@ -6,7 +6,8 @@ public enum FillMode implements Borsh.Enum { Fill, PlaceAndMake, - PlaceAndTake; + PlaceAndTake, + Liquidation; public static FillMode read(final byte[] _data, final int offset) { return Borsh.read(FillMode.values(), _data, offset); diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OpenbookV2FulfillmentConfig.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OpenbookV2FulfillmentConfig.java new file mode 100644 index 0000000..b2dd841 --- /dev/null +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OpenbookV2FulfillmentConfig.java @@ -0,0 +1,186 @@ +package software.sava.anchor.programs.drift.anchor.types; + +import java.util.function.BiFunction; + +import software.sava.core.accounts.PublicKey; +import software.sava.core.borsh.Borsh; +import software.sava.core.programs.Discriminator; +import software.sava.core.rpc.Filter; + +import static software.sava.anchor.AnchorUtil.parseDiscriminator; +import static software.sava.core.accounts.PublicKey.readPubKey; +import static software.sava.core.encoding.ByteUtil.getInt16LE; +import static software.sava.core.encoding.ByteUtil.putInt16LE; + +public record OpenbookV2FulfillmentConfig(PublicKey _address, + Discriminator discriminator, + PublicKey pubkey, + PublicKey openbookV2ProgramId, + PublicKey openbookV2Market, + PublicKey openbookV2MarketAuthority, + PublicKey openbookV2EventHeap, + PublicKey openbookV2Bids, + PublicKey openbookV2Asks, + PublicKey openbookV2BaseVault, + PublicKey openbookV2QuoteVault, + int marketIndex, + SpotFulfillmentType fulfillmentType, + SpotFulfillmentConfigStatus status, + int[] padding) implements Borsh { + + public static final int BYTES = 304; + public static final Filter SIZE_FILTER = Filter.createDataSizeFilter(BYTES); + + public static final int PUBKEY_OFFSET = 8; + public static final int OPENBOOK_V2_PROGRAM_ID_OFFSET = 40; + public static final int OPENBOOK_V2_MARKET_OFFSET = 72; + public static final int OPENBOOK_V2_MARKET_AUTHORITY_OFFSET = 104; + public static final int OPENBOOK_V2_EVENT_HEAP_OFFSET = 136; + public static final int OPENBOOK_V2_BIDS_OFFSET = 168; + public static final int OPENBOOK_V2_ASKS_OFFSET = 200; + public static final int OPENBOOK_V2_BASE_VAULT_OFFSET = 232; + public static final int OPENBOOK_V2_QUOTE_VAULT_OFFSET = 264; + public static final int MARKET_INDEX_OFFSET = 296; + public static final int FULFILLMENT_TYPE_OFFSET = 298; + public static final int STATUS_OFFSET = 299; + public static final int PADDING_OFFSET = 300; + + public static Filter createPubkeyFilter(final PublicKey pubkey) { + return Filter.createMemCompFilter(PUBKEY_OFFSET, pubkey); + } + + public static Filter createOpenbookV2ProgramIdFilter(final PublicKey openbookV2ProgramId) { + return Filter.createMemCompFilter(OPENBOOK_V2_PROGRAM_ID_OFFSET, openbookV2ProgramId); + } + + public static Filter createOpenbookV2MarketFilter(final PublicKey openbookV2Market) { + return Filter.createMemCompFilter(OPENBOOK_V2_MARKET_OFFSET, openbookV2Market); + } + + public static Filter createOpenbookV2MarketAuthorityFilter(final PublicKey openbookV2MarketAuthority) { + return Filter.createMemCompFilter(OPENBOOK_V2_MARKET_AUTHORITY_OFFSET, openbookV2MarketAuthority); + } + + public static Filter createOpenbookV2EventHeapFilter(final PublicKey openbookV2EventHeap) { + return Filter.createMemCompFilter(OPENBOOK_V2_EVENT_HEAP_OFFSET, openbookV2EventHeap); + } + + public static Filter createOpenbookV2BidsFilter(final PublicKey openbookV2Bids) { + return Filter.createMemCompFilter(OPENBOOK_V2_BIDS_OFFSET, openbookV2Bids); + } + + public static Filter createOpenbookV2AsksFilter(final PublicKey openbookV2Asks) { + return Filter.createMemCompFilter(OPENBOOK_V2_ASKS_OFFSET, openbookV2Asks); + } + + public static Filter createOpenbookV2BaseVaultFilter(final PublicKey openbookV2BaseVault) { + return Filter.createMemCompFilter(OPENBOOK_V2_BASE_VAULT_OFFSET, openbookV2BaseVault); + } + + public static Filter createOpenbookV2QuoteVaultFilter(final PublicKey openbookV2QuoteVault) { + return Filter.createMemCompFilter(OPENBOOK_V2_QUOTE_VAULT_OFFSET, openbookV2QuoteVault); + } + + public static Filter createMarketIndexFilter(final int marketIndex) { + final byte[] _data = new byte[2]; + putInt16LE(_data, 0, marketIndex); + return Filter.createMemCompFilter(MARKET_INDEX_OFFSET, _data); + } + + public static Filter createFulfillmentTypeFilter(final SpotFulfillmentType fulfillmentType) { + return Filter.createMemCompFilter(FULFILLMENT_TYPE_OFFSET, fulfillmentType.write()); + } + + public static Filter createStatusFilter(final SpotFulfillmentConfigStatus status) { + return Filter.createMemCompFilter(STATUS_OFFSET, status.write()); + } + + public static OpenbookV2FulfillmentConfig read(final byte[] _data, final int offset) { + return read(null, _data, offset); + } + + public static OpenbookV2FulfillmentConfig read(final PublicKey _address, final byte[] _data) { + return read(_address, _data, 0); + } + + public static final BiFunction FACTORY = OpenbookV2FulfillmentConfig::read; + + public static OpenbookV2FulfillmentConfig read(final PublicKey _address, final byte[] _data, final int offset) { + final var discriminator = parseDiscriminator(_data, offset); + int i = offset + discriminator.length(); + final var pubkey = readPubKey(_data, i); + i += 32; + final var openbookV2ProgramId = readPubKey(_data, i); + i += 32; + final var openbookV2Market = readPubKey(_data, i); + i += 32; + final var openbookV2MarketAuthority = readPubKey(_data, i); + i += 32; + final var openbookV2EventHeap = readPubKey(_data, i); + i += 32; + final var openbookV2Bids = readPubKey(_data, i); + i += 32; + final var openbookV2Asks = readPubKey(_data, i); + i += 32; + final var openbookV2BaseVault = readPubKey(_data, i); + i += 32; + final var openbookV2QuoteVault = readPubKey(_data, i); + i += 32; + final var marketIndex = getInt16LE(_data, i); + i += 2; + final var fulfillmentType = SpotFulfillmentType.read(_data, i); + i += Borsh.len(fulfillmentType); + final var status = SpotFulfillmentConfigStatus.read(_data, i); + i += Borsh.len(status); + final var padding = Borsh.readArray(new int[4], _data, i); + return new OpenbookV2FulfillmentConfig(_address, + discriminator, + pubkey, + openbookV2ProgramId, + openbookV2Market, + openbookV2MarketAuthority, + openbookV2EventHeap, + openbookV2Bids, + openbookV2Asks, + openbookV2BaseVault, + openbookV2QuoteVault, + marketIndex, + fulfillmentType, + status, + padding); + } + + @Override + public int write(final byte[] _data, final int offset) { + int i = offset + discriminator.write(_data, offset); + pubkey.write(_data, i); + i += 32; + openbookV2ProgramId.write(_data, i); + i += 32; + openbookV2Market.write(_data, i); + i += 32; + openbookV2MarketAuthority.write(_data, i); + i += 32; + openbookV2EventHeap.write(_data, i); + i += 32; + openbookV2Bids.write(_data, i); + i += 32; + openbookV2Asks.write(_data, i); + i += 32; + openbookV2BaseVault.write(_data, i); + i += 32; + openbookV2QuoteVault.write(_data, i); + i += 32; + putInt16LE(_data, i, marketIndex); + i += 2; + i += Borsh.write(fulfillmentType, _data, i); + i += Borsh.write(status, _data, i); + i += Borsh.fixedWrite(padding, _data, i); + return i - offset; + } + + @Override + public int l() { + return BYTES; + } +} diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OracleSource.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OracleSource.java index 9821966..e59824b 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OracleSource.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OracleSource.java @@ -14,7 +14,8 @@ public enum OracleSource implements Borsh.Enum { PythPull, Pyth1KPull, Pyth1MPull, - PythStableCoinPull; + PythStableCoinPull, + SwitchboardOnDemand; public static OracleSource read(final byte[] _data, final int offset) { return Borsh.read(OracleSource.values(), _data, offset); diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OrderActionExplanation.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OrderActionExplanation.java index 446c00e..2ea54a2 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OrderActionExplanation.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/OrderActionExplanation.java @@ -22,7 +22,8 @@ public enum OrderActionExplanation implements Borsh.Enum { OrderFillWithPhoenix, OrderFilledWithAMMJitLPSplit, OrderFilledWithLPJit, - DeriskLp; + DeriskLp, + OrderFilledWithOpenbookV2; public static OrderActionExplanation read(final byte[] _data, final int offset) { return Borsh.read(OrderActionExplanation.values(), _data, offset); diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/PerpMarket.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/PerpMarket.java index 1256fc4..20d9668 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/PerpMarket.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/PerpMarket.java @@ -92,6 +92,15 @@ public record PerpMarket(PublicKey _address, // E.g. if this is -50 and the fee is 5bps, the new fee will be 2.5bps // if this is 50 and the fee is 5bps, the new fee will be 7.5bps int feeAdjustment, + // fuel multiplier for perp funding + // precision: 10 + int fuelBoostPosition, + // fuel multiplier for perp taker + // precision: 10 + int fuelBoostTaker, + // fuel multiplier for perp maker + // precision: 10 + int fuelBoostMaker, int[] padding) implements Borsh { public static final int PUBKEY_OFFSET = 8; @@ -175,7 +184,13 @@ public static PerpMarket read(final PublicKey _address, final byte[] _data, fina i += 2; final var feeAdjustment = getInt16LE(_data, i); i += 2; - final var padding = Borsh.readArray(new int[46], _data, i); + final var fuelBoostPosition = _data[i] & 0xFF; + ++i; + final var fuelBoostTaker = _data[i] & 0xFF; + ++i; + final var fuelBoostMaker = _data[i] & 0xFF; + ++i; + final var padding = Borsh.readArray(new int[43], _data, i); return new PerpMarket(_address, discriminator, pubkey, @@ -206,6 +221,9 @@ public static PerpMarket read(final PublicKey _address, final byte[] _data, fina pausedOperations, quoteSpotMarketIndex, feeAdjustment, + fuelBoostPosition, + fuelBoostTaker, + fuelBoostMaker, padding); } @@ -261,6 +279,12 @@ public int write(final byte[] _data, final int offset) { i += 2; putInt16LE(_data, i, feeAdjustment); i += 2; + _data[i] = (byte) fuelBoostPosition; + ++i; + _data[i] = (byte) fuelBoostTaker; + ++i; + _data[i] = (byte) fuelBoostMaker; + ++i; i += Borsh.fixedWrite(padding, _data, i); return i - offset; } @@ -295,6 +319,9 @@ public int l() { + 1 + 2 + 2 + + 1 + + 1 + + 1 + Borsh.fixedLen(padding); } } diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotFulfillmentType.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotFulfillmentType.java index d9b0d68..6234519 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotFulfillmentType.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotFulfillmentType.java @@ -6,7 +6,8 @@ public enum SpotFulfillmentType implements Borsh.Enum { SerumV3, Match, - PhoenixV1; + PhoenixV1, + OpenbookV2; public static SpotFulfillmentType read(final byte[] _data, final int offset) { return Borsh.read(SpotFulfillmentType.values(), _data, offset); diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarket.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarket.java index 186074f..e94ed90 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarket.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarket.java @@ -178,6 +178,22 @@ public record SpotMarket(PublicKey _address, // 1 => 1/200 => .5% // precision: X/200 int minBorrowRate, + // fuel multiplier for spot deposits + // precision: 10 + int fuelBoostDeposits, + // fuel multiplier for spot borrows + // precision: 10 + int fuelBoostBorrows, + // fuel multiplier for spot taker + // precision: 10 + int fuelBoostTaker, + // fuel multiplier for spot maker + // precision: 10 + int fuelBoostMaker, + // fuel multiplier for spot insurance stake + // precision: 10 + int fuelBoostInsurance, + int tokenProgram, int[] padding) implements Borsh { public static final int PUBKEY_OFFSET = 8; @@ -332,7 +348,19 @@ public static SpotMarket read(final PublicKey _address, final byte[] _data, fina i += 8; final var minBorrowRate = _data[i] & 0xFF; ++i; - final var padding = Borsh.readArray(new int[47], _data, i); + final var fuelBoostDeposits = _data[i] & 0xFF; + ++i; + final var fuelBoostBorrows = _data[i] & 0xFF; + ++i; + final var fuelBoostTaker = _data[i] & 0xFF; + ++i; + final var fuelBoostMaker = _data[i] & 0xFF; + ++i; + final var fuelBoostInsurance = _data[i] & 0xFF; + ++i; + final var tokenProgram = _data[i] & 0xFF; + ++i; + final var padding = Borsh.readArray(new int[41], _data, i); return new SpotMarket(_address, discriminator, pubkey, @@ -391,6 +419,12 @@ public static SpotMarket read(final PublicKey _address, final byte[] _data, fina totalSwapFee, scaleInitialAssetWeightStart, minBorrowRate, + fuelBoostDeposits, + fuelBoostBorrows, + fuelBoostTaker, + fuelBoostMaker, + fuelBoostInsurance, + tokenProgram, padding); } @@ -500,6 +534,18 @@ public int write(final byte[] _data, final int offset) { i += 8; _data[i] = (byte) minBorrowRate; ++i; + _data[i] = (byte) fuelBoostDeposits; + ++i; + _data[i] = (byte) fuelBoostBorrows; + ++i; + _data[i] = (byte) fuelBoostTaker; + ++i; + _data[i] = (byte) fuelBoostMaker; + ++i; + _data[i] = (byte) fuelBoostInsurance; + ++i; + _data[i] = (byte) tokenProgram; + ++i; i += Borsh.fixedWrite(padding, _data, i); return i - offset; } @@ -562,6 +608,12 @@ public int l() { + 8 + 8 + 1 + + 1 + + 1 + + 1 + + 1 + + 1 + + 1 + Borsh.fixedLen(padding); } } diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarketVaultDepositRecord.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarketVaultDepositRecord.java new file mode 100644 index 0000000..a269784 --- /dev/null +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotMarketVaultDepositRecord.java @@ -0,0 +1,72 @@ +package software.sava.anchor.programs.drift.anchor.types; + +import java.math.BigInteger; + +import software.sava.core.borsh.Borsh; + +import static software.sava.core.encoding.ByteUtil.getInt128LE; +import static software.sava.core.encoding.ByteUtil.getInt16LE; +import static software.sava.core.encoding.ByteUtil.getInt64LE; +import static software.sava.core.encoding.ByteUtil.putInt128LE; +import static software.sava.core.encoding.ByteUtil.putInt16LE; +import static software.sava.core.encoding.ByteUtil.putInt64LE; + +public record SpotMarketVaultDepositRecord(long ts, + int marketIndex, + BigInteger depositBalance, + BigInteger cumulativeDepositInterestBefore, + BigInteger cumulativeDepositInterestAfter, + long depositTokenAmountBefore, + long amount) implements Borsh { + + public static final int BYTES = 74; + + public static SpotMarketVaultDepositRecord read(final byte[] _data, final int offset) { + int i = offset; + final var ts = getInt64LE(_data, i); + i += 8; + final var marketIndex = getInt16LE(_data, i); + i += 2; + final var depositBalance = getInt128LE(_data, i); + i += 16; + final var cumulativeDepositInterestBefore = getInt128LE(_data, i); + i += 16; + final var cumulativeDepositInterestAfter = getInt128LE(_data, i); + i += 16; + final var depositTokenAmountBefore = getInt64LE(_data, i); + i += 8; + final var amount = getInt64LE(_data, i); + return new SpotMarketVaultDepositRecord(ts, + marketIndex, + depositBalance, + cumulativeDepositInterestBefore, + cumulativeDepositInterestAfter, + depositTokenAmountBefore, + amount); + } + + @Override + public int write(final byte[] _data, final int offset) { + int i = offset; + putInt64LE(_data, i, ts); + i += 8; + putInt16LE(_data, i, marketIndex); + i += 2; + putInt128LE(_data, i, depositBalance); + i += 16; + putInt128LE(_data, i, cumulativeDepositInterestBefore); + i += 16; + putInt128LE(_data, i, cumulativeDepositInterestAfter); + i += 16; + putInt64LE(_data, i, depositTokenAmountBefore); + i += 8; + putInt64LE(_data, i, amount); + i += 8; + return i - offset; + } + + @Override + public int l() { + return BYTES; + } +} diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotOperation.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotOperation.java index 1e9270a..0bad217 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotOperation.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/SpotOperation.java @@ -6,6 +6,7 @@ public enum SpotOperation implements Borsh.Enum { UpdateCumulativeInterest, Fill, + Deposit, Withdraw, Liquidation; diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/User.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/User.java index 80c0bea..208264f 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/User.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/User.java @@ -79,6 +79,8 @@ public record User(PublicKey _address, int openAuctions, // Whether or not user has open order with auction boolean hasOpenAuction, + int[] padding1, + int lastFuelBonusUpdateTs, int[] padding) implements Borsh { public static final int AUTHORITY_OFFSET = 8; @@ -159,7 +161,11 @@ public static User read(final PublicKey _address, final byte[] _data, final int ++i; final var hasOpenAuction = _data[i] == 1; ++i; - final var padding = Borsh.readArray(new int[21], _data, i); + final var padding1 = Borsh.readArray(new int[5], _data, i); + i += Borsh.fixedLen(padding1); + final var lastFuelBonusUpdateTs = getInt32LE(_data, i); + i += 4; + final var padding = Borsh.readArray(new int[12], _data, i); return new User(_address, discriminator, authority, @@ -188,6 +194,8 @@ public static User read(final PublicKey _address, final byte[] _data, final int hasOpenOrder, openAuctions, hasOpenAuction, + padding1, + lastFuelBonusUpdateTs, padding); } @@ -242,6 +250,9 @@ public int write(final byte[] _data, final int offset) { ++i; _data[i] = (byte) (hasOpenAuction ? 1 : 0); ++i; + i += Borsh.fixedWrite(padding1, _data, i); + putInt32LE(_data, i, lastFuelBonusUpdateTs); + i += 4; i += Borsh.fixedWrite(padding, _data, i); return i - offset; } @@ -274,6 +285,8 @@ public int l() { + 1 + 1 + 1 + + Borsh.fixedLen(padding1) + + 4 + Borsh.fixedLen(padding); } } diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/UserStats.java b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/UserStats.java index c28d30a..cf7507e 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/UserStats.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/anchor/types/UserStats.java @@ -10,8 +10,10 @@ import static software.sava.anchor.AnchorUtil.parseDiscriminator; import static software.sava.core.accounts.PublicKey.readPubKey; import static software.sava.core.encoding.ByteUtil.getInt16LE; +import static software.sava.core.encoding.ByteUtil.getInt32LE; import static software.sava.core.encoding.ByteUtil.getInt64LE; import static software.sava.core.encoding.ByteUtil.putInt16LE; +import static software.sava.core.encoding.ByteUtil.putInt32LE; import static software.sava.core.encoding.ByteUtil.putInt64LE; public record UserStats(PublicKey _address, @@ -50,6 +52,23 @@ public record UserStats(PublicKey _address, // Whether the user is a referrer. Sub account 0 can not be deleted if user is a referrer boolean isReferrer, boolean disableUpdatePerpBidAskTwap, + int[] padding1, + // accumulated fuel for token amounts of insurance + int fuelInsurance, + // accumulated fuel for notional of deposits + int fuelDeposits, + // accumulate fuel bonus for notional of borrows + int fuelBorrows, + // accumulated fuel for perp open interest + int fuelPositions, + // accumulate fuel bonus for taker volume + int fuelTaker, + // accumulate fuel bonus for maker volume + int fuelMaker, + // The amount of tokens staked in the governance spot markets if + long ifStakedGovTokenAmount, + // last unix ts user stats data was used to update if fuel (u32 to save space) + int lastFuelIfBonusUpdateTs, int[] padding) implements Borsh { public static final int AUTHORITY_OFFSET = 8; @@ -111,7 +130,25 @@ public static UserStats read(final PublicKey _address, final byte[] _data, final ++i; final var disableUpdatePerpBidAskTwap = _data[i] == 1; ++i; - final var padding = Borsh.readArray(new int[50], _data, i); + final var padding1 = Borsh.readArray(new int[2], _data, i); + i += Borsh.fixedLen(padding1); + final var fuelInsurance = getInt32LE(_data, i); + i += 4; + final var fuelDeposits = getInt32LE(_data, i); + i += 4; + final var fuelBorrows = getInt32LE(_data, i); + i += 4; + final var fuelPositions = getInt32LE(_data, i); + i += 4; + final var fuelTaker = getInt32LE(_data, i); + i += 4; + final var fuelMaker = getInt32LE(_data, i); + i += 4; + final var ifStakedGovTokenAmount = getInt64LE(_data, i); + i += 8; + final var lastFuelIfBonusUpdateTs = getInt32LE(_data, i); + i += 4; + final var padding = Borsh.readArray(new int[12], _data, i); return new UserStats(_address, discriminator, authority, @@ -129,6 +166,15 @@ public static UserStats read(final PublicKey _address, final byte[] _data, final numberOfSubAccountsCreated, isReferrer, disableUpdatePerpBidAskTwap, + padding1, + fuelInsurance, + fuelDeposits, + fuelBorrows, + fuelPositions, + fuelTaker, + fuelMaker, + ifStakedGovTokenAmount, + lastFuelIfBonusUpdateTs, padding); } @@ -164,6 +210,23 @@ public int write(final byte[] _data, final int offset) { ++i; _data[i] = (byte) (disableUpdatePerpBidAskTwap ? 1 : 0); ++i; + i += Borsh.fixedWrite(padding1, _data, i); + putInt32LE(_data, i, fuelInsurance); + i += 4; + putInt32LE(_data, i, fuelDeposits); + i += 4; + putInt32LE(_data, i, fuelBorrows); + i += 4; + putInt32LE(_data, i, fuelPositions); + i += 4; + putInt32LE(_data, i, fuelTaker); + i += 4; + putInt32LE(_data, i, fuelMaker); + i += 4; + putInt64LE(_data, i, ifStakedGovTokenAmount); + i += 8; + putInt32LE(_data, i, lastFuelIfBonusUpdateTs); + i += 4; i += Borsh.fixedWrite(padding, _data, i); return i - offset; } @@ -185,6 +248,15 @@ public int l() { + 2 + 1 + 1 + + Borsh.fixedLen(padding1) + + 4 + + 4 + + 4 + + 4 + + 4 + + 4 + + 8 + + 4 + Borsh.fixedLen(padding); } }