# Software Design ## Idea `tardigrade.surge.sh` ### Problem - NFT are not crosschainable. They die. ### Solution - Add CCIP to a digital asset (NFT) - Use simplistic ai to show livelyness ## Requirments ### Functional Requirments - A NFT should be transferable from Chain A to Chain B - A NFT should be transferable from Chain B to Chain A - A NFT should be able to evolve ### Non Function Requirments - Keep it simple ## Story ### User Story - As a User I want to be able to transfer my NFT - As a User I want to be able to see my NFT evolving - As a User I want to decided who does the evolving ## Diagrams ### Use Case ```plantuml left to right direction @startuml actor User User -- (transfer) User -- (see evoling) User -- (choose) @end ``` ### ClassDiagram ```plantuml @startuml class Tardigrade_v2 { + link: address + router: address + owner: address .. TardiGeneration .. + theme_sepolia: string[] + theme_fuji: string[] + tardi_level: uint256 + prompt_string: string[] + is_fuji: bool + is_sepolia: bool .. Tardigrade .. + tardigrade: string + is_real: bool + all_ipfs_links: string[] .. NodeHandling .. + registered_nodes: address[] + accepted_nodes: address[] + nonce: uint256 .. Function.. + constructor() + _ccipReceive() + send() + registerNode() + acceptNode() + setIpfsLink() + generateRandomNumber(): uint256 + changeOwner() } @enduml ``` ### Sequence ```plantuml !theme plain @startuml !theme plain actor User entity WebApp database SmartContractFuji database SmartContractSepolia entity Node group "Setup" User -> SmartContractSepolia: "mint" User -> SmartContractFuji: "mint" Node -> SmartContractSepolia: "register" Node -> SmartContractFuji: "register" User -> SmartContractSepolia: "acceptNode" User -> SmartContractFuji: "acceptNode" Node -> SmartContractSepolia: "listens" Node -> SmartContractFuji: "listens" end group "Automised via Cronjob for MVP Purpose" group "Send Sepoloa" User -> SmartContractFuji: "sendToSepolia" SmartContractFuji -> SmartContractSepolia: "recieves" SmartContractSepolia -> SmartContractSepolia: "update data, emit event" Node <- SmartContractSepolia: "pulls data" Node -> Node: "generate image, push ipfs" Node -> SmartContractSepolia: "sets tardigrade" end group "Send Fuji" User -> SmartContractSepolia: "sendToFuji" SmartContractSepolia -> SmartContractFuji: "recieves" SmartContractFuji -> SmartContractFuji: "update data, emit event" Node <- SmartContractFuji: "pulls data" Node -> Node: "generate image, push ipfs" Node -> SmartContractFuji: "sets tardigrade" end group "repeat.." end group "repeat..." end end group WebApp -> SmartContractSepolia: "fetches alls images" WebApp -> WebApp: "display images" User -> WebApp: "Watch all images" end @enduml ```