# Project export: DinoVR

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: UC Berkeley AI Hackathon 2025
- Tagline: Making my childhood dream of chatting with dinosaurs come true
- Devpost: https://devpost.com/software/dinovr
- GitHub: https://github.com/WilliamUW/BerkeleyAIHack
- Video: https://www.youtube.com/embed/1CN7B_nBRi4?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 1 GitHub contributor(s) — William Wang (20 commits)

## Devpost submission (written by the team)

### Overview

Hi everyone! 👋 My name is William, and I’m a huge dinosaur fan! 🦕💚 Ever since I was little, I’ve dreamed of chatting with dinosaurs—so I made it happen with DinoVR! 🚀 🚀 Getting Started Getting into DinoVR is super easy-peasy! 🎮✨ Walk up to any dinosaur—they’re all excited to meet you! 🦖👋 Start chatting—ask them anything! Their clever replies are powered by Google’s Gemini Flash 2.5 Model. 🤖💬 Pick them up, inspect them, even toss them around—because who wouldn’t want to play catch with a T-Rex? 🏀🦖 🌍 Social Impact DinoVR isn’t just about fun—it’s about sparking curiosity and inspiring the next generation of explorers! 🌱 Fostering Curiosity: By letting kids interact directly with lifelike dinosaurs, DinoVR turns learning into an adventure. Children can ask questions, hear stories, and explore prehistory in a way that’s engaging and memorable. Accessible Science: DinoVR brings the wonders of paleontology and natural history into homes and classrooms, breaking down barriers to STEM education and making science accessible to everyone. Encouraging Lifelong Learning: By blending play and education, DinoVR helps nurture a love for discovery and critical thinking, giving kids the confidence to ask questions and seek answers—skills that last a lifetime. 🌟

### Inspiration

I just really, really love dinosaurs. Like, a lot. 🦕💖 (Also, I wanted to make my inner child super happy. Mission accomplished! 🎉) 🦖 What It Does Chat with lifelike dinosaurs—ask them about their favorite snacks, ancient adventures, or what it’s like to be extinct (spoiler: they’re still pretty cool with it). 🦖💬 Interact in VR—pick up, inspect, and toss your new dino friends. 🏀✨ Gemini-powered smarts—every conversation is smart, funny, and totally unique! 🧠💡 🛠️ How We Built It Unity VR for the immersive dinosaur world 🌍 Google Gemini Flash 2.5 for all the dino banter 💬🤖 Postman & curl for API magic (because every dino needs a little tech support!) 🛠️🔌 A whole lot of love for dinosaurs—seriously, so much love 💚 🚧 Challenges We Ran Into Shader compilation on my M2 MacBook Air—dinosaurs are patient, but my computer? Not so much! 🖥️😅 Keeping the AI in character—sometimes the T-Rex wants to talk about quantum physics instead of lunch. 🤯🦖 VR physics—tossing a dino is fun until it bounces into the sunset. 🌅 🏆 Accomplishments We’re Proud Of Making my childhood dream come true—chatting with dinosaurs in VR! 🦖✨ Gemini integration—super smart, super fun conversations! 🧠💬 A project that’s as fun to play as it is to build—and that’s saying something! 🎮💖 📚 What We Learned VR + AI = endless possibilities—and a lot of fun! 🌟 Shader optimization is important—dinosaurs don’t like to wait! 🦖⏳ Character consistency in AI is tricky but rewarding—when your dino stays in character, it’s pure magic! ✨ 🚀 What’s Next for DinoVR More dino species—because the more, the merrier! 🦕🦖 New interactions—maybe a dino dance-off? 💃🦖 Multiplayer mode—so you and your friends can chat with dinosaurs together! 👫🦕 Thanks for checking out DinoVR! Let’s make the prehistoric world a little more fun—and a lot more educational—one chat at a time! 🦖💬✨

## README (from the GitHub repository)

# 🦖✨ DinoVR: Chat with Dinosaurs in Virtual Reality! ✨🦕

Hi everyone! 👋 My name is William, and I’m a huge dinosaur fan! 🦕💚 Ever since I was little, I’ve dreamed of chatting with dinosaurs—so I made it happen with DinoVR! 🚀

---

## 🚀 Getting Started

Getting into DinoVR is super easy-peasy! 🎮✨

- **Walk up to any dinosaur**—they’re all excited to meet you! 🦖👋
- **Start chatting**—ask them anything! Their clever replies are powered by Google’s Gemini Flash 2.5 Model. 🤖💬
- **Pick them up, inspect them, even toss them around**—because who wouldn’t want to play catch with a T-Rex? 🏀🦖

---

## 🌍 Social Impact

DinoVR isn’t just about fun—it’s about sparking curiosity and inspiring the next generation of explorers! 🌱

- **Fostering Curiosity:** By letting kids interact directly with lifelike dinosaurs, DinoVR turns learning into an adventure. Children can ask questions, hear stories, and explore prehistory in a way that’s engaging and memorable.
- **Accessible Science:** DinoVR brings the wonders of paleontology and natural history into homes and classrooms, breaking down barriers to STEM education and making science accessible to everyone.
- **Encouraging Lifelong Learning:** By blending play and education, DinoVR helps nurture a love for discovery and critical thinking, giving kids the confidence to ask questions and seek answers—skills that last a lifetime.

---

## 🌟 Inspiration

I just really, really love dinosaurs. Like, a lot. 🦕💖  
(Also, I wanted to make my inner child super happy. Mission accomplished! 🎉)

---

## 🦖 What It Does

- **Chat with lifelike dinosaurs**—ask them about their favorite snacks, ancient adventures, or what it’s like to be extinct (spoiler: they’re still pretty cool with it). 🦖💬
- **Interact in VR**—pick up, inspect, and toss your new dino friends. 🏀✨
- **Gemini-powered smarts**—every conversation is smart, funny, and totally unique! 🧠💡

---

## 🛠️ How We Built It

- **Unity VR** for the immersive dinosaur world 🌍
- **Google Gemini Flash 2.5** for all the dino banter 💬🤖
- **Postman & curl** for API magic (because every dino needs a little tech support!) 🛠️🔌
- **A whole lot of love for dinosaurs**—seriously, so much love 💚

---

## 🚧 Challenges We Ran Into

- **Shader compilation on my M2 MacBook Air**—dinosaurs are patient, but my computer? Not so much! 🖥️😅
- **Keeping the AI in character**—sometimes the T-Rex wants to talk about quantum physics instead of lunch. 🤯🦖
- **VR physics**—tossing a dino is fun until it bounces into the sunset. 🌅

---

## 🏆 Accomplishments We’re Proud Of

- **Making my childhood dream come true**—chatting with dinosaurs in VR! 🦖✨
- **Gemini integration**—super smart, super fun conversations! 🧠💬
- **A project that’s as fun to play as it is to build**—and that’s saying something! 🎮💖

---

## 📚 What We Learned

- **VR + AI = endless possibilities**—and a lot of fun! 🌟
- **Shader optimization is important**—dinosaurs don’t like to wait! 🦖⏳
- **Character consistency in AI is tricky but rewarding**—when your dino stays in character, it’s pure magic! ✨

---

## 🚀 What’s Next for DinoVR

- **More dino species**—because the more, the merrier! 🦕🦖
- **New interactions**—maybe a dino dance-off? 💃🦖
- **Multiplayer mode**—so you and your friends can chat with dinosaurs together! 👫🦕

---

Thanks for checking out DinoVR! Let’s make the prehistoric world a little more fun—and a lot more educational—one chat at a time! 🦖💬✨

## Detected evidence (automated analysis)

Indexed codebase: 203 recognized source files, 582 KB.
- C# (language) — detected in the code
- Java (language) — detected in the code
- Google Gemini (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (120 of 2140)

```
.DS_Store
.gitattributes
.gitignore
.vscode/extensions.json
.vscode/launch.json
.vscode/settings.json
.vsconfig
Assets/InputSystem.inputsettings.asset
Assets/InputSystem.inputsettings.asset.meta
Assets/Models.meta
Assets/Models/3.fbx
Assets/Models/3.fbx.meta
Assets/Models/akysaurus.glb
Assets/Models/akysaurus.glb.meta
Assets/Models/Anky.controller
Assets/Models/Anky.controller.meta
Assets/Models/Bella the Blue Whale.glb
Assets/Models/Bella the Blue Whale.glb.meta
Assets/Models/Carl the Caribbean Reef Shark.glb
Assets/Models/Carl the Caribbean Reef Shark.glb.meta
Assets/Models/Debra the Dodo Bird.glb
Assets/Models/Debra the Dodo Bird.glb.meta
Assets/Models/Ellie the Elephant.glb
Assets/Models/Ellie the Elephant.glb.meta
Assets/Models/henry-co-tqu0IOMaiU8-unsplash.jpg.meta
Assets/Models/Kai the Koi Fish.glb
Assets/Models/Kai the Koi Fish.glb.meta
Assets/Models/Manny the Woolly Mammoth.glb
Assets/Models/Manny the Woolly Mammoth.glb.meta
Assets/Models/Mosasaur.controller
Assets/Models/Mosasaur.controller.meta
Assets/Models/Mosasaur.glb
Assets/Models/Mosasaur.glb.meta
Assets/Models/New Material.mat
Assets/Models/New Material.mat.meta
Assets/Models/Nicky the Nile Crocodile.glb
Assets/Models/Nicky the Nile Crocodile.glb.meta
Assets/Models/Pteradactal.controller
Assets/Models/Pteradactal.controller.meta
Assets/Models/Pteradactal.glb
Assets/Models/Pteradactal.glb.meta
Assets/Models/Rampaging T-Rex.glb
Assets/Models/Rampaging T-Rex.glb.meta
Assets/Models/raptor.glb
Assets/Models/raptor.glb.meta
Assets/Models/Stego.controller
Assets/Models/Stego.controller.meta
Assets/Models/stegosaurus sf.glb
Assets/Models/stegosaurus sf.glb.meta
Assets/Models/Tara the Triceratops.glb
Assets/Models/Tara the Triceratops.glb.meta
Assets/Models/TrexAnimatorController.controller
Assets/Models/TrexAnimatorController.controller.meta
Assets/Models/tyrant_king_-_tyrannosaurus.glb
Assets/Models/tyrant_king_-_tyrannosaurus.glb.meta
Assets/Models/Willow the White Tiger.glb
Assets/Models/Willow the White Tiger.glb.meta
Assets/Monaverse.meta
Assets/Monaverse/Core.meta
Assets/Monaverse/Core/Monaverse.Core.asmdef
Assets/Monaverse/Core/Monaverse.Core.asmdef.meta
Assets/Monaverse/Core/Plugins.meta
Assets/Monaverse/Core/Plugins/Mona.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/CHANGELOG.md
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/CHANGELOG.md.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/LICENSE
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/LICENSE.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/package.json
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/package.json.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/README.md
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/README.md.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/ApiEnvironment.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/ApiEnvironment.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/IApiConfiguration.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/IApiConfiguration.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/LocalConfiguration.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/LocalConfiguration.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/ProductionConfiguration.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/ProductionConfiguration.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/StagingConfiguration.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Configuration/StagingConfiguration.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Constants.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Constants.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Extensions.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Extensions/ApiConfigurationExtensions.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Extensions/ApiConfigurationExtensions.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Extensions/ApiEnvironmentExtensions.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Extensions/ApiEnvironmentExtensions.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Extensions/ApiOptionsExtensions.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Extensions/ApiOptionsExtensions.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Helpers.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Helpers/PlayerPrefsObfuscator.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Helpers/PlayerPrefsObfuscator.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/IMonaApiClient.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/IMonaApiClient.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Logging.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Logging/ApiLogLevel.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Logging/ApiLogLevel.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Logging/IMonaApiLogger.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Logging/IMonaApiLogger.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Logging/UnityMonaApiLogger.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Logging/UnityMonaApiLogger.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/AuthApiModule.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/AuthApiModule.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Helpers.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Helpers/SiweMessageBuilder.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Helpers/SiweMessageBuilder.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/IAuthApiModule.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/IAuthApiModule.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Requests.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Requests/AuthorizeRequest.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Requests/AuthorizeRequest.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Requests/PostNonceRequest.cs
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Requests/PostNonceRequest.cs.meta
Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/Rutime/Modules/Auth/Responses.meta
[2020 more files omitted for size]
```

### Dependencies

- Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/package.json: com.unity.modules.imgui@1.0.0, com.unity.modules.ui@1.0.0, com.unity.nuget.newtonsoft-json@3.2.1, com.unity.textmeshpro@3.0.6, com.unity.ugui@1.0.0, nuget.moq@2.0.0
- Assets/Monaverse/Core/Plugins/WalletConnect/com.walletconnect.core/package.json: com.unity.nuget.newtonsoft-json@3.2.1
- Assets/Monaverse/Core/Plugins/WalletConnect/com.walletconnect.modal/package.json: com.walletconnect.core@3.1.3, com.walletconnect.ui@1.1.3
- Assets/Monaverse/Core/Plugins/WalletConnect/com.walletconnect.ui/package.json: com.unity.textmeshpro@3.0.0, com.unity.ugui@1.0.0, com.walletconnect.core@3.1.3

### Recent commits (newest first)

- Create README.md
- Update .DS_Store
- Create lib_burst_generated.txt
- Update ProjectSettings.asset
- Update ProjectSettings.asset
- crash
- Update MeshColliderAndXRGrabAdder.cs
- Update Hackathon.unity
- Create stegosaurus sf.glb
- stego
- raptor
- mosasaur
- anky
- Update Hackathon.unity
- Update Hackathon.unity
- Update MeshColliderAndXRGrabAdder.cs
- working grab
- flying animation
- working animation
- Initial commit

## Key source files (fetched from GitHub, selected and truncated for size)

### Assets/Monaverse/Core/Plugins/Newtonsoft 3.0.2/LICENSE.md

```markdown
Nuget.Newtonsoft.Json copyright © 2022 Unity Technologies ApS

Licensed under the Unity Companion License for Unity-dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License).

Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions.

```

### Assets/Monaverse/Core/Plugins/Newtonsoft 3.0.2/CHANGELOG.md

```markdown
# Changelog
All notable changes to this package will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [3.0.2] - 2022-03-29

* Removed test code from package.

## [3.0.1] - 2022-02-21

* Updated license file

## [3.0.0] - 2022-01-27

* Updated Documentation

## [3.0.0-preview.1] - 2022-01-25

* Updated AOT and Editor DLLs to corresponds to Newtonsoft.Json version 13.0.1
* Removed deprecated Portable DLL
* Updated README
* Updated Documentation

## [2.0.2] - 2020-10-04

* Updated README
* Added package signature for validation

## [2.0.1-preview.1] - 2020-11-14

* Updated README and Internal Fixtures

## [2.0.0] - 2020-04-20

### This is the release of *Unity Package Nuget.NewtonsoftJson* v2.0.0.

* Updated dll to AOT compatible version to allow for IL2CPP compilation platform targets
* Added dll to Portable compatible version to allow for additional platform targets
* Updated associated Package Documents

## [2.0.0-preview] - 2019-11-14

### This is the preview of *Unity Package Nuget.NewtonsoftJson* v2.0.0-preview.

* Changed dll to AOT compatible version to allow for IL2CPP compilation platform targets

## [1.1.2] - 2019-10-31

### This is the release of *Unity Package Nuget.NewtonsoftJson* v1.1.2.

* Fixed tests for 2018.4.

## [1.1.1] - 2019-10-30

### This is the release of *Unity Package Nuget.NewtonsoftJson* v1.1.1.

* Added some sanity tests to catch issues in the CI.

## [1.1.0] - 2019-10-29

### This is the release of *Unity Package Nuget.NewtonsoftJson* v1.1.0.

* Use .net standard 2.0 version of the dll.
* Renamed the dll to match the assembly name. Users will need to update their assembly references.

## [1.1.0-preview.1] - 2019-08-09

### This is the first preview of *Unity Package Nuget.Newtonsoft.Json* version 1.1.0.

* Updated to bug fix release 12.0.2 of Newtonsoft Json.
* Updated package description.

## [1.0.1-preview.2] - 2019-10-02

### This is the second preview release of *Unity Package Nuget.NewtonsoftJson* v1.0.1.

* Use .net standard 2.0 version of the dll.

## [1.0.1-preview.1] - 2019-08-13

### This is the first preview release of *Unity Package Nuget.Newtonsoft.Json* v1.0.1.

* Renamed the dll to match the assembly name. Users will need to update their assembly references.

## [1.0.0] - 2019-08-08

### This is the first release of *Unity Package Nuget.Newtonsoft.Json*.

* No notable changes from the previous preview release.

## [1.0.0-preview.4] - 2019-08-06

### This is the fourth preview release of *Unity Package Nuget.Newtonsoft.Json*.

* Remove the unused asmdef file and make it such that the dll needs to be explicitly included.

## [1.0.0-preview.3] - 2019-07-03

### This is the third preview release of *Unity Package Nuget.Newtonsoft.Json*.

* Update the documentation for the package and the package description to state that this package is for internal Unity use 
[truncated — 422 more characters]
```

### Assets/Monaverse/Core/Plugins/Newtonsoft 3.0.2/package.json

```
{
  "name": "com.unity.nuget.newtonsoft-json",
  "displayName": "Newtonsoft Json",
  "version": "3.0.2",
  "unity": "2018.4",
  "description": "Newtonsoft Json for use in Unity projects and Unity packages. Currently synced to version 13.0.1.\n\nThis package is used for advanced json serialization and deserialization. Most Unity users will be better suited using the existing json tools built into Unity.\nTo avoid assembly clashes, please use this package if you intend to use Newtonsoft Json.",
  "type": "library",
  "upm": {
    "changelog": "* Removed test code from package."
  },
  "relatedPackages": {
    "com.unity.nuget.newtonsoft-json.tests": "3.0.2"
  },
  "upmCi": {
    "footprint": "9865874fd8512c6773c94ea410443dffb68a5609"
  },
  "repository": {
    "url": "https://github.cds.internal.unity3d.com/unity/com.unity.nuget.newtonsoft-json.git",
    "type": "git",
    "revision": "8f66870a71ad3f2cdd46330b5c482dfd138ffc64"
  }
}

```

### Assets/Monaverse/Core/Plugins/WalletConnect/com.walletconnect.ui/package.json

```
{
  "name": "com.walletconnect.ui",
  "version": "1.1.3",
  "displayName": "WalletConnectUnity UI",
  "unity": "2021.3",
  "dependencies": {
    "com.walletconnect.core": "3.1.3",
    "com.unity.textmeshpro": "3.0.0",
    "com.unity.ugui": "1.0.0"
  }
}

```

### Assets/Monaverse/Core/Plugins/WalletConnect/com.walletconnect.core/package.json

```
{
  "name": "com.walletconnect.core",
  "version": "3.1.3",
  "displayName": "WalletConnectUnity Core",
  "unity": "2021.3",
  "changelogUrl": "https://github.com/WalletConnect/WalletConnectUnity/blob/main/Packages/com.walletconnect.core/CHANGELOG.md",
  "keywords": [
    "wallet",
    "walletconnect",
    "walletconnectsharp",
    "walletconnectunity"
  ],
  "dependencies": {
    "com.unity.nuget.newtonsoft-json": "3.2.1"
  }
}

```

### Assets/Monaverse/Core/Plugins/Mona/com.monaverse.api/package.json

```
{
    "name": "com.monaverse.api",
    "displayName": "Monaverse Wallet SDK API",
    "description": "Directly access the public API of the Mona Wallet SDK",
    "version": "0.1.0",
    "unity": "2022.3",
    "unityRelease": "17f1",
    "dependencies": {
        "com.unity.nuget.newtonsoft-json": "3.2.1",
        "com.unity.textmeshpro": "3.0.6",
        "com.unity.modules.ui": "1.0.0",
        "com.unity.modules.imgui": "1.0.0",
        "com.unity.ugui": "1.0.0",
        "nuget.moq": "2.0.0"
    },
    "keywords": [
        "Mona",
        "Monaverse",
        "Wallet",
        "SDK",
        "API"
    ],
    "author": {
        "name": "Mona Gallery, Inc.",
        "url": "https://www.monaverse.com"
    }
}
```

### Assets/Monaverse/Core/Plugins/WalletConnect/com.walletconnect.modal/package.json

```
{
  "name": "com.walletconnect.modal",
  "version": "1.1.3",
  "displayName": "WalletConnectUnity Modal",
  "unity": "2021.3",
  "changelogUrl": "https://github.com/WalletConnect/WalletConnectUnity/blob/main/Packages/com.walletconnect.modal/CHANGELOG.md",
  "keywords": [
    "wallet",
    "walletconnect",
    "walletconnectmodal",
    "walletconnectunity"
  ],
  "dependencies": {
    "com.walletconnect.core": "3.1.3",
    "com.walletconnect.ui": "1.1.3"
  },
  "samples": [
    {
      "displayName": "Modal Sample",
      "description": "A sample dApp demonstrating how to select a network, use the modal, sign messages and transactions, and disconnect sessions.",
      "path": "Samples~/Modal Sample"
    }
  ]
}

```

### Assets/Scripts/ButtonClickInvoker.cs

```c#
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

public class ButtonClickInvoker : MonoBehaviour
{
    public List<Button> targetButtons;

    public void InvokeButtonClick(int index)
    {
        if (index >= 0 && index < targetButtons.Count)
        {
            Button button = targetButtons[index];
            if (button != null)
            {
                button.onClick.Invoke();
            }
        }
    }

    
}

```

### Assets/Scripts/SmartContractFetch.cs

```c#
using System;
using System.Collections;
using System.Collections.Generic;
using System.Numerics; // For BigInteger
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
using Nethereum.Web3;
using Nethereum.Contracts;
using Nethereum.ABI.FunctionEncoding.Attributes;
using TMPro;
using UnityEngine.Networking;
using Monaverse.Api.Modules.Collectibles.Dtos;





public class MainController : MonoBehaviour
{
    private Web3 web3;
    private Contract contract;
    private string contractAddress = "0x5ddb5d32a84ece5cdbd519714c3bf2c586daaffb";
    private string rpcUrl = "https://polygon-amoy.infura.io/v3/4764f6f6a4bb4aae8672c9d2627d0b05";
    private ArtworkRegistryService artworkRegistryService;
    private List<ArtworkRegistryService.ArtworkDTO> artworks;
    public TMP_Text artworkText;

    public MeshColliderAndXRGrabAdder meshColliderAndXRGrabAdder;

    void Start()
    {
        artworkRegistryService = new ArtworkRegistryService(rpcUrl, contractAddress);
        artworks = new List<ArtworkRegistryService.ArtworkDTO>();
        StartCoroutine(FetchArtworksCoroutine());
    }

    public List<ArtworkRegistryService.ArtworkDTO> GetArtworks()
    {
        return artworks;
    }

    IEnumerator FetchArtworksCoroutine()
    {
        var getArtworkCountTask = artworkRegistryService.GetArtworkCountAsync();
        yield return new WaitUntil(() => getArtworkCountTask.IsCompleted);

        if (getArtworkCountTask.Exception != null)
        {
            Debug.LogError("Error fetching artwork count: " + getArtworkCountTask.Exception);
            yield break;
        }

        BigInteger artworkCount = getArtworkCountTask.Result;
        Debug.Log($"Total Artworks: {artworkCount}");

        for (BigInteger i = 0; i < artworkCount; i++)
        {
            var getArtworkTask = artworkRegistryService.GetArtworkAsync(i);
            yield return new WaitUntil(() => getArtworkTask.IsCompleted);

            if (getArtworkTask.Exception != null)
            {
                Debug.LogError($"Error fetching artwork {i}: " + getArtworkTask.Exception);
                continue;
            }

            var artwork = getArtworkTask.Result;
            artworks.Add(artwork);
            Debug.Log($"Fetched Artwork {i}: {artwork.Name} {artwork.FileUrl} ({artwork.X}, {artwork.Y}, {artwork.Z}) {artwork.Size} {artwork.Description} {artwork.Prompt} ");
            // Convert artworks to CollectibleDto and call LoadGltfAssetsAndAddComponents
        }
        meshColliderAndXRGrabAdder.LoadGltfAssetsAndAddComponents(artworks);
    }
}

public class ArtworkRegistryService
{
    private Web3 web3;
    private Contract contract;

    public ArtworkRegistryService(string rpcUrl, string contractAddress)
    {
        web3 = new Web3(rpcUrl);
        string abi = @"[{
            ""constant"": true,
            ""inputs"": [],
            ""name"": ""getArtworkCount"",
            ""outputs"": [{""name"": """", ""type"": ""uint256""}],
            ""payable"": false,
            ""stateMutability"": ""view"",
            ""type"": ""function""
        },{
            ""constant"": true,
            ""inputs"": [{""name"": ""_index"", ""type"": ""uint256""}],
            ""name"": ""getArtwork"",
            ""outputs"": [
                {""name"": ""name"", ""type"": ""string""},
                {""name"": ""description"", ""type"": ""string""},
                {""name"": ""prompt"", ""type"": ""string""},
                {""name"": ""fileUrl"", ""type"": ""string""},
                {""name"": ""x"", ""type"": ""int256""},
                {""name"": ""y"", ""type"": ""int256""},
                {""name"": ""z"", ""type"": ""int256""},
                {""name"": ""size"", ""type"": ""uint256""}
            ],
            ""payable"": false,
            ""stateMutability"": ""view"",
            ""type"": ""function""
        }]";
        contract = web3.Eth.GetContract(abi, contractAddress);
    }

    public Task<BigInteger> GetArtworkCountAsync()
    {
        var getArtworkCountFunction = contract.GetFunction("getArtworkCount");
        return getArtworkCountFunction.CallAsync<BigInteger>();
    }

    public Task<ArtworkDTO> GetArtworkAsync(BigInteger index)
    {
        var getArtworkFunction = contract.GetFunction("getArtwork");
        return getArtworkFunction.CallDeserializingToObjectAsync<ArtworkDTO>(index);
    }

    [FunctionOutput]
    public class ArtworkDTO : IFunctionOutputDTO
    {
        [Parameter("string", "name", 1)] public string Name { get; set; }
        [Parameter("string", "description", 2)] public string Description { get; set; }
        [Parameter("string", "prompt", 3)] public string Prompt { get; set; }
        [Parameter("string", "fileUrl", 4)] public string FileUrl { get; set; }
        [Parameter("int256", "x", 5)] public BigInteger X { get; set; }
        [Parameter("int256", "y", 6)] public BigInteger Y { get; set; }
        [Parameter("int256", "z", 7)] public BigInteger Z { get; set; }
        [Parameter("uint256", "size", 8)] public BigInteger Size { get; set; }
    }

}

```

### Assets/Scripts/Gemini.cs

```c#
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI; // Required for UI Button interaction
using Meta.Voice.Samples.Dictation;

public class Gemini : MonoBehaviour
{
    private MethodInfo onClickMethod = typeof(Button).GetMethod("Press", BindingFlags.NonPublic | BindingFlags.Instance);

    public UnityEngine.UI.InputField textToSpeechInputTextField;
    public Button textToSpeechStartButton; // Reference to the UI Button
    public Button textToSpeechStopButton; // Reference to the UI Button

    public DictationActivation controller; // Assign this in the Inspector
    public UnityEngine.UI.Button clearButton;
    public TextMeshProUGUI transcriptionText; // Reference to the TextMeshPro UI component on the button

    public TextMeshProUGUI statusText; // Reference to the TextMeshPro UI component on the button


    private List<Dictionary<string, object>> conversation = new List<Dictionary<string, object>>();
    private string geminiApiKey = "AIzaSyBszLpcsGcv5_r6rnJhU-h-UKI9QkeOJT4";
    private string url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent";
    
    // TODO: Add audio indicator for listening

    private bool isListening = false;

    private void Start()
    {
        InitializeGemini("You are a helpful assistant.");
    }

    public void InitializeGemini(string initialPrompt, string name="Gemini")
    {
        Speak("Hello, I am " + name + "!");
        conversation = new List<Dictionary<string, object>>
        {
            new Dictionary<string, object>
            {
                { "role", "user" },
                { "parts", new List<object>
                    {
                        new { text = "Answer in first person without any prefix. You are: " + name + " . More information: " + initialPrompt },
                    }
                }
            },
            new Dictionary<string, object>
            {
                { "role", "model" },
                { "parts", new List<object>
                    {
                        new { text = "Ok, I am: " + name },
                    }
                }
            }
        };
    }

    public void Speak(string text)
    {
        Debug.Log("Speak: " + text);
        statusText.text = text;
        onClickMethod?.Invoke(clearButton, null);
        onClickMethod?.Invoke(textToSpeechStopButton, null);
        textToSpeechInputTextField.text = text;
        onClickMethod?.Invoke(textToSpeechStartButton, null);
    }

    public void StartListening()
    {
        if (isListening) return;
        isListening = true;
        // Speak("Listening.");
        Debug.Log("Listen start");
        onClickMethod?.Invoke(clearButton, null);
        onClickMethod?.Invoke(textToSpeechStopButton, null);
        controller.ToggleActivation();
        statusText.text = "Listening...";
    }

    public void StopListening()
    {
        if (!isListening) return;
        isListening = false;
        // Speak("Finished listening.");
        Debug.Log("Listen end");
        string user_input = transcriptionText.text;
        AskGemini(user_input);
        statusText.text = "Asking ... " + user_input;
        controller.ToggleActivation();
    }



    public async void AskGemini(string userQuery, bool resetConversation = false, bool announceQuestion = true)
    {
        if (string.IsNullOrWhiteSpace(userQuery))
        {
            return;
        }
        if (announceQuestion)
        {
            Speak("I heard: " + userQuery);
        }

        if (resetConversation)
        {
            conversation.Clear();
        }

        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri(url);
            var requestUri = $"?key={geminiApiKey}";

            conversation.Add(new Dictionary<string, object>
            {
                { "role", "user" },
                { "parts", new List<object>
                    {
                        new { text = userQuery },
                    }
                }
            });

            Debug.Log(JsonConvert.SerializeObject(conversation, Newtonsoft.Json.Formatting.Indented));
            var safetySettings = new List<object>
            {
                new { category = "HARM_CATEGORY_HARASSMENT", threshold = "BLOCK_NONE" },
                new { category = "HARM_CATEGORY_HATE_SPEECH", threshold = "BLOCK_NONE" },
                new { category = "HARM_CATEGORY_SEXUALLY_EXPLICIT", threshold = "BLOCK_NONE" },
                new { category = "HARM_CATEGORY_DANGEROUS_CONTENT", threshold = "BLOCK_NONE" }
            };

            var requestBody = new
            {
                contents = conversation,
                safetySettings = safetySettings,
            };
            Debug.Log(JsonConvert.SerializeObject(requestBody, Newtonsoft.Json.Formatting.Indented));

            var conversationJson = JsonConvert.SerializeObject(requestBody, Newtonsoft.Json.Formatting.None);
            HttpContent content = new StringContent(conversationJson, Encoding.UTF8, "application/json");

            try
            {
                HttpResponseMessage httpresponse = await client.PostAsync(requestUri, content);
                httpresponse.EnsureSuccessStatusCode();
                string responseBody = await httpresponse.Content.ReadAsStringAsync();
                Debug.Log(responseBody);

                JObject jsonResponse = JObject.Parse(responseBody);
                Debug.Log(jsonResponse);

                JToken jtokenResponse = jsonResponse["candidates"][0]["content"]["parts"][0]["text"];

                if (jtokenResponse != null)
                {
                    string extractedText = jtokenResponse.ToString();
                    Debug.Log("Extracted
[truncated — 1510 more characters]
```

[191 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]