feat: expand non-evm relay and route planning support
This commit is contained in:
@@ -8,7 +8,9 @@ import "../../../contracts/bridge/adapters/evm/XDCAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/evm/AlltraAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/non-evm/XRPLAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/non-evm/StellarAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/non-evm/SolanaAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/non-evm/TezosAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/non-evm/TronAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/hyperledger/FireflyAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/hyperledger/CactiAdapter.sol";
|
||||
import "../../../contracts/bridge/adapters/hyperledger/FabricAdapter.sol";
|
||||
@@ -39,7 +41,9 @@ contract DeployAllAdapters is Script {
|
||||
// Deploy non-EVM adapters
|
||||
XRPLAdapter xrplAdapter = new XRPLAdapter(deployer);
|
||||
StellarAdapter stellarAdapter = new StellarAdapter(deployer);
|
||||
SolanaAdapter solanaAdapter = new SolanaAdapter(deployer);
|
||||
TezosAdapter tezosAdapter = new TezosAdapter(deployer);
|
||||
TronAdapter tronAdapter = new TronAdapter(deployer);
|
||||
|
||||
// Deploy Hyperledger adapters
|
||||
FireflyAdapter fireflyAdapter = new FireflyAdapter(deployer, "alltra-bridge");
|
||||
@@ -59,7 +63,9 @@ contract DeployAllAdapters is Script {
|
||||
|
||||
registry.registerNonEVMChain("XRPL-Mainnet", ChainRegistry.ChainType.XRPL, address(xrplAdapter), "https://xrpscan.com", 1, 4, true, "");
|
||||
registry.registerNonEVMChain("Stellar-Mainnet", ChainRegistry.ChainType.Stellar, address(stellarAdapter), "https://stellarchain.io", 1, 5, true, "");
|
||||
registry.registerNonEVMChain("Solana-Mainnet", ChainRegistry.ChainType.Solana, address(solanaAdapter), "https://solscan.io", 32, 1, true, "");
|
||||
registry.registerNonEVMChain("Tezos-Mainnet", ChainRegistry.ChainType.Other, address(tezosAdapter), "https://tzkt.io", 1, 30, true, "");
|
||||
registry.registerNonEVMChain("Tron-Mainnet", ChainRegistry.ChainType.Tron, address(tronAdapter), "https://tronscan.org", 20, 3, true, "");
|
||||
registry.registerNonEVMChain("Firefly-Orchestration", ChainRegistry.ChainType.Firefly, address(fireflyAdapter), "", 1, 1, true, "");
|
||||
registry.registerNonEVMChain("Cacti-Interoperability", ChainRegistry.ChainType.Cacti, address(cactiAdapter), "", 1, 1, true, "");
|
||||
registry.registerNonEVMChain("Fabric-bridge-channel", ChainRegistry.ChainType.Fabric, address(fabricAdapter), "", 1, 1, true, "");
|
||||
|
||||
42
script/deploy/chains/DeploySolanaAdapter.s.sol
Normal file
42
script/deploy/chains/DeploySolanaAdapter.s.sol
Normal file
@@ -0,0 +1,42 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import "forge-std/Script.sol";
|
||||
import "../../../contracts/registry/ChainRegistry.sol";
|
||||
import "../../../contracts/bridge/adapters/non-evm/SolanaAdapter.sol";
|
||||
|
||||
contract DeploySolanaAdapter is Script {
|
||||
function run() external {
|
||||
uint256 pk = vm.envUint("PRIVATE_KEY");
|
||||
address admin = vm.addr(pk);
|
||||
address chainRegistry = vm.envAddress("CHAIN_REGISTRY_ADDRESS");
|
||||
|
||||
ChainRegistry registry = ChainRegistry(chainRegistry);
|
||||
|
||||
vm.startBroadcast(pk);
|
||||
|
||||
SolanaAdapter solanaAdapter = new SolanaAdapter(admin);
|
||||
ChainRegistry.ChainMetadata memory existing = registry.getNonEVMChain("Solana-Mainnet");
|
||||
|
||||
if (existing.adapter == address(0)) {
|
||||
registry.registerNonEVMChain(
|
||||
"Solana-Mainnet",
|
||||
ChainRegistry.ChainType.Solana,
|
||||
address(solanaAdapter),
|
||||
"https://solscan.io",
|
||||
32,
|
||||
1,
|
||||
true,
|
||||
""
|
||||
);
|
||||
} else {
|
||||
registry.updateAdapter(0, "Solana-Mainnet", address(solanaAdapter));
|
||||
registry.setChainActive(0, "Solana-Mainnet", true);
|
||||
}
|
||||
|
||||
vm.stopBroadcast();
|
||||
|
||||
console.log("SolanaAdapter:", address(solanaAdapter));
|
||||
console.log("ChainRegistry:", chainRegistry);
|
||||
}
|
||||
}
|
||||
26
script/wrapped-lp-public/DeployWrappedLPLockerChain138.s.sol
Normal file
26
script/wrapped-lp-public/DeployWrappedLPLockerChain138.s.sol
Normal file
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import {Script, console2} from "forge-std/Script.sol";
|
||||
|
||||
import {Chain138LPLocker} from "../../contracts/wrapped-lp-public/Chain138LPLocker.sol";
|
||||
|
||||
/**
|
||||
* @title DeployWrappedLPLockerChain138
|
||||
* @notice Deploy **only** `Chain138LPLocker` on Chain 138. Use `--rpc-url` pointing at Core RPC.
|
||||
* @dev Env: `LP_TOKEN`, `ADMIN`, `PRIVATE_KEY`. Verify on Blockscout after deploy.
|
||||
*/
|
||||
contract DeployWrappedLPLockerChain138 is Script {
|
||||
function run() external {
|
||||
address lpToken = vm.envAddress("LP_TOKEN");
|
||||
address admin = vm.envAddress("ADMIN");
|
||||
uint256 pk = vm.envUint("PRIVATE_KEY");
|
||||
|
||||
vm.startBroadcast(pk);
|
||||
|
||||
Chain138LPLocker locker = new Chain138LPLocker(lpToken, admin);
|
||||
console2.log("Chain138LPLocker", address(locker));
|
||||
|
||||
vm.stopBroadcast();
|
||||
}
|
||||
}
|
||||
72
script/wrapped-lp-public/DeployWrappedLPProgram.s.sol
Normal file
72
script/wrapped-lp-public/DeployWrappedLPProgram.s.sol
Normal file
@@ -0,0 +1,72 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import {Script, console2} from "forge-std/Script.sol";
|
||||
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
||||
|
||||
import {Chain138LPLocker} from "../../contracts/wrapped-lp-public/Chain138LPLocker.sol";
|
||||
import {WLPReceiptToken} from "../../contracts/wrapped-lp-public/WLPReceiptToken.sol";
|
||||
import {PublicChainMintController} from "../../contracts/wrapped-lp-public/PublicChainMintController.sol";
|
||||
import {WLPRedemptionGateway} from "../../contracts/wrapped-lp-public/WLPRedemptionGateway.sol";
|
||||
import {WLPNAVOracle} from "../../contracts/wrapped-lp-public/WLPNAVOracle.sol";
|
||||
import {WrappedLPNAVVault} from "../../contracts/wrapped-lp-public/WrappedLPNAVVault.sol";
|
||||
|
||||
/**
|
||||
* @title DeployWrappedLPProgram
|
||||
* @notice **Single-chain / local harness:** deploys locker + public stack in one `run()` (only valid when
|
||||
* both sides target the **same** RPC, e.g. Anvil or fork). For production use:
|
||||
* - [DeployWrappedLPLockerChain138.s.sol](DeployWrappedLPLockerChain138.s.sol) with Chain 138 RPC
|
||||
* - [DeployWrappedLPPublicChain.s.sol](DeployWrappedLPPublicChain.s.sol) with destination RPC
|
||||
* @dev Env: `LP_TOKEN`, `ADMIN`, `USDC` (optional vault), `PRIVATE_KEY`. Optional `WIRE_ROLES=1` and
|
||||
* `RELAYER_ADDRESS` when `vm.addr(PRIVATE_KEY) == ADMIN`.
|
||||
*/
|
||||
contract DeployWrappedLPProgram is Script {
|
||||
function run() external {
|
||||
address lpToken = vm.envAddress("LP_TOKEN");
|
||||
address admin = vm.envAddress("ADMIN");
|
||||
uint256 pk = vm.envUint("PRIVATE_KEY");
|
||||
|
||||
vm.startBroadcast(pk);
|
||||
|
||||
Chain138LPLocker locker = new Chain138LPLocker(lpToken, admin);
|
||||
console2.log("Chain138LPLocker", address(locker));
|
||||
|
||||
WLPReceiptToken wlp = new WLPReceiptToken("Wrapped LP", "wLP", 18, admin);
|
||||
console2.log("WLPReceiptToken", address(wlp));
|
||||
|
||||
PublicChainMintController mintCtl = new PublicChainMintController(address(wlp), address(locker), admin);
|
||||
console2.log("PublicChainMintController", address(mintCtl));
|
||||
|
||||
WLPRedemptionGateway gateway = new WLPRedemptionGateway(address(wlp), admin);
|
||||
console2.log("WLPRedemptionGateway", address(gateway));
|
||||
|
||||
WLPNAVOracle oracle = new WLPNAVOracle(admin, 3600);
|
||||
console2.log("WLPNAVOracle", address(oracle));
|
||||
|
||||
address usdc = vm.envOr("USDC", address(0));
|
||||
if (usdc != address(0)) {
|
||||
WrappedLPNAVVault vault = new WrappedLPNAVVault(
|
||||
IERC20(usdc),
|
||||
"Wrapped LP NAV Vault",
|
||||
"wLPV",
|
||||
admin
|
||||
);
|
||||
console2.log("WrappedLPNAVVault", address(vault));
|
||||
}
|
||||
|
||||
if (vm.envOr("WIRE_ROLES", false)) {
|
||||
address deployer = vm.addr(pk);
|
||||
require(deployer == admin, "WIRE_ROLES requires deployer==ADMIN");
|
||||
address relayerAddr = vm.envAddress("RELAYER_ADDRESS");
|
||||
address keeperAddr = vm.envOr("KEEPER_ADDRESS", relayerAddr);
|
||||
wlp.grantRole(wlp.MINTER_ROLE(), address(mintCtl));
|
||||
wlp.grantRole(wlp.BURNER_ROLE(), address(gateway));
|
||||
mintCtl.grantRole(mintCtl.RELAYER_ROLE(), relayerAddr);
|
||||
locker.grantRole(locker.BRIDGE_RELEASE_ROLE(), relayerAddr);
|
||||
oracle.grantRole(oracle.KEEPER_ROLE(), keeperAddr);
|
||||
console2.log("Wired roles (minter/burner/relayer/release/keeper)");
|
||||
}
|
||||
|
||||
vm.stopBroadcast();
|
||||
}
|
||||
}
|
||||
65
script/wrapped-lp-public/DeployWrappedLPPublicChain.s.sol
Normal file
65
script/wrapped-lp-public/DeployWrappedLPPublicChain.s.sol
Normal file
@@ -0,0 +1,65 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import {Script, console2} from "forge-std/Script.sol";
|
||||
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
||||
|
||||
import {WLPReceiptToken} from "../../contracts/wrapped-lp-public/WLPReceiptToken.sol";
|
||||
import {PublicChainMintController} from "../../contracts/wrapped-lp-public/PublicChainMintController.sol";
|
||||
import {WLPRedemptionGateway} from "../../contracts/wrapped-lp-public/WLPRedemptionGateway.sol";
|
||||
import {WLPNAVOracle} from "../../contracts/wrapped-lp-public/WLPNAVOracle.sol";
|
||||
import {WrappedLPNAVVault} from "../../contracts/wrapped-lp-public/WrappedLPNAVVault.sol";
|
||||
|
||||
/**
|
||||
* @title DeployWrappedLPPublicChain
|
||||
* @notice Deploy wLP stack on **public** chain (mainnet or L2). `--rpc-url` must be destination chain.
|
||||
* @dev Env: `ADMIN`, `PRIVATE_KEY`, `CHAIN138_LOCKER` (locker address for mint controller reference),
|
||||
* optional `USDC` for vault, optional `WIRE_ROLES=1`, `RELAYER_ADDRESS`, `KEEPER_ADDRESS` (defaults to relayer).
|
||||
*/
|
||||
contract DeployWrappedLPPublicChain is Script {
|
||||
function run() external {
|
||||
address admin = vm.envAddress("ADMIN");
|
||||
address chain138Locker = vm.envAddress("CHAIN138_LOCKER");
|
||||
uint256 pk = vm.envUint("PRIVATE_KEY");
|
||||
|
||||
vm.startBroadcast(pk);
|
||||
|
||||
WLPReceiptToken wlp = new WLPReceiptToken("Wrapped LP", "wLP", 18, admin);
|
||||
console2.log("WLPReceiptToken", address(wlp));
|
||||
|
||||
PublicChainMintController mintCtl = new PublicChainMintController(address(wlp), chain138Locker, admin);
|
||||
console2.log("PublicChainMintController", address(mintCtl));
|
||||
|
||||
WLPRedemptionGateway gateway = new WLPRedemptionGateway(address(wlp), admin);
|
||||
console2.log("WLPRedemptionGateway", address(gateway));
|
||||
|
||||
WLPNAVOracle oracle = new WLPNAVOracle(admin, 3600);
|
||||
console2.log("WLPNAVOracle", address(oracle));
|
||||
|
||||
address usdc = vm.envOr("USDC", address(0));
|
||||
if (usdc != address(0)) {
|
||||
WrappedLPNAVVault vault = new WrappedLPNAVVault(
|
||||
IERC20(usdc),
|
||||
"Wrapped LP NAV Vault",
|
||||
"wLPV",
|
||||
admin
|
||||
);
|
||||
console2.log("WrappedLPNAVVault", address(vault));
|
||||
}
|
||||
|
||||
if (vm.envOr("WIRE_ROLES", false)) {
|
||||
address deployer = vm.addr(pk);
|
||||
require(deployer == admin, "WIRE_ROLES requires deployer==ADMIN");
|
||||
address relayerAddr = vm.envAddress("RELAYER_ADDRESS");
|
||||
address keeperAddr = vm.envOr("KEEPER_ADDRESS", relayerAddr);
|
||||
|
||||
wlp.grantRole(wlp.MINTER_ROLE(), address(mintCtl));
|
||||
wlp.grantRole(wlp.BURNER_ROLE(), address(gateway));
|
||||
mintCtl.grantRole(mintCtl.RELAYER_ROLE(), relayerAddr);
|
||||
oracle.grantRole(oracle.KEEPER_ROLE(), keeperAddr);
|
||||
console2.log("Wired MINTER/BURNER/RELAYER/KEEPER");
|
||||
}
|
||||
|
||||
vm.stopBroadcast();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user