├── .DS_Store ├── .env.example ├── .eslintrc.js ├── .gitignore ├── .prettierignore ├── .prettierrc ├── Dockerfile ├── README.md ├── app.vue ├── assets ├── .DS_Store ├── fonts │ ├── IBMPlexMono-Bold.ttf │ ├── IBMPlexMono-BoldItalic.ttf │ ├── IBMPlexMono-ExtraLight.ttf │ ├── IBMPlexMono-ExtraLightItalic.ttf │ ├── IBMPlexMono-Italic.ttf │ ├── IBMPlexMono-Light.ttf │ ├── IBMPlexMono-LightItalic.ttf │ ├── IBMPlexMono-Medium.ttf │ ├── IBMPlexMono-MediumItalic.ttf │ ├── IBMPlexMono-Regular.ttf │ ├── IBMPlexMono-SemiBold.ttf │ ├── IBMPlexMono-SemiBoldItalic.ttf │ ├── IBMPlexMono-Thin.ttf │ └── IBMPlexMono-ThinItalic.ttf ├── images │ ├── architecture.svg │ ├── discord.png │ ├── github.png │ ├── telegram.png │ └── x.png └── styles │ ├── _mixin.scss │ ├── _variables.scss │ ├── basic.scss │ ├── fonts.scss │ └── main.scss ├── blocks ├── home │ ├── HomeArchitecture.vue │ ├── HomeContributors.vue │ ├── HomeFeatures.vue │ ├── HomeFooter.vue │ ├── HomeIntroduction.vue │ ├── HomeStats.vue │ └── HomeTable.vue └── layout │ ├── LayoutFooter.vue │ └── LayoutHeader.vue ├── components ├── CursorBox.vue ├── NotificationBanner.vue └── icons │ ├── ArrowRightIcon.vue │ ├── DoneIcon.vue │ ├── InterconnectIcon.vue │ ├── LoopArrowIcon.vue │ ├── SafetyIcon.vue │ └── SatoshiLogo.vue ├── composables ├── breakpoints.ts └── dark.ts ├── layouts └── default.vue ├── locales └── en.json ├── nuxt.config.ts ├── package.json ├── pages └── index.vue ├── public ├── banner.png ├── btcvm.mp4 ├── favicon.svg ├── icon.png └── light_icon.png ├── renovate.json ├── server └── api │ └── stats.get.ts ├── store └── counter.ts ├── stylelint.config.js ├── tsconfig.json └── yarn.lock /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/.DS_Store -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | NUXT_EXPLORER_API= 2 | NUXT_BTC_API= -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['@nuxtjs/eslint-config-typescript'] 4 | } 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .nuxt 4 | nuxt.d.ts 5 | .output 6 | .github 7 | .vscode/* 8 | .env -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | ### 2 | # Place your Prettier ignore content here 3 | 4 | ### 5 | # .gitignore content is duplicated here due to https://github.com/prettier/prettier/issues/8506 6 | 7 | # Created by .ignore support plugin (hsz.mobi) 8 | ### Node template 9 | # Logs 10 | /logs 11 | *.log 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | 16 | # Runtime data 17 | pids 18 | *.pid 19 | *.seed 20 | *.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | lib-cov 24 | 25 | # Coverage directory used by tools like istanbul 26 | coverage 27 | 28 | # nyc test coverage 29 | .nyc_output 30 | 31 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 32 | .grunt 33 | 34 | # Bower dependency directory (https://bower.io/) 35 | bower_components 36 | 37 | # node-waf configuration 38 | .lock-wscript 39 | 40 | # Compiled binary addons (https://nodejs.org/api/addons.html) 41 | build/Release 42 | 43 | # Dependency directories 44 | node_modules/ 45 | jspm_packages/ 46 | 47 | # TypeScript v1 declaration files 48 | typings/ 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Optional REPL history 57 | .node_repl_history 58 | 59 | # Output of 'npm pack' 60 | *.tgz 61 | 62 | # Yarn Integrity file 63 | .yarn-integrity 64 | 65 | # dotenv environment variables file 66 | .env 67 | 68 | # parcel-bundler cache (https://parceljs.org/) 69 | .cache 70 | 71 | # next.js build output 72 | .next 73 | 74 | # nuxt.js build output 75 | .nuxt 76 | 77 | # Nuxt generate 78 | dist 79 | 80 | # vuepress build output 81 | .vuepress/dist 82 | 83 | # Serverless directories 84 | .serverless 85 | 86 | # IDE / Editor 87 | .idea 88 | 89 | # Service worker 90 | sw.* 91 | 92 | # macOS 93 | .DS_Store 94 | 95 | # Vim swap files 96 | *.swp 97 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "singleQuote": true, 5 | "semi": false, 6 | "trailingComma": "none", 7 | "printWidth": 80 8 | } 9 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16-buster 2 | 3 | ADD . /usr/src/node/server/ 4 | 5 | WORKDIR /usr/src/node/server/ 6 | 7 | CMD [ "sh", "-c", "yarn start" ] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SatoshiVM Website 2 | 3 | See live at [satoshivm.io](https://satoshivm.io) 4 | 5 | ## Develop 6 | 7 | The website is built with [nuxtjs](https://nuxt.com/) 8 | 9 | ``` 10 | yarn 11 | yarn dev 12 | ``` 13 | -------------------------------------------------------------------------------- /app.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/.DS_Store -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-ExtraLight.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-Italic.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-LightItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-MediumItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-SemiBold.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-Thin.ttf -------------------------------------------------------------------------------- /assets/fonts/IBMPlexMono-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/fonts/IBMPlexMono-ThinItalic.ttf -------------------------------------------------------------------------------- /assets/images/discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/images/discord.png -------------------------------------------------------------------------------- /assets/images/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/images/github.png -------------------------------------------------------------------------------- /assets/images/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/images/telegram.png -------------------------------------------------------------------------------- /assets/images/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/assets/images/x.png -------------------------------------------------------------------------------- /assets/styles/_mixin.scss: -------------------------------------------------------------------------------- 1 | @mixin flexR { 2 | display: flex; 3 | flex-direction: row; 4 | justify-content: flex-start; 5 | align-items: center; 6 | } 7 | @mixin flexRc { 8 | display: flex; 9 | flex-direction: row; 10 | justify-content: center; 11 | align-items: center; 12 | } 13 | @mixin flexC { 14 | display: flex; 15 | flex-direction: column; 16 | justify-content: flex-start; 17 | align-items: center; 18 | } 19 | @mixin flexRc { 20 | display: flex; 21 | flex-direction: row; 22 | justify-content: center; 23 | align-items: center; 24 | } 25 | @mixin flexCc { 26 | display: flex; 27 | flex-direction: column; 28 | justify-content: center; 29 | align-items: center; 30 | } 31 | @mixin flexRsb { 32 | display: flex; 33 | flex-direction: row; 34 | justify-content: space-between; 35 | align-items: center; 36 | } 37 | @mixin flexCsb { 38 | display: flex; 39 | flex-direction: column; 40 | justify-content: space-between; 41 | align-items: center; 42 | } 43 | @mixin flexRsa { 44 | display: flex; 45 | flex-direction: row; 46 | justify-content: space-around; 47 | align-items: center; 48 | } 49 | 50 | @mixin flexRGap($gap) { 51 | margin: $gap * -1 0 0 $gap * -1; 52 | width: calc(100% + $gap); 53 | & > * { 54 | margin: $gap 0 0 $gap; 55 | } 56 | } 57 | 58 | @mixin flexCGap($gap) { 59 | margin: 0 $gap * -1 $gap * -1 0; 60 | height: calc(100% + $gap); 61 | & > * { 62 | margin: 0 $gap $gap 0; 63 | } 64 | } 65 | 66 | @mixin singleLine { 67 | white-space: nowrap; 68 | overflow: hidden; 69 | text-overflow: ellipsis; 70 | } 71 | 72 | @mixin phone { 73 | @media (max-width: 799px) { 74 | @content; 75 | } 76 | } 77 | 78 | @mixin pad { 79 | @media (max-width: 1199px) { 80 | @content; 81 | } 82 | } 83 | 84 | @mixin desktop { 85 | @media (min-width: 1200px) { 86 | @content; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /assets/styles/_variables.scss: -------------------------------------------------------------------------------- 1 | $primary: #ff7800; 2 | $onPrimary: #ffffff; 3 | $secondary: #282828; 4 | $onSecondary: #ffffff; 5 | $background: #000; 6 | $onBackground: #fff; 7 | $lightText: #a6a6a6; 8 | 9 | $shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); 10 | -------------------------------------------------------------------------------- /assets/styles/basic.scss: -------------------------------------------------------------------------------- 1 | @import url('./fonts.scss'); 2 | 3 | html { 4 | width: 100%; 5 | height: auto; 6 | min-height: 100%; 7 | margin: 0; 8 | padding: 0; 9 | } 10 | body { 11 | width: 100%; 12 | height: auto; 13 | min-height: 100vh; 14 | margin: 0; 15 | padding: 0; 16 | position: relative; 17 | text-rendering: optimizeSpeed; 18 | background-color: $background; 19 | color: $onBackground; 20 | @include phone { 21 | background-color: $background; 22 | } 23 | overflow-y: scroll; 24 | font-family: IBMPlexMono, -apple-system, BlinkMacSystemFont, 'Segoe UI', 25 | Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; 26 | } 27 | #__nuxt, 28 | #__layout { 29 | width: 100%; 30 | height: auto; 31 | min-height: 100vh; 32 | } 33 | * { 34 | box-sizing: border-box; 35 | } 36 | 37 | @include phone() { 38 | button, 39 | div, 40 | a { 41 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 42 | -webkit-tap-highlight-color: transparent; 43 | -webkit-user-select: none; 44 | -khtml-user-select: none; 45 | -moz-user-select: none; 46 | -ms-user-select: none; 47 | user-select: none; 48 | } 49 | } 50 | 51 | ul { 52 | list-style-type: none; 53 | margin: 0; 54 | padding: 0; 55 | } 56 | 57 | a { 58 | color: $primary; 59 | text-decoration: none; 60 | } 61 | 62 | p { 63 | margin: 0; 64 | } 65 | 66 | /* Float Vue Style */ 67 | .v-popper--theme-menu .v-popper-wrapper { 68 | &:before { 69 | content: ''; 70 | position: absolute; 71 | top: 0; 72 | right: 0; 73 | bottom: 0; 74 | left: 0; 75 | z-index: -1; 76 | margin: 2px; /* !importanté */ 77 | background: linear-gradient(to right, red, orange); 78 | } 79 | } 80 | .v-popper--theme-menu .v-popper__inner { 81 | background: linear-gradient(to right, #888, #ff7800) !important; 82 | color: black; 83 | padding: 2px; 84 | position: relative; 85 | border-radius: 8px !important; 86 | border: none !important; 87 | .dropdown-menu { 88 | background: #000; 89 | padding: 10px 20px; 90 | border-radius: 6px !important; 91 | } 92 | // border-image-slice: 1; 93 | .link-item { 94 | color: #fff; 95 | opacity: 1; 96 | font-family: 'IBMPlexMono-Bold'; 97 | font-size: 16px; 98 | font-weight: 700; 99 | font-style: normal; 100 | letter-spacing: 0px; 101 | text-align: right; 102 | text-transform: uppercase; 103 | @include flexRc; 104 | justify-content: flex-end; 105 | align-items: flex-start; 106 | cursor: pointer; 107 | margin: 10px 0; 108 | @include phone { 109 | font-size: 12px; 110 | margin: 0 4px; 111 | } 112 | } 113 | } 114 | .v-popper--theme-menu.v-popper__popper--hidden { 115 | visibility: hidden; 116 | opacity: 0; 117 | transition: opacity 0.15s, visibility 0.15s; 118 | } 119 | 120 | .v-popper--theme-menu.v-popper__popper--shown { 121 | visibility: visible; 122 | opacity: 1; 123 | transition: opacity 0.15s; 124 | } 125 | 126 | .v-popper--theme-menu .v-popper__arrow-inner { 127 | visibility: hidden !important; 128 | border-color: #fff; 129 | } 130 | 131 | .v-popper--theme-menu .v-popper__arrow-outer { 132 | visibility: hidden !important; 133 | border-color: #ddd; 134 | } 135 | -------------------------------------------------------------------------------- /assets/styles/fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'IBMPlexMono-Bold'; 3 | src: url('../fonts/IBMPlexMono-Bold.ttf') format('truetype'); 4 | } 5 | 6 | @font-face { 7 | font-family: 'IBMPlexMono'; 8 | src: url('../fonts/IBMPlexMono-Regular.ttf') format('truetype'); 9 | } 10 | -------------------------------------------------------------------------------- /assets/styles/main.scss: -------------------------------------------------------------------------------- 1 | @import './_variables.scss'; 2 | @import './_mixin.scss'; 3 | -------------------------------------------------------------------------------- /blocks/home/HomeArchitecture.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 31 | 32 | 33 | SatoshiVM 34 | ARCHITECTURE 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | {{ item.label }} 45 | : 46 | {{ item.content }} 47 | 48 | 49 | 50 | 51 | Read Details in Documents 52 | 53 | 54 | 55 | 56 | 57 | 58 | 172 | -------------------------------------------------------------------------------- /blocks/home/HomeContributors.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | CONTRIBUTORS 9 | 10 | 11 | 12 | 13 | 14 | 15 | {{ item.name }} 16 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | {{ item.desc }} 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 132 | -------------------------------------------------------------------------------- /blocks/home/HomeFeatures.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 27 | -------------------------------------------------------------------------------- /blocks/home/HomeFooter.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 24 | 42 | 43 | 44 | 102 | -------------------------------------------------------------------------------- /blocks/home/HomeIntroduction.vue: -------------------------------------------------------------------------------- 1 | 180 | 181 | 182 | 183 | 184 | 185 | SatoshiVM 186 | 187 | 188 | With 189 | 190 | 191 | {{ currentTip + dynamicText }} 192 | 193 | {{ tips[nowTipIndex ?? 0] }} 194 | 195 | 196 | 197 | 198 | {{ desText1 }} 199 | 200 | {{ desText2 }} 201 | 202 | 203 | 204 | 205 | 225 | 226 | {{ item.label }} 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 456 | -------------------------------------------------------------------------------- /blocks/home/HomeStats.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | 66 | 67 | {{ 68 | defaultData.addresses 69 | }} 70 | Unique Wallets 71 | 72 | 73 | {{ 74 | defaultData.transactions 75 | }} 76 | Blockchain Transactions 77 | 78 | 79 | {{ defaultData.btc }} 80 | BTC Bridged 81 | 82 | 83 | 84 | 85 | 121 | -------------------------------------------------------------------------------- /blocks/home/HomeTable.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | 66 | 67 | 68 | SatoshiVM 69 | DESIGN 70 | PHILOSOPHY 71 | 72 | 73 | 74 | 83 | 84 | 99 | 104 | 105 | 106 | {{ item.label }} 107 | 108 | 109 | 110 | 123 | {{ activeContent }} 124 | 125 | 126 | 127 | 128 | 129 | 130 | 142 | {{ activeContent }} 143 | 144 | 145 | 146 | 147 | 148 | 149 | 466 | -------------------------------------------------------------------------------- /blocks/layout/LayoutFooter.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 27 | -------------------------------------------------------------------------------- /blocks/layout/LayoutHeader.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Build 13 | Explorer 18 | Bridge 23 | Docs 28 | 29 | 30 | Paper 31 | 32 | 33 | 34 | 35 | 36 | White Paper 41 | 42 | 43 | Yellow Paper 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 150 | -------------------------------------------------------------------------------- /components/CursorBox.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 27 | 28 | 29 | 30 | 48 | -------------------------------------------------------------------------------- /components/NotificationBanner.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 19 | -------------------------------------------------------------------------------- /components/icons/ArrowRightIcon.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 22 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /components/icons/DoneIcon.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 27 | 28 | 32 | 33 | 34 | 35 | 43 | 44 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /components/icons/InterconnectIcon.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 27 | 28 | 32 | 33 | 34 | 42 | 43 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /components/icons/LoopArrowIcon.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 27 | 28 | 32 | 33 | 34 | 35 | 43 | 44 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /components/icons/SafetyIcon.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 27 | 28 | 32 | 33 | 34 | 35 | 43 | 44 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /components/icons/SatoshiLogo.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 12 | 16 | 20 | 24 | 25 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /composables/breakpoints.ts: -------------------------------------------------------------------------------- 1 | import { useBreakpoints } from '@vueuse/core' 2 | export const breakpoints = useBreakpoints({ 3 | phone: 799, 4 | pad: 1280, 5 | desktop: 1280 6 | }) 7 | export const isPhone = computed(() => { 8 | if (process.server) { 9 | return false 10 | } 11 | 12 | return !breakpoints.phone.value 13 | }) 14 | export const isPad = computed(() => { 15 | if (process.server) { 16 | return false 17 | } 18 | return !breakpoints.pad.value 19 | }) 20 | export const isDesktop = computed(() => { 21 | return !breakpoints.desktop.value 22 | }) 23 | -------------------------------------------------------------------------------- /composables/dark.ts: -------------------------------------------------------------------------------- 1 | import { useDark, useToggle } from '@vueuse/core' 2 | 3 | export const isDark = useDark() 4 | export const toggleDark = useToggle(isDark) 5 | -------------------------------------------------------------------------------- /layouts/default.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Testnet is live, explore Bitcoin Layer2 athttps://testnet.svmscan.io. 🔥 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 37 | -------------------------------------------------------------------------------- /locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "hello": "Hello, {name}!", 3 | "language": "Language", 4 | "menu": { 5 | "home": "Home" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from 'nuxt/config' 2 | import stylelint from 'vite-plugin-stylelint' 3 | 4 | export default defineNuxtConfig({ 5 | ssr: true, 6 | devServer: { 7 | host: '0.0.0.0' 8 | }, 9 | app: { 10 | head: { 11 | title: 'SatoshiVM', 12 | meta: [ 13 | { hid: 'og-type', property: 'og:type', content: 'website' }, 14 | { hid: 'og-title', property: 'og:title', content: 'SatoshiVM' }, 15 | { 16 | hid: 'og-desc', 17 | property: 'og:description', 18 | content: 19 | 'Decentralized Bitcoin ZK Rollup Layer2 that is compatible with the EVM ecosystem and uses native BTC as gas.' 20 | }, 21 | { 22 | hid: 'og-image', 23 | property: 'og:image', 24 | content: 'https://www.satoshivm.io/banner.png' 25 | }, 26 | { 27 | hid: 'og-url', 28 | property: 'og:url', 29 | content: 'https://wwww.satoshivm.io' 30 | }, 31 | { hid: 't-type', name: 'twitter:card', content: 'summary_large_image' } 32 | ], 33 | link: [ 34 | { rel: 'icon', type: 'image/*', href: '/icon.png' }, 35 | { 36 | rel: 'preload', 37 | type: 'font/ttf', 38 | href: '@/assets/fonts/IBMPlexMono-Bold.ttf' 39 | }, 40 | { 41 | rel: 'preload', 42 | type: 'font/ttf', 43 | href: '@/assets/fonts/IBMPlexMono-Regular.ttf' 44 | } 45 | ] 46 | } 47 | }, 48 | css: ['@/assets/styles/basic.scss'], 49 | modules: [ 50 | '@pinia/nuxt', 51 | '@vueuse/nuxt', 52 | '@nuxt/devtools', 53 | '@vueuse/motion/nuxt', 54 | '@nuxtjs/fontaine', 55 | 'floating-vue/nuxt', 56 | '@hypernym/nuxt-gsap' 57 | ], 58 | components: ['~/components', '~/blocks', '~/components/icons'], 59 | vite: { 60 | css: { 61 | preprocessorOptions: { 62 | scss: { 63 | additionalData: '@use "@/assets/styles/main.scss" as *;' 64 | } 65 | } 66 | }, 67 | plugins: [ 68 | stylelint({ 69 | fix: true 70 | }) 71 | ] 72 | }, 73 | 74 | runtimeConfig: { 75 | explorerApi: 'https://original-testnet.svmscan.io/api/v2', 76 | btcApi: 'https://mempool.space/testnet/api', 77 | public: {} 78 | } 79 | }) 80 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "satoshivm-website", 3 | "description": "SatoshiVM website", 4 | "private": false, 5 | "scripts": { 6 | "dev": "nuxt dev --port 6636", 7 | "build": "nuxt build", 8 | "generate": "nuxt generate", 9 | "preview": "nuxt preview", 10 | "postinstall": "nuxt prepare", 11 | "start": "node .output/server/index.mjs", 12 | "lint:js": "eslint --ext \".js,.ts,.vue\" --ignore-path .gitignore .", 13 | "lint:prettier": "prettier --check .", 14 | "lintfix": "prettier --write --list-different . && yarn lint:js --fix" 15 | }, 16 | "devDependencies": { 17 | "@iconify/json": "^2.1.143", 18 | "@nuxt/devtools": "^1.0.4", 19 | "@nuxt/types": "^2.16.0", 20 | "@nuxtjs/eslint-config-typescript": "^12.0.0", 21 | "@nuxtjs/fontaine": "^0.4.1", 22 | "@pinia/nuxt": "^0.5.0", 23 | "@vueuse/nuxt": "^9.6.0", 24 | "eslint": "^8.34.0", 25 | "esno": "^4.0.0", 26 | "nuxt": "^3.8.2", 27 | "prettier": "^2.8.4", 28 | "sass": "^1.58.3", 29 | "stylelint": "^15.11.0", 30 | "typescript": "^5.3.2", 31 | "vite-plugin-stylelint": "^4.3.0" 32 | }, 33 | "engines": { 34 | "node": ">=18.0.0" 35 | }, 36 | "dependencies": { 37 | "@hypernym/nuxt-gsap": "^2.4.2", 38 | "@vueuse/components": "^10.7.1", 39 | "@vueuse/motion": "^2.0.0", 40 | "floating-vue": "^5.1.0", 41 | "gsap": "^3.12.4", 42 | "node-fetch-cache": "^4.1.0", 43 | "pinia": "^2.1.7" 44 | }, 45 | "resolutions": { 46 | "string-width": "4.2.3" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /pages/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 63 | -------------------------------------------------------------------------------- /public/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/public/banner.png -------------------------------------------------------------------------------- /public/btcvm.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/public/btcvm.mp4 -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/public/icon.png -------------------------------------------------------------------------------- /public/light_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SatoshiVM/website/bdb9d61514f0ca4b39bf62b0ef8dd6431df945ca/public/light_icon.png -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:base", "schedule:earlyMondays"], 4 | "packageRules": [ 5 | { 6 | "matchUpdateTypes": ["major"], 7 | "enabled": false 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /server/api/stats.get.ts: -------------------------------------------------------------------------------- 1 | import NodeFetchCache, { MemoryCache } from 'node-fetch-cache' 2 | const fetch = NodeFetchCache.create({ cache: new MemoryCache({ ttl: 10000 }) }) 3 | const fetcher = (url: string) => fetch(url).then(res => res.json()) 4 | 5 | export default defineEventHandler(async (_) => { 6 | const config = useRuntimeConfig() 7 | try { 8 | const [data, balance] = await Promise.all([ 9 | fetcher(config.explorerApi + '/stats'), 10 | fetcher( 11 | config.btcApi + '/address/tb1q7y4e54ujq3xqlvmghwmaade48qdam8xwf47kr9' 12 | ) 13 | ]) 14 | const formateBalance = 15 | (Number(balance.chain_stats.funded_txo_sum) + 16 | Number(balance.mempool_stats.funded_txo_sum)) / 17 | 100000000 18 | return { 19 | addresses: Number(data.total_addresses), 20 | transactions: Number(data.total_transactions), 21 | btc: Number(formateBalance.toFixed(3)) 22 | } 23 | } catch (error) { 24 | console.log(error) 25 | return { 26 | addresses: 120891, 27 | transactions: 521280, 28 | btc: 528.796 29 | } 30 | } 31 | }) 32 | -------------------------------------------------------------------------------- /store/counter.ts: -------------------------------------------------------------------------------- 1 | import { ref, Ref } from 'vue' 2 | import { defineStore } from 'pinia' 3 | 4 | interface CounterState { 5 | n: number 6 | myRef: Ref 7 | } 8 | 9 | export const useCounter = defineStore('counter', { 10 | state: (): CounterState => ({ 11 | n: 5, 12 | myRef: ref('hello') 13 | }), 14 | actions: { 15 | increment () { 16 | this.n++ 17 | } 18 | } 19 | }) 20 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | customSyntax: 'postcss-html', 3 | extends: [ 4 | 'stylelint-config-standard', 5 | 'stylelint-config-recommended-vue', 6 | 'stylelint-config-prettier' 7 | ], 8 | // add your custom config here 9 | // https://stylelint.io/user-guide/configuration 10 | rules: {} 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.nuxt/tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["@pinia/nuxt", "@nuxt/types"] 5 | } 6 | } 7 | --------------------------------------------------------------------------------