- Resolve stash: merge load_deployment_env path with secure-secrets and CR/LF RPC strip - create-pmm-full-mesh-chain138.sh delegates to sync-chain138-pmm-pools-from-json.sh - env.additions.example: canonical PMM pool defaults (cUSDT/USDT per crosscheck) - Include Chain138 scripts, official mirror deploy scaffolding, and prior staged changes Made-with: Cursor
41 lines
1.2 KiB
Solidity
41 lines
1.2 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.19;
|
|
|
|
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
|
import "@openzeppelin/contracts/access/Ownable.sol";
|
|
|
|
/**
|
|
* @title OfficialStableMirrorToken
|
|
* @notice Lightweight ERC-20 used as the local Chain 138 "official" stable mirror.
|
|
* @dev This token exists only to provide a live ERC-20 quote-side asset for local PMM pools.
|
|
* It is intentionally separate from the compliant token contracts.
|
|
*/
|
|
contract OfficialStableMirrorToken is ERC20, Ownable {
|
|
uint8 private immutable _decimalsStorage;
|
|
|
|
constructor(
|
|
string memory name_,
|
|
string memory symbol_,
|
|
uint8 decimals_,
|
|
address initialOwner,
|
|
uint256 initialSupply
|
|
) ERC20(name_, symbol_) Ownable(initialOwner) {
|
|
_decimalsStorage = decimals_;
|
|
if (initialSupply > 0) {
|
|
_mint(msg.sender, initialSupply);
|
|
}
|
|
}
|
|
|
|
function decimals() public view override returns (uint8) {
|
|
return _decimalsStorage;
|
|
}
|
|
|
|
function mint(address to, uint256 amount) external onlyOwner {
|
|
_mint(to, amount);
|
|
}
|
|
|
|
function burn(address from, uint256 amount) external onlyOwner {
|
|
_burn(from, amount);
|
|
}
|
|
}
|