From eded37b79228229cd5b25d8abe0be69dff63a548 Mon Sep 17 00:00:00 2001 From: Ramarti Date: Fri, 8 Dec 2023 09:01:44 -0300 Subject: [PATCH] Readme (#243) * readme * renamed mvp folder to legacy * fix image --------- Co-authored-by: Raul --- README.md | 181 ++---------------- image.png | Bin 0 -> 46582 bytes .../ip-accounts/IERC6551Account.sol | 0 .../interfaces/ip-accounts/IIPAccount.sol | 0 .../ip-accounts/IIPAccountRegistry.sol | 0 .../modules/collect/ICollectModule.sol | 0 .../modules/collect/ICollectNFT.sol | 0 .../modules/collect/ICollectPaymentModule.sol | 0 .../modules/royalties/IRoyaltyDistributor.sol | 0 .../modules/royalties/IRoyaltyPolicy.sol | 0 .../modules/royalties/ISplitMain.sol | 0 .../royalties/policies/IRoyaltyPolicy.sol | 0 .../contracts/ip-accounts/IPAccountImpl.sol | 0 .../ip-accounts/IPAccountRegistry.sol | 0 .../modules/collect/CollectModuleBase.sol | 0 .../collect/CollectPaymentModuleBase.sol | 0 .../modules/collect/SimpleCollectModule.sol | 0 .../modules/collect/nft/CollectNFTBase.sol | 0 .../contracts/modules/collect/nft/ERC721.sol | 0 .../modules/royalties/RoyaltyDistributor.sol | 0 .../modules/royalties/RoyaltyNFT.sol | 0 .../modules/royalties/RoyaltyNFTFactory.sol | 0 .../MutableRoyaltyProportionPolicy.sol | 0 {mvp => legacy}/test/foundry/IPAccount.t.sol | 0 .../test/foundry/IPAccountRegistry.t.sol | 0 .../test/foundry/RoyaltyDistributor.t.sol | 0 .../test/foundry/RoyaltyDistributorFork.t.sol | 0 .../collect/BaseCollectModuleTest.sol | 0 .../collect/CollectPaymentModuleBase.t.sol | 0 .../collect/SimpleCollectModule.t.sol | 0 .../collect/nft/BaseERC721Test.sol | 0 .../collect/nft/CollectNFTBase.t.sol | 0 .../_old_modules/collect/nft/ERC721.t.sol | 0 .../test/foundry/mocks/MockCollectModule.sol | 0 .../foundry/mocks/MockCollectModuleERC721.sol | 0 .../test/foundry/mocks/MockCollectNFT.sol | 0 .../mocks/MockCollectPaymentModule.sol | 0 .../test/foundry/mocks/MockIPAccount.sol | 0 .../test/foundry/mocks/MockSplit.sol | 0 .../test/foundry/mocks/MockSplitMain.sol | 0 40 files changed, 13 insertions(+), 168 deletions(-) create mode 100644 image.png rename {mvp => legacy}/contracts/interfaces/ip-accounts/IERC6551Account.sol (100%) rename {mvp => legacy}/contracts/interfaces/ip-accounts/IIPAccount.sol (100%) rename {mvp => legacy}/contracts/interfaces/ip-accounts/IIPAccountRegistry.sol (100%) rename {mvp => legacy}/contracts/interfaces/modules/collect/ICollectModule.sol (100%) rename {mvp => legacy}/contracts/interfaces/modules/collect/ICollectNFT.sol (100%) rename {mvp => legacy}/contracts/interfaces/modules/collect/ICollectPaymentModule.sol (100%) rename {mvp => legacy}/contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol (100%) rename {mvp => legacy}/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol (100%) rename {mvp => legacy}/contracts/interfaces/modules/royalties/ISplitMain.sol (100%) rename {mvp => legacy}/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol (100%) rename {mvp => legacy}/contracts/ip-accounts/IPAccountImpl.sol (100%) rename {mvp => legacy}/contracts/ip-accounts/IPAccountRegistry.sol (100%) rename {mvp => legacy}/contracts/modules/collect/CollectModuleBase.sol (100%) rename {mvp => legacy}/contracts/modules/collect/CollectPaymentModuleBase.sol (100%) rename {mvp => legacy}/contracts/modules/collect/SimpleCollectModule.sol (100%) rename {mvp => legacy}/contracts/modules/collect/nft/CollectNFTBase.sol (100%) rename {mvp => legacy}/contracts/modules/collect/nft/ERC721.sol (100%) rename {mvp => legacy}/contracts/modules/royalties/RoyaltyDistributor.sol (100%) rename {mvp => legacy}/contracts/modules/royalties/RoyaltyNFT.sol (100%) rename {mvp => legacy}/contracts/modules/royalties/RoyaltyNFTFactory.sol (100%) rename {mvp => legacy}/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol (100%) rename {mvp => legacy}/test/foundry/IPAccount.t.sol (100%) rename {mvp => legacy}/test/foundry/IPAccountRegistry.t.sol (100%) rename {mvp => legacy}/test/foundry/RoyaltyDistributor.t.sol (100%) rename {mvp => legacy}/test/foundry/RoyaltyDistributorFork.t.sol (100%) rename {mvp => legacy}/test/foundry/_old_modules/collect/BaseCollectModuleTest.sol (100%) rename {mvp => legacy}/test/foundry/_old_modules/collect/CollectPaymentModuleBase.t.sol (100%) rename {mvp => legacy}/test/foundry/_old_modules/collect/SimpleCollectModule.t.sol (100%) rename {mvp => legacy}/test/foundry/_old_modules/collect/nft/BaseERC721Test.sol (100%) rename {mvp => legacy}/test/foundry/_old_modules/collect/nft/CollectNFTBase.t.sol (100%) rename {mvp => legacy}/test/foundry/_old_modules/collect/nft/ERC721.t.sol (100%) rename {mvp => legacy}/test/foundry/mocks/MockCollectModule.sol (100%) rename {mvp => legacy}/test/foundry/mocks/MockCollectModuleERC721.sol (100%) rename {mvp => legacy}/test/foundry/mocks/MockCollectNFT.sol (100%) rename {mvp => legacy}/test/foundry/mocks/MockCollectPaymentModule.sol (100%) rename {mvp => legacy}/test/foundry/mocks/MockIPAccount.sol (100%) rename {mvp => legacy}/test/foundry/mocks/MockSplit.sol (100%) rename {mvp => legacy}/test/foundry/mocks/MockSplitMain.sol (100%) diff --git a/README.md b/README.md index 5ae05fd8..707f72d0 100644 --- a/README.md +++ b/README.md @@ -1,178 +1,21 @@ -🚧🚧🚧🚧 **Repo in active development, expect things to break and change.** 🚧🚧🚧🚧 +🚧🚧🚧🚧 ** Alpha deployment. This code is in active development and unaudited. Do not use in Production ** 🚧🚧🚧🚧 -# Story Protocol Contracts - -# Architecture Diagram -![image](https://github.com/storyprotocol/protocol-contracts/assets/2632384/ce60fecc-1904-4c35-a4c1-577c90060feb) - -# Core Components - -In Story Protocol, the basic unit of intellectual property is the IPAsset, representing a well defined item that will be subject to a set of rules defined in each Franchise. -IPAssets will have many categories corresponding to different domains of intellectual property, starting with Narrative Universes. - -The starting IPAsset types are: -- Story -- Character -- Item -- Location -- Art -- Group - -They have mediaURL, an off chain file identifying the IPA medium, duration, divisions, authorship and other characteristics. - -IPAssets can be combined together to form more rich intellectual property, and can be remixed and extended within the legal parameters defined on each Franchise. - -## FranchiseRegistry - -ERC721 that registers all the narrative franchises in Story Protocol. -When registering a new franchise, along with minting an NFT to identify the Franchise Owner, all contracts required to represent the IPAssets, their IP rights, licenses, etc will be deployed by a factory. - -Ownership of a Franchise Registry token implies the power to: -- Configure the licensing rules for the IPAssets created in the Franchise -- Define possible Relationships between IPAssets of the same franchise 🚧 - -Since this is an ERC721, ownership of the Franchise could be determined by an EOA, Multisig, Governor contracts or whatever available web3 coordination tool. - - -## IPAssetRegistry - -ERC721 NFT where IPAssets are minted. There is 1 IPAssetRegistry per Franchise registered in Story Protocol. - -When minted, an IPAsset will also: -1. Set it's metadata -2. Set the parent IPA id, in case it is a remix -3. Assign the licenses representing its IP Rights, as defined by the Franchise Owner in the Licensing Module. -4. Configure it's collectible 🚧 - - -## IPAssetRegistryFactory - -Factory contract responsible for, when triggered by a Franchise registration, deploying an instance of the contracts required to represent and run said Franchise: -- IPAssetRegistry -- LicenseRegistry - -To save in gas, these contracts will be proxies, currently BeaconProxy clones 🚧 - -# Modules - -We have represented the IP with our Core Components. Now let's look into the contracts that add utility and features to manage IP in Story Protocol: - - -## Relationships - -A Relationship is an on-chain directional association between 2 IPAssets (or an IPAsset and an external NFT), identified by an ID and a set of pre conditions that gives it meaning. - -Relationships can have **previous steps**, defined by **RelationshipProcessor** contracts, that can be built to: - -- Check ownership over IPAssets being related. -- Require payment in native currency, ERC20s... -- Require the approval of the owner of one of the IPA -- Any other interaction with other protocols, oracles... - -Since they are on-chain, they help compose with other modules or external protocols/contracts: -- They can be created as a result of the execution of other modules (e.g agreeing on the Licensing terms for a Character creates an APPEARS_IN relationship between Character and Story) -- They can be a condition for the correct execution of a module (IPA owner can emit commercial license of a Character IPA if said IPA has a EXTERNAL_PFP relation) -- They can just have narrative meaning within the Franchise (two characters DID_HOOKUP, a story IS_SEQUEL of another) or some other community interation. - -There is going to be 2 levels for Relationships: -- Protocol-wide relationships, defined by Governance and with interaction with protocol modules -- Franchise level relationships, to be defined by Franchise Owner 🚧 - -Protocol-wide relationships need to be proposed through a governance process, [like this one](https://github.com/storyprotocol/protocol-contracts/issues/33) - -A system to dispute and revoke Relationships is in the works 🚧 +[See Alpha agreement if you are going to use these contracts](https://github.com/storyprotocol/protocol-contracts/blob/main/StoryProtocol-AlphaTestingAgreement-17942166.3.pdf) -## Licensing +![Logo](image.png) -The Licensing Module is at the heart of Story Protocol. It aims to create a transparent, public and fair legal environment for Franchise Owners and Creators to develop an IP while capturing the value and ownership among different contributors in a novel way. - -It has several component contracts: - -### RightsManager -Every IPAssetRegistry is a RightsManager, which implements a modified version of [draft EIP-5218](https://eips.ethereum.org/EIPS/eip-5218). - -It manages trees of License structs and all their sublicenses. If a License is revoked (every License has a revoker address), all the licenses down the tree will be too. - -Every License can have none or many on-chain an off-chain terms, and both will be able to be composed from many "License Legos" 🚧 -- **Off-chain terms** are given by the License metadata and legal text files linked to the License struct (in the works, based in the Token Bound License)🚧. Off-chain terms will be enforced via a market of licensing flagger/revoker services, individuals and oracles or in worst case scenario, the legacy legal system. -- **On-chain terms** are TermsProcessor contracts, that must be executed by the current License Holder in order to activate the License. These can include: - - Time limitations, with or without renewal. - - Setting revenue splits in the Royalty Module. - - Payment. - - Approval of the content by the licensor. - - Creation or check for existance of a Relationship between assets. - - External NFT ownership - - KYC Oracle - - Other cases build by the community - -A RightsManager allows us to grant 2 **type of License:** - -1. **Rights**: Licenses tied to a tokenId (IPAsset id), in which the license holder is always the owner of said tokenId. Each tokenId can have commercial or non commercial license tied to it. Transfering an IPAsset transfers the Rights too, so the previous owner will lose the ownership of the righst along the IPA. -2. **Tradeable Licenses**: The license holder is the owner of the correspondent LicenseRegistry NFT. They are either: - - a. **Franchise root license**: license minted by a Franchise owner to govern commercial or non commercial rights for all the IPAssetRegistries. - - b. **Sublicense**: a license coming from IPA Rights or other Licenses, minted as an ERC721 by the parent license owner. These would be the future "movie adaptation to my story" or "merchandise rights for my PFP" type licenses that can be transferred or sold in NFT markets. - -### LicenseRegistry - -Simple ERC721 NFT wrapper for Tradeable Licenses registered in a RightsManager. Each IPAssetRegistry have its correspondent LicenseRegistry. - -### Licensing Module - -Networked IPs with multiple stakeholders need to have compatible licensing terms and characteristics in order to be commercially develop in a feasible way. -The Licensing Module contract is where Franchise Owners define this common legal framework. - -By design, with the idea of growing the IP, every IPA will have a license that will **allow remixing it as long as the remixer**: -- Attributes the original creator -- It's for non commercial (or within reasonable commercial assumptions 🚧) -- It's minted back to the Franchise as a child IPA with the same non commercial terms - -Root IPAs have optional commercial rights, meaning that a commercial License might be bought/requested from the owner of the rights, to do a commercial remixes, adaptations, merch, etc, with benefits traversing as defined by revenue/royalty modules. - -**The configurable options are:** - -- For both commercial and non commercial rights of IPAs - - can they sublicense (remix)? - - do they have a Franchise level root License from which all the rights stem from? -- Terms for both commercial and non commercial rights -- Do root IPA have commercial rights on mint or not? -- URI pointing to the Franchise Commercial Rights license text. - -We are going to have several **ready-made templates** for Franchise creators 🚧: - -- **Tight narrative/commercial direction:** - - Commercial Licenses can only be granted by the owner of the Root Commercial License (minted by Franchise Owner) - - Users can add and remix IPAs under Non Commercial terms. - - If Franchise Owner wants to emit commercial licenses from IPAs, an agreement must be made between IPA and Franchise owners (inclusion in upside/revenue, up front payment, voting rights, combination of some of all...) - -- **Loose narrative/commercial direction:** - - Every root IPA has commercial rights (under some terms, e.g owner of IPA is owner of external PFP NFT) and can emit commercial licenses around that IPA. - - -## Collect - -Collect module allows users to mint duplicates of an IPA as a memento, way of supporting the creators, engagement metric... - -- Each IPA can configure custom CollectNFTs as result of the Collect action -- Programable pre conditions for collection will be possible 🚧 (payment, approval) - - -## Royalties Module - -Although revenue/royalties is a complicated subject, we are building infrastructure to make it easier for proyects, since correct incentivization of participants in IP creation is such a core issue in web3 and the off chain enternainment industry. - -NOTE: We are using royalties and revenue in an informal and interchangeable way. This is a system to distribute shares of value, the technical source of it is out of scope at the moment. 🚧 - -The first obvious case that can be enforced with these contracts are on-chain revenue and royalties, but we expect the community to build bridges to more traditional platforms and payment rails that can route value here. +# Story Protocol Contracts -The RoyaltyDistributor contract allows IPAsset owners and license TermsProcessors to set revenue/royal shares. +Story Protocol is a decentralized IP protocol for powering the next wave of creative innovation on the Internet. By providing a decentralized IP registry and a set of powerful modules centered around IP licensing, Story Protocol enables creators to build new forms of IP without the friction imposed by traditional processes. -How the shares are configured is up to RoyaltyPolicies, and the actual shares are given by our RoyaltyNFT, an ERC-1155 wrapper over the [Split contracts of 0xSplits](https://www.0xsplits.xyz/) +## Documentation +[See Documenentation](https://docs.storyprotocol.xyz/docs/overview-2) +## Guidelines +[See our contribution guidelines](./GUIDELINES.md) # Deployed Contracts -- [Goerli addresses](https://github.com/storyprotocol/protocol-contracts/blob/main/deployment-5.json) +- [Sepolia addresses](https://github.com/storyprotocol/protocol-contracts/deployment-11155111.json) # Installing @@ -282,7 +125,9 @@ make anvil This will spin up a local blockchain with a determined private key, so you can use the same private key each time. # Code Style -We employed solhint to check code style. + +Defined in our [Guidelines](./GUIDELINES.md) + To check code style with solhint run: ``` make lint diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..a84f22bb6645c798ce76c32edf5274331cf55db2 GIT binary patch literal 46582 zcmZs?WmuH`^F9pABD)}+N-Zs^bhmU$H%Ll%gRm$P(%qoa-5qPu-65eM-7WcC>wW+3 z@BhW~0**bFW;8KIy& z6t|U@R#%XghN-(bTiZHVp`ge|BKJLBls2gDu<_ zOQ;gJ0=jI&GQ23ggv9dZ(jc-v=8}iwnt7N!sKm2q4^mT~TFc1Eq3AtW=t}jTL8Y~? z66meJo4YrC&uAJqf`$_DP9QsXWZ=yu3W^V}8XGf8@RQY{BBF3BGMzkjII2{;#5-={ zW`lPV#6Gb<7{yYsUCB{cv^aDVpuzJDz1*0->FUxIxaLgwrcXc;*{C(nCQI~U-)!*~ zB*;0xaRpjm;R>Y(O(;{3ueouDRhx4heO*&v*(63?TwI+zf*hUyy@_>ZKkVrF!LLXD#7E9rM{hcu3DS_oQ9)2pt> zv%o1D_ns-ipC)@IBWr&p!U`oEUOZ8bdaH+R-gA@H>{2ka`H{_QEid}{W7hY}pkI3M zC-f2@Vu`KgLoAZdt$hEyIr+|K4Hb-6Y_Ec`ifP4Dmq+&`_uy`X7!!o+LEi|4+^mIv zZaGAUOGdU>jDSDB6(|_SaFvuOH)m7D-;ib9bLEzF3XkG{Gt1lcOjVFXjV%~U<3p@X zIM&BiV%J|Xb3dwI$%tHP;GxdK@SX(|O?y0pTB5y_bGCTeu6YVZYh5@sk!5JTaTg^0a%;g%cpGq+IIM$$;};)koFi5^ zE#KZB4u>XVtPX{0Pv0N>kvtdv8lwC*As)xivKZHZ;7vIEo4Wb4F%o`6psTY8$mI5= zXLow@#)?Si0$~oG5EK_W12KMUNErG(A@?H%T5I0xYA(_(@pVvBNQRRS%0AlE2d>KZ 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 P%ui8HO}6@tY4HC6pcc$y literal 0 HcmV?d00001 diff --git a/mvp/contracts/interfaces/ip-accounts/IERC6551Account.sol b/legacy/contracts/interfaces/ip-accounts/IERC6551Account.sol similarity index 100% rename from mvp/contracts/interfaces/ip-accounts/IERC6551Account.sol rename to legacy/contracts/interfaces/ip-accounts/IERC6551Account.sol diff --git a/mvp/contracts/interfaces/ip-accounts/IIPAccount.sol b/legacy/contracts/interfaces/ip-accounts/IIPAccount.sol similarity index 100% rename from mvp/contracts/interfaces/ip-accounts/IIPAccount.sol rename to legacy/contracts/interfaces/ip-accounts/IIPAccount.sol diff --git a/mvp/contracts/interfaces/ip-accounts/IIPAccountRegistry.sol b/legacy/contracts/interfaces/ip-accounts/IIPAccountRegistry.sol similarity index 100% rename from mvp/contracts/interfaces/ip-accounts/IIPAccountRegistry.sol rename to legacy/contracts/interfaces/ip-accounts/IIPAccountRegistry.sol diff --git a/mvp/contracts/interfaces/modules/collect/ICollectModule.sol b/legacy/contracts/interfaces/modules/collect/ICollectModule.sol similarity index 100% rename from mvp/contracts/interfaces/modules/collect/ICollectModule.sol rename to legacy/contracts/interfaces/modules/collect/ICollectModule.sol diff --git a/mvp/contracts/interfaces/modules/collect/ICollectNFT.sol b/legacy/contracts/interfaces/modules/collect/ICollectNFT.sol similarity index 100% rename from mvp/contracts/interfaces/modules/collect/ICollectNFT.sol rename to legacy/contracts/interfaces/modules/collect/ICollectNFT.sol diff --git a/mvp/contracts/interfaces/modules/collect/ICollectPaymentModule.sol b/legacy/contracts/interfaces/modules/collect/ICollectPaymentModule.sol similarity index 100% rename from mvp/contracts/interfaces/modules/collect/ICollectPaymentModule.sol rename to legacy/contracts/interfaces/modules/collect/ICollectPaymentModule.sol diff --git a/mvp/contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol b/legacy/contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol similarity index 100% rename from mvp/contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol rename to legacy/contracts/interfaces/modules/royalties/IRoyaltyDistributor.sol diff --git a/mvp/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol b/legacy/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol similarity index 100% rename from mvp/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol rename to legacy/contracts/interfaces/modules/royalties/IRoyaltyPolicy.sol diff --git a/mvp/contracts/interfaces/modules/royalties/ISplitMain.sol b/legacy/contracts/interfaces/modules/royalties/ISplitMain.sol similarity index 100% rename from mvp/contracts/interfaces/modules/royalties/ISplitMain.sol rename to legacy/contracts/interfaces/modules/royalties/ISplitMain.sol diff --git a/mvp/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol b/legacy/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol similarity index 100% rename from mvp/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol rename to legacy/contracts/interfaces/modules/royalties/policies/IRoyaltyPolicy.sol diff --git a/mvp/contracts/ip-accounts/IPAccountImpl.sol b/legacy/contracts/ip-accounts/IPAccountImpl.sol similarity index 100% rename from mvp/contracts/ip-accounts/IPAccountImpl.sol rename to legacy/contracts/ip-accounts/IPAccountImpl.sol diff --git a/mvp/contracts/ip-accounts/IPAccountRegistry.sol b/legacy/contracts/ip-accounts/IPAccountRegistry.sol similarity index 100% rename from mvp/contracts/ip-accounts/IPAccountRegistry.sol rename to legacy/contracts/ip-accounts/IPAccountRegistry.sol diff --git a/mvp/contracts/modules/collect/CollectModuleBase.sol b/legacy/contracts/modules/collect/CollectModuleBase.sol similarity index 100% rename from mvp/contracts/modules/collect/CollectModuleBase.sol rename to legacy/contracts/modules/collect/CollectModuleBase.sol diff --git a/mvp/contracts/modules/collect/CollectPaymentModuleBase.sol b/legacy/contracts/modules/collect/CollectPaymentModuleBase.sol similarity index 100% rename from mvp/contracts/modules/collect/CollectPaymentModuleBase.sol rename to legacy/contracts/modules/collect/CollectPaymentModuleBase.sol diff --git a/mvp/contracts/modules/collect/SimpleCollectModule.sol b/legacy/contracts/modules/collect/SimpleCollectModule.sol similarity index 100% rename from mvp/contracts/modules/collect/SimpleCollectModule.sol rename to legacy/contracts/modules/collect/SimpleCollectModule.sol diff --git a/mvp/contracts/modules/collect/nft/CollectNFTBase.sol b/legacy/contracts/modules/collect/nft/CollectNFTBase.sol similarity index 100% rename from mvp/contracts/modules/collect/nft/CollectNFTBase.sol rename to legacy/contracts/modules/collect/nft/CollectNFTBase.sol diff --git a/mvp/contracts/modules/collect/nft/ERC721.sol b/legacy/contracts/modules/collect/nft/ERC721.sol similarity index 100% rename from mvp/contracts/modules/collect/nft/ERC721.sol rename to legacy/contracts/modules/collect/nft/ERC721.sol diff --git a/mvp/contracts/modules/royalties/RoyaltyDistributor.sol b/legacy/contracts/modules/royalties/RoyaltyDistributor.sol similarity index 100% rename from mvp/contracts/modules/royalties/RoyaltyDistributor.sol rename to legacy/contracts/modules/royalties/RoyaltyDistributor.sol diff --git a/mvp/contracts/modules/royalties/RoyaltyNFT.sol b/legacy/contracts/modules/royalties/RoyaltyNFT.sol similarity index 100% rename from mvp/contracts/modules/royalties/RoyaltyNFT.sol rename to legacy/contracts/modules/royalties/RoyaltyNFT.sol diff --git a/mvp/contracts/modules/royalties/RoyaltyNFTFactory.sol b/legacy/contracts/modules/royalties/RoyaltyNFTFactory.sol similarity index 100% rename from mvp/contracts/modules/royalties/RoyaltyNFTFactory.sol rename to legacy/contracts/modules/royalties/RoyaltyNFTFactory.sol diff --git a/mvp/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol b/legacy/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol similarity index 100% rename from mvp/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol rename to legacy/contracts/modules/royalties/policies/MutableRoyaltyProportionPolicy.sol diff --git a/mvp/test/foundry/IPAccount.t.sol b/legacy/test/foundry/IPAccount.t.sol similarity index 100% rename from mvp/test/foundry/IPAccount.t.sol rename to legacy/test/foundry/IPAccount.t.sol diff --git a/mvp/test/foundry/IPAccountRegistry.t.sol b/legacy/test/foundry/IPAccountRegistry.t.sol similarity index 100% rename from mvp/test/foundry/IPAccountRegistry.t.sol rename to legacy/test/foundry/IPAccountRegistry.t.sol diff --git a/mvp/test/foundry/RoyaltyDistributor.t.sol b/legacy/test/foundry/RoyaltyDistributor.t.sol similarity index 100% rename from mvp/test/foundry/RoyaltyDistributor.t.sol rename to legacy/test/foundry/RoyaltyDistributor.t.sol diff --git a/mvp/test/foundry/RoyaltyDistributorFork.t.sol b/legacy/test/foundry/RoyaltyDistributorFork.t.sol similarity index 100% rename from mvp/test/foundry/RoyaltyDistributorFork.t.sol rename to legacy/test/foundry/RoyaltyDistributorFork.t.sol diff --git a/mvp/test/foundry/_old_modules/collect/BaseCollectModuleTest.sol b/legacy/test/foundry/_old_modules/collect/BaseCollectModuleTest.sol similarity index 100% rename from mvp/test/foundry/_old_modules/collect/BaseCollectModuleTest.sol rename to legacy/test/foundry/_old_modules/collect/BaseCollectModuleTest.sol diff --git a/mvp/test/foundry/_old_modules/collect/CollectPaymentModuleBase.t.sol b/legacy/test/foundry/_old_modules/collect/CollectPaymentModuleBase.t.sol similarity index 100% rename from mvp/test/foundry/_old_modules/collect/CollectPaymentModuleBase.t.sol rename to legacy/test/foundry/_old_modules/collect/CollectPaymentModuleBase.t.sol diff --git a/mvp/test/foundry/_old_modules/collect/SimpleCollectModule.t.sol b/legacy/test/foundry/_old_modules/collect/SimpleCollectModule.t.sol similarity index 100% rename from mvp/test/foundry/_old_modules/collect/SimpleCollectModule.t.sol rename to legacy/test/foundry/_old_modules/collect/SimpleCollectModule.t.sol diff --git a/mvp/test/foundry/_old_modules/collect/nft/BaseERC721Test.sol b/legacy/test/foundry/_old_modules/collect/nft/BaseERC721Test.sol similarity index 100% rename from mvp/test/foundry/_old_modules/collect/nft/BaseERC721Test.sol rename to legacy/test/foundry/_old_modules/collect/nft/BaseERC721Test.sol diff --git a/mvp/test/foundry/_old_modules/collect/nft/CollectNFTBase.t.sol b/legacy/test/foundry/_old_modules/collect/nft/CollectNFTBase.t.sol similarity index 100% rename from mvp/test/foundry/_old_modules/collect/nft/CollectNFTBase.t.sol rename to legacy/test/foundry/_old_modules/collect/nft/CollectNFTBase.t.sol diff --git a/mvp/test/foundry/_old_modules/collect/nft/ERC721.t.sol b/legacy/test/foundry/_old_modules/collect/nft/ERC721.t.sol similarity index 100% rename from mvp/test/foundry/_old_modules/collect/nft/ERC721.t.sol rename to legacy/test/foundry/_old_modules/collect/nft/ERC721.t.sol diff --git a/mvp/test/foundry/mocks/MockCollectModule.sol b/legacy/test/foundry/mocks/MockCollectModule.sol similarity index 100% rename from mvp/test/foundry/mocks/MockCollectModule.sol rename to legacy/test/foundry/mocks/MockCollectModule.sol diff --git a/mvp/test/foundry/mocks/MockCollectModuleERC721.sol b/legacy/test/foundry/mocks/MockCollectModuleERC721.sol similarity index 100% rename from mvp/test/foundry/mocks/MockCollectModuleERC721.sol rename to legacy/test/foundry/mocks/MockCollectModuleERC721.sol diff --git a/mvp/test/foundry/mocks/MockCollectNFT.sol b/legacy/test/foundry/mocks/MockCollectNFT.sol similarity index 100% rename from mvp/test/foundry/mocks/MockCollectNFT.sol rename to legacy/test/foundry/mocks/MockCollectNFT.sol diff --git a/mvp/test/foundry/mocks/MockCollectPaymentModule.sol b/legacy/test/foundry/mocks/MockCollectPaymentModule.sol similarity index 100% rename from mvp/test/foundry/mocks/MockCollectPaymentModule.sol rename to legacy/test/foundry/mocks/MockCollectPaymentModule.sol diff --git a/mvp/test/foundry/mocks/MockIPAccount.sol b/legacy/test/foundry/mocks/MockIPAccount.sol similarity index 100% rename from mvp/test/foundry/mocks/MockIPAccount.sol rename to legacy/test/foundry/mocks/MockIPAccount.sol diff --git a/mvp/test/foundry/mocks/MockSplit.sol b/legacy/test/foundry/mocks/MockSplit.sol similarity index 100% rename from mvp/test/foundry/mocks/MockSplit.sol rename to legacy/test/foundry/mocks/MockSplit.sol diff --git a/mvp/test/foundry/mocks/MockSplitMain.sol b/legacy/test/foundry/mocks/MockSplitMain.sol similarity index 100% rename from mvp/test/foundry/mocks/MockSplitMain.sol rename to legacy/test/foundry/mocks/MockSplitMain.sol