mirror of
https://github.com/lens-protocol/core.git
synced 2026-01-08 21:58:06 -05:00
Merge branch 'feat/fresh-v2' into feat/protocolSharedRevenueMinFeeMintModule
This commit is contained in:
290
addresses.json
290
addresses.json
@@ -1,10 +1,11 @@
|
||||
{
|
||||
"mainnet": {
|
||||
"testnet": false,
|
||||
"chainId": 137,
|
||||
"network": "polygon",
|
||||
"LensProfilesGuardianTimelock": 604800,
|
||||
"LensHandlesGuardianTimelock": 86400,
|
||||
"LensHubProxy": "0xdb46d1dc155634fbc732f92e853b10b288ad5a1d",
|
||||
"LensHub": "0xdb46d1dc155634fbc732f92e853b10b288ad5a1d",
|
||||
"ModuleGlobals": "0x3Df697FF746a60CBe9ee8D47555c88CB66f03BB9",
|
||||
"ProfileCreator": "0xe7Af8325aA443F7678B651d4f0De23663E818691",
|
||||
"LensPeriphery": "0xeff187b4190E551FC25a7fA4dFC6cf7fDeF7194f",
|
||||
@@ -153,261 +154,122 @@
|
||||
"PermissionlessCreator": "0x0b5e6100243f793e480DE6088dE6bA70aA9f3872"
|
||||
},
|
||||
"testnet": {
|
||||
"chainId": 80001,
|
||||
"network": "mumbai",
|
||||
"testnet": true,
|
||||
"chainId": 80002,
|
||||
"network": "amoy",
|
||||
"LensProfilesGuardianTimelock": 300,
|
||||
"LensHandlesGuardianTimelock": 300,
|
||||
"LensHubProxy": "0x4fbffF20302F3326B20052ab9C217C44F6480900",
|
||||
"ModuleGlobals": "0x19E75039d17D580b66bD0Eb52cF011B2966A8582",
|
||||
"ProfileCreator": "0x6C1e1bC39b13f9E0Af9424D76De899203F47755F",
|
||||
"LensPeriphery": "0xFf7Ba2334dD8D50067c664561ffFddc7aecEA870",
|
||||
"UIDataProvider": "0x2BcFaaCb0450d63860E3Ee7c62ea12330BdC96F5",
|
||||
"WMATIC": "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889",
|
||||
"TreasuryFee": 500,
|
||||
"ProfileRoyaltyFee": 500,
|
||||
"HandleRoyaltyFee": 500,
|
||||
"AnonymousProfileId": "1",
|
||||
"Currencies": [
|
||||
{
|
||||
"symbol": "WMATIC",
|
||||
"addy": "0x360ad4f9a9A8EFe9A8DCB5f461c4Cc1047E1Dcf9"
|
||||
},
|
||||
{
|
||||
"symbol": "USDC",
|
||||
"addy": "0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582"
|
||||
}
|
||||
],
|
||||
"Modules": {
|
||||
"v1": {
|
||||
"collect": [
|
||||
{
|
||||
"name": "FreeCollectModule",
|
||||
"addy": "0x41564F744244D4221B87e4570A351F507f774245"
|
||||
},
|
||||
{
|
||||
"name": "FeeCollectModule",
|
||||
"addy": "0x04DdbF98fA7D795A2c522fe501Eff5AdA68e0703"
|
||||
},
|
||||
{
|
||||
"name": "LimitedFeeCollectModule",
|
||||
"addy": "0x0206b4123E2fdec8F98BC31132e13928a793D676"
|
||||
},
|
||||
{
|
||||
"name": "SimpleFeeCollectModule",
|
||||
"addy": "0x01C43c11161B7A1960f95595445c8449a9c356D5"
|
||||
},
|
||||
{
|
||||
"name": "MultirecipientFeeCollectModule",
|
||||
"addy": "0xBA377571F81D7225A5744911932aB5451b4Ca5d7"
|
||||
},
|
||||
{
|
||||
"name": "StepwiseCollectModule",
|
||||
"addy": "0xfdf89C33b36331f7568a1885bcCf2AfaCe44084e"
|
||||
}
|
||||
],
|
||||
"follow": [
|
||||
{
|
||||
"name": "FeeFollowModule",
|
||||
"addy": "0x0000000000000000000000000000000000000000"
|
||||
},
|
||||
{
|
||||
"name": "ProfileFollowModule",
|
||||
"addy": "0x0000000000000000000000000000000000000000"
|
||||
},
|
||||
{
|
||||
"name": "RevertFollowModule",
|
||||
"addy": "0x0000000000000000000000000000000000000000"
|
||||
}
|
||||
],
|
||||
"reference": [
|
||||
{
|
||||
"name": "TokenGatedReferenceModule",
|
||||
"addy": "0xD7aE30dCD7bc74F98562C2E64B3762058289C884"
|
||||
},
|
||||
{
|
||||
"name": "FollowerOnlyReferenceModule",
|
||||
"addy": "0x50c1E6f739ad1b7ADaCdf848656682e4644aF42F"
|
||||
},
|
||||
{
|
||||
"name": "DegreesOfSeparationReferenceModule",
|
||||
"addy": "0xA740cb1f188FfF87b232cc9F5f27c473E1653d6A"
|
||||
}
|
||||
]
|
||||
"collect": [],
|
||||
"follow": [],
|
||||
"reference": []
|
||||
},
|
||||
"v2": {
|
||||
"follow": [
|
||||
{
|
||||
"name": "FeeFollowModule",
|
||||
"addy": "0xB7612562C63dDcAFE4349beE6Ca35e9170819504"
|
||||
"addy": "0x1F7A5E77493AADc59FCD835921a60A1010312D1E"
|
||||
},
|
||||
{
|
||||
"name": "RevertFollowModule",
|
||||
"addy": "0xaaB7E564ECbb2D11bCb9592A18F2E9281BA9f73A"
|
||||
"addy": "0x0c4944D3d0dDf692B578100Ed260a67c7d7F7930"
|
||||
}
|
||||
],
|
||||
"act": [
|
||||
{
|
||||
"name": "CollectPublicationAction",
|
||||
"addy": "0x4FdAae7fC16Ef41eAE8d8f6578d575C9d64722f2"
|
||||
"addy": "0x34A437A91415C36712B0D912c171c74595Be437d"
|
||||
}
|
||||
],
|
||||
"collect": [
|
||||
{
|
||||
"name": "SimpleFeeCollectModule",
|
||||
"addy": "0x345Cc3A3F9127DE2C69819C2E07bB748dE6E45ee"
|
||||
"addy": "0x185B529b421Ff60b0F2388483b757b39103cfcb1"
|
||||
},
|
||||
{
|
||||
"name": "MultirecipientFeeCollectModule",
|
||||
"addy": "0xe9FabdC429640DC35153C9Ba13AE83A0A1996912"
|
||||
"addy": "0xC13ACcCe5cDb32bED1Af0B11cdb637E3966BCB45"
|
||||
}
|
||||
],
|
||||
"reference": [
|
||||
{
|
||||
"name": "DegreesOfSeparationReferenceModule",
|
||||
"addy": "0xFb290857DBA5c24Ef548a8D98CEFba8E56293254"
|
||||
"addy": "0x2C1F5d6f6dc5df8ce021B5DF6d0AF84c32817d0C"
|
||||
},
|
||||
{
|
||||
"name": "FollowerOnlyReferenceModule",
|
||||
"addy": "0x9Dd0b6e39F8Ea8B8dE9D55acC4652573E2eCB16f"
|
||||
"addy": "0x0D11dC88286466DE99E3DE836eaF35826d373a3c"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Treasury": "0x8c6a6488822a5Dad91CBBfFAF7Af3379Bd6d8306",
|
||||
"TreasuryFee": "50",
|
||||
"LegacyCollectNFTImpl": "0x712d529Fe13c075069d97A878243e3E5A826D012",
|
||||
"FollowNFTImpl": "0xC2452BAAeffd6109750401bF83e15E5aaec98606",
|
||||
"LensHandlesImpl": "0x4d2c60431D4Fb2484C82fdD8C05985FfF93851E1",
|
||||
"LensHandles": "0x44e1668150A154f01D53d1f05B8Fa0d8f3f341a9",
|
||||
"TokenHandleRegistryImpl": "0xe3a704FEe3260cbee9B54A300be53f534Ad6755A",
|
||||
"TokenHandleRegistry": "0x66cA05cAc4e8D543028192dD28C0570a0b6e3413",
|
||||
"ModuleRegistryImpl": "0xBa7b1C57e6168b2B910b24F26FEbe41B4552A47e",
|
||||
"ModuleRegistry": "0x4BeB63842BB800A1Da77a62F2c74dE3CA39AF7C0",
|
||||
"LensHubV2Impl": "0xb4A26f55Cc2d1473b8A7649d90d34ba52A480391",
|
||||
"GovernanceContract": "0x6D90D6c3F66784f5b5AFEb68f856592e4ad158c3",
|
||||
"GovernanceContractAdmin": "0x1A1cDf59C94a682a067fA2D288C2167a8506abd7",
|
||||
"ProxyAdminContract": "0xfbAddb4efA038325800846238e928529b7DD4a67",
|
||||
"ProxyAdminContractAdmin": "0xcB6C7b2E340D50701d45d55507f19A5cE5d72330",
|
||||
"LensV2UpgradeContract": "0x0Bd9617289e79751a9e1a0a19232608E1F7C36A4",
|
||||
"ProfileCreationProxy": "0x0554a7163C3aa423429719940FFE179F21cD83f6",
|
||||
"PublicActProxyImpl": "0x8555ad9CaCf2DE9873C15ed8369FC8BE7E2675FA",
|
||||
"PublicActProxy": "0x4ed64Eb32C96Df0eA60BB8934798F4DFd3098Ba1",
|
||||
"CollectNFT": "0x15062A8b16EAe79D68EC6a583212349bdF679C5e",
|
||||
"CollectPublicationActionImpl": "0x2f422811ABBc5AFA6d18f083e70Bc6326fD245E0",
|
||||
"LitAccessControlImpl": "0x6F0512aC88DDEB0A4bE8EeCC716daC0793EeCff2",
|
||||
"LitAccessControl": "0xc4F726a10fDEb0E98e16Fa658b606192d57FC71c",
|
||||
"AnonymousProfileId": "3",
|
||||
"FollowTokenURI": "0xB9136f393861822cF2CAEa7E7062f6c71354d46f",
|
||||
"PermissionlessCreatorImpl": "0xBb841c444655558176aBf97993b7f653A2B24994",
|
||||
"PermissionlessCreator": "0xCb4FB63c3f13CB83cCD6F10E9e5F29eC250329Cc",
|
||||
"FreeCreditsProvider": "0xC3161EeE3A055860125eE0b70412e4e4081852dD",
|
||||
"ProfileTokenURI": "0x19787A2E8b396077B99F381c39B2DB5781FF6D38"
|
||||
"ModuleRegistryImpl": "0x90E0b396C83F6df96Cd1f76df3Db2dAf9eae9c93",
|
||||
"ModuleRegistry": "0x9E81eD8099dF82004D298144138C12AbB959DF1E",
|
||||
"FollowNFT": "0x3CA67DAfe181AAd74Ad026Cc098E248869f50Ff1",
|
||||
"LensHubImpl": "0x68b2751C4113BbACca7c024a030355fE3989Bda7",
|
||||
"LensHub": "0xA2574D9DdB6A325Ad2Be838Bd854228B80215148",
|
||||
"LensHandlesImpl": "0x33b7C0692DD8267f936936C0A0f7079144d78B92",
|
||||
"LensHandles": "0xf6fDD7932219D64f267E4BfaF8d19774526d31D9",
|
||||
"TokenHandleRegistryImpl": "0x33E2b04f6060BbfD9f2d45EeC53787040B7DE049",
|
||||
"TokenHandleRegistry": "0x24360dc6Af3c0b37baA8B0aaDD5BcA11C1a1389A",
|
||||
"PermissionlessCreator": "0x36440da1D98FF46637f0b98AAA082bc77977B49B",
|
||||
"CreditsFaucet": "0xB4Ae4bb3A458f690A0768a9681a5a157886ADC89",
|
||||
"CollectNFT": "0xC7B6faDeCE0345E60ffa46BD3100094815aeB428",
|
||||
"LitAccessControlImpl": "0xae17Edd1CbCE05394575192006893Af9cB1AFc05",
|
||||
"LitAccessControl": "0x9Ddad77aD520d02D2566563b446935C6edD970fC",
|
||||
"PublicActProxy": "0x88c8fa7C470d9d94aDfA40187157917B26A548d3",
|
||||
"GovernanceContract": "0x17e37DC312934108DaC5905897559C4c4A81b994",
|
||||
"GovernanceContractAdmin": "0x532BbA5445e306cB83cF26Ef89842d4701330A45",
|
||||
"ProxyAdminContract": "0xF71926E6487D465A307Bc0AcB5da50Ab7A15DA27",
|
||||
"ProxyAdminContractAdmin": "0xFBD6b26d7d6FaF3e3AccC77Aa645AeaB6c024d23",
|
||||
"ProfileCreationProxy": "0x8de25afc4B37e0AdBb58caf3dF06fAf419455404",
|
||||
"Treasury": "0x648Ddb72d51B5f1849586f6Fd2a95E70754A126A"
|
||||
},
|
||||
"sandbox": {
|
||||
"chainId": 80001,
|
||||
"network": "mumbai",
|
||||
"example": {
|
||||
"testnet": true,
|
||||
"chainId": 69,
|
||||
"network": "example",
|
||||
"LensProfilesGuardianTimelock": 300,
|
||||
"LensHandlesGuardianTimelock": 300,
|
||||
"LensHubProxy": "0x7582177F9E536aB0b6c721e11f383C326F2Ad1D5",
|
||||
"ProfileCreator": "0x6C1e1bC39b13f9E0Af9424D76De899203F47755F",
|
||||
"LensPeriphery": "0xa6bcF4398824A199965f89094796DFCcEa81b1a6",
|
||||
"ModuleGlobals": "0xcbCC5b9611d22d11403373432642Df9Ef7Dd81AD",
|
||||
"PoolAddressesProvider": "0x5343b5bA672Ae99d627A1C87866b8E53F47Db2E6",
|
||||
"MockSandboxGovernance": "0x1677d9cC4861f1C85ac7009d5F06f49c928CA2AD",
|
||||
"Currencies": [
|
||||
{
|
||||
"symbol": "EXAMPLE",
|
||||
"addy": "0x0000000000000000000000000000000000000006"
|
||||
},
|
||||
{
|
||||
"symbol": "BITCOIN",
|
||||
"addy": "0x0000000000000000000000000000000000000009"
|
||||
}
|
||||
],
|
||||
"Modules": {
|
||||
"v1": {
|
||||
"collect": [
|
||||
{
|
||||
"name": "FreeCollectModule",
|
||||
"addy": "0x11C45Cbc6fDa2dbe435C0079a2ccF9c4c7051595"
|
||||
},
|
||||
{
|
||||
"name": "FeeCollectModule",
|
||||
"addy": "0xE98a40DB1170B3A46ffa7bA84335A0A0e9A65C2d"
|
||||
},
|
||||
{
|
||||
"name": "LimitedFeeCollectModule",
|
||||
"addy": "0x27742f7e82356e1c1e4177C11f627B5Dc18E4686"
|
||||
},
|
||||
{
|
||||
"name": "TimedFeeCollectModule",
|
||||
"addy": "0x6Bf382f52398DAdD3969Fb9C1AB3a1Bab8268F4E"
|
||||
},
|
||||
{
|
||||
"name": "LimitedTimedFeeCollectModule",
|
||||
"addy": "0x75Df383C587B0de2EB00FeA95B9b8e3AF35EbCe6"
|
||||
},
|
||||
{
|
||||
"name": "RevertCollectModule",
|
||||
"addy": "0x75fe7513709E6Ca573d017cE979F7d35192CE0d5"
|
||||
},
|
||||
{
|
||||
"name": "SimpleFeeCollectModule",
|
||||
"addy": "0xb4a9874adc790eec88fd086e43d329bbc9520efd"
|
||||
},
|
||||
{
|
||||
"name": "MultirecipientFeeCollectModule",
|
||||
"addy": "0x99d6c3eabf05435e851c067d2c3222716f7fcfe5"
|
||||
},
|
||||
{
|
||||
"name": "StepwiseCollectModule",
|
||||
"addy": "0x7a7b8e7699e0492da1d3c7eab7e2f3bf1065aa40"
|
||||
},
|
||||
{
|
||||
"name": "ERC4626FeeCollectModule",
|
||||
"addy": "0x79697402bd2caa19a53d615fb1a30a98e35b84d5"
|
||||
},
|
||||
{
|
||||
"name": "AaveFeeCollectModule",
|
||||
"addy": "0x912860ed4ed6160c48a52d52fcab5c059d34fe5a"
|
||||
}
|
||||
],
|
||||
"follow": [
|
||||
{
|
||||
"name": "FeeFollowModule",
|
||||
"addy": "0xE98a40DB1170B3A46ffa7bA84335A0A0e9A65C2d"
|
||||
},
|
||||
{
|
||||
"name": "ProfileFollowModule",
|
||||
"addy": "0x62D0EcAB45428087d91a94EE33E141B7496Ad7c3"
|
||||
},
|
||||
{
|
||||
"name": "RevertFollowModule",
|
||||
"addy": "0x65004331Ae1c3D35DF81aEC6E8C259167Bbe64E2"
|
||||
}
|
||||
],
|
||||
"reference": [
|
||||
{
|
||||
"name": "TokenGatedReferenceModule",
|
||||
"addy": "0xb4ba8dccd35bd3dcc5d58dbb9c7dff9c9268add9"
|
||||
},
|
||||
{
|
||||
"name": "FollowerOnlyReferenceModule",
|
||||
"addy": "0xB080AAc00E53FBeb04917F22096721d602c70759"
|
||||
},
|
||||
{
|
||||
"name": "DegreesOfSeparationReferenceModule",
|
||||
"addy": "0xe20D64D25779D2Ae0d76711e5Aca23EE633f2E1E"
|
||||
}
|
||||
]
|
||||
"collect": [],
|
||||
"follow": [],
|
||||
"reference": []
|
||||
},
|
||||
"v2": {}
|
||||
}
|
||||
},
|
||||
"devnet": {
|
||||
"chainId": 80001,
|
||||
"network": "mumbai",
|
||||
"LensProfilesGuardianTimelock": 300,
|
||||
"LensHandlesGuardianTimelock": 300,
|
||||
"LensHubProxy": "0xE444E6C7Fa6d21637E2ee724276Ef0b2E9250B1e",
|
||||
"LensHubImplementation": "0x82eA94D35C8589357222FE39d22076700a86a576",
|
||||
"ModuleGlobals": "0x2D61Efe6e7c7F696D5e0A6aac43Bd5035F0302B3",
|
||||
"ProfileCreationProxy": "0x334b503E75CD1900F174A0F5Acc01c57C3b8F962",
|
||||
"LegacyRevertCollectModule": "0x4c9a09e4313B3AC6065853A38332fA71C8Fc80Ab",
|
||||
"LegacyFreeCollectModule": "0xc124502653cb0bC5510515Ba63df643366ff6f52",
|
||||
"LegacyFeeFollowModule": "0x03e3d4D799271f0c4287e2bb7050aBE8c8C18d25",
|
||||
"LegacyProfileFollowModule": "0xc809B311994672c4547E80d12fEb757ED9EbBB64",
|
||||
"LegacyMultirecipientFeeCollectModule": "0x1cff6c45b0de2fff70670ef4dc67a92a1ccfe0bb",
|
||||
"LegacyStepwiseCollectModule": "0x6928d6127dfa0da401737e6ff421fcf62d5617a3",
|
||||
"LegacyERC4626FeeCollectModule": "0x31126c602cf88193825a99dcd1d17bf1124b1b4f",
|
||||
"LegacyAaveFeeCollectModule": "0x666e06215747879ee68b3e5a317dcd8411de1897",
|
||||
"LegacyTokenGatedReferenceModule": "0x86d35562ceb9f10d7c2c23c098dfeacb02f53853",
|
||||
"LegacySimpleFeeCollectModule": "0x372443083ecbb3a50b5c0c2f1b30f23a9c41f256",
|
||||
"FollowNFTImpl": "0xF02673CAb69Da82C024267f0D43712Bba066FC56",
|
||||
"LensHandlesImpl": "0x8e9d7401379E012bb98846033164B8506f78a895",
|
||||
"LensHandles": "0x1D21Ca2BEe708E12419A3e2564668F150817C2A5",
|
||||
"TokenHandleRegistryImpl": "0x7Bf77E1F9E85C6d7437B29Fdfd48Ce41c05129C6",
|
||||
"TokenHandleRegistry": "0x6968000D5c3B2569491706728D59e9a9bBc7f98B",
|
||||
"FeeFollowModule": "0xB5bF585e14b26Ac59eF416e42C422a4a2356bC6B",
|
||||
"LensHubV2Impl": "0x530Bc44E8722C61B657f80b74d64BAABD767782B",
|
||||
"GovernanceContract": "0x0Dc07bEB61a71AbD9E156D428D693f7ea24401b3",
|
||||
"ProxyAdminContract": "0xe7975519721fA50999636684439B395651fBb9CA",
|
||||
"LensV2UpgradeContract": "0x7daE0aCb7cF72639c4efbBeAB4aA5739745E6812"
|
||||
"v2": {
|
||||
"follow": [],
|
||||
"act": [],
|
||||
"collect": [],
|
||||
"reference": []
|
||||
}
|
||||
},
|
||||
"TreasuryFee": "50",
|
||||
"AnonymousProfileId": "3"
|
||||
}
|
||||
}
|
||||
|
||||
3844
broadcast/DeployFreshLensV2.s.sol/80002/9352fad2-latest.json
Normal file
3844
broadcast/DeployFreshLensV2.s.sol/80002/9352fad2-latest.json
Normal file
File diff suppressed because one or more lines are too long
3844
broadcast/DeployFreshLensV2.s.sol/80002/run-1712794134.json
Normal file
3844
broadcast/DeployFreshLensV2.s.sol/80002/run-1712794134.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
25
contracts/misc/CreditsFaucet.sol
Normal file
25
contracts/misc/CreditsFaucet.sol
Normal file
@@ -0,0 +1,25 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.15;
|
||||
|
||||
interface IPermissionlessCreator {
|
||||
function increaseCredits(address account, uint256 amount) external;
|
||||
|
||||
function decreaseCredits(address account, uint256 amount) external;
|
||||
}
|
||||
|
||||
contract CreditsFaucet {
|
||||
IPermissionlessCreator permissionlessCreator;
|
||||
|
||||
constructor(address permissionlessCreator_) {
|
||||
permissionlessCreator = IPermissionlessCreator(permissionlessCreator_);
|
||||
}
|
||||
|
||||
function getCredits(address account, uint256 amount) external {
|
||||
return permissionlessCreator.increaseCredits(account, amount);
|
||||
}
|
||||
|
||||
function burnCredits(uint256 amount) external {
|
||||
return permissionlessCreator.decreaseCredits(msg.sender, amount);
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.15;
|
||||
|
||||
import {PermissionlessCreator} from 'contracts/misc/PermissionlessCreator.sol';
|
||||
|
||||
contract FreeCreditsProvider {
|
||||
PermissionlessCreator permissionlessCreator;
|
||||
|
||||
constructor(address permissionlessCreator_) {
|
||||
permissionlessCreator = PermissionlessCreator(permissionlessCreator_);
|
||||
}
|
||||
|
||||
function getFreeCredit(address user, uint256 amount) external {
|
||||
return permissionlessCreator.increaseCredits(user, amount);
|
||||
}
|
||||
|
||||
function burnCredits(uint256 amount) external {
|
||||
return permissionlessCreator.decreaseCredits(msg.sender, amount);
|
||||
}
|
||||
}
|
||||
19
foundry.toml
19
foundry.toml
@@ -30,20 +30,21 @@ via_ir = true
|
||||
|
||||
# Testnet libraries:
|
||||
# libraries = [
|
||||
# 'contracts/libraries/ActionLib.sol:ActionLib:0xf76565aee4bf3641bf10090561ff0143628fde99',
|
||||
# 'contracts/libraries/FollowLib.sol:FollowLib:0xd33423b0ae94717274ef83431950a858b274c3f9',
|
||||
# 'contracts/libraries/GovernanceLib.sol:GovernanceLib:0x06df1ff944ed3f3f140fb0afae5f27429f93eba1',
|
||||
# 'contracts/libraries/LegacyCollectLib.sol:LegacyCollectLib:0xe6b308313eff636b82e7ced21cdc05ea7107504a',
|
||||
# 'contracts/libraries/MetaTxLib.sol:MetaTxLib:0xf4a73d59b5c3eeb02d007e4f82c7952cc659c06f',
|
||||
# 'contracts/libraries/MigrationLib.sol:MigrationLib:0x38fd9d33e9cdd1e99b4f9d983db64ed035ead9d4',
|
||||
# 'contracts/libraries/ProfileLib.sol:ProfileLib:0xdf4bdf058490383c9f12a25c2f28679c8154aa8b',
|
||||
# 'contracts/libraries/PublicationLib.sol:PublicationLib:0x70d2a21726bcc835e56680b173b31c38b6c33c64',
|
||||
# 'contracts/libraries/ValidationLib.sol:ValidationLib:0xef1c3a9c87177217574afd66956d203ba8f0ee6c',
|
||||
# "contracts/libraries/ActionLib.sol:ActionLib:0x6099032c8d4b93d25A50a8F0A6E2cc66259103bc",
|
||||
# "contracts/libraries/FollowLib.sol:FollowLib:0x7289854FF2e55c43AFCB895EC8cAE798811fcc2D",
|
||||
# "contracts/libraries/GovernanceLib.sol:GovernanceLib:0xf32f16af9e44cB92311DE854D138547BC1F91DC7",
|
||||
# "contracts/libraries/LegacyCollectLib.sol:LegacyCollectLib:0xCCF77B802160326282F260bb6e275333fEA9E76C",
|
||||
# "contracts/libraries/MetaTxLib.sol:MetaTxLib:0x7Afc131Fc22A703e39694c11003E55b9301BaBd7",
|
||||
# "contracts/libraries/MigrationLib.sol:MigrationLib:0xA4ad0E98a19581C8aB0426478d3aBcE83476554d",
|
||||
# "contracts/libraries/ProfileLib.sol:ProfileLib:0x653FB436CE5523d9607339C90d2D361396d699DA",
|
||||
# "contracts/libraries/PublicationLib.sol:PublicationLib:0x37CBD2C689A8eb10459D974A824ADEF74124DC7e",
|
||||
# "contracts/libraries/ValidationLib.sol:ValidationLib:0x1a4D3f97770925A14997B351C5cC3Cd47192a5B8",
|
||||
# ]
|
||||
|
||||
[rpc_endpoints]
|
||||
polygon = "${POLYGON_RPC_URL}"
|
||||
mumbai = "${MUMBAI_RPC_URL}"
|
||||
amoy = "${AMOY_RPC_URL}"
|
||||
|
||||
[fuzz]
|
||||
runs = 50
|
||||
|
||||
@@ -13,7 +13,9 @@ contract BlankScriptTemplate is Script, ForkManagement {
|
||||
uint256 profileId;
|
||||
}
|
||||
|
||||
LensAccount _deployer;
|
||||
LensAccount deployer;
|
||||
LensAccount governance;
|
||||
LensAccount proxyAdmin;
|
||||
|
||||
string mnemonic;
|
||||
|
||||
@@ -28,8 +30,12 @@ contract BlankScriptTemplate is Script, ForkManagement {
|
||||
|
||||
console.log('\n');
|
||||
|
||||
(_deployer.owner, _deployer.ownerPk) = deriveRememberKey(mnemonic, 0);
|
||||
console.log('Deployer address: %s', address(_deployer.owner));
|
||||
(deployer.owner, deployer.ownerPk) = deriveRememberKey(mnemonic, 0);
|
||||
console.log('\n- - - DEPLOYER: %s', deployer.owner);
|
||||
(governance.owner, governance.ownerPk) = deriveRememberKey(mnemonic, 1);
|
||||
console.log('\n- - - GOVERNANCE: %s', governance.owner);
|
||||
(proxyAdmin.owner, proxyAdmin.ownerPk) = deriveRememberKey(mnemonic, 2);
|
||||
console.log('\n- - - PROXYADMIN: %s', proxyAdmin.owner);
|
||||
|
||||
console.log('\n');
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ contract DeployCore is Script, ForkManagement {
|
||||
}
|
||||
|
||||
function loadBaseAddresses() internal override {
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy')));
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub')));
|
||||
vm.label(lensHub, 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', lensHub);
|
||||
|
||||
|
||||
575
script/DeployFreshLensV2.s.sol
Normal file
575
script/DeployFreshLensV2.s.sol
Normal file
@@ -0,0 +1,575 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.13;
|
||||
|
||||
import {ForkManagement} from 'script/helpers/ForkManagement.sol';
|
||||
import 'forge-std/Script.sol';
|
||||
import {LensV2UpgradeContract} from 'contracts/misc/LensV2UpgradeContract.sol';
|
||||
import {FollowNFT} from 'contracts/FollowNFT.sol';
|
||||
import {LensHandles} from 'contracts/namespaces/LensHandles.sol';
|
||||
import {TokenHandleRegistry} from 'contracts/namespaces/TokenHandleRegistry.sol';
|
||||
import {TransparentUpgradeableProxy} from '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol';
|
||||
import {Governance} from 'contracts/misc/access/Governance.sol';
|
||||
import {LensV2UpgradeContract} from 'contracts/misc/LensV2UpgradeContract.sol';
|
||||
import {ProxyAdmin} from 'contracts/misc/access/ProxyAdmin.sol';
|
||||
import {LensHubInitializable} from 'contracts/misc/LensHubInitializable.sol';
|
||||
import {ILensHub} from 'contracts/interfaces/ILensHub.sol';
|
||||
import {ILensHandles} from 'contracts/interfaces/ILensHandles.sol';
|
||||
import {ITokenHandleRegistry} from 'contracts/interfaces/ITokenHandleRegistry.sol';
|
||||
import {ProfileCreationProxy} from 'contracts/misc/ProfileCreationProxy.sol';
|
||||
import {PermissionlessCreator} from 'contracts/misc/PermissionlessCreator.sol';
|
||||
import {CreditsFaucet} from 'contracts/misc/CreditsFaucet.sol';
|
||||
import {CollectNFT} from 'contracts/modules/act/collect/CollectNFT.sol';
|
||||
import {CollectPublicationAction} from 'contracts/modules/act/collect/CollectPublicationAction.sol';
|
||||
import {SimpleFeeCollectModule} from 'contracts/modules/act/collect/SimpleFeeCollectModule.sol';
|
||||
import {MultirecipientFeeCollectModule} from 'contracts/modules/act/collect/MultirecipientFeeCollectModule.sol';
|
||||
import {FeeFollowModule} from './../contracts/modules/follow/FeeFollowModule.sol';
|
||||
import {RevertFollowModule} from 'contracts/modules/follow/RevertFollowModule.sol';
|
||||
import {DegreesOfSeparationReferenceModule} from 'contracts/modules/reference/DegreesOfSeparationReferenceModule.sol';
|
||||
import {FollowerOnlyReferenceModule} from 'contracts/modules/reference/FollowerOnlyReferenceModule.sol';
|
||||
import {TokenGatedReferenceModule} from 'contracts/modules/reference/TokenGatedReferenceModule.sol';
|
||||
import {Types} from 'contracts/libraries/constants/Types.sol';
|
||||
import {ModuleRegistry} from 'contracts/misc/ModuleRegistry.sol';
|
||||
import {IModuleRegistry} from 'contracts/interfaces/IModuleRegistry.sol';
|
||||
import {LitAccessControl} from 'contracts/misc/access/LitAccessControl.sol';
|
||||
import {PublicActProxy} from './../contracts/misc/PublicActProxy.sol';
|
||||
import {Governance} from './../contracts/misc/access/Governance.sol';
|
||||
import {ProxyAdmin} from './../contracts/misc/access/ProxyAdmin.sol';
|
||||
import {ERC2981CollectionRoyalties} from './../contracts/base/ERC2981CollectionRoyalties.sol';
|
||||
|
||||
import {ArrayHelpers} from 'test/helpers/ArrayHelpers.sol';
|
||||
|
||||
contract DeployFreshLensV2 is Script, ForkManagement, ArrayHelpers {
|
||||
using stdJson for string;
|
||||
|
||||
string addressesFile = 'addressesV2.txt';
|
||||
|
||||
bytes32 constant ADMIN_SLOT = bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1);
|
||||
string mnemonic;
|
||||
|
||||
uint256 internal PROFILE_GUARDIAN_COOLDOWN;
|
||||
uint256 internal HANDLE_GUARDIAN_COOLDOWN;
|
||||
|
||||
struct LensAccount {
|
||||
uint256 ownerPk;
|
||||
address owner;
|
||||
uint256 profileId;
|
||||
}
|
||||
|
||||
LensAccount deployer;
|
||||
LensAccount governance;
|
||||
LensAccount proxyAdmin;
|
||||
LensAccount treasury;
|
||||
LensAccount profileCreator;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ModuleRegistry moduleRegistryImpl;
|
||||
TransparentUpgradeableProxy moduleRegistryProxy;
|
||||
ModuleRegistry moduleRegistry;
|
||||
FollowNFT followNFT;
|
||||
LensHubInitializable lensHubImpl;
|
||||
TransparentUpgradeableProxy hubProxy;
|
||||
ILensHub hub;
|
||||
LensHandles handlesImpl;
|
||||
TransparentUpgradeableProxy handlesProxy;
|
||||
ILensHandles handles;
|
||||
TokenHandleRegistry tokenHandleRegistryImpl;
|
||||
TransparentUpgradeableProxy tokenHandleRegistryProxy;
|
||||
ITokenHandleRegistry tokenHandleRegistry;
|
||||
PermissionlessCreator permissionlessCreatorImpl;
|
||||
TransparentUpgradeableProxy permissionlessCreatorProxy;
|
||||
PermissionlessCreator permissionlessCreator;
|
||||
CreditsFaucet creditsFaucet;
|
||||
ProfileCreationProxy profileCreationProxy;
|
||||
CollectNFT collectNFT;
|
||||
CollectPublicationAction collectPublicationActionImpl;
|
||||
TransparentUpgradeableProxy collectPublicationActionProxy;
|
||||
CollectPublicationAction collectPublicationAction;
|
||||
SimpleFeeCollectModule simpleFeeCollectModule;
|
||||
MultirecipientFeeCollectModule multirecipientFeeCollectModule;
|
||||
FeeFollowModule feeFollowModule;
|
||||
RevertFollowModule revertFollowModule;
|
||||
DegreesOfSeparationReferenceModule degreesOfSeparationReferenceModule;
|
||||
FollowerOnlyReferenceModule followerOnlyReferenceModule;
|
||||
TokenGatedReferenceModule tokenGatedReferenceModule;
|
||||
LitAccessControl litAccessControlImpl;
|
||||
TransparentUpgradeableProxy litAccessControlProxy;
|
||||
LitAccessControl litAccessControl;
|
||||
PublicActProxy publicActProxy;
|
||||
Governance governanceContract;
|
||||
ProxyAdmin proxyAdminContract;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function loadPrivateKeys() internal {
|
||||
if (isEnvSet('MNEMONIC')) {
|
||||
mnemonic = vm.envString('MNEMONIC');
|
||||
}
|
||||
|
||||
if (bytes(mnemonic).length == 0) {
|
||||
revert('Missing mnemonic');
|
||||
}
|
||||
|
||||
console.log('\n- - - CURRENT BLOCK: ', block.number);
|
||||
|
||||
(deployer.owner, deployer.ownerPk) = deriveRememberKey(mnemonic, 0);
|
||||
console.log('\n- - - DEPLOYER: %s', deployer.owner);
|
||||
(governance.owner, governance.ownerPk) = deriveRememberKey(mnemonic, 1);
|
||||
console.log('\n- - - GOVERNANCE: %s', governance.owner);
|
||||
(proxyAdmin.owner, proxyAdmin.ownerPk) = deriveRememberKey(mnemonic, 2);
|
||||
console.log('\n- - - PROXYADMIN: %s', proxyAdmin.owner);
|
||||
(treasury.owner, treasury.ownerPk) = deriveRememberKey(mnemonic, 3);
|
||||
console.log('\n- - - TREASURY: %s', treasury.owner);
|
||||
profileCreator.owner = 0x6C1e1bC39b13f9E0Af9424D76De899203F47755F;
|
||||
console.log('\n- - - PROFILE CREATOR: %s', profileCreator.owner);
|
||||
}
|
||||
|
||||
function saveContractAddress(string memory contractName, address deployedAddress) internal {
|
||||
// console.log('Saving %s (%s) into addresses under %s environment', contractName, deployedAddress, targetEnv);
|
||||
string[] memory inputs = new string[](5);
|
||||
inputs[0] = 'node';
|
||||
inputs[1] = 'script/helpers/saveAddress.js';
|
||||
inputs[2] = targetEnv;
|
||||
inputs[3] = contractName;
|
||||
inputs[4] = vm.toString(deployedAddress);
|
||||
// bytes memory res =
|
||||
vm.ffi(inputs);
|
||||
// string memory output = abi.decode(res, (string));
|
||||
// console.log(output);
|
||||
}
|
||||
|
||||
function saveModule(
|
||||
string memory moduleName,
|
||||
address moduleAddress,
|
||||
string memory lensVersion,
|
||||
string memory moduleType
|
||||
) internal {
|
||||
// console.log('Saving %s (%s) into addresses under %s environment', moduleName, moduleAddress, targetEnv);
|
||||
string[] memory inputs = new string[](7);
|
||||
inputs[0] = 'node';
|
||||
inputs[1] = 'script/helpers/saveAddress.js';
|
||||
inputs[2] = targetEnv;
|
||||
inputs[3] = moduleName;
|
||||
inputs[4] = vm.toString(moduleAddress);
|
||||
inputs[5] = lensVersion;
|
||||
inputs[6] = moduleType;
|
||||
// bytes memory res =
|
||||
vm.ffi(inputs);
|
||||
// string memory output = abi.decode(res, (string));
|
||||
// console.log(output);
|
||||
}
|
||||
|
||||
function saveValue(string memory contractName, string memory str) internal {
|
||||
// console.log('Saving %s (%s) into addresses under %s environment', contractName, deployedAddress, targetEnv);
|
||||
string[] memory inputs = new string[](5);
|
||||
inputs[0] = 'node';
|
||||
inputs[1] = 'script/helpers/saveAddress.js';
|
||||
inputs[2] = targetEnv;
|
||||
inputs[3] = contractName;
|
||||
inputs[4] = str;
|
||||
// bytes memory res =
|
||||
vm.ffi(inputs);
|
||||
// string memory output = abi.decode(res, (string));
|
||||
// console.log(output);
|
||||
}
|
||||
|
||||
function _logDeployedAddress(address deployedAddress, string memory addressLabel) internal {
|
||||
console.log('\n+ + + ', addressLabel, ': ', deployedAddress);
|
||||
vm.writeLine(addressesFile, string.concat(addressLabel, string.concat(': ', vm.toString(deployedAddress))));
|
||||
saveContractAddress(addressLabel, deployedAddress);
|
||||
}
|
||||
|
||||
function _logDeployedModule(address deployedAddress, string memory moduleName, string memory moduleType) internal {
|
||||
string memory lensVersion = 'v2';
|
||||
console.log('\n+ + + ', moduleName, ': ', deployedAddress);
|
||||
vm.writeLine(addressesFile, string.concat(moduleName, string.concat(': ', vm.toString(deployedAddress))));
|
||||
saveModule(moduleName, deployedAddress, lensVersion, moduleType);
|
||||
}
|
||||
|
||||
function loadDeployParams() internal {
|
||||
HANDLE_GUARDIAN_COOLDOWN = json.readUint(
|
||||
string(abi.encodePacked('.', targetEnv, '.LensHandlesGuardianTimelock'))
|
||||
);
|
||||
if (HANDLE_GUARDIAN_COOLDOWN == 0) {
|
||||
console.log('HANDLE_GUARDIAN_COOLDOWN not set');
|
||||
revert('HANDLE_GUARDIAN_COOLDOWN not set');
|
||||
}
|
||||
console.log('HANDLE_GUARDIAN_COOLDOWN: %s', HANDLE_GUARDIAN_COOLDOWN);
|
||||
|
||||
PROFILE_GUARDIAN_COOLDOWN = json.readUint(
|
||||
string(abi.encodePacked('.', targetEnv, '.LensProfilesGuardianTimelock'))
|
||||
);
|
||||
if (PROFILE_GUARDIAN_COOLDOWN == 0) {
|
||||
console.log('PROFILE_GUARDIAN_COOLDOWN not set');
|
||||
revert('PROFILE_GUARDIAN_COOLDOWN not set');
|
||||
}
|
||||
console.log('PROFILE_GUARDIAN_COOLDOWN: %s', PROFILE_GUARDIAN_COOLDOWN);
|
||||
}
|
||||
|
||||
function _deployCore() internal {
|
||||
moduleRegistryImpl = new ModuleRegistry();
|
||||
_logDeployedAddress(address(moduleRegistryImpl), 'ModuleRegistryImpl');
|
||||
moduleRegistryProxy = new TransparentUpgradeableProxy({
|
||||
_logic: address(moduleRegistryImpl),
|
||||
admin_: proxyAdmin.owner,
|
||||
_data: ''
|
||||
});
|
||||
moduleRegistry = ModuleRegistry(address(moduleRegistryProxy));
|
||||
_logDeployedAddress(address(moduleRegistry), 'ModuleRegistry');
|
||||
|
||||
uint256 currentDeployerNonce = vm.getNonce(deployer.owner);
|
||||
/**
|
||||
* FollowNFT (currentDeployerNonce)
|
||||
* LensHubInitializable aka LensHubImpl (currentDeployerNonce + 1)
|
||||
* TransparentUpgradeableProxy aka LensHubProxy (currentDeployerNonce + 2)
|
||||
*/
|
||||
uint256 lensHubProxyDeploymentNonce = currentDeployerNonce + 2;
|
||||
address expectedLensHubProxyAddress = computeCreateAddress(deployer.owner, lensHubProxyDeploymentNonce);
|
||||
|
||||
followNFT = new FollowNFT(expectedLensHubProxyAddress);
|
||||
_logDeployedAddress(address(followNFT), 'FollowNFT');
|
||||
|
||||
lensHubImpl = new LensHubInitializable({
|
||||
followNFTImpl: address(followNFT),
|
||||
collectNFTImpl: address(0), // No needed on a fresh V2 deployment, no publications will have legacy collect.
|
||||
moduleRegistry: address(moduleRegistry),
|
||||
tokenGuardianCooldown: PROFILE_GUARDIAN_COOLDOWN,
|
||||
migrationParams: Types.MigrationParams({
|
||||
lensHandlesAddress: address(0),
|
||||
tokenHandleRegistryAddress: address(0),
|
||||
legacyFeeFollowModule: address(0),
|
||||
legacyProfileFollowModule: address(0),
|
||||
newFeeFollowModule: address(0)
|
||||
}) // No needed on a fresh V2 deployment, no migration needed.
|
||||
});
|
||||
_logDeployedAddress(address(lensHubImpl), 'LensHubImpl');
|
||||
|
||||
hubProxy = new TransparentUpgradeableProxy({
|
||||
_logic: address(lensHubImpl),
|
||||
admin_: proxyAdmin.owner,
|
||||
_data: abi.encodeWithSelector(
|
||||
LensHubInitializable.initialize.selector,
|
||||
'Lens Protocol Profiles', // Name
|
||||
'LPP', // Symbol
|
||||
governance.owner
|
||||
)
|
||||
});
|
||||
hub = ILensHub(address(hubProxy));
|
||||
_logDeployedAddress(address(hub), 'LensHub');
|
||||
|
||||
handlesImpl = new LensHandles({
|
||||
owner: governance.owner,
|
||||
lensHub: address(hub),
|
||||
tokenGuardianCooldown: HANDLE_GUARDIAN_COOLDOWN
|
||||
});
|
||||
_logDeployedAddress(address(handlesImpl), 'LensHandlesImpl');
|
||||
|
||||
handlesProxy = new TransparentUpgradeableProxy({
|
||||
_logic: address(handlesImpl),
|
||||
admin_: proxyAdmin.owner,
|
||||
_data: ''
|
||||
});
|
||||
_logDeployedAddress(address(handlesProxy), 'LensHandles');
|
||||
handles = ILensHandles(address(handlesProxy));
|
||||
|
||||
tokenHandleRegistryImpl = new TokenHandleRegistry({lensHub: address(hub), lensHandles: address(handles)});
|
||||
_logDeployedAddress(address(tokenHandleRegistryImpl), 'TokenHandleRegistryImpl');
|
||||
|
||||
tokenHandleRegistryProxy = new TransparentUpgradeableProxy({
|
||||
_logic: address(tokenHandleRegistryImpl),
|
||||
admin_: proxyAdmin.owner,
|
||||
_data: ''
|
||||
});
|
||||
_logDeployedAddress(address(tokenHandleRegistryProxy), 'TokenHandleRegistry');
|
||||
tokenHandleRegistry = ITokenHandleRegistry(address(tokenHandleRegistryProxy));
|
||||
|
||||
permissionlessCreatorImpl = new PermissionlessCreator(
|
||||
governance.owner,
|
||||
address(hub),
|
||||
address(handles),
|
||||
address(tokenHandleRegistry)
|
||||
);
|
||||
permissionlessCreatorProxy = new TransparentUpgradeableProxy({
|
||||
_logic: address(permissionlessCreatorImpl),
|
||||
admin_: proxyAdmin.owner,
|
||||
_data: ''
|
||||
});
|
||||
permissionlessCreator = PermissionlessCreator(address(permissionlessCreatorProxy));
|
||||
_logDeployedAddress(address(permissionlessCreator), 'PermissionlessCreator');
|
||||
|
||||
if (isTestnet) {
|
||||
// Credit faucet is added as provider in the permissionless creator later in this script.
|
||||
creditsFaucet = new CreditsFaucet(address(permissionlessCreatorProxy));
|
||||
_logDeployedAddress(address(creditsFaucet), 'CreditsFaucet');
|
||||
|
||||
profileCreationProxy = new ProfileCreationProxy(
|
||||
governance.owner,
|
||||
address(hub),
|
||||
address(handles),
|
||||
address(tokenHandleRegistry)
|
||||
);
|
||||
_logDeployedAddress(address(profileCreationProxy), 'ProfileCreationProxy');
|
||||
}
|
||||
|
||||
currentDeployerNonce = vm.getNonce(deployer.owner);
|
||||
/**
|
||||
* CollectNFT (currentDeployerNonce)
|
||||
* CollectPublicationAction aka CollectPublicationActionImpl (currentDeployerNonce + 1)
|
||||
* TransparentUpgradeableProxy aka CollectPublicationActionProxy (currentDeployerNonce + 2)
|
||||
*/
|
||||
uint256 collectPublicationActionProxyDeploymentNonce = currentDeployerNonce + 2;
|
||||
address expectedCollectPublicationActionProxyAddress = computeCreateAddress(
|
||||
deployer.owner,
|
||||
collectPublicationActionProxyDeploymentNonce
|
||||
);
|
||||
|
||||
collectNFT = new CollectNFT({hub: address(hub), actionModule: expectedCollectPublicationActionProxyAddress});
|
||||
_logDeployedAddress(address(collectNFT), 'CollectNFT');
|
||||
|
||||
collectPublicationActionImpl = new CollectPublicationAction({
|
||||
hub: address(hub),
|
||||
collectNFTImpl: address(collectNFT),
|
||||
moduleOwner: governance.owner
|
||||
});
|
||||
|
||||
collectPublicationActionProxy = new TransparentUpgradeableProxy({
|
||||
_logic: address(collectPublicationActionImpl),
|
||||
admin_: proxyAdmin.owner,
|
||||
_data: ''
|
||||
});
|
||||
collectPublicationAction = CollectPublicationAction(address(collectPublicationActionProxy));
|
||||
_logDeployedModule(address(collectPublicationAction), 'CollectPublicationAction', 'act');
|
||||
}
|
||||
|
||||
function _deployFollowModules() internal {
|
||||
feeFollowModule = new FeeFollowModule({
|
||||
hub: address(hub),
|
||||
moduleRegistry: address(moduleRegistry),
|
||||
moduleOwner: governance.owner
|
||||
});
|
||||
_logDeployedModule(address(feeFollowModule), 'FeeFollowModule', 'follow');
|
||||
|
||||
revertFollowModule = new RevertFollowModule({moduleOwner: governance.owner});
|
||||
_logDeployedModule(address(revertFollowModule), 'RevertFollowModule', 'follow');
|
||||
}
|
||||
|
||||
function _deployCollectModules() internal {
|
||||
simpleFeeCollectModule = new SimpleFeeCollectModule({
|
||||
hub: address(hub),
|
||||
actionModule: address(collectPublicationAction),
|
||||
moduleRegistry: address(moduleRegistry),
|
||||
moduleOwner: governance.owner
|
||||
});
|
||||
_logDeployedModule(address(simpleFeeCollectModule), 'SimpleFeeCollectModule', 'collect');
|
||||
|
||||
multirecipientFeeCollectModule = new MultirecipientFeeCollectModule({
|
||||
hub: address(hub),
|
||||
actionModule: address(collectPublicationAction),
|
||||
moduleRegistry: address(moduleRegistry),
|
||||
moduleOwner: governance.owner
|
||||
});
|
||||
_logDeployedModule(address(multirecipientFeeCollectModule), 'MultirecipientFeeCollectModule', 'collect');
|
||||
}
|
||||
|
||||
function _deployReferenceModules() internal {
|
||||
degreesOfSeparationReferenceModule = new DegreesOfSeparationReferenceModule({
|
||||
hub: address(hub),
|
||||
moduleOwner: governance.owner
|
||||
});
|
||||
_logDeployedModule(
|
||||
address(degreesOfSeparationReferenceModule),
|
||||
'DegreesOfSeparationReferenceModule',
|
||||
'reference'
|
||||
);
|
||||
|
||||
followerOnlyReferenceModule = new FollowerOnlyReferenceModule({
|
||||
hub: address(hub),
|
||||
moduleOwner: governance.owner
|
||||
});
|
||||
_logDeployedModule(address(followerOnlyReferenceModule), 'FollowerOnlyReferenceModule', 'reference');
|
||||
}
|
||||
|
||||
function _deployPeripherialContracts() internal {
|
||||
litAccessControlImpl = new LitAccessControl(address(hub), address(collectPublicationAction));
|
||||
_logDeployedAddress(address(litAccessControlImpl), 'LitAccessControlImpl');
|
||||
|
||||
litAccessControlProxy = new TransparentUpgradeableProxy({
|
||||
_logic: address(litAccessControlImpl),
|
||||
admin_: proxyAdmin.owner,
|
||||
_data: ''
|
||||
});
|
||||
litAccessControl = LitAccessControl(address(litAccessControlProxy));
|
||||
_logDeployedAddress(address(litAccessControl), 'LitAccessControl');
|
||||
|
||||
publicActProxy = new PublicActProxy({
|
||||
lensHub: address(hub),
|
||||
collectPublicationAction: address(collectPublicationAction)
|
||||
});
|
||||
_logDeployedAddress(address(publicActProxy), 'PublicActProxy');
|
||||
}
|
||||
|
||||
// TODO: Use from test/ContractAddresses?
|
||||
struct Currency {
|
||||
address addy;
|
||||
string symbol;
|
||||
}
|
||||
|
||||
function _registerCurrencies() internal {
|
||||
console.log('\n[Registering currencies]');
|
||||
|
||||
Currency[] memory currencies = abi.decode(
|
||||
vm.parseJson(json, string(abi.encodePacked('.', targetEnv, '.Currencies'))),
|
||||
(Currency[])
|
||||
);
|
||||
|
||||
for (uint256 i = 0; i < currencies.length; i++) {
|
||||
moduleRegistry.registerErc20Currency(currencies[i].addy);
|
||||
console.log('\n* * * ', currencies[i].symbol, ' registered as currency: ', currencies[i].addy);
|
||||
vm.writeLine(
|
||||
addressesFile,
|
||||
string.concat(currencies[i].symbol, string.concat(': ', vm.toString(currencies[i].addy)))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function _registerModules() internal {
|
||||
// Follow modules
|
||||
moduleRegistry.registerModule(address(feeFollowModule), uint256(IModuleRegistry.ModuleType.FOLLOW_MODULE));
|
||||
console.log('\n* * * FeeFollowModule registered as follow module');
|
||||
|
||||
moduleRegistry.registerModule(address(revertFollowModule), uint256(IModuleRegistry.ModuleType.FOLLOW_MODULE));
|
||||
console.log('\n* * * RevertFollowModule registered as follow module');
|
||||
|
||||
// Reference modules
|
||||
moduleRegistry.registerModule(
|
||||
address(degreesOfSeparationReferenceModule),
|
||||
uint256(IModuleRegistry.ModuleType.REFERENCE_MODULE)
|
||||
);
|
||||
console.log('\n* * * DegreesOfSeparationReferenceModule registered');
|
||||
|
||||
moduleRegistry.registerModule(
|
||||
address(followerOnlyReferenceModule),
|
||||
uint256(IModuleRegistry.ModuleType.REFERENCE_MODULE)
|
||||
);
|
||||
console.log('\n* * * FollowerOnlyReferenceModule registered');
|
||||
|
||||
// Collect modules
|
||||
moduleRegistry.registerModule(
|
||||
address(collectPublicationAction),
|
||||
uint256(IModuleRegistry.ModuleType.PUBLICATION_ACTION_MODULE)
|
||||
);
|
||||
console.log('\n* * * CollectPublicationAction registered as action module');
|
||||
|
||||
collectPublicationAction.registerCollectModule(address(simpleFeeCollectModule));
|
||||
console.log('\n* * * SimpleFeeCollectModule registered as collect module');
|
||||
|
||||
collectPublicationAction.registerCollectModule(address(multirecipientFeeCollectModule));
|
||||
console.log('\n* * * MultirecipientFeeCollectModule registered as collect module');
|
||||
}
|
||||
|
||||
function deploy() internal {
|
||||
loadDeployParams();
|
||||
|
||||
vm.startBroadcast(deployer.ownerPk);
|
||||
{
|
||||
_deployCore();
|
||||
|
||||
_deployCollectModules();
|
||||
|
||||
_deployFollowModules();
|
||||
|
||||
_deployReferenceModules();
|
||||
|
||||
_deployPeripherialContracts();
|
||||
}
|
||||
vm.stopBroadcast();
|
||||
|
||||
vm.startBroadcast(governance.ownerPk);
|
||||
{
|
||||
if (isTestnet) {
|
||||
console.log('\n[Adding Credits Faucet as Credit Provider]');
|
||||
permissionlessCreator.addCreditProvider(address(creditsFaucet));
|
||||
|
||||
hub.whitelistProfileCreator(address(profileCreationProxy), true);
|
||||
console.log('\n* * * Profile creation proxy contract registered as profile creator');
|
||||
}
|
||||
|
||||
_registerCurrencies();
|
||||
|
||||
hub.whitelistProfileCreator(address(permissionlessCreator), true);
|
||||
console.log('\n* * * Permissionless creator contract registered as profile creator');
|
||||
|
||||
_registerModules();
|
||||
|
||||
hub.setState(Types.ProtocolState.Unpaused);
|
||||
console.log('\n* * * Protocol unpaused');
|
||||
|
||||
hub.setTreasury(treasury.owner);
|
||||
console.log('\n* * * Treasury set to: ', treasury.owner);
|
||||
saveContractAddress('Treasury', treasury.owner);
|
||||
|
||||
uint256 treasuryFee = json.readUint(string(abi.encodePacked('.', targetEnv, '.TreasuryFee')));
|
||||
if (treasuryFee > 10_000) {
|
||||
revert('Treasury fee exceeding max BPS');
|
||||
}
|
||||
hub.setTreasuryFee(uint16(treasuryFee));
|
||||
console.log('\n* * * Treasury fee set to: ', treasuryFee);
|
||||
|
||||
uint256 profileRoyaltyFee = json.readUint(string(abi.encodePacked('.', targetEnv, '.ProfileRoyaltyFee')));
|
||||
ERC2981CollectionRoyalties(address(hub)).setRoyalty(profileRoyaltyFee);
|
||||
|
||||
uint256 handleRoyaltyFee = json.readUint(string(abi.encodePacked('.', targetEnv, '.HandleRoyaltyFee')));
|
||||
ERC2981CollectionRoyalties(address(handles)).setRoyalty(handleRoyaltyFee);
|
||||
|
||||
uint256 anonymousProfileId = permissionlessCreator.createProfile({
|
||||
createProfileParams: Types.CreateProfileParams({
|
||||
to: deployer.owner,
|
||||
followModule: address(0),
|
||||
followModuleInitData: ''
|
||||
}),
|
||||
delegatedExecutors: new address[](0)
|
||||
});
|
||||
|
||||
vm.writeLine(addressesFile, string.concat('AnonymousProfileId :', vm.toString(anonymousProfileId)));
|
||||
console.log('\n* * * Anonymous profile created with id: ', anonymousProfileId);
|
||||
saveValue('AnonymousProfileId', vm.toString(anonymousProfileId));
|
||||
}
|
||||
vm.stopBroadcast();
|
||||
|
||||
vm.startBroadcast(deployer.ownerPk);
|
||||
{
|
||||
// Deploy governance and proxy-admin controllable-by-contract contracts, and transfer ownership.
|
||||
governanceContract = new Governance(address(hub), governance.owner);
|
||||
_logDeployedAddress(address(governanceContract), 'GovernanceContract');
|
||||
_logDeployedAddress(governance.owner, 'GovernanceContractAdmin');
|
||||
|
||||
proxyAdminContract = new ProxyAdmin(address(hub), address(0), proxyAdmin.owner);
|
||||
_logDeployedAddress(address(proxyAdminContract), 'ProxyAdminContract');
|
||||
_logDeployedAddress(proxyAdmin.owner, 'ProxyAdminContractAdmin');
|
||||
}
|
||||
vm.stopBroadcast();
|
||||
|
||||
vm.startBroadcast(governance.ownerPk);
|
||||
{
|
||||
hub.setGovernance(address(governanceContract));
|
||||
// hub.setEmergencyAdmin(governance.owner); // TODO: WHO ?
|
||||
}
|
||||
vm.stopBroadcast();
|
||||
|
||||
vm.startBroadcast(proxyAdmin.ownerPk);
|
||||
{
|
||||
hubProxy.changeAdmin(address(proxyAdminContract));
|
||||
}
|
||||
vm.stopBroadcast();
|
||||
}
|
||||
|
||||
function run(string memory targetEnv_) external {
|
||||
targetEnv = targetEnv_;
|
||||
loadJson();
|
||||
checkNetworkParams();
|
||||
loadPrivateKeys();
|
||||
deploy();
|
||||
// _writeBackendEnvFile();
|
||||
// _interact();
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@ contract DeployLensHub is Script, ForkManagement {
|
||||
}
|
||||
|
||||
function loadBaseAddresses() internal override {
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy')));
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub')));
|
||||
vm.label(lensHub, 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', lensHub);
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ contract DeployPermissionlessCreator is Script, ForkManagement {
|
||||
}
|
||||
|
||||
function loadBaseAddresses() internal override {
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy')));
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub')));
|
||||
vm.label(lensHub, 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', lensHub);
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ contract S01_DeployLensV2Upgrade is Script, ForkManagement, ArrayHelpers {
|
||||
ProxyAdmin proxyAdminContract;
|
||||
|
||||
function loadBaseAddresses() internal override {
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy')));
|
||||
lensHub = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub')));
|
||||
legacyLensHub = ILensGovernable(lensHub);
|
||||
vm.label(lensHub, 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', address(legacyLensHub));
|
||||
|
||||
@@ -183,7 +183,7 @@ contract S02_DeployLensV2Periphery is Script, ForkManagement, ArrayHelpers {
|
||||
vm.label(proxyAdminContractAdmin, 'ProxyAdminContractAdmin');
|
||||
console.log('ProxyAdminContractAdmin: %s', proxyAdminContractAdmin);
|
||||
|
||||
hub = ILensHub(json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy'))));
|
||||
hub = ILensHub(json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub'))));
|
||||
vm.label(address(hub), 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', address(hub));
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ contract S03_ChangeLensV1Admins is Script, ForkManagement {
|
||||
ProxyAdmin proxyAdminContract;
|
||||
|
||||
function loadBaseAddresses() internal override {
|
||||
address lensHubProxyAddress = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy')));
|
||||
address lensHubProxyAddress = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub')));
|
||||
legacyLensHub = ILensGovernable(lensHubProxyAddress);
|
||||
vm.label(lensHubProxyAddress, 'LensHub');
|
||||
console.log('Legacy Lens Hub: %s', address(legacyLensHub));
|
||||
|
||||
@@ -38,7 +38,7 @@ contract S04_PerformV2Upgrade is Script, ForkManagement {
|
||||
ProxyAdmin proxyAdminContract;
|
||||
|
||||
function loadBaseAddresses() internal override {
|
||||
address lensHubProxyAddress = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy')));
|
||||
address lensHubProxyAddress = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub')));
|
||||
legacyLensHub = ILensGovernable(lensHubProxyAddress);
|
||||
vm.label(lensHubProxyAddress, 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', address(legacyLensHub));
|
||||
|
||||
@@ -251,7 +251,7 @@ contract S05_GovernanceActions is Script, ForkManagement, ArrayHelpers {
|
||||
vm.label(proxyAdminContractAdmin, 'ProxyAdminContractAdmin');
|
||||
console.log('ProxyAdminContractAdmin: %s', proxyAdminContractAdmin);
|
||||
|
||||
hub = ILensHub(json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy'))));
|
||||
hub = ILensHub(json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub'))));
|
||||
vm.label(address(hub), 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', address(hub));
|
||||
|
||||
|
||||
@@ -205,7 +205,7 @@ contract S06_InteractWithLensV2 is Script, ForkManagement, ArrayHelpers {
|
||||
vm.label(proxyAdminContractAdmin, 'ProxyAdminContractAdmin');
|
||||
console.log('ProxyAdminContractAdmin: %s', proxyAdminContractAdmin);
|
||||
|
||||
hub = ILensHub(json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy'))));
|
||||
hub = ILensHub(json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub'))));
|
||||
vm.label(address(hub), 'LensHub');
|
||||
console.log('Lens Hub Proxy: %s', address(hub));
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ echo "Using target: $TARGET"
|
||||
|
||||
IMPLEMENTATION_SLOT="0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
|
||||
|
||||
LENSHUB=$(node script/helpers/readAddress.js $TARGET LensHubProxy)
|
||||
LENSHUB=$(node script/helpers/readAddress.js $TARGET LensHub)
|
||||
echo "LensHub Proxy: $LENSHUB"
|
||||
|
||||
LENSHUB_NEW_IMPL=$(node script/helpers/readAddress.js $TARGET LensHubV2Impl)
|
||||
|
||||
@@ -14,6 +14,7 @@ contract ForkManagement is Script {
|
||||
string network;
|
||||
string json;
|
||||
uint256 forkBlockNumber;
|
||||
bool isTestnet;
|
||||
|
||||
// TODO: Replace with forge-std/StdJson.sol::keyExists(...) when/if this PR is approved:
|
||||
// https://github.com/foundry-rs/forge-std/pull/226
|
||||
@@ -65,11 +66,13 @@ contract ForkManagement is Script {
|
||||
function checkNetworkParams() internal {
|
||||
network = json.readString(string(abi.encodePacked('.', targetEnv, '.network')));
|
||||
uint256 chainId = json.readUint(string(abi.encodePacked('.', targetEnv, '.chainId')));
|
||||
isTestnet = json.readBool(string.concat('.', targetEnv, '.testnet'));
|
||||
|
||||
console.log('\nTarget environment:', targetEnv);
|
||||
console.log('Network:', network);
|
||||
if (block.chainid != chainId) revert('Wrong chainId');
|
||||
console.log('ChainId:', chainId);
|
||||
console.log('\n\n Testnet: ', isTestnet ? 'true' : 'false');
|
||||
}
|
||||
|
||||
function getNetwork() internal returns (string memory) {
|
||||
|
||||
@@ -7,12 +7,16 @@ const findModule = (moduleType, moduleName, version) => {
|
||||
(module) => module.name === moduleName
|
||||
);
|
||||
if (!module) {
|
||||
return 'undefined';
|
||||
return '0x0000000000000000000000000000000000000000';
|
||||
} else {
|
||||
return module.addy;
|
||||
}
|
||||
};
|
||||
|
||||
const addressOrZero = (addressKey) => {
|
||||
return addresses[addressKey] || '0x0000000000000000000000000000000000000000';
|
||||
};
|
||||
|
||||
const addressesPath = '../../addresses.json';
|
||||
|
||||
const addressesJson = require(path.join(__dirname, addressesPath));
|
||||
@@ -33,7 +37,7 @@ fs.writeFileSync(`./backendEnv_${targetEnv}.txt`, '');
|
||||
const str = fs.createWriteStream(`./backendEnv_${targetEnv}.txt`, { flags: 'a' });
|
||||
|
||||
str.write(`# Hub\n`);
|
||||
str.write(`LENS_HUB_PROXY=${addresses['LensHubProxy']}\n`);
|
||||
str.write(`LENS_HUB_PROXY=${addresses['LensHub']}\n`);
|
||||
|
||||
str.write(`\n# LensHandles\n`);
|
||||
str.write(`LENS_HANDLE_PROXY=${addresses['LensHandles']}\n`);
|
||||
@@ -45,16 +49,22 @@ str.write(`\n# Public Act Proxy\n`);
|
||||
str.write(`LENS_PUBLIC_ACT_PROXY=${addresses['PublicActProxy']}\n`);
|
||||
|
||||
str.write(`\n# Profile creation proxy\n`);
|
||||
str.write(`PROFILE_CREATION_PROXY=${addresses['ProfileCreationProxy']}\n`);
|
||||
str.write(`PROFILE_CREATION_PROXY=${addressOrZero('ProfileCreationProxy')}\n`);
|
||||
|
||||
str.write(`\n# Permissionless creator\n`);
|
||||
str.write(`PERMISSONLESS_CREATOR=${addresses['PermissionlessCreator']}\n`);
|
||||
|
||||
str.write(`\n# Credits faucet\n`);
|
||||
str.write(`CREDITS_FAUCET=${addressOrZero('CreditsFaucet')}\n`);
|
||||
|
||||
str.write(`\n# Legacy ModuleGlobals for V1 (deprecated and removed in v2)\n`);
|
||||
str.write(`LEGACY_MODULE_GLOBALS=${addresses['ModuleGlobals']}\n`);
|
||||
str.write(`LEGACY_MODULE_GLOBALS=${addressOrZero('ModuleGlobals')}\n`);
|
||||
|
||||
str.write(`\n# ModuleRegistry (for V2)\n`);
|
||||
str.write(`GLOBAL_MODULE_REGISTRY=${addresses['ModuleRegistry']}\n`);
|
||||
|
||||
str.write(`\n# Legacy metadata updates\n`);
|
||||
str.write(`LEGACY_PERIPHERY_DATA_PROVIDER=${addresses['LensPeriphery']}\n`);
|
||||
str.write(`LEGACY_PERIPHERY_DATA_PROVIDER=${addressOrZero('LensPeriphery')}\n`);
|
||||
|
||||
// LEGACY COLLECT MODULES
|
||||
|
||||
@@ -159,7 +169,7 @@ str.write(
|
||||
|
||||
// PublicActProxy ProfileId
|
||||
str.write(`\n# PublicActProxy ProfileId\n`);
|
||||
str.write(`PUBLIC_ACT_PROXY_PROFILE_ID=${addresses['AnonymousProfileId']}\n`);
|
||||
str.write(`LENS_PUBLIC_ACT_PROXY_PROFILE_ID=${addresses['AnonymousProfileId']}\n`);
|
||||
|
||||
// LitAccessControl
|
||||
str.write(`\n# LitAccessControl\n`);
|
||||
|
||||
@@ -39,7 +39,7 @@ CALLDATA=$(cast calldata "run(string)" $TARGET)
|
||||
echo "Interactions calldata:"
|
||||
echo "$CALLDATA"
|
||||
|
||||
forge script script/$SCRIPT_NAME.s.sol:$SCRIPT_NAME --sig $CALLDATA --rpc-url $NETWORK -vv --legacy --skip test --ffi
|
||||
forge script script/$SCRIPT_NAME.s.sol:$SCRIPT_NAME --sig $CALLDATA --rpc-url $NETWORK -vv --skip test --ffi
|
||||
|
||||
# If the confirmation override is set to s or S - then we skip the rest of the script and exit with success
|
||||
if [[ "$CONFIRMATION_OVERRIDE" == "s" || "$CONFIRMATION_OVERRIDE" == "S" ]]
|
||||
@@ -86,7 +86,7 @@ if [[ "$CONFIRMATION" == "y" || "$CONFIRMATION" == "Y" ]]
|
||||
catapulta script script/$SCRIPT_NAME.s.sol --chain $NETWORK --sig $CALLDATA --legacy --skip test --ffi --slow --skip-git
|
||||
exit 0
|
||||
else
|
||||
forge script script/$SCRIPT_NAME.s.sol:$SCRIPT_NAME --sig $CALLDATA --rpc-url $NETWORK -vv --legacy --skip test --ffi --slow --broadcast
|
||||
forge script script/$SCRIPT_NAME.s.sol:$SCRIPT_NAME --sig $CALLDATA --rpc-url $NETWORK -vv --skip test --ffi --slow --broadcast
|
||||
fi
|
||||
|
||||
else
|
||||
|
||||
@@ -26,11 +26,11 @@ if [[ $1 == "" ]]
|
||||
echo " verifyStorageSlots.sh [targetDeployment] [contractName] [proxyNameInAddresses] [newImplNameInAddresses]"
|
||||
echo " e.g. target (required): mainnet/testnet/sandbox"
|
||||
echo " e.g. contractName (optional): LensHubInitializable (default)"
|
||||
echo " e.g. proxyNameInAddresses (optional): LensHubProxy (default)"
|
||||
echo " e.g. proxyNameInAddresses (optional): LensHub (default)"
|
||||
echo " e.g. newImplNameInAddresses (optional): LensHubV2Impl (default)"
|
||||
echo ""
|
||||
echo "Example:"
|
||||
echo " verifyStorageSlots.sh mainnet LensHub LensHubProxy LensHubV2Impl"
|
||||
echo " verifyStorageSlots.sh mainnet LensHubInitializable LensHub LensHubV2Impl"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -48,7 +48,7 @@ fi
|
||||
|
||||
if [[ $3 == "" ]]
|
||||
then
|
||||
PROXY_NAME="LensHubProxy"
|
||||
PROXY_NAME="LensHub"
|
||||
else
|
||||
PROXY_NAME=$3
|
||||
fi
|
||||
|
||||
@@ -110,7 +110,7 @@ contract TestSetup is Test, ContractAddressesLoaderDeployer, ArrayHelpers {
|
||||
|
||||
lensVersion = forkVersion;
|
||||
|
||||
hubProxyAddr = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHubProxy')));
|
||||
hubProxyAddr = json.readAddress(string(abi.encodePacked('.', targetEnv, '.LensHub')));
|
||||
vm.label(hubProxyAddr, 'LENS_HUB');
|
||||
console.log('hubProxyAddr:', hubProxyAddr);
|
||||
|
||||
|
||||
@@ -3,10 +3,9 @@ pragma solidity ^0.8.13;
|
||||
|
||||
import 'test/base/BaseTest.t.sol';
|
||||
import {PermissionlessCreator} from 'contracts/misc/PermissionlessCreator.sol';
|
||||
import {FreeCreditsProvider} from 'contracts/misc/FreeCreditsProvider.sol';
|
||||
import {Types} from 'contracts/libraries/constants/Types.sol';
|
||||
import {CreditsFaucet} from 'contracts/misc/CreditsFaucet.sol';
|
||||
|
||||
contract FreeCreditsProviderTest is BaseTest {
|
||||
contract CreditsFaucetTest is BaseTest {
|
||||
error OnlyOwner();
|
||||
|
||||
using stdJson for string;
|
||||
@@ -14,7 +13,7 @@ contract FreeCreditsProviderTest is BaseTest {
|
||||
PermissionlessCreator permissionlessCreator;
|
||||
address permissionlessCreatorOwner = makeAddr('PERMISSIONLESS_CREATOR_OWNER');
|
||||
|
||||
FreeCreditsProvider freeCreditsProvider;
|
||||
CreditsFaucet creditsFaucet;
|
||||
|
||||
function setUp() public virtual override {
|
||||
super.setUp();
|
||||
@@ -57,25 +56,25 @@ contract FreeCreditsProviderTest is BaseTest {
|
||||
vm.prank(governance);
|
||||
hub.whitelistProfileCreator(address(permissionlessCreator), true);
|
||||
|
||||
freeCreditsProvider = new FreeCreditsProvider(address(permissionlessCreator));
|
||||
creditsFaucet = new CreditsFaucet(address(permissionlessCreator));
|
||||
|
||||
vm.prank(permissionlessCreatorOwner);
|
||||
permissionlessCreator.addCreditProvider(address(freeCreditsProvider));
|
||||
permissionlessCreator.addCreditProvider(address(creditsFaucet));
|
||||
}
|
||||
|
||||
// Scenarios
|
||||
function testIncreaseCredit(address profileCreator, address txSender) public {
|
||||
vm.assume(profileCreator != address(0));
|
||||
vm.assume(profileCreator != address(permissionlessCreator));
|
||||
vm.assume(profileCreator != address(freeCreditsProvider));
|
||||
vm.assume(profileCreator != address(creditsFaucet));
|
||||
vm.assume(txSender != address(0));
|
||||
vm.assume(txSender != address(permissionlessCreator));
|
||||
vm.assume(txSender != address(freeCreditsProvider));
|
||||
vm.assume(txSender != address(creditsFaucet));
|
||||
|
||||
uint256 creditsBefore = permissionlessCreator.getCreditBalance(profileCreator);
|
||||
|
||||
vm.prank(txSender);
|
||||
freeCreditsProvider.getFreeCredit(profileCreator, 123);
|
||||
creditsFaucet.getCredits(profileCreator, 123);
|
||||
|
||||
uint256 creditsAfter = permissionlessCreator.getCreditBalance(profileCreator);
|
||||
|
||||
@@ -85,14 +84,14 @@ contract FreeCreditsProviderTest is BaseTest {
|
||||
function testDecreaseCredit(address profileCreator) public {
|
||||
vm.assume(profileCreator != address(0));
|
||||
vm.assume(profileCreator != address(permissionlessCreator));
|
||||
vm.assume(profileCreator != address(freeCreditsProvider));
|
||||
vm.assume(profileCreator != address(creditsFaucet));
|
||||
|
||||
freeCreditsProvider.getFreeCredit(profileCreator, 123456);
|
||||
creditsFaucet.getCredits(profileCreator, 123456);
|
||||
|
||||
uint256 creditsBefore = permissionlessCreator.getCreditBalance(profileCreator);
|
||||
|
||||
vm.prank(profileCreator);
|
||||
freeCreditsProvider.burnCredits(123);
|
||||
creditsFaucet.burnCredits(123);
|
||||
|
||||
uint256 creditsAfter = permissionlessCreator.getCreditBalance(profileCreator);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user