Overflow in curate() function, results in permanently stuck funds
The `Axis-Finance` protocol has a curate() function that can be used to set a certain fee to a curator set by the seller for a certain auction. Typically, a curator is providing some service to an auction seller to help the sale succeed. This could be doing diligence on the project and `vouching` for them, or something simpler, such as listing the auction on a popular interface. A lot of memecoins have a big supply in the trillions, for example SHIBA INU has a total supply of nearly 1000 trillion tokens and each token has 18 decimals. With a lot of new memecoins emerging every day due to the favorable bullish conditions and having supply in the trillions, it is safe to assume that such protocols will interact with the `Axis-Finance` protocol. Creating auctions for big amounts, and promising big fees to some celebrities or influencers to promote their project. The funding parameter in the Routing struct is of type `uint96`\\n```\\n    struct Routing {\\n        // rest of code\\n        uint96 funding; \\n        // rest of code\\n    }\\n```\\n\\nThe max amount of tokens with 18 decimals a `uint96` variable can hold is around 80 billion. The problem arises in the curate() function, If the auction is prefunded, which all batch auctions are( a normal FPAM auction can also be prefunded), and the amount of prefunded tokens is big enough, close to 80 billion tokens with 18 decimals, and the curator fee is for example 7.5%, when the `curatorFeePayout` is added to the current funding, the funding will overflow.\\n```\\nunchecked {\\n   routing.funding += curatorFeePayout;\\n}\\n```\\n\\nGist After following the steps in the above mentioned gist, add the following test to the `AuditorTests.t.sol`\\n```\\nfunction test_CuratorFeeOverflow() public {\\n        vm.startPrank(alice);\\n        Veecode veecode = fixedPriceAuctionModule.VEECODE();\\n        Keycode keycode = keycodeFromVeecode(veecode);\\n        bytes memory _derivativeParams = "";\\n        uint96 lotCapacity = 75_000_000_000e18; // this is 75 billion tokens\\n        mockBaseToken.mint(alice, 100_000_000_000e18);\\n        mockBaseToken.approve(address(auctionHouse), type(uint256).max);\\n\\n        FixedPriceAuctionModule.FixedPriceParams  memory myStruct = FixedPriceAuctionModule.FixedPriceParams({\\n            price: uint96(1e18),\\n            maxPayoutPercent: uint24(1e5)\\n        });\\n\\n        Auctioneer.RoutingParams memory routingA = Auctioneer.RoutingParams({\\n            auctionType: keycode,\\n            baseToken: mockBaseToken,\\n            quoteToken: mockQuoteToken,\\n            curator: curator,\\n            callbacks: ICallback(address(0)),\\n            callbackData: abi.encode(""),\\n            derivativeType: toKeycode(""),\\n            derivativeParams: _derivativeParams,\\n            wrapDerivative: false,\\n            prefunded: true\\n        });\\n\\n        Auction.AuctionParams memory paramsA = Auction.AuctionParams({\\n            start: 0,\\n            duration: 1 days,\\n            capacityInQuote: false,\\n            capacity: lotCapacity,\\n            implParams: abi.encode(myStruct)\\n        });\\n\\n        string memory infoHashA;\\n        auctionHouse.auction(routingA, paramsA, infoHashA);       \\n        vm.stopPrank();\\n\\n        vm.startPrank(owner);\\n        FeeManager.FeeType type_ = FeeManager.FeeType.MaxCurator;\\n        uint48 fee = 7_500; // 7.5% max curator fee\\n        auctionHouse.setFee(keycode, type_, fee);\\n        vm.stopPrank();\\n\\n        vm.startPrank(curator);\\n        uint96 fundingBeforeCuratorFee;\\n        uint96 fundingAfterCuratorFee;\\n        (,fundingBeforeCuratorFee,,,,,,,) = auctionHouse.lotRouting(0);\\n        console2.log("Here is the funding normalized before curator fee is set: ", fundingBeforeCuratorFee/1e18);\\n        auctionHouse.setCuratorFee(keycode, fee);\\n        bytes memory callbackData_ = "";\\n        auctionHouse.curate(0, callbackData_);\\n        (,fundingAfterCuratorFee,,,,,,,) = auctionHouse.lotRouting(0);\\n        console2.log("Here is the funding normalized after curator fee is set: ", fundingAfterCuratorFee/1e18);\\n        console2.log("Balance of base token of the auction house: ", mockBaseToken.balanceOf(address(auctionHouse))/1e18);\\n        vm.stopPrank();\\n    }\\n```\\n\\n```\\nLogs:\\n  Here is the funding normalized before curator fee is set:  75000000000\\n  Here is the funding normalized after curator fee is set:  1396837485\\n  Balance of base token of the auction house:  80625000000\\n```\\n\\nTo run the test use: `forge test -vvv --mt test_CuratorFeeOverflow`
Either remove the unchecked block\\n```\\nunchecked {\\n   routing.funding += curatorFeePayout;\\n}\\n```\\n\\nso that when overflow occurs, the transaction will revert, or better yet also change the funding variable type from `uint96` to `uint256` this way sellers can create big enough auctions, and provide sufficient curator fee in order to bootstrap their protocol successfully .
If there is an overflow occurs in the curate() function, a big portion of the tokens will be stuck in the `Axis-Finance` protocol forever, as there is no way for them to be withdrawn, either by an admin function, or by canceling the auction (if an auction has started, only FPAM auctions can be canceled), as the amount returned is calculated in the following way\\n```\\n        if (routing.funding > 0) {\\n            uint96 funding = routing.funding;\\n\\n            // Set to 0 before transfer to avoid re-entrancy\\n            routing.funding = 0;\\n\\n            // Transfer the base tokens to the appropriate contract\\n            Transfer.transfer(\\n                routing.baseToken,\\n                _getAddressGivenCallbackBaseTokenFlag(routing.callbacks, routing.seller),\\n                funding,\\n                false\\n            );\\n            // rest of code\\n        }\\n```\\n
```\\n    struct Routing {\\n        // rest of code\\n        uint96 funding; \\n        // rest of code\\n    }\\n```\\n