@@ -21,9 +21,20 @@ import com.soneso.stellar.sdk.smartaccount.oz.OZContextRuleManager
2121import com.soneso.stellar.sdk.smartaccount.oz.OZSmartAccountConfig
2222import com.soneso.stellar.sdk.smartaccount.oz.OZSmartAccountKit
2323import com.soneso.stellar.sdk.smartaccount.oz.ParsedContextRule
24+ import com.soneso.stellar.sdk.xdr.ContractExecutableExternalRefXdr
25+ import com.soneso.stellar.sdk.xdr.ContractExecutableXdr
26+ import com.soneso.stellar.sdk.xdr.ContractIDPreimageFromAddressXdr
27+ import com.soneso.stellar.sdk.xdr.ContractIDPreimageXdr
28+ import com.soneso.stellar.sdk.xdr.CreateContractArgsXdr
2429import com.soneso.stellar.sdk.xdr.SCMapEntryXdr
2530import com.soneso.stellar.sdk.xdr.SCMapXdr
31+ import com.soneso.stellar.sdk.xdr.SCStringXdr
2632import com.soneso.stellar.sdk.xdr.SCValXdr
33+ import com.soneso.stellar.sdk.xdr.SorobanAuthorizationEntryXdr
34+ import com.soneso.stellar.sdk.xdr.SorobanAuthorizedFunctionXdr
35+ import com.soneso.stellar.sdk.xdr.SorobanAuthorizedInvocationXdr
36+ import com.soneso.stellar.sdk.xdr.SorobanCredentialsXdr
37+ import com.soneso.stellar.sdk.xdr.Uint256Xdr
2738import kotlinx.coroutines.test.runTest
2839import kotlin.test.Test
2940import kotlin.test.assertEquals
@@ -1124,4 +1135,45 @@ class ContextRuleParsingTest {
11241135 }
11251136 assertTrue(ex.message!! .contains(" context_type" ), " Exception message should mention 'context_type'" )
11261137 }
1138+
1139+ // ========================================================================
1140+ // resolveContextRuleIdsForEntry — executables without a WASM hash
1141+ // ========================================================================
1142+
1143+ @Test
1144+ fun testResolveContextRuleIds_createContractWithExternalRefExecutable_throwsValidationException () = runTest {
1145+ val kit = createConnectedKit()
1146+ val manager = kit.contextRuleManager
1147+
1148+ val entry = SorobanAuthorizationEntryXdr (
1149+ credentials = SorobanCredentialsXdr .Void ,
1150+ rootInvocation = SorobanAuthorizedInvocationXdr (
1151+ function = SorobanAuthorizedFunctionXdr .CreateContractHostFn (
1152+ CreateContractArgsXdr (
1153+ contractIdPreimage = ContractIDPreimageXdr .FromAddress (
1154+ ContractIDPreimageFromAddressXdr (
1155+ address = Address (validContractAddress).toSCAddress(),
1156+ salt = Uint256Xdr (ByteArray (32 ))
1157+ )
1158+ ),
1159+ executable = ContractExecutableXdr .ExternalRef (
1160+ ContractExecutableExternalRefXdr (
1161+ executableOwner = Address (validContractAddress2).toSCAddress(),
1162+ tag = SCStringXdr (" my-tag" )
1163+ )
1164+ )
1165+ )
1166+ ),
1167+ subInvocations = emptyList()
1168+ )
1169+ )
1170+
1171+ val ex = assertFailsWith<ValidationException .InvalidInput > {
1172+ manager.resolveContextRuleIdsForEntry(entry, emptyList(), emptyList())
1173+ }
1174+ assertTrue(
1175+ ex.message!! .contains(" external executable" ),
1176+ " Exception message should name the external executable"
1177+ )
1178+ }
11271179}
0 commit comments