diff --git a/.changeset/slimy-owls-matter.md b/.changeset/slimy-owls-matter.md
new file mode 100644
index 00000000..201949c6
--- /dev/null
+++ b/.changeset/slimy-owls-matter.md
@@ -0,0 +1,5 @@
+---
+"chainlink-deployments-framework": patch
+---
+
+fix(mcms): render proposal parameters in collapsible code blocks
diff --git a/engine/cld/mcms/proposalanalysis/engine_test.go b/engine/cld/mcms/proposalanalysis/engine_test.go
index 491f5222..9d652a93 100644
--- a/engine/cld/mcms/proposalanalysis/engine_test.go
+++ b/engine/cld/mcms/proposalanalysis/engine_test.go
@@ -277,32 +277,40 @@ func TestAnalyzerEngineE2E_RunAndRenderMarkdown(t *testing.T) {
}, analyzed)
require.NoError(t, err)
- expected := `## Proposal — mcms (staging)
-
-
-
-_Annotations:_
-- proposal.note: generated by analyzer
-
-
-Batch 1 — ethereum-testnet-sepolia (16015286601757825753)
-
-
-#### Call 1
-
-- [ ] ` + "`native_transfer`" + `
-
-**Target:** ` + "`0x1234567890123456789012345678901234567890`" + `
-
-**Inputs:**
-
-- **` + "`recipient`" + `** (` + "`AddressField`" + `): 0x1234567890123456789012345678901234567890
-- **` + "`amount_wei`" + `** (` + "`SimpleField`" + `): 1000000000000000000
-- **` + "`amount_eth`" + `** (` + "`SimpleField`" + `): 1.000000000000000000
-
-
-
-`
+ expected := "## Proposal — mcms (staging)\n\n\n\n" +
+ "_Annotations:_\n" +
+ "- proposal.note: generated by analyzer\n\n" +
+ "\n" +
+ "Batch 1 — ethereum-testnet-sepolia (16015286601757825753)
\n\n\n" +
+ "#### Call 1\n\n" +
+ "- [ ] `native_transfer`\n\n" +
+ "**Target:** `0x1234567890123456789012345678901234567890`\n\n" +
+ "**Inputs:**\n\n" +
+ "- **`recipient`** (`AddressField`):\n" +
+ " \n" +
+ " Value
\n" +
+ "\n" +
+ " ```text\n" +
+ " 0x1234567890123456789012345678901234567890\n" +
+ " ```\n" +
+ " \n" +
+ "- **`amount_wei`** (`SimpleField`):\n" +
+ " \n" +
+ " Value
\n" +
+ "\n" +
+ " ```text\n" +
+ " 1000000000000000000\n" +
+ " ```\n" +
+ " \n" +
+ "- **`amount_eth`** (`SimpleField`):\n" +
+ " \n" +
+ " Value
\n" +
+ "\n" +
+ " ```text\n" +
+ " 1.000000000000000000\n" +
+ " ```\n" +
+ " \n\n\n" +
+ " \n"
require.Equal(t, expected, out.String())
}
diff --git a/engine/cld/mcms/proposalanalysis/examples/ccip/analyzers/tokenpool/testdata/golden_markdown.md b/engine/cld/mcms/proposalanalysis/examples/ccip/analyzers/tokenpool/testdata/golden_markdown.md
index 9f9f8afd..545bf3f9 100644
--- a/engine/cld/mcms/proposalanalysis/examples/ccip/analyzers/tokenpool/testdata/golden_markdown.md
+++ b/engine/cld/mcms/proposalanalysis/examples/ccip/analyzers/tokenpool/testdata/golden_markdown.md
@@ -13,8 +13,22 @@
**Inputs:**
-- **`remoteChainSelectorsToRemove`** (`uint64[]`):
-- **`chainsToAdd`** (`tuple[]`): (decoded)
+- **`remoteChainSelectorsToRemove`** (`uint64[]`):
+
+ Value
+
+ ```text
+
+ ```
+
+- **`chainsToAdd`** (`tuple[]`):
+
+ Value
+
+ ```text
+ (decoded)
+ ```
+
**Changes:**
@@ -41,8 +55,22 @@ _Annotations:_
**Inputs:**
-- **`remoteChainSelectorsToRemove`** (`uint64[]`): [ 3734025351759498498 ]
-- **`chainsToAdd`** (`tuple[]`):
+- **`remoteChainSelectorsToRemove`** (`uint64[]`):
+
+ Value
+
+ ```text
+ [ 3734025351759498498 ]
+ ```
+
+- **`chainsToAdd`** (`tuple[]`):
+
+ Value
+
+ ```text
+
+ ```
+
_Annotations:_
diff --git a/engine/cld/mcms/proposalanalysis/renderer/funcmap.go b/engine/cld/mcms/proposalanalysis/renderer/funcmap.go
index 723539be..b84496c7 100644
--- a/engine/cld/mcms/proposalanalysis/renderer/funcmap.go
+++ b/engine/cld/mcms/proposalanalysis/renderer/funcmap.go
@@ -34,7 +34,6 @@ func defaultFuncMap() template.FuncMap {
"diffAnnotations": diffAnnotations,
"renderDiff": renderDiff,
"formatParam": formatParam,
- "hasNewline": hasNewline,
"indentLines": indentLines,
"formatAnnotationValue": formatAnnotationValue,
"resolveChainSelector": resolveChainSelector,
@@ -87,10 +86,6 @@ func formatParam(param analyzer.AnalyzedParameter) string {
return v
}
-func hasNewline(s string) bool {
- return strings.Contains(s, "\n")
-}
-
func indentLines(s, prefix string) string {
if s == "" {
return ""
diff --git a/engine/cld/mcms/proposalanalysis/renderer/templates/markdown/parameter.tmpl b/engine/cld/mcms/proposalanalysis/renderer/templates/markdown/parameter.tmpl
index 67ef817e..b5466cc3 100644
--- a/engine/cld/mcms/proposalanalysis/renderer/templates/markdown/parameter.tmpl
+++ b/engine/cld/mcms/proposalanalysis/renderer/templates/markdown/parameter.tmpl
@@ -1,13 +1,13 @@
{{- define "parameter" -}}
{{- $formatted := formatParam . -}}
-{{- if hasNewline $formatted -}}
- **`{{ .Name }}`** (`{{ .Type }}`):
+
+ Value
+
```text
{{ indentLines $formatted " " }}
```
-{{- else -}}
-- **`{{ .Name }}`** (`{{ .Type }}`): {{ $formatted }}
-{{- end -}}
+
{{- if hasDisplayAnnotations .Annotations -}}
{{- range .Annotations -}}
{{- if not (isFrameworkAnnotation .Name) }}
diff --git a/engine/cld/mcms/proposalanalysis/renderer/testdata/golden_markdown.md b/engine/cld/mcms/proposalanalysis/renderer/testdata/golden_markdown.md
index 28e6e694..52937d53 100644
--- a/engine/cld/mcms/proposalanalysis/renderer/testdata/golden_markdown.md
+++ b/engine/cld/mcms/proposalanalysis/renderer/testdata/golden_markdown.md
@@ -17,12 +17,43 @@ _Annotations:_
**Inputs:**
-- **`target`** (`address`): 0xAbCdEf1234567890abcdef1234567890abcdef12
+- **`target`** (`address`):
+
+ Value
+
+ ```text
+ 0xAbCdEf1234567890abcdef1234567890abcdef12
+ ```
+
- _label: destination contract_
-- **`amount`** (`uint256`): 1,000,000,000,000,000,000
-- **`enabled`** (`bool`): true
-- **`proof`** (`bytes`): 0xdeadbeef
+- **`amount`** (`uint256`):
+
+ Value
+
+ ```text
+ 1,000,000,000,000,000,000
+ ```
+
+- **`enabled`** (`bool`):
+
+ Value
+
+ ```text
+ true
+ ```
+
+- **`proof`** (`bytes`):
+
+ Value
+
+ ```text
+ 0xdeadbeef
+ ```
+
- **`destChainConfigArgs`** (`((uint64,(bool,uint16,uint32,uint32,uint32,uint8,uint8,uint16,uint32,uint16,uint16,bytes4,bool,uint16,uint32,uint32,uint64,uint32,uint32))[])`):
+
+ Value
+
```text
[
{
@@ -51,6 +82,7 @@ _Annotations:_
}
]
```
+
- _note: multi-chain destination configuration_
@@ -71,8 +103,22 @@ _Annotations:_
**Inputs:**
-- **`to`** (`address`): 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
-- **`value`** (`uint256`): 500
+- **`to`** (`address`):
+
+ Value
+
+ ```text
+ 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
+ ```
+
+- **`value`** (`uint256`):
+
+ Value
+
+ ```text
+ 500
+ ```
+