-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Write final test testing BpfUpgradeableProgram
- Loading branch information
Showing
14 changed files
with
366 additions
and
84 deletions.
There are no files selected for viewing
24 changes: 0 additions & 24 deletions
24
...ation-test/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgramIntegrationTest.java
This file was deleted.
Oops, something went wrong.
49 changes: 49 additions & 0 deletions
49
...tion-test/java/com/lmax/solana4j/programs/BpfLoaderUpgradeableProgramIntegrationTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package com.lmax.solana4j.programs; | ||
|
||
import com.lmax.solana4j.parameterization.ParameterizedMessageEncodingTest; | ||
import org.junit.jupiter.api.AfterEach; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.parallel.Execution; | ||
import org.junit.jupiter.api.parallel.ExecutionMode; | ||
|
||
@Execution(ExecutionMode.SAME_THREAD) | ||
public class BpfLoaderUpgradeableProgramIntegrationTest extends IntegrationTestBase | ||
{ | ||
@BeforeEach | ||
void beforeEachTest() | ||
{ | ||
solana.createKeyPair("payer"); | ||
solana.airdrop("payer", "0.01"); | ||
} | ||
|
||
@ParameterizedMessageEncodingTest | ||
void shouldSetUpgradeAuthority(final String messageEncoding) | ||
{ | ||
solana.setMessageEncoding(messageEncoding); | ||
|
||
solana.createKeyPair("newAuthority"); | ||
|
||
// see solana-run.sh for where these values come from | ||
solana.upgradeAuthority("<CxmAHzszTVSWmtBnCXda7eUTemd8DGyax88yYk54A2PT>", "<13jT1jL8jpTFzFcZATPq9W4gmRB5uZbEYjXxJJbugB1d>"); | ||
|
||
solana.setUpgradeAuthority( | ||
"<CxmAHzszTVSWmtBnCXda7eUTemd8DGyax88yYk54A2PT>", | ||
"<13jT1jL8jpTFzFcZATPq9W4gmRB5uZbEYjXxJJbugB1d>", | ||
"<Ed4gbZARwspMoyVRPU3GvCCARFtRSPSw2TqtHvH6vvj8>", | ||
"newAuthority", | ||
"payer"); | ||
|
||
solana.upgradeAuthority("<CxmAHzszTVSWmtBnCXda7eUTemd8DGyax88yYk54A2PT>", "newAuthority"); | ||
} | ||
|
||
@AfterEach | ||
void afterEachTest() | ||
{ | ||
solana.setUpgradeAuthority( | ||
"<CxmAHzszTVSWmtBnCXda7eUTemd8DGyax88yYk54A2PT>", | ||
"newAuthority", | ||
"newAuthority", | ||
"<13jT1jL8jpTFzFcZATPq9W4gmRB5uZbEYjXxJJbugB1d>", | ||
"payer"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
49 changes: 0 additions & 49 deletions
49
src/main/java/com/lmax/solana4j/programs/BpfLoaderUpgradableProgram.java
This file was deleted.
Oops, something went wrong.
96 changes: 96 additions & 0 deletions
96
src/main/java/com/lmax/solana4j/programs/BpfLoaderUpgradeableProgram.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
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.TransactionBuilder; | ||
import com.lmax.solana4j.encoding.SolanaEncoding; | ||
import org.bitcoinj.core.Base58; | ||
|
||
import java.nio.ByteOrder; | ||
import java.util.List; | ||
import java.util.Optional; | ||
|
||
/** | ||
* Represents a program for interacting with the BPF Loader Upgradeable program on the Solana blockchain. | ||
* This program allows for managing upgradeable programs, such as setting a new upgrade authority. | ||
*/ | ||
public final class BpfLoaderUpgradeableProgram | ||
{ | ||
/** | ||
* The Program ID for the BPF Loader Upgradeable program. | ||
*/ | ||
private static final byte[] PROGRAM_ID = Base58.decode("BPFLoaderUpgradeab1e11111111111111111111111"); | ||
|
||
/** | ||
* The public key associated with the BPF Loader Upgradeable program. | ||
*/ | ||
public static final PublicKey PROGRAM_ACCOUNT = Solana.account(PROGRAM_ID); | ||
|
||
/** | ||
* The instruction code for setting a new upgrade authority. | ||
*/ | ||
private static final int SET_AUTHORITY_INSTRUCTION = 4; | ||
|
||
/** | ||
* The transaction builder used to construct and manage Solana transactions. | ||
*/ | ||
private final TransactionBuilder tb; | ||
|
||
/** | ||
* Factory method to create an instance of {@code BpfLoaderUpgradeableProgram} with a specified transaction builder. | ||
* | ||
* @param tb The transaction builder to use for constructing transactions. | ||
* @return A new instance of {@code BpfLoaderUpgradeableProgram}. | ||
*/ | ||
public static BpfLoaderUpgradeableProgram factory(final TransactionBuilder tb) | ||
{ | ||
return new BpfLoaderUpgradeableProgram(tb); | ||
} | ||
|
||
/** | ||
* Constructs a new instance of {@code BpfLoaderUpgradeableProgram} with the specified transaction builder. | ||
* | ||
* @param tb The transaction builder to use for constructing transactions. | ||
*/ | ||
BpfLoaderUpgradeableProgram(final TransactionBuilder tb) | ||
{ | ||
this.tb = tb; | ||
} | ||
|
||
/** | ||
* Sets the upgrade authority for a given program address. | ||
* | ||
* @param programAddress The public key of the program whose upgrade authority is being changed. | ||
* @param currentAuthorityAddress The current authority's public key. | ||
* @param maybeNewAuthorityAddress An optional public key for the new authority. If not present, no new authority is set. | ||
* @return The current instance of {@code BpfLoaderUpgradeableProgram} to allow method chaining. | ||
*/ | ||
public BpfLoaderUpgradeableProgram setUpgradeAuthority( | ||
final PublicKey programAddress, | ||
final PublicKey currentAuthorityAddress, | ||
final Optional<PublicKey> maybeNewAuthorityAddress) | ||
{ | ||
tb.append(ib -> | ||
{ | ||
ib.program(PROGRAM_ACCOUNT) | ||
.account(deriveAddress(programAddress).programId(), false, true) | ||
.account(currentAuthorityAddress, true, false); | ||
maybeNewAuthorityAddress.ifPresent(newAuthorityAddress -> ib.account(newAuthorityAddress, false, false)); | ||
ib.data(4, bb -> bb.order(ByteOrder.LITTLE_ENDIAN).putInt(SET_AUTHORITY_INSTRUCTION)); | ||
}); | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Derives a program-derived address for the specified program public key. | ||
* | ||
* @param program The public key of the program. | ||
* @return The derived program address. | ||
*/ | ||
public static ProgramDerivedAddress deriveAddress(final PublicKey program) | ||
{ | ||
return SolanaEncoding.deriveProgramAddress(List.of(program.bytes()), PROGRAM_ACCOUNT); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.