Skip to content

Commit

Permalink
add integration test for nonceAdvance
Browse files Browse the repository at this point in the history
  • Loading branch information
ml-james committed Jun 19, 2024
1 parent 7bb958a commit 2031d2b
Show file tree
Hide file tree
Showing 8 changed files with 157 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.lmax.solana4j.programs;

import com.lmax.solana4j.base.IntegrationTestBase;
import com.lmax.solana4j.base.ParameterizedMessageEncodingTest;
import org.junit.jupiter.api.BeforeEach;

public class SystemProgramIntegrationTest extends IntegrationTestBase
{
@BeforeEach
void beforeEachTest()
{
solana.createKeyPair("payer");
solana.airdrop("payer", "100");
}

@ParameterizedMessageEncodingTest
void shouldCreateNonce(final String messageEncoding)
{
solana.setMessageEncoding(messageEncoding);

solana.createKeyPair("account");
solana.createKeyPair("authority");

solana.airdrop("address: authority", "amountSol: 10");
solana.createNonceAccount("account", "authority", "payer");
}

@ParameterizedMessageEncodingTest
void shouldAdvanceNonce(final String messageEncoding)
{
solana.setMessageEncoding(messageEncoding);

solana.createKeyPair("account");
solana.createKeyPair("authority");

solana.airdrop("address: authority", "amountSol: 10");
solana.createNonceAccount("account", "authority", "payer");

solana.advanceNonce("account", "authority", "payer");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,6 @@ void shouldMintToToken(final String messageEncoding, final String tokenProgram)
solana.tokenBalance("tokenAccount", "0.0000000000000001");
}

@ParameterizedTokenTest
void shouldCreateNonce(final String messageEncoding, final String tokenProgram)
{
solana.setMessageEncoding(messageEncoding);

solana.createKeyPair("account");
solana.createKeyPair("authority");

solana.airdrop("address: authority", "amountSol: 10");
solana.createNonceAccount("account", "authority", "payer", tokenProgram);
}

@ParameterizedTokenTest
void shouldTransferToken(final String messageEncoding, final String tokenProgram)
{
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/lmax/solana4j/programs/TokenProgram.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public static TokenProgram<?> factory(final TransactionBuilderBase tb)
}


public T createInitializeAccountInstruction(final PublicKey account, final PublicKey mint, final PublicKey owner)
public T createInitializeTokenAccountInstruction(final PublicKey account, final PublicKey mint, final PublicKey owner)
{
tb.append(ib -> ib
.program(programId)
Expand All @@ -77,7 +77,7 @@ public T createInitializeAccountInstruction(final PublicKey account, final Publi
return (T) this;
}

public T createInitializeMintInstruction(
public T createInitializeMintAccountInstruction(
final PublicKey tokenMintAddress,
final byte decimals,
final PublicKey mintAuthority,
Expand Down
19 changes: 19 additions & 0 deletions src/test-support/java/com/lmax/solana4j/SolanaDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,25 @@ public String createNonceAccount(
return solanaApi.sendTransaction(transactionBlob, Commitment.FINALIZED);
}

public String advanceNonce(
final TestKeyPair account,
final TestKeyPair authority,
final TestKeyPair payer,
final List<AddressLookupTable> addressLookupTables)
{
final Blockhash blockhash = solanaApi.getRecentBlockHash();

final String transactionBlob = getTransactionFactory().advanceNonce(
account.getSolana4jPublicKey(),
authority.getSolana4jPublicKey(),
Solana.blockhash(blockhash.getBytes()),
payer.getSolana4jPublicKey(),
List.of(payer, authority),
addressLookupTables);

return solanaApi.sendTransaction(transactionBlob, Commitment.FINALIZED);
}

public String tokenTransfer(
final TokenProgram tokenProgram,
final TestKeyPair from,
Expand Down
23 changes: 22 additions & 1 deletion src/test-support/java/com/lmax/solana4j/SolanaNodeDsl.java
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,6 @@ public void createNonceAccount(final String... args)
new RequiredArg("account"),
new RequiredArg("authority"),
new RequiredArg("payer"),
new OptionalArg("tokenProgram").setAllowedValues("Token", "Token2022").setDefault("Token"),
new OptionalArg("addressLookupTables").setAllowMultipleValues()
);

Expand All @@ -335,4 +334,26 @@ public void createNonceAccount(final String... args)

new Waiter().waitFor(new IsNotNullAssertion<>(() -> solanaDriver.getTransactionResponse(transactionSignature, FINALIZED).getTransaction()));
}

public void advanceNonce(final String... args)
{
final DslParams params = DslParams.create(
args,
new RequiredArg("account"),
new RequiredArg("authority"),
new RequiredArg("payer"),
new OptionalArg("addressLookupTables").setAllowMultipleValues()
);

final TestKeyPair account = testContext.getKeyPair(params.value("account"));
final TestKeyPair authority = testContext.getKeyPair(params.value("authority"));
final TestKeyPair payer = testContext.getKeyPair(params.value("payer"));
final List<AddressLookupTable> addressLookupTables = params.valuesAsList("addressLookupTables").stream()
.map(testContext::getAddressLookupTable)
.toList();

final String transactionSignature = solanaDriver.advanceNonce(account, authority, payer, addressLookupTables);

new Waiter().waitFor(new IsNotNullAssertion<>(() -> solanaDriver.getTransactionResponse(transactionSignature, FINALIZED).getTransaction()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ public String createMintAccount(
accountSpan,
tokenProgram.getProgram()))
.instructions(builder -> tokenProgram.getFactory().factory(builder)
.createInitializeMintInstruction(
.createInitializeMintAccountInstruction(
account,
(byte) decimals,
mintAuthority,
Expand Down Expand Up @@ -287,7 +287,7 @@ public String initializeTokenAccount(
accountSpan,
tokenProgram.getProgram()))
.instructions(legacyTransactionBuilder -> tokenProgram.getFactory().factory(legacyTransactionBuilder)
.createInitializeAccountInstruction(
.createInitializeTokenAccountInstruction(
account,
mint,
owner))
Expand Down Expand Up @@ -393,6 +393,36 @@ public String extendAddressLookupTable(
return base58encode(buffer);
}

@Override
public String advanceNonce(
final PublicKey account,
final PublicKey authority,
final Blockhash blockhash,
final PublicKey payer,
final List<TestKeyPair> signers,
final List<AddressLookupTable> addressLookupTables)
{
final ByteBuffer buffer = ByteBuffer.allocate(Solana.MAX_MESSAGE_SIZE);
Solana.builder(buffer)
.legacy()
.recent(blockhash)
.instructions(tb -> SystemProgram.factory(tb)
.nonceAdvance(account, authority))
.payer(payer)
.seal()
.unsigned()
.build();

final SignedMessageBuilder signedMessageBuilder = Solana.forSigning(buffer);
for (final TestKeyPair signer : signers)
{
signedMessageBuilder.by(signer.getSolana4jPublicKey(), new BouncyCastleSigner(signer.getPrivateKeyBytes()));
}

signedMessageBuilder.build();
return base58encode(buffer);
}

private static String base58encode(final ByteBuffer bytes)
{
return Base58.encode(ByteBufferPrimitiveArray.copy(bytes));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,4 +115,12 @@ String extendAddressLookupTable(
PublicKey payer,
List<TestKeyPair> signers,
List<AddressLookupTable> addressLookupTables);

String advanceNonce(
PublicKey account,
PublicKey authority,
Blockhash blockhash,
PublicKey payer,
List<TestKeyPair> signers,
List<AddressLookupTable> addressLookupTables);
}
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ public String createMintAccount(
accountSpan,
tokenProgram.getProgram()))
.instructions(builder -> tokenProgram.getFactory().factory(builder)
.createInitializeMintInstruction(
.createInitializeMintAccountInstruction(
account,
(byte) decimals,
mintAuthority,
Expand Down Expand Up @@ -285,7 +285,7 @@ public String initializeTokenAccount(
accountSpan,
tokenProgram.getProgram()))
.instructions(legacyTransactionBuilder -> tokenProgram.getFactory().factory(legacyTransactionBuilder)
.createInitializeAccountInstruction(
.createInitializeTokenAccountInstruction(
account,
mint,
owner))
Expand Down Expand Up @@ -394,6 +394,37 @@ public String extendAddressLookupTable(
return base58encode(buffer);
}

@Override
public String advanceNonce(
final PublicKey account,
final PublicKey authority,
final Blockhash blockhash,
final PublicKey payer,
final List<TestKeyPair> signers,
final List<AddressLookupTable> addressLookupTables)
{
final ByteBuffer buffer = ByteBuffer.allocate(Solana.MAX_MESSAGE_SIZE);
Solana.builder(buffer)
.v0()
.recent(blockhash)
.instructions(tb -> SystemProgram.factory(tb)
.nonceAdvance(account, authority))
.payer(payer)
.lookups(addressLookupTables)
.seal()
.unsigned()
.build();

final SignedMessageBuilder signedMessageBuilder = Solana.forSigning(buffer);
for (final TestKeyPair signer : signers)
{
signedMessageBuilder.by(signer.getSolana4jPublicKey(), new BouncyCastleSigner(signer.getPrivateKeyBytes()));
}

signedMessageBuilder.build();
return base58encode(buffer);
}

private static String base58encode(final ByteBuffer bytes)
{
return Base58.encode(ByteBufferPrimitiveArray.copy(bytes));
Expand Down

0 comments on commit 2031d2b

Please sign in to comment.