function withdraw(address _usdcVersion, uint256 _amount) external returns (uint256) {
    // check whitelist
    require(whitelistedUSDCVersions[_usdcVersion], "ASDUSDC: USDC version not whitelisted");
    // burn tokens
    _burn(msg.sender, _amount);
    // calculate amount to withdraw
    uint256 amountToWithdraw = _amount / (10 ** (this.decimals() - ERC20(_usdcVersion).decimals()));   // @audit precision loss
    // check balance
    require(usdcBalances[_usdcVersion] >= amountToWithdraw, "ASDUSDC: Not enough USDC balance");
    // transfer USDC
    usdcBalances[_usdcVersion] -= amountToWithdraw;
    SafeERC20.safeTransfer(ERC20(_usdcVersion), msg.sender, amountToWithdraw);
    emit Withdrawal(_usdcVersion, amountToWithdraw);
    return amountToWithdraw;
}
diff --git a/contracts/test-contracts/TestERC20.sol b/contracts/test-contracts/TestERC20.sol
index dccc64d..229d8c6 100644
--- a/contracts/test-contracts/TestERC20.sol
+++ b/contracts/test-contracts/TestERC20.sol
@@ -3,7 +3,19 @@ pragma solidity ^0.8.22;
 import {IERC20, ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
 
 contract TestERC20 is ERC20 {
+
+    uint8 private _decimals;
+
     constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {
+        _decimals = 18;
         _mint(msg.sender, 1000 ether);
     }
+
+    function decimals() public view override returns (uint8) {
+        return _decimals;
+    }
+
+    function setDecimals(uint8 _val) public {
+        _decimals = _val;
+    }
 }
diff --git a/test/ASDUSDC.js b/test/ASDUSDC.js
index 62e66b8..5a100b0 100644
--- a/test/ASDUSDC.js
+++ b/test/ASDUSDC.js
@@ -6,6 +6,7 @@ describe("ASDUSDC", function () {
     let usdc1;
     let usdc2;
     let usdc3;
+    let usdc4;
     this.beforeEach(async () => {
         // deploy ASDUSDC contract
         asdUSDC = await ethers.deployContract("ASDUSDC");
@@ -13,9 +14,13 @@ describe("ASDUSDC", function () {
         usdc1 = await ethers.deployContract("TestERC20", ["USDC1", "USDC1"]);
         usdc2 = await ethers.deployContract("TestERC20", ["USDC2", "USDC2"]);
         usdc3 = await ethers.deployContract("TestERC20", ["USDC3", "USDC3"]);
-        // set whitelist for 2 of the tokens
+        usdc4 = await ethers.deployContract("TestERC20", ["USDC4", "USDC4"]);
+        await usdc4.setDecimals(6);
+
+        // set whitelist for 3 of the tokens
         await asdUSDC.updateWhitelist(usdc1.target, true);
         await asdUSDC.updateWhitelist(usdc2.target, true);
+        await asdUSDC.updateWhitelist(usdc4.target, true);
     });
 
     it("should set whitelist for correct contract addresses", async () => {
@@ -43,6 +48,26 @@ describe("ASDUSDC", function () {
         await expect(asdUSDC.deposit(usdc3.target, 1000)).to.be.revertedWith("ASDUSDC: USDC version not whitelisted");
     });
 
+    it("should deposit & withdraw with differing decimals", async () => {
+        const [signer] = await ethers.getSigners();
+        const usdc4Deposit = 1000e6;
+        await usdc4.approve(asdUSDC.target, usdc4Deposit);
+        await asdUSDC.deposit(usdc4.target, usdc4Deposit);
+
+        const usdc4Withdraw = BigInt(1000e18);
+        expect(await asdUSDC.balanceOf(signer)).to.equal(usdc4Withdraw);
+
+        //split withdrawal in 2 transactions to provoke rounding error
+        await asdUSDC.withdraw(usdc4.target, usdc4Withdraw / BigInt(2) - BigInt(1));
+        await asdUSDC.withdraw(usdc4.target, usdc4Withdraw / BigInt(2) + BigInt(1));
+
+        // check that all of user's asdUDSC is burned
+        expect(await asdUSDC.balanceOf(signer)).to.equal(0);
+
+        expect(await usdc4.balanceOf(asdUSDC.target), "asdUSDC contract still has USDC4").to.equal(0);
+
+    });
+
     it("should withdraw whitelisted usdc versions for asdUSDC", async () => {
         const [signer] = await ethers.getSigners();
         const usdc1Deposit = 1000;
