diff --git a/src/components/Molecules/Address/NFTApprovalList/NFTApprovalList.stories.tsx b/src/components/Molecules/Address/NFTApprovalList/NFTApprovalList.stories.tsx
new file mode 100644
index 00000000..ef9c48e9
--- /dev/null
+++ b/src/components/Molecules/Address/NFTApprovalList/NFTApprovalList.stories.tsx
@@ -0,0 +1,18 @@
+import { type Meta, type StoryObj } from "@storybook/react";
+import { NFTApprovalList as NFTApprovalListComponent } from "./NFTApprovalList";
+
+type Story = StoryObj;
+
+const meta: Meta = {
+ title: "Molecules/Address/Approval/NFT Approval List",
+ component: NFTApprovalListComponent,
+};
+
+export default meta;
+
+export const NFTApprovalList: Story = {
+ args: {
+ chain_name: "eth-mainnet",
+ address: "demo.eth",
+ },
+};
diff --git a/src/components/Molecules/Address/NFTApprovalList/NFTApprovalList.tsx b/src/components/Molecules/Address/NFTApprovalList/NFTApprovalList.tsx
new file mode 100644
index 00000000..d2d3ead2
--- /dev/null
+++ b/src/components/Molecules/Address/NFTApprovalList/NFTApprovalList.tsx
@@ -0,0 +1,188 @@
+import { type Option, None, Some } from "@/utils/option";
+import type { NftApprovalsItem } from "@covalenthq/client-sdk";
+import { useEffect, useState } from "react";
+import { type NFTApprovalListProps } from "@/utils/types/molecules.types";
+import { useGoldRush } from "@/utils/store";
+import { type CovalentAPIError } from "@/utils/types/shared.types";
+import { defaultErrorMessage } from "@/utils/constants/shared.constants";
+import { TableHeaderSorting, TableList } from "@/components/Shared";
+import type { ColumnDef } from "@tanstack/react-table";
+import { Address } from "@/components/Atoms";
+import { Button } from "@/components/ui/button";
+
+export const NFTApprovalList: React.FC = ({
+ chain_name,
+ address,
+ on_revoke_approval,
+}) => {
+ const { covalentClient } = useGoldRush();
+
+ const [maybeResult, setMaybeResult] =
+ useState
+ );
+ },
+ },
+ {
+ id: "risk_factor",
+ accessorKey: "risk_factor",
+ header: ({ column }) => (
+
+ align="left"
+ header={"Risk Factor"}
+ column={column}
+ />
+ ),
+ cell: ({ row }) => {
+ return (
+
+ {row.original.spenders[0].allowance === "Unlimited"
+ ? "High"
+ : "Low"}
+
+ );
+ },
+ },
+ ];
+
+ if (on_revoke_approval) {
+ columns.push({
+ id: "revoke",
+ accessorKey: "revoke",
+ header: () => ,
+ cell: ({ row }) => {
+ return (
+
+ );
+ },
+ });
+ }
+
+ return (
+
+ columns={columns}
+ errorMessage={errorMessage}
+ maybeData={maybeResult}
+ sorting_state={[
+ {
+ id: "value_at_risk",
+ desc: true,
+ },
+ ]}
+ />
+ );
+};
diff --git a/src/components/Molecules/Address/TokenApprovalList/TokenApprovalList.stories.tsx b/src/components/Molecules/Address/TokenApprovalList/TokenApprovalList.stories.tsx
new file mode 100644
index 00000000..518a6d7d
--- /dev/null
+++ b/src/components/Molecules/Address/TokenApprovalList/TokenApprovalList.stories.tsx
@@ -0,0 +1,18 @@
+import { type Meta, type StoryObj } from "@storybook/react";
+import { TokenApprovalList as TokenApprovalListComponent } from "./TokenApprovalList";
+
+type Story = StoryObj;
+
+const meta: Meta = {
+ title: "Molecules/Address/Approval/Token Approval List",
+ component: TokenApprovalListComponent,
+};
+
+export default meta;
+
+export const TokenApprovalList: Story = {
+ args: {
+ chain_name: "eth-mainnet",
+ address: "demo.eth",
+ },
+};
diff --git a/src/components/Molecules/Address/TokenApprovalList/TokenApprovalList.tsx b/src/components/Molecules/Address/TokenApprovalList/TokenApprovalList.tsx
new file mode 100644
index 00000000..013baf99
--- /dev/null
+++ b/src/components/Molecules/Address/TokenApprovalList/TokenApprovalList.tsx
@@ -0,0 +1,219 @@
+import { type Option, None, Some } from "@/utils/option";
+import { type TokensApprovalItem } from "@covalenthq/client-sdk";
+import { useEffect, useState } from "react";
+import { type TokenApprovalListProps } from "@/utils/types/molecules.types";
+import { useGoldRush } from "@/utils/store";
+import { type CovalentAPIError } from "@/utils/types/shared.types";
+import {
+ GRK_SIZES,
+ defaultErrorMessage,
+} from "@/utils/constants/shared.constants";
+import { CardDetail, TableHeaderSorting, TableList } from "@/components/Shared";
+import type { ColumnDef } from "@tanstack/react-table";
+import { Address, TokenAvatar } from "@/components/Atoms";
+import { Button } from "@/components/ui/button";
+
+export const TokenApprovalList: React.FC = ({
+ chain_name,
+ address,
+ on_revoke_approval,
+}) => {
+ const { covalentClient } = useGoldRush();
+
+ const [maybeResult, setMaybeResult] =
+ useState