From 6d50853801e5f504c54978eba6005b855a7adfe3 Mon Sep 17 00:00:00 2001 From: jamesm Date: Wed, 19 Jun 2024 16:01:45 -0400 Subject: [PATCH] cleanup of bits and pieces including adding remaining but as yet unimplemented integration tests --- ...AssociatedTokenProgramIntegrationTest.java | 25 +++++++ ...oaderUpgradableProgramIntegrationTest.java | 25 +++++++ .../ComputeBudgetProgramIntegrationTest.java | 33 +++++++++ .../programs/TokenProgramIntegrationTest.java | 18 +++++ .../programs/AddressLookupTableProgram.java | 8 ++- .../programs/AssociatedTokenProgram.java | 45 ++++++++++++ .../programs/BpfLoaderUpgradableProgram.java | 1 + .../programs/ComputeBudgetProgram.java | 2 + .../lmax/solana4j/programs/SystemProgram.java | 10 +-- .../lmax/solana4j/programs/TokenProgram.java | 69 +++---------------- .../java/com/lmax/solana4j/SolanaDriver.java | 3 +- .../java/com/lmax/solana4j/SolanaNodeDsl.java | 34 ++------- .../transaction/LegacyTransactionFactory.java | 35 +++++----- .../transaction/V0TransactionFactory.java | 35 +++++----- 14 files changed, 214 insertions(+), 129 deletions(-) create mode 100644 src/integration-test/java/com/lmax/solana4j/programs/AssociatedTokenProgramIntegrationTest.java create mode 100644 src/integration-test/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgramIntegrationTest.java create mode 100644 src/integration-test/java/com/lmax/solana4j/programs/ComputeBudgetProgramIntegrationTest.java diff --git a/src/integration-test/java/com/lmax/solana4j/programs/AssociatedTokenProgramIntegrationTest.java b/src/integration-test/java/com/lmax/solana4j/programs/AssociatedTokenProgramIntegrationTest.java new file mode 100644 index 0000000..0ff7f84 --- /dev/null +++ b/src/integration-test/java/com/lmax/solana4j/programs/AssociatedTokenProgramIntegrationTest.java @@ -0,0 +1,25 @@ +package com.lmax.solana4j.programs; + +import com.lmax.solana4j.base.IntegrationTestBase; +import com.lmax.solana4j.base.ParameterizedMessageEncodingTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; + +import static org.junit.jupiter.api.Assertions.fail; + +public class AssociatedTokenProgramIntegrationTest extends IntegrationTestBase +{ + @BeforeEach + void beforeEachTest() + { + solana.createKeyPair("payer"); + solana.airdrop("payer", "100"); + } + + @Disabled + @ParameterizedMessageEncodingTest + void shouldCreateAssociatedTokenAddress(final String messageEncoding) + { + fail(); + } +} diff --git a/src/integration-test/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgramIntegrationTest.java b/src/integration-test/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgramIntegrationTest.java new file mode 100644 index 0000000..5e3c6b4 --- /dev/null +++ b/src/integration-test/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgramIntegrationTest.java @@ -0,0 +1,25 @@ +package com.lmax.solana4j.programs; + +import com.lmax.solana4j.base.IntegrationTestBase; +import com.lmax.solana4j.base.ParameterizedMessageEncodingTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; + +import static org.junit.jupiter.api.Assertions.fail; + +public class BpfLoaderUpgradableProgramIntegrationTest extends IntegrationTestBase +{ + @BeforeEach + void beforeEachTest() + { + solana.createKeyPair("payer"); + solana.airdrop("payer", "100"); + } + + @Disabled + @ParameterizedMessageEncodingTest + void shouldSetUpgradeAuthority(final String messageEncoding) + { + fail(); + } +} diff --git a/src/integration-test/java/com/lmax/solana4j/programs/ComputeBudgetProgramIntegrationTest.java b/src/integration-test/java/com/lmax/solana4j/programs/ComputeBudgetProgramIntegrationTest.java new file mode 100644 index 0000000..ce6f2a3 --- /dev/null +++ b/src/integration-test/java/com/lmax/solana4j/programs/ComputeBudgetProgramIntegrationTest.java @@ -0,0 +1,33 @@ +package com.lmax.solana4j.programs; + +import com.lmax.solana4j.base.IntegrationTestBase; +import com.lmax.solana4j.base.ParameterizedMessageEncodingTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; + +import static org.junit.jupiter.api.Assertions.fail; + +public class ComputeBudgetProgramIntegrationTest extends IntegrationTestBase +{ + @BeforeEach + void beforeEachTest() + { + solana.createKeyPair("payer"); + solana.airdrop("payer", "100"); + } + + @Disabled + @ParameterizedMessageEncodingTest + void shouldSetComputeUnitLimit(final String messageEncoding) + { + fail(); + } + + + @Disabled + @ParameterizedMessageEncodingTest + void shouldSetComputeUnitPrice(final String messageEncoding) + { + fail(); + } +} diff --git a/src/integration-test/java/com/lmax/solana4j/programs/TokenProgramIntegrationTest.java b/src/integration-test/java/com/lmax/solana4j/programs/TokenProgramIntegrationTest.java index f8d551d..d895933 100644 --- a/src/integration-test/java/com/lmax/solana4j/programs/TokenProgramIntegrationTest.java +++ b/src/integration-test/java/com/lmax/solana4j/programs/TokenProgramIntegrationTest.java @@ -3,6 +3,9 @@ import com.lmax.solana4j.base.IntegrationTestBase; import com.lmax.solana4j.base.ParameterizedTokenTest; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; + +import static org.junit.jupiter.api.Assertions.fail; class TokenProgramIntegrationTest extends IntegrationTestBase { @@ -67,4 +70,19 @@ void shouldTransferToken(final String messageEncoding, final String tokenProgram solana.tokenBalance("tokenAccountSender", "0.00000000000000009"); solana.tokenBalance("tokenAccountReceiver", "0.00000000000000001"); } + + @Disabled + @ParameterizedTokenTest + void shouldCreateMultisig(final String messageEncoding, final String tokenProgram) + { + fail(); + } + + @Disabled + @ParameterizedTokenTest + void shouldSetAuthority(final String messageEncoding, final String tokenProgram) + { + fail(); + } + } diff --git a/src/main/java/com/lmax/solana4j/programs/AddressLookupTableProgram.java b/src/main/java/com/lmax/solana4j/programs/AddressLookupTableProgram.java index f39046f..d7f6762 100644 --- a/src/main/java/com/lmax/solana4j/programs/AddressLookupTableProgram.java +++ b/src/main/java/com/lmax/solana4j/programs/AddressLookupTableProgram.java @@ -36,7 +36,7 @@ private AddressLookupTableProgram(final TransactionBuilderBase tb) this.tb = tb; } - public void createAddressLookupTableInstruction(final ProgramDerivedAddress programDerivedAddress, final PublicKey authority, final PublicKey payer, final Slot recentSlot) + public AddressLookupTableProgram createLookupTable(final ProgramDerivedAddress programDerivedAddress, final PublicKey authority, final PublicKey payer, final Slot recentSlot) { tb.append(ib -> ib .program(PROGRAM_ACCOUNT) @@ -52,9 +52,11 @@ public void createAddressLookupTableInstruction(final ProgramDerivedAddress prog } ) ); + + return this; } - public void extendAddressLookupTable(final PublicKey lookupTable, final PublicKey authority, final PublicKey payer, final List addresses) + public AddressLookupTableProgram extendLookupTable(final PublicKey lookupTable, final PublicKey authority, final PublicKey payer, final List addresses) { tb.append(ib -> ib .program(PROGRAM_ACCOUNT) @@ -70,6 +72,8 @@ public void extendAddressLookupTable(final PublicKey lookupTable, final PublicKe } ) ); + + return this; } public static ProgramDerivedAddress deriveAddress(final PublicKey authority, final Slot slot) diff --git a/src/main/java/com/lmax/solana4j/programs/AssociatedTokenProgram.java b/src/main/java/com/lmax/solana4j/programs/AssociatedTokenProgram.java index 65fb43b..177ffc7 100644 --- a/src/main/java/com/lmax/solana4j/programs/AssociatedTokenProgram.java +++ b/src/main/java/com/lmax/solana4j/programs/AssociatedTokenProgram.java @@ -1,11 +1,56 @@ package com.lmax.solana4j.programs; import com.lmax.solana4j.Solana; +import com.lmax.solana4j.api.ProgramDerivedAddress; import com.lmax.solana4j.api.PublicKey; +import com.lmax.solana4j.api.TransactionBuilderBase; import org.bitcoinj.core.Base58; +import java.nio.ByteOrder; + +import static com.lmax.solana4j.encoding.SysVar.RENT; +import static com.lmax.solana4j.programs.SystemProgram.SYSTEM_PROGRAM_ACCOUNT; + public final class AssociatedTokenProgram { private static final byte[] ASSOCIATED_TOKEN_PROGRAM_ID = Base58.decode("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); public static final PublicKey ASSOCIATED_TOKEN_PROGRAM_ACCOUNT = Solana.account(ASSOCIATED_TOKEN_PROGRAM_ID); + + public static final int IDEMPOTENT_CREATE_INSTRUCTION = 1; + public static final int CREATE_INSTRUCTION = 0; + + private final TransactionBuilderBase tb; + + public static AssociatedTokenProgram factory(final TransactionBuilderBase tb) + { + return new AssociatedTokenProgram(tb); + } + + private AssociatedTokenProgram(final TransactionBuilderBase tb) + { + this.tb = tb; + } + + public AssociatedTokenProgram createAssociatedToken( + final ProgramDerivedAddress programDerivedAddress, + final PublicKey mint, + final PublicKey owner, + final PublicKey payer, + final boolean idempotent) + { + tb.append(ib -> ib + .program(ASSOCIATED_TOKEN_PROGRAM_ACCOUNT) + .account(payer, true, true) + .account(programDerivedAddress.address(), false, true) + .account(owner, false, false) + .account(mint, false, false) + .account(SYSTEM_PROGRAM_ACCOUNT, false, false) + .account(ASSOCIATED_TOKEN_PROGRAM_ACCOUNT, false, false) + .account(RENT, false, false) + .data(1, bb -> bb.order(ByteOrder.LITTLE_ENDIAN) + .put((byte) (idempotent ? IDEMPOTENT_CREATE_INSTRUCTION : CREATE_INSTRUCTION))) + ); + + return this; + } } diff --git a/src/main/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgram.java b/src/main/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgram.java index c04f7fb..2fe54af 100644 --- a/src/main/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgram.java +++ b/src/main/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgram.java @@ -48,6 +48,7 @@ public BpfLoaderUpgradableProgram setUpgradeAuthority( maybeNewAuthorityAddress.ifPresent(newAuthorityAddress -> ib.account(newAuthorityAddress, false, false)); ib.data(4, bb -> bb.order(ByteOrder.LITTLE_ENDIAN).putInt(SET_AUTHORITY_INSTRUCTION)); }); + return this; } } diff --git a/src/main/java/com/lmax/solana4j/programs/ComputeBudgetProgram.java b/src/main/java/com/lmax/solana4j/programs/ComputeBudgetProgram.java index 79f7949..ddffc9c 100644 --- a/src/main/java/com/lmax/solana4j/programs/ComputeBudgetProgram.java +++ b/src/main/java/com/lmax/solana4j/programs/ComputeBudgetProgram.java @@ -36,6 +36,7 @@ public ComputeBudgetProgram setComputeUnitLimit(final int computeUnits) .put((byte) SET_COMPUTE_UNIT_LIMIT_INSTRUCTION) .putInt(computeUnits)) ); + return this; } @@ -48,6 +49,7 @@ public ComputeBudgetProgram setComputeUnitPrice(final long microLamports) .put((byte) SET_COMPUTE_UNIT_PRICE_INSTRUCTION) .putLong(microLamports)) ); + return this; } } diff --git a/src/main/java/com/lmax/solana4j/programs/SystemProgram.java b/src/main/java/com/lmax/solana4j/programs/SystemProgram.java index 5f330ac..254d55e 100644 --- a/src/main/java/com/lmax/solana4j/programs/SystemProgram.java +++ b/src/main/java/com/lmax/solana4j/programs/SystemProgram.java @@ -14,7 +14,8 @@ public final class SystemProgram private static final byte[] SYSTEM_PROGRAM_ID = Base58.decode("11111111111111111111111111111111"); public static final PublicKey SYSTEM_PROGRAM_ACCOUNT = Solana.account(SYSTEM_PROGRAM_ID); - public static final int NONCE_ACCOUNT_LENGTH = 80; // ref solana-web3.js PATH:programs/system.ts (NonceAccountLayout) + public static final int NONCE_ACCOUNT_LENGTH = 80; + public static final int MINT_ACCOUNT_LENGTH = 82; private static final int CREATE_ACCOUNT_INSTRUCTION = 0; private static final int TRANSFER_INSTRUCTION = 2; @@ -34,12 +35,6 @@ public static SystemProgram factory(final TransactionBuilderBase tb) this.tb = tb; } - public SystemProgram createAccount(final PublicKey payer, final PublicKey newAccount, final long lamports, final long space) - { - createAccount(payer, newAccount, lamports, space, SYSTEM_PROGRAM_ACCOUNT); - return this; - } - public SystemProgram createAccount(final PublicKey payer, final PublicKey newAccount, final long lamports, final long space, final PublicKey program) { tb.append(ib -> ib @@ -56,6 +51,7 @@ public SystemProgram createAccount(final PublicKey payer, final PublicKey newAcc program.write(bb); }) ); + return this; } diff --git a/src/main/java/com/lmax/solana4j/programs/TokenProgram.java b/src/main/java/com/lmax/solana4j/programs/TokenProgram.java index f176815..69bb357 100644 --- a/src/main/java/com/lmax/solana4j/programs/TokenProgram.java +++ b/src/main/java/com/lmax/solana4j/programs/TokenProgram.java @@ -8,12 +8,10 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.Collections; import java.util.List; import java.util.Optional; import static com.lmax.solana4j.encoding.SysVar.RENT; -import static com.lmax.solana4j.programs.SystemProgram.SYSTEM_PROGRAM_ACCOUNT; @SuppressWarnings("unchecked") // return type cast is pretty safe after all as we're limited to our types only @@ -46,8 +44,6 @@ public class TokenProgram>> private static final int INITIALIZE_MULTISIG2_INSTRUCTION = 19; private static final int INITIALIZE_MINT2_INSTRUCTION = 20; public static final int AUTHORITY_TYPE_ACCOUNT_OWNER = 2; - public static final int IDEMPOTENT_CREATE_INSTRUCTION = 1; - public static final int CREATE_INSTRUCTION = 0; private final PublicKey programId; private final TransactionBuilderBase tb; @@ -64,7 +60,7 @@ public static TokenProgram factory(final TransactionBuilderBase tb) } - public T createInitializeTokenAccountInstruction(final PublicKey account, final PublicKey mint, final PublicKey owner) + public T initializeAccount(final PublicKey account, final PublicKey mint, final PublicKey owner) { tb.append(ib -> ib .program(programId) @@ -74,10 +70,11 @@ public T createInitializeTokenAccountInstruction(final PublicKey account, final .account(RENT, false, false) .data(1, bb -> bb.order(ByteOrder.LITTLE_ENDIAN).put((byte) INITIALIZE_ACCOUNT_INSTRUCTION)) ); + return (T) this; } - public T createInitializeMintAccountInstruction( + public T initializeMint( final PublicKey tokenMintAddress, final byte decimals, final PublicKey mintAuthority, @@ -108,50 +105,11 @@ public T createInitializeMintAccountInstruction( } }) ); - return (T) this; - } - public T createTokenAccountInstruction( - final PublicKey payer, - final PublicKey associatedTokenAddress, - final PublicKey mint, - final PublicKey associatedTokenProgramId, - final PublicKey owner, - final boolean idempotent) - { - tb.append(ib -> ib - .program(associatedTokenProgramId) - .account(payer, true, true) - .account(associatedTokenAddress, false, true) - .account(owner, false, false) - .account(mint, false, false) - .account(SYSTEM_PROGRAM_ACCOUNT, false, false) - .account(programId, false, false) - .account(RENT, false, false) - .data(1, bb -> bb.order(ByteOrder.LITTLE_ENDIAN) - .put((byte) (idempotent ? IDEMPOTENT_CREATE_INSTRUCTION : CREATE_INSTRUCTION))) - ); - return (T) this; - } - - public T createMintToInstruction( - final PublicKey mint, - final PublicKey authority, - final Destination destination) - { - tb.append(ib -> ib - .program(programId) - .account(mint, false, true) - .account(destination.getDestination(), false, true) - .account(authority, true, false) - .data(1 + 8, bb -> bb.order(ByteOrder.LITTLE_ENDIAN) - .put((byte) MINT_TO_INSTRUCTION) - .putLong(destination.getAmount())) - ); return (T) this; } - public T createMintToInstructions( + public T mintTo( final PublicKey mint, final PublicKey authority, final List destinations) @@ -168,19 +126,11 @@ public T createMintToInstructions( .putLong(destination.getAmount())) ); } - return (T) this; - } - public T createTransferInstruction( - final PublicKey source, - final PublicKey destination, - final PublicKey owner, - final long amount) - { - return createTransferInstruction(source, destination, owner, amount, Collections.emptyList()); + return (T) this; } - public T createTransferInstruction( + public T transfer( final PublicKey source, final PublicKey destination, final PublicKey owner, @@ -200,10 +150,11 @@ public T createTransferInstruction( signers.forEach(signer -> ib .account(signer, true, false)); }); + return (T) this; } - public T createInitializeMultisigInstruction( + public T initializeMultisig( final PublicKey multisigPublicKey, final List signers, final int requiredSignatures) @@ -220,10 +171,11 @@ public T createInitializeMultisigInstruction( signers.forEach(signer -> ib .account(signer, false, false)); }); + return (T) this; } - public T createSetAuthorityInstruction( + public T setAuthority( final PublicKey tokenAccount, final PublicKey newAuthority, final PublicKey oldAuthority, @@ -249,6 +201,7 @@ public T createSetAuthorityInstruction( signers.forEach(signer -> ib .account(signer, true, false)); }); + return (T) this; } diff --git a/src/test-support/java/com/lmax/solana4j/SolanaDriver.java b/src/test-support/java/com/lmax/solana4j/SolanaDriver.java index 694094e..bb4747c 100644 --- a/src/test-support/java/com/lmax/solana4j/SolanaDriver.java +++ b/src/test-support/java/com/lmax/solana4j/SolanaDriver.java @@ -103,7 +103,8 @@ public String createMintAccount( final int decimals, final TestKeyPair mintAuthority, final TestKeyPair freezeAuthority, - final TestKeyPair payer, final int accountSpan, + final TestKeyPair payer, + final int accountSpan, final List addressLookupTables) { final com.lmax.solana4j.client.api.Blockhash recentBlockhash = solanaApi.getRecentBlockHash(); diff --git a/src/test-support/java/com/lmax/solana4j/SolanaNodeDsl.java b/src/test-support/java/com/lmax/solana4j/SolanaNodeDsl.java index 59ee4d6..4d538da 100644 --- a/src/test-support/java/com/lmax/solana4j/SolanaNodeDsl.java +++ b/src/test-support/java/com/lmax/solana4j/SolanaNodeDsl.java @@ -25,16 +25,14 @@ import java.util.stream.Collectors; import static com.lmax.solana4j.client.api.Commitment.FINALIZED; +import static com.lmax.solana4j.programs.SystemProgram.MINT_ACCOUNT_LENGTH; +import static com.lmax.solana4j.programs.SystemProgram.NONCE_ACCOUNT_LENGTH; +import static com.lmax.solana4j.programs.TokenProgram.ACCOUNT_LAYOUT_SPAN; import static java.util.Arrays.stream; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class SolanaNodeDsl { - public static final int MINT_LAYOUT_SPAN = 82; - public static final int ACCOUNT_LAYOUT_SPAN = 165; - public static final int NONCE_ACCOUNT_LAYOUT_SPAN = 80; - public static final int MULTISIG_LAYOUT_SPAN = 355; - private final SolanaDriver solanaDriver; private final TestContext testContext; @@ -183,29 +181,7 @@ public void createMintAccount(final String... args) .map(testContext::getAddressLookupTable) .toList(); - final String transactionSignature = solanaDriver.createMintAccount(tokenProgram, account, decimals, mintAuthority, freezeAuthority, payer, MINT_LAYOUT_SPAN, addressLookupTables); - - new Waiter().waitFor(new IsNotNullAssertion<>(() -> solanaDriver.getTransactionResponse(transactionSignature, FINALIZED).getTransaction())); - } - - public void createAccount(final String... args) - { - final DslParams params = DslParams.create( - args, - new RequiredArg("account"), - new RequiredArg("payer"), - new OptionalArg("tokenProgram").setAllowedValues("Token", "Token2022").setDefault("Token"), - new OptionalArg("addressLookupTables").setAllowMultipleValues() - ); - - final TestKeyPair account = testContext.getKeyPair(params.value("account")); - final TestKeyPair payer = testContext.getKeyPair(params.value("payer")); - final TokenProgram tokenProgram = TokenProgram.fromName(params.value("tokenProgram")); - final List addressLookupTables = params.valuesAsList("addressLookupTables").stream() - .map(testContext::getAddressLookupTable) - .toList(); - - final String transactionSignature = solanaDriver.createAccount(tokenProgram.getProgram(), account, payer, ACCOUNT_LAYOUT_SPAN, addressLookupTables); + final String transactionSignature = solanaDriver.createMintAccount(tokenProgram, account, decimals, mintAuthority, freezeAuthority, payer, MINT_ACCOUNT_LENGTH, addressLookupTables); new Waiter().waitFor(new IsNotNullAssertion<>(() -> solanaDriver.getTransactionResponse(transactionSignature, FINALIZED).getTransaction())); } @@ -346,7 +322,7 @@ public void createNonceAccount(final String... args) .map(testContext::getAddressLookupTable) .toList(); - final String transactionSignature = solanaDriver.createNonceAccount(account, authority, payer, NONCE_ACCOUNT_LAYOUT_SPAN, addressLookupTables); + final String transactionSignature = solanaDriver.createNonceAccount(account, authority, payer, NONCE_ACCOUNT_LENGTH, addressLookupTables); new Waiter().waitFor(new IsNotNullAssertion<>(() -> solanaDriver.getTransactionResponse(transactionSignature, FINALIZED).getTransaction())); } diff --git a/src/test-support/java/com/lmax/solana4j/transaction/LegacyTransactionFactory.java b/src/test-support/java/com/lmax/solana4j/transaction/LegacyTransactionFactory.java index 2ac9f48..ad55cf0 100644 --- a/src/test-support/java/com/lmax/solana4j/transaction/LegacyTransactionFactory.java +++ b/src/test-support/java/com/lmax/solana4j/transaction/LegacyTransactionFactory.java @@ -14,7 +14,6 @@ import com.lmax.solana4j.domain.BouncyCastleSigner; import com.lmax.solana4j.domain.TestKeyPair; import com.lmax.solana4j.programs.AddressLookupTableProgram; -import com.lmax.solana4j.programs.SystemProgram; import org.bitcoinj.core.Base58; import java.nio.ByteBuffer; @@ -22,6 +21,9 @@ import java.util.Optional; import java.util.stream.Collectors; +import static com.lmax.solana4j.programs.SystemProgram.SYSTEM_PROGRAM_ACCOUNT; +import static com.lmax.solana4j.programs.SystemProgram.factory; + public class LegacyTransactionFactory implements TransactionFactory { @@ -40,7 +42,7 @@ public String solTransfer( Solana.builder(buffer) .legacy() .recent(blockhash) - .instructions(builder -> SystemProgram.factory(builder) + .instructions(builder -> factory(builder) .transfer( from, to, @@ -79,7 +81,7 @@ public String tokenTransfer( .legacy() .recent(blockhash) .instructions(builder -> tokenProgramFactory.factory(builder) - .createTransferInstruction( + .transfer( from, to, owner, @@ -118,10 +120,10 @@ public String mintTo( .legacy() .recent(blockhash) .instructions(builder -> tokenProgramFactory.factory(builder) - .createMintToInstruction( + .mintTo( mint, authority, - destination + List.of(destination) )) .payer(payer) .seal() @@ -154,7 +156,7 @@ public String createAccount( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(versionedTransactionBuilder -> SystemProgram.factory(versionedTransactionBuilder) + .instructions(versionedTransactionBuilder -> factory(versionedTransactionBuilder) .createAccount( payer, account, @@ -196,7 +198,7 @@ public String createMintAccount( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(versionedTransactionBuilder -> SystemProgram.factory(versionedTransactionBuilder) + .instructions(versionedTransactionBuilder -> factory(versionedTransactionBuilder) .createAccount( payer, account, @@ -204,7 +206,7 @@ public String createMintAccount( accountSpan, tokenProgram.getProgram())) .instructions(builder -> tokenProgram.getFactory().factory(builder) - .createInitializeMintAccountInstruction( + .initializeMint( account, (byte) decimals, mintAuthority, @@ -240,13 +242,14 @@ public String createNonce( Solana.builder(buffer) .legacy() .recent(blockhash) - .instructions(legacyTransactionBuilder -> SystemProgram.factory(legacyTransactionBuilder) + .instructions(legacyTransactionBuilder -> factory(legacyTransactionBuilder) .createAccount( authority, nonce, rentExemption, - accountSpan)) - .instructions(legacyTransactionBuilder -> SystemProgram.factory(legacyTransactionBuilder).nonceInitialize(nonce, authority)) + accountSpan, + SYSTEM_PROGRAM_ACCOUNT)) + .instructions(legacyTransactionBuilder -> factory(legacyTransactionBuilder).nonceInitialize(nonce, authority)) .payer(payer) .seal() .unsigned() @@ -279,7 +282,7 @@ public String initializeTokenAccount( Solana.builder(buffer) .legacy() .recent(blockhash) - .instructions(legacyTransactionBuilder -> SystemProgram.factory(legacyTransactionBuilder) + .instructions(legacyTransactionBuilder -> factory(legacyTransactionBuilder) .createAccount( payer, account, @@ -287,7 +290,7 @@ public String initializeTokenAccount( accountSpan, tokenProgram.getProgram())) .instructions(legacyTransactionBuilder -> tokenProgram.getFactory().factory(legacyTransactionBuilder) - .createInitializeTokenAccountInstruction( + .initializeAccount( account, mint, owner)) @@ -335,7 +338,7 @@ public String createAddressLookupTable( .legacy() .recent(blockhash) .instructions(builder -> AddressLookupTableProgram.factory(builder) - .createAddressLookupTableInstruction( + .createLookupTable( programDerivedAddress, authority, payer, @@ -372,7 +375,7 @@ public String extendAddressLookupTable( .legacy() .recent(blockhash) .instructions(builder -> AddressLookupTableProgram.factory(builder) - .extendAddressLookupTable( + .extendLookupTable( lookupAddress, authority, payer, @@ -406,7 +409,7 @@ public String advanceNonce( Solana.builder(buffer) .legacy() .recent(blockhash) - .instructions(tb -> SystemProgram.factory(tb) + .instructions(tb -> factory(tb) .nonceAdvance(account, authority)) .payer(payer) .seal() diff --git a/src/test-support/java/com/lmax/solana4j/transaction/V0TransactionFactory.java b/src/test-support/java/com/lmax/solana4j/transaction/V0TransactionFactory.java index ae1e30f..e99e589 100644 --- a/src/test-support/java/com/lmax/solana4j/transaction/V0TransactionFactory.java +++ b/src/test-support/java/com/lmax/solana4j/transaction/V0TransactionFactory.java @@ -14,7 +14,6 @@ import com.lmax.solana4j.domain.BouncyCastleSigner; import com.lmax.solana4j.domain.TestKeyPair; import com.lmax.solana4j.programs.AddressLookupTableProgram; -import com.lmax.solana4j.programs.SystemProgram; import org.bitcoinj.core.Base58; import java.nio.ByteBuffer; @@ -22,6 +21,9 @@ import java.util.Optional; import java.util.stream.Collectors; +import static com.lmax.solana4j.programs.SystemProgram.SYSTEM_PROGRAM_ACCOUNT; +import static com.lmax.solana4j.programs.SystemProgram.factory; + public class V0TransactionFactory implements TransactionFactory { @@ -40,7 +42,7 @@ public String solTransfer( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(builder -> SystemProgram.factory(builder).transfer(from, to, amount)) + .instructions(builder -> factory(builder).transfer(from, to, amount)) .payer(payer) .lookups(addressLookupTables) .seal() @@ -75,7 +77,7 @@ public String tokenTransfer( .v0() .recent(blockhash) .instructions(builder -> tokenProgramFactory.factory(builder) - .createTransferInstruction( + .transfer( from, to, owner, @@ -115,10 +117,10 @@ public String mintTo( .v0() .recent(blockhash) .instructions(builder -> tokenProgramFactory.factory(builder) - .createMintToInstruction( + .mintTo( mint, authority, - destination + List.of(destination) )) .payer(payer) .lookups(addressLookupTables) @@ -152,7 +154,7 @@ public String createAccount( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(versionedTransactionBuilder -> SystemProgram.factory(versionedTransactionBuilder) + .instructions(versionedTransactionBuilder -> factory(versionedTransactionBuilder) .createAccount( payer, account, @@ -193,7 +195,7 @@ public String createMintAccount( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(versionedTransactionBuilder -> SystemProgram.factory(versionedTransactionBuilder) + .instructions(versionedTransactionBuilder -> factory(versionedTransactionBuilder) .createAccount( payer, account, @@ -201,7 +203,7 @@ public String createMintAccount( accountSpan, tokenProgram.getProgram())) .instructions(builder -> tokenProgram.getFactory().factory(builder) - .createInitializeMintAccountInstruction( + .initializeMint( account, (byte) decimals, mintAuthority, @@ -237,13 +239,14 @@ public String createNonce( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(legacyTransactionBuilder -> SystemProgram.factory(legacyTransactionBuilder) + .instructions(legacyTransactionBuilder -> factory(legacyTransactionBuilder) .createAccount( payer, nonce, rentExemption, - accountSpan)) - .instructions(legacyTransactionBuilder -> SystemProgram.factory(legacyTransactionBuilder).nonceInitialize(nonce, authority)) + accountSpan, + SYSTEM_PROGRAM_ACCOUNT)) + .instructions(legacyTransactionBuilder -> factory(legacyTransactionBuilder).nonceInitialize(nonce, authority)) .payer(payer) .lookups(addressLookupTables) .seal() @@ -277,7 +280,7 @@ public String initializeTokenAccount( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(legacyTransactionBuilder -> SystemProgram.factory(legacyTransactionBuilder) + .instructions(legacyTransactionBuilder -> factory(legacyTransactionBuilder) .createAccount( payer, account, @@ -285,7 +288,7 @@ public String initializeTokenAccount( accountSpan, tokenProgram.getProgram())) .instructions(legacyTransactionBuilder -> tokenProgram.getFactory().factory(legacyTransactionBuilder) - .createInitializeTokenAccountInstruction( + .initializeAccount( account, mint, owner)) @@ -334,7 +337,7 @@ public String createAddressLookupTable( .v0() .recent(blockhash) .instructions(builder -> AddressLookupTableProgram.factory(builder) - .createAddressLookupTableInstruction( + .createLookupTable( programDerivedAddress, authority, payer, @@ -372,7 +375,7 @@ public String extendAddressLookupTable( .v0() .recent(blockhash) .instructions(builder -> AddressLookupTableProgram.factory(builder) - .extendAddressLookupTable( + .extendLookupTable( lookupAddress, authority, payer, @@ -407,7 +410,7 @@ public String advanceNonce( Solana.builder(buffer) .v0() .recent(blockhash) - .instructions(tb -> SystemProgram.factory(tb) + .instructions(tb -> factory(tb) .nonceAdvance(account, authority)) .payer(payer) .lookups(addressLookupTables)