- 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
86 lines
3.5 KiB
Solidity
86 lines
3.5 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.20;
|
|
|
|
import "forge-std/Script.sol";
|
|
import {CompliantFiatToken} from "../../contracts/tokens/CompliantFiatToken.sol";
|
|
|
|
/**
|
|
* @title DeployGasCanonicalTokens
|
|
* @notice Deploy Wave 1 gas-native canonical c* tokens on Chain 138.
|
|
*
|
|
* Env:
|
|
* PRIVATE_KEY (required)
|
|
* GAS_FAMILY (optional) - deploy one family only: eth_mainnet, eth_l2, bnb, pol, avax, cro, xdai, celo, wemix
|
|
* GAS_INITIAL_OWNER (optional, defaults to deployer)
|
|
* GAS_ADMIN (optional, defaults to deployer)
|
|
* GAS_INITIAL_SUPPLY (optional, defaults to 0)
|
|
* DEPLOY_GAS_<FAMILY>=0 to skip a family when GAS_FAMILY is unset
|
|
*/
|
|
contract DeployGasCanonicalTokens is Script {
|
|
uint8 internal constant DECIMALS = 18;
|
|
|
|
function run() external {
|
|
uint256 pk = vm.envUint("PRIVATE_KEY");
|
|
address deployer = vm.addr(pk);
|
|
address owner = vm.envOr("GAS_INITIAL_OWNER", deployer);
|
|
address admin = vm.envOr("GAS_ADMIN", deployer);
|
|
uint256 initialSupply = vm.envOr("GAS_INITIAL_SUPPLY", uint256(0));
|
|
string memory targetFamily = vm.envOr("GAS_FAMILY", string(""));
|
|
|
|
vm.startBroadcast(pk);
|
|
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "eth_mainnet", "DEPLOY_GAS_ETH_MAINNET", "Ethereum Mainnet Gas (Compliant)", "cETH", "ETH");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "eth_l2", "DEPLOY_GAS_ETH_L2", "Ethereum L2 Gas (Compliant)", "cETHL2", "ETH");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "bnb", "DEPLOY_GAS_BNB", "BNB Gas (Compliant)", "cBNB", "BNB");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "pol", "DEPLOY_GAS_POL", "Polygon Gas (Compliant)", "cPOL", "POL");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "avax", "DEPLOY_GAS_AVAX", "Avalanche Gas (Compliant)", "cAVAX", "AVAX");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "cro", "DEPLOY_GAS_CRO", "Cronos Gas (Compliant)", "cCRO", "CRO");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "xdai", "DEPLOY_GAS_XDAI", "Gnosis Gas (Compliant)", "cXDAI", "XDAI");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "celo", "DEPLOY_GAS_CELO", "Celo Gas (Compliant)", "cCELO", "CELO");
|
|
_deployOne(owner, admin, initialSupply, targetFamily, "wemix", "DEPLOY_GAS_WEMIX", "Wemix Gas (Compliant)", "cWEMIX", "WEMIX");
|
|
|
|
vm.stopBroadcast();
|
|
}
|
|
|
|
function _deployOne(
|
|
address owner,
|
|
address admin,
|
|
uint256 initialSupply,
|
|
string memory targetFamily,
|
|
string memory familyKey,
|
|
string memory envFlag,
|
|
string memory name,
|
|
string memory symbol,
|
|
string memory currencyCode
|
|
) internal {
|
|
if (!_shouldDeploy(targetFamily, familyKey, envFlag)) return;
|
|
|
|
CompliantFiatToken token = new CompliantFiatToken(
|
|
name,
|
|
symbol,
|
|
DECIMALS,
|
|
currencyCode,
|
|
owner,
|
|
admin,
|
|
initialSupply
|
|
);
|
|
|
|
console.log(symbol, address(token));
|
|
console.log(" familyKey", familyKey);
|
|
console.log(" owner", owner);
|
|
console.log(" admin", admin);
|
|
console.log(" initialSupply", initialSupply);
|
|
}
|
|
|
|
function _shouldDeploy(
|
|
string memory targetFamily,
|
|
string memory familyKey,
|
|
string memory envFlag
|
|
) internal view returns (bool) {
|
|
if (bytes(targetFamily).length != 0) {
|
|
return keccak256(bytes(targetFamily)) == keccak256(bytes(familyKey));
|
|
}
|
|
return vm.envOr(envFlag, uint256(1)) != 0;
|
|
}
|
|
}
|