addContextRule

suspend fun addContextRule(contextType: ContextRuleType, name: String, validUntil: UInt? = null, signers: List<SmartAccountSigner>, policies: Map<String, SCValXdr> = emptyMap(), selectedSigners: List<SelectedSigner> = emptyList(), forceMethod: SubmissionMethod? = null): TransactionResult

Adds a new context rule to the smart account.

Creates a context rule that defines authorization requirements for operations matching the specified context type. The rule includes signers who can authorize matching operations and policies that constrain how operations can be executed.

Flow:

  1. Validates inputs (name, signers count, policies count, policy addresses)

  2. Builds contract invocation for add_context_rule

  3. Simulates to get auth entries

  4. Signs auth entries (requires user interaction)

  5. Submits transaction

  6. Polls for confirmation

Contract limits enforced:

  • Maximum 15 signers per context rule

  • Maximum 5 policies per context rule

IMPORTANT: This is a state-changing operation requiring smart account authorization. The user will be prompted for biometric authentication.

Return

TransactionResult indicating success or failure

Parameters

contextType

The type of context this rule applies to

name

A human-readable name for the rule (e.g., "DefaultRule", "TokenTransfers")

validUntil

Optional ledger number when this rule expires (null = no expiration)

signers

List of signers who can authorize operations matching this context

policies

Map of policy contract addresses to their installation parameters

selectedSigners

Optional list of signers for multi-signer authorization. When empty (default), uses single-signer auth with the connected passkey. When non-empty, coordinates signatures from all listed signers.

forceMethod

Optional submission method override. When null (default), uses the configured submission method (relayer if available, RPC otherwise).

Throws

if validation fails

if transaction submission fails

Example:

val result = contextMgr.addContextRule(
contextType = ContextRuleType.CallContract("CBCD1234..."),
name = "TokenOps",
validUntil = 12345678u,
signers = listOf(webAuthnSigner, delegatedSigner),
policies = mapOf(
thresholdPolicyAddress to Scv.toU32(2u),
spendingLimitPolicyAddress to limitScVal
)
)
if (result.success) {
println("Context rule added. Hash: ${result.hash ?: ""}")
}