Files
smom-dbis-138/test/reserve/StablecoinReserveVault.t.sol
defiQUG 76aa419320 feat: bridges, PMM, flash workflow, token-aggregation, and deployment docs
- CCIP/trustless bridge contracts, GRU tokens, DEX/PMM tests, reserve vault.
- Token-aggregation service routes, planner, chain config, relay env templates.
- Config snapshots and multi-chain deployment markdown updates.
- gitignore services/btc-intake/dist/ (tsc output); do not track dist.

Run forge build && forge test before deploy (large solc graph).

Made-with: Cursor
2026-04-07 23:40:52 -07:00

98 lines
3.8 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {OfficialStableMirrorToken} from "../../contracts/tokens/OfficialStableMirrorToken.sol";
import {CompliantUSDT} from "../../contracts/tokens/CompliantUSDT.sol";
import {CompliantUSDC} from "../../contracts/tokens/CompliantUSDC.sol";
import {StablecoinReserveVault} from "../../contracts/reserve/StablecoinReserveVault.sol";
contract StablecoinReserveVaultTest is Test {
address internal user = address(0xBEEF);
OfficialStableMirrorToken internal officialUsdt;
OfficialStableMirrorToken internal officialUsdc;
CompliantUSDT internal compliantUsdt;
CompliantUSDC internal compliantUsdc;
StablecoinReserveVault internal vault;
function setUp() public {
officialUsdt = new OfficialStableMirrorToken("Tether USD (Chain 138)", "USDT", 6, address(this), 0);
officialUsdc = new OfficialStableMirrorToken("USD Coin (Chain 138)", "USDC", 6, address(this), 0);
compliantUsdt = new CompliantUSDT(address(this), address(this));
compliantUsdc = new CompliantUSDC(address(this), address(this));
vault = new StablecoinReserveVault(
address(this),
address(officialUsdt),
address(officialUsdc),
address(compliantUsdt),
address(compliantUsdc)
);
}
function testSeedReserveBootstrapsBackingForExistingCanonicalSupply() public {
uint256 existingCusdtSupply = compliantUsdt.totalSupply();
uint256 existingCusdcSupply = compliantUsdc.totalSupply();
officialUsdt.mint(address(this), existingCusdtSupply);
officialUsdc.mint(address(this), existingCusdcSupply);
officialUsdt.approve(address(vault), existingCusdtSupply);
officialUsdc.approve(address(vault), existingCusdcSupply);
vault.seedUSDTReserve(existingCusdtSupply);
vault.seedUSDCReserve(existingCusdcSupply);
(uint256 usdtReserve, uint256 usdtSupply, uint256 usdtBackingRatio) =
vault.getBackingRatio(address(compliantUsdt));
(uint256 usdcReserve, uint256 usdcSupply, uint256 usdcBackingRatio) =
vault.getBackingRatio(address(compliantUsdc));
assertEq(usdtReserve, existingCusdtSupply);
assertEq(usdtSupply, existingCusdtSupply);
assertEq(usdtBackingRatio, 10000);
assertEq(usdcReserve, existingCusdcSupply);
assertEq(usdcSupply, existingCusdcSupply);
assertEq(usdcBackingRatio, 10000);
(bool usdtAdequate, bool usdcAdequate) = vault.checkReserveAdequacy();
assertTrue(usdtAdequate);
assertTrue(usdcAdequate);
}
function testDepositAndRedeemWorkAfterVaultTakesCompliantOwnership() public {
uint256 depositAmount = 100e6;
uint256 redeemAmount = 40e6;
compliantUsdt.transferOwnership(address(vault));
officialUsdt.mint(user, depositAmount);
vm.startPrank(user);
officialUsdt.approve(address(vault), depositAmount);
vault.depositUSDT(depositAmount);
assertEq(compliantUsdt.balanceOf(user), depositAmount);
assertEq(officialUsdt.balanceOf(user), 0);
compliantUsdt.approve(address(vault), redeemAmount);
vault.redeemUSDT(redeemAmount);
vm.stopPrank();
assertEq(compliantUsdt.balanceOf(user), depositAmount - redeemAmount);
assertEq(officialUsdt.balanceOf(user), redeemAmount);
assertEq(vault.usdtReserveBalance(), depositAmount - redeemAmount);
}
function testVaultAdminCanRecoverCompliantTokenOwnership() public {
address recoveryOwner = address(0xCAFE);
compliantUsdc.transferOwnership(address(vault));
assertEq(compliantUsdc.owner(), address(vault));
vault.transferCompliantTokenOwnership(address(compliantUsdc), recoveryOwner);
assertEq(compliantUsdc.owner(), recoveryOwner);
}
}