// SPDX-License-Identifier: MIT pragma solidity 0.8.35; import {BankV2} from "../src/BankV2.sol"; import {MockUSDC} from "../src/MockUSDC.sol"; import {DemoScript} from "./lib/DemoScript.sol"; contract TransferV2Demo is DemoScript { function run() external { _run(_manifestPath(ACTIVE_MANIFEST_PATH)); } function _run(string memory manifestPath) internal { _requireSupportedChain(block.chainid); _printEducationalWarning(); Manifest memory manifest = _readManifest(manifestPath, true); if (block.chainid == BASE_SEPOLIA_CHAIN_ID) { _runBase(manifest); return; } _runLocal(manifest); } function _runLocal(Manifest memory manifest) private { (uint256 aliceKey, address alice) = _deriveLocalActor(block.chainid, 1); address bob = manifest.actors[2].address_; _assertAddress("Alice actor", manifest.actors[1].address_, alice); BankV2 bank = BankV2(manifest.proxy); MockUSDC token = MockUSDC(manifest.token); _assertUint("version", 2, bank.contractVersion()); _assertUint("Alice internal balance", 900e6, bank.balanceOf(alice)); _assertUint("Bob internal balance", 500e6, bank.balanceOf(bob)); uint256 liabilities = bank.totalLiabilities(); uint256 reserves = token.balanceOf(manifest.proxy); _assertUint("liabilities", 1_400e6, liabilities); _assertUint("reserves", 1_400e6, reserves); vm.startBroadcast(aliceKey); bank.transferBalance(bob, 250e6); vm.stopBroadcast(); _assertUint("Alice internal balance", 650e6, bank.balanceOf(alice)); _assertUint("Bob internal balance", 750e6, bank.balanceOf(bob)); _assertUint("liabilities", liabilities, bank.totalLiabilities()); _assertUint("reserves", reserves, token.balanceOf(manifest.proxy)); _assertUint("surplus", 0, token.balanceOf(manifest.proxy) - bank.totalLiabilities()); } function _runBase(Manifest memory manifest) private { address scriptSender = vm.envAddress("SCRIPT_SENDER"); (address presenter, address recipient,) = _requireBaseConfig(scriptSender); _assertAddress("Presenter", manifest.actors[0].address_, presenter); _assertAddress("Recipient", manifest.actors[1].address_, recipient); BankV2 bank = BankV2(manifest.proxy); MockUSDC token = MockUSDC(manifest.token); _assertUint("version", 2, bank.contractVersion()); _assertUint("Presenter internal balance", 1_000e6, bank.balanceOf(presenter)); _assertUint("Recipient internal balance", 0, bank.balanceOf(recipient)); uint256 liabilities = bank.totalLiabilities(); uint256 reserves = token.balanceOf(manifest.proxy); _assertUint("liabilities", 1_000e6, liabilities); _assertUint("reserves", 1_000e6, reserves); vm.startBroadcast(presenter); bank.transferBalance(recipient, 250e6); vm.stopBroadcast(); _assertUint("Presenter internal balance", 750e6, bank.balanceOf(presenter)); _assertUint("Recipient internal balance", 250e6, bank.balanceOf(recipient)); _assertUint("liabilities", liabilities, bank.totalLiabilities()); _assertUint("reserves", reserves, token.balanceOf(manifest.proxy)); _assertUint("surplus", 0, token.balanceOf(manifest.proxy) - bank.totalLiabilities()); } }