+ );
+};
diff --git a/packages/site/src/components/index.ts b/packages/site/src/components/index.ts
index c91a0a2b..a4ae54e2 100644
--- a/packages/site/src/components/index.ts
+++ b/packages/site/src/components/index.ts
@@ -4,5 +4,6 @@ export * from './Footer';
export * from './Header';
export * from './MetaMask';
export * from './PoweredBy';
+export * from './Sovereign';
export * from './SnapLogo';
export * from './Toggle';
diff --git a/packages/site/src/pages/index.tsx b/packages/site/src/pages/index.tsx
index 78baa715..3ee99fce 100644
--- a/packages/site/src/pages/index.tsx
+++ b/packages/site/src/pages/index.tsx
@@ -1,19 +1,12 @@
import { useContext } from 'react';
import styled from 'styled-components';
import { MetamaskActions, MetaMaskContext } from '../hooks';
-import {
- connectSnap,
- getSnap,
- isLocalSnap,
- sendHello,
- shouldDisplayReconnectButton,
-} from '../utils';
+import { connectSnap, getSnap, isLocalSnap } from '../utils';
import {
ConnectButton,
InstallFlaskButton,
- ReconnectButton,
- SendHelloButton,
Card,
+ Sovereign,
} from '../components';
import { defaultSnapOrigin } from '../config';
@@ -64,25 +57,6 @@ const CardContainer = styled.div`
margin-top: 1.5rem;
`;
-const Notice = styled.div`
- background-color: ${({ theme }) => theme.colors.background.alternative};
- border: 1px solid ${({ theme }) => theme.colors.border.default};
- color: ${({ theme }) => theme.colors.text.alternative};
- border-radius: ${({ theme }) => theme.radii.default};
- padding: 2.4rem;
- margin-top: 2.4rem;
- max-width: 60rem;
- width: 100%;
-
- & > * {
- margin: 0;
- }
- ${({ theme }) => theme.mediaQueries.small} {
- margin-top: 1.2rem;
- padding: 1.6rem;
- }
-`;
-
const ErrorMessage = styled.div`
background-color: ${({ theme }) => theme.colors.error.muted};
border: 1px solid ${({ theme }) => theme.colors.error.default};
@@ -123,22 +97,13 @@ const Index = () => {
}
};
- const handleSendHelloClick = async () => {
- try {
- await sendHello();
- } catch (e) {
- console.error(e);
- dispatch({ type: MetamaskActions.SetError, payload: e });
- }
- };
-
return (
- Welcome to template-snap
+ Welcome to sov-snap
- Get started by editing src/index.ts
+ sov-snap is a snap for the Sovereign SDK.
{state.error && (
@@ -162,7 +127,7 @@ const Index = () => {
content={{
title: 'Connect',
description:
- 'Get started by connecting to and installing the example snap.',
+ 'Get started by connecting to and installing the Sovereign SDK snap.',
button: (
{
disabled={!isMetaMaskReady}
/>
)}
- {shouldDisplayReconnectButton(state.installedSnap) && (
-
- ),
- }}
- disabled={!state.installedSnap}
- />
- )}
-
- ),
- }}
- disabled={!state.installedSnap}
- fullWidth={
- isMetaMaskReady &&
- Boolean(state.installedSnap) &&
- !shouldDisplayReconnectButton(state.installedSnap)
- }
- />
-
-
- Please note that the snap.manifest.json and{' '}
- package.json must be located in the server root directory and
- the bundle must be hosted at the location specified by the location
- field.
-
-
+
);
diff --git a/packages/site/src/utils/snap.ts b/packages/site/src/utils/snap.ts
index 9c32e167..015fefe8 100644
--- a/packages/site/src/utils/snap.ts
+++ b/packages/site/src/utils/snap.ts
@@ -53,13 +53,64 @@ export const getSnap = async (version?: string): Promise => {
};
/**
- * Invoke the "hello" method from the example snap.
+ * Get the public key from the installed snap.
*/
-export const sendHello = async () => {
- await window.ethereum.request({
+export const getPublicKey = async () => {
+ return await window.ethereum.request({
method: 'wallet_invokeSnap',
- params: { snapId: defaultSnapOrigin, request: { method: 'hello' } },
+ params: {
+ snapId: defaultSnapOrigin,
+ request: {
+ method: 'getPublicKey',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'secp256k1',
+ },
+ },
+ },
+ });
+};
+
+/**
+ * Sign a given message using secp256k1.
+ */
+
+export const signMessageSecp256k1 = async (message: Uint8Array) => {
+ return await window.ethereum.request({
+ method: 'wallet_invokeSnap',
+ params: {
+ snapId: defaultSnapOrigin,
+ request: {
+ method: 'signMessage',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'secp256k1',
+ message,
+ },
+ },
+ },
+ });
+};
+
+/**
+ * Sign a given message using ed25519.
+ */
+
+export const signMessageEd25519 = async (message: Uint8Array) => {
+ return await window.ethereum.request({
+ method: 'wallet_invokeSnap',
+ params: {
+ snapId: defaultSnapOrigin,
+ request: {
+ method: 'signMessage',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'ed25519',
+ message,
+ },
+ },
+ },
});
};
diff --git a/packages/snap/README.md b/packages/snap/README.md
index c3601a1f..f90c38c0 100644
--- a/packages/snap/README.md
+++ b/packages/snap/README.md
@@ -1,12 +1,71 @@
-# TypeScript Example Snap
+# Sovereign SDK MetaMask Snap
-This snap demonstrates how to develop a snap with TypeScript. It is a simple
-snap that displays a confirmation dialog when the `hello` JSON-RPC method is
-called.
+The Sovereign SDK MetaMask Snap enables transaction signing for users.
+
+This Snap is configured to use the designated [coin type 1551](https://github.com/satoshilabs/slips/blob/master/slip-0044.md#registered-coin-types), allocated for the SDK-Sovereign SDK. In accordance with Metamask's Snap permissions design, the coin type is hardcoded. If you require a different coin type, you can fork this repository and modify the authorized path in the [Snap manifest](./packages/snap/snap.md).
+
+## Methods
+
+#### `getPublicKey`
+
+Returns the public key of the wallet as hexadecimal string.
+
+##### Params
+
+- `path`: The BIP-32 derivation path of the wallet (`string[]`).
+- `curve`: The curve of the public key (`secp256k1` or `ed25519`).
+
+##### Example
+
+```typescript
+const response = await request({
+ method: 'getPublicKey',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'ed25519',
+ },
+});
+if (
+ !response ===
+ '0x00c9aaf347832dc3b1dbb7aab4f41e5e04c64446b819c0761571c27b9f90eacb27'
+) {
+ throw new Error('Invalid public key');
+}
+```
+
+#### `signMessage`
+
+Returns the signature of the message as hexadecimal string.
+
+Will emit a confirmation dialog for the user.
+
+##### Params
+
+- `path`: The BIP-32 derivation path of the wallet (`string['m', "44'", "1551'", ...]`).
+- `curve`: The curve of the public key (`secp256k1` or `ed25519`).
+- `message`: The message to sign (`bigint | number | string | Uint8Array`).
+
+##### Example
+
+```typescript
+const response = request({
+ method: 'signMessage',
+ params: {
+ path: ['m', "44'", "1551'", "1'"],
+ curve: 'ed25519',
+ message: 'some message',
+ },
+});
+if (
+ !response ===
+ '0x10804459eef93e52f9f01f38775ce4a21eb818d70cb637c602267f48c4e129fb2f68bc24bf74c84a1950227ea76d7c1ce860e4867941ef793c83399621c69c0d'
+) {
+ throw new Error('Invalid signature');
+}
+```
## Testing
-The snap comes with some basic tests, to demonstrate how to write tests for
-snaps. To test the snap, run `yarn test` in this directory. This will use
-[`@metamask/snaps-jest`](https://github.com/MetaMask/snaps/tree/main/packages/snaps-jest)
-to run the tests in `src/index.test.ts`.
+To test the snap, run `yarn test` in this directory. This will use [`@metamask/snaps-jest`](https://github.com/MetaMask/snaps/tree/main/packages/snaps-jest) to run the tests in `src/index.test.ts`.
+
+If a change to the snap code was performed, you will need to run `yarn build` before the tests.
diff --git a/packages/snap/images/icon.svg b/packages/snap/images/icon.svg
index f555e1ea..82470453 100644
--- a/packages/snap/images/icon.svg
+++ b/packages/snap/images/icon.svg
@@ -1 +1,23 @@
-
+
\ No newline at end of file
diff --git a/packages/snap/package.json b/packages/snap/package.json
index 41f32528..a1eac6d5 100644
--- a/packages/snap/package.json
+++ b/packages/snap/package.json
@@ -1,12 +1,12 @@
{
- "name": "snap",
+ "name": "sov-snap",
"version": "0.1.0",
- "description": "The 'Hello, world!' of MetaMask Snaps, now written in TypeScript.",
+ "description": "A Sovereign SDK Metamask Snap",
"repository": {
"type": "git",
- "url": "https://github.com/MetaMask/template-snap-monorepo.git"
+ "url": "https://github.com/Sovereign-Labs/sov-snap.git"
},
- "license": "(MIT-0 OR Apache-2.0)",
+ "license": "Apache-2.0",
"main": "./dist/bundle.js",
"files": [
"dist/",
@@ -26,8 +26,13 @@
"test": "jest"
},
"dependencies": {
+ "@metamask/key-tree": "^9.0.0",
+ "@metamask/rpc-errors": "^6.0.0",
"@metamask/snaps-types": "^2.0.0",
"@metamask/snaps-ui": "^2.0.0",
+ "@metamask/utils": "^8.1.0",
+ "@noble/ed25519": "^1.6.0",
+ "@noble/secp256k1": "^1.7.1",
"buffer": "^6.0.3"
},
"devDependencies": {
diff --git a/packages/snap/snap.manifest.json b/packages/snap/snap.manifest.json
index bdfe2ff8..b0dfbc77 100644
--- a/packages/snap/snap.manifest.json
+++ b/packages/snap/snap.manifest.json
@@ -1,28 +1,64 @@
{
"version": "0.1.0",
- "description": "An example Snap written in TypeScript.",
- "proposedName": "TypeScript Example",
+ "description": "A Sovereign SDK Metamask Snap",
+ "proposedName": "sov-snap",
"repository": {
"type": "git",
- "url": "https://github.com/MetaMask/template-snap-monorepo.git"
+ "url": "https://github.com/Sovereign-Labs/sov-snap.git"
},
"source": {
- "shasum": "nW1/2r9/N2sDi0R2fm8wFoenu69wpC5fLbRrmztrWnc=",
+ "shasum": "ffF94Uc3L8/OZ4qDYWUAWbUDSs/a4v69Bg24WiT3Mvc=",
"location": {
"npm": {
"filePath": "dist/bundle.js",
"iconPath": "images/icon.svg",
- "packageName": "snap",
+ "packageName": "sov-snap",
"registry": "https://registry.npmjs.org/"
}
}
},
"initialPermissions": {
- "snap_dialog": {},
"endowment:rpc": {
"dapps": true,
- "snaps": false
- }
+ "snaps": true
+ },
+ "snap_dialog": {},
+ "snap_getBip32Entropy": [
+ {
+ "path": [
+ "m",
+ "44'",
+ "1551'"
+ ],
+ "curve": "secp256k1"
+ },
+ {
+ "path": [
+ "m",
+ "44'",
+ "1551'"
+ ],
+ "curve": "ed25519"
+ }
+ ],
+ "snap_getBip32PublicKey": [
+ {
+ "path": [
+ "m",
+ "44'",
+ "1551'"
+ ],
+ "curve": "secp256k1"
+ },
+ {
+ "path": [
+ "m",
+ "44'",
+ "1551'"
+ ],
+ "curve": "ed25519"
+ }
+ ]
},
"manifestVersion": "0.1"
}
diff --git a/packages/snap/src/index.test.ts b/packages/snap/src/index.test.ts
index 8f9f1fdc..86ed683e 100644
--- a/packages/snap/src/index.test.ts
+++ b/packages/snap/src/index.test.ts
@@ -1,54 +1,91 @@
import { installSnap } from '@metamask/snaps-jest';
import { expect } from '@jest/globals';
-import { panel, text } from '@metamask/snaps-ui';
+import { assert } from '@metamask/utils';
describe('onRpcRequest', () => {
- describe('hello', () => {
- it('shows a confirmation dialog', async () => {
- const { request } = await installSnap();
+ describe('getPublicKey', () => {
+ it('returns a secp256k1 public key', async () => {
+ const { request, close } = await installSnap();
- const origin = 'Jest';
- const response = request({
- method: 'hello',
- origin,
+ const response = await request({
+ method: 'getPublicKey',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'secp256k1',
+ },
});
- const ui = await response.getInterface();
- expect(ui.type).toBe('confirmation');
- expect(ui).toRender(
- panel([
- text(`Hello, **${origin}**!`),
- text('This custom confirmation is just for display purposes.'),
- text(
- 'But you can edit the snap source code to make it do something, if you want to!',
- ),
- ]),
+ expect(response).toRespondWith(
+ '0x04237d3c3d7d80442704201691f8b05034cf7cff2e0f60afa77971f02ae640adb9654a5c736938c430fffccc883d42760eb1aaac3a2441485bfa817a089aae7ff5',
);
- await ui.ok();
+ await close();
+ });
+
+ it('returns a ed25519 public key', async () => {
+ const { request, close } = await installSnap();
- expect(await response).toRespondWith(true);
+ const response = await request({
+ method: 'getPublicKey',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'ed25519',
+ },
+ });
+
+ expect(response).toRespondWith(
+ '0x00ff3c690d2a58db6d7f97e9ed0aa3455dd54a21246cf71492f36d60bb7c0a659f',
+ );
+
+ await close();
});
});
- it('throws an error if the requested method does not exist', async () => {
- const { request, close } = await installSnap();
+ describe('signMessage', () => {
+ it('returns a secp256k1 signature', async () => {
+ const { request, close } = await installSnap();
+
+ const response = request({
+ method: 'signMessage',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'secp256k1',
+ message: 'some message',
+ },
+ });
+
+ const ui = await response.getInterface();
+ assert(ui.type === 'confirmation');
+ await ui.ok();
+
+ expect(await response).toRespondWith(
+ '0x3044022037e40728bd555a0b18a9a60e56eb1c3ad3f691c13df947a95c177491a23e8a2f02206eb555dd3061ae3fb13292dc90f742111c4329397e2323746bfa2296a478e4f5',
+ );
- const response = await request({
- method: 'foo',
+ await close();
});
- expect(response).toRespondWithError({
- code: -32603,
- message: 'Internal JSON-RPC error.',
- data: {
- cause: {
- message: 'Method not found.',
- stack: expect.any(String),
+ it('returns a ed25519 signature', async () => {
+ const { request, close } = await installSnap();
+
+ const response = request({
+ method: 'signMessage',
+ params: {
+ path: ['m', "44'", "1551'"],
+ curve: 'ed25519',
+ message: 'some message',
},
- },
- });
+ });
+
+ const ui = await response.getInterface();
+ assert(ui.type === 'confirmation');
+ await ui.ok();
- await close();
+ expect(await response).toRespondWith(
+ '0x83207c0ef4117e2cb70fdf6bcce4ed0b54ec2047332205f81f480744375b14ba1239738d0883c21285f96d60259070988b1095e45d7cbb6782393eba2dfdd903',
+ );
+
+ await close();
+ });
});
});
diff --git a/packages/snap/src/index.ts b/packages/snap/src/index.ts
index f4202879..2c4fddb5 100644
--- a/packages/snap/src/index.ts
+++ b/packages/snap/src/index.ts
@@ -1,33 +1,104 @@
-import { OnRpcRequestHandler } from '@metamask/snaps-types';
-import { panel, text } from '@metamask/snaps-ui';
+import { providerErrors, rpcErrors } from '@metamask/rpc-errors';
+import { DialogType, OnRpcRequestHandler } from '@metamask/snaps-types';
+import { copyable, heading, panel, text } from '@metamask/snaps-ui';
+import { SLIP10Node } from '@metamask/key-tree';
+import {
+ add0x,
+ assert,
+ bytesToHex,
+ remove0x,
+ valueToBytes,
+} from '@metamask/utils';
+import { sign as signEd25519 } from '@noble/ed25519';
+import { sign as signSecp256k1 } from '@noble/secp256k1';
+
+import type { GetBip32PublicKeyParams, SignMessageParams } from './types';
/**
* Handle incoming JSON-RPC requests, sent through `wallet_invokeSnap`.
*
* @param args - The request handler args as object.
- * @param args.origin - The origin of the request, e.g., the website that
- * invoked the snap.
* @param args.request - A validated JSON-RPC request object.
- * @returns The result of `snap_dialog`.
+ * @returns The result of the method.
* @throws If the request method is not valid for this snap.
*/
-export const onRpcRequest: OnRpcRequestHandler = ({ origin, request }) => {
+export const onRpcRequest: OnRpcRequestHandler = async ({ request }) => {
switch (request.method) {
- case 'hello':
- return snap.request({
+ // the return is a plain hex string
+ // https://docs.metamask.io/snaps/reference/rpc-api/#returns-5
+ case 'getPublicKey':
+ return await snap.request({
+ method: 'snap_getBip32PublicKey',
+ params: request.params as unknown as GetBip32PublicKeyParams,
+ });
+
+ case 'signMessage': {
+ const { message, curve, ...params } = request.params as SignMessageParams;
+ const json = await snap.request({
+ method: 'snap_getBip32Entropy',
+ params: {
+ ...params,
+ curve,
+ },
+ });
+
+ // we define a SLIP-10 node from the response
+ // https://docs.metamask.io/snaps/reference/rpc-api/#returns-4
+ const node = await SLIP10Node.fromJSON(json);
+
+ // while SLIP-10 does support NIST P-256, Metamask doesn't under the claim of insufficient
+ // demand.
+ // https://github.com/satoshilabs/slips/blob/master/slip-0010.md#master-key-generation
+ // https://github.com/MetaMask/key-tree/blob/main/README.md#usage
+ assert(node.privateKey);
+ assert(curve === 'ed25519' || curve === 'secp256k1');
+
+ // assert the user's approval of the provided message. Note: this message will be a raw bytes
+ // representation. A human-friendly format is currently not supported by the API as the
+ // conversion is expected to be performed before the interaction with the Snap.
+ //
+ // For more information, refer to the tracking issue:
+ // https://github.com/Sovereign-Labs/sovereign-sdk/issues/982
+ const approved = await snap.request({
method: 'snap_dialog',
params: {
- type: 'confirmation',
+ type: DialogType.Confirmation,
content: panel([
- text(`Hello, **${origin}**!`),
- text('This custom confirmation is just for display purposes.'),
+ heading('Signature request'),
text(
- 'But you can edit the snap source code to make it do something, if you want to!',
+ `Do you want to ${curve} sign "${message}" with the following public key?`,
),
+ copyable(add0x(node.publicKey)),
]),
},
});
- default:
- throw new Error('Method not found.');
+
+ if (!approved) {
+ throw providerErrors.userRejectedRequest();
+ }
+
+ const messageBytes = valueToBytes(message);
+ const privateKey = remove0x(node.privateKey);
+
+ let signed;
+ switch (curve) {
+ case 'ed25519':
+ signed = await signEd25519(messageBytes, privateKey);
+ break;
+ case 'secp256k1':
+ signed = await signSecp256k1(messageBytes, privateKey);
+ break;
+ default:
+ throw new Error(`Unsupported curve: ${String(curve)}.`);
+ }
+
+ return bytesToHex(signed);
+ }
+
+ default: {
+ throw rpcErrors.methodNotFound({
+ data: { method: request.method },
+ });
+ }
}
};
diff --git a/packages/snap/src/types.ts b/packages/snap/src/types.ts
new file mode 100644
index 00000000..357664cc
--- /dev/null
+++ b/packages/snap/src/types.ts
@@ -0,0 +1,52 @@
+import { Bytes } from '@metamask/utils';
+
+/**
+ * The parameters for calling the `getPublicKey` JSON-RPC method.
+ *
+ * Note: For simplicity, these are not validated by the snap. In production, you
+ * should validate that the request object matches this type before using it.
+ */
+export type GetBip32PublicKeyParams = {
+ /**
+ * The BIP-32 path to the account.
+ */
+ path: ['m', ...(`${number}` | `${number}'`)[]];
+
+ /**
+ * The curve used to derive the account.
+ */
+ curve: 'secp256k1' | 'ed25519';
+
+ /**
+ * Whether to return the public key in compressed form.
+ */
+ compressed?: boolean | undefined;
+
+ /**
+ * Miscellaneous parameters, which are passed to `snap_getBip32PublicKey`.
+ */
+ [key: string]: unknown;
+};
+
+/**
+ * The parameters for calling the `signMessage` JSON-RPC method.
+ *
+ * Note: For simplicity, these are not validated by the snap. In production, you
+ * should validate that the request object matches this type before using it.
+ */
+export type SignMessageParams = {
+ /**
+ * The message to sign.
+ */
+ message: Bytes;
+
+ /**
+ * The BIP-32 path to the account.
+ */
+ path: string[];
+
+ /**
+ * The curve used to derive the account.
+ */
+ curve: 'secp256k1' | 'ed25519';
+};
diff --git a/scripts/cleanup.sh b/scripts/cleanup.sh
deleted file mode 100755
index b45fd00b..00000000
--- a/scripts/cleanup.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-set -u
-set -o pipefail
-
-rm .github/CODEOWNERS
-rm .github/workflows/create-release-pr.yml
-rm .github/workflows/publish-release.yml
-rm -f scripts/cleanup.sh
-git commit -am "Clean up undesired MetaMask GitHub files"
diff --git a/tsconfig.json b/tsconfig.json
index 6c3eecc5..ca2c33ce 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -9,7 +9,14 @@
"useUnknownInCatchVariables": false,
"sourceMap": true,
"strict": true,
- "target": "ES2020"
+ "target": "ES2020",
+ "noImplicitReturns": true,
+ "strictFunctionTypes": true,
+ "strictBindCallApply": true,
+ "removeComments": true,
+ "noImplicitAny": true,
+ "allowUnreachableCode": false,
+ "strictNullChecks": true
},
"exclude": ["**/__snapshots__/**", "**/test/**", "**/*.test.ts"]
}
diff --git a/yarn.lock b/yarn.lock
index e019f8e8..4c5a83f8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4250,6 +4250,16 @@ __metadata:
languageName: node
linkType: hard
+"@metamask/rpc-errors@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "@metamask/rpc-errors@npm:6.0.0"
+ dependencies:
+ "@metamask/utils": ^8.0.0
+ fast-safe-stringify: ^2.0.6
+ checksum: 7e1ee1a98972266af4a34f0bbc842cdc11dc565056f0b8fbc93aa95663a7027eab8ff1fecbe3e09c38a1dc199f8219a6c69b2237015b2fdb8de0e5b35027c3f8
+ languageName: node
+ linkType: hard
+
"@metamask/rpc-methods@npm:^2.0.0":
version: 2.0.0
resolution: "@metamask/rpc-methods@npm:2.0.0"
@@ -4534,29 +4544,6 @@ __metadata:
languageName: node
linkType: hard
-"@metamask/template-snap-monorepo@workspace:.":
- version: 0.0.0-use.local
- resolution: "@metamask/template-snap-monorepo@workspace:."
- dependencies:
- "@metamask/eslint-config": ^10.0.0
- "@metamask/eslint-config-jest": ^10.0.0
- "@metamask/eslint-config-nodejs": ^10.0.0
- "@metamask/eslint-config-typescript": ^10.0.0
- "@typescript-eslint/eslint-plugin": ^5.33.0
- "@typescript-eslint/parser": ^5.33.0
- eslint: ^8.21.0
- eslint-config-prettier: ^8.1.0
- eslint-plugin-import: ^2.26.0
- eslint-plugin-jest: ^26.8.2
- eslint-plugin-jsdoc: ^39.2.9
- eslint-plugin-node: ^11.1.0
- eslint-plugin-prettier: ^4.2.1
- prettier: ^2.2.1
- prettier-plugin-packagejson: ^2.2.18
- typescript: ^4.7.4
- languageName: unknown
- linkType: soft
-
"@metamask/types@npm:^1.1.0":
version: 1.1.0
resolution: "@metamask/types@npm:1.1.0"
@@ -4603,7 +4590,7 @@ __metadata:
languageName: node
linkType: hard
-"@metamask/utils@npm:^8.1.0":
+"@metamask/utils@npm:^8.0.0, @metamask/utils@npm:^8.1.0":
version: 8.1.0
resolution: "@metamask/utils@npm:8.1.0"
dependencies:
@@ -5590,6 +5577,29 @@ __metadata:
languageName: node
linkType: hard
+"@sovereign-sdk/sov-snap@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "@sovereign-sdk/sov-snap@workspace:."
+ dependencies:
+ "@metamask/eslint-config": ^10.0.0
+ "@metamask/eslint-config-jest": ^10.0.0
+ "@metamask/eslint-config-nodejs": ^10.0.0
+ "@metamask/eslint-config-typescript": ^10.0.0
+ "@typescript-eslint/eslint-plugin": ^5.33.0
+ "@typescript-eslint/parser": ^5.33.0
+ eslint: ^8.21.0
+ eslint-config-prettier: ^8.1.0
+ eslint-plugin-import: ^2.26.0
+ eslint-plugin-jest: ^26.8.2
+ eslint-plugin-jsdoc: ^39.2.9
+ eslint-plugin-node: ^11.1.0
+ eslint-plugin-prettier: ^4.2.1
+ prettier: ^2.2.1
+ prettier-plugin-packagejson: ^2.2.18
+ typescript: ^4.7.4
+ languageName: unknown
+ linkType: soft
+
"@spruceid/siwe-parser@npm:1.1.3":
version: 1.1.3
resolution: "@spruceid/siwe-parser@npm:1.1.3"
@@ -20585,48 +20595,6 @@ __metadata:
languageName: node
linkType: hard
-"site@workspace:packages/site":
- version: 0.0.0-use.local
- resolution: "site@workspace:packages/site"
- dependencies:
- "@metamask/eslint-config": ^10.0.0
- "@metamask/eslint-config-jest": ^10.0.0
- "@metamask/eslint-config-nodejs": ^10.0.0
- "@metamask/eslint-config-typescript": ^10.0.0
- "@metamask/providers": ^9.0.0
- "@svgr/webpack": ^6.4.0
- "@testing-library/dom": ^8.17.1
- "@testing-library/jest-dom": ^5.16.4
- "@testing-library/react": ^13.3.0
- "@testing-library/user-event": ^13.5.0
- "@types/jest": ^27.5.2
- "@types/react": ^18.0.15
- "@types/react-dom": ^18.0.6
- "@types/styled-components": ^5.1.25
- "@typescript-eslint/eslint-plugin": ^5.33.0
- "@typescript-eslint/parser": ^5.33.0
- eslint: ^8.21.0
- eslint-config-prettier: ^8.1.0
- eslint-plugin-import: ^2.26.0
- eslint-plugin-jest: ^26.8.2
- eslint-plugin-jsdoc: ^39.2.9
- eslint-plugin-node: ^11.1.0
- eslint-plugin-prettier: ^4.2.1
- gatsby: ^4.24.4
- gatsby-plugin-manifest: ^4.24.0
- gatsby-plugin-styled-components: ^5.24.0
- gatsby-plugin-svgr: ^3.0.0-beta.0
- prettier: ^2.2.1
- prettier-plugin-packagejson: ^2.2.18
- react: ^18.2.0
- react-dom: ^18.2.0
- react-is: ^18.2.0
- rimraf: ^3.0.2
- styled-components: 5.3.3
- typescript: ^4.7.4
- languageName: unknown
- linkType: soft
-
"slash@npm:^3.0.0":
version: 3.0.0
resolution: "slash@npm:3.0.0"
@@ -20669,41 +20637,6 @@ __metadata:
languageName: node
linkType: hard
-"snap@workspace:packages/snap":
- version: 0.0.0-use.local
- resolution: "snap@workspace:packages/snap"
- dependencies:
- "@jest/globals": ^29.5.0
- "@lavamoat/allow-scripts": ^2.0.3
- "@metamask/auto-changelog": ^2.6.0
- "@metamask/eslint-config": ^10.0.0
- "@metamask/eslint-config-jest": ^10.0.0
- "@metamask/eslint-config-nodejs": ^10.0.0
- "@metamask/eslint-config-typescript": ^10.0.0
- "@metamask/snaps-cli": ^2.0.1
- "@metamask/snaps-jest": ^1.0.0
- "@metamask/snaps-types": ^2.0.0
- "@metamask/snaps-ui": ^2.0.0
- "@typescript-eslint/eslint-plugin": ^5.33.0
- "@typescript-eslint/parser": ^5.33.0
- buffer: ^6.0.3
- eslint: ^8.21.0
- eslint-config-prettier: ^8.1.0
- eslint-plugin-import: ^2.26.0
- eslint-plugin-jest: ^26.8.2
- eslint-plugin-jsdoc: ^39.2.9
- eslint-plugin-node: ^11.1.0
- eslint-plugin-prettier: ^4.2.1
- jest: ^29.5.0
- prettier: ^2.2.1
- prettier-plugin-packagejson: ^2.2.11
- rimraf: ^3.0.2
- through2: ^4.0.2
- ts-jest: ^29.1.0
- typescript: ^4.7.4
- languageName: unknown
- linkType: soft
-
"socket.io-adapter@npm:~2.1.0":
version: 2.1.0
resolution: "socket.io-adapter@npm:2.1.0"
@@ -20874,6 +20807,88 @@ __metadata:
languageName: node
linkType: hard
+"sov-snap-site@workspace:packages/site":
+ version: 0.0.0-use.local
+ resolution: "sov-snap-site@workspace:packages/site"
+ dependencies:
+ "@metamask/eslint-config": ^10.0.0
+ "@metamask/eslint-config-jest": ^10.0.0
+ "@metamask/eslint-config-nodejs": ^10.0.0
+ "@metamask/eslint-config-typescript": ^10.0.0
+ "@metamask/providers": ^9.0.0
+ "@svgr/webpack": ^6.4.0
+ "@testing-library/dom": ^8.17.1
+ "@testing-library/jest-dom": ^5.16.4
+ "@testing-library/react": ^13.3.0
+ "@testing-library/user-event": ^13.5.0
+ "@types/jest": ^27.5.2
+ "@types/react": ^18.0.15
+ "@types/react-dom": ^18.0.6
+ "@types/styled-components": ^5.1.25
+ "@typescript-eslint/eslint-plugin": ^5.33.0
+ "@typescript-eslint/parser": ^5.33.0
+ eslint: ^8.21.0
+ eslint-config-prettier: ^8.1.0
+ eslint-plugin-import: ^2.26.0
+ eslint-plugin-jest: ^26.8.2
+ eslint-plugin-jsdoc: ^39.2.9
+ eslint-plugin-node: ^11.1.0
+ eslint-plugin-prettier: ^4.2.1
+ gatsby: ^4.24.4
+ gatsby-plugin-manifest: ^4.24.0
+ gatsby-plugin-styled-components: ^5.24.0
+ gatsby-plugin-svgr: ^3.0.0-beta.0
+ prettier: ^2.2.1
+ prettier-plugin-packagejson: ^2.2.18
+ react: ^18.2.0
+ react-dom: ^18.2.0
+ react-is: ^18.2.0
+ rimraf: ^3.0.2
+ styled-components: 5.3.3
+ typescript: ^4.7.4
+ languageName: unknown
+ linkType: soft
+
+"sov-snap@workspace:packages/snap":
+ version: 0.0.0-use.local
+ resolution: "sov-snap@workspace:packages/snap"
+ dependencies:
+ "@jest/globals": ^29.5.0
+ "@lavamoat/allow-scripts": ^2.0.3
+ "@metamask/auto-changelog": ^2.6.0
+ "@metamask/eslint-config": ^10.0.0
+ "@metamask/eslint-config-jest": ^10.0.0
+ "@metamask/eslint-config-nodejs": ^10.0.0
+ "@metamask/eslint-config-typescript": ^10.0.0
+ "@metamask/key-tree": ^9.0.0
+ "@metamask/rpc-errors": ^6.0.0
+ "@metamask/snaps-cli": ^2.0.1
+ "@metamask/snaps-jest": ^1.0.0
+ "@metamask/snaps-types": ^2.0.0
+ "@metamask/snaps-ui": ^2.0.0
+ "@metamask/utils": ^8.1.0
+ "@noble/ed25519": ^1.6.0
+ "@noble/secp256k1": ^1.7.1
+ "@typescript-eslint/eslint-plugin": ^5.33.0
+ "@typescript-eslint/parser": ^5.33.0
+ buffer: ^6.0.3
+ eslint: ^8.21.0
+ eslint-config-prettier: ^8.1.0
+ eslint-plugin-import: ^2.26.0
+ eslint-plugin-jest: ^26.8.2
+ eslint-plugin-jsdoc: ^39.2.9
+ eslint-plugin-node: ^11.1.0
+ eslint-plugin-prettier: ^4.2.1
+ jest: ^29.5.0
+ prettier: ^2.2.1
+ prettier-plugin-packagejson: ^2.2.11
+ rimraf: ^3.0.2
+ through2: ^4.0.2
+ ts-jest: ^29.1.0
+ typescript: ^4.7.4
+ languageName: unknown
+ linkType: soft
+
"space-separated-tokens@npm:^1.1.0":
version: 1.1.5
resolution: "space-separated-tokens@npm:1.1.5"