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 ( +
+

EXAMPLE APP

+
+
+
+ + + + +
+
+
+
+ + +
+
+ +
+
+ ); +} + +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'], }, - } + }; });