From 42399ad31afaaa07c9b4a755b2b2661755b82fdf Mon Sep 17 00:00:00 2001 From: Jamie Li Date: Tue, 20 May 2025 11:42:46 -0700 Subject: [PATCH 1/3] Add CheckStellarAssetContract example --- .../lightsail/CheckStellarAssetContract.java | 72 +++++++++++++++++++ .../lightsail/SorobanCreateContract.java | 3 + 2 files changed, 75 insertions(+) create mode 100644 examples/src/main/java/network/lightsail/CheckStellarAssetContract.java diff --git a/examples/src/main/java/network/lightsail/CheckStellarAssetContract.java b/examples/src/main/java/network/lightsail/CheckStellarAssetContract.java new file mode 100644 index 000000000..e1ef96caf --- /dev/null +++ b/examples/src/main/java/network/lightsail/CheckStellarAssetContract.java @@ -0,0 +1,72 @@ +package network.lightsail; + +import java.io.IOException; +import java.util.List; +import org.stellar.sdk.*; +import org.stellar.sdk.responses.sorobanrpc.GetLedgerEntriesResponse; +import org.stellar.sdk.scval.Scv; +import org.stellar.sdk.xdr.ContractDataDurability; +import org.stellar.sdk.xdr.LedgerEntry.LedgerEntryData; +import org.stellar.sdk.xdr.LedgerEntryType; +import org.stellar.sdk.xdr.LedgerKey; +import org.stellar.sdk.xdr.LedgerKey.LedgerKeyContractData; + +/** + * This example shows how to check the existence of the SAC (Stellar Asset Contract) of a class asset. + */ +public class CheckStellarAssetContract { + public static void main(String[] args) throws IOException { + String rpcServerUrl = "https://soroban-testnet.stellar.org:443"; + Asset assetNative = Asset.createNativeAsset(); + Asset assetUSDC = + Asset.createNonNativeAsset( + "USDC", "GDQOE23CFSUMSVQK4Y5JHPPYK73VYCNHZHA7ENKCV37P6SUEO6XQBKPP"); + Asset assetUnknown = + Asset.createNonNativeAsset( + "UNKN", "GDQOE23CFSUMSVQK4Y5JHPPYK73VYCNHZHA7ENKCV37P6SUEO6XQBKPP"); + + try (SorobanServer sorobanServer = new SorobanServer(rpcServerUrl)) { + System.out.println( + "The SAC ID of the asset [" + + assetNative + + "] is " + + getContractData(sorobanServer, assetNative)); + System.out.println( + "The SAC ID of the asset [" + + assetUSDC + + "] is " + + getContractData(sorobanServer, assetNative)); + System.out.println( + "The SAC ID of the asset [" + + assetUSDC + + "] is unknown (" + + getContractData(sorobanServer, assetUnknown) + + ")"); + } + } + + public static String getContractData(SorobanServer sorobanServer, Asset asset) + throws IOException { + String contractId = asset.getContractId(Network.TESTNET); + List ledgerKeys = + List.of( + LedgerKey.builder() + .discriminant(LedgerEntryType.CONTRACT_DATA) + .contractData( + LedgerKeyContractData.builder() + .contract(new Address(contractId).toSCAddress()) + .key(Scv.toLedgerKeyContractInstance()) + .durability(ContractDataDurability.PERSISTENT) + .build()) + .build()); + GetLedgerEntriesResponse response = sorobanServer.getLedgerEntries(ledgerKeys); + if (response.getEntries() != null && !response.getEntries().isEmpty()) { + LedgerEntryData entryData = + LedgerEntryData.fromXdrBase64(response.getEntries().get(0).getXdr()); + if (entryData.getContractData() == null) return null; + return entryData.getContractData().getContract().getContractId().toXdrBase64(); + } else { + return null; + } + } +} diff --git a/examples/src/main/java/network/lightsail/SorobanCreateContract.java b/examples/src/main/java/network/lightsail/SorobanCreateContract.java index 5eeca7c75..72a0e54f0 100644 --- a/examples/src/main/java/network/lightsail/SorobanCreateContract.java +++ b/examples/src/main/java/network/lightsail/SorobanCreateContract.java @@ -19,6 +19,9 @@ import org.stellar.sdk.xdr.SCVal; import org.stellar.sdk.xdr.TransactionMeta; +/** + * This example shows how to deploy a contract with an installed (uploaded) wasm id. + */ public class SorobanCreateContract { public static void main(String[] args) throws IOException { String secret = "SAAPYAPTTRZMCUZFPG3G66V4ZMHTK4TWA6NS7U4F7Z3IMUD52EK4DDEV"; From fdb278950611c8b4a8aa4d2061f836d05bda8f66 Mon Sep 17 00:00:00 2001 From: Jamie Li Date: Wed, 21 May 2025 09:36:09 -0700 Subject: [PATCH 2/3] Take care of PR comments --- .../lightsail/CheckStellarAssetContract.java | 41 ++++++------------- .../InvokeHostFunctionOperationTest.java | 4 +- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/examples/src/main/java/network/lightsail/CheckStellarAssetContract.java b/examples/src/main/java/network/lightsail/CheckStellarAssetContract.java index e1ef96caf..918cb19c2 100644 --- a/examples/src/main/java/network/lightsail/CheckStellarAssetContract.java +++ b/examples/src/main/java/network/lightsail/CheckStellarAssetContract.java @@ -12,11 +12,13 @@ import org.stellar.sdk.xdr.LedgerKey.LedgerKeyContractData; /** - * This example shows how to check the existence of the SAC (Stellar Asset Contract) of a class asset. + * This example shows how to check the existence of the SAC (Stellar Asset Contract) of a class + * asset. */ public class CheckStellarAssetContract { public static void main(String[] args) throws IOException { String rpcServerUrl = "https://soroban-testnet.stellar.org:443"; + Network network = Network.TESTNET; Asset assetNative = Asset.createNativeAsset(); Asset assetUSDC = Asset.createNonNativeAsset( @@ -26,28 +28,18 @@ public static void main(String[] args) throws IOException { "UNKN", "GDQOE23CFSUMSVQK4Y5JHPPYK73VYCNHZHA7ENKCV37P6SUEO6XQBKPP"); try (SorobanServer sorobanServer = new SorobanServer(rpcServerUrl)) { - System.out.println( - "The SAC ID of the asset [" - + assetNative - + "] is " - + getContractData(sorobanServer, assetNative)); - System.out.println( - "The SAC ID of the asset [" - + assetUSDC - + "] is " - + getContractData(sorobanServer, assetNative)); - System.out.println( - "The SAC ID of the asset [" - + assetUSDC - + "] is unknown (" - + getContractData(sorobanServer, assetUnknown) - + ")"); + for (Asset asset : List.of(assetNative, assetUSDC, assetUnknown)) { + String contractId = asset.getContractId(network); + System.out.printf( + "The contract id for %s is %s, it is %s\n", + asset, + contractId, + isContractDeployed(sorobanServer, contractId) ? "deployed" : "not deployed"); + } } } - public static String getContractData(SorobanServer sorobanServer, Asset asset) - throws IOException { - String contractId = asset.getContractId(Network.TESTNET); + public static boolean isContractDeployed(SorobanServer sorobanServer, String contractId) { List ledgerKeys = List.of( LedgerKey.builder() @@ -60,13 +52,6 @@ public static String getContractData(SorobanServer sorobanServer, Asset asset) .build()) .build()); GetLedgerEntriesResponse response = sorobanServer.getLedgerEntries(ledgerKeys); - if (response.getEntries() != null && !response.getEntries().isEmpty()) { - LedgerEntryData entryData = - LedgerEntryData.fromXdrBase64(response.getEntries().get(0).getXdr()); - if (entryData.getContractData() == null) return null; - return entryData.getContractData().getContract().getContractId().toXdrBase64(); - } else { - return null; - } + return response.getEntries() != null && !response.getEntries().isEmpty(); } } diff --git a/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java b/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java index 5da854ec3..1ba84a672 100644 --- a/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java +++ b/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java @@ -292,10 +292,10 @@ public void testNotEqualsSource() { } @Test - public void testUploadContractWasmOperationBuilder() { + public void testInstallContractWasmOperationBuilder() { byte[] wasm = new byte[] {0x00, 0x01, 0x02, 0x03, 0x34, 0x45, 0x66, 0x46}; InvokeHostFunctionOperation operation = - InvokeHostFunctionOperation.uploadContractWasmOperationBuilder(wasm).build(); + InvokeHostFunctionOperation.installContractWasmOperationBuilder(wasm).build(); HostFunction expectedFunction = HostFunction.builder() .discriminant(HostFunctionType.HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM) From cea736105bee1a402797ae1580d90e181deeee10 Mon Sep 17 00:00:00 2001 From: Jamie Li Date: Thu, 22 May 2025 15:35:30 -0700 Subject: [PATCH 3/3] Rollback InvokeHostFunctionOperationTest.java --- .../sdk/operations/InvokeHostFunctionOperationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java b/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java index 1ba84a672..5da854ec3 100644 --- a/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java +++ b/src/test/java/org/stellar/sdk/operations/InvokeHostFunctionOperationTest.java @@ -292,10 +292,10 @@ public void testNotEqualsSource() { } @Test - public void testInstallContractWasmOperationBuilder() { + public void testUploadContractWasmOperationBuilder() { byte[] wasm = new byte[] {0x00, 0x01, 0x02, 0x03, 0x34, 0x45, 0x66, 0x46}; InvokeHostFunctionOperation operation = - InvokeHostFunctionOperation.installContractWasmOperationBuilder(wasm).build(); + InvokeHostFunctionOperation.uploadContractWasmOperationBuilder(wasm).build(); HostFunction expectedFunction = HostFunction.builder() .discriminant(HostFunctionType.HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM)