Skip to content

Commit da10416

Browse files
committed
Convenience methods for creating advance nonce instruction. Document how to create a durable transaction.
1 parent 4ec0d2b commit da10416

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

README.md

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,8 @@ request.
6262
```
6363
final Signer signer = ...
6464
65-
final var rpcEndpoint = URI.create("https://mainnet.helius-rpc.com/?api-key=");
6665
try (final var httpClient = HttpClient.newHttpClient()) {
67-
final var rpcClient = SolanaRpcClient.createClient(rpcEndpoint, httpClient);
66+
final var rpcClient = SolanaRpcClient.createClient(SolanaNetwork.MAIN_NET.getEndpoint(), httpClient);
6867
6968
final var blockHashFuture = rpcClient.getLatestBlockHash();
7069
final var minRentFuture = rpcClient.getMinimumBalanceForRentExemption(NonceAccount.BYTES);
@@ -133,3 +132,48 @@ try (final var httpClient = HttpClient.newHttpClient()) {
133132
System.out.println(nonceAccount);
134133
}
135134
```
135+
136+
### Create & Send Durable Transaction
137+
138+
```
139+
final var signer = ...
140+
final var nonceAccountKey = PublicKey.fromBase58Encoded("");
141+
final var sendToKey = PublicKey.fromBase58Encoded("");
142+
final var transferSOL = new BigDecimal("0.0");
143+
144+
final var solanaAccounts = SolanaAccounts.MAIN_NET;
145+
try (final var httpClient = HttpClient.newHttpClient()) {
146+
final var rpcClient = SolanaRpcClient.createClient(SolanaNetwork.MAIN_NET.getEndpoint(), httpClient);
147+
148+
final var nonceAccountInfo = rpcClient.getAccountInfo(nonceAccountKey).join();
149+
final var nonceAccount = NonceAccount.read(nonceAccountInfo);
150+
System.out.println(nonceAccount);
151+
152+
final var advanceNonceIx = nonceAccount.advanceNonceAccount(solanaAccounts);
153+
final var transferIx = SystemProgram.transfer(
154+
solanaAccounts.invokedSystemProgram(),
155+
signer.publicKey(),
156+
sendToKey,
157+
LamportDecimal.fromBigDecimal(transferSOL).longValue()
158+
);
159+
160+
final var instructions = List.of(advanceNonceIx, transferIx);
161+
final var transaction = Transaction.createTx(signer.publicKey(), instructions);
162+
transaction.setRecentBlockHash(nonceAccount.nonce());
163+
transaction.sign(signer);
164+
165+
final var base64Encoded = transaction.base64EncodeToString();
166+
final var sendTransactionFuture = rpcClient.sendTransaction(base64Encoded);
167+
System.out.format("""
168+
Transferring %s SOL from %s to %s.
169+
https://explorer.solana.com/tx/%s
170+
171+
""",
172+
transferSOL.toPlainString(), signer.publicKey(), sendToKey,
173+
transaction.getBase58Id()
174+
);
175+
176+
final var sig = sendTransactionFuture.join();
177+
System.out.println("Confirmed transaction " + sig);
178+
}
179+
```

src/main/java/software/sava/solana/programs/system/NonceAccount.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package software.sava.solana.programs.system;
22

33
import software.sava.core.accounts.PublicKey;
4+
import software.sava.core.accounts.SolanaAccounts;
45
import software.sava.core.encoding.ByteUtil;
56
import software.sava.core.rpc.Filter;
7+
import software.sava.core.tx.Instruction;
68
import software.sava.core.tx.Transaction;
79
import software.sava.rpc.json.http.response.AccountInfo;
810
import software.sava.solana.programs.stake.StakeState;
@@ -96,4 +98,22 @@ public static NonceAccount read(final PublicKey address, final byte[] data, int
9698
lamportsPerSignature
9799
);
98100
}
101+
102+
public Instruction advanceNonceAccount() {
103+
return advanceNonceAccount(SolanaAccounts.MAIN_NET);
104+
}
105+
106+
public Instruction advanceNonceAccount(final SolanaAccounts solanaAccounts) {
107+
return SystemProgram.advanceNonceAccount(solanaAccounts, address, authority);
108+
}
109+
110+
public void setNonce(final Transaction transaction) {
111+
setNonce(SolanaAccounts.MAIN_NET, transaction);
112+
}
113+
114+
public void setNonce(final SolanaAccounts solanaAccounts, final Transaction transaction) {
115+
transaction.setRecentBlockHash(nonce);
116+
final var advanceNonceIx = advanceNonceAccount(solanaAccounts);
117+
transaction.prependIx(advanceNonceIx);
118+
}
99119
}

0 commit comments

Comments
 (0)