Skip to content

Proposal: L1SenderV2 adapterParams maintenance — review @DavidAJohnston · exec Smart Agents · credit @rcondron #65

Description

@EnergyHound

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.

Revert 0x6592671c…0000 = LZ_ULN_InvalidWorkerOptions(0)
DepositPool 0x47176B2Af9885dC6C4575d4eFd63895f7Aaa4790
Examples 0x8f42b692…c201 · 0x246674a2…86aa

Call path:
DepositPool.claimDistributorV2L1SenderV2.sendMintMessage → Endpoint V1 send()SendUln301 → revert.


Root cause

  1. L1SenderV2 always passes layerZeroConfig.adapterParams into ILayerZeroEndpoint.send().
  2. Live adapterParams are empty (length 0).
  3. App never set its own send version → follows Endpoint default send version 4 (SendUln301).
  4. UltraLightNodeV2 accepted empty params and defaulted dest gas to 200k type-1.
  5. SendUln301 does not: UlnOptions.decode reverts if options.length < 2.
Check Value
L1SenderV2 0x2Efd4430489e1a05A89c2f51811aC661B7E5FF84 (layerZeroConfig / #F3 — surface @rcondron flagged)
Owner 0x1FE04BC15Cf2c5A2d41a0b3a96725596676eBa1E (Safe; threshold 5)
Live routing gateway Endpoint V1 · receiver L2MessageReceiver Arb · chainId 110 · zro 0x0leave unchanged
Last success (ULNv2) 0x2f73519b…8314 (block 25678531)

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

V1 adapter parameters (type-1 packing, 200k example) https://docs.layerzero.network/v1/developers/evm/evm-guides/advanced/relayer-adapter-parameters
Error codes (InvalidWorkerOptions, legacy type-1) https://docs.layerzero.network/v2/developers/evm/troubleshooting/error-messages
L1SenderV2 config (read) https://etherscan.io/address/0x2Efd4430489e1a05A89c2f51811aC661B7E5FF84#readProxyContract#F3

Checklist

@DavidAJohnston — review

  • Agree root cause (empty adapterParams under SendUln301)
  • Agree payload: keep live gateway/receiver/110/zro; type-1 200k (or state 250k)
  • ACK / NACK in a comment

Smart Agents — after ACK

  • Simulate owner tx (Safe / Tenderly)
  • Execute setLayerZeroConfig from owner multisig
  • Re-read layerZeroConfig()adapterParams length 34
  • Canary claim → confirm MOR mint on Arbitrum
  • Optional: scan other Endpoint-V1 OApps for empty adapterParams

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions