diff --git a/.eslintrc b/.eslintrc
index 1b4295e1..85c4444c 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -25,19 +25,6 @@
"no-console": ["off"],
"quotes": ["error", "single"],
"react/react-in-jsx-scope": "off",
- "@typescript-eslint/no-explicit-any": "off",
- "@typescript-eslint/member-delimiter-style": [
- "warn",
- {
- "multiline": {
- "delimiter": "semi",
- "requireLast": true
- },
- "singleline": {
- "delimiter": "comma",
- "requireLast": false
- }
- }
- ]
- }
+ "@typescript-eslint/no-explicit-any": "off"
+ }
}
diff --git a/.gitignore b/.gitignore
index 5fd99476..918d6e29 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,5 @@ dist
node_modules
coverage
.env
+*.temp
~/node_modules
\ No newline at end of file
diff --git a/example/.gitignore b/example/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/example/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/example/index.html b/example/index.html
new file mode 100644
index 00000000..1a808336
--- /dev/null
+++ b/example/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+ Vite + React + TS
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/example/package-lock.json b/example/package-lock.json
new file mode 100644
index 00000000..1b0bc0c7
--- /dev/null
+++ b/example/package-lock.json
@@ -0,0 +1,5456 @@
+{
+ "name": "example",
+ "version": "0.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "example",
+ "version": "0.0.0",
+ "dependencies": {
+ "@esbuild-plugins/node-globals-polyfill": "^0.1.1",
+ "@ethereumjs/common": "^3.0.2",
+ "@ethereumjs/tx": "^4.0.2",
+ "buffer": "^6.0.3",
+ "gridplus-sdk": "^2.4.3",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@vitejs/plugin-react": "^3.0.0",
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.20.10",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
+ "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz",
+ "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-module-transforms": "^7.20.7",
+ "@babel/helpers": "^7.20.7",
+ "@babel/parser": "^7.20.7",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
+ "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+ "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+ "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.10",
+ "@babel/types": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
+ "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
+ "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz",
+ "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz",
+ "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+ "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.20.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz",
+ "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+ "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild-plugins/node-globals-polyfill": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz",
+ "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==",
+ "peerDependencies": {
+ "esbuild": "*"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.0.tgz",
+ "integrity": "sha512-hlbX5ym1V5kIKvnwFhm6rhar7MNqfJrZyYTNfk6+WS1uQfQmszFgXeyPH2beP3lSCumZyqX0zMBfOqftOpZ7GA==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.0.tgz",
+ "integrity": "sha512-77GVyD7ToESy/7+9eI8z62GGBdS/hsqsrpM+JA4kascky86wHbN29EEFpkVvxajPL7k6mbLJ5VBQABdj7n9FhQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.0.tgz",
+ "integrity": "sha512-TroxZdZhtAz0JyD0yahtjcbKuIXrBEAoAazaYSeR2e2tUtp9uXrcbpwFJF6oxxOiOOne6y7l4hx4YVnMW/tdFw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.0.tgz",
+ "integrity": "sha512-wP/v4cgdWt1m8TS/WmbaBc3NZON10eCbm6XepdVc3zJuqruHCzCKcC9dTSTEk50zX04REcRcbIbdhTMciQoFIg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.0.tgz",
+ "integrity": "sha512-R4WB6D6V9KGO/3LVTT8UlwRJO26IBFatOdo/bRXksfJR0vyOi2/lgmAAMBSpgcnnwvts9QsWiyM++mTTlwRseA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.0.tgz",
+ "integrity": "sha512-FO7+UEZv79gen2df8StFYFHZPI9ADozpFepLZCxY+O8sYLDa1rirvenmLwJiOHmeQRJ5orYedFeLk1PFlZ6t8Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.0.tgz",
+ "integrity": "sha512-qCsNRsVTaC3ekwZcb2sa7l1gwCtJK3EqCWyDgpoQocYf3lRpbAzaCvqZSF2+NOO64cV+JbedXPsFiXU1aaVcIg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.0.tgz",
+ "integrity": "sha512-Y2G2NU6155gcfNKvrakVmZV5xUAEhXjsN/uKtbKKRnvee0mHUuaT3OdQJDJKjHVGr6B0898pc3slRpI1PqspoQ==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.0.tgz",
+ "integrity": "sha512-js4Vlch5XJQYISbDVJd2hsI/MsfVUz6d/FrclCE73WkQmniH37vFpuQI42ntWAeBghDIfaPZ6f9GilhwGzVFUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.0.tgz",
+ "integrity": "sha512-7tl/jSPkF59R3zeFDB2/09zLGhcM7DM+tCoOqjJbQjuL6qbMWomGT2RglCqRFpCSdzBx0hukmPPgUAMlmdj0sQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.0.tgz",
+ "integrity": "sha512-OG356F7dIVVF+EXJx5UfzFr1I5l6ES53GlMNSr3U1MhlaVyrP9um5PnrSJ+7TSDAzUC7YGjxb2GQWqHLd5XFoA==",
+ "cpu": [
+ "loong64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.0.tgz",
+ "integrity": "sha512-LWQJgGpxrjh2x08UYf6G5R+Km7zhkpCvKXtFQ6SX0fimDvy1C8kslgFHGxLS0wjGV8C4BNnENW/HNy57+RB7iA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.0.tgz",
+ "integrity": "sha512-f40N8fKiTQslUcUuhof2/syOQ+DC9Mqdnm9d063pew+Ptv9r6dBNLQCz4300MOfCLAbb0SdnrcMSzHbMehXWLw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.0.tgz",
+ "integrity": "sha512-sc/pvLexRvxgEbmeq7LfLGnzUBFi/E2MGbnQj3CG8tnQ90tWPTi+9CbZEgIADhj6CAlCCmqxpUclIV1CRVUOTw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.0.tgz",
+ "integrity": "sha512-7xq9/kY0vunCL2vjHKdHGI+660pCdeEC6K6TWBVvbTGXvT8s/qacfxMgr8PCeQRbNUZLOA13G6/G1+c0lYXO1A==",
+ "cpu": [
+ "s390x"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.0.tgz",
+ "integrity": "sha512-o7FhBLONk1mLT2ytlj/j/WuJcPdhWcVpysSJn1s9+zRdLwLKveipbPi5SIasJIqMq0T4CkQW76pxJYMqz9HrQA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.0.tgz",
+ "integrity": "sha512-V6xXsv71b8vwFCW/ky82Rs//SbyA+ORty6A7Mzkg33/4NbYZ/1Vcbk7qAN5oi0i/gS4Q0+7dYT7NqaiVZ7+Xjw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.0.tgz",
+ "integrity": "sha512-StlQor6A0Y9SSDxraytr46Qbz25zsSDmsG3MCaNkBnABKHP3QsngOCfdBikqHVVrXeK0KOTmtX92/ncTGULYgQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.0.tgz",
+ "integrity": "sha512-K64Wqw57j8KrwjR3QjsuzN/qDGK6Cno6QYtIlWAmGab5iYPBZCWz7HFtF2a86/130LmUsdXqOID7J0SmjjRFIQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.0.tgz",
+ "integrity": "sha512-hly6iSWAf0hf3aHD18/qW7iFQbg9KAQ0RFGG9plcxkhL4uGw43O+lETGcSO/PylNleFowP/UztpF6U4oCYgpPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.0.tgz",
+ "integrity": "sha512-aL4EWPh0nyC5uYRfn+CHkTgawd4DjtmwquthNDmGf6Ht6+mUc+bQXyZNH1QIw8x20hSqFc4Tf36aLLWP/TPR3g==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.0.tgz",
+ "integrity": "sha512-W6IIQ9Rt43I/GqfXeBFLk0TvowKBoirs9sw2LPfhHax6ayMlW5PhFzSJ76I1ac9Pk/aRcSMrHWvVyZs8ZPK2wA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@ethereumjs/common": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.0.2.tgz",
+ "integrity": "sha512-N8fpT5uDvxOE5dIaPQZWzJaBRkRWrCXv63MONEn5ikp/J9mWFc53VUjb3GqtIYHRgg9nP81TXmtnvQJz1IuTiw==",
+ "dependencies": {
+ "@ethereumjs/util": "^8.0.3",
+ "crc-32": "^1.2.0"
+ }
+ },
+ "node_modules/@ethereumjs/rlp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.0.tgz",
+ "integrity": "sha512-LM4jS5n33bJN60fM5EC8VeyhUgga6/DjCPBV2vWjnfVtobqtOiNC4SQ1MRFqyBSmJGGdB533JZWewyvlcdJtkQ==",
+ "bin": {
+ "rlp": "bin/rlp"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/tx": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.0.2.tgz",
+ "integrity": "sha512-6GoKVK3MVcAFFn4qSLIIDZ1vrKSLn7W5L80Pvae1BJFgchu+11R2iOqQyVGUSGbaXllh4xliUy/7+x5pYwRY8Q==",
+ "dependencies": {
+ "@ethereumjs/common": "^3.0.2",
+ "@ethereumjs/rlp": "^4.0.0",
+ "@ethereumjs/util": "^8.0.3",
+ "ethereum-cryptography": "^1.1.2",
+ "ethers": "^5.7.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/util": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.0.3.tgz",
+ "integrity": "sha512-0apCbwc8xAaie6W7q6QyogfyRS2BMU816a8KwpnpRw9Qrc6Bws+l7J3LfCLMt2iL6Wi8CYb0B29AeIr2N4vHnw==",
+ "dependencies": {
+ "@ethereumjs/rlp": "^4.0.0-beta.2",
+ "async": "^3.2.4",
+ "ethereum-cryptography": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethersproject/abi": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz",
+ "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-provider": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz",
+ "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/web": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-signer": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz",
+ "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/address": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz",
+ "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/base64": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz",
+ "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/basex": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz",
+ "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/bignumber": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz",
+ "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "bn.js": "^5.2.1"
+ }
+ },
+ "node_modules/@ethersproject/bytes": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz",
+ "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/constants": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz",
+ "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/contracts": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz",
+ "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/hash": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz",
+ "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/hdnode": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz",
+ "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/basex": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/pbkdf2": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/wordlists": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/json-wallets": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz",
+ "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hdnode": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/pbkdf2": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "aes-js": "3.0.0",
+ "scrypt-js": "3.0.1"
+ }
+ },
+ "node_modules/@ethersproject/json-wallets/node_modules/aes-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
+ "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw=="
+ },
+ "node_modules/@ethersproject/keccak256": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz",
+ "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "js-sha3": "0.8.0"
+ }
+ },
+ "node_modules/@ethersproject/logger": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz",
+ "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ]
+ },
+ "node_modules/@ethersproject/networks": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz",
+ "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/pbkdf2": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz",
+ "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/properties": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz",
+ "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/providers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz",
+ "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/basex": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/web": "^5.7.0",
+ "bech32": "1.1.4",
+ "ws": "7.4.6"
+ }
+ },
+ "node_modules/@ethersproject/providers/node_modules/bech32": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
+ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="
+ },
+ "node_modules/@ethersproject/random": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz",
+ "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/rlp": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz",
+ "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/sha2": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz",
+ "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/signing-key": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz",
+ "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "bn.js": "^5.2.1",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/solidity": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz",
+ "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/strings": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz",
+ "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/transactions": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz",
+ "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/units": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz",
+ "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/wallet": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz",
+ "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/hdnode": "^5.7.0",
+ "@ethersproject/json-wallets": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/wordlists": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/web": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz",
+ "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/wordlists": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz",
+ "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz",
+ "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/@noble/secp256k1": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz",
+ "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/@scure/base": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz",
+ "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/@scure/bip32": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz",
+ "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "@noble/hashes": "~1.1.1",
+ "@noble/secp256k1": "~1.6.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/@scure/bip39": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz",
+ "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "@noble/hashes": "~1.1.1",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/@types/bn.js": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz",
+ "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "18.11.18",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
+ },
+ "node_modules/@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
+ "dev": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.0.26",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz",
+ "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==",
+ "dev": true,
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.0.10",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz",
+ "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
+ "dev": true
+ },
+ "node_modules/@types/secp256k1": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
+ "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.0.tgz",
+ "integrity": "sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.20.5",
+ "@babel/plugin-transform-react-jsx-self": "^7.18.6",
+ "@babel/plugin-transform-react-jsx-source": "^7.19.6",
+ "magic-string": "^0.27.0",
+ "react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/aes-js": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+ "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "node_modules/base-x": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
+ "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bech32": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz",
+ "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="
+ },
+ "node_modules/bignumber.js": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz",
+ "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/bitwise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/bitwise/-/bitwise-2.1.0.tgz",
+ "integrity": "sha512-XKgAhMXCh4H/3oNwAHAsAO0iC89s9cOiumgYwSHjSobGWxYjv62YhkL9QEdvGP151xypCtMlAfKK79GEcd2eRQ=="
+ },
+ "node_modules/blakejs": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
+ "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="
+ },
+ "node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
+ },
+ "node_modules/borc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz",
+ "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==",
+ "dependencies": {
+ "bignumber.js": "^9.0.0",
+ "buffer": "^5.5.0",
+ "commander": "^2.15.0",
+ "ieee754": "^1.1.13",
+ "iso-url": "~0.4.7",
+ "json-text-sequence": "~0.1.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/borc/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "dependencies": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "node_modules/bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "dependencies": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001441",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
+ "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+ "bin": {
+ "crc32": "bin/crc32.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/delimit-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz",
+ "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ=="
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "dev": true
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "node_modules/esbuild": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.0.tgz",
+ "integrity": "sha512-4yGk3rD95iS/wGzrx0Ji5czZcx1j2wvfF1iAJaX2FIYLB6sU6wYkDeplpZHzfwQw2yXGXsAoxmO6LnMQkl04Kg==",
+ "hasInstallScript": true,
+ "peer": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.17.0",
+ "@esbuild/android-arm64": "0.17.0",
+ "@esbuild/android-x64": "0.17.0",
+ "@esbuild/darwin-arm64": "0.17.0",
+ "@esbuild/darwin-x64": "0.17.0",
+ "@esbuild/freebsd-arm64": "0.17.0",
+ "@esbuild/freebsd-x64": "0.17.0",
+ "@esbuild/linux-arm": "0.17.0",
+ "@esbuild/linux-arm64": "0.17.0",
+ "@esbuild/linux-ia32": "0.17.0",
+ "@esbuild/linux-loong64": "0.17.0",
+ "@esbuild/linux-mips64el": "0.17.0",
+ "@esbuild/linux-ppc64": "0.17.0",
+ "@esbuild/linux-riscv64": "0.17.0",
+ "@esbuild/linux-s390x": "0.17.0",
+ "@esbuild/linux-x64": "0.17.0",
+ "@esbuild/netbsd-x64": "0.17.0",
+ "@esbuild/openbsd-x64": "0.17.0",
+ "@esbuild/sunos-x64": "0.17.0",
+ "@esbuild/win32-arm64": "0.17.0",
+ "@esbuild/win32-ia32": "0.17.0",
+ "@esbuild/win32-x64": "0.17.0"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eth-eip712-util-browser": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/eth-eip712-util-browser/-/eth-eip712-util-browser-0.0.3.tgz",
+ "integrity": "sha512-RUXQ6Hjl0wEjm/ObWgYKjzMfO1segqcPFGnMPtBkkwGaHGbXXh6WFAn5vZfReK9WWujs35uIW2+kgJmh3FXtww==",
+ "dependencies": {
+ "bn.js": ">4.0.0",
+ "buffer": "^6.0.3",
+ "js-sha3": "^0.8.0"
+ }
+ },
+ "node_modules/ethereum-cryptography": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz",
+ "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==",
+ "dependencies": {
+ "@noble/hashes": "1.1.2",
+ "@noble/secp256k1": "1.6.3",
+ "@scure/bip32": "1.1.0",
+ "@scure/bip39": "1.1.0"
+ }
+ },
+ "node_modules/ethereumjs-util": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
+ "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
+ "dependencies": {
+ "@types/bn.js": "^5.1.0",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "rlp": "^2.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "dependencies": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/ethereumjs-util/node_modules/rlp": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
+ "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
+ "dependencies": {
+ "bn.js": "^5.2.0"
+ },
+ "bin": {
+ "rlp": "bin/rlp"
+ }
+ },
+ "node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/gridplus-sdk": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/gridplus-sdk/-/gridplus-sdk-2.4.3.tgz",
+ "integrity": "sha512-LssiqmgV05ACRa5vnFSJ2WjMd+qoxyZN+OQwj2uFCRoC24wUP3pXaKOXUxHInl2HlyZk+f3nT8iQvOSWzFiZHw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@ethereumjs/common": "2.4.0",
+ "@ethereumjs/tx": "3.3.0",
+ "@ethersproject/abi": "^5.5.0",
+ "aes-js": "^3.1.1",
+ "bech32": "^2.0.0",
+ "bignumber.js": "^9.0.1",
+ "bitwise": "^2.0.4",
+ "borc": "^2.1.2",
+ "bs58check": "^2.1.2",
+ "buffer": "^5.6.0",
+ "crc-32": "^1.2.0",
+ "elliptic": "6.5.4",
+ "eth-eip712-util-browser": "^0.0.3",
+ "hash.js": "^1.1.7",
+ "js-sha3": "^0.8.0",
+ "rlp": "^3.0.0",
+ "secp256k1": "4.0.2",
+ "uuid": "^9.0.0"
+ }
+ },
+ "node_modules/gridplus-sdk/node_modules/@ethereumjs/common": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz",
+ "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==",
+ "dependencies": {
+ "crc-32": "^1.2.0",
+ "ethereumjs-util": "^7.1.0"
+ }
+ },
+ "node_modules/gridplus-sdk/node_modules/@ethereumjs/tx": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz",
+ "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==",
+ "dependencies": {
+ "@ethereumjs/common": "^2.4.0",
+ "ethereumjs-util": "^7.1.0"
+ }
+ },
+ "node_modules/gridplus-sdk/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/iso-url": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz",
+ "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-text-sequence": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz",
+ "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==",
+ "dependencies": {
+ "delimit-stream": "0.1.0"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keccak": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz",
+ "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
+ "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
+ "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==",
+ "dev": true
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/postcss": {
+ "version": "8.4.20",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
+ "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
+ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/rlp": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-3.0.0.tgz",
+ "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==",
+ "bin": {
+ "rlp": "bin/rlp"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.9.0.tgz",
+ "integrity": "sha512-nGGylpmblyjTpF4lEUPgmOw6OVxRvnI6Iuuh6Lz4O/X66cVOX1XJSsqP1YamxQ+mPuFE7qJxLFDSCk8rNv5dDw==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+ },
+ "node_modules/secp256k1": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
+ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vite": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.3.tgz",
+ "integrity": "sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.16.3",
+ "postcss": "^8.4.20",
+ "resolve": "^1.22.1",
+ "rollup": "^3.7.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.12.tgz",
+ "integrity": "sha512-CTWgMJtpCyCltrvipZrrcjjRu+rzm6pf9V8muCsJqtKujR3kPmU4ffbckvugNNaRmhxAF1ZI3J+0FUIFLFg8KA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.12.tgz",
+ "integrity": "sha512-0LacmiIW+X0/LOLMZqYtZ7d4uY9fxYABAYhSSOu+OGQVBqH4N5eIYgkT7bBFnR4Nm3qo6qS3RpHKVrDASqj/uQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.12.tgz",
+ "integrity": "sha512-sS5CR3XBKQXYpSGMM28VuiUnbX83Z+aWPZzClW+OB2JquKqxoiwdqucJ5qvXS8pM6Up3RtJfDnRQZkz3en2z5g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.12.tgz",
+ "integrity": "sha512-Dpe5hOAQiQRH20YkFAg+wOpcd4PEuXud+aGgKBQa/VriPJA8zuVlgCOSTwna1CgYl05lf6o5els4dtuyk1qJxQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.12.tgz",
+ "integrity": "sha512-ApGRA6X5txIcxV0095X4e4KKv87HAEXfuDRcGTniDWUUN+qPia8sl/BqG/0IomytQWajnUn4C7TOwHduk/FXBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.12.tgz",
+ "integrity": "sha512-AMdK2gA9EU83ccXCWS1B/KcWYZCj4P3vDofZZkl/F/sBv/fphi2oUqUTox/g5GMcIxk8CF1CVYTC82+iBSyiUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.12.tgz",
+ "integrity": "sha512-KUKB9w8G/xaAbD39t6gnRBuhQ8vIYYlxGT2I+mT6UGRnCGRr1+ePFIGBQmf5V16nxylgUuuWVW1zU2ktKkf6WQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.12.tgz",
+ "integrity": "sha512-vhDdIv6z4eL0FJyNVfdr3C/vdd/Wc6h1683GJsFoJzfKb92dU/v88FhWdigg0i6+3TsbSDeWbsPUXb4dif2abg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.12.tgz",
+ "integrity": "sha512-29HXMLpLklDfmw7T2buGqq3HImSUaZ1ArmrPOMaNiZZQptOSZs32SQtOHEl8xWX5vfdwZqrBfNf8Te4nArVzKQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.12.tgz",
+ "integrity": "sha512-JFDuNDTTfgD1LJg7wHA42o2uAO/9VzHYK0leAVnCQE/FdMB599YMH73ux+nS0xGr79pv/BK+hrmdRin3iLgQjg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.12.tgz",
+ "integrity": "sha512-xTGzVPqm6WKfCC0iuj1fryIWr1NWEM8DMhAIo+4rFgUtwy/lfHl+Obvus4oddzRDbBetLLmojfVZGmt/g/g+Rw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.12.tgz",
+ "integrity": "sha512-zI1cNgHa3Gol+vPYjIYHzKhU6qMyOQrvZ82REr5Fv7rlh5PG6SkkuCoH7IryPqR+BK2c/7oISGsvPJPGnO2bHQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.12.tgz",
+ "integrity": "sha512-/C8OFXExoMmvTDIOAM54AhtmmuDHKoedUd0Otpfw3+AuuVGemA1nQK99oN909uZbLEU6Bi+7JheFMG3xGfZluQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.12.tgz",
+ "integrity": "sha512-qeouyyc8kAGV6Ni6Isz8hUsKMr00EHgVwUKWNp1r4l88fHEoNTDB8mmestvykW6MrstoGI7g2EAsgr0nxmuGYg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.12.tgz",
+ "integrity": "sha512-s9AyI/5vz1U4NNqnacEGFElqwnHusWa81pskAf8JNDM2eb6b2E6PpBmT8RzeZv6/TxE6/TADn2g9bb0jOUmXwQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.12.tgz",
+ "integrity": "sha512-e8YA7GQGLWhvakBecLptUiKxOk4E/EPtSckS1i0MGYctW8ouvNUoh7xnU15PGO2jz7BYl8q1R6g0gE5HFtzpqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.12.tgz",
+ "integrity": "sha512-z2+kUxmOqBS+6SRVd57iOLIHE8oGOoEnGVAmwjm2aENSP35HPS+5cK+FL1l+rhrsJOFIPrNHqDUNechpuG96Sg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.12.tgz",
+ "integrity": "sha512-PAonw4LqIybwn2/vJujhbg1N9W2W8lw9RtXIvvZoyzoA/4rA4CpiuahVbASmQohiytRsixbNoIOUSjRygKXpyA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.12.tgz",
+ "integrity": "sha512-+wr1tkt1RERi+Zi/iQtkzmMH4nS8+7UIRxjcyRz7lur84wCkAITT50Olq/HiT4JN2X2bjtlOV6vt7ptW5Gw60Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.12.tgz",
+ "integrity": "sha512-XEjeUSHmjsAOJk8+pXJu9pFY2O5KKQbHXZWQylJzQuIBeiGrpMeq9sTVrHefHxMOyxUgoKQTcaTS+VK/K5SviA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.12.tgz",
+ "integrity": "sha512-eRKPM7e0IecUAUYr2alW7JGDejrFJXmpjt4MlfonmQ5Rz9HWpKFGCjuuIRgKO7W9C/CWVFXdJ2GjddsBXqQI4A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.12.tgz",
+ "integrity": "sha512-iPYKN78t3op2+erv2frW568j1q0RpqX6JOLZ7oPPaAV1VaF7dDstOrNw37PVOYoTWE11pV4A1XUitpdEFNIsPg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.12.tgz",
+ "integrity": "sha512-eq5KcuXajf2OmivCl4e89AD3j8fbV+UTE9vczEzq5haA07U9oOTzBWlh3+6ZdjJR7Rz2QfWZ2uxZyhZxBgJ4+g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.16.12",
+ "@esbuild/android-arm64": "0.16.12",
+ "@esbuild/android-x64": "0.16.12",
+ "@esbuild/darwin-arm64": "0.16.12",
+ "@esbuild/darwin-x64": "0.16.12",
+ "@esbuild/freebsd-arm64": "0.16.12",
+ "@esbuild/freebsd-x64": "0.16.12",
+ "@esbuild/linux-arm": "0.16.12",
+ "@esbuild/linux-arm64": "0.16.12",
+ "@esbuild/linux-ia32": "0.16.12",
+ "@esbuild/linux-loong64": "0.16.12",
+ "@esbuild/linux-mips64el": "0.16.12",
+ "@esbuild/linux-ppc64": "0.16.12",
+ "@esbuild/linux-riscv64": "0.16.12",
+ "@esbuild/linux-s390x": "0.16.12",
+ "@esbuild/linux-x64": "0.16.12",
+ "@esbuild/netbsd-x64": "0.16.12",
+ "@esbuild/openbsd-x64": "0.16.12",
+ "@esbuild/sunos-x64": "0.16.12",
+ "@esbuild/win32-arm64": "0.16.12",
+ "@esbuild/win32-ia32": "0.16.12",
+ "@esbuild/win32-x64": "0.16.12"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.18.6"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.20.10",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
+ "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz",
+ "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-module-transforms": "^7.20.7",
+ "@babel/helpers": "^7.20.7",
+ "@babel/parser": "^7.20.7",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
+ "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.20.7",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+ "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "dev": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+ "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.10",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "dev": true
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.20.2"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "dev": true
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
+ "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
+ "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
+ "dev": true
+ },
+ "@babel/plugin-transform-react-jsx-self": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz",
+ "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-source": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz",
+ "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ }
+ },
+ "@babel/template": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+ "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.20.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz",
+ "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+ "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@esbuild-plugins/node-globals-polyfill": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz",
+ "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==",
+ "requires": {}
+ },
+ "@esbuild/android-arm": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.0.tgz",
+ "integrity": "sha512-hlbX5ym1V5kIKvnwFhm6rhar7MNqfJrZyYTNfk6+WS1uQfQmszFgXeyPH2beP3lSCumZyqX0zMBfOqftOpZ7GA==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/android-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.0.tgz",
+ "integrity": "sha512-77GVyD7ToESy/7+9eI8z62GGBdS/hsqsrpM+JA4kascky86wHbN29EEFpkVvxajPL7k6mbLJ5VBQABdj7n9FhQ==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/android-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.0.tgz",
+ "integrity": "sha512-TroxZdZhtAz0JyD0yahtjcbKuIXrBEAoAazaYSeR2e2tUtp9uXrcbpwFJF6oxxOiOOne6y7l4hx4YVnMW/tdFw==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/darwin-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.0.tgz",
+ "integrity": "sha512-wP/v4cgdWt1m8TS/WmbaBc3NZON10eCbm6XepdVc3zJuqruHCzCKcC9dTSTEk50zX04REcRcbIbdhTMciQoFIg==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/darwin-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.0.tgz",
+ "integrity": "sha512-R4WB6D6V9KGO/3LVTT8UlwRJO26IBFatOdo/bRXksfJR0vyOi2/lgmAAMBSpgcnnwvts9QsWiyM++mTTlwRseA==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/freebsd-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.0.tgz",
+ "integrity": "sha512-FO7+UEZv79gen2df8StFYFHZPI9ADozpFepLZCxY+O8sYLDa1rirvenmLwJiOHmeQRJ5orYedFeLk1PFlZ6t8Q==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/freebsd-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.0.tgz",
+ "integrity": "sha512-qCsNRsVTaC3ekwZcb2sa7l1gwCtJK3EqCWyDgpoQocYf3lRpbAzaCvqZSF2+NOO64cV+JbedXPsFiXU1aaVcIg==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-arm": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.0.tgz",
+ "integrity": "sha512-Y2G2NU6155gcfNKvrakVmZV5xUAEhXjsN/uKtbKKRnvee0mHUuaT3OdQJDJKjHVGr6B0898pc3slRpI1PqspoQ==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.0.tgz",
+ "integrity": "sha512-js4Vlch5XJQYISbDVJd2hsI/MsfVUz6d/FrclCE73WkQmniH37vFpuQI42ntWAeBghDIfaPZ6f9GilhwGzVFUg==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-ia32": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.0.tgz",
+ "integrity": "sha512-7tl/jSPkF59R3zeFDB2/09zLGhcM7DM+tCoOqjJbQjuL6qbMWomGT2RglCqRFpCSdzBx0hukmPPgUAMlmdj0sQ==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-loong64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.0.tgz",
+ "integrity": "sha512-OG356F7dIVVF+EXJx5UfzFr1I5l6ES53GlMNSr3U1MhlaVyrP9um5PnrSJ+7TSDAzUC7YGjxb2GQWqHLd5XFoA==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-mips64el": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.0.tgz",
+ "integrity": "sha512-LWQJgGpxrjh2x08UYf6G5R+Km7zhkpCvKXtFQ6SX0fimDvy1C8kslgFHGxLS0wjGV8C4BNnENW/HNy57+RB7iA==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-ppc64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.0.tgz",
+ "integrity": "sha512-f40N8fKiTQslUcUuhof2/syOQ+DC9Mqdnm9d063pew+Ptv9r6dBNLQCz4300MOfCLAbb0SdnrcMSzHbMehXWLw==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-riscv64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.0.tgz",
+ "integrity": "sha512-sc/pvLexRvxgEbmeq7LfLGnzUBFi/E2MGbnQj3CG8tnQ90tWPTi+9CbZEgIADhj6CAlCCmqxpUclIV1CRVUOTw==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-s390x": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.0.tgz",
+ "integrity": "sha512-7xq9/kY0vunCL2vjHKdHGI+660pCdeEC6K6TWBVvbTGXvT8s/qacfxMgr8PCeQRbNUZLOA13G6/G1+c0lYXO1A==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/linux-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.0.tgz",
+ "integrity": "sha512-o7FhBLONk1mLT2ytlj/j/WuJcPdhWcVpysSJn1s9+zRdLwLKveipbPi5SIasJIqMq0T4CkQW76pxJYMqz9HrQA==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/netbsd-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.0.tgz",
+ "integrity": "sha512-V6xXsv71b8vwFCW/ky82Rs//SbyA+ORty6A7Mzkg33/4NbYZ/1Vcbk7qAN5oi0i/gS4Q0+7dYT7NqaiVZ7+Xjw==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/openbsd-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.0.tgz",
+ "integrity": "sha512-StlQor6A0Y9SSDxraytr46Qbz25zsSDmsG3MCaNkBnABKHP3QsngOCfdBikqHVVrXeK0KOTmtX92/ncTGULYgQ==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/sunos-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.0.tgz",
+ "integrity": "sha512-K64Wqw57j8KrwjR3QjsuzN/qDGK6Cno6QYtIlWAmGab5iYPBZCWz7HFtF2a86/130LmUsdXqOID7J0SmjjRFIQ==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/win32-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.0.tgz",
+ "integrity": "sha512-hly6iSWAf0hf3aHD18/qW7iFQbg9KAQ0RFGG9plcxkhL4uGw43O+lETGcSO/PylNleFowP/UztpF6U4oCYgpPw==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/win32-ia32": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.0.tgz",
+ "integrity": "sha512-aL4EWPh0nyC5uYRfn+CHkTgawd4DjtmwquthNDmGf6Ht6+mUc+bQXyZNH1QIw8x20hSqFc4Tf36aLLWP/TPR3g==",
+ "optional": true,
+ "peer": true
+ },
+ "@esbuild/win32-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.0.tgz",
+ "integrity": "sha512-W6IIQ9Rt43I/GqfXeBFLk0TvowKBoirs9sw2LPfhHax6ayMlW5PhFzSJ76I1ac9Pk/aRcSMrHWvVyZs8ZPK2wA==",
+ "optional": true,
+ "peer": true
+ },
+ "@ethereumjs/common": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.0.2.tgz",
+ "integrity": "sha512-N8fpT5uDvxOE5dIaPQZWzJaBRkRWrCXv63MONEn5ikp/J9mWFc53VUjb3GqtIYHRgg9nP81TXmtnvQJz1IuTiw==",
+ "requires": {
+ "@ethereumjs/util": "^8.0.3",
+ "crc-32": "^1.2.0"
+ }
+ },
+ "@ethereumjs/rlp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.0.tgz",
+ "integrity": "sha512-LM4jS5n33bJN60fM5EC8VeyhUgga6/DjCPBV2vWjnfVtobqtOiNC4SQ1MRFqyBSmJGGdB533JZWewyvlcdJtkQ=="
+ },
+ "@ethereumjs/tx": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.0.2.tgz",
+ "integrity": "sha512-6GoKVK3MVcAFFn4qSLIIDZ1vrKSLn7W5L80Pvae1BJFgchu+11R2iOqQyVGUSGbaXllh4xliUy/7+x5pYwRY8Q==",
+ "requires": {
+ "@ethereumjs/common": "^3.0.2",
+ "@ethereumjs/rlp": "^4.0.0",
+ "@ethereumjs/util": "^8.0.3",
+ "ethereum-cryptography": "^1.1.2",
+ "ethers": "^5.7.1"
+ }
+ },
+ "@ethereumjs/util": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.0.3.tgz",
+ "integrity": "sha512-0apCbwc8xAaie6W7q6QyogfyRS2BMU816a8KwpnpRw9Qrc6Bws+l7J3LfCLMt2iL6Wi8CYb0B29AeIr2N4vHnw==",
+ "requires": {
+ "@ethereumjs/rlp": "^4.0.0-beta.2",
+ "async": "^3.2.4",
+ "ethereum-cryptography": "^1.1.2"
+ }
+ },
+ "@ethersproject/abi": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz",
+ "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==",
+ "requires": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "@ethersproject/abstract-provider": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz",
+ "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/web": "^5.7.0"
+ }
+ },
+ "@ethersproject/abstract-signer": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz",
+ "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz",
+ "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0"
+ }
+ },
+ "@ethersproject/base64": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz",
+ "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0"
+ }
+ },
+ "@ethersproject/basex": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz",
+ "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz",
+ "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "bn.js": "^5.2.1"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz",
+ "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==",
+ "requires": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz",
+ "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.7.0"
+ }
+ },
+ "@ethersproject/contracts": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz",
+ "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==",
+ "requires": {
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz",
+ "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "@ethersproject/hdnode": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz",
+ "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/basex": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/pbkdf2": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/wordlists": "^5.7.0"
+ }
+ },
+ "@ethersproject/json-wallets": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz",
+ "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hdnode": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/pbkdf2": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "aes-js": "3.0.0",
+ "scrypt-js": "3.0.1"
+ },
+ "dependencies": {
+ "aes-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
+ "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw=="
+ }
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz",
+ "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "js-sha3": "0.8.0"
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz",
+ "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig=="
+ },
+ "@ethersproject/networks": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz",
+ "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==",
+ "requires": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "@ethersproject/pbkdf2": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz",
+ "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0"
+ }
+ },
+ "@ethersproject/properties": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz",
+ "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==",
+ "requires": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "@ethersproject/providers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz",
+ "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/basex": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/web": "^5.7.0",
+ "bech32": "1.1.4",
+ "ws": "7.4.6"
+ },
+ "dependencies": {
+ "bech32": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
+ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="
+ }
+ }
+ },
+ "@ethersproject/random": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz",
+ "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz",
+ "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "@ethersproject/sha2": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz",
+ "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz",
+ "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "bn.js": "^5.2.1",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/solidity": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz",
+ "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz",
+ "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz",
+ "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==",
+ "requires": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0"
+ }
+ },
+ "@ethersproject/units": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz",
+ "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "@ethersproject/wallet": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz",
+ "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/hdnode": "^5.7.0",
+ "@ethersproject/json-wallets": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/wordlists": "^5.7.0"
+ }
+ },
+ "@ethersproject/web": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz",
+ "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==",
+ "requires": {
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "@ethersproject/wordlists": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz",
+ "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "@noble/hashes": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz",
+ "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA=="
+ },
+ "@noble/secp256k1": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz",
+ "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ=="
+ },
+ "@scure/base": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz",
+ "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA=="
+ },
+ "@scure/bip32": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz",
+ "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==",
+ "requires": {
+ "@noble/hashes": "~1.1.1",
+ "@noble/secp256k1": "~1.6.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "@scure/bip39": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz",
+ "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==",
+ "requires": {
+ "@noble/hashes": "~1.1.1",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "@types/bn.js": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz",
+ "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/node": {
+ "version": "18.11.18",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
+ },
+ "@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
+ "dev": true
+ },
+ "@types/react": {
+ "version": "18.0.26",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz",
+ "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==",
+ "dev": true,
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.0.10",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz",
+ "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
+ "dev": true
+ },
+ "@types/secp256k1": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
+ "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@vitejs/plugin-react": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.0.tgz",
+ "integrity": "sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.20.5",
+ "@babel/plugin-transform-react-jsx-self": "^7.18.6",
+ "@babel/plugin-transform-react-jsx-source": "^7.19.6",
+ "magic-string": "^0.27.0",
+ "react-refresh": "^0.14.0"
+ }
+ },
+ "aes-js": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
+ "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "base-x": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
+ "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "bech32": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz",
+ "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="
+ },
+ "bignumber.js": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz",
+ "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig=="
+ },
+ "bitwise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/bitwise/-/bitwise-2.1.0.tgz",
+ "integrity": "sha512-XKgAhMXCh4H/3oNwAHAsAO0iC89s9cOiumgYwSHjSobGWxYjv62YhkL9QEdvGP151xypCtMlAfKK79GEcd2eRQ=="
+ },
+ "blakejs": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
+ "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="
+ },
+ "bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="
+ },
+ "borc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz",
+ "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==",
+ "requires": {
+ "bignumber.js": "^9.0.0",
+ "buffer": "^5.5.0",
+ "commander": "^2.15.0",
+ "ieee754": "^1.1.13",
+ "iso-url": "~0.4.7",
+ "json-text-sequence": "~0.1.0",
+ "readable-stream": "^3.6.0"
+ },
+ "dependencies": {
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ }
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ }
+ },
+ "bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "requires": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "requires": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001441",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
+ "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "csstype": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "delimit-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz",
+ "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ=="
+ },
+ "electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "dev": true
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "esbuild": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.0.tgz",
+ "integrity": "sha512-4yGk3rD95iS/wGzrx0Ji5czZcx1j2wvfF1iAJaX2FIYLB6sU6wYkDeplpZHzfwQw2yXGXsAoxmO6LnMQkl04Kg==",
+ "peer": true,
+ "requires": {
+ "@esbuild/android-arm": "0.17.0",
+ "@esbuild/android-arm64": "0.17.0",
+ "@esbuild/android-x64": "0.17.0",
+ "@esbuild/darwin-arm64": "0.17.0",
+ "@esbuild/darwin-x64": "0.17.0",
+ "@esbuild/freebsd-arm64": "0.17.0",
+ "@esbuild/freebsd-x64": "0.17.0",
+ "@esbuild/linux-arm": "0.17.0",
+ "@esbuild/linux-arm64": "0.17.0",
+ "@esbuild/linux-ia32": "0.17.0",
+ "@esbuild/linux-loong64": "0.17.0",
+ "@esbuild/linux-mips64el": "0.17.0",
+ "@esbuild/linux-ppc64": "0.17.0",
+ "@esbuild/linux-riscv64": "0.17.0",
+ "@esbuild/linux-s390x": "0.17.0",
+ "@esbuild/linux-x64": "0.17.0",
+ "@esbuild/netbsd-x64": "0.17.0",
+ "@esbuild/openbsd-x64": "0.17.0",
+ "@esbuild/sunos-x64": "0.17.0",
+ "@esbuild/win32-arm64": "0.17.0",
+ "@esbuild/win32-ia32": "0.17.0",
+ "@esbuild/win32-x64": "0.17.0"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "eth-eip712-util-browser": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/eth-eip712-util-browser/-/eth-eip712-util-browser-0.0.3.tgz",
+ "integrity": "sha512-RUXQ6Hjl0wEjm/ObWgYKjzMfO1segqcPFGnMPtBkkwGaHGbXXh6WFAn5vZfReK9WWujs35uIW2+kgJmh3FXtww==",
+ "requires": {
+ "bn.js": ">4.0.0",
+ "buffer": "^6.0.3",
+ "js-sha3": "^0.8.0"
+ }
+ },
+ "ethereum-cryptography": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz",
+ "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==",
+ "requires": {
+ "@noble/hashes": "1.1.2",
+ "@noble/secp256k1": "1.6.3",
+ "@scure/bip32": "1.1.0",
+ "@scure/bip39": "1.1.0"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
+ "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
+ "requires": {
+ "@types/bn.js": "^5.1.0",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "rlp": "^2.2.4"
+ },
+ "dependencies": {
+ "ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "requires": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "rlp": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
+ "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
+ "requires": {
+ "bn.js": "^5.2.0"
+ }
+ }
+ }
+ },
+ "ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "requires": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "gridplus-sdk": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/gridplus-sdk/-/gridplus-sdk-2.4.3.tgz",
+ "integrity": "sha512-LssiqmgV05ACRa5vnFSJ2WjMd+qoxyZN+OQwj2uFCRoC24wUP3pXaKOXUxHInl2HlyZk+f3nT8iQvOSWzFiZHw==",
+ "requires": {
+ "@ethereumjs/common": "2.4.0",
+ "@ethereumjs/tx": "3.3.0",
+ "@ethersproject/abi": "^5.5.0",
+ "aes-js": "^3.1.1",
+ "bech32": "^2.0.0",
+ "bignumber.js": "^9.0.1",
+ "bitwise": "^2.0.4",
+ "borc": "^2.1.2",
+ "bs58check": "^2.1.2",
+ "buffer": "^5.6.0",
+ "crc-32": "^1.2.0",
+ "elliptic": "6.5.4",
+ "eth-eip712-util-browser": "^0.0.3",
+ "hash.js": "^1.1.7",
+ "js-sha3": "^0.8.0",
+ "rlp": "^3.0.0",
+ "secp256k1": "4.0.2",
+ "uuid": "^9.0.0"
+ },
+ "dependencies": {
+ "@ethereumjs/common": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz",
+ "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==",
+ "requires": {
+ "crc-32": "^1.2.0",
+ "ethereumjs-util": "^7.1.0"
+ }
+ },
+ "@ethereumjs/tx": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz",
+ "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==",
+ "requires": {
+ "@ethereumjs/common": "^2.4.0",
+ "ethereumjs-util": "^7.1.0"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "iso-url": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz",
+ "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog=="
+ },
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-text-sequence": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz",
+ "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==",
+ "requires": {
+ "delimit-stream": "0.1.0"
+ }
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true
+ },
+ "keccak": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz",
+ "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==",
+ "requires": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ }
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true
+ },
+ "node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
+ "node-gyp-build": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
+ "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg=="
+ },
+ "node-releases": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
+ "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.4.20",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
+ "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ }
+ },
+ "react-refresh": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
+ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "rlp": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-3.0.0.tgz",
+ "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw=="
+ },
+ "rollup": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.9.0.tgz",
+ "integrity": "sha512-nGGylpmblyjTpF4lEUPgmOw6OVxRvnI6Iuuh6Lz4O/X66cVOX1XJSsqP1YamxQ+mPuFE7qJxLFDSCk8rNv5dDw==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "requires": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+ },
+ "secp256k1": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
+ "requires": {
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true
+ },
+ "typescript": {
+ "version": "4.9.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
+ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
+ "dev": true
+ },
+ "update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
+ },
+ "vite": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.3.tgz",
+ "integrity": "sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.16.3",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.20",
+ "resolve": "^1.22.1",
+ "rollup": "^3.7.0"
+ },
+ "dependencies": {
+ "@esbuild/android-arm": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.12.tgz",
+ "integrity": "sha512-CTWgMJtpCyCltrvipZrrcjjRu+rzm6pf9V8muCsJqtKujR3kPmU4ffbckvugNNaRmhxAF1ZI3J+0FUIFLFg8KA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.12.tgz",
+ "integrity": "sha512-0LacmiIW+X0/LOLMZqYtZ7d4uY9fxYABAYhSSOu+OGQVBqH4N5eIYgkT7bBFnR4Nm3qo6qS3RpHKVrDASqj/uQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.12.tgz",
+ "integrity": "sha512-sS5CR3XBKQXYpSGMM28VuiUnbX83Z+aWPZzClW+OB2JquKqxoiwdqucJ5qvXS8pM6Up3RtJfDnRQZkz3en2z5g==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.12.tgz",
+ "integrity": "sha512-Dpe5hOAQiQRH20YkFAg+wOpcd4PEuXud+aGgKBQa/VriPJA8zuVlgCOSTwna1CgYl05lf6o5els4dtuyk1qJxQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.12.tgz",
+ "integrity": "sha512-ApGRA6X5txIcxV0095X4e4KKv87HAEXfuDRcGTniDWUUN+qPia8sl/BqG/0IomytQWajnUn4C7TOwHduk/FXBQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.12.tgz",
+ "integrity": "sha512-AMdK2gA9EU83ccXCWS1B/KcWYZCj4P3vDofZZkl/F/sBv/fphi2oUqUTox/g5GMcIxk8CF1CVYTC82+iBSyiUg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.12.tgz",
+ "integrity": "sha512-KUKB9w8G/xaAbD39t6gnRBuhQ8vIYYlxGT2I+mT6UGRnCGRr1+ePFIGBQmf5V16nxylgUuuWVW1zU2ktKkf6WQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.12.tgz",
+ "integrity": "sha512-vhDdIv6z4eL0FJyNVfdr3C/vdd/Wc6h1683GJsFoJzfKb92dU/v88FhWdigg0i6+3TsbSDeWbsPUXb4dif2abg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.12.tgz",
+ "integrity": "sha512-29HXMLpLklDfmw7T2buGqq3HImSUaZ1ArmrPOMaNiZZQptOSZs32SQtOHEl8xWX5vfdwZqrBfNf8Te4nArVzKQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ia32": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.12.tgz",
+ "integrity": "sha512-JFDuNDTTfgD1LJg7wHA42o2uAO/9VzHYK0leAVnCQE/FdMB599YMH73ux+nS0xGr79pv/BK+hrmdRin3iLgQjg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-loong64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.12.tgz",
+ "integrity": "sha512-xTGzVPqm6WKfCC0iuj1fryIWr1NWEM8DMhAIo+4rFgUtwy/lfHl+Obvus4oddzRDbBetLLmojfVZGmt/g/g+Rw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-mips64el": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.12.tgz",
+ "integrity": "sha512-zI1cNgHa3Gol+vPYjIYHzKhU6qMyOQrvZ82REr5Fv7rlh5PG6SkkuCoH7IryPqR+BK2c/7oISGsvPJPGnO2bHQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ppc64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.12.tgz",
+ "integrity": "sha512-/C8OFXExoMmvTDIOAM54AhtmmuDHKoedUd0Otpfw3+AuuVGemA1nQK99oN909uZbLEU6Bi+7JheFMG3xGfZluQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-riscv64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.12.tgz",
+ "integrity": "sha512-qeouyyc8kAGV6Ni6Isz8hUsKMr00EHgVwUKWNp1r4l88fHEoNTDB8mmestvykW6MrstoGI7g2EAsgr0nxmuGYg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-s390x": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.12.tgz",
+ "integrity": "sha512-s9AyI/5vz1U4NNqnacEGFElqwnHusWa81pskAf8JNDM2eb6b2E6PpBmT8RzeZv6/TxE6/TADn2g9bb0jOUmXwQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.12.tgz",
+ "integrity": "sha512-e8YA7GQGLWhvakBecLptUiKxOk4E/EPtSckS1i0MGYctW8ouvNUoh7xnU15PGO2jz7BYl8q1R6g0gE5HFtzpqQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/netbsd-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.12.tgz",
+ "integrity": "sha512-z2+kUxmOqBS+6SRVd57iOLIHE8oGOoEnGVAmwjm2aENSP35HPS+5cK+FL1l+rhrsJOFIPrNHqDUNechpuG96Sg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/openbsd-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.12.tgz",
+ "integrity": "sha512-PAonw4LqIybwn2/vJujhbg1N9W2W8lw9RtXIvvZoyzoA/4rA4CpiuahVbASmQohiytRsixbNoIOUSjRygKXpyA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/sunos-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.12.tgz",
+ "integrity": "sha512-+wr1tkt1RERi+Zi/iQtkzmMH4nS8+7UIRxjcyRz7lur84wCkAITT50Olq/HiT4JN2X2bjtlOV6vt7ptW5Gw60Q==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-arm64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.12.tgz",
+ "integrity": "sha512-XEjeUSHmjsAOJk8+pXJu9pFY2O5KKQbHXZWQylJzQuIBeiGrpMeq9sTVrHefHxMOyxUgoKQTcaTS+VK/K5SviA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-ia32": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.12.tgz",
+ "integrity": "sha512-eRKPM7e0IecUAUYr2alW7JGDejrFJXmpjt4MlfonmQ5Rz9HWpKFGCjuuIRgKO7W9C/CWVFXdJ2GjddsBXqQI4A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-x64": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.12.tgz",
+ "integrity": "sha512-iPYKN78t3op2+erv2frW568j1q0RpqX6JOLZ7oPPaAV1VaF7dDstOrNw37PVOYoTWE11pV4A1XUitpdEFNIsPg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild": {
+ "version": "0.16.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.12.tgz",
+ "integrity": "sha512-eq5KcuXajf2OmivCl4e89AD3j8fbV+UTE9vczEzq5haA07U9oOTzBWlh3+6ZdjJR7Rz2QfWZ2uxZyhZxBgJ4+g==",
+ "dev": true,
+ "requires": {
+ "@esbuild/android-arm": "0.16.12",
+ "@esbuild/android-arm64": "0.16.12",
+ "@esbuild/android-x64": "0.16.12",
+ "@esbuild/darwin-arm64": "0.16.12",
+ "@esbuild/darwin-x64": "0.16.12",
+ "@esbuild/freebsd-arm64": "0.16.12",
+ "@esbuild/freebsd-x64": "0.16.12",
+ "@esbuild/linux-arm": "0.16.12",
+ "@esbuild/linux-arm64": "0.16.12",
+ "@esbuild/linux-ia32": "0.16.12",
+ "@esbuild/linux-loong64": "0.16.12",
+ "@esbuild/linux-mips64el": "0.16.12",
+ "@esbuild/linux-ppc64": "0.16.12",
+ "@esbuild/linux-riscv64": "0.16.12",
+ "@esbuild/linux-s390x": "0.16.12",
+ "@esbuild/linux-x64": "0.16.12",
+ "@esbuild/netbsd-x64": "0.16.12",
+ "@esbuild/openbsd-x64": "0.16.12",
+ "@esbuild/sunos-x64": "0.16.12",
+ "@esbuild/win32-arm64": "0.16.12",
+ "@esbuild/win32-ia32": "0.16.12",
+ "@esbuild/win32-x64": "0.16.12"
+ }
+ }
+ }
+ },
+ "ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "requires": {}
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ }
+ }
+}
diff --git a/example/package.json b/example/package.json
new file mode 100644
index 00000000..eaac56ed
--- /dev/null
+++ b/example/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "example",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@esbuild-plugins/node-globals-polyfill": "^0.1.1",
+ "@ethereumjs/common": "^3.0.2",
+ "@ethereumjs/tx": "^4.0.2",
+ "buffer": "^6.0.3",
+ "gridplus-sdk": "^2.4.3",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@vitejs/plugin-react": "^3.0.0",
+ "typescript": "^4.9.3",
+ "vite": "^4.0.0"
+ }
+}
diff --git a/example/public/vite.svg b/example/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/example/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/example/src/App.css b/example/src/App.css
new file mode 100644
index 00000000..e69de29b
diff --git a/example/src/App.tsx b/example/src/App.tsx
new file mode 100644
index 00000000..cd6bd031
--- /dev/null
+++ b/example/src/App.tsx
@@ -0,0 +1,97 @@
+import { useEffect, useState } from 'react';
+import { getClient, pair, setup } from '../../src/api/index';
+import './App.css';
+import { Lattice } from './Lattice';
+
+function App() {
+ const [label, setLabel] = useState('No Device');
+
+ const getStoredClient = () =>
+ window.localStorage.getItem('storedClient') || '';
+
+ const setStoredClient = (storedClient: string | null) => {
+ if (!storedClient) return;
+ window.localStorage.setItem('storedClient', storedClient);
+
+ const client = getClient();
+ setLabel(client?.getDeviceId() || 'No Device');
+ };
+
+ useEffect(() => {
+ if (getStoredClient()) {
+ setup({ getStoredClient, setStoredClient });
+ }
+ }, []);
+
+ const submitInit = (e: any) => {
+ e.preventDefault();
+ const deviceId = e.currentTarget[0].value;
+ const password = e.currentTarget[1].value;
+ const name = e.currentTarget[2].value;
+ setup({
+ deviceId,
+ password,
+ name,
+ getStoredClient,
+ setStoredClient,
+ });
+ };
+
+ const submitPair = (e: React.FormEvent) => {
+ e.preventDefault();
+ // @ts-expect-error - bad html types
+ const pairingCode = e.currentTarget[0].value.toUpperCase();
+ pair(pairingCode);
+ };
+
+ return (
+
+ );
+}
+
+export default App;
diff --git a/example/src/Button.tsx b/example/src/Button.tsx
new file mode 100644
index 00000000..86f16bc0
--- /dev/null
+++ b/example/src/Button.tsx
@@ -0,0 +1,15 @@
+import { useState } from 'react';
+
+export const Button = ({ onClick, children }) => {
+ const [isLoading, setIsLoading] = useState(false);
+
+ const handleOnClick = () => {
+ setIsLoading(true);
+ onClick().finally(() => setIsLoading(false));
+ };
+ return (
+
+ );
+};
diff --git a/example/src/Lattice.tsx b/example/src/Lattice.tsx
new file mode 100644
index 00000000..842067da
--- /dev/null
+++ b/example/src/Lattice.tsx
@@ -0,0 +1,126 @@
+import { Chain, Common, Hardfork } from '@ethereumjs/common';
+import { TransactionFactory } from '@ethereumjs/tx';
+import { useState } from 'react';
+import {
+ addAddressTags,
+ fetchAddresses,
+ fetchAddressTags,
+ fetchLedgerLiveAddresses,
+ removeAddressTags,
+ sign,
+ signMessage,
+} from '../../src/api';
+import { Button } from './Button';
+
+export const Lattice = ({ label }) => {
+ const [addresses, setAddresses] = useState([]);
+ const [addressTags, setAddressTags] = useState<{ id: string }[]>([]);
+ const [ledgerAddresses, setLedgerAddresses] = useState([]);
+
+ const getTxPayload = () => {
+ const txData = {
+ type: 1,
+ maxFeePerGas: 1200000000,
+ maxPriorityFeePerGas: 1200000000,
+ nonce: 0,
+ gasLimit: 50000,
+ to: '0xe242e54155b1abc71fc118065270cecaaf8b7768',
+ value: 1000000000000,
+ data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8',
+ gasPrice: 1200000000,
+ };
+ const common = new Common({
+ chain: Chain.Mainnet,
+ hardfork: Hardfork.London,
+ });
+ const tx = TransactionFactory.fromTxData(txData, { common });
+ const payload = tx.getMessageToSign(false);
+ return payload;
+ };
+
+ return (
+
+
{label}
+
+
+
+
+
Addresses
+
+ {addresses?.map((address) => (
+ - {address}
+ ))}
+
+
+
+
+
+
+
+
Address Tags
+
+ {addressTags?.map((tag: any) => (
+ -
+ {tag.key}: {tag.val}
+
+ ))}
+
+
+
+
+
Ledger Addresses
+
+ {ledgerAddresses?.map((ledgerAddress: any) => (
+ - {ledgerAddress}
+ ))}
+
+
+
+
+ );
+};
diff --git a/example/src/index.css b/example/src/index.css
new file mode 100644
index 00000000..c6ec5363
--- /dev/null
+++ b/example/src/index.css
@@ -0,0 +1,73 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+ margin-top: 10px;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+input {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ margin-top: 15px;
+ font-size: 16px;
+ padding: 0.6em;
+}
diff --git a/example/src/main.tsx b/example/src/main.tsx
new file mode 100644
index 00000000..5549107e
--- /dev/null
+++ b/example/src/main.tsx
@@ -0,0 +1,10 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import App from './App';
+import './index.css';
+
+ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
+
+
+ ,
+);
diff --git a/example/src/vite-env.d.ts b/example/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/example/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/example/tsconfig.json b/example/tsconfig.json
new file mode 100644
index 00000000..145731c9
--- /dev/null
+++ b/example/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "allowJs": false,
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": false,
+ "forceConsistentCasingInFileNames": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "noEmit": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "target": "ESNext",
+ "useDefineForClassFields": true
+ },
+ "include": ["src"]
+}
diff --git a/example/vite.config.ts b/example/vite.config.ts
new file mode 100644
index 00000000..627a3196
--- /dev/null
+++ b/example/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+});
diff --git a/package-lock.json b/package-lock.json
index 03386631..5a18da02 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,18 +1,19 @@
{
"name": "gridplus-sdk",
- "version": "2.4.3",
+ "version": "2.5.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "gridplus-sdk",
- "version": "2.4.3",
+ "version": "2.5.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@ethereumjs/common": "2.4.0",
"@ethereumjs/tx": "3.3.0",
"@ethersproject/abi": "^5.5.0",
+ "@types/uuid": "^9.0.0",
"aes-js": "^3.1.1",
"bech32": "^2.0.0",
"bignumber.js": "^9.0.1",
@@ -3050,6 +3051,11 @@
"integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
"dev": true
},
+ "node_modules/@types/uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q=="
+ },
"node_modules/@types/ws": {
"version": "7.4.7",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz",
@@ -11977,6 +11983,11 @@
"integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
"dev": true
},
+ "@types/uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q=="
+ },
"@types/ws": {
"version": "7.4.7",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz",
diff --git a/package.json b/package.json
index 508adbea..4630ecbb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gridplus-sdk",
- "version": "2.4.3",
+ "version": "2.5.0",
"description": "SDK to interact with GridPlus Lattice1 device",
"scripts": {
"build": "NODE_ENV=production tsc -p tsconfig.json",
@@ -13,9 +13,7 @@
"test": "vitest /src/__test__/unit /src/__test__/integration",
"test-unit": "vitest src/__test__/unit",
"unit-decode": "vitest src/__test__/unit/decoders.test.ts",
- "unit-decrypt": "vitest src/__test__/unit/decrypters.test.ts",
"unit-encode": "vitest src/__test__/unit/encoders.test.ts",
- "unit-encrypt": "vitest src/__test__/unit/encrypters.test.ts",
"unit-validators": "vitest src/__test__/unit/validators.test.ts",
"test-int": "vitest src/__test__/integration/",
"test-utils": "vitest src/__test__/utils/__test__/",
@@ -32,7 +30,8 @@
"e2e-sign-evm-tx": "vitest src/__test__/e2e/signing/evm-tx.test.ts",
"e2e-sign-solana": "vitest src/__test__/e2e/signing/solana*",
"e2e-sign-unformatted": "vitest src/__test__/e2e/signing/unformatted.test.ts",
- "e2e-wj": "vitest src/__test__/e2e/wallet-jobs.test.ts"
+ "e2e-wj": "vitest src/__test__/e2e/wallet-jobs.test.ts",
+ "e2e-api": "vitest src/__test__/e2e/api.test.ts"
},
"files": [
"dist"
@@ -47,6 +46,7 @@
"@ethereumjs/common": "2.4.0",
"@ethereumjs/tx": "3.3.0",
"@ethersproject/abi": "^5.5.0",
+ "@types/uuid": "^9.0.0",
"aes-js": "^3.1.1",
"bech32": "^2.0.0",
"bignumber.js": "^9.0.1",
@@ -109,4 +109,4 @@
"vitest": "^0.15.2"
},
"license": "MIT"
-}
\ No newline at end of file
+}
diff --git a/src/__test__/e2e/api.test.ts b/src/__test__/e2e/api.test.ts
new file mode 100644
index 00000000..df1c9def
--- /dev/null
+++ b/src/__test__/e2e/api.test.ts
@@ -0,0 +1,171 @@
+import { getClient } from './../../api/utilities';
+import Common, { Chain, Hardfork } from '@ethereumjs/common';
+import { TransactionFactory } from '@ethereumjs/tx';
+import { question } from 'readline-sync';
+import { encode } from 'rlp';
+import {
+ fetchActiveWallets,
+ fetchAddresses,
+ pair,
+ signBtcLegacyTx,
+ signBtcSegwitTx,
+ signBtcWrappedSegwitTx,
+ signMessage,
+} from '../../api';
+import { HARDENED_OFFSET } from '../../constants';
+import { BTC_PURPOSE_P2SH_P2WPKH, BTC_TESTNET_COIN } from '../utils/helpers';
+import { dexlabProgram } from './signing/__mocks__/programs';
+import {
+ addAddressTags,
+ fetchAddressTags,
+ fetchLedgerLiveAddresses,
+ removeAddressTags,
+ sign,
+ signSolanaTx,
+} from '../../api/index';
+import { setupClient } from '../utils/setup';
+import { buildRandomMsg } from '../utils/builders';
+
+describe('API', () => {
+ test('pair', async () => {
+ const isPaired = await setupClient();
+ if (!isPaired) {
+ const secret = question('Please enter the pairing secret: ');
+ await pair(secret.toUpperCase());
+ }
+ });
+
+ describe('signing', () => {
+ describe('bitcoin', () => {
+ const btcTxData = {
+ prevOuts: [
+ {
+ txHash:
+ '6e78493091f80d89a92ae3152df7fbfbdc44df09cf01a9b76c5113c02eaf2e0f',
+ value: 10000,
+ index: 1,
+ signerPath: [
+ BTC_PURPOSE_P2SH_P2WPKH,
+ BTC_TESTNET_COIN,
+ HARDENED_OFFSET,
+ 0,
+ 0,
+ ],
+ },
+ ],
+ recipient: 'mhifA1DwiMPHTjSJM8FFSL8ibrzWaBCkVT',
+ value: 1000,
+ fee: 1000,
+ changePath: [
+ BTC_PURPOSE_P2SH_P2WPKH,
+ BTC_TESTNET_COIN,
+ HARDENED_OFFSET,
+ 1,
+ 0,
+ ],
+ };
+ test('legacy', async () => {
+ await signBtcLegacyTx(btcTxData);
+ });
+
+ test('segwit', async () => {
+ await signBtcSegwitTx(btcTxData);
+ });
+
+ test('wrapped segwit', async () => {
+ await signBtcWrappedSegwitTx(btcTxData);
+ });
+ });
+
+ describe('ethereum', () => {
+ describe('messages', () => {
+ test('signPersonal', async () => {
+ await signMessage('test message');
+ });
+
+ test('eip712', async () => {
+ await signMessage(buildRandomMsg('eip712', getClient()));
+ });
+ });
+
+ describe('transactions', () => {
+ const txData = {
+ type: 1,
+ maxFeePerGas: 1200000000,
+ maxPriorityFeePerGas: 1200000000,
+ nonce: 0,
+ gasLimit: 50000,
+ to: '0xe242e54155b1abc71fc118065270cecaaf8b7768',
+ value: 1000000000000,
+ data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8',
+ gasPrice: 1200000000,
+ };
+
+ test('generic', async () => {
+ const common = new Common({
+ chain: Chain.Mainnet,
+ hardfork: Hardfork.London,
+ });
+ const tx = TransactionFactory.fromTxData(txData, { common });
+ const payload = tx.getMessageToSign(false);
+
+ await sign(payload);
+ });
+
+ test('legacy', async () => {
+ const rawTx = encode([
+ txData.nonce,
+ txData.gasPrice,
+ txData.gasLimit,
+ txData.to,
+ txData.value,
+ txData.data,
+ ]);
+ await sign(rawTx);
+ });
+ });
+ });
+
+ describe('solana', () => {
+ test('sign solana', async () => {
+ await signSolanaTx(dexlabProgram);
+ });
+ });
+ });
+
+ describe('address tags', () => {
+ test('addAddressTags', async () => {
+ await addAddressTags([{ test: 'test' }]);
+ });
+
+ test('fetchAddressTags', async () => {
+ const addressTags = await fetchAddressTags();
+ expect(addressTags.some((tag) => tag.key === 'test')).toBeTruthy();
+ });
+
+ test('removeAddressTags', async () => {
+ const addressTags = await fetchAddressTags();
+ await removeAddressTags(addressTags);
+ expect(await fetchAddressTags()).toHaveLength(0);
+ });
+ });
+
+ describe('addresses', () => {
+ test('fetchAddresses', async () => {
+ const addresses = await fetchAddresses();
+ expect(addresses).toHaveLength(10);
+ });
+
+ test('fetchLedgerLiveAddresses', async () => {
+ const addresses = await fetchLedgerLiveAddresses();
+ expect(addresses).toHaveLength(10);
+ });
+ });
+
+ describe('fetchActiveWallet', () => {
+ test('fetchActiveWallet', async () => {
+ const wallet = await fetchActiveWallets();
+ expect(wallet).toBeTruthy();
+ });
+ });
+});
diff --git a/src/__test__/e2e/eth.msg.test.ts b/src/__test__/e2e/eth.msg.test.ts
index 1f5be66b..b13789cf 100644
--- a/src/__test__/e2e/eth.msg.test.ts
+++ b/src/__test__/e2e/eth.msg.test.ts
@@ -98,7 +98,7 @@ describe('ETH Messages', () => {
// Using a zero length payload should auto-reject
await expect(
client.sign(buildEthMsgReq(zeroInvalid, protocol)),
- ).rejects.toThrow(/Invalid request/);
+ ).rejects.toThrow(/Invalid Request/);
});
describe(`Test ${numRandom} random payloads`, () => {
diff --git a/src/__test__/e2e/general.test.ts b/src/__test__/e2e/general.test.ts
index f85c1aeb..c1c2cf2e 100644
--- a/src/__test__/e2e/general.test.ts
+++ b/src/__test__/e2e/general.test.ts
@@ -20,9 +20,9 @@ import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx';
import { question } from 'readline-sync';
import {
HARDENED_OFFSET,
- responseCodes,
- responseMsgs,
+ LatticeResponseCode,
} from '../../constants';
+import { ProtocolConstants, LatticeResponseCode } from '../../protocol';
import { randomBytes } from '../../util';
import { buildEthSignRequest } from '../utils/builders';
import { getDeviceId } from '../utils/getters';
@@ -153,6 +153,7 @@ describe('General', () => {
const { req } = await buildEthSignRequest(client);
await client.sign(req);
});
+
it('should sign newer transactions', async () => {
const { txData, req, common } = await buildEthSignRequest(
client,
@@ -184,9 +185,10 @@ describe('General', () => {
const tx = EthTxFactory.fromTxData(txData, { common });
req.data.payload = tx.getMessageToSign(false);
await expect(client.sign(req)).rejects.toThrow(
- `${responseMsgs[responseCodes.RESP_ERR_USER_DECLINED]}`,
+ `${ProtocolConstants.responseMsg[LatticeResponseCode.userDeclined]}`,
);
});
+
});
describe('Should sign Bitcoin transactions', () => {
@@ -346,4 +348,5 @@ describe('General', () => {
expect(sigResp.changeRecipient?.slice(0, 2)).toEqual('tb');
});
});
+
});
diff --git a/src/__test__/e2e/kv.test.ts b/src/__test__/e2e/kv.test.ts
index 2abdddc1..d77bc1a9 100644
--- a/src/__test__/e2e/kv.test.ts
+++ b/src/__test__/e2e/kv.test.ts
@@ -5,15 +5,11 @@ import { DEFAULT_SIGNER } from '../utils/builders';
* at the time of writing is address tags.
*/
import { question } from 'readline-sync';
-import {
- HARDENED_OFFSET,
- responseCodes,
- responseMsgs
-} from '../../constants';
+import { HARDENED_OFFSET } from '../../constants';
+import { ProtocolConstants, LatticeResponseCode } from '../../protocol';
import { BTC_PURPOSE_P2PKH, ETH_COIN } from '../utils/helpers';
import { initializeClient } from '../utils/initializeClient';
-
// Random address to test the screen with.
// IMPORTANT NOTE: For Ethereum addresses you should always add the lower case variety since
// requests come in at lower case
@@ -72,7 +68,7 @@ describe('key-value', () => {
it('Should make a request to an unknown address', async () => {
await client.sign(ETH_REQ).catch((err) => {
expect(err.message).toContain(
- responseMsgs[responseCodes.RESP_ERR_USER_DECLINED],
+ ProtocolConstants.responseMsg[LatticeResponseCode.userDeclined],
);
});
});
@@ -211,7 +207,7 @@ describe('key-value', () => {
it('Should make another request to make sure case sensitivity is enforced', async () => {
await client.sign(ETH_REQ).catch((err) => {
expect(err.message).toContain(
- responseMsgs[responseCodes.RESP_ERR_USER_DECLINED],
+ ProtocolConstants.responseMsg[LatticeResponseCode.userDeclined],
);
});
});
diff --git a/src/__test__/e2e/signing/bls.test.ts b/src/__test__/e2e/signing/bls.test.ts
index 637f9054..b3d051db 100644
--- a/src/__test__/e2e/signing/bls.test.ts
+++ b/src/__test__/e2e/signing/bls.test.ts
@@ -17,8 +17,6 @@ import {
import { getPublicKey, sign } from '@noble/bls12-381';
import { mnemonicToSeedSync } from 'bip39';
import { deriveSeedTree } from 'bls12-381-keygen';
-import { readFileSync } from 'fs';
-import { jsonc } from 'jsonc';
import { question } from 'readline-sync';
import { getEncPw } from '../../utils/getters';
@@ -30,7 +28,8 @@ import {
buildPath,
copyBuffer,
getCodeMsg,
- gpErrors,
+ gpErrors,
+ getTestVectors,
jobTypes,
parseWalletJobResp,
serializeJobData
@@ -39,9 +38,7 @@ import { testRequest } from '../../utils/testRequest';
import { Constants } from '../../../index';
import { getPathStr } from '../../../shared/utilities';
-const globalVectors = jsonc.parse(
- readFileSync(`${process.cwd()}/src/__test__/vectors.jsonc`).toString(),
-);
+const globalVectors = getTestVectors();
let client, origWalletSeed, encPw;
const DEPOSIT_PATH = [ 12381, 3600, 0, 0, 0];
@@ -117,6 +114,7 @@ describe('[BLS keys]', () => {
await removeSeed(client);
await loadSeed(client, origWalletSeed);
})
+
})
//=========================================================
diff --git a/src/__test__/e2e/signing/evm-abi.test.ts b/src/__test__/e2e/signing/evm-abi.test.ts
index 7600b5e2..67db3fd2 100644
--- a/src/__test__/e2e/signing/evm-abi.test.ts
+++ b/src/__test__/e2e/signing/evm-abi.test.ts
@@ -6,18 +6,15 @@ This includes:
You must have `FEATURE_TEST_RUNNER=1` enabled in firmware to run these tests.
*/
-import { readFileSync } from 'fs';
-import { jsonc } from 'jsonc';
import { NETWORKS_BY_CHAIN_ID} from '../../../constants'
import { fetchCalldataDecoder } from '../../../util';
+import { getTestVectors } from '../../utils/helpers';
import { buildEncDefs, buildEvmReq, DEFAULT_SIGNER } from '../../utils/builders';
import { getEtherscanKey } from '../../utils/getters';
import { runEvm } from '../../utils/runners';
import { initializeClient, initializeSeed } from '../../utils/initializeClient';
-const globalVectors = jsonc.parse(
- readFileSync(`${process.cwd()}/src/__test__/vectors.jsonc`).toString(),
-);
+const globalVectors = getTestVectors();
const vectors = globalVectors.evm.calldata;
//---------------------------------------
diff --git a/src/__test__/unit/__mocks__/decoderData.ts b/src/__test__/unit/__mocks__/decoderData.ts
index 60ca4c75..eaa70833 100644
--- a/src/__test__/unit/__mocks__/decoderData.ts
+++ b/src/__test__/unit/__mocks__/decoderData.ts
@@ -1,24 +1,105 @@
-export const connectDecryptedData = Buffer.from(
- '01049d09fb09e26afddbcd280f4ccb1e01aa5ae24015f89df2ccf6923915c0bf2537e3698946cdba580d492123a00bcb990b2bd53bf943737d1ec69f80ee94a6716a000f000086b7008c4e03f1e9faacb3e26c363a517248536eea190f22db2147249b38bb3b23ab8a68fb93fa4ebf1d23bc21b49c071631ca8be1085a096bbc3b3c6e483ba4f0a76ba4039938aeadcfe3581aa7097c8e20d6e3976b6522033978d0bdb6f39503024a84915178737c08e8704d83eba012d61c8e761d83767f6a92f4157a4b370622b625d4c47495e8fb22fd68e68055',
- 'hex',
+/**
+ * These constants were generated from the response data of real e2e tests.
+ * For encrypted requests, the results are decrypted.
+ * For each response, the response code and checksum are removed.
+ */
+import {
+ LatticeGetAddressesFlag,
+ LatticeEncDataSchema
+} from '../../../protocol';
+import {
+ getP256KeyPair
+} from '../../../util';
+
+export const clientKeyPair = getP256KeyPair(
+ Buffer.from('3fb53b677f73e4d2b8c89c303f6f6b349f0075ad88ea126cb9f6632085815dca', 'hex')
+)
+
+export const decoderTestsFwConstants = JSON.parse(
+ '{"extraDataFrameSz":1500,"extraDataMaxFrames":1,"genericSigning":{"baseReqSz":1552,"baseDataSz":1519,"hashTypes":{"NONE":0,"KECCAK256":1,"SHA256":2},"curveTypes":{"SECP256K1":0,"ED25519":1,"BLS12_381_G2":2},"encodingTypes":{"NONE":1,"SOLANA":2,"EVM":4,"ETH_DEPOSIT":5},"calldataDecoding":{"reserved":2895728,"maxSz":1024}},"reqMaxDataSz":1678,"ethMaxGasPrice":20000000000000,"addrFlagsAllowed":true,"ethMaxDataSz":1519,"ethMaxMsgSz":1540,"eip712MaxTypeParams":36,"varAddrPathSzAllowed":true,"eip712Supported":true,"prehashAllowed":true,"ethMsgPreHashAllowed":true,"allowedEthTxTypes":[1,2],"personalSignHeaderSz":72,"kvActionsAllowed":true,"kvKeyMaxStrSz":63,"kvValMaxStrSz":63,"kvActionMaxNum":10,"kvRemoveMaxNum":100,"allowBtcLegacyAndSegwitAddrs":true,"contractDeployKey":"0x08002e0fec8e6acf00835f43c9764f7364fa3f42","abiCategorySz":32,"abiMaxRmv":200,"getAddressFlags":[4,3,5],"maxDecoderBufSz":1600}'
);
-export const fetchActiveWalletDecryptedData = Buffer.from(
- '04908babf748e922906794d87371a3796d3a612a84a99edb4bb09e2648c1f48301032c0f0b00989c1f35038d8f146bbf35629274792c588cc4062947d80dec621430d394a771c122ce35f7878bf6810567ef679947dd537df3621f271297adcba8000000014c6f7374206469676974616c2d676f6c64206f66205361746f736869000000000000002d337479d775a93e2f67533de0dccedc52f3d2080cd3b1fd01cada670ea6f718000000014c6f7374206469676974616c2d676f6c64206f66205361746f736869000000000000005bfbdb8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
- 'hex',
+export const connectDecoderData = Buffer.from(
+ '0104de558941cc182423e1fa6b0ee81b2c17c6203d0c2897929f900480a8b879261993500d7c0bb5b80f75e2ca462681fcaa20d0261775d3204c6ee461c9250ee1d60011000022cfce60cc7995770a9d2c5080351ae2068c71cecb766de54c65053f5662337809baf7d9ddaaafca95180611fb37601c8eebc1d9f967c061edee1511309a70fbe2491a266f84dc5d1c868b6e129170fa3b777ebd9af7c047fd6dff2a8a563cf6b8ea8c6157b33bc5a0614c65369ffc3c4d35537f37f197f9bae12c574b9847174e38c41b0302833ebbd2101237703794',
+ 'hex'
);
-export const signEthDecryptedData = Buffer.from(
- '04f6c6b42df23d098fb0e2af81922d6f4968b5030b6942aaf01a7910415e34dc6def6a4c3a3ef6661c54b6c4c82f0283119d2fbd8eed6e650e8852249d28bb2d600494b250f26efd7108555b26e5f898836479c1121c5a03c3b68e0843ad21a82d22ca3d4aee14264c050c80963183045317927d94c3c330ec6fb254a3f1a6c057b4304402207276976e6110ba46c4c08bb33ec06cc873a9bab060b849af0a6ac218004e925d022020b26a10ae192589cc45030feddf1f7abdebf6026a35912f125c138c1b78ce4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b15940e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
- 'hex',
+export const getAddressesFlag = LatticeGetAddressesFlag.none;
+export const getAddressesDecoderData = Buffer.from(
+ '334d32465857534a7569584d4d79737179534d52566e4d655935335141545a664459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033435757456366725447394441336648376955714562506b6d504c6b5a396d416838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033384b734472704a3556524553516150364163785072704875554a6d5270397a646800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003351665444387372784a636742685958667557443555505955375146616258476733000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033426a685344394a386b50553648346b52475071614d5a58485a4134726f447a344c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
+ 'hex'
);
-export const signEthMsgDecryptedData = Buffer.from(
- '04372ed70d4105e57d20bb5b337ba8efc782e3bf9b7f706baaa9b4fb26e42b8a639e0591134c6b1e97643b294a278833b4365b4c4e6dbb0c1415560baddc62559f304402207db9e97fa8a2de98835bd320dc2a77fbbe1babe60f67cb405d0ba25c9d49ff3d02206fc01778bea900509bad56d262a7c7546d3cb2fb6d5a1236bb012cf68ea666410000000086060bb25df7b65f5153988840f88c13eed3a18b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa7cba450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
- 'hex',
+export const signGenericRequest = {
+ payload: Buffer.from(
+ '040000000100050000002c0000803c000080000000800000000000000000004e0001f84b01808447868c0082c35094e242e54155b1abc71fc118065270cecaaf8b776885e8d4a51000a417e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
+ 'hex'
+ ),
+ extraDataPayloads: [],
+ schema: 5,
+ curveType: 0,
+ encodingType: 4,
+ hashType: 1,
+ omitPubkey: false,
+ origPayloadBuf: Buffer.from(
+ '01f84b01808447868c0082c35094e242e54155b1abc71fc118065270cecaaf8b776885e8d4a51000a417e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8c0',
+ 'hex'
+ )
+};
+export const signGenericDecoderData = Buffer.from(
+ '04a50d7d8e5bf6353086dfaff71652a223aa13e02273a2b6bf5a145314b544be1281ac8f78d035874a06b11e3df68e45f7630b2e6ba3be0f51f916fbb6f0a6403930440220640b2c690858ab8d0b9500f9ed64c9aa6b7467b77f1199b061aa96ea780aadaa022048f830f9290dd1b3eaf1922e08a8c992873be1162bd6d5bef681cf911328abe500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
+ 'hex'
);
-export const getKvRecordsDecryptedData = Buffer.from(
- '04738154da07d35484f754e81d1782d1c71bd4eeeffed486c00af15b8a9c3b227a7eb7e89e1afc3e1e0826f22f6d562f97513df0e29fd6b38f6ecc5ab840304e320000000101340db5d6000000000005746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574657374000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000207257d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
- 'hex',
-);
\ No newline at end of file
+export const signBitcoinRequest = {
+ schema: 0,
+ // NOTE: This data was tricky to fetch because JSON stringify and buffers don't match well
+ origData: {
+ prevOuts: [
+ {
+ txHash: Buffer.from('b2efdbdd3340d2bc547671ce3993a6f05d70343c07578f9d7f5626fdfc06fa35', 'hex'),
+ value: 76800,
+ index: 0,
+ signerPath: [2147483732,2147483649,2147483648,0,0]
+ },
+ ],
+ recipient: '2N4gqWT4oqWL2gz9ps92z9fm2Bg3FUkqG7Q',
+ value: 70000,
+ fee: 4380,
+ isSegwit: true,
+ changePath: [ 2147483732, 2147483649, 2147483648, 1, 0 ],
+ fwConstants: decoderTestsFwConstants,
+ },
+ changeData: { value: 2420 },
+ payload: Buffer.from(
+ 'f00500000054000080010000800000008001000000000000001c110000c47d816ef0a39d6497963ebcf24d05242d51ada74370110100000000000105000000540000800100008000000080000000000000000000000000002c01000000000004b2efdbdd3340d2bc547671ce3993a6f05d70343c07578f9d7f5626fdfc06fa35',
+ 'hex'
+ ),
+}
+
+export const signBitcoinDecoderData = Buffer.from(
+ '6bb07ddb748b655c8478581af3e128335c16eca0304502210084e356184a7dc1e05a08808cb6da03f9e5d1c37be0f382a761eac2a266a4737f0220172d99b82cf78bf5bb4299e4e663f13e1e4578d144ffeabc474631fb1ac1a4fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d423e4c1cc57744a0e7365954e7a632ab272f5d0167337f69227c58e6e2d113e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
+ 'hex'
+);
+
+// Uses `decoderTestsFwConstants`
+export const getKvRecordsDecoderData = Buffer.from(
+ '00000001013f53e5d800000000012b3078333064613364374138363543393334623338396339313963373337353130303534313131414233410000000000000000000000000000000000000000000012546573742041646472657373204e616d650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
+ 'hex'
+)
+
+export const fetchEncryptedDataRequest = {
+ schema: LatticeEncDataSchema.eip2335,
+ params: {
+ path: [ 12381, 3600, 0, 0 ],
+ c: 999,
+ walletUID: Buffer.from(
+ '6ae62c0c96c1e039fc97bfeb7c2428c093fe7f0b6188a434bbac7b652c3e4012',
+ 'hex'
+ )
+ }
+}
+export const fetchEncryptedDataDecoderData = Buffer.from(
+ 'a4000000e703000077051b0f03811b1b0bdb48e44977ac70c685312aa6df31c8b3491a9de63b6266f3d76007aba10d19c51ffd031101ac78089c7325d3168d492509735d7f064bfc7f057f2a33451a665c3a8e16dc552e0b1c386f922a80dfd7208ef98afa499dcd2fc5b879b78281c8e5b699904dbbaba690a9a242b1aa0cd4458398c77497200e485f55c16b1e7a3146ac74bff42872d2f76e63689be7066f557e985ebd671114000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
+ 'hex'
+);
diff --git a/src/__test__/unit/__mocks__/decryptersData.ts b/src/__test__/unit/__mocks__/decryptersData.ts
deleted file mode 100644
index 2af1a1b7..00000000
--- a/src/__test__/unit/__mocks__/decryptersData.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export const pairEncryptedResponse = Buffer.from('df2c47c09e4eca4d6bd13c4a541769e9991076da24a154938e7d08685b6586f90719a915dddba32e01eebd375cb6f3163419194003db036edd684835bd1f59256fd828e1415441551192fd3232a5c08f79708ad487a121510bd12f615594016794ace8719518bb51065ceedda4e11a20f8073564240a231a1b8ed5958a1bf7a64d7487ca2297efdb27bf63014fb8a27050d5568a4c2b6d9c46b94dbae3e3d15e99473dadfa1ea017dedbde9d8362623083613589005366e7db17d8e1ca517fa08730910af03475f450da0b35cfc955d32892780fe6ca4205dc2c48c7d539668b13f889f740b69473f40c17042fa7798526cc54972f06ec61d414dc3d930262224d53ba531cccbfa918c07a6fad4c424e8f0060f89996dccbedfb765ed43431992b99822185e2d90dfa1c1916a87526a7486381aaf9c83189b26819f3d309b03c5f9814147b3346e137d671c0890b48bb52c13d04e4dea46281bdf892ddf67f2772e324937db042f63758268b3765ff0cab8841f55d7fbc5c70ae9a27e38c8061b017f22f4ecf1f0b8184c5ccc9e8b1edfdbbec142d9e6a9e05e0e10223606dd7127fe0a6ff02b2cb780c06c3fe9942c1248f3e923cc07f322752e84f94a201f3bdffebe568e4a9e54f92ef6cfff585a586407adfc05f2700fe721c8f8ecd18367054d25648625391235f22e638cc72acf826e613eb1c36445b845573132142a8b7d5d3f8e64173ceb14ee7ccb780c8c59029fcfea4c21117065f88ef77a7dcad094cf959c5a2a94a0e71dc1b4d1efc91dab0b99bc4f7f85b57df90c4be33c9ead9bf8ce6861f30f5ca36e191d1cfcad93d73fcc548356e7457c0e87d16d3d1d216576300157a6cdf73591e2e68ef1c73faa593150d42281a53cf74fff2d9f32e5eee31a046dc07ec490c078ca20945f90ab36d68787f97fc8142ba8cd69ddc197c9cce4fd2e6cba8d162ee42502ef66753e2170e7cb8be483942cce838bbbd339bd4b2d0f2adb38166e9079189b72707cd0908d719879bef5bceb4292c5151b4b2d5ffd17356479eb77c9393d9c7d8ae21752be7f5aa11154c67fe0ea7cfd3ceb0feb59e080155f49f19402ea67ac588d5b17d32be0f8059eaea3389b5bb752c8bb6770a17a83a9ad7c31ff0ba74ba8495b4d0a2ea2720e7dedd162eae470734a81c4d68d76e3efc4ed6ccbba533dcaa063e3306016ce798b305db44bd2edd4a5e5ce808c24b6261375ba12aca2f1a93f0b02b7121351af440a87efae00f74e1b460db2a22aab65e140199cde33d30f4fa24846c1de412939621f4001902654a90678286a9eb832e9130cdebd5b97d307eae32e9651471689f3903481ed496cdcca73e6af76001b699bdec5f339797983e0dc2edae525620a9e28791c8ab72da61dcd5dedcba4fbc4bd676640d1cee8b069adf3122f0585ee059f8223cffc3dabde87bd31856fd193113e384402ff3f7431440fcee0df2049a69e9ba619e32a5cc8e3b4faeac144d217b091a19353067d79854289a8a05f4b7b99e90eaca74640762d7b622869e82492374dd4be8448f4e6933f7b4ff42ffb4f954e140db3b8a41239b06c4b6a1dbb11f34ec42735f4e016e04c136160af24aa728583a353112dd73626ca1d9d431ed5aadfb503bcd79359a0f61c760bebe6674919403102cf86ab1b67b0904960fabfb4727a59a52ad4dbe6a1b783ed24c4532287f35c4c36851a9ad0b3df9ae9eb433390dcac15cd2273687b580d95099d04a28e9cb4d52390472d10a5f86be34de9f15217adaa00f14f24308b9cbd12bdd9033aea856efc21deaeb3d69611dd3138a4db08e739241a0399a710c4f739627ad4880af21dca3466e69673976e0ece1bf076ae1e5504b7d952ca0cfbbb3ede87718b9dd7d6a58f5b357015ee50fbdac846b118e87bcbd3b7ee869117ce8825c9f8115d944d2d11d43381950669f6e939988228144c80968e133645732023575a5e1e48518949337552ffe63a5e7e115ae632ae29ba4fb023f49cc5a8bebd7ad984b9b00208146e107a28050b104e48b4c82feb61f7069fdc353d9c40df8603502416c719491eb84d6ce2e25ca8806212ece559fa462f910863b8013dcb163009483b4b15ec3f9fca3609576bfddebcdfb91dba46f51a84451e8ae4d9b12dc769a1cf8f891bbf28ad01b9128acd82209ece379cccbe371ecc569fedf7c952a16e833647a8a0920d5fc9cf980c6547d297c636707ce56feefcfcadbd9f185c36b3d6676834f51f71eda91481865fb0dd8cb80345fdf8b68ebf389dbf1ae8cb5bc81e4fe4214046cdd8f0af3ee7ba9e9b8439778440aa62cf1fe9149aaf2fa88c5da2efc67beb700722d81dc4e6f0abbaa7735c0876ad4f7a6304e8e22828b51e4ac5638ddef3332b82d2d3d05e227f6bc8152d3be2d68c5fab24910b4e8711d605ba5cf5013f2b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex')
-export const fetchActiveWalletEncryptedResponse = Buffer.from('dfab5728d4b69329087773a8d742bf5c8ba5b4b48fe84e089694d04475cc6f94a3b3b386faeaabaab8fe0301591f89516562ad1599a37c151c394fcb93a041b1b91573b15ab54b9c9873269caa8da4246168b92c456056372526295d3ad05b2fc1c30ec7da9ff7e8c208abc4599cc8c7fc89b6701e8c74600622ec0ae08da291286fe3e4cf31b56622b808980de1a3f8a3b5d436eda9e8c47757c9a62f473ce99041294a8adffa65b5307036e22ff7ccf01e8a38326ddc6d81ee01582c26e5873a9b6d6e67c7979903ff1808695565fa6dfbc236c37aa20d524f341d3f46db5953c2040cc39792e7883282b8c037c4b1bea1c826322ced21aa9dd30dc7a7229159397e86763a9f17e0f2265cac5c29294187e8b9dae0ef4a85a4278a7dee051876495f13feeea1683f573ded70a9d6a52fcb7dc5afc24e18b484ca526d50f75b7bd29ca56dbffa8c3cf2a81eb4f3d4c52eae60f7bde0aa897aacad2fd93897551e7a9446a951b4376f76a76f00406941b53672e3879b5d0f8805e744ac6beea359b94023c05f985e1be9b9fa286c33a0e0bbf88b096afcbc5bdaa0f6e7ee9b643a0e44733e805359553663ac0809651948e6f10697e37fdbc33b3ab06c18f8d529a0965b938cab213f021a7e58d86c58c04198604355963ee34a2a8323452d6cf13d608b7253f925ba6d8ee31a38b0997a8fc4ca96e95d61c19feb589cd1cb6d437a4e378b1af19bc90cd3e048db422c0d0addb0190ffbb1a53a69344fe7ccd57b0f09fefed4b9b755a11c8aaa046d3ae3e2f2184efa597ab9dbc3e0bebff2f1f6563bbb2f23cd0942d2de8e98a9f4934999d8a3e70d8db5d8356bde8248522ebf2126182ad83cf398f324ce105adfc6662697c26756071a5d0a811646407cf3e4f7d79d61d14ee7dc7b8334ebb22174f318e9c4bfc00230a7ff7a497d6ad866ae1f08c37344cbc156c4883c68797b20b771a2528b9bc2bc2e46c322dd3e0426c54293ea87a99d5924eb72e08fa274564f27478e5b8567cacc3932f7b3ab1e471784de3ad4473075217efc827e6932ca890563e5a6d3b7d57519379c146211875c1c76c56174fb4909f690b2b130fc37b9434acad1fbe8f898e09c2282293548502ce6aa9fb8bb09708297e330aa13a736c7bd00ca7882317f26cdb1697b480ce1b2c5fcd1c6e9759d2b202209fd4b42705ffdfb9072e4389b6e7d544fdd4f9d9520aa2ca14c1587b673dc8227ff2afc2441af2f334bbd7240f7c0c1b74e7bd4ff670429ca472268f5aac75daf388142f0323c1f028f74a122ba259d86947de75fe1d651ea62faad6c00820286a916567d03acac157433d452f58d9dafe6f9fbe68de653cb87b867b1830e2c4262eefac0c278a55de8fb5cda3494ee78bfbdfe2eb58a14cd9de64da85e5bd341d0c85d12891bb65eca4b3509dca595de2ffb37874a2495bb5c258997567d3fbf5cee95a5c97d304fdc443a2ad64957ed1d1cfea9e9ddfda2d780f3b11a52520c0a57fa3ef068dd750c89621a0e766ae0f0ea91427c0fd33fa875f84a39b03633ce92cc571fb240c0a25de7c6d3a40a49ebee0ebb82642183d7b87f88ec8d7aea1c0b8e59b3079aef37151cbceee1a9a41377954cb8762478b158e2a1c9753e6463be27b9aa6001dd8d79761def1502ba3596f9ee684eb1c4f7ca7fbc3dac31806980073f9ae5f0e338c581f0d7b9e4d401870e735c4e017ac44a742183bb0148de98df81bd6d965e1232db506a27c63657b3f8a3857e4a4bc7289ba6ba64f4315e338eaffbe3f1c0b42a94beb813a46d911a2b3bbf12461f977ad26d772390320518868f2d76fe6d3a12732fffce38f70f8934b53d23ef9b0f80750770d9b72d50e8635e6421930fc8c50270e70f223a2d8733df11654e6b8a5f38857c7eb19bf85a23dfe6a7e75b6e95718087f03aaef84345b73e27555c374e1b8d0aa0ec82e31db4ef33a4225943040b9be1c10ea42d46082a76bd5c8c595e25c6fb004a05ef132a9580a799009c5e56de2b04031b70531800ec27fe7f1ed9880b9cddd063fa939d42eb829301745c46772788f132c7b4feb569fa5706d0ad8ed2b0dae1e8de752253a56baf91ba40a66ad9e66af60237b5cd16d9f829cd5a00e3e07120f05c2f7d1b1b11ec2a7a6b1631449cc08ef1cf5140ea7669773555254561893ad6177bd14e31473a17560d37666504eb46308da41aa745b2cdda9b06fff2d02dd6b67b92a46efad1748fad9669ab5cc17c260ae1b40de113e383cc5c28f83ade4b973c2d7adde11c28927e0edcc9fd641e5c54ca23c05b7ddb7d9fcbef0d0d857a4b716f7c77e14790ed3eb3e156e24b476d66bb7b8939bb1db0d63f7116755611c89e996bb5f41978e64528635a797e9ba179e37d99f0126a4f5987f35833d9cf5795d02115c186be398b5c000a51a7d6310c28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex')
-export const getAddressesEncryptedResponse = Buffer.from('4e286c492a7f8c81714d8afc1d465362e65d6cdee5ece9b2b4bdc5e841e74269d09859ccddbe7ed4835d3008b202e73b04813fe05a12518a4655eff1c47687d19a75a0f689fe5f15a0b2e1593f0b8b45b1039ab1b50abfbdadad2aef4e3d609beb1ae65d83c18ab3e335deadaafe79810762587b2fede7b7322057d85414da2e8b06af72a6f865c5d2edd5f2f09c180b88da41a04d54032435449a0c2c6276bbf668c4e04c85b7464826665fc23f1406d9df1d0e44b98934afc9330a459275d18055e117fd644d4054ee17ff9606d93c7a1a4e58259790a15d7fe9ceb4ffa40d041de6cb0f4b34edae4298eea9011f8e50f62a3ec146e00e36144e187bb7bd3590be9c71fdb3c8f18a99899d34fdd687721295080ef17dfb8fda5403485d4af4b250261e6d0d906619216aecbab0de081f5d0f375fbbe648ee6f37b13ab0c92209e14f0965c443cb89d5280d8e10d76f3a8b710f783ec10f4fb2b22b239416dd6182cf1439e25821c354b040fc23a61008221b931c773fc4daed7b8b61dda781ed03168028ab604d8d36eb5cc53f255cac32d56281823bbe20ea526643644c32a12182ff065b6f82be7932fe50f43db22b1b8ab25dd1a8cc75c0d7f80b53331f31d2c0552e6384807d8a76ba7bd4944504698c4de72355f9a41cc2e5acf632fd49c0134d4160376f12bde4e26bc93f866ccbfa75ad475d4d0364b7cfe41998fe8c94a7d94a485f56c9e95bce5761e2b1587841638ffece16d156290a5ffa2af42901bb3ab97c9818a67bc6eb6392dfd489c0af8d6df9fb5a684de477cf31606e2b5eec66efa4ec8f316c609462e1b2e0cf0679a3124d898928e7f998d940146ca73f11ae64a05668690fa864d30099b277fa3a129441ddbd0a49ab9ed7cf32d52d3e96d5964a634ce3946cdd2e24c90f47a4acae58002034affb80ce2d490701ecefaad0a09c03cbae3b8b24714e022bf353a57f21eb23c4554219c6530b5b774c8ad6d5286e67eb7ccf568629b7f056cb41f2ac520ebad72c284520364e1198683aba1d3c6b7116bc09e864bc4d1b2aaeb04ab96f65430e05ea91f91b22173a4e92e24523033bac388657aa9fe8d10f2b6745a26ef2c895c275398efcbf1a81f96e124a6601a76d6389204755652969fef1f440e4cb4408e3c1078588dd18e73b8b5e3c86984787ff5ec8e5bfb2ab9928445a14a16eaf3d84bffb2288bce18915b3de01a20d9bb801936edbf386933f60a0c7ee17c43cb2869ffab1db5456949d38c84285546a7059c9b619e50406218e73c59f0203a91f3829d804b168b6733b26353b4b5f6ce2e174b01f4108d08028b525ddbb64afd7e5d711639374c09387871795870cf0a921f5042f9caeaaac614d84d4196aef1363ac6c97554466fe8e1167b33e75bf41a27b8697f54dda778b8334a83b5b1fbbdc7dee6be5e45f7fd3bb5deb59df9a59cee638865a597cf53cb71bcbf38b2bc9d68ce325cf33db76b23fe307b2ad6025d5c6f4d3a5be3290a6a296b3f406af4cf46c5cc4bc63fadd63ea96a99e9a0a3cd9b418eec73e1f980c7d099f369a6ce28754b7fdc7bf98ff141b160f9b9c69c96b7b57942e80fd3a9330c8f2f585b0b98244fcca08b1b00f481f4a89fe08939f9a56f6bbd39cd8d6d4ca3de8ff3315377a268d2f521adaf93b71d6012d2ff018a0618695cc288fae4836d4bdb1b515dff86b1bd4b453048c6f6a48cf8605b5e0e213a48b3a09920784a78510cb0c3d530e8009df0cd8091adf128520f0cea9323b7605707e7d229694f609497a8f62b1dea08e6211c21703ca834707bcb8f584de7ed63b7b95e47c1f29540753130c6c06bedfb9c7b99227f52f627f1518eadbfce2e026aec160055447b13c6b9540210cfec9ac2fba395d071f80e02ebef4673d33a9a1c90d6e1732508de7f66c6d59f6d5fcf980285f9c7acfc969bdabca0e911c5e0ea02b18c0405f03ada74cb882f8870a4f2ed794bc0e076834e3142e47889fc0e0d7605ecfb4a1d020f3926fc4a51b9eab27bcd13358d2e0994ad07f6f12d2167de1b4448b4e340dd6f458821cbf54653822bc82944231071b161eacd5b8af0522697f8270e5c1e93ca2c873615e13ac85fa1e0ccdd834c4cad58c30a6b79eae6d522b1aa1193226445b37761019a4d95e5ae3bde97e5b44ebfcbbda005c5fdde16d64f2aa182475fba964d212dc143a4979d08d4cf71a5bcbbf6ee300e1fc64e84f6e8b5fc269d81cc5d7b5961732a314851e820536f11797e70383424504907d99d7f037816313e91ba6fa5b474d87c63e8432a17af4fd505016f2ea7dba90630246192af27892d4477ded1a639d63ec2eb12630a11bc7b6bfede1ed302b0f6b6586882f8adbb581591415bd29c4f0487d1b49ef04a913f9814584a7dd874bf9091795952a346f7200243c8d79e23ee221b874e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex')
-export const signEncryptedResponse = Buffer.from('98e7feb73d55b167408ad9d10a1e5e087882ed3d3f8196dbcd2575be8d5d4bb3dda7e13284c962bed6e731743805a6de5e6fe4c8af47f49f714e994618e01c366856d86ecf4e505fd4b646cff75634587104381267ca8e457cacb82bd2cc13df1bdde98115719f6b57eb2866dc6067627917a294f3bc12b603a3303bad5f4ba33821e9d2953bb06b1106e2255a22e90132e8aac8f7d63908a0e56d83fc8e74adf99cbbda9724165855d061f7c808238ce3e89191c14cdc0739c3e86b9815913b144cb8342ac9208a445df7c12320983fb46725d65485720790535f1c9d969d6ae46bd56324482786019be64ce710ee23ce2866e54208ba53a71c097296d145969414a9d0e4034394605c6008c2441bdb1a8c328c2c0e535e05279f97d44e1ed368789bf8a07a95fe38fe97e635316a16c541c8919898ab7525f04350312a9079069fe43df38fdb69b35400416c6c83411c0a5cd7b7adca9ed523d1c39522424bf12afdfa0b3034f291c2d5794882463779ec3ecfa64427de67f4f5b72ba249c8bb01320e367a3d6fc9b307bd325ce5918f8fce93ee23c83b5c383c46c35890bbd927595b3eb02785e0d196c655eae51c4e506052045c6add962ca8043a5fb4bc937812e0883528b2eb97173bd4bdb721879a7e593db94b84ad6f84e05e6edb1a3b398c854684b2224f6e545be9594022e37e2f72df0ed134c771d20adcb5aaacaa5e2bee920c7783c897b3dfb3298f4b545cf80fa1aaf671ce19e9457f55bb450f16ae1792269368da26b2003a4a8ec44f0f07cd6064f36406996fb5073d0959e6448b6c483ee45966eaf7ba9ea119eb1e39aba6ecb8607da4ea1da41dc22fb4f1ee3629b20988eccb03d31b6198ae655218311e6b2eabc8248ae716a671e3ae69b40c599f367bc15fdc092aba16ae8e0824921bd0c4dd8214ec2be5731b019afc2dbd080cce94bfe678bd39929ebd6dba83db9c27717b9d0f860607627b42be61815bda009af502034c1dc68539dc41fe9e7141ff976d6f8fb37829b3db250c4734c9755175d13849b27293d2b386f684c847f4d2eb2d13989059935f6c49c7da03aad2cd7a25120d772ae8532103ad03c2641352685497ee73ba11bc9bf5dd74906587936191b4262c190289c52d6aa21cefc2811d8d2ac87f1963c3f24895c4e1b460197925b9c70b52773b758c499168f66d5a8ac88a48aee0fbea1b26797015d3fc3a369c05ba581348969a9b9062edd41cdc8e6782fbb7d3ee2f1ed8c23dffd1fea996f1cea4856149fbaac0af2625f0291fca03fce284aef1f2478a4efa07daf72065b0207ef8f6657d5bfa5a5ec4eb53a86e713f74e6f6f21aecd1b406089f01a56ba40db03e1e12d710d7da0189a15c2519904515aa7b8ea59759ffe93f019be71c4b473e417806b8a3f923278d7012aae6727357ac560c4cc81d779870f58cf14e86ae08143a635f3ee2695fd311f22ed078167bc3e0002f27d534c3bd48015f841d8f25838a55c779d87a95c1b7a20cafd480057723cdc65d0a95b60cc35d67f0fc7de0e41a198e78c67841c7bdcc94bbbefc87eecb2c4b7d2fe874f8793aa1ddc1406494a737bf7c70c63dde19e236449c6293ed8ade10a2a7466f3d039c2e48f6b74650331fff965ffcc4e3b49252ee84d8d199823d989396ed4cbbc595262d3c52d958f4df3c596d264874e1b51c33582e537372fc0970049fd6ce4c8d00a2721bf6323952a4e4b8ef048b7c41e01ef30bd1fec303af74d776517f1d1a427f3a63cfe5c83fa80bf4b4da5edfed9c1394d66716c4ab49eb7c6c6cf969aedde85c5b2cc3e776c6147e4a16d436fba6ae99487a9e02fda81d3e102977f83a256ae3c914ca3e9a955b0cf16f655629816186410e61b3ee20bf3e06424e3e4af27d62b060dab14d108470d82a41859c882483523ee552124f76ff9c462f22dc55b25e4c2768e683ab8db3e86ef0ebdfc63ef15b874704eec77b0d6d24151fd3189c464191f4d078af6265b52b6ed5f4212fd16c1b0ac05fca251ea6151207daf5d6e04014b81fee104c5ca88ce45f739b47a1891634a5957a97941a2c5ff0ce9ff6b5390fa9384fb224607f1d0585a05714369953fea4fd83f77e27dc7c71e234786b528c08b8eebd829ecc59635fc1d7a0374b4b67ed98b24de4030e7a9f6f55d5d36d1076f505f4760fa5a7e008b57d30db4bbcc70eaffbaf26917b6ef3699eb123de6f7a1b8e2a5994465cec6c5d25aebe89c781312be5dd2a9280f6fcc428fe2aa8d59df8789ac58cdda25a60f9a1781a5618d8bb03a6d4153785eec77a72e140827f70c71d6867e9e84440c24a85ab7c8faf1c57214b02e4e6cf4f830930b599cb850ee2e5a32063ee44f9e258682c4e8449087bf812eb3e6bb2d8383a8c35eb8b36f042f01a452df1be90085f0997d217dddbddd4021c1586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex')
-export const getKvRecordsEncryptedResponse = Buffer.from('6a241af2a0b2b698f962c4d42a1c28c49a7890cbb61f773b0a84c3e2e25b89dd0cd4529fc739fb01c537426e897107a47db645d82b601208c85977c78c65555d5b3b5af4b70a80550fba2ba27bb70d618c8c27f153470ec68ee6f8e7d9af82c7b49603ae9ef4099dbfb20cb636d45507b1f19b246482fa3cfa2555cf8baa8dce6d8e9fa34f22d799104b35583e05644e85a55158a8ab7743050e55a0868ed261fa61cfd76fe95f9b1887bf1dd3a2e3869b5dc3e61e30f6567ec766a4f359ffcdfe6f9043c1886831553014985312009af18b47dc2cb8c41c479bab204606b4914200993d06ea6b041a25f255748ca27beae3182a6d9b82cad2176b25c60f3c366af2bdab8f0c4526860bcbff8fde980faf0b1c4d4dbcd6486832690af2bfa7ec276f35c740aa5372922bec4142eebf246ba66876a104014ad6fff2f7a05f39701405c90c0ef30c955ebcc54f3581d8e8a5b32510623dd097d325a2f0635fc2f2cd2be2f473dafedf85886575df5c820defaf235a88be6dfcfc9ff28f62aa7737c01b4e2835e81ca66b97ecd5bf2df2ad0c09e981b28fb1ac354e947dca2a904f8d9ce122e18f36d3c67265c678be848195592ebb2c157c8b4b0d7129dedace3fd61bfd5696195ce081d2e80c83a336c7208a70db5b0354b7deca93c76e8096ee627f86b63789cf41f3e0c9e0f3db3cf439c919e2b738e1946918e6808d188734a3df858d1fb4034c5a60b903b24a0b71c0de117d99603fcb222354d07340baf4043a2f3295941bc6cef2aac803cd4113eb00c8092530f83c47802556d3e6f23a930c4c806060bd5a33b72f32218aae207b80e988207db3f228d9dca486f67a48c7633c37f6e1563c3721e42050ac22c1ae51daaa32993950360c215778fdfcbbc7104faff4b0abfb87e8d0e23bc5973c32d3fcff98f623c369f2826f85c677e75e8affc55c39b1bd90ec74a980014b130ae1d166c5cc49be022445d25efce114925454bf9ae6a469408b8a28a40bf06bc1ace31cf048de6b508bac842931156a67dcfe5036cd308f19eedf633b31bc43578379ef304c6c39272180fea5710384a7d7b6cfd9bdd8aa78c335e9d942565f24629116ff2abcac5d484da09beeca8b8247eebedb9eb5839b9d94f9e79ba564374416dd2e448549b7ca72f1e04531ee1a8e2900f99e849f882e9967ed0d817193c661ae82553502ef9fbd358800cef924e3d646d668cdf4731d1688000eab6249695500d41762053e1d65bf6ef83d09bea6890c7a666a4b1c5fc2e24a573522453d16d5eb335577ef49dccd68c96b752ee67b8dfcb07dddb9d2c662eed11ffe208d370937e636bb72f392987dbc0a2ce50389b1ea91624a7d3fc6c60d42bafd32cc6f2048475432937f948b049f46a29f324cb7df8851c6e1ddb945cfecdcdc92c9cd317cff09e2b13955ab610b0573b30021657d0c310a67087f81dceb0cc6db5517f9506b33b059fecb082d9f2063d85ca29d6c61cf396a52d8d4d79fc68e8ac268d1775e0da45843faa21ef03d62e24af39b6362f87dc7917038a3412413d5d5d302d60ee9b685ecd8504eb5c3c298df7804dcec869b283196ad823a8c7096fe43f35c5c95165e3e40ad6bfe5cc1934c10f6e93f93ee2776e7434064f66a7264b500258eb86b21bf94ef0cfbefbc6a9a997b6665e38fe4163dfd4ce689a72271a2ab87dad2ccaea0159e4e728d74b47f25f8469505aadc381beed90b9b5867ac7bf45d8177152fc67cdc7d7e56d54c11ac43c67a8bde937cb75b94543941f15a90acc51bb2da1b5a4ede93b0cb9542a3b46f20ba5c904c610457ac86cd2e32e82965bffbe9c085791a096ec634f77ddfe25a5ee847a65abb9cdd5e58d123c54ca0a03c96c9564677e410622936c2dd7427bc4182e71b6533398c490675c03a8ecc564c72a9e13420779cfb0e8c9261add79eacaa1598f7ba6b81466933724a35a1f3100f5da5b7f8d23718bf337e3d7066b12f07a8529786b012eef33a74b19426f36b51dd6ddedd5c61a408a349652cd2822547523ed57aa8bc8af24bf64f6af6c96927bb3fa6beb9d2b209fe56bb560ee42bd72d7c6049a2679320f00104fa6091718beb9c29dcff57693a533cfb396311aaf34828d219c992b5f90395799f454a747792a1ae508f7eec0d8939d47ccc4caf601a78abc9a5b64082abf0b70077c24e157d21e7effe0712798d3ce4672b682169c95708f89ba6da425f45a68325af231f5fa2d9c6f1ec86c3eae57109a309406de8ba8aae41a1f2cfe6b46ec8e958bf636da8b9ffa11ea5cd24d52fd35e4cc282757e485b27afaca29c9287478c89e3beec77076e6fe45b919b36aa4d5c5fc4c6b4dd6d5c7a37d419bae9348511ee50ee78a58717e01628cdb6c03c9c145f559ba975b8523fe60f23e26ca7f9f3ad907f04896328212932645796000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex')
-export const addKvRecordsEncryptedResponse = Buffer.from('4ff5d30b47dceef77406ed4abb6ea8a6e73150cfbb70090e5cf4cbbdd8b2b675b9594dd87919238401c15c235ded4ec20accd85b7752d7f204c6e38c5d0434bb9f83ee6649fbea479ebfc3cb3254dfd6d9a5091457d04e36f9fa16eaeaf81932fb31022a49b41bc5542941a293c5b467a44d7a6fd57ff71401538fe431585e72eed2dcbfd1c178552104cd0b7d18eb9d6533f34d54064f15cbeafde817854ef45d3c6bf110b32a8efbbbc1bce076a4d32ff73efb668aab0772554e0a311388ef6b097b337f1de6a31e947c4663e66b5aa494726cd6c3886ef7fba0d7b8adf57fe272f35cfda3c0aeebae26571974048d93234217d82e04e17700868880cd399a986142d14c26ab5267903e7b4ae9f7355a2cc71f1ca9d49e1c1e1f4c298f68af29cf7483d4f094aff97c5189074340ea3b310d56c7879efeb4b328ec8a4e1446c126b2adfbbea085d01487dc3ec2fc0fe4b9ff65137fe017895125318835523f59b0d729dd7bcc4c34a4956a6f6e4f28c08bd15302310f24fbfd3cc30b52040298cf0ef2e643bd962729d5626304b58eb8e1fce662e35b0824cd3cbf21e5701912c63dca5b72e376c6f35c3acf9aec2489ee1c1b5b4dfbe180fd8937ee4cebe74cff238f6f8b755144d23e8a53d2dbb05a6572c085c98d4f1c2627771bf07541c3d1a3e75257a4554761c026e736e42eb6786a8d744fd78b9ec0abd732c3fff175fc93dc4df15d910bf5dcb6848c9973d8edddbcc55799954c631e02df9ec5b2a098f04150d3c9a399a1f06ff925de8b3c70506e97202db9c4eba3469ca0d049b3abab116d4057782de9d0609b95434b65c952939769c6835ca4ca4b370ff172018bd14ed02af2d228c69a753230dae1637277d0614d2f341c10593a7330b823cb463434fd047b82e67f605d19ea81afa90eb3eaf010c4bf75b4985b586107cef2a7332356391233889db87d9ab2d56073ba43a8ecf23d5331733ada836d1fb849a4b56b2157fc2a0c63e8e2b71709277c2697e47f13c9e885b651aef099736687f904ee3afd77c159ed26f511147c6d3de6d73e3a2565972f3d8797317e82f2408fc0d3799b68e9f311ddfbf1eb0c4ee58bca3b0f50ebbff7230dab03ce3d44ba87487e9c22b89c070c9e3e05621d84715d21b54ceb5a483dd7a79888e6863995f1e1ee6e6a2cae0341f07f2b9cf9a64e44d544dce2eb27d891e5ad1f5197f8003bdfb2a024f04f15ca6cbea5df323547cb9ac68aa615b655526b9fff35ef9064938e57ee0e8336ab45afeeae0f91a6343b791b62f615dd93b4e6668a4733f14493f5a54cf412eee11a19e7b0485e8868f8827158b79738a8303109c9a0c817327ebb2573dcaba212d0623b494957578deb280c4960b8e5284f585576c74a9ccc992e9d39f58dfdee8d7ee58ed8a2583997b42176eed6af34135e83922d587b3db6a6fa26bfa3191788930b328b3da13665dba511d52b7513bba7523373636807a12aaaf7c9089069857f5069c934b1f44180e718982d539f12c726fa2b65177a514503f794048bdfffa0dcc381006479c22221fec94908124df67cc3e2cf26c75cfa23709d8597ed91b2969fef94c82f2fc2860c82b94dad626ef870b88033f43168279bb9a10b1ae36b82279cb051301fbbd3541aba25077685ac91981e6cc436db78365b4a67277386dcb9b62bddc89587cbcdb9ef5de3b37769bff4ad155e4916f4e7089f03688610edec54011d00e8776a27f7204f414943baa731f115a4fc868d2823a1fce0c3446ccb26777bc1b76a8c3ebcf18ef6ab75eed41fffb3b6a785ffa7147482efe37bc88559c1c47d38ea11459bc76879229754cce801c332b4321a7a15957a209d299004d18be1af74e8b2fad840c229067eb5ca8b359f959567caebdf8eb8fb2fe8ba496433a04743482b918ca84033dce4a7157583f5359a7d132c35a2b04cc27c1836c803a6a3773e799e2a851bf733356e6a39ce47fb4478815daf4b856dff1bab0bff47f234159efc36089e03206b70febea72857352a87c2eb97dec5dd692dbc1296301f5349930b0d70d06e15b94e38a52bfdecd5a3442e06e751440d81f6d1ba68de48afd5e92d5fda0aac1160659bdb9cae6df6bdba489d277bc097f04205afc2affe73774a9c8c2bd6951ef50a7e3d8a16977467bd73b988b9bf91bdc818a3aba9fcc2e7ac9502d263a225e0bf6a0a4339931f372d7d284b5faf73ef646f4450f1d85640035b981f133f3704e64b3388c4aaaf97659e50044462ff1183fde18b860068816609055fae1076fc9563fd42b6a64b15f40f27597936425aaeab2d8075c71ca3efb5e308253085134d79f8f40ebe2711647c21249eae3903360609817d2c9eaa7bb2bf42b084caf01467e4b792aeb6dd668b1d17080ca3fbf1a4be3f7ad5c55699d5ef0330c9a4535b2de4a37dca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex')
-export const removeKvRecordsEncryptedResponse = Buffer.from('728ec918b6a6b042974b0c451b601c34212d344a535991c98d70d96616dfbd2ee3c3bbff8b0e1980517e07429d9513c057e8bd75386f0a8fa436c1b6c348b00fe5f8c95dc64f6170ae8e7c933d5b3084f746a5bf5fac70b81b3bc37a414271ba2c0a4e7896442457ba9bc2e620335b81ec7fdfd5c06cc7b2f06c428f62e6e2d80002fb5e2712b8ea65f7c7802616b2c0a0e240ea23a11fc0105aa86e706af0e903f0cba4c7e5fcc99c66ad4bbd04a0e0c64fae21295b0ab2ef3ec7c74f238ba6e112cfe15728464c56ecde6c07d60f682f0e8dd40bfac3175b004a65aa9b886bf98f8a3cfdc1875d157fec2b78c35762e1008b6a26ae0e88f409371ab86be32ce1f3f0262b51a1a07e6cd36da5b6bd1e6ea848fcba1ce4d0f2abec03bfde024b6a30389828f02dca08ffe4bf61933ff25c28dbe8c91427272d74a2318c578f81d383f00c9062ae958444eec39d7a4510af835cf3fc86e2f06bd8301cb892b99c9021eb5f754127655bd4f6c038adb68c620c8986fc3bc6390d3428b5c95f9bf0400e7e49fd2e0f5822d678e5d9d8b5de65012e801758ecc4c2d9c07203565a1536857fd7438400d0ac848a727c411cc9e0da9545ba68b3da84916ad5d359d3ca255ad40893abf75d961f595e717d8d2dfb61ff2fab077792453b118370c6c84ce5628ca725218b2988581f8497ca9bb69e4596c709a73826548a84daca67c060d1acb016b5b8f7a2831da2f67a41108aa27ea6fb86034f8f50b1c3be5e5fa696da39d1bf48152feaed0dec94aa898ddd1b3f2d0439ed813b5c6d5fa67bf6d5244dad9da6f704644d8ea921b8c1197e4edf62bc4d96fb44522748068eb0b4457f3f0de1283303eb4ef2f388f7eea781d3aa349f42085f502fccbf12b0b8dc14c666a967f6ac6fe36c09ad555980b77c81ce33aa1cde9272adb292f8cae7b8150264af90ea8b4237a96a6f94656a01511c653af5923c27a6d2cc782af5d9b7402f483a3fbda6c87611fc600684f2838314cfd67396c7d1a3f84a0d1853b55f0557b278c38019cfc59b2702e3dae09dffd9c5c4ed04023929ee77619619800658b0b3eac0ffec51a5f7cf1e0bd72cbf5377814a4e137049a8dbd56681e4aa35886f62e32a7aa6d50500fa0327cd63bf5776afcf93590212d58b9b58ad733d1113e664677c089e649e0a62a049c332ca7353adeefe208a7117bee946c3a24f7ac374454c17337436241741ca64d3ddadbc511142daf743594cc50988225f5153abe7f223e3fcc72edbc16ae9b4488d645a13dcde897e28d8ff38b85ebba178fe5188ceac34d4190aff37949a1a3362f821891e86809836178add8f9a2954cc4c038eb3c996664227befe2e76d1689dbd68143c827142d880c72ba45b0cab47c90ef1f1ba211f7b62e64edf315bf8fd54a3fcb88e8a9c6f40e4185c5ed4b7f8b8f7f26f252c152c6bd1d26acb6f78852ef36f575bb63f507377a29bd6513dda90d5b690d953f992b58e1ff0114aacef7b379657be7a6eabdcdb2951cedb2d0a0b57be3fa486781d16cc68a050b1bc136c74e8838d87a3cb015a1d46cc0287f5d3580afee0e450ecb0a5b79dbea8951990ba934a9be55082c6c1b7db425c93be5a8e1e3f9cf50f669279783502a130901c7fd83f0f9eb552bd99cdb54f14e55ff1c6768962ec206cdc0b7a6355a6c338fd28d8d89318b6168f5f2617097399c3ca8e44457d490a727daad605be22929126e5b517085ee62b00740afe47642d1b7bef25573e5d61cde4ab80b436581d6085b229333dee6b56738f733a359a58e32eebfff15acc6c0e9b6bc3d91569990ea1781be4c73e1a9b6e1e89759bad99f57265bd4ac3ec59bd04b4cfc626be8900b7a69619f2950912c4ba57894259655a85bfe3d9a71224377a7aff4d6f6581187985285c345708ee1dc200dc6567bb04de14446e66d5b56b8c61169c18442fc791712875a9a2a9ea6d7f01dbcd04f0a4875dcac815030aa2c7555acc8481e56e0dddf445732fdc204fea641049e3a5e31d2d7cd1f60f23857cab492e62c843d589ec13655443fec0e7db8e12d3ef926bed89506aa5412379ec11684513f7d02e58932303095845402dc77d22527a7e474aa085244c8fffb1b51168494c250ba57e5fdc5851707d9888025cc7002fbb8a9b89c947715a0a6e9334ba1803e5266d476ad1672ee11bcdfa5d7a30faaac75a855fe23d7ef7b5565b63e7d72bf8a7ecfc60cbe05d46d6f0c1f6207f866ae7dedd9fdbadcede282418f47747903d135444921b128d7079a9bd0b7a3fd1b5d7d50e05696c39feced7a30c02d21d26bd30e8bc1bc072461018b422a94af48177746dccf791c79b5d8310793d3db2b51a8d08d8a7458be8014e6a5f8b1b27dd304d481d07dfe685184d33121a3369fa3333dc9965b2b6391fbe7e91983a336cf18a29cb71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex')
\ No newline at end of file
diff --git a/src/__test__/unit/__snapshots__/decoders.test.ts.snap b/src/__test__/unit/__snapshots__/decoders.test.ts.snap
index 69ab5433..893ef034 100644
--- a/src/__test__/unit/__snapshots__/decoders.test.ts.snap
+++ b/src/__test__/unit/__snapshots__/decoders.test.ts.snap
@@ -9,38 +9,38 @@ exports[`decoders > connect 1`] = `
"name": undefined,
"uid": {
"data": [
- 251,
- 230,
- 125,
- 166,
+ 149,
+ 94,
100,
- 189,
- 123,
- 95,
- 163,
- 34,
- 243,
- 53,
- 36,
- 65,
- 33,
- 139,
- 170,
- 53,
- 190,
- 195,
- 189,
- 40,
136,
+ 133,
+ 196,
+ 71,
+ 131,
+ 4,
+ 208,
+ 41,
+ 98,
+ 58,
+ 140,
+ 220,
+ 9,
+ 170,
+ 200,
+ 223,
+ 241,
+ 203,
+ 165,
+ 193,
+ 150,
+ 122,
+ 10,
190,
- 23,
- 112,
- 186,
- 217,
- 89,
- 79,
- 185,
- 128,
+ 250,
+ 242,
+ 143,
+ 64,
+ 122,
],
"type": "Buffer",
},
@@ -51,38 +51,38 @@ exports[`decoders > connect 1`] = `
"name": undefined,
"uid": {
"data": [
- 48,
- 211,
- 148,
- 167,
- 113,
- 193,
- 34,
- 206,
- 53,
- 247,
- 135,
- 139,
- 246,
- 129,
- 5,
- 103,
- 239,
- 103,
- 153,
- 71,
- 221,
- 83,
- 125,
- 243,
- 98,
- 31,
- 39,
- 18,
- 151,
- 173,
- 203,
- 168,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
],
"type": "Buffer",
},
@@ -2742,14 +2742,14 @@ exports[`decoders > connect 1`] = `
},
"priv": null,
"pub": [
- "c16d27d972ba0a608afe27823c6f3e6c4cd397466e32aafd7752205e1be0f65a",
- "aad977f8ddd4bfb31d7c7896d80d35579b352060503b4230402600e0cc9a1a97",
+ "aac5b104a70433abbc2d7fba7a73f28179e0d4fd24fb7364418cebbec2fae6d9",
+ "bf6fcf8cbb0c9cc5fddcbc35fc7c3d9dd43beabe1bab691a94cf599cb089e89a",
],
},
"fwVersion": {
"data": [
0,
- 15,
+ 17,
0,
0,
],
@@ -2759,344 +2759,925 @@ exports[`decoders > connect 1`] = `
}
`;
-exports[`decoders > fetchActiveWallet 1`] = `
+exports[`decoders > fetchEncryptedData 1`] = `
{
- "external": {
- "capabilities": 1,
- "external": true,
- "name": {
- "data": [
- 76,
- 111,
- 115,
- 116,
- 32,
- 100,
- 105,
- 103,
- 105,
- 116,
- 97,
- 108,
- 45,
- 103,
- 111,
- 108,
- 100,
- 32,
- 111,
- 102,
- 32,
- 83,
- 97,
- 116,
- 111,
- 115,
- 104,
- 105,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ],
- "type": "Buffer",
- },
- "uid": {
- "data": [
- 45,
- 51,
- 116,
- 121,
- 215,
- 117,
- 169,
- 62,
- 47,
- 103,
- 83,
- 61,
- 224,
- 220,
- 206,
- 220,
- 82,
- 243,
- 210,
- 8,
- 12,
- 211,
- 177,
- 253,
- 1,
- 202,
- 218,
- 103,
- 14,
- 166,
- 247,
- 24,
- ],
- "type": "Buffer",
- },
- },
- "internal": {
- "capabilities": 1,
- "external": false,
- "name": {
- "data": [
- 76,
- 111,
- 115,
- 116,
- 32,
- 100,
- 105,
- 103,
- 105,
- 116,
- 97,
- 108,
- 45,
- 103,
- 111,
- 108,
- 100,
- 32,
- 111,
- 102,
- 32,
- 83,
- 97,
- 116,
- 111,
- 115,
- 104,
- 105,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ],
- "type": "Buffer",
- },
- "uid": {
- "data": [
- 48,
- 211,
- 148,
- 167,
- 113,
- 193,
- 34,
- 206,
- 53,
- 247,
- 135,
- 139,
- 246,
- 129,
- 5,
- 103,
- 239,
- 103,
- 153,
- 71,
- 221,
- 83,
- 125,
- 243,
- 98,
- 31,
- 39,
- 18,
- 151,
- 173,
- 203,
- 168,
- ],
- "type": "Buffer",
- },
- },
+ "data": [
+ 123,
+ 34,
+ 118,
+ 101,
+ 114,
+ 115,
+ 105,
+ 111,
+ 110,
+ 34,
+ 58,
+ 52,
+ 44,
+ 34,
+ 117,
+ 117,
+ 105,
+ 100,
+ 34,
+ 58,
+ 34,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 45,
+ 48,
+ 48,
+ 48,
+ 48,
+ 45,
+ 48,
+ 48,
+ 48,
+ 48,
+ 45,
+ 48,
+ 48,
+ 48,
+ 48,
+ 45,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 34,
+ 44,
+ 34,
+ 112,
+ 97,
+ 116,
+ 104,
+ 34,
+ 58,
+ 34,
+ 109,
+ 47,
+ 49,
+ 50,
+ 51,
+ 56,
+ 49,
+ 47,
+ 51,
+ 54,
+ 48,
+ 48,
+ 47,
+ 48,
+ 47,
+ 48,
+ 34,
+ 44,
+ 34,
+ 112,
+ 117,
+ 98,
+ 107,
+ 101,
+ 121,
+ 34,
+ 58,
+ 34,
+ 57,
+ 48,
+ 97,
+ 57,
+ 97,
+ 50,
+ 52,
+ 50,
+ 98,
+ 49,
+ 97,
+ 97,
+ 48,
+ 99,
+ 100,
+ 52,
+ 52,
+ 53,
+ 56,
+ 51,
+ 57,
+ 56,
+ 99,
+ 55,
+ 55,
+ 52,
+ 57,
+ 55,
+ 50,
+ 48,
+ 48,
+ 101,
+ 52,
+ 56,
+ 53,
+ 102,
+ 53,
+ 53,
+ 99,
+ 49,
+ 54,
+ 98,
+ 49,
+ 101,
+ 55,
+ 97,
+ 51,
+ 49,
+ 52,
+ 54,
+ 97,
+ 99,
+ 55,
+ 52,
+ 98,
+ 102,
+ 102,
+ 52,
+ 50,
+ 56,
+ 55,
+ 50,
+ 100,
+ 50,
+ 102,
+ 55,
+ 54,
+ 101,
+ 54,
+ 51,
+ 54,
+ 56,
+ 57,
+ 98,
+ 101,
+ 55,
+ 48,
+ 54,
+ 54,
+ 102,
+ 53,
+ 53,
+ 55,
+ 101,
+ 57,
+ 56,
+ 53,
+ 101,
+ 98,
+ 100,
+ 54,
+ 55,
+ 49,
+ 49,
+ 49,
+ 52,
+ 34,
+ 44,
+ 34,
+ 99,
+ 114,
+ 121,
+ 112,
+ 116,
+ 111,
+ 34,
+ 58,
+ 123,
+ 34,
+ 107,
+ 100,
+ 102,
+ 34,
+ 58,
+ 123,
+ 34,
+ 102,
+ 117,
+ 110,
+ 99,
+ 116,
+ 105,
+ 111,
+ 110,
+ 34,
+ 58,
+ 34,
+ 112,
+ 98,
+ 107,
+ 100,
+ 102,
+ 50,
+ 34,
+ 44,
+ 34,
+ 112,
+ 97,
+ 114,
+ 97,
+ 109,
+ 115,
+ 34,
+ 58,
+ 123,
+ 34,
+ 100,
+ 107,
+ 108,
+ 101,
+ 110,
+ 34,
+ 58,
+ 51,
+ 50,
+ 44,
+ 34,
+ 99,
+ 34,
+ 58,
+ 57,
+ 57,
+ 57,
+ 44,
+ 34,
+ 112,
+ 114,
+ 102,
+ 34,
+ 58,
+ 34,
+ 104,
+ 109,
+ 97,
+ 99,
+ 45,
+ 115,
+ 104,
+ 97,
+ 50,
+ 53,
+ 54,
+ 34,
+ 44,
+ 34,
+ 115,
+ 97,
+ 108,
+ 116,
+ 34,
+ 58,
+ 34,
+ 102,
+ 51,
+ 100,
+ 55,
+ 54,
+ 48,
+ 48,
+ 55,
+ 97,
+ 98,
+ 97,
+ 49,
+ 48,
+ 100,
+ 49,
+ 57,
+ 99,
+ 53,
+ 49,
+ 102,
+ 102,
+ 100,
+ 48,
+ 51,
+ 49,
+ 49,
+ 48,
+ 49,
+ 97,
+ 99,
+ 55,
+ 56,
+ 48,
+ 56,
+ 57,
+ 99,
+ 55,
+ 51,
+ 50,
+ 53,
+ 100,
+ 51,
+ 49,
+ 54,
+ 56,
+ 100,
+ 52,
+ 57,
+ 50,
+ 53,
+ 48,
+ 57,
+ 55,
+ 51,
+ 53,
+ 100,
+ 55,
+ 102,
+ 48,
+ 54,
+ 52,
+ 98,
+ 102,
+ 99,
+ 34,
+ 125,
+ 44,
+ 34,
+ 109,
+ 101,
+ 115,
+ 115,
+ 97,
+ 103,
+ 101,
+ 34,
+ 58,
+ 34,
+ 34,
+ 125,
+ 44,
+ 34,
+ 99,
+ 104,
+ 101,
+ 99,
+ 107,
+ 115,
+ 117,
+ 109,
+ 34,
+ 58,
+ 123,
+ 34,
+ 102,
+ 117,
+ 110,
+ 99,
+ 116,
+ 105,
+ 111,
+ 110,
+ 34,
+ 58,
+ 34,
+ 115,
+ 104,
+ 97,
+ 50,
+ 53,
+ 54,
+ 34,
+ 44,
+ 34,
+ 112,
+ 97,
+ 114,
+ 97,
+ 109,
+ 115,
+ 34,
+ 58,
+ 123,
+ 125,
+ 44,
+ 34,
+ 109,
+ 101,
+ 115,
+ 115,
+ 97,
+ 103,
+ 101,
+ 34,
+ 58,
+ 34,
+ 55,
+ 102,
+ 48,
+ 53,
+ 55,
+ 102,
+ 50,
+ 97,
+ 51,
+ 51,
+ 52,
+ 53,
+ 49,
+ 97,
+ 54,
+ 54,
+ 53,
+ 99,
+ 51,
+ 97,
+ 56,
+ 101,
+ 49,
+ 54,
+ 100,
+ 99,
+ 53,
+ 53,
+ 50,
+ 101,
+ 48,
+ 98,
+ 49,
+ 99,
+ 51,
+ 56,
+ 54,
+ 102,
+ 57,
+ 50,
+ 50,
+ 97,
+ 56,
+ 48,
+ 100,
+ 102,
+ 100,
+ 55,
+ 50,
+ 48,
+ 56,
+ 101,
+ 102,
+ 57,
+ 56,
+ 97,
+ 102,
+ 97,
+ 52,
+ 57,
+ 57,
+ 100,
+ 99,
+ 100,
+ 34,
+ 125,
+ 44,
+ 34,
+ 99,
+ 105,
+ 112,
+ 104,
+ 101,
+ 114,
+ 34,
+ 58,
+ 123,
+ 34,
+ 102,
+ 117,
+ 110,
+ 99,
+ 116,
+ 105,
+ 111,
+ 110,
+ 34,
+ 58,
+ 34,
+ 97,
+ 101,
+ 115,
+ 45,
+ 49,
+ 50,
+ 56,
+ 45,
+ 99,
+ 116,
+ 114,
+ 34,
+ 44,
+ 34,
+ 112,
+ 97,
+ 114,
+ 97,
+ 109,
+ 115,
+ 34,
+ 58,
+ 123,
+ 34,
+ 105,
+ 118,
+ 34,
+ 58,
+ 34,
+ 50,
+ 102,
+ 99,
+ 53,
+ 98,
+ 56,
+ 55,
+ 57,
+ 98,
+ 55,
+ 56,
+ 50,
+ 56,
+ 49,
+ 99,
+ 56,
+ 101,
+ 53,
+ 98,
+ 54,
+ 57,
+ 57,
+ 57,
+ 48,
+ 52,
+ 100,
+ 98,
+ 98,
+ 97,
+ 98,
+ 97,
+ 54,
+ 34,
+ 125,
+ 44,
+ 34,
+ 109,
+ 101,
+ 115,
+ 115,
+ 97,
+ 103,
+ 101,
+ 34,
+ 58,
+ 34,
+ 55,
+ 55,
+ 48,
+ 53,
+ 49,
+ 98,
+ 48,
+ 102,
+ 48,
+ 51,
+ 56,
+ 49,
+ 49,
+ 98,
+ 49,
+ 98,
+ 48,
+ 98,
+ 100,
+ 98,
+ 52,
+ 56,
+ 101,
+ 52,
+ 52,
+ 57,
+ 55,
+ 55,
+ 97,
+ 99,
+ 55,
+ 48,
+ 99,
+ 54,
+ 56,
+ 53,
+ 51,
+ 49,
+ 50,
+ 97,
+ 97,
+ 54,
+ 100,
+ 102,
+ 51,
+ 49,
+ 99,
+ 56,
+ 98,
+ 51,
+ 52,
+ 57,
+ 49,
+ 97,
+ 57,
+ 100,
+ 101,
+ 54,
+ 51,
+ 98,
+ 54,
+ 50,
+ 54,
+ 54,
+ 34,
+ 125,
+ 125,
+ 125,
+ ],
+ "type": "Buffer",
}
`;
-exports[`decoders > getAddresses 1`] = `[]`;
+exports[`decoders > getAddresses 1`] = `
+[
+ "3M2FXWSJuiXMMysqySMRVnMeY53QATZfDY",
+ "3CWWEcfrTG9DA3fH7iUqEbPkmPLkZ9mAh8",
+ "38KsDrpJ5VRESQaP6AcxPrpHuUJmRp9zdh",
+ "3QfTD8srxJcgBhYXfuWD5UPYU7QFabXGg3",
+ "3BjhSD9J8kPU6H4kRGPqaMZXHZA4roDz4L",
+]
+`;
exports[`decoders > getKvRecords 1`] = `
{
"fetched": 1,
"records": [
{
- "caseSensitive": false,
- "id": 873313750,
- "key": "test",
+ "caseSensitive": true,
+ "id": 1062462936,
+ "key": "0x30da3d7A865C934b389c919c737510054111AB3A",
"type": 0,
- "val": "test",
+ "val": "Test Address Name",
},
],
"total": 1,
}
`;
-exports[`decoders > sign BTC 1`] = `
+exports[`decoders > sign - bitcoin 1`] = `
{
- "changeRecipient": "PA7wHSw",
- "sigs": [],
- "tx": "020000000002e8030000000000001976a9141826efb6399e3b7978b4af1728f1e007a76cb63e88ac401f00000000000003a9008700000000",
- "txHash": "3070c0edf91578d101ddcd4d77568870900f42cee5293ab772017ac92dc0ca98",
+ "changeRecipient": "tb1qdwc8mkm53dj4eprctqd08cfgxdwpdm9qrx3ccz",
+ "sigs": [
+ {
+ "data": [
+ 48,
+ 69,
+ 2,
+ 33,
+ 0,
+ 132,
+ 227,
+ 86,
+ 24,
+ 74,
+ 125,
+ 193,
+ 224,
+ 90,
+ 8,
+ 128,
+ 140,
+ 182,
+ 218,
+ 3,
+ 249,
+ 229,
+ 209,
+ 195,
+ 123,
+ 224,
+ 243,
+ 130,
+ 167,
+ 97,
+ 234,
+ 194,
+ 162,
+ 102,
+ 164,
+ 115,
+ 127,
+ 2,
+ 32,
+ 23,
+ 45,
+ 153,
+ 184,
+ 44,
+ 247,
+ 139,
+ 245,
+ 187,
+ 66,
+ 153,
+ 228,
+ 230,
+ 99,
+ 241,
+ 62,
+ 30,
+ 69,
+ 120,
+ 209,
+ 68,
+ 255,
+ 234,
+ 188,
+ 71,
+ 70,
+ 49,
+ 251,
+ 26,
+ 193,
+ 164,
+ 254,
+ ],
+ "type": "Buffer",
+ },
+ ],
+ "tx": "0200000000010135fa06fcfd26567f9d8f57073c34705df0a69339ce717654bcd24033dddbefb20000000000ffffffff02701101000000000017a9147d816ef0a39d6497963ebcf24d05242d51ada7438774090000000000001600146bb07ddb748b655c8478581af3e128335c16eca00248304502210084e356184a7dc1e05a08808cb6da03f9e5d1c37be0f382a761eac2a266a4737f0220172d99b82cf78bf5bb4299e4e663f13e1e4578d144ffeabc474631fb1ac1a4fe0121000000000000000000000000000000000000000002d423e4c1cc57744a0e73659500000000",
+ "txHash": "cc9f6840abe1ef0b2b106ebc5d87c8b013d42060da91cfeae1f7ce3b71638458",
}
`;
-exports[`decoders > sign ETH 1`] = `
+exports[`decoders > sign - generic 1`] = `
{
"pubkey": {
"data": [
4,
- 148,
- 178,
- 80,
- 242,
- 110,
- 253,
- 113,
- 8,
- 85,
- 91,
- 38,
- 229,
- 248,
- 152,
- 131,
- 100,
- 121,
- 193,
- 18,
- 28,
- 90,
- 3,
- 195,
- 182,
+ 165,
+ 13,
+ 125,
142,
- 8,
- 67,
- 173,
- 33,
- 168,
- 45,
+ 91,
+ 246,
+ 53,
+ 48,
+ 134,
+ 223,
+ 175,
+ 247,
+ 22,
+ 82,
+ 162,
+ 35,
+ 170,
+ 19,
+ 224,
34,
- 202,
- 61,
- 74,
- 238,
+ 115,
+ 162,
+ 182,
+ 191,
+ 90,
20,
- 38,
- 76,
- 5,
- 12,
- 128,
- 150,
- 49,
- 131,
- 4,
83,
- 23,
- 146,
- 125,
- 148,
- 195,
- 195,
- 48,
- 236,
- 111,
- 178,
- 84,
+ 20,
+ 181,
+ 68,
+ 190,
+ 18,
+ 129,
+ 172,
+ 143,
+ 120,
+ 208,
+ 53,
+ 135,
+ 74,
+ 6,
+ 177,
+ 30,
+ 61,
+ 246,
+ 142,
+ 69,
+ 247,
+ 99,
+ 11,
+ 46,
+ 107,
163,
- 241,
+ 190,
+ 15,
+ 81,
+ 249,
+ 22,
+ 251,
+ 182,
+ 240,
166,
- 192,
- 87,
- 180,
+ 64,
+ 57,
],
"type": "Buffer",
},
"sig": {
"r": {
"data": [
- 114,
- 118,
- 151,
- 110,
- 97,
- 16,
- 186,
- 70,
- 196,
- 192,
- 139,
- 179,
- 62,
- 192,
- 108,
- 200,
- 115,
- 169,
- 186,
+ 100,
+ 11,
+ 44,
+ 105,
+ 8,
+ 88,
+ 171,
+ 141,
+ 11,
+ 149,
+ 0,
+ 249,
+ 237,
+ 100,
+ 201,
+ 170,
+ 107,
+ 116,
+ 103,
+ 183,
+ 127,
+ 17,
+ 153,
176,
- 96,
- 184,
- 73,
- 175,
+ 97,
+ 170,
+ 150,
+ 234,
+ 120,
10,
- 106,
- 194,
- 24,
- 0,
- 78,
- 146,
- 93,
+ 173,
+ 170,
],
"type": "Buffer",
},
"s": {
"data": [
- 32,
- 178,
- 106,
- 16,
- 174,
- 25,
- 37,
- 137,
- 204,
- 69,
- 3,
- 15,
- 237,
- 223,
- 31,
- 122,
- 189,
- 235,
+ 72,
+ 248,
+ 48,
+ 249,
+ 41,
+ 13,
+ 209,
+ 179,
+ 234,
+ 241,
+ 146,
+ 46,
+ 8,
+ 168,
+ 201,
+ 146,
+ 135,
+ 59,
+ 225,
+ 22,
+ 43,
+ 214,
+ 213,
+ 190,
246,
- 2,
- 106,
- 53,
+ 129,
+ 207,
145,
- 47,
- 18,
- 92,
19,
- 140,
- 27,
- 120,
- 206,
- 76,
+ 40,
+ 171,
+ 229,
],
"type": "Buffer",
},
@@ -3109,43 +3690,3 @@ exports[`decoders > sign ETH 1`] = `
},
}
`;
-
-exports[`decoders > sign ETH_MSG 1`] = `
-{
- "sig": {
- "r": "7db9e97fa8a2de98835bd320dc2a77fbbe1babe60f67cb405d0ba25c9d49ff3d",
- "s": "6fc01778bea900509bad56d262a7c7546d3cb2fb6d5a1236bb012cf68ea66641",
- "v": {
- "data": [
- 28,
- ],
- "type": "Buffer",
- },
- },
- "signer": {
- "data": [
- 134,
- 6,
- 11,
- 178,
- 93,
- 247,
- 182,
- 95,
- 81,
- 83,
- 152,
- 136,
- 64,
- 248,
- 140,
- 19,
- 238,
- 211,
- 161,
- 139,
- ],
- "type": "Buffer",
- },
-}
-`;
diff --git a/src/__test__/unit/__snapshots__/decrypters.test.ts.snap b/src/__test__/unit/__snapshots__/decrypters.test.ts.snap
deleted file mode 100644
index 4b327c90..00000000
--- a/src/__test__/unit/__snapshots__/decrypters.test.ts.snap
+++ /dev/null
@@ -1,15 +0,0 @@
-// Vitest Snapshot v1
-
-exports[`decrypters > addKvRecords 1`] = `"0474065b047e4d78221796d230ae2f65e59fcf6835ffd11f9489839e316815e2380f099a5eee4d984456bd7f0240173a05cc4fb856af08ae345a75ba1138647ca2b7747310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-
-exports[`decrypters > fetchActiveWallet 1`] = `"04559363c25bf3890503ef962c54539da171bb850c40703658da61cfcb4d4c5232082d6b8619e49a922f08d6a1ff9f2291f2e13d46acd434d2a6713038e83f3fda30d394a771c122ce35f7878bf6810567ef679947dd537df3621f271297adcba8000000014c6f7374206469676974616c2d676f6c64206f66205361746f736869000000000000002d337479d775a93e2f67533de0dccedc52f3d2080cd3b1fd01cada670ea6f718000000014c6f7374206469676974616c2d676f6c64206f66205361746f73686900000000000000cf0a93ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-
-exports[`decrypters > getAddresses 1`] = `"04c2ad6fcfb7259fd1ccbead753cd4ebcb56eb361b77446a9a0f7c95bd181facf719a1c546a58a3aa8dcc6cbee476784607639ce0a1b841c7a7817787fb114416b3078383630363062623235646637623635663531353339383838343066383863313365656433613138620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005dc44c3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-
-exports[`decrypters > getKvRecords 1`] = `"049a716cdcdf5f8b341561e09dd7b286278c19ff6bbd33e32a18f4964e40330073e9134588eb44dad2d35f69e87acac0a24658de84f06552a77246d56efb098ed60000000101340db5d6000000000005746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574657374000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf465bf6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-
-exports[`decrypters > pair 1`] = `"048de0f29258c1f5db855d23b72ece49d2e9f8b54bbcc472194e3c8332a716c618cfa1fceefdfa8152a40a14427a48955424a8ff296a01017970c40505bbcac5c846ec172d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-
-exports[`decrypters > removeKvRecords 1`] = `"04100099c67d24880a3312befd66a1342f9ac64d23e331ffcf511b57e27ef188a49e7f6c5041a7c313080c0dab2f5f97c1192046ae9f435a9e626d640b432ec4a9d223cd4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-
-exports[`decrypters > sign 1`] = `"04ec1322cec47925e25bc2f0917e4d40ab12f10790f52815252c25df1bb6ca1741461313edb6adcdc467600ad1a1ebc8102bd599d86df1bb9109fc13de8c1982690494b250f26efd7108555b26e5f898836479c1121c5a03c3b68e0843ad21a82d22ca3d4aee14264c050c80963183045317927d94c3c330ec6fb254a3f1a6c057b43045022100fc29efbd1f40a5fb0e79004e85d1eb33890185175ddac6b3512b23ddf20a82cf02202945662e4f657e21a7535b50c41f74ae04da4de6384531fead623ea05f343d4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055b089340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
diff --git a/src/__test__/unit/__snapshots__/encoders.test.ts.snap b/src/__test__/unit/__snapshots__/encoders.test.ts.snap
index 21a2b2c0..d6641ded 100644
--- a/src/__test__/unit/__snapshots__/encoders.test.ts.snap
+++ b/src/__test__/unit/__snapshots__/encoders.test.ts.snap
@@ -6,116 +6,112 @@ exports[`encoders > KvRecords > getKvRecords 1`] = `"000000000100000000"`;
exports[`encoders > KvRecords > removeKvRecords 1`] = `"000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > connect > connect encoder 1`] = `"11111111111111111111111111111111"`;
+exports[`encoders > getAddresses > encodeGetAddressesRequest with ED25519_PUB 1`] = `"162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2058000002c8000003c80000000000000000000000041"`;
-exports[`encoders > connect > connect encoder 2`] = `"01021a1a1a1a004201047431b18f055ac873b1eb7d74d8716ad1e3df06908b00cc2f901153f8eb6428184867c0fdab339c6c490a39ae704d29b5b4c2f1244350a29059622cf49b421155516ed68e"`;
+exports[`encoders > getAddresses > encodeGetAddressesRequest with SECP256K1_PUB 1`] = `"162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2058000002c8000003c80000000000000000000000031"`;
-exports[`encoders > getAddresses > encodeGetAddressesRequest with ED25519_PUB 1`] = `"7465737400000000000000000000000000000000000000000000000000000000058000002c8000003c80000000000000000000000001"`;
-
-exports[`encoders > getAddresses > encodeGetAddressesRequest with SECP256K1_PUB 1`] = `"7465737400000000000000000000000000000000000000000000000000000000058000002c8000003c80000000000000000000000001"`;
-
-exports[`encoders > getAddresses > encodeGetAddressesRequest with default flag 1`] = `"7465737400000000000000000000000000000000000000000000000000000000058000002c8000003c80000000000000000000000001"`;
+exports[`encoders > getAddresses > encodeGetAddressesRequest with default flag 1`] = `"162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2058000002c8000003c80000000000000000000000001"`;
exports[`encoders > pair > pair encoder 1`] = `"11111111111111111111111111111111"`;
exports[`encoders > pair > pair encoder 2`] = `"746573747465737400000000000000000000000000000000003044022065a197118869c9dbe800c7ffad2e6edb7c0e6f74297b012a7bb5cb5e4e194514022056e5e010f9ee256b560d15af300c75b5336069994181ab6f51d6313905bf1c4300000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.10.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.10.0 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.10.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.10.1 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.10.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.10.2 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.10.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.10.3 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.10.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.10.4 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.11.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.11.0 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.11.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.11.1 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.11.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.11.2 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.11.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.11.3 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.11.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.11.4 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.12.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.12.0 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.12.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.12.1 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.12.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.12.2 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.12.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.12.3 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.12.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.12.4 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.13.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.13.0 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.13.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.13.1 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.13.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.13.2 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.13.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.13.3 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.13.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.13.4 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.14.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.14.0 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.14.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.14.1 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.14.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.14.2 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.14.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.14.3 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.14.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.14.4 1`] = `"0001162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd20101050000002c0000803c00008000000080000000000000000080000000000000008000000080000000c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.15.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.15.0 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.15.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.15.1 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.15.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.15.2 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.15.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.15.3 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.15.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.15.4 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.16.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.16.0 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.16.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.16.1 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.16.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.16.2 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.16.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.16.3 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.16.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.16.4 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.17.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.17.0 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.17.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.17.1 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.17.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.17.2 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.17.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.17.3 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.17.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.17.4 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.18.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.18.0 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.18.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.18.1 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.18.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.18.2 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.18.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.18.3 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.18.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.18.4 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.19.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.19.0 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.19.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.19.1 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.19.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.19.2 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.19.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.19.3 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
-exports[`encoders > sign > should test sign encoder with firmware v0.19.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
+exports[`encoders > sign > should test sign encoder with firmware v0.19.4 1`] = `"0005162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2040000000100050000002c0000803c000080000000800000000000000000002e00ed84800000008480000000848000000094c0c8f96c2fe011cc96770d2e37cfbfeafb585f0e84800000000001808000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`;
diff --git a/src/__test__/unit/__snapshots__/encrypters.test.ts.snap b/src/__test__/unit/__snapshots__/encrypters.test.ts.snap
deleted file mode 100644
index 016cb223..00000000
--- a/src/__test__/unit/__snapshots__/encrypters.test.ts.snap
+++ /dev/null
@@ -1,15 +0,0 @@
-// Vitest Snapshot v1
-
-exports[`encrypters > addKvRecords 1`] = `"01021a1a1a1a06c5025742d3d5d80c0d7d33c0f7c63b891d6aab51df5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2792179"`;
-
-exports[`encrypters > fetchActiveWallet 1`] = `"01021a1a1a1a06c5025742d3d59bffbd66b864ce21894d3109c3bd4e6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e65f5dc0"`;
-
-exports[`encrypters > getAddresses 1`] = `"01021a1a1a1a06c5025742d3d5ae818a7d4eb6256d0d44891d4765a3960738d997fd4b730e44a1bea654444e048589f85aa3ab3e52a6cde25840a4a1a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013c495e0"`;
-
-exports[`encrypters > getKvRecords 1`] = `"01021a1a1a1a06c5025742d3d59a61950ffbddb0dcbfbb539536f296e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aab69a3"`;
-
-exports[`encrypters > pair 1`] = `"01021a1a1a1a06c5025742d3d54ceb0a4632d3a72c395ae4620a88704e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642050a2"`;
-
-exports[`encrypters > removeKvRecords 1`] = `"01021a1a1a1a06c5025742d3d56e9ebe8a4afbd6a7789f63e4518dffd3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041606c1f"`;
-
-exports[`encrypters > sign 1`] = `"01021a1a1a1a06c5025742d3d51c02f37575e771648d53e8fd886e4d620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5ed3419"`;
diff --git a/src/__test__/unit/__snapshots__/validators.test.ts.snap b/src/__test__/unit/__snapshots__/validators.test.ts.snap
deleted file mode 100644
index 664f91fc..00000000
--- a/src/__test__/unit/__snapshots__/validators.test.ts.snap
+++ /dev/null
@@ -1,146 +0,0 @@
-// Vitest Snapshot v1
-
-exports[`validators > KvRecords > addKvRecords > should successfully validate 1`] = `
-{
- "fwConstants": {
- "kvActionsAllowed": true,
- },
- "sharedSecret": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- "url": "test.com",
- "validRecords": {
- "key": "value",
- },
-}
-`;
-
-exports[`validators > KvRecords > getKvRecords > should successfully validate 1`] = `
-{
- "fwConstants": {
- "kvActionsAllowed": true,
- },
- "n": 1,
- "sharedSecret": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- "start": 0,
- "type": 1,
- "url": "test.com",
-}
-`;
-
-exports[`validators > KvRecords > removeKvRecords > should successfully validate 1`] = `
-{
- "fwConstants": {
- "kvActionsAllowed": true,
- },
- "ids": [
- 1,
- ],
- "sharedSecret": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- "type": 1,
- "url": "test.com",
-}
-`;
-
-exports[`validators > connect > should successfully validate 1`] = `"test"`;
-
-exports[`validators > fetchActiveWallet > should successfully validate 1`] = `
-{
- "sharedSecret": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- "url": "test.com",
-}
-`;
-
-exports[`validators > getAddresses > should successfully validate 1`] = `
-{
- "fwVersion": {
- "data": [
- 0,
- 12,
- 0,
- ],
- "type": "Buffer",
- },
- "sharedSecret": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- "url": "asdf",
- "wallet": {
- "capabilities": 1,
- "external": true,
- "name": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- "uid": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- },
-}
-`;
-
-exports[`validators > sign > should successfully validate 1`] = `
-{
- "fwConstants": {
- "kvActionsAllowed": true,
- },
- "sharedSecret": {
- "data": [
- 116,
- 101,
- 115,
- 116,
- ],
- "type": "Buffer",
- },
- "url": "test.com",
- "wallet": "wallet",
-}
-`;
diff --git a/src/__test__/unit/decoders.test.ts b/src/__test__/unit/decoders.test.ts
index 033116d8..a447dbf7 100644
--- a/src/__test__/unit/decoders.test.ts
+++ b/src/__test__/unit/decoders.test.ts
@@ -1,115 +1,76 @@
import {
decodeConnectResponse,
- decodeFetchActiveWalletResponse,
- decodeGetAddresses,
+ decodeGetAddressesResponse,
decodeGetKvRecordsResponse,
+ decodeFetchEncData,
decodeSignResponse,
} from '../../functions';
-import { getP256KeyPair } from '../../util';
-import { buildFirmwareConstants } from '../utils/builders';
-import { REUSABLE_KEY } from '../utils/helpers';
import {
- connectDecryptedData,
- fetchActiveWalletDecryptedData,
- getKvRecordsDecryptedData,
- signEthDecryptedData,
- signEthMsgDecryptedData,
+ clientKeyPair,
+ decoderTestsFwConstants,
+ connectDecoderData,
+ getAddressesFlag,
+ getAddressesDecoderData,
+ signBitcoinRequest,
+ signBitcoinDecoderData,
+ signGenericRequest,
+ signGenericDecoderData,
+ getKvRecordsDecoderData,
+ fetchEncryptedDataRequest,
+ fetchEncryptedDataDecoderData,
} from './__mocks__/decoderData';
describe('decoders', () => {
test('connect', () => {
- const decryptedData = connectDecryptedData;
- const key = getP256KeyPair(Buffer.from(REUSABLE_KEY, 'hex'));
- expect(decodeConnectResponse(decryptedData, key)).toMatchSnapshot();
- });
-
- test('fetchActiveWallet', () => {
- const decryptedData = fetchActiveWalletDecryptedData;
- expect(decodeFetchActiveWalletResponse(decryptedData)).toMatchSnapshot();
+ expect(
+ decodeConnectResponse(connectDecoderData, clientKeyPair),
+ ).toMatchSnapshot();
});
test('getAddresses', () => {
- const decryptedData = Buffer.from([0, 0, 0]);
- const flag = 0;
- expect(decodeGetAddresses(decryptedData, flag)).toMatchSnapshot();
- });
-
- test('sign BTC', () => {
- const data = Buffer.from('5b302c20302c20305d', 'hex');
- const request = {
- payload: Buffer.from(
- 'c4050000003100008001000080000000800100000000000000e80300006f1826efb6399e3b7978b4af1728f1e00',
- 'hex',
- ),
- schema: 0,
- origData: {
- prevOuts: [[{}]],
- recipient: 'mhifA1DwiMPHTjSJM8FFSL8ibrzWaBCkVT',
- value: 1000,
- fee: 1000,
- changePath: [2147483697, 2147483649, 2147483648, 1, 0],
- fwConstants: buildFirmwareConstants(),
- },
- changeData: { value: 8000 },
- };
- const currency = 'BTC';
- const isGeneric = false;
expect(
- decodeSignResponse({ data, request, isGeneric, currency }),
+ decodeGetAddressesResponse(getAddressesDecoderData, getAddressesFlag),
).toMatchSnapshot();
});
- test('sign ETH', () => {
- const data = signEthDecryptedData;
- const request = {
- payload: Buffer.from(
- '040000000100050000002c0000803c00008000000080000000000000000000fd0b3e957d90bb196dcfbd4424af1430b3d0595841d37fb0fba9f0cfdf5286dae0150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
- 'hex',
- ),
- extraDataPayloads: [],
- schema: 5,
- curveType: 0,
- encodingType: 4,
- hashType: 1,
- omitPubkey: false,
- origPayloadBuf: Buffer.from(
- '02f90bf901808447868c008447868c0082c35094e242e54155b1abc71fc118065270cecaaf8b776885e8d4a51000b90bcbe34859b84f2f0f7bd6aff353125625b88ee6b106042bc9a1b51a498a257d1b2b0538d3ce1cadcf1faf2d6bada2cd4433a1f1f586d07b5d99519d4ff67f6d38a35908cff0c0e55a5a7557b3dd5158307a20347e150e0967c8c563dc3334ebaed0364b5e9944e930348a19dc85fc79d887e9501d15645c69a15dd815410f8bb34699efe12e22951eed3d3a2615bf31a14cbfae8475bbce94fb9019dd9a9c7b1af146dc59a9dbd464219cb2da82f310592a18c5fc2075174f0a40398e1e7d483c226313c51b2baaaf14e9a7b3ae83be693bbcb4678b7fe2dc777d8b2d40c5bc4016ed2788e3c6fcc0d4f1445eda5c359f9051b7dc04c956d03b67baebc0de67eee5df18bda89f26ed9d342a0411d3a24ff3b83e214005644e2f9b878e27914464f710a88d15d9d2005bedb403eddc9004e8babd09a786c6cc1aeeb2d0db30d06306f551f941cf7399d6379fd56b7ee1762e9fcd57b4d0717b722360caa3274bb4c615ba9f286a7f1205dea9ad691f611507e0715fa60f5c198b0f21bcbd0bd278f2340f5490781a95921ce808f7b2e9e371abe96bb16b7441283957154c8f5060d47c376558914a6c637a857e7aa4fde004a27cb989b68302d577349d1a516b58777a955f281ce2afa22f36304e44810a53204347788445c3a3fbb1b3cbf14f605c04f432ebf528c228708c9ad1b2c23110d566a8815e4ea43fcde9d1895ab061ce323bc76ced74817b393a3d8be77ea5bae6bcb7c7590432f54b240447321ccafa9fe11907a17784946d774b11382e07dfc0b8a8ee0177a980b43ba90feeaa6c47c3bf373ca1c19927b17e4cfcc39c7bd7c5b67fdf922d8641e2ff62cc8ea0c2d4f770b649b84e7af29a7595355d18e06e872812e112fdb8255e8fddd27a6b0e6de51de724176ee8abb17e1d480083d473e7b779f46f37db38da58f5ad4c0d19474ecae0d9d059e8d62f27f818d9649a55000610987a2b8bd892ae851cd571499019b280a42d7988b32d9512f77d1f701e16baff9e4d1bd2ccbfabdf5af133934b5fd5ed69f20128018c2b7abf9ecf96fa3406bf19bdbd2f402b612bd7e2265725b9dacbc7aa31f1c05fb690c74dff088137dedcefbe560187d12ac7e8eeecce06b1024fb1cc8f2b363032ad3a84446532730ef879ba35be36ac0385ce60ef81f593712c76a21cbbc56e81194db29aec74ac900e15bc354f0567572ee5ba3105dcfc1cbd897e3452535b63b9cfb017d0fe331cf6d8ce377d96307e2be7c1cb7179abe9c41483829a01222cb2936854308262ad1d219cbd4e53fdb2df1451db9358cc1c4fd8eacf23d98a9f63aa95aef3115ebb5eb6a793d4a2e5f8933a609d0330ae13542a41beba616a15c59135f111c4e1901d278a60028b40bc6e9e15899407484ccb893a43e3d962f4aafb191334f2c3fbb0a9868cd358a4e4ae94786cd5df4952cad67593e91cb821b4d0c2c4b77945c2f603e34b6b9638fc0d57d476f592747f78dc86d0833cc589d07b60ec53b9daa3fbf9efc1df71ad79be5202e5dfc39d7e80e6a76b7045b770a4e3b0d27291e8bdc1a8d7166082899b0a3200321489cc7760ce454366656bd895c44a7bb3107e022bb0477c414a7a7d3a212e4f3f02aea9c7d762e2d17aa2b4b0a32c2e42139026ba878b360197524f177084c8d056d175a4befd6a83c33fe216a7ad6ffb95a076c458e40255eea6ce617366ed53f6e4f69e893db4ef9b367ec383759839c1f4b0e2708d40662cd69dda8e5f9ba7364ab9acc1ea340f82c43e23b1040832e139c025b73a84b7d58608b8a8d002d88df458cc593dddfae6d732b70bf35d32e5e868a3acf19cd83c9db8de926236ab87388a771fe7ad9946180bc75badb0bc7e0f0cf4a8e36d3794284f4e81d90f85433246a62861a72d4d15f1740695636fb9274bae63875ad4154861a2e95933d5ab131b83025d349b167ea3e59059870f732f72acd9060299896e6f6f76049ac09727b1c8040ea61027e08212546668f41dc0d3dc9e924ab27e1378ec58b44c3e5d40be5d8fa7a6b520d9f0b3f5a2d2501382653ce536d908da4c7ff191b2d6705c4c4a6f47e5f5b40b8bb741f6fe485a60d07de97207c4324d57cdd6b4eff4384b13fbc8c86d4695b892520df148bcb1ee0dbf1267014b92eeefb77298eae64dcc4d9c045c2e974c8e12ea1ecf08865961223f801fec4bdfdef3cbfa643384e1ddb3a7e73023c7368e2e9082c8181551b7b43a41d9aaf9b06a63d508156ffb890f75217c91ab00dedb0fbcfc343b7c23aa4b88d4c84b41bb32e158a55e1dc897453d970eb7466dee714d368884691e08db69c4fc454a86f5af5d6ffad2d8f62f94294c623fe86159ca307cee1a64350c939bbaaeb62559803033bb59b791d1c8a02a72e37177333d8aa03d4423fc35cf364ba1dd836abf41abe485d066cfe34f026be2a6b81f9b6b2f4e9f69bca71f97ad46911a56229202d9668249e2cd0dfe0982b92c4be7a5e4a8d70cfd436fdf9e0f913c4956b91f4ee07f96045ffe92060bc7b8f99c5dbc1d4903586ecebf86837f1e920ee5c42b648d083b993ba4cbc92731b0ad680a0c776099ac605c3ea5ecee9eb089b31d0d5122348180f89d59fc01192ddbe7a3aac72d9821ffb51dd1ecb382352c07270cbdcb853d782b9b007e19f61a7c901d079a2aa899c257c00f517272d87106d92cfbc66b287587520ab899dbc709cc780915eae76d6b32c5ec5450806d1696f553f79614276c5fa8de2a1dfedc3737bc0bc57ee1ee86bef5036ff1741f91ed6db7db07fa5d2845d8012e01f06bd3b2963a2ff3e52ce6a93668011ab09e326c05e596ef12993a2ce2f34646f4d17cbef97d6e88ea65731cd5dd7bf8cce9c1893a7a7a36cbfae8baed3f3a2a0e94412d0c8524c430c4765f9d096ff3a180fb469fd6fc8bb7c536f5b37cd1928906c1449da4cc3230bb3e556510319b8c801d92b0b390db7798f4f8b7e2b5359f5f79cb0df654c4bb3398b5210f6d3309a3fb58e640723bf44d908750ce339701a7794e5bbd9ab240890dd29578b7201a4ca291833a13e77eead114cf6ad61b2e32f2d8e6c1352f12fb4ed1475f782057747b15e5a43d9a14b98a3b10172f7e0a675e2b916fd366fa9707cfb090dd99054c7202b86b03747990009d13f751f6f45a8bf56736e101d873bf5753ada69c9456708f7fd88fc35481c76f9c0f258296a893b73b73a0605ff09f113f69e3ac601328d4e6f0da7be8e5dad49e2099574066fa55efbd019a8650d294d2d848617d74b7d4710e0c262a02922f78e76423c4c94ae53635a21de1f4951b679d5cb78993d818728bbca1e101e04016b73d986ee02d6110c512ec13e6b9869f971b39dcdfee3f53f38879108b5c553df43403243e01954c8883955243ba92721c65c84170cea37d29a82b13666e8c6c346309308165166ea762a18d5d1f7bb0a713c9574a7e614923f40cab4360190d52535dee46b90cde15d1375b1ef6fb52ff26d30819ba7dc2e01e2985140985db4475cc5cf312f26004e42d7526e51695eb8f891d7311237974bc341a2c351ed62318bf04f9c07e46985d9822c5e3dcbee9defa983a47f331a7638cb188497f33a6856e9232a06ba9dc6c790c687b328fa35772177da32792e7dc22a70c1b1c542efb9ad34046bedf89a12c93dc4539a0535cbd7932f78c6c9cd253fdb5cea6fc76bea2093ae1a0ce3b13cda17f4dc42d6a37204f49706139623368016126ed5ba788fb54d878b66428191b01a6c3b00a94118b416e6e7bd76edc74d0cce62e943e8a575e81638b9caa1de6ad122d19e5741129f5b2a53516b87355fd8ca0e7f93fb6438402eec8a20975f1bc8d6efcdaf68c11d59a72a14a1bb3ff279cbd4b01353ede78833da2356b36f37033689077e71f626595d9878b2a553b22662e189321a31bb3910d9128245be9cfcd1c19015c2689cfeabd236fa907ec11d93489660ef280697ecc6471761eaea19e6513309f8b7988f048252bab478421041efb086858a6cfc3eafb8dde97b79ce83f37bfe042d1114de8ee60d40b6190d7d6fa2f66bddbcb307cd7e8d0b7d330135f2251b663618f17ef16c7605d1ae9afe7a587f78a405ef2d45f57c25e458aee5aab475a130d5b5f334889957f242cb40db12c15530a5e841df78646c6578573bee178f10910e40ebe3505a745334b8f9daff70963c40a8d47a39954f0a950d2436b9c7138f46e94f2b884477e680dfba960e3f2251337200f1858fe12a3c3273ec0',
- 'hex',
- ),
+ test('sign - bitcoin', () => {
+ const params: DecodeSignResponseParams = {
+ data: signBitcoinDecoderData,
+ request: signBitcoinRequest,
+ isGeneric: false,
+ currency: 'BTC',
};
- const isGeneric = false;
- expect(decodeSignResponse({ data, request, isGeneric })).toMatchSnapshot();
+ expect(decodeSignResponse(params)).toMatchSnapshot();
});
- test('sign ETH_MSG', () => {
- const data = signEthMsgDecryptedData;
- const request = {
- schema: 3,
- payload: Buffer.from(
- ' 00050000002c0000803c000080000000800000000000000000010300abcdef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
- 'hex',
- ),
- input: {
- signerPath: [2147483692, 2147483708, 2147483648, 0, 0],
- payload: Buffer.from('abcdef', 'hex'),
- protocol: 'signPersonal',
- fwConstants: buildFirmwareConstants(),
- },
- msg: Buffer.from('abcdef', 'hex'),
- extraDataPayloads: [],
+ test('sign - generic', () => {
+ const params: DecodeSignResponseParams = {
+ data: signGenericDecoderData,
+ request: signGenericRequest,
+ isGeneric: true,
};
- const currency = 'ETH_MSG';
- const isGeneric = false;
- expect(
- decodeSignResponse({ data, request, isGeneric, currency }),
- ).toMatchSnapshot();
+ expect(decodeSignResponse(params)).toMatchSnapshot();
});
test('getKvRecords', () => {
- const decryptedData = getKvRecordsDecryptedData;
- const fwConstants = buildFirmwareConstants();
expect(
- decodeGetKvRecordsResponse(decryptedData, fwConstants),
+ decodeGetKvRecordsResponse(
+ getKvRecordsDecoderData,
+ decoderTestsFwConstants,
+ ),
).toMatchSnapshot();
});
+
+ test('fetchEncryptedData', () => {
+ // This test is different than the others because one part of the data is
+ // randomly generated (UUID) before the response is returned.
+ // We will just zero it out for testing purposes.
+ const decoded = decodeFetchEncData({
+ data: fetchEncryptedDataDecoderData,
+ ...fetchEncryptedDataRequest,
+ });
+ const decodedDerp = JSON.parse(decoded.toString());
+ decodedDerp.uuid = '00000000-0000-0000-0000-000000000000';
+ expect(Buffer.from(JSON.stringify(decodedDerp))).toMatchSnapshot();
+ });
});
diff --git a/src/__test__/unit/decrypters.test.ts b/src/__test__/unit/decrypters.test.ts
deleted file mode 100644
index 5409a8ec..00000000
--- a/src/__test__/unit/decrypters.test.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import {
- decryptPairResponse,
- decryptFetchActiveWalletResponse,
- decryptGetAddressesResponse,
- decryptSignResponse,
- decryptGetKvRecordsResponse,
- decryptAddKvRecordsResponse,
- decryptRemoveKvRecordsResponse,
-} from '../../functions';
-import {
- pairEncryptedResponse,
- fetchActiveWalletEncryptedResponse,
- getAddressesEncryptedResponse,
- signEncryptedResponse,
- getKvRecordsEncryptedResponse,
- addKvRecordsEncryptedResponse,
- removeKvRecordsEncryptedResponse,
-} from './__mocks__/decryptersData';
-
-describe('decrypters', () => {
- test('pair', () => {
- const encryptedResponse = pairEncryptedResponse;
- const sharedSecret = Buffer.from(
- '19c5bb9839d81eb975aed91b865728f10d5836d0a96497dae396d01da39cff9d',
- 'hex',
- );
- const { decryptedData } = decryptPairResponse(
- encryptedResponse,
- sharedSecret,
- );
- expect(decryptedData.toString('hex')).toMatchSnapshot();
- });
-
- test('fetchActiveWallet', () => {
- const encryptedResponse = fetchActiveWalletEncryptedResponse;
- const sharedSecret = Buffer.from(
- '7b42b92db38d6b154fd6855d2793b1bd6b74cc4ebc022720a89d890fed39d271',
- 'hex',
- );
- const { decryptedData } = decryptFetchActiveWalletResponse(
- encryptedResponse,
- sharedSecret,
- );
- expect(decryptedData.toString('hex')).toMatchSnapshot();
- });
-
- test('getAddresses', () => {
- const encryptedResponse = getAddressesEncryptedResponse;
- const sharedSecret = Buffer.from(
- 'ea07e69e110c91daa1956f9fd09d02a3926c90a23e2194edc44c5a072760b0d2',
- 'hex',
- );
- const { decryptedData } = decryptGetAddressesResponse(
- encryptedResponse,
- sharedSecret,
- );
- expect(decryptedData.toString('hex')).toMatchSnapshot();
- });
-
- test('sign', () => {
- const encryptedResponse = signEncryptedResponse;
- const sharedSecret = Buffer.from(
- '7fd212816bc3f786a105dc2c1f1427ba16c82895ae2ca2ab0ab5aa74333da5c1',
- 'hex',
- );
- const { decryptedData } = decryptSignResponse(
- encryptedResponse,
- sharedSecret,
- );
- expect(decryptedData.toString('hex')).toMatchSnapshot();
- });
-
- test('getKvRecords', () => {
- const encryptedResponse = getKvRecordsEncryptedResponse;
- const sharedSecret = Buffer.from(
- 'fd9a2e92003c72c574f4b7f5a52c81ac75eabbba1530cea6b88e5fe759fa5d68',
- 'hex',
- );
- const { decryptedData } = decryptGetKvRecordsResponse(
- encryptedResponse,
- sharedSecret,
- );
- expect(decryptedData.toString('hex')).toMatchSnapshot();
- });
-
- test('addKvRecords', () => {
- const encryptedResponse = addKvRecordsEncryptedResponse;
- const sharedSecret = Buffer.from(
- '7d07d7b0116de8e1fc7beefdf79ce0ac0c6f5550aad2a5df65d556282a3b7d2f',
- 'hex',
- );
- const { decryptedData } = decryptAddKvRecordsResponse(
- encryptedResponse,
- sharedSecret,
- );
- expect(decryptedData.toString('hex')).toMatchSnapshot();
- });
-
- test('removeKvRecords', () => {
- const encryptedResponse = removeKvRecordsEncryptedResponse;
- const sharedSecret = Buffer.from(
- 'fbf8c2922e33023b1cb4478ce7316b92a1a275e87b18ea7940e2eef31cf35f8a',
- 'hex',
- );
- const { decryptedData } = decryptRemoveKvRecordsResponse(
- encryptedResponse,
- sharedSecret,
- );
- expect(decryptedData.toString('hex')).toMatchSnapshot();
- });
-});
diff --git a/src/__test__/unit/encoders.test.ts b/src/__test__/unit/encoders.test.ts
index a59fb31a..7ee7a6aa 100644
--- a/src/__test__/unit/encoders.test.ts
+++ b/src/__test__/unit/encoders.test.ts
@@ -1,18 +1,19 @@
import { EXTERNAL } from '../../constants';
import {
encodeAddKvRecordsRequest,
- encodeConnectRequest,
encodeGetAddressesRequest,
encodeGetKvRecordsRequest,
encodePairRequest,
encodeRemoveKvRecordsRequest,
encodeSignRequest,
} from '../../functions';
+import { buildTransaction } from '../../shared/functions';
import { getP256KeyPair } from '../../util';
import {
buildFirmwareConstants,
buildGetAddressesObject,
- buildTransactionObject,
+ buildSignObject,
+ buildWallet,
getFwVersionsList,
} from '../utils/builders';
@@ -27,31 +28,24 @@ describe('encoders', () => {
mockRandom.mockRestore();
});
- describe('connect', () => {
- test('connect encoder', () => {
- const privKey = Buffer.alloc(32, '1');
- expect(privKey.toString()).toMatchSnapshot();
- const key = getP256KeyPair(privKey);
- const payload = encodeConnectRequest(key);
- const payloadAsString = payload.toString('hex');
- expect(payloadAsString).toMatchSnapshot();
- });
- });
-
describe('pair', () => {
test('pair encoder', () => {
const privKey = Buffer.alloc(32, '1');
expect(privKey.toString()).toMatchSnapshot();
const key = getP256KeyPair(privKey);
- const payload = encodePairRequest(key, 'testtest', 'testtest');
+ const payload = encodePairRequest({
+ key,
+ pairingSecret: 'testtest',
+ appName: 'testtest',
+ });
const payloadAsString = payload.toString('hex');
expect(payloadAsString).toMatchSnapshot();
});
});
+
describe('getAddresses', () => {
test('encodeGetAddressesRequest with default flag', () => {
- const mockObject = buildGetAddressesObject({});
- const payload = encodeGetAddressesRequest(mockObject);
+ const payload = encodeGetAddressesRequest(buildGetAddressesObject());
const payloadAsString = payload.toString('hex');
expect(payloadAsString).toMatchSnapshot();
});
@@ -73,34 +67,27 @@ describe('encoders', () => {
const payloadAsString = payload.toString('hex');
expect(payloadAsString).toMatchSnapshot();
});
-
- test('encodeGetAddressesRequest should throw with invalid startPath on old firmware', () => {
- const startPath = [0x80000000 + 44, 0x80000000 + 60, 0, 0, 0, 0, 0];
- const fwVersion = Buffer.from([0, 0, 0]);
- const testEncodingFunction = () =>
- encodeGetAddressesRequest(
- buildGetAddressesObject({ startPath, fwVersion }),
- );
- expect(testEncodingFunction).toThrowError(
- 'derivation paths with 5 indices',
- );
- });
});
describe('sign', () => {
test.each(getFwVersionsList())(
'should test sign encoder with firmware v%d.%d.%d',
(major, minor, patch) => {
- const { payload } = encodeSignRequest(
- buildTransactionObject({
- fwVersion: Buffer.from([patch, minor, major]),
- }),
- );
+ const fwVersion = Buffer.from([patch, minor, major]);
+ const txObj = buildSignObject(fwVersion);
+ const tx = buildTransaction(txObj);
+ const req = {
+ ...txObj,
+ ...tx,
+ wallet: buildWallet(),
+ };
+ const { payload } = encodeSignRequest(req);
const payloadAsString = payload.toString('hex');
expect(payloadAsString).toMatchSnapshot();
},
);
});
+
describe('KvRecords', () => {
test('getKvRecords', () => {
const mockObject = { type: 0, n: 1, start: 0 };
@@ -110,11 +97,12 @@ describe('encoders', () => {
});
test('addKvRecords', () => {
+ const fwConstants = buildFirmwareConstants();
const mockObject = {
type: 0,
records: { key: 'value' },
- fwConstants: buildFirmwareConstants(),
caseSensitive: false,
+ fwConstants,
};
const payload = encodeAddKvRecordsRequest(mockObject);
const payloadAsString = payload.toString('hex');
@@ -122,11 +110,12 @@ describe('encoders', () => {
});
test('removeKvRecords', () => {
+ const fwConstants = buildFirmwareConstants();
const mockObject = {
type: 0,
- ids: [0],
- fwConstants: buildFirmwareConstants(),
+ ids: ['0'],
caseSensitive: false,
+ fwConstants,
};
const payload = encodeRemoveKvRecordsRequest(mockObject);
const payloadAsString = payload.toString('hex');
diff --git a/src/__test__/unit/encrypters.test.ts b/src/__test__/unit/encrypters.test.ts
deleted file mode 100644
index aff47d18..00000000
--- a/src/__test__/unit/encrypters.test.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import {
- encryptAddKvRecordsRequest,
- encryptFetchActiveWalletRequest,
- encryptGetAddressesRequest,
- encryptGetKvRecordsRequest,
- encryptPairRequest,
- encryptRemoveKvRecordsRequest,
- encryptSignRequest,
-} from '../../functions';
-import { buildSharedSecret } from '../utils/builders';
-
-describe('encrypters', () => {
- let mockRandom: any;
-
- beforeAll(() => {
- mockRandom = vi.spyOn(global.Math, 'random').mockReturnValue(0.1);
- });
-
- afterAll(() => {
- mockRandom.mockRestore();
- });
-
- test('pair', () => {
- const payload = Buffer.from('test');
- const sharedSecret = buildSharedSecret();
- const encryptedPayload = encryptPairRequest({ payload, sharedSecret });
- expect(encryptedPayload.toString('hex')).toMatchSnapshot();
- });
-
- test('fetchActiveWallet', () => {
- const sharedSecret = buildSharedSecret();
- const encryptedPayload = encryptFetchActiveWalletRequest({ sharedSecret });
- expect(encryptedPayload.toString('hex')).toMatchSnapshot();
- });
-
- test('getAddresses', () => {
- const payload = buildSharedSecret();
- const sharedSecret = buildSharedSecret();
- const encryptedPayload = encryptGetAddressesRequest({
- payload,
- sharedSecret,
- });
- expect(encryptedPayload.toString('hex')).toMatchSnapshot();
- });
-
- test('sign', () => {
- const payload = Buffer.from([1, 2, 3]);
- const sharedSecret = buildSharedSecret();
- const encryptedPayload = encryptSignRequest({ payload, sharedSecret });
- expect(encryptedPayload.toString('hex')).toMatchSnapshot();
- });
-
- test('getKvRecords', () => {
- const payload = Buffer.from('test');
- const sharedSecret = buildSharedSecret();
- const encryptedPayload = encryptGetKvRecordsRequest({
- payload,
- sharedSecret,
- });
- expect(encryptedPayload.toString('hex')).toMatchSnapshot();
- });
-
- test('addKvRecords', () => {
- const payload = Buffer.from('test');
- const sharedSecret = buildSharedSecret();
- const encryptedPayload = encryptAddKvRecordsRequest({
- payload,
- sharedSecret,
- });
- expect(encryptedPayload.toString('hex')).toMatchSnapshot();
- });
-
- test('removeKvRecords', () => {
- const payload = Buffer.from('test');
- const sharedSecret = buildSharedSecret();
- const encryptedPayload = encryptRemoveKvRecordsRequest({
- payload,
- sharedSecret,
- });
- expect(encryptedPayload.toString('hex')).toMatchSnapshot();
- });
-});
diff --git a/src/__test__/unit/requests.test.ts b/src/__test__/unit/requests.test.ts
deleted file mode 100644
index 4e7e69f9..00000000
--- a/src/__test__/unit/requests.test.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-//TODO: Mock out the server responses to generate deterministic results
-describe('requests', () => {
- test('should test connect request');
-})
\ No newline at end of file
diff --git a/src/__test__/unit/validators.test.ts b/src/__test__/unit/validators.test.ts
index 5ca0cd5c..a5cd6b5a 100644
--- a/src/__test__/unit/validators.test.ts
+++ b/src/__test__/unit/validators.test.ts
@@ -1,11 +1,9 @@
import {
validateAddKvRequest,
validateConnectRequest,
- validateFetchActiveWallet,
validateGetAddressesRequest,
validateGetKvRequest,
validateRemoveKvRequest,
- validateSignRequest,
} from '../../functions';
import {
isValidBlockExplorerResponse,
@@ -20,28 +18,34 @@ import {
describe('validators', () => {
describe('connect', () => {
test('should successfully validate', () => {
- const connectBundle = buildValidateConnectObject({});
- const validConnectRequest = validateConnectRequest(connectBundle);
- expect(validConnectRequest.deviceId).toMatchSnapshot();
+ validateConnectRequest(buildValidateConnectObject());
});
+ // NOTE: There aren't many possible error conditions because
+ // the Client constructor has lots of fallback values. However,
+ // we should validate that you can't set a null ephemeral pub.
test('should throw errors on validation failure', () => {
- const connectBundle = buildValidateConnectObject({ baseUrl: '' });
- expect(() => validateConnectRequest(connectBundle)).toThrowError();
+ const req = buildValidateConnectObject({ name: '' });
+ expect(() => {
+ req.client.ephemeralPub = null;
+ }).toThrowError();
});
});
describe('getAddresses', () => {
test('should successfully validate', () => {
const getAddressesBundle = buildGetAddressesObject({});
- expect(validateGetAddressesRequest(getAddressesBundle)).toMatchSnapshot();
+ validateGetAddressesRequest(getAddressesBundle);
});
- test('should throw errors on validation failure', () => {
- const getAddressesBundle = buildGetAddressesObject({ url: '' });
- expect(() =>
- validateGetAddressesRequest(getAddressesBundle),
- ).toThrowError();
+ test('encodeGetAddressesRequest should throw with invalid startPath', () => {
+ const startPath = [0x80000000 + 44, 0x80000000 + 60, 0, 0, 0, 0, 0];
+ const fwVersion = Buffer.from([0, 0, 0]);
+ const testEncodingFunction = () =>
+ validateGetAddressesRequest(
+ buildGetAddressesObject({ startPath, fwVersion }),
+ );
+ expect(testEncodingFunction).toThrowError();
});
});
@@ -51,7 +55,7 @@ describe('validators', () => {
const validateAddKvBundle: any = buildValidateRequestObject({
records: { key: 'value' },
});
- expect(validateAddKvRequest(validateAddKvBundle)).toMatchSnapshot();
+ validateAddKvRequest(validateAddKvBundle);
});
test('should throw errors on validation failure', () => {
@@ -67,7 +71,7 @@ describe('validators', () => {
type: 1,
start: 0,
});
- expect(validateGetKvRequest(validateGetKvBundle)).toMatchSnapshot();
+ validateGetKvRequest(validateGetKvBundle);
});
test('should throw errors on validation failure', () => {
@@ -82,51 +86,13 @@ describe('validators', () => {
ids: [1],
type: 1,
});
- expect(
- validateRemoveKvRequest(validateRemoveKvBundle),
- ).toMatchSnapshot();
+ validateRemoveKvRequest(validateRemoveKvBundle);
});
test('should throw errors on validation failure', () => {
const validateRemoveKvBundle: any = buildValidateRequestObject({});
- expect(() =>
- validateRemoveKvRequest(validateRemoveKvBundle),
- ).toThrowError();
- });
- });
- });
-
- describe('fetchActiveWallet', () => {
- test('should successfully validate', () => {
- const validateFetchActiveWalletBundle: any = buildValidateRequestObject(
- {},
- );
- expect(
- validateFetchActiveWallet(validateFetchActiveWalletBundle),
- ).toMatchSnapshot();
- });
-
- test('should throw errors on validation failure', () => {
- const validateFetchActiveWalletBundle: any = { url: '' };
- expect(() =>
- validateFetchActiveWallet(validateFetchActiveWalletBundle),
- ).toThrowError();
- });
- });
-
- describe('sign', () => {
- test('should successfully validate', () => {
- const validateSignRequestBundle: any = buildValidateRequestObject({
- wallet: 'wallet',
+ expect (() => validateRemoveKvRequest(validateRemoveKvBundle)).toThrowError();
});
- expect(validateSignRequest(validateSignRequestBundle)).toMatchSnapshot();
- });
-
- test('should throw errors on validation failure', () => {
- const validateSignRequestBundle: any = buildValidateRequestObject({});
- expect(() =>
- validateSignRequest(validateSignRequestBundle),
- ).toThrowError();
});
});
diff --git a/src/__test__/utils/builders.ts b/src/__test__/utils/builders.ts
index 671c8297..62638dc2 100644
--- a/src/__test__/utils/builders.ts
+++ b/src/__test__/utils/builders.ts
@@ -1,17 +1,20 @@
import Common, { Chain, Hardfork } from '@ethereumjs/common';
import {
TransactionFactory as EthTxFactory,
- TypedTransaction
+ TypedTransaction,
} from '@ethereumjs/tx';
import { AbiCoder } from '@ethersproject/abi';
import { keccak256 } from 'js-sha3';
import randomWords from 'random-words';
import { decode as rlpDecode, encode as rlpEncode } from 'rlp';
-import { Client } from '../../client';
import { Calldata, Constants } from '../..';
-import { CURRENCIES, HARDENED_OFFSET } from '../../constants';
-import { getP256KeyPair, randomBytes } from '../../util';
-import { TestRequestPayload } from '../../types/utils';
+import { Client } from '../../client';
+import {
+ CURRENCIES,
+ getFwVersionConst,
+ HARDENED_OFFSET,
+} from '../../constants';
+import { randomBytes } from '../../util';
import { MSG_PAYLOAD_METADATA_SZ } from './constants';
import { convertDecoderToEthers } from './ethers';
import { getN, getPrng } from './getters';
@@ -20,7 +23,8 @@ import {
buildRandomEip712Object,
copyBuffer,
ETH_COIN,
- serializeJobData
+ getTestVectors,
+ serializeJobData,
} from './helpers';
const prng = getPrng();
@@ -75,48 +79,43 @@ export const buildFirmwareConstants = (...overrides: any) => {
} as FirmwareConstants;
};
-export const buildGetAddressesObject = ({ ...overrides }) => ({
+export const buildWallet = (overrides?) => ({
+ uid: Buffer.from(
+ '162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2',
+ 'hex',
+ ),
+ capabilities: 1,
+ external: true,
+ ...overrides,
+});
+
+export const buildGetAddressesObject = (overrides?) => ({
startPath: [0x80000000 + 44, 0x80000000 + 60, 0x80000000, 0, 0],
n: 1,
flag: 1,
- url: 'asdf',
- fwVersion: Buffer.from([0, 12, 0]),
- wallet: {
- uid: Buffer.from('test'),
- name: Buffer.from('test'),
- capabilities: 1,
- external: true,
- },
- ephemeralPub: Buffer.from('test'),
- sharedSecret: Buffer.from('test'),
+ fwConstants: buildFirmwareConstants(),
+ wallet: buildWallet(),
...overrides,
});
-export const buildTransactionObject = ({
- ...overrides
-}) => ({
- data: {
- to: '0xc0c8f96C2fE011cc96770D2e37CfbfeAFB585F0e',
- from: '0xc0c8f96C2fE011cc96770D2e37CfbfeAFB585F0e',
- value: 0x80000000,
- data: 0x0,
- signerPath: [0x80000000 + 44, 0x80000000 + 60, 0x80000000, 0, 0],
- nonce: 0x80000000,
- gasLimit: 0x80000000,
- gasPrice: 0x80000000,
- },
- request: { payload: Buffer.from('test') },
- fwConstants: buildFirmwareConstants({ reqMaxDataSz: 10 }),
- currency: CURRENCIES.ETH as Currency,
- fwVersion: Buffer.from([0, 0, 0]),
- wallet: {
- uid: Buffer.from('test'),
- name: Buffer.from('test'),
- capabilities: 1,
- external: true,
- },
- ...overrides,
-});
+export const buildSignObject = (fwVersion, overrides?) => {
+ const fwConstants = getFwVersionConst(fwVersion);
+ return {
+ data: {
+ to: '0xc0c8f96C2fE011cc96770D2e37CfbfeAFB585F0e',
+ from: '0xc0c8f96C2fE011cc96770D2e37CfbfeAFB585F0e',
+ value: 0x80000000,
+ data: 0x0,
+ signerPath: [0x80000000 + 44, 0x80000000 + 60, 0x80000000, 0, 0],
+ nonce: 0x80000000,
+ gasLimit: 0x80000000,
+ gasPrice: 0x80000000,
+ },
+ currency: CURRENCIES.ETH as Currency,
+ fwConstants,
+ ...overrides,
+ };
+};
export const buildSharedSecret = () => {
return Buffer.from([
@@ -183,7 +182,8 @@ export const buildTx = (data = '0xdeadbeef') => {
};
export const buildEthSignRequest = async (
- client: Client, txDataOverrides?: any
+ client: Client,
+ txDataOverrides?: any,
): Promise => {
if (client.getFwVersion()?.major === 0 && client.getFwVersion()?.minor < 15) {
console.warn('Please update firmware. Skipping ETH signing tests.');
@@ -205,7 +205,7 @@ export const buildEthSignRequest = async (
to: '0xe242e54155b1abc71fc118065270cecaaf8b7768',
value: 1000000000000,
data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8',
- ...txDataOverrides
+ ...txDataOverrides,
};
const tx = EthTxFactory.fromTxData(txData, { common });
const req = {
@@ -262,15 +262,12 @@ export const buildEvmReq = (overrides?: {
if (overrides?.common) {
chainInfo = overrides.common;
} else if (overrides?.txData?.chainId !== '0x1') {
- chainInfo = Common.custom(
- { chainId: 137 },
- { hardfork: Hardfork.London }
- );
+ chainInfo = Common.custom({ chainId: 137 }, { hardfork: Hardfork.London });
} else {
chainInfo = new Common({
chain: Chain.Mainnet,
hardfork: Hardfork.London,
- })
+ });
}
const req = {
data: {
@@ -315,8 +312,8 @@ export const buildEncDefs = (vectors: any) => {
return { encDefs, encDefsCalldata };
};
-export function buildRandomMsg (type = 'signPersonal', client: Client) {
- function randInt (n: number) {
+export function buildRandomMsg(type = 'signPersonal', client: Client) {
+ function randInt(n: number) {
return Math.floor(n * prng.quick());
}
@@ -333,10 +330,16 @@ export function buildRandomMsg (type = 'signPersonal', client: Client) {
}
}
-export function buildEthMsgReq (
+export function buildEthMsgReq(
payload: any,
protocol: string,
- signerPath = [BTC_PURPOSE_P2PKH, ETH_COIN, HARDENED_OFFSET, 0, 0] as SigningPath,
+ signerPath = [
+ BTC_PURPOSE_P2PKH,
+ ETH_COIN,
+ HARDENED_OFFSET,
+ 0,
+ 0,
+ ] as SigningPath,
): SignRequestParams {
return {
currency: CURRENCIES.ETH_MSG,
@@ -348,16 +351,30 @@ export function buildEthMsgReq (
};
}
-export const buildValidateConnectObject = ({ ...overrides }) => ({
+export const buildValidateConnectObject = (overrides?) => ({
deviceId: 'test',
- key: getP256KeyPair(Buffer.from('test')),
- baseUrl: 'https://gridpl.us',
+ key: 'test',
+ baseUrl: 'https://www.test.com',
...overrides,
});
-export const buildValidateRequestObject = ({ ...overrides }) => ({
- url: 'test.com',
- fwConstants: { kvActionsAllowed: true },
- sharedSecret: Buffer.from('test'),
- ...overrides,
-});
+export const buildValidateRequestObject = (overrides?) => {
+ const fwConstants = buildFirmwareConstants();
+ return {
+ fwConstants,
+ ...overrides,
+ };
+};
+
+// Most of the endpoint validators (for encrypted requests)
+// will require a connected client instance.
+export function buildMockConnectedClient(opts) {
+ const _stateData = JSON.parse(getTestVectors().dehydratedClientState);
+ const stateData = {
+ ..._stateData,
+ ...opts,
+ };
+ return new Client({
+ stateData: JSON.stringify(stateData),
+ });
+}
diff --git a/src/__test__/utils/helpers.ts b/src/__test__/utils/helpers.ts
index e07483b5..d35155a8 100644
--- a/src/__test__/utils/helpers.ts
+++ b/src/__test__/utils/helpers.ts
@@ -7,18 +7,19 @@ import {
} from 'ed25519-hd-key';
import { ec as EC, eddsa as EdDSA } from 'elliptic';
import { privateToAddress } from 'ethereumjs-util';
+import { readFileSync } from 'fs';
import { sha256 } from 'hash.js/lib/hash/sha';
import { keccak256 } from 'js-sha3';
import {
- ADDR_STR_LEN,
BIP_CONSTANTS,
ethMsgProtocol,
HARDENED_OFFSET,
} from '../../constants';
+import { jsonc } from 'jsonc';
import { Constants } from '../..';
-
import { getV, parseDER, randomBytes } from '../../util';
import { Client } from '../../client';
+import { ProtocolConstants } from '../../protocol';
import { getPathStr } from '../../shared/utilities'
import { TypedTransaction } from '@ethereumjs/tx';
import { getEnv } from './getters';
@@ -539,8 +540,8 @@ export const deserializeGetAddressesJobResult = function (res) {
getAddrResult.count = res.readUInt8(off);
off += 3; // Skip a 2-byte empty shim value (for backwards compatibility)
for (let i = 0; i < getAddrResult.count; i++) {
- const _addr = res.slice(off, off + ADDR_STR_LEN);
- off += ADDR_STR_LEN;
+ const _addr = res.slice(off, off + ProtocolConstants.addrStrLen);
+ off += ProtocolConstants.addrStrLen;
for (let j = 0; j < _addr.length; j++)
if (_addr[j] === 0x00) {
getAddrResult.addresses.push(_addr.slice(0, j).toString('utf8'));
@@ -982,3 +983,8 @@ export const compressPubKey = function (pub) {
return compressed;
}
+export const getTestVectors = function () {
+ return jsonc.parse(
+ readFileSync(`${process.cwd()}/src/__test__/vectors.jsonc`).toString()
+ );
+}
\ No newline at end of file
diff --git a/src/__test__/utils/runners.ts b/src/__test__/utils/runners.ts
index 7a312d08..c1d8e33c 100644
--- a/src/__test__/utils/runners.ts
+++ b/src/__test__/utils/runners.ts
@@ -1,7 +1,6 @@
import { Client } from '../../client';
import { getEncodedPayload } from '../../genericSigning';
-import { TestRequestPayload } from '../../types/utils';
import { deriveSECP256K1Key, parseWalletJobResp, validateGenericSig } from './helpers';
import { initializeSeed } from './initializeClient';
import { testRequest } from './testRequest';
diff --git a/src/__test__/utils/setup.ts b/src/__test__/utils/setup.ts
index 4ebc34fb..f61946f8 100644
--- a/src/__test__/utils/setup.ts
+++ b/src/__test__/utils/setup.ts
@@ -1,20 +1,51 @@
import fetch, { Request } from 'node-fetch';
-
-import * as dotenv from 'dotenv'
-dotenv.config()
+import * as fs from 'fs';
+import { setup } from '../..';
+import * as dotenv from 'dotenv';
+dotenv.config();
if (!globalThis.fetch) {
// @ts-expect-error - fetch must be patched in a node environment
- globalThis.fetch = fetch
+ globalThis.fetch = fetch;
// @ts-expect-error - Request must be patched in a node environment
- globalThis.Request = Request
+ globalThis.Request = Request;
}
expect.extend({
- toEqualElseLog (received: any, expected: any, message: string) {
+ toEqualElseLog(received: any, expected: any, message: string) {
return {
pass: received === expected,
- message: () => message ? message : `Expected ${received} to equal ${expected}`,
+ message: () =>
+ message ? message : `Expected ${received} to equal ${expected}`,
};
},
-});
\ No newline at end of file
+});
+
+export const setStoredClient = (data: string) => {
+ try {
+ fs.writeFileSync('./client.temp', data);
+ } catch (err) {
+ return '';
+ }
+};
+
+export const getStoredClient = () => {
+ try {
+ return fs.readFileSync('./client.temp', 'utf8');
+ } catch (err) {
+ return '';
+ }
+};
+
+export const setupClient = async () => {
+ const deviceId = process.env.DEVICE_ID;
+ const password = process.env.PASSWORD || 'password';
+ const name = process.env.name || 'api-test';
+ return setup({
+ deviceId,
+ password,
+ name,
+ getStoredClient,
+ setStoredClient,
+ });
+};
diff --git a/src/__test__/utils/testRequest.ts b/src/__test__/utils/testRequest.ts
index 5e21266e..f119abc3 100644
--- a/src/__test__/utils/testRequest.ts
+++ b/src/__test__/utils/testRequest.ts
@@ -1,7 +1,7 @@
-import { decResLengths } from '../../constants';
-import { encryptRequest, decryptResponse, request } from '../../shared/functions';
-
-import { TestRequestPayload } from '../../types/utils';
+import {
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+} from '../../protocol';
/**
* `test` takes a data object with a testID and a payload, and sends them to the device.
@@ -17,22 +17,21 @@ export const testRequest = async ({
'First argument must contain `testID` and `payload` fields.',
);
}
+ const sharedSecret = client.sharedSecret;
+ const ephemeralPub = client.ephemeralPub;
+ const url = client.url;
+
const TEST_DATA_SZ = 500;
- const _payload = Buffer.alloc(TEST_DATA_SZ + 6);
- _payload.writeUInt32BE(testID, 0);
- _payload.writeUInt16BE(payload.length, 4);
- payload.copy(_payload, 6);
- const encryptedPayload = encryptRequest({
- requestCode: 'TEST',
- payload: _payload,
- sharedSecret: client.sharedSecret,
+ const data = Buffer.alloc(TEST_DATA_SZ + 6);
+ data.writeUInt32BE(testID, 0);
+ data.writeUInt16BE(payload.length, 4);
+ payload.copy(data, 6);
+
+ return await encryptedSecureRequest({
+ data,
+ requestType: LatticeSecureEncryptedRequestType.test,
+ sharedSecret,
+ ephemeralPub,
+ url,
});
- const res = await request({ payload: encryptedPayload, url: client.url ?? '' });
- const { decryptedData, newEphemeralPub } = decryptResponse(
- res,
- decResLengths.test,
- client.sharedSecret,
- );
- client.ephemeralPub = newEphemeralPub;
- return decryptedData.slice(65); // remove ephem pub
};
diff --git a/src/__test__/vectors.jsonc b/src/__test__/vectors.jsonc
index fbe4d1f8..1f773b63 100644
--- a/src/__test__/vectors.jsonc
+++ b/src/__test__/vectors.jsonc
@@ -1,4 +1,4 @@
-// Vectors for signing tests
+// Constant test vectors for various things
{
"evm": {
// We use these vectors to test just-in-type calldata decoding for EVM transactions.
@@ -241,5 +241,7 @@
}
}
]
- }
+ },
+ // Dehydrated state for unit/integration tests
+ "dehydratedClientState": "{\"activeWallets\":{\"internal\":{\"uid\":\"162b56efe561c12bc93f703dc7026b3ec3d53923270c9259e2b08015fb9defd2\"},\"external\":{\"uid\":\"0000000000000000000000000000000000000000000000000000000000000000\"}},\"ephemeralPub\":\"04627c74680bee7907c07fdea2bde0ab1ac17c95213f379ccc1dce87f3586babe8ba0ed02688fd5539a54ea1b7b8ab0860d1853006f55f22a2e3ea4e190a17ab30\",\"fwVersion\":\"00110000\",\"deviceId\":\"Cd3dtg\",\"name\":\"SDK Test\",\"baseUrl\":\"https: //signing.gridpl.us\",\"privKey\":\"3fb53b677f73e4d2b8c89c303f6f6b349f0075ad88ea126cb9f6632085815dca\",\"retryCount\":3,\"timeout\":120000}"
}
\ No newline at end of file
diff --git a/src/api/addressTags.ts b/src/api/addressTags.ts
new file mode 100644
index 00000000..20e11012
--- /dev/null
+++ b/src/api/addressTags.ts
@@ -0,0 +1,47 @@
+import { Client } from '../client';
+import { MAX_ADDR } from '../constants';
+import { queue } from './utilities';
+
+export const addAddressTags = async (
+ tags: [{ [key: string]: string }],
+): Promise => {
+ // convert an array of objects to an object
+ const records = tags.reduce((acc, tag) => {
+ const key = Object.keys(tag)[0];
+ acc[key] = tag[key];
+ return acc;
+ }, {});
+
+ return queue((client) => client.addKvRecords({ records }));
+};
+
+export const fetchAddressTags = async (
+ { n, start } = { n: MAX_ADDR, start: 0 },
+) => {
+ const addressTags: AddressTag[] = [];
+ let remainingToFetch = n;
+ let fetched = start;
+
+ while (remainingToFetch > 0) {
+ await queue((client) =>
+ client
+ .getKvRecords({
+ start: fetched,
+ n: remainingToFetch > MAX_ADDR ? MAX_ADDR : remainingToFetch,
+ })
+ .then(async (res) => {
+ addressTags.push(...res.records);
+ fetched = res.fetched + fetched;
+ remainingToFetch = res.total - fetched;
+ }),
+ );
+ }
+ return addressTags;
+};
+
+export const removeAddressTags = async (
+ tags: AddressTag[],
+): Promise => {
+ const ids = tags.map((tag) => `${tag.id}`);
+ return queue((client: Client) => client.removeKvRecords({ ids }));
+};
diff --git a/src/api/addresses.ts b/src/api/addresses.ts
new file mode 100644
index 00000000..c3bf4c9c
--- /dev/null
+++ b/src/api/addresses.ts
@@ -0,0 +1,113 @@
+import {
+ BTC_LEGACY_DERIVATION,
+ BTC_SEGWIT_DERIVATION,
+ BTC_WRAPPED_SEGWIT_DERIVATION,
+ DEFAULT_ETH_DERIVATION,
+ LEDGER_LEGACY_DERIVATION,
+ LEDGER_LIVE_DERIVATION,
+ MAX_ADDR,
+ SOLANA_DERIVATION,
+} from '../constants';
+import { getStartPath, queue } from './utilities';
+
+export const fetchAddresses = async (
+ overrides?: GetAddressesRequestParams,
+): Promise => {
+ return queue((client) =>
+ client
+ .getAddresses({
+ startPath: DEFAULT_ETH_DERIVATION,
+ n: MAX_ADDR,
+ ...overrides,
+ })
+ .then((addrs) => addrs.map((addr) => `${addr}`)),
+ );
+};
+
+export const fetchBtcLegacyAddresses = async (
+ n = MAX_ADDR,
+ startPathIndex?: number,
+): Promise => {
+ return fetchAddresses({
+ startPath: getStartPath(BTC_LEGACY_DERIVATION, startPathIndex),
+ n,
+ });
+};
+
+export const fetchBtCSegwitAddresses = async (
+ n = MAX_ADDR,
+ startPathIndex?: number,
+): Promise => {
+ return fetchAddresses({
+ startPath: getStartPath(BTC_SEGWIT_DERIVATION, startPathIndex),
+ n,
+ });
+};
+
+export const fetchBtcWrappedSegwitAddresses = async (
+ n = MAX_ADDR,
+ startPathIndex?: number,
+): Promise => {
+ return fetchAddresses({
+ startPath: getStartPath(BTC_WRAPPED_SEGWIT_DERIVATION, startPathIndex),
+ n,
+ });
+};
+
+export const fetchSolanaAddresses = async (
+ n = MAX_ADDR,
+ startPathIndex?: number,
+): Promise => {
+ return fetchAddresses({
+ startPath: getStartPath(SOLANA_DERIVATION, startPathIndex, 2),
+ n,
+ });
+};
+
+export const fetchLedgerLiveAddresses = async (
+ n = MAX_ADDR,
+ startPathIndex?: number,
+): Promise => {
+ const addresses = [];
+ for (let i = 0; i < n; i++) {
+ addresses.push(
+ queue((client) =>
+ client
+ .getAddresses({
+ startPath: getStartPath(
+ LEDGER_LIVE_DERIVATION,
+ startPathIndex + i,
+ 2,
+ ),
+ n: 1,
+ })
+ .then((addresses) => addresses.map((address) => `${address}`)),
+ ),
+ );
+ }
+ return Promise.all(addresses);
+};
+
+export const fetchLedgerLegacyAddresses = async (
+ n = MAX_ADDR,
+ startPathIndex?: number,
+): Promise => {
+ const addresses = [];
+ for (let i = 0; i < n; i++) {
+ addresses.push(
+ queue((client) =>
+ client
+ .getAddresses({
+ startPath: getStartPath(
+ LEDGER_LEGACY_DERIVATION,
+ startPathIndex + i,
+ 3,
+ ),
+ n: 1,
+ })
+ .then((addresses) => addresses.map((address) => `${address}`)),
+ ),
+ );
+ }
+ return Promise.all(addresses);
+};
diff --git a/src/api/index.ts b/src/api/index.ts
new file mode 100644
index 00000000..80057ef6
--- /dev/null
+++ b/src/api/index.ts
@@ -0,0 +1,18 @@
+export { getClient, setup } from './utilities';
+import { queue } from './utilities';
+
+export const connect = async (deviceId: string): Promise => {
+ return queue((client) => client.connect(deviceId));
+};
+
+export const pair = async (pairingCode: string): Promise => {
+ return queue((client) => client.pair(pairingCode));
+};
+
+export const fetchActiveWallets = async (): Promise => {
+ return queue((client) => client.fetchActiveWallet());
+};
+
+export * from './addresses';
+export * from './addressTags';
+export * from './signing';
diff --git a/src/api/signing.ts b/src/api/signing.ts
new file mode 100644
index 00000000..72e7ef8f
--- /dev/null
+++ b/src/api/signing.ts
@@ -0,0 +1,106 @@
+import { Constants } from '..';
+import {
+ DEFAULT_ETH_DERIVATION,
+ BTC_LEGACY_DERIVATION,
+ BTC_SEGWIT_DERIVATION,
+ BTC_WRAPPED_SEGWIT_DERIVATION,
+ SOLANA_DERIVATION,
+ CURRENCIES,
+} from '../constants';
+import { isEIP712Payload, queue } from './utilities';
+
+export const sign = async (
+ payload: Uint8Array | Buffer | Buffer[],
+ overrides?: SignRequestParams,
+): Promise => {
+ const tx: SignRequestParams = {
+ data: {
+ signerPath: DEFAULT_ETH_DERIVATION,
+ curveType: Constants.SIGNING.CURVES.SECP256K1,
+ hashType: Constants.SIGNING.HASHES.KECCAK256,
+ encodingType: Constants.SIGNING.ENCODINGS.EVM,
+ payload,
+ },
+ ...overrides,
+ };
+ return queue((client) => client.sign(tx));
+};
+
+export const signMessage = async (
+ payload: string | Uint8Array | Buffer | Buffer[] | EIP712MessagePayload,
+ overrides?: SignRequestParams,
+): Promise => {
+ const tx = {
+ data: {
+ signerPath: DEFAULT_ETH_DERIVATION,
+ curveType: Constants.SIGNING.CURVES.SECP256K1,
+ hashType: Constants.SIGNING.HASHES.KECCAK256,
+ protocol: 'signPersonal',
+ payload,
+ ...overrides,
+ },
+ currency: CURRENCIES.ETH_MSG,
+ };
+
+ if (isEIP712Payload(payload)) {
+ tx.data.protocol = 'eip712';
+ }
+
+ return queue((client) => client.sign(tx));
+};
+
+export const signBtcLegacyTx = async (
+ payload: BitcoinSignPayload,
+): Promise => {
+ const tx = {
+ data: {
+ signerPath: BTC_LEGACY_DERIVATION,
+ ...payload,
+ },
+ currency: 'BTC',
+ };
+ return queue((client) => client.sign(tx));
+};
+
+export const signBtcSegwitTx = async (
+ payload: BitcoinSignPayload,
+): Promise => {
+ const tx = {
+ data: {
+ signerPath: BTC_SEGWIT_DERIVATION,
+ ...payload,
+ },
+ currency: 'BTC',
+ };
+ return queue((client) => client.sign(tx));
+};
+
+export const signBtcWrappedSegwitTx = async (
+ payload: BitcoinSignPayload,
+): Promise => {
+ const tx = {
+ data: {
+ signerPath: BTC_WRAPPED_SEGWIT_DERIVATION,
+ ...payload,
+ },
+ currency: 'BTC',
+ };
+ return queue((client) => client.sign(tx));
+};
+
+export const signSolanaTx = async (
+ payload: Buffer,
+ overrides?: SignRequestParams,
+): Promise => {
+ const tx = {
+ data: {
+ signerPath: SOLANA_DERIVATION,
+ curveType: Constants.SIGNING.CURVES.ED25519,
+ hashType: Constants.SIGNING.HASHES.NONE,
+ encodingType: Constants.SIGNING.ENCODINGS.SOLANA,
+ payload,
+ ...overrides,
+ },
+ };
+ return queue((client) => client.sign(tx));
+};
diff --git a/src/api/state.ts b/src/api/state.ts
new file mode 100644
index 00000000..6d7e7f6e
--- /dev/null
+++ b/src/api/state.ts
@@ -0,0 +1,21 @@
+import { Client } from '../client';
+
+export let saveClient: (clientData: string | null) => void;
+
+export const setSaveClient = (fn: (clientData: string | null) => void) => {
+ saveClient = fn;
+};
+
+export let loadClient: () => Client | undefined;
+
+export const setLoadClient = (fn: () => Client | undefined) => {
+ loadClient = fn;
+};
+
+let functionQueue: Promise;
+
+export const getFunctionQueue = () => functionQueue;
+
+export const setFunctionQueue = (queue: Promise) => {
+ functionQueue = queue;
+};
diff --git a/src/api/utilities.ts b/src/api/utilities.ts
new file mode 100644
index 00000000..fcde0b79
--- /dev/null
+++ b/src/api/utilities.ts
@@ -0,0 +1,135 @@
+import { connect, Utils } from '..';
+import { Client } from '../client';
+import {
+ saveClient,
+ loadClient,
+ setSaveClient,
+ setLoadClient,
+ getFunctionQueue,
+ setFunctionQueue,
+} from './state';
+
+/**
+ * `setup` initializes the Client and executes `connect()` if necessary. It returns a promise that
+ * resolves to a boolean that indicates whether the Client is paired to the application to which it's
+ * attempting to connect.
+ */
+export const setup = async ({
+ deviceId,
+ password,
+ name,
+ getStoredClient,
+ setStoredClient,
+}: {
+ deviceId?: string;
+ password?: string;
+ name?: string;
+ getStoredClient: () => string;
+ setStoredClient: (clientData: string | null) => void;
+}) => {
+ if (!getStoredClient) throw new Error('Client data getter required');
+ setSaveClient(buildSaveClientFn(setStoredClient));
+
+ if (!setStoredClient) throw new Error('Client data setter required');
+ setLoadClient(buildLoadClientFn(getStoredClient));
+
+ if (deviceId && password && name) {
+ const privKey = Utils.generateAppSecret(deviceId, password, name);
+ const client = new Client({ deviceId, privKey, name });
+ return client.connect(deviceId).then((isPaired) => {
+ saveClient(client.getStateData());
+ return isPaired;
+ });
+ } else {
+ const client = loadClient();
+ if (!client) throw new Error('Client not initialized');
+ const deviceId = client.getDeviceId();
+ if (!client.ephemeralPub && deviceId) {
+ return connect(deviceId);
+ } else {
+ saveClient(client.getStateData());
+ return Promise.resolve(true);
+ }
+ }
+};
+
+/**
+ * `queue` is a function that wraps all functional API calls. It limits the number of concurrent
+ * requests to the server to 1, and ensures that the client state data is saved after each call.
+ * This is necessary because the ephemeral public key must be updated after each successful request,
+ * and two concurrent requests could result in the same key being used twice or the wrong key being
+ * written to memory locally.
+ */
+export const queue = (fn: (client: Client) => Promise) => {
+ const client = loadClient();
+ if (!client) throw new Error('Client not initialized');
+ if (!getFunctionQueue()) {
+ setFunctionQueue(Promise.resolve());
+ }
+ setFunctionQueue(
+ getFunctionQueue().then(() =>
+ fn(client)
+ .catch((err) => {
+ // Empty the queue if any function call fails
+ setFunctionQueue(Promise.resolve());
+ throw err;
+ })
+ .then((returnValue) => {
+ saveClient(client.getStateData());
+ return returnValue;
+ }),
+ ),
+ );
+ return getFunctionQueue();
+};
+
+export const getClient = () => (loadClient ? loadClient() : null);
+
+const encodeClientData = (clientData: string) => {
+ return Buffer.from(clientData).toString('base64');
+};
+
+const decodeClientData = (clientData: string) => {
+ return Buffer.from(clientData, 'base64').toString();
+};
+
+const buildSaveClientFn = (
+ setStoredClient: (clientData: string | null) => void,
+) => {
+ return (clientData: string | null) => {
+ if (!clientData) return;
+ const encodedData = encodeClientData(clientData);
+ setStoredClient(encodedData);
+ };
+};
+
+const buildLoadClientFn = (getStoredClient: () => string) => {
+ return () => {
+ const clientData = getStoredClient();
+ if (!clientData) return undefined;
+ const stateData = decodeClientData(clientData);
+ if (!stateData) return undefined;
+ const client = new Client({ stateData });
+ if (!client) throw new Error('Client not initialized');
+ return client;
+ };
+};
+
+export const getStartPath = (
+ defaultStartPath: number[],
+ addressIndex = 0, // The value to increment `defaultStartPath`
+ pathIndex = 4, // Which index in `defaultStartPath` array to increment
+): number[] => {
+ const startPath = defaultStartPath;
+ if (addressIndex > 0) {
+ startPath[pathIndex] = defaultStartPath[pathIndex] + addressIndex;
+ }
+ return startPath;
+};
+
+export const isEIP712Payload = (payload: any) =>
+ typeof payload !== 'string' &&
+ 'types' in payload &&
+ 'domain' in payload &&
+ 'primaryType' in payload &&
+ 'message' in payload;
diff --git a/src/bitcoin.ts b/src/bitcoin.ts
index 8cfd134e..c053f6ec 100644
--- a/src/bitcoin.ts
+++ b/src/bitcoin.ts
@@ -3,7 +3,8 @@ import { bech32 } from 'bech32';
import bs58check from 'bs58check';
import { ripemd160 } from 'hash.js/lib/hash/ripemd';
import { sha256 } from 'hash.js/lib/hash/sha';
-import { BIP_CONSTANTS, signingSchema } from './constants';
+import { BIP_CONSTANTS } from './constants';
+import { LatticeSignSchema } from './protocol';
const DEFAULT_SEQUENCE = 0xffffffff;
const DEFAULT_SIGHASH_BUFFER = Buffer.from('01', 'hex'); // SIGHASH_ALL = 0x01
const { PURPOSES, COINS } = BIP_CONSTANTS;
@@ -112,7 +113,7 @@ const buildBitcoinTxRequest = function (data) {
// Send them back!
return {
payload,
- schema: signingSchema.BTC_TRANSFER,
+ schema: LatticeSignSchema.bitcoin,
origData: data, // We will need the original data for serializing the tx
changeData: {
// This data helps fill in the change output
diff --git a/src/client.ts b/src/client.ts
index 92146c89..1facf466 100644
--- a/src/client.ts
+++ b/src/client.ts
@@ -16,8 +16,13 @@ import {
sign
} from './functions/index';
import { buildRetryWrapper } from './shared/functions';
+import { getPubKeyBytes } from './shared/utilities';
import { validateEphemeralPub } from './shared/validators';
-import { getP256KeyPair, getP256KeyPairFromPub, randomBytes } from './util';
+import {
+ getP256KeyPair,
+ getP256KeyPairFromPub,
+ randomBytes
+} from './util';
/**
* `Client` is a class-based interface for managing a Lattice device.
@@ -39,11 +44,10 @@ export class Client {
private retryCount: number;
private fwVersion?: Buffer;
private skipRetryOnWrongWallet: boolean;
-
/** Temporary secret that is generated by the Lattice device */
private _ephemeralPub: KeyPair;
/** The ID of the connected Lattice */
- private deviceId: string | null;
+ private deviceId?: string;
/** Information about the current wallet. Should be null unless we know a wallet is present */
public activeWallets: ActiveWallets;
/** A wrapper function for handling retries and injecting the {@link Client} class */
@@ -60,6 +64,7 @@ export class Client {
timeout,
retryCount,
skipRetryOnWrongWallet,
+ deviceId,
}: {
/** The base URL of the signing server. */
baseUrl?: string;
@@ -75,10 +80,12 @@ export class Client {
stateData?: string;
/** If true we will not retry if we get a wrong wallet error code */
skipRetryOnWrongWallet?: boolean;
+ /** The ID of the connected Lattice */
+ deviceId?: string;
}) {
this.name = name || 'Unknown';
this.baseUrl = baseUrl || BASE_URL;
- this.deviceId = null;
+ this.deviceId = deviceId;
this.isPaired = false;
this.activeWallets = DEFAULT_ACTIVE_WALLETS;
this.timeout = timeout || 60000;
@@ -93,6 +100,30 @@ export class Client {
this.unpackAndApplyStateData(stateData);
}
}
+
+ /**
+ * Get the public key associated with the client's static keypair.
+ * The public key is used for identifying the client to the Lattice.
+ * @internal
+ * @returns Buffer
+ */
+ public get publicKey () {
+ return getPubKeyBytes(this.key);
+ }
+
+ /**
+ * Get the pairing name for this client instance
+ */
+ public getAppName() {
+ return this.name;
+ }
+
+ /**
+ * Get the `deviceId` for this client instance
+ */
+ public getDeviceId() {
+ return this.deviceId;
+ }
/**
* Get the shared secret, derived via ECDH from the local private key and the ephemeral public key
@@ -284,10 +315,29 @@ export class Client {
}
/**
- * `getAppName` returns the name of the application to which this device is currently paired.
+ * Handles the mutation of Client state in the primary functions.
*/
- public getAppName (): string {
- return this.name;
+ public mutate({
+ deviceId,
+ ephemeralPub,
+ url,
+ isPaired,
+ fwVersion,
+ activeWallets,
+ }: {
+ deviceId?: string;
+ ephemeralPub?: Buffer;
+ url?: string;
+ isPaired?: boolean;
+ fwVersion?: Buffer;
+ activeWallets?: ActiveWallets;
+ }) {
+ if (deviceId !== undefined) this.deviceId = deviceId;
+ if (ephemeralPub !== undefined) this.ephemeralPub = ephemeralPub;
+ if (url !== undefined) this.url = url;
+ if (isPaired !== undefined) this.isPaired = isPaired;
+ if (fwVersion !== undefined) this.fwVersion = fwVersion;
+ if (activeWallets !== undefined) this.activeWallets = activeWallets;
}
/**
@@ -310,7 +360,7 @@ export class Client {
capabilities: this.activeWallets.external.capabilities,
},
},
- ephemeralPub: this.ephemeralPub.getPublic().encode('hex'),
+ ephemeralPub: this.ephemeralPub?.getPublic()?.encode('hex'),
fwVersion: this.fwVersion?.toString('hex'),
deviceId: this.deviceId,
name: this.name,
diff --git a/src/constants.ts b/src/constants.ts
index da7a211b..f8414860 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -1,154 +1,86 @@
-/** @internal Consistent with Lattice's IV */
-const AES_IV = [
- 0x6d, 0x79, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x70, 0x61, 0x73, 0x73, 0x77,
- 0x6f, 0x72, 0x64,
-];
-
-/** @internal 128-char strings (null terminated) */
-const ADDR_STR_LEN = 129;
-
-/**
- * Decrypted response lengths will be fixed for any given message type.
- * These are defined in the Lattice spec.
- * Every decrypted response should have a 65-byte pubkey prefixing it (and a 4-byte request ID)
- * These are NOT counted in `decResLengths`, meaning these values are 69-bytes smaller than the
- * corresponding structs in firmware.
- * @internal
- */
-const decResLengths = {
- empty: 0, // Only contains the pubkey
- getAddresses: 10 * ADDR_STR_LEN, // 10x 129 byte strings (128 bytes + null terminator)
- sign: 1090, // 1 DER signature for ETH, 10 for BTC + change pubkeyhash
- getWallets: 142, // 71 bytes per wallet record (response contains internal and external)
- getKvRecords: 1395,
- getDecoders: 1608,
- fetchEncryptedData: 1608,
- removeDecoders: 4,
- test: 1646, // Max size of test response payload
-};
-
-/**
- * Every corresponding decrypted response struct in firmware has a pubkey
- * and checksum added. These are not included in `decResLengths`
- * @internal
- */
-const DES_RES_EXTRADATA_LEN = 69;
+import {
+ LatticeGetAddressesFlag,
+ LatticeEncDataSchema,
+ LatticeSignBlsDst,
+ LatticeSignCurve,
+ LatticeSignEncoding,
+ LatticeSignHash,
+} from './protocol/latticeConstants';
/**
- * Encrypted responses also have metadata
- * - Prefix:
- * - protocol version (1 byte)
- * - response type, reserved (1 byte) -- not used
- * - response id (4 bytes) -- not used
- * - payload length (2 bytes)
- * - response code (1 byte)
- * - Suffix:
- * - checksum (4 bytes) -- NOT the same checksum as inside the decrypted msg
- * @internal
- */
-const ENC_MSG_METADATA_LEN = 13;
-
-/** @internal */
-const ENC_MSG_EXTRA_LEN = DES_RES_EXTRADATA_LEN + ENC_MSG_METADATA_LEN;
-/**
- * Per Lattice spec, all encrypted messages must fit in a buffer of this size.
- * The length comes from the largest request/response data type size
- * We also add the prefix length
- * @internal
+ * Externally exported constants used for building requests
+ * @public
*/
-let ENC_MSG_LEN = 0;
-Object.keys(decResLengths).forEach((k) => {
- if (decResLengths[k] + ENC_MSG_EXTRA_LEN > ENC_MSG_LEN)
- ENC_MSG_LEN = decResLengths[k] + ENC_MSG_EXTRA_LEN;
-});
-
-/** @internal */
-const deviceCodes = {
- CONNECT: 1,
- ENCRYPTED_REQUEST: 2,
-};
-
-/** @internal */
-const encReqCodes = {
- FINALIZE_PAIRING: 0,
- GET_ADDRESSES: 1,
- ADD_PERMISSION: 2,
- SIGN_TRANSACTION: 3,
- GET_WALLETS: 4,
- ADD_PERMISSION_V0: 5,
- ADD_DECODERS: 6,
- GET_KV_RECORDS: 7,
- ADD_KV_RECORDS: 8,
- REMOVE_KV_RECORDS: 9,
- GET_DECODERS: 10,
- REMOVE_DECODERS: 11,
- EXPORT_ENC_DATA: 12,
- TEST: 13,
+export const EXTERNAL = {
+ // Optional flags for `getAddresses`
+ GET_ADDR_FLAGS: {
+ SECP256K1_PUB: LatticeGetAddressesFlag.secp256k1Pubkey,
+ ED25519_PUB: LatticeGetAddressesFlag.ed25519Pubkey,
+ BLS12_381_G1_PUB: LatticeGetAddressesFlag.bls12_381Pubkey,
+ },
+ // Options for building general signing requests
+ SIGNING: {
+ HASHES: {
+ NONE: LatticeSignHash.none,
+ KECCAK256: LatticeSignHash.keccak256,
+ SHA256: LatticeSignHash.sha256,
+ },
+ CURVES: {
+ SECP256K1: LatticeSignCurve.secp256k1,
+ ED25519: LatticeSignCurve.ed25519,
+ BLS12_381_G2: LatticeSignCurve.bls12_381,
+ },
+ ENCODINGS: {
+ NONE: LatticeSignEncoding.none,
+ SOLANA: LatticeSignEncoding.solana,
+ EVM: LatticeSignEncoding.evm,
+ ETH_DEPOSIT: LatticeSignEncoding.eth_deposit,
+ },
+ BLS_DST: {
+ BLS_DST_NUL: LatticeSignBlsDst.NUL,
+ BLS_DST_POP: LatticeSignBlsDst.POP,
+ },
+ },
+ // Options for exporting encrypted data
+ ENC_DATA: {
+ SCHEMAS: {
+ BLS_KEYSTORE_EIP2335_PBKDF_V4: LatticeEncDataSchema.eip2335,
+ },
+ },
+ ETH_CONSENSUS_SPEC: {
+ NETWORKS: {
+ MAINNET_GENESIS: {
+ networkName: 'mainnet',
+ forkVersion: Buffer.alloc(4),
+ // Empty root because there were no validators at genesis
+ validatorsRoot: Buffer.alloc(32),
+ },
+ },
+ DOMAINS: {
+ DEPOSIT: Buffer.from('03000000', 'hex'),
+ VOLUNTARY_EXIT: Buffer.from('04000000', 'hex'),
+ },
+ },
} as const;
-/** @internal */
-const messageConstants = {
- NOT_PAIRED: 0x00,
- PAIRED: 0x01,
-};
-
+//===============================
+// INTERNAL CONSTANTS
+//===============================
/** @internal */
const addressSizes = {
BTC: 20, // 20 byte pubkeyhash
ETH: 20, // 20 byte address not including 0x prefix
-};
-
-/** @internal */
-const responseCodes = {
- RESP_SUCCESS: 0x00,
- RESP_ERR_INVALID_MSG: 0x80,
- RESP_ERR_UNSUPPORTED_VER: 0x81,
- RESP_ERR_DEV_BUSY: 0x82,
- RESP_ERR_USER_TIMEOUT: 0x83,
- RESP_ERR_USER_DECLINED: 0x84,
- RESP_ERR_PAIR_FAIL: 0x85,
- RESP_ERR_PAIR_DISABLED: 0x86,
- RESP_ERR_PERMISSION_DISABLED: 0x87,
- RESP_ERR_INTERNAL: 0x88,
- RESP_ERR_GCE_TIMEOUT: 0x89,
- RESP_ERR_WRONG_WALLET: 0x8a,
- RESP_ERR_DEV_LOCKED: 0x8b,
- RESP_ERR_DISABLED: 0x8c,
- RESP_ERR_ALREADY: 0x8d,
- RESP_ERR_INVALID_EPHEM_ID: 0x8e,
-};
+} as const;
/** @internal */
const CURRENCIES = {
ETH: 'ETH',
BTC: 'BTC',
ETH_MSG: 'ETH_MSG',
-}
-
-/** @internal */
-const responseMsgs = {
- [responseCodes.RESP_SUCCESS]: 0x00,
- [responseCodes.RESP_ERR_INVALID_MSG]: 'Invalid request',
- [responseCodes.RESP_ERR_UNSUPPORTED_VER]: 'Unsupported version',
- [responseCodes.RESP_ERR_DEV_BUSY]: 'Device busy',
- [responseCodes.RESP_ERR_USER_TIMEOUT]: 'Timeout waiting for user',
- [responseCodes.RESP_ERR_USER_DECLINED]: 'Request declined by user',
- [responseCodes.RESP_ERR_PAIR_FAIL]: 'Pairing failed',
- [responseCodes.RESP_ERR_PAIR_DISABLED]: 'Pairing is currently disabled',
- [responseCodes.RESP_ERR_PERMISSION_DISABLED]:
- 'Automated signing is currently disabled',
- [responseCodes.RESP_ERR_INTERNAL]: 'Device error',
- [responseCodes.RESP_ERR_GCE_TIMEOUT]: 'Timeout',
- [responseCodes.RESP_ERR_WRONG_WALLET]: 'Active wallet does not match request',
- [responseCodes.RESP_ERR_DEV_LOCKED]: 'Device locked',
- [responseCodes.RESP_ERR_DISABLED]: 'Disabled',
- [responseCodes.RESP_ERR_ALREADY]:
- 'Record already exists. You must first remove it on your device.',
- [responseCodes.RESP_ERR_INVALID_EPHEM_ID]:
- 'Could not find requester. Please reconnect.',
-};
+} as const;
/** @internal */
+// THIS NEEDS TO BE A PROTOCOL CONSTANT TOO
const signingSchema = {
BTC_TRANSFER: 0,
ETH_TRANSFER: 1,
@@ -156,7 +88,7 @@ const signingSchema = {
ETH_MSG: 3,
EXTRA_DATA: 4,
GENERAL_SIGNING: 5,
-};
+} as const;
/** @internal */
const HARDENED_OFFSET = 0x80000000; // Hardened offset
@@ -174,7 +106,7 @@ const BIP_CONSTANTS = {
BTC: HARDENED_OFFSET,
BTC_TESTNET: HARDENED_OFFSET + 1,
},
-};
+} as const;
/** @internal For all HSM-bound requests */
const REQUEST_TYPE_BYTE = 0x02;
@@ -332,63 +264,6 @@ const ethMsgProtocol = {
},
};
-/**
- * Externally exported constants used for building requests
- * @public
- */
-export const EXTERNAL = {
- // Optional flags for `getAddresses`
- GET_ADDR_FLAGS: {
- SECP256K1_PUB: 3,
- ED25519_PUB: 4,
- BLS12_381_G1_PUB: 5,
- },
- // Options for building general signing requests
- SIGNING: {
- HASHES: {
- NONE: 0,
- KECCAK256: 1,
- SHA256: 2,
- },
- CURVES: {
- SECP256K1: 0,
- ED25519: 1,
- BLS12_381_G2: 2,
- },
- ENCODINGS: {
- NONE: 1,
- SOLANA: 2,
- // TERRA: 3, // Deprecated
- EVM: 4,
- ETH_DEPOSIT: 5,
- },
- BLS_DST: {
- BLS_DST_NUL: 1,
- BLS_DST_POP: 2,
- },
- },
- // Options for exporting encrypted data
- ENC_DATA: {
- SCHEMAS: {
- BLS_KEYSTORE_EIP2335_PBKDF_V4: 0,
- },
- },
- ETH_CONSENSUS_SPEC: {
- NETWORKS: {
- MAINNET_GENESIS: {
- networkName: 'mainnet',
- forkVersion: Buffer.alloc(4),
- // Empty root because there were no validators at genesis
- validatorsRoot: Buffer.alloc(32),
- },
- },
- DOMAINS: {
- DEPOSIT: Buffer.from('03000000', 'hex'),
- VOLUNTARY_EXIT: Buffer.from('04000000', 'hex'),
- }
- },
-};
-
/** @internal */
function getFwVersionConst (v: Buffer): FirmwareConstants {
const c: any = {
@@ -627,26 +502,77 @@ export const DEFAULT_ACTIVE_WALLETS: ActiveWallets = {
},
};
+/** @internal */
+export const DEFAULT_ETH_DERIVATION = [
+ HARDENED_OFFSET + 44,
+ HARDENED_OFFSET + 60,
+ HARDENED_OFFSET,
+ 0,
+ 0,
+];
+
+/** @internal */
+export const BTC_LEGACY_DERIVATION = [
+ HARDENED_OFFSET + 44,
+ HARDENED_OFFSET + 0,
+ HARDENED_OFFSET,
+ 0,
+ 0,
+];
+
+/** @internal */
+export const BTC_SEGWIT_DERIVATION = [
+ HARDENED_OFFSET + 84,
+ HARDENED_OFFSET,
+ HARDENED_OFFSET,
+ 0,
+ 0,
+];
+
+/** @internal */
+export const BTC_WRAPPED_SEGWIT_DERIVATION = [
+ HARDENED_OFFSET + 49,
+ HARDENED_OFFSET,
+ HARDENED_OFFSET,
+ 0,
+ 0,
+];
+
+/** @internal */
+export const SOLANA_DERIVATION = [
+ HARDENED_OFFSET + 44,
+ HARDENED_OFFSET + 501,
+ HARDENED_OFFSET,
+];
+
+/** @internal */
+export const LEDGER_LIVE_DERIVATION = [
+ HARDENED_OFFSET + 49,
+ HARDENED_OFFSET + 60,
+ HARDENED_OFFSET,
+ 0,
+ 0,
+];
+
+/** @internal */
+export const LEDGER_LEGACY_DERIVATION = [
+ HARDENED_OFFSET + 49,
+ HARDENED_OFFSET + 60,
+ HARDENED_OFFSET,
+ 0,
+];
+
export {
ASCII_REGEX,
getFwVersionConst,
- ADDR_STR_LEN,
- AES_IV,
BIP_CONSTANTS,
BASE_URL,
CURRENCIES,
MAX_ADDR,
NETWORKS_BY_CHAIN_ID,
EXTERNAL_NETWORKS_BY_CHAIN_ID_URL,
- ENC_MSG_LEN,
addressSizes,
- decResLengths,
- deviceCodes,
- encReqCodes,
ethMsgProtocol,
- messageConstants,
- responseCodes,
- responseMsgs,
signingSchema,
REQUEST_TYPE_BYTE,
VERSION_BYTE,
@@ -654,6 +580,5 @@ export {
HANDLE_LARGER_CHAIN_ID,
MAX_CHAIN_ID_BYTES,
ETH_ABI_LATTICE_FW_TYPE_MAP,
-
EXTERNAL as PUBLIC,
};
diff --git a/src/ethereum.ts b/src/ethereum.ts
index f71cd80a..34bd8fe2 100644
--- a/src/ethereum.ts
+++ b/src/ethereum.ts
@@ -14,8 +14,8 @@ import {
ethMsgProtocol,
HANDLE_LARGER_CHAIN_ID,
MAX_CHAIN_ID_BYTES,
- signingSchema
} from './constants';
+import { LatticeSignSchema } from './protocol';
import {
buildSignerPathBuf,
ensureHexBuffer,
@@ -32,7 +32,7 @@ const buildEthereumMsgRequest = function (input) {
if (input.signerPath.length > 5 || input.signerPath.length < 2)
throw new Error('Please provide a signer path with 2-5 indices');
const req = {
- schema: signingSchema.ETH_MSG,
+ schema: LatticeSignSchema.ethereumMsg,
payload: null,
input, // Save the input for later
msg: null, // Save the buffered message for later
@@ -374,7 +374,7 @@ const buildEthereumTxRequest = function (data) {
type,
payload: txReqPayload.slice(0, off),
extraDataPayloads,
- schema: signingSchema.ETH_TRANSFER, // We will use eth transfer for all ETH txs for v1
+ schema: LatticeSignSchema.ethereum, // We will use eth transfer for all ETH txs for v1
chainId,
useEIP155,
signerPath,
diff --git a/src/functions/addKvRecords.ts b/src/functions/addKvRecords.ts
index 5bd7e67b..92357b6d 100644
--- a/src/functions/addKvRecords.ts
+++ b/src/functions/addKvRecords.ts
@@ -1,11 +1,11 @@
-import { decResLengths } from '../constants';
-import { decryptResponse, encryptRequest, request } from '../shared/functions';
import {
- validateFwConstants,
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+} from '../protocol';
+import {
+ validateConnectedClient,
validateKvRecord,
validateKvRecords,
- validateSharedSecret,
- validateUrl,
} from '../shared/validators';
/**
@@ -14,70 +14,60 @@ import {
* @category Lattice
* @returns A callback with an error or null.
*/
-export async function addKvRecords ({
- type = 0,
- records,
- caseSensitive = false,
+export async function addKvRecords({
client,
+ records,
+ type,
+ caseSensitive,
}: AddKvRecordsRequestFunctionParams): Promise {
- const { url, sharedSecret, fwConstants, validRecords } = validateAddKvRequest(
- {
- url: client.url,
- fwConstants: client.getFwConstants(),
- sharedSecret: client.sharedSecret,
- records,
- },
- );
+ const { url, sharedSecret, ephemeralPub, fwConstants } =
+ validateConnectedClient(client);
+ validateAddKvRequest({ records, fwConstants });
- const payload = encodeAddKvRecordsRequest({
- records: validRecords,
- fwConstants,
+ // Build the data for this request
+ const data = encodeAddKvRecordsRequest({
+ records,
type,
caseSensitive,
+ fwConstants,
});
- const encryptedPayload = encryptAddKvRecordsRequest({
- payload,
+ const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({
+ data,
+ requestType: LatticeSecureEncryptedRequestType.addKvRecords,
sharedSecret,
+ ephemeralPub,
+ url,
});
- const encryptedResponse = await requestAddKvRecords(encryptedPayload, url);
-
- const { decryptedData, newEphemeralPub } = decryptAddKvRecordsResponse(
- encryptedResponse,
- sharedSecret,
- );
-
- client.ephemeralPub = newEphemeralPub;
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
+ });
return decryptedData;
}
export const validateAddKvRequest = ({
- url,
- fwConstants,
- sharedSecret,
records,
-}: ValidateAddKvRequestParams) => {
- const validUrl = validateUrl(url);
- const validFwConstants = validateFwConstants(fwConstants);
- const validSharedSecret = validateSharedSecret(sharedSecret);
- const validRecords = validateKvRecords(records, validFwConstants);
-
- return {
- url: validUrl,
- fwConstants: validFwConstants,
- sharedSecret: validSharedSecret,
- validRecords,
- };
+ fwConstants,
+}: {
+ records: KVRecords;
+ fwConstants: FirmwareConstants;
+}) => {
+ validateKvRecords(records, fwConstants);
};
export const encodeAddKvRecordsRequest = ({
records,
- fwConstants,
type,
caseSensitive,
-}: EncodeAddKvRecordsRequestParams) => {
+ fwConstants,
+}: {
+ records: KVRecords;
+ type: number;
+ caseSensitive: boolean;
+ fwConstants: FirmwareConstants;
+}) => {
const payload = Buffer.alloc(1 + 139 * fwConstants.kvActionMaxNum);
payload.writeUInt8(Object.keys(records).length, 0);
let off = 1;
@@ -104,30 +94,3 @@ export const encodeAddKvRecordsRequest = ({
});
return payload;
};
-
-export const encryptAddKvRecordsRequest = ({
- payload,
- sharedSecret,
-}: EncrypterParams) => {
- return encryptRequest({
- requestCode: 'ADD_KV_RECORDS',
- payload,
- sharedSecret,
- });
-};
-
-export const requestAddKvRecords = async (payload: Buffer, url: string) => {
- return request({ payload, url });
-};
-
-export const decryptAddKvRecordsResponse = (
- response: Buffer,
- sharedSecret: Buffer,
-) => {
- const { decryptedData, newEphemeralPub } = decryptResponse(
- response,
- decResLengths.empty,
- sharedSecret,
- );
- return { decryptedData, newEphemeralPub };
-};
diff --git a/src/functions/connect.ts b/src/functions/connect.ts
index 1574592a..0525d715 100644
--- a/src/functions/connect.ts
+++ b/src/functions/connect.ts
@@ -1,11 +1,6 @@
-import { deviceCodes, messageConstants } from '../constants';
-import { buildRequest, request } from '../shared/functions';
+import { connectSecureRequest, ProtocolConstants } from '../protocol';
import { doesFetchWalletsOnLoad } from '../shared/predicates';
-import {
- getPubKeyBytes,
- getSharedSecret,
- parseWallets,
-} from '../shared/utilities';
+import { getSharedSecret, parseWallets } from '../shared/utilities';
import {
validateBaseUrl,
validateDeviceId,
@@ -13,39 +8,49 @@ import {
} from '../shared/validators';
import { aes256_decrypt, getP256KeyPairFromPub } from '../util';
-export async function connect ({
- id,
+export async function connect({
client,
+ id,
}: ConnectRequestFunctionParams): Promise {
const { deviceId, key, baseUrl } = validateConnectRequest({
deviceId: id,
key: client.key,
baseUrl: client.baseUrl,
});
- const url = `${baseUrl}/${deviceId}`;
- const payload = await encodeConnectRequest(key);
+ const url = `${baseUrl}/${deviceId}`;
- const response = await requestConnect(payload, url);
+ const respPayloadData = await connectSecureRequest({
+ url,
+ pubkey: client.publicKey,
+ });
+ // Decode response data params.
+ // Response payload data is *not* encrypted.
const { isPaired, fwVersion, activeWallets, ephemeralPub } =
- await decodeConnectResponse(response, key);
+ await decodeConnectResponse(respPayloadData, key);
- client.deviceId = deviceId;
- client.ephemeralPub = ephemeralPub;
- client.url = `${client.baseUrl}/${deviceId}`;
- client.isPaired = isPaired;
- client.fwVersion = fwVersion;
- if (activeWallets) {
- client.activeWallets = activeWallets;
- }
+ // Update client state with response data
- // If we are paired and are on older firmware (<0.14.1), we need a follow up request to sync
- // wallet state.
+ client.mutate({
+ deviceId,
+ ephemeralPub,
+ url,
+ isPaired,
+ fwVersion,
+ activeWallets,
+ });
+
+ // If we are paired and are on older firmware (<0.14.1), we need a
+ // follow up request to sync wallet state.
if (isPaired && !doesFetchWalletsOnLoad(client.getFwVersion())) {
await client.fetchActiveWallet();
}
+ // Return flag indicating whether we are paired or not.
+ // If we are *not* already paired, the Lattice is now in
+ // pairing mode and expects a `finalizePairing` encrypted
+ // request as a follow up.
return isPaired;
}
@@ -53,10 +58,19 @@ export const validateConnectRequest = ({
deviceId,
key,
baseUrl,
-}: ValidateConnectRequestParams): ValidatedConnectRequest => {
+}: {
+ deviceId?: string;
+ key?: KeyPair;
+ baseUrl?: string;
+}): {
+ deviceId: string;
+ key: KeyPair;
+ baseUrl: string;
+} => {
const validDeviceId = validateDeviceId(deviceId);
const validKey = validateKey(key);
const validBaseUrl = validateBaseUrl(baseUrl);
+
return {
deviceId: validDeviceId,
key: validKey,
@@ -64,20 +78,6 @@ export const validateConnectRequest = ({
};
};
-export const encodeConnectRequest = (key: KeyPair) => {
- const deviceCode = deviceCodes.CONNECT;
- const pubKeyBytes = getPubKeyBytes(key);
- const payload = buildRequest(deviceCode, pubKeyBytes);
- return payload;
-};
-
-export const requestConnect = async (
- payload: Buffer,
- url: string,
-): Promise => {
- return request({ payload, url });
-};
-
/**
* `decodeConnectResponse` will call `StartPairingMode` on the device, which gives the user 60 seconds to
* finalize the pairing. This will return an ephemeral public key, which is needed for the next
@@ -98,7 +98,8 @@ export const decodeConnectResponse = (
ephemeralPub: Buffer;
} => {
let off = 0;
- const isPaired = response.readUInt8(off) === messageConstants.PAIRED;
+ const isPaired =
+ response.readUInt8(off) === ProtocolConstants.pairingStatus.paired;
off++;
// If we are already paired, we get the next ephemeral key
const pub = response.slice(off, off + 65).toString('hex');
diff --git a/src/functions/fetchActiveWallet.ts b/src/functions/fetchActiveWallet.ts
index e585809d..c5a6ec74 100644
--- a/src/functions/fetchActiveWallet.ts
+++ b/src/functions/fetchActiveWallet.ts
@@ -1,87 +1,45 @@
-import { decResLengths, EMPTY_WALLET_UID } from '../constants';
+import { EMPTY_WALLET_UID } from '../constants';
import {
- decryptResponse,
- encryptRequest,
- request,
-} from '../shared/functions';
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+} from '../protocol';
import {
validateActiveWallets,
- validateSharedSecret,
- validateUrl,
+ validateConnectedClient,
} from '../shared/validators';
/**
- * Fetch the active wallet in the device.
+ * Fetch the active wallet in the device.
*
* The Lattice has two wallet interfaces: internal and external. If a SafeCard is inserted and
* unlocked, the external interface is considered "active" and this will return its {@link Wallet}
* data. Otherwise it will return the info for the internal Lattice wallet.
*/
-export async function fetchActiveWallet ({
+export async function fetchActiveWallet({
client,
}: FetchActiveWalletRequestFunctionParams): Promise {
- const { url, sharedSecret } = validateFetchActiveWallet({
- url: client.url,
- sharedSecret: client.sharedSecret,
- });
-
- const payload = encryptFetchActiveWalletRequest({ sharedSecret });
+ const { url, sharedSecret, ephemeralPub } = validateConnectedClient(client);
- const encryptedResponse = await requestFetchActiveWallet(payload, url).catch(
- (err) => {
- client.resetActiveWallets();
- throw err;
- },
- );
-
- const { decryptedData, newEphemeralPub } = decryptFetchActiveWalletResponse(
- encryptedResponse,
+ const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({
+ data: Buffer.alloc(0),
+ requestType: LatticeSecureEncryptedRequestType.getWallets,
sharedSecret,
- );
+ ephemeralPub,
+ url,
+ });
const activeWallets = decodeFetchActiveWalletResponse(decryptedData);
-
const validActiveWallets = validateActiveWallets(activeWallets);
- client.activeWallets = validActiveWallets;
- client.ephemeralPub = newEphemeralPub;
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
+ activeWallets: validActiveWallets,
+ });
return validActiveWallets;
}
-export const validateFetchActiveWallet = ({
- url,
- sharedSecret,
-}: ValidateFetchActiveWalletRequestParams) => {
- const validUrl = validateUrl(url);
- const validSharedSecret = validateSharedSecret(sharedSecret);
-
- return {
- url: validUrl,
- sharedSecret: validSharedSecret,
- };
-};
-
-export const encryptFetchActiveWalletRequest = ({
- sharedSecret,
-}: ValidatedFetchActiveWalletRequest) => {
- return encryptRequest({
- requestCode: 'GET_WALLETS',
- payload: Buffer.alloc(0),
- sharedSecret,
- });
-};
-
-export const requestFetchActiveWallet = async (
- payload: Buffer,
- url: string,
-) => {
- return request({ payload, url });
-};
-
export const decodeFetchActiveWalletResponse = (data: Buffer) => {
- // Skip 65byte pubkey prefix. WalletDescriptor contains 32byte id + 4byte flag + 35byte name
- const walletData = data.slice(65);
// Read the external wallet data first. If it is non-null, the external wallet will be the
// active wallet of the device and we should save it. If the external wallet is blank, it means
// there is no card present and we should save and use the interal wallet. If both wallets are
@@ -103,32 +61,14 @@ export const decodeFetchActiveWalletResponse = (data: Buffer) => {
},
};
let off = 0;
- activeWallets.internal.uid = walletData.slice(off, off + 32);
- activeWallets.internal.capabilities = walletData.readUInt32BE(off + 32);
- activeWallets.internal.name = walletData.slice(
- off + 36,
- off + walletDescriptorLen,
- );
+ activeWallets.internal.uid = data.slice(off, off + 32);
+ activeWallets.internal.capabilities = data.readUInt32BE(off + 32);
+ activeWallets.internal.name = data.slice(off + 36, off + walletDescriptorLen);
// Offset the first item
off += walletDescriptorLen;
// External
- activeWallets.external.uid = walletData.slice(off, off + 32);
- activeWallets.external.capabilities = walletData.readUInt32BE(off + 32);
- activeWallets.external.name = walletData.slice(
- off + 36,
- off + walletDescriptorLen,
- );
+ activeWallets.external.uid = data.slice(off, off + 32);
+ activeWallets.external.capabilities = data.readUInt32BE(off + 32);
+ activeWallets.external.name = data.slice(off + 36, off + walletDescriptorLen);
return activeWallets;
};
-
-export const decryptFetchActiveWalletResponse = (
- response: Buffer,
- sharedSecret: Buffer,
-) => {
- const { decryptedData, newEphemeralPub } = decryptResponse(
- response,
- decResLengths.getWallets,
- sharedSecret,
- );
- return { decryptedData, newEphemeralPub };
-};
diff --git a/src/functions/fetchEncData.ts b/src/functions/fetchEncData.ts
index 6cca6b0a..83945bed 100644
--- a/src/functions/fetchEncData.ts
+++ b/src/functions/fetchEncData.ts
@@ -3,22 +3,15 @@
* to known schema, e.g. EIP2335 derived privkey export.
*/
import { v4 as uuidV4 } from 'uuid';
-
-import {
- decResLengths,
- EXTERNAL,
-} from '../constants';
+import { EXTERNAL } from '../constants';
import {
- decryptResponse,
- encryptRequest,
- request,
-} from '../shared/functions';
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+} from '../protocol';
import { getPathStr } from '../shared/utilities';
import {
- validateFwVersion,
- validateSharedSecret,
+ validateConnectedClient,
validateStartPath,
- validateUrl,
validateWallet,
} from '../shared/validators';
@@ -32,58 +25,75 @@ const ENC_DATA_RESP_SZ = {
CHECKSUM: 32,
IV: 16,
PUBKEY: 48,
- }
-}
+ },
+} as const;
+
+export async function fetchEncData({
+ client,
+ schema,
+ params,
+}: FetchEncDataRequestFunctionParams): Promise {
+ const { url, sharedSecret, ephemeralPub, fwVersion } =
+ validateConnectedClient(client);
+ const activeWallet = validateWallet(client.getActiveWallet());
+ validateFetchEncDataRequest({ params });
-export async function fetchEncData (req: FetchEncDataRequestFunctionParams): Promise {
- const params = validateFetchEncDataRequest(req);
- const payload = encodeFetchEncDataRequest(req.schema, params);
- const encryptedPayload = encryptFetchEncDataRequest({
- payload,
- sharedSecret: req.client.sharedSecret,
+ const data = encodeFetchEncDataRequest({
+ schema,
+ params,
+ fwVersion,
+ activeWallet,
});
- const encryptedResponse = await request({
- payload: encryptedPayload,
- url: req.client.url
+
+ const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({
+ data,
+ requestType: LatticeSecureEncryptedRequestType.fetchEncryptedData,
+ sharedSecret,
+ ephemeralPub,
+ url,
+ });
+
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
});
- const { decryptedData, newEphemeralPub } = decryptResponse(
- encryptedResponse,
- decResLengths.fetchEncryptedData,
- req.client.sharedSecret,
- );
- req.client.ephemeralPub = newEphemeralPub;
- return decodeFetchEncData(decryptedData, req);
+
+ return decodeFetchEncData({ data: decryptedData, schema, params });
}
-export const validateFetchEncDataRequest = (req: FetchEncDataRequestFunctionParams): EIP2335KeyExportReq => {
- const { schema, params, client } = req;
- // Validate client state
- const wallet = client.getActiveWallet();
- validateFwVersion(client.fwVersion);
- validateWallet(wallet);
- validateSharedSecret(client.sharedSecret);
- validateUrl(client.url);
+export const validateFetchEncDataRequest = ({
+ params,
+}: {
+ params: EIP2335KeyExportReq;
+}) => {
+ // Validate derivation path
+ validateStartPath(params.path);
+};
+
+export const encodeFetchEncDataRequest = ({
+ schema,
+ params,
+ fwVersion,
+ activeWallet,
+}: {
+ schema: number;
+ params: EIP2335KeyExportReq;
+ fwVersion: FirmwareVersion;
+ activeWallet: Wallet;
+}) => {
// Check firmware version
- if (client.fwVersion.major < 1 && client.fwVersion.minor < 17) {
- throw new Error('Firmware version >=v0.17.0 is required for encrypted data export.');
+ if (fwVersion.major < 1 && fwVersion.minor < 17) {
+ throw new Error(
+ 'Firmware version >=v0.17.0 is required for encrypted data export.',
+ );
}
- // Validate params depending on what type of data is being exported
+ // Update params depending on what type of data is being exported
if (schema === ENC_DATA.SCHEMAS.BLS_KEYSTORE_EIP2335_PBKDF_V4) {
- // EIP2335 key export
- validateStartPath(params.path);
// Set the wallet UID to the client's current active wallet
- params.walletUID = wallet.uid;
- // Return updated params
- return params;
+ params.walletUID = activeWallet.uid;
} else {
throw new Error(ENC_DATA_ERR_STR);
}
-}
-
-export const encodeFetchEncDataRequest = (
- schema: number,
- params: EIP2335KeyExportReq,
-) => {
+ // Build the payload data
const payload = Buffer.alloc(ENC_DATA_REQ_DATA_SZ);
let off = 0;
payload.writeUInt8(schema, off);
@@ -100,37 +110,41 @@ export const encodeFetchEncDataRequest = (
off += 4;
}
if (params.c) {
- payload.writeUInt32LE(params.c, off)
+ payload.writeUInt32LE(params.c, off);
}
off += 4;
return payload;
} else {
- throw new Error(ENC_DATA_ERR_STR)
+ throw new Error(ENC_DATA_ERR_STR);
}
-}
-
-export const encryptFetchEncDataRequest = ({
- payload,
- sharedSecret,
-}: EncrypterParams) => {
- return encryptRequest({
- requestCode: 'EXPORT_ENC_DATA',
- payload,
- sharedSecret,
- });
-}
+};
-export const decodeFetchEncData = (data: Buffer, req: FetchEncDataRequestFunctionParams): Buffer => {
- let off = 65; // Skip 65 byte pubkey prefix
- if (req.schema === ENC_DATA.SCHEMAS.BLS_KEYSTORE_EIP2335_PBKDF_V4) {
+export const decodeFetchEncData = ({
+ data,
+ schema,
+ params,
+}: {
+ schema: number;
+ params: EIP2335KeyExportReq;
+ data: Buffer;
+}): Buffer => {
+ let off = 0;
+ if (schema === ENC_DATA.SCHEMAS.BLS_KEYSTORE_EIP2335_PBKDF_V4) {
const respData = {} as EIP2335KeyExportData;
const { CIPHERTEXT, SALT, CHECKSUM, IV, PUBKEY } = ENC_DATA_RESP_SZ.EIP2335;
- const expectedSz = 4 + // iterations = u32
- CIPHERTEXT + SALT + CHECKSUM + IV + PUBKEY;
+ const expectedSz =
+ 4 + // iterations = u32
+ CIPHERTEXT +
+ SALT +
+ CHECKSUM +
+ IV +
+ PUBKEY;
const dataSz = data.readUInt32LE(off);
off += 4;
if (dataSz !== expectedSz) {
- throw new Error('Invalid data returned from Lattice. Expected EIP2335 data.');
+ throw new Error(
+ 'Invalid data returned from Lattice. Expected EIP2335 data.',
+ );
}
respData.iterations = data.readUInt32LE(off);
off += 4;
@@ -144,7 +158,7 @@ export const decodeFetchEncData = (data: Buffer, req: FetchEncDataRequestFunctio
off += IV;
respData.pubkey = data.slice(off, off + PUBKEY);
off += PUBKEY;
- return formatEIP2335ExportData(respData, req.params.path);
+ return formatEIP2335ExportData(respData, params.path);
} else {
throw new Error(ENC_DATA_ERR_STR);
}
diff --git a/src/functions/getAddresses.ts b/src/functions/getAddresses.ts
index 4cee8aa7..14ad7028 100644
--- a/src/functions/getAddresses.ts
+++ b/src/functions/getAddresses.ts
@@ -1,19 +1,16 @@
import bitwise from 'bitwise';
import { Byte, UInt4 } from 'bitwise/types';
import {
- ADDR_STR_LEN,
- decResLengths,
- EXTERNAL,
- getFwVersionConst,
-} from '../constants';
-import { decryptResponse, encryptRequest, request } from '../shared/functions';
+ encryptedSecureRequest,
+ LatticeGetAddressesFlag,
+ LatticeSecureEncryptedRequestType,
+ ProtocolConstants,
+} from '../protocol';
import {
- validateFwVersion,
+ validateConnectedClient,
validateIsUInt4,
validateNAddresses,
- validateSharedSecret,
validateStartPath,
- validateUrl,
validateWallet,
} from '../shared/validators';
import { isValidAssetPath } from '../util';
@@ -24,93 +21,84 @@ import { isValidAssetPath } from '../util';
* @category Lattice
* @returns An array of addresses or public keys.
*/
-export async function getAddresses ({
- startPath,
- n,
- flag,
+export async function getAddresses({
client,
+ startPath: _startPath,
+ n: _n,
+ flag: _flag,
}: GetAddressesRequestFunctionParams): Promise {
- const { url, fwVersion, wallet, sharedSecret } =
- validateGetAddressesRequest({
- startPath,
- n,
- flag,
- url: client.url,
- fwVersion: client.fwVersion,
- wallet: client.getActiveWallet(),
- sharedSecret: client.sharedSecret,
- });
+ const { url, sharedSecret, ephemeralPub, fwConstants } =
+ validateConnectedClient(client);
+ const activeWallet = validateWallet(client.getActiveWallet());
+
+ const { startPath, n, flag } = validateGetAddressesRequest({
+ startPath: _startPath,
+ n: _n,
+ flag: _flag,
+ });
- const payload = encodeGetAddressesRequest({
+ const data = encodeGetAddressesRequest({
startPath,
n,
flag,
- fwVersion,
- wallet,
+ fwConstants,
+ wallet: activeWallet,
});
- const encryptedPayload = encryptGetAddressesRequest({
- payload,
+ const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({
+ data,
+ requestType: LatticeSecureEncryptedRequestType.getAddresses,
sharedSecret,
+ ephemeralPub,
+ url,
});
- const encryptedResponse = await requestGetAddresses(encryptedPayload, url);
-
- const { decryptedData, newEphemeralPub } = decryptGetAddressesResponse(
- encryptedResponse,
- sharedSecret,
- );
-
- client.ephemeralPub = newEphemeralPub;
-
- const data = decodeGetAddresses(decryptedData, flag);
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
+ });
- return data;
+ return decodeGetAddressesResponse(decryptedData, flag);
}
export const validateGetAddressesRequest = ({
startPath,
n,
flag,
- url,
- fwVersion,
- wallet,
- sharedSecret,
-}: ValidateGetAddressesRequestParams) => {
- validateStartPath(startPath);
- validateNAddresses(n);
- validateIsUInt4(flag);
- const validUrl = validateUrl(url);
- const validFwVersion = validateFwVersion(fwVersion);
- const validWallet = validateWallet(wallet);
- const validSharedSecret = validateSharedSecret(sharedSecret);
-
+}: {
+ startPath?: number[];
+ n?: number;
+ flag?: number;
+}) => {
return {
- url: validUrl,
- fwVersion: validFwVersion,
- wallet: validWallet,
- sharedSecret: validSharedSecret,
+ startPath: validateStartPath(startPath),
+ n: validateNAddresses(n),
+ flag: validateIsUInt4(flag),
};
};
export const encodeGetAddressesRequest = ({
- fwVersion,
startPath,
n,
- wallet,
flag,
-}: EncodeGetAddressesRequestParams) => {
- const fwConstants = getFwVersionConst(fwVersion);
- const flags = fwConstants.getAddressFlags || [] as any[];
+ fwConstants,
+ wallet,
+}: {
+ startPath: number[];
+ n: number;
+ flag: number;
+ fwConstants: FirmwareConstants;
+ wallet: Wallet;
+}) => {
+ const flags = fwConstants.getAddressFlags || ([] as any[]);
const isPubkeyOnly =
flags.indexOf(flag) > -1 &&
- (
- flag === EXTERNAL.GET_ADDR_FLAGS.ED25519_PUB ||
- flag === EXTERNAL.GET_ADDR_FLAGS.SECP256K1_PUB ||
- flag === EXTERNAL.GET_ADDR_FLAGS.BLS12_381_G1_PUB
- );
+ (flag === LatticeGetAddressesFlag.ed25519Pubkey ||
+ flag === LatticeGetAddressesFlag.secp256k1Pubkey ||
+ flag === LatticeGetAddressesFlag.bls12_381Pubkey);
if (!isPubkeyOnly && !isValidAssetPath(startPath, fwConstants)) {
- throw new Error('Derivation path or flag is not supported. Try updating Lattice firmware.');
+ throw new Error(
+ 'Derivation path or flag is not supported. Try updating Lattice firmware.',
+ );
}
let sz = 32 + 20 + 1; // walletUID + 5 u32 indices + count/flag
if (fwConstants.varAddrPathSzAllowed) {
@@ -122,7 +110,6 @@ export const encodeGetAddressesRequest = ({
}
const payload = Buffer.alloc(sz);
let off = 0;
-
wallet.uid.copy(payload, off);
off += 32;
// Build the start path (5x u32 indices)
@@ -146,7 +133,7 @@ export const encodeGetAddressesRequest = ({
// `n` as a 4 bit value
flagVal =
fwConstants.getAddressFlags &&
- fwConstants.getAddressFlags.indexOf(flag) > -1
+ fwConstants.getAddressFlags.indexOf(flag) > -1
? (flag as UInt4)
: 0;
const flagBits = bitwise.nibble.read(flagVal);
@@ -161,44 +148,38 @@ export const encodeGetAddressesRequest = ({
return payload;
};
-export const encryptGetAddressesRequest = ({
- payload,
- sharedSecret,
-}: EncrypterParams) => {
- return encryptRequest({
- requestCode: 'GET_ADDRESSES',
- payload,
- sharedSecret,
- });
-};
-
-export const requestGetAddresses = async (payload: Buffer, url: string) => {
- return request({ payload, url });
-};
-
/**
* @internal
* @return an array of address strings or pubkey buffers
*/
-export const decodeGetAddresses = (data: any, flag: number): Buffer[] => {
- let off = 65; // Skip 65 byte pubkey prefix
+export const decodeGetAddressesResponse = (
+ data: Buffer,
+ flag: number,
+): Buffer[] => {
+ let off = 0;
// Look for addresses until we reach the end (a 4 byte checksum)
const addrs: any[] = [];
// Pubkeys are formatted differently in the response
- const { ED25519_PUB, SECP256K1_PUB, BLS12_381_G1_PUB } = EXTERNAL.GET_ADDR_FLAGS;
- const arePubkeys = flag === ED25519_PUB || flag === SECP256K1_PUB || flag === BLS12_381_G1_PUB;
+ const arePubkeys =
+ flag === LatticeGetAddressesFlag.secp256k1Pubkey ||
+ flag === LatticeGetAddressesFlag.ed25519Pubkey ||
+ flag === LatticeGetAddressesFlag.bls12_381Pubkey;
if (arePubkeys) {
off += 1; // skip uint8 representing pubkey type
}
- while (off + 4 < decResLengths.getAddresses) {
+ const respDataLength =
+ ProtocolConstants.msgSizes.secure.data.response.encrypted[
+ LatticeSecureEncryptedRequestType.getAddresses
+ ];
+ while (off < respDataLength) {
if (arePubkeys) {
// Pubkeys are shorter and are returned as buffers
const pubBytes = data.slice(off, off + 65);
const isEmpty = pubBytes.every((byte: number) => byte === 0x00);
- if (!isEmpty && flag === ED25519_PUB) {
+ if (!isEmpty && flag === LatticeGetAddressesFlag.ed25519Pubkey) {
// ED25519 pubkeys are 32 bytes
addrs.push(pubBytes.slice(0, 32));
- } else if (!isEmpty && flag === BLS12_381_G1_PUB) {
+ } else if (!isEmpty && flag === LatticeGetAddressesFlag.bls12_381Pubkey) {
// BLS12_381_G1 keys are 48 bytes
addrs.push(pubBytes.slice(0, 48));
} else if (!isEmpty) {
@@ -209,8 +190,8 @@ export const decodeGetAddresses = (data: any, flag: number): Buffer[] => {
off += 65;
} else {
// Otherwise we are dealing with address strings
- const addrBytes = data.slice(off, off + ADDR_STR_LEN);
- off += ADDR_STR_LEN;
+ const addrBytes = data.slice(off, off + ProtocolConstants.addrStrLen);
+ off += ProtocolConstants.addrStrLen;
// Return the UTF-8 representation
const len = addrBytes.indexOf(0); // First 0 is the null terminator
if (len > 0) {
@@ -221,15 +202,3 @@ export const decodeGetAddresses = (data: any, flag: number): Buffer[] => {
return addrs;
};
-
-export const decryptGetAddressesResponse = (
- response: Buffer,
- sharedSecret: Buffer,
-) => {
- const { decryptedData, newEphemeralPub } = decryptResponse(
- response,
- decResLengths.getAddresses,
- sharedSecret,
- );
- return { decryptedData, newEphemeralPub };
-};
diff --git a/src/functions/getKvRecords.ts b/src/functions/getKvRecords.ts
index 2c194cdf..a16c8754 100644
--- a/src/functions/getKvRecords.ts
+++ b/src/functions/getKvRecords.ts
@@ -1,69 +1,62 @@
-import { decResLengths } from '../constants';
-import { decryptResponse, encryptRequest, request } from '../shared/functions';
import {
- validateFwConstants,
- validateSharedSecret,
- validateUrl,
-} from '../shared/validators';
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+} from '../protocol';
+import { validateConnectedClient } from '../shared/validators';
-export async function getKvRecords ({
+export async function getKvRecords({
+ client,
type: _type,
n: _n,
start: _start,
- client,
}: GetKvRecordsRequestFunctionParams): Promise {
- const { url, sharedSecret, fwConstants, type, n, start } =
- validateGetKvRequest({
- url: client.url,
- fwConstants: client.getFwConstants(),
- sharedSecret: client.sharedSecret,
- type: _type,
- n: _n,
- start: _start,
- });
-
- const payload = encodeGetKvRecordsRequest({ type, n, start });
-
- const encryptedPayload = encryptGetKvRecordsRequest({
- payload,
- sharedSecret,
+ const { url, sharedSecret, ephemeralPub, fwConstants } =
+ validateConnectedClient(client);
+
+ const { type, n, start } = validateGetKvRequest({
+ type: _type,
+ n: _n,
+ start: _start,
+ fwConstants,
});
- const encryptedResponse = await requestGetKvRecords(encryptedPayload, url);
+ const data = encodeGetKvRecordsRequest({ type, n, start });
- const { decryptedData, newEphemeralPub } = decryptGetKvRecordsResponse(
- encryptedResponse,
+ const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({
+ data,
+ requestType: LatticeSecureEncryptedRequestType.getKvRecords,
sharedSecret,
- );
-
- client.ephemeralPub = newEphemeralPub;
+ ephemeralPub,
+ url,
+ });
- const records = decodeGetKvRecordsResponse(decryptedData, fwConstants);
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
+ });
- return records;
+ return decodeGetKvRecordsResponse(decryptedData, fwConstants);
}
export const validateGetKvRequest = ({
- url,
fwConstants,
- sharedSecret,
n,
type,
start,
-}: ValidateGetKvRequestParams) => {
- const validUrl = validateUrl(url);
- const validFwConstants = validateFwConstants(fwConstants);
- const validSharedSecret = validateSharedSecret(sharedSecret);
-
- if (!validFwConstants.kvActionsAllowed) {
+}: {
+ fwConstants: FirmwareConstants;
+ n?: number;
+ type?: number;
+ start?: number;
+}) => {
+ if (!fwConstants.kvActionsAllowed) {
throw new Error('Unsupported. Please update firmware.');
}
if (!n || n < 1) {
throw new Error('You must request at least one record.');
}
- if (n > validFwConstants.kvActionMaxNum) {
+ if (n > fwConstants.kvActionMaxNum) {
throw new Error(
- `You may only request up to ${validFwConstants.kvActionMaxNum} records at once.`,
+ `You may only request up to ${fwConstants.kvActionMaxNum} records at once.`,
);
}
if (type !== 0 && !type) {
@@ -73,21 +66,18 @@ export const validateGetKvRequest = ({
throw new Error('You must specify a type.');
}
- return {
- url: validUrl,
- fwConstants: validFwConstants,
- sharedSecret: validSharedSecret,
- type,
- n,
- start,
- };
+ return { fwConstants, n, type, start };
};
export const encodeGetKvRecordsRequest = ({
type,
n,
start,
-}: EncodeGetKvRecordsRequestParams) => {
+}: {
+ type: number;
+ n: number;
+ start: number;
+}) => {
const payload = Buffer.alloc(9);
payload.writeUInt32LE(type, 0);
payload.writeUInt8(n, 4);
@@ -95,39 +85,12 @@ export const encodeGetKvRecordsRequest = ({
return payload;
};
-export const encryptGetKvRecordsRequest = ({
- payload,
- sharedSecret,
-}: EncrypterParams) => {
- return encryptRequest({
- requestCode: 'GET_KV_RECORDS',
- payload,
- sharedSecret,
- });
-};
-
-export const requestGetKvRecords = async (payload: Buffer, url: string) => {
- return request({ payload, url });
-};
-
-export const decryptGetKvRecordsResponse = (
- response: Buffer,
- sharedSecret: Buffer,
-) => {
- const { decryptedData, newEphemeralPub } = decryptResponse(
- response,
- decResLengths.getKvRecords,
- sharedSecret,
- );
- return { decryptedData, newEphemeralPub };
-};
-
export const decodeGetKvRecordsResponse = (
data: Buffer,
fwConstants: FirmwareConstants,
) => {
- let off = 65; // Skip 65 byte pubkey prefix
- const nTotal = parseInt(data.slice(off, off + 4).toString('hex'), 16);
+ let off = 0;
+ const nTotal = data.readUInt32BE(off);
off += 4;
const nFetched = parseInt(data.slice(off, off + 1).toString('hex'), 16);
off += 1;
@@ -136,9 +99,9 @@ export const decodeGetKvRecordsResponse = (
const records: any = [];
for (let i = 0; i < nFetched; i++) {
const r: any = {};
- r.id = parseInt(data.slice(off, off + 4).toString('hex'), 16);
+ r.id = data.readUInt32BE(off);
off += 4;
- r.type = parseInt(data.slice(off, off + 4).toString('hex'), 16);
+ r.type = data.readUInt32BE(off);
off += 4;
r.caseSensitive =
parseInt(data.slice(off, off + 1).toString('hex'), 16) === 1
diff --git a/src/functions/pair.ts b/src/functions/pair.ts
index 9e8a56ba..99f6a9ef 100644
--- a/src/functions/pair.ts
+++ b/src/functions/pair.ts
@@ -1,7 +1,9 @@
-import { decResLengths } from '../constants';
-import { encryptRequest, decryptResponse, request } from '../shared/functions';
+import {
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+} from '../protocol';
import { getPubKeyBytes } from '../shared/utilities';
-import { validateAppName, validateUrl } from '../shared/validators';
+import { validateConnectedClient } from '../shared/validators';
import { generateAppSecret, toPaddedDER } from '../util';
/**
@@ -11,37 +13,41 @@ import { generateAppSecret, toPaddedDER } from '../util';
* @category Lattice
* @returns The active wallet object.
*/
-export async function pair ({ pairingSecret, client }: PairRequestParams) {
- //TODO: Add pair validator
- const name = validateAppName(client.name);
- const url = validateUrl(client.url);
+export async function pair({
+ client,
+ pairingSecret,
+}: PairRequestParams): Promise {
+ const { url, sharedSecret, ephemeralPub, appName, key } =
+ validateConnectedClient(client);
+ const data = encodePairRequest({ pairingSecret, key, appName });
- const payload = encodePairRequest(client.key, pairingSecret, name);
-
- const encryptedPayload = encryptPairRequest({
- payload,
- sharedSecret: client.sharedSecret,
+ const { newEphemeralPub } = await encryptedSecureRequest({
+ data,
+ requestType: LatticeSecureEncryptedRequestType.finalizePairing,
+ sharedSecret,
+ ephemeralPub,
+ url,
});
- const encryptedResponse = await requestPair(encryptedPayload, url);
-
- const { newEphemeralPub } = decryptPairResponse(
- encryptedResponse,
- client.sharedSecret,
- );
- client.isPaired = true
- client.ephemeralPub = newEphemeralPub;
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
+ isPaired: true,
+ });
- // Try to get the active wallet once pairing is successful
await client.fetchActiveWallet();
return client.hasActiveWallet();
}
-export const encodePairRequest = (
- key: KeyPair,
- pairingSecret: string,
- name: string,
-) => {
+export const encodePairRequest = ({
+ key,
+ pairingSecret,
+ appName,
+}: {
+ key: KeyPair;
+ pairingSecret: string;
+ appName: string;
+}) => {
+ // Build the payload data
const pubKeyBytes = getPubKeyBytes(key);
const nameBuf = Buffer.alloc(25);
if (pairingSecret.length > 0) {
@@ -49,7 +55,7 @@ export const encodePairRequest = (
// the pairing attempt. In this case we pass a zero-length name buffer so the firmware can
// know not to draw the error screen. Note that we still expect an error to come back
// (RESP_ERR_PAIR_FAIL)
- nameBuf.write(name);
+ nameBuf.write(appName);
}
const hash = generateAppSecret(
pubKeyBytes,
@@ -61,33 +67,3 @@ export const encodePairRequest = (
const payload = Buffer.concat([nameBuf, derSig]);
return payload;
};
-
-export const encryptPairRequest = ({
- payload,
- sharedSecret,
-}: EncrypterParams) => {
- return encryptRequest({
- requestCode: 'FINALIZE_PAIRING',
- payload,
- sharedSecret,
- });
-};
-
-export const requestPair = async (payload: Buffer, url: string) => {
- return request({ payload, url });
-};
-
-/**
- * Pair will create a new pairing if the user successfully enters the secret into the device in
- * time. If successful (`status=0`), the device will return a new ephemeral public key, which is
- * used to derive a shared secret for the next request
- * @category Device Response
- * @internal
- * @returns error (or null)
- */
-export const decryptPairResponse = (
- encryptedResponse: any,
- sharedSecret: Buffer,
-) => {
- return decryptResponse(encryptedResponse, decResLengths.empty, sharedSecret);
-};
diff --git a/src/functions/removeKvRecords.ts b/src/functions/removeKvRecords.ts
index e0101f89..57a6e432 100644
--- a/src/functions/removeKvRecords.ts
+++ b/src/functions/removeKvRecords.ts
@@ -1,90 +1,84 @@
-import { decResLengths } from '../constants';
-import { decryptResponse, encryptRequest, request } from '../shared/functions';
import {
- validateFwConstants,
- validateSharedSecret,
- validateUrl
-} from '../shared/validators';
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+} from '../protocol';
+import { validateConnectedClient } from '../shared/validators';
/**
* `removeKvRecords` takes in an array of ids and sends a request to remove them from the Lattice.
* @category Lattice
* @returns A callback with an error or null.
*/
-export async function removeKvRecords ({
+export async function removeKvRecords({
+ client,
type: _type,
ids: _ids,
- client,
}: RemoveKvRecordsRequestFunctionParams): Promise {
- const { url, sharedSecret, fwConstants, type, ids } = validateRemoveKvRequest(
- {
- url: client.url,
- fwConstants: client.getFwConstants(),
- sharedSecret: client.sharedSecret,
- type: _type,
- ids: _ids,
- },
- );
+ const { url, sharedSecret, ephemeralPub, fwConstants } =
+ validateConnectedClient(client);
- const payload = encodeRemoveKvRecordsRequest({ type, ids, fwConstants });
-
- const encryptedPayload = encryptRemoveKvRecordsRequest({
- payload,
- sharedSecret,
+ const { type, ids } = validateRemoveKvRequest({
+ fwConstants,
+ type: _type,
+ ids: _ids,
});
- const encryptedResponse = await requestRemoveKvRecords(encryptedPayload, url);
+ const data = encodeRemoveKvRecordsRequest({
+ type,
+ ids,
+ fwConstants,
+ });
- const { decryptedData, newEphemeralPub } = decryptRemoveKvRecordsResponse(
- encryptedResponse,
+ const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({
+ data,
+ requestType: LatticeSecureEncryptedRequestType.removeKvRecords,
sharedSecret,
- );
+ ephemeralPub,
+ url,
+ });
- client.ephemeralPub = newEphemeralPub;
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
+ });
return decryptedData;
}
export const validateRemoveKvRequest = ({
- url,
fwConstants,
- sharedSecret,
- ids,
type,
-}: ValidateRemoveKvRequestParams): ValidatedRemoveKvRequest => {
- const validUrl = validateUrl(url);
- const validFwConstants = validateFwConstants(fwConstants);
- const validSharedSecret = validateSharedSecret(sharedSecret);
-
- if (!validFwConstants.kvActionsAllowed) {
+ ids,
+}: {
+ fwConstants: FirmwareConstants;
+ type?: number;
+ ids?: string[];
+}) => {
+ if (!fwConstants.kvActionsAllowed) {
throw new Error('Unsupported. Please update firmware.');
}
if (!Array.isArray(ids) || ids.length < 1) {
throw new Error('You must include one or more `ids` to removed.');
}
- if (ids.length > validFwConstants.kvRemoveMaxNum) {
+ if (ids.length > fwConstants.kvRemoveMaxNum) {
throw new Error(
- `Only up to ${validFwConstants.kvRemoveMaxNum} records may be removed at once.`,
+ `Only up to ${fwConstants.kvRemoveMaxNum} records may be removed at once.`,
);
}
if (type !== 0 && !type) {
throw new Error('You must specify a type.');
}
-
- return {
- url: validUrl,
- fwConstants: validFwConstants,
- sharedSecret: validSharedSecret,
- type,
- ids,
- };
+ return { type, ids };
};
export const encodeRemoveKvRecordsRequest = ({
+ fwConstants,
type,
ids,
- fwConstants,
-}: EncodeRemoveKvRecordsRequestParams) => {
+}: {
+ fwConstants: FirmwareConstants;
+ type: number;
+ ids: string[];
+}) => {
const payload = Buffer.alloc(5 + 4 * fwConstants.kvRemoveMaxNum);
payload.writeUInt32LE(type, 0);
payload.writeUInt8(ids.length, 4);
@@ -94,30 +88,3 @@ export const encodeRemoveKvRecordsRequest = ({
}
return payload;
};
-
-export const encryptRemoveKvRecordsRequest = ({
- payload,
- sharedSecret,
-}: EncrypterParams) => {
- return encryptRequest({
- requestCode: 'REMOVE_KV_RECORDS',
- payload,
- sharedSecret,
- });
-};
-
-export const requestRemoveKvRecords = async (payload: Buffer, url: string) => {
- return request({ payload, url });
-};
-
-export const decryptRemoveKvRecordsResponse = (
- response: Buffer,
- sharedSecret: Buffer,
-) => {
- const { decryptedData, newEphemeralPub } = decryptResponse(
- response,
- decResLengths.empty,
- sharedSecret,
- );
- return { decryptedData, newEphemeralPub };
-};
diff --git a/src/functions/sign.ts b/src/functions/sign.ts
index 96bfacde..be25a2c6 100644
--- a/src/functions/sign.ts
+++ b/src/functions/sign.ts
@@ -1,20 +1,15 @@
import { sha256 } from 'hash.js';
import bitcoin from '../bitcoin';
-import { CURRENCIES, decResLengths, signingSchema } from '../constants';
+import { CURRENCIES } from '../constants';
import ethereum from '../ethereum';
import { parseGenericSigningResponse } from '../genericSigning';
import {
- buildTransaction,
- decryptResponse,
- encryptRequest,
- request
-} from '../shared/functions';
-import {
- validateFwConstants,
- validateSharedSecret,
- validateUrl,
- validateWallet
-} from '../shared/validators';
+ encryptedSecureRequest,
+ LatticeSecureEncryptedRequestType,
+ LatticeSignSchema,
+} from '../protocol';
+import { buildTransaction } from '../shared/functions';
+import { validateConnectedClient, validateWallet } from '../shared/validators';
import { parseDER } from '../util';
/**
@@ -22,172 +17,131 @@ import { parseDER } from '../util';
* @category Lattice
* @returns The response from the device.
*/
-export async function sign ({
+export async function sign({
+ client,
data,
currency,
cachedData,
nextCode,
- client,
-}: SignRequestFunctionParams): Promise {
- const { url, wallet, sharedSecret, fwConstants } = validateSignRequest({
- url: client.url,
- fwConstants: client.getFwConstants(),
- wallet: client.getActiveWallet(),
- sharedSecret: client.sharedSecret,
- });
-
- const { request, isGeneric } = buildTransaction({
+}: SignRequestFunctionParams): Promise {
+ const { url, sharedSecret, ephemeralPub, fwConstants } =
+ validateConnectedClient(client);
+ const wallet = validateWallet(client.getActiveWallet());
+
+ const { requestData, isGeneric } = buildTransaction({
data,
currency,
fwConstants,
});
const { payload, hasExtraPayloads } = encodeSignRequest({
- request,
fwConstants,
wallet,
+ requestData,
cachedData,
nextCode,
});
- const encryptedPayload = encryptSignRequest({
- payload,
+ const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({
+ data: payload,
+ requestType: LatticeSecureEncryptedRequestType.sign,
sharedSecret,
+ ephemeralPub,
+ url,
});
- const encryptedResponse = await requestSign(encryptedPayload, url);
+ client.mutate({
+ ephemeralPub: newEphemeralPub,
+ });
+ // If this request has multiple payloads, we need to recurse
+ // so that we can make the next request.
+ // It is chained to the first request using `nextCode`
if (hasExtraPayloads) {
- const { decryptedData, newEphemeralPub } = decryptSignResponse(
- encryptedResponse,
- sharedSecret,
- );
-
- client.ephemeralPub = newEphemeralPub;
-
return client.sign({
data,
currency,
- cachedData: request,
- nextCode: decryptedData.slice(65, 73),
+ cachedData: requestData,
+ nextCode: decryptedData.slice(0, 8),
});
}
-
- const { decryptedData, newEphemeralPub } = decryptSignResponse(
- encryptedResponse,
- sharedSecret,
- );
-
- client.ephemeralPub = newEphemeralPub;
- const transaction = decodeSignResponse({
+ // If this is the only (or final) request,
+ // decode response data and return
+ const decodedResponse = decodeSignResponse({
data: decryptedData,
- request,
+ request: requestData,
isGeneric,
currency,
});
- return transaction;
+ return decodedResponse;
}
-export const validateSignRequest = ({
- url,
- fwConstants,
- sharedSecret,
- wallet,
-}: ValidateSignRequestParams) => {
- const validUrl = validateUrl(url);
- const validFwConstants = validateFwConstants(fwConstants);
- const validSharedSecret = validateSharedSecret(sharedSecret);
- const validWallet = validateWallet(wallet);
-
- return {
- url: validUrl,
- fwConstants: validFwConstants,
- sharedSecret: validSharedSecret,
- wallet: validWallet,
- };
-};
-
export const encodeSignRequest = ({
- request,
fwConstants,
wallet,
+ requestData,
cachedData,
nextCode,
}: EncodeSignRequestParams) => {
let reqPayload, schema;
+
if (cachedData && nextCode) {
- request = cachedData;
- reqPayload = Buffer.concat([nextCode, request.extraDataPayloads.shift()]);
- schema = signingSchema.EXTRA_DATA;
+ requestData = cachedData;
+ reqPayload = Buffer.concat([
+ nextCode,
+ requestData.extraDataPayloads.shift(),
+ ]);
+ schema = LatticeSignSchema.extraData;
} else {
- reqPayload = request.payload;
- schema = request.schema;
+ reqPayload = requestData.payload;
+ schema = requestData.schema;
}
const payload = Buffer.alloc(2 + fwConstants.reqMaxDataSz);
let off = 0;
const hasExtraPayloads =
- request.extraDataPayloads && Number(request.extraDataPayloads.length > 0);
+ requestData.extraDataPayloads &&
+ Number(requestData.extraDataPayloads.length > 0);
payload.writeUInt8(hasExtraPayloads, off);
off += 1;
// Copy request schema (e.g. ETH or BTC transfer)
payload.writeUInt8(schema, off);
off += 1;
- const validWallet = validateWallet(wallet);
// Copy the wallet UID
- validWallet.uid?.copy(payload, off);
- off += validWallet.uid?.length ?? 0;
+ wallet.uid?.copy(payload, off);
+ off += wallet.uid?.length ?? 0;
// Build data based on the type of request
reqPayload.copy(payload, off);
return { payload, hasExtraPayloads };
};
-export const encryptSignRequest = ({
- payload,
- sharedSecret,
-}: EncrypterParams) => {
- return encryptRequest({
- requestCode: 'SIGN_TRANSACTION',
- payload,
- sharedSecret,
- });
-};
-
-export const requestSign = async (payload: Buffer, url: string) => {
- return request({ payload, url });
-};
-
export const decodeSignResponse = ({
data,
request,
isGeneric,
currency,
}: DecodeSignResponseParams): SignData => {
- const PUBKEY_PREFIX_LEN = 65;
- const PKH_PREFIX_LEN = 20;
- let off = PUBKEY_PREFIX_LEN; // Skip past pubkey prefix
-
- const DERLength = 74; // max size of a DER signature -- all Lattice sigs are this long
- const SIGS_OFFSET = 10 * DERLength; // 10 signature slots precede 10 pubkey slots
- const PUBKEYS_OFFSET = PUBKEY_PREFIX_LEN + PKH_PREFIX_LEN + SIGS_OFFSET;
-
- // Get the change data if we are making a BTC transaction
- let changeRecipient;
+ let off = 0;
+ const derSigLen = 74; // DER signatures are 74 bytes
if (currency === CURRENCIES.BTC) {
const btcRequest = request as BitcoinSignRequest;
- const changeVersion = bitcoin.getAddressFormat(btcRequest.origData.changePath);
- const changePubKeyHash = data.slice(off, off + PKH_PREFIX_LEN);
- off += PKH_PREFIX_LEN;
- changeRecipient = bitcoin.getBitcoinAddress(
+ const pkhLen = 20; // Pubkeyhashes are 20 bytes
+ const sigsLen = 740; // Up to 10x DER signatures
+ const changeVersion = bitcoin.getAddressFormat(
+ btcRequest.origData.changePath,
+ );
+ const changePubKeyHash = data.slice(off, off + pkhLen);
+ off += pkhLen;
+ const changeRecipient = bitcoin.getBitcoinAddress(
changePubKeyHash,
changeVersion,
);
const compressedPubLength = 33; // Size of compressed public key
- const pubkeys = [];
- const sigs = [];
+ const pubkeys = [] as any[];
+ const sigs = [] as any[];
let n = 0;
// Parse the signature for each output -- they are returned in the serialized payload in form
// [pubkey, sig] There is one signature per output
@@ -200,13 +154,13 @@ export const decodeSignResponse = ({
const sigStart = off;
const sigEnd = off + 2 + data[off + 1];
sigs.push(data.slice(sigStart, sigEnd));
+ off += derSigLen;
// Next, shift by the full set of signatures to hit the respective pubkey NOTE: The data
// returned is: [, , ... ][, , ... ]
- const pubStart = n * compressedPubLength + PUBKEYS_OFFSET;
- const pubEnd = (n + 1) * compressedPubLength + PUBKEYS_OFFSET;
+ const pubStart = n * compressedPubLength + sigsLen;
+ const pubEnd = (n + 1) * compressedPubLength + sigsLen;
pubkeys.push(data.slice(pubStart, pubEnd));
// Update offset to hit the next signature slot
- off += DERLength;
n += 1;
}
// Build the transaction data to be serialized
@@ -220,7 +174,7 @@ export const decodeSignResponse = ({
value: btcRequest.origData.value,
recipient: btcRequest.origData.recipient,
});
- if (btcRequest.changeData.value > 0) {
+ if (btcRequest.changeData?.value && btcRequest.changeData.value > 0) {
// Second output comes from change data
preSerializedData.outputs.push({
value: btcRequest.changeData.value,
@@ -256,7 +210,7 @@ export const decodeSignResponse = ({
};
} else if (currency === CURRENCIES.ETH && !isGeneric) {
const sig = parseDER(data.slice(off, off + 2 + data[off + 1]));
- off += DERLength;
+ off += derSigLen;
const ethAddr = data.slice(off, off + 20);
// Determine the `v` param and add it to the sig before returning
const { rawTx, sigWithV } = ethereum.buildEthRawTx(request, sig, ethAddr);
@@ -272,7 +226,7 @@ export const decodeSignResponse = ({
};
} else if (currency === CURRENCIES.ETH_MSG) {
const sig = parseDER(data.slice(off, off + 2 + data[off + 1]));
- off += DERLength;
+ off += derSigLen;
const signer = data.slice(off, off + 20);
const validatedSig = ethereum.validateEthereumMsgResponse(
{ signer, sig },
@@ -291,12 +245,3 @@ export const decodeSignResponse = ({
return parseGenericSigningResponse(data, off, request);
}
};
-
-export const decryptSignResponse = (response: Buffer, sharedSecret: Buffer) => {
- const { decryptedData, newEphemeralPub } = decryptResponse(
- response,
- decResLengths.sign,
- sharedSecret,
- );
- return { decryptedData, newEphemeralPub };
-};
diff --git a/src/genericSigning.ts b/src/genericSigning.ts
index b3e31ddd..3b683e75 100644
--- a/src/genericSigning.ts
+++ b/src/genericSigning.ts
@@ -10,8 +10,9 @@ This payload should be coupled with:
*/
import { sha256 } from 'hash.js/lib/hash/sha';
import { keccak256 } from 'js-sha3';
-import { HARDENED_OFFSET, signingSchema } from './constants';
+import { HARDENED_OFFSET } from './constants';
import { Constants } from './index';
+import { LatticeSignSchema } from './protocol';
import {
buildSignerPathBuf,
existsIn,
@@ -192,7 +193,7 @@ export const buildGenericSigningMsgRequest = function (req) {
return {
payload: buf,
extraDataPayloads,
- schema: signingSchema.GENERAL_SIGNING,
+ schema: LatticeSignSchema.generic,
curveType,
encodingType,
hashType,
@@ -290,6 +291,9 @@ export const getEncodedPayload = function (
);
}
let payloadBuf;
+ if (!payload) {
+ throw new Error('No payload included');
+ }
if (typeof payload === 'string' && payload.slice(0, 2) === '0x') {
payloadBuf = Buffer.from(payload.slice(2), 'hex');
} else {
diff --git a/src/index.ts b/src/index.ts
index ef4377b8..8dfc3e0d 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,4 +1,5 @@
export { CALLDATA as Calldata } from './calldata/index';
export { Client } from './client';
export { EXTERNAL as Constants } from './constants';
-export { EXTERNAL as Utils } from './util'
+export { EXTERNAL as Utils } from './util';
+export * from './api';
diff --git a/src/protocol/index.ts b/src/protocol/index.ts
new file mode 100644
index 00000000..0a993b78
--- /dev/null
+++ b/src/protocol/index.ts
@@ -0,0 +1,2 @@
+export * from './latticeConstants';
+export * from './secureMessages';
\ No newline at end of file
diff --git a/src/protocol/latticeConstants.ts b/src/protocol/latticeConstants.ts
new file mode 100644
index 00000000..6a537d49
--- /dev/null
+++ b/src/protocol/latticeConstants.ts
@@ -0,0 +1,201 @@
+export enum LatticeResponseCode {
+ success = 0x00,
+ invalidMsg = 0x80,
+ unsupportedVersion = 0x81,
+ deviceBusy = 0x82,
+ userTimeout = 0x83,
+ userDeclined = 0x84,
+ pairFailed = 0x85,
+ pairDisabled = 0x86,
+ permissionDisabled = 0x87,
+ internalError = 0x88,
+ gceTimeout = 0x89,
+ wrongWallet = 0x8a,
+ deviceLocked = 0x8b,
+ disabled = 0x8c,
+ already = 0x8d,
+ invalidEphemId = 0x8e,
+}
+
+export enum LatticeSecureMsgType {
+ connect = 0x01,
+ encrypted = 0x02,
+}
+
+export enum LatticeProtocolVersion {
+ v1 = 0x01,
+}
+
+export enum LatticeMsgType {
+ response = 0x00,
+ secure = 0x02,
+}
+
+export enum LatticeSecureEncryptedRequestType {
+ finalizePairing = 0,
+ getAddresses = 1,
+ sign = 3,
+ getWallets = 4,
+ getKvRecords = 7,
+ addKvRecords = 8,
+ removeKvRecords = 9,
+ fetchEncryptedData = 12,
+ test = 13,
+}
+
+export enum LatticeGetAddressesFlag {
+ none = 0, // For formatted addresses
+ secp256k1Pubkey = 3,
+ ed25519Pubkey = 4,
+ bls12_381Pubkey = 5,
+}
+
+export enum LatticeSignSchema {
+ bitcoin = 0,
+ ethereum = 1, // Deprecated
+ ethereumMsg = 3,
+ extraData = 4,
+ generic = 5,
+}
+
+export enum LatticeSignHash {
+ none = 0,
+ keccak256 = 1,
+ sha256 = 2,
+}
+
+export enum LatticeSignCurve {
+ secp256k1 = 0,
+ ed25519 = 1,
+ bls12_381 = 2,
+}
+
+export enum LatticeSignEncoding {
+ none = 1,
+ solana = 2,
+ evm = 4,
+ eth_deposit = 5,
+}
+
+export enum LatticeSignBlsDst {
+ NUL = 1,
+ POP = 2,
+}
+
+export enum LatticeEncDataSchema {
+ eip2335 = 0,
+}
+
+export const ProtocolConstants = {
+ // Lattice firmware uses a static initialization vector for
+ // message encryption/decryption. This is generally considered
+ // fine because each encryption/decryption uses a unique encryption
+ // secret (derived from the per-message ephemeral key pair).
+ aesIv: [
+ 0x6d, 0x79, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x70, 0x61, 0x73, 0x73,
+ 0x77, 0x6f, 0x72, 0x64,
+ ],
+ // Constant size of address buffers from the Lattice.
+ // Note that this size also captures public keys returned
+ // by the Lattice (addresses = strings, pubkeys = buffers)
+ addrStrLen: 129,
+ // Status of the client's pairing with the target Lattice
+ pairingStatus: {
+ notPaired: 0x00,
+ paired: 0x01,
+ },
+ // Response types, codes, and error messages
+ responseMsg: {
+ [LatticeResponseCode.success]: '',
+ [LatticeResponseCode.invalidMsg]: 'Invalid Request',
+ [LatticeResponseCode.unsupportedVersion]: 'Unsupported Version',
+ [LatticeResponseCode.deviceBusy]: 'Device Busy',
+ [LatticeResponseCode.userTimeout]: 'Timeout waiting for user',
+ [LatticeResponseCode.userDeclined]: 'Request declined by user',
+ [LatticeResponseCode.pairFailed]: 'Pairing failed',
+ [LatticeResponseCode.pairDisabled]: 'Pairing is currently disabled',
+ [LatticeResponseCode.permissionDisabled]:
+ 'Automated signing is currently disabled',
+ [LatticeResponseCode.internalError]: 'Device Error',
+ [LatticeResponseCode.gceTimeout]: 'Device Timeout',
+ [LatticeResponseCode.wrongWallet]: 'Active wallet does not match request',
+ [LatticeResponseCode.deviceLocked]: 'Device Locked',
+ [LatticeResponseCode.disabled]: 'Feature Disabled',
+ [LatticeResponseCode.already]: 'Record already exists on device',
+ [LatticeResponseCode.invalidEphemId]: 'Request failed - needs resync',
+ },
+ msgSizes: {
+ // General message header size. Valid for all Lattice messages
+ header: 8,
+ // Checksum must be appended to each message
+ checksum: 4,
+ // Lattice secure message constants. All requests from this SDK
+ // are secure messages.
+ secure: {
+ // Sizes of full payloads for secure messages
+ payload: {
+ request: {
+ // [ requestType (1 byte) | pubkey (65 bytes) ]
+ connect: 66,
+ // [ requestType (1 byte) | ephemeralId (4 bytes) | encryptedData (1728 bytes) ]
+ encrypted: 1733,
+ },
+ // Note that the response payload always has status code as the
+ // first byte. This byte is removed as part of `request`, inside
+ // `parseLattice1Response`. These constants include the status
+ // code byte.
+ response: {
+ connect: 215,
+ // Encrypted responses are as follows:
+ // encryptedData (1728) | empty (1728)
+ // The latter half is empty due to an invalid type definition
+ // in Lattice firmware. (Someone made a C `struct` instead of
+ // a `union`, oops).
+ encrypted: 3457,
+ },
+ },
+ // Sizes for data inside secure message payloads
+ data: {
+ // All requests also have a `requestCode`, which is omitted
+ // from these constants.
+ request: {
+ connect: 65,
+ encrypted: {
+ // All encrypted requests are encrypted into a 1728 byte buffer
+ encryptedData: 1728,
+ // Individual request types have different data sizes.
+ [LatticeSecureEncryptedRequestType.finalizePairing]: 99,
+ [LatticeSecureEncryptedRequestType.getAddresses]: 54,
+ [LatticeSecureEncryptedRequestType.sign]: 1680,
+ [LatticeSecureEncryptedRequestType.getWallets]: 0,
+ [LatticeSecureEncryptedRequestType.getKvRecords]: 9,
+ [LatticeSecureEncryptedRequestType.addKvRecords]: 1391,
+ [LatticeSecureEncryptedRequestType.removeKvRecords]: 405,
+ [LatticeSecureEncryptedRequestType.fetchEncryptedData]: 1025,
+ [LatticeSecureEncryptedRequestType.test]: 506,
+ },
+ },
+ // All responses also have a `responseCode`, which is omitted
+ // from these constants.
+ response: {
+ encrypted: {
+ encryptedData: 1728,
+ // Once decrypted, the data size of the response
+ // payload will be determined by the request type.
+ // NOTE: All requests also have ephemeralPublicKey (65 bytes) and
+ // checksum (4 bytes), which are excluded from these sizes.
+ [LatticeSecureEncryptedRequestType.finalizePairing]: 0,
+ [LatticeSecureEncryptedRequestType.getAddresses]: 1290,
+ [LatticeSecureEncryptedRequestType.sign]: 1090,
+ [LatticeSecureEncryptedRequestType.getWallets]: 142,
+ [LatticeSecureEncryptedRequestType.getKvRecords]: 1395,
+ [LatticeSecureEncryptedRequestType.addKvRecords]: 0,
+ [LatticeSecureEncryptedRequestType.removeKvRecords]: 0,
+ [LatticeSecureEncryptedRequestType.fetchEncryptedData]: 1608,
+ [LatticeSecureEncryptedRequestType.test]: 1646,
+ },
+ },
+ },
+ },
+ },
+} as const;
diff --git a/src/protocol/secureMessages.ts b/src/protocol/secureMessages.ts
new file mode 100644
index 00000000..cbe7bb4b
--- /dev/null
+++ b/src/protocol/secureMessages.ts
@@ -0,0 +1,353 @@
+/**
+ * All messages sent to the Lattice from this SDK will be
+ * "secure messages", of which there are two types:
+ *
+ * 1. Connect requests are *unencrypted* and serve to establish
+ * a connection between the SDK Client instance and the target
+ * Lattice. If the client is already paired to the target Lattice,
+ * the response will indicate that. If the client has never paired
+ * with this Lattice, the Lattice will go into "pairing mode" and
+ * will expect a follow up `finalizePairing` request, which is
+ * an encrypted request. This will return an ephemeral public key,
+ * which is used to encrypt the next request.
+ * 2. Encrypted requests are *encrypted* (obviously) and from a Lattice
+ * protocol perspective they are all constructed the same way:
+ * create a buffer of `payload` length and fill it with unencrypted
+ * data, then encrypt the entire payload (not just the data you filled)
+ * with the ECDH secret formed from the last ephemeral public key.
+ * The response to this request will contain a new ephemral public
+ * key, which you will need for the next encrypted request.
+ */
+import {
+ ProtocolConstants as Constants,
+ LatticeSecureMsgType,
+ LatticeMsgType,
+ LatticeProtocolVersion,
+ LatticeSecureEncryptedRequestType,
+} from './latticeConstants';
+import {
+ aes256_decrypt,
+ aes256_encrypt,
+ checksum,
+ getP256KeyPairFromPub,
+ randomBytes,
+} from '../util';
+import { getEphemeralId, request } from '../shared/functions';
+import { validateEphemeralPub } from '../shared/validators';
+
+const { msgSizes } = Constants;
+const { secure: szs } = msgSizes;
+
+/**
+ * Build and make a request to connect to a specific Lattice
+ * based on its `deviceId`.
+ * @param deviceId - Device ID for the target Lattice. Must be in
+ * the same `client.baseUrl` domain to be found.
+ * @return {Buffer} - Connection response payload data, which contains
+ * information about the connected Lattice.
+ */
+export async function connectSecureRequest({
+ url,
+ pubkey,
+}: {
+ url: string;
+ pubkey: Buffer;
+}): Promise {
+ // Build the secure request message
+ const payloadData = serializeSecureRequestConnectPayloadData({
+ pubkey: pubkey,
+ });
+ const msgId = randomBytes(4);
+ const msg = serializeSecureRequestMsg(
+ msgId,
+ LatticeSecureMsgType.connect,
+ payloadData,
+ );
+ // Send request to the Lattice
+ const resp = await request({ url, payload: msg });
+ if (resp.length !== szs.payload.response.connect - 1) {
+ throw new Error('Wrong Lattice response message size.');
+ }
+
+ return resp;
+}
+
+/**
+ * Build an encrypted secure request using raw data,
+ * then send that request to the target Lattice, handle
+ * the response, and return the *decrypted* response
+ * payload data.
+ * Also updates ephemeral public key in the client.
+ * This is a wrapper around several local util functions.
+ * @param data - Unencrypted raw calldata for function
+ * @param requestType - Type of encrypted reques to make
+ * @return {Buffer} Decrypted response data (excluding metadata)
+ */
+export async function encryptedSecureRequest({
+ data,
+ requestType,
+ sharedSecret,
+ ephemeralPub,
+ url,
+}: {
+ data: Buffer;
+ requestType: LatticeSecureEncryptedRequestType;
+ sharedSecret: Buffer;
+ ephemeralPub: Buffer;
+ url: string;
+}): Promise {
+ // Generate a random message id for internal tracking
+ // of this specific request (internal on both sides).
+ const msgId = randomBytes(4);
+
+ // Serialize the request data into encrypted request
+ // payload data.
+ const payloadData = serializeSecureRequestEncryptedPayloadData({
+ data,
+ requestType,
+ ephemeralPub,
+ sharedSecret,
+ });
+
+ // Serialize the payload data into an encrypted secure
+ // request message.
+ const msg = serializeSecureRequestMsg(
+ msgId,
+ LatticeSecureMsgType.encrypted,
+ payloadData,
+ );
+
+ // Send request to Lattice
+ const resp = await request({
+ url,
+ payload: msg,
+ });
+
+ // Deserialize the response payload data
+ if (resp.length !== szs.payload.response.encrypted - 1) {
+ throw new Error('Wrong Lattice response message size.');
+ }
+
+ const encPayloadData = resp.slice(
+ 0,
+ szs.data.response.encrypted.encryptedData,
+ );
+
+ // Return decrypted response payload data
+ return decryptEncryptedLatticeResponseData({
+ encPayloadData,
+ requestType,
+ sharedSecret,
+ });
+}
+
+/**
+ * @internal
+ * Serialize a Secure Request message for the Lattice.
+ * All outgoing SDK requests are of this form.
+ * @param msgId - Random 4 bytes of data for internally tracking this message
+ * @param secureRequestType - 0x01 for connect, 0x02 for encrypted
+ * @param payloadData - Request data
+ * @return {Buffer} Serialized message to be sent to Lattice
+ */
+function serializeSecureRequestMsg(
+ msgId: Buffer,
+ secureRequestType: LatticeSecureMsgType,
+ payloadData: Buffer,
+): Buffer {
+ // Sanity check request data
+ if (msgId.length !== 4) {
+ throw new Error('msgId must be four bytes');
+ }
+ if (
+ secureRequestType !== LatticeSecureMsgType.connect &&
+ secureRequestType !== LatticeSecureMsgType.encrypted
+ ) {
+ throw new Error('Invalid Lattice secure request type');
+ }
+
+ // Validate the incoming payload data size. Note that the payload
+ // data is prepended with a secure request type byte, so the
+ // payload data size is one less than the expected size.
+ const isValidConnectPayloadDataSz =
+ secureRequestType === LatticeSecureMsgType.connect &&
+ payloadData.length === szs.payload.request.connect - 1;
+ const isValidEncryptedPayloadDataSz =
+ secureRequestType === LatticeSecureMsgType.encrypted &&
+ payloadData.length === szs.payload.request.encrypted - 1;
+
+ // Build payload and size
+ let msgSz = msgSizes.header + msgSizes.checksum;
+ let payloadLen;
+ const payload: LatticeSecureRequestPayload = {
+ requestType: secureRequestType,
+ data: payloadData,
+ };
+ if (isValidConnectPayloadDataSz) {
+ payloadLen = szs.payload.request.connect;
+ } else if (isValidEncryptedPayloadDataSz) {
+ payloadLen = szs.payload.request.encrypted;
+ } else {
+ throw new Error('Invalid Lattice secure request payload size');
+ }
+ msgSz += payloadLen;
+
+ // Construct the request in object form
+ const header: LatticeMessageHeader = {
+ version: LatticeProtocolVersion.v1,
+ type: LatticeMsgType.secure,
+ id: msgId,
+ len: payloadLen,
+ };
+ const req: LatticeSecureRequest = {
+ header,
+ payload,
+ };
+
+ // Now serialize the whole message
+ // Header | requestType | payloadData | checksum
+ const msg = Buffer.alloc(msgSz);
+ let off = 0;
+ // Header
+ msg.writeUInt8(req.header.version, off);
+ off += 1;
+ msg.writeUInt8(req.header.type, off);
+ off += 1;
+ req.header.id.copy(msg, off);
+ off += req.header.id.length;
+ msg.writeUInt16BE(req.header.len, off);
+ off += 2;
+ // Payload
+ msg.writeUInt8(req.payload.requestType, off);
+ off += 1;
+ req.payload.data.copy(msg, off);
+ off += req.payload.data.length;
+ // Checksum
+ msg.writeUInt32BE(checksum(msg.slice(0, off)), off);
+ off += 4;
+ if (off !== msgSz) {
+ throw new Error('Failed to build request message');
+ }
+
+ // We have our serialized secure message!
+ return msg;
+}
+
+/**
+ * @internal
+ * Serialize payload data for a Lattice secure request: connect
+ * @return {Buffer} - 1700 bytes, of which only 65 are used
+ */
+function serializeSecureRequestConnectPayloadData(
+ payloadData: LatticeSecureConnectRequestPayloadData,
+): Buffer {
+ const serPayloadData = Buffer.alloc(szs.data.request.connect);
+ payloadData.pubkey.copy(serPayloadData, 0);
+ return serPayloadData;
+}
+
+/**
+ * @internal
+ * Serialize payload data for Lattice secure request: encrypted
+ * @param data - Raw (unencrypted) request data
+ * @return {Buffer} - 1700 bytes, all of which should be used
+ */
+function serializeSecureRequestEncryptedPayloadData({
+ data,
+ requestType,
+ ephemeralPub,
+ sharedSecret,
+}: {
+ data: Buffer;
+ requestType: LatticeSecureEncryptedRequestType;
+ ephemeralPub: Buffer;
+ sharedSecret: Buffer;
+}): Buffer {
+ // Sanity checks request size
+ if (data.length > szs.data.request.encrypted.encryptedData) {
+ throw new Error('Encrypted request data too large');
+ }
+ // Make sure we have a shared secret. An error will be thrown
+ // if there is no ephemeral pub, indicating we need to reconnect.
+ validateEphemeralPub(ephemeralPub);
+
+ // Validate the request data size matches the desired request
+ const requestDataSize = szs.data.request.encrypted[requestType];
+ if (data.length !== requestDataSize) {
+ throw new Error(
+ `Invalid request datasize (wanted ${requestDataSize}, got ${data.length})`,
+ );
+ }
+
+ // Build the pre-encrypted data payload, which variable sized and of form:
+ // encryptedRequestType | data | checksum
+ const preEncryptedData = Buffer.alloc(1 + requestDataSize);
+ preEncryptedData[0] = requestType;
+ data.copy(preEncryptedData, 1);
+ const preEncryptedDataChecksum = checksum(preEncryptedData);
+
+ // Encrypt the data into a fixed size buffer. The buffer size should
+ // equal to the full message request less the 4-byte ephemeral id.
+ const _encryptedData = Buffer.alloc(szs.data.request.encrypted.encryptedData);
+ preEncryptedData.copy(_encryptedData, 0);
+ _encryptedData.writeUInt32LE(
+ preEncryptedDataChecksum,
+ preEncryptedData.length,
+ );
+ const encryptedData = aes256_encrypt(_encryptedData, sharedSecret);
+
+ // Calculate ephemeral ID
+ const ephemeralId = getEphemeralId(sharedSecret);
+
+ // Now we will serialize the payload data.
+ const serPayloadData = Buffer.alloc(szs.payload.request.encrypted - 1);
+ serPayloadData.writeUInt32LE(ephemeralId);
+ encryptedData.copy(serPayloadData, 4);
+ return serPayloadData;
+}
+
+/**
+ * @internal
+ * Decrypt the response data from an encrypted request.
+ * @param encPayloadData - Encrypted payload data in response
+ * @return {Buffer} Decrypted response data (excluding metadata)
+ */
+function decryptEncryptedLatticeResponseData({
+ encPayloadData,
+ requestType,
+ sharedSecret,
+}: {
+ encPayloadData: Buffer;
+ requestType: LatticeSecureEncryptedRequestType;
+ sharedSecret: Buffer;
+}) {
+ // Decrypt data using the *current* shared secret
+ const decData = aes256_decrypt(encPayloadData, sharedSecret);
+
+ // Bulid the object
+ const ephemeralPubSz = 65; // secp256r1 pubkey
+ const checksumOffset =
+ ephemeralPubSz + szs.data.response.encrypted[requestType];
+ const respData: LatticeSecureDecryptedResponse = {
+ ephemeralPub: decData.slice(0, ephemeralPubSz),
+ data: decData.slice(ephemeralPubSz, checksumOffset),
+ checksum: decData.readUInt32BE(checksumOffset),
+ };
+
+ // Validate the checksum
+ const validChecksum = checksum(decData.slice(0, checksumOffset));
+ if (respData.checksum !== validChecksum) {
+ throw new Error('Checksum mismatch in decrypted Lattice data');
+ }
+
+ // Validate the response data size
+ const validSz = szs.data.response.encrypted[requestType];
+ if (respData.data.length !== validSz) {
+ throw new Error('Incorrect response data returned from Lattice');
+ }
+
+ const newEphemeralPub = getP256KeyPairFromPub(respData.ephemeralPub);
+
+ // Returned the decrypted data
+ return { decryptedData: respData.data, newEphemeralPub };
+}
diff --git a/src/shared/errors.ts b/src/shared/errors.ts
index d131080b..b2c7d055 100644
--- a/src/shared/errors.ts
+++ b/src/shared/errors.ts
@@ -1,9 +1,15 @@
-import { responseMsgs } from '../constants';
+import { LatticeResponseCode, ProtocolConstants } from '../protocol';
-const buildLatticeResponseErrorMessage = ({ responseCode, errorMessage }) => {
+const buildLatticeResponseErrorMessage = ({
+ responseCode,
+ errorMessage,
+}: {
+ responseCode?: LatticeResponseCode;
+ errorMessage?: string;
+}) => {
const msg: string[] = [];
if (responseCode) {
- msg.push(`${responseMsgs[responseCode]}`);
+ msg.push(`${ProtocolConstants.responseMsg[responseCode]}`);
}
if (errorMessage) {
msg.push('Error Message: ');
@@ -14,10 +20,13 @@ const buildLatticeResponseErrorMessage = ({ responseCode, errorMessage }) => {
export class LatticeResponseError extends Error {
constructor(
- public responseCode: number,
- public errorMessage: string,
+ public responseCode?: LatticeResponseCode,
+ public errorMessage?: string,
) {
- const message = buildLatticeResponseErrorMessage({ responseCode, errorMessage });
+ const message = buildLatticeResponseErrorMessage({
+ responseCode,
+ errorMessage,
+ });
super(message);
this.name = 'LatticeResponseError';
this.responseCode = responseCode;
diff --git a/src/shared/functions.ts b/src/shared/functions.ts
index 7e46c8dd..f4eacb99 100644
--- a/src/shared/functions.ts
+++ b/src/shared/functions.ts
@@ -1,25 +1,10 @@
import { sha256 } from 'hash.js/lib/hash/sha';
import { Client } from '..';
import bitcoin from '../bitcoin';
-import {
- deviceCodes,
- encReqCodes,
- ENC_MSG_LEN,
- EXTERNAL,
- REQUEST_TYPE_BYTE,
- VERSION_BYTE,
-} from '../constants';
+import { EXTERNAL } from '../constants';
import ethereum from '../ethereum';
import { buildGenericSigningMsgRequest } from '../genericSigning';
-import {
- aes256_decrypt,
- aes256_encrypt,
- checksum,
- fetchWithTimeout,
- getP256KeyPairFromPub,
- parseLattice1Response,
- randomBytes,
-} from '../util';
+import { fetchWithTimeout, parseLattice1Response } from '../util';
import { LatticeResponseError } from './errors';
import {
isDeviceBusy,
@@ -27,81 +12,7 @@ import {
isWrongWallet,
shouldUseEVMLegacyConverter,
} from './predicates';
-import {
- validateChecksum,
- validateRequestError,
- validateResponse,
-} from './validators';
-
-/**
- * Build a request to send to the device.
- * @internal
- * @param request_code {uint8} - 8-bit unsigned integer representing the message request code
- * @param id {buffer} - 4 byte identifier (comes from HSM for subsequent encrypted reqs)
- * @param payload {buffer} - serialized payload
- * @returns {buffer}
- */
-export const buildRequest = (request_code: number, payload: Buffer) => {
- // Length of payload; we add 1 to the payload length to account for the request_code byte
- let L = payload && Buffer.isBuffer(payload) ? payload.length + 1 : 1;
- if (request_code === deviceCodes.ENCRYPTED_REQUEST) {
- L = 1 + payload.length;
- }
- let i = 0;
- const preReq = Buffer.alloc(L + 8);
- // Build the header
- i = preReq.writeUInt8(VERSION_BYTE, i);
- i = preReq.writeUInt8(REQUEST_TYPE_BYTE, i);
- const id = randomBytes(4);
- i = preReq.writeUInt32BE(parseInt(`0x${id.toString('hex')}`), i);
- i = preReq.writeUInt16BE(L, i);
- // Build the payload
- i = preReq.writeUInt8(request_code, i);
- if (L > 1) i = payload.copy(preReq, i);
- // Add the checksum
- const cs = checksum(preReq);
- const req = Buffer.alloc(preReq.length + 4); // 4-byte checksum
- i = preReq.copy(req);
- req.writeUInt32BE(cs, i);
- return req;
-};
-
-/**
- * Builds an encrypted request
- * @internal
- */
-export const encryptRequest = ({
- payload,
- requestCode,
- sharedSecret,
-}: EncryptRequestParams) => {
- // Get the ephemeral id - all encrypted requests require there to be an ephemeral public key in
- // order to send
- const ephemeralId = getEphemeralId(sharedSecret);
- const requestCodeValue = encReqCodes[requestCode];
- // Build the payload and checksum
- const payloadPreCs = Buffer.concat([
- Buffer.from([requestCodeValue]),
- payload,
- ]);
- const cs = checksum(payloadPreCs);
- const payloadBuf = Buffer.alloc(payloadPreCs.length + 4);
-
- // Lattice validates checksums in little endian
- payloadPreCs.copy(payloadBuf, 0);
- payloadBuf.writeUInt32LE(cs, payloadPreCs.length);
- // Encrypt this payload
- const newEncPayload = aes256_encrypt(payloadBuf, sharedSecret);
-
- // Write to the overall payload. We must use the same length for every encrypted request and
- // must include a 32-bit ephemId along with the encrypted data
- const newPayload = Buffer.alloc(ENC_MSG_LEN + 4);
- // First 4 bytes are the ephemeral id (in little endian)
- newPayload.writeUInt32LE(ephemeralId, 0);
- // Next N bytes
- newEncPayload.copy(newPayload, 4);
- return buildRequest(deviceCodes.ENCRYPTED_REQUEST, newPayload);
-};
+import { validateRequestError } from './validators';
export const buildTransaction = ({
data,
@@ -125,7 +36,7 @@ export const buildTransaction = ({
if (currency === 'ETH' && shouldUseEVMLegacyConverter(fwConstants)) {
console.log(
'Using the legacy ETH signing path. This will soon be deprecated. ' +
- 'Please switch to general signing request.',
+ 'Please switch to general signing request.',
);
let payload;
try {
@@ -133,7 +44,7 @@ export const buildTransaction = ({
} catch (err) {
throw new Error(
'Could not convert legacy request. Please switch to a general signing ' +
- 'request. See gridplus-sdk docs for more information.',
+ 'request. See gridplus-sdk docs for more information.',
);
}
data = {
@@ -145,28 +56,28 @@ export const buildTransaction = ({
payload,
};
return {
- request: buildGenericSigningMsgRequest({ ...data, fwConstants }),
+ requestData: buildGenericSigningMsgRequest({ ...data, fwConstants }),
isGeneric: true,
};
} else if (currency === 'ETH') {
// Legacy signing pathway -- should deprecate in the future
return {
- request: ethereum.buildEthereumTxRequest({ ...data, fwConstants }),
+ requestData: ethereum.buildEthereumTxRequest({ ...data, fwConstants }),
isGeneric: false,
};
} else if (currency === 'ETH_MSG') {
return {
- request: ethereum.buildEthereumMsgRequest({ ...data, fwConstants }),
+ requestData: ethereum.buildEthereumMsgRequest({ ...data, fwConstants }),
isGeneric: false,
};
} else if (currency === 'BTC') {
return {
- request: bitcoin.buildBitcoinTxRequest({ ...data, fwConstants }),
+ requestData: bitcoin.buildBitcoinTxRequest({ ...data, fwConstants }),
isGeneric: false,
};
}
return {
- request: buildGenericSigningMsgRequest({ ...data, fwConstants }),
+ requestData: buildGenericSigningMsgRequest({ ...data, fwConstants }),
isGeneric: true,
};
};
@@ -209,7 +120,7 @@ export const request = async ({
/**
* `sleep()` returns a Promise that resolves after a given number of milliseconds.
*/
-function sleep (ms) {
+function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
@@ -273,37 +184,6 @@ export const retryWrapper = async ({ fn, params, retries, client }) => {
});
};
-/**
- * All encrypted responses must be decrypted with the previous shared secret. Per specification,
- * decrypted responses will all contain a 65-byte public key as the prefix, which becomes the new
- * `ephemeralPub`.
- * @category Device Response
- * @internal
- */
-export const decryptResponse = (
- encryptedResponse: Buffer,
- length: number,
- sharedSecret: Buffer,
-): DecryptedResponse => {
- if (!encryptedResponse || encryptedResponse.length < length) {
- return { decryptedData: null, newEphemeralPub: null };
- }
- const encData = encryptedResponse.slice(0, ENC_MSG_LEN);
- const decryptedData = aes256_decrypt(encData, sharedSecret);
-
- validateResponse(decryptedData);
-
- // length does not include a 65-byte pubkey that prefixes each response
- length += 65;
-
- validateChecksum(decryptedData, length);
-
- // First 65 bytes is the next ephemeral pubkey
- const pub = decryptedData.slice(0, 65).toString('hex');
- const newEphemeralPub = getP256KeyPairFromPub(pub);
- return { decryptedData, newEphemeralPub };
-};
-
/**
* Get the ephemeral id, which is the first 4 bytes of the shared secret generated from the local
* private key and the ephemeral public key from the device.
diff --git a/src/shared/predicates.ts b/src/shared/predicates.ts
index 6ea50f46..2691e7e8 100644
--- a/src/shared/predicates.ts
+++ b/src/shared/predicates.ts
@@ -1,16 +1,16 @@
-import { responseCodes } from '../constants';
+import { LatticeResponseCode } from '../protocol';
import { isFWSupported } from './utilities';
export const isDeviceBusy = (responseCode: number) =>
- responseCode === responseCodes.RESP_ERR_DEV_BUSY ||
- responseCode === responseCodes.RESP_ERR_GCE_TIMEOUT;
+ responseCode === LatticeResponseCode.deviceBusy ||
+ responseCode === LatticeResponseCode.gceTimeout;
export const isWrongWallet = (responseCode: number) =>
- responseCode === responseCodes.RESP_ERR_WRONG_WALLET;
+ responseCode === LatticeResponseCode.wrongWallet;
export const isInvalidEphemeralId = (responseCode: number) =>
- responseCode === responseCodes.RESP_ERR_INVALID_EPHEM_ID;
+ responseCode === LatticeResponseCode.invalidEphemId;
export const doesFetchWalletsOnLoad = (fwVersion: FirmwareVersion) =>
isFWSupported(fwVersion, { major: 0, minor: 14, fix: 1 });
diff --git a/src/shared/validators.ts b/src/shared/validators.ts
index f3873815..b26b1691 100644
--- a/src/shared/validators.ts
+++ b/src/shared/validators.ts
@@ -1,14 +1,8 @@
import { UInt4 } from 'bitwise/types';
-import { MAX_ADDR, encReqCodes, EMPTY_WALLET_UID, ASCII_REGEX } from '../constants';
-import { isUInt4, checksum } from '../util';
-import isEmpty from 'lodash/isEmpty'
-
-export const validateValueExists = (arg: { [key: string]: any }) => {
- const [key, [, value]] = Object.entries(arg);
- if (!value) {
- throw new Error(`${key} must be provided`);
- }
-};
+import { Client } from '../client';
+import { MAX_ADDR, EMPTY_WALLET_UID, ASCII_REGEX } from '../constants';
+import { isUInt4 } from '../util';
+import isEmpty from 'lodash/isEmpty';
export const validateIsUInt4 = (n?: number) => {
if (typeof n !== 'number' || !isUInt4(n)) {
@@ -17,17 +11,24 @@ export const validateIsUInt4 = (n?: number) => {
return n as UInt4;
};
-export const validateNAddresses = (n: number) => {
- if (n > MAX_ADDR)
+export const validateNAddresses = (n?: number) => {
+ if (!n) {
+ throw new Error('The number of addresses is required.');
+ }
+ if (n > MAX_ADDR) {
throw new Error(`You may only request ${MAX_ADDR} addresses at once.`);
+ }
+ return n;
};
-export const validateStartPath = (startPath: number[]) => {
+export const validateStartPath = (startPath?: number[]) => {
if (!startPath) {
throw new Error('Start path is required');
}
- if (startPath.length < 2 || startPath.length > 5)
- throw new Error('Path must include between 2 and 5 indices');
+ if (startPath.length < 1 || startPath.length > 5)
+ throw new Error('Path must include between 1 and 5 indices');
+
+ return startPath;
};
export const validateDeviceId = (deviceId?: string) => {
@@ -39,12 +40,6 @@ export const validateDeviceId = (deviceId?: string) => {
return deviceId;
};
-export const validateEncryptRequestCode = (code: keyof typeof encReqCodes) => {
- if (code && encReqCodes[code] === undefined) {
- throw new Error('Unknown encrypted request code.');
- }
-};
-
export const validateAppName = (name?: string) => {
if (!name) {
throw new Error('Name is required.');
@@ -57,15 +52,14 @@ export const validateAppName = (name?: string) => {
return name;
};
-export const validateResponse = (res: Buffer) => {
- if (!res) {
- throw new Error('Error decrypting response');
- }
-};
-
export const validateUrl = (url?: string) => {
if (!url) {
- throw new Error('Url does not exist. Please reconnect.');
+ throw new Error('URL does not exist. Please reconnect.');
+ }
+ try {
+ new URL(url);
+ } catch (err) {
+ throw new Error('Invalid URL provided. Please use a valid URL.');
}
return url;
};
@@ -74,6 +68,11 @@ export const validateBaseUrl = (baseUrl?: string) => {
if (!baseUrl) {
throw new Error('Base URL is required.');
}
+ try {
+ new URL(baseUrl);
+ } catch (err) {
+ throw new Error('Invalid Base URL provided. Please use a valid URL.');
+ }
return baseUrl;
};
@@ -83,26 +82,19 @@ export const validateFwConstants = (fwConstants?: FirmwareConstants) => {
}
return fwConstants;
};
-export const validateFwVersion = (fwVersion?: Buffer) => {
- if (!fwVersion || fwVersion.byteLength > 4) {
+
+export const validateFwVersion = (fwVersion?: FirmwareVersion) => {
+ if (!fwVersion) {
throw new Error('Firmware version does not exist. Please reconnect.');
}
- return fwVersion;
-};
-
-/**
- * Validate checksum. It will be the last 4 bytes of the decrypted payload. The length of the
- * decrypted payload will be fixed for each given message type.
- */
-export const validateChecksum = (res: Buffer, length: number) => {
- const toCheck = res.slice(0, length);
- const cs = parseInt(`0x${res.slice(length, length + 4).toString('hex')}`);
- const csCheck = checksum(toCheck);
- if (cs !== csCheck) {
- throw new Error(
- `Checksum mismatch in response from Lattice (calculated ${csCheck}, wanted ${cs})`,
- );
+ if (
+ typeof fwVersion.fix !== 'number' ||
+ typeof fwVersion.minor !== 'number' ||
+ typeof fwVersion.major !== 'number'
+ ) {
+ throw new Error('Firmware version improperly formatted. Please reconnect.');
}
+ return fwVersion;
};
export const validateRequestError = (err: LatticeError) => {
@@ -115,13 +107,34 @@ export const validateRequestError = (err: LatticeError) => {
throw new Error(`Failed to make request to device:\n${err.message}`);
};
-export const validateWallet = (wallet?: Wallet): Wallet => {
+export const validateWallet = (wallet?: Wallet) => {
if (!wallet || wallet === null) {
throw new Error('No active wallet.');
}
return wallet;
};
+export const validateConnectedClient = (client: Client) => {
+ const appName = validateAppName(client.getAppName());
+ const ephemeralPub = validateEphemeralPub(client.ephemeralPub);
+ const sharedSecret = validateSharedSecret(client.sharedSecret);
+ const url = validateUrl(client.url);
+ const fwConstants = validateFwConstants(client.getFwConstants());
+ const fwVersion = validateFwVersion(client.getFwVersion());
+ // @ts-expect-error - Key is private
+ const key = validateKey(client.key);
+
+ return {
+ appName,
+ ephemeralPub,
+ sharedSecret,
+ url,
+ fwConstants,
+ fwVersion,
+ key,
+ };
+};
+
export const validateEphemeralPub = (ephemeralPub?: Buffer) => {
if (!ephemeralPub) {
throw new Error(
@@ -200,12 +213,6 @@ export const validateKvRecord = (
return { key, val };
};
-export const validateRequestLength = (req: any, fwConstants: FirmwareConstants) => {
- if (req.payload.length > fwConstants.reqMaxDataSz) {
- throw new Error('Transaction is too large');
- }
-}
-
export const isValidBlockExplorerResponse = (data: any) => {
try {
const result = JSON.parse(data.result);
diff --git a/src/types/addKvRecords.d.ts b/src/types/addKvRecords.d.ts
index 59315f14..98c3724d 100644
--- a/src/types/addKvRecords.d.ts
+++ b/src/types/addKvRecords.d.ts
@@ -3,21 +3,7 @@ interface AddKvRecordsRequestParams {
type?: number;
caseSensitive?: boolean;
}
+
interface AddKvRecordsRequestFunctionParams extends AddKvRecordsRequestParams {
client: Client;
-}
-
-interface ValidateAddKvRequestParams {
- url?: string;
- fwConstants?: FirmwareConstants;
- wallet?: Wallet;
- sharedSecret?: Buffer;
- records?: KVRecords;
-}
-
-interface EncodeAddKvRecordsRequestParams {
- records: KVRecords;
- fwConstants: FirmwareConstants;
- type: number;
- caseSensitive: boolean;
-}
+}
\ No newline at end of file
diff --git a/src/types/client.d.ts b/src/types/client.d.ts
index b20baeda..28c9a250 100644
--- a/src/types/client.d.ts
+++ b/src/types/client.d.ts
@@ -1,7 +1,6 @@
-
type Currency = keyof typeof CURRENCIES;
-type SigningPath = [number, number, number, number, number];
+type SigningPath = number[];
interface SignData {
tx?: string;
@@ -17,6 +16,8 @@ interface SignData {
err?: string;
}
+type SigningRequestResponse = SignData | { pubkey: null; sig: null };
+
interface TransactionPayload {
type: number;
gasPrice: number;
@@ -29,22 +30,11 @@ interface TransactionPayload {
maxPriorityFeePerGas: number;
}
-interface SigningPayload {
- signerPath: SigningPath;
- payload: TransactionPayload;
- curveType: number;
- hashType: number;
- encodingType: number;
-}
-
-type EncryptionRequestCodeKeys = keyof typeof encReqCodes;
-type EncryptionRequestCodes = typeof encReqCodes[EncryptionRequestCodeKeys];
-
interface Wallet {
/** 32 byte id */
uid: Buffer;
/** 20 char (max) string */
- name: Buffer;
+ name: Buffer | null;
/** 4 byte flag */
capabilities: number;
/** External or internal wallet */
@@ -56,12 +46,6 @@ interface ActiveWallets {
external: Wallet;
}
-interface EncryptRequestParams {
- payload: Buffer;
- requestCode: EncryptionRequestCodeKeys;
- sharedSecret: Buffer;
-}
-
interface RequestParams {
url: string;
payload: any; //TODO Fix this any
@@ -81,5 +65,3 @@ interface ClientStateData {
retryCount: number;
timeout: number;
}
-
-type RequestTypes = 'connect' | 'getAddresses' | 'sign' | 'fetchActiveWallet' | 'addKvRecords' | 'getKvRecords' | 'removeKvRecords'
\ No newline at end of file
diff --git a/src/types/connect.d.ts b/src/types/connect.d.ts
index e822e643..0aa3656d 100644
--- a/src/types/connect.d.ts
+++ b/src/types/connect.d.ts
@@ -4,23 +4,4 @@ interface ConnectRequestParams {
interface ConnectRequestFunctionParams extends ConnectRequestParams {
client: Client;
-}
-
-interface ValidateConnectRequestParams {
- deviceId?: string;
- key?: KeyPair;
- baseUrl?: string;
-}
-
-interface ValidatedConnectRequest {
- deviceId: string;
- key: KeyPair;
- baseUrl: string;
-}
-interface EncodeConnectRequestParams {
- fwVersion: any;
- startPath: number[];
- n: number;
- wallet: Wallet;
- flag: number;
-}
+}
\ No newline at end of file
diff --git a/src/types/fetchActiveWallet.d.ts b/src/types/fetchActiveWallet.d.ts
index bd773bfb..e8461029 100644
--- a/src/types/fetchActiveWallet.d.ts
+++ b/src/types/fetchActiveWallet.d.ts
@@ -2,12 +2,6 @@ interface FetchActiveWalletRequestFunctionParams {
client: Client;
}
-interface ValidateFetchActiveWalletRequestParams {
- url?: string;
- ephemeralPub?: Buffer;
- sharedSecret?: Buffer;
-}
-
interface ValidatedFetchActiveWalletRequest {
sharedSecret: Buffer;
}
diff --git a/src/types/getAddresses.d.ts b/src/types/getAddresses.d.ts
index 149a668b..5f78734e 100644
--- a/src/types/getAddresses.d.ts
+++ b/src/types/getAddresses.d.ts
@@ -7,19 +7,3 @@ interface GetAddressesRequestParams {
interface GetAddressesRequestFunctionParams extends GetAddressesRequestParams {
client: Client;
}
-
-interface ValidateGetAddressesRequestParams extends GetAddressesRequestParams {
- url?: string;
- fwVersion?: Buffer;
- wallet?: Wallet;
- ephemeralPub?: Buffer;
- sharedSecret?: Buffer;
-}
-
-interface EncodeGetAddressesRequestParams {
- fwVersion: any;
- startPath: number[];
- n: number;
- wallet: Wallet;
- flag: number;
-}
diff --git a/src/types/getKvRecords.d.ts b/src/types/getKvRecords.d.ts
index d29d41ff..359d2ff1 100644
--- a/src/types/getKvRecords.d.ts
+++ b/src/types/getKvRecords.d.ts
@@ -8,27 +8,16 @@ interface GetKvRecordsRequestFunctionParams extends GetKvRecordsRequestParams {
client: Client;
}
-interface ValidateGetKvRequestParams {
- url?: string;
- fwConstants?: FirmwareConstants;
- sharedSecret?: Buffer;
- records?: KVRecords;
- n?: number;
- type?: number;
- start?: number;
-}
-
-interface EncodeGetKvRecordsRequestParams {
+type AddressTag = {
+ caseSensitive: boolean;
+ id: number;
+ key: string;
type: number;
- n: number;
- start: number;
-}
+ val: string;
+};
interface GetKvRecordsData {
- records: {
- id: string;
- [key: string]: string;
- }[];
+ records: AddressTag[];
fetched: number;
total: number;
-}
\ No newline at end of file
+}
diff --git a/src/types/messages.d.ts b/src/types/messages.d.ts
new file mode 100644
index 00000000..945edaf1
--- /dev/null
+++ b/src/types/messages.d.ts
@@ -0,0 +1,17 @@
+interface LatticeMessageHeader {
+ // Protocol version. Should always be 0x01
+ // [uint8]
+ version: number;
+ // Protocol request type. Should always be 0x02
+ // for "secure" message type.
+ // [uint8]
+ type: LatticeMsgType;
+ // Random message ID for internal tracking in firmware
+ // [4 bytes]
+ id: Buffer;
+ // Length of payload data being used
+ // For an encrypted request, this indicates the
+ // size of the non-zero decrypted data.
+ // [uint16]
+ len: number;
+}
\ No newline at end of file
diff --git a/src/types/removeKvRecords.d.ts b/src/types/removeKvRecords.d.ts
index 573e1583..0762368f 100644
--- a/src/types/removeKvRecords.d.ts
+++ b/src/types/removeKvRecords.d.ts
@@ -6,25 +6,4 @@ interface RemoveKvRecordsRequestParams {
interface RemoveKvRecordsRequestFunctionParams
extends RemoveKvRecordsRequestParams {
client: Client;
-}
-interface ValidateRemoveKvRequestParams {
- url?: string;
- fwConstants?: FirmwareConstants;
- sharedSecret?: Buffer;
- ids?: string[];
- type?: number;
-}
-
-interface ValidatedRemoveKvRequest {
- url: string;
- fwConstants: FirmwareConstants;
- sharedSecret: Buffer;
- type: number;
- ids: string[];
-}
-
-interface EncodeRemoveKvRecordsRequestParams {
- type: number;
- ids: string[];
- fwConstants: FirmwareConstants;
-}
+}
\ No newline at end of file
diff --git a/src/types/secureMessages.d.ts b/src/types/secureMessages.d.ts
new file mode 100644
index 00000000..d0cb56ee
--- /dev/null
+++ b/src/types/secureMessages.d.ts
@@ -0,0 +1,56 @@
+interface LatticeSecureRequest {
+ // Message header
+ header: LatticeMessageHeader;
+ // Request data
+ payload: LatticeSecureRequestPayload;
+}
+
+interface LatticeSecureRequestPayload {
+ // Indicates whether this is a connect (0x01) or
+ // encrypted (0x02) secure request
+ // [uint8]
+ requestType: LatticeSecureMsgType;
+ // Request data
+ // [connect = 65 bytes, encrypted = 1732]
+ data: Buffer;
+}
+
+interface LatticeSecureConnectResponsePayload {
+ // [214 bytes]
+ data: Buffer;
+}
+
+interface LatticeSecureEncryptedResponsePayload {
+ // Error code
+ responseCode: LatticeResponseCode;
+ // Response data
+ // [3392 bytes]
+ data: Buffer;
+}
+
+interface LatticeSecureConnectRequestPayloadData {
+ // Public key corresponding to the static Client keypair
+ // [65 bytes]
+ pubkey: Buffer;
+}
+
+interface LatticeSecureEncryptedRequestPayloadData {
+ // SHA256(sharedSecret).slice(0, 4)
+ // [uint32]
+ ephemeralId: number;
+ // Encrypted data envelope
+ // [1728 bytes]
+ encryptedData: Buffer;
+}
+
+interface LatticeSecureDecryptedResponse {
+ // ECDSA public key that should replace the client's ephemeral key
+ // [65 bytes]
+ ephemeralPub: Buffer;
+ // Decrypted response data
+ // [Variable size]
+ data: Buffer;
+ // Checksum on response data (ephemeralKey | data)
+ // [uint32]
+ checksum: number;
+}
\ No newline at end of file
diff --git a/src/types/sign.d.ts b/src/types/sign.d.ts
index 21d0767e..d31d1d17 100644
--- a/src/types/sign.d.ts
+++ b/src/types/sign.d.ts
@@ -1,32 +1,27 @@
+interface SigningPayload {
+ signerPath: SigningPath;
+ payload: Uint8Array | Buffer | Buffer[] | string | EIP712MessagePayload;
+ curveType: number;
+ hashType: number;
+ encodingType?: number;
+ protocol?: ETH_MESSAGE_PROTOCOL;
+}
+
interface SignRequestParams {
- data: SigningPayload;
+ data: SigningPayload | BitcoinSignPayload;
currency?: Currency;
cachedData?: any;
nextCode?: Buffer;
- retries?: number;
}
interface SignRequestFunctionParams extends SignRequestParams {
client: Client;
}
-interface ValidateSignRequestParams {
- url?: string;
- fwConstants?: FirmwareConstants;
- wallet?: Wallet;
- sharedSecret?: Buffer;
-}
-
-interface ValidatedSignRequest {
- deviceId: string;
- key: KeyPair;
- baseUrl: string;
-}
-
interface EncodeSignRequestParams {
- request: any;
fwConstants: FirmwareConstants;
wallet: Wallet;
+ requestData: any;
cachedData?: any;
nextCode?: Buffer;
}
@@ -56,7 +51,7 @@ interface EthMsgSignRequest extends SignRequest {
interface BitcoinSignRequest extends SignRequest {
origData: {
- prevOuts: any;
+ prevOuts: PreviousOutput[];
recipient: string;
value: number;
fee: number;
@@ -66,10 +61,39 @@ interface BitcoinSignRequest extends SignRequest {
changeData?: { value: number };
}
+type PreviousOutput = {
+ txHash: string;
+ value: number;
+ index: number;
+ signerPath: number[];
+};
+
+type BitcoinSignPayload = {
+ prevOuts: PreviousOutput[];
+ recipient: string;
+ value: number;
+ fee: number;
+ changePath: number[];
+};
+
interface DecodeSignResponseParams {
data: Buffer;
/** The original request data */
- request: EthSignRequest | EthMsgSignRequest | BitcoinSignRequest;
+ request: SignRequest;
isGeneric: boolean;
currency?: Currency;
-}
\ No newline at end of file
+}
+
+type ETH_MESSAGE_PROTOCOLS = 'eip712' | 'signPersonal';
+
+interface EIP712MessagePayload {
+ types: {
+ [key: string]: {
+ name: string;
+ type: string;
+ }[];
+ };
+ domain: any;
+ primaryType: string;
+ message: any;
+}
diff --git a/src/util.ts b/src/util.ts
index 037fb020..956a2de9 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -13,15 +13,16 @@ import { decode as rlpDecode, encode as rlpEncode } from 'rlp';
import { ecdsaRecover } from 'secp256k1';
import { Calldata } from '.';
import {
- AES_IV,
BIP_CONSTANTS,
NETWORKS_BY_CHAIN_ID,
HARDENED_OFFSET,
- responseCodes,
- responseMsgs,
VERSION_BYTE,
EXTERNAL_NETWORKS_BY_CHAIN_ID_URL,
} from './constants';
+import {
+ LatticeResponseCode,
+ ProtocolConstants
+} from './protocol';
import { isValidBlockExplorerResponse, isValid4ByteResponse } from './shared/validators';
const { COINS, PURPOSES } = BIP_CONSTANTS;
@@ -72,9 +73,9 @@ export const parseLattice1Response = function (r): {
// Get response code
const responseCode = payload.readUInt8(0);
- if (responseCode !== responseCodes.RESP_SUCCESS) {
- parsed.errorMessage = `${responseMsgs[responseCode] ? responseMsgs[responseCode] : 'Unknown Error'
- } (Lattice)`;
+ if (responseCode !== LatticeResponseCode.success) {
+ const errMsg = ProtocolConstants.responseMsg[responseCode];
+ parsed.errorMessage = `[Lattice] ${errMsg ? errMsg : 'Unknown Error'}`;
parsed.responseCode = responseCode;
return parsed;
} else {
@@ -209,7 +210,7 @@ export const fixLen = function (msg, length) {
//--------------------------------------------------
/** @internal */
export const aes256_encrypt = function (data, key) {
- const iv = Buffer.from(AES_IV);
+ const iv = Buffer.from(ProtocolConstants.aesIv);
const aesCbc = new aes.ModeOfOperation.cbc(key, iv);
const paddedData =
data.length % 16 === 0 ? data : aes.padding.pkcs7.pad(data);
@@ -218,7 +219,7 @@ export const aes256_encrypt = function (data, key) {
/** @internal */
export const aes256_decrypt = function (data, key) {
- const iv = Buffer.from(AES_IV);
+ const iv = Buffer.from(ProtocolConstants.aesIv);
const aesCbc = new aes.ModeOfOperation.cbc(key, iv);
return Buffer.from(aesCbc.decrypt(data));
}
diff --git a/tsconfig.json b/tsconfig.json
index ad517e2f..551b8786 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,39 +1,13 @@
{
"compilerOptions": {
- /* Visit https://aka.ms/tsconfig.json to read more about this file */
-
- /* Basic Options */
- // "incremental": true, /* Enable incremental compilation */
- "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
- "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
- // "lib": [], /* Specify library files to be included in the compilation. */
- // "allowJs": true, /* Allow javascript files to be compiled. */
- // "checkJs": true, /* Report errors in .js files. */
- // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
"declaration": true /* Generates corresponding '.d.ts' file. */,
"declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */,
- // "sourceMap": true, /* Generates corresponding '.map' file. */
- // "outFile": "./", /* Concatenate and emit output to single file. */
- "outDir": "./dist" /* Redirect output structure to the directory. */,
- "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
- // "composite": true, /* Enable project compilation */
- // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
- // "removeComments": true, /* Do not emit comments to output. */
- // "noEmit": true, /* Do not emit outputs. */
- // "importHelpers": true, /* Import emit helpers from 'tslib'. */
- // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
- // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
-
- /* Strict Type-Checking Options */
- "strict": false /* Enable all strict type-checking options. */,
- "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */,
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
-
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
@@ -41,7 +15,6 @@
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
// "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */
-
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
@@ -51,25 +24,46 @@
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
+ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */,
+ // "lib": [], /* Specify library files to be included in the compilation. */
+ // "allowJs": true, /* Allow javascript files to be compiled. */
+ // "checkJs": true, /* Report errors in .js files. */
+ "jsx": "react-jsx" /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */,
+ "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
+ "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */,
+ // "sourceMap": true, /* Generates corresponding '.map' file. */
+ // "outFile": "./", /* Concatenate and emit output to single file. */
+ "outDir": "./dist" /* Redirect output structure to the directory. */,
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
-
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
-
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
"resolveJsonModule": true,
+ "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
/* Advanced Options */
- "skipLibCheck": true /* Skip type checking of declaration files. */,
- "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */,
- "types": ["node", "jest", "vitest", "vitest/globals"],
- "typeRoots": ["node_modules/@types", "src/**/types"]
+ "skipLibCheck": true /* Skip type checking of declaration files. */,
+ // "composite": true, /* Enable project compilation */
+ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
+ // "removeComments": true, /* Do not emit comments to output. */
+ // "noEmit": true, /* Do not emit outputs. */
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+ /* Strict Type-Checking Options */
+ "strict": false /* Enable all strict type-checking options. */,
+ /* Visit https://aka.ms/tsconfig.json to read more about this file */
+ /* Basic Options */
+ // "incremental": true, /* Enable incremental compilation */
+ "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
+ "typeRoots": ["node_modules/@types", "src/**/types"],
+ "types": ["node", "jest", "vitest", "vitest/globals"]
},
- "include": ["./src", ],
- "exclude": ["node_modules", "**/__test__","**/*.spec.ts", "**/*.test.ts"],
+ "exclude": ["node_modules", "**/__test__", "**/*.spec.ts", "**/*.test.ts"],
+ "include": ["./src"]
}
diff --git a/vite.config.ts b/vite.config.ts
index 292531c5..50b3b8f6 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -16,5 +16,5 @@ export default defineConfig(() => {
exclude: ['./src/__test__/integration/connect.test.ts'],
watchExclude: ['**/*.json'],
},
- }
+ };
});