Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,6 @@
path = lib/murky
url = https://github.com/dmfxyz/murky
branch = main
[submodule "lib/libraries-solidity"]
path = lib/libraries-solidity
url = https://github.com/manifoldxyz/libraries-solidity
3,529 changes: 3,528 additions & 1 deletion abis/SuperRareBazaar.json

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions deployments/sepolia.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"approvedTokenRegistry": "0x861bB2EB55A1604F288fAa45667C7d2ccb903495",
"chainId": 11155111,
"creatorRegistry": "0xaBf7837627537cCe9a8C42DC9b87ff3C435eb109",
"deployer": "0x3B9C3C5EA16E7d3c9C0bb293a549aFa4066dc162",
"marketplaceSettingsV3": "0x11309daFfD91F822b08809F89814361Dd7E3Ccad",
"payments": "0x18cf9dcdadDaf03E1D4Bdcf6833d8a2e8cf88146",
"rareAppRegistry": "0x3ad7694F899804206076F9A8E6F06719E360A90b",
"rareMinter": "0xf689b3344090DdE8b7a2C6b942730fF05De29451",
"rareMinterImpl": "0x695be76C315108fAb8D03f88a19d8e077D8df037",
"rareRoyaltyRegistry": "0x4B2B0b2807d5bD24be254cccccfD3282a689d29A",
"rareToken": "0x197FaeF3f59eC80113e773Bb6206a17d183F97CB",
"royaltyEngineV1": "0xbb503BE3a7c457566Cc3d806F54Cd0c1fB654e23",
"sovereignNFTContractFactory": "0xeF4aac03af2684bE0BE2B07c451949CC4246085F",
"spaceOperatorRegistry": "0xeE6440256d31cD009BA1A1d32e986A33A5a1603C",
"stakingRegistryStub": "0xDfF2f86F2C7A48b73E87f7938C79e924807d43bb",
"superRareAdmin": "0x3D2f4EDdB7F8A63C68BaB6Ed46DCFD97FF12a36A",
"superRareAuctionHouse": "0xA40024deeaB7Dc6089cBa91f8c7e7EbB7932A7a9",
"superRareBazaar": "0xCE999aeF38E1316A510615b80713b494658807c6",
"superRareBazaarImpl": "0xE145336615decc8dB40CF27B102fBe84E9b32094",
"superRareMarketplace": "0xA1194D90522334E01cb5192f7c758B2EdA2773a4"
}
53 changes: 53 additions & 0 deletions foundry.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"lib/buffer": {
"rev": "c3a2e0aed8c07baee3d837f7e92532d28f249132"
},
"lib/ds-test": {
"rev": "e282159d5170298eb2455a6c05280ab5a73a4ef0"
},
"lib/ens-contracts": {
"rev": "f5f2ededccbb7e52be44925c0050620d71762e32"
},
"lib/forge-std": {
"rev": "e8a047e3f40f13fa37af6fe14e6e06283d9a060e"
},
"lib/governance-contracts": {
"rev": "30a1989d89ab6b859b23db5430d345ef84208616"
},
"lib/libraries-solidity": {
"tag": {
"name": "v1.0.5",
"rev": "c0fc1d47493e8abf33717e082bde0dad48a74a32"
}
},
"lib/murky": {
"branch": {
"name": "main",
"rev": "5feccd1253d7da820f7cccccdedf64471025455d"
}
},
"lib/openzeppelin-contracts": {
"rev": "dfef6a68ee18dbd2e1f5a099061a3b8a0e404485"
},
"lib/openzeppelin-contracts-upgradeable": {
"rev": "f6febd79e2a3a17e26969dd0d450c6ebd64bf459"
},
"lib/royalty-guard": {
"rev": "043a8bc0cdb215502470ab04b232636c5b7b3697"
},
"lib/royalty-registry-solidity": {
"rev": "c4ca8faf12e55e357a945bd65406dff9f32c8692"
},
"lib/solidity-stringutils": {
"rev": "46983c6d9462a80229cf0d5bab8ea3b3ee31066c"
},
"lib/solmate": {
"rev": "2001af43aedb46fdc2335d2a7714fb2dae7cfcd1"
},
"lib/v3-core": {
"rev": "ab80c076b3d7122eda2731303a346aa079d16c19"
},
"lib/v3-periphery": {
"rev": "b46983053823829c7a8dfbce39a26e0bfb48c76a"
}
}
5 changes: 4 additions & 1 deletion foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@ auto_detect_remappings = false
viaIR = true
optimizer = true
optimizer_runs = 100
fs_permissions = [{ access = "read", path = "./"}]
fs_permissions = [
{ access = "read", path = "./" },
{ access = "read-write", path = "./deployments" }
]
1 change: 1 addition & 0 deletions lib/libraries-solidity
Submodule libraries-solidity added at c0fc1d
4 changes: 3 additions & 1 deletion remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ ensdomains/ens-contracts/=lib/ensdomains/ens-contracts/contracts/
arachnid/solidity-stringutils/=lib/solidity-stringutils/
@uniswap/v3-core/contracts=lib/v3-core/contracts/
@uniswap/v3-core/=lib/v3-core/contracts/
@uniswap/v3-periphery/=lib/v3-periphery/contracts/
@uniswap/v3-periphery/=lib/v3-periphery/contracts/
@manifoldxyz/libraries-solidity/=lib/libraries-solidity/
openzeppelin/=lib/openzeppelin-contracts/contracts/
173 changes: 173 additions & 0 deletions script/DeploySepolia.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "forge-std/Script.sol";
import {ERC1967Proxy} from "openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol";

import "../src/utils/SuperRareAdmin.sol";
import "../src/marketplace/MarketplaceSettingsV1.sol";
import "../src/marketplace/MarketplaceSettingsV2.sol";
import "../src/marketplace/MarketplaceSettingsV3.sol";
import "../src/registry/RareAppRegistry.sol";
import "../src/registry/CreatorRegistry.sol";
import "../src/registry/RoyaltyRegistry.sol";
import "../src/registry/SpaceOperatorRegistry.sol";
import "../src/registry/ApprovedTokenRegistry.sol";
import "../src/payments/Payments.sol";
import "../src/token/ERC721/superrare/SuperRareV2.sol";
import "../src/token/ERC721/sovereign/SovereignNFTContractFactory.sol";
import "../src/collection/RareMinter.sol";
import "../src/marketplace/SuperRareMarketplace.sol";
import "../src/auctionhouse/SuperRareAuctionHouse.sol";
import "../src/bazaar/SuperRareBazaar.sol";
import "../src/staking/registry/StakingRegistryStub.sol";

import {FallbackRegistry} from "royalty-registry/FallbackRegistry.sol";
import {ManifoldRoyaltyRegistryStub} from "../src/registry/ManifoldRoyaltyRegistryStub.sol";
import {RoyaltyEngineV1} from "royalty-registry/RoyaltyEngineV1.sol";

/// @title DeploySepolia
/// @notice Deployment script for the full Rare Protocol stack on Sepolia testnet.
contract DeploySepolia is Script {
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address deployer = vm.addr(deployerPrivateKey);
address rareToken = vm.envAddress("RARE_ADDRESS");

vm.startBroadcast(deployerPrivateKey);

// 1. SuperRareV2 (for SuperRareAdmin)
SuperRareV2 superRareV2 = new SuperRareV2("SuperRareV2", "SUPR");

// 2. SuperRareAdmin
SuperRareAdmin admin = new SuperRareAdmin(address(superRareV2));

// 3. MarketplaceSettings V1 -> V2 -> V3
MarketplaceSettingsV1 settingsV1 = new MarketplaceSettingsV1();
MarketplaceSettingsV2 settingsV2 = new MarketplaceSettingsV2(deployer, address(settingsV1));
MarketplaceSettingsV3 settingsV3 = new MarketplaceSettingsV3(deployer, address(settingsV2));

// 4. RareAppRegistry
RareAppRegistry appRegistry = new RareAppRegistry(deployer);

// 5. SovereignNFTContractFactory (deploy first for CreatorRegistry)
SovereignNFTContractFactory sovFactory = new SovereignNFTContractFactory();

// 6. CreatorRegistry, Rare RoyaltyRegistry
address[] memory creatorImplementations = new address[](1);
creatorImplementations[0] = sovFactory.sovereignNFT();
CreatorRegistry creatorRegistry = new CreatorRegistry(creatorImplementations);
RoyaltyRegistry rareRoyaltyRegistry = new RoyaltyRegistry(address(creatorRegistry));

// 7. Royalty stack (Manifold)
FallbackRegistry fallbackRegistry = new FallbackRegistry(deployer);
ManifoldRoyaltyRegistryStub manifoldRoyaltyRegistry = new ManifoldRoyaltyRegistryStub();
RoyaltyEngineV1 royaltyEngine = new RoyaltyEngineV1(address(fallbackRegistry));
royaltyEngine.initialize(deployer, address(manifoldRoyaltyRegistry));

// 8. StakingRegistryStub
StakingRegistryStub stakingStub = new StakingRegistryStub();

// 9. Payments, ApprovedTokenRegistry, SpaceOperatorRegistry
Payments payments = new Payments();
ApprovedTokenRegistry approvedTokenRegistry = new ApprovedTokenRegistry();
SpaceOperatorRegistry spaceOperatorRegistry = new SpaceOperatorRegistry();
spaceOperatorRegistry.initialize();

// 10. RareMinter (impl + proxy)
RareMinter rareMinterImpl = new RareMinter();
ERC1967Proxy rareMinterProxy = new ERC1967Proxy(
address(rareMinterImpl),
abi.encodeWithSelector(
RareMinter.initialize.selector,
deployer,
address(settingsV3),
address(spaceOperatorRegistry),
address(royaltyEngine),
address(payments),
address(approvedTokenRegistry),
address(settingsV3),
address(stakingStub)
)
);
RareMinter rareMinter = RareMinter(payable(address(rareMinterProxy)));

// 11. SuperRareMarketplace, SuperRareAuctionHouse, SuperRareBazaar
SuperRareMarketplace bazaarMarketplace = new SuperRareMarketplace();
SuperRareAuctionHouse bazaarAuctionHouse = new SuperRareAuctionHouse();
SuperRareBazaar bazaarImpl = new SuperRareBazaar();

ERC1967Proxy bazaarProxy = new ERC1967Proxy(
address(bazaarImpl),
abi.encodeWithSelector(
SuperRareBazaar.initialize.selector,
address(settingsV3),
address(rareRoyaltyRegistry),
address(royaltyEngine),
address(bazaarMarketplace),
address(bazaarAuctionHouse),
address(spaceOperatorRegistry),
address(approvedTokenRegistry),
address(payments),
address(stakingStub),
deployer
)
);
SuperRareBazaar bazaar = SuperRareBazaar(payable(address(bazaarProxy)));

// 12. Wire: setAppRegistry, grantMarketplaceAccess, addApprovedToken(RARE)
bazaar.setAppRegistry(address(appRegistry));
settingsV3.grantMarketplaceAccess(address(bazaar));
approvedTokenRegistry.addApprovedToken(rareToken);

vm.stopBroadcast();

// 13. Write deployment addresses to JSON
string memory root = "sepolia";
string memory json = vm.serializeUint(root, "chainId", 11155111);
json = vm.serializeAddress(root, "rareToken", rareToken);
json = vm.serializeAddress(root, "superRareAdmin", address(admin));
json = vm.serializeAddress(root, "marketplaceSettingsV3", address(settingsV3));
json = vm.serializeAddress(root, "rareAppRegistry", address(appRegistry));
json = vm.serializeAddress(root, "creatorRegistry", address(creatorRegistry));
json = vm.serializeAddress(root, "rareRoyaltyRegistry", address(rareRoyaltyRegistry));
json = vm.serializeAddress(root, "royaltyEngineV1", address(royaltyEngine));
json = vm.serializeAddress(root, "stakingRegistryStub", address(stakingStub));
json = vm.serializeAddress(root, "sovereignNFTContractFactory", address(sovFactory));
json = vm.serializeAddress(root, "rareMinter", address(rareMinterProxy));
json = vm.serializeAddress(root, "rareMinterImpl", address(rareMinterImpl));
json = vm.serializeAddress(root, "payments", address(payments));
json = vm.serializeAddress(root, "approvedTokenRegistry", address(approvedTokenRegistry));
json = vm.serializeAddress(root, "spaceOperatorRegistry", address(spaceOperatorRegistry));
json = vm.serializeAddress(root, "superRareMarketplace", address(bazaarMarketplace));
json = vm.serializeAddress(root, "superRareAuctionHouse", address(bazaarAuctionHouse));
json = vm.serializeAddress(root, "superRareBazaar", address(bazaarProxy));
json = vm.serializeAddress(root, "superRareBazaarImpl", address(bazaarImpl));
json = vm.serializeAddress(root, "deployer", deployer);
vm.writeJson(json, "deployments/sepolia.json");

// Log all addresses
console.log("=== Deployed Addresses ===");
console.log("RARE Token:", rareToken);
console.log("SuperRareAdmin:", address(admin));
console.log("MarketplaceSettingsV3:", address(settingsV3));
console.log("RareAppRegistry:", address(appRegistry));
console.log("CreatorRegistry:", address(creatorRegistry));
console.log("Rare RoyaltyRegistry:", address(rareRoyaltyRegistry));
console.log("RoyaltyEngineV1:", address(royaltyEngine));
console.log("StakingRegistryStub:", address(stakingStub));
console.log("SovereignNFTContractFactory:", address(sovFactory));
console.log("RareMinter:", address(rareMinterProxy));
console.log("RareMinter impl:", address(rareMinterImpl));
console.log("Payments:", address(payments));
console.log("ApprovedTokenRegistry:", address(approvedTokenRegistry));
console.log("SpaceOperatorRegistry:", address(spaceOperatorRegistry));
console.log("SuperRareMarketplace:", address(bazaarMarketplace));
console.log("SuperRareAuctionHouse:", address(bazaarAuctionHouse));
console.log("SuperRareBazaar:", address(bazaarProxy));
console.log("SuperRareBazaar impl:", address(bazaarImpl));
console.log("Deployer:", deployer);
console.log("");
console.log("Addresses written to deployments/sepolia.json");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ contract RareBatchAuctionHouseSeedSepolia is Script {
// Register the Merkle root with the auction house
address payable[] memory splitAddresses = new address payable[](1);
splitAddresses[0] = payable(deployer); // Set the deployer as the recipient
uint8[] memory splitRatios = new uint8[](1);
splitRatios[0] = 100; // 100% to the deployer
uint16[] memory splitRatios = new uint16[](1);
splitRatios[0] = 10000; // 100% to the deployer

// Register the Merkle root for the auction
rareBatchAuctionHouse.registerAuctionMerkleRoot(
Expand Down
71 changes: 71 additions & 0 deletions script/sepolia/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/bin/bash

# Sepolia Deployment Script - Rare Protocol
# Usage: ./script/sepolia/deploy.sh [--broadcast] [--verify]

BROADCAST=false
VERIFY=false

while [[ $# -gt 0 ]]; do
case $1 in
--broadcast)
BROADCAST=true
shift
;;
--verify)
VERIFY=true
shift
;;
*)
echo "Unknown parameter: $1"
echo "Usage: $0 [--broadcast] [--verify]"
exit 1
;;
esac
done

# Load .env from project root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
ENV_FILE="$PROJECT_ROOT/.env"

if [ -f "$ENV_FILE" ]; then
echo "Loading environment from .env"
set -o allexport
source "$ENV_FILE"
set +o allexport
fi

if [ -z "$RPC_URL" ]; then
echo "RPC_URL not set. Using default Sepolia RPC."
export RPC_URL="https://rpc.sepolia.org"
fi

if [ -z "$RARE_ADDRESS" ]; then
echo "ERROR: RARE_ADDRESS must be set in .env"
exit 1
fi

if [ -z "$PRIVATE_KEY" ]; then
echo "ERROR: PRIVATE_KEY must be set in .env"
exit 1
fi

# Create deployments directory for JSON output
mkdir -p "$PROJECT_ROOT/deployments"

cd "$PROJECT_ROOT"

FORGE_CMD="forge script script/DeploySepolia.s.sol:DeploySepolia --rpc-url ${RPC_URL} -vvv"

if [ "$BROADCAST" = true ]; then
echo "Broadcasting transactions to Sepolia..."
FORGE_CMD="${FORGE_CMD} --broadcast --chain-id ${CHAIN_ID:-11155111}"
if [ "$VERIFY" = true ] && [ -n "$ETHERSCAN_API_KEY" ]; then
FORGE_CMD="${FORGE_CMD} --verify --etherscan-api-key ${ETHERSCAN_API_KEY}"
fi
else
echo "Running in simulation mode (no broadcasting)..."
fi

eval "${FORGE_CMD}"
22 changes: 22 additions & 0 deletions script/sepolia/env.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Sepolia Deployment - Rare Protocol
# Copy this file to .env in the project root and update the values.
# Never commit .env to version control.

# Network Configuration
# -------------------
RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR-API-KEY
CHAIN_ID=11155111

# Deployment Account
# ------------------
# Private key (with or without 0x prefix; forge accepts both)
PRIVATE_KEY=your_private_key_here

# Contract Dependencies
# --------------------
# Sepolia $RARE token (existing)
RARE_ADDRESS=0x197FaeF3f59eC80113e773Bb6206a17d183F97CB

# Verification (optional - for --verify flag)
# ------------------------------------------
ETHERSCAN_API_KEY=your_etherscan_api_key
Loading