Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
7c2a01b
feat(superset): add SupersetFacet v1.0.0
gvladika May 20, 2026
4290e48
refactor(superset): unify hub + spoke into single facet with chain-id…
gvladika May 20, 2026
f5c0580
chore(superset): simplify demo to hardcoded params, no protocol details
gvladika May 25, 2026
6589815
refactor(superset): drop native source asset support
gvladika May 25, 2026
6cd8fec
refactor(superset): refund source-side native + leftovers to refundAd…
gvladika May 27, 2026
990b349
refactor(superset): enforce lzFee sufficiency in shared validation
gvladika May 27, 2026
cd081c2
refactor(superset): facet cleanup — named args + tighter error model
gvladika May 28, 2026
9ca0cb2
refactor(superset-demo): organize as scenario record + CLI flag
gvladika May 28, 2026
79afee0
refactor(superset-demo): quote ETH→USDC pre-swap at runtime via Unisw…
gvladika May 28, 2026
191494c
refactor(superset-demo): switch w-swap scenario to WETH→exact-USDC vi…
gvladika May 28, 2026
714942d
chore(superset-demo): record executed-run tx hashes + clean-EOA fallback
gvladika May 28, 2026
272663a
pr-ready: remove stale Non-EVM Destinations section (docs/SupersetFac…
gvladika May 28, 2026
3cd6bb9
pr-ready: add destination-call rejection test (test/solidity/Facets/S…
gvladika May 28, 2026
14bcd44
refactor(superset-test): exercise the real Base spoke instead of a mock
gvladika May 28, 2026
d8a7ad4
feat(SupersetFacet): add chainId↔lzEid mapping with destination valid…
gvladika May 29, 2026
a45effd
pr-ready: fix hub refundAddress guidance (docs/SupersetFacet.md:97)
gvladika May 29, 2026
2e15237
pr-ready: reject empty supersetData.path early (src/Facets/SupersetFa…
gvladika May 29, 2026
254b353
pr-ready: comment test-only inputToken extraction (test/solidity/Face…
gvladika May 29, 2026
37ad6c4
pr-ready: unit-test amountOutMin positive-slippage math (test/solidit…
gvladika May 29, 2026
fe17c14
refactor(SupersetFacet): drop the lzEid+1 offset
gvladika May 29, 2026
704fdc5
refactor(SupersetFacet): drop unsetChainIdToEid
gvladika May 29, 2026
8327426
refactor(SupersetFacet): use InvalidConfig for destinationChainId↔toE…
gvladika May 29, 2026
974f939
refactor(superset-test): replace mock spoke with vm.mockCall/expectCall
gvladika May 29, 2026
0c325df
refactor(SupersetFacet): collapse _chainIdToEid into public getChainI…
gvladika May 29, 2026
6944bd5
Update staging logs
gvladika May 29, 2026
fb35b41
Update demo script reference TXs
gvladika May 29, 2026
026c6ef
chore(clear-signing): regenerate after adding SupersetFacet
gvladika May 29, 2026
2201082
refactor(SupersetFacet): use standard for-loop increment
gvladika May 29, 2026
f007ded
docs(superset-interfaces): drop private-repo URL from NatSpec
gvladika May 29, 2026
e65b56b
Update deployment logs
gvladika May 29, 2026
621f5df
pr-ready: align doc with InvalidConfig revert (docs/SupersetFacet.md:52)
gvladika May 29, 2026
18ec27a
pr-ready: clarify hub-vs-spoke refundAddress semantics (src/Facets/Su…
gvladika May 29, 2026
f31fe09
pr-ready: cover setChainIdToEid update path (test/solidity/Facets/Sup…
gvladika May 29, 2026
b8d0777
Merge branch 'main' into worktree-superset-tech-assessment
gvladika May 29, 2026
7c23053
pr-ready: clarify initSuperset is a diamondCut one-shot (docs/Superse…
gvladika May 29, 2026
f186e4d
pr-ready: fast-fail on stale deadline at source (src/Facets/SupersetF…
gvladika Jun 2, 2026
1793a6a
pr-ready: drop Superset testnet config (config/superset.json:3)
gvladika Jun 2, 2026
ec6566a
pr-ready: emit per-entry ChainIdToEidSet in initSuperset (src/Facets/…
gvladika Jun 2, 2026
5ddd19c
pr-ready: clarify amountOutMin vs amountOutMinPercent (src/Facets/Sup…
gvladika Jun 2, 2026
49e6e86
pr-ready: document EIP-7702 fallbackEoA limitation (docs/SupersetFace…
gvladika Jun 2, 2026
57a2bee
pr-ready: switch to absolute-amount positive-slippage scaling (src/Fa…
gvladika Jun 2, 2026
d597a34
pr-ready: collapse DeadlineExpired into InvalidConfig (src/Facets/Sup…
gvladika Jun 2, 2026
04f003d
pr-ready: note EIP-7702 limitation on fallbackEoA param (src/Facets/S…
gvladika Jun 2, 2026
df89f3f
Merge remote-tracking branch 'origin/main' into worktree-superset-tec…
gvladika Jun 3, 2026
c5c35a0
chore(demo): refresh Superset quote values and exercise positive-slip…
gvladika Jun 3, 2026
4fa6aed
chore(superset): repin SupersetFacet on staging + refresh demo for po…
gvladika Jun 3, 2026
1e7b135
chore(superset): document source for PoolManager addresses
gvladika Jun 8, 2026
3b2df2b
refactor(errors): add DeadlineExpired for in-flight timeout reverts
gvladika Jun 8, 2026
6baa3f1
Merge remote-tracking branch 'origin/main' into worktree-superset-tec…
gvladika Jun 23, 2026
75c67ac
Merge remote-tracking branch 'origin/main' into worktree-superset-tec…
0xDEnYO Jun 29, 2026
070e2bb
fix(SupersetFacet): bind path input token to bridgeData.sendingAssetId
gvladika Jul 1, 2026
bfd3488
fix(SupersetFacet): reject zero amountOutMin slippage floor
gvladika Jul 1, 2026
2c0e442
fix(SupersetFacet): reject zero chainId/lzEid in admin config
gvladika Jul 1, 2026
2a6f8f3
docs(SupersetFacet): note amountOutMin scaling is conservative
gvladika Jul 1, 2026
02191ea
fix(SupersetFacet): use solady mulDiv for amountOutMin scaling
gvladika Jul 1, 2026
57c5169
Merge branch 'main' into worktree-superset-tech-assessment
gvladika Jul 1, 2026
865f12e
chore(clear-signing): regenerate proposal after main merge
gvladika Jul 1, 2026
6e741ed
chore(audit): add SupersetFacet v1.0.0 security review (Sujith Somraaj)
gvladika Jul 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion audit/auditLog.json
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,13 @@
"auditorGitHandle": "sujithsomraaj",
"auditReportPath": "./audit/reports/2026.06.30_LiFiIntentEscrowFacetV2(v1.0.0).pdf",
"auditCommitHash": "11aad2677a9434cd394eb9ab98e3fb23d078e50f"
},
"audit20260701": {
"auditCompletedOn": "01.07.2026",
"auditedBy": "Sujith Somraaj (individual security researcher)",
"auditorGitHandle": "sujithsomraaj",
"auditReportPath": "./audit/reports/2026.07.01_SupersetFacet(v1.0.0).pdf",
"auditCommitHash": "6baa3f128eae77d4aa1db1985651607b4a1ac72e"
}
},
"auditedContracts": {
Expand Down Expand Up @@ -748,7 +755,8 @@
},
"GenericErrors": {
"1.0.1": ["audit20250506", "audit20250508"],
"1.0.2": ["audit20250718"]
"1.0.2": ["audit20250718"],
"1.0.4": ["audit20260701"]
},
"GenericSwapFacet": {
"1.0.0": ["audit20250508"]
Expand Down Expand Up @@ -981,6 +989,9 @@
"StargateFacetV2": {
"1.0.1": ["audit20240814", "audit20250508"]
},
"SupersetFacet": {
"1.0.0": ["audit20260701"]
},
"SwapperV2": {
"1.0.0": ["audit20250508"],
"1.0.1": ["audit20250718"],
Expand Down
Binary file not shown.
66 changes: 34 additions & 32 deletions bun.lock

Large diffs are not rendered by default.

165 changes: 164 additions & 1 deletion config/clearSigningProposal.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$note": "ERC-7730 display.formats entries for the LIFI Diamond, generated by tasks/buildClearSigningProposal.ts from Foundry artifacts. Source of truth for clear-signing UX strings. Consumed by tasks/generateLedgerClearSigning.ts during the sync workflow: entries here are merged into the registry payload pushed to ethereum/clear-signing-erc7730-registry.",
"$count": 103,
"$count": 105,
"formats": {
"startBridgeTokensViaAcross((bytes32 transactionId, string bridge, string integrator, address referrer, address sendingAssetId, address receiver, uint256 minAmount, uint256 destinationChainId, bool hasSourceSwaps, bool hasDestinationCall) _bridgeData, (int64 relayerFeePct, uint32 quoteTimestamp, bytes message, uint256 maxCount) _acrossData)": {
"intent": "Bridge via Across",
Expand Down Expand Up @@ -2309,6 +2309,73 @@
}
]
},
"startBridgeTokensViaSuperset((bytes32 transactionId, string bridge, string integrator, address referrer, address sendingAssetId, address receiver, uint256 minAmount, uint256 destinationChainId, bool hasSourceSwaps, bool hasDestinationCall) _bridgeData, (bytes path, uint256 amountOutMin, address refundAddress, address fallbackEoA, uint256 deadline, uint32 toEid, bytes options, uint256 lzFee) _supersetData)": {
"intent": "Bridge via Superset",
"interpolatedIntent": "Bridge {_bridgeData.minAmount} via Superset to chain {_bridgeData.destinationChainId} for {_bridgeData.receiver}",
"fields": [
{
"path": "_bridgeData.minAmount",
"label": "Amount to Bridge",
"format": "tokenAmount",
"params": {
"tokenPath": "_bridgeData.sendingAssetId"
},
"visible": "always"
},
{
"path": "_bridgeData.destinationChainId",
"label": "Destination Chain",
"format": "raw",
"visible": "always"
},
{
"path": "_bridgeData.receiver",
"label": "Recipient",
"format": "addressName",
"params": {
"types": [
"eoa",
"contract"
],
"sources": [
"local",
"ens"
]
},
"visible": "always"
},
{
"path": "_bridgeData.transactionId",
"label": "Transaction Id",
"visible": "never"
},
{
"path": "_bridgeData.bridge",
"label": "Bridge",
"visible": "never"
},
{
"path": "_bridgeData.integrator",
"label": "Integrator",
"visible": "never"
},
{
"path": "_bridgeData.referrer",
"label": "Referrer",
"visible": "never"
},
{
"path": "_bridgeData.hasSourceSwaps",
"label": "Has Source Swaps",
"visible": "never"
},
{
"path": "_bridgeData.hasDestinationCall",
"label": "Has Destination Call",
"visible": "never"
}
]
},
"startBridgeTokensViaSymbiosis((bytes32 transactionId, string bridge, string integrator, address referrer, address sendingAssetId, address receiver, uint256 minAmount, uint256 destinationChainId, bool hasSourceSwaps, bool hasDestinationCall) _bridgeData, (bytes firstSwapCalldata, bytes secondSwapCalldata, address intermediateToken, address firstDexRouter, address secondDexRouter, address[] approvedTokens, address callTo, bytes callData) _symbiosisData)": {
"intent": "Bridge via Symbiosis",
"interpolatedIntent": "Bridge {_bridgeData.minAmount} via Symbiosis to chain {_bridgeData.destinationChainId} for {_bridgeData.receiver}",
Expand Down Expand Up @@ -5678,6 +5745,102 @@
}
]
},
"swapAndStartBridgeTokensViaSuperset((bytes32 transactionId, string bridge, string integrator, address referrer, address sendingAssetId, address receiver, uint256 minAmount, uint256 destinationChainId, bool hasSourceSwaps, bool hasDestinationCall) _bridgeData, (address callTo, address approveTo, address sendingAssetId, address receivingAssetId, uint256 fromAmount, bytes callData, bool requiresDeposit)[] _swapData, (bytes path, uint256 amountOutMin, address refundAddress, address fallbackEoA, uint256 deadline, uint32 toEid, bytes options, uint256 lzFee) _supersetData)": {
"intent": "Swap & Bridge via Superset",
"interpolatedIntent": "Swap then bridge {_bridgeData.minAmount} via Superset to chain {_bridgeData.destinationChainId} for {_bridgeData.receiver}",
"fields": [
{
"path": "_swapData.[0].fromAmount",
"label": "Amount to Swap",
"format": "tokenAmount",
"params": {
"tokenPath": "_swapData.[0].sendingAssetId"
},
"visible": "always"
},
{
"path": "_bridgeData.minAmount",
"label": "Minimum to Bridge",
"format": "tokenAmount",
"params": {
"tokenPath": "_bridgeData.sendingAssetId"
},
"visible": "always"
},
{
"path": "_bridgeData.destinationChainId",
"label": "Destination Chain",
"format": "raw",
"visible": "always"
},
{
"path": "_bridgeData.receiver",
"label": "Recipient",
"format": "addressName",
"params": {
"types": [
"eoa",
"contract"
],
"sources": [
"local",
"ens"
]
},
"visible": "always"
},
{
"path": "_bridgeData.transactionId",
"label": "Transaction Id",
"visible": "never"
},
{
"path": "_bridgeData.bridge",
"label": "Bridge",
"visible": "never"
},
{
"path": "_bridgeData.integrator",
"label": "Integrator",
"visible": "never"
},
{
"path": "_bridgeData.referrer",
"label": "Referrer",
"visible": "never"
},
{
"path": "_bridgeData.hasSourceSwaps",
"label": "Has Source Swaps",
"visible": "never"
},
{
"path": "_bridgeData.hasDestinationCall",
"label": "Has Destination Call",
"visible": "never"
},
{
"path": "_swapData.[].callData",
"label": "Swap Data Call Data",
"visible": "never"
},
{
"path": "_swapData.[].callTo",
"label": "Swap Data Call To",
"visible": "never"
},
{
"path": "_swapData.[].approveTo",
"label": "Swap Data Approve To",
"visible": "never"
},
{
"path": "_swapData.[].requiresDeposit",
"label": "Swap Data Requires Deposit",
"visible": "never"
}
]
},
"swapAndStartBridgeTokensViaSymbiosis((bytes32 transactionId, string bridge, string integrator, address referrer, address sendingAssetId, address receiver, uint256 minAmount, uint256 destinationChainId, bool hasSourceSwaps, bool hasDestinationCall) _bridgeData, (address callTo, address approveTo, address sendingAssetId, address receivingAssetId, uint256 fromAmount, bytes callData, bool requiresDeposit)[] _swapData, (bytes firstSwapCalldata, bytes secondSwapCalldata, address intermediateToken, address firstDexRouter, address secondDexRouter, address[] approvedTokens, address callTo, bytes callData) _symbiosisData)": {
"intent": "Swap & Bridge via Symbiosis",
"interpolatedIntent": "Swap then bridge {_bridgeData.minAmount} via Symbiosis to chain {_bridgeData.destinationChainId} for {_bridgeData.receiver}",
Expand Down
15 changes: 15 additions & 0 deletions config/superset.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"IMPORTANT DEV NOTICE": "after adding a new mapping, call initSuperset (first deploy) or setChainIdToEid (incremental update) on every diamond where SupersetFacet is deployed",
"Source for LayerZero EIDs: https://docs.layerzero.network/v2/deployments/deployed-contracts": {},
"Source for Superset PoolManager addresses: https://github.com/superset-finance/deployments/blob/main/manifests/mainnet.json": {},
"poolManager": {
"arbitrum": "0xcC687ed9155F5e49719D5f3147F79FD5F177961c",
"base": "0x57C155a15a9CA0A6C1F759ac6988b4fCa3663Ea4",
"unichain": "0x326D0B0357b394EC5bbeFE87554243E5dc76e56E"
},
Comment thread
mirooon marked this conversation as resolved.
"mappings": [
{ "chainId": 42161, "lzEid": 30110 },
{ "chainId": 8453, "lzEid": 30184 },
{ "chainId": 130, "lzEid": 30320 }
]
Comment thread
mirooon marked this conversation as resolved.
}
3 changes: 2 additions & 1 deletion deployments/arbitrum.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,6 @@
"ReceiverOIF": "0x55C74AdB64A9C11EFA5637dF58AC17Bc77D5c911",
"WhitelistRecoveryFacet": "0xd35fC069dcBD50780c706750A41AfC418f25f5D6",
"EcoFacet": "0x532CEdcf24B769EA6dB2D6970220C38b15C9fAF2",
"FeeForwarder": "0x7C1923FbD89154156DE2220870C834B141bA8c49"
"FeeForwarder": "0x7C1923FbD89154156DE2220870C834B141bA8c49",
"SupersetFacet": "0x54AEC552Acc3218b0B3991FD61cA12b3A4fD222D"
}
3 changes: 2 additions & 1 deletion deployments/base.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,6 @@
"FeeCollector": "0x8354CdFA9FD680e53a4AAAecbf7dfB22665c36Ec",
"ERC20Proxy": "0xC87e9C07db776bd167bEFc3a6d46797BCf343313",
"Executor": "0xaD2cc66a7dC1e5adFE4419355D8b128845E77f04",
"ReceiverOIF": "0xa89c674d04E44AD24D38298097e94281BF93f9AD"
"ReceiverOIF": "0xa89c674d04E44AD24D38298097e94281BF93f9AD",
"SupersetFacet": "0x54AEC552Acc3218b0B3991FD61cA12b3A4fD222D"
}
Loading
Loading