Failed to transfer the received BNB in Proxy Contract A to Proxy Contract B

Please help me find out what is the cause, thank you very much
Failed to transfer the received BNB in ​​Proxy Contract A to Proxy Contract B
ProxyContractA:TransparentUpgradeableProxy | Address 0x11EeC0063C95Cf9314208294562007248D570F05 | BscScan

    function buySlot(address payable toUser) public payable {
        toUser.transfer(msg.value);
    }

ProxyContractB:TransparentUpgradeableProxy | Address 0xAd9b283B7E745AA1A4ad058f9E5437fA462E2fF8 | BscScan
The proxy contract has a function to accept tokens

	receive() external payable {
		if(msg.sender != founderSaleAddress){
			buy();
		}
	}

I can successfully transfer BNB to the proxy contract B using my wallet. The following is the successful record

But when I used proxy contract A to transfer BNB to proxy contract B, it failed. The following is 1 failure record, but most of them failed during gas estimation. I deliberately forced a transaction and it was rolled back.

The proxy contracts of both contracts are compiled with 0.8.10 and have been open sourced in the blockchain browser. The implementation contracts of both contracts are compiled with 0.8.25 and have been open sourced in the blockchain browser.

My test case using hardhat locally is success

  describe("购买", function () {

    it("购买", async function () {
      const tcpAddress = await tcp314.getAddress()
      await sale.buySlot(tcpAddress, { value: ethers.parseEther("1") });
      expect(await ethers.provider.getBalance(tcpAddress)).to.equal(ethers.parseEther("1"));
    });
  });
yarn test ./test/SaleTest.ts 

  SaleTest
    购买
      ✓ 购买

·-------------------------------|---------------------------|-------------|-----------------------------·
|     Solc version: 0.8.25      ·  Optimizer enabled: true  ·  Runs: 200  ·  Block limit: 30000000 gas  │
································|···························|·············|······························
|  Methods                                                                                              │
·················|··············|·············|·············|·············|···············|··············
|  Contract      ·  Method      ·  Min        ·  Max        ·  Avg        ·  # calls      ·  eur (avg)  │
·················|··············|·············|·············|·············|···············|··············
|  SaleTest      ·  buySlot     ·          -  ·          -  ·      33200  ·            1  ·          -  │
·················|··············|·············|·············|·············|···············|··············
|  Token314Test  ·  initialize  ·          -  ·          -  ·     383353  ·            1  ·          -  │
·················|··············|·············|·············|·············|···············|··············
|  Deployments                  ·                                         ·  % of limit   ·             │
································|·············|·············|·············|···············|··············
|  SaleTest                     ·          -  ·          -  ·      90791  ·        0.3 %  ·          -  │
································|·············|·············|·············|···············|··············
|  Token314Test                 ·          -  ·          -  ·    2536187  ·        8.5 %  ·          -  │
·-------------------------------|-------------|-------------|-------------|---------------|-------------·

  1 passing (6s)

Thanks

Already solved
Change the transfer method to the following

    function buySlot(address payable toUser) public payable {
        (bool sent, ) = toUser.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }

Since new users can only send up to two links, I attach them here.
I can successfully transfer BNB to the proxy contract B using my wallet. The following is the successful record

But when I used proxy contract A to transfer BNB to proxy contract B, it failed. The following is 1 failure record, but most of them failed during gas estimation. I deliberately forced a transaction and it was rolled back.

Already solved
Change the transfer method to the following

    function buySlot(address payable toUser) public payable {
        (bool sent, ) = toUser.call{value: msg.value}("");
        require(sent, "Failed to send Ether");
    }