From ae43bd2a67cb5d767b33da59fc7ceabf056814c0 Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Mon, 16 Sep 2024 14:51:36 +0700
Subject: [PATCH 01/11] feat: created hook for fetching addresses[]

---
 .../hooks/useGetAddressesByOrgIdAndAddress.ts | 54 +++++++++++++++++++
 .../address-book/queries/queries.ts           | 19 +++++++
 2 files changed, 73 insertions(+)
 create mode 100644 apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts

diff --git a/apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts b/apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts
new file mode 100644
index 00000000..5e0c5a3c
--- /dev/null
+++ b/apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts
@@ -0,0 +1,54 @@
+import { requestSignetBackend } from '@domains/offchain-data/hasura'
+import { selectedAccountState } from '@domains/auth'
+import { SignedInAccount } from '@domains/auth'
+import { useRecoilValue } from 'recoil'
+import { useQuery } from '@tanstack/react-query'
+import { ADDRESSES_BY_ORG_ID_AND_ADDRESS } from '@domains/offchain-data/address-book/queries/queries'
+import { useSelectedMultisig } from '@domains/multisig'
+import { Address } from '@util/addresses'
+import { Contact } from '../address-book'
+
+export type ContactAddress = Omit<Contact, 'orgId'> & { team_id?: string; org_id: string }
+export type ContactAddressIO = Omit<ContactAddress, 'address'> & { address: string }
+
+export type PaginatedAddresses = {
+  rows: ContactAddress[]
+  pageCount: number
+  rowCount: number
+}
+
+const fetchGraphQLData = async ({
+  orgId,
+  addresses,
+  selectedAccount,
+}: {
+  orgId: string
+  addresses: string[]
+  selectedAccount: SignedInAccount
+}): Promise<ContactAddress[]> => {
+  const { data } = await requestSignetBackend(
+    ADDRESSES_BY_ORG_ID_AND_ADDRESS,
+    {
+      orgId,
+      addresses,
+    },
+    selectedAccount
+  )
+
+  return (
+    data.address?.map((contact: ContactAddressIO) => ({ ...contact, address: Address.fromSs58(contact.address) })) ?? []
+  )
+}
+
+const useGetAddressesByOrgIdAndAddress = (addresses: string[]) => {
+  const selectedAccount = useRecoilValue(selectedAccountState)
+  const [selectedMultisig] = useSelectedMultisig()
+  return useQuery({
+    queryKey: ['addresses', selectedMultisig.id, addresses],
+    queryFn: async () =>
+      fetchGraphQLData({ orgId: selectedMultisig.orgId, addresses, selectedAccount: selectedAccount! }),
+    enabled: !!selectedAccount && addresses.length > 0,
+  })
+}
+
+export default useGetAddressesByOrgIdAndAddress
diff --git a/apps/multisig/src/domains/offchain-data/address-book/queries/queries.ts b/apps/multisig/src/domains/offchain-data/address-book/queries/queries.ts
index 64570328..efbe78a8 100644
--- a/apps/multisig/src/domains/offchain-data/address-book/queries/queries.ts
+++ b/apps/multisig/src/domains/offchain-data/address-book/queries/queries.ts
@@ -70,6 +70,25 @@ export const PAGINATED_SUB_CATEGORIES_BY_ORG_ID = gql`
   }
 `
 
+export const ADDRESSES_BY_ORG_ID_AND_ADDRESS = gql`
+  query AddressesByOrgIdAndAddress($orgId: uuid!, $addresses: [String!]!) {
+    address(where: { org_id: { _eq: $orgId }, address: { _in: $addresses } }) {
+      id
+      org_id
+      name
+      address
+      category {
+        id
+        name
+      }
+      sub_category {
+        id
+        name
+      }
+    }
+  }
+`
+
 export const UPSERT_ADDRESSES = gql`
   mutation UpsertAddressesMutation($orgId: String!, $teamId: String!, $addressesInput: [AddressInput!]!) {
     UpsertAddresses(addressesInput: { addresses: $addressesInput, org_id: $orgId, team_id: $teamId }) {

From 69ca7da952c6561e1a3c09c7a3f643580b595678 Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 10:14:34 +0700
Subject: [PATCH 02/11] feat: useKnownAddresses fetch addresses on demand

---
 apps/multisig/src/hooks/useKnownAddresses.ts | 21 +++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/apps/multisig/src/hooks/useKnownAddresses.ts b/apps/multisig/src/hooks/useKnownAddresses.ts
index 11e6a991..9f6a9b44 100644
--- a/apps/multisig/src/hooks/useKnownAddresses.ts
+++ b/apps/multisig/src/hooks/useKnownAddresses.ts
@@ -6,20 +6,27 @@ import { useMemo } from 'react'
 import { useSelectedMultisig } from '@domains/multisig'
 import { useSmartContracts } from '../domains/offchain-data/smart-contract'
 import { Contact } from '../domains/offchain-data/address-book/address-book'
+import useGetAddressesByOrgIdAndAddress from '../domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress'
 
 type ContactWithNameAndCategory = Partial<Contact> & AddressWithName
 
 export const useKnownAddresses = (
-  teamId?: string,
+  orgId?: string,
   {
     includeSelectedMultisig = false,
     includeContracts = false,
-  }: { includeSelectedMultisig?: boolean; includeContracts?: boolean } = {}
-): { addresses: ContactWithNameAndCategory[]; contactByAddress: Record<string, ContactWithNameAndCategory> } => {
+  }: { includeSelectedMultisig?: boolean; includeContracts?: boolean } = {},
+  addresses?: string[]
+): {
+  addresses: ContactWithNameAndCategory[]
+  contactByAddress: Record<string, ContactWithNameAndCategory>
+  isLoading: boolean
+} => {
   const extensionAccounts = useRecoilValue(accountsState)
   const addressBookByOrgId = useRecoilValue(addressBookByOrgIdState)
   const [multisig] = useSelectedMultisig()
   const { contracts } = useSmartContracts()
+  const { data: addressBookData, isLoading } = useGetAddressesByOrgIdAndAddress(addresses ?? [])
 
   const extensionContacts = extensionAccounts.reduce<AddressWithName[]>(
     (acc, { address, meta: { name = '' } = {} }) => {
@@ -37,9 +44,9 @@ export const useKnownAddresses = (
   )
 
   const addressBookContacts = useMemo(() => {
-    if (!teamId) return []
+    if (!orgId) return []
 
-    const addresses = addressBookByOrgId[teamId ?? ''] ?? []
+    const addresses = [...(addressBookByOrgId[orgId ?? ''] ?? []), ...(addressBookData ?? [])]
 
     return addresses.reduce<ContactWithNameAndCategory[]>((acc, { address, name, category, sub_category }) => {
       if (multisig.isEthereumAccount === address.isEthereum) {
@@ -54,7 +61,7 @@ export const useKnownAddresses = (
       }
       return acc
     }, [])
-  }, [addressBookByOrgId, multisig.isEthereumAccount, teamId])
+  }, [addressBookByOrgId, addressBookData, multisig.isEthereumAccount, orgId])
 
   const combinedList = useMemo(() => {
     let list = extensionContacts
@@ -130,5 +137,5 @@ export const useKnownAddresses = (
     }, {} as Record<string, ContactWithNameAndCategory>)
   }, [combinedList])
 
-  return { addresses: combinedList, contactByAddress }
+  return { addresses: combinedList, contactByAddress, isLoading }
 }

From 7abc64dbd9f018439503933852c65c453d4446eb Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 10:19:24 +0700
Subject: [PATCH 03/11] feat: fetch contacts in MultiSendExpandedDetails

---
 .../AddressInput/AccountDetails.tsx           |  3 ++
 .../AddressInput/NameAndAddress.tsx           | 17 +++++++--
 .../TransactionDetailsExpandable.tsx          | 35 +++++++++++++++----
 3 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/apps/multisig/src/components/AddressInput/AccountDetails.tsx b/apps/multisig/src/components/AddressInput/AccountDetails.tsx
index 287d7355..09212876 100644
--- a/apps/multisig/src/components/AddressInput/AccountDetails.tsx
+++ b/apps/multisig/src/components/AddressInput/AccountDetails.tsx
@@ -19,6 +19,7 @@ type Props = {
   hideAddress?: boolean
   identiconSize?: number
   breakLine?: boolean
+  isNameLoading?: boolean
 }
 
 export const AccountDetails: React.FC<Props> = ({
@@ -33,6 +34,7 @@ export const AccountDetails: React.FC<Props> = ({
   breakLine,
   hideIdenticon = false,
   hideAddress = false,
+  isNameLoading = false,
 }) => {
   const { copy, copied } = useCopied()
 
@@ -54,6 +56,7 @@ export const AccountDetails: React.FC<Props> = ({
         nameOrAddressOnly={nameOrAddressOnly}
         breakLine={breakLine}
         hideAddress={hideAddress}
+        isNameLoading={isNameLoading}
       />
       {!disableCopy && (
         <div
diff --git a/apps/multisig/src/components/AddressInput/NameAndAddress.tsx b/apps/multisig/src/components/AddressInput/NameAndAddress.tsx
index 25fcff90..22b5e676 100644
--- a/apps/multisig/src/components/AddressInput/NameAndAddress.tsx
+++ b/apps/multisig/src/components/AddressInput/NameAndAddress.tsx
@@ -4,6 +4,7 @@ import { useOnchainIdentity } from '@domains/identity/useOnchainIdentity'
 import { Address } from '@util/addresses'
 import { Check } from 'lucide-react'
 import { useEffect, useMemo, useState } from 'react'
+import { CircularProgressIndicator } from '@talismn/ui'
 
 export const NameAndAddress: React.FC<{
   address: Address
@@ -12,7 +13,8 @@ export const NameAndAddress: React.FC<{
   nameOrAddressOnly?: boolean
   breakLine?: boolean
   hideAddress?: boolean
-}> = ({ address, name, chain, nameOrAddressOnly, breakLine, hideAddress }) => {
+  isNameLoading?: boolean
+}> = ({ address, name, chain, nameOrAddressOnly, breakLine, hideAddress, isNameLoading = false }) => {
   const { resolve } = useAzeroID()
   const [azeroId, setAzeroId] = useState<string | undefined>()
   const onchainIdentity = useOnchainIdentity(address, chain)
@@ -55,12 +57,23 @@ export const NameAndAddress: React.FC<{
     return null
   }, [address, azeroId, chain, name, nameOrAddressOnly, onchainIdentityUi])
 
-  if (!secondaryText)
+  if (!secondaryText) {
+    if (isNameLoading) {
+      return (
+        <div className="flex flex-col gap-1">
+          {true && !name && <CircularProgressIndicator size={16} />}
+          <p className="text-gray-200 text-[12px] leading-[1] whitespace-nowrap overflow-hidden text-ellipsis max-w-max w-full pt-[3px]">
+            {primaryText}
+          </p>
+        </div>
+      )
+    }
     return (
       <p className="text-offWhite overflow-hidden text-ellipsis mt-[3px] w-full max-w-max whitespace-nowrap">
         {primaryText}
       </p>
     )
+  }
 
   return (
     <div
diff --git a/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx b/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
index a7df1bd2..2e131e90 100644
--- a/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
+++ b/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
@@ -31,6 +31,7 @@ import { isExtrinsicProxyWrapped } from '@util/extrinsics'
 import { CONFIG } from '@lib/config'
 import { VestingDateRange } from '@components/VestingDateRange'
 import { Table, TableCell, TableHead, TableHeader, TableRow } from '@components/ui/table'
+import { CircularProgressIndicator } from '@talismn/ui'
 
 const CopyPasteBox: React.FC<{ content: string; label?: string }> = ({ content, label }) => {
   const [copied, setCopied] = useState(false)
@@ -153,14 +154,17 @@ const ChangeConfigExpandedDetails = ({ t }: { t: Transaction }) => {
 }
 
 const MultiSendExpandedDetails = ({ t }: { t: Transaction }) => {
-  const { contactByAddress } = useKnownAddresses(t.multisig.orgId)
-  const shouldDisplayCategory = t.decoded?.recipients.some(r => contactByAddress[r.address.toSs58()]?.category)
-  const shouldDisplaySubcategory = t.decoded?.recipients.some(r => contactByAddress[r.address.toSs58()]?.sub_category)
+  const recipientAddresses = t.decoded?.recipients.map(r => r.address.toSs58())
+  const { contactByAddress, isLoading } = useKnownAddresses(t.multisig.orgId, {}, recipientAddresses)
+  const shouldDisplayCategory =
+    t.decoded?.recipients.some(r => contactByAddress[r.address.toSs58()]?.category) || isLoading
+  const shouldDisplaySubcategory =
+    t.decoded?.recipients.some(r => contactByAddress[r.address.toSs58()]?.sub_category) || isLoading
   const shouldDisplayVesting = t.decoded?.recipients.some(r => r.vestingSchedule)
 
   return (
     <div className="border border-gray-500 rounded-[8px] overflow-hidden">
-      <Table className="border-b-0">
+      <Table className="border-b-0 table-auto">
         <TableHeader>
           <TableRow>
             <TableHead>Recipient</TableHead>
@@ -172,7 +176,7 @@ const MultiSendExpandedDetails = ({ t }: { t: Transaction }) => {
         </TableHeader>
 
         {t.decoded?.recipients.map(({ address, balance, vestingSchedule }, i) => (
-          <TableRow key={i} className="last:border-b-0">
+          <TableRow key={i} className="last:border-b-0 h-[55px]">
             <TableCell>
               <AccountDetails
                 name={contactByAddress[address.toSs58()]?.name}
@@ -183,13 +187,30 @@ const MultiSendExpandedDetails = ({ t }: { t: Transaction }) => {
                 identiconSize={28}
                 disableCopy
                 hideIdenticon
+                isNameLoading={isLoading}
               />
             </TableCell>
             {shouldDisplayCategory && (
-              <TableCell className="text-right">{contactByAddress[address.toSs58()]?.category?.name}</TableCell>
+              <TableCell className="text-right ml-auto">
+                {isLoading ? (
+                  <div className="flex justify-end">
+                    <CircularProgressIndicator size={16} />
+                  </div>
+                ) : (
+                  contactByAddress[address.toSs58()]?.category?.name
+                )}
+              </TableCell>
             )}
             {shouldDisplaySubcategory && (
-              <TableCell className="text-right">{contactByAddress[address.toSs58()]?.sub_category?.name}</TableCell>
+              <TableCell className="text-right">
+                {isLoading ? (
+                  <div className="flex justify-end">
+                    <CircularProgressIndicator size={16} />
+                  </div>
+                ) : (
+                  contactByAddress[address.toSs58()]?.sub_category?.name
+                )}
+              </TableCell>
             )}
             {vestingSchedule && (
               <TableCell>

From 11ace01bbfa1da2fd40f8bd9d85018160ba26fdd Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 11:04:32 +0700
Subject: [PATCH 04/11] refactor: transactionDetailsHeader to use lodable
 contact name

---
 .../AddressInput/NameAndAddress.tsx           | 27 ++++++++++---------
 .../TransactionDetailsExpandable.tsx          | 14 +++++++---
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/apps/multisig/src/components/AddressInput/NameAndAddress.tsx b/apps/multisig/src/components/AddressInput/NameAndAddress.tsx
index 22b5e676..ff8c8f0e 100644
--- a/apps/multisig/src/components/AddressInput/NameAndAddress.tsx
+++ b/apps/multisig/src/components/AddressInput/NameAndAddress.tsx
@@ -58,20 +58,23 @@ export const NameAndAddress: React.FC<{
   }, [address, azeroId, chain, name, nameOrAddressOnly, onchainIdentityUi])
 
   if (!secondaryText) {
-    if (isNameLoading) {
-      return (
-        <div className="flex flex-col gap-1">
-          {true && !name && <CircularProgressIndicator size={16} />}
-          <p className="text-gray-200 text-[12px] leading-[1] whitespace-nowrap overflow-hidden text-ellipsis max-w-max w-full pt-[3px]">
+    return (
+      <div className="flex flex-col gap-1">
+        {isNameLoading && !name ? (
+          <>
+            <CircularProgressIndicator size={16} />
+            {!nameOrAddressOnly && (
+              <p className="text-gray-200 text-[12px] leading-[1] whitespace-nowrap overflow-hidden text-ellipsis max-w-max w-full pt-[3px]">
+                {primaryText}
+              </p>
+            )}
+          </>
+        ) : (
+          <p className="text-offWhite overflow-hidden text-ellipsis mt-[3px] w-full max-w-max whitespace-nowrap">
             {primaryText}
           </p>
-        </div>
-      )
-    }
-    return (
-      <p className="text-offWhite overflow-hidden text-ellipsis mt-[3px] w-full max-w-max whitespace-nowrap">
-        {primaryText}
-      </p>
+        )}
+      </div>
     )
   }
 
diff --git a/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx b/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
index 2e131e90..e12b7034 100644
--- a/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
+++ b/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
@@ -322,15 +322,20 @@ function AdvancedExpendedDetails({
 }
 
 const TransactionDetailsHeaderContent: React.FC<{ t: Transaction }> = ({ t }) => {
-  const { contactByAddress } = useKnownAddresses(t.multisig.orgId, {
-    includeContracts: true,
-  })
   const recipients = t.decoded?.recipients || []
+  const [recipient] = t.decoded?.recipients || []
+  const recipientAddress = recipient?.address.toSs58()
+  const { contactByAddress, isLoading } = useKnownAddresses(
+    t.multisig.orgId,
+    {
+      includeContracts: true,
+    },
+    recipients.length === 1 && recipientAddress ? [recipientAddress] : []
+  )
 
   if (!t.decoded) return null
 
   if (t.decoded.type === TransactionType.Transfer) {
-    const [recipient] = t.decoded.recipients
     if (recipient)
       return (
         <div className="bg-gray-500 p-[4px] px-[8px] rounded-[8px] max-w-[180px] [&>div>p]:text-[14px]">
@@ -342,6 +347,7 @@ const TransactionDetailsHeaderContent: React.FC<{ t: Transaction }> = ({ t }) =>
             nameOrAddressOnly
             identiconSize={16}
             disableCopy
+            isNameLoading={isLoading}
           />
         </div>
       )

From 95c86215829b4aaa852685508fa9922953188973 Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 12:06:19 +0700
Subject: [PATCH 05/11] refactor: updated VaultCard to fetch addresses

---
 apps/multisig/src/components/ScanVaults/VaultCard.tsx | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/apps/multisig/src/components/ScanVaults/VaultCard.tsx b/apps/multisig/src/components/ScanVaults/VaultCard.tsx
index 14ec2dfe..51154929 100644
--- a/apps/multisig/src/components/ScanVaults/VaultCard.tsx
+++ b/apps/multisig/src/components/ScanVaults/VaultCard.tsx
@@ -21,7 +21,8 @@ const VaultCard: React.FC<{ vault: ScannedVault; onAdded?: () => void }> = ({ on
   const { toast } = useToast()
   const setImportedTeams = useSetRecoilState(importedTeamsState)
   const navigate = useNavigate()
-  const { contactByAddress } = useKnownAddresses()
+  const signerAddresses = vault.multisig.signers.map(s => s.toSs58())
+  const { contactByAddress } = useKnownAddresses('', {}, showMultisig ? signerAddresses : [])
   useEffect(() => {
     if (add && showMultisig) setShowMultisig(false)
   }, [add, showMultisig])

From 5fa01714e344b4332688789bd1c4509664aeb809 Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 12:24:24 +0700
Subject: [PATCH 06/11] refactor: updated TransactionSideSheetApprovals to
 fetch addresses

---
 apps/multisig/src/components/MemberRow/index.tsx     |  9 ++++++++-
 .../TransactionSidesheetApprovals.tsx                | 12 +++++++++++-
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/apps/multisig/src/components/MemberRow/index.tsx b/apps/multisig/src/components/MemberRow/index.tsx
index 22e9919b..f995af33 100644
--- a/apps/multisig/src/components/MemberRow/index.tsx
+++ b/apps/multisig/src/components/MemberRow/index.tsx
@@ -4,7 +4,13 @@ import { css } from '@emotion/css'
 import { ExternalLink, Trash } from '@talismn/icons'
 import { AccountDetails } from '@components/AddressInput/AccountDetails'
 
-const MemberRow = (props: { member: AugmentedAccount; chain: Chain; onDelete?: () => void; truncate?: boolean }) => {
+const MemberRow = (props: {
+  member: AugmentedAccount
+  chain: Chain
+  onDelete?: () => void
+  truncate?: boolean
+  isNameLoading?: boolean
+}) => {
   return (
     <div
       className={css`
@@ -27,6 +33,7 @@ const MemberRow = (props: { member: AugmentedAccount; chain: Chain; onDelete?: (
           disableCopy
           withAddressTooltip
           chain={props.chain}
+          isNameLoading={props.isNameLoading}
         />
         {props.member.you ? <span className="text-offWhite text-[14px]"> (You)</span> : null}
       </div>
diff --git a/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx b/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
index 76793912..da8d8492 100644
--- a/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
+++ b/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
@@ -7,8 +7,17 @@ import { Address } from '@util/addresses'
 import { useSelectedMultisig } from '@domains/multisig'
 
 export const TransactionSidesheetApprovals: React.FC<{ t: Transaction }> = ({ t }) => {
-  const { contactByAddress } = useKnownAddresses(t.multisig.orgId)
   const [{ isEthereumAccount }] = useSelectedMultisig()
+  const approversAddresses = Object.keys(t.approvals).reduce<string[]>((acc, address) => {
+    const decodedAddress = isEthereumAccount ? Address.fromSs58(address) : Address.fromPubKey(address)
+    if (decodedAddress) {
+      acc.push(decodedAddress.toSs58())
+    }
+    return acc
+  }, [])
+
+  console.log({ approversAddresses })
+  const { contactByAddress, isLoading } = useKnownAddresses(t.multisig.orgId, {}, approversAddresses)
   return (
     <div css={{ display: 'grid', gap: '14px' }}>
       {Object.entries(t.approvals).map(([address, approval]) => {
@@ -24,6 +33,7 @@ export const TransactionSidesheetApprovals: React.FC<{ t: Transaction }> = ({ t
               <MemberRow
                 member={{ address: decodedAddress, nickname: contact?.name, you: contact?.extensionName !== undefined }}
                 chain={t.multisig.chain}
+                isNameLoading={isLoading}
               />
             </div>
             {(t.rawPending || t.executedAt) && (

From e1ac907238e21575da129d280fa1e1a3ac24df1a Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 12:36:35 +0700
Subject: [PATCH 07/11] refactor: updated CollaboratorRow to fetch Address

---
 .../TransactionSidesheetApprovals.tsx                    | 1 -
 .../src/layouts/Collaborators/CollaboratorRow.tsx        | 9 +++++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx b/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
index da8d8492..0ceeb16e 100644
--- a/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
+++ b/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
@@ -16,7 +16,6 @@ export const TransactionSidesheetApprovals: React.FC<{ t: Transaction }> = ({ t
     return acc
   }, [])
 
-  console.log({ approversAddresses })
   const { contactByAddress, isLoading } = useKnownAddresses(t.multisig.orgId, {}, approversAddresses)
   return (
     <div css={{ display: 'grid', gap: '14px' }}>
diff --git a/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx b/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx
index f3de06fb..fa025a24 100644
--- a/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx
+++ b/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx
@@ -14,7 +14,7 @@ export const CollaboratorRow: React.FC<{ orgId: string; userId: string; address:
   userId,
   address,
 }) => {
-  const { contactByAddress } = useKnownAddresses(orgId, { includeContracts: true })
+  const { contactByAddress, isLoading } = useKnownAddresses(orgId, { includeContracts: true }, [address.toSs58()])
   const { deleteCollaborator, deleting } = useDeleteCollaborator()
   const { isCollaborator } = useUser()
 
@@ -25,7 +25,12 @@ export const CollaboratorRow: React.FC<{ orgId: string; userId: string; address:
   return (
     <div className="w-full bg-gray-900 p-[16px] rounded-[12px] flex items-center justify-between">
       <div>
-        <AccountDetails address={address} name={contactByAddress?.[address.toSs58()]?.name} withAddressTooltip />
+        <AccountDetails
+          address={address}
+          name={contactByAddress?.[address.toSs58()]?.name}
+          withAddressTooltip
+          isNameLoading={isLoading}
+        />
       </div>
       {!isCollaborator && (
         <Tooltip content="Remove collaborator">

From c94109ad92fb1c917f34c19370456de678367046 Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 12:49:11 +0700
Subject: [PATCH 08/11] refactor: updated VaultOverview to fetch addresses

---
 apps/multisig/src/layouts/Overview/VaultOverview.tsx | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/apps/multisig/src/layouts/Overview/VaultOverview.tsx b/apps/multisig/src/layouts/Overview/VaultOverview.tsx
index f6394ee2..410c18cf 100644
--- a/apps/multisig/src/layouts/Overview/VaultOverview.tsx
+++ b/apps/multisig/src/layouts/Overview/VaultOverview.tsx
@@ -24,8 +24,9 @@ const showMemberState = atom<boolean>({
 export const VaultOverview: React.FC = () => {
   const [selectedMultisig] = useSelectedMultisig()
   const [showMembers, setShowMembers] = useRecoilState(showMemberState)
-  const { contactByAddress } = useKnownAddresses(selectedMultisig.orgId)
   const { copy, copied } = useCopied()
+  const signersAddresses = selectedMultisig.signers.map(signer => signer.toSs58())
+  const { contactByAddress, isLoading } = useKnownAddresses(selectedMultisig.orgId, {}, signersAddresses)
 
   return (
     <section className="flex flex-col p-[24px] rounded-2xl bg-gray-800">
@@ -145,6 +146,7 @@ export const VaultOverview: React.FC = () => {
                   identiconSize={20}
                   nameOrAddressOnly
                   withAddressTooltip
+                  isNameLoading={isLoading}
                 />
               ))}
             </div>

From c974ff663d9d99ab427389a0a56e57c6753ece33 Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 15:27:28 +0700
Subject: [PATCH 09/11] refactor: updated components to fetch addresses

---
 .../Overview/Transactions/TransactionSummaryRow.tsx    |  5 ++++-
 apps/multisig/src/layouts/Settings/RecoverMultisig.tsx | 10 ++++++----
 apps/multisig/src/layouts/Settings/SignersSettings.tsx |  8 +++++++-
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx b/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx
index d6bbe908..0c67cced 100644
--- a/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx
+++ b/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx
@@ -38,7 +38,9 @@ const TransactionSummaryRow = ({
   showShareButton?: boolean
   onClick?: () => void
 }) => {
-  const { contactByAddress } = useKnownAddresses(t.multisig.orgId)
+  const { contactByAddress, isLoading } = useKnownAddresses(t.multisig.orgId, {}, [
+    t?.draft?.creator.address.toSs58() || '',
+  ])
   const sumOutgoing: Balance[] = useMemo(() => calcSumOutgoing(t), [t])
   const combinedView = useRecoilValue(combinedViewState)
   const tokenPrices = useRecoilValueLoadable(tokenPricesState(sumOutgoing.map(b => b.token)))
@@ -157,6 +159,7 @@ const TransactionSummaryRow = ({
                     withAddressTooltip
                     nameOrAddressOnly
                     disableCopy
+                    isNameLoading={isLoading}
                   />
                 </div>
               </div>
diff --git a/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx b/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx
index 28f3f26d..70d8d4d9 100644
--- a/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx
+++ b/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx
@@ -25,10 +25,11 @@ type Props = {
 const ScannedMultisigs: React.FC<{
   multisigs: { signers: Address[]; threshold: number; address: Address }[]
   chain: Chain
-  teamId: string
+  orgId: string
   onSelect: (multisig: { signers: Address[]; threshold: number; address: Address }) => void
-}> = ({ chain, multisigs, onSelect, teamId }) => {
-  const { contactByAddress } = useKnownAddresses(teamId)
+}> = ({ chain, multisigs, onSelect, orgId }) => {
+  const signersAddresses = useMemo(() => multisigs.flatMap(m => m.signers.map(signer => signer.toSs58())), [multisigs])
+  const { contactByAddress, isLoading } = useKnownAddresses(orgId, {}, signersAddresses)
   return (
     <div className="grid gap-[8px] max-h-[400px] overflow-y-auto">
       {multisigs.map(multisig => (
@@ -66,6 +67,7 @@ const ScannedMultisigs: React.FC<{
                     name={contactByAddress[signer.toSs58()]?.name}
                     withAddressTooltip
                     nameOrAddressOnly
+                    isNameLoading={isLoading}
                   />
                 </div>
               ))}
@@ -184,7 +186,7 @@ export const RecoverMultisig: React.FC<Props> = ({ multisig }) => {
               )}
               <ScannedMultisigs
                 chain={multisig.chain}
-                teamId={multisig.id}
+                orgId={multisig.id}
                 multisigs={applicableMultisigs.map(({ multisigAddress, signers, threshold }) => ({
                   address: multisigAddress,
                   signers,
diff --git a/apps/multisig/src/layouts/Settings/SignersSettings.tsx b/apps/multisig/src/layouts/Settings/SignersSettings.tsx
index 2fae01db..577377b5 100644
--- a/apps/multisig/src/layouts/Settings/SignersSettings.tsx
+++ b/apps/multisig/src/layouts/Settings/SignersSettings.tsx
@@ -19,7 +19,12 @@ type Props = {
 }
 
 export const SignersSettings: React.FC<Props> = ({ capHeight, editable, error, members, multisig, onChange }) => {
-  const { addresses: knownAddresses, contactByAddress } = useKnownAddresses(multisig.orgId)
+  const membersAddresses = members.map(m => m.toSs58())
+  const {
+    addresses: knownAddresses,
+    contactByAddress,
+    isLoading,
+  } = useKnownAddresses(multisig.orgId, {}, membersAddresses)
   const prevLength = useRef(members.length)
   const scrollView = useRef<HTMLDivElement>(null)
 
@@ -62,6 +67,7 @@ export const SignersSettings: React.FC<Props> = ({ capHeight, editable, error, m
                 disableCopy
                 chain={multisig.chain}
                 withAddressTooltip
+                isNameLoading={isLoading}
               />
               <Button
                 disabled={!editable}

From 26f8b4611753f23e35fd82305e09ce3b2812d04f Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Wed, 18 Sep 2024 15:53:59 +0700
Subject: [PATCH 10/11] refactor: useKnownAddresses args

---
 .../src/components/ScanVaults/VaultCard.tsx   |  2 +-
 .../param-input/Address.tsx                   |  2 +-
 .../TransactionSidesheetApprovals.tsx         |  2 +-
 apps/multisig/src/hooks/useKnownAddresses.ts  | 19 +++++++++++--------
 .../Collaborators/AddCollaboratorModal.tsx    |  2 +-
 .../layouts/Collaborators/CollaboratorRow.tsx |  6 +++++-
 .../NewTransaction/Multisend/index.tsx        |  2 +-
 .../NewTransaction/Send/DetailsForm.tsx       |  2 +-
 .../TransactionDetailsExpandable.tsx          | 16 +++++++---------
 .../Transactions/TransactionSummaryRow.tsx    |  7 ++++---
 .../src/layouts/Overview/VaultOverview.tsx    |  5 ++++-
 .../src/layouts/Settings/RecoverMultisig.tsx  |  2 +-
 .../src/layouts/Settings/SignersSettings.tsx  |  2 +-
 .../DeployContractExpandedDetails.tsx         |  3 ++-
 .../SmartContractCallExpandedDetails.tsx      |  3 ++-
 15 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/apps/multisig/src/components/ScanVaults/VaultCard.tsx b/apps/multisig/src/components/ScanVaults/VaultCard.tsx
index 51154929..9139ad0c 100644
--- a/apps/multisig/src/components/ScanVaults/VaultCard.tsx
+++ b/apps/multisig/src/components/ScanVaults/VaultCard.tsx
@@ -22,7 +22,7 @@ const VaultCard: React.FC<{ vault: ScannedVault; onAdded?: () => void }> = ({ on
   const setImportedTeams = useSetRecoilState(importedTeamsState)
   const navigate = useNavigate()
   const signerAddresses = vault.multisig.signers.map(s => s.toSs58())
-  const { contactByAddress } = useKnownAddresses('', {}, showMultisig ? signerAddresses : [])
+  const { contactByAddress } = useKnownAddresses({ addresses: showMultisig ? signerAddresses : [] })
   useEffect(() => {
     if (add && showMultisig) setShowMultisig(false)
   }, [add, showMultisig])
diff --git a/apps/multisig/src/components/SubstrateContractAbi/param-input/Address.tsx b/apps/multisig/src/components/SubstrateContractAbi/param-input/Address.tsx
index ac9cbe9a..67376d29 100644
--- a/apps/multisig/src/components/SubstrateContractAbi/param-input/Address.tsx
+++ b/apps/multisig/src/components/SubstrateContractAbi/param-input/Address.tsx
@@ -7,7 +7,7 @@ import { useEffect, useState } from 'react'
 export const AddressParamInput: ParamInputComponent<string> = ({ chain, onChange, arg }) => {
   const [query, setQuery] = useState('')
   const [selectedMultisig] = useSelectedMultisig()
-  const { addresses } = useKnownAddresses(selectedMultisig.orgId, { includeSelectedMultisig: true })
+  const { addresses } = useKnownAddresses({ orgId: selectedMultisig.orgId, includeSelectedMultisig: true })
 
   useEffect(() => {
     if (!arg) setQuery('')
diff --git a/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx b/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
index 0ceeb16e..580238ac 100644
--- a/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
+++ b/apps/multisig/src/components/TransactionSidesheet/TransactionSidesheetApprovals.tsx
@@ -16,7 +16,7 @@ export const TransactionSidesheetApprovals: React.FC<{ t: Transaction }> = ({ t
     return acc
   }, [])
 
-  const { contactByAddress, isLoading } = useKnownAddresses(t.multisig.orgId, {}, approversAddresses)
+  const { contactByAddress, isLoading } = useKnownAddresses({ orgId: t.multisig.orgId, addresses: approversAddresses })
   return (
     <div css={{ display: 'grid', gap: '14px' }}>
       {Object.entries(t.approvals).map(([address, approval]) => {
diff --git a/apps/multisig/src/hooks/useKnownAddresses.ts b/apps/multisig/src/hooks/useKnownAddresses.ts
index 9f6a9b44..9baa0747 100644
--- a/apps/multisig/src/hooks/useKnownAddresses.ts
+++ b/apps/multisig/src/hooks/useKnownAddresses.ts
@@ -10,14 +10,17 @@ import useGetAddressesByOrgIdAndAddress from '../domains/offchain-data/address-b
 
 type ContactWithNameAndCategory = Partial<Contact> & AddressWithName
 
-export const useKnownAddresses = (
-  orgId?: string,
-  {
-    includeSelectedMultisig = false,
-    includeContracts = false,
-  }: { includeSelectedMultisig?: boolean; includeContracts?: boolean } = {},
+export const useKnownAddresses = ({
+  orgId,
+  includeSelectedMultisig,
+  includeContracts,
+  addresses,
+}: {
+  orgId?: string
+  includeSelectedMultisig?: boolean
+  includeContracts?: boolean
   addresses?: string[]
-): {
+} = {}): {
   addresses: ContactWithNameAndCategory[]
   contactByAddress: Record<string, ContactWithNameAndCategory>
   isLoading: boolean
@@ -44,7 +47,7 @@ export const useKnownAddresses = (
   )
 
   const addressBookContacts = useMemo(() => {
-    if (!orgId) return []
+    if (!orgId || !addressBookData?.length) return []
 
     const addresses = [...(addressBookByOrgId[orgId ?? ''] ?? []), ...(addressBookData ?? [])]
 
diff --git a/apps/multisig/src/layouts/Collaborators/AddCollaboratorModal.tsx b/apps/multisig/src/layouts/Collaborators/AddCollaboratorModal.tsx
index 659103c6..c5fdf7b5 100644
--- a/apps/multisig/src/layouts/Collaborators/AddCollaboratorModal.tsx
+++ b/apps/multisig/src/layouts/Collaborators/AddCollaboratorModal.tsx
@@ -16,7 +16,7 @@ export const AddCollaboratorModal: React.FC<Props> = ({ isOpen, onClose }) => {
   const [selectedMultisig] = useSelectedMultisig()
   const [address, setAddress] = useState<Address | undefined>()
   const [error, setError] = useState<boolean>(false)
-  const { addresses } = useKnownAddresses(selectedMultisig.orgId)
+  const { addresses } = useKnownAddresses({ orgId: selectedMultisig.orgId })
   const { addCollaborator, adding } = useAddOrgCollaborator()
 
   const handleAddressChange = (address: Address | undefined) => {
diff --git a/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx b/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx
index fa025a24..a6315476 100644
--- a/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx
+++ b/apps/multisig/src/layouts/Collaborators/CollaboratorRow.tsx
@@ -14,7 +14,11 @@ export const CollaboratorRow: React.FC<{ orgId: string; userId: string; address:
   userId,
   address,
 }) => {
-  const { contactByAddress, isLoading } = useKnownAddresses(orgId, { includeContracts: true }, [address.toSs58()])
+  const { contactByAddress, isLoading } = useKnownAddresses({
+    orgId,
+    includeContracts: true,
+    addresses: [address.toSs58()],
+  })
   const { deleteCollaborator, deleting } = useDeleteCollaborator()
   const { isCollaborator } = useUser()
 
diff --git a/apps/multisig/src/layouts/NewTransaction/Multisend/index.tsx b/apps/multisig/src/layouts/NewTransaction/Multisend/index.tsx
index de5a11c6..c78a4502 100644
--- a/apps/multisig/src/layouts/NewTransaction/Multisend/index.tsx
+++ b/apps/multisig/src/layouts/NewTransaction/Multisend/index.tsx
@@ -31,7 +31,7 @@ const MultiSend = () => {
   const apiLoadable = useRecoilValueLoadable(pjsApiSelector(multisig.chain.genesisHash))
   const { toast } = useToast()
   const permissions = hasPermission(multisig, 'transfer')
-  const { addresses } = useKnownAddresses(multisig.orgId)
+  const { addresses } = useKnownAddresses({ orgId: multisig.orgId })
   const newSends = useRecoilValue(multisendSendsAtom)
   const unit = useRecoilValue(multisendAmountUnitAtom)
   const token = useRecoilValue(multisendTokenAtom)
diff --git a/apps/multisig/src/layouts/NewTransaction/Send/DetailsForm.tsx b/apps/multisig/src/layouts/NewTransaction/Send/DetailsForm.tsx
index 906e05bc..5f6a41cb 100644
--- a/apps/multisig/src/layouts/NewTransaction/Send/DetailsForm.tsx
+++ b/apps/multisig/src/layouts/NewTransaction/Send/DetailsForm.tsx
@@ -69,7 +69,7 @@ export const DetailsForm: React.FC<Props> = ({
 }) => {
   const [addressError, setAddressError] = useState<boolean>(false)
   const [multisig] = useSelectedMultisig()
-  const { addresses } = useKnownAddresses(multisig.orgId)
+  const { addresses } = useKnownAddresses({ orgId: multisig.orgId })
   const { hasDelayedPermission, hasNonDelayedPermission } = hasPermission(multisig, 'transfer')
   const vestingConsts = useRecoilValueLoadable(vestingConstsSelector(multisig.chain.genesisHash))
 
diff --git a/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx b/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
index e12b7034..0188f372 100644
--- a/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
+++ b/apps/multisig/src/layouts/Overview/Transactions/TransactionDetailsExpandable.tsx
@@ -116,7 +116,7 @@ const MultisigCallDataBox: React.FC<{ calldata: `0x${string}`; genesisHash: stri
 }
 
 const ChangeConfigExpandedDetails = ({ t }: { t: Transaction }) => {
-  const { contactByAddress } = useKnownAddresses(t.multisig.orgId)
+  const { contactByAddress } = useKnownAddresses({ orgId: t.multisig.orgId })
   return (
     <div>
       <div css={{ display: 'grid', gap: 12, marginTop: '8px' }}>
@@ -155,7 +155,7 @@ const ChangeConfigExpandedDetails = ({ t }: { t: Transaction }) => {
 
 const MultiSendExpandedDetails = ({ t }: { t: Transaction }) => {
   const recipientAddresses = t.decoded?.recipients.map(r => r.address.toSs58())
-  const { contactByAddress, isLoading } = useKnownAddresses(t.multisig.orgId, {}, recipientAddresses)
+  const { contactByAddress, isLoading } = useKnownAddresses({ orgId: t.multisig.orgId, addresses: recipientAddresses })
   const shouldDisplayCategory =
     t.decoded?.recipients.some(r => contactByAddress[r.address.toSs58()]?.category) || isLoading
   const shouldDisplaySubcategory =
@@ -325,13 +325,11 @@ const TransactionDetailsHeaderContent: React.FC<{ t: Transaction }> = ({ t }) =>
   const recipients = t.decoded?.recipients || []
   const [recipient] = t.decoded?.recipients || []
   const recipientAddress = recipient?.address.toSs58()
-  const { contactByAddress, isLoading } = useKnownAddresses(
-    t.multisig.orgId,
-    {
-      includeContracts: true,
-    },
-    recipients.length === 1 && recipientAddress ? [recipientAddress] : []
-  )
+  const { contactByAddress, isLoading } = useKnownAddresses({
+    orgId: t.multisig.orgId,
+    includeContracts: true,
+    addresses: recipients.length === 1 && recipientAddress ? [recipientAddress] : [],
+  })
 
   if (!t.decoded) return null
 
diff --git a/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx b/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx
index 0c67cced..d1d15f19 100644
--- a/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx
+++ b/apps/multisig/src/layouts/Overview/Transactions/TransactionSummaryRow.tsx
@@ -38,9 +38,10 @@ const TransactionSummaryRow = ({
   showShareButton?: boolean
   onClick?: () => void
 }) => {
-  const { contactByAddress, isLoading } = useKnownAddresses(t.multisig.orgId, {}, [
-    t?.draft?.creator.address.toSs58() || '',
-  ])
+  const { contactByAddress, isLoading } = useKnownAddresses({
+    orgId: t.multisig.orgId,
+    addresses: [t?.draft?.creator.address.toSs58() || ''],
+  })
   const sumOutgoing: Balance[] = useMemo(() => calcSumOutgoing(t), [t])
   const combinedView = useRecoilValue(combinedViewState)
   const tokenPrices = useRecoilValueLoadable(tokenPricesState(sumOutgoing.map(b => b.token)))
diff --git a/apps/multisig/src/layouts/Overview/VaultOverview.tsx b/apps/multisig/src/layouts/Overview/VaultOverview.tsx
index 410c18cf..d9beb721 100644
--- a/apps/multisig/src/layouts/Overview/VaultOverview.tsx
+++ b/apps/multisig/src/layouts/Overview/VaultOverview.tsx
@@ -26,7 +26,10 @@ export const VaultOverview: React.FC = () => {
   const [showMembers, setShowMembers] = useRecoilState(showMemberState)
   const { copy, copied } = useCopied()
   const signersAddresses = selectedMultisig.signers.map(signer => signer.toSs58())
-  const { contactByAddress, isLoading } = useKnownAddresses(selectedMultisig.orgId, {}, signersAddresses)
+  const { contactByAddress, isLoading } = useKnownAddresses({
+    orgId: selectedMultisig.orgId,
+    addresses: signersAddresses,
+  })
 
   return (
     <section className="flex flex-col p-[24px] rounded-2xl bg-gray-800">
diff --git a/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx b/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx
index 70d8d4d9..01d9e51a 100644
--- a/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx
+++ b/apps/multisig/src/layouts/Settings/RecoverMultisig.tsx
@@ -29,7 +29,7 @@ const ScannedMultisigs: React.FC<{
   onSelect: (multisig: { signers: Address[]; threshold: number; address: Address }) => void
 }> = ({ chain, multisigs, onSelect, orgId }) => {
   const signersAddresses = useMemo(() => multisigs.flatMap(m => m.signers.map(signer => signer.toSs58())), [multisigs])
-  const { contactByAddress, isLoading } = useKnownAddresses(orgId, {}, signersAddresses)
+  const { contactByAddress, isLoading } = useKnownAddresses({ orgId, addresses: signersAddresses })
   return (
     <div className="grid gap-[8px] max-h-[400px] overflow-y-auto">
       {multisigs.map(multisig => (
diff --git a/apps/multisig/src/layouts/Settings/SignersSettings.tsx b/apps/multisig/src/layouts/Settings/SignersSettings.tsx
index 577377b5..8d38bdf4 100644
--- a/apps/multisig/src/layouts/Settings/SignersSettings.tsx
+++ b/apps/multisig/src/layouts/Settings/SignersSettings.tsx
@@ -24,7 +24,7 @@ export const SignersSettings: React.FC<Props> = ({ capHeight, editable, error, m
     addresses: knownAddresses,
     contactByAddress,
     isLoading,
-  } = useKnownAddresses(multisig.orgId, {}, membersAddresses)
+  } = useKnownAddresses({ orgId: multisig.orgId, addresses: membersAddresses })
   const prevLength = useRef(members.length)
   const scrollView = useRef<HTMLDivElement>(null)
 
diff --git a/apps/multisig/src/layouts/SmartContracts/DeployContractExpandedDetails.tsx b/apps/multisig/src/layouts/SmartContracts/DeployContractExpandedDetails.tsx
index 9bf6cd38..56167fe4 100644
--- a/apps/multisig/src/layouts/SmartContracts/DeployContractExpandedDetails.tsx
+++ b/apps/multisig/src/layouts/SmartContracts/DeployContractExpandedDetails.tsx
@@ -32,7 +32,8 @@ const IS_ADDRESS: Record<string, boolean> = {
 export const DeployContractExpandedDetails: React.FC<{ t: Transaction }> = ({ t }) => {
   const { api } = useApi(t.multisig.chain.genesisHash)
   const { decimal, symbol } = useTokenByChain(t.multisig.chain.genesisHash)
-  const { contactByAddress } = useKnownAddresses(t.multisig.orgId, {
+  const { contactByAddress } = useKnownAddresses({
+    orgId: t.multisig.orgId,
     includeContracts: true,
     includeSelectedMultisig: true,
   })
diff --git a/apps/multisig/src/layouts/SmartContracts/SmartContractCallExpandedDetails.tsx b/apps/multisig/src/layouts/SmartContracts/SmartContractCallExpandedDetails.tsx
index 1329e6c8..0a17b3f7 100644
--- a/apps/multisig/src/layouts/SmartContracts/SmartContractCallExpandedDetails.tsx
+++ b/apps/multisig/src/layouts/SmartContracts/SmartContractCallExpandedDetails.tsx
@@ -37,7 +37,8 @@ export const SmartContractCallExpandedDetails: React.FC<{ t: Transaction }> = ({
   const { api } = useApi(t.multisig.chain.genesisHash)
   const { contract, contractDetails, loading } = useContractByAddress(t.decoded?.contractCall?.address, api)
   const { symbol, decimal } = useTokenByChain(t.multisig.chain.genesisHash)
-  const { contactByAddress } = useKnownAddresses(t.multisig.orgId, {
+  const { contactByAddress } = useKnownAddresses({
+    orgId: t.multisig.orgId,
     includeContracts: true,
     includeSelectedMultisig: true,
   })

From a193a74f887234e81488952963805a365bf90213 Mon Sep 17 00:00:00 2001
From: Will Urban <will.urban.dev@gmail.com>
Date: Tue, 15 Oct 2024 14:14:25 +0700
Subject: [PATCH 11/11] Update
 apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts

Co-authored-by: Chris Ling <81092286+chrisling-dev@users.noreply.github.com>
---
 .../address-book/hooks/useGetAddressesByOrgIdAndAddress.ts     | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts b/apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts
index 5e0c5a3c..4fd423ef 100644
--- a/apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts
+++ b/apps/multisig/src/domains/offchain-data/address-book/hooks/useGetAddressesByOrgIdAndAddress.ts
@@ -45,8 +45,7 @@ const useGetAddressesByOrgIdAndAddress = (addresses: string[]) => {
   const [selectedMultisig] = useSelectedMultisig()
   return useQuery({
     queryKey: ['addresses', selectedMultisig.id, addresses],
-    queryFn: async () =>
-      fetchGraphQLData({ orgId: selectedMultisig.orgId, addresses, selectedAccount: selectedAccount! }),
+    queryFn: () => fetchGraphQLData({ orgId: selectedMultisig.orgId, addresses, selectedAccount: selectedAccount! }),
     enabled: !!selectedAccount && addresses.length > 0,
   })
 }