Spaces:
Building
Building
| // SPDX-License-Identifier: AGPL-3.0-or-later | |
| pragma solidity ^0.8.24; | |
| import "forge-std/Script.sol"; | |
| import "../src/MockBTT.sol"; | |
| import "../src/ZKVerifier.sol"; | |
| import "../src/RoyaltyDistributor.sol"; | |
| /// @notice Deploys MockBTT + ZKVerifier + RoyaltyDistributor to BTTC testnet. | |
| /// | |
| /// All signing is performed on the Ledger hardware device β no private key | |
| /// ever touches the host machine. | |
| /// | |
| /// Usage: | |
| /// forge script script/Deploy.s.sol:DeployScript \ | |
| /// --rpc-url $BTTC_RPC_URL \ | |
| /// --ledger \ | |
| /// --hd-paths "m/44'/60'/0'/0/0" \ | |
| /// --legacy \ | |
| /// --broadcast \ | |
| /// --verify // optional: source verify on BTTCScan | |
| /// | |
| /// Dry-run (no broadcast, no hardware required): | |
| /// forge script script/Deploy.s.sol:DeployScript --rpc-url $BTTC_RPC_URL --legacy | |
| /// | |
| /// The HD path index can be overridden via env: | |
| /// LEDGER_ACCOUNT=1 forge script ... --ledger --hd-paths "m/44'/60'/0'/0/1" | |
| contract DeployScript is Script { | |
| function run() external { | |
| // msg.sender is set to the Ledger address when --ledger is passed. | |
| // vm.startBroadcast() with no argument uses the --sender / --ledger | |
| // address resolved by Forge β no private key is ever passed here. | |
| vm.startBroadcast(); | |
| // 1. Deploy mock BTT (testnet only β replace with real BTT on mainnet) | |
| MockBTT btt = new MockBTT(1_000_000_000); | |
| console.log("MockBTT deployed: ", address(btt)); | |
| // 2. Deploy ZKVerifier β VK is set in a separate tx after ceremony | |
| ZKVerifier verifier = new ZKVerifier(); | |
| console.log("ZKVerifier deployed: ", address(verifier)); | |
| // 3. Deploy RoyaltyDistributor β immutable, no proxy, no upgrade path | |
| RoyaltyDistributor dist = new RoyaltyDistributor(address(btt), address(verifier)); | |
| console.log("RoyaltyDistributor deployed:", address(dist)); | |
| // 4. Fund distributor with initial BTT from deployer | |
| btt.transfer(address(dist), 100_000_000 * 1e18); | |
| vm.stopBroadcast(); | |
| // Print .env update instructions | |
| console.log("\n# Add these to .env:"); | |
| console.log("BTT_CONTRACT_ADDR=", address(btt)); | |
| console.log("ZK_VERIFIER_ADDR=", address(verifier)); | |
| console.log("ROYALTY_CONTRACT_ADDR=", address(dist)); | |
| console.log("\n# Then set the VK on-chain:"); | |
| console.log("# cast send $ZK_VERIFIER_ADDR 'setVerifyingKey(...)' \\"); | |
| console.log("# $(cat vk.json | jq -r ...) \\"); | |
| console.log("# --ledger --hd-paths \"m/44'/60'/0'/0/0\" --rpc-url $BTTC_RPC_URL"); | |
| } | |
| } | |