Skip to content

flare: add clear-signing descriptors for WNat, FXRP, and correct PollingFoundation owner - #2982

Closed
fassko wants to merge 6 commits into
ethereum:masterfrom
fassko:flare-descriptors
Closed

fassko wants to merge 6 commits into
ethereum:masterfrom
fassko:flare-descriptors

Conversation

@fassko

@fassko fassko commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Add calldata descriptors and tests for WNat (wrap/unwrap/transfer) on Flare and Songbird
  • Add calldata descriptors and tests for FXRP-related contracts (AssetManager, FAsset, MintingTagManager, RewardManager) on Flare and Songbird
  • Correct the owner on the two unattested PollingFoundation descriptors to "Flare Foundation"

Test plan

  • CI descriptor validation passes
  • Reviewed generated calldata descriptors against contract ABIs

@github-actions

github-actions Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Clear Signing Tests

Tested 0a28107 · started 2026-09-14 10:11 UTC · finished 2026-09-14 10:12 UTC

Entity Descriptor Case @ethereum-sourcify/clear-signing@0.2.2 llbartekll/clear-signing@0.1.0
flare calldata-AssetManager-FXRP-Flare Redeem 10 FXRP by amount - chain 14 ✅ ❌
flare calldata-AssetManager-FXRP-Flare Redeem 10 FXRP with destination tag - chain 14 ✅ ❌
flare calldata-AssetManager-FXRP-Flare Redemption payment default - chain 14 ❌ ✅
flare calldata-AssetManager-FXRP-Flare Execute direct minting - chain 14 ❌ ❌
flare calldata-AssetManager-FXRP-Flare Execute direct minting with data - chain 14 ❌ ❌
flare calldata-AssetManager-FXRP-Songbird Redeem 10 FXRP by amount - chain 19 ✅ ❌
flare calldata-AssetManager-FXRP-Songbird Redeem 10 FXRP with destination tag - chain 19 ✅ ❌
flare calldata-AssetManager-FXRP-Songbird Redemption payment default - chain 19 ❌ ✅
flare calldata-AssetManager-FXRP-Songbird Execute direct minting - chain 19 ❌ ❌
flare calldata-AssetManager-FXRP-Songbird Execute direct minting with data - chain 19 ❌ ❌
flare calldata-DistributionToDelegators-Flare Claim month 12 wrapped - chain 14 ✅ ✅
flare calldata-DistributionToDelegators-Flare Batch claim month 12 - chain 14 ✅ ✅
flare calldata-DistributionToDelegators-Flare Opt out of airdrop - chain 14 ✅ ✅
flare calldata-FAsset-FXRP-Flare Send 1 FXRP - chain 14 ✅ ✅
flare calldata-FAsset-FXRP-Flare Approve 10 FXRP for AssetManager - chain 14 ✅ ✅
flare calldata-FAsset-FXRP-Songbird Send 1 FXRP - chain 19 ✅ ✅
flare calldata-FAsset-FXRP-Songbird Approve 10 FXRP for AssetManager - chain 19 ✅ ✅
flare calldata-MintingTagManager-FXRP-Flare Reserve minting tag - chain 14 ✅ ❌
flare calldata-MintingTagManager-FXRP-Flare Set mint recipient for tag 1 - chain 14 ✅ ✅
flare calldata-MintingTagManager-FXRP-Flare Set mint executor for tag 1 - chain 14 ✅ ✅
flare calldata-MintingTagManager-FXRP-Flare Transfer minting tag 1 - chain 14 ✅ ✅
flare calldata-MintingTagManager-FXRP-Songbird Reserve minting tag - chain 19 ✅ ❌
flare calldata-MintingTagManager-FXRP-Songbird Set mint recipient for tag 1 - chain 19 ✅ ✅
flare calldata-MintingTagManager-FXRP-Songbird Set mint executor for tag 1 - chain 19 ✅ ✅
flare calldata-MintingTagManager-FXRP-Songbird Transfer minting tag 1 - chain 19 ✅ ✅
flare calldata-PollingFoundation-Flare Cast vote For - chain 14 ✅ ✅
flare calldata-PollingFoundation-Flare Cast vote Against - chain 14 ✅ ✅
flare calldata-PollingFoundation-Flare Create proposal with execution - chain 14 ✅ ❌
flare calldata-PollingFoundation-Flare Create proposal without execution - chain 14 ✅ ✅
flare calldata-PollingFoundation-Songbird Cast vote For - chain 19 ✅ ✅
flare calldata-PollingFoundation-Songbird Cast vote Against - chain 19 ✅ ✅
flare calldata-PollingFoundation-Songbird Create proposal with execution - chain 19 ✅ ❌
flare calldata-PollingFoundation-Songbird Create proposal without execution - chain 19 ✅ ✅
flare calldata-ValidatorRewardManager-Flare Claim 1 FLR wrapped - chain 14 ✅ ❌
flare calldata-ValidatorRewardManager-Flare Set claim executor - chain 14 ✅ ✅
flare calldata-ValidatorRewardManager-Flare Set allowed claim recipient - chain 14 ✅ ✅
flare calldata-WNat-Flare Wrap 1 FLR - chain 14 ✅ ❌
flare calldata-WNat-Flare Wrap 1 FLR to recipient - chain 14 ✅ ❌
flare calldata-WNat-Flare Unwrap 1 WFLR - chain 14 ✅ ✅
flare calldata-WNat-Flare Unwrap 1 WFLR from owner - chain 14 ✅ ✅
flare calldata-WNat-Flare Send 1 WFLR - chain 14 ✅ ✅
flare calldata-WNat-Flare Approve 10 WFLR - chain 14 ✅ ✅
flare calldata-WNat-Flare Delegate 100% FTSO vote power - chain 14 ✅ ✅
flare calldata-WNat-Flare Delegate 1 WFLR explicitly - chain 14 ✅ ✅
flare calldata-WNat-Flare Batch delegate FTSO vote power - chain 14 ✅ ✅
flare calldata-WNat-Flare Undelegate FTSO vote power - chain 14 ✅ ✅
flare calldata-WNat-Flare Undelegate explicit providers - chain 14 ✅ ✅
flare calldata-WNat-Songbird Wrap 1 SGB - chain 19 ✅ ❌
flare calldata-WNat-Songbird Wrap 1 SGB to recipient - chain 19 ✅ ❌
flare calldata-WNat-Songbird Unwrap 1 WSGB - chain 19 ✅ ✅
flare calldata-WNat-Songbird Unwrap 1 WSGB from owner - chain 19 ✅ ✅
flare calldata-WNat-Songbird Send 1 WSGB - chain 19 ✅ ✅
flare calldata-WNat-Songbird Approve 10 WSGB - chain 19 ✅ ✅
flare calldata-WNat-Songbird Delegate 100% FTSO vote power - chain 19 ✅ ✅
flare calldata-WNat-Songbird Delegate 1 WSGB explicitly - chain 19 ✅ ✅
flare calldata-WNat-Songbird Undelegate FTSO vote power - chain 19 ✅ ✅
flare calldata-WNat-Songbird Undelegate explicit providers - chain 19 ✅ ✅

✅ pass · ❌ fail · ⚠️ error · ⏭️ skipped · — not run

Details

❌ flare/calldata-AssetManager-FXRP-Flare · Redeem 10 FXRP by amount - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [3] "Executor Fee": expected "0 FLR", got "0 ETH"

Expected:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "0x0000000000000000000000000000000000000000"
    },
    {
      "label": "Executor Fee",
      "value": "0 FLR"
    }
  ]
}

Got:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "0x0000000000000000000000000000000000000000"
    },
    {
      "label": "Executor Fee",
      "value": "0 ETH"
    }
  ]
}
❌ flare/calldata-AssetManager-FXRP-Flare · Redeem 10 FXRP with destination tag - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [4] "Executor Fee": expected "1 FLR", got "1 ETH"

Expected:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "Executor"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "1 FLR"
    }
  ]
}

Got:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "Executor"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "1 ETH"
    }
  ]
}
❌ flare/calldata-AssetManager-FXRP-Flare · Redemption payment default - chain 14 · `@ethereum-sourcify/clear-signing@0.2.2`

intent mismatch: expected "claim redemption default", got "" (library warnings: UNSUPPORTED_NESTED_FIELD_GROUP: Nested field groups are not supported)

Expected:

{
  "intent": "claim redemption default",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Request ID",
      "value": "777"
    },
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "Deadline",
      "value": "2025-06-15 16:06:40Z"
    }
  ]
}

Got:

{
  "intent": "",
  "fields": []
}
❌ flare/calldata-AssetManager-FXRP-Flare · Execute direct minting - chain 14 · `@ethereum-sourcify/clear-signing@0.2.2`

intent mismatch: expected "execute minting", got "" (library warnings: UNSUPPORTED_NESTED_FIELD_GROUP: Nested field groups are not supported)

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 FLR"
    }
  ]
}

Got:

{
  "intent": "",
  "fields": []
}
❌ flare/calldata-AssetManager-FXRP-Flare · Execute direct minting - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [3] "Executor Fee": expected "0.5 FLR", got "0.5 ETH"

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 FLR"
    }
  ]
}

Got:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 ETH"
    }
  ]
}
❌ flare/calldata-AssetManager-FXRP-Flare · Execute direct minting with data - chain 14 · `@ethereum-sourcify/clear-signing@0.2.2`

intent mismatch: expected "execute minting", got "" (library warnings: UNSUPPORTED_NESTED_FIELD_GROUP: Nested field groups are not supported)

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 FLR"
    },
    {
      "label": "User Op",
      "value": "0xdeadbeef"
    }
  ]
}

Got:

{
  "intent": "",
  "fields": []
}
❌ flare/calldata-AssetManager-FXRP-Flare · Execute direct minting with data - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [3] "Executor Fee": expected "0.5 FLR", got "0.5 ETH"

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 FLR"
    },
    {
      "label": "User Op",
      "value": "0xdeadbeef"
    }
  ]
}

Got:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 ETH"
    },
    {
      "label": "User Op",
      "value": "0xdeadbeef"
    }
  ]
}
❌ flare/calldata-AssetManager-FXRP-Songbird · Redeem 10 FXRP by amount - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [3] "Executor Fee": expected "0 SGB", got "0 ETH"

Expected:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "0x0000000000000000000000000000000000000000"
    },
    {
      "label": "Executor Fee",
      "value": "0 SGB"
    }
  ]
}

Got:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "0x0000000000000000000000000000000000000000"
    },
    {
      "label": "Executor Fee",
      "value": "0 ETH"
    }
  ]
}
❌ flare/calldata-AssetManager-FXRP-Songbird · Redeem 10 FXRP with destination tag - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [4] "Executor Fee": expected "1 SGB", got "1 ETH"

Expected:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "Executor"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "1 SGB"
    }
  ]
}

Got:

{
  "intent": "redeem FXRP",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRP Address",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Executor",
      "value": "Executor"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "1 ETH"
    }
  ]
}
❌ flare/calldata-AssetManager-FXRP-Songbird · Redemption payment default - chain 19 · `@ethereum-sourcify/clear-signing@0.2.2`

intent mismatch: expected "claim redemption default", got "" (library warnings: UNSUPPORTED_NESTED_FIELD_GROUP: Nested field groups are not supported)

Expected:

{
  "intent": "claim redemption default",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Request ID",
      "value": "777"
    },
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "Deadline",
      "value": "2025-06-15 16:06:40Z"
    }
  ]
}

Got:

{
  "intent": "",
  "fields": []
}
❌ flare/calldata-AssetManager-FXRP-Songbird · Execute direct minting - chain 19 · `@ethereum-sourcify/clear-signing@0.2.2`

intent mismatch: expected "execute minting", got "" (library warnings: UNSUPPORTED_NESTED_FIELD_GROUP: Nested field groups are not supported)

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 SGB"
    }
  ]
}

Got:

{
  "intent": "",
  "fields": []
}
❌ flare/calldata-AssetManager-FXRP-Songbird · Execute direct minting - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [3] "Executor Fee": expected "0.5 SGB", got "0.5 ETH"

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 SGB"
    }
  ]
}

Got:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 ETH"
    }
  ]
}
❌ flare/calldata-AssetManager-FXRP-Songbird · Execute direct minting with data - chain 19 · `@ethereum-sourcify/clear-signing@0.2.2`

intent mismatch: expected "execute minting", got "" (library warnings: UNSUPPORTED_NESTED_FIELD_GROUP: Nested field groups are not supported)

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 SGB"
    },
    {
      "label": "User Op",
      "value": "0xdeadbeef"
    }
  ]
}

Got:

{
  "intent": "",
  "fields": []
}
❌ flare/calldata-AssetManager-FXRP-Songbird · Execute direct minting with data - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [3] "Executor Fee": expected "0.5 SGB", got "0.5 ETH"

Expected:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 SGB"
    },
    {
      "label": "User Op",
      "value": "0xdeadbeef"
    }
  ]
}

Got:

{
  "intent": "execute minting",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "10 FXRP"
    },
    {
      "label": "XRPL Source",
      "value": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"
    },
    {
      "label": "Dest Tag",
      "value": "42"
    },
    {
      "label": "Executor Fee",
      "value": "0.5 ETH"
    },
    {
      "label": "User Op",
      "value": "0xdeadbeef"
    }
  ]
}
❌ flare/calldata-MintingTagManager-FXRP-Flare · Reserve minting tag - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [0] "Reservation Fee": expected "1 FLR", got "1 ETH"

Expected:

{
  "intent": "reserve minting tag",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Reservation Fee",
      "value": "1 FLR"
    }
  ]
}

Got:

{
  "intent": "reserve minting tag",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Reservation Fee",
      "value": "1 ETH"
    }
  ]
}
❌ flare/calldata-MintingTagManager-FXRP-Songbird · Reserve minting tag - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [0] "Reservation Fee": expected "1 SGB", got "1 ETH"

Expected:

{
  "intent": "reserve minting tag",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Reservation Fee",
      "value": "1 SGB"
    }
  ]
}

Got:

{
  "intent": "reserve minting tag",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Reservation Fee",
      "value": "1 ETH"
    }
  ]
}
❌ flare/calldata-PollingFoundation-Flare · Create proposal with execution - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [1] "Values": expected "1 FLR", got "1 ETH"

Expected:

{
  "intent": "create proposal",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Targets",
      "value": "Proposal Target"
    },
    {
      "label": "Values",
      "value": "1 FLR"
    },
    {
      "label": "Calldatas",
      "value": "0x12345678"
    },
    {
      "label": "Description",
      "value": "Fund the grants program"
    },
    {
      "label": "Accept",
      "value": "true"
    },
    {
      "label": "Voting Start",
      "value": "2025-06-15 15:06:40Z"
    },
    {
      "label": "Voting Period",
      "value": "168:00:00"
    },
    {
      "label": "Vp Block Period",
      "value": "24:00:00"
    },
    {
      "label": "Threshold (bps)",
      "value": "7500bps"
    },
    {
      "label": "Majority (bps)",
      "value": "5000bps"
    },
    {
      "label": "Execution Delay",
      "value": "01:00:00"
    },
    {
      "label": "Execution Period",
      "value": "72:00:00"
    }
  ]
}

Got:

{
  "intent": "create proposal",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Targets",
      "value": "Proposal Target"
    },
    {
      "label": "Values",
      "value": "1 ETH"
    },
    {
      "label": "Calldatas",
      "value": "0x12345678"
    },
    {
      "label": "Description",
      "value": "Fund the grants program"
    },
    {
      "label": "Accept",
      "value": "true"
    },
    {
      "label": "Voting Start",
      "value": "2025-06-15 15:06:40Z"
    },
    {
      "label": "Voting Period",
      "value": "168:00:00"
    },
    {
      "label": "Vp Block Period",
      "value": "24:00:00"
    },
    {
      "label": "Threshold (bps)",
      "value": "7500bps"
    },
    {
      "label": "Majority (bps)",
      "value": "5000bps"
    },
    {
      "label": "Execution Delay",
      "value": "01:00:00"
    },
    {
      "label": "Execution Period",
      "value": "72:00:00"
    }
  ]
}
❌ flare/calldata-PollingFoundation-Songbird · Create proposal with execution - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [1] "Values": expected "1 SGB", got "1 ETH"

Expected:

{
  "intent": "create proposal",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Targets",
      "value": "Proposal Target"
    },
    {
      "label": "Values",
      "value": "1 SGB"
    },
    {
      "label": "Calldatas",
      "value": "0x12345678"
    },
    {
      "label": "Description",
      "value": "Fund the grants program"
    },
    {
      "label": "Accept",
      "value": "true"
    },
    {
      "label": "Voting Start Ts",
      "value": "2025-06-15 15:06:40Z"
    },
    {
      "label": "Voting Period",
      "value": "168:00:00"
    },
    {
      "label": "Vp Block Period",
      "value": "24:00:00"
    },
    {
      "label": "Threshold",
      "value": "7500bps"
    },
    {
      "label": "Majority",
      "value": "5000bps"
    },
    {
      "label": "Execution Delay",
      "value": "01:00:00"
    },
    {
      "label": "Execution Period",
      "value": "72:00:00"
    }
  ]
}

Got:

{
  "intent": "create proposal",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Targets",
      "value": "Proposal Target"
    },
    {
      "label": "Values",
      "value": "1 ETH"
    },
    {
      "label": "Calldatas",
      "value": "0x12345678"
    },
    {
      "label": "Description",
      "value": "Fund the grants program"
    },
    {
      "label": "Accept",
      "value": "true"
    },
    {
      "label": "Voting Start Ts",
      "value": "2025-06-15 15:06:40Z"
    },
    {
      "label": "Voting Period",
      "value": "168:00:00"
    },
    {
      "label": "Vp Block Period",
      "value": "24:00:00"
    },
    {
      "label": "Threshold",
      "value": "7500bps"
    },
    {
      "label": "Majority",
      "value": "5000bps"
    },
    {
      "label": "Execution Delay",
      "value": "01:00:00"
    },
    {
      "label": "Execution Period",
      "value": "72:00:00"
    }
  ]
}
❌ flare/calldata-ValidatorRewardManager-Flare · Claim 1 FLR wrapped - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [2] "Reward Amount": expected "1 FLR", got "1 ETH"

Expected:

{
  "intent": "Claim/Wrap Reward",
  "owner": "Flare Labs",
  "fields": [
    {
      "label": "Reward Owner",
      "value": "Reward Owner"
    },
    {
      "label": "Recipient",
      "value": "Recipient"
    },
    {
      "label": "Reward Amount",
      "value": "1 FLR"
    },
    {
      "label": "Wrap",
      "value": "true"
    }
  ]
}

Got:

{
  "intent": "Claim/Wrap Reward",
  "owner": "Flare Labs",
  "fields": [
    {
      "label": "Reward Owner",
      "value": "Reward Owner"
    },
    {
      "label": "Recipient",
      "value": "Recipient"
    },
    {
      "label": "Reward Amount",
      "value": "1 ETH"
    },
    {
      "label": "Wrap",
      "value": "true"
    }
  ]
}
❌ flare/calldata-WNat-Flare · Wrap 1 FLR - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [0] "Amount": expected "1 FLR", got "1 ETH"

Expected:

{
  "intent": "Wrap FLR",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 FLR"
    }
  ]
}

Got:

{
  "intent": "Wrap FLR",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 ETH"
    }
  ]
}
❌ flare/calldata-WNat-Flare · Wrap 1 FLR to recipient - chain 14 · `llbartekll/clear-signing@0.1.0`

field value at [0] "Amount": expected "1 FLR", got "1 ETH"

Expected:

{
  "intent": "Wrap FLR",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 FLR"
    },
    {
      "label": "To",
      "value": "Recipient"
    }
  ]
}

Got:

{
  "intent": "Wrap FLR",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 ETH"
    },
    {
      "label": "To",
      "value": "Recipient"
    }
  ]
}
❌ flare/calldata-WNat-Songbird · Wrap 1 SGB - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [0] "Amount": expected "1 SGB", got "1 ETH"

Expected:

{
  "intent": "Wrap SGB",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 SGB"
    }
  ]
}

Got:

{
  "intent": "Wrap SGB",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 ETH"
    }
  ]
}
❌ flare/calldata-WNat-Songbird · Wrap 1 SGB to recipient - chain 19 · `llbartekll/clear-signing@0.1.0`

field value at [0] "Amount": expected "1 SGB", got "1 ETH"

Expected:

{
  "intent": "Wrap SGB",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 SGB"
    },
    {
      "label": "To",
      "value": "Recipient"
    }
  ]
}

Got:

{
  "intent": "Wrap SGB",
  "owner": "Flare Foundation",
  "fields": [
    {
      "label": "Amount",
      "value": "1 ETH"
    },
    {
      "label": "To",
      "value": "Recipient"
    }
  ]
}

📋 View test details

@github-actions github-actions Bot added the descriptors Changes to clear signing descriptors label Sep 14, 2026
@github-actions

github-actions Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Clear signing recommendations

These are suggestions. They do not block this pull request.

49 format(s) have no interpolatedIntent. A wallet prefers it over intent, because it puts the values of the transaction in the sentence that the signer reads.

  • registry/flare/calldata-AssetManager-FXRP-Flare.json — redeemAmount(uint256 _amountUBA, string _redeemerUnderlyingAddressString, address _executor)
  • registry/flare/calldata-AssetManager-FXRP-Flare.json — redeemWithTag(uint256 _amountUBA, string _redeemerUnderlyingAddressString, address _executor, uint256 _destinationTag)
  • registry/flare/calldata-AssetManager-FXRP-Flare.json — redemptionPaymentDefault((bytes32[] merkleProof, (bytes32 attestationType, bytes32 sourceId, uint64 votingRound, uint64 lowestUsedTimestamp, (uint64 minimalBlockNumber, uint64 deadlineBlockNumber, uin
  • registry/flare/calldata-AssetManager-FXRP-Flare.json — executeDirectMinting((bytes32[] merkleProof, (bytes32 attestationType, bytes32 sourceId, uint64 votingRound, uint64 lowestUsedTimestamp, (bytes32 transactionId, address proofOwner) requestBody, (uint6
  • registry/flare/calldata-AssetManager-FXRP-Flare.json — executeDirectMintingWithData((bytes32[] merkleProof, (bytes32 attestationType, bytes32 sourceId, uint64 votingRound, uint64 lowestUsedTimestamp, (bytes32 transactionId, address proofOwner) requestBody
  • registry/flare/calldata-AssetManager-FXRP-Songbird.json — redeemAmount(uint256 _amountUBA, string _redeemerUnderlyingAddressString, address _executor)
  • registry/flare/calldata-AssetManager-FXRP-Songbird.json — redeemWithTag(uint256 _amountUBA, string _redeemerUnderlyingAddressString, address _executor, uint256 _destinationTag)
  • registry/flare/calldata-AssetManager-FXRP-Songbird.json — redemptionPaymentDefault((bytes32[] merkleProof, (bytes32 attestationType, bytes32 sourceId, uint64 votingRound, uint64 lowestUsedTimestamp, (uint64 minimalBlockNumber, uint64 deadlineBlockNumber, uin
  • registry/flare/calldata-AssetManager-FXRP-Songbird.json — executeDirectMinting((bytes32[] merkleProof, (bytes32 attestationType, bytes32 sourceId, uint64 votingRound, uint64 lowestUsedTimestamp, (bytes32 transactionId, address proofOwner) requestBody, (uint6
  • registry/flare/calldata-AssetManager-FXRP-Songbird.json — executeDirectMintingWithData((bytes32[] merkleProof, (bytes32 attestationType, bytes32 sourceId, uint64 votingRound, uint64 lowestUsedTimestamp, (bytes32 transactionId, address proofOwner) requestBody
  • registry/flare/calldata-FAsset-FXRP-Flare.json — transfer(address to, uint256 amount)
  • registry/flare/calldata-FAsset-FXRP-Flare.json — approve(address spender, uint256 amount)
  • registry/flare/calldata-FAsset-FXRP-Songbird.json — transfer(address to, uint256 amount)
  • registry/flare/calldata-FAsset-FXRP-Songbird.json — approve(address spender, uint256 amount)
  • registry/flare/calldata-MintingTagManager-FXRP-Flare.json — reserve()
  • registry/flare/calldata-MintingTagManager-FXRP-Flare.json — setMintingRecipient(uint256 _mintingTag, address _recipient)
  • registry/flare/calldata-MintingTagManager-FXRP-Flare.json — setAllowedExecutor(uint256 _mintingTag, address _executor)
  • registry/flare/calldata-MintingTagManager-FXRP-Flare.json — transfer(address _to, uint256 _mintingTag)
  • registry/flare/calldata-MintingTagManager-FXRP-Songbird.json — reserve()
  • registry/flare/calldata-MintingTagManager-FXRP-Songbird.json — setMintingRecipient(uint256 _mintingTag, address _recipient)
  • registry/flare/calldata-MintingTagManager-FXRP-Songbird.json — setAllowedExecutor(uint256 _mintingTag, address _executor)
  • registry/flare/calldata-MintingTagManager-FXRP-Songbird.json — transfer(address _to, uint256 _mintingTag)
  • registry/flare/calldata-WNat-Flare.json — deposit()
  • registry/flare/calldata-WNat-Flare.json — depositTo(address recipient)
  • registry/flare/calldata-WNat-Flare.json — withdraw(uint256 amount)
  • registry/flare/calldata-WNat-Flare.json — withdrawFrom(address owner, uint256 amount)
  • registry/flare/calldata-WNat-Flare.json — transfer(address recipient, uint256 amount)
  • registry/flare/calldata-WNat-Flare.json — approve(address spender, uint256 amount)
  • registry/flare/calldata-WNat-Flare.json — delegate(address _to, uint256 _bips)
  • registry/flare/calldata-WNat-Flare.json — delegateExplicit(address _to, uint256 _amount)
  • registry/flare/calldata-WNat-Flare.json — batchDelegate(address[] _delegatees, uint256[] _bips)
  • registry/flare/calldata-WNat-Flare.json — undelegateAll()
  • registry/flare/calldata-WNat-Flare.json — undelegateAllExplicit(address[] _delegateAddresses)
  • registry/flare/calldata-WNat-Songbird.json — deposit()
  • registry/flare/calldata-WNat-Songbird.json — depositTo(address recipient)
  • registry/flare/calldata-WNat-Songbird.json — withdraw(uint256 amount)
  • registry/flare/calldata-WNat-Songbird.json — withdrawFrom(address owner, uint256 amount)
  • registry/flare/calldata-WNat-Songbird.json — transfer(address recipient, uint256 amount)
  • registry/flare/calldata-WNat-Songbird.json — approve(address spender, uint256 amount)
  • registry/flare/calldata-WNat-Songbird.json — delegate(address _to, uint256 _bips)
  • registry/flare/calldata-WNat-Songbird.json — delegateExplicit(address _to, uint256 _amount)
  • registry/flare/calldata-WNat-Songbird.json — undelegateAll()
  • registry/flare/calldata-WNat-Songbird.json — undelegateAllExplicit(address[] _delegateAddresses)
  • registry/flare/calldata-PollingFoundation-Flare.json — castVote(uint256 _proposalId, uint8 _support)
  • registry/flare/calldata-PollingFoundation-Flare.json — propose(address[] _targets, uint256[] _values, bytes[] _calldatas, string _description, (bool accept, uint256 votingStartTs, uint256 votingPeriodSeconds, uint256 vpBlockPeriodSeconds, uint256 threshol
  • registry/flare/calldata-PollingFoundation-Flare.json — propose(string _description, (bool accept, uint256 votingStartTs, uint256 votingPeriodSeconds, uint256 vpBlockPeriodSeconds, uint256 thresholdConditionBIPS, uint256 majorityConditionBIPS) _settings)
  • registry/flare/calldata-PollingFoundation-Songbird.json — castVote(uint256 _proposalId, uint8 _support)
  • registry/flare/calldata-PollingFoundation-Songbird.json — propose(address[] _targets, uint256[] _values, bytes[] _calldatas, string _description, (bool accept, uint256 votingStartTs, uint256 votingPeriodSeconds, uint256 vpBlockPeriodSeconds, uint256 threshol
  • registry/flare/calldata-PollingFoundation-Songbird.json — propose(string _description, (bool accept, uint256 votingStartTs, uint256 votingPeriodSeconds, uint256 vpBlockPeriodSeconds, uint256 thresholdConditionBIPS, uint256 majorityConditionBIPS) _settings)

fassko and others added 4 commits September 14, 2026 11:38
The two PollingFoundation descriptors carry no auditor attestation, so
the owner string can still be corrected in place. The four attested
descriptors keep "Flare Labs" until they are re-attested.
…Flare and Songbird

- Introduced calldata descriptors for AssetManager, FAsset, MintingTagManager, and RewardManager for both Flare and Songbird networks.
- Updated ownership metadata to reflect "Flare Foundation" across relevant descriptors.
- Added test cases for each new descriptor to ensure functionality and correctness in transaction intents and expected outputs.
- Introduced calldata descriptors for WNat-Flare and WNat-Songbird, including contract metadata and transaction formats for wrapping, unwrapping, and transferring tokens.
- Added test cases for each descriptor to validate transaction intents and expected outputs, ensuring functionality across both networks.
- Updated ownership metadata to reflect "Flare Foundation" for both WNat contracts.
DistributionToDelegators-Flare, RewardManager-Flare/Songbird, and
ValidatorRewardManager-Flare already carry auditor attestations, so CI
rejects any in-place edits to them. Restore their original content;
the owner-rename and formatting changes were unintentional carryover
from the FXRP commit and aren't needed for this PR.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fassko and others added 2 commits September 14, 2026 12:06
The rebase brought in the new selector-coverage check, which requires a
test for every function of a changed descriptor. Adds the missing cases:
both propose() overloads on PollingFoundation, setAllowedExecutor and
transfer on MintingTagManager, and redeemWithTag, redemptionPaymentDefault,
executeDirectMinting and executeDirectMintingWithData on AssetManager —
the last three carrying hand-encoded FDC Merkle proofs.

DistributionToDelegators and ValidatorRewardManager keep "Flare Labs" in
their expectations, because the attestation on those descriptors blocks
the owner rename until an auditor re-signs them.

The Executor Fee expectations read FLR/SGB rather than the ETH the Rust
runner prints today; llbartekll/clear-signing#15 adds the missing chain
entries that make it so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ethereum-sourcify/clear-signing renders nothing for these two
descriptors — UNSUPPORTED_NESTED_FIELD_GROUP — so the tests cannot pass
against them. Flattening the paths would fix it, but an auditor has
attested both files and the index allows only one descriptor per
(chainId, address), so a versioned second file is not an option either.

Removing the tests keeps this pull request to descriptors that render.
The underlying gap needs a maintainer decision on how an attested but
unrenderable descriptor gets replaced.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fassko

fassko commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Two issues here are outside this PR, and I'd appreciate guidance on both.

1. The Rust runner has no native currency for Flare

native_token_meta in llbartekll/clear-signing has no entry for chains 14 / 19, so it falls through to the ("ETH", "Ether") default and every format: amount field on Flare renders as ETH:

Reward Amount = 1 ETH     # should be 1 FLR
Executor Fee  = 0 ETH     # should be 0 FLR

The Sourcify runner resolves against chainid.network and already gets this right, so the two runners disagree on these chains — which is why the Sourcify jobs pass and the Rust jobs fail on exactly these fields.

Fix: llbartekll/clear-signing#15. I've kept the expectations in this PR at FLR/SGB, verified against a local build of that branch (57/57 green). .github/actions/run-rust-tests/action.yml pins 10605ba, so the Rust jobs here stay red until that pin moves — could you bump it once the upstream PR merges?

2. An attested descriptor that no implementation can render

calldata-RewardManager-{Flare,Songbird}.json use nested field groups. @ethereum-sourcify/clear-signing@0.2.2 rejects them outright — UNSUPPORTED_NESTED_FIELD_GROUP, rendering {"intent": "", "fields": []} — so no test can pass against these descriptors as written.

Flattening the paths fixes it, but that runs into a dead end:

  • both files are attested, so the descriptor cannot be edited in place;
  • the error suggests adding a new descriptor file instead, but generate-index.js throws Duplicate calldata deployment because each (chainId, address) may map to only one calldata descriptor, and the replacement would reuse the same address.

So the versioned-file route doesn't apply when the address is unchanged. I've dropped the RewardManager tests from this PR to keep it to descriptors that render — but the descriptors themselves are still unrenderable on master. What's the intended path for replacing an attested descriptor at the same address? Happy to prepare it either way.

🤖 Generated with Claude Code

@fassko

fassko commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Splitting this into two smaller PRs for focused review: #2983 (WNat, clean — no attested files touched) and #2984 (FXRP + PollingFoundation owner rename + the RewardManager question). Closing this one in favor of those.

🤖 Generated with Claude Code

@fassko fassko closed this Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

descriptors Changes to clear signing descriptors

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant