Proposal for review: L1SenderV2 LayerZero adapterParams maintenance
Reviewer: @DavidAJohnston
Execution (when approved): Smart Agents via owner multisig
Diagnosis / payload: @rcondron
Author of this write-up: EnergyHound (docs only)
Decision requested from @DavidAJohnston: ACK / NACK (or ACK with preferred dest gas) on the owner config below.
This issue documents the maintenance item. Smart Agents execute after review; no contract upgrade.
Summary
|
|
| What |
Owner call: L1SenderV2.setLayerZeroConfig — set non-empty type-1 adapterParams |
| Why |
Endpoint V1 default send library is SendUln301 (v4). Empty options now revert; ULNv2 used to inject 200k silently |
| Impact if not done |
Ethereum MOR claim() paths that mint via LZ keep reverting |
| Funds |
No loss — full L1 revert; only gas spent |
| Upgrade? |
No |
| User self-fix? |
No — params are contract state |
Symptom
Since ~2026-08-05, L1 MOR reward claims that cross to Arbitrum via LayerZero fail.
Call path:
DepositPool.claim → DistributorV2 → L1SenderV2.sendMintMessage → Endpoint V1 send() → SendUln301 → revert.
Root cause
L1SenderV2 always passes layerZeroConfig.adapterParams into ILayerZeroEndpoint.send().
- Live
adapterParams are empty (length 0).
- App never set its own send version → follows Endpoint default send version 4 (SendUln301).
- UltraLightNodeV2 accepted empty params and defaulted dest gas to 200k type-1.
- SendUln301 does not:
UlnOptions.decode reverts if options.length < 2.
Quote check: estimateFees with empty options → same revert; with type-1 34-byte 200k → ~0.000048 ETH.
Proposed maintenance (@rcondron)
Keep all live routing fields. Write type-1 adapter params only:
// onlyOwner — L1SenderV2
setLayerZeroConfig({
gateway: 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675, // Endpoint V1 (ETH)
receiver: 0xd4a8ECcBe696295e68572A98b1aa70Aa9277d427, // L2MessageReceiver (Arb)
receiverChainId: 110,
zroPaymentAddress: address(0),
adapterParams: /* type-1, exactly 34 bytes, 200_000 gas */
});
adapterParams (recommended: 200k = historical ULNv2 default):
0x00010000000000000000000000000000000000000000000000000000000000030d40
ethers.utils.solidityPack(['uint16', 'uint256'], [1, 200000])
| Detail |
|
| Encoding rule |
Type-1 must be exactly 34 bytes or ULN301 reverts InvalidLegacyType1Option |
| Fees |
~0.000048 ETH at 200k; frontend typically 0.0005–0.002 ETH (excess refunded) |
| Optional |
250000 → …03d090 (safer dest gas; ~0.000001 ETH more). Can re-run maintenance later; only affects new messages |
| Scope |
All sendMintMessage paths (standard / referrer / batch claims) |
| Not an alternative without upgrade |
Pin old send library — L1SenderV2 has no setSendVersion |
Calldata (200k) for Safe / simulation:
To: 0x2Efd4430489e1a05A89c2f51811aC661B7E5FF84
Value: 0
Data:
0x73ff24fd000000000000000000000000000000000000000000000000000000000000002000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000d4a8eccbe696295e68572a98b1aa70aa9277d427000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002200010000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000
LayerZero references
Checklist
@DavidAJohnston — review
Smart Agents — after ACK
Decision line
Propose: ACK type-1 200k as specified by @rcondron; Smart Agents execute owner maintenance.
@DavidAJohnston — please reply ACK, ACK + prefer 250k, or NACK + reason.
Proposal for review: L1SenderV2 LayerZero
adapterParamsmaintenanceReviewer: @DavidAJohnston
Execution (when approved): Smart Agents via owner multisig
Diagnosis / payload: @rcondron
Author of this write-up: EnergyHound (docs only)
Decision requested from @DavidAJohnston: ACK / NACK (or ACK with preferred dest gas) on the owner config below.
This issue documents the maintenance item. Smart Agents execute after review; no contract upgrade.
Summary
L1SenderV2.setLayerZeroConfig— set non-empty type-1adapterParamsclaim()paths that mint via LZ keep revertingSymptom
Since ~2026-08-05, L1 MOR reward claims that cross to Arbitrum via LayerZero fail.
0x6592671c…0000=LZ_ULN_InvalidWorkerOptions(0)0x47176B2Af9885dC6C4575d4eFd63895f7Aaa47900x8f42b692…c201·0x246674a2…86aaCall path:
DepositPool.claim→DistributorV2→L1SenderV2.sendMintMessage→ Endpoint V1send()→ SendUln301 → revert.Root cause
L1SenderV2always passeslayerZeroConfig.adapterParamsintoILayerZeroEndpoint.send().adapterParamsare empty (length 0).UlnOptions.decodereverts ifoptions.length < 2.0x2Efd4430489e1a05A89c2f51811aC661B7E5FF84(layerZeroConfig/ #F3 — surface @rcondron flagged)0x1FE04BC15Cf2c5A2d41a0b3a96725596676eBa1E(Safe; threshold 5)0x0— leave unchanged0x2f73519b…8314(block 25678531)Quote check:
estimateFeeswith empty options → same revert; with type-1 34-byte 200k → ~0.000048 ETH.Proposed maintenance (@rcondron)
Keep all live routing fields. Write type-1 adapter params only:
adapterParams(recommended: 200k = historical ULNv2 default):InvalidLegacyType1Option250000→…03d090(safer dest gas; ~0.000001 ETH more). Can re-run maintenance later; only affects new messagessendMintMessagepaths (standard / referrer / batch claims)setSendVersionCalldata (200k) for Safe / simulation:
LayerZero references
InvalidWorkerOptions, legacy type-1)Checklist
@DavidAJohnston — review
adapterParamsunder SendUln301)110/zro; type-1 200k (or state 250k)Smart Agents — after ACK
setLayerZeroConfigfrom owner multisiglayerZeroConfig()—adapterParamslength 34claim→ confirm MOR mint on ArbitrumadapterParamsDecision line
Propose: ACK type-1 200k as specified by @rcondron; Smart Agents execute owner maintenance.
@DavidAJohnston — please reply ACK, ACK + prefer 250k, or NACK + reason.