Skip to content

Commit 175094b

Browse files
Harden smart account context rule tests for external executables
Reject a createContract invocation whose executable is an external reference during context rule resolution, asserting the validation error names the external executable.
1 parent d2ec8f4 commit 175094b

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

stellar-sdk/src/commonTest/kotlin/com/soneso/stellar/sdk/unitTests/smartaccount/ContextRuleParsingTest.kt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,20 @@ import com.soneso.stellar.sdk.smartaccount.oz.OZContextRuleManager
2121
import com.soneso.stellar.sdk.smartaccount.oz.OZSmartAccountConfig
2222
import com.soneso.stellar.sdk.smartaccount.oz.OZSmartAccountKit
2323
import 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
2429
import com.soneso.stellar.sdk.xdr.SCMapEntryXdr
2530
import com.soneso.stellar.sdk.xdr.SCMapXdr
31+
import com.soneso.stellar.sdk.xdr.SCStringXdr
2632
import 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
2738
import kotlinx.coroutines.test.runTest
2839
import kotlin.test.Test
2940
import 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

Comments
 (0)