diff --git a/package-lock.json b/package-lock.json index b46084687..94fe116fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "kukai", - "version": "1.2.3", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -47,9 +47,17 @@ } }, "@angular/animations": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.11.tgz", + "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/cdk": { "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.5.tgz", - "integrity": "sha512-70ElCmaeDxLQc2OkgYhJjXj4zjtdjI4K1D5ZZm/uSPLlUcqC6uf6skCXlhMawQoPbsL/SXE5xw2HlMgEbhUysw==", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.2.5.tgz", + "integrity": "sha512-GN8m1d+VcCE9+Bgwv06Y8YJKyZ0i9ZIq2ZPBcJYt+KVgnVVRg4JkyUNxud07LNsvzOX22DquHqmIZiC4hAG7Ag==", "requires": { "tslib": "^1.7.1" } @@ -185,6 +193,14 @@ "integrity": "sha512-UWNbECu8svXmrgbTL03Fr+Dn06aPCZZLScmCOGVT5lkdsiJPAJpWAvKVM2Y0nzH0PmvekHw7INtV5lwfJOijYQ==", "dev": true }, + "@angular/material": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.2.5.tgz", + "integrity": "sha512-IltfBeTJWnmZehOQNQ7KoFs7MGWuZTe0g21hIitGkusVNt1cIoTD24xKH5jwztjH19c04IgiwonpurMKM6pBCQ==", + "requires": { + "tslib": "^1.7.1" + } + }, "@angular/platform-browser": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.5.tgz", @@ -593,7 +609,6 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, - "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -1597,8 +1612,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", - "dev": true, - "optional": true + "dev": true }, "buffer-xor": { "version": "1.0.3", @@ -1816,6 +1830,39 @@ "supports-color": "^4.0.0" } }, + "chart.js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", + "integrity": "sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz", + "integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=", + "requires": { + "chartjs-color-string": "^0.5.0", + "color-convert": "^0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" + } + } + }, + "chartjs-color-string": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz", + "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==", + "requires": { + "color-name": "^1.0.0" + } + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -2209,8 +2256,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "0.3.0", @@ -2396,8 +2442,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true + "dev": true }, "constants-browserify": { "version": "1.0.0", @@ -3157,8 +3202,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true + "dev": true }, "denodeify": { "version": "1.2.1", @@ -4608,8 +4652,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.1.1", @@ -4676,7 +4719,6 @@ "version": "0.0.9", "bundled": true, "dev": true, - "optional": true, "requires": { "inherits": "~2.0.0" } @@ -4685,7 +4727,6 @@ "version": "2.10.1", "bundled": true, "dev": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -4703,8 +4744,7 @@ "buffer-shims": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "caseless": { "version": "0.12.0", @@ -4721,8 +4761,7 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "combined-stream": { "version": "1.0.5", @@ -4742,20 +4781,17 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "cryptiles": { "version": "2.0.5", "bundled": true, "dev": true, - "optional": true, "requires": { "boom": "2.x.x" } @@ -4828,8 +4864,7 @@ "extsprintf": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "forever-agent": { "version": "0.6.1", @@ -4851,14 +4886,12 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "fstream": { "version": "1.0.11", "bundled": true, "dev": true, - "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4914,7 +4947,6 @@ "version": "7.1.2", "bundled": true, "dev": true, - "optional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4927,8 +4959,7 @@ "graceful-fs": { "version": "4.1.11", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "har-schema": { "version": "1.0.5", @@ -4956,7 +4987,6 @@ "version": "3.1.3", "bundled": true, "dev": true, - "optional": true, "requires": { "boom": "2.x.x", "cryptiles": "2.x.x", @@ -4967,8 +4997,7 @@ "hoek": { "version": "2.16.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "http-signature": { "version": "1.1.1", @@ -4985,7 +5014,6 @@ "version": "1.0.6", "bundled": true, "dev": true, - "optional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4994,8 +5022,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.4", @@ -5007,7 +5034,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "1.0.1" } @@ -5021,8 +5047,7 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "isstream": { "version": "0.1.2", @@ -5111,7 +5136,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "1.1.7" } @@ -5126,7 +5150,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5200,7 +5223,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5230,8 +5252,7 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "performance-now": { "version": "0.2.0", @@ -5242,8 +5263,7 @@ "process-nextick-args": { "version": "1.0.7", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "punycode": { "version": "1.4.1", @@ -5281,7 +5301,6 @@ "version": "2.2.9", "bundled": true, "dev": true, - "optional": true, "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", @@ -5326,7 +5345,6 @@ "version": "2.6.1", "bundled": true, "dev": true, - "optional": true, "requires": { "glob": "^7.0.5" } @@ -5334,8 +5352,7 @@ "safe-buffer": { "version": "5.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "semver": { "version": "5.3.0", @@ -5359,7 +5376,6 @@ "version": "1.0.9", "bundled": true, "dev": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -5393,7 +5409,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5404,7 +5419,6 @@ "version": "1.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -5419,7 +5433,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5434,7 +5447,6 @@ "version": "2.2.1", "bundled": true, "dev": true, - "optional": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -5490,8 +5502,7 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "uuid": { "version": "3.0.1", @@ -5520,8 +5531,7 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -5530,7 +5540,6 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, - "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -5617,7 +5626,6 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, - "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -6071,8 +6079,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true + "dev": true }, "has-value": { "version": "1.0.0", @@ -6397,7 +6404,6 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz", "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=", "dev": true, - "optional": true, "requires": { "agent-base": "2", "debug": "2", @@ -6448,7 +6454,6 @@ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", "dev": true, - "optional": true, "requires": { "httpreq": ">=0.4.22", "underscore": "~1.7.0" @@ -6458,8 +6463,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "dev": true, - "optional": true + "dev": true }, "https-browserify": { "version": "1.0.0", @@ -7594,15 +7598,13 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", - "dev": true, - "optional": true + "dev": true }, "libmime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", "dev": true, - "optional": true, "requires": { "iconv-lite": "0.4.15", "libbase64": "0.1.0", @@ -7613,8 +7615,7 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true, - "optional": true + "dev": true } } }, @@ -7622,8 +7623,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "dev": true, - "optional": true + "dev": true }, "libsodium-wrappers": { "version": "0.5.4", @@ -8463,6 +8463,11 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8729,8 +8734,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true + "dev": true }, "caseless": { "version": "0.11.0", @@ -8744,7 +8748,6 @@ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -8806,8 +8809,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "optional": true + "dev": true }, "tunnel-agent": { "version": "0.4.3", @@ -8862,15 +8864,13 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", - "dev": true, - "optional": true + "dev": true }, "nodemailer-shared": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", "dev": true, - "optional": true, "requires": { "nodemailer-fetch": "1.6.0" } @@ -8903,8 +8903,7 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "dev": true, - "optional": true + "dev": true }, "nopt": { "version": "4.0.1", @@ -13124,7 +13123,6 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, - "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -15680,8 +15678,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "optional": true + "dev": true }, "prepend-http": { "version": "1.0.4", @@ -17158,15 +17155,13 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", - "dev": true, - "optional": true + "dev": true }, "smtp-connection": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", "dev": true, - "optional": true, "requires": { "httpntlm": "1.6.1", "nodemailer-shared": "1.1.0" @@ -17392,7 +17387,6 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", "dev": true, - "optional": true, "requires": { "ip": "^1.1.4", "smart-buffer": "^1.0.13" @@ -17403,7 +17397,6 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz", "integrity": "sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw==", "dev": true, - "optional": true, "requires": { "agent-base": "2", "extend": "3", @@ -18460,7 +18453,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, - "optional": true, "requires": { "prelude-ls": "~1.1.2" } @@ -18589,8 +18581,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true, - "optional": true + "dev": true }, "union-value": { "version": "1.0.0", @@ -19877,7 +19868,6 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, - "optional": true, "requires": { "string-width": "^1.0.2" } diff --git a/package.json b/package.json index 3e212eadb..973f6f27f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kukai", - "version": "1.3.0", + "version": "1.3.1", "license": "MIT", "scripts": { "ng": "ng", @@ -24,12 +24,14 @@ }, "private": true, "dependencies": { - "@angular/animations": "^5.2.0", + "@angular/animations": "^5.2.11", + "@angular/cdk": "^5.2.5", "@angular/common": "^5.2.0", "@angular/compiler": "^5.2.0", "@angular/core": "^5.2.0", "@angular/forms": "^5.2.0", "@angular/http": "^5.2.0", + "@angular/material": "^5.2.5", "@angular/platform-browser": "^5.2.0", "@angular/platform-browser-dynamic": "^5.2.0", "@angular/router": "^5.2.0", @@ -45,6 +47,7 @@ "bs58": "^4.0.1", "bs58check": "^2.1.1", "buffer": "^5.0.7", + "chart.js": "^2.7.3", "codecov": "^2.3.1", "copy-to-clipboard": "^3.0.8", "core-js": "^2.4.1", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 1e4b010d3..0c5bc968d 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -16,6 +16,9 @@ import { AccountComponent } from './components/account/account.component'; import { MnemonicImportComponent } from './components/mnemonic-import/mnemonic-import.component'; import { BakeryComponent } from './components/bakery/bakery.component'; import { ActivateComponent } from './components/activate/activate.component'; +import { VotingComponent } from './components/voting/voting.component'; +import { CommunityComponent } from './components/community/community.component'; +import { BakersListComponent } from './components/bakers-list/bakers-list.component'; const routes: Routes = [ { path: '', component: StartComponent }, // Content Centre position @@ -32,7 +35,10 @@ const routes: Routes = [ { path: 'delegate', component: DelegateComponent }, { path: 'account', component: AccountComponent }, { path: 'bakery', component: BakeryComponent }, - { path: 'activate', component: ActivateComponent } + { path: 'activate', component: ActivateComponent }, + { path: 'voting', component: VotingComponent }, + { path: 'community', component: CommunityComponent }, + { path: 'bakers-list', component: BakersListComponent } ]; @NgModule({ diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 65522e8e0..cad40f48f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -5,6 +5,11 @@ import { HttpClientModule, HttpClient } from '@angular/common/http'; import { AppRoutingModule } from './app-routing.module'; import { BsModalService } from 'ngx-bootstrap/modal'; +// From Angular Material +import { MatSortModule } from '@angular/material'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + + // For translation import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import {TranslateHttpLoader} from '@ngx-translate/http-loader'; @@ -51,6 +56,9 @@ import { OperationService } from './services/operation.service'; import { BakeryComponent } from './components/bakery/bakery.component'; import { ActivateComponent } from './components/activate/activate.component'; import { MessagesComponent } from './components/messages/messages.component'; // Empty +import { VotingComponent } from './components/voting/voting.component'; +import { CommunityComponent } from './components/community/community.component'; +import { BakersListComponent } from './components/bakers-list/bakers-list.component'; // Pipes import { ErrorHandlingPipe } from './pipes/error-handling.pipe'; @@ -87,6 +95,9 @@ export function HttpLoaderFactory(http: HttpClient) { BakeryComponent, ActivateComponent, MessagesComponent, // Empty + VotingComponent, + CommunityComponent, + BakersListComponent, // Pipes ErrorHandlingPipe, @@ -96,6 +107,8 @@ export function HttpLoaderFactory(http: HttpClient) { ], imports: [ BrowserModule, + BrowserAnimationsModule, + MatSortModule, FormsModule, AppRoutingModule, HttpClientModule, diff --git a/src/app/components/bakers-list/bakers-list.component.html b/src/app/components/bakers-list/bakers-list.component.html new file mode 100644 index 000000000..a63aeb16e --- /dev/null +++ b/src/app/components/bakers-list/bakers-list.component.html @@ -0,0 +1,126 @@ + +
+ +
+
+

Bakers List

+
+
+ + +
+
+

+

Here, you can easily view the public bakers vote and participation

+

+
+
+ +
+ + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name Rolls Identity Proposal Period Exploration Testing Promotion
+ Baker image {{ baker.baker_name }} + {{ baker.rolls }} {{ baker.identity }} {{ baker.vote }} {{ baker.vote2 }} {{ baker.vote3 }}
+
+
+ +
+ + +
+ + \ No newline at end of file diff --git a/src/app/components/bakers-list/bakers-list.component.scss b/src/app/components/bakers-list/bakers-list.component.scss new file mode 100644 index 000000000..432639384 --- /dev/null +++ b/src/app/components/bakers-list/bakers-list.component.scss @@ -0,0 +1,189 @@ +.mono { + font-family: "Courier New", Courier, monospace; +} +.page-header { + margin: 40px 0px 10px 0px; //top right bottom left +} + +.bottom-separator { + padding-bottom: 27px; + border-bottom: 1px solid #eee; //Alignment with sidebar + margin-bottom: 0.5rem; //space between border and next content +} + +.page-header-no-account { + margin: 40px 0px 10px 0px; //top right bottom left +} + +.bottom-separator-no-account { + padding-bottom: 27px; + border-bottom: 1px solid #eee; //Alignment with sidebar + margin-bottom: 0.5rem; //space between border and next content +} +.column-sort { + cursor:pointer; +} +h4 { + font-weight: 400; +} + +.row-subheading { + min-width: 992; +} + +//btn-second +.btn-second { + min-width: 96px; + color: #333333; +} + +.btn-second:hover { + background-color: #cccccc; +} + +.btn-second:active { + background-color: #b3b3b3; +} + +.show-more { + font-size: 0.9rem; +} + +.btn-balance { + color: #6c757d; + padding-right: 0rem; // original 0.5rem; + padding-left: 0rem; // original 0.5rem; +} + +//Accounts table +.row-header { + font-weight: bold; +} + +.col-header { + background-color: #fde19b; +} + +.row-buttons { + padding-top: 5px; +} + +.col-border { + padding-top: 0.4em; + padding-bottom: 0.4em; +} + +.min-size-name-image-cell { + min-width: 200px; +} + +.min-size-address-cell { + min-width: 380px; // 388px; +} + +.min-size-number-cell { + min-width: 75px; // 188px; +} + +.min-size-other-cell { + min-width: 180px; // 188px; +} + +.margin-left { + margin-left: 1rem; +} + +.no-margin { + margin-bottom: 0rem //default at 1rem +} + + +/* --------------------------------------------------- + CUSTOM STYLE +----------------------------------------------------- */ +$tableColor : #fde19b; +$darkColor : #ffc107; +$lightBlack : #555555; +$lightYellow : #f9cb9c; +$lightgrey : #e1e5ea; + + +.tableSection{ + margin-bottom: 30px; + thead { + background-color: $tableColor; + th{ + border: 1px solid $darkColor; + //border-top: 0; + white-space: nowrap; + box-shadow: inset 0 -1px 0 0 $lightgrey; + //border-bottom: 0; + //padding: 1.3rem; + } + } + .table{ + border-collapse: separate; + border-spacing: 0; + tbody{ + tr{ + th{ + background-color: $tableColor; + border: 1px solid $darkColor; + white-space: nowrap; + box-shadow: inset 0 -1px 0 0 $lightgrey; + //border-bottom: 0; + //border-top: 0; + //padding: 1.3rem; + } + td { + border-color: $darkColor; + border: 1px solid $darkColor; + //font-size: 15px; + white-space: nowrap; + box-shadow: inset 0 -1px 0 0 $lightgrey; + //border-bottom: 0; + //border-top: 0; + //padding: 1.3rem; + /* + &:nth-child(2){ + color: #007bff; + } + &:nth-child(3){ + color: #007bff; + } */ + } + } + } + } +} + + +/* Responsive breakpoints */ +// Extra small devices (portrait phones, less than 576px) +// No media query since this is the default in Bootstrap + +// Small devices (landscape phones, 576px and up) +@media (min-width: 576px) { + .container { + padding-left: 2em; + min-width: 0vw; + } + } + +// Medium devices (tablets, 768px and up) +//@media (min-width: 768px) { ... } + +// Large devices (desktops, 992px and up) +@media (min-width: 992px) { + //.container { + min-width: 0vw; + //} + } + +// Extra large devices (large desktops, 1200px and up) +@media (min-width: 1200px) { + .container { + padding-left: 2em; + min-width: 0vw; // 65vw + } +} \ No newline at end of file diff --git a/src/app/components/bakers-list/bakers-list.component.ts b/src/app/components/bakers-list/bakers-list.component.ts new file mode 100644 index 000000000..103e0929f --- /dev/null +++ b/src/app/components/bakers-list/bakers-list.component.ts @@ -0,0 +1,299 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Sort } from '@angular/material'; + +import { WalletService } from '../../services/wallet.service'; +import { TzscanService } from '../../services/tzscan.service'; +import { OperationService } from '../../services/operation.service'; +import { DelegatorNamePipe } from '../../pipes/delegator-name.pipe'; + +import { Period, PeriodKind } from '../../interfaces'; +import { VOTINGPERIODHEADS } from '../../../data/bakers-list'; +import { BAKERSLIST } from '../../../data/bakers-list'; + +@Component({ + selector: 'app-bakers-list', + templateUrl: './bakers-list.component.html', + styleUrls: ['./bakers-list.component.scss'] +}) +export class BakersListComponent implements OnInit, OnDestroy { + + showAll = false; + bakersList = BAKERSLIST; + athensAVotes = null; + athensBVotes = null; + athensAHash = 'Pt24m4xiPbLDhVgVfABUjirbmda3yohdN82Sp9FeuAXJ4eV9otd'; + athensBHash = 'Psd1ynUBhMZAeajwcZJAeq5NrxorM6UCU4GJqxZ7Bx2e9vUWB6z'; + proposals = null; + proposalsHash: string[] = []; + + showBtn = 'Show all the bakers'; + + showColumn = { + Proposal: false, + Exploration: false, + Testing: false, + Promotion: false + }; + + currentParticipation = { + proposal: [], + unused_count: -1, + unused_votes: -1, + total_count: -1, + total_votes: -1 + }; + + votingPeriodHeads = VOTINGPERIODHEADS; + currentPeriod: Period = { + amendment: 'Athens', + period: 10, + period_kind: 'Proposal', //PeriodKind.Proposal, + proposal_hash: [], + proposal_alias: [], + start_level: this.votingPeriodHeads[0].start_level, // 327681 + end_level: this.votingPeriodHeads[0].end_level, // 360448 + level: -1, + progress: -1, + remaining: -1 + }; + + constructor( + // Uncaught Error: Can't resolve all parameters for BakersListComponent: ([object Object], [object Object], [object Object], [object Object], ?). + public walletService: WalletService, + private tzscanService: TzscanService, + private delegatorNamePipe: DelegatorNamePipe, + private operationService: OperationService + ) { } + + sortData(sort: Sort) { + const data = this.bakersList.slice(); + if (!sort.active || sort.direction === '') { + this.bakersList = data; + return; + } + + this.bakersList = data.sort((a, b) => { + const isAsc = sort.direction === 'asc'; + switch (sort.active) { + case 'name': return compare(a.baker_name, b.baker_name, isAsc); + case 'roll': return compare(+a.rolls, +b.rolls, isAsc); + case 'identity': return compare(+a.identity, +b.identity, isAsc); + case 'proposal': return compare(+a.vote, +b.vote, isAsc); + case 'exploration': return compare(+a.vote2, +b.vote2, isAsc); + //case 'testing': return compare(+a.protein, +b.protein, isAsc); + //case 'promotion': return compare(+a.protein, +b.protein, isAsc); + default: return 0; + } + }); + + function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); + } + } + + ngOnInit() { // or ngAfterViewInit // ngOnInit + //this.athensAVotes = this.tzscanService.getProposalVotes(this.athensAHash); + //this.tzscanService.getProposalVotes(this.athensAHash).subscribe( + this.sortName(); + this.tzscanService.getPeriodInfo().subscribe( + period => { + const periodInfo: any = period; + console.log('getPeriodInfo ', period); + //Check Voting Period Type + switch (periodInfo.kind) { + case 'proposal': { + this.showColumn.Proposal = true; + break; + } + case 'testing_vote': { + this.showColumn.Proposal = true; + this.showColumn.Exploration = true; + break; + } + case 'testing': { + this.showColumn.Proposal = true; + this.showColumn.Exploration = true; + break; + } + case 'promotion_vote': { + this.showColumn.Proposal = true; + this.showColumn.Exploration = true; + this.showColumn.Promotion = true; + break; + } + default: { + console.log('Error with period type'); + break; + } + } + this.operationService.getVotingRights().subscribe( + ((res: any) => { + console.log(res); + if (res.success) { + for (const voter of res.payload) { + // console.log('voter: ' + voter); + let known = false; + for (const baker of this.bakersList) { + if (baker.identity === voter.pkh) { + baker.rolls = voter.rolls; + known = true; + } + } if (!known) { // Add unknown bakers + this.bakersList.push({ + baker_name: '', + identity: voter.pkh, + vote: '', + rolls: voter.rolls, + vote2: '', + image: '' + }); + } + } + //Getting the totalNumbers + this.tzscanService.getTotalVotes(this.currentPeriod.period).subscribe( + result => { + const totalVotes: any = result; + this.currentParticipation.unused_count = totalVotes.unused_count; + this.currentParticipation.unused_votes = totalVotes.unused_votes; + this.currentParticipation.total_count = totalVotes.total_count; + this.currentParticipation.total_votes = totalVotes.total_votes; + console.log('currentParticipation ', this.currentParticipation); + }); + this.tzscanService.getProposal().subscribe( + data => { + this.proposals = data; + console.log('proposals ', this.proposals); + + for (const proposal of this.proposals) { + this.proposalsHash.push(proposal.proposal_hash); + // console.log('proposal.proposal_hash ', proposal.proposal_hash); + } + console.log('proposalsHash ', this.proposalsHash); + + /* To replace call made at l132 and l140 + //For Proposal Period, to get proposal votes details for each proposal + for (const hash of this.proposalsHash) { + this.tzscanService.getProposalVotes(hash).subscribe( + votes => { + if (this.athensAHash === hash) { + this.athensAVotes = votes; + } else { + this.athensBVotes = votes; + } + console.log('athensAVotes ', this.athensAVotes); + } + ); + } + console.log('athensAVotes ', this.athensAVotes); // null + console.log('athensBVotes ', this.athensBVotes); // null + */ + this.tzscanService.getProposalVotes(this.proposalsHash[0]).subscribe( + votesA => { + // console.log('votesA ', votesA); + if (this.athensAHash === this.proposalsHash[0]) { + this.athensAVotes = votesA; + } else { + this.athensBVotes = votesA; + } + this.tzscanService.getProposalVotes(this.proposalsHash[1]).subscribe( + votesB => { + if (this.athensBHash === this.proposalsHash[1]) { + this.athensBVotes = votesB; + } else { + this.athensAVotes = votesB; + } + this.athensBVotes = votesB; + // console.log('athensAVotes ', this.athensAVotes); + // console.log('athensBVotes ', this.athensBVotes); + + for (const athensAVote of this.athensAVotes) { + // console.log('athensAVote.source.tz ', athensAVote.source.tz); + for (const baker of this.bakersList) { + if (baker.identity === athensAVote.source.tz) { + baker.vote = 'Athens A'; + } + } + } + for (const athensBVotes of this.athensBVotes) { + for (const baker of this.bakersList) { + if (baker.identity === athensBVotes.source.tz) { + if (baker.vote !== 'Athens A') { + baker.vote = 'Athens B'; + } else { + baker.vote = baker.vote.concat('; Athens B'); + } + } + } + } + // Get number of votes + if (this.showColumn.Exploration) { + let maxPeriod = periodInfo.period; + if (this.showColumn.Promotion) { + maxPeriod -= 2; + } + this.tzscanService.getBallotVotes(maxPeriod).subscribe( + (votes: any) => { + for (const vote of votes) { + const index = this.bakersList.findIndex(b => b.identity === vote.type.source.tz); + if (index !== -1) { + // console.log(JSON.stringify(this.bakersList[index])); + if (!this.showColumn.Promotion) { + if (!this.bakersList[index].vote2) { + this.bakersList[index].vote2 = vote.type.ballot; + } + } else { + if (vote.type.period < periodInfo.period) {// exploration vote + if (!this.bakersList[index].vote2) { + this.bakersList[index].vote2 = vote.type.ballot; + } + } else { // promotion vote + if (!this.bakersList[index].vote3) { + this.bakersList[index].vote3 = vote.type.ballot; + } + } + } + } + } + } + ); + } + } + ); + } + ); + }, + err => console.log('Failed to get proposal: ' + 'this.athensAHash ' + JSON.stringify(err)) + ); + } + }) + ); + }); + // console.log('athensAVotes ', this.athensAVotes); // returning null + } + sortRolls() { + console.log('Sorting on rolls'); + this.bakersList.sort((a, b) => b.rolls - a.rolls); + } + sortName() { + console.log('Sorting on name'); + this.bakersList.sort((a, b) => { + if (!a.baker_name) { return 1; } + if (!b.baker_name) { return -1; } + if (a.baker_name < b.baker_name) { return -1; } + if (a.baker_name > b.baker_name) { return 1; } + return 0; + }); + } + toggleShowAll() { + this.showAll = !this.showAll; + + if (this.showAll) { + this.showBtn = 'Show only Public Bakers'; + } else { + this.showBtn = 'Show all the Bakers'; + } + } + ngOnDestroy() { + this.bakersList = []; + } +} diff --git a/src/app/components/community/community.component.html b/src/app/components/community/community.component.html new file mode 100644 index 000000000..30939288d --- /dev/null +++ b/src/app/components/community/community.component.html @@ -0,0 +1,53 @@ + +
+ +
+
+

Building Kukai

+
+
+ + +
+
+

+

Thank you for using and contributing to Kukai. Check out what we're working on here and share your thoughts on upcoming features with us and the wider community.

+

+
+
+ +
+ +
+
+

...

+
+
+
+
+

+ ... to be continued ... +

+
+
+ +
+ + \ No newline at end of file diff --git a/src/app/components/community/community.component.scss b/src/app/components/community/community.component.scss new file mode 100644 index 000000000..d3f9b247f --- /dev/null +++ b/src/app/components/community/community.component.scss @@ -0,0 +1,59 @@ +.mono { + font-family: "Courier New", Courier, monospace; +} +.page-header { + margin: 40px 0px 10px 0px; //top right bottom left +} + +.bottom-separator { + padding-bottom: 27px; + border-bottom: 1px solid #eee; //Alignment with sidebar + margin-bottom: 0.5rem; //space between border and next content +} + +.page-header-no-account { + margin: 40px 0px 10px 0px; //top right bottom left +} + +.bottom-separator-no-account { + padding-bottom: 27px; + border-bottom: 1px solid #eee; //Alignment with sidebar + margin-bottom: 0.5rem; //space between border and next content +} + +h4 { + font-weight: 400; +} + + + + +/* Responsive breakpoints */ +// Extra small devices (portrait phones, less than 576px) +// No media query since this is the default in Bootstrap + +// Small devices (landscape phones, 576px and up) +@media (min-width: 576px) { + .container { + padding-left: 2em; + min-width: 0vw; + } + } + +// Medium devices (tablets, 768px and up) +//@media (min-width: 768px) { ... } + +// Large devices (desktops, 992px and up) +@media (min-width: 992px) { + //.container { + min-width: 0vw; + //} + } + +// Extra large devices (large desktops, 1200px and up) +@media (min-width: 1200px) { + .container { + padding-left: 2em; + min-width: 0vw; // 65vw + } +} \ No newline at end of file diff --git a/src/app/components/community/community.component.ts b/src/app/components/community/community.component.ts new file mode 100644 index 000000000..403ff678e --- /dev/null +++ b/src/app/components/community/community.component.ts @@ -0,0 +1,20 @@ +import { Component } from '@angular/core'; + +import { WalletService } from '../../services/wallet.service'; +import { DelegatorNamePipe } from '../../pipes/delegator-name.pipe'; + + +@Component({ + selector: 'app-community', + templateUrl: './community.component.html', + styleUrls: ['./community.component.scss'] +}) +export class CommunityComponent { + + constructor( + public walletService: WalletService, + private delegatorNamePipe: DelegatorNamePipe + ) { } + + +} diff --git a/src/app/components/home-page/home-page.component.html b/src/app/components/home-page/home-page.component.html index ac3880edc..5cc5424e5 100644 --- a/src/app/components/home-page/home-page.component.html +++ b/src/app/components/home-page/home-page.component.html @@ -1,4 +1,4 @@ -
+
@@ -16,7 +16,7 @@
-
+
+ + + +
+ Alphanet +
+
+ Mainnet +
+
+ + + +
+ +
+
+

Votes for Protocol amendments

+
+
+ + +
+
+

+

Athens amendments

+

+
+
+ + +
+
+ Proposal Period +
+
+ Exploration Vote Period +
+
+ Testing Period +
+
+ Promotion Period +
+
+ + +
+
+
+
+
{{currentPeriod.progress}}%
+
+
+
+
+
+
+
{{currentPeriod.progress}}%
+
+
+
+
+
+
+
{{currentPeriod.progress}}%
+
+
+
+
+
+
+
{{currentPeriod.progress}}%
+
+
+
+
+ + +
+
+

+ Amendments votes + (Acceptance: + {{ballot.vote_yay/(ballot.vote_yay+ballot.vote_nay)*100 | number:'1.0-2'}} %) +

+ +
+ +
+

Bakers' Participation (rolls)

+

Bakers' Participation (nodes)

+ +
+
+ +
+
+ + + +
+
+

More information

+
+
+
+
+

+ A protocol amendment goes through 4 voting periods. Each period lasts 8 cycles (~22.4 days). A quorum + and supermajority is required for the Exploration Vote and Promotion period. + You can check Tezos + documentation + and the excellent guide + by Jacob Arluck to learn more about the voting process. +

+

+ Athens A + proposal is for the increase of gas limit and the reduction of roll size from 10,000 xtz to 8,000 xtz. + Athens B + proposal is for the increase of gas limit only. +

+

+ You can view and participate in the community debate on Kialo + and Riot. + To learn more about the different amendments, you can check this another great write-up by Jacob Arluck, + the technical post and announcement + from Nomadic Labs. +

+

With Tezvote's smart-contract you can also inform + your baker of your preferred choice.

+ +
+
+ +
+ + \ No newline at end of file diff --git a/src/app/components/voting/voting.component.scss b/src/app/components/voting/voting.component.scss new file mode 100644 index 000000000..4aa8de89f --- /dev/null +++ b/src/app/components/voting/voting.component.scss @@ -0,0 +1,136 @@ +.mono { + font-family: "Courier New", Courier, monospace; +} +.page-header { + margin: 40px 0px 10px 0px; //top right bottom left +} + +.bottom-separator { + padding-bottom: 27px; + border-bottom: 1px solid #eee; //Alignment with sidebar + margin-bottom: 0.5rem; //space between border and next content +} + +.page-header-no-account { + margin: 40px 0px 10px 0px; //top right bottom left +} + +.bottom-separator-no-account { + padding-bottom: 27px; + border-bottom: 1px solid #eee; //Alignment with sidebar + margin-bottom: 0.5rem; //space between border and next content +} + +h4 { + font-weight: 400; +} + +.row-subheading { + min-width: 992; +} + +//btn-second +.btn-second { + min-width: 96px; + color: #333333; +} + +.btn-second:hover { + background-color: #cccccc; +} + +.btn-second:active { + background-color: #b3b3b3; +} + +//Voting bar +.row-period { + font-weight: bold; + text-align: center; + color: #fafafa; +} + +.col-period { + padding-top: 0.4em; + padding-bottom: 0.4em; + background: #191919; +} + +.col-active { + background-color: #FAB915; +} + +.col-period-start { + border-top-left-radius: 20px; + border-bottom-left-radius: 20px; +} + +.col-period-end { + border-top-right-radius: 20px; + border-bottom-right-radius: 20px; +} + +.row-progress { + padding-top: 0.8em; +} + +.progress-bar { + background-color: #FAB915; +} + +.row-doughnut { + padding-top: 0.8em; +} + +.title { + font-weight: bold; + text-align: center; + font-size: 1.2rem; +} + +.sub-title { + font-size: 0.8rem; +} + +.fa-repeat:active { + font-weight: bold; +} + +.fa-repeat:hover { + font-weight: bold; +} + +.col-bakers-list { + text-align: right; +} + + +/* Responsive breakpoints */ +// Extra small devices (portrait phones, less than 576px) +// No media query since this is the default in Bootstrap + +// Small devices (landscape phones, 576px and up) +@media (min-width: 576px) { + .container { + padding-left: 2em; + min-width: 0vw; + } + } + +// Medium devices (tablets, 768px and up) +//@media (min-width: 768px) { ... } + +// Large devices (desktops, 992px and up) +@media (min-width: 992px) { + //.container { + min-width: 0vw; + //} + } + +// Extra large devices (large desktops, 1200px and up) +@media (min-width: 1200px) { + .container { + padding-left: 2em; + min-width: 0vw; // 65vw + } +} \ No newline at end of file diff --git a/src/app/components/voting/voting.component.ts b/src/app/components/voting/voting.component.ts new file mode 100644 index 000000000..bbde3edf1 --- /dev/null +++ b/src/app/components/voting/voting.component.ts @@ -0,0 +1,317 @@ +import { Component, ViewChild, OnInit, AfterViewInit } from '@angular/core'; + +import { WalletService } from '../../services/wallet.service'; +import { TzscanService } from '../../services/tzscan.service'; +import { Chart } from 'chart.js'; + +import { DelegatorNamePipe } from '../../pipes/delegator-name.pipe'; + +import { VOTINGPERIOD, PROPOSALS } from '../../constants'; +import { VOTINGPERIODHEADS } from '../../../data/bakers-list'; +import { Period, Ballot, PeriodKind, ParticipationPerPeriod } from '../../interfaces'; + +@Component({ + selector: 'app-voting', + templateUrl: './voting.component.html', + styleUrls: ['./voting.component.scss'] +}) +export class VotingComponent implements OnInit { + @ViewChild('doughnutCanvasVotes') doughnutCanvasVotes; + @ViewChild('doughnutCanvasParticipation') doughnutCanvasParticipation; + + proposals = null; //For proposal period + proposalsHash: string[] = []; + ballot: Ballot = { //For the other 3 periods (Exploration, Testing, Promotion) + proposal: '', + nb_yay: -1, + nb_nay: -1, + nb_pass: -1, + vote_yay: -1, + vote_nay: -1, + vote_pass: -1 + }; + + athensAVotes = null; + athensBVotes = null; + + isSuperMajority = true; + isBakersParticipation = true; + + doughnutVotes: any; + doughnutParticipation: any; + + votingPeriodHeads = VOTINGPERIODHEADS; + currentPeriod: Period = { + amendment: 'Athens', + period: 10, + period_kind: '', //PeriodKind.Proposal + proposal_hash: [], + proposal_alias: [], + start_level: this.votingPeriodHeads[0].start_level, // 327681 + end_level: this.votingPeriodHeads[0].end_level, // 360448 - not used + level: -1, + progress: -1, + remaining: -1 + }; + + currentParticipation = { + proposal: [], + unused_count: 0, + unused_votes: 0, + total_count: 0, + total_votes: 0 + }; + + constructor( + public walletService: WalletService, + private tzscanService: TzscanService, + private delegatorNamePipe: DelegatorNamePipe + ) {} + + showDoughnutCharts(currentParticipation: any) { + const votersCounted = currentParticipation.total_count - currentParticipation.unused_count; + const votersUndecided = currentParticipation.unused_count; + + if (this.currentPeriod.period_kind === 'Proposal') { // In proposal period, with multiple proposals + // Vote Counts + this.doughnutVotes = new Chart(this.doughnutCanvasVotes.nativeElement, { + + type: 'doughnut', + data: { + labels: [currentParticipation.proposal[0].alias, currentParticipation.proposal[1].alias], + // 'Athens A: Increase gaz limits', 'Athens B: Increase gaz limits and decrease roll size' + datasets: [{ + label: '# of Votes', + data: [currentParticipation.proposal[0].votes, currentParticipation.proposal[1].votes], + backgroundColor: [ + '#FF6384', + '#36A2EB', + '#FFCE56' + ], + hoverBackgroundColor: [ + '#cc4f69', + '#2b81bc', + '#cca444' + ] + }] + } + }); + + } else { // In ballot period + // Check SuperMajority + this.isSuperMajority = this.ballot.vote_yay / (this.ballot.vote_yay + this.ballot.vote_nay) > 0.8; + // console.log('Yes supermajority: ', this.ballot.vote_yay / (this.ballot.vote_yay + this.ballot.vote_nay) > 0.8); + + // Vote Counts + this.doughnutVotes = new Chart(this.doughnutCanvasVotes.nativeElement, { + + type: 'doughnut', + data: { + labels: ['Yes', 'No', 'Pass'], + datasets: [{ + label: '# of Votes', + data: [this.ballot.vote_yay, this.ballot.vote_nay, this.ballot.vote_pass], + backgroundColor: [ + '#FF6384', + '#36A2EB', + '#FFCE56' + ], + hoverBackgroundColor: [ + '#cc4f69', + '#2b81bc', + '#cca444' + ] + }] + } + }); + } + + // Bakers Participation + this.showParticipationDoughnutCharts(currentParticipation); + } + + showParticipationDoughnutCharts(currentParticipation: any) { + const votersCounted = currentParticipation.total_count - currentParticipation.unused_count; + const votersUndecided = currentParticipation.unused_count; + + // Bakers Participation + this.doughnutParticipation = new Chart(this.doughnutCanvasParticipation.nativeElement, { + + type: 'doughnut', + data: { + labels: ['Voted', 'To be decided'], + datasets: [{ + label: '# of Votes', + data: [this.currentParticipation.total_votes - this.currentParticipation.unused_votes, this.currentParticipation.unused_votes], + backgroundColor: [ + '#00bc6c', + '#9f9ff0' + ], + hoverBackgroundColor: [ + '#009656', + '#7f7fc0' + ] + }] + } + }); + } + + toggleParticipationCharts() { + this.isBakersParticipation = !this.isBakersParticipation; + console.log(this.isBakersParticipation); + if (this.isBakersParticipation) { + // Bakers Participation - docs: https://www.chartjs.org/docs/latest/developers/updates.html + /*this.doughnutParticipation.data.labels.pop(); + this.doughnutParticipation.data.labels.pop(); + this.doughnutParticipation.data.labels.push('Voted', 'To be decided');*/ + //this.doughnutParticipation.data.labels = ['Voted', 'To be decided']; + this.doughnutParticipation.data.datasets.forEach((dataset) => { + dataset.data.pop(); + dataset.data.pop(); + dataset.data.push(this.currentParticipation.total_votes - this.currentParticipation.unused_votes); + dataset.data.push(this.currentParticipation.unused_votes); + }); + this.doughnutParticipation.update(); + } else { + // Vote counts + this.doughnutParticipation.data.datasets.forEach((dataset) => { + dataset.data.pop(); + dataset.data.pop(); + dataset.data.push(this.currentParticipation.total_count - this.currentParticipation.unused_count); + dataset.data.push(this.currentParticipation.unused_count); + }); + this.doughnutParticipation.update(); + } + } + + ngOnInit() { + console.log('votingPeriodHeads ', this.votingPeriodHeads); + + this.tzscanService.getPeriodInfo().subscribe( + data => { + const periodInfo: any = data; + console.log('getPeriodInfo ', data); + + //Check Voting Period Type + switch (periodInfo.kind) { + case 'proposal': { + this.currentPeriod.period_kind = 'Proposal'; //PeriodKind.Proposal + break; + } + case 'testing_vote': { + this.currentPeriod.period_kind = 'Exploration'; //PeriodKind.Exploration + this.currentPeriod.start_level = this.currentPeriod.start_level + VOTINGPERIOD.blocks; + this.currentPeriod.end_level = this.currentPeriod.end_level + VOTINGPERIOD.blocks; + break; + } + case 'testing': { + this.currentPeriod.period_kind = 'Testing'; //PeriodKind.Testing + this.currentPeriod.start_level = this.currentPeriod.start_level + VOTINGPERIOD.blocks * 2; + this.currentPeriod.end_level = this.currentPeriod.end_level + VOTINGPERIOD.blocks * 2; + break; + } + case 'promotion_vote': { + this.currentPeriod.period_kind = 'Promotion'; //PeriodKind.Promotion + this.currentPeriod.start_level = this.currentPeriod.start_level + VOTINGPERIOD.blocks * 3; + this.currentPeriod.end_level = this.currentPeriod.end_level + VOTINGPERIOD.blocks * 3; + break; + } + default: { + console.log('Error with period type'); + break; + } + } + + // Progress bar + this.currentPeriod.level = periodInfo.level; + this.currentPeriod.period = periodInfo.period; + this.currentPeriod.progress = Math.round((this.currentPeriod.level - this.currentPeriod.start_level) / VOTINGPERIOD.blocks * 100); + this.currentPeriod.remaining = Math.round(((this.currentPeriod.end_level - this.currentPeriod.level) / 60 / 24 * 100)) / 100; + console.log('currentPeriod.period ', this.currentPeriod.period); + + this.tzscanService.getProposalsCurrentPeriod(this.currentPeriod.period).subscribe( + proposalsCurrentPeriod => { + this.proposals = proposalsCurrentPeriod; + console.log('proposals ', this.proposals); + + for (const proposal of this.proposals) { + this.proposalsHash.push(proposal.proposal_hash); + // console.log('proposal.proposal_hash ', proposal.proposal_hash); + } + console.log('proposalsHash ', this.proposalsHash); + + //For Proposal Period, to get counts and votes for different competing proposals + for (const hash of this.proposalsHash) { + this.tzscanService.getNbProposalVotes(hash).subscribe( + resultproposalNumbers => { + //{"count":57,"votes":11408} + const proposalNumbers: any = resultproposalNumbers; + + const proposal = { + hash: hash, + alias: hash === PROPOSALS[0].hash ? PROPOSALS[0].alias : PROPOSALS[1].alias, // /!\ This will break with 3 proposals /!\ + count: proposalNumbers.count, + votes: proposalNumbers.votes + }; + + console.log('proposal ', proposal); + this.currentParticipation.proposal.push(proposal); + } + ); + } + console.log('currentParticipation.proposal ', this.currentParticipation.proposal); + + //For other 3 periods (Exploration, Testing, Promotion), to get ballot details (yah, nay or pass) + if (this.currentPeriod.period_kind !== 'Proposal') { + this.tzscanService.getBallots(this.currentPeriod.period, periodInfo.kind).subscribe( + result => { //{"proposal": "string","nb_yay": 0,"nb_nay": 0,"nb_pass": 0,"vote_yay": 0,"vote_nay": 0,"vote_pass": 0} + const ballotresult: any = result; + + this.ballot = { + proposal: ballotresult.proposal, + nb_yay: ballotresult.nb_yay, + nb_nay: ballotresult.nb_nay, + nb_pass: ballotresult.nb_pass, + vote_yay: ballotresult.vote_yay, + vote_nay: ballotresult.vote_nay, + vote_pass: ballotresult.vote_pass + }; + this.tzscanService.getTotalVotes2(this.currentPeriod.period).subscribe( + result2 => { + const totalVotes: any = result2; + console.log('totalVotes ' + JSON.stringify(totalVotes)); + this.currentParticipation.unused_count = totalVotes.count - (this.ballot.nb_yay + this.ballot.nb_nay + this.ballot.nb_pass); + this.currentParticipation.unused_votes = totalVotes.votes - (this.ballot.vote_yay + this.ballot.vote_nay + this.ballot.vote_pass); + this.currentParticipation.total_count = totalVotes.count; + this.currentParticipation.total_votes = totalVotes.votes; + console.log('currentParticipation ', this.currentParticipation); + //Display Doughnut Charts + this.showDoughnutCharts(this.currentParticipation); + } + ); + } + ); + } + + //Getting the totalNumbers + if (this.currentPeriod.period_kind === 'Proposal') { + this.tzscanService.getTotalVotes(this.currentPeriod.period).subscribe( + result => { //{"proposal_count":2,"total_count":458,"total_votes":51604,"used_count":107,"used_votes":15773,"unused_count":360,"unused_votes":36492} + const totalVotes: any = result; + this.currentParticipation.unused_count = totalVotes.unused_count; + this.currentParticipation.unused_votes = totalVotes.unused_votes; + this.currentParticipation.total_count = totalVotes.total_count; + this.currentParticipation.total_votes = totalVotes.total_votes; + console.log('currentParticipation ', this.currentParticipation); + + //Display Doughnut Charts + this.showDoughnutCharts(this.currentParticipation); + } + ); + } + } + ); + } + ); + } +} diff --git a/src/app/constants.ts b/src/app/constants.ts index f59849d04..14f2cabd1 100644 --- a/src/app/constants.ts +++ b/src/app/constants.ts @@ -5,6 +5,26 @@ interface Net { BLOCK_EXPLORER_URL: string; CHAIN_ID: string; } + +export const VOTINGPERIOD: any = { + cycles: 8, + blocks: 32768 +}; + +export const PROPOSALHASH: any = { + athensAHash: 'Pt24m4xiPbLDhVgVfABUjirbmda3yohdN82Sp9FeuAXJ4eV9otd', + athensBHash: 'Psd1ynUBhMZAeajwcZJAeq5NrxorM6UCU4GJqxZ7Bx2e9vUWB6z', +}; +export const PROPOSALS: any = [ + { + hash: PROPOSALHASH.athensAHash, + alias: 'Athens A' + }, + { + hash: PROPOSALHASH.athensBHash, + alias: 'Athens B' + } +]; export class Constants { // Select Zeronet, Alphanet or Mainnet // readonly NET: Net = this.alphanet(); @@ -27,18 +47,19 @@ export class Constants { API_URL: 'https://api.alphanet.tzscan.io/', NODE_URL: 'https://alphanet-node.tzscan.io/', BLOCK_EXPLORER_URL: 'https://alphanet.tzscan.io/', - CHAIN_ID: 'PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP' + CHAIN_ID: 'Pt24m4xiPbLDhVgVfABUjirbmda3yohdN82Sp9FeuAXJ4eV9otd' }; return ALPHANET; } mainnet(): Net { - const n = Math.floor(Math.random() * 6) + 1; + let n = Math.floor(Math.random() * 5) + 1; + if (n > 3) { n += 1; } const MAINNET: Net = { NAME: 'Mainnet', API_URL: 'https://api' + n + '.tzscan.io/', - NODE_URL: 'https://rpc.tezrpc.me/', + NODE_URL: 'https://mainnet.tezrpc.me/', BLOCK_EXPLORER_URL: 'https://tzscan.io/', - CHAIN_ID: 'PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP' + CHAIN_ID: 'Pt24m4xiPbLDhVgVfABUjirbmda3yohdN82Sp9FeuAXJ4eV9otd' }; return MAINNET; } diff --git a/src/app/interfaces.ts b/src/app/interfaces.ts index 9ecbc2d57..c0088952c 100644 --- a/src/app/interfaces.ts +++ b/src/app/interfaces.ts @@ -40,3 +40,59 @@ export enum WalletType { ViewOnlyWallet, ObserverWallet } +export interface Baker { + baker_name: string; + image: string; + rolls: number; + identity: string; + vote: string; + vote2: string; + // vote: [] +} +export interface Vote { + voting_period: string; + period_kind: PeriodKind; + proposal_hash: string[]; + proposal_alias: string[]; + votes: number[]; + operation: string[]; +} +export interface Period { + amendment: string; + period: number; + period_kind: string; + proposal_hash: string[]; + proposal_alias: string[]; + start_level: number; + end_level: number; + level: number; + progress: number; + remaining: number; +} +export interface ParticipationPerPeriod { + proposal?: [{ + hash: string; + alias: string; + count: number; + votes: number; + }]; + unused_count: number; + total_count: number; + unused_votes: number; + total_votes: number; +} +export interface Ballot { + proposal: string; + nb_yay: number; + nb_nay: number; + nb_pass: number; + vote_yay: number; + vote_nay: number; + vote_pass: number; +} +export enum PeriodKind { + Proposal, + Exploration, + Testing, + Promotion +} diff --git a/src/app/pipes/error-handling.pipe.ts b/src/app/pipes/error-handling.pipe.ts index 6d1237b7f..7508bee49 100644 --- a/src/app/pipes/error-handling.pipe.ts +++ b/src/app/pipes/error-handling.pipe.ts @@ -12,472 +12,471 @@ export class ErrorHandlingPipe implements PipeTransform { transform(errorId: string, args?: any): any { let errorMessage = ''; - const protocol = 'proto.003-PsddFKi3'; switch (errorId) { - case 'proto.003-PsddFKi3.InconsistentTypesTypeError': { + case 'proto.004-Pt24m4xi.InconsistentTypesTypeError': { // tslint:disable-next-line:max-line-length errorMessage = 'This is the basic type clash error, that appears in several places where the equality of two types have to be proven, it is always accompanied with another error that provides more context.'; break; } - case 'proto.003-PsddFKi3.badContractParameter': { + case 'proto.004-Pt24m4xi.badContractParameter': { // tslint:disable-next-line:max-line-length errorMessage = 'Either no parameter was supplied to a contract, a parameter was passed to an account, or a parameter was supplied of the wrong type'; break; } - case 'proto.003-PsddFKi3.badReturnTypeError': { + case 'proto.004-Pt24m4xi.badReturnTypeError': { errorMessage = 'Unexpected stack at the end of a lambda or script.'; break; } - case 'proto.003-PsddFKi3.badStackItemTypeError': { + case 'proto.004-Pt24m4xi.badStackItemTypeError': { errorMessage = 'The type of a stack item is unexpected (this error is always accompanied by a more precise one).'; break; } - case 'proto.003-PsddFKi3.badStackTypeError': { + case 'proto.004-Pt24m4xi.badStackTypeError': { errorMessage = 'The stack has an unexpected length or contents.'; break; } - case 'proto.003-PsddFKi3.baking.cannot_freeze_baking_deposit': { + case 'proto.004-Pt24m4xi.baking.cannot_freeze_baking_deposit': { errorMessage = 'Impossible to debit the required tokens on the baker\'s contract'; break; } - case 'proto.003-PsddFKi3.baking.cannot_freeze_endorsement_deposit': { + case 'proto.004-Pt24m4xi.baking.cannot_freeze_endorsement_deposit': { errorMessage = 'Impossible to debit the required tokens on the endorser\'s contract'; break; } - case 'proto.003-PsddFKi3.baking.inconsisten_endorsement': { + case 'proto.004-Pt24m4xi.baking.inconsisten_endorsement': { errorMessage = 'The operation tries to endorse slots with distinct delegates'; break; } - case 'proto.003-PsddFKi3.baking.insufficient_proof_of_work': { + case 'proto.004-Pt24m4xi.baking.insufficient_proof_of_work': { errorMessage = 'The block\'s proof-of-work stamp is insufficient'; break; } - case 'proto.003-PsddFKi3.baking.invalid_block_signature': { + case 'proto.004-Pt24m4xi.baking.invalid_block_signature': { errorMessage = 'A block was not signed with the expected private key.'; break; } - case 'proto.003-PsddFKi3.baking.invalid_fitness_gap': { + case 'proto.004-Pt24m4xi.baking.invalid_fitness_gap': { errorMessage = 'The gap of fitness is out of bounds'; break; } - case 'proto.003-PsddFKi3.baking.invalid_signature': { + case 'proto.004-Pt24m4xi.baking.invalid_signature': { errorMessage = 'The block\'s signature is invalid'; break; } - case 'proto.003-PsddFKi3.baking.invalid_slot': { + case 'proto.004-Pt24m4xi.baking.invalid_slot': { errorMessage = 'The baking slot is out of bounds'; break; } - case 'proto.003-PsddFKi3.baking.timestamp_too_early': { + case 'proto.004-Pt24m4xi.baking.timestamp_too_early': { errorMessage = 'The block timestamp is before the first slot for this baker at this level'; break; } - case 'proto.003-PsddFKi3.block.inconsistent_double_baking_evidence': { + case 'proto.004-Pt24m4xi.block.inconsistent_double_baking_evidence': { errorMessage = 'A double-baking evidence is inconsistent (two distinct delegates)'; break; } - case 'proto.003-PsddFKi3.block.inconsistent_double_endorsement_evidence': { + case 'proto.004-Pt24m4xi.block.inconsistent_double_endorsement_evidence': { errorMessage = 'A double-endorsement evidence is inconsistent (two distinct delegates)'; break; } - case 'proto.003-PsddFKi3.block.invalid_commitment': { + case 'proto.004-Pt24m4xi.block.invalid_commitment': { errorMessage = 'The block header has invalid commitment.'; break; } - case 'proto.003-PsddFKi3.block.invalid_double_baking_evidence': { + case 'proto.004-Pt24m4xi.block.invalid_double_baking_evidence': { errorMessage = 'A double-baking evidence is inconsistent (two distinct level)'; break; } - case 'proto.003-PsddFKi3.block.invalid_double_endorsement_evidence': { + case 'proto.004-Pt24m4xi.block.invalid_double_endorsement_evidence': { errorMessage = 'A double-endorsement evidence is malformed'; break; } - case 'proto.003-PsddFKi3.block.multiple_revelation': { + case 'proto.004-Pt24m4xi.block.multiple_revelation': { errorMessage = 'A manager operation should not contain more than one revelation'; break; } - case 'proto.003-PsddFKi3.block.outdated_double_baking_evidence': { + case 'proto.004-Pt24m4xi.block.outdated_double_baking_evidence': { errorMessage = 'A double-baking evidence is outdated.'; break; } - case 'proto.003-PsddFKi3.block.outdated_double_endorsement_evidence': { + case 'proto.004-Pt24m4xi.block.outdated_double_endorsement_evidence': { errorMessage = 'A double-endorsement evidence is outdated.'; break; } - case 'proto.003-PsddFKi3.block.too_early_double_baking_evidence': { + case 'proto.004-Pt24m4xi.block.too_early_double_baking_evidence': { errorMessage = 'A double-baking evidence is in the future'; break; } - case 'proto.003-PsddFKi3.block.too_early_double_endorsement_evidence': { + case 'proto.004-Pt24m4xi.block.too_early_double_endorsement_evidence': { errorMessage = 'A double-endorsement evidence is in the future'; break; } - case 'proto.003-PsddFKi3.block.unrequired_double_baking_evidence': { + case 'proto.004-Pt24m4xi.block.unrequired_double_baking_evidence': { errorMessage = 'A double-baking evidence is unrequired'; break; } - case 'proto.003-PsddFKi3.block.unrequired_double_endorsement_evidence': { + case 'proto.004-Pt24m4xi.block.unrequired_double_endorsement_evidence': { errorMessage = 'A double-endorsement evidence is unrequired'; break; } - case 'proto.003-PsddFKi3.comparableTypeExpectedTypeError': { + case 'proto.004-Pt24m4xi.comparableTypeExpectedTypeError': { errorMessage = 'A non comparable type was used in a place where only comparable types are accepted.'; break; } - case 'proto.003-PsddFKi3.context.failed_to_decode_parameter': { + case 'proto.004-Pt24m4xi.context.failed_to_decode_parameter': { errorMessage = 'Unexpected JSON object.'; break; } - case 'proto.003-PsddFKi3.context.failed_to_parse_parameter': { + case 'proto.004-Pt24m4xi.context.failed_to_parse_parameter': { errorMessage = 'The protocol parameters are not valid JSON.'; break; } - case 'proto.003-PsddFKi3.context.storage_error': { + case 'proto.004-Pt24m4xi.context.storage_error': { errorMessage = 'An error that should never happen unless something has been deleted or corrupted in the database.'; break; } - case 'proto.003-PsddFKi3.contract.balance_too_low': { + case 'proto.004-Pt24m4xi.contract.balance_too_low': { errorMessage = 'An operation tried to spend more tokens than the contract has'; break; } - case 'proto.003-PsddFKi3.contract.cannot_pay_storage_fee': { + case 'proto.004-Pt24m4xi.contract.cannot_pay_storage_fee': { errorMessage = 'The storage fee is higher than the contract balance'; break; } - case 'proto.003-PsddFKi3.contract.counter_in_the_future': { + case 'proto.004-Pt24m4xi.contract.counter_in_the_future': { errorMessage = 'An operation assumed a contract counter in the future'; break; } - case 'proto.003-PsddFKi3.contract.counter_in_the_past': { + case 'proto.004-Pt24m4xi.contract.counter_in_the_past': { errorMessage = 'An operation assumed a contract counter in the past'; break; } - case 'proto.003-PsddFKi3.contract.empty_transaction': { + case 'proto.004-Pt24m4xi.contract.empty_transaction': { errorMessage = 'Forbidden to credit 0ꜩ to a contract without code.'; break; } - case 'proto.003-PsddFKi3.contract.failure': { + case 'proto.004-Pt24m4xi.contract.failure': { errorMessage = 'Unexpected contract storage error'; break; } - case 'proto.003-PsddFKi3.contract.invalid_contract_notation': { + case 'proto.004-Pt24m4xi.contract.invalid_contract_notation': { errorMessage = 'A malformed contract notation was given to an RPC or in a script.'; break; } - case 'proto.003-PsddFKi3.contract.manager.inconsistent_hash': { + case 'proto.004-Pt24m4xi.contract.manager.inconsistent_hash': { errorMessage = 'A revealed manager public key is inconsistent with the announced hash'; break; } - case 'proto.003-PsddFKi3.contract.manager.inconsistent_public_key': { + case 'proto.004-Pt24m4xi.contract.manager.inconsistent_public_key': { errorMessage = 'A provided manager public key is different with the public key stored in the contract'; break; } - case 'proto.003-PsddFKi3.contract.manager.unregistered_delegate': { + case 'proto.004-Pt24m4xi.contract.manager.unregistered_delegate': { errorMessage = 'A contract cannot be delegated to an unregistered delegate'; break; } - case 'proto.003-PsddFKi3.contract.non_existing_contract': { + case 'proto.004-Pt24m4xi.contract.non_existing_contract': { errorMessage = 'A contract handle is not present in the context (either it never was or it has been destroyed)'; break; } - case 'proto.003-PsddFKi3.contract.previously_revealed_key': { + case 'proto.004-Pt24m4xi.contract.previously_revealed_key': { errorMessage = 'One tried to revealed twice a manager public key'; break; } - case 'proto.003-PsddFKi3.contract.undelegatable_contract': { + case 'proto.004-Pt24m4xi.contract.undelegatable_contract': { errorMessage = 'Tried to delegate an implicit contract or a non delegatable originated contract'; break; } - case 'proto.003-PsddFKi3.contract.unrevealed_key': { + case 'proto.004-Pt24m4xi.contract.unrevealed_key': { errorMessage = 'One tried to apply a manager operation without revealing the manager public key'; break; } - case 'proto.003-PsddFKi3.contract.unspendable_contract': { + case 'proto.004-Pt24m4xi.contract.unspendable_contract': { errorMessage = 'An operation tried to spend tokens from an unspendable contract'; break; } - case 'proto.003-PsddFKi3.delegate.already_active': { + case 'proto.004-Pt24m4xi.delegate.already_active': { errorMessage = 'Useless delegate reactivation'; break; } - case 'proto.003-PsddFKi3.delegate.empty_delegate_account': { + case 'proto.004-Pt24m4xi.delegate.empty_delegate_account': { errorMessage = 'Cannot register a delegate when its implicit account is empty'; break; } - case 'proto.003-PsddFKi3.delegate.no_deletion': { + case 'proto.004-Pt24m4xi.delegate.no_deletion': { errorMessage = 'Tried to unregister a delegate'; break; } - case 'proto.003-PsddFKi3.delegate.unchanged': { + case 'proto.004-Pt24m4xi.delegate.unchanged': { errorMessage = 'Contract already delegated to the given delegate'; break; } - case 'proto.003-PsddFKi3.duplicateMapKeys': { + case 'proto.004-Pt24m4xi.duplicateMapKeys': { errorMessage = 'Map literals cannot contain duplicated keys'; break; } - case 'proto.003-PsddFKi3.duplicateScriptField': { + case 'proto.004-Pt24m4xi.duplicateScriptField': { errorMessage = 'When parsing script, a field was found more than once'; break; } - case 'proto.003-PsddFKi3.duplicateSetValuesInLiteral': { + case 'proto.004-Pt24m4xi.duplicateSetValuesInLiteral': { errorMessage = 'Set literals cannot contain duplicate elements, but a duplicae was found while parsing.'; break; } - case 'proto.003-PsddFKi3.failNotInTailPositionTypeError': { + case 'proto.004-Pt24m4xi.failNotInTailPositionTypeError': { errorMessage = 'There is non trivial garbage code after a FAIL instruction.'; break; } - case 'proto.003-PsddFKi3.gas_exhausted.block': { + case 'proto.004-Pt24m4xi.gas_exhausted.block': { errorMessage = 'The sum of gas consumed by all the operations in the block exceeds the hard gas limit per block'; break; } - case 'proto.003-PsddFKi3.gas_exhausted.operation': { + case 'proto.004-Pt24m4xi.gas_exhausted.operation': { errorMessage = 'A script or one of its callee took more time than the operation said it would'; break; } - case 'proto.003-PsddFKi3.gas_limit_too_high': { + case 'proto.004-Pt24m4xi.gas_limit_too_high': { errorMessage = 'A transaction tried to exceed the hard limit on gas'; break; } - case 'proto.003-PsddFKi3.illFormedTypeTypeError': { + case 'proto.004-Pt24m4xi.illFormedTypeTypeError': { errorMessage = 'The toplevel error thrown when trying to parse a type expression (always followed by more precise errors).'; break; } - case 'proto.003-PsddFKi3.illTypedContractTypeError': { + case 'proto.004-Pt24m4xi.illTypedContractTypeError': { // tslint:disable-next-line:max-line-length errorMessage = 'The toplevel error thrown when trying to typecheck a contract code against given input, output and storage types (always followed by more precise errors).'; break; } - case 'proto.003-PsddFKi3.illTypedDataTypeError': { + case 'proto.004-Pt24m4xi.illTypedDataTypeError': { // tslint:disable-next-line:max-line-length errorMessage = 'The toplevel error thrown when trying to typecheck a data expression against a given type (always followed by more precise errors).'; break; } - case 'proto.003-PsddFKi3.implicit.empty_implicit_contract': { + case 'proto.004-Pt24m4xi.implicit.empty_implicit_contract': { errorMessage = 'No manager operations are allowed on an empty implicit contract.'; break; } - case 'proto.003-PsddFKi3.inconsistentAnnotations': { + case 'proto.004-Pt24m4xi.inconsistentAnnotations': { errorMessage = 'The annotations on two types could not be merged'; break; } - case 'proto.003-PsddFKi3.inconsistentStackLengthsTypeError': { + case 'proto.004-Pt24m4xi.inconsistentStackLengthsTypeError': { errorMessage = 'A stack was of an unexpected length (this error is always in the context of a located error).'; break; } - case 'proto.003-PsddFKi3.inconsistentTypeAnnotations': { + case 'proto.004-Pt24m4xi.inconsistentTypeAnnotations': { errorMessage = 'The two types contain annotations that do not match'; break; } - case 'proto.003-PsddFKi3.internal_operation_replay': { + case 'proto.004-Pt24m4xi.internal_operation_replay': { errorMessage = 'An internal operation was emitted twice by a script'; break; } - case 'proto.003-PsddFKi3.invalidArityTypeError': { + case 'proto.004-Pt24m4xi.invalidArityTypeError': { errorMessage = 'In a script or data expression, a primitive was applied to an unsupported number of arguments.'; break; } - case 'proto.003-PsddFKi3.invalidConstantTypeError': { + case 'proto.004-Pt24m4xi.invalidConstantTypeError': { errorMessage = 'A data expression was invalid for its expected type.'; break; } - case 'proto.003-PsddFKi3.invalidContractTypeError': { + case 'proto.004-Pt24m4xi.invalidContractTypeError': { // tslint:disable-next-line:max-line-length errorMessage = 'A script or data expression references a contract that does not exist or assumes a wrong type for an existing contract.'; break; } - case 'proto.003-PsddFKi3.invalidExpressionKindTypeError': { + case 'proto.004-Pt24m4xi.invalidExpressionKindTypeError': { // tslint:disable-next-line:max-line-length errorMessage = 'In a script or data expression, an expression was of the wrong kind (for instance a string where only a primitive applications can appear).'; break; } - case 'proto.003-PsddFKi3.invalidIterBody': { + case 'proto.004-Pt24m4xi.invalidIterBody': { errorMessage = 'The body of an ITER instruction must result in the same stack type as before the ITER.'; break; } - case 'proto.003-PsddFKi3.invalidMapBlockFail': { + case 'proto.004-Pt24m4xi.invalidMapBlockFail': { errorMessage = 'FAIL cannot be the only instruction in the body. The propper type of the return list cannot be inferred.'; break; } - case 'proto.003-PsddFKi3.invalidMapBody': { + case 'proto.004-Pt24m4xi.invalidMapBody': { errorMessage = 'The body of a map block did not match the expected type'; break; } - case 'proto.003-PsddFKi3.invalidPrimitiveNameCaseTypeError': { + case 'proto.004-Pt24m4xi.invalidPrimitiveNameCaseTypeError': { errorMessage = 'In a script or data expression, a primitive name is neither uppercase, lowercase or capitalized.'; break; } - case 'proto.003-PsddFKi3.invalidPrimitiveNameTypeErro': { + case 'proto.004-Pt24m4xi.invalidPrimitiveNameTypeErro': { errorMessage = 'In a script or data expression, a primitive name is unknown or has a wrong case.'; break; } - case 'proto.003-PsddFKi3.invalidPrimitiveNamespaceTypeError': { + case 'proto.004-Pt24m4xi.invalidPrimitiveNamespaceTypeError': { errorMessage = 'In a script or data expression, a primitive was of the wrong namespace.'; break; } - case 'proto.003-PsddFKi3.invalidPrimitiveTypeError': { + case 'proto.004-Pt24m4xi.invalidPrimitiveTypeError': { errorMessage = 'In a script or data expression, a primitive was unknown.'; break; } - case 'proto.003-PsddFKi3.invalid_binary_format': { + case 'proto.004-Pt24m4xi.invalid_binary_format': { errorMessage = 'Could not deserialize some piece of data from its binary representation'; break; } - case 'proto.003-PsddFKi3.missingScriptField': { + case 'proto.004-Pt24m4xi.missingScriptField': { errorMessage = 'When parsing script, a field was expected, but not provided'; break; } - case 'proto.003-PsddFKi3.nonce.previously_revealed': { + case 'proto.004-Pt24m4xi.nonce.previously_revealed': { errorMessage = 'Duplicated revelation for a nonce.'; break; } - case 'proto.003-PsddFKi3.nonce.too_early_revelation': { + case 'proto.004-Pt24m4xi.nonce.too_early_revelation': { errorMessage = 'Nonce revelation happens before cycle end'; break; } - case 'proto.003-PsddFKi3.nonce.too_late_revelation': { + case 'proto.004-Pt24m4xi.nonce.too_late_revelation': { errorMessage = 'Nonce revelation happens too late'; break; } - case 'proto.003-PsddFKi3.nonce.unexpected': { + case 'proto.004-Pt24m4xi.nonce.unexpected': { errorMessage = 'The provided nonce is inconsistent with the commit nonce hash.'; break; } - case 'proto.003-PsddFKi3.operation.cannot_parse': { + case 'proto.004-Pt24m4xi.operation.cannot_parse': { errorMessage = 'The operation is ill-formed or for another protocol version'; break; } - case 'proto.003-PsddFKi3.operation.duplicate_endorsement': { + case 'proto.004-Pt24m4xi.operation.duplicate_endorsement': { errorMessage = 'Two endorsements received for the same slot'; break; } - case 'proto.003-PsddFKi3.operation.invalid_activation': { + case 'proto.004-Pt24m4xi.operation.invalid_activation': { errorMessage = 'The given key has already been activated or the given key does not correspond to any preallocated contract'; break; } - case 'proto.003-PsddFKi3.operation.invalid_endorsement_level': { + case 'proto.004-Pt24m4xi.operation.invalid_endorsement_level': { errorMessage = 'The level of an endorsement is inconsistent with the provided block hash.'; break; } - case 'proto.003-PsddFKi3.operation.invalid_signature': { + case 'proto.004-Pt24m4xi.operation.invalid_signature': { errorMessage = 'The operation signature is ill-formed or has been made with the wrong public key'; break; } - case 'proto.003-PsddFKi3.operation.missing_signature': { + case 'proto.004-Pt24m4xi.operation.missing_signature': { errorMessage = 'The operation is of a kind that must be signed, but the signature is missing'; break; } - case 'proto.003-PsddFKi3.operation.wrong_activation_secret': { + case 'proto.004-Pt24m4xi.operation.wrong_activation_secret': { errorMessage = 'The submitted activation key does not match the registered key.'; break; } - case 'proto.003-PsddFKi3.operation.wrong_endorsement_predecessor': { + case 'proto.004-Pt24m4xi.operation.wrong_endorsement_predecessor': { errorMessage = 'Trying to include an endorsement in a block that is not the successor of the endorsed one'; break; } - case 'proto.003-PsddFKi3.operation.wrong_voting_period': { + case 'proto.004-Pt24m4xi.operation.wrong_voting_period': { errorMessage = 'Trying to onclude a proposal or ballot meant for another voting period'; break; } - case 'proto.003-PsddFKi3.scriptOverflowRuntimeError': { + case 'proto.004-Pt24m4xi.scriptOverflowRuntimeError': { errorMessage = 'A FAIL instruction was reached due to the detection of an overflow'; break; } - case 'proto.003-PsddFKi3.scriptRejectedRuntimeError': { + case 'proto.004-Pt24m4xi.scriptRejectedRuntimeError': { errorMessage = 'A FAIL instruction was reached'; break; } - case 'proto.003-PsddFKi3.scriptRuntimeError': { + case 'proto.004-Pt24m4xi.scriptRuntimeError': { errorMessage = 'Toplevel error for all runtime script errors'; break; } - case 'proto.003-PsddFKi3.seed.unknown_seed': { + case 'proto.004-Pt24m4xi.seed.unknown_seed': { errorMessage = 'The requested seed is not available'; break; } - case 'proto.003-PsddFKi3.selfInLambda': { + case 'proto.004-Pt24m4xi.selfInLambda': { errorMessage = 'A SELF instruction was encountered in a lambda expression.'; break; } - case 'proto.003-PsddFKi3.storage_exhausted.block': { + case 'proto.004-Pt24m4xi.storage_exhausted.block': { errorMessage = 'The sum of storage consumed by all the operations in the block exceeds the hard storage limit per block'; break; } - case 'proto.003-PsddFKi3.storage_exhausted.operation': { + case 'proto.004-Pt24m4xi.storage_exhausted.operation': { errorMessage = 'A script or one of its callee wrote more bytes than the operation said it would'; break; } - case 'proto.003-PsddFKi3.storage_limit_too_high': { + case 'proto.004-Pt24m4xi.storage_limit_too_high': { errorMessage = 'A transaction tried to exceed the hard limit on storage'; break; } - case 'proto.003-PsddFKi3.tez.addition_overflow': { + case 'proto.004-Pt24m4xi.tez.addition_overflow': { errorMessage = 'An addition of two tez amounts overflowed'; break; } - case 'proto.003-PsddFKi3.tez.invalid_divisor': { + case 'proto.004-Pt24m4xi.tez.invalid_divisor': { errorMessage = 'Multiplication of a tez amount by a non positive integer'; break; } - case 'proto.003-PsddFKi3.tez.multiplication_overflow': { + case 'proto.004-Pt24m4xi.tez.multiplication_overflow': { errorMessage = 'A multiplication of a tez amount by an integer overflowed'; break; } - case 'proto.003-PsddFKi3.tez.negative_multiplicator': { + case 'proto.004-Pt24m4xi.tez.negative_multiplicator': { errorMessage = 'Multiplication of a tez amount by a negative integer'; break; } - case 'proto.003-PsddFKi3.tez.subtraction_underflow': { + case 'proto.004-Pt24m4xi.tez.subtraction_underflow': { errorMessage = 'An subtraction of two tez amounts underflowed'; break; } - case 'proto.003-PsddFKi3.too_many_internal_operations': { + case 'proto.004-Pt24m4xi.too_many_internal_operations': { errorMessage = 'A transaction exceeded the hard limit of internal operations it can emit'; break; } - case 'proto.003-PsddFKi3.typeTooLarge': { + case 'proto.004-Pt24m4xi.typeTooLarge': { errorMessage = 'An instruction generated a type larger than the limit.'; break; } - case 'proto.003-PsddFKi3.undefinedBinopTypeError': { + case 'proto.004-Pt24m4xi.undefinedBinopTypeError': { errorMessage = 'A binary operation is called on operands of types over which it is not defined.'; break; } - case 'proto.003-PsddFKi3.undefinedUnopTypeError': { + case 'proto.004-Pt24m4xi.undefinedUnopTypeError': { errorMessage = 'A unary operation is called on an operand of type over which it is not defined.'; break; } - case 'proto.003-PsddFKi3.undefined_operation_nonce': { + case 'proto.004-Pt24m4xi.undefined_operation_nonce': { errorMessage = 'An origination was attemped out of the scope of a manager operation'; break; } - case 'proto.003-PsddFKi3.unexpectedAnnotation': { + case 'proto.004-Pt24m4xi.unexpectedAnnotation': { errorMessage = 'A node in the syntax tree was impropperly annotated'; break; } - case 'proto.003-PsddFKi3.unexpectedBigMap': { + case 'proto.004-Pt24m4xi.unexpectedBigMap': { // tslint:disable-next-line:max-line-length errorMessage = 'When parsing script, a big_map type was found somewhere else than in the left component of the toplevel storage pair.'; break; } - case 'proto.003-PsddFKi3.unexpectedOperation': { + case 'proto.004-Pt24m4xi.unexpectedOperation': { errorMessage = 'When parsing script, a operation type was found in the storage or parameter field.'; break; } - case 'proto.003-PsddFKi3.unknownPrimitiveNameTypeError': { + case 'proto.004-Pt24m4xi.unknownPrimitiveNameTypeError': { errorMessage = 'In a script or data expression, a primitive was unknown.'; break; } - case 'proto.003-PsddFKi3.unmatchedBranchesTypeError': { + case 'proto.004-Pt24m4xi.unmatchedBranchesTypeError': { errorMessage = 'At the join point at the end of two code branches the stacks have inconsistent lengths or contents.'; break; } - case 'proto.003-PsddFKi3.unorderedMapLiteral': { + case 'proto.004-Pt24m4xi.unorderedMapLiteral': { errorMessage = 'Map keys must be in strictly increasing order'; break; } - case 'proto.003-PsddFKi3.unorderedSetLiteral': { + case 'proto.004-Pt24m4xi.unorderedSetLiteral': { errorMessage = 'Set values must be in strictly increasing order'; break; } diff --git a/src/app/services/balance.service.spec.ts b/src/app/services/balance.service.spec.ts index 822be0a76..01da18d88 100644 --- a/src/app/services/balance.service.spec.ts +++ b/src/app/services/balance.service.spec.ts @@ -5,6 +5,9 @@ import { HttpTestingController } from '@angular/common/http/testing'; // class mocks import {Account, Balance, http_imports, translate_imports, balancesrv_providers, rx} from '../../../spec/helpers/service.helper'; import { BalanceService, WalletService, OperationService } from '../../../spec/helpers/service.helper'; + +// class dependencies +import { TzscanService } from './tzscan.service'; /** * Suite: BalanceService * @todo: remove console.log spy, mock operation service calls entirely. it should never be tested. @@ -30,7 +33,7 @@ describe('[ BalanceService ]', () => { // WalletService mock TestBed.configureTestingModule({ imports: [http_imports, translate_imports], - providers: [ balancesrv_providers ] + providers: [ balancesrv_providers, TzscanService ] }); service = TestBed.get(BalanceService); diff --git a/src/app/services/encryption.service.spec.ts b/src/app/services/encryption.service.spec.ts index d3159f07f..3feaa157f 100644 --- a/src/app/services/encryption.service.spec.ts +++ b/src/app/services/encryption.service.spec.ts @@ -123,30 +123,24 @@ describe('[ EncryptionService ]', () => { }); }); - - /** @todo finish the v2 methods describe('> Encrypt & Decrypt v2', () => { beforeEach(() => { keypair = { sk: 'edskRkVvBf657kMmoRb47oKjkQBzzH6dExq9GKsoFCHte3p2qeAecwQyjoSH5mNMb9LLDPSFQUJwGQdi3KzGYh1hCQamREUdV4', pk: 'edpktubBcCqnS8pUJaYyf7dqqvSR3CgTcLRXKP8L6AubzoZxTjYGpT', pkh: 'tz1hyH4nZMnQcCbA8b2DmLE8Z9ctByhP54Fn' - } - - let mnemonic = 'version general song belt roast random horror shop pitch fun earn badge drum submit output'; + }; + const mnemonic = 'version general song belt roast random horror shop pitch fun earn badge drum submit output'; seed = bip39.mnemonicToSeed(mnemonic, '').slice(0, 32); - salt = keypair.pkh.slice(3, 19); ciphertext = '1145141c7e2cdd3448b477a6e6e2f4de2ab893f74afddfb26875a2f055628c69==9fd30af5d097d24675e0418220f478cc'; - iv = '5fc2071f276ad69abc38a0348c0bd289' password = 'Firebird87'; - version = "2"; - }) - - it('should encrypt a private key w/password', () => { - let encryptedseed = service.encrypt_v2(seed, password); - expect(encryptedseed).toEqual({ciphertext: ciphertext); + version = '2'; + }); + it('should encrypt and decrypt a seed successfully', () => { + const encryptedseed = service.encrypt_v2(seed, password); + decryptedseed = Buffer.from(service.decrypt_v2(encryptedseed.chiphertext, password, encryptedseed.iv)); + expect(decryptedseed).toEqual(seed); }); }); - */ }); diff --git a/src/app/services/import.service.ts b/src/app/services/import.service.ts index 2b42a9c92..9bce153a8 100644 --- a/src/app/services/import.service.ts +++ b/src/app/services/import.service.ts @@ -33,6 +33,7 @@ export class ImportService { } } async importWalletData(data: any, isJson: boolean = true, pkh: string = '', pwd: string = ''): Promise { + this.coordinatorService.stopAll(); try { let walletData; if (isJson) { @@ -88,6 +89,7 @@ export class ImportService { } } importWalletFromPk(pk: string) { + this.coordinatorService.stopAll(); try { const pkh = this.operationService.pk2pkh(pk); this.importWalletFromPkh(pkh, WalletType.ViewOnlyWallet); @@ -98,6 +100,7 @@ export class ImportService { } } importWalletFromPkh(pkh: string, type: WalletType = WalletType.ObserverWallet) { + this.coordinatorService.stopAll(); try { this.walletService.wallet = this.walletService.emptyWallet(type); this.walletService.addAccount(pkh); @@ -109,23 +112,42 @@ export class ImportService { this.findAllAccounts(pkh); } async findAllAccounts(pkh: string) { - this.findNumberOfAccounts(pkh); + // Test start + console.log('searching after KT...'); + this.operationService.getManagerKey(pkh).subscribe( + ((pk: string) => { + console.log('PK: ' + pk); + if (pk) { + this.findNumberOfAccounts(pkh, pk); + } else { + this.tzscanService.getManagerKey(pkh).subscribe( + ((pk2: string) => { + console.log('PK: ' + pk2); + if (pk2) { + this.findNumberOfAccounts(pkh, pk2); + } + }), + err => console.log('No PK found!') + ); + } + }) + ); } - async findNumberOfAccounts(pkh: string) { + async findNumberOfAccounts(pkh: string, pk: string) { if (pkh) { console.log('Find accounts...'); console.log('pkh: ' + pkh); this.tzscanService.numberOperationsOrigination(pkh).subscribe( data => { if (data[0]) { - this.findAccounts(pkh, data[0]); + this.findAccounts(pkh, pk, data[0]); } }, err => console.log('ImportError: ' + JSON.stringify(err)) ); } } - async findAccounts(pkh: string, n: number) { + async findAccounts(pkh: string, pk: string, n: number) { console.log('Accounts found: ' + n); this.coordinatorService.start(pkh); this.coordinatorService.startXTZ(); @@ -140,23 +162,32 @@ export class ImportService { if (this.walletService.wallet.accounts.findIndex(a => a.pkh === KT) === -1) { const opIndex = data[i].type.operations.findIndex(a => a.kind === 'origination'); const opLevel = data[i].type.operations[opIndex].op_level; - this.operationService.getVerifiedOpBytes(opLevel, data[i].hash, pkh).subscribe( - opBytes => { - if (KT === this.operationService.createKTaddress(opBytes)) { - console.log('Added: ' + KT); - this.walletService.addAccount(KT); - this.coordinatorService.start(KT); - this.findNumberOfAccounts(KT); // Recursive call - } else { - this.messageService.addError('Failed to verify KT address!'); + const storedProof = localStorage.getItem(KT); + if (storedProof && storedProof !== 'undefined' && KT === this.operationService.createKTaddress(storedProof)) { + console.log('Stored proof found'); + this.walletService.addAccount(KT); + this.coordinatorService.start(KT); + this.findNumberOfAccounts(KT, pk); // Recursive call + } else { + this.operationService.getVerifiedOpBytes(opLevel, data[i].hash, pkh, pk).subscribe( + opBytes => { + if (KT === this.operationService.createKTaddress(opBytes)) { + console.log('Store proof'); + localStorage.setItem(KT, opBytes); + this.walletService.addAccount(KT); + this.coordinatorService.start(KT); + this.findNumberOfAccounts(KT, pk); // Recursive call + } else { + this.messageService.addError('Failed to verify KT address!'); + } + }, + err => { + // tslint:disable-next-line:max-line-length + this.messageService.addWarning('Something went wrong when searching after additional addresses. Try to reimport your keystore file.'); + throw new Error(err); } - }, - err => { - // tslint:disable-next-line:max-line-length - this.messageService.addWarning('Something went wrong when searching after additional addresses. Try to reimport your keystor file.'); - throw new Error(err); - } - ); + ); + } } } this.walletService.storeWallet(); diff --git a/src/app/services/input-validation.service.ts b/src/app/services/input-validation.service.ts index 1dab383ea..0804bf34b 100644 --- a/src/app/services/input-validation.service.ts +++ b/src/app/services/input-validation.service.ts @@ -61,6 +61,19 @@ amount(amount: string): Boolean { fee(fee: string): Boolean { return this.amount(fee); // same as amount } +gas(amount: string): Boolean { + console.log('amount: ' + amount); + if (amount === '' || amount === '0') { // default value / zero + return true; + } else if (Number(amount) && 0 < Number(amount) && Number(amount) % 1 === 0) { // Positive integer + return true; + } else { + return false; + } +} +storage(amount: string) { + return this.gas(amount); +} code(code: string): Boolean { if (code && code.length === 40 && code.match(/^[a-f0-9]*$/)) { // 40 hex chars return true; diff --git a/src/app/services/operation.service.ts b/src/app/services/operation.service.ts index edb31450e..c4f5361ba 100644 --- a/src/app/services/operation.service.ts +++ b/src/app/services/operation.service.ts @@ -119,10 +119,9 @@ export class OperationService { source: pkh, fee: this.microTez.times(fee).toString(), counter: (++counter).toString(), - gas_limit: '10000', + gas_limit: '10100', storage_limit: '277', - managerPubkey: keys.pkh, // Mainnet - // manager_pubkey: keys.pkh, // Zeronet + manager_pubkey: keys.pkh, balance: this.microTez.times(amount).toString(), spendable: true, delegatable: true @@ -137,7 +136,7 @@ export class OperationService { fee: '0', counter: (counter).toString(), gas_limit: '10000', - storage_limit: '0', // '60000', + storage_limit: '0', public_key: keys.pk }; fop.contents[1].counter = (Number(fop.contents[1].counter) + 1).toString(); @@ -151,7 +150,7 @@ export class OperationService { Returns an observable for the transaction of tez. */ // transfer(from: string, to: string, amount: number, fee: number = 0, keys: KeyPair): Observable { - transfer(from: string, transactions: any, fee: number = 0, keys: KeyPair): Observable { + transfer(from: string, transactions: any, fee: number = 0, keys: KeyPair, gasLimit: number, storageLimit: number): Observable { return this.http.get(this.nodeURL + '/chains/main/blocks/head/hash', {}) .flatMap((hash: any) => { return this.http.get(this.nodeURL + '/chains/main/blocks/head/context/contracts/' + from + '/counter', {}) @@ -180,8 +179,8 @@ export class OperationService { source: from, fee: this.microTez.times(fee).toString(), counter: (++counter).toString(), - gas_limit: '10300', - storage_limit: '277', + gas_limit: gasLimit.toString(), + storage_limit: storageLimit.toString(), amount: this.microTez.times(transactions[i].amount).toString(), destination: transactions[i].to, }); @@ -373,6 +372,18 @@ export class OperationService { ); }).pipe(catchError(err => this.errHandler(err))); } + getVotingRights(): Observable { + console.log(''); + return this.http.get(this.nodeURL + '/chains/main/blocks/head/votes/listings') + .flatMap((listings: any) => { + return of( + { + success: true, + payload: listings + } + ); + }).pipe(catchError(err => this.errHandler(err))); + } isRevealed(pkh: string): Observable { return this.http.get(this.nodeURL + '/chains/main/blocks/head/context/contracts/' + pkh + '/manager_key', {}) .flatMap((manager: any) => { @@ -406,7 +417,17 @@ export class OperationService { ); }).pipe(catchError(err => this.errHandler(err))); } - getVerifiedOpBytes(operationLevel, operationHash, pkh): Observable { + getManagerKey(pkh: string): Observable { + return this.http.get(this.nodeURL + '/chains/main/blocks/head/context/contracts/' + pkh + '/manager_key', {}) + .flatMap((manager: any) => { + if (manager.key) { + return of(manager.key); + } else { + return of(''); + } + }); + } + getVerifiedOpBytes(operationLevel, operationHash, pkh, pk): Observable { return this.http.get(this.nodeURL + '/chains/main/blocks/' + operationLevel + '/operation_hashes/3', {}) .flatMap((opHashes: any) => { const opIndex = opHashes.findIndex(a => a === operationHash); @@ -420,26 +441,24 @@ export class OperationService { delete op.protocol; for (let i = 0; i < op.contents.length; i++) { delete op.contents[i].metadata; - if (op.contents[i].manager_pubkey) { // Fix for mainnet - op.contents[i].managerPubkey = op.contents[i].manager_pubkey; - delete op.contents[i].manager_pubkey; + if (op.contents[i].managerPubkey) { // Fix for mainnet + op.contents[i].manager_pubkey = op.contents[i].managerPubkey; + delete op.contents[i].managerPubkey; } } + console.log('DUMP: ' + JSON.stringify(op)); return this.http.post(this.nodeURL + '/chains/main/blocks/head/helpers/forge/operations', op) .flatMap((opBytes: any) => { - return this.http.get(this.nodeURL + '/chains/main/blocks/head/context/contracts/' + pkh + '/manager_key', {}) - .flatMap((manager: any) => { - if (this.pk2pkh(manager.key) === pkh) { - if (this.verify(opBytes, sig, manager.key)) { - ans = opBytes + this.buf2hex(this.b58cdecode(sig, this.prefix.sig)); - } else { - throw new Error('InvalidSignature'); - } - } else { - throw new Error('InvalidPublicKey'); - } - return of(ans); - }); + if (this.pk2pkh(pk) === pkh) { + if (this.verify(opBytes, sig, pk)) { + ans = opBytes + this.buf2hex(this.b58cdecode(sig, this.prefix.sig)); + } else { + throw new Error('InvalidSignature'); + } + } else { + throw new Error('InvalidPublicKey'); + } + return of(ans); }); }); }); @@ -612,8 +631,8 @@ export class OperationService { decodeOrigination(content: any): any { // Tag 9 let index = 0; const op = this.decodeCommon({ kind: 'origination' }, content); - op.data.managerPubkey = this.decodePkh(op.rest.slice(index, index += 42)); // mainnet - // op.data.manager_pubkey = this.decodePkh(op.rest.slice(index, index += 42)); // zeronet + // op.data.managerPubkey = this.decodePkh(op.rest.slice(index, index += 42)); // mainnet + op.data.manager_pubkey = this.decodePkh(op.rest.slice(index, index += 42)); // zeronet const balance = this.zarithDecode(op.rest.slice(index)); op.data.balance = balance.value.toString(); op.data.spendable = (op.rest.slice(index += balance.count * 2, index += 2) === 'ff'); @@ -741,8 +760,8 @@ export class OperationService { let balanceTmp = ''; managerTmp = this.translate.instant('OPERATIONSERVICE.MANAGER'); balanceTmp = this.translate.instant('OPERATIONSERVICE.BALANCE'); - output.push(managerTmp + ' ' + fop.contents[i].managerPubkey); // betanet - // output.push(managerTmp + ' ' + fop.contents[i].manager_pubkey); // zeronet + // output.push(managerTmp + ' ' + fop.contents[i].managerPubkey); // betanet + output.push(managerTmp + ' ' + fop.contents[i].manager_pubkey); // zeronet output.push(balanceTmp + ' ' + Big(Number(fop.contents[i].balance)).div(this.microTez).toString() + ' tez'); } else if (fop.contents[i].kind === 'delegation') { let delegateTmp = ''; diff --git a/src/app/services/tzrate.service.spec.ts b/src/app/services/tzrate.service.spec.ts index fe37eca5c..3482d9249 100644 --- a/src/app/services/tzrate.service.spec.ts +++ b/src/app/services/tzrate.service.spec.ts @@ -14,11 +14,14 @@ import { EncryptionService } from './encryption.service'; import { OperationService } from './operation.service'; import { TestBed } from '@angular/core/testing'; import { ErrorHandlingPipe } from '../pipes/error-handling.pipe'; +import { of } from 'rxjs/observable/of'; import { Account, Wallet, Balance } from '../interfaces'; +import { TzscanService } from './tzscan.service'; /** * Suite: TzrateService + * @todo Remove mock on cmc api */ describe('[ TzrateService ]', () => { // class under inspection @@ -26,6 +29,7 @@ describe('[ TzrateService ]', () => { // class dependencies let walletservice: WalletService; + let tzscanservice: TzscanService; let httpMock: HttpTestingController; // mock network data @@ -86,12 +90,14 @@ describe('[ TzrateService ]', () => { TranslateService, OperationService, EncryptionService, - ErrorHandlingPipe + ErrorHandlingPipe, + TzscanService ] }); service = TestBed.get(TzrateService); walletservice = TestBed.get(WalletService); + tzscanservice = TestBed.get(TzscanService); httpMock = TestBed.get(HttpTestingController); const mockbalance: Balance = { @@ -116,11 +122,12 @@ describe('[ TzrateService ]', () => { balance: mockbalance, accounts: mockaccount }; - // spies spyOn(service, 'getTzrate').and.callThrough(); spyOn(service, 'updateFiatBalances').and.callThrough(); spyOn(walletservice, 'storeWallet'); + spyOn(tzscanservice, 'getPriceUSD') + .and.returnValue(of(ticker[0]['price_usd'])); spyOn(walletservice, 'wallet'); spyOn(console, 'log'); @@ -135,17 +142,14 @@ describe('[ TzrateService ]', () => { }); describe('> Update XTZ Rate', () => { - let req: TestRequest; beforeEach(() => { service.getTzrate(); - req = httpMock.expectOne(apiUrl); - req.flush(ticker); }); - it('should perform a get request to apiUrl', () => { + /*it('should perform a get request to apiUrl', () => { expect(req.request.method).toBe('GET'); - }); + });*/ it('should update wallet xtzrate from 0 to 0.4605297041', () => { expect(walletservice.wallet.XTZrate.toString()).toEqual(ticker[0]['price_usd']); @@ -165,7 +169,7 @@ describe('[ TzrateService ]', () => { }); }); }); - + /* describe('> Handle Network Errors', () => { const mockErrorResponse = { status: 404, statusText: 'Bad Request' }; const data = 'Invalid request parameters'; @@ -173,7 +177,9 @@ describe('[ TzrateService ]', () => { beforeEach(() => { // tslint:disable-next-line:max-line-length - errResponse = 'Failed to get xtz price from CMC: {"headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"status":0,"statusText":"Unknown Error","url":"https://api.coinmarketcap.com/v1/ticker/tezos/","ok":false,"name":"HttpErrorResponse","message":"Http failure response for https://api.coinmarketcap.com/v1/ticker/tezos/: 0 ","error":{"isTrusted":false}}'; + errResponse = 'Failed to get xtz price from CMC: {"headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"status":0, + "statusText":"Unknown Error","url":"https://api.coinmarketcap.com/v1/ticker/tezos/","ok":false,"name":"HttpErrorResponse", + "message":"Http failure response for https://api.coinmarketcap.com/v1/ticker/tezos/: 0 ","error":{"isTrusted":false}}'; service.getTzrate(); const failedreq = httpMock.expectOne(apiUrl).error(new ErrorEvent('network error')); }); @@ -181,5 +187,5 @@ describe('[ TzrateService ]', () => { it('should log error message if ticker is unavailable', () => { expect(console.log).toHaveBeenCalledWith(errResponse); }); - }); + });*/ }); diff --git a/src/app/services/tzrate.service.ts b/src/app/services/tzrate.service.ts index 2386b87b7..7012c2e95 100644 --- a/src/app/services/tzrate.service.ts +++ b/src/app/services/tzrate.service.ts @@ -4,6 +4,7 @@ import { HttpClient } from '@angular/common/http'; import 'rxjs/add/operator/map'; import { WalletService } from './wallet.service'; +import { TzscanService } from './tzscan.service'; @Injectable() @@ -11,17 +12,19 @@ export class TzrateService { private apiUrl = 'https://api.coinmarketcap.com/v1/ticker/tezos/'; // returns a json object, key: price_usd constructor(private http: HttpClient, - private walletService: WalletService) { + private walletService: WalletService, + private tzscanService: TzscanService) { } getTzrate() { - this.http.get(this.apiUrl).subscribe( - data => { - this.walletService.wallet.XTZrate = data[0]['price_usd']; + // this.http.get(this.apiUrl).subscribe( + this.tzscanService.getPriceUSD().subscribe( + price => { + this.walletService.wallet.XTZrate = price; this.updateFiatBalances(); - console.log('XTZ = $' + data[0]['price_usd']); + console.log('XTZ = $' + price); }, - err => console.log('Failed to get xtz price from CMC: ' + JSON.stringify(err)) + err => console.log('Failed to get xtz price: ' + JSON.stringify(err)) ); } updateFiatBalances() { diff --git a/src/app/services/tzscan.service.ts b/src/app/services/tzscan.service.ts index af8d37120..2a5ed80d7 100644 --- a/src/app/services/tzscan.service.ts +++ b/src/app/services/tzscan.service.ts @@ -50,12 +50,24 @@ export class TzscanService { getCounter(op: any): number { return Number(op.type.operations[0].counter); } + getManagerKey(pkh: any): Observable { + return this.http.get(this.apiUrl + 'v1/operations/' + pkh + '?type=Reveal&number=1&p=0') + .flatMap((res: any) => { + return of(res[0].type.operations[0].public_key); + }); + } operationsOrigination(pkh: string, n: number) { return this.http.get(this.apiUrl + 'v1/operations/' + pkh + '?type=Origination&number=' + n + '&p=0'); } timestamp(block: string) { return this.http.get(this.apiUrl + 'v1/timestamp/' + block); } + getPriceUSD(): Observable { + return this.http.get(this.apiUrl + 'v1/marketcap') + .flatMap((res: any) => { + return of(res[0].price_usd); + }); + } getOp(data: any, pkh: string): any { const ops: any[] = []; for (let index = 0; index < data.type.operations.length; index++) { @@ -106,4 +118,95 @@ export class TzscanService { } return ops; } + + getProposal() { + const apiUrlMainnet = 'https://api6.tzscan.io/'; //https://api6.tzscan.io/v3/proposals + return this.http.get(apiUrlMainnet + 'v3/proposals'); + } + + getProposalsCurrentPeriod(period: number) { + const apiUrlMainnet = 'https://api6.tzscan.io/'; //https://api6.tzscan.io/v3/proposals/?period=10 + return this.http.get(apiUrlMainnet + 'v3/proposals/' + '?period=' + period); + } + + //Needs improvement - Need to work with an array of hash strings + getProposalVotes(proposalHash, p: number = 0, data?: any): Observable { + return this.http.get('https://api6.tzscan.io/v3/proposal_votes/' + proposalHash + '?p=' + p + '&number=50') + .flatMap( + ((res: any) => { + if (res.length < 50) { + if (data) { + res = res.concat(data); + } + return of(res); + } else { + if (data) { + res = res.concat(data); + } + return this.getProposalVotes(proposalHash, ++p, res); + } + }) + ); + } + + getPeriodInfo() { + const apiUrlMainnet = 'https://api6.tzscan.io/'; //https://api6.tzscan.io/v3/voting_period_info + return this.http.get(apiUrlMainnet + 'v3/voting_period_info'); + // {"period":10,"kind":"proposal","cycle":84,"level":345815,"max_period":true} + } + + getNbProposalVotes(proposalHash) { + const apiUrlMainnet = 'https://api6.tzscan.io/'; //https://api6.tzscan.io/v3/nb_proposal_votes/{proposal_hash} + return this.http.get(apiUrlMainnet + 'v3/nb_proposal_votes/' + proposalHash); + // {"count":57,"votes":11408} + } + + getTotalVotes(period: number) { + const apiUrlMainnet = 'https://api6.tzscan.io/'; //https://api6.tzscan.io/v3/total_proposal_votes/10 + return this.http.get(apiUrlMainnet + 'v3/total_proposal_votes/' + period); + // https://api6.tzscan.io/v3/total_voters/10 + // {"count":458,"votes":51604} + // https://api6.tzscan.io/v3/total_proposal_votes/10 + // {"proposal_count":2,"total_count":458,"total_votes":51604,"used_count":107,"used_votes":15773,"unused_count":360,"unused_votes":36492} + } + getTotalVotes2(period: number) { + return this.http.get(this.apiUrl + 'v3/total_voters/' + period); + } + getBallots(period: number, kind: string) { + const apiUrlMainnet = 'https://api6.tzscan.io/'; //https://api6.tzscan.io/v3/ballots/11 + return this.http.get(apiUrlMainnet + 'v3/ballots/' + period + '?period_kind=' + kind); + // {"proposal": "string","nb_yay": 0,"nb_nay": 0,"nb_pass": 0,"vote_yay": 0,"vote_nay": 0,"vote_pass": 0} + } + getBallotVotes(maxPeriod: number, p: number = 0, data?: any): Observable { + return this.http.get(this.apiUrl + 'v3/operations?type=Ballot&p=' + p + '&number=50') + .flatMap( + ((res: any) => { + let inScope = []; + for (let i = 0; i < res.length; i++) { + if (res[i].type.period >= maxPeriod) { + inScope = inScope.concat(res[i]); + } else { + break; + } + } + if (inScope.length < 50) { + if (data) { + inScope = inScope.concat(data); + } + return of(inScope); // We are done + } else { + if (data) { + inScope = inScope.concat(data); + } + return this.getBallotVotes(maxPeriod, ++p, inScope); // Do more calls + } + }) + ); + } + /* // Not needed + getCurrentHead() { + const apiUrlMainnet = 'https://api6.tzscan.io/'; + return this.http.get(apiUrlMainnet + 'v3/head'); + } */ + } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index cd15ce041..b09a48764 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -314,6 +314,8 @@ "FROM" : "From:", "TO" : "To:", "AMOUNT" : "Amount:", + "GASLIMIT": "Gas limit", + "STORAGELIMIT": "Storage limit", "FEE2" : "Fee:", "PASSWORD" : "Password:", "CONFIRM" : "Confirm", @@ -333,6 +335,8 @@ "INVALIDRECEIVERADDRESS" : "Invalid receiver address", "INVALIDAMOUNT" : "Invalid amount", "INVALIDFEE" : "Invalid fee", + "INVALIDGASLIMIT" : "Invalid gas limit", + "INVALIDSTORAGELIMIT" : "Invalid storage limit", "NOADDRESSORAMOUNT" : "No address or amount provided!" }, "STARTCOMPONENT": { diff --git a/src/assets/img/bakers/888xtz.png b/src/assets/img/bakers/888xtz.png new file mode 100644 index 000000000..58bbd6fdc Binary files /dev/null and b/src/assets/img/bakers/888xtz.png differ diff --git a/src/assets/img/bakers/airbie.png b/src/assets/img/bakers/airbie.png new file mode 100644 index 000000000..4158c4a68 Binary files /dev/null and b/src/assets/img/bakers/airbie.png differ diff --git a/src/assets/img/bakers/airfoil.png b/src/assets/img/bakers/airfoil.png new file mode 100644 index 000000000..a47ec8574 Binary files /dev/null and b/src/assets/img/bakers/airfoil.png differ diff --git a/src/assets/img/bakers/airfoil2.png b/src/assets/img/bakers/airfoil2.png new file mode 100644 index 000000000..95f0b443c Binary files /dev/null and b/src/assets/img/bakers/airfoil2.png differ diff --git a/src/assets/img/bakers/atjames.png b/src/assets/img/bakers/atjames.png new file mode 100644 index 000000000..463182978 Binary files /dev/null and b/src/assets/img/bakers/atjames.png differ diff --git a/src/assets/img/bakers/atticpool.png b/src/assets/img/bakers/atticpool.png new file mode 100644 index 000000000..088196327 Binary files /dev/null and b/src/assets/img/bakers/atticpool.png differ diff --git a/src/assets/img/bakers/bake_n_rolls.png b/src/assets/img/bakers/bake_n_rolls.png new file mode 100644 index 000000000..b938e24bf Binary files /dev/null and b/src/assets/img/bakers/bake_n_rolls.png differ diff --git a/src/assets/img/bakers/bake_tz.png b/src/assets/img/bakers/bake_tz.png new file mode 100644 index 000000000..0512366a3 Binary files /dev/null and b/src/assets/img/bakers/bake_tz.png differ diff --git a/src/assets/img/bakers/bake_tz_for_me.jpg b/src/assets/img/bakers/bake_tz_for_me.jpg new file mode 100644 index 000000000..f16710f1f Binary files /dev/null and b/src/assets/img/bakers/bake_tz_for_me.jpg differ diff --git a/src/assets/img/bakers/baked_tezos.jpg b/src/assets/img/bakers/baked_tezos.jpg new file mode 100644 index 000000000..6e16c1e27 Binary files /dev/null and b/src/assets/img/bakers/baked_tezos.jpg differ diff --git a/src/assets/img/bakers/bakemon.png b/src/assets/img/bakers/bakemon.png new file mode 100644 index 000000000..ffd6edcf8 Binary files /dev/null and b/src/assets/img/bakers/bakemon.png differ diff --git a/src/assets/img/bakers/baker-avenue.png b/src/assets/img/bakers/baker-avenue.png new file mode 100644 index 000000000..78877d3a1 Binary files /dev/null and b/src/assets/img/bakers/baker-avenue.png differ diff --git a/src/assets/img/bakers/bakery-il.png b/src/assets/img/bakers/bakery-il.png new file mode 100644 index 000000000..95e33641d Binary files /dev/null and b/src/assets/img/bakers/bakery-il.png differ diff --git a/src/assets/img/bakers/bakeyourstake.png b/src/assets/img/bakers/bakeyourstake.png new file mode 100644 index 000000000..9a958bb3e Binary files /dev/null and b/src/assets/img/bakers/bakeyourstake.png differ diff --git a/src/assets/img/bakers/bakingtacos.png b/src/assets/img/bakers/bakingtacos.png new file mode 100644 index 000000000..9316cfac3 Binary files /dev/null and b/src/assets/img/bakers/bakingtacos.png differ diff --git a/src/assets/img/bakers/bitfinex.png b/src/assets/img/bakers/bitfinex.png new file mode 100644 index 000000000..a7e532717 Binary files /dev/null and b/src/assets/img/bakers/bitfinex.png differ diff --git a/src/assets/img/bakers/blockpowerstaking.png b/src/assets/img/bakers/blockpowerstaking.png new file mode 100644 index 000000000..d0b1f31d0 Binary files /dev/null and b/src/assets/img/bakers/blockpowerstaking.png differ diff --git a/src/assets/img/bakers/btfd.png b/src/assets/img/bakers/btfd.png new file mode 100644 index 000000000..d86a63b93 Binary files /dev/null and b/src/assets/img/bakers/btfd.png differ diff --git a/src/assets/img/bakers/ceiboxtz.png b/src/assets/img/bakers/ceiboxtz.png new file mode 100644 index 000000000..2bc8a6ed6 Binary files /dev/null and b/src/assets/img/bakers/ceiboxtz.png differ diff --git a/src/assets/img/bakers/ceiboxtz2.png b/src/assets/img/bakers/ceiboxtz2.png new file mode 100644 index 000000000..f6f64a602 Binary files /dev/null and b/src/assets/img/bakers/ceiboxtz2.png differ diff --git a/src/assets/img/bakers/coinbase.png b/src/assets/img/bakers/coinbase.png new file mode 100644 index 000000000..a01404e9b Binary files /dev/null and b/src/assets/img/bakers/coinbase.png differ diff --git a/src/assets/img/bakers/coinone.png b/src/assets/img/bakers/coinone.png new file mode 100644 index 000000000..ab1e9f77b Binary files /dev/null and b/src/assets/img/bakers/coinone.png differ diff --git a/src/assets/img/bakers/cryptiumlabs.png b/src/assets/img/bakers/cryptiumlabs.png new file mode 100644 index 000000000..c30bc9ca9 Binary files /dev/null and b/src/assets/img/bakers/cryptiumlabs.png differ diff --git a/src/assets/img/bakers/cryptiumlabs2.png b/src/assets/img/bakers/cryptiumlabs2.png new file mode 100644 index 000000000..976ee5b68 Binary files /dev/null and b/src/assets/img/bakers/cryptiumlabs2.png differ diff --git a/src/assets/img/bakers/cryptiumlabs3.png b/src/assets/img/bakers/cryptiumlabs3.png new file mode 100644 index 000000000..47ecd888c Binary files /dev/null and b/src/assets/img/bakers/cryptiumlabs3.png differ diff --git a/src/assets/img/bakers/cryptodelegate.png b/src/assets/img/bakers/cryptodelegate.png new file mode 100644 index 000000000..de96f9f2a Binary files /dev/null and b/src/assets/img/bakers/cryptodelegate.png differ diff --git a/src/assets/img/bakers/dashmaster.png b/src/assets/img/bakers/dashmaster.png new file mode 100644 index 000000000..00f0cad09 Binary files /dev/null and b/src/assets/img/bakers/dashmaster.png differ diff --git a/src/assets/img/bakers/delegatedcapital.jpg b/src/assets/img/bakers/delegatedcapital.jpg new file mode 100644 index 000000000..a89cc33d2 Binary files /dev/null and b/src/assets/img/bakers/delegatedcapital.jpg differ diff --git a/src/assets/img/bakers/drunktortuga.png b/src/assets/img/bakers/drunktortuga.png new file mode 100644 index 000000000..d259e8b23 Binary files /dev/null and b/src/assets/img/bakers/drunktortuga.png differ diff --git a/src/assets/img/bakers/elitetezos.jpg b/src/assets/img/bakers/elitetezos.jpg new file mode 100644 index 000000000..8bcb46324 Binary files /dev/null and b/src/assets/img/bakers/elitetezos.jpg differ diff --git a/src/assets/img/bakers/eon.png b/src/assets/img/bakers/eon.png new file mode 100644 index 000000000..819c8bc94 Binary files /dev/null and b/src/assets/img/bakers/eon.png differ diff --git a/src/assets/img/bakers/everstake.png b/src/assets/img/bakers/everstake.png new file mode 100644 index 000000000..27b192f63 Binary files /dev/null and b/src/assets/img/bakers/everstake.png differ diff --git a/src/assets/img/bakers/figment.png b/src/assets/img/bakers/figment.png new file mode 100644 index 000000000..3f8d5227f Binary files /dev/null and b/src/assets/img/bakers/figment.png differ diff --git a/src/assets/img/bakers/firstblock.jpeg b/src/assets/img/bakers/firstblock.jpeg new file mode 100644 index 000000000..67e33167f Binary files /dev/null and b/src/assets/img/bakers/firstblock.jpeg differ diff --git a/src/assets/img/bakers/flippintacos.png b/src/assets/img/bakers/flippintacos.png new file mode 100644 index 000000000..bb9d66bf6 Binary files /dev/null and b/src/assets/img/bakers/flippintacos.png differ diff --git a/src/assets/img/bakers/foundationbaker.jpg b/src/assets/img/bakers/foundationbaker.jpg new file mode 100644 index 000000000..f9b1c3c81 Binary files /dev/null and b/src/assets/img/bakers/foundationbaker.jpg differ diff --git a/src/assets/img/bakers/fractalide.jpg b/src/assets/img/bakers/fractalide.jpg new file mode 100644 index 000000000..2fde9ddf9 Binary files /dev/null and b/src/assets/img/bakers/fractalide.jpg differ diff --git a/src/assets/img/bakers/freshtezos.png b/src/assets/img/bakers/freshtezos.png new file mode 100644 index 000000000..199dd93a8 Binary files /dev/null and b/src/assets/img/bakers/freshtezos.png differ diff --git a/src/assets/img/bakers/gateio.png b/src/assets/img/bakers/gateio.png new file mode 100644 index 000000000..a5e9095f5 Binary files /dev/null and b/src/assets/img/bakers/gateio.png differ diff --git a/src/assets/img/bakers/happytezos.png b/src/assets/img/bakers/happytezos.png new file mode 100644 index 000000000..f4576995f Binary files /dev/null and b/src/assets/img/bakers/happytezos.png differ diff --git a/src/assets/img/bakers/hashquark.jpg b/src/assets/img/bakers/hashquark.jpg new file mode 100644 index 000000000..295423902 Binary files /dev/null and b/src/assets/img/bakers/hashquark.jpg differ diff --git a/src/assets/img/bakers/hayeklab.png b/src/assets/img/bakers/hayeklab.png new file mode 100644 index 000000000..c4b72e896 Binary files /dev/null and b/src/assets/img/bakers/hayeklab.png differ diff --git a/src/assets/img/bakers/hayeklab2.png b/src/assets/img/bakers/hayeklab2.png new file mode 100644 index 000000000..0b556c046 Binary files /dev/null and b/src/assets/img/bakers/hayeklab2.png differ diff --git a/src/assets/img/bakers/hotstake.png b/src/assets/img/bakers/hotstake.png new file mode 100644 index 000000000..11d580ce6 Binary files /dev/null and b/src/assets/img/bakers/hotstake.png differ diff --git a/src/assets/img/bakers/hyperblocks.png b/src/assets/img/bakers/hyperblocks.png new file mode 100644 index 000000000..d0c9f26bf Binary files /dev/null and b/src/assets/img/bakers/hyperblocks.png differ diff --git a/src/assets/img/bakers/hyperblocks2.png b/src/assets/img/bakers/hyperblocks2.png new file mode 100644 index 000000000..b8aec6ded Binary files /dev/null and b/src/assets/img/bakers/hyperblocks2.png differ diff --git a/src/assets/img/bakers/ibaketezos.jpg b/src/assets/img/bakers/ibaketezos.jpg new file mode 100644 index 000000000..b632a0af4 Binary files /dev/null and b/src/assets/img/bakers/ibaketezos.jpg differ diff --git a/src/assets/img/bakers/illuminarean.png b/src/assets/img/bakers/illuminarean.png new file mode 100644 index 000000000..c4ef984c7 Binary files /dev/null and b/src/assets/img/bakers/illuminarean.png differ diff --git a/src/assets/img/bakers/infinitystones.jpg b/src/assets/img/bakers/infinitystones.jpg new file mode 100644 index 000000000..abbd5bea9 Binary files /dev/null and b/src/assets/img/bakers/infinitystones.jpg differ diff --git a/src/assets/img/bakers/justabaker.png b/src/assets/img/bakers/justabaker.png new file mode 100644 index 000000000..18b228c01 Binary files /dev/null and b/src/assets/img/bakers/justabaker.png differ diff --git a/src/assets/img/bakers/kraken.png b/src/assets/img/bakers/kraken.png new file mode 100644 index 000000000..4e79351ce Binary files /dev/null and b/src/assets/img/bakers/kraken.png differ diff --git a/src/assets/img/bakers/letzbake.jpg b/src/assets/img/bakers/letzbake.jpg new file mode 100644 index 000000000..5d6347527 Binary files /dev/null and b/src/assets/img/bakers/letzbake.jpg differ diff --git a/src/assets/img/bakers/lucidmining.png b/src/assets/img/bakers/lucidmining.png new file mode 100644 index 000000000..f0a1e442b Binary files /dev/null and b/src/assets/img/bakers/lucidmining.png differ diff --git a/src/assets/img/bakers/mytezosbaking.png b/src/assets/img/bakers/mytezosbaking.png new file mode 100644 index 000000000..9afa1d086 Binary files /dev/null and b/src/assets/img/bakers/mytezosbaking.png differ diff --git a/src/assets/img/bakers/norndelegate.png b/src/assets/img/bakers/norndelegate.png new file mode 100644 index 000000000..20a992a39 Binary files /dev/null and b/src/assets/img/bakers/norndelegate.png differ diff --git a/src/assets/img/bakers/ocryptopool.png b/src/assets/img/bakers/ocryptopool.png new file mode 100644 index 000000000..d3b4afe9e Binary files /dev/null and b/src/assets/img/bakers/ocryptopool.png differ diff --git a/src/assets/img/bakers/ownblock.png b/src/assets/img/bakers/ownblock.png new file mode 100644 index 000000000..84a0e8ce8 Binary files /dev/null and b/src/assets/img/bakers/ownblock.png differ diff --git a/src/assets/img/bakers/p2pvalidator.png b/src/assets/img/bakers/p2pvalidator.png new file mode 100644 index 000000000..403c9d5f6 Binary files /dev/null and b/src/assets/img/bakers/p2pvalidator.png differ diff --git a/src/assets/img/bakers/paytezos.png b/src/assets/img/bakers/paytezos.png new file mode 100644 index 000000000..b77e8cfde Binary files /dev/null and b/src/assets/img/bakers/paytezos.png differ diff --git a/src/assets/img/bakers/polychain.png b/src/assets/img/bakers/polychain.png new file mode 100644 index 000000000..cd2d10671 Binary files /dev/null and b/src/assets/img/bakers/polychain.png differ diff --git a/src/assets/img/bakers/pos_bakerz.png b/src/assets/img/bakers/pos_bakerz.png new file mode 100644 index 000000000..c510fdf27 Binary files /dev/null and b/src/assets/img/bakers/pos_bakerz.png differ diff --git a/src/assets/img/bakers/shakenbake.png b/src/assets/img/bakers/shakenbake.png new file mode 100644 index 000000000..2e43b1061 Binary files /dev/null and b/src/assets/img/bakers/shakenbake.png differ diff --git a/src/assets/img/bakers/stacktezos.png b/src/assets/img/bakers/stacktezos.png new file mode 100644 index 000000000..6c19be466 Binary files /dev/null and b/src/assets/img/bakers/stacktezos.png differ diff --git a/src/assets/img/bakers/stake_bake.jpg b/src/assets/img/bakers/stake_bake.jpg new file mode 100644 index 000000000..0f3d493fe Binary files /dev/null and b/src/assets/img/bakers/stake_bake.jpg differ diff --git a/src/assets/img/bakers/stake_house.png b/src/assets/img/bakers/stake_house.png new file mode 100644 index 000000000..d72fe2994 Binary files /dev/null and b/src/assets/img/bakers/stake_house.png differ diff --git a/src/assets/img/bakers/staked.png b/src/assets/img/bakers/staked.png new file mode 100644 index 000000000..087755d10 Binary files /dev/null and b/src/assets/img/bakers/staked.png differ diff --git a/src/assets/img/bakers/stakery.png b/src/assets/img/bakers/stakery.png new file mode 100644 index 000000000..f1a5d9b83 Binary files /dev/null and b/src/assets/img/bakers/stakery.png differ diff --git a/src/assets/img/bakers/stakingfacilities.png b/src/assets/img/bakers/stakingfacilities.png new file mode 100644 index 000000000..7ce5231db Binary files /dev/null and b/src/assets/img/bakers/stakingfacilities.png differ diff --git a/src/assets/img/bakers/stirdelegate.png b/src/assets/img/bakers/stirdelegate.png new file mode 100644 index 000000000..b3c0b34b9 Binary files /dev/null and b/src/assets/img/bakers/stirdelegate.png differ diff --git a/src/assets/img/bakers/tez_baker.png b/src/assets/img/bakers/tez_baker.png new file mode 100644 index 000000000..2b19cdd66 Binary files /dev/null and b/src/assets/img/bakers/tez_baker.png differ diff --git a/src/assets/img/bakers/tez_mania.jpg b/src/assets/img/bakers/tez_mania.jpg new file mode 100644 index 000000000..767b02faf Binary files /dev/null and b/src/assets/img/bakers/tez_mania.jpg differ diff --git a/src/assets/img/bakers/tez_milk.png b/src/assets/img/bakers/tez_milk.png new file mode 100644 index 000000000..4911b955f Binary files /dev/null and b/src/assets/img/bakers/tez_milk.png differ diff --git a/src/assets/img/bakers/tez_patisserie.png b/src/assets/img/bakers/tez_patisserie.png new file mode 100644 index 000000000..04d1de268 Binary files /dev/null and b/src/assets/img/bakers/tez_patisserie.png differ diff --git a/src/assets/img/bakers/tez_rocket.png b/src/assets/img/bakers/tez_rocket.png new file mode 100644 index 000000000..77ba888da Binary files /dev/null and b/src/assets/img/bakers/tez_rocket.png differ diff --git a/src/assets/img/bakers/tez_whale.png b/src/assets/img/bakers/tez_whale.png new file mode 100644 index 000000000..ecc142996 Binary files /dev/null and b/src/assets/img/bakers/tez_whale.png differ diff --git a/src/assets/img/bakers/tezbaking.png b/src/assets/img/bakers/tezbaking.png new file mode 100644 index 000000000..a04410f99 Binary files /dev/null and b/src/assets/img/bakers/tezbaking.png differ diff --git a/src/assets/img/bakers/tezdele.png b/src/assets/img/bakers/tezdele.png new file mode 100644 index 000000000..7839ed974 Binary files /dev/null and b/src/assets/img/bakers/tezdele.png differ diff --git a/src/assets/img/bakers/tezetetic.jpg b/src/assets/img/bakers/tezetetic.jpg new file mode 100644 index 000000000..207d69426 Binary files /dev/null and b/src/assets/img/bakers/tezetetic.jpg differ diff --git a/src/assets/img/bakers/tezmania.jpg b/src/assets/img/bakers/tezmania.jpg new file mode 100644 index 000000000..767b02faf Binary files /dev/null and b/src/assets/img/bakers/tezmania.jpg differ diff --git a/src/assets/img/bakers/tezocracy.png b/src/assets/img/bakers/tezocracy.png new file mode 100644 index 000000000..db3e70b49 Binary files /dev/null and b/src/assets/img/bakers/tezocracy.png differ diff --git a/src/assets/img/bakers/tezos_bakery.png b/src/assets/img/bakers/tezos_bakery.png new file mode 100644 index 000000000..bb3464095 Binary files /dev/null and b/src/assets/img/bakers/tezos_bakery.png differ diff --git a/src/assets/img/bakers/tezos_barcelona.png b/src/assets/img/bakers/tezos_barcelona.png new file mode 100644 index 000000000..dc9fee31c Binary files /dev/null and b/src/assets/img/bakers/tezos_barcelona.png differ diff --git a/src/assets/img/bakers/tezos_berlin.jpg b/src/assets/img/bakers/tezos_berlin.jpg new file mode 100644 index 000000000..6a301df83 Binary files /dev/null and b/src/assets/img/bakers/tezos_berlin.jpg differ diff --git a/src/assets/img/bakers/tezos_capital.png b/src/assets/img/bakers/tezos_capital.png new file mode 100644 index 000000000..39f71c9f7 Binary files /dev/null and b/src/assets/img/bakers/tezos_capital.png differ diff --git a/src/assets/img/bakers/tezos_capital_legacy.png b/src/assets/img/bakers/tezos_capital_legacy.png new file mode 100644 index 000000000..aebc42e10 Binary files /dev/null and b/src/assets/img/bakers/tezos_capital_legacy.png differ diff --git a/src/assets/img/bakers/tezos_cat.png b/src/assets/img/bakers/tezos_cat.png new file mode 100644 index 000000000..7ea615303 Binary files /dev/null and b/src/assets/img/bakers/tezos_cat.png differ diff --git a/src/assets/img/bakers/tezos_chef.png b/src/assets/img/bakers/tezos_chef.png new file mode 100644 index 000000000..9176e008e Binary files /dev/null and b/src/assets/img/bakers/tezos_chef.png differ diff --git a/src/assets/img/bakers/tezos_delegateEU.png b/src/assets/img/bakers/tezos_delegateEU.png new file mode 100644 index 000000000..ea852bf00 Binary files /dev/null and b/src/assets/img/bakers/tezos_delegateEU.png differ diff --git a/src/assets/img/bakers/tezos_france.png b/src/assets/img/bakers/tezos_france.png new file mode 100644 index 000000000..18eac6688 Binary files /dev/null and b/src/assets/img/bakers/tezos_france.png differ diff --git a/src/assets/img/bakers/tezos_gold.png b/src/assets/img/bakers/tezos_gold.png new file mode 100644 index 000000000..728a3024e Binary files /dev/null and b/src/assets/img/bakers/tezos_gold.png differ diff --git a/src/assets/img/bakers/tezos_hodl.png b/src/assets/img/bakers/tezos_hodl.png new file mode 100644 index 000000000..499840f1c Binary files /dev/null and b/src/assets/img/bakers/tezos_hodl.png differ diff --git a/src/assets/img/bakers/tezos_hotbakery.png b/src/assets/img/bakers/tezos_hotbakery.png new file mode 100644 index 000000000..2e1f5dca1 Binary files /dev/null and b/src/assets/img/bakers/tezos_hotbakery.png differ diff --git a/src/assets/img/bakers/tezos_istanbul.jpg b/src/assets/img/bakers/tezos_istanbul.jpg new file mode 100644 index 000000000..920cd69fb Binary files /dev/null and b/src/assets/img/bakers/tezos_istanbul.jpg differ diff --git a/src/assets/img/bakers/tezos_kitchen.png b/src/assets/img/bakers/tezos_kitchen.png new file mode 100644 index 000000000..4a4bde802 Binary files /dev/null and b/src/assets/img/bakers/tezos_kitchen.png differ diff --git a/src/assets/img/bakers/tezos_korea.png b/src/assets/img/bakers/tezos_korea.png new file mode 100644 index 000000000..fce8afcb6 Binary files /dev/null and b/src/assets/img/bakers/tezos_korea.png differ diff --git a/src/assets/img/bakers/tezos_mars.png b/src/assets/img/bakers/tezos_mars.png new file mode 100644 index 000000000..0949cdad2 Binary files /dev/null and b/src/assets/img/bakers/tezos_mars.png differ diff --git a/src/assets/img/bakers/tezos_moon.png b/src/assets/img/bakers/tezos_moon.png new file mode 100644 index 000000000..a54fb2e48 Binary files /dev/null and b/src/assets/img/bakers/tezos_moon.png differ diff --git a/src/assets/img/bakers/tezos_ninja.png b/src/assets/img/bakers/tezos_ninja.png new file mode 100644 index 000000000..1a30a816e Binary files /dev/null and b/src/assets/img/bakers/tezos_ninja.png differ diff --git a/src/assets/img/bakers/tezos_otc.png b/src/assets/img/bakers/tezos_otc.png new file mode 100644 index 000000000..349e62e41 Binary files /dev/null and b/src/assets/img/bakers/tezos_otc.png differ diff --git a/src/assets/img/bakers/tezos_panda.png b/src/assets/img/bakers/tezos_panda.png new file mode 100644 index 000000000..07340f289 Binary files /dev/null and b/src/assets/img/bakers/tezos_panda.png differ diff --git a/src/assets/img/bakers/tezos_rio.png b/src/assets/img/bakers/tezos_rio.png new file mode 100644 index 000000000..2dd0fef4a Binary files /dev/null and b/src/assets/img/bakers/tezos_rio.png differ diff --git a/src/assets/img/bakers/tezos_suisse.jpg b/src/assets/img/bakers/tezos_suisse.jpg new file mode 100644 index 000000000..1cadf76d7 Binary files /dev/null and b/src/assets/img/bakers/tezos_suisse.jpg differ diff --git a/src/assets/img/bakers/tezos_tacos.jpg b/src/assets/img/bakers/tezos_tacos.jpg new file mode 100644 index 000000000..600f76a62 Binary files /dev/null and b/src/assets/img/bakers/tezos_tacos.jpg differ diff --git a/src/assets/img/bakers/tezos_tokyo.png b/src/assets/img/bakers/tezos_tokyo.png new file mode 100644 index 000000000..a16f29098 Binary files /dev/null and b/src/assets/img/bakers/tezos_tokyo.png differ diff --git a/src/assets/img/bakers/tezos_vote.png b/src/assets/img/bakers/tezos_vote.png new file mode 100644 index 000000000..bd5a84e24 Binary files /dev/null and b/src/assets/img/bakers/tezos_vote.png differ diff --git a/src/assets/img/bakers/tezosbakes1.png b/src/assets/img/bakers/tezosbakes1.png new file mode 100644 index 000000000..7921bbcea Binary files /dev/null and b/src/assets/img/bakers/tezosbakes1.png differ diff --git a/src/assets/img/bakers/tezosbakes2.png b/src/assets/img/bakers/tezosbakes2.png new file mode 100644 index 000000000..ffcabd125 Binary files /dev/null and b/src/assets/img/bakers/tezosbakes2.png differ diff --git a/src/assets/img/bakers/tezosbc.png b/src/assets/img/bakers/tezosbc.png new file mode 100644 index 000000000..f94cfa6a0 Binary files /dev/null and b/src/assets/img/bakers/tezosbc.png differ diff --git a/src/assets/img/bakers/tezosbrazil.png b/src/assets/img/bakers/tezosbrazil.png new file mode 100644 index 000000000..298ca9583 Binary files /dev/null and b/src/assets/img/bakers/tezosbrazil.png differ diff --git a/src/assets/img/bakers/tezosrus.jpg b/src/assets/img/bakers/tezosrus.jpg new file mode 100644 index 000000000..a6fcc7824 Binary files /dev/null and b/src/assets/img/bakers/tezosrus.jpg differ diff --git a/src/assets/img/bakers/tezosseasia.jpg b/src/assets/img/bakers/tezosseasia.jpg new file mode 100644 index 000000000..d393cdab7 Binary files /dev/null and b/src/assets/img/bakers/tezosseasia.jpg differ diff --git a/src/assets/img/bakers/tezosteam.jpg b/src/assets/img/bakers/tezosteam.jpg new file mode 100644 index 000000000..8411ecefc Binary files /dev/null and b/src/assets/img/bakers/tezosteam.jpg differ diff --git a/src/assets/img/bakers/tezosteam2.jpg b/src/assets/img/bakers/tezosteam2.jpg new file mode 100644 index 000000000..7b3d562a3 Binary files /dev/null and b/src/assets/img/bakers/tezosteam2.jpg differ diff --git a/src/assets/img/bakers/tezry.png b/src/assets/img/bakers/tezry.png new file mode 100644 index 000000000..b8c23272f Binary files /dev/null and b/src/assets/img/bakers/tezry.png differ diff --git a/src/assets/img/bakers/teztechlabs.jpg b/src/assets/img/bakers/teztechlabs.jpg new file mode 100644 index 000000000..39683f66f Binary files /dev/null and b/src/assets/img/bakers/teztechlabs.jpg differ diff --git a/src/assets/img/bakers/tezzcity.jpg b/src/assets/img/bakers/tezzcity.jpg new file mode 100644 index 000000000..ed384b4e4 Binary files /dev/null and b/src/assets/img/bakers/tezzcity.jpg differ diff --git a/src/assets/img/bakers/tezzieland.png b/src/assets/img/bakers/tezzieland.png new file mode 100644 index 000000000..1c7c3c578 Binary files /dev/null and b/src/assets/img/bakers/tezzieland.png differ diff --git a/src/assets/img/bakers/tezzigator.png b/src/assets/img/bakers/tezzigator.png new file mode 100644 index 000000000..9ec700161 Binary files /dev/null and b/src/assets/img/bakers/tezzigator.png differ diff --git a/src/assets/img/bakers/tz_bake.png b/src/assets/img/bakers/tz_bake.png new file mode 100644 index 000000000..991ceb7d0 Binary files /dev/null and b/src/assets/img/bakers/tz_bake.png differ diff --git a/src/assets/img/bakers/tz_bakery.jpg b/src/assets/img/bakers/tz_bakery.jpg new file mode 100644 index 000000000..b3a4c6b6c Binary files /dev/null and b/src/assets/img/bakers/tz_bakery.jpg differ diff --git a/src/assets/img/bakers/tz_bank.png b/src/assets/img/bakers/tz_bank.png new file mode 100644 index 000000000..44971f7e5 Binary files /dev/null and b/src/assets/img/bakers/tz_bank.png differ diff --git a/src/assets/img/bakers/tz_dutch.png b/src/assets/img/bakers/tz_dutch.png new file mode 100644 index 000000000..3bf808b15 Binary files /dev/null and b/src/assets/img/bakers/tz_dutch.png differ diff --git a/src/assets/img/bakers/tz_envoy.jpg b/src/assets/img/bakers/tz_envoy.jpg new file mode 100644 index 000000000..5333ea673 Binary files /dev/null and b/src/assets/img/bakers/tz_envoy.jpg differ diff --git a/src/assets/img/bakers/tz_node.png b/src/assets/img/bakers/tz_node.png new file mode 100644 index 000000000..073e7e284 Binary files /dev/null and b/src/assets/img/bakers/tz_node.png differ diff --git a/src/assets/img/bakers/tzbakeoven.gif b/src/assets/img/bakers/tzbakeoven.gif new file mode 100644 index 000000000..937923821 Binary files /dev/null and b/src/assets/img/bakers/tzbakeoven.gif differ diff --git a/src/assets/img/bakers/tzscan.png b/src/assets/img/bakers/tzscan.png new file mode 100644 index 000000000..d30235044 Binary files /dev/null and b/src/assets/img/bakers/tzscan.png differ diff --git a/src/assets/img/bakers/validators.png b/src/assets/img/bakers/validators.png new file mode 100644 index 000000000..ced469eb8 Binary files /dev/null and b/src/assets/img/bakers/validators.png differ diff --git a/src/assets/img/bakers/viewnodestezos.jpg b/src/assets/img/bakers/viewnodestezos.jpg new file mode 100644 index 000000000..165180e2e Binary files /dev/null and b/src/assets/img/bakers/viewnodestezos.jpg differ diff --git a/src/assets/img/bakers/wetez.jpg b/src/assets/img/bakers/wetez.jpg new file mode 100644 index 000000000..c999aea23 Binary files /dev/null and b/src/assets/img/bakers/wetez.jpg differ diff --git a/src/assets/img/bakers/xtzantipodes.png b/src/assets/img/bakers/xtzantipodes.png new file mode 100644 index 000000000..d6ad026fe Binary files /dev/null and b/src/assets/img/bakers/xtzantipodes.png differ diff --git a/src/assets/img/bakers/xtzbaker.png b/src/assets/img/bakers/xtzbaker.png new file mode 100644 index 000000000..71c3ec0ed Binary files /dev/null and b/src/assets/img/bakers/xtzbaker.png differ diff --git a/src/assets/img/bakers/xtzbakery.jpg b/src/assets/img/bakers/xtzbakery.jpg new file mode 100644 index 000000000..77721cc82 Binary files /dev/null and b/src/assets/img/bakers/xtzbakery.jpg differ diff --git a/src/assets/img/bakers/xtzdelegate.png b/src/assets/img/bakers/xtzdelegate.png new file mode 100644 index 000000000..9ba4ba0a0 Binary files /dev/null and b/src/assets/img/bakers/xtzdelegate.png differ diff --git a/src/assets/img/bakers/xtzland.png b/src/assets/img/bakers/xtzland.png new file mode 100644 index 000000000..b396b715b Binary files /dev/null and b/src/assets/img/bakers/xtzland.png differ diff --git a/src/assets/img/bakers/xtzmaster.png b/src/assets/img/bakers/xtzmaster.png new file mode 100644 index 000000000..61b596e5c Binary files /dev/null and b/src/assets/img/bakers/xtzmaster.png differ diff --git a/src/assets/img/bakers/youloafwebake.png b/src/assets/img/bakers/youloafwebake.png new file mode 100644 index 000000000..8474f36ca Binary files /dev/null and b/src/assets/img/bakers/youloafwebake.png differ diff --git a/src/assets/img/bakers/zednode.png b/src/assets/img/bakers/zednode.png new file mode 100644 index 000000000..995d96d37 Binary files /dev/null and b/src/assets/img/bakers/zednode.png differ diff --git a/src/data/bakers-list-v1.ts b/src/data/bakers-list-v1.ts new file mode 100644 index 000000000..ae89be8d9 --- /dev/null +++ b/src/data/bakers-list-v1.ts @@ -0,0 +1,1121 @@ + + +export const VOTINGPERIODHEADS: any = [ + { + amendment: 'Athens', + period: 10, + kind: 'proposal', + start_level: 327681, + end_level: 360448 + } +]; + +export const BAKERSLIST: any = [ + { + baker_name: '888 XTZ', + identity: 'tz1WBfwbT66FC6BTLexc2BoyCCBM9LG7pnVW', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/888xtz.png' + }, + { + baker_name: 'AirBie', + identity: 'tz1iLbZZ9uoRuVJCrZ9ZwiJMpfzhy3c67mav', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/airbie.png' + }, + { + baker_name: 'Airfoil', + identity: 'tz1gk3TDbU7cJuiBRMhwQXVvgDnjsxuWhcEA', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/airfoil2.png' + }, + { + baker_name: 'At James', + identity: 'tz3e75hU4EhDU3ukyJueh5v6UvEHzGwkg3yC', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/atjames.png' + }, + { + baker_name: 'Attic Pool', + identity: 'tz1MXFrtZoaXckE41bjUCSjAjAap3AFDSr3N', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/atticpool.png' + }, + { + baker_name: 'Bake Tz', + identity: 'tz1ei4WtWEMEJekSv8qDnu9PExG6Q8HgRGr3', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bake_tz.png' + }, + { + baker_name: 'Bake ꜩ For Me', + identity: 'tz1NRGxXV9h6SdNaZLcgmjuLx3hyy2f8YoGN', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bake_tz_for_me.jpg' + }, + { + baker_name: 'Bake\'n\'Rolls', + identity: 'tz1NortRftucvAkD1J58L32EhSVrQEWJCEnB', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bake_n_rolls.png' + }, + { + baker_name: 'Baked Tezos', + identity: 'tz1aRhFErGMgL57DYHMT1vYwv7PzsJN1chrk', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/baked_tezos.jpg' + }, + { + baker_name: 'Bakemon', + identity: 'tz1Z1WwoqgRFbLE3YNdYRpCx44NSfiMJzeAG', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bakemon.png' + }, + { + baker_name: 'Baker Avenue', + identity: 'tz1YgNQBeLTgbwRb7QiyvHrx7hwN7AUbdqpB', + vote: '', + rolls: '', + vote2: '', + ote3: '', + image: 'assets/img/bakers/baker-avenue.png' + }, + { + baker_name: 'BAKER-IL', + identity: 'tz1cYufsxHXJcvANhvS55h3aY32a9BAFB494', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bakery-il.png' + }, + { + baker_name: 'Baking Tacos', + identity: 'tz1RV1MBbZMR68tacosb7Mwj6LkbPSUS1er1', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bakingtacos.png' + }, + { + baker_name: 'Blockpower', + identity: 'tz1LmaFsWRkjr7QMCx5PtV6xTUz3AmEpKQiF', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/blockpowerstaking.png' + }, + /*{ + baker_name: 'Bitfinex', + identity: 'tz1KtGwriE7VuLwT3LwuvU9Nv4wAxP7XZ57d', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bitfinex.png' + },*/ + { + baker_name: 'BTFD', + identity: 'tz1d2EwsrmoCPmhNUjt7unCQ8a9RwVsVXEmd', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/btfd.png' + }, + { + baker_name: 'Ceibo XTZ', + identity: 'tz3bEQoFCZEEfZMskefZ8q8e4eiHH1pssRax', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ceiboxtz2.png' + }, + { + baker_name: 'Coinone', + identity: 'tz1SYq214SCBy9naR6cvycQsYcUGpBqQAE8d', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/coinone.png' + }, + { + baker_name: 'Cryptium Labs', + identity: 'tz1eEnQhbwf6trb8Q8mPb2RaPkNk2rN7BKi8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/cryptiumlabs.png' + }, + { + baker_name: 'Crypto Delegate', + identity: 'tz1Tnjaxk6tbAeC2TmMApPh8UsrEVQvhHvx5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/cryptodelegate.png' + }, + { + baker_name: 'Figment', + identity: 'tz1Scdr2HsZiQjc7bHMeBbmDRXYVvdhjJbBh', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/figment.png' + }, + { + baker_name: 'First Block', + identity: 'tz1ZQppA6UerMz5CJtGvZmmB6z8L9syq7ixu', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/firstblock.jpeg' + }, + { + baker_name: 'Flippin\' tacos', + identity: 'tz1TzaNn7wSQSP5gYPXCnNzBCpyMiidCq1PX', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/flippintacos.png' + }, + { + baker_name: 'Foundation Baker 1', + identity: 'tz3RDC3Jdn4j15J7bBHZd29EUee9gVB1CxD9', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 2', + identity: 'tz3bvNMQ95vfAYtG8193ymshqjSvmxiCUuR5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 3', + identity: 'tz3RB4aoyjov4KEVRbuhvQ1CKJgBJMWhaeB8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 4', + identity: 'tz3bTdwZinP8U1JmSweNzVKhmwafqWmFWRfk', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 5', + identity: 'tz3NExpXn9aPNZPorRE4SdjJ2RGrfbJgMAaV', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 6', + identity: 'tz3UoffC7FG7zfpmvmjUmUeAaHvzdcUvAj6r', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 7', + identity: 'tz3WMqdzXqRWXwyvj5Hp2H7QEepaUuS7vd9K', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 8', + identity: 'tz3VEZ4k6a4Wx42iyev6i2aVAptTRLEAivNN', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Fractalide', + identity: 'tz1P6kxtzRrJ8KfXE4kKqR1RBiSpEgimxN5o', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/fractalide.jpg' + }, + { + baker_name: 'Fresh Tezos', + identity: 'tz1QLXqnfN51dkjeghXvKHkJfhvGiM5gK4tc', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/freshtezos.png' + }, + { + baker_name: 'Gate.io', + identity: 'tz1NpWrAyDL9k2Lmnyxcgr9xuJakbBxdq7FB', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/gateio.png' + }, + { + baker_name: 'Happy Tezos', + identity: 'tz1WCd2jm4uSt4vntk4vSuUWoZQGhLcDuR9q', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/happytezos.png' + }, + { + baker_name: 'Hayek Lab', + identity: 'tz1SohptP53wDPZhzTWzDUFAUcWF6DMBpaJV', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/hayeklab2.png' + }, + { + baker_name: 'Hot Stake', + identity: 'tz1Z3KCf8CLGAYfvVWPEr562jDDyWkwNF7sT', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/hotstake.png' + }, + { + baker_name: 'Hyper Blocks Pro', + identity: 'tz1VHFxUuBhwopxC9YC9gm5s2MHBHLyCtvN1', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/hyperblocks.png' + }, + { + baker_name: 'iBakeTezos', + identity: 'tz1dp3tScJZy8Go3byPdioSujgDi5CdemiuZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ibaketezos.jpg' + }, + { + baker_name: 'Illuminarean', + identity: 'tz1Ryat7ZuRapjGUgsPym9DuMGrTYYyDBJoq', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/illuminarean.png' + }, + { + baker_name: 'Infinity Stones', + identity: 'tz1awXW7wuXy21c66vBudMXQVAPgRnqqwgTH', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/infinitystones.jpg' + }, + { + baker_name: 'Just a Baker', + identity: 'tz1ZTG13gkvouxSANka3HG3uys8C5gu3DPXZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/justabaker.png' + }, + { + baker_name: 'Lucid Mining', + identity: 'tz1VmiY38m3y95HqQLjMwqnMS7sdMfGomzKi', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/lucidmining.png' + }, + { + baker_name: 'My Tezos Baking', + identity: 'tz1d6Fx42mYgVFnHUW8T8A7WBfJ6nD9pVok8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/mytezosbaking.png' + }, + { + baker_name: 'Norn Delegate', + identity: 'tz1YdCPrYbksK7HCoYKDyzgfXwY16Fy9rrGa', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/norndelegate.png' + }, + { + baker_name: 'Ø Crypto Pool', + identity: 'tz1KtvGSYU5hdKD288a1koTBURWYuADJGrLE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ocryptopool.png' + }, + { + baker_name: 'Own Block', + identity: 'tz1X1fpAZtwQk94QXUgZwfgsvkQgyc2KHp9d', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ownblock.png' + }, + { + baker_name: 'P2P Validator', + identity: 'tz1P2Po7YM526ughEsRbY4oR9zaUPDZjxFrb', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/p2pvalidator.png' + }, + { + baker_name: 'Polychain', + identity: 'tz1Yju7jmmsaUiG9qQLoYv35v5pHgnWoLWbt', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/polychain.png' + }, + { + baker_name: 'POS Bakerz', + identity: 'tz1Vyuu4EJ5Nym4JcrfRLnp3hpaq1DSEp1Ke', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/pos_bakerz.png' + }, + { + baker_name: 'Shake \'n Bake', + identity: 'tz1V4qCyvPKZ5UeqdH14HN42rxvNPQfc9UZg', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/shakenbake.png' + }, + { + baker_name: 'Stack Tezos', + identity: 'tz1MDKr36woXfVtrtXfV1ppPJERxPcm2wU6V', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stacktezos.png' + }, + { + baker_name: 'Stake Bake', + identity: 'tz1MowoYvqgxhKToQMAmGgTtjfZcRfS733JY', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stake_bake.jpg' + }, + { + baker_name: 'Stake House', + identity: 'tz1V2FYediKBAEaTpXXJBSjuQpjkyCzrTSiE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stake_house.png' + }, + { + baker_name: 'Staked', + identity: 'tz1RCFbB9GpALpsZtu6J58sb74dm8qe6XBzv', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/staked.png' + }, + { + baker_name: 'Stakery', + identity: 'tz1go7f6mEQfT2xX2LuHAqgnRGN6c2zHPf5c', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stakery.png' + }, + { + baker_name: 'Staking Facilities', + identity: 'tz1WpeqFaBG9Jm73Dmgqamy8eF8NWLz9JCoY', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stakingfacilities.png' + }, + { + baker_name: 'Stir Delegate', + identity: 'tz1LH4L6XYT2JNPhvWYC4Zq3XEiGgEwzNRvo', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stirdelegate.png' + }, + { + baker_name: 'Tez Baker', + identity: 'tz1Lhf4J9Qxoe3DZ2nfe8FGDnvVj7oKjnMY6', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_baker.png' + }, + { + baker_name: 'Tez Mania', + identity: 'tz1MQJPGNMijnXnVoBENFz9rUhaPt3S7rWoz', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_mania.jpg' + }, + { + baker_name: 'Tez Milk', + identity: 'tz1bakeKFwqmtLBzghw8CFnqFvRxLj849Vfg', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_milk.png' + }, + { + baker_name: 'Tez Patisserie', + identity: 'tz1UUgPwikRHW1mEyVZfGYy6QaxrY6Y7WaG5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_patisserie.png' + }, + { + baker_name: 'TEZ Rocket', + identity: 'tz1abTjX2tjtMdaq5VCzkDtBnMSCFPW2oRPa', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_rocket.png' + }, + { + baker_name: 'Tez Whale', + identity: 'tz1isXamBXpTUgbByQ6gXgZQg4GWNW7r6rKE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_whale.png' + }, + { + baker_name: 'Tez-Baking', + identity: 'tz1LBEKXaxQbd5Gtzbc1ATCwc3pppu81aWGc', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezbaking.png' + }, + { + baker_name: 'TezDele Baker A', + identity: 'tz1Yc6ATtfUJyDjHwJ8WoVL22sJueDenueke', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezdele.png' + }, + { + baker_name: 'TezDele Baker B', + identity: 'tz1SdwBHocSrcuMFNLPUg4LPRfx9eaqjVUEL', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezdele.png' + }, + { + baker_name: 'Tezetetic', + identity: 'tz1VceyYUpq1gk5dtp6jXQRtCtY8hm5DKt72', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezetetic.jpg' + }, + { + baker_name: 'Tezocracy', + identity: 'tz1TaLYBeGZD3yKVHQGBM857CcNnFFNceLYh', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezocracy.png' + }, + { + baker_name: 'Tezos Bakery', + identity: 'tz1fZ767VDbqx4DeKiFswPSHh513f51mKEUZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_bakery.png' + }, + { + baker_name: 'Tezos Barcelona', + identity: 'tz1b2mCFQm8isfJRGUctgyxHhHcmTNTRPdps', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_barcelona.png' + }, + { + baker_name: 'Tezos Berlin', + identity: 'tz1Y42aKCk53vMbaJNpf1hBg1rznGdBxHJ5C', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_berlin.jpg' + }, + { + baker_name: 'Tezos Capital', + identity: 'tz1TDSmoZXwVevLTEvKCTHWpomG76oC9S2fJ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_capital.png' + }, + { + baker_name: 'Tezos Cat', + identity: 'tz1XXayQohB8XRXN7kMoHbf2NFwNiH3oMRQQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_cat.png' + }, + { + baker_name: 'Tezos Chef', + identity: 'tz1hThMBD8jQjFt78heuCnKxJnJtQo9Ao25X', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_chef.png' + }, + { + baker_name: 'Tezos Delegate EU', + identity: 'tz1YTyvABUyhE7JHpxMVBVqjZnZM4ofMrWKE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_delegateEU.png' + }, + { + baker_name: 'Tezos France', + identity: 'tz1U638Z3xWRiXDDKx2S125MCCaAeGDdA896', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_france.png' + }, + { + baker_name: 'Tezos Gold', + identity: 'tz1TAzNBtnq6vF6kg34ApectxXoxZVTyapq3', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_gold.png' + }, + { + baker_name: 'Tezos HODL', + identity: 'tz1WnfXMPaNTBmH7DBPwqCWs9cPDJdkGBTZ8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_hodl.png' + }, + { + baker_name: 'Tezos Hot Bakery', + identity: 'tz1bLwpPfr3xqy1gWBF4sGvv8bLJyPHR11kx', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_hotbakery.png' + }, + { + baker_name: 'Tezos Istanbul', + identity: 'tz1Vm5cfHncKGBo7YvZfHc4mmudY4qpWzvSB', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_istanbul.jpg' + }, + { + baker_name: 'Tezos Kitchen', + identity: 'tz1Nn14BBsDULrPXtkM9UQeXaE4iqJhmqmK5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_kitchen.png' + }, + { + baker_name: 'Tezos Korea', + identity: 'tz1PPUo28B8BroqmVCMMNDudG4ShA2bzicrU', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_korea.png' + }, + { + baker_name: 'Tezos Mars', + identity: 'tz1S1Aew75hMrPUymqenKfHo8FspppXKpW7h', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_mars.png' + }, + { + baker_name: 'Tezos Moon', + identity: 'tz1TgvirXEwVJPg1cCrxT9zFubdzw7Ng6Ke9', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_moon.png' + }, + { + baker_name: 'Tezos Ninja', + identity: 'tz1djEKk6j1FqigTgbRsunbnY9BB7qsn1aAQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_ninja.png' + }, + { + baker_name: 'Tezos OTC', + identity: 'tz1SkU5S3dDRi6f8LHCvYeK3H3Mjq4MS8uHW', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_otc.png' + }, + { + baker_name: 'Tezos Panda', + identity: 'tz1PeZx7FXy7QRuMREGXGxeipb24RsMMzUNe', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_panda.png' + }, + { + baker_name: 'Tezos Rio', + identity: 'tz1gfipKzYrNRT14oSNQJMCdRRsUtcbZoKsd', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_rio.png' + }, + { + baker_name: 'Tezos Suisse', + identity: 'tz1hAYfexyzPGG6RhZZMpDvAHifubsbb6kgn', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_suisse.jpg' + }, + { + baker_name: 'Tezos Tacos', + identity: 'tz1bkKTY9Y3rTsHbpr2fbGUCRm736LLquQfM', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_tacos.jpg' + }, + { + baker_name: 'Tezos Tokyo', + identity: 'tz1VYQpZvjVhv1CdcENuCNWJQXu1TWBJ8KTD', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_tokyo.png' + }, + { + baker_name: 'Tezos Vote', + identity: 'tz1bHzftcTKZMTZgLLtnrXydCm6UEqf4ivca', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_vote.png' + }, + { + baker_name: 'PayTezos', + identity: 'tz1Ldzz6k1BHdhuKvAtMRX7h5kJSMHESMHLC', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/paytezos.png' + }, + { + baker_name: 'TezosBakes', + identity: 'tz1PYLN9TsKZHfn2GtrXnxkeGvahmYdBTG5v', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosbakes2.png' + }, + { + baker_name: 'TezosBC', + identity: 'tz1QGZ3dD2YpRKZ4APeso6EXTeyCUUkw6MQC', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosbc.png' + }, + { + baker_name: 'TezosBr', + identity: 'tz1YKh8T79LAtWxX29N5VedCSmaZGw9LNVxQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosbrazil.png' + }, + { + baker_name: 'TezosRUs', + identity: 'tz1b9MYGrbN1NAxphLEsPPNT9JC7aNFc5nA4', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosrus.jpg' + }, + { + baker_name: 'TezosSEAsia', + identity: 'tz1R6Ej25VSerE3MkSoEEeBjKHCDTFbpKuSX', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosseasia.jpg' + }, + { + baker_name: 'TezoSteam', + identity: 'tz1LLNkQK4UQV6QcFShiXJ2vT2ELw449MzAA', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosteam2.jpg' + }, + { + baker_name: 'Tezry', + identity: 'tz1UJvHTgpVzcKWhTazGxVcn5wsHru5Gietg', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezry.png' + }, + { + baker_name: 'Tezz City', + identity: 'tz1Zcxkfa5jKrRbBThG765GP29bUCU3C4ok5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzcity.jpg' + }, + { + baker_name: 'Tezzieland', + identity: 'tz1fUjvVhJrHLZCbhPNvDRckxApqbkievJHN', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzieland.png' + }, + { + baker_name: 'Tezzigator (HSM)', + identity: 'tz3adcvQaKXTCg12zbninqo3q8ptKKtDFTLv', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzigator.png' + }, + { + baker_name: 'Tezzigator (Legacy)', + identity: 'tz1iZEKy4LaAjnTmn2RuGDf2iqdAQKnRi8kY', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzigator.png' + }, + { + baker_name: 'TZ Bake', + identity: 'tz1Zhv3RkfU2pHrmaiDyxp7kFZpZrUCu1CiF', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_bake.png' + }, + { + baker_name: 'Tz Bakery', + identity: 'tz1cX93Q3KsiTADpCC4f12TBvAmS5tw7CW19', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_bakery.jpg' + }, + { + baker_name: 'Tz Bank', + identity: 'tz1bkg7rynMXVcjomoe3diB4URfv8GU2GAcw', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_bank.png' + }, + { + baker_name: 'Tz Dutch', + identity: 'tz1PesW5khQNhy4revu2ETvMtWPtuVyH2XkZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_dutch.png' + }, + { + baker_name: 'Tz Envoy', + identity: 'tz1iJ4qgGTzyhaYEzd1RnC6duEkLBd1nzexh', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_envoy.jpg' + }, + { + baker_name: 'Tz Node', + identity: 'tz1Vd1rXpV8hTHbFXCXN3c3qzCsgcU5BZw1e', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_node.png' + }, + { + baker_name: 'TzBakeOven', + identity: 'tz1Yh1nLXfwqVpP8btykuRguu61n3veVmADa', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tzbakeoven.gif' + }, + { + baker_name: 'Tzscan', + identity: 'tz1LWub69XbTxdatJnBkm7caDQoybSgW4T3s', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tzscan.png' + }, + { + baker_name: 'View Nodes', + identity: 'tz1aiYKXmSRckyJ9EybKmpVry373rfyngJU8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/viewnodestezos.jpg' + }, + { + baker_name: 'Wetez Wallet', + identity: 'tz1iMAHAVpkCVegF9FLGWUpQQeiAHh4ffdLQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/wetez.jpg' + }, + { + baker_name: 'XTZ Antipodes', + identity: 'tz1TcH4Nb3aHNDJ7CGZhU7jgAK1BkSP4Lxds', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzantipodes.png' + }, + { + baker_name: 'XTZ Baker', + identity: 'tz1ZKi4VrDMEQpypn2NTn9pPbZL3xLRkETLA', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzbaker.png' + }, + { + baker_name: 'XTZ Bakery', + identity: 'tz1P9GwUWeAyPoT3ZwBc6gWCTP9exEPaVU3w', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzbakery.jpg' + }, + { + baker_name: 'XTZ Delegate', + identity: 'tz1Xek93iSXXckyQ6aYLVS5Rr2tge2en7ZxS', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzdelegate.png' + }, + { + baker_name: 'XTZ Land', + identity: 'tz1Z1tMai15JWUWeN2PKL9faXXVPMuWamzJj', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzland.png' + }, + { + baker_name: 'XTZ Master', + identity: 'tz1KfEsrtDaA1sX7vdM4qmEPWuSytuqCDp5j', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzmaster.png' + }, + { + baker_name: 'You Loaf We Bake', + identity: 'tz1eZwq8b5cvE2bPKokatLkVMzkxz24z3Don', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/youloafwebake.png' + }, + { + baker_name: 'Zednode', + identity: 'tz1L3vFD8mFzBaS8yLHFsd7qDJY1t276Dh8i', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/zednode.png' + } +]; diff --git a/src/data/bakers-list.ts b/src/data/bakers-list.ts new file mode 100644 index 000000000..f92432276 --- /dev/null +++ b/src/data/bakers-list.ts @@ -0,0 +1,1190 @@ + + +export const VOTINGPERIODHEADS: any = [ + { + amendment: 'Athens', + period: 10, + kind: 'proposal', + start_level: 327681, + end_level: 360448 + } +]; + +export const BAKERSLIST: any = [ + { + baker_name: '888 XTZ', + identity: 'tz1WBfwbT66FC6BTLexc2BoyCCBM9LG7pnVW', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/888xtz.png' + }, + { + baker_name: 'AirBie', + identity: 'tz1iLbZZ9uoRuVJCrZ9ZwiJMpfzhy3c67mav', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/airbie.png' + }, + { + baker_name: 'Airfoil', + identity: 'tz1gk3TDbU7cJuiBRMhwQXVvgDnjsxuWhcEA', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/airfoil2.png' + }, + { + baker_name: 'At James', + identity: 'tz3e75hU4EhDU3ukyJueh5v6UvEHzGwkg3yC', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/atjames.png' + }, + { + baker_name: 'Attic Pool', + identity: 'tz1MXFrtZoaXckE41bjUCSjAjAap3AFDSr3N', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/atticpool.png' + }, + { + baker_name: 'Bake Tz', + identity: 'tz1ei4WtWEMEJekSv8qDnu9PExG6Q8HgRGr3', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bake_tz.png' + }, + { + baker_name: 'Bake ꜩ For Me', + identity: 'tz1NRGxXV9h6SdNaZLcgmjuLx3hyy2f8YoGN', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bake_tz_for_me.jpg' + }, + { + baker_name: 'Bake\'n\'Rolls', + identity: 'tz1NortRftucvAkD1J58L32EhSVrQEWJCEnB', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bake_n_rolls.png' + }, + { + baker_name: 'Baked Tezos', + identity: 'tz1aRhFErGMgL57DYHMT1vYwv7PzsJN1chrk', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/baked_tezos.jpg' + }, + { + baker_name: 'Bakemon', + identity: 'tz1Z1WwoqgRFbLE3YNdYRpCx44NSfiMJzeAG', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bakemon.png' + }, + { + baker_name: 'BakeMyStake', + identity: 'tz1NkFRjmkqqcGkAhqe78fdgemDNKXvL7Bod', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bakeyourstake.png' + }, + /* + { + baker_name: 'Baker Avenue', + identity: 'tz1YgNQBeLTgbwRb7QiyvHrx7hwN7AUbdqpB', + vote: '', + rolls: '', + vote2: '', + ote3: '', + image: 'assets/img/bakers/baker-avenue.png' + }, + { + baker_name: 'BAKER-IL', + identity: 'tz1cYufsxHXJcvANhvS55h3aY32a9BAFB494', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bakery-il.png' + }, + */ + { + baker_name: 'Baking Tacos', + identity: 'tz1RV1MBbZMR68tacosb7Mwj6LkbPSUS1er1', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bakingtacos.png' + }, + { + baker_name: 'Blockpower', + identity: 'tz1LmaFsWRkjr7QMCx5PtV6xTUz3AmEpKQiF', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/blockpowerstaking.png' + }, + /*{ + baker_name: 'Bitfinex', + identity: 'tz1KtGwriE7VuLwT3LwuvU9Nv4wAxP7XZ57d', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/bitfinex.png' + },*/ + { + baker_name: 'BTFD', + identity: 'tz1d2EwsrmoCPmhNUjt7unCQ8a9RwVsVXEmd', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/btfd.png' + }, + { + baker_name: 'Ceibo XTZ', + identity: 'tz3bEQoFCZEEfZMskefZ8q8e4eiHH1pssRax', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ceiboxtz2.png' + }, + { + baker_name: 'Coinbase', + identity: 'tz1irJKkXS2DBWkU1NnmFQx1c1L7pbGg4yhk', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/coinbase.png' + }, + { + baker_name: 'Coinone', + identity: 'tz1SYq214SCBy9naR6cvycQsYcUGpBqQAE8d', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/coinone.png' + }, + { + baker_name: 'Cryptium Labs', + identity: 'tz1eEnQhbwf6trb8Q8mPb2RaPkNk2rN7BKi8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/cryptiumlabs3.png' + }, + { + baker_name: 'Crypto Delegate', + identity: 'tz1Tnjaxk6tbAeC2TmMApPh8UsrEVQvhHvx5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/cryptodelegate.png' + }, + { + baker_name: 'Dash Master', + identity: 'tz1Lc87p6zRaDwzJs9kHvdpm7XzeWE8QTwVB', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/dashmaster.png' + }, + { + baker_name: 'Delegated Capital', + identity: 'tz1ZRWFLgT9sz8iFi1VYWPfRYeUvUSFAaDao', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/delegatedcapital.jpg' + }, + { + baker_name: 'Elite Tezos', + identity: 'tz1W1f1JrE7VsqgpUpj1iiDobqP5TixgZhDk', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/elitetezos.jpg' + }, + { + baker_name: 'EON', + identity: 'tz1PK8bNrfPbc73BtHH1A63jfU5UtbRFkvU4', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/eon.png' + }, + { + baker_name: 'Everstake', + identity: 'tz1MXFrtZoaXckE41bjUCSjAjAap3AFDSr3N', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/everstake.png' + }, + { + baker_name: 'Figment', + identity: 'tz1Scdr2HsZiQjc7bHMeBbmDRXYVvdhjJbBh', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/figment.png' + }, + { + baker_name: 'First Block', + identity: 'tz1ZQppA6UerMz5CJtGvZmmB6z8L9syq7ixu', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/firstblock.jpeg' + }, + { + baker_name: 'Flippin\' tacos', + identity: 'tz1TzaNn7wSQSP5gYPXCnNzBCpyMiidCq1PX', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/flippintacos.png' + }, + { + baker_name: 'Foundation Baker 1', + identity: 'tz3RDC3Jdn4j15J7bBHZd29EUee9gVB1CxD9', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 2', + identity: 'tz3bvNMQ95vfAYtG8193ymshqjSvmxiCUuR5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 3', + identity: 'tz3RB4aoyjov4KEVRbuhvQ1CKJgBJMWhaeB8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 4', + identity: 'tz3bTdwZinP8U1JmSweNzVKhmwafqWmFWRfk', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 5', + identity: 'tz3NExpXn9aPNZPorRE4SdjJ2RGrfbJgMAaV', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 6', + identity: 'tz3UoffC7FG7zfpmvmjUmUeAaHvzdcUvAj6r', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 7', + identity: 'tz3WMqdzXqRWXwyvj5Hp2H7QEepaUuS7vd9K', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Foundation Baker 8', + identity: 'tz3VEZ4k6a4Wx42iyev6i2aVAptTRLEAivNN', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/foundationbaker.jpg' + }, + { + baker_name: 'Fresh Tezos', + identity: 'tz1QLXqnfN51dkjeghXvKHkJfhvGiM5gK4tc', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/freshtezos.png' + }, + { + baker_name: 'Gate.io', + identity: 'tz1NpWrAyDL9k2Lmnyxcgr9xuJakbBxdq7FB', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/gateio.png' + }, + { + baker_name: 'Happy Tezos', + identity: 'tz1WCd2jm4uSt4vntk4vSuUWoZQGhLcDuR9q', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/happytezos.png' + }, + { + baker_name: 'HashQuark', + identity: 'tz1KzSC1J9aBxKp7u8TUnpN8L7S65PBRkgdF', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/hashquark.jpg' + }, + { + baker_name: 'Hayek Lab', + identity: 'tz1SohptP53wDPZhzTWzDUFAUcWF6DMBpaJV', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/hayeklab2.png' + }, + { + baker_name: 'Hot Stake', + identity: 'tz1Z3KCf8CLGAYfvVWPEr562jDDyWkwNF7sT', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/hotstake.png' + }, + { + baker_name: 'Hyper Blocks Pro', + identity: 'tz1VHFxUuBhwopxC9YC9gm5s2MHBHLyCtvN1', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/hyperblocks2.png' + }, + /* + { + baker_name: 'iBakeTezos', + identity: 'tz1dp3tScJZy8Go3byPdioSujgDi5CdemiuZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ibaketezos.jpg' + }, + */ + { + baker_name: 'Illuminarean', + identity: 'tz1Ryat7ZuRapjGUgsPym9DuMGrTYYyDBJoq', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/illuminarean.png' + }, + { + baker_name: 'Infinity Stones', + identity: 'tz1awXW7wuXy21c66vBudMXQVAPgRnqqwgTH', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/infinitystones.jpg' + }, + { + baker_name: 'Just a Baker', + identity: 'tz1ZTG13gkvouxSANka3HG3uys8C5gu3DPXZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/justabaker.png' + }, + { + baker_name: 'Kraken 1', + identity: 'tz1bDXD6nNSrebqmAnnKKwnX1QdePSMCj4MX', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/kraken.png' + }, + { + baker_name: 'Kraken 2', + identity: 'tz1NH4A2kRyFQUYhyi9aL8jrrySQUrCgNsX9', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/kraken.png' + }, + { + baker_name: 'LetzBake!', + identity: 'tz1aqcYgG6NuViML5vdWhohHJBYxcDVLNUsE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/letzbake.jpg' + }, + { + baker_name: 'Lucid Mining', + identity: 'tz1VmiY38m3y95HqQLjMwqnMS7sdMfGomzKi', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/lucidmining.png' + }, + { + baker_name: 'My Tezos Baking', + identity: 'tz1d6Fx42mYgVFnHUW8T8A7WBfJ6nD9pVok8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/mytezosbaking.png' + }, + { + baker_name: 'Norn Delegate', + identity: 'tz1YdCPrYbksK7HCoYKDyzgfXwY16Fy9rrGa', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/norndelegate.png' + }, + { + baker_name: 'Ø Crypto Pool', + identity: 'tz1KtvGSYU5hdKD288a1koTBURWYuADJGrLE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ocryptopool.png' + }, + { + baker_name: 'Own Block', + identity: 'tz1X1fpAZtwQk94QXUgZwfgsvkQgyc2KHp9d', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/ownblock.png' + }, + { + baker_name: 'P2P Validator', + identity: 'tz1P2Po7YM526ughEsRbY4oR9zaUPDZjxFrb', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/p2pvalidator.png' + }, + { + baker_name: 'PayTezos', + identity: 'tz1Ldzz6k1BHdhuKvAtMRX7h5kJSMHESMHLC', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/paytezos.png' + }, + { + baker_name: 'Polychain', + identity: 'tz1Yju7jmmsaUiG9qQLoYv35v5pHgnWoLWbt', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/polychain.png' + }, + { + baker_name: 'POS Bakerz', + identity: 'tz1Vyuu4EJ5Nym4JcrfRLnp3hpaq1DSEp1Ke', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/pos_bakerz.png' + }, + { + baker_name: 'Shake \'n Bake', + identity: 'tz1V4qCyvPKZ5UeqdH14HN42rxvNPQfc9UZg', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/shakenbake.png' + }, + { + baker_name: 'Stack Tezos', + identity: 'tz1MDKr36woXfVtrtXfV1ppPJERxPcm2wU6V', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stacktezos.png' + }, + { + baker_name: 'Stake House', + identity: 'tz1V2FYediKBAEaTpXXJBSjuQpjkyCzrTSiE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stake_house.png' + }, + { + baker_name: 'Staked', + identity: 'tz1RCFbB9GpALpsZtu6J58sb74dm8qe6XBzv', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/staked.png' + }, + { + baker_name: 'Stakery', + identity: 'tz1go7f6mEQfT2xX2LuHAqgnRGN6c2zHPf5c', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stakery.png' + }, + { + baker_name: 'Staking Facilities', + identity: 'tz1WpeqFaBG9Jm73Dmgqamy8eF8NWLz9JCoY', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stakingfacilities.png' + }, + { + baker_name: 'Stir Delegate', + identity: 'tz1LH4L6XYT2JNPhvWYC4Zq3XEiGgEwzNRvo', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/stirdelegate.png' + }, + { + baker_name: 'Tez Baker', + identity: 'tz1Lhf4J9Qxoe3DZ2nfe8FGDnvVj7oKjnMY6', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_baker.png' + }, + { + baker_name: 'Tez Mania', + identity: 'tz1MQJPGNMijnXnVoBENFz9rUhaPt3S7rWoz', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_mania.jpg' + }, + { + baker_name: 'Tez Milk', + identity: 'tz1bakeKFwqmtLBzghw8CFnqFvRxLj849Vfg', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_milk.png' + }, + { + baker_name: 'Tez Patisserie', + identity: 'tz1UUgPwikRHW1mEyVZfGYy6QaxrY6Y7WaG5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_patisserie.png' + }, + { + baker_name: 'TEZ Rocket', + identity: 'tz1abTjX2tjtMdaq5VCzkDtBnMSCFPW2oRPa', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_rocket.png' + }, + { + baker_name: 'Tez Whale', + identity: 'tz1isXamBXpTUgbByQ6gXgZQg4GWNW7r6rKE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tez_whale.png' + }, + { + baker_name: 'Tez-Baking', + identity: 'tz1LBEKXaxQbd5Gtzbc1ATCwc3pppu81aWGc', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezbaking.png' + }, + { + baker_name: 'Tezetetic', + identity: 'tz1VceyYUpq1gk5dtp6jXQRtCtY8hm5DKt72', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezetetic.jpg' + }, + { + baker_name: 'Tezmania', + identity: 'tz1MQJPGNMijnXnVoBENFz9rUhaPt3S7rWoz', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezmania.jpg' + }, + { + baker_name: 'Tezocracy', + identity: 'tz1TaLYBeGZD3yKVHQGBM857CcNnFFNceLYh', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezocracy.png' + }, + { + baker_name: 'Tezos Bakery', + identity: 'tz1fZ767VDbqx4DeKiFswPSHh513f51mKEUZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_bakery.png' + }, + { + baker_name: 'Tezos Berlin', + identity: 'tz1Y42aKCk53vMbaJNpf1hBg1rznGdBxHJ5C', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_berlin.jpg' + }, + { + baker_name: 'Tezos Capital', + identity: 'tz2PdGc7U5tiyqPgTSgqCDct94qd6ovQwP6u', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_capital.png' + }, + { + baker_name: 'Tezos Capital Legacy', + identity: 'tz1TDSmoZXwVevLTEvKCTHWpomG76oC9S2fJ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_capital_legacy.png' + }, + { + baker_name: 'Tezos Cat', + identity: 'tz1XXayQohB8XRXN7kMoHbf2NFwNiH3oMRQQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_cat.png' + }, + { + baker_name: 'Tezos Chef', + identity: 'tz1hThMBD8jQjFt78heuCnKxJnJtQo9Ao25X', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_chef.png' + }, + { + baker_name: 'Tezos Delegate EU', + identity: 'tz1YTyvABUyhE7JHpxMVBVqjZnZM4ofMrWKE', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_delegateEU.png' + }, + { + baker_name: 'Tezos France', + identity: 'tz1U638Z3xWRiXDDKx2S125MCCaAeGDdA896', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_france.png' + }, + { + baker_name: 'Tezos HODL', + identity: 'tz1WnfXMPaNTBmH7DBPwqCWs9cPDJdkGBTZ8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_hodl.png' + }, + { + baker_name: 'Tezos Hot Bakery', + identity: 'tz1bLwpPfr3xqy1gWBF4sGvv8bLJyPHR11kx', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_hotbakery.png' + }, + { + baker_name: 'Tezos Istanbul', + identity: 'tz1Vm5cfHncKGBo7YvZfHc4mmudY4qpWzvSB', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_istanbul.jpg' + }, + { + baker_name: 'Tezos Kitchen', + identity: 'tz1Nn14BBsDULrPXtkM9UQeXaE4iqJhmqmK5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_kitchen.png' + }, + { + baker_name: 'Tezos Korea', + identity: 'tz1PPUo28B8BroqmVCMMNDudG4ShA2bzicrU', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_korea.png' + }, + { + baker_name: 'Tezos Mars', + identity: 'tz1S1Aew75hMrPUymqenKfHo8FspppXKpW7h', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_mars.png' + }, + { + baker_name: 'Tezos Moon', + identity: 'tz1TgvirXEwVJPg1cCrxT9zFubdzw7Ng6Ke9', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_moon.png' + }, + { + baker_name: 'Tezos Ninja', + identity: 'tz1djEKk6j1FqigTgbRsunbnY9BB7qsn1aAQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_ninja.png' + }, + { + baker_name: 'Tezos Panda', + identity: 'tz1PeZx7FXy7QRuMREGXGxeipb24RsMMzUNe', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_panda.png' + }, + /* + { + baker_name: 'Tezos Rio', + identity: 'tz1gfipKzYrNRT14oSNQJMCdRRsUtcbZoKsd', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_rio.png' + }, + */ + { + baker_name: 'Tezos Suisse', + identity: 'tz1hAYfexyzPGG6RhZZMpDvAHifubsbb6kgn', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_suisse.jpg' + }, + { + baker_name: 'Tezos Tacos', + identity: 'tz1bkKTY9Y3rTsHbpr2fbGUCRm736LLquQfM', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_tacos.jpg' + }, + { + baker_name: 'Tezos Tokyo', + identity: 'tz1VYQpZvjVhv1CdcENuCNWJQXu1TWBJ8KTD', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_tokyo.png' + }, + { + baker_name: 'Tezos Vote', + identity: 'tz1bHzftcTKZMTZgLLtnrXydCm6UEqf4ivca', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezos_vote.png' + }, + { + baker_name: 'TezosBC', + identity: 'tz1QGZ3dD2YpRKZ4APeso6EXTeyCUUkw6MQC', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosbc.png' + }, + { + baker_name: 'TezosBr', + identity: 'tz1YKh8T79LAtWxX29N5VedCSmaZGw9LNVxQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosbrazil.png' + }, + { + baker_name: 'TezosRUs', + identity: 'tz1b9MYGrbN1NAxphLEsPPNT9JC7aNFc5nA4', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosrus.jpg' + }, + { + baker_name: 'TezosSEAsia', + identity: 'tz1R6Ej25VSerE3MkSoEEeBjKHCDTFbpKuSX', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosseasia.jpg' + }, + { + baker_name: 'TezoSteam', + identity: 'tz1LLNkQK4UQV6QcFShiXJ2vT2ELw449MzAA', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezosteam2.jpg' + }, + { + baker_name: 'Tezry', + identity: 'tz1UJvHTgpVzcKWhTazGxVcn5wsHru5Gietg', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezry.png' + }, + { + baker_name: 'TezTech Labs', + identity: 'tz1Vtimi84kLh9RANfRVX2JvYtP4NPCT1aFm', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/teztechlabs.jpg' + }, + { + baker_name: 'Tezz City', + identity: 'tz1Zcxkfa5jKrRbBThG765GP29bUCU3C4ok5', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzcity.jpg' + }, + { + baker_name: 'Tezzieland', + identity: 'tz1fUjvVhJrHLZCbhPNvDRckxApqbkievJHN', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzieland.png' + }, + { + baker_name: 'Tezzigator (HSM)', + identity: 'tz3adcvQaKXTCg12zbninqo3q8ptKKtDFTLv', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzigator.png' + }, + { + baker_name: 'Tezzigator Legacy', + identity: 'tz1iZEKy4LaAjnTmn2RuGDf2iqdAQKnRi8kY', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tezzigator.png' + }, + { + baker_name: 'TZ Bake', + identity: 'tz1Zhv3RkfU2pHrmaiDyxp7kFZpZrUCu1CiF', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_bake.png' + }, + { + baker_name: 'Tz Bakery', + identity: 'tz1cX93Q3KsiTADpCC4f12TBvAmS5tw7CW19', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_bakery.jpg' + }, + { + baker_name: 'Tz Bank', + identity: 'tz1bkg7rynMXVcjomoe3diB4URfv8GU2GAcw', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_bank.png' + }, + { + baker_name: 'Tz Dutch', + identity: 'tz1PesW5khQNhy4revu2ETvMtWPtuVyH2XkZ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_dutch.png' + }, + { + baker_name: 'Tz Envoy', + identity: 'tz1iJ4qgGTzyhaYEzd1RnC6duEkLBd1nzexh', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_envoy.jpg' + }, + { + baker_name: 'Tz Node', + identity: 'tz1Vd1rXpV8hTHbFXCXN3c3qzCsgcU5BZw1e', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tz_node.png' + }, + { + baker_name: 'TzBakeOven', + identity: 'tz1Yh1nLXfwqVpP8btykuRguu61n3veVmADa', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tzbakeoven.gif' + }, + { + baker_name: 'Tzscan', + identity: 'tz1LWub69XbTxdatJnBkm7caDQoybSgW4T3s', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/tzscan.png' + }, + { + baker_name: 'Validators.com', + identity: 'tz1Pwgj6j55akKCyvTwwr9X4np1RskSXpQY4', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/validators.png' + }, + { + baker_name: 'View Nodes', + identity: 'tz1aiYKXmSRckyJ9EybKmpVry373rfyngJU8', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/viewnodestezos.jpg' + }, + { + baker_name: 'Wetez Wallet', + identity: 'tz1iMAHAVpkCVegF9FLGWUpQQeiAHh4ffdLQ', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/wetez.jpg' + }, + { + baker_name: 'XTZ Antipodes', + identity: 'tz1TcH4Nb3aHNDJ7CGZhU7jgAK1BkSP4Lxds', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzantipodes.png' + }, + { + baker_name: 'XTZ Baker', + identity: 'tz1ZKi4VrDMEQpypn2NTn9pPbZL3xLRkETLA', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzbaker.png' + }, + { + baker_name: 'XTZ Bakery', + identity: 'tz1P9GwUWeAyPoT3ZwBc6gWCTP9exEPaVU3w', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzbakery.jpg' + }, + { + baker_name: 'XTZ Delegate', + identity: 'tz1Xek93iSXXckyQ6aYLVS5Rr2tge2en7ZxS', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzdelegate.png' + }, + { + baker_name: 'XTZ Land', + identity: 'tz1Z1tMai15JWUWeN2PKL9faXXVPMuWamzJj', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzland.png' + }, + { + baker_name: 'XTZ Master', + identity: 'tz1KfEsrtDaA1sX7vdM4qmEPWuSytuqCDp5j', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/xtzmaster.png' + }, + { + baker_name: 'You Loaf We Bake', + identity: 'tz1eZwq8b5cvE2bPKokatLkVMzkxz24z3Don', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/youloafwebake.png' + }, + { + baker_name: 'Zednode', + identity: 'tz1L3vFD8mFzBaS8yLHFsd7qDJY1t276Dh8i', + vote: '', + rolls: '', + vote2: '', + vote3: '', + image: 'assets/img/bakers/zednode.png' + } +]; diff --git a/src/electron/package.json b/src/electron/package.json index 3b5c42da0..e6ed88016 100644 --- a/src/electron/package.json +++ b/src/electron/package.json @@ -1,6 +1,6 @@ { "name": "kukai", - "version": "1.3.0", + "version": "1.3.1", "main": "main.js", "scripts": { "start": "electron ." diff --git a/src/styles.scss b/src/styles.scss index 0999b9538..3c514ec6d 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -6,6 +6,9 @@ //For font-awesome @import '../node_modules/font-awesome/scss/font-awesome'; +// Angular Material theme +@import "~@angular/material/prebuilt-themes/indigo-pink.css"; + /* Boostrap personalization Info for shades: https://www.w3schools.com/colors/colors_picker.asp diff --git a/tslint.json b/tslint.json index cc07127a4..f80e29f6a 100644 --- a/tslint.json +++ b/tslint.json @@ -30,7 +30,7 @@ "label-position": true, "max-line-length": [ true, - 140 + 180 ], "member-access": false, "member-ordering": [