From cdb92d65b1eb46c2fd4029b9a05e1aacd3b6cd29 Mon Sep 17 00:00:00 2001 From: Lesnak1 Date: Mon, 19 Oct 2026 22:21:56 +0300 Subject: [PATCH] fix(oft-evm-upgradeable): align sharedDecimals mutability with IOFT and OFTCore Align the state mutability of sharedDecimals() in OFTCoreUpgradeable from pure to view. In the IOFT interface, sharedDecimals() is declared as external view returns (uint8). Similarly, in all other implementations across the LayerZero V2 ecosystem (OFTCore, OFTAltCore, OFTAltCoreUpgradeable), sharedDecimals() is defined as public view virtual. Because Solidity forbids overriding a pure virtual function with a view function, declaring sharedDecimals() as pure in OFTCoreUpgradeable blocked custom upgradeable implementations from overriding sharedDecimals() to read contract state (e.g. from storage/initializer). Fixes #1954 --- .changeset/oft-upgradeable-shared-decimals-view.md | 5 +++++ .../contracts/oft/OFTCoreUpgradeable.sol | 2 +- packages/oft-evm-upgradeable/test/OFT.t.sol | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/oft-upgradeable-shared-decimals-view.md diff --git a/.changeset/oft-upgradeable-shared-decimals-view.md b/.changeset/oft-upgradeable-shared-decimals-view.md new file mode 100644 index 0000000000..a02fdf935f --- /dev/null +++ b/.changeset/oft-upgradeable-shared-decimals-view.md @@ -0,0 +1,5 @@ +--- +"@layerzerolabs/oft-evm-upgradeable": patch +--- + +Align `sharedDecimals()` mutability in `OFTCoreUpgradeable` from `pure` to `view`, matching the `IOFT` interface and `OFTCore` implementations. diff --git a/packages/oft-evm-upgradeable/contracts/oft/OFTCoreUpgradeable.sol b/packages/oft-evm-upgradeable/contracts/oft/OFTCoreUpgradeable.sol index a88eb895d7..37bad18b8b 100644 --- a/packages/oft-evm-upgradeable/contracts/oft/OFTCoreUpgradeable.sol +++ b/packages/oft-evm-upgradeable/contracts/oft/OFTCoreUpgradeable.sol @@ -118,7 +118,7 @@ abstract contract OFTCoreUpgradeable is * For tokens exceeding this totalSupply(), they will need to override the sharedDecimals function with something smaller. * ie. 4 sharedDecimals would be 1,844,674,407,370,955.1615 */ - function sharedDecimals() public pure virtual returns (uint8) { + function sharedDecimals() public view virtual returns (uint8) { return 6; } diff --git a/packages/oft-evm-upgradeable/test/OFT.t.sol b/packages/oft-evm-upgradeable/test/OFT.t.sol index a5d61112d2..644b967dcb 100644 --- a/packages/oft-evm-upgradeable/test/OFT.t.sol +++ b/packages/oft-evm-upgradeable/test/OFT.t.sol @@ -555,4 +555,10 @@ contract OFTTest is TestHelperOz5 { vm.expectRevert(abi.encodeWithSelector(IOAppMsgInspector.InspectionFailed.selector, message, extraOptions)); (message, ) = aOFT.buildMsgAndOptions(sendParam, amountToCreditLD); } + + function test_shared_decimals_view() public view { + assertEq(aOFT.sharedDecimals(), 6); + assertEq(bOFT.sharedDecimals(), 6); + assertEq(cOFTAdapter.sharedDecimals(), 6); + } }