From 18991b16bda5af4b993868ee85a280e8b39271ca Mon Sep 17 00:00:00 2001
From: Magic Cat <37407870+MonikaCat@users.noreply.github.com>
Date: Sat, 2 Sep 2023 15:01:14 +0700
Subject: [PATCH 01/20] feat: add `x/post` and `x/tokenfactory` modules msg
types [web-desmos] (#1298)
## Description
Closes: [BDU-1125](https://forbole.atlassian.net/browse/BDU-1125)
Changes:
1. Support new `x/post` module msg types:
-
[MsgMovePost](https://github.com/desmos-labs/desmos/blob/v6.0.0/proto/desmos/posts/v3/msgs.proto#L392)
-
[MsgRequestPostOwnerTransfer](https://github.com/desmos-labs/desmos/blob/v6.0.0/proto/desmos/posts/v3/msgs.proto#L442)
-
[MsgCancelPostOwnerTransferRequest](https://github.com/desmos-labs/desmos/blob/v6.0.0/proto/desmos/posts/v3/msgs.proto#L481)
-
[MsgAcceptPostOwnerTransferRequest](https://github.com/desmos-labs/desmos/blob/v6.0.0/proto/desmos/posts/v3/msgs.proto#L515)
-
[MsgRefusePostOwnerTransferRequest](https://github.com/desmos-labs/desmos/blob/v6.0.0/proto/desmos/posts/v3/msgs.proto#L548)
2. Support `x/tokenfactory` module msg types:
- MsgCreateDenom
- MsgMint
- MsgBurn
- MsgSetDenomMetadata
- MsgUpdateParams
---
### Author Checklist
_All items are required. Please add a note to the item if the item is
not applicable and
please add links to any relevant follow up issues._
I have...
- [x] ran linting via `yarn lint`
- [x] wrote tests where necessary
- [x] included the correct [type
prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json)
in the PR title
- [x] targeted the correct branch
- [x] provided a link to the relevant issue or specification
- [x] reviewed "Files changed" and left comments if necessary
- [x] confirmed all CI checks have passed
- [x] added a changeset via [`yarn && yarn
changeset`](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
[BDU-1125]:
https://forbole.atlassian.net/browse/BDU-1125?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
---
.changeset/dry-rules-hear.md | 6 ++
apps/web-desmos/src/components/msg/index.ts | 10 +++
.../__snapshots__/index.test.tsx.snap | 30 +++++++++
.../index.test.tsx | 38 +++++++++++
.../index.tsx | 30 +++++++++
.../__snapshots__/index.test.tsx.snap | 30 +++++++++
.../index.test.tsx | 38 +++++++++++
.../index.tsx | 30 +++++++++
.../__snapshots__/index.test.tsx.snap | 30 +++++++++
.../msg/posts/move_post/index.test.tsx | 39 ++++++++++++
.../components/msg/posts/move_post/index.tsx | 31 +++++++++
.../__snapshots__/index.test.tsx.snap | 30 +++++++++
.../index.test.tsx | 38 +++++++++++
.../index.tsx | 30 +++++++++
.../__snapshots__/index.test.tsx.snap | 36 +++++++++++
.../index.test.tsx | 39 ++++++++++++
.../request_post_owner_transfer/index.tsx | 35 +++++++++++
.../burn/__snapshots__/index.test.tsx.snap | 30 +++++++++
.../msg/tokenfactory/burn/index.test.tsx | 47 ++++++++++++++
.../msg/tokenfactory/burn/index.tsx | 38 +++++++++++
.../__snapshots__/index.test.tsx.snap | 30 +++++++++
.../tokenfactory/create_denom/index.test.tsx | 38 +++++++++++
.../msg/tokenfactory/create_denom/index.tsx | 30 +++++++++
.../mint/__snapshots__/index.test.tsx.snap | 30 +++++++++
.../msg/tokenfactory/mint/index.test.tsx | 47 ++++++++++++++
.../msg/tokenfactory/mint/index.tsx | 38 +++++++++++
.../__snapshots__/index.test.tsx.snap | 30 +++++++++
.../set_denom_metadata/index.test.tsx | 37 +++++++++++
.../tokenfactory/set_denom_metadata/index.tsx | 29 +++++++++
.../__snapshots__/index.test.tsx.snap | 30 +++++++++
.../tokenfactory/update_params/index.test.tsx | 37 +++++++++++
.../msg/tokenfactory/update_params/index.tsx | 29 +++++++++
apps/web-desmos/src/components/msg/utils.tsx | 63 +++++++++++++++++++
apps/web-desmos/src/models/index.ts | 10 +++
.../msg_accept_post_owner_transfer_request.ts | 38 +++++++++++
.../msg_cancel_post_owner_transfer_request.ts | 38 +++++++++++
.../src/models/msg/posts/msg_create_post.ts | 2 +-
.../src/models/msg/posts/msg_edit_post.ts | 10 +--
.../src/models/msg/posts/msg_move_post.ts | 42 +++++++++++++
.../msg_refuse_post_owner_transfer_request.ts | 38 +++++++++++
.../posts/msg_request_post_owner_transfer.ts | 42 +++++++++++++
.../src/models/msg/tokenfactory/msg_burn.ts | 41 ++++++++++++
.../msg/tokenfactory/msg_create_denom.ts | 38 +++++++++++
.../src/models/msg/tokenfactory/msg_mint.ts | 41 ++++++++++++
.../tokenfactory/msg_set_denom_metadata.ts | 34 ++++++++++
.../msg/tokenfactory/msg_update_params.ts | 34 ++++++++++
apps/web-desmos/src/models/msg/types.ts | 2 +-
packages/ui/public/locales/en/web_desmos.json | 22 ++++++-
48 files changed, 1527 insertions(+), 8 deletions(-)
create mode 100644 .changeset/dry-rules-hear.md
create mode 100644 apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/move_post/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/posts/move_post/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/move_post/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/burn/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/burn/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/burn/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/create_denom/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/mint/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/mint/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/mint/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/update_params/__snapshots__/index.test.tsx.snap
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/update_params/index.test.tsx
create mode 100644 apps/web-desmos/src/components/msg/tokenfactory/update_params/index.tsx
create mode 100644 apps/web-desmos/src/models/msg/posts/msg_accept_post_owner_transfer_request.ts
create mode 100644 apps/web-desmos/src/models/msg/posts/msg_cancel_post_owner_transfer_request.ts
create mode 100644 apps/web-desmos/src/models/msg/posts/msg_move_post.ts
create mode 100644 apps/web-desmos/src/models/msg/posts/msg_refuse_post_owner_transfer_request.ts
create mode 100644 apps/web-desmos/src/models/msg/posts/msg_request_post_owner_transfer.ts
create mode 100644 apps/web-desmos/src/models/msg/tokenfactory/msg_burn.ts
create mode 100644 apps/web-desmos/src/models/msg/tokenfactory/msg_create_denom.ts
create mode 100644 apps/web-desmos/src/models/msg/tokenfactory/msg_mint.ts
create mode 100644 apps/web-desmos/src/models/msg/tokenfactory/msg_set_denom_metadata.ts
create mode 100644 apps/web-desmos/src/models/msg/tokenfactory/msg_update_params.ts
diff --git a/.changeset/dry-rules-hear.md b/.changeset/dry-rules-hear.md
new file mode 100644
index 0000000000..85fcd5a386
--- /dev/null
+++ b/.changeset/dry-rules-hear.md
@@ -0,0 +1,6 @@
+---
+'web-desmos': minor
+'ui': minor
+---
+
+Add x/post and x/tokenfactory modules msg types
diff --git a/apps/web-desmos/src/components/msg/index.ts b/apps/web-desmos/src/components/msg/index.ts
index 5f4391697a..8bb202e131 100644
--- a/apps/web-desmos/src/components/msg/index.ts
+++ b/apps/web-desmos/src/components/msg/index.ts
@@ -9,6 +9,11 @@ export { default as SetDefaultExternalAddress } from '@/components/msg/profiles/
export { default as CreatePost } from '@/components/msg/posts/create_post';
export { default as EditPost } from '@/components/msg/posts/edit_post';
export { default as DeletePost } from '@/components/msg/posts/delete_post';
+export { default as MovePost } from '@/components/msg/posts/move_post';
+export { default as RequestPostOwnerTransfer } from '@/components/msg/posts/request_post_owner_transfer';
+export { default as CancelPostOwnerTransferRequest } from '@/components/msg/posts/cancel_post_owner_transfer_request';
+export { default as AcceptPostOwnerTransferRequest } from '@/components/msg/posts/accept_post_owner_transfer_request';
+export { default as RefusePostOwnerTransferRequest } from '@/components/msg/posts/refuse_post_owner_transfer_request';
export { default as AddPostAttachment } from '@/components/msg/posts/add_post_attachment';
export { default as RemovePostAttachment } from '@/components/msg/posts/remove_post_attachment';
export { default as AnswerPoll } from '@/components/msg/posts/answer_poll';
@@ -38,4 +43,9 @@ export { default as DeleteUserGroup } from '@/components/msg/subspaces/delete_us
export { default as AddUserToUserGroup } from '@/components/msg/subspaces/add_user_to_user_group';
export { default as RemoveUserFromUserGroup } from '@/components/msg/subspaces/remove_user_from_user_group';
export { default as SetUserPermissions } from '@/components/msg/subspaces/set_user_permissions';
+export { default as CreateDenom } from '@/components/msg/tokenfactory/create_denom';
+export { default as Mint } from '@/components/msg/tokenfactory/mint';
+export { default as Burn } from '@/components/msg/tokenfactory/burn';
+export { default as SetDenomMetadata } from '@/components/msg/tokenfactory/set_denom_metadata';
+export { default as UpdateParams } from '@/components/msg/tokenfactory/update_params';
export * from 'ui/components/msg';
diff --git a/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..7dd7f885b9
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/AcceptPostOwnerTransferRequest matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"receiver":"receiver","post_id":"1","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.test.tsx b/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.test.tsx
new file mode 100644
index 0000000000..51dfb9238e
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.test.tsx
@@ -0,0 +1,38 @@
+import renderer from 'react-test-renderer';
+import AcceptPostOwnerTransferRequest from '@/components/msg/posts/accept_post_owner_transfer_request';
+import MsgAcceptPostOwnerTransferRequest from '@/models/msg/posts/msg_accept_post_owner_transfer_request';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/AcceptPostOwnerTransferRequest', () => {
+ it('matches snapshot', () => {
+ const message: MsgAcceptPostOwnerTransferRequest = {
+ category: 'posts',
+ type: 'MsgAcceptPostOwnerTransferRequest',
+ receiver: 'receiver',
+ post_id: '1',
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.tsx b/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.tsx
new file mode 100644
index 0000000000..d409095893
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/accept_post_owner_transfer_request/index.tsx
@@ -0,0 +1,30 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgAcceptPostOwnerTransferRequest from '@/models/msg/posts/msg_accept_post_owner_transfer_request';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const AcceptPostOwnerTransferRequest: FC<{ message: MsgAcceptPostOwnerTransferRequest }> = (props) => {
+ const { message } = props;
+
+ const receiver = useProfileRecoil(message.receiver);
+
+ const receiverMoniker = receiver ? receiver?.name : message.receiver;
+
+ return (
+
+ , ]}
+ values={{
+ receiver: receiverMoniker,
+ post_id: message.post_id,
+ subspace_id: message.subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default AcceptPostOwnerTransferRequest;
diff --git a/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..b9efa178cb
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/CancelPostOwnerTransferRequest matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"sender":"sender","post_id":"1","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.test.tsx b/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.test.tsx
new file mode 100644
index 0000000000..071cdf6d9a
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.test.tsx
@@ -0,0 +1,38 @@
+import renderer from 'react-test-renderer';
+import CancelPostOwnerTransferRequest from '@/components/msg/posts/cancel_post_owner_transfer_request';
+import MsgCancelPostOwnerTransferRequest from '@/models/msg/posts/msg_cancel_post_owner_transfer_request';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/CancelPostOwnerTransferRequest', () => {
+ it('matches snapshot', () => {
+ const message: MsgCancelPostOwnerTransferRequest = {
+ category: 'posts',
+ type: 'MsgCancelPostOwnerTransferRequest',
+ sender: 'sender',
+ post_id: '1',
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.tsx b/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.tsx
new file mode 100644
index 0000000000..231c1ab1f6
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/cancel_post_owner_transfer_request/index.tsx
@@ -0,0 +1,30 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgCancelPostOwnerTransferRequest from '@/models/msg/posts/msg_cancel_post_owner_transfer_request';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const CancelPostOwnerTransferRequest: FC<{ message: MsgCancelPostOwnerTransferRequest }> = (props) => {
+ const { message } = props;
+
+ const sender = useProfileRecoil(message.sender);
+
+ const senderMoniker = sender ? sender?.name : message.sender;
+
+ return (
+
+ , ]}
+ values={{
+ sender: senderMoniker,
+ post_id: message.post_id,
+ subspace_id: message.subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default CancelPostOwnerTransferRequest;
diff --git a/apps/web-desmos/src/components/msg/posts/move_post/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/posts/move_post/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..a06f44df3a
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/move_post/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/MovePost matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"owner":"owner","post_id":"1","subspace_id":"subspace-id-1","target_subspace_id":"subspace-id-2"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/posts/move_post/index.test.tsx b/apps/web-desmos/src/components/msg/posts/move_post/index.test.tsx
new file mode 100644
index 0000000000..7b859f2f05
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/move_post/index.test.tsx
@@ -0,0 +1,39 @@
+import renderer from 'react-test-renderer';
+import MovePost from '@/components/msg/posts/move_post';
+import MsgMovePost from '@/models/msg/posts/msg_move_post';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/MovePost', () => {
+ it('matches snapshot', () => {
+ const message: MsgMovePost = {
+ category: 'posts',
+ type: 'MsgMovePost',
+ owner: 'owner',
+ post_id: '1',
+ subspace_id:'subspace-id-1',
+ target_subspace_id: 'subspace-id-2',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/posts/move_post/index.tsx b/apps/web-desmos/src/components/msg/posts/move_post/index.tsx
new file mode 100644
index 0000000000..b9357069df
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/move_post/index.tsx
@@ -0,0 +1,31 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgMovePost from '@/models/msg/posts/msg_move_post';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const MovePost: FC<{ message: MsgMovePost }> = (props) => {
+ const { message } = props;
+
+ const owner = useProfileRecoil(message.owner);
+
+ const authorMoniker = owner ? owner?.name : message.owner;
+
+ return (
+
+ , ]}
+ values={{
+ owner: authorMoniker,
+ post_id: message.post_id,
+ subspace_id: message.subspace_id,
+ target_subspace_id: message.target_subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default MovePost;
diff --git a/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..db6aaab8b9
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/RefusePostOwnerTransferRequest matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"receiver":"receiver","post_id":"1","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.test.tsx b/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.test.tsx
new file mode 100644
index 0000000000..046ed33eb1
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.test.tsx
@@ -0,0 +1,38 @@
+import renderer from 'react-test-renderer';
+import RefusePostOwnerTransferRequest from '@/components/msg/posts/refuse_post_owner_transfer_request';
+import MsgRefusePostOwnerTransferRequest from '@/models/msg/posts/msg_refuse_post_owner_transfer_request';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/RefusePostOwnerTransferRequest', () => {
+ it('matches snapshot', () => {
+ const message: MsgRefusePostOwnerTransferRequest = {
+ category: 'posts',
+ type: 'MsgRefusePostOwnerTransferRequest',
+ receiver: 'receiver',
+ post_id: '1',
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.tsx b/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.tsx
new file mode 100644
index 0000000000..f3913d7940
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/refuse_post_owner_transfer_request/index.tsx
@@ -0,0 +1,30 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgRefusePostOwnerTransferRequest from '@/models/msg/posts/msg_refuse_post_owner_transfer_request';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const RefusePostOwnerTransferRequest: FC<{ message: MsgRefusePostOwnerTransferRequest }> = (props) => {
+ const { message } = props;
+
+ const receiver = useProfileRecoil(message.receiver);
+
+ const receiverMoniker = receiver ? receiver?.name : message.receiver;
+
+ return (
+
+ , ]}
+ values={{
+ receiver: receiverMoniker,
+ post_id: message.post_id,
+ subspace_id: message.subspace_id
+ }}
+ />
+
+ );
+};
+
+export default RefusePostOwnerTransferRequest;
diff --git a/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..d5437d74fa
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,36 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/RequestPostOwnerTransfer matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+
+
+ {"sender":"sender","receiver":"receiver","post_id":"1","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.test.tsx b/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.test.tsx
new file mode 100644
index 0000000000..e41cde737d
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.test.tsx
@@ -0,0 +1,39 @@
+import renderer from 'react-test-renderer';
+import RequestPostOwnerTransfer from '@/components/msg/posts/request_post_owner_transfer';
+import MsgRequestPostOwnerTransfer from '@/models/msg/posts/msg_request_post_owner_transfer';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/RequestPostOwnerTransfer', () => {
+ it('matches snapshot', () => {
+ const message: MsgRequestPostOwnerTransfer = {
+ category: 'posts',
+ type: 'MsgRequestPostOwnerTransfer',
+ sender: 'sender',
+ receiver: 'receiver',
+ post_id: '1',
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.tsx b/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.tsx
new file mode 100644
index 0000000000..beb18c4270
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/posts/request_post_owner_transfer/index.tsx
@@ -0,0 +1,35 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgRequestPostOwnerTransfer from '@/models/msg/posts/msg_request_post_owner_transfer';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const RequestPostOwnerTransfer: FC<{ message: MsgRequestPostOwnerTransfer }> = (props) => {
+ const { message } = props;
+
+ const sender = useProfileRecoil(message.sender);
+ const receiver = useProfileRecoil(message.receiver);
+
+
+ const senderMoniker = sender ? sender?.name : message.sender;
+ const receiverMoniker = receiver ? receiver?.name : message.receiver;
+
+
+ return (
+
+ , ,, ]}
+ values={{
+ sender: senderMoniker,
+ receiver: receiverMoniker,
+ post_id: message.post_id,
+ subspace_id: message.subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default RequestPostOwnerTransfer;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/burn/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/tokenfactory/burn/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..d56b9b64a9
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/burn/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/Burn matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"sender":"sender","amount":"100,000 DENOM1","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/burn/index.test.tsx b/apps/web-desmos/src/components/msg/tokenfactory/burn/index.test.tsx
new file mode 100644
index 0000000000..63fc6ba20e
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/burn/index.test.tsx
@@ -0,0 +1,47 @@
+import renderer from 'react-test-renderer';
+import Burn from '@/components/msg/tokenfactory/burn';
+import MsgBurn from '@/models/msg/tokenfactory/msg_burn';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/Burn', () => {
+ it('matches snapshot', () => {
+ const message: MsgBurn = {
+ category: 'tokenfactory',
+ type: 'MsgBurn',
+ sender: 'sender',
+ amount: [
+ {
+ denom: 'denom1',
+ amount: '100000',
+ },
+ {
+ denom: 'denom2',
+ amount: '200000',
+ },
+ ],
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/burn/index.tsx b/apps/web-desmos/src/components/msg/tokenfactory/burn/index.tsx
new file mode 100644
index 0000000000..e5eea20c76
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/burn/index.tsx
@@ -0,0 +1,38 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgBurn from '@/models/msg/tokenfactory/msg_burn';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+import { formatNumber, formatToken } from '@/utils/format_token';
+
+const Burn: FC<{ message: MsgBurn }> = props => {
+ const { message } = props;
+
+ const sender = useProfileRecoil(message.sender);
+
+ const senderMoniker = sender ? sender?.name : message.sender;
+
+ const amount = formatToken(message.amount[0]?.amount, message.amount[0]?.denom);
+
+ const parsedAmount = `${formatNumber(
+ amount.value,
+ amount.exponent
+ )} ${amount.displayDenom.toUpperCase()}`;
+
+ return (
+
+ , ]}
+ values={{
+ sender: senderMoniker,
+ amount: parsedAmount,
+ subspace_id: message.subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default Burn;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/create_denom/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/tokenfactory/create_denom/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..2d8972f401
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/create_denom/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/CreateDenom matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"sender":"sender","subdenom":"subdenom","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.test.tsx b/apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.test.tsx
new file mode 100644
index 0000000000..45f8506dae
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.test.tsx
@@ -0,0 +1,38 @@
+import renderer from 'react-test-renderer';
+import CreateDenom from '@/components/msg/tokenfactory/create_denom';
+import MsgCreateDenom from '@/models/msg/tokenfactory/msg_create_denom';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/CreateDenom', () => {
+ it('matches snapshot', () => {
+ const message: MsgCreateDenom = {
+ category: 'tokenfactory',
+ type: 'MsgCreateDenom',
+ sender: 'sender',
+ subdenom: 'subdenom',
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.tsx b/apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.tsx
new file mode 100644
index 0000000000..ac12dc7ad4
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/create_denom/index.tsx
@@ -0,0 +1,30 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgCreateDenom from '@/models/msg/tokenfactory/msg_create_denom';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const CreateDenom: FC<{ message: MsgCreateDenom }> = (props) => {
+ const { message } = props;
+
+ const sender = useProfileRecoil(message.sender);
+
+ const senderMoniker = sender ? sender?.name : message.sender;
+
+ return (
+
+ , ]}
+ values={{
+ sender: senderMoniker,
+ subdenom: message.subdenom,
+ subspace_id: message.subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default CreateDenom;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/mint/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/tokenfactory/mint/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..c8893d051a
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/mint/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/Mint matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"sender":"sender","amount":"100,000 DENOM1","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/mint/index.test.tsx b/apps/web-desmos/src/components/msg/tokenfactory/mint/index.test.tsx
new file mode 100644
index 0000000000..1b183d3696
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/mint/index.test.tsx
@@ -0,0 +1,47 @@
+import renderer from 'react-test-renderer';
+import Mint from '@/components/msg/tokenfactory/mint';
+import MsgMint from '@/models/msg/tokenfactory/msg_mint';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/Mint', () => {
+ it('matches snapshot', () => {
+ const message: MsgMint = {
+ category: 'tokenfactory',
+ type: 'MsgMint',
+ sender: 'sender',
+ amount: [
+ {
+ denom: 'denom1',
+ amount: '100000',
+ },
+ {
+ denom: 'denom2',
+ amount: '200000',
+ },
+ ],
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/mint/index.tsx b/apps/web-desmos/src/components/msg/tokenfactory/mint/index.tsx
new file mode 100644
index 0000000000..b53ae46892
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/mint/index.tsx
@@ -0,0 +1,38 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgMint from '@/models/msg/tokenfactory/msg_mint';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+import { formatNumber, formatToken } from '@/utils/format_token';
+
+const Mint: FC<{ message: MsgMint }> = props => {
+ const { message } = props;
+
+ const sender = useProfileRecoil(message.sender);
+
+ const senderMoniker = sender ? sender?.name : message.sender;
+
+ const amount = formatToken(message.amount[0]?.amount, message.amount[0]?.denom);
+
+ const parsedAmount = `${formatNumber(
+ amount.value,
+ amount.exponent
+ )} ${amount.displayDenom.toUpperCase()}`;
+
+ return (
+
+ , ]}
+ values={{
+ sender: senderMoniker,
+ amount: parsedAmount,
+ subspace_id: message.subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default Mint;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..804614d644
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/SetDenomMetadata matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"sender":"sender","subspace_id":"subspace-id-1"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.test.tsx b/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.test.tsx
new file mode 100644
index 0000000000..7ab611cfaf
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.test.tsx
@@ -0,0 +1,37 @@
+import renderer from 'react-test-renderer';
+import SetDenomMetadata from '@/components/msg/tokenfactory/set_denom_metadata';
+import MsgSetDenomMetadata from '@/models/msg/tokenfactory/msg_set_denom_metadata';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/SetDenomMetadata', () => {
+ it('matches snapshot', () => {
+ const message: MsgSetDenomMetadata = {
+ category: 'tokenfactory',
+ type: 'MsgSetDenomMetadata',
+ sender: 'sender',
+ subspace_id: 'subspace-id-1',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.tsx b/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.tsx
new file mode 100644
index 0000000000..16c61eeca9
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/set_denom_metadata/index.tsx
@@ -0,0 +1,29 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgSetDenomMetadata from '@/models/msg/tokenfactory/msg_set_denom_metadata';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const SetDenomMetadata: FC<{ message: MsgSetDenomMetadata }> = (props) => {
+ const { message } = props;
+
+ const sender = useProfileRecoil(message.sender);
+
+ const senderMoniker = sender ? sender?.name : message.sender;
+
+ return (
+
+ , ]}
+ values={{
+ sender: senderMoniker,
+ subspace_id: message.subspace_id,
+ }}
+ />
+
+ );
+};
+
+export default SetDenomMetadata;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/update_params/__snapshots__/index.test.tsx.snap b/apps/web-desmos/src/components/msg/tokenfactory/update_params/__snapshots__/index.test.tsx.snap
new file mode 100644
index 0000000000..ee74de985f
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/update_params/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`screen: TransactionDetails/UpdateParams matches snapshot 1`] = `
+.emotion-0 {
+ margin: 0;
+ font-size: 1rem;
+ white-space: pre-wrap;
+ letter-spacing: 0.5px;
+ font-family: "Roboto","Helvetica","Arial",sans-serif;
+ font-weight: 400;
+ line-height: 1.5;
+}
+
+
+
+
+
+ {"authority":"authority","params":"{}"}
+
+
+`;
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/update_params/index.test.tsx b/apps/web-desmos/src/components/msg/tokenfactory/update_params/index.test.tsx
new file mode 100644
index 0000000000..8a1e4fc15d
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/update_params/index.test.tsx
@@ -0,0 +1,37 @@
+import renderer from 'react-test-renderer';
+import UpdateParams from '@/components/msg/tokenfactory/update_params';
+import MsgUpdateParams from '@/models/msg/tokenfactory/msg_update_params';
+import MockTheme from '@/tests/mocks/MockTheme';
+
+// ==================================
+// mocks
+// ==================================
+jest.mock('@/components/name', () => (props: JSX.IntrinsicElements['div']) => (
+
+));
+
+// ==================================
+// unit tests
+// ==================================
+describe('screen: TransactionDetails/UpdateParams', () => {
+ it('matches snapshot', () => {
+ const message: MsgUpdateParams = {
+ category: 'tokenfactory',
+ type: 'MsgUpdateParams',
+ authority: 'authority',
+ params: '{}',
+ json: {},
+ };
+ const component = renderer.create(
+
+
+
+ );
+ const tree = component?.toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+});
diff --git a/apps/web-desmos/src/components/msg/tokenfactory/update_params/index.tsx b/apps/web-desmos/src/components/msg/tokenfactory/update_params/index.tsx
new file mode 100644
index 0000000000..a61bcb171f
--- /dev/null
+++ b/apps/web-desmos/src/components/msg/tokenfactory/update_params/index.tsx
@@ -0,0 +1,29 @@
+import Typography from '@mui/material/Typography';
+import AppTrans from '@/components/AppTrans';
+import { FC } from 'react';
+import Name from '@/components/name';
+import MsgUpdateParams from '@/models/msg/tokenfactory/msg_update_params';
+import { useProfileRecoil } from '@/recoil/profiles/hooks';
+
+const UpdateParams: FC<{ message: MsgUpdateParams }> = (props) => {
+ const { message } = props;
+
+ const authority = useProfileRecoil(message.authority);
+
+ const authorityMoniker = authority ? authority?.name : message.authority;
+
+ return (
+
+ , ]}
+ values={{
+ authority: authorityMoniker,
+ params: message.params,
+ }}
+ />
+
+ );
+};
+
+export default UpdateParams;
diff --git a/apps/web-desmos/src/components/msg/utils.tsx b/apps/web-desmos/src/components/msg/utils.tsx
index b1f63fe31c..9de3ff70a3 100644
--- a/apps/web-desmos/src/components/msg/utils.tsx
+++ b/apps/web-desmos/src/components/msg/utils.tsx
@@ -479,6 +479,36 @@ const customTypeToModel = {
tagTheme: 'four',
tagDisplay: 'txMsgDeletePost',
},
+ '/desmos.posts.v3.MsgMovePost': {
+ model: MODELS.MsgMovePost,
+ content: COMPONENTS.MovePost,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgMovePost',
+ },
+ '/desmos.posts.v3.MsgRequestPostOwnerTransfer': {
+ model: MODELS.MsgRequestPostOwnerTransfer,
+ content: COMPONENTS.RequestPostOwnerTransfer,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgRequestPostOwnerTransfer',
+ },
+ '/desmos.posts.v3.MsgCancelPostOwnerTransferRequest': {
+ model: MODELS.MsgCancelPostOwnerTransferRequest,
+ content: COMPONENTS.CancelPostOwnerTransferRequest,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgCancelPostOwnerTransferRequest',
+ },
+ '/desmos.posts.v3.MsgAcceptPostOwnerTransferRequest': {
+ model: MODELS.MsgAcceptPostOwnerTransferRequest,
+ content: COMPONENTS.AcceptPostOwnerTransferRequest,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgAcceptPostOwnerTransferRequest',
+ },
+ '/desmos.posts.v3.MsgRefusePostOwnerTransferRequest': {
+ model: MODELS.MsgRefusePostOwnerTransferRequest,
+ content: COMPONENTS.RefusePostOwnerTransferRequest,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgRefusePostOwnerTransferRequest',
+ },
'/desmos.posts.v2.MsgAddPostAttachment': {
model: MODELS.MsgAddPostAttachment,
content: COMPONENTS.AddPostAttachment,
@@ -680,6 +710,39 @@ const customTypeToModel = {
tagTheme: 'four',
tagDisplay: 'txMsgSetUserPermissions',
},
+ // ========================
+ // tokenfactory
+ // ========================
+ '/desmos.tokenfactory.v1.MsgCreateDenom': {
+ model: MODELS.MsgCreateDenom,
+ content: COMPONENTS.CreateDenom,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgCreateDenom',
+ },
+ '/desmos.tokenfactory.v1.MsgMint': {
+ model: MODELS.MsgMint,
+ content: COMPONENTS.Mint,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgMint',
+ },
+ '/desmos.tokenfactory.v1.MsgBurn': {
+ model: MODELS.MsgBurn,
+ content: COMPONENTS.Burn,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgBurn',
+ },
+ '/desmos.tokenfactory.v1.MsgSetDenomMetadata': {
+ model: MODELS.MsgSetDenomMetadata,
+ content: COMPONENTS.SetDenomMetadata,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgSetDenomMetadata',
+ },
+ '/desmos.tokenfactory.v1.MsgUpdateParams': {
+ model: MODELS.MsgUpdateParams,
+ content: COMPONENTS.UpdateParams,
+ tagTheme: 'four',
+ tagDisplay: 'txMsgUpdateParams',
+ },
};
type CustomTypeToModel = typeof customTypeToModel;
diff --git a/apps/web-desmos/src/models/index.ts b/apps/web-desmos/src/models/index.ts
index 9c443cfe5c..108f2db0c8 100644
--- a/apps/web-desmos/src/models/index.ts
+++ b/apps/web-desmos/src/models/index.ts
@@ -10,6 +10,11 @@ export { default as MsgSetDefaultExternalAddress } from '@/models/msg/profiles/m
export { default as MsgCreatePost } from '@/models/msg/posts/msg_create_post';
export { default as MsgEditPost } from '@/models/msg/posts/msg_edit_post';
export { default as MsgDeletePost } from '@/models/msg/posts/msg_delete_post';
+export { default as MsgMovePost } from '@/models/msg/posts/msg_move_post';
+export { default as MsgRequestPostOwnerTransfer } from '@/models/msg/posts/msg_request_post_owner_transfer';
+export { default as MsgCancelPostOwnerTransferRequest } from '@/models/msg/posts/msg_cancel_post_owner_transfer_request';
+export { default as MsgAcceptPostOwnerTransferRequest } from '@/models/msg/posts/msg_accept_post_owner_transfer_request';
+export { default as MsgRefusePostOwnerTransferRequest } from '@/models/msg/posts/msg_refuse_post_owner_transfer_request';
export { default as MsgAddPostAttachment } from '@/models/msg/posts/msg_add_post_attachment';
export { default as MsgRemovePostAttachment } from '@/models/msg/posts/msg_add_post_attachment';
export { default as MsgAnswerPoll } from '@/models/msg/posts/msg_answer_poll';
@@ -39,4 +44,9 @@ export { default as MsgDeleteUserGroup } from '@/models/msg/subspaces/msg_delete
export { default as MsgAddUserToUserGroup } from '@/models/msg/subspaces/msg_add_user_to_user_group';
export { default as MsgRemoveUserFromUserGroup } from '@/models/msg/subspaces/msg_remove_user_from_user_group';
export { default as MsgSetUserPermissions } from '@/models/msg/subspaces/msg_set_user_group_permissions';
+export { default as MsgCreateDenom } from '@/models/msg/tokenfactory/msg_create_denom';
+export { default as MsgMint } from '@/models/msg/tokenfactory/msg_mint';
+export { default as MsgBurn } from '@/models/msg/tokenfactory/msg_burn';
+export { default as MsgSetDenomMetadata } from '@/models/msg/tokenfactory/msg_set_denom_metadata';
+export { default as MsgUpdateParams } from '@/models/msg/tokenfactory/msg_update_params';
export * from 'ui/models';
diff --git a/apps/web-desmos/src/models/msg/posts/msg_accept_post_owner_transfer_request.ts b/apps/web-desmos/src/models/msg/posts/msg_accept_post_owner_transfer_request.ts
new file mode 100644
index 0000000000..f623257808
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/posts/msg_accept_post_owner_transfer_request.ts
@@ -0,0 +1,38 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgAcceptPostOwnerTransferRequest {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public receiver: string;
+
+ public post_id: string;
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.receiver = R.pathOr('', ['receiver'], payload);
+ this.post_id = R.pathOr('', ['post_id'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ receiver: R.pathOr('', ['receiver'], json),
+ post_id: R.pathOr('', ['post_id'], json),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgAcceptPostOwnerTransferRequest;
diff --git a/apps/web-desmos/src/models/msg/posts/msg_cancel_post_owner_transfer_request.ts b/apps/web-desmos/src/models/msg/posts/msg_cancel_post_owner_transfer_request.ts
new file mode 100644
index 0000000000..4583c3e7b1
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/posts/msg_cancel_post_owner_transfer_request.ts
@@ -0,0 +1,38 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgCancelPostOwnerTransferRequest {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public sender: string;
+
+ public post_id: string;
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.sender = R.pathOr('', ['sender'], payload);
+ this.post_id = R.pathOr('', ['post_id'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ sender: R.pathOr('', ['sender'], json),
+ post_id: R.pathOr('', ['post_id'], json),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgCancelPostOwnerTransferRequest;
diff --git a/apps/web-desmos/src/models/msg/posts/msg_create_post.ts b/apps/web-desmos/src/models/msg/posts/msg_create_post.ts
index fe267db164..f5b5e1c2ad 100644
--- a/apps/web-desmos/src/models/msg/posts/msg_create_post.ts
+++ b/apps/web-desmos/src/models/msg/posts/msg_create_post.ts
@@ -19,7 +19,7 @@ class MsgCreatePost {
static fromJson(json: object): MsgCreatePost {
return {
- category: 'profiles',
+ category: 'posts',
json,
type: R.pathOr('', ['@type'], json),
author: R.pathOr('', ['author'], json),
diff --git a/apps/web-desmos/src/models/msg/posts/msg_edit_post.ts b/apps/web-desmos/src/models/msg/posts/msg_edit_post.ts
index 653a35b011..e2ad66d900 100644
--- a/apps/web-desmos/src/models/msg/posts/msg_edit_post.ts
+++ b/apps/web-desmos/src/models/msg/posts/msg_edit_post.ts
@@ -1,7 +1,7 @@
import * as R from 'ramda';
import type { Categories } from '@/models/msg/types';
-class MsgCreatePost {
+class MsgEditPost {
public category: Categories;
public type: string;
@@ -17,14 +17,14 @@ class MsgCreatePost {
this.editor = R.pathOr('', ['editor'], payload);
}
- static fromJson(json: object): MsgCreatePost {
+ static fromJson(json: object) {
return {
- category: 'profiles',
- json,
+ category: 'posts',
type: R.pathOr('', ['@type'], json),
+ json,
editor: R.pathOr('', ['editor'], json),
};
}
}
-export default MsgCreatePost;
+export default MsgEditPost;
diff --git a/apps/web-desmos/src/models/msg/posts/msg_move_post.ts b/apps/web-desmos/src/models/msg/posts/msg_move_post.ts
new file mode 100644
index 0000000000..8cdd690b17
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/posts/msg_move_post.ts
@@ -0,0 +1,42 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgMovePost {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public owner: string;
+
+ public subspace_id: string;
+
+ public post_id: string;
+
+ public target_subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.owner = R.pathOr('', ['owner'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ this.post_id = R.pathOr('', ['post_id'], payload);
+ this.target_subspace_id = R.pathOr('', ['target_subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ owner: R.pathOr('', ['owner'], json),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ post_id: R.pathOr('', ['post_id'], json),
+ target_subspace_id: R.pathOr('', ['target_subspace_id'], json),
+ };
+ }
+}
+
+export default MsgMovePost;
diff --git a/apps/web-desmos/src/models/msg/posts/msg_refuse_post_owner_transfer_request.ts b/apps/web-desmos/src/models/msg/posts/msg_refuse_post_owner_transfer_request.ts
new file mode 100644
index 0000000000..3f261c07c6
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/posts/msg_refuse_post_owner_transfer_request.ts
@@ -0,0 +1,38 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgRefusePostOwnerTransferRequest {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public receiver: string;
+
+ public post_id: string;
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.receiver = R.pathOr('', ['receiver'], payload);
+ this.post_id = R.pathOr('', ['post_id'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ receiver: R.pathOr('', ['receiver'], json),
+ post_id: R.pathOr('', ['post_id'], json),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgRefusePostOwnerTransferRequest;
diff --git a/apps/web-desmos/src/models/msg/posts/msg_request_post_owner_transfer.ts b/apps/web-desmos/src/models/msg/posts/msg_request_post_owner_transfer.ts
new file mode 100644
index 0000000000..0844486e18
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/posts/msg_request_post_owner_transfer.ts
@@ -0,0 +1,42 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgRequestPostOwnerTransfer {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public sender: string;
+
+ public receiver: string;
+
+ public post_id: string;
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.sender = R.pathOr('', ['sender'], payload);
+ this.receiver = R.pathOr('', ['receiver'], payload);
+ this.post_id = R.pathOr('', ['post_id'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ sender: R.pathOr('', ['sender'], json),
+ receiver: R.pathOr('', ['receiver'], json),
+ post_id: R.pathOr('', ['post_id'], json),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgRequestPostOwnerTransfer;
diff --git a/apps/web-desmos/src/models/msg/tokenfactory/msg_burn.ts b/apps/web-desmos/src/models/msg/tokenfactory/msg_burn.ts
new file mode 100644
index 0000000000..3d69b72d71
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/tokenfactory/msg_burn.ts
@@ -0,0 +1,41 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgBurn {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public sender: string;
+
+ public amount: MsgCoin[];
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.sender = R.pathOr('', ['sender'], payload);
+ this.amount = R.pathOr([], ['amount'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ sender: R.pathOr('', ['sender'], json),
+ amount: R.pathOr([], ['amount'], json).map((x) => ({
+ denom: x?.denom ?? '',
+ amount: x?.amount ?? '0',
+ })),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgBurn;
diff --git a/apps/web-desmos/src/models/msg/tokenfactory/msg_create_denom.ts b/apps/web-desmos/src/models/msg/tokenfactory/msg_create_denom.ts
new file mode 100644
index 0000000000..35606efc4d
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/tokenfactory/msg_create_denom.ts
@@ -0,0 +1,38 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgCreateDenom {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public sender: string;
+
+ public subdenom: string;
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.sender = R.pathOr('', ['sender'], payload);
+ this.subdenom = R.pathOr('', ['subdenom'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ sender: R.pathOr('', ['sender'], json),
+ subdenom: R.pathOr('', ['subdenom'], json),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgCreateDenom;
diff --git a/apps/web-desmos/src/models/msg/tokenfactory/msg_mint.ts b/apps/web-desmos/src/models/msg/tokenfactory/msg_mint.ts
new file mode 100644
index 0000000000..db1b652d34
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/tokenfactory/msg_mint.ts
@@ -0,0 +1,41 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgMint {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public sender: string;
+
+ public amount: MsgCoin[];
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.sender = R.pathOr('', ['sender'], payload);
+ this.amount = R.pathOr([], ['amount'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ sender: R.pathOr('', ['sender'], json),
+ amount: R.pathOr([], ['amount'], json).map((x) => ({
+ denom: x?.denom ?? '',
+ amount: x?.amount ?? '0',
+ })),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgMint;
diff --git a/apps/web-desmos/src/models/msg/tokenfactory/msg_set_denom_metadata.ts b/apps/web-desmos/src/models/msg/tokenfactory/msg_set_denom_metadata.ts
new file mode 100644
index 0000000000..1d0787ebb4
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/tokenfactory/msg_set_denom_metadata.ts
@@ -0,0 +1,34 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgSetDenomMetadata {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public sender: string;
+
+ public subspace_id: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.sender = R.pathOr('', ['sender'], payload);
+ this.subspace_id = R.pathOr('', ['subspace_id'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ sender: R.pathOr('', ['sender'], json),
+ subspace_id: R.pathOr('', ['subspace_id'], json),
+ };
+ }
+}
+
+export default MsgSetDenomMetadata;
diff --git a/apps/web-desmos/src/models/msg/tokenfactory/msg_update_params.ts b/apps/web-desmos/src/models/msg/tokenfactory/msg_update_params.ts
new file mode 100644
index 0000000000..cc92c031f3
--- /dev/null
+++ b/apps/web-desmos/src/models/msg/tokenfactory/msg_update_params.ts
@@ -0,0 +1,34 @@
+import * as R from 'ramda';
+import type { Categories } from '@/models/msg/types';
+
+class MsgUpdateParams {
+ public category: Categories;
+
+ public type: string;
+
+ public json: object;
+
+ public authority: string;
+
+ public params: string;
+
+ constructor(payload: object) {
+ this.category = 'posts';
+ this.type = R.pathOr('', ['type'], payload);
+ this.json = R.pathOr({}, ['json'], payload);
+ this.authority = R.pathOr('', ['authority'], payload);
+ this.params = R.pathOr('', ['params'], payload);
+ }
+
+ static fromJson(json: object) {
+ return {
+ category: 'posts',
+ type: R.pathOr('', ['@type'], json),
+ json,
+ authority: R.pathOr('', ['authority'], json),
+ params: R.pathOr('', ['params'], json),
+ };
+ }
+}
+
+export default MsgUpdateParams;
diff --git a/apps/web-desmos/src/models/msg/types.ts b/apps/web-desmos/src/models/msg/types.ts
index ec0dc8e8f2..5e025148f1 100644
--- a/apps/web-desmos/src/models/msg/types.ts
+++ b/apps/web-desmos/src/models/msg/types.ts
@@ -1,5 +1,5 @@
import type { BaseCategories, Log } from 'ui/models/msg/types';
-export type CustomCategories = 'posts' | 'reactions' | 'reports' | 'subspaces'; // custom modules
+export type CustomCategories = 'posts' | 'reactions' | 'reports' | 'subspaces' | 'tokenfactory'; // custom modules
export type Categories = BaseCategories | CustomCategories;
export type { Log };
diff --git a/packages/ui/public/locales/en/web_desmos.json b/packages/ui/public/locales/en/web_desmos.json
index ed71ce7ee0..5b44a2ae87 100644
--- a/packages/ui/public/locales/en/web_desmos.json
+++ b/packages/ui/public/locales/en/web_desmos.json
@@ -8,6 +8,11 @@
"message_contents.txMsgCreatePost": "<0>{{author}}0> created a post",
"message_contents.txMsgEditPost": "<0>{{editor}}0> edited a post",
"message_contents.txMsgDeletePost": "<0>{{signer}}0> deleted a post",
+ "message_contents.txMsgMovePost": "<0>{{owner}}0> moved a post with ID <1>{{post_id}}1> from <2>{{subspace_id}}2> to <3>{{target_subspace_id}}3> subspace",
+ "message_contents.txMsgRequestPostOwnerTransfer": "<0>{{sender}}0> requested to transfer a post <1>{{post_id}}1> ownership to <2>{{receiver}}2> in <3>{{subspace_id}}3> subspace",
+ "message_contents.txMsgCancelPostOwnerTransferRequest": "<0>{{sender}}0> cancelled owner transfer request for a post with ID <1>{{post_id}}1> in <2>{{subspace_id}}2> subspace",
+ "message_contents.txMsgAcceptPostOwnerTransferRequest": "<0>{{receiver}}0> accepted owner transfer request for a post with ID <1>{{post_id}}1> in <2>{{subspace_id}}2> subspace",
+ "message_contents.txMsgRefusePostOwnerTransferRequest": "<0>{{receiver}}0> refused owner transfer request for a post with ID <1>{{post_id}}1> in <2>{{subspace_id}}2> subspace",
"message_contents.txMsgAddPostAttachment": "<0>{{editor}}0> added an attachment to a post",
"message_contents.txMsgRemovePostAttachment": "<0>{{editor}}0> removed an attachment to a post",
"message_contents.txMsgAnswerPoll": "<0>{{signer}}0> answered a poll",
@@ -37,6 +42,11 @@
"message_contents.txMsgAddUserToUserGroup": "<0>{{signer}}0> added <1>{{user}}1> to a user group",
"message_contents.txMsgRemoveUserFromUserGroup": "<0>{{signer}}0> removed <1>{{user}}1> from a user group",
"message_contents.txMsgSetUserPermissions": "<0>{{signer}}0> set the permissions for <1>{{user}}1>",
+ "message_contents.txMsgCreateDenom": "<0>{{sender}}0> created <1>{{subdenom}}1> denom in <2>{{subspace_id}}2> subspace",
+ "message_contents.txMsgMint": "<0>{{sender}}0> minted <1>{{amount}}1> in <2>{{subspace_id}}2> subspace",
+ "message_contents.txMsgBurn": "<0>{{sender}}0> burned <1>{{amount}}1> in <2>{{subspace_id}}2> subspace",
+ "message_contents.txMsgSetDenomMetadata": "<0>{{sender}}0> set denom metadata in <1>{{subspace_id}}1> subspace",
+ "message_contents.txMsgUpdateParams": "<0>{{authority}}0> updated params to <1>{{params}}1>",
"message_labels.txLinkChainAccount": "Link Chain Account",
"message_labels.txMsgLinkApplication": "Link Application",
"message_labels.txMsgUnlinkApplication": "Unlink Application",
@@ -45,6 +55,11 @@
"message_labels.txMsgCreatePost": "Create Post",
"message_labels.txMsgEditPost": "Edit Post",
"message_labels.txMsgDeletePost": "Delete Post",
+ "message_labels.txMsgMovePost": "Move Post",
+ "message_labels.txMsgRequestPostOwnerTransfer": "Request Post Owner Transfer",
+ "message_labels.txMsgCancelPostOwnerTransferRequest": "Cancel Post Owner Transfer Request",
+ "message_labels.txMsgAcceptPostOwnerTransferRequest": "Accept Post Owner Transfer Request",
+ "message_labels.txMsgRefusePostOwnerTransferRequest": "Refuse Post Owner Transfer Request",
"message_labels.txMsgAddPostAttachment": "Add Post Attachment",
"message_labels.txMsgRemovePostAttachment": "Remove Post Attachment",
"message_labels.txMsgAnswerPoll": "Answer Poll",
@@ -73,5 +88,10 @@
"message_labels.txMsgDeleteUserGroup": "Delete User Group",
"message_labels.txMsgAddUserToUserGroup": "Add User To User Group",
"message_labels.txMsgRemoveUserFromUserGroup": "Remove User From User Group",
- "message_labels.txMsgSetUserPermissions": "Set User Permissions"
+ "message_labels.txMsgSetUserPermissions": "Set User Permissions",
+ "message_labels.txMsgCreateDenom": "Create Denom",
+ "message_labels.txMsgMint": "Mint",
+ "message_labels.txMsgBurn": "Burn",
+ "message_labels.txMsgSetDenomMetadata": "Set Denom Metadata",
+ "message_labels.txMsgUpdateParams": "Update Params"
}
\ No newline at end of file
From 584138bbb2443b74d437546ad04327fa2f0dd003 Mon Sep 17 00:00:00 2001
From: Rachel Ho
Date: Mon, 4 Sep 2023 13:04:42 +0800
Subject: [PATCH 02/20] feat: add archway [web-archway] (#1296)
## Description
Closes: [BDU-969](https://forbole.atlassian.net/browse/BDU-969)
---
### Author Checklist
_All items are required. Please add a note to the item if the item is
not applicable and
please add links to any relevant follow up issues._
I have...
- [x] ran linting via `yarn lint`
- [x] wrote tests where necessary
- [x] included the correct [type
prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json)
in the PR title
- [x] targeted the correct branch
- [x] provided a link to the relevant issue or specification
- [x] reviewed "Files changed" and left comments if necessary
- [x] confirmed all CI checks have passed
- [x] added a changeset via [`yarn && yarn
changeset`](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
---------
Co-authored-by: Magic Cat
---
.changeset/afraid-poets-visit.md | 7 +
.pnp.cjs | 132 +
apps/web-archway/.codecov.yml | 17 +
apps/web-archway/.eslintrc.yml | 9 +
apps/web-archway/CHANGELOG.md | 812 ++
apps/web-archway/codegen.yml | 13 +
apps/web-archway/jest.config.ts | 32 +
apps/web-archway/jest.setup.ts | 16 +
apps/web-archway/next-env.d.ts | 5 +
apps/web-archway/next-i18next.config.js | 11 +
apps/web-archway/next-sitemap.config.js | 5 +
apps/web-archway/next.config.js | 9 +
apps/web-archway/package.json | 138 +
.../public/fonts/HindMadurai-Regular.woff2 | Bin 0 -> 45624 bytes
.../public/icons/android-chrome-192x192.png | Bin 0 -> 6153 bytes
.../public/icons/android-chrome-512x512.png | Bin 0 -> 17642 bytes
.../public/icons/apple-touch-icon.png | Bin 0 -> 5660 bytes
.../public/icons/browserconfig.xml | 9 +
.../public/icons/favicon-16x16.png | Bin 0 -> 1033 bytes
.../public/icons/favicon-32x32.png | Bin 0 -> 1714 bytes
apps/web-archway/public/icons/favicon.ico | Bin 0 -> 15086 bytes
.../public/icons/mstile-150x150.png | Bin 0 -> 3382 bytes
.../public/icons/safari-pinned-tab.svg | 61 +
.../web-archway/public/icons/site.webmanifest | 19 +
.../public/images/default_cover_pattern.png | Bin 0 -> 46167 bytes
apps/web-archway/src/chain.json | 163 +
.../general/account_details_documents.ts | 105 +
.../general/active_validator_count.graphql | 17 +
.../src/graphql/general/block_details.graphql | 34 +
.../src/graphql/general/block_height.graphql | 5 +
.../src/graphql/general/block_time.graphql | 11 +
.../src/graphql/general/blocks.graphql | 33 +
.../src/graphql/general/chain_id.graphql | 6 +
.../src/graphql/general/market_data.graphql | 21 +
.../general/messages_by_address.graphql | 15 +
.../general/online_voting_power.graphql | 20 +
.../src/graphql/general/params.graphql | 19 +
.../graphql/general/proposal_details.graphql | 54 +
.../src/graphql/general/proposals.graphql | 14 +
.../src/graphql/general/token_price.graphql | 15 +
.../src/graphql/general/tokenomics.graphql | 12 +
.../general/transaction_details.graphql | 17 +
.../src/graphql/general/transactions.graphql | 25 +
.../graphql/general/validator_details.graphql | 62 +
.../general/validator_details_documents.ts | 56 +
.../src/graphql/general/validators.graphql | 32 +
.../general/validators_address_list.graphql | 28 +
.../src/graphql/types/general_types.ts | 9516 +++++++++++++++++
apps/web-archway/src/pages/404.tsx | 10 +
apps/web-archway/src/pages/[dtag].tsx | 11 +
apps/web-archway/src/pages/_app.tsx | 7 +
apps/web-archway/src/pages/_document.tsx | 12 +
apps/web-archway/src/pages/_error.tsx | 8 +
.../src/pages/accounts/[address].tsx | 18 +
.../web-archway/src/pages/blocks/[height].tsx | 17 +
apps/web-archway/src/pages/blocks/index.tsx | 16 +
apps/web-archway/src/pages/index.tsx | 15 +
apps/web-archway/src/pages/params/index.tsx | 10 +
apps/web-archway/src/pages/proposals/[id].tsx | 11 +
.../web-archway/src/pages/proposals/index.tsx | 10 +
.../src/pages/server-sitemap.xml/index.tsx | 8 +
.../src/pages/transactions/[tx].tsx | 16 +
.../src/pages/transactions/index.tsx | 15 +
.../src/pages/validators/[address].tsx | 18 +
.../src/pages/validators/index.tsx | 17 +
apps/web-archway/tsconfig.json | 13 +
.../assets/icons/archway-both.svg | 11 +
.../assets/logos/archway-dark.svg | 17 +
.../assets/logos/archway-light.svg | 17 +
.../ui/src/components/ChainIcon/index.tsx | 7 +
yarn.lock | 125 +
71 files changed, 11984 insertions(+)
create mode 100644 .changeset/afraid-poets-visit.md
create mode 100644 apps/web-archway/.codecov.yml
create mode 100644 apps/web-archway/.eslintrc.yml
create mode 100644 apps/web-archway/CHANGELOG.md
create mode 100644 apps/web-archway/codegen.yml
create mode 100644 apps/web-archway/jest.config.ts
create mode 100644 apps/web-archway/jest.setup.ts
create mode 100644 apps/web-archway/next-env.d.ts
create mode 100644 apps/web-archway/next-i18next.config.js
create mode 100644 apps/web-archway/next-sitemap.config.js
create mode 100644 apps/web-archway/next.config.js
create mode 100644 apps/web-archway/package.json
create mode 100644 apps/web-archway/public/fonts/HindMadurai-Regular.woff2
create mode 100644 apps/web-archway/public/icons/android-chrome-192x192.png
create mode 100644 apps/web-archway/public/icons/android-chrome-512x512.png
create mode 100644 apps/web-archway/public/icons/apple-touch-icon.png
create mode 100644 apps/web-archway/public/icons/browserconfig.xml
create mode 100644 apps/web-archway/public/icons/favicon-16x16.png
create mode 100644 apps/web-archway/public/icons/favicon-32x32.png
create mode 100644 apps/web-archway/public/icons/favicon.ico
create mode 100644 apps/web-archway/public/icons/mstile-150x150.png
create mode 100644 apps/web-archway/public/icons/safari-pinned-tab.svg
create mode 100644 apps/web-archway/public/icons/site.webmanifest
create mode 100644 apps/web-archway/public/images/default_cover_pattern.png
create mode 100644 apps/web-archway/src/chain.json
create mode 100644 apps/web-archway/src/graphql/general/account_details_documents.ts
create mode 100644 apps/web-archway/src/graphql/general/active_validator_count.graphql
create mode 100644 apps/web-archway/src/graphql/general/block_details.graphql
create mode 100644 apps/web-archway/src/graphql/general/block_height.graphql
create mode 100644 apps/web-archway/src/graphql/general/block_time.graphql
create mode 100644 apps/web-archway/src/graphql/general/blocks.graphql
create mode 100644 apps/web-archway/src/graphql/general/chain_id.graphql
create mode 100644 apps/web-archway/src/graphql/general/market_data.graphql
create mode 100644 apps/web-archway/src/graphql/general/messages_by_address.graphql
create mode 100644 apps/web-archway/src/graphql/general/online_voting_power.graphql
create mode 100644 apps/web-archway/src/graphql/general/params.graphql
create mode 100644 apps/web-archway/src/graphql/general/proposal_details.graphql
create mode 100644 apps/web-archway/src/graphql/general/proposals.graphql
create mode 100644 apps/web-archway/src/graphql/general/token_price.graphql
create mode 100644 apps/web-archway/src/graphql/general/tokenomics.graphql
create mode 100644 apps/web-archway/src/graphql/general/transaction_details.graphql
create mode 100644 apps/web-archway/src/graphql/general/transactions.graphql
create mode 100644 apps/web-archway/src/graphql/general/validator_details.graphql
create mode 100644 apps/web-archway/src/graphql/general/validator_details_documents.ts
create mode 100644 apps/web-archway/src/graphql/general/validators.graphql
create mode 100644 apps/web-archway/src/graphql/general/validators_address_list.graphql
create mode 100644 apps/web-archway/src/graphql/types/general_types.ts
create mode 100644 apps/web-archway/src/pages/404.tsx
create mode 100644 apps/web-archway/src/pages/[dtag].tsx
create mode 100644 apps/web-archway/src/pages/_app.tsx
create mode 100644 apps/web-archway/src/pages/_document.tsx
create mode 100644 apps/web-archway/src/pages/_error.tsx
create mode 100644 apps/web-archway/src/pages/accounts/[address].tsx
create mode 100644 apps/web-archway/src/pages/blocks/[height].tsx
create mode 100644 apps/web-archway/src/pages/blocks/index.tsx
create mode 100644 apps/web-archway/src/pages/index.tsx
create mode 100644 apps/web-archway/src/pages/params/index.tsx
create mode 100644 apps/web-archway/src/pages/proposals/[id].tsx
create mode 100644 apps/web-archway/src/pages/proposals/index.tsx
create mode 100644 apps/web-archway/src/pages/server-sitemap.xml/index.tsx
create mode 100644 apps/web-archway/src/pages/transactions/[tx].tsx
create mode 100644 apps/web-archway/src/pages/transactions/index.tsx
create mode 100644 apps/web-archway/src/pages/validators/[address].tsx
create mode 100644 apps/web-archway/src/pages/validators/index.tsx
create mode 100644 apps/web-archway/tsconfig.json
create mode 100644 packages/shared-utils/assets/icons/archway-both.svg
create mode 100644 packages/shared-utils/assets/logos/archway-dark.svg
create mode 100644 packages/shared-utils/assets/logos/archway-light.svg
diff --git a/.changeset/afraid-poets-visit.md b/.changeset/afraid-poets-visit.md
new file mode 100644
index 0000000000..581b9f3816
--- /dev/null
+++ b/.changeset/afraid-poets-visit.md
@@ -0,0 +1,7 @@
+---
+'shared-utils': minor
+'web-archway': minor
+'ui': minor
+---
+
+feat: add Archway Big Dipper
diff --git a/.pnp.cjs b/.pnp.cjs
index 7a45d87007..ea54c75aed 100755
--- a/.pnp.cjs
+++ b/.pnp.cjs
@@ -27,6 +27,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"name": "web-akash",\
"reference": "workspace:apps/web-akash"\
},\
+ {\
+ "name": "web-archway",\
+ "reference": "workspace:apps/web-archway"\
+ },\
{\
"name": "web-assetmantle",\
"reference": "workspace:apps/web-assetmantle"\
@@ -180,6 +184,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["web", ["workspace:apps/web"]],\
["web-agoric", ["workspace:apps/web-agoric"]],\
["web-akash", ["workspace:apps/web-akash"]],\
+ ["web-archway", ["workspace:apps/web-archway"]],\
["web-assetmantle", ["workspace:apps/web-assetmantle"]],\
["web-band", ["workspace:apps/web-band"]],\
["web-bitsong", ["workspace:apps/web-bitsong"]],\
@@ -21449,6 +21454,133 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "SOFT"\
}]\
]],\
+ ["web-archway", [\
+ ["workspace:apps/web-archway", {\
+ "packageLocation": "./apps/web-archway/",\
+ "packageDependencies": [\
+ ["web-archway", "workspace:apps/web-archway"],\
+ ["@apollo/client", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:3.7.14"],\
+ ["@cosmjs/encoding", "npm:0.30.1"],\
+ ["@cosmjs/launchpad", "npm:0.27.1"],\
+ ["@cosmjs/stargate", "npm:0.29.5"],\
+ ["@emotion/cache", "npm:11.11.0"],\
+ ["@emotion/jest", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:11.11.0"],\
+ ["@emotion/react", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:11.11.0"],\
+ ["@emotion/server", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:11.11.0"],\
+ ["@emotion/styled", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:11.11.0"],\
+ ["@graphql-codegen/cli", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:3.3.1"],\
+ ["@graphql-codegen/client-preset", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:3.0.1"],\
+ ["@graphql-codegen/fragment-matcher", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:4.0.1"],\
+ ["@graphql-codegen/typescript", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:3.0.4"],\
+ ["@graphql-codegen/typescript-operations", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:3.0.4"],\
+ ["@graphql-codegen/typescript-react-apollo", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:3.3.7"],\
+ ["@graphql-tools/mock", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:8.7.20"],\
+ ["@graphql-tools/schema", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:9.0.19"],\
+ ["@jest/globals", "npm:29.5.0"],\
+ ["@keplr-wallet/types", "npm:0.11.59"],\
+ ["@keplr-wallet/wc-client", "npm:0.11.59"],\
+ ["@mui/icons-material", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:5.11.16"],\
+ ["@mui/material", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:5.12.3"],\
+ ["@next/eslint-plugin-next", "npm:13.4.1"],\
+ ["@socialgouv/matomo-next", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:1.6.1"],\
+ ["@svgr/webpack", "npm:7.0.0"],\
+ ["@testing-library/jest-dom", "npm:5.16.5"],\
+ ["@testing-library/react", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:14.0.0"],\
+ ["@types/big.js", "npm:6.1.6"],\
+ ["@types/color", "npm:3.0.3"],\
+ ["@types/eslint", "npm:8.37.0"],\
+ ["@types/esprima", "npm:4.0.3"],\
+ ["@types/jest", "npm:29.5.1"],\
+ ["@types/js-yaml", "npm:4.0.5"],\
+ ["@types/node", "npm:18.16.5"],\
+ ["@types/numeral", "npm:2.0.2"],\
+ ["@types/qs", "npm:6.9.7"],\
+ ["@types/ramda", "npm:0.29.1"],\
+ ["@types/react", "npm:18.2.6"],\
+ ["@types/react-dom", "npm:18.2.4"],\
+ ["@types/react-test-renderer", "npm:18.0.0"],\
+ ["@types/react-virtualized-auto-sizer", "npm:1.0.1"],\
+ ["@types/react-window", "npm:1.8.5"],\
+ ["@types/react-window-infinite-loader", "npm:1.0.6"],\
+ ["@typescript-eslint/eslint-plugin", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:5.59.2"],\
+ ["@typescript-eslint/parser", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:5.59.2"],\
+ ["@walletconnect/client", "npm:1.8.0"],\
+ ["@walletconnect/encoding", "npm:1.0.2"],\
+ ["@yarnpkg/pnpify", "npm:4.0.0-rc.43"],\
+ ["apollo-link-rest", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:0.9.0"],\
+ ["bech32", "npm:2.0.0"],\
+ ["big.js", "npm:6.2.1"],\
+ ["color", "npm:4.2.3"],\
+ ["copy-to-clipboard", "npm:3.3.3"],\
+ ["csstype", "npm:3.1.2"],\
+ ["dayjs", "npm:1.11.7"],\
+ ["dotenv", "npm:16.0.3"],\
+ ["eslint", "npm:8.40.0"],\
+ ["eslint-config-airbnb", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:19.0.4"],\
+ ["eslint-config-custom", "workspace:packages/eslint-config-custom"],\
+ ["eslint-config-next", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:13.4.1"],\
+ ["eslint-config-prettier", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:8.8.0"],\
+ ["eslint-config-turbo", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:1.9.3"],\
+ ["eslint-import-resolver-typescript", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:3.5.5"],\
+ ["eslint-plugin-import", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:2.27.5"],\
+ ["eslint-plugin-jsx-a11y", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:6.7.1"],\
+ ["eslint-plugin-react", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:7.32.2"],\
+ ["eslint-plugin-react-hooks", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:4.6.0"],\
+ ["eslint-plugin-turbo", "virtual:680b866b1f607595b2b59758405cb64dff07d461aebb031486e5900d3b742457da054ab889d192b9338afd7b8895fdd9016de2dbb9d2a9b7e5b890949f153324#npm:1.9.3"],\
+ ["esprima", "npm:4.0.1"],\
+ ["framer-motion", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:10.12.8"],\
+ ["graphql", "npm:16.6.0"],\
+ ["graphql-tag", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:2.12.6"],\
+ ["graphql-ws", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:5.12.1"],\
+ ["i18next", "npm:22.4.15"],\
+ ["jdenticon", "npm:3.2.0"],\
+ ["jest", "virtual:f7bc41586b68b5179d26bce3bfb89ba68358f8cd7c2ddff4083d94b6829a704acc2424da9379676891d28c060e6d7ef24661ff4a113dbb2daf852983923aee3a#npm:29.5.0"],\
+ ["jest-cli", "virtual:d5102ea91e67e6a6d0fa5039a06fb67a1b3142418e7fa0fa83e3772fea7312d90d28c6e359755b6fea6d78c65348593d88722b1c1ad6476e3b3d5bb912925daa#npm:29.5.0"],\
+ ["jest-environment-jsdom", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:29.5.0"],\
+ ["jest-localstorage-mock", "npm:2.4.26"],\
+ ["jest-presets", "workspace:packages/jest-presets"],\
+ ["jest-transform-stub", "npm:2.0.0"],\
+ ["jest-watch-typeahead", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:2.2.2"],\
+ ["js-yaml", "npm:4.1.0"],\
+ ["lightweight-charts", "npm:4.0.1"],\
+ ["markdown-to-jsx", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:7.2.0"],\
+ ["next", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:13.4.1"],\
+ ["next-i18next", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:13.2.2"],\
+ ["next-seo", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:6.0.0"],\
+ ["next-sitemap", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:4.1.3"],\
+ ["numeral", "npm:2.0.6"],\
+ ["qrcode.react", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:3.1.0"],\
+ ["qs", "npm:6.11.1"],\
+ ["ramda", "npm:0.29.0"],\
+ ["react", "npm:18.2.0"],\
+ ["react-dom", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:18.2.0"],\
+ ["react-i18next", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:12.2.2"],\
+ ["react-share", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:4.4.1"],\
+ ["react-test-renderer", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:18.2.0"],\
+ ["react-toastify", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:9.1.2"],\
+ ["react-virtualized-auto-sizer", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:1.0.15"],\
+ ["react-window", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:1.8.9"],\
+ ["react-window-infinite-loader", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:1.0.9"],\
+ ["recharts", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:2.5.0"],\
+ ["recoil", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:0.7.7"],\
+ ["shared-utils", "workspace:packages/shared-utils"],\
+ ["subscriptions-transport-ws", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:0.11.0"],\
+ ["ts-jest", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:29.1.0"],\
+ ["ts-node", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:10.9.1"],\
+ ["tsconfig", "workspace:packages/tsconfig"],\
+ ["tslib", "npm:2.5.0"],\
+ ["tss-react", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:4.8.3"],\
+ ["typanion", "npm:3.12.1"],\
+ ["typescript", "patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=85af82"],\
+ ["ui", "workspace:packages/ui"],\
+ ["usehooks-ts", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:2.9.1"],\
+ ["ws", "virtual:9dce388d82c018b4a7af5edc7243e51f7023d1ab93a923b3959d0066ac6881c93b965a0932486426cbefa96c9c8e47849d5ff541d2404b8aca246480fa32f0d2#npm:8.13.0"],\
+ ["xss", "npm:1.0.14"],\
+ ["zod", "npm:3.21.4"]\
+ ],\
+ "linkType": "SOFT"\
+ }]\
+ ]],\
["web-assetmantle", [\
["workspace:apps/web-assetmantle", {\
"packageLocation": "./apps/web-assetmantle/",\
diff --git a/apps/web-archway/.codecov.yml b/apps/web-archway/.codecov.yml
new file mode 100644
index 0000000000..a990bf8809
--- /dev/null
+++ b/apps/web-archway/.codecov.yml
@@ -0,0 +1,17 @@
+# https://docs.codecov.io/docs/commit-status
+coverage:
+ status:
+ project:
+ default:
+ # basic
+ target: 0
+ threshold: 0%
+ base: 0%
+ # advanced
+ branches: []
+ if_no_uploads: error
+ if_not_found: success
+ if_ci_failed: error
+ only_pulls: false
+ flags: []
+ paths: []
diff --git a/apps/web-archway/.eslintrc.yml b/apps/web-archway/.eslintrc.yml
new file mode 100644
index 0000000000..fc134c47f1
--- /dev/null
+++ b/apps/web-archway/.eslintrc.yml
@@ -0,0 +1,9 @@
+root: true
+extends:
+ - custom
+ignorePatterns:
+ - '**/node_modules/*'
+ - '**/out/*'
+ - '**/.next/*'
+ - '**/dist/*'
+ - '**/src/graphql/*'
diff --git a/apps/web-archway/CHANGELOG.md b/apps/web-archway/CHANGELOG.md
new file mode 100644
index 0000000000..d2848929a6
--- /dev/null
+++ b/apps/web-archway/CHANGELOG.md
@@ -0,0 +1,812 @@
+# Unreleased
+
+## 2.17.2
+
+### Patch Changes
+
+- Updated dependencies [[`99fb1bdf8`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/99fb1bdf8be3e3baa022475903f0ebc8fc9f0619)]:
+ - shared-utils@2.22.0
+ - ui@2.35.0
+
+## 2.17.1
+
+### Patch Changes
+
+- Updated dependencies [[`d6d815915`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/d6d815915a397c857247b32882222918eaef14e5), [`1e919a3c7`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/1e919a3c7eff85ce9aef954d59dfe38212fd997a)]:
+ - shared-utils@2.21.0
+ - ui@2.34.0
+
+## 2.17.0
+
+### Minor Changes
+
+- [#1279](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1279) [`f7365dfe0`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/f7365dfe0ca3b6f0cbefcb580d255a7977f44a4f) Thanks [@rachelhox](https://github.com/rachelhox)! - feat: price chart component
+
+### Patch Changes
+
+- Updated dependencies [[`f7365dfe0`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/f7365dfe0ca3b6f0cbefcb580d255a7977f44a4f)]:
+ - ui@2.33.0
+
+## 2.16.1
+
+### Patch Changes
+
+- Updated dependencies [[`4a8dd7a48`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/4a8dd7a480a65aadefd3ea3af6fc1d5280dacbc2)]:
+ - shared-utils@2.20.0
+ - ui@2.32.0
+
+## 2.16.0
+
+### Minor Changes
+
+- [#1258](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1258) [`12079a781`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/12079a78141eb2e5ddee1c9211c5e81bc4e6d0d1) Thanks [@teamchong](https://github.com/teamchong)! - - Integrated `next-sitemap` to auto-generate sitemaps for each Next.js app in the monorepo. This enhancement improves our SEO capabilities and website visibility on search engines. The sitemap will be automatically updated with every build, ensuring it always reflects the current state of the site.
+
+### Patch Changes
+
+- Updated dependencies [[`12079a781`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/12079a78141eb2e5ddee1c9211c5e81bc4e6d0d1)]:
+ - shared-utils@2.19.0
+ - ui@2.31.0
+
+## 2.15.3
+
+### Patch Changes
+
+- Updated dependencies [[`f5392fbba`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/f5392fbbabf50763001c80faa0f7fefca343f287)]:
+ - ui@2.30.2
+
+## 2.15.2
+
+### Patch Changes
+
+- Updated dependencies [[`5654972fd`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/5654972fdf2bb50bcd8566320dc93294301facab)]:
+ - shared-utils@2.18.1
+ - ui@2.30.1
+
+## 2.15.1
+
+### Patch Changes
+
+- Updated dependencies [[`c59a66729`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/c59a66729196471a7adafa23823dc4b1b21e334b), [`3df0639ae`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/3df0639ae1ce872cfd05b535ae55edd9292995b3)]:
+ - shared-utils@2.18.0
+ - ui@2.30.0
+
+## 2.15.0
+
+### Minor Changes
+
+- [#1248](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1248) [`376b4b356`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/376b4b356b58375f14f004f62a3c2e1a11c8dccf) Thanks [@rachelhox](https://github.com/rachelhox)! - add Coreum Big Dipper
+
+- [#1236](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1236) [`fe24afcda`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/fe24afcdad91cb859ee637f2c61d79d177d8c616) Thanks [@rachelhox](https://github.com/rachelhox)! - fix quicksilver validator moniker display
+
+### Patch Changes
+
+- Updated dependencies [[`376b4b356`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/376b4b356b58375f14f004f62a3c2e1a11c8dccf), [`fe24afcda`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/fe24afcdad91cb859ee637f2c61d79d177d8c616)]:
+ - shared-utils@2.17.0
+ - ui@2.29.0
+
+## 2.14.1
+
+### Patch Changes
+
+- [#1242](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1242) [`66586e088`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/66586e088e49686ef920c00af8035dab1798317e) Thanks [@teamchong](https://github.com/teamchong)! - Shared translations for workspaces
+
+- Updated dependencies [[`66586e088`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/66586e088e49686ef920c00af8035dab1798317e)]:
+ - shared-utils@2.16.2
+ - ui@2.28.1
+
+## 2.14.0
+
+### Minor Changes
+
+- [#1238](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1238) [`a0653bd55`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/a0653bd552af9d2e1c29ea3516b32da3b94d7e0b) Thanks [@rachelhox](https://github.com/rachelhox)! - update login ui
+
+### Patch Changes
+
+- [#1225](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1225) [`5316f55cf`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/5316f55cfccc31a44cac4d42de704d0d3f058048) Thanks [@teamchong](https://github.com/teamchong)! - Bump package versions
+
+- Updated dependencies [[`a0653bd55`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/a0653bd552af9d2e1c29ea3516b32da3b94d7e0b), [`acfb8cf38`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/acfb8cf38ab779cd70117109f86c07f7d87d7a42), [`5316f55cf`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/5316f55cfccc31a44cac4d42de704d0d3f058048)]:
+ - ui@2.28.0
+ - shared-utils@2.16.1
+
+## 2.13.0
+
+### Minor Changes
+
+- [#1128](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1128) [`1edb0b236`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/1edb0b236d80993a19b11dc598cbcbb44d1905b4) Thanks [@MonikaCat](https://github.com/MonikaCat)! - Added login with Keplr and WalletConnect([\#1128](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1128))
+
+### Patch Changes
+
+- Updated dependencies [[`1edb0b236`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/1edb0b236d80993a19b11dc598cbcbb44d1905b4)]:
+ - shared-utils@2.16.0
+ - ui@2.27.0
+
+## 2.12.2
+
+### Patch Changes
+
+- Updated dependencies [[`2949b87b9`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/2949b87b93676df46bfb824ac486e9b96b9a5ba4)]:
+ - shared-utils@2.15.0
+ - ui@2.26.0
+
+## 2.12.1
+
+### Patch Changes
+
+- Updated dependencies [[`d106401de`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/d106401de6ad55be1efa2eedc248ad7277ce524a), [`381e863d1`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/381e863d12c2c56e1a32946f828de6cbd5350c46), [`2113969f5`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/2113969f5dea2d4a2cc177dc94f6ac8994080a67)]:
+ - ui@2.25.0
+ - shared-utils@2.14.0
+
+## 2.12.0
+
+### Minor Changes
+
+- [#1223](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1223) [`9082afdce`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/9082afdce5e76b378c612c5cd4f74161403c4a67) Thanks [@rachelhox](https://github.com/rachelhox)! - fix: missing messages from authz module
+
+### Patch Changes
+
+- Updated dependencies [[`9082afdce`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/9082afdce5e76b378c612c5cd4f74161403c4a67)]:
+ - ui@2.24.0
+
+## 2.11.1
+
+### Patch Changes
+
+- Updated dependencies [[`26b06277b`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/26b06277b6df0ccdf17a8207c39e74d147a20e6e)]:
+ - ui@2.23.0
+
+## 2.11.0
+
+### Minor Changes
+
+- [#1191](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1191) [`9049e712c`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/9049e712c6dacedc5a4733830b2517f7fc6d4862) Thanks [@rachelhox](https://github.com/rachelhox)! - feat: footer add documentation link
+
+### Patch Changes
+
+- Updated dependencies [[`9049e712c`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/9049e712c6dacedc5a4733830b2517f7fc6d4862), [`b756f45fd`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/b756f45fde55cb582aa312f4fc9c5c49ce21173c), [`bf192489d`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/bf192489dfc10cf9f6679f08e6a1b96d390e2e00)]:
+ - ui@2.22.0
+ - shared-utils@2.13.0
+
+## 2.10.1
+
+### Patch Changes
+
+- [#1196](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1196) [`c4d1d83e3`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/c4d1d83e30922bdb86ffc20d8cde36adad34bd0c) Thanks [@teamchong](https://github.com/teamchong)! - chore: versions bump
+
+- Updated dependencies [[`c4d1d83e3`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/c4d1d83e30922bdb86ffc20d8cde36adad34bd0c), [`e1502b5d1`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/e1502b5d1ecb50b8da94fc157ac1866ee40df9a8)]:
+ - shared-utils@2.12.1
+ - ui@2.21.0
+
+## 2.10.0
+
+### Minor Changes
+
+- [#1183](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1183) [`33750408b`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/33750408bfa3bc3195124b78be72c0d54b414bd7) Thanks [@rachelhox](https://github.com/rachelhox)! - feat: theme toggle button and 12-hour/24-hour toggle button
+
+### Patch Changes
+
+- Updated dependencies [[`33750408b`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/33750408bfa3bc3195124b78be72c0d54b414bd7)]:
+ - shared-utils@2.12.0
+ - ui@2.20.0
+
+## 2.9.0
+
+### Minor Changes
+
+- [#1166](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1166) [`f4e9417a0`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/f4e9417a06c3a5667fe541eee2bf2b820566496d) Thanks [@rachelhox](https://github.com/rachelhox)! - add en zht zhs it pl locales
+
+- [#1166](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1166) [`f4e9417a0`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/f4e9417a06c3a5667fe541eee2bf2b820566496d) Thanks [@rachelhox](https://github.com/rachelhox)! - add zht, zhs, pl and it locales
+
+### Patch Changes
+
+- Updated dependencies [[`f4e9417a0`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/f4e9417a06c3a5667fe541eee2bf2b820566496d), [`f4e9417a0`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/f4e9417a06c3a5667fe541eee2bf2b820566496d)]:
+ - ui@2.19.0
+
+## 2.8.14
+
+### Patch Changes
+
+- Updated dependencies [[`8fbfb95d5`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/8fbfb95d5d64ba23bff774aa95ea885839475603)]:
+ - ui@2.18.0
+
+## 2.8.13
+
+### Patch Changes
+
+- Updated dependencies [[`717cb798b`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/717cb798b200f5a3afde49695548266fa6bdfb3d)]:
+ - shared-utils@2.11.0
+ - ui@2.17.1
+
+## 2.8.12
+
+### Patch Changes
+
+- Updated dependencies [[`98505b6e1`](https://github.com/forbole/big-dipper-2.0-cosmos/commit/98505b6e1ca3001a6b078d30266ed33456c808df)]:
+ - ui@2.17.0
+
+## 2.8.11
+
+### Patch Changes
+
+- Updated dependencies [35f47327d]
+ - shared-utils@2.10.0
+ - ui@2.16.0
+
+## 2.8.10
+
+### Patch Changes
+
+- Updated dependencies [29f3ac40]
+ - ui@2.15.1
+
+## 2.8.9
+
+### Patch Changes
+
+- Updated dependencies [9f2e26b1]
+ - shared-utils@2.9.0
+ - ui@2.15.0
+
+## 2.8.8
+
+### Patch Changes
+
+- Updated dependencies [e0f32672]
+ - ui@2.14.3
+
+## 2.8.7
+
+### Patch Changes
+
+- Updated dependencies [e11d768a]
+ - ui@2.14.2
+
+## 2.8.6
+
+### Patch Changes
+
+- Updated dependencies [4079b219]
+ - ui@2.14.1
+
+## 2.8.5
+
+### Patch Changes
+
+- Updated dependencies [d08c0dfd]
+ - shared-utils@2.8.0
+ - tsconfig@0.3.0
+ - ui@2.14.0
+
+## 2.8.4
+
+### Patch Changes
+
+- Updated dependencies [af2e8add5]
+ - shared-utils@2.7.0
+ - ui@2.13.0
+
+## 2.8.3
+
+### Patch Changes
+
+- Updated dependencies [b4ac0a0c5]
+ - shared-utils@2.6.3
+ - ui@2.12.1
+
+## 2.8.2
+
+### Patch Changes
+
+- Updated dependencies [e12c3b0c2]
+ - ui@2.12.0
+
+## 2.8.1
+
+### Patch Changes
+
+- Updated dependencies [a04d53bd8]
+- Updated dependencies [a04d53bd8]
+- Updated dependencies [a04d53bd8]
+ - ui@2.11.1
+
+## 2.8.0
+
+### Minor Changes
+
+- d967ae3f: migrate from next-tranlsate to next-i18next
+
+ - replace {{count}} in locales/en/\*.json to {{num}} because {{count}} is reserved for next-18next
+ - add getServerSideProps to path with dynamic route param
+ - add getStaticProps to path without dynamic route param
+
+### Patch Changes
+
+- d967ae3f: remove @sentry/nextjs package, add install sentry script to install @sentry/nextjs when deployment via docker
+- d967ae3f: replace dompurify package with xss
+- d967ae3f: feat: change matomoSiteID to 8
+- d967ae3f: move jest setup coding to ui worksapce
+- Updated dependencies [d967ae3f]
+- Updated dependencies [d967ae3f]
+- Updated dependencies [d967ae3f]
+- Updated dependencies [d967ae3f]
+- Updated dependencies [d967ae3f]
+- Updated dependencies [d967ae3f]
+- Updated dependencies [d967ae3f]
+ - tsconfig@0.2.0
+ - ui@2.11.0
+
+## 2.7.2
+
+### Patch Changes
+
+- b64119a1: feat: handle respoonsive UI via CSS instead of using JS
+- Updated dependencies [b64119a1]
+ - shared-utils@2.6.2
+ - ui@2.10.4
+
+## 2.7.1
+
+### Patch Changes
+
+- dc085630: feat: Add Rotate banner feature
+- Updated dependencies [dc085630]
+ - shared-utils@2.6.1
+ - ui@2.10.1
+
+## 2.7.0
+
+### Minor Changes
+
+- 85dd8c7d: Migrate MUI v4 to MUI v5, Next v12 to v13, React v17 to v18
+
+### Patch Changes
+
+- Updated dependencies [85dd8c7d]
+ - shared-utils@2.6.0
+ - ui@2.10.0
+
+## 2.6.0
+
+### Minor Changes
+
+- 8ea919c8: auto deployment based on PR title keyword
+
+### Patch Changes
+
+- Updated dependencies [8ea919c8]
+ - ui@2.9.0
+
+## 2.5.0
+
+### Minor Changes
+
+- 650f686b: Enable Yarn Plug'n'Play (Zero-Installs)
+
+### Patch Changes
+
+- Updated dependencies [650f686b]
+ - shared-utils@2.5.0
+ - ui@2.7.0
+
+## 2.4.1
+
+### Patch Changes
+
+- 2db4ee93: performance improvements and bug fixes
+- Updated dependencies [2db4ee93]
+ - ui@2.6.1
+
+## 2.4.0
+
+### Minor Changes
+
+- df8a5bca: - batch network requests ([\#1092](https://github.com/forbole/big-dipper-2.0-cosmos/issues/1092))
+
+### Patch Changes
+
+- Updated dependencies [df8a5bca]
+ - ui@2.5.0
+
+## 2.3.0
+
+### Minor Changes
+
+- e6437552: fix: numeral [NaN issue](https://github.com/adamwdraper/Numeral-js/issues/596)
+
+### Patch Changes
+
+- e6437552: refactor: add config for voting power exponent
+- e6437552: fix: transaction message raw and filter not working
+- e6437552: fix: WebSocket use default instead of GRAPHQL_TRANSPORT_WS_PROTOCOL
+- e6437552: ci: Add bulk preview / publish to Akash
+- e6437552: fix: height is not display properly in consensus ui
+- e6437552: fix: type erros missing type declaration csstype
+- Updated dependencies [e6437552]
+- Updated dependencies [e6437552]
+- Updated dependencies [e6437552]
+- Updated dependencies [e6437552]
+- Updated dependencies [e6437552]
+- Updated dependencies [e6437552]
+- Updated dependencies [e6437552]
+
+ - shared-utils@2.3.0
+ - ui@2.3.0
+
+- Display `requested amount` and `recipient` fields inside Community Pool Spend proposal details page ([\#1053](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1053))
+- Added Connect Wallet pop up screen ([\#1068](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1068))
+
+# main-v2.2.0 - 2022-11-22
+
+## Changes
+
+- Moved env variables to config ([\#1007](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1007))
+- Added Sentry's Next.js SDK ([\#1005](https://github.com/forbole/big-dipper-2.0-cosmos/issues/1005))
+- Switched from using `npm` to `yarn berry` package manager ([\#1028](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1028))
+- Setup monorepo ([\#1035](https://github.com/forbole/big-dipper-2.0-cosmos/issues/1035))
+- Incremented unit tests coverage ([\#1044](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1044))
+- Increment E2E tests coverage ([\#1047](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1047))
+- Added Affiliate Marketing advertising banners ([\#1056](https://github.com/forbole/big-dipper-2.0-cosmos/pull/1056))
+
+# base-v2.1.2 - 2022-09-11
+
+## Fixes
+
+- Fixed `/font` after chain prefix `/desmos` in global.css ([\#992](https://github.com/forbole/big-dipper-2.0-cosmos/issues/992))
+
+# base-v2.1.1 - 2022-08-29
+
+## Fixes
+
+- Added missing dependency of `useEffect` in `useProfilesRecoil` to avoid desmos profile from not being loaded ([\#904](https://github.com/forbole/big-dipper-2.0-cosmos/issues/904))
+
+## Changes
+
+- Updated validator and account details to not be found if bech32 is invalid
+- Removed the use of NEXT_PUBLIC_URL
+- Updated graphql types generation structure (in preparation for third party modules)
+- Updated preview image location
+- Updated change url files ([\#972](https://github.com/forbole/big-dipper-2.0-cosmos/issues/972))
+- Added `NEXT_PUBLIC_MATOMO_URL` and `NEXT_PUBLIC_MATOMO_SITE_ID` to github workflow production ([\#972](https://github.com/forbole/big-dipper-2.0-cosmos/issues/972))
+
+# base-v2.1.0 - 2022-04-19
+
+## Changes
+
+- Updated not found and 404 logo ([\#792](https://github.com/forbole/big-dipper-2.0-cosmos/issues/792))
+- Fixed params % display ([\#795](https://github.com/forbole/big-dipper-2.0-cosmos/issues/795))
+- Updated params page if time period less than 1 day then show seconds ([\#797](https://github.com/forbole/big-dipper-2.0-cosmos/issues/797))
+- Added token price history component ([\#784](https://github.com/forbole/big-dipper-2.0-cosmos/issues/784))
+- Updated Account details hasura actions to default call 100 items instead of 10 for better performance
+- Added back proposal details quorum % ([\#788](https://github.com/forbole/big-dipper-2.0-cosmos/issues/788))
+- Updated validator details hasura actions performances ([\#812](https://github.com/forbole/big-dipper-2.0-cosmos/issues/812))
+
+## Fixes
+
+- Fixed commission being displayed for non validator accounts ([\#787](https://github.com/forbole/big-dipper-2.0-cosmos/issues/787))
+- Added community tax in to apr calculation ([\#810](https://github.com/forbole/big-dipper-2.0-cosmos/issues/810))
+
+# base-v2.0.2 - 2022-03-23
+
+## Bug fixes
+
+- Fixed proposal details chart percentage display
+
+# base-v2.0.1 - 2022-03-17
+
+## Bug fixes
+
+- Fixed online voting power total ([\#800](https://github.com/forbole/big-dipper-2.0-cosmos/issues/800))
+
+# base-v2.0.0 - 2022-03-10
+
+## Changes
+
+- Changed online voting power to be a query instead of a subscription ([\#638](https://github.com/forbole/big-dipper-2.0-cosmos/issues/638))
+- Optimised rendering of Proposal Details page ([\#763](https://github.com/forbole/big-dipper-2.0-cosmos/issues/763))
+- Updated online voting power display ([\#776](https://github.com/forbole/big-dipper-2.0-cosmos/issues/776))
+- Improved initial loading speed by asyncing top level functions ([\#773](https://github.com/forbole/big-dipper-2.0-cosmos/issues/773))
+
+## Bug fixes
+
+- Fixed Apr error if bonded tokens is 0 ([\#758](https://github.com/forbole/big-dipper-2.0-cosmos/issues/758))
+
+## Breaking
+
+- [Bdjuno](https://github.com/forbole/bdjuno) must be on `v2.0.0`
+
+# base-v2.0.0-rc3 - 2022-02-25
+
+## Changes
+
+- Changed `NEXT_PUBLIC_WS_CHAIN_URL` to `NEXT_PUBLIC_RPC_WEBSOCKET` for clarification
+- Changed `NEXT_PUBLIC_CHAIN_STATUS` to `NEXT_PUBLIC_CHAIN_TYPE` for clarification
+
+## Migration
+
+- Changed env `NEXT_PUBLIC_WS_CHAIN_URL` to `NEXT_PUBLIC_RPC_WEBSOCKET` or don't. It's backwards compatible
+- Changed env `NEXT_PUBLIC_CHAIN_STATUS` to `NEXT_PUBLIC_CHAIN_TYPE` or don't. It's backwards compatible
+
+## Breaking
+
+- [Bdjuno](https://github.com/forbole/bdjuno) must be on `v2.0.0`
+
+# base-v2.0.0-rc2 - 2022-02-24
+
+## Changes
+
+- Updated market cap display ([\#698](https://github.com/forbole/big-dipper-2.0-cosmos/issues/698))
+- Optimised validator details and account details to prevent random polling behavior ([\#703](https://github.com/forbole/big-dipper-2.0-cosmos/issues/703))
+- Added hasura actions error handling in account details ([\#713](https://github.com/forbole/big-dipper-2.0-cosmos/issues/713))
+- Updated to display accounts even if balance is 0 and does not exist ([\#692](https://github.com/forbole/big-dipper-2.0-cosmos/issues/692))
+- Updated handling of 18 decimal places denoms ([\#724](https://github.com/forbole/big-dipper-2.0-cosmos/issues/724))
+
+## Bug fixes
+
+- Added better handling of get denom return types ([\#735](https://github.com/forbole/big-dipper-2.0-cosmos/issues/735))
+- Updated ui to match the improved hasura actions return types
+
+# base-v2.0.0-rc1 - 2022-02-07
+
+## Changes
+
+- Updated Hasura Actions
+
+## Breaking
+
+- [Bdjuno](https://github.com/forbole/bdjuno) must be on `v1.0.0`
+
+# base-v1.10.0 - 2022-01-25
+
+## Changes
+
+- Optimized initial loading by setting basic details first then profiles after ([\#629](https://github.com/forbole/big-dipper-2.0-cosmos/issues/629))
+- Added vp token unit in config ([\#645](https://github.com/forbole/big-dipper-2.0-cosmos/issues/645))
+
+## Bug fixes
+
+- Fixed home page validator image url not displaying correctly ([\#632](https://github.com/forbole/big-dipper-2.0-cosmos/issues/632))
+- Fix validator anc account details possible infinite load due to dayjs in hook
+- Added description sanitization to proposals list ([\#666](https://github.com/forbole/big-dipper-2.0-cosmos/issues/666))
+- Fixed pagination hook page callback ([\#667](https://github.com/forbole/big-dipper-2.0-cosmos/issues/667))
+- Showed address if name or moniker is empty ([\#668](https://github.com/forbole/big-dipper-2.0-cosmos/issues/668))
+
+## Migration
+
+- [v1.9.0 to v1.10.0](https://docs.bigdipper.live/cosmos-based/frontend/migrations/v1.9.0-to-v1.10.0)
+
+# base-v1.9.0 - 2022-01-10
+
+## Changes
+
+- Added logs in tx details ([\#515](https://github.com/forbole/big-dipper-2.0-cosmos/issues/515))
+- Added tombstoned status ([\#600](https://github.com/forbole/big-dipper-2.0-cosmos/issues/600))
+- Added manual versioning in ui ([\#605](https://github.com/forbole/big-dipper-2.0-cosmos/issues/605))
+- Optimized tx list for chains with heavy traffic ([\#602](https://github.com/forbole/big-dipper-2.0-cosmos/issues/602))
+- Setup case insensitive search in dtags ([\#592](https://github.com/forbole/big-dipper-2.0-cosmos/issues/592))
+- Fixed profiles logic ([\#591](https://github.com/forbole/big-dipper-2.0-cosmos/issues/591))
+- Added AvatarNameListMsg for handling msgs with multiple users ([\#619](https://github.com/forbole/big-dipper-2.0-cosmos/issues/619))
+
+# base-v1.8.4 - 2021-12-08
+
+## Bug fixes
+
+- Fix `feegrant` and `authz` messages ([\#588](https://github.com/forbole/big-dipper-2.0-cosmos/issues/588))
+
+# base-v1.8.3 - 2021-12-07
+
+## Bug fixes
+
+- Fix validators list not displaying inactive validators ([\#583](https://github.com/forbole/big-dipper-2.0-cosmos/issues/583))
+
+# base-v1.8.2 - 2021-12-06
+
+## Bug fixes
+
+- Fix APR to handle multiple supply coins
+
+# base-v1.8.1 - 2021-12-06
+
+## Bug fixes
+
+- Fix `formatNumber` display after cleaning up ending 0s
+
+# base-v1.8.0 - 2021-12-06
+
+## Changes
+
+- Display `APR` on title bar ([\#483](https://github.com/forbole/big-dipper-2.0-cosmos/issues/483))
+- Add `@dtag` to search bar ([\#554](https://github.com/forbole/big-dipper-2.0-cosmos/issues/554))
+- Add `/@dtag` feature ([\#428](https://github.com/forbole/big-dipper-2.0-cosmos/issues/428))
+- Add `feegrant` and `authz` messages ([\#481](https://github.com/forbole/big-dipper-2.0-cosmos/issues/481))
+- Add `vesting` messages ([\#538](https://github.com/forbole/big-dipper-2.0-cosmos/issues/538))
+- Add status row in `/validators` ([\#556](https://github.com/forbole/big-dipper-2.0-cosmos/issues/556))
+- Show who the top 34% validators are ([\#506](https://github.com/forbole/big-dipper-2.0-cosmos/issues/506))
+
+## Bug fixes
+
+- Fix validator searchbar ([\#540](https://github.com/forbole/big-dipper-2.0-cosmos/issues/540))
+
+# base-v1.7.0 - 2021-11-23
+
+## Changes
+
+- Fix account details denom display ([\#478](https://github.com/forbole/big-dipper-2.0-cosmos/issues/478))
+- Replace average block time with average since last hour ([\#480](https://github.com/forbole/big-dipper-2.0-cosmos/issues/480))
+- Renamed `PROFILE_DETAILS` to `ADDRESS_DETAILS` ([\#503](https://github.com/forbole/big-dipper-2.0-cosmos/issues/503))
+- Update handling of block height in searchbar ([\#501](https://github.com/forbole/big-dipper-2.0-cosmos/issues/501))
+- Fix community pool spend proposal display ([\#520](https://github.com/forbole/big-dipper-2.0-cosmos/issues/520))
+- Update how tokens are formatted and display up to 18 decimal places ([\#524](https://github.com/forbole/big-dipper-2.0-cosmos/issues/524))
+- Auto display 0% if validator is not active ([\#541](https://github.com/forbole/big-dipper-2.0-cosmos/issues/541))
+
+## Migration
+
+- [v1.6.0 to v1.7.0](https://docs.bigdipper.live/cosmos-based/frontend/migrations/v1.6.0-to-v1.7.0)
+
+# base-v1.6.0 - 2021-11-01
+
+## Changes
+
+- Converted all react context in to recoil ([\#455](https://github.com/forbole/big-dipper-2.0-cosmos/issues/455))
+- Enabled desmos profile for delegators ([\#277](https://github.com/forbole/big-dipper-2.0-cosmos/issues/277))
+- Add license comment ([\#474](https://github.com/forbole/big-dipper-2.0-cosmos/issues/474))
+- Add redirect for old big dipper urls ([\#427](https://github.com/forbole/big-dipper-2.0-cosmos/issues/427))
+- Fix desmos profile alignment ([\#435](https://github.com/forbole/big-dipper-2.0-cosmos/issues/435))
+
+## Migration
+
+- [v1.x.x to v1.6.0](https://docs.bigdipper.live/cosmos-based/frontend/migrations/v1.x.x-to-v1.6.0)
+
+# base-v1.5.1 - 2021-10-11
+
+## Changes
+
+- Fixed `detailed` transaction list not showing correct msg count
+
+# base-v1.5.0 - 2021-10-11
+
+## Changes
+
+- Displayed desmos profile native address in connections ([\#420](https://github.com/forbole/big-dipper-2.0-cosmos/issues/420))
+- Create `compact` and `detailed` transaction list views for users with different needs ([\#391](https://github.com/forbole/big-dipper-2.0-cosmos/issues/391))
+- Updated `chain_config`
+
+# base-v1.4.0 - 2021-10-04
+
+## Changes
+
+- Updated markdown to handle `\n`
+- Changed validator list tab orders ([\#411](https://github.com/forbole/big-dipper-2.0-cosmos/issues/411))
+- Update numeral formats based on denom exponent ([\#409](https://github.com/forbole/big-dipper-2.0-cosmos/issues/409))
+
+## Bug fixes
+
+- Fixed rewards dict inside account details ([\#412](https://github.com/forbole/big-dipper-2.0-cosmos/issues/412))
+
+# base-v1.3.0 - 2021-09-27
+
+## Changes
+
+- Hides delegators in account details if amount is 0 ([\#369](https://github.com/forbole/big-dipper-2.0-cosmos/issues/369))
+- Add MsgCoin global delclaration ([\#367](https://github.com/forbole/big-dipper-2.0-cosmos/issues/367))
+
+## Bug fixes
+
+- Fixed tx msg label padding typo ([\#382](https://github.com/forbole/big-dipper-2.0-cosmos/issues/382))
+- Added default config value for online voting power ([\#378](https://github.com/forbole/big-dipper-2.0-cosmos/issues/378))
+- Fixes how queries are called so data matches on ui ([\#371](https://github.com/forbole/big-dipper-2.0-cosmos/issues/371))
+
+# base-v1.2.0 - 2021-09-20
+
+## Changes
+
+- Update price and market cap display ([\#322](https://github.com/forbole/big-dipper-2.0-cosmos/issues/322))
+
+## Bug fixes
+
+- Fix account and validator details redelegation linking consensus address ([\#323](https://github.com/forbole/big-dipper-2.0-cosmos/issues/323))
+
+# base-v1.1.1 - 2021-09-17
+
+## Hotfix
+
+- Fixed display error with previous delegation rewards also adding to total rewards balance
+
+# base-v1.1.0 - 2021-09-13
+
+## Changes
+
+- Centered desmos profile cover photo ([\#285](https://github.com/forbole/big-dipper-2.0-cosmos/issues/285))
+- Add License to footer ([\#287](https://github.com/forbole/big-dipper-2.0-cosmos/issues/287))
+- Changed position of desmos profile
+- Fix avatar images not loading correctly ([\#296](https://github.com/forbole/big-dipper-2.0-cosmos/issues/296))
+- Fix rendering issue on account and validtor details page ([\#297](https://github.com/forbole/big-dipper-2.0-cosmos/issues/297))
+- Add validator status to account delegation component ([\#307](https://github.com/forbole/big-dipper-2.0-cosmos/issues/307))
+
+# base-v1.0.9 - 2021-09-03
+
+## Bug fixes
+
+- Fixed desmos profile edge case display
+
+# base-v1.0.8 - 2021-09-03
+
+## Changes
+
+- Change how markdown is displayed ([\#274](https://github.com/forbole/big-dipper-2.0-cosmos/issues/274))
+- Update desmos profile component ([\#273](https://github.com/forbole/big-dipper-2.0-cosmos/issues/273)) ([\#140](https://github.com/forbole/big-dipper-2.0-cosmos/issues/140))
+- Fixed account detail balance ([\#271](https://github.com/forbole/big-dipper-2.0-cosmos/issues/271))
+- Update account/ validator details staking component sorting order ([\#266](https://github.com/forbole/big-dipper-2.0-cosmos/issues/266))
+
+## Bug fixes
+
+- Fix withdraw rewards display error if not enough gas
+
+# base-v1.0.7 - 2021-08-31
+
+## Changes
+
+- Added testnet and mainnet configs for easier deployment of the same chain in different stages
+- Update akash webhook CICD
+
+# base-v1.0.6 - 2021-08-25
+
+## Changes
+
+- Updated SEO structure
+
+# base-v1.0.5 - 2021-08-23
+
+## Changes
+
+- Updated models msg types ([\#225](https://github.com/forbole/big-dipper-2.0-cosmos/issues/225))
+- Update github actions CI/CD
+
+## Bug fixes
+
+- Fix staking param details displaying incorrect `Max Validators`
+
+# base-v1.0.4 - 2021-08-19
+
+## Changes
+
+- Change logo placement in nav mobile ([\#202](https://github.com/forbole/big-dipper-2.0-cosmos/issues/202))
+- Increased tag colors ([\#207](https://github.com/forbole/big-dipper-2.0-cosmos/issues/207))
+- Add IBC messages ([\#192](https://github.com/forbole/big-dipper-2.0-cosmos/issues/192))
+
+# base-v1.0.3
+
+## Changes
+
+- Bump next 10 to next 11
+- Bump react v16.x.x to v17.x.x
+- Update logo to have max height of 55px
+
+# base-v1.0.2
+
+## Changes
+
+- Update the structure layout of themes
+- Update footer light and dark theme
+- Add maintainer section in footer
+
+# base-v1.0.1
+
+## Bug fixes
+
+- Fixed tokenomics legend to use the correct colors
+
+# base-v1.0.0
+
+## Changes
+
+- Created initial boilerplate base
+- Updated proposal details to display results using snapshots instead of realtime data ([\#116](https://github.com/forbole/big-dipper-2.0-cosmos/issues/116))
+- Added desmos profile feature
+- Update chain status notifications ([\#141](https://github.com/forbole/big-dipper-2.0-cosmos/issues/141))
+- Add custom 500 page ([\#149](https://github.com/forbole/big-dipper-2.0-cosmos/issues/149))
+- Fix twitter crawler preview ([\#144](https://github.com/forbole/big-dipper-2.0-cosmos/issues/144))
+- Update params visualisation ([\#152](https://github.com/forbole/big-dipper-2.0-cosmos/issues/152))
+- Make mui tabs scrollable ([\#152](https://github.com/forbole/big-dipper-2.0-cosmos/issues/153))
+- Moved documentation to own repo ([\#162](https://github.com/forbole/big-dipper-2.0-cosmos/issues/162))
+- Add validator last seen active feature ([\#160](https://github.com/forbole/big-dipper-2.0-cosmos/issues/160))
+- Updated params to be JSONB with models typed
+- Add logos by different theme ([\#168](https://github.com/forbole/big-dipper-2.0-cosmos/issues/160))
diff --git a/apps/web-archway/codegen.yml b/apps/web-archway/codegen.yml
new file mode 100644
index 0000000000..1a7c1e9ee9
--- /dev/null
+++ b/apps/web-archway/codegen.yml
@@ -0,0 +1,13 @@
+overwrite: true
+generates:
+ ./src/graphql/types/general_types.ts:
+ documents:
+ - 'src/graphql/general/*'
+ schema: https://gql.archway.forbole.com/v1/graphql
+ config:
+ # omitOperationSuffix: true
+ skipTypeNameForRoot: true
+ plugins:
+ - 'typescript'
+ - 'typescript-operations'
+ - 'typescript-react-apollo' # To generate custom hooks per query
diff --git a/apps/web-archway/jest.config.ts b/apps/web-archway/jest.config.ts
new file mode 100644
index 0000000000..d0d9cb919a
--- /dev/null
+++ b/apps/web-archway/jest.config.ts
@@ -0,0 +1,32 @@
+import configFromPreset from 'jest-presets/jest/node/jest-preset';
+import nextJest from 'next/jest';
+import { pathsToModuleNameMapper } from 'ts-jest';
+import tsconfig from './tsconfig.json';
+
+/* Creating a jest configuration for nextjs. */
+const createJestConfig = nextJest({
+ dir: './',
+})(configFromPreset);
+
+const exportFunc = async () => {
+ // Create Next.js jest configuration
+ const configFromNext = await createJestConfig();
+ Object.keys(configFromNext.moduleNameMapper).forEach((regExp) => {
+ if (new RegExp(regExp).test('_.svg')) {
+ configFromNext.moduleNameMapper[regExp] = 'shared-utils/__mocks__/svg.js';
+ }
+ });
+ // moduleNameMapper overrided by nextjs, so we need to add it here.
+ const finalConfig = {
+ ...configFromNext,
+ moduleNameMapper: {
+ ...configFromNext.moduleNameMapper,
+ ...pathsToModuleNameMapper(tsconfig.compilerOptions.paths, {
+ prefix: '/src/',
+ }),
+ },
+ };
+ return finalConfig;
+};
+
+export default exportFunc;
diff --git a/apps/web-archway/jest.setup.ts b/apps/web-archway/jest.setup.ts
new file mode 100644
index 0000000000..301ebcb836
--- /dev/null
+++ b/apps/web-archway/jest.setup.ts
@@ -0,0 +1,16 @@
+import mockApollo from '@/tests/mocks/mockApollo';
+import mockChainConfig from '@/tests/mocks/mockChainConfig';
+import mockDayJs from '@/tests/mocks/mockDayJs';
+import mockDynamicComponent from '@/tests/mocks/mockDynamicComponent';
+import mockI18Next from '@/tests/mocks/mockI18Next';
+import mockProfiles from '@/tests/mocks/mockProfiles';
+import '@testing-library/jest-dom/extend-expect';
+import 'jest-localstorage-mock';
+
+jest.setTimeout(30000);
+mockI18Next();
+mockApollo();
+mockChainConfig();
+mockDayJs();
+mockDynamicComponent();
+mockProfiles();
diff --git a/apps/web-archway/next-env.d.ts b/apps/web-archway/next-env.d.ts
new file mode 100644
index 0000000000..4f11a03dc6
--- /dev/null
+++ b/apps/web-archway/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/apps/web-archway/next-i18next.config.js b/apps/web-archway/next-i18next.config.js
new file mode 100644
index 0000000000..ebf68ae324
--- /dev/null
+++ b/apps/web-archway/next-i18next.config.js
@@ -0,0 +1,11 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
+const { resolve } = require('path');
+
+module.exports = {
+ i18n: {
+ defaultLocale: 'en',
+ locales: ['en', 'zht', 'zhs', 'it', 'pl'],
+ },
+ localeDetection: false,
+ localePath: resolve('../../packages/ui/public/locales'),
+};
diff --git a/apps/web-archway/next-sitemap.config.js b/apps/web-archway/next-sitemap.config.js
new file mode 100644
index 0000000000..f1d46928c5
--- /dev/null
+++ b/apps/web-archway/next-sitemap.config.js
@@ -0,0 +1,5 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
+const { readFileSync } = require('fs');
+const getSitemap = require('shared-utils/configs/sitemap');
+
+module.exports = getSitemap(JSON.parse(readFileSync('./package.json', 'utf8')).name);
diff --git a/apps/web-archway/next.config.js b/apps/web-archway/next.config.js
new file mode 100644
index 0000000000..76ba5b65c2
--- /dev/null
+++ b/apps/web-archway/next.config.js
@@ -0,0 +1,9 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
+const { readFileSync } = require('fs');
+const { i18n } = require('./next-i18next.config');
+const getNextConfig = require('../../packages/shared-utils/configs/next');
+
+const nextConfig = getNextConfig(JSON.parse(readFileSync('./package.json', 'utf8')).name);
+nextConfig.i18n = i18n;
+
+module.exports = nextConfig;
diff --git a/apps/web-archway/package.json b/apps/web-archway/package.json
new file mode 100644
index 0000000000..6372086abd
--- /dev/null
+++ b/apps/web-archway/package.json
@@ -0,0 +1,138 @@
+{
+ "name": "web-archway",
+ "version": "2.17.2",
+ "license": "Apache-2.0",
+ "private": true,
+ "scripts": {
+ "dev": "RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=false next dev",
+ "build": "next build && next-sitemap",
+ "clean": "rm -rf .next .swc .turbo coverage node_modules",
+ "start": "next start",
+ "ts-check": "pnpify tsc --noemit",
+ "lint": "next lint",
+ "test": "pnpify jest --passWithNoTests --ci --no-watchman --runInBand",
+ "graphql:codegen": "pnpify graphql-codegen"
+ },
+ "dependencies": {
+ "@apollo/client": "^3.7.14",
+ "@cosmjs/encoding": "^0.30.1",
+ "@cosmjs/launchpad": "^0.27.1",
+ "@cosmjs/stargate": "^0.29.5",
+ "@emotion/react": "^11.11.0",
+ "@emotion/server": "^11.11.0",
+ "@emotion/styled": "^11.11.0",
+ "@keplr-wallet/types": "^0.11.59",
+ "@keplr-wallet/wc-client": "^0.11.59",
+ "@mui/icons-material": "^5.11.16",
+ "@mui/material": "^5.12.3",
+ "@socialgouv/matomo-next": "^1.6.1",
+ "@walletconnect/client": "^1.8.0",
+ "@walletconnect/encoding": "^1.0.2",
+ "@yarnpkg/pnpify": "^4.0.0-rc.43",
+ "apollo-link-rest": "^0.9.0",
+ "bech32": "^2.0.0",
+ "big.js": "^6.2.1",
+ "color": "^4.2.3",
+ "copy-to-clipboard": "^3.3.3",
+ "dayjs": "^1.11.7",
+ "framer-motion": "^10.12.8",
+ "graphql": "^16.6.0",
+ "graphql-ws": "^5.12.1",
+ "i18next": "^22.4.15",
+ "jdenticon": "^3.2.0",
+ "js-yaml": "^4.1.0",
+ "lightweight-charts": "^4.0.1",
+ "markdown-to-jsx": "^7.2.0",
+ "next": "^13.4.1",
+ "next-i18next": "^13.2.2",
+ "next-seo": "^6.0.0",
+ "next-sitemap": "^4.1.3",
+ "numeral": "^2.0.6",
+ "qrcode.react": "^3.1.0",
+ "qs": "^6.11.1",
+ "ramda": "^0.29.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-i18next": "^12.2.2",
+ "react-share": "^4.4.1",
+ "react-toastify": "^9.1.2",
+ "react-virtualized-auto-sizer": "^1.0.15",
+ "react-window": "^1.8.9",
+ "react-window-infinite-loader": "^1.0.9",
+ "recharts": "^2.5.0",
+ "recoil": "^0.7.7",
+ "shared-utils": "workspace:*",
+ "subscriptions-transport-ws": "^0.11.0",
+ "tsconfig": "workspace:*",
+ "tslib": "^2.5.0",
+ "tss-react": "^4.8.3",
+ "typanion": "^3.12.1",
+ "ui": "workspace:*",
+ "usehooks-ts": "^2.9.1",
+ "ws": "^8.13.0",
+ "xss": "^1.0.14",
+ "zod": "^3.21.4"
+ },
+ "devDependencies": {
+ "@emotion/cache": "^11.11.0",
+ "@emotion/jest": "^11.11.0",
+ "@graphql-codegen/cli": "^3.3.1",
+ "@graphql-codegen/client-preset": "^3.0.1",
+ "@graphql-codegen/fragment-matcher": "^4.0.1",
+ "@graphql-codegen/typescript": "^3.0.4",
+ "@graphql-codegen/typescript-operations": "^3.0.4",
+ "@graphql-codegen/typescript-react-apollo": "^3.3.7",
+ "@graphql-tools/mock": "^8.7.20",
+ "@graphql-tools/schema": "^9.0.19",
+ "@jest/globals": "^29.5.0",
+ "@next/eslint-plugin-next": "^13.4.1",
+ "@svgr/webpack": "^7.0.0",
+ "@testing-library/jest-dom": "^5.16.5",
+ "@testing-library/react": "^14.0.0",
+ "@types/big.js": "^6.1.6",
+ "@types/color": "^3.0.3",
+ "@types/eslint": "^8.37.0",
+ "@types/esprima": "^4.0.3",
+ "@types/jest": "^29.5.1",
+ "@types/js-yaml": "^4.0.5",
+ "@types/node": "^18.16.5",
+ "@types/numeral": "^2.0.2",
+ "@types/qs": "^6.9.7",
+ "@types/ramda": "^0.29.1",
+ "@types/react": "^18.2.6",
+ "@types/react-dom": "^18.2.4",
+ "@types/react-test-renderer": "^18.0.0",
+ "@types/react-virtualized-auto-sizer": "^1.0.1",
+ "@types/react-window": "^1.8.5",
+ "@types/react-window-infinite-loader": "^1.0.6",
+ "@typescript-eslint/eslint-plugin": "^5.59.2",
+ "@typescript-eslint/parser": "^5.59.2",
+ "csstype": "^3.1.2",
+ "dotenv": "^16.0.3",
+ "eslint": "^8.40.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-custom": "workspace:*",
+ "eslint-config-next": "^13.4.1",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-config-turbo": "^1.9.3",
+ "eslint-import-resolver-typescript": "^3.5.5",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-react": "^7.32.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-turbo": "^1.9.3",
+ "esprima": "^4.0.1",
+ "graphql-tag": "^2.12.6",
+ "jest": "^29.5.0",
+ "jest-cli": "^29.5.0",
+ "jest-environment-jsdom": "^29.5.0",
+ "jest-localstorage-mock": "^2.4.26",
+ "jest-presets": "workspace:*",
+ "jest-transform-stub": "^2.0.0",
+ "jest-watch-typeahead": "^2.2.2",
+ "react-test-renderer": "^18.2.0",
+ "ts-jest": "^29.1.0",
+ "ts-node": "^10.9.1",
+ "typescript": "^5.0.4"
+ }
+}
diff --git a/apps/web-archway/public/fonts/HindMadurai-Regular.woff2 b/apps/web-archway/public/fonts/HindMadurai-Regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..64b2f86e1eb3b88a07fb6e8d3380e9bb8328b70d
GIT binary patch
literal 45624
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